From e3e12f52b214121840b44c91de5b3e5af5d3eb84 Mon Sep 17 00:00:00 2001
From: hc <hc@nodka.com>
Date: Mon, 06 Nov 2023 03:04:41 +0000
Subject: [PATCH] rk3568 rt init

---
 kernel/kernel/watchdog.c                                                          |    2 
 kernel/drivers/media/platform/rockchip/cif/dev.h                                  |    1 
 kernel/kernel/rcu/tree.h                                                          |    6 
 kernel/drivers/video/rockchip/mpp/mpp_vepu2.c                                     |   20 
 kernel/kernel/trace/trace_output.c                                                |   19 
 kernel/kernel/rcu/rcu.h                                                           |   11 
 kernel/include/linux/mutex.h                                                      |   20 
 kernel/include/linux/radix-tree.h                                                 |    7 
 kernel/drivers/mmc/host/rtsx_usb_sdmmc.c                                          |    1 
 kernel/drivers/mmc/host/sunxi-mmc.c                                               |    1 
 kernel/arch/arm/mm/highmem.c                                                      |   58 
 kernel/kernel/rcu/tree.c                                                          |  153 
 kernel/tools/perf/bench/bench.h                                                   |    4 
 kernel/drivers/mmc/host/sdhci-spear.c                                             |    1 
 kernel/include/linux/suspend.h                                                    |    6 
 kernel/drivers/soc/rockchip/rockchip_system_monitor.c                             |   35 
 kernel/arch/arm64/boot/dts/rockchip/rk3368.dtsi                                   |    3 
 kernel/drivers/video/rockchip/mpp/rockchip_iep2_regs.h                            |    7 
 kernel/arch/x86/kernel/fpu/core.c                                                 |   12 
 kernel/drivers/mmc/host/pxamci.c                                                  |    1 
 kernel/kernel/irq_work.c                                                          |   76 
 kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dhd_pcie.c                |   43 
 kernel/include/linux/smp.h                                                        |    3 
 kernel/include/linux/kdb.h                                                        |    2 
 kernel/kernel/printk/printk.c                                                     |  157 
 kernel/drivers/rkflash/sfc_nor.c                                                  |   21 
 kernel/kernel/sched/core.c                                                        |  520 
 kernel/kernel/stop_machine.c                                                      |    7 
 kernel/arch/arm/configs/at91_dt_defconfig                                         |    2 
 kernel/include/linux/pstore.h                                                     |    8 
 kernel/drivers/gpu/drm/i915/i915_request.c                                        |    8 
 kernel/drivers/video/rockchip/rga3/rga_job.c                                      |  357 
 kernel/kernel/events/core.c                                                       |    4 
 kernel/sound/soc/codecs/Kconfig                                                   |    5 
 kernel/drivers/mmc/host/rtsx_pci_sdmmc.c                                          |    1 
 kernel/include/linux/nfs_xdr.h                                                    |    2 
 kernel/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c                          |   74 
 kernel/kernel/rcu/tree_plugin.h                                                   |  158 
 kernel/arch/x86/include/asm/thread_info.h                                         |   11 
 kernel/drivers/gpu/drm/drm_internal.h                                             |    4 
 kernel/drivers/misc/eeprom/at24.c                                                 |  148 
 kernel/arch/x86/kvm/lapic.c                                                       |    2 
 kernel/drivers/tty/serial/8250/8250_core.c                                        |   11 
 kernel/drivers/gpu/drm/rockchip/ebc-dev/ebc_dev_v8.S                              | 45038 +++++++-------
 kernel/arch/arm64/crypto/crc32-ce-glue.c                                          |    3 
 kernel/kernel/sched/completion.c                                                  |   34 
 kernel/kernel/fork.c                                                              |   45 
 kernel/kernel/workqueue.c                                                         |  341 
 kernel/drivers/scsi/libfc/fc_exch.c                                               |    4 
 kernel/drivers/headset_observe/rk_headset.c                                       |   10 
 kernel/drivers/media/platform/rockchip/isp/isp_stats_v21.c                        |    2 
 kernel/include/linux/buffer_head.h                                                |   42 
 kernel/lib/Kconfig                                                                |    1 
 kernel/drivers/headset_observe/rk_headset.h                                       |    1 
 kernel/drivers/mmc/host/sdhci-esdhc-imx.c                                         |    1 
 kernel/drivers/net/wireless/rockchip_wlan/uwe5621ds/unisocwcn/platform/wcn_boot.c |  155 
 kernel/tools/perf/bench/futex-lock-pi.c                                           |   11 
 kernel/include/linux/cgroup-defs.h                                                |    2 
 kernel/include/linux/iommu.h                                                      |    5 
 kernel/arch/arm64/kernel/asm-offsets.c                                            |    1 
 kernel/include/linux/highmem.h                                                    |   32 
 kernel/net/wireless/core.h                                                        |    4 
 kernel/include/linux/soc/rockchip/rk_vendor_storage.h                             |   37 
 kernel/arch/x86/mm/pageattr.c                                                     |    8 
 kernel/drivers/clk/rockchip/clk-out.c                                             |   99 
 kernel/drivers/media/i2c/Kconfig                                                  |   11 
 kernel/arch/arm/boot/dts/rk322x.dtsi                                              |    1 
 kernel/drivers/gpu/drm/rockchip/ebc-dev/ebc_dev.h                                 |   42 
 kernel/arch/arm/kernel/signal.c                                                   |    3 
 kernel/fs/fscache/cookie.c                                                        |    8 
 kernel/drivers/char/random.c                                                      |   11 
 kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dhd_gpio.c                |   26 
 kernel/arch/x86/include/asm/preempt.h                                             |   33 
 kernel/arch/arm/boot/dts/rk3528-evb2-ddr3-v10.dts                                 |   12 
 kernel/drivers/iommu/iommu.c                                                      |    3 
 kernel/include/linux/spinlock.h                                                   |   12 
 kernel/crypto/cryptd.c                                                            |   19 
 kernel/kernel/time/tick-sched.c                                                   |   31 
 kernel/arch/x86/include/asm/fpu/api.h                                             |    1 
 kernel/include/linux/spinlock_types_up.h                                          |    4 
 kernel/tools/perf/util/parse-events.y                                             |    4 
 kernel/kernel/sched/Makefile                                                      |    2 
 kernel/arch/alpha/include/asm/spinlock_types.h                                    |    4 
 kernel/drivers/gpu/arm/mali400/mali/common/mali_osk.h                             |   47 
 kernel/drivers/gpu/drm/rockchip/ebc-dev/Makefile                                  |    1 
 kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/wl_escan.c                |   13 
 kernel/mm/zsmalloc.c                                                              |   80 
 kernel/drivers/iio/adc/rockchip_saradc.c                                          |   18 
 kernel/arch/arm/mach-sti/platsmp.c                                                |   10 
 kernel/drivers/gpu/arm/mali400/mali/linux/mali_osk_timers.c                       |   33 
 kernel/drivers/md/raid5.h                                                         |    1 
 kernel/arch/arm/mach-prima2/platsmp.c                                             |   10 
 kernel/net/netfilter/core.c                                                       |    6 
 kernel/drivers/clk/rockchip/clk-pvtm.c                                            |    3 
 kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/include/linux_osl.h       |    1 
 kernel/drivers/video/rockchip/rga3/rga_common.c                                   |   62 
 kernel/arch/arm/mach-spear/platsmp.c                                              |   10 
 kernel/net/sched/sch_generic.c                                                    |   14 
 kernel/virt/kvm/arm/arm.c                                                         |    6 
 kernel/drivers/gpu/drm/rockchip/ebc-dev/ebc_dev_y8_v8.S                           | 74565 +++++++++++++++++++++++++
 kernel/drivers/iommu/rockchip-iommu.c                                             |  213 
 kernel/arch/arm/kernel/entry-armv.S                                               |   19 
 kernel/kernel/locking/rtmutex_common.h                                            |   29 
 kernel/drivers/gpu/arm/mali400/mali/common/mali_control_timer.c                   |   22 
 kernel/drivers/misc/Kconfig                                                       |   12 
 kernel/drivers/nvmem/rockchip-otp.c                                               |   17 
 kernel/include/linux/rtmutex.h                                                    |   22 
 kernel/include/linux/sched/wake_q.h                                               |   27 
 kernel/arch/powerpc/kernel/entry_32.S                                             |   29 
 kernel/drivers/usb/core/hub.c                                                     |    1 
 kernel/drivers/video/rockchip/rga3/rga2_reg_info.c                                |  241 
 kernel/drivers/gpu/drm/rockchip/rockchip_drm_vop.h                                |  145 
 kernel/fs/inode.c                                                                 |    2 
 kernel/arch/arm64/boot/dts/rockchip/rk3568-evb1-ddr4-v10-linux-amp.dts            |    2 
 kernel/mm/vmstat.c                                                                |   12 
 kernel/drivers/gpu/drm/rockchip/rockchip_drm_vop.c                                |    6 
 kernel/arch/x86/mm/highmem_32.c                                                   |   13 
 kernel/net/xfrm/xfrm_ipcomp.c                                                     |   21 
 kernel/arch/sparc/kernel/irq_64.c                                                 |    2 
 kernel/Documentation/devicetree/bindings/clock/rockchip,clk-out.yaml              |  107 
 kernel/drivers/mmc/host/sdhci-of-dwcmshc.c                                        |  139 
 kernel/arch/powerpc/Kconfig                                                       |    6 
 kernel/drivers/md/raid5.c                                                         |    8 
 kernel/arch/powerpc/kernel/misc_32.S                                              |    2 
 kernel/drivers/video/rockchip/mpp/mpp_rkvenc.c                                    |   18 
 kernel/fs/dcache.c                                                                |   50 
 kernel/arch/x86/kernel/apic/io_apic.c                                             |   16 
 kernel/include/linux/irqflags.h                                                   |   23 
 kernel/kernel/Kconfig.locks                                                       |    4 
 kernel/mm/compaction.c                                                            |    6 
 kernel/drivers/tty/sysrq.c                                                        |    6 
 kernel/kernel/sched/cpudeadline.c                                                 |    4 
 kernel/fs/eventpoll.c                                                             |    4 
 kernel/fs/namespace.c                                                             |    8 
 kernel/include/linux/mm_types.h                                                   |    4 
 kernel/kernel/watchdog_hld.c                                                      |   10 
 kernel/arch/x86/include/asm/stackprotector.h                                      |    8 
 kernel/drivers/mmc/host/wmt-sdmmc.c                                               |    1 
 kernel/kernel/irq/handle.c                                                        |    8 
 kernel/kernel/rcu/srcutree.c                                                      |   36 
 kernel/arch/arm64/boot/dts/rockchip/rk3568-evb.dtsi                               | 1098 
 kernel/drivers/md/dm-rq.c                                                         |    1 
 kernel/arch/arm64/boot/dts/rockchip/rk3528-demo1-lp4-v10.dts                      |   31 
 kernel/arch/x86/kernel/cpu/intel_rdt_pseudo_lock.c                                |    2 
 kernel/arch/powerpc/include/asm/thread_info.h                                     |   18 
 kernel/drivers/gpu/drm/rockchip/rockchip_post_csc.h                               |   18 
 kernel/drivers/mmc/host/dw_mmc-k3.c                                               |    1 
 kernel/arch/arm64/kernel/process.c                                                |    2 
 kernel/arch/arm64/boot/dts/rockchip/rk3568-evb1-ddr4-v10.dtsi                     |  163 
 kernel/drivers/gpu/drm/rockchip/rockchip_post_csc.c                               | 1573 
 kernel/net/core/pktgen.c                                                          |    4 
 kernel/arch/arm64/boot/dts/rockchip/rk3566-evb1-ddr4-v10.dtsi                     |   76 
 kernel/samples/trace_events/trace-events-sample.c                                 |    2 
 kernel/include/linux/thread_info.h                                                |   12 
 kernel/kernel/debug/kdb/kdb_io.c                                                  |    2 
 kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/include/linuxver.h        |    5 
 kernel/net/ipv4/icmp.c                                                            |    8 
 kernel/drivers/firmware/rockchip_sip.c                                            |   32 
 kernel/drivers/scsi/fcoe/fcoe.c                                                   |   16 
 kernel/kernel/irq/settings.h                                                      |   12 
 kernel/Documentation/devicetree/bindings/soc/rockchip/rockchip-pm-config.txt      |   18 
 kernel/drivers/video/rockchip/rga3/rga_dma_buf.c                                  |   60 
 kernel/drivers/mmc/host/wbsd.c                                                    |    1 
 kernel/include/linux/cpu.h                                                        |    1 
 kernel/drivers/mmc/host/jz4740_mmc.c                                              |    1 
 kernel/drivers/video/rockchip/mpp/mpp_rkvdec2_link.h                              |    4 
 kernel/drivers/video/rockchip/mpp/mpp_rkvdec2_link.c                              |  191 
 kernel/fs/proc/array.c                                                            |    4 
 kernel/arch/arm64/boot/dts/rockchip/rk3528-evb2-ddr3-v10.dts                      |   31 
 kernel/drivers/net/phy/phy_device.c                                               |   10 
 kernel/init/main.c                                                                |    1 
 kernel/drivers/extcon/extcon.c                                                    |    5 
 kernel/drivers/soc/rockchip/mtd_vendor_storage.c                                  |   73 
 kernel/block/blk-ioc.c                                                            |    5 
 kernel/arch/arm64/boot/dts/rockchip/rk3528.dtsi                                   | 2489 
 kernel/fs/namei.c                                                                 |    4 
 kernel/fs/ext4/page-io.c                                                          |    6 
 kernel/drivers/video/rockchip/rga3/include/rga_drv.h                              |   26 
 kernel/arch/arm64/configs/rockchip_linux_defconfig                                |  512 
 kernel/arch/xtensa/include/asm/spinlock_types.h                                   |    4 
 kernel/lib/ubsan.c                                                                |   69 
 kernel/drivers/usb/serial/Makefile                                                |    1 
 kernel/drivers/clk/rockchip/clk-rk3528.c                                          | 1175 
 kernel/arch/arm64/kernel/cpufeature.c                                             |    6 
 kernel/arch/mips/kernel/mips-mt-fpaff.c                                           |    2 
 kernel/include/linux/fscache.h                                                    |    1 
 kernel/include/linux/timer.h                                                      |    2 
 kernel/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c                               | 1176 
 kernel/kernel/locking/spinlock_debug.c                                            |    5 
 kernel/fs/nfs/nfs4proc.c                                                          |    4 
 kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dbus.c                    |   27 
 kernel/include/linux/uaccess.h                                                    |    2 
 kernel/init/init_task.c                                                           |   14 
 kernel/include/dt-bindings/soc/rockchip-system-status.h                           |    4 
 kernel/lib/irq_poll.c                                                             |    5 
 kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/Makefile                  |   33 
 kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dhd_pno.c                 |    2 
 kernel/sound/soc/rockchip/rockchip_pdm.c                                          |   39 
 kernel/arch/sh/kernel/irq.c                                                       |    2 
 kernel/Makefile                                                                   |    2 
 kernel/drivers/media/platform/rockchip/cif/capture.c                              |  141 
 kernel/drivers/gpu/drm/drm_prime.c                                                |   20 
 kernel/sound/soc/codecs/rk817_codec.c                                             |  117 
 kernel/arch/x86/kernel/irq_32.c                                                   |    2 
 kernel/include/soc/rockchip/rockchip_system_monitor.h                             |    6 
 kernel/arch/hexagon/include/asm/spinlock_types.h                                  |    4 
 kernel/drivers/soc/rockchip/Kconfig.cpu                                           |    3 
 kernel/drivers/mmc/host/mxs-mmc.c                                                 |    1 
 kernel/drivers/net/ethernet/stmicro/stmmac/common.h                               |    7 
 kernel/arch/arm64/boot/dts/rockchip/rk3568-evb5-ddr4-v10.dtsi                     |   13 
 kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/wl_cfgvendor.c            |   41 
 kernel/arch/x86/entry/entry_32.S                                                  |   17 
 kernel/drivers/firmware/arm_sdei.c                                                |   41 
 kernel/init/Makefile                                                              |    2 
 kernel/drivers/phy/rockchip/phy-rockchip-inno-usb2.c                              |  254 
 kernel/block/blk-softirq.c                                                        |    3 
 kernel/drivers/char/hw_random/rockchip-rng.c                                      |  120 
 kernel/drivers/net/ethernet/stmicro/stmmac/dwmac4_lib.c                           |    4 
 kernel/include/linux/locallock.h                                                  |  282 
 kernel/drivers/soc/rockchip/Kconfig                                               |   13 
 kernel/drivers/usb/gadget/function/uvc_v4l2.c                                     |    2 
 kernel/fs/squashfs/decompressor_multi_percpu.c                                    |   16 
 kernel/drivers/gpu/drm/rockchip/ebc-dev/epdlut/pvi_waveform_v8.S                  | 2097 
 kernel/drivers/video/rockchip/rga3/include/rga_iommu.h                            |   36 
 kernel/kernel/rcu/rcutorture.c                                                    |    7 
 kernel/drivers/devfreq/event/rockchip-dfi.c                                       |   49 
 kernel/drivers/video/rockchip/rga3/rga_policy.c                                   |   18 
 kernel/drivers/dma-buf/dma-buf.c                                                  |    8 
 kernel/sound/soc/generic/simple-card.c                                            |    4 
 kernel/arch/arm/mach-imx/cpuidle-imx6q.c                                          |   10 
 kernel/mm/swap.c                                                                  |   74 
 kernel/drivers/soc/rockchip/rockchip_pm_config.c                                  |    1 
 kernel/arch/arm/configs/rv1126-snapshot.config                                    |    2 
 kernel/drivers/mmc/host/atmel-mci.c                                               |    1 
 kernel/drivers/mmc/host/usdhi6rol0.c                                              |    1 
 kernel/include/linux/rwlock_types.h                                               |    4 
 kernel/drivers/spi/spi-rockchip.c                                                 |  386 
 kernel/drivers/devfreq/rockchip_dmc_dbg.c                                         |   96 
 kernel/drivers/dma-buf/reservation.c                                              |   43 
 kernel/arch/arm64/boot/dts/rockchip/rk3568-nvr-demo-v10.dtsi                      |   30 
 kernel/sound/soc/codecs/hdmi-codec.c                                              |   67 
 kernel/kernel/time/posix-cpu-timers.c                                             |  181 
 kernel/drivers/mmc/core/mmc_ops.c                                                 |    6 
 kernel/arch/arm64/boot/dts/rockchip/rk3528-demo4-ddr4-v10.dtsi                    |   92 
 kernel/arch/arm64/boot/dts/rockchip/rk3528-demo4-ddr4-v10.dts                     |   32 
 kernel/drivers/gpu/drm/rockchip/dw-mipi-dsi.c                                     |    7 
 kernel/Documentation/devicetree/bindings/mmc/rockchip-dw-mshc.txt                 |   33 
 kernel/arch/arm64/boot/dts/rockchip/NK-R36S0.dts                                  |   12 
 kernel/arch/arm64/include/asm/thread_info.h                                       |    6 
 kernel/kernel/sched/swait.c                                                       |   22 
 kernel/arch/arm64/boot/dts/rockchip/rk3568-android.dtsi                           |    2 
 kernel/kernel/rcu/tree_exp.h                                                      |    9 
 kernel/arch/arm64/boot/dts/rockchip/px30s-dram-default-timing.dtsi                |   10 
 kernel/include/net/net_seq_lock.h                                                 |   15 
 kernel/arch/arm/mach-omap2/omap-smp.c                                             |   10 
 kernel/tools/perf/tests/bp_account.c                                              |    2 
 kernel/drivers/media/i2c/Makefile                                                 |    1 
 kernel/net/packet/af_packet.c                                                     |    5 
 kernel/arch/arm64/boot/dts/rockchip/rk3568-evb1-ddr4-v10.dts                      |   12 
 kernel/drivers/cpufreq/Kconfig.x86                                                |    2 
 kernel/fs/userfaultfd.c                                                           |   12 
 kernel/include/linux/dcache.h                                                     |    4 
 kernel/arch/arm64/boot/dts/rockchip/rk3326-linux.dtsi                             |    6 
 kernel/drivers/mmc/host/sdhci-pxav3.c                                             |    1 
 kernel/drivers/mmc/host/sh_mmcif.c                                                |    1 
 kernel/drivers/mmc/host/moxart-mmc.c                                              |    1 
 kernel/tools/lib/traceevent/Makefile                                              |    2 
 kernel/drivers/gpu/drm/rockchip/ebc-dev/bufmanage/buf_manage.c                    |   23 
 kernel/drivers/mmc/host/s3cmci.c                                                  |    1 
 kernel/drivers/gpu/drm/rockchip/ebc-dev/bufmanage/buf_manage.h                    |    1 
 kernel/drivers/tty/serial/omap-serial.c                                           |   12 
 kernel/drivers/video/rockchip/mpp/mpp_jpgdec.c                                    |   18 
 kernel/kernel/rcu/Kconfig                                                         |    6 
 kernel/localversion-rt                                                            |    1 
 kernel/drivers/video/rockchip/mpp/mpp_rkvdec.c                                    |   12 
 kernel/include/linux/arm_sdei.h                                                   |   40 
 kernel/drivers/headset_observe/rockchip_headset_core.c                            |   29 
 kernel/kernel/sched/sched.h                                                       |   14 
 kernel/kernel/sched/debug.c                                                       |    4 
 kernel/drivers/media/i2c/gc2145.c                                                 |   22 
 kernel/drivers/block/zram/zcomp.c                                                 |   13 
 kernel/arch/arm64/boot/dts/rockchip/rk3328.dtsi                                   |    1 
 kernel/kernel/sched/cpupri.c                                                      |    4 
 kernel/crypto/scompress.c                                                         |    6 
 kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dhd.h                     |   12 
 kernel/kernel/sched/rt.c                                                          |    8 
 kernel/drivers/mmc/host/tmio_mmc.c                                                |    1 
 kernel/scripts/mkimg                                                              |    6 
 kernel/include/linux/device.h                                                     |   11 
 kernel/drivers/block/zram/zcomp.h                                                 |    1 
 kernel/kernel/time/timer.c                                                        |   89 
 kernel/include/linux/rwsem_rt.h                                                   |   69 
 kernel/drivers/mmc/host/sdhci-bcm-kona.c                                          |    1 
 kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dhd_debug.c               |    2 
 kernel/drivers/gpu/drm/rockchip/rockchip_drm_gem.c                                |   18 
 kernel/drivers/usb/typec/tcpm/tcpm.c                                              |    2 
 kernel/drivers/clk/rockchip/Kconfig                                               |    6 
 kernel/drivers/gpu/drm/rockchip/rockchip_drm_fbdev.c                              |    2 
 kernel/kernel/trace/trace_events.c                                                |    2 
 kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/wl_android.c              |    3 
 kernel/drivers/tty/serial/8250/8250_port.c                                        |    5 
 kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/include/epivers.h         |    2 
 kernel/drivers/rknpu/rknpu_debugger.c                                             |   10 
 kernel/arch/arm/kernel/asm-offsets.c                                              |    1 
 kernel/drivers/gpu/drm/drm_edid.c                                                 |  108 
 kernel/arch/arm64/configs/rockchip_rt.config                                      |   22 
 kernel/drivers/gpu/arm/mali400/mali/linux/mali_internal_sync.c                    |   10 
 kernel/include/linux/workqueue.h                                                  |    4 
 kernel/kernel/power/wakeup_reason.c                                               |   36 
 kernel/drivers/clk/rockchip/clk-rk3399.c                                          |    4 
 kernel/drivers/media/platform/rockchip/isp/dmarx.c                                |    6 
 kernel/include/linux/sched/mm.h                                                   |   11 
 kernel/arch/arm64/boot/dts/rockchip/rk3568j.dtsi                                  |    2 
 kernel/drivers/crypto/rockchip/rk_crypto_skcipher_utils.c                         |    8 
 kernel/kernel/workqueue_internal.h                                                |    5 
 kernel/drivers/net/ethernet/stmicro/stmmac/dwmac-ipq806x.c                        |   20 
 kernel/include/uapi/linux/cec.h                                                   |    6 
 kernel/arch/arm/boot/dts/rv1126-pinctrl.dtsi                                      |   11 
 kernel/drivers/hv/hv.c                                                            |    4 
 kernel/drivers/infiniband/hw/hfi1/sdma.c                                          |    3 
 kernel/drivers/video/rockchip/mpp/mpp_vdpu2.c                                     |   84 
 kernel/include/linux/percpu.h                                                     |   29 
 kernel/drivers/gpu/drm/i915/intel_sprite.c                                        |   13 
 kernel/arch/powerpc/platforms/ps3/device-init.c                                   |    4 
 kernel/drivers/i2c/busses/i2c-hix5hd2.c                                           |    3 
 kernel/arch/arm64/configs/rk3528_box.config                                       |   65 
 kernel/arch/arm64/boot/dts/rockchip/rk3566-evb2-lp4x-v10.dtsi                     |   29 
 kernel/arch/arm64/boot/dts/rockchip/rk3399-linux.dtsi                             |    6 
 kernel/drivers/gpu/arm/mali400/mali/linux/mali_kernel_linux.c                     |   55 
 kernel/sound/soc/rockchip/Kconfig                                                 |    1 
 kernel/drivers/soc/rockchip/sdmmc_vendor_storage.c                                |   42 
 kernel/kernel/locking/rtmutex.c                                                   |  962 
 kernel/include/linux/interrupt.h                                                  |   63 
 kernel/net/sunrpc/svc_xprt.c                                                      |    4 
 kernel/sound/core/pcm_dmaengine.c                                                 |   12 
 kernel/drivers/net/ethernet/stmicro/stmmac/stmmac.h                               |   19 
 kernel/drivers/pci/controller/rockchip-pcie-dma.h                                 |    1 
 kernel/drivers/devfreq/rockchip_dmc.c                                             |  134 
 kernel/drivers/video/rockchip/mpp/mpp_iep2.c                                      |  105 
 kernel/drivers/net/ethernet/stmicro/stmmac/dwmac1000.h                            |    8 
 kernel/kernel/rcu/update.c                                                        |    6 
 kernel/drivers/clk/rockchip/clk-rk3568.c                                          |    6 
 kernel/virt/kvm/arm/arch_timer.c                                                  |    6 
 kernel/arch/arm/mach-qcom/platsmp.c                                               |   10 
 kernel/include/linux/trace_events.h                                               |    2 
 kernel/arch/arm64/boot/dts/rockchip/rk3528-pinctrl.dtsi                           | 1406 
 kernel/tools/perf/util/parse-events.c                                             |   61 
 kernel/drivers/devfreq/rockchip_bus.c                                             |    1 
 kernel/drivers/mmc/host/dw_mmc.h                                                  |    3 
 kernel/drivers/net/phy/fixed_phy.c                                                |   23 
 kernel/drivers/infiniband/hw/qib/qib_file_ops.c                                   |    7 
 kernel/drivers/mmc/host/dw_mmc.c                                                  |   29 
 kernel/include/linux/spinlock_types_raw.h                                         |   55 
 kernel/mm/slub.c                                                                  |  139 
 kernel/security/apparmor/include/path.h                                           |   19 
 kernel/sound/core/control_compat.c                                                |    4 
 kernel/drivers/mmc/host/dw_mmc-pltfm.c                                            |    1 
 kernel/arch/arm64/boot/dts/rockchip/rk3528-linux.dtsi                             |   88 
 kernel/net/core/gen_stats.c                                                       |    8 
 kernel/arch/arm/configs/sama5_defconfig                                           |    2 
 kernel/fs/fuse/dir.c                                                              |    2 
 kernel/arch/arm64/include/asm/spinlock_types.h                                    |    4 
 kernel/drivers/gpu/drm/rockchip/rockchip_drm_tve.c                                |  509 
 kernel/drivers/gpu/drm/rockchip/rockchip_drm_tve.h                                |  169 
 kernel/include/linux/bottom_half.h                                                |   34 
 kernel/net/core/gen_estimator.c                                                   |    6 
 kernel/arch/x86/Kconfig                                                           |    8 
 kernel/drivers/clk/rockchip/Makefile                                              |    3 
 kernel/kernel/locking/rwsem-rt.c                                                  |  312 
 kernel/block/blk-mq.h                                                             |    4 
 kernel/kernel/Kconfig.preempt                                                     |   39 
 kernel/arch/arm64/boot/dts/rockchip/rk3528-evb1-ddr4-v10-linux.dts                |    8 
 kernel/block/blk-mq.c                                                             |   36 
 kernel/kernel/ksysfs.c                                                            |   12 
 kernel/drivers/crypto/rockchip/Kconfig                                            |    4 
 kernel/fs/nfs/delegation.c                                                        |    4 
 kernel/arch/arm/mm/fault.c                                                        |    6 
 kernel/fs/nfs/inode.c                                                             |    4 
 kernel/arch/arm64/boot/dts/rockchip/Makefile                                      |    9 
 kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/wl_iw.c                   |   24 
 kernel/include/linux/percpu-rwsem.h                                               |   24 
 kernel/include/dt-bindings/suspend/rockchip-rk3528.h                              |   54 
 kernel/drivers/media/i2c/imx241.c                                                 | 1356 
 kernel/arch/arm/boot/dts/rk3036.dtsi                                              |   24 
 kernel/kernel/sched/features.h                                                    |    8 
 kernel/drivers/pci/controller/dwc/pcie-designware-host.c                          |    4 
 kernel/drivers/mmc/host/mvsdio.c                                                  |    1 
 kernel/net/core/dev.c                                                             |   61 
 kernel/fs/cifs/readdir.c                                                          |    2 
 kernel/drivers/of/base.c                                                          |   19 
 kernel/drivers/gpu/arm/mali400/mali/linux/mali_devfreq.c                          |   14 
 kernel/drivers/soc/rockchip/rockchip_opp_select.c                                 |  160 
 kernel/drivers/mmc/core/core.c                                                    |    4 
 device/rockchip/common/build.sh                                                   |    2 
 kernel/arch/arm64/boot/dts/rockchip/rk3358-linux.dtsi                             |    9 
 kernel/arch/arm64/configs/px30_linux_defconfig                                    |    5 
 kernel/drivers/crypto/rockchip/rk_crypto_v2_akcipher.c                            |    2 
 kernel/drivers/mtd/nand/raw/rockchip_nand_v6.c                                    |   26 
 kernel/drivers/video/rockchip/mpp/mpp_vdpp.c                                      |   70 
 kernel/include/drm/bridge/dw_hdmi.h                                               |    6 
 kernel/drivers/pci/controller/dwc/pcie-dw-ep-rockchip.c                           |  376 
 kernel/include/linux/nfs_fs.h                                                     |    4 
 kernel/lib/debugobjects.c                                                         |    5 
 kernel/drivers/net/ethernet/stmicro/stmmac/Kconfig                                |   36 
 kernel/drivers/net/ethernet/stmicro/stmmac/dwmac-rk-tool.c                        |  113 
 kernel/scripts/io-domain.sh                                                       |   21 
 kernel/drivers/net/ethernet/stmicro/stmmac/dwmac-rk-tool.h                        |   13 
 kernel/arch/arm64/configs/rk3358_linux.config                                     |   13 
 kernel/arch/arm64/boot/dts/rockchip/rk3528-evb3-lp4x-v10.dtsi                     |  132 
 kernel/drivers/dma-buf/heaps/Makefile                                             |    2 
 kernel/drivers/mmc/host/mtk-sd.c                                                  |    1 
 kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dhd_linux_exportfs.c      |    4 
 kernel/drivers/net/wireless/rockchip_wlan/uwe5621ds/unisocwifi/Makefile           |    2 
 kernel/lib/locking-selftest.c                                                     |   50 
 kernel/arch/x86/crypto/aesni-intel_glue.c                                         |   22 
 kernel/arch/arm64/kernel/fpsimd.c                                                 |   31 
 kernel/drivers/iio/imu/inv_icm40605/icm40605.h                                    |    3 
 kernel/mm/slab.c                                                                  |   94 
 kernel/drivers/iio/imu/inv_icm40605/icm40605_ring.c                               |    2 
 kernel/drivers/media/platform/rockchip/isp/dev.c                                  |    6 
 kernel/arch/x86/crypto/cast5_avx_glue.c                                           |   21 
 kernel/drivers/video/rockchip/rga3/rga3_reg_info.c                                |  396 
 kernel/kernel/time/tick-common.c                                                  |   10 
 kernel/drivers/net/ethernet/stmicro/stmmac/dwmac4_core.c                          |    4 
 kernel/drivers/net/ethernet/stmicro/stmmac/stmmac_mdio.c                          |    1 
 kernel/kernel/power/suspend.c                                                     |    4 
 kernel/sound/soc/codecs/Makefile                                                  |    2 
 kernel/mm/slab.h                                                                  |    2 
 kernel/include/linux/blk-cgroup.h                                                 |    2 
 kernel/arch/arm64/kernel/signal.c                                                 |    2 
 kernel/drivers/video/rockchip/mpp/mpp_rkvdec2.c                                   |   81 
 kernel/include/linux/rcupdate.h                                                   |   75 
 kernel/drivers/media/platform/rockchip/isp/capture_v21.c                          |  113 
 kernel/drivers/video/rockchip/mpp/mpp_rkvdec2.h                                   |    7 
 kernel/kernel/time/itimer.c                                                       |    1 
 kernel/arch/arm/plat-versatile/platsmp.c                                          |   10 
 kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/rk_dhd_pcie_linux.h       |   37 
 kernel/drivers/mmc/host/sdhci-s3c.c                                               |    1 
 kernel/fs/exec.c                                                                  |    2 
 kernel/drivers/mmc/host/omap_hsmmc.c                                              |    1 
 kernel/drivers/net/ethernet/stmicro/stmmac/mmc_core.c                             |    2 
 kernel/include/linux/vmstat.h                                                     |    4 
 kernel/sound/soc/codecs/rk3528_codec.c                                            |  771 
 kernel/tools/perf/bench/sched-messaging.c                                         |    4 
 kernel/include/linux/rcu_assign_pointer.h                                         |   54 
 kernel/arch/arm/boot/dts/rk3288.dtsi                                              |    3 
 kernel/sound/soc/codecs/rk3528_codec.h                                            |  229 
 kernel/include/linux/extcon.h                                                     |    1 
 kernel/arch/arm64/boot/dts/rockchip/rk3566.dtsi                                   |    3 
 kernel/drivers/net/ethernet/stmicro/stmmac/dwmac4_dma.c                           |   26 
 kernel/drivers/irqchip/irq-gic-v3-its.c                                           |   82 
 kernel/drivers/infiniband/hw/hfi1/affinity.c                                      |    6 
 kernel/Documentation/devicetree/bindings/phy/phy-rockchip-inno-usb2.txt           |    3 
 kernel/arch/arm64/boot/dts/rockchip/rk3566-evb2-lp4x-v10-linux.dts                |   10 
 kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dhd_linux_priv.h          |   47 
 kernel/arch/arm64/boot/dts/rockchip/rk3568-evb6-ddr3-v10.dtsi                     |   13 
 kernel/drivers/media/platform/rockchip/isp/rkisp.c                                |   49 
 kernel/include/linux/memcontrol.h                                                 |    2 
 kernel/sound/core/pcm_trace.h                                                     |   26 
 kernel/net/wireless/scan.c                                                        |   12 
 kernel/drivers/mmc/host/davinci_mmc.c                                             |    1 
 kernel/include/linux/wait.h                                                       |    5 
 kernel/drivers/gpu/drm/rockchip/ebc-dev/epdlut/rkf_waveform_v8.S                  | 1807 
 kernel/drivers/usb/host/xhci-ring.c                                               |    4 
 kernel/kernel/sched/swork.c                                                       |  173 
 kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dhd_linux_platdev.c       |   15 
 kernel/drivers/rkflash/sfc_nand.c                                                 |   27 
 kernel/arch/arm/Makefile                                                          |    1 
 kernel/drivers/phy/rockchip/phy-rockchip-inno-hdmi-phy.c                          |  311 
 kernel/include/linux/preempt.h                                                    |  107 
 kernel/drivers/leds/trigger/Kconfig                                               |    1 
 kernel/arch/arm64/boot/dts/rockchip/rk3566-evb5-lp4x-v10.dtsi                     |   16 
 kernel/arch/x86/kernel/fpu/signal.c                                               |    2 
 kernel/drivers/video/rockchip/rga3/include/rga2_reg_info.h                        |  251 
 kernel/include/linux/jbd2.h                                                       |   24 
 kernel/arch/x86/kernel/process_32.c                                               |   32 
 kernel/drivers/media/platform/rockchip/isp/isp_params_v21.c                       |    1 
 kernel/include/linux/kthread.h                                                    |    4 
 kernel/include/linux/netdevice.h                                                  |  101 
 kernel/lib/radix-tree.c                                                           |   32 
 kernel/mm/Kconfig                                                                 |    2 
 kernel/drivers/spi/spi-rockchip-test.c                                            |   12 
 kernel/arch/arm/boot/dts/Makefile                                                 |    6 
 kernel/kernel/ptrace.c                                                            |   32 
 kernel/arch/arm64/boot/dts/rockchip/rk3566-box.dtsi                               |   27 
 kernel/drivers/soc/rockchip/rockchip_debug.c                                      |   13 
 kernel/sound/soc/rockchip/rockchip_sai.c                                          |  226 
 kernel/drivers/mmc/host/sdhci-tegra.c                                             |    1 
 kernel/kernel/cpu.c                                                               |   44 
 kernel/drivers/soc/rockchip/flash_vendor_storage.c                                |   25 
 kernel/kernel/cgroup/cpuset.c                                                     |   68 
 kernel/arch/x86/include/asm/signal.h                                              |   13 
 kernel/kernel/softirq.c                                                           |  750 
 kernel/arch/arm/boot/dts/rk3066a.dtsi                                             |   20 
 kernel/kernel/irq/spurious.c                                                      |    8 
 kernel/drivers/mmc/host/au1xmmc.c                                                 |    1 
 kernel/drivers/staging/android/fiq_debugger/fiq_debugger.h                        |    3 
 kernel/drivers/hv/vmbus_drv.c                                                     |    4 
 kernel/drivers/staging/android/fiq_debugger/fiq_debugger.c                        |   24 
 kernel/include/dt-bindings/clock/rk3528-cru.h                                     |  747 
 kernel/drivers/thermal/rockchip_thermal.c                                         |  174 
 kernel/include/linux/seqlock.h                                                    |   66 
 kernel/drivers/crypto/rockchip/rk_crypto_ahash_utils.c                            |    3 
 kernel/kernel/signal.c                                                            |  116 
 kernel/include/linux/netfilter/x_tables.h                                         |    7 
 kernel/drivers/gpu/drm/i915/i915_gem.c                                            |   10 
 kernel/drivers/rknpu/rknpu_drv.c                                                  |   14 
 kernel/drivers/video/rockchip/mpp/mpp_iommu.c                                     |    9 
 kernel/security/apparmor/lsm.c                                                    |    2 
 kernel/drivers/gpu/arm/mali400/mali/common/mali_osk_mali.h                        |    3 
 kernel/kernel/trace/trace_hwlat.c                                                 |    2 
 kernel/drivers/gpu/drm/vmwgfx/vmwgfx_fifo.c                                       |    2 
 kernel/arch/arm64/configs/rk3326_linux.config                                     |   17 
 kernel/drivers/crypto/rockchip/rk_crypto_core.c                                   |   38 
 kernel/arch/arm/mach-exynos/platsmp.c                                             |   12 
 kernel/include/linux/reservation.h                                                |    4 
 kernel/drivers/net/ethernet/stmicro/stmmac/hwif.c                                 |   30 
 kernel/include/linux/rwsem.h                                                      |   11 
 kernel/drivers/video/rockchip/rga3/rga_drv.c                                      |  201 
 kernel/net/bluetooth/rfcomm/sock.c                                                |    7 
 kernel/fs/proc/proc_sysctl.c                                                      |    2 
 kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/wl_cfg80211.c             |  341 
 kernel/drivers/video/rockchip/mpp/mpp_iommu.h                                     |   15 
 kernel/arch/arm64/kvm/va_layout.c                                                 |    7 
 kernel/drivers/media/platform/rockchip/isp/capture.c                              |    8 
 kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/wl_cfg80211.h             |    9 
 kernel/arch/arm64/boot/dts/rockchip/rk3528-android.dtsi                           |  106 
 kernel/drivers/md/bcache/Kconfig                                                  |    1 
 kernel/sound/soc/codecs/rk312x_codec.c                                            |    3 
 kernel/arch/arm64/boot/dts/rockchip/rk3528-demo1-lp4-v10.dtsi                     |   92 
 kernel/kernel/locking/locktorture.c                                               |    1 
 kernel/include/linux/usb/hcd.h                                                    |    3 
 kernel/arch/arm/boot/dts/rk3528-evb1-ddr4-v10.dts                                 |   12 
 kernel/kernel/time/timekeeping.h                                                  |    3 
 kernel/drivers/staging/android/ion/ion_trace.h                                    |    2 
 kernel/mm/vmalloc.c                                                               |   13 
 kernel/drivers/pwm/pwm-rockchip.c                                                 |    6 
 kernel/drivers/media/cec/cec-adap.c                                               |   50 
 kernel/drivers/mmc/host/sdhci-acpi.c                                              |    1 
 kernel/kernel/time/timekeeping.c                                                  |    6 
 kernel/fs/buffer.c                                                                |   21 
 kernel/drivers/pci/controller/dwc/Kconfig                                         |    7 
 kernel/include/dt-bindings/display/rockchip-tve.h                                 |   15 
 kernel/kernel/cgroup/rstat.c                                                      |    5 
 kernel/drivers/mtd/nand/raw/rockchip_nand_v9.c                                    |   26 
 kernel/drivers/net/ethernet/stmicro/stmmac/dwmac-generic.c                        |    1 
 kernel/include/linux/irq_work.h                                                   |    8 
 kernel/kernel/kthread.c                                                           |   42 
 kernel/drivers/input/remotectl/rockchip_pwm_remotectl.c                           |    5 
 kernel/fs/nfs/dir.c                                                               |   12 
 kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/bcmsdh_sdmmc.c            |   49 
 kernel/drivers/net/ethernet/stmicro/stmmac/stmmac_uio.c                           | 1178 
 kernel/Documentation/devicetree/bindings/devfreq/event/rockchip-dfi.txt           |    1 
 kernel/arch/mips/Kconfig                                                          |    2 
 kernel/drivers/video/rockchip/rga3/include/rga_debugger.h                         |    1 
 kernel/arch/powerpc/platforms/cell/spufs/sched.c                                  |    2 
 kernel/arch/x86/entry/entry_64.S                                                  |   18 
 kernel/arch/arm64/boot/dts/rockchip/rk3528-evb1-ddr4-v10.dtsi                     |  137 
 kernel/drivers/gpu/drm/i915/i915_irq.c                                            |    2 
 kernel/arch/mips/kernel/traps.c                                                   |    6 
 kernel/drivers/tee/optee/supp.c                                                   |   22 
 kernel/kernel/sched/topology.c                                                    |    1 
 kernel/include/linux/random.h                                                     |    2 
 kernel/mm/highmem.c                                                               |    6 
 kernel/include/asm-generic/percpu.h                                               |    1 
 kernel/include/net/sch_generic.h                                                  |   19 
 kernel/arch/arm64/boot/dts/rockchip/rk3568-amp.dtsi                               |    9 
 kernel/drivers/thermal/x86_pkg_temp_thermal.c                                     |   24 
 kernel/drivers/soc/rockchip/rk_fiq_debugger.c                                     |  181 
 kernel/drivers/video/rockchip/rga3/rga_fence.c                                    |    4 
 kernel/include/linux/blk-mq.h                                                     |    2 
 kernel/arch/powerpc/include/asm/spinlock_types.h                                  |    4 
 kernel/arch/arm64/boot/dts/rockchip/rk3568-nvr.dtsi                               |   21 
 kernel/drivers/video/rockchip/rga3/rga_iommu.c                                    |   49 
 kernel/sound/soc/rockchip/rockchip_i2s_tdm.h                                      |   37 
 kernel/drivers/mmc/host/android-goldfish.c                                        |    1 
 kernel/arch/arm64/boot/dts/rockchip/px30-evb-ddr3-v10.dtsi                        |   43 
 kernel/sound/soc/rockchip/rockchip_i2s_tdm.c                                      |  951 
 kernel/net/wireless/sme.c                                                         |   32 
 kernel/drivers/tty/serial/amba-pl011.c                                            |   17 
 kernel/include/linux/pid.h                                                        |    1 
 kernel/include/linux/sched.h                                                      |  162 
 kernel/drivers/mmc/host/dw_mmc-exynos.c                                           |    1 
 kernel/arch/ia64/include/asm/spinlock_types.h                                     |    4 
 kernel/arch/arm/boot/dts/rk312x.dtsi                                              |   16 
 kernel/arch/arm64/boot/dts/rockchip/rk3528-evb1-ddr4-v10.dts                      |   35 
 kernel/drivers/usb/gadget/configfs.c                                              |   21 
 kernel/kernel/time/tick-broadcast-hrtimer.c                                       |    2 
 kernel/drivers/gpu/drm/rockchip/rockchip_vop_reg.h                                |  168 
 kernel/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c                             |  624 
 kernel/drivers/video/rockchip/rga3/include/rga_common.h                           |    6 
 kernel/arch/arm64/include/asm/alternative.h                                       |    6 
 kernel/drivers/mmc/host/sdhci-sirf.c                                              |    1 
 kernel/drivers/gpu/drm/radeon/radeon_display.c                                    |    2 
 kernel/include/linux/skbuff.h                                                     |    7 
 kernel/drivers/soc/rockchip/rockchip-cpuinfo.c                                    |    9 
 kernel/kernel/irq/manage.c                                                        |   13 
 kernel/drivers/scsi/fcoe/fcoe_ctlr.c                                              |    4 
 kernel/drivers/gpu/arm/mali400/mali/common/mali_osk_types.h                       |    6 
 kernel/include/linux/rwlock_rt.h                                                  |  119 
 kernel/drivers/gpu/drm/bridge/synopsys/dw-hdmi.h                                  |   13 
 kernel/arch/powerpc/kernel/entry_64.S                                             |   32 
 kernel/arch/powerpc/kernel/irq.c                                                  |    2 
 kernel/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c                                  |  520 
 kernel/arch/x86/kernel/asm-offsets.c                                              |    2 
 kernel/fs/ntfs/aops.c                                                             |   10 
 kernel/arch/arm/boot/dts/rv1126-thunder-boot-emmc.dtsi                            |    7 
 kernel/drivers/clocksource/Makefile                                               |    3 
 kernel/drivers/usb/host/ehci-hub.c                                                |    3 
 kernel/kernel/trace/trace.h                                                       |    2 
 kernel/include/net/gen_stats.h                                                    |    9 
 kernel/drivers/misc/nkio/nk_io_core.c_bak                                         |  427 
 kernel/kernel/trace/trace.c                                                       |   37 
 kernel/arch/arm/boot/dts/rv1126.dtsi                                              |    6 
 kernel/arch/powerpc/kernel/asm-offsets.c                                          |    1 
 kernel/drivers/mmc/host/sdhci-cns3xxx.c                                           |    1 
 kernel/Documentation/devicetree/bindings/devfreq/rockchip_dmc.txt                 |    1 
 kernel/arch/arm/include/asm/switch_to.h                                           |    8 
 kernel/drivers/media/platform/rockchip/cif/hw.h                                   |    2 
 kernel/fs/aio.c                                                                   |   13 
 kernel/kernel/power/hibernate.c                                                   |    7 
 kernel/Documentation/devicetree/bindings/spi/spi-rockchip.txt                     |    5 
 kernel/drivers/gpu/drm/bridge/analogix/analogix_dp_reg.c                          |    2 
 kernel/drivers/media/platform/rockchip/cif/hw.c                                   |    1 
 kernel/drivers/mmc/host/sdhci-dove.c                                              |    1 
 kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dhd_config.h              |   10 
 kernel/drivers/video/rockchip/mpp/mpp_vepu1.c                                     |   18 
 kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dhd_config.c              |  265 
 kernel/fs/locks.c                                                                 |   32 
 kernel/include/linux/fs.h                                                         |    2 
 kernel/arch/arm64/boot/dts/rockchip/rk3528-iotest-lp3-v10.dts                     |  203 
 kernel/mm/page_alloc.c                                                            |  196 
 kernel/net/Kconfig                                                                |    2 
 kernel/include/linux/kernel.h                                                     |    4 
 kernel/lib/smp_processor_id.c                                                     |    7 
 kernel/include/linux/rockchip/rockchip_sip.h                                      |    7 
 kernel/arch/arm64/kernel/entry.S                                                  |   12 
 kernel/drivers/gpu/drm/bridge/synopsys/dw-hdmi-cec.h                              |    7 
 kernel/drivers/media/platform/rockchip/isp/isp_params.h                           |    2 
 kernel/include/linux/spinlock_types_nort.h                                        |   33 
 kernel/drivers/crypto/caam/qi.c                                                   |   43 
 kernel/sound/soc/rockchip/rockchip_spdif.c                                        |   63 
 kernel/drivers/crypto/caam/qi.h                                                   |    2 
 kernel/include/linux/rwlock_types_rt.h                                            |   55 
 kernel/kernel/time/posix-timers.c                                                 |   42 
 kernel/include/linux/blkdev.h                                                     |    5 
 kernel/sound/soc/rockchip/rockchip_spdif.h                                        |   16 
 kernel/drivers/mmc/host/sdhci-of-hlwd.c                                           |    1 
 kernel/drivers/net/wireless/intersil/orinoco/orinoco_usb.c                        |    4 
 kernel/drivers/gpu/drm/bridge/synopsys/dw-hdmi-cec.c                              |  239 
 kernel/kernel/time/posix-timers.h                                                 |    2 
 kernel/net/ipv4/tcp_ipv4.c                                                        |    6 
 kernel/Documentation/devicetree/bindings/net/rockchip-dwmac.txt                   |    1 
 kernel/include/linux/completion.h                                                 |    8 
 kernel/kernel/time/jiffies.c                                                      |    7 
 kernel/include/linux/stop_machine.h                                               |    2 
 kernel/drivers/gpu/drm/i915/i915_trace.h                                          |    6 
 kernel/drivers/video/rockchip/mpp/mpp_rkvenc2.c                                   |   86 
 kernel/net/core/skbuff.c                                                          |   33 
 kernel/drivers/video/rockchip/rga3/include/rga_job.h                              |   14 
 kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/wl_android_ext.h          |    2 
 kernel/drivers/mmc/host/sdhci-iproc.c                                             |    1 
 kernel/drivers/mmc/host/sdhci-of-at91.c                                           |    1 
 kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dhd_sdio.c                |    3 
 kernel/include/linux/posix-timers.h                                               |    3 
 kernel/drivers/media/platform/rockchip/isp/hw.c                                   |    3 
 kernel/drivers/usb/gadget/function/u_serial.c                                     |  112 
 kernel/net/rfkill/rfkill-bt.c                                                     |  248 
 kernel/kernel/sched/fair.c                                                        |   86 
 kernel/drivers/dma-buf/heaps/rk_cma_heap.c                                        |  616 
 kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/wl_android_ext.c          |  225 
 kernel/kernel/locking/lockdep.c                                                   |    2 
 kernel/arch/arm/configs/rv1126-trailcamera.config                                 |    2 
 kernel/tools/perf/bench/futex-hash.c                                              |   12 
 kernel/include/linux/swap.h                                                       |    2 
 kernel/drivers/mmc/host/sdhci-pxav2.c                                             |    1 
 kernel/include/linux/spinlock_types.h                                             |   78 
 kernel/sound/soc/rockchip/rockchip_hdmi.c                                         |    3 
 kernel/drivers/usb/core/hcd.c                                                     |    3 
 kernel/drivers/net/phy/motorcomm.c                                                |   15 
 kernel/Documentation/devicetree/bindings/mailbox/rockchip-mailbox.txt             |    4 
 kernel/drivers/mmc/host/sdhci_f_sdh30.c                                           |    1 
 kernel/fs/nfs/nfs4state.c                                                         |   22 
 kernel/kernel/panic.c                                                             |    2 
 kernel/arch/powerpc/kernel/misc_64.S                                              |    2 
 kernel/drivers/net/ethernet/stmicro/stmmac/stmmac_tc.c                            |    7 
 kernel/arch/arm64/boot/dts/rockchip/rk3566-evb1-ddr4-v10.dts                      |   12 
 kernel/include/net/sock.h                                                         |    4 
 kernel/arch/arm/include/asm/spinlock_types.h                                      |    4 
 kernel/drivers/usb/serial/option.c                                                |  197 
 kernel/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c                                |  334 
 kernel/lib/Kconfig.debug                                                          |    2 
 kernel/drivers/soc/rockchip/pm_domains.c                                          |   47 
 kernel/fs/pstore/ram.c                                                            |   78 
 kernel/arch/arm/mach-at91/Kconfig                                                 |   25 
 kernel/drivers/crypto/rockchip/rk_crypto_v1_skcipher.c                            |    4 
 kernel/drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c                      |    8 
 kernel/include/soc/at91/atmel_tcb.h                                               |  183 
 kernel/arch/arm64/Kconfig                                                         |    1 
 kernel/include/linux/irqchip/arm-gic-v3.h                                         |    1 
 kernel/init/Kconfig                                                               |    5 
 kernel/arch/x86/kvm/x86.c                                                         |    7 
 kernel/arch/arm/include/asm/irq.h                                                 |    2 
 kernel/include/linux/hrtimer.h                                                    |   29 
 kernel/include/linux/signal.h                                                     |    1 
 kernel/include/uapi/linux/rk-pcie-ep.h                                            |   67 
 kernel/drivers/gpu/drm/rockchip/rockchip_drm_drv.c                                |   41 
 kernel/drivers/gpu/drm/rockchip/rockchip_drm_drv.h                                |   35 
 kernel/drivers/rtc/rtc-rk808.c                                                    |    7 
 kernel/arch/arm/configs/rockchip_linux_defconfig                                  |    2 
 kernel/include/uapi/linux/rkisp21-config.h                                        |    1 
 kernel/drivers/mmc/host/sdhci-st.c                                                |    1 
 kernel/drivers/gpu/drm/bridge/lontium-lt9611.c                                    |   10 
 kernel/drivers/media/platform/rockchip/isp/isp_ispp.h                             |    4 
 kernel/arch/arm/mach-hisi/platmcpm.c                                              |   22 
 kernel/arch/arm64/boot/dts/rockchip/rk-stb-ir-keymap.dtsi                         |  397 
 kernel/drivers/clk/rockchip/clk.h                                                 |   28 
 kernel/arch/arm64/boot/dts/rockchip/rk3566-eink.dtsi                              |    2 
 kernel/drivers/rkflash/sfc.c                                                      |    4 
 kernel/include/linux/spinlock_types_rt.h                                          |   48 
 kernel/arch/powerpc/kvm/Kconfig                                                   |    1 
 kernel/lib/scatterlist.c                                                          |    2 
 kernel/drivers/rkflash/sfc.h                                                      |    5 
 kernel/include/linux/list_bl.h                                                    |   30 
 kernel/drivers/gpu/drm/rockchip/Makefile                                          |    2 
 kernel/include/linux/idr.h                                                        |    5 
 kernel/arch/arm64/boot/dts/rockchip/rk3528-evb.dtsi                               |  672 
 kernel/drivers/media/i2c/imx464.c                                                 | 1042 
 kernel/scripts/mkcompile_h                                                        |    6 
 kernel/fs/timerfd.c                                                               |    6 
 kernel/drivers/mmc/host/omap.c                                                    |    1 
 kernel/drivers/gpu/drm/rockchip/rockchip_drm_fb.c                                 |   27 
 kernel/sound/soc/rockchip/rockchip_multi_dais_pcm.c                               |    3 
 kernel/arch/arm/kernel/entry-common.S                                             |    9 
 kernel/fs/proc/base.c                                                             |    3 
 kernel/include/dt-bindings/input/rk-ir.h                                          |   34 
 kernel/arch/arm64/boot/dts/rockchip/rk3568.dtsi                                   |  243 
 kernel/drivers/pci/switch/switchtec.c                                             |   24 
 kernel/arch/arm/Kconfig                                                           |    5 
 kernel/drivers/thermal/cpu_cooling.c                                              |    2 
 kernel/drivers/media/platform/rockchip/isp1/rkisp1.c                              |    2 
 kernel/arch/arm64/boot/dts/rockchip/px30-evb-ddr4-v10-linux.dts                   |   13 
 kernel/net/rds/ib_rdma.c                                                          |    3 
 kernel/sound/soc/rockchip/rockchip_i2s.c                                          |  120 
 kernel/drivers/clocksource/tcb_clksrc.c                                           |   69 
 kernel/drivers/usb/gadget/legacy/inode.c                                          |    4 
 kernel/drivers/misc/Makefile                                                      |    3 
 kernel/arch/arm64/boot/dts/rockchip/rk3528-demo.dtsi                              |  497 
 kernel/drivers/cpufreq/cpufreq_interactive.c                                      |   90 
 kernel/drivers/pci/controller/dwc/pcie-dw-dmatest.c                               |  128 
 kernel/drivers/gpu/arm/mali400/mali/platform/rk/rk.c                              |  206 
 kernel/drivers/pci/controller/dwc/pcie-dw-dmatest.h                               |    7 
 kernel/drivers/video/rockchip/mpp/mpp_service.c                                   |   35 
 kernel/drivers/clocksource/Kconfig                                                |   13 
 kernel/kernel/locking/spinlock.c                                                  |    7 
 kernel/sound/soc/rockchip/rockchip_multi_dais.c                                   |   10 
 kernel/drivers/gpu/drm/rockchip/ebc-dev/epdlut/epd_lut.c                          |    6 
 kernel/kernel/time/alarmtimer.c                                                   |    2 
 kernel/kernel/exit.c                                                              |    2 
 kernel/kernel/cgroup/cgroup.c                                                     |    9 
 kernel/drivers/gpu/drm/rockchip/ebc-dev/epdlut/epd_lut.h                          |    9 
 kernel/include/linux/pstore_ram.h                                                 |   20 
 kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dhd_pcie_linux.c          |   17 
 kernel/include/linux/rockchip/cpu.h                                               |   14 
 kernel/arch/arm64/boot/dts/rockchip/rk3528-evb3-lp4x-v10.dts                      |   50 
 kernel/mm/mmu_context.c                                                           |    2 
 kernel/fs/pstore/Kconfig                                                          |    6 
 kernel/include/dt-bindings/power/rk3528-power.h                                   |   18 
 kernel/arch/sh/include/asm/spinlock_types.h                                       |    4 
 kernel/drivers/usb/gadget/function/f_uac1.c                                       |    8 
 kernel/drivers/mfd/fusb302.c                                                      |  119 
 kernel/drivers/mmc/host/dw_mmc-rockchip.c                                         |    7 
 kernel/drivers/mfd/fusb302.h                                                      |   20 
 kernel/drivers/staging/android/vsoc.c                                             |    6 
 kernel/mm/memcontrol.c                                                            |   28 
 kernel/include/linux/rcutree.h                                                    |    8 
 kernel/drivers/watchdog/watchdog_dev.c                                            |    8 
 kernel/drivers/net/phy/rk630phy.c                                                 |   71 
 kernel/include/linux/swait.h                                                      |   16 
 kernel/fs/pstore/inode.c                                                          |   14 
 kernel/sound/soc/rockchip/rockchip_multicodecs.c                                  |  516 
 kernel/kernel/futex.c                                                             |  126 
 kernel/include/linux/irq.h                                                        |    4 
 kernel/include/linux/spinlock_api_smp.h                                           |    4 
 kernel/arch/arm64/boot/dts/rockchip/rk3568-dram-default-timing.dtsi               |    4 
 kernel/drivers/video/rockchip/mpp/mpp_vdpu1.c                                     |   82 
 kernel/arch/arm/boot/dts/rk3528-evb3-lp4x-v10.dts                                 |   12 
 kernel/drivers/gpu/drm/rockchip/rockchip_vop2_reg.c                               |  596 
 kernel/drivers/mmc/core/mmc.c                                                     |   27 
 kernel/drivers/video/rockchip/mpp/mpp_common.h                                    |   91 
 kernel/include/linux/delay.h                                                      |    6 
 kernel/drivers/media/spi/ms41908.c                                                |   16 
 kernel/arch/arm64/boot/dts/rockchip/rk3568-linux.dtsi                             |   47 
 kernel/drivers/mmc/host/sdhci-of-arasan.c                                         |    1 
 kernel/drivers/video/rockchip/mpp/mpp_common.c                                    |  455 
 kernel/drivers/clocksource/timer-atmel-tcb.c                                      |  617 
 kernel/arch/arm64/configs/rockchip_defconfig                                      |    2 
 kernel/drivers/mailbox/rockchip-mailbox.c                                         |   19 
 kernel/arch/arm64/boot/dts/rockchip/rk3566-evb3-ddr3-v10.dtsi                     |   16 
 kernel/drivers/media/platform/rockchip/isp/regs_v2x.h                             |    2 
 kernel/arch/x86/platform/efi/efi_64.c                                             |   10 
 kernel/drivers/gpu/drm/drm_gem.c                                                  |   17 
 kernel/drivers/hv/hyperv_vmbus.h                                                  |    1 
 kernel/include/linux/rbtree.h                                                     |    2 
 kernel/arch/powerpc/platforms/pseries/iommu.c                                     |   16 
 kernel/include/linux/printk.h                                                     |    2 
 kernel/kernel/locking/Makefile                                                    |    9 
 kernel/drivers/soc/rockchip/rockchip_thunderboot_mmc.c                            |   17 
 kernel/arch/s390/include/asm/spinlock_types.h                                     |    4 
 kernel/drivers/pinctrl/pinctrl-rockchip.c                                         |  208 
 kernel/arch/mips/include/asm/switch_to.h                                          |    4 
 kernel/drivers/pinctrl/pinctrl-rockchip.h                                         |    1 
 kernel/include/linux/platform_device.h                                            |    4 
 kernel/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c                         |    8 
 kernel/arch/arm/boot/dts/rk3528-evb4-ddr4-v10.dts                                 |   12 
 kernel/arch/arm/include/asm/thread_info.h                                         |    8 
 kernel/drivers/net/ethernet/stmicro/stmmac/Makefile                               |   23 
 kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/wl_cfgvif.h               |    9 
 kernel/arch/ia64/kernel/mca.c                                                     |    2 
 kernel/drivers/net/ethernet/stmicro/stmmac/stmmac_hwtstamp.c                      |   17 
 kernel/block/blk-core.c                                                           |   15 
 kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dhd_static_buf.c          |  115 
 kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/wl_cfgvif.c               |  103 
 kernel/drivers/video/rockchip/rga3/include/rga3_reg_info.h                        |  673 
 kernel/drivers/video/rockchip/rga3/rga_mm.c                                       |  279 
 kernel/arch/arm64/boot/dts/rockchip/px30.dtsi                                     |   10 
 kernel/include/linux/regulator/consumer.h                                         |    5 
 kernel/kernel/sched/deadline.c                                                    |   12 
 kernel/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c                           |    6 
 kernel/include/net/neighbour.h                                                    |    6 
 kernel/arch/arm64/boot/dts/rockchip/rk3568-evb2-lp4x-v10.dtsi                     |   13 
 kernel/arch/Kconfig                                                               |    1 
 kernel/fs/nfs/unlink.c                                                            |   35 
 kernel/drivers/gpu/drm/rockchip/cdn-dp-core.c                                     |    5 
 kernel/include/net/cfg80211.h                                                     |   15 
 kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dhd_linux.c               |  234 
 kernel/arch/x86/mm/iomap_32.c                                                     |   11 
 kernel/drivers/phy/rockchip/phy-rockchip-naneng-combphy.c                         |  190 
 kernel/drivers/pci/controller/dwc/pcie-dw-rockchip.c                              |  162 
 kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dhd_linux.h               |    6 
 kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/wl_iapsta.c               |  128 
 kernel/arch/arm64/boot/dts/rockchip/rk3528-evb2-ddr3-v10.dtsi                     |  138 
 kernel/include/linux/swork.h                                                      |   24 
 kernel/include/linux/sched/task.h                                                 |   11 
 kernel/sound/core/pcm_lib.c                                                       |    3 
 kernel/drivers/mmc/host/sdhci-of-esdhc.c                                          |    1 
 kernel/drivers/net/wireless/rockchip_wlan/uwe5621ds/unisocwifi/vendor.c           |    4 
 kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dbus_usb_linux.c          |   10 
 kernel/drivers/char/tpm/tpm_tis.c                                                 |   29 
 kernel/kernel/locking/rwlock-rt.c                                                 |  384 
 kernel/include/linux/spinlock_rt.h                                                |  156 
 kernel/drivers/firmware/efi/efi.c                                                 |    5 
 kernel/arch/arm64/boot/dts/rockchip/NK-R36S0.dtsi                                 |  353 
 kernel/kernel/locking/mutex-rt.c                                                  |  223 
 kernel/arch/arm64/boot/dts/rockchip/rk3399.dtsi                                   |   37 
 kernel/drivers/video/rockchip/mpp/mpp_debug.h                                     |    3 
 kernel/drivers/block/zram/zram_drv.h                                              |    3 
 kernel/kernel/time/hrtimer.c                                                      |  126 
 kernel/mm/kmemleak.c                                                              |   92 
 kernel/arch/arm64/crypto/Kconfig                                                  |   28 
 kernel/drivers/rknpu/rknpu_job.c                                                  |    8 
 kernel/fs/nfs/nfs4_fs.h                                                           |    2 
 kernel/arch/arm64/boot/dts/rockchip/rk3528-evb4-ddr4-v10.dts                      |   35 
 kernel/arch/arm64/kernel/alternative.c                                            |    1 
 kernel/drivers/gpu/drm/rockchip/inno_hdmi.c                                       |  116 
 kernel/drivers/mmc/host/mxcmmc.c                                                  |    1 
 kernel/drivers/block/zram/zram_drv.c                                              |   43 
 kernel/include/linux/irqdesc.h                                                    |    1 
 kernel/drivers/gpu/arm/mali400/mali/common/mali_group.h                           |    2 
 kernel/net/sched/sch_api.c                                                        |    2 
 kernel/drivers/gpu/arm/mali400/mali/common/mali_group.c                           |   46 
 kernel/drivers/video/rockchip/rga3/rga_debugger.c                                 |   27 
 kernel/drivers/gpu/drm/rockchip/rockchip_rgb.c                                    |   23 
 kernel/include/soc/rockchip/rockchip_iommu.h                                      |   15 
 /dev/null                                                                         |  243 
 kernel/drivers/gpu/drm/bridge/synopsys/dw-hdmi-i2s-audio.c                        |   18 
 kernel/fs/fscache/main.c                                                          |    1 
 kernel/drivers/gpio/gpiolib-sysfs.c                                               |    7 
 kernel/include/linux/mutex_rt.h                                                   |  130 
 kernel/drivers/connector/cn_proc.c                                                |    6 
 kernel/drivers/i2c/busses/i2c-exynos5.c                                           |    4 
 kernel/arch/x86/crypto/glue_helper.c                                              |   31 
 kernel/arch/x86/entry/common.c                                                    |   11 
 kernel/mm/zswap.c                                                                 |   12 
 kernel/drivers/usb/gadget/function/f_fs.c                                         |    2 
 kernel/fs/autofs/expire.c                                                         |    3 
 886 files changed, 142,101 insertions(+), 33,523 deletions(-)

diff --git a/device/rockchip/common/build.sh b/device/rockchip/common/build.sh
index 1f60029..08a7b7a 100755
--- a/device/rockchip/common/build.sh
+++ b/device/rockchip/common/build.sh
@@ -652,7 +652,7 @@
 	build_check_cross_compile
 
 	cd kernel
-	make ARCH=$RK_ARCH $RK_KERNEL_DEFCONFIG $RK_KERNEL_DEFCONFIG_FRAGMENT
+	make ARCH=$RK_ARCH $RK_KERNEL_DEFCONFIG rockchip_rt.config
 	make ARCH=$RK_ARCH $RK_KERNEL_DTS.img -j$RK_JOBS
 	if [ -f "$TOP_DIR/device/rockchip/$RK_TARGET_PRODUCT/$RK_KERNEL_FIT_ITS" ]; then
 		$COMMON_DIR/mk-fitimage.sh $TOP_DIR/kernel/$RK_BOOT_IMG \
diff --git a/kernel/Documentation/devicetree/bindings/clock/rockchip,clk-out.yaml b/kernel/Documentation/devicetree/bindings/clock/rockchip,clk-out.yaml
new file mode 100644
index 0000000..6582605
--- /dev/null
+++ b/kernel/Documentation/devicetree/bindings/clock/rockchip,clk-out.yaml
@@ -0,0 +1,107 @@
+# SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/clock/rockchip,clk-out.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: Rockchip Clock Out Control Module Binding
+
+maintainers:
+  - Sugar Zhang <sugar.zhang@rock-chips.com>
+
+description: |
+  This add support switch for clk-bidirection which located
+  at GRF, such as SAIx_MCLK_{IN OUT} which share the same pin.
+  and these config maybe located in many pieces of GRF,
+  which hard to addressed in one single clk driver. so, we add
+  this simple helper driver to address this situation.
+
+  In order to simplify implement and usage, and also for safety
+  clk usage (avoid high freq glitch), we set all clk out as disabled
+  (which means Input default for clk-bidrection) in the pre-stage,
+  such boot-loader or init by HW default. And then set a safety freq
+  before enable clk-out, such as "assign-clock-rates" or clk_set_rate
+  in drivers.
+
+properties:
+  compatible:
+    enum:
+      - rockchip,clk-out
+
+  reg:
+    maxItems: 1
+
+  "#clock-cells":
+    const: 1
+
+  clocks:
+    maxItems: 1
+    description: parent clocks.
+
+  power-domains:
+    maxItems: 1
+
+  clock-output-names:
+    maxItems: 1
+
+  rockchip,bit-shift:
+    $ref: /schemas/types.yaml#/definitions/uint32
+    description: Defines the bit shift of clk out enable.
+
+  rockchip,bit-set-to-disable:
+    type: boolean
+    description: |
+      By default this clock sets the bit at bit-shift to enable the clock.
+      Setting this property does the opposite: setting the bit disable
+      the clock and clearing it enables the clock.
+
+required:
+  - compatible
+  - reg
+  - clocks
+  - "#clock-cells"
+  - clock-output-names
+  - rockchip,bit-shift
+
+additionalProperties: false
+
+examples:
+  # Clock Provider node:
+  - |
+    mclkin_sai0: mclkin-sai0 {
+        compatible = "fixed-clock";
+        #clock-cells = <0>;
+        clock-frequency = <12288000>;
+        clock-output-names = "mclk_sai0_from_io";
+    };
+
+    mclkout_sai0: mclkout-sai0@ff040070 {
+        compatible = "rockchip,clk-out";
+        reg = <0 0xff040070 0 0x4>;
+        clocks = <&cru MCLK_SAI0_OUT2IO>;
+        #clock-cells = <0>;
+        clock-output-names = "mclk_sai0_to_io";
+        rockchip,bit-shift = <4>;
+    };
+
+  # Clock mclkout Consumer node:
+  - |
+    ext_codec {
+        clocks = <&mclkout_sai0>;
+        clock-names = "mclk";
+        assigned-clocks = <&mclkout_sai0>;
+        assigned-clock-rates = <12288000>;
+        pinctrl-names = "default";
+        pinctrl-0 = <&i2s0m0_mclk>;
+    };
+
+  # Clock mclkin Consumer node:
+  - |
+    ext_codec {
+        clocks = <&mclkin_sai0>;
+        clock-names = "mclk";
+        assigned-clocks = <&cru CLK_SAI0>;
+        assigned-clock-parents = <&mclkin_sai0>;
+        pinctrl-names = "default";
+        pinctrl-0 = <&i2s0m0_mclk>;
+    };
diff --git a/kernel/Documentation/devicetree/bindings/devfreq/event/rockchip-dfi.txt b/kernel/Documentation/devicetree/bindings/devfreq/event/rockchip-dfi.txt
index eee2a7f..c0925e8 100644
--- a/kernel/Documentation/devicetree/bindings/devfreq/event/rockchip-dfi.txt
+++ b/kernel/Documentation/devicetree/bindings/devfreq/event/rockchip-dfi.txt
@@ -10,6 +10,7 @@
   - "rockchip,rk3328-dfi" - for RK3328 SoCs.
   - "rockchip,rk3368-dfi" - for RK3368 SoCs.
   - "rockchip,rk3399-dfi" - for RK3399 SoCs.
+  - "rockchip,rk3528-dfi" - for RK3528 SoCs.
   - "rockchip,rk3568-dfi" - for RK3568 SoCs.
   - "rockchip,rv1126-dfi" - for RV1126 SoCs.
 
diff --git a/kernel/Documentation/devicetree/bindings/devfreq/rockchip_dmc.txt b/kernel/Documentation/devicetree/bindings/devfreq/rockchip_dmc.txt
index 507ab0a..5ae9f08 100644
--- a/kernel/Documentation/devicetree/bindings/devfreq/rockchip_dmc.txt
+++ b/kernel/Documentation/devicetree/bindings/devfreq/rockchip_dmc.txt
@@ -11,6 +11,7 @@
   - "rockchip,rk3328-dmc" - for RK3328 SoCs.
   - "rockchip,rk3368-dmc" - for RK3368 SoCs.
   - "rockchip,rk3399-dmc" - for RK3399 SoCs.
+  - "rockchip,rk3528-dmc" - for RK3528 SoCs.
   - "rockchip,rk3568-dmc" - for RK3568 SoCs.
   - "rockchip,rv1126-dmc" - for RV1126 SoCs.
 - devfreq-events: Node to get DDR loading, Refer to
diff --git a/kernel/Documentation/devicetree/bindings/mailbox/rockchip-mailbox.txt b/kernel/Documentation/devicetree/bindings/mailbox/rockchip-mailbox.txt
index b6bb84a..b57d9cc 100644
--- a/kernel/Documentation/devicetree/bindings/mailbox/rockchip-mailbox.txt
+++ b/kernel/Documentation/devicetree/bindings/mailbox/rockchip-mailbox.txt
@@ -17,6 +17,10 @@
  - #mbox-cells: Common mailbox binding property to identify the number
 	of cells required for the mailbox specifier. Should be 1
 
+Optional properties :
+
+ - rockchip,txpoll-period-ms: TX Done polling interval in milliseconds.
+
 Example:
 --------
 
diff --git a/kernel/Documentation/devicetree/bindings/mmc/rockchip-dw-mshc.txt b/kernel/Documentation/devicetree/bindings/mmc/rockchip-dw-mshc.txt
index 6f629b1..9a5b278 100644
--- a/kernel/Documentation/devicetree/bindings/mmc/rockchip-dw-mshc.txt
+++ b/kernel/Documentation/devicetree/bindings/mmc/rockchip-dw-mshc.txt
@@ -38,6 +38,12 @@
   execute tuning when needed. If not specified, the host will do tuning
   for 360 times, namely tuning for each degree.
 
+* pinctrl-names: should be "default" or "normal" combined with "idle". For
+  SDIO or eMMC devices, recommend to use "default". For SD/MMC cards, recommend
+  to use "normal" combined with "idle" to prevent power leak if vqmmc can't be
+  powered off. "normal" state is the same as "default" state, but "idle" state
+  should define the clk/cmd/data line to be pulled down or pulled none.
+
 Example:
 
 	rkdwmmc0@12200000 {
@@ -47,3 +53,30 @@
 		#address-cells = <1>;
 		#size-cells = <0>;
 	};
+
+	/* "default" pinctrl */
+	&rkdwmmc0{
+		...
+		pinctrl-names = "default"
+		pinctrl-0 = <&sdmmc0_clk &sdmmc0_cmd &sdmmc0_det &sdmmc0_bus4>;
+		...
+	};
+
+	/* "normal" combined with "idle" pinctrl */
+	sdmmc_idle_gpios: sdmmc-idle-gpios {
+		rockchip,pins =
+			<3 RK_PA2 RK_FUNC_GPIO &pcfg_pull_none>,
+			<3 RK_PA3 RK_FUNC_GPIO &pcfg_pull_none>,
+			<3 RK_PA4 RK_FUNC_GPIO &pcfg_pull_none>,
+			<3 RK_PA5 RK_FUNC_GPIO &pcfg_pull_none>,
+			<3 RK_PA6 RK_FUNC_GPIO &pcfg_pull_none>,
+			<3 RK_PA7 RK_FUNC_GPIO &pcfg_pull_none>;
+	};
+
+	&rkdwmmc0{
+		...
+		pinctrl-names = "normal", "idle";
+		pinctrl-0 = <&sdmmc0_clk &sdmmc0_cmd &sdmmc0_det &sdmmc0_bus4>;
+		pinctrl-1 = <&sdmmc_idle_gpios &sdmmc0_det>;
+		...
+	}
diff --git a/kernel/Documentation/devicetree/bindings/net/rockchip-dwmac.txt b/kernel/Documentation/devicetree/bindings/net/rockchip-dwmac.txt
index e19737e..fe0f597 100644
--- a/kernel/Documentation/devicetree/bindings/net/rockchip-dwmac.txt
+++ b/kernel/Documentation/devicetree/bindings/net/rockchip-dwmac.txt
@@ -14,6 +14,7 @@
    "rockchip,rk3366-gmac": found on RK3366 SoCs
    "rockchip,rk3368-gmac": found on RK3368 SoCs
    "rockchip,rk3399-gmac": found on RK3399 SoCs
+   "rockchip,rk3528-gmac": found on RK3528 SoCs
    "rockchip,rk3568-gmac": found on RK3568 SoCs
    "rockchip,rv1108-gmac": found on RV1108 SoCs
    "rockchip,rv1126-gmac": found on RV1126 SoCs
diff --git a/kernel/Documentation/devicetree/bindings/phy/phy-rockchip-inno-usb2.txt b/kernel/Documentation/devicetree/bindings/phy/phy-rockchip-inno-usb2.txt
index 6877e2c..06faee3 100644
--- a/kernel/Documentation/devicetree/bindings/phy/phy-rockchip-inno-usb2.txt
+++ b/kernel/Documentation/devicetree/bindings/phy/phy-rockchip-inno-usb2.txt
@@ -10,6 +10,7 @@
 	* "rockchip,rk3366-usb2phy"
 	* "rockchip,rk3368-usb2phy"
 	* "rockchip,rk3399-usb2phy"
+	* "rockchip,rk3528-usb2phy"
 	* "rockchip,rk3568-usb2phy"
 	* "rockchip,rv1108-usb2phy"
  - reg : the address offset of grf for usb-phy configuration.
@@ -64,6 +65,7 @@
 		is always powered on.
  - rockchip,low-power-mode: when set, the port will enter low power
 		state when suspend.
+ - rockchip,dis-u2-susphy: when set, disable otg suspend phy.
 
 Example:
 
@@ -102,6 +104,7 @@
 		"rockchip,rk1808-usb2phy-grf", "syscon", "simple-mfd";
 		"rockchip,rk3308-usb2phy-grf", "syscon", "simple-mfd";
 		"rockchip,rk3328-usb2phy-grf", "syscon", "simple-mfd";
+		"rockchip,rk3528-grf", "syscon", "simple-mfd";
 		"rockchip,rk3568-usb2phy-grf", "syscon";
  - reg : the address offset of grf for usb-phy configuration.
  - #address-cells : should be 1.
diff --git a/kernel/Documentation/devicetree/bindings/soc/rockchip/rockchip-pm-config.txt b/kernel/Documentation/devicetree/bindings/soc/rockchip/rockchip-pm-config.txt
index e06a3aa..4fd173f 100644
--- a/kernel/Documentation/devicetree/bindings/soc/rockchip/rockchip-pm-config.txt
+++ b/kernel/Documentation/devicetree/bindings/soc/rockchip/rockchip-pm-config.txt
@@ -9,6 +9,7 @@
 - "rockchip,pm-rk3328" - for RK3328 SOCs.
 - "rockchip,pm-rk3368" - for RK3368 SoCs.
 - "rockchip,pm-rk3399" - for RK3399 SoCs.
+- "rockchip,pm-rk3528" - for RK3528 SoCs.
 - "rockchip,pm-rv1126" - for RV1126 SoCs.
 
 - rockchip,sleep-mode-config : the sleep mode config,
@@ -164,6 +165,23 @@
 		>;
 	};
 
+	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_suspend: rockchip_suspend {
 		compatible = "rockchip,pm-rk3568";
 		status = "okay";
diff --git a/kernel/Documentation/devicetree/bindings/spi/spi-rockchip.txt b/kernel/Documentation/devicetree/bindings/spi/spi-rockchip.txt
index 3016484..0dbc450 100644
--- a/kernel/Documentation/devicetree/bindings/spi/spi-rockchip.txt
+++ b/kernel/Documentation/devicetree/bindings/spi/spi-rockchip.txt
@@ -35,6 +35,11 @@
 - rx-sample-delay-ns: nanoseconds to delay after the SCLK edge before sampling
 		Rx data (may need to be fine tuned for high capacitance lines).
 		No delay (0) by default.
+- csm: ss_n be high for half or one sclk_out cycle after every frame data is
+		transferred:
+		- "0" for keep low;
+		- "1" for half sclk_out;
+		- "2" for one sclk_out.
 - pinctrl-names: Names for the pin configuration(s); may be "default" or
 		"sleep", where the "sleep" configuration may describe the state
 		the pins should be in during system suspend. See also
diff --git a/kernel/Makefile b/kernel/Makefile
index 8431633..995bb8c 100644
--- a/kernel/Makefile
+++ b/kernel/Makefile
@@ -463,7 +463,7 @@
 		   -fno-strict-aliasing -fno-common -fshort-wchar \
 		   -Werror-implicit-function-declaration \
 		   -Werror=return-type -Wno-format-security \
-		   -w
+		   -w \
 		   -std=gnu89
 KBUILD_CPPFLAGS := -D__KERNEL__
 KBUILD_AFLAGS_KERNEL :=
diff --git a/kernel/arch/Kconfig b/kernel/arch/Kconfig
index 8e0c3bb..ae3ce37 100644
--- a/kernel/arch/Kconfig
+++ b/kernel/arch/Kconfig
@@ -28,6 +28,7 @@
 	tristate "OProfile system profiling"
 	depends on PROFILING
 	depends on HAVE_OPROFILE
+	depends on !PREEMPT_RT_FULL
 	select RING_BUFFER
 	select RING_BUFFER_ALLOW_SWAP
 	help
diff --git a/kernel/arch/alpha/include/asm/spinlock_types.h b/kernel/arch/alpha/include/asm/spinlock_types.h
index 1d5716b..6883bc9 100644
--- a/kernel/arch/alpha/include/asm/spinlock_types.h
+++ b/kernel/arch/alpha/include/asm/spinlock_types.h
@@ -2,10 +2,6 @@
 #ifndef _ALPHA_SPINLOCK_TYPES_H
 #define _ALPHA_SPINLOCK_TYPES_H
 
-#ifndef __LINUX_SPINLOCK_TYPES_H
-# error "please don't include this file directly"
-#endif
-
 typedef struct {
 	volatile unsigned int lock;
 } arch_spinlock_t;
diff --git a/kernel/arch/arm/Kconfig b/kernel/arch/arm/Kconfig
index 930881c..019ef14 100644
--- a/kernel/arch/arm/Kconfig
+++ b/kernel/arch/arm/Kconfig
@@ -51,7 +51,7 @@
 	select HARDIRQS_SW_RESEND
 	select HAVE_ARCH_AUDITSYSCALL if (AEABI && !OABI_COMPAT)
 	select HAVE_ARCH_BITREVERSE if (CPU_32v7M || CPU_32v7) && !CPU_32v6
-	select HAVE_ARCH_JUMP_LABEL if !XIP_KERNEL && !CPU_ENDIAN_BE32 && MMU
+	select HAVE_ARCH_JUMP_LABEL if !XIP_KERNEL && !CPU_ENDIAN_BE32 && MMU && !PREEMPT_RT_BASE
 	select HAVE_ARCH_KGDB if !CPU_ENDIAN_BE32 && MMU
 	select HAVE_ARCH_MMAP_RND_BITS if MMU
 	select HAVE_ARCH_SECCOMP_FILTER if (AEABI && !OABI_COMPAT)
@@ -91,6 +91,7 @@
 	select HAVE_PERF_EVENTS
 	select HAVE_PERF_REGS
 	select HAVE_PERF_USER_STACK_DUMP
+	select HAVE_PREEMPT_LAZY
 	select HAVE_RCU_TABLE_FREE if (SMP && ARM_LPAE)
 	select HAVE_REGS_AND_STACK_ACCESS_API
 	select HAVE_RSEQ
@@ -2165,7 +2166,7 @@
 
 config KERNEL_MODE_NEON
 	bool "Support for NEON in kernel mode"
-	depends on NEON && AEABI
+	depends on NEON && AEABI && !PREEMPT_RT_BASE
 	help
 	  Say Y to include support for NEON in kernel mode.
 
diff --git a/kernel/arch/arm/Makefile b/kernel/arch/arm/Makefile
index db32b78..af600aa 100644
--- a/kernel/arch/arm/Makefile
+++ b/kernel/arch/arm/Makefile
@@ -158,6 +158,7 @@
 textofs-$(CONFIG_ARCH_MESON) := 0x00208000
 textofs-$(CONFIG_ARCH_AXXIA) := 0x00308000
 textofs-$(CONFIG_CPU_RK3308) := 0x00058000
+textofs-$(CONFIG_CPU_RK3528) := 0x00208000
 textofs-$(CONFIG_CPU_PX30) := 0x00208000
 ifeq ($(CONFIG_ROCKCHIP_THUNDER_BOOT),y)
 textofs-$(CONFIG_CPU_RV1126) := 0x00608000
diff --git a/kernel/arch/arm/boot/dts/Makefile b/kernel/arch/arm/boot/dts/Makefile
index 37479c9..142937f 100644
--- a/kernel/arch/arm/boot/dts/Makefile
+++ b/kernel/arch/arm/boot/dts/Makefile
@@ -930,7 +930,11 @@
 	rk3326-evb-lp3-v10.dtb \
 	rk3326-863-lp3-v10.dtb \
 	rk3326-evb-lp3-v10-avb.dtb \
-	rk3326-863-lp3-v10-avb.dtb
+	rk3326-863-lp3-v10-avb.dtb \
+	rk3528-evb1-ddr4-v10.dtb \
+	rk3528-evb2-ddr3-v10.dtb \
+	rk3528-evb3-lp4x-v10.dtb \
+	rk3528-evb4-ddr4-v10.dtb
 dtb-$(CONFIG_ARCH_S3C24XX) += \
 	s3c2416-smdk2416.dtb
 dtb-$(CONFIG_ARCH_S3C64XX) += \
diff --git a/kernel/arch/arm/boot/dts/rk3036.dtsi b/kernel/arch/arm/boot/dts/rk3036.dtsi
index ff5710b..b3a265e 100644
--- a/kernel/arch/arm/boot/dts/rk3036.dtsi
+++ b/kernel/arch/arm/boot/dts/rk3036.dtsi
@@ -742,35 +742,31 @@
 			bias-pull-pin-default;
 		};
 
-		pcfg_pull_up: pcfg-pull-up {
-			bias-pull-up;
-		};
-
 		pcfg_pull_none: pcfg-pull-none {
 			bias-disable;
 		};
 
 		pwm0 {
 			pwm0_pin: pwm0-pin {
-				rockchip,pins = <0 RK_PA0 2 &pcfg_pull_none>;
+				rockchip,pins = <0 RK_PA0 2 &pcfg_pull_default>;
 			};
 		};
 
 		pwm1 {
 			pwm1_pin: pwm1-pin {
-				rockchip,pins = <0 RK_PA1 2 &pcfg_pull_none>;
+				rockchip,pins = <0 RK_PA1 2 &pcfg_pull_default>;
 			};
 		};
 
 		pwm2 {
 			pwm2_pin: pwm2-pin {
-				rockchip,pins = <0 RK_PA1 2 &pcfg_pull_none>;
+				rockchip,pins = <0 RK_PA1 2 &pcfg_pull_default>;
 			};
 		};
 
 		pwm3 {
 			pwm3_pin: pwm3-pin {
-				rockchip,pins = <0 RK_PD3 1 &pcfg_pull_none>;
+				rockchip,pins = <0 RK_PD3 1 &pcfg_pull_default>;
 			};
 		};
 
@@ -906,8 +902,8 @@
 
 		uart0 {
 			uart0_xfer: uart0-xfer {
-				rockchip,pins = <0 RK_PC0 1 &pcfg_pull_up>,
-						<0 RK_PC1 1 &pcfg_pull_up>;
+				rockchip,pins = <0 RK_PC0 1 &pcfg_pull_default>,
+						<0 RK_PC1 1 &pcfg_pull_default>;
 			};
 
 			uart0_cts: uart0-cts {
@@ -921,16 +917,16 @@
 
 		uart1 {
 			uart1_xfer: uart1-xfer {
-				rockchip,pins = <2 RK_PC6 1 &pcfg_pull_up>,
-						<2 RK_PC7 1 &pcfg_pull_up>;
+				rockchip,pins = <2 RK_PC6 1 &pcfg_pull_default>,
+						<2 RK_PC7 1 &pcfg_pull_default>;
 			};
 			/* no rts / cts for uart1 */
 		};
 
 		uart2 {
 			uart2_xfer: uart2-xfer {
-				rockchip,pins = <1 RK_PC2 2 &pcfg_pull_up>,
-						<1 RK_PC3 2 &pcfg_pull_up>;
+				rockchip,pins = <1 RK_PC2 2 &pcfg_pull_default>,
+						<1 RK_PC3 2 &pcfg_pull_default>;
 			};
 			/* no rts / cts for uart2 */
 		};
diff --git a/kernel/arch/arm/boot/dts/rk3066a.dtsi b/kernel/arch/arm/boot/dts/rk3066a.dtsi
index 2e36e01..e94a6d3 100644
--- a/kernel/arch/arm/boot/dts/rk3066a.dtsi
+++ b/kernel/arch/arm/boot/dts/rk3066a.dtsi
@@ -465,10 +465,6 @@
 			bias-pull-pin-default;
 		};
 
-		pcfg_pull_up: pcfg-pull-up {
-			bias-pull-up;
-		};
-
 		pcfg_pull_none: pcfg_pull_none {
 			bias-disable;
 		};
@@ -609,8 +605,8 @@
 
 		uart0 {
 			uart0_xfer: uart0-xfer {
-				rockchip,pins = <1 RK_PA0 1 &pcfg_pull_up>,
-						<1 RK_PA1 1 &pcfg_pull_up>;
+				rockchip,pins = <1 RK_PA0 1 &pcfg_pull_default>,
+						<1 RK_PA1 1 &pcfg_pull_default>;
 			};
 
 			uart0_cts: uart0-cts {
@@ -624,8 +620,8 @@
 
 		uart1 {
 			uart1_xfer: uart1-xfer {
-				rockchip,pins = <1 RK_PA4 1 &pcfg_pull_up>,
-						<1 RK_PA5 1 &pcfg_pull_up>;
+				rockchip,pins = <1 RK_PA4 1 &pcfg_pull_default>,
+						<1 RK_PA5 1 &pcfg_pull_default>;
 			};
 
 			uart1_cts: uart1-cts {
@@ -639,16 +635,16 @@
 
 		uart2 {
 			uart2_xfer: uart2-xfer {
-				rockchip,pins = <1 RK_PB0 1 &pcfg_pull_up>,
-						<1 RK_PB1 1 &pcfg_pull_up>;
+				rockchip,pins = <1 RK_PB0 1 &pcfg_pull_default>,
+						<1 RK_PB1 1 &pcfg_pull_default>;
 			};
 			/* no rts / cts for uart2 */
 		};
 
 		uart3 {
 			uart3_xfer: uart3-xfer {
-				rockchip,pins = <3 RK_PD3 1 &pcfg_pull_up>,
-						<3 RK_PD4 1 &pcfg_pull_up>;
+				rockchip,pins = <3 RK_PD3 1 &pcfg_pull_default>,
+						<3 RK_PD4 1 &pcfg_pull_default>;
 			};
 
 			uart3_cts: uart3-cts {
diff --git a/kernel/arch/arm/boot/dts/rk312x.dtsi b/kernel/arch/arm/boot/dts/rk312x.dtsi
index 8f879eb..c9abe0b 100644
--- a/kernel/arch/arm/boot/dts/rk312x.dtsi
+++ b/kernel/arch/arm/boot/dts/rk312x.dtsi
@@ -1292,10 +1292,6 @@
 			bias-pull-pin-default;
 		};
 
-		pcfg_pull_up: pcfg-pull-up {
-			bias-pull-up;
-		};
-
 		pcfg_output_high: pcfg-output-high {
 			output-high;
 		};
@@ -1420,8 +1416,8 @@
 
 		uart0 {
 			uart0_xfer: uart0-xfer {
-				rockchip,pins = <2 RK_PD2 2 &pcfg_pull_up>,
-						<2 RK_PD3 2 &pcfg_pull_up>;
+				rockchip,pins = <2 RK_PD2 2 &pcfg_pull_default>,
+						<2 RK_PD3 2 &pcfg_pull_none>;
 			};
 
 			uart0_cts: uart0-cts {
@@ -1435,8 +1431,8 @@
 
 		uart1 {
 			uart1_xfer: uart1-xfer {
-				rockchip,pins = <1 RK_PB1 2 &pcfg_pull_up>,
-						<1 RK_PB2 2 &pcfg_pull_up>;
+				rockchip,pins = <1 RK_PB1 2 &pcfg_pull_default>,
+						<1 RK_PB2 2 &pcfg_pull_default>;
 			};
 
 			uart1_cts: uart1-cts {
@@ -1450,8 +1446,8 @@
 
 		uart2 {
 			uart2_xfer: uart2-xfer {
-				rockchip,pins = <1 RK_PC2 2 &pcfg_pull_up>,
-						<1 RK_PC3 2 &pcfg_pull_up>;
+				rockchip,pins = <1 RK_PC2 2 &pcfg_pull_default>,
+						<1 RK_PC3 2 &pcfg_pull_none>;
 			};
 
 			uart2_cts: uart2-cts {
diff --git a/kernel/arch/arm/boot/dts/rk322x.dtsi b/kernel/arch/arm/boot/dts/rk322x.dtsi
index ba61ecd..7faf704 100644
--- a/kernel/arch/arm/boot/dts/rk322x.dtsi
+++ b/kernel/arch/arm/boot/dts/rk322x.dtsi
@@ -1032,6 +1032,7 @@
 		reg-io-width = <4>;
 		interrupts = <GIC_SPI 35 IRQ_TYPE_LEVEL_HIGH>,
 			     <GIC_SPI 71 IRQ_TYPE_LEVEL_HIGH>;
+		interrupt-names = "hdmi", "hdmi_wakeup";
 		clocks = <&cru SCLK_HDMI_HDCP>, <&cru PCLK_HDMI_CTRL>,
 			 <&cru SCLK_HDMI_CEC>;
 		clock-names = "isfr", "iahb", "cec";
diff --git a/kernel/arch/arm/boot/dts/rk3288.dtsi b/kernel/arch/arm/boot/dts/rk3288.dtsi
index 58bd444..c1373a9 100644
--- a/kernel/arch/arm/boot/dts/rk3288.dtsi
+++ b/kernel/arch/arm/boot/dts/rk3288.dtsi
@@ -1649,7 +1649,8 @@
 		reg-io-width = <4>;
 		#sound-dai-cells = <0>;
 		rockchip,grf = <&grf>;
-		interrupts = <GIC_SPI 103 IRQ_TYPE_LEVEL_HIGH>;
+		interrupts = <GIC_SPI 103 IRQ_TYPE_LEVEL_HIGH>, <GIC_SPI 102 IRQ_TYPE_LEVEL_HIGH>;
+		interrupt-names = "hdmi", "hdmi_wakeup";
 		clocks = <&cru  PCLK_HDMI_CTRL>, <&cru SCLK_HDMI_HDCP>, <&cru SCLK_HDMI_CEC>;
 		clock-names = "iahb", "isfr", "cec";
 		pinctrl-names = "default", "sleep";
diff --git a/kernel/arch/arm/boot/dts/rk3528-evb1-ddr4-v10.dts b/kernel/arch/arm/boot/dts/rk3528-evb1-ddr4-v10.dts
new file mode 100644
index 0000000..d71a742
--- /dev/null
+++ b/kernel/arch/arm/boot/dts/rk3528-evb1-ddr4-v10.dts
@@ -0,0 +1,12 @@
+// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
+/*
+ * Copyright (c) 2022 Rockchip Electronics Co., Ltd.
+ *
+ */
+
+#include "arm64/rockchip/rk3528-evb1-ddr4-v10.dts"
+
+/ {
+	model = "Rockchip RK3528 EVB1 DDR4 V10 Board (AArch32)";
+	compatible = "rockchip,rk3528-evb1-ddr4-v10", "rockchip,rk3528";
+};
diff --git a/kernel/arch/arm/boot/dts/rk3528-evb2-ddr3-v10.dts b/kernel/arch/arm/boot/dts/rk3528-evb2-ddr3-v10.dts
new file mode 100644
index 0000000..83855ac
--- /dev/null
+++ b/kernel/arch/arm/boot/dts/rk3528-evb2-ddr3-v10.dts
@@ -0,0 +1,12 @@
+// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
+/*
+ * Copyright (c) 2022 Rockchip Electronics Co., Ltd.
+ *
+ */
+
+#include "arm64/rockchip/rk3528-evb2-ddr3-v10.dts"
+
+/{
+	model = "Rockchip RK3528 EVB2 DDR3 V10 Board (AArch32)";
+	compatible = "rockchip,rk3528-evb2-ddr3-v10", "rockchip,rk3528";
+};
diff --git a/kernel/arch/arm/boot/dts/rk3528-evb3-lp4x-v10.dts b/kernel/arch/arm/boot/dts/rk3528-evb3-lp4x-v10.dts
new file mode 100644
index 0000000..29939cc
--- /dev/null
+++ b/kernel/arch/arm/boot/dts/rk3528-evb3-lp4x-v10.dts
@@ -0,0 +1,12 @@
+// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
+/*
+ * Copyright (c) 2022 Rockchip Electronics Co., Ltd.
+ *
+ */
+
+#include "arm64/rockchip/rk3528-evb3-lp4x-v10.dts"
+
+/{
+	model = "Rockchip RK3528 EVB3 LP4X V10 Board (AArch32)";
+	compatible = "rockchip,rk3528-evb3-lp4x-v10", "rockchip,rk3528";
+};
diff --git a/kernel/arch/arm/boot/dts/rk3528-evb4-ddr4-v10.dts b/kernel/arch/arm/boot/dts/rk3528-evb4-ddr4-v10.dts
new file mode 100644
index 0000000..71ff4de
--- /dev/null
+++ b/kernel/arch/arm/boot/dts/rk3528-evb4-ddr4-v10.dts
@@ -0,0 +1,12 @@
+// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
+/*
+ * Copyright (c) 2022 Rockchip Electronics Co., Ltd.
+ *
+ */
+
+#include "arm64/rockchip/rk3528-evb1-ddr4-v10.dts"
+
+/{
+	model = "Rockchip RK3528 EVB4 DDR4 V10 Board (AArch32)";
+	compatible = "rockchip,rk3528-evb4-ddr4-v10", "rockchip,rk3528";
+};
diff --git a/kernel/arch/arm/boot/dts/rv1126-pinctrl.dtsi b/kernel/arch/arm/boot/dts/rv1126-pinctrl.dtsi
index e063e81..e4cfa71 100644
--- a/kernel/arch/arm/boot/dts/rv1126-pinctrl.dtsi
+++ b/kernel/arch/arm/boot/dts/rv1126-pinctrl.dtsi
@@ -1214,6 +1214,17 @@
 				/* sdmmc0_pwr */
 				<0 RK_PC0 1 &pcfg_pull_none>;
 		};
+
+		/omit-if-no-ref/
+		sdmmc0_idle_pins: sdmmc0-idle-pins {
+			rockchip,pins =
+				<1 RK_PB0 RK_FUNC_GPIO &pcfg_pull_down>,
+				<1 RK_PB1 RK_FUNC_GPIO &pcfg_pull_down>,
+				<1 RK_PA4 RK_FUNC_GPIO &pcfg_pull_down>,
+				<1 RK_PA5 RK_FUNC_GPIO &pcfg_pull_down>,
+				<1 RK_PA6 RK_FUNC_GPIO &pcfg_pull_down>,
+				<1 RK_PA7 RK_FUNC_GPIO &pcfg_pull_down>;
+		};
 	};
 	spi0 {
 		/omit-if-no-ref/
diff --git a/kernel/arch/arm/boot/dts/rv1126-thunder-boot-emmc.dtsi b/kernel/arch/arm/boot/dts/rv1126-thunder-boot-emmc.dtsi
index 08b8738..fe9d6bb 100644
--- a/kernel/arch/arm/boot/dts/rv1126-thunder-boot-emmc.dtsi
+++ b/kernel/arch/arm/boot/dts/rv1126-thunder-boot-emmc.dtsi
@@ -19,6 +19,8 @@
 	thunder_boot_mmc: thunder-boot-mmc {
 		compatible = "rockchip,thunder-boot-mmc";
 		reg = <0xffc50000 0x4000>;
+		clocks = <&cru HCLK_EMMC>, <&cru CLK_EMMC>;
+		clock-names = "biu", "ciu";
 		memory-region-src = <&ramdisk_c>;
 		memory-region-dst = <&ramdisk_r>;
 		memory-region-idmac = <&mmc_idmac>;
@@ -26,6 +28,11 @@
 };
 
 &emmc {
+	/delete-property/ power-domains;
 	memory-region-ecsd = <&mmc_ecsd>;
 	post-power-on-delay-ms = <0>;
 };
+
+&power {
+	/delete-node/ pd_nvm@RV1126_PD_NVM;
+};
diff --git a/kernel/arch/arm/boot/dts/rv1126.dtsi b/kernel/arch/arm/boot/dts/rv1126.dtsi
index 5182b61..5eebdbd 100644
--- a/kernel/arch/arm/boot/dts/rv1126.dtsi
+++ b/kernel/arch/arm/boot/dts/rv1126.dtsi
@@ -2125,7 +2125,7 @@
 		iommus = <&rkvdec_mmu>;
 		rockchip,srv = <&mpp_srv>;
 		rockchip,taskqueue-node = <0>;
-		rockchip,resetgroup-node = <0>;
+		rockchip,resetgroup-node = <1>;
 		status = "disabled";
 	};
 
@@ -2364,8 +2364,9 @@
 		clock-names = "biu", "ciu", "ciu-drive", "ciu-sample";
 		fifo-depth = <0x100>;
 		max-frequency = <200000000>;
-		pinctrl-names = "default";
+		pinctrl-names = "normal", "idle";
 		pinctrl-0 = <&sdmmc0_clk &sdmmc0_cmd &sdmmc0_det &sdmmc0_bus4>;
+		pinctrl-1 = <&sdmmc0_idle_pins &sdmmc0_det>;
 		status = "disabled";
 	};
 
@@ -2539,6 +2540,7 @@
 			snps,tx-ipgap-linecheck-dis-quirk;
 			snps,tx-fifo-resize;
 			snps,xhci-trb-ent-quirk;
+			snps,usb2-lpm-disable;
 			status = "disabled";
 		};
 	};
diff --git a/kernel/arch/arm/configs/at91_dt_defconfig b/kernel/arch/arm/configs/at91_dt_defconfig
index e4b1be6..f4b253b 100644
--- a/kernel/arch/arm/configs/at91_dt_defconfig
+++ b/kernel/arch/arm/configs/at91_dt_defconfig
@@ -19,6 +19,7 @@
 CONFIG_ARCH_AT91=y
 CONFIG_SOC_AT91RM9200=y
 CONFIG_SOC_AT91SAM9=y
+# CONFIG_ATMEL_CLOCKSOURCE_PIT is not set
 CONFIG_AEABI=y
 CONFIG_UACCESS_WITH_MEMCPY=y
 CONFIG_ZBOOT_ROM_TEXT=0x0
@@ -64,7 +65,6 @@
 CONFIG_BLK_DEV_RAM=y
 CONFIG_BLK_DEV_RAM_COUNT=4
 CONFIG_BLK_DEV_RAM_SIZE=8192
-CONFIG_ATMEL_TCLIB=y
 CONFIG_ATMEL_SSC=y
 CONFIG_SCSI=y
 CONFIG_BLK_DEV_SD=y
diff --git a/kernel/arch/arm/configs/rockchip_linux_defconfig b/kernel/arch/arm/configs/rockchip_linux_defconfig
index cb27cd6..056a967 100644
--- a/kernel/arch/arm/configs/rockchip_linux_defconfig
+++ b/kernel/arch/arm/configs/rockchip_linux_defconfig
@@ -173,7 +173,6 @@
 CONFIG_BLK_DEV_DM=y
 CONFIG_DM_CRYPT=y
 CONFIG_DM_THIN_PROVISIONING=y
-CONFIG_DM_VERITY=y
 CONFIG_NETDEVICES=y
 CONFIG_TUN=y
 CONFIG_VETH=y
@@ -349,6 +348,7 @@
 CONFIG_SND_USB_AUDIO=y
 CONFIG_SND_SOC=y
 CONFIG_SND_SOC_ROCKCHIP=y
+CONFIG_SND_SOC_ROCKCHIP_SAI=y
 CONFIG_SND_SOC_ROCKCHIP_SPDIF=y
 CONFIG_SND_SOC_ROCKCHIP_MAX98090=y
 CONFIG_SND_SOC_ROCKCHIP_RT5645=y
diff --git a/kernel/arch/arm/configs/rv1126-snapshot.config b/kernel/arch/arm/configs/rv1126-snapshot.config
index 8129fa5..08230d2 100644
--- a/kernel/arch/arm/configs/rv1126-snapshot.config
+++ b/kernel/arch/arm/configs/rv1126-snapshot.config
@@ -17,7 +17,7 @@
 # CONFIG_PM_DEBUG is not set
 # CONFIG_PM_DEVFREQ_EVENT is not set
 # CONFIG_PPS is not set
-CONFIG_PSTORE_MCU_LOG=y
+CONFIG_PSTORE_BOOT_LOG=y
 # CONFIG_PTP_1588_CLOCK is not set
 # CONFIG_PWRSEQ_EMMC is not set
 # CONFIG_PWRSEQ_SIMPLE is not set
diff --git a/kernel/arch/arm/configs/rv1126-trailcamera.config b/kernel/arch/arm/configs/rv1126-trailcamera.config
index 52abc6e..9e65283 100644
--- a/kernel/arch/arm/configs/rv1126-trailcamera.config
+++ b/kernel/arch/arm/configs/rv1126-trailcamera.config
@@ -19,7 +19,7 @@
 # CONFIG_PM_DEBUG is not set
 # CONFIG_PM_DEVFREQ_EVENT is not set
 # CONFIG_PPS is not set
-CONFIG_PSTORE_MCU_LOG=y
+CONFIG_PSTORE_BOOT_LOG=y
 # CONFIG_PTP_1588_CLOCK is not set
 # CONFIG_PWRSEQ_EMMC is not set
 # CONFIG_PWRSEQ_SIMPLE is not set
diff --git a/kernel/arch/arm/configs/sama5_defconfig b/kernel/arch/arm/configs/sama5_defconfig
index 2080025..be92871 100644
--- a/kernel/arch/arm/configs/sama5_defconfig
+++ b/kernel/arch/arm/configs/sama5_defconfig
@@ -20,6 +20,7 @@
 CONFIG_SOC_SAMA5D2=y
 CONFIG_SOC_SAMA5D3=y
 CONFIG_SOC_SAMA5D4=y
+# CONFIG_ATMEL_CLOCKSOURCE_PIT is not set
 CONFIG_AEABI=y
 CONFIG_UACCESS_WITH_MEMCPY=y
 CONFIG_ZBOOT_ROM_TEXT=0x0
@@ -75,7 +76,6 @@
 CONFIG_BLK_DEV_RAM=y
 CONFIG_BLK_DEV_RAM_COUNT=4
 CONFIG_BLK_DEV_RAM_SIZE=8192
-CONFIG_ATMEL_TCLIB=y
 CONFIG_ATMEL_SSC=y
 CONFIG_EEPROM_AT24=y
 CONFIG_SCSI=y
diff --git a/kernel/arch/arm/include/asm/irq.h b/kernel/arch/arm/include/asm/irq.h
index 46d4114..c421b5b 100644
--- a/kernel/arch/arm/include/asm/irq.h
+++ b/kernel/arch/arm/include/asm/irq.h
@@ -23,6 +23,8 @@
 #endif
 
 #ifndef __ASSEMBLY__
+#include <linux/cpumask.h>
+
 struct irqaction;
 struct pt_regs;
 
diff --git a/kernel/arch/arm/include/asm/spinlock_types.h b/kernel/arch/arm/include/asm/spinlock_types.h
index 5976958..a37c080 100644
--- a/kernel/arch/arm/include/asm/spinlock_types.h
+++ b/kernel/arch/arm/include/asm/spinlock_types.h
@@ -2,10 +2,6 @@
 #ifndef __ASM_SPINLOCK_TYPES_H
 #define __ASM_SPINLOCK_TYPES_H
 
-#ifndef __LINUX_SPINLOCK_TYPES_H
-# error "please don't include this file directly"
-#endif
-
 #define TICKET_SHIFT	16
 
 typedef struct {
diff --git a/kernel/arch/arm/include/asm/switch_to.h b/kernel/arch/arm/include/asm/switch_to.h
index d3e937d..6ab96a2 100644
--- a/kernel/arch/arm/include/asm/switch_to.h
+++ b/kernel/arch/arm/include/asm/switch_to.h
@@ -4,6 +4,13 @@
 
 #include <linux/thread_info.h>
 
+#if defined CONFIG_PREEMPT_RT_FULL && defined CONFIG_HIGHMEM
+void switch_kmaps(struct task_struct *prev_p, struct task_struct *next_p);
+#else
+static inline void
+switch_kmaps(struct task_struct *prev_p, struct task_struct *next_p) { }
+#endif
+
 /*
  * For v7 SMP cores running a preemptible kernel we may be pre-empted
  * during a TLB maintenance operation, so execute an inner-shareable dsb
@@ -26,6 +33,7 @@
 #define switch_to(prev,next,last)					\
 do {									\
 	__complete_pending_tlbi();					\
+	switch_kmaps(prev, next);					\
 	last = __switch_to(prev,task_thread_info(prev), task_thread_info(next));	\
 } while (0)
 
diff --git a/kernel/arch/arm/include/asm/thread_info.h b/kernel/arch/arm/include/asm/thread_info.h
index 8f55dc5..4f834bf 100644
--- a/kernel/arch/arm/include/asm/thread_info.h
+++ b/kernel/arch/arm/include/asm/thread_info.h
@@ -49,6 +49,7 @@
 struct thread_info {
 	unsigned long		flags;		/* low level flags */
 	int			preempt_count;	/* 0 => preemptable, <0 => bug */
+	int			preempt_lazy_count; /* 0 => preemptable, <0 => bug */
 	mm_segment_t		addr_limit;	/* address limit */
 	struct task_struct	*task;		/* main task structure */
 	__u32			cpu;		/* cpu */
@@ -139,7 +140,8 @@
 #define TIF_SYSCALL_TRACE	4	/* syscall trace active */
 #define TIF_SYSCALL_AUDIT	5	/* syscall auditing active */
 #define TIF_SYSCALL_TRACEPOINT	6	/* syscall tracepoint instrumentation */
-#define TIF_SECCOMP		7	/* seccomp syscall filtering active */
+#define TIF_SECCOMP		8	/* seccomp syscall filtering active */
+#define TIF_NEED_RESCHED_LAZY	7
 
 #define TIF_NOHZ		12	/* in adaptive nohz mode */
 #define TIF_USING_IWMMXT	17
@@ -149,6 +151,7 @@
 #define _TIF_SIGPENDING		(1 << TIF_SIGPENDING)
 #define _TIF_NEED_RESCHED	(1 << TIF_NEED_RESCHED)
 #define _TIF_NOTIFY_RESUME	(1 << TIF_NOTIFY_RESUME)
+#define _TIF_NEED_RESCHED_LAZY	(1 << TIF_NEED_RESCHED_LAZY)
 #define _TIF_UPROBE		(1 << TIF_UPROBE)
 #define _TIF_SYSCALL_TRACE	(1 << TIF_SYSCALL_TRACE)
 #define _TIF_SYSCALL_AUDIT	(1 << TIF_SYSCALL_AUDIT)
@@ -164,7 +167,8 @@
  * Change these and you break ASM code in entry-common.S
  */
 #define _TIF_WORK_MASK		(_TIF_NEED_RESCHED | _TIF_SIGPENDING | \
-				 _TIF_NOTIFY_RESUME | _TIF_UPROBE)
+				 _TIF_NOTIFY_RESUME | _TIF_UPROBE | \
+				 _TIF_NEED_RESCHED_LAZY)
 
 #endif /* __KERNEL__ */
 #endif /* __ASM_ARM_THREAD_INFO_H */
diff --git a/kernel/arch/arm/kernel/asm-offsets.c b/kernel/arch/arm/kernel/asm-offsets.c
index 40afe95..d634d6f 100644
--- a/kernel/arch/arm/kernel/asm-offsets.c
+++ b/kernel/arch/arm/kernel/asm-offsets.c
@@ -58,6 +58,7 @@
   BLANK();
   DEFINE(TI_FLAGS,		offsetof(struct thread_info, flags));
   DEFINE(TI_PREEMPT,		offsetof(struct thread_info, preempt_count));
+  DEFINE(TI_PREEMPT_LAZY,	offsetof(struct thread_info, preempt_lazy_count));
   DEFINE(TI_ADDR_LIMIT,		offsetof(struct thread_info, addr_limit));
   DEFINE(TI_TASK,		offsetof(struct thread_info, task));
   DEFINE(TI_CPU,		offsetof(struct thread_info, cpu));
diff --git a/kernel/arch/arm/kernel/entry-armv.S b/kernel/arch/arm/kernel/entry-armv.S
index cde22c0..857c9cd 100644
--- a/kernel/arch/arm/kernel/entry-armv.S
+++ b/kernel/arch/arm/kernel/entry-armv.S
@@ -209,11 +209,18 @@
 
 #ifdef CONFIG_PREEMPT
 	ldr	r8, [tsk, #TI_PREEMPT]		@ get preempt count
-	ldr	r0, [tsk, #TI_FLAGS]		@ get flags
 	teq	r8, #0				@ if preempt count != 0
+	bne	1f				@ return from exeption
+	ldr	r0, [tsk, #TI_FLAGS]		@ get flags
+	tst	r0, #_TIF_NEED_RESCHED		@ if NEED_RESCHED is set
+	blne	svc_preempt			@ preempt!
+
+	ldr	r8, [tsk, #TI_PREEMPT_LAZY]	@ get preempt lazy count
+	teq	r8, #0				@ if preempt lazy count != 0
 	movne	r0, #0				@ force flags to 0
-	tst	r0, #_TIF_NEED_RESCHED
+	tst	r0, #_TIF_NEED_RESCHED_LAZY
 	blne	svc_preempt
+1:
 #endif
 
 	svc_exit r5, irq = 1			@ return from exception
@@ -228,8 +235,14 @@
 1:	bl	preempt_schedule_irq		@ irq en/disable is done inside
 	ldr	r0, [tsk, #TI_FLAGS]		@ get new tasks TI_FLAGS
 	tst	r0, #_TIF_NEED_RESCHED
+	bne	1b
+	tst	r0, #_TIF_NEED_RESCHED_LAZY
 	reteq	r8				@ go again
-	b	1b
+	ldr	r0, [tsk, #TI_PREEMPT_LAZY]	@ get preempt lazy count
+	teq	r0, #0				@ if preempt lazy count != 0
+	beq	1b
+	ret	r8				@ go again
+
 #endif
 
 __und_fault:
diff --git a/kernel/arch/arm/kernel/entry-common.S b/kernel/arch/arm/kernel/entry-common.S
index 0465d65..4767583 100644
--- a/kernel/arch/arm/kernel/entry-common.S
+++ b/kernel/arch/arm/kernel/entry-common.S
@@ -56,7 +56,9 @@
 	cmp	r2, #TASK_SIZE
 	blne	addr_limit_check_failed
 	ldr	r1, [tsk, #TI_FLAGS]		@ re-check for syscall tracing
-	tst	r1, #_TIF_SYSCALL_WORK | _TIF_WORK_MASK
+	tst	r1, #((_TIF_SYSCALL_WORK | _TIF_WORK_MASK) & ~_TIF_SECCOMP)
+	bne	fast_work_pending
+	tst	r1, #_TIF_SECCOMP
 	bne	fast_work_pending
 
 
@@ -93,8 +95,11 @@
 	cmp	r2, #TASK_SIZE
 	blne	addr_limit_check_failed
 	ldr	r1, [tsk, #TI_FLAGS]		@ re-check for syscall tracing
-	tst	r1, #_TIF_SYSCALL_WORK | _TIF_WORK_MASK
+	tst	r1, #((_TIF_SYSCALL_WORK | _TIF_WORK_MASK) & ~_TIF_SECCOMP)
+	bne	do_slower_path
+	tst	r1, #_TIF_SECCOMP
 	beq	no_work_pending
+do_slower_path:
  UNWIND(.fnend		)
 ENDPROC(ret_fast_syscall)
 
diff --git a/kernel/arch/arm/kernel/signal.c b/kernel/arch/arm/kernel/signal.c
index 1c01358..263b032 100644
--- a/kernel/arch/arm/kernel/signal.c
+++ b/kernel/arch/arm/kernel/signal.c
@@ -652,7 +652,8 @@
 	 */
 	trace_hardirqs_off();
 	do {
-		if (likely(thread_flags & _TIF_NEED_RESCHED)) {
+		if (likely(thread_flags & (_TIF_NEED_RESCHED |
+					   _TIF_NEED_RESCHED_LAZY))) {
 			schedule();
 		} else {
 			if (unlikely(!user_mode(regs)))
diff --git a/kernel/arch/arm/mach-at91/Kconfig b/kernel/arch/arm/mach-at91/Kconfig
index 903f23c..fa493a8 100644
--- a/kernel/arch/arm/mach-at91/Kconfig
+++ b/kernel/arch/arm/mach-at91/Kconfig
@@ -107,6 +107,31 @@
 	    AT91SAM9X35
 	    AT91SAM9XE
 
+comment "Clocksource driver selection"
+
+config ATMEL_CLOCKSOURCE_PIT
+	bool "Periodic Interval Timer (PIT) support"
+	depends on SOC_AT91SAM9 || SOC_SAMA5
+	default SOC_AT91SAM9 || SOC_SAMA5
+	select ATMEL_PIT
+	help
+	  Select this to get a clocksource based on the Atmel Periodic Interval
+	  Timer. It has a relatively low resolution and the TC Block clocksource
+	  should be preferred.
+
+config ATMEL_CLOCKSOURCE_TCB
+	bool "Timer Counter Blocks (TCB) support"
+	depends on SOC_AT91RM9200 || SOC_AT91SAM9 || SOC_SAMA5 || COMPILE_TEST
+	default SOC_AT91RM9200 || SOC_AT91SAM9 || SOC_SAMA5
+	depends on !ATMEL_TCLIB
+	select ATMEL_ARM_TCB_CLKSRC
+	help
+	  Select this to get a high precision clocksource based on a
+	  TC block with a 5+ MHz base clock rate.
+	  On platforms with 16-bit counters, two timer channels are combined
+	  to make a single 32-bit timer.
+	  It can also be used as a clock event device supporting oneshot mode.
+
 config HAVE_AT91_UTMI
 	bool
 
diff --git a/kernel/arch/arm/mach-exynos/platsmp.c b/kernel/arch/arm/mach-exynos/platsmp.c
index 6a1e682..17dca0f 100644
--- a/kernel/arch/arm/mach-exynos/platsmp.c
+++ b/kernel/arch/arm/mach-exynos/platsmp.c
@@ -239,7 +239,7 @@
 	sync_cache_w(&pen_release);
 }
 
-static DEFINE_SPINLOCK(boot_lock);
+static DEFINE_RAW_SPINLOCK(boot_lock);
 
 static void exynos_secondary_init(unsigned int cpu)
 {
@@ -252,8 +252,8 @@
 	/*
 	 * Synchronise with the boot thread.
 	 */
-	spin_lock(&boot_lock);
-	spin_unlock(&boot_lock);
+	raw_spin_lock(&boot_lock);
+	raw_spin_unlock(&boot_lock);
 }
 
 int exynos_set_boot_addr(u32 core_id, unsigned long boot_addr)
@@ -317,7 +317,7 @@
 	 * Set synchronisation state between this boot processor
 	 * and the secondary one
 	 */
-	spin_lock(&boot_lock);
+	raw_spin_lock(&boot_lock);
 
 	/*
 	 * The secondary processor is waiting to be released from
@@ -344,7 +344,7 @@
 
 		if (timeout == 0) {
 			printk(KERN_ERR "cpu1 power enable failed");
-			spin_unlock(&boot_lock);
+			raw_spin_unlock(&boot_lock);
 			return -ETIMEDOUT;
 		}
 	}
@@ -390,7 +390,7 @@
 	 * calibrations, then wait for it to finish
 	 */
 fail:
-	spin_unlock(&boot_lock);
+	raw_spin_unlock(&boot_lock);
 
 	return pen_release != -1 ? ret : 0;
 }
diff --git a/kernel/arch/arm/mach-hisi/platmcpm.c b/kernel/arch/arm/mach-hisi/platmcpm.c
index f66815c..00524ab 100644
--- a/kernel/arch/arm/mach-hisi/platmcpm.c
+++ b/kernel/arch/arm/mach-hisi/platmcpm.c
@@ -61,7 +61,7 @@
 
 static void __iomem *sysctrl, *fabric;
 static int hip04_cpu_table[HIP04_MAX_CLUSTERS][HIP04_MAX_CPUS_PER_CLUSTER];
-static DEFINE_SPINLOCK(boot_lock);
+static DEFINE_RAW_SPINLOCK(boot_lock);
 static u32 fabric_phys_addr;
 /*
  * [0]: bootwrapper physical address
@@ -113,7 +113,7 @@
 	if (cluster >= HIP04_MAX_CLUSTERS || cpu >= HIP04_MAX_CPUS_PER_CLUSTER)
 		return -EINVAL;
 
-	spin_lock_irq(&boot_lock);
+	raw_spin_lock_irq(&boot_lock);
 
 	if (hip04_cpu_table[cluster][cpu])
 		goto out;
@@ -147,7 +147,7 @@
 
 out:
 	hip04_cpu_table[cluster][cpu]++;
-	spin_unlock_irq(&boot_lock);
+	raw_spin_unlock_irq(&boot_lock);
 
 	return 0;
 }
@@ -162,11 +162,11 @@
 	cpu = MPIDR_AFFINITY_LEVEL(mpidr, 0);
 	cluster = MPIDR_AFFINITY_LEVEL(mpidr, 1);
 
-	spin_lock(&boot_lock);
+	raw_spin_lock(&boot_lock);
 	hip04_cpu_table[cluster][cpu]--;
 	if (hip04_cpu_table[cluster][cpu] == 1) {
 		/* A power_up request went ahead of us. */
-		spin_unlock(&boot_lock);
+		raw_spin_unlock(&boot_lock);
 		return;
 	} else if (hip04_cpu_table[cluster][cpu] > 1) {
 		pr_err("Cluster %d CPU%d boots multiple times\n", cluster, cpu);
@@ -174,7 +174,7 @@
 	}
 
 	last_man = hip04_cluster_is_down(cluster);
-	spin_unlock(&boot_lock);
+	raw_spin_unlock(&boot_lock);
 	if (last_man) {
 		/* Since it's Cortex A15, disable L2 prefetching. */
 		asm volatile(
@@ -203,7 +203,7 @@
 	       cpu >= HIP04_MAX_CPUS_PER_CLUSTER);
 
 	count = TIMEOUT_MSEC / POLL_MSEC;
-	spin_lock_irq(&boot_lock);
+	raw_spin_lock_irq(&boot_lock);
 	for (tries = 0; tries < count; tries++) {
 		if (hip04_cpu_table[cluster][cpu])
 			goto err;
@@ -211,10 +211,10 @@
 		data = readl_relaxed(sysctrl + SC_CPU_RESET_STATUS(cluster));
 		if (data & CORE_WFI_STATUS(cpu))
 			break;
-		spin_unlock_irq(&boot_lock);
+		raw_spin_unlock_irq(&boot_lock);
 		/* Wait for clean L2 when the whole cluster is down. */
 		msleep(POLL_MSEC);
-		spin_lock_irq(&boot_lock);
+		raw_spin_lock_irq(&boot_lock);
 	}
 	if (tries >= count)
 		goto err;
@@ -231,10 +231,10 @@
 		goto err;
 	if (hip04_cluster_is_down(cluster))
 		hip04_set_snoop_filter(cluster, 0);
-	spin_unlock_irq(&boot_lock);
+	raw_spin_unlock_irq(&boot_lock);
 	return 1;
 err:
-	spin_unlock_irq(&boot_lock);
+	raw_spin_unlock_irq(&boot_lock);
 	return 0;
 }
 #endif
diff --git a/kernel/arch/arm/mach-imx/cpuidle-imx6q.c b/kernel/arch/arm/mach-imx/cpuidle-imx6q.c
index 326e870..d9ac80a 100644
--- a/kernel/arch/arm/mach-imx/cpuidle-imx6q.c
+++ b/kernel/arch/arm/mach-imx/cpuidle-imx6q.c
@@ -17,22 +17,22 @@
 #include "hardware.h"
 
 static int num_idle_cpus = 0;
-static DEFINE_SPINLOCK(cpuidle_lock);
+static DEFINE_RAW_SPINLOCK(cpuidle_lock);
 
 static int imx6q_enter_wait(struct cpuidle_device *dev,
 			    struct cpuidle_driver *drv, int index)
 {
-	spin_lock(&cpuidle_lock);
+	raw_spin_lock(&cpuidle_lock);
 	if (++num_idle_cpus == num_online_cpus())
 		imx6_set_lpm(WAIT_UNCLOCKED);
-	spin_unlock(&cpuidle_lock);
+	raw_spin_unlock(&cpuidle_lock);
 
 	cpu_do_idle();
 
-	spin_lock(&cpuidle_lock);
+	raw_spin_lock(&cpuidle_lock);
 	if (num_idle_cpus-- == num_online_cpus())
 		imx6_set_lpm(WAIT_CLOCKED);
-	spin_unlock(&cpuidle_lock);
+	raw_spin_unlock(&cpuidle_lock);
 
 	return index;
 }
diff --git a/kernel/arch/arm/mach-omap2/omap-smp.c b/kernel/arch/arm/mach-omap2/omap-smp.c
index 1c73694..ac4d2f0 100644
--- a/kernel/arch/arm/mach-omap2/omap-smp.c
+++ b/kernel/arch/arm/mach-omap2/omap-smp.c
@@ -69,7 +69,7 @@
 	.startup_addr = omap5_secondary_startup,
 };
 
-static DEFINE_SPINLOCK(boot_lock);
+static DEFINE_RAW_SPINLOCK(boot_lock);
 
 void __iomem *omap4_get_scu_base(void)
 {
@@ -177,8 +177,8 @@
 	/*
 	 * Synchronise with the boot thread.
 	 */
-	spin_lock(&boot_lock);
-	spin_unlock(&boot_lock);
+	raw_spin_lock(&boot_lock);
+	raw_spin_unlock(&boot_lock);
 }
 
 static int omap4_boot_secondary(unsigned int cpu, struct task_struct *idle)
@@ -191,7 +191,7 @@
 	 * Set synchronisation state between this boot processor
 	 * and the secondary one
 	 */
-	spin_lock(&boot_lock);
+	raw_spin_lock(&boot_lock);
 
 	/*
 	 * Update the AuxCoreBoot0 with boot state for secondary core.
@@ -270,7 +270,7 @@
 	 * Now the secondary core is starting up let it run its
 	 * calibrations, then wait for it to finish
 	 */
-	spin_unlock(&boot_lock);
+	raw_spin_unlock(&boot_lock);
 
 	return 0;
 }
diff --git a/kernel/arch/arm/mach-prima2/platsmp.c b/kernel/arch/arm/mach-prima2/platsmp.c
index 75ef5d4..c17c86e 100644
--- a/kernel/arch/arm/mach-prima2/platsmp.c
+++ b/kernel/arch/arm/mach-prima2/platsmp.c
@@ -22,7 +22,7 @@
 
 static void __iomem *clk_base;
 
-static DEFINE_SPINLOCK(boot_lock);
+static DEFINE_RAW_SPINLOCK(boot_lock);
 
 static void sirfsoc_secondary_init(unsigned int cpu)
 {
@@ -36,8 +36,8 @@
 	/*
 	 * Synchronise with the boot thread.
 	 */
-	spin_lock(&boot_lock);
-	spin_unlock(&boot_lock);
+	raw_spin_lock(&boot_lock);
+	raw_spin_unlock(&boot_lock);
 }
 
 static const struct of_device_id clk_ids[]  = {
@@ -75,7 +75,7 @@
 	/* make sure write buffer is drained */
 	mb();
 
-	spin_lock(&boot_lock);
+	raw_spin_lock(&boot_lock);
 
 	/*
 	 * The secondary processor is waiting to be released from
@@ -107,7 +107,7 @@
 	 * now the secondary core is starting up let it run its
 	 * calibrations, then wait for it to finish
 	 */
-	spin_unlock(&boot_lock);
+	raw_spin_unlock(&boot_lock);
 
 	return pen_release != -1 ? -ENOSYS : 0;
 }
diff --git a/kernel/arch/arm/mach-qcom/platsmp.c b/kernel/arch/arm/mach-qcom/platsmp.c
index 5494c9e..e8ce157 100644
--- a/kernel/arch/arm/mach-qcom/platsmp.c
+++ b/kernel/arch/arm/mach-qcom/platsmp.c
@@ -46,7 +46,7 @@
 
 extern void secondary_startup_arm(void);
 
-static DEFINE_SPINLOCK(boot_lock);
+static DEFINE_RAW_SPINLOCK(boot_lock);
 
 #ifdef CONFIG_HOTPLUG_CPU
 static void qcom_cpu_die(unsigned int cpu)
@@ -60,8 +60,8 @@
 	/*
 	 * Synchronise with the boot thread.
 	 */
-	spin_lock(&boot_lock);
-	spin_unlock(&boot_lock);
+	raw_spin_lock(&boot_lock);
+	raw_spin_unlock(&boot_lock);
 }
 
 static int scss_release_secondary(unsigned int cpu)
@@ -284,7 +284,7 @@
 	 * set synchronisation state between this boot processor
 	 * and the secondary one
 	 */
-	spin_lock(&boot_lock);
+	raw_spin_lock(&boot_lock);
 
 	/*
 	 * Send the secondary CPU a soft interrupt, thereby causing
@@ -297,7 +297,7 @@
 	 * now the secondary core is starting up let it run its
 	 * calibrations, then wait for it to finish
 	 */
-	spin_unlock(&boot_lock);
+	raw_spin_unlock(&boot_lock);
 
 	return ret;
 }
diff --git a/kernel/arch/arm/mach-spear/platsmp.c b/kernel/arch/arm/mach-spear/platsmp.c
index 39038a0..6da5c93 100644
--- a/kernel/arch/arm/mach-spear/platsmp.c
+++ b/kernel/arch/arm/mach-spear/platsmp.c
@@ -32,7 +32,7 @@
 	sync_cache_w(&pen_release);
 }
 
-static DEFINE_SPINLOCK(boot_lock);
+static DEFINE_RAW_SPINLOCK(boot_lock);
 
 static void __iomem *scu_base = IOMEM(VA_SCU_BASE);
 
@@ -47,8 +47,8 @@
 	/*
 	 * Synchronise with the boot thread.
 	 */
-	spin_lock(&boot_lock);
-	spin_unlock(&boot_lock);
+	raw_spin_lock(&boot_lock);
+	raw_spin_unlock(&boot_lock);
 }
 
 static int spear13xx_boot_secondary(unsigned int cpu, struct task_struct *idle)
@@ -59,7 +59,7 @@
 	 * set synchronisation state between this boot processor
 	 * and the secondary one
 	 */
-	spin_lock(&boot_lock);
+	raw_spin_lock(&boot_lock);
 
 	/*
 	 * The secondary processor is waiting to be released from
@@ -84,7 +84,7 @@
 	 * now the secondary core is starting up let it run its
 	 * calibrations, then wait for it to finish
 	 */
-	spin_unlock(&boot_lock);
+	raw_spin_unlock(&boot_lock);
 
 	return pen_release != -1 ? -ENOSYS : 0;
 }
diff --git a/kernel/arch/arm/mach-sti/platsmp.c b/kernel/arch/arm/mach-sti/platsmp.c
index 231f19e..a3419b7 100644
--- a/kernel/arch/arm/mach-sti/platsmp.c
+++ b/kernel/arch/arm/mach-sti/platsmp.c
@@ -35,7 +35,7 @@
 	sync_cache_w(&pen_release);
 }
 
-static DEFINE_SPINLOCK(boot_lock);
+static DEFINE_RAW_SPINLOCK(boot_lock);
 
 static void sti_secondary_init(unsigned int cpu)
 {
@@ -48,8 +48,8 @@
 	/*
 	 * Synchronise with the boot thread.
 	 */
-	spin_lock(&boot_lock);
-	spin_unlock(&boot_lock);
+	raw_spin_lock(&boot_lock);
+	raw_spin_unlock(&boot_lock);
 }
 
 static int sti_boot_secondary(unsigned int cpu, struct task_struct *idle)
@@ -60,7 +60,7 @@
 	 * set synchronisation state between this boot processor
 	 * and the secondary one
 	 */
-	spin_lock(&boot_lock);
+	raw_spin_lock(&boot_lock);
 
 	/*
 	 * The secondary processor is waiting to be released from
@@ -91,7 +91,7 @@
 	 * now the secondary core is starting up let it run its
 	 * calibrations, then wait for it to finish
 	 */
-	spin_unlock(&boot_lock);
+	raw_spin_unlock(&boot_lock);
 
 	return pen_release != -1 ? -ENOSYS : 0;
 }
diff --git a/kernel/arch/arm/mm/fault.c b/kernel/arch/arm/mm/fault.c
index a9ee0d9..20b0e14 100644
--- a/kernel/arch/arm/mm/fault.c
+++ b/kernel/arch/arm/mm/fault.c
@@ -439,6 +439,9 @@
 	if (addr < TASK_SIZE)
 		return do_page_fault(addr, fsr, regs);
 
+	if (interrupts_enabled(regs))
+		local_irq_enable();
+
 	if (user_mode(regs))
 		goto bad_area;
 
@@ -506,6 +509,9 @@
 static int
 do_sect_fault(unsigned long addr, unsigned int fsr, struct pt_regs *regs)
 {
+	if (interrupts_enabled(regs))
+		local_irq_enable();
+
 	do_bad_area(addr, fsr, regs);
 	return 0;
 }
diff --git a/kernel/arch/arm/mm/highmem.c b/kernel/arch/arm/mm/highmem.c
index d02f818..542692d 100644
--- a/kernel/arch/arm/mm/highmem.c
+++ b/kernel/arch/arm/mm/highmem.c
@@ -34,6 +34,11 @@
 	return *ptep;
 }
 
+static unsigned int fixmap_idx(int type)
+{
+	return FIX_KMAP_BEGIN + type + KM_TYPE_NR * smp_processor_id();
+}
+
 void *kmap(struct page *page)
 {
 	might_sleep();
@@ -54,12 +59,13 @@
 
 void *kmap_atomic(struct page *page)
 {
+	pte_t pte = mk_pte(page, kmap_prot);
 	unsigned int idx;
 	unsigned long vaddr;
 	void *kmap;
 	int type;
 
-	preempt_disable();
+	preempt_disable_nort();
 	pagefault_disable();
 	if (!PageHighMem(page))
 		return page_address(page);
@@ -79,7 +85,7 @@
 
 	type = kmap_atomic_idx_push();
 
-	idx = FIX_KMAP_BEGIN + type + KM_TYPE_NR * smp_processor_id();
+	idx = fixmap_idx(type);
 	vaddr = __fix_to_virt(idx);
 #ifdef CONFIG_DEBUG_HIGHMEM
 	/*
@@ -93,7 +99,10 @@
 	 * in place, so the contained TLB flush ensures the TLB is updated
 	 * with the new mapping.
 	 */
-	set_fixmap_pte(idx, mk_pte(page, kmap_prot));
+#ifdef CONFIG_PREEMPT_RT_FULL
+	current->kmap_pte[type] = pte;
+#endif
+	set_fixmap_pte(idx, pte);
 
 	return (void *)vaddr;
 }
@@ -106,44 +115,75 @@
 
 	if (kvaddr >= (void *)FIXADDR_START) {
 		type = kmap_atomic_idx();
-		idx = FIX_KMAP_BEGIN + type + KM_TYPE_NR * smp_processor_id();
+		idx = fixmap_idx(type);
 
 		if (cache_is_vivt())
 			__cpuc_flush_dcache_area((void *)vaddr, PAGE_SIZE);
+#ifdef CONFIG_PREEMPT_RT_FULL
+		current->kmap_pte[type] = __pte(0);
+#endif
 #ifdef CONFIG_DEBUG_HIGHMEM
 		BUG_ON(vaddr != __fix_to_virt(idx));
-		set_fixmap_pte(idx, __pte(0));
 #else
 		(void) idx;  /* to kill a warning */
 #endif
+		set_fixmap_pte(idx, __pte(0));
 		kmap_atomic_idx_pop();
 	} else if (vaddr >= PKMAP_ADDR(0) && vaddr < PKMAP_ADDR(LAST_PKMAP)) {
 		/* this address was obtained through kmap_high_get() */
 		kunmap_high(pte_page(pkmap_page_table[PKMAP_NR(vaddr)]));
 	}
 	pagefault_enable();
-	preempt_enable();
+	preempt_enable_nort();
 }
 EXPORT_SYMBOL(__kunmap_atomic);
 
 void *kmap_atomic_pfn(unsigned long pfn)
 {
+	pte_t pte = pfn_pte(pfn, kmap_prot);
 	unsigned long vaddr;
 	int idx, type;
 	struct page *page = pfn_to_page(pfn);
 
-	preempt_disable();
+	preempt_disable_nort();
 	pagefault_disable();
 	if (!PageHighMem(page))
 		return page_address(page);
 
 	type = kmap_atomic_idx_push();
-	idx = FIX_KMAP_BEGIN + type + KM_TYPE_NR * smp_processor_id();
+	idx = fixmap_idx(type);
 	vaddr = __fix_to_virt(idx);
 #ifdef CONFIG_DEBUG_HIGHMEM
 	BUG_ON(!pte_none(get_fixmap_pte(vaddr)));
 #endif
-	set_fixmap_pte(idx, pfn_pte(pfn, kmap_prot));
+#ifdef CONFIG_PREEMPT_RT_FULL
+	current->kmap_pte[type] = pte;
+#endif
+	set_fixmap_pte(idx, pte);
 
 	return (void *)vaddr;
 }
+#if defined CONFIG_PREEMPT_RT_FULL
+void switch_kmaps(struct task_struct *prev_p, struct task_struct *next_p)
+{
+	int i;
+
+	/*
+	 * Clear @prev's kmap_atomic mappings
+	 */
+	for (i = 0; i < prev_p->kmap_idx; i++) {
+		int idx = fixmap_idx(i);
+
+		set_fixmap_pte(idx, __pte(0));
+	}
+	/*
+	 * Restore @next_p's kmap_atomic mappings
+	 */
+	for (i = 0; i < next_p->kmap_idx; i++) {
+		int idx = fixmap_idx(i);
+
+		if (!pte_none(next_p->kmap_pte[i]))
+			set_fixmap_pte(idx, next_p->kmap_pte[i]);
+	}
+}
+#endif
diff --git a/kernel/arch/arm/plat-versatile/platsmp.c b/kernel/arch/arm/plat-versatile/platsmp.c
index c236651..6b60f58 100644
--- a/kernel/arch/arm/plat-versatile/platsmp.c
+++ b/kernel/arch/arm/plat-versatile/platsmp.c
@@ -32,7 +32,7 @@
 	sync_cache_w(&pen_release);
 }
 
-static DEFINE_SPINLOCK(boot_lock);
+static DEFINE_RAW_SPINLOCK(boot_lock);
 
 void versatile_secondary_init(unsigned int cpu)
 {
@@ -45,8 +45,8 @@
 	/*
 	 * Synchronise with the boot thread.
 	 */
-	spin_lock(&boot_lock);
-	spin_unlock(&boot_lock);
+	raw_spin_lock(&boot_lock);
+	raw_spin_unlock(&boot_lock);
 }
 
 int versatile_boot_secondary(unsigned int cpu, struct task_struct *idle)
@@ -57,7 +57,7 @@
 	 * Set synchronisation state between this boot processor
 	 * and the secondary one
 	 */
-	spin_lock(&boot_lock);
+	raw_spin_lock(&boot_lock);
 
 	/*
 	 * This is really belt and braces; we hold unintended secondary
@@ -87,7 +87,7 @@
 	 * now the secondary core is starting up let it run its
 	 * calibrations, then wait for it to finish
 	 */
-	spin_unlock(&boot_lock);
+	raw_spin_unlock(&boot_lock);
 
 	return pen_release != -1 ? -ENOSYS : 0;
 }
diff --git a/kernel/arch/arm64/Kconfig b/kernel/arch/arm64/Kconfig
index 2be7500..337df6a 100644
--- a/kernel/arch/arm64/Kconfig
+++ b/kernel/arch/arm64/Kconfig
@@ -148,6 +148,7 @@
 	select HAVE_PERF_EVENTS
 	select HAVE_PERF_REGS
 	select HAVE_PERF_USER_STACK_DUMP
+	select HAVE_PREEMPT_LAZY
 	select HAVE_REGS_AND_STACK_ACCESS_API
 	select HAVE_RCU_TABLE_FREE
 	select HAVE_RSEQ
diff --git a/kernel/arch/arm64/boot/dts/rockchip/Makefile b/kernel/arch/arm64/boot/dts/rockchip/Makefile
index a6f13d5..9ec92c9 100644
--- a/kernel/arch/arm64/boot/dts/rockchip/Makefile
+++ b/kernel/arch/arm64/boot/dts/rockchip/Makefile
@@ -14,6 +14,7 @@
 dtb-$(CONFIG_ARCH_ROCKCHIP) += px30-evb-ddr3-v11-avb.dtb
 dtb-$(CONFIG_ARCH_ROCKCHIP) += px30-evb-ddr3-v11-linux.dtb
 dtb-$(CONFIG_ARCH_ROCKCHIP) += px30-evb-ddr4-v10.dtb
+dtb-$(CONFIG_ARCH_ROCKCHIP) += px30-evb-ddr4-v10-linux.dtb
 dtb-$(CONFIG_ARCH_ROCKCHIP) += px30-evb-ext-rk618.dtb
 dtb-$(CONFIG_ARCH_ROCKCHIP) += px30-evb-ext-rk618-avb.dtb
 dtb-$(CONFIG_ARCH_ROCKCHIP) += px30-z7-a0-rk618-dsi.dtb
@@ -72,6 +73,14 @@
 dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399pro-evb-v10-linux.dtb
 dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399pro-evb-v11-linux.dtb
 dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399pro-evb-v14-linux.dtb
+dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3528-demo1-lp4-v10.dtb
+dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3528-demo4-ddr4-v10.dtb
+dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3528-evb1-ddr4-v10.dtb
+dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3528-evb1-ddr4-v10-linux.dtb
+dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3528-evb2-ddr3-v10.dtb
+dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3528-evb3-lp4x-v10.dtb
+dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3528-evb4-ddr4-v10.dtb
+dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3528-iotest-lp3-v10.dtb
 dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3566-box-demo-v10.dtb
 dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3566-box-demo-v10-android9.dtb
 dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3566-evb-mipitest-v10.dtb
diff --git a/kernel/arch/arm64/boot/dts/rockchip/NK-R36S0.dts b/kernel/arch/arm64/boot/dts/rockchip/NK-R36S0.dts
index 34b6829..2f9fe3d 100644
--- a/kernel/arch/arm64/boot/dts/rockchip/NK-R36S0.dts
+++ b/kernel/arch/arm64/boot/dts/rockchip/NK-R36S0.dts
@@ -6,3 +6,15 @@
 
 #include "NK-R36S0.dtsi"
 #include "rk3568-android.dtsi"
+
+&bt_sco {
+	status = "okay";
+};
+
+&bt_sound {
+	status = "okay";
+};
+
+&i2s3_2ch {
+	status = "okay";
+};
diff --git a/kernel/arch/arm64/boot/dts/rockchip/NK-R36S0.dtsi b/kernel/arch/arm64/boot/dts/rockchip/NK-R36S0.dtsi
old mode 100755
new mode 100644
index 7e23798..f45ce09
--- a/kernel/arch/arm64/boot/dts/rockchip/NK-R36S0.dtsi
+++ b/kernel/arch/arm64/boot/dts/rockchip/NK-R36S0.dtsi
@@ -8,21 +8,12 @@
 
 #include <dt-bindings/gpio/gpio.h>
 #include <dt-bindings/pinctrl/rockchip.h>
-#include <dt-bindings/display/media-bus-format.h>
 #include "rk3568.dtsi"
 #include "rk3568-evb.dtsi"
 
 / {
 	model = "Rockchip RK3568 EVB1 DDR4 V10 Board";
 	compatible = "rockchip,rk3568-evb1-ddr4-v10", "rockchip,rk3568";
-
-	rk_headset: rk-headset {
-		compatible = "rockchip_headset";
-		headset_gpio = <&gpio0 RK_PD5 GPIO_ACTIVE_LOW>;
-		spk_ctl_gpio = <&gpio4 RK_PC2 GPIO_ACTIVE_LOW>;//AMP_SD_GPIO4_C2_3V3
-		pinctrl-names = "default";
-		pinctrl-0 = <&hp_det>;
-	};
 
 	vcc2v5_sys: vcc2v5-ddr {
 		compatible = "regulator-fixed";
@@ -34,6 +25,15 @@
 		vin-supply = <&vcc3v3_sys>;
 	};
 
+	vcc3v3_vga: vcc3v3-vga {
+		compatible = "regulator-fixed";
+		regulator-name = "vcc3v3_vga";
+		regulator-always-on;
+		regulator-boot-on;
+		gpio = <&gpio0 RK_PD5 GPIO_ACTIVE_HIGH>;
+		enable-active-high;
+		vin-supply = <&vcc3v3_sys>;
+	};
 
 	pcie30_avdd0v9: pcie30-avdd0v9 {
 		compatible = "regulator-fixed";
@@ -60,9 +60,7 @@
 		regulator-name = "vcc3v3_pcie";
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
-		regulator-always-on;
 		enable-active-high;
-		regulator-boot-on;
 		gpio = <&gpio0 RK_PD4 GPIO_ACTIVE_HIGH>;
 		startup-delay-us = <5000>;
 		vin-supply = <&dc_12v>;
@@ -87,8 +85,9 @@
 		enable-active-high;
 		regulator-always-on;
 		regulator-boot-on;
-    	};
+	};
 #endif
+
 	ndj_io_init {
          	compatible = "nk_io_control";	
 			pinctrl-names = "default";
@@ -186,69 +185,7 @@
 				gpio_function = <1>;
 			};
 	#endif
-		};
-#if 0			
-	    nk_io_init {
-                compatible = "nk_io_control";
-//				vcc3_io_en_gpio = <&gpio0 RK_PC4 GPIO_ACTIVE_HIGH>; //VCC3_IO_EN_GPIO0_C4_3V3
-                hub_host2_5V_rest_gpio = <&gpio4 RK_PD2 GPIO_ACTIVE_HIGH>; //HUB_RST_GPIO4_D2_3V3
-                hub_host3_5v_gpio = <&gpio4 RK_PB2 GPIO_ACTIVE_HIGH>; //HOST3_EN_GPIO4_B2_1V8
-                vcc_5v_io = <&gpio1 RK_PA4 GPIO_ACTIVE_HIGH>;   //VCC5_IO_EN_GPIO1_A4_3V3
-                vcc_12v_io = <&gpio0 RK_PC7 GPIO_ACTIVE_HIGH>; //VCC12_IO_EN_GPIO0_C7_3V3
-                en_4g_gpio = <&gpio0 RK_PC6 GPIO_ACTIVE_HIGH>; //4G_PWREN_H_GPIO0_C6
-                reset_4g_gpio = <&gpio1 RK_PB2 GPIO_ACTIVE_HIGH>; //4G_RST_GPIO01_B2_3V3
-                air_mode_4g_gpio = <&gpio1 RK_PB0 GPIO_ACTIVE_HIGH>; //4G_AIR_MODE_GPIO01_B0_3V3
-                wake_4g_gpio = <&gpio1 RK_PB1 GPIO_ACTIVE_HIGH>; //4G_WAKEUP_GPIO01_B1_3V3
-				hp_en_gpio = <&gpio3 RK_PA6 GPIO_ACTIVE_HIGH>;//HP_EN_GPIO3_A6_3V3
-//              spk_out_gpio = <&gpio4 RK_PC2 GPIO_ACTIVE_HIGH>;//AMP_SD_GPIO4_C2_3V3			
-				wifi_power_en_gpio = <&gpio3 RK_PC6 GPIO_ACTIVE_HIGH>; //WIFI_PWREN_GPIO3_C6_1V8
-//				pcie_power_en_gpio = <&gpio0 RK_PD4 GPIO_ACTIVE_HIGH>;//PCIE_PWREN_H_GPIO0_D4				
-				pinctrl-names = "default";
-				pinctrl-0 = <&nk_io_gpio>;				
-        };
-#endif	
-		panel: panel {
-				compatible = "simple-panel";
-				backlight = <&backlight>;
-				power-supply = <&vcc3v3_lcd0_n>;
-				enable-gpios = <&gpio2 RK_PD4 GPIO_ACTIVE_HIGH>; //LCD0_VDD_H_GPIO2_D4
-				reset-gpios = <&gpio3 RK_PD1 GPIO_ACTIVE_LOW>; //7511_RST_GPIO3_D1
-				edp-bl-gpios = <&gpio0 RK_PB7 GPIO_ACTIVE_HIGH>;  //LCD0_BKLT_EN_3V3
-				edp-bl-en = <&gpio0 RK_PB0 GPIO_ACTIVE_HIGH>; //LCD0_BKLT_EN_3V3
-				bus-format = <MEDIA_BUS_FMT_RGB888_1X24>;
-				bpc = <8>;
-				prepare-delay-ms = <200>;
-				enable-delay-ms = <20>;
-				lvds-gpio0 = <&gpio3 RK_PD2 GPIO_ACTIVE_HIGH>; //7511_GPIO0-GPIO3_D2 
-				lvds-gpio1 = <&gpio3 RK_PD3 GPIO_ACTIVE_HIGH>; //7511_GPIO1-GPIO3_D3 
-				lvds-gpio2 = <&gpio3 RK_PD4 GPIO_ACTIVE_HIGH>; //7511_GPIO2-GPIO3_D4 
-				lvds-gpio3 = <&gpio3 RK_PD5 GPIO_ACTIVE_HIGH>; //7511_GPIO3-GPIO3_D5
-				nodka-lvds = <15>;
-
-				display-timings {
-                native-mode = <&timing0>;
-                timing0: timing0 {
-					clock-frequency = <72500000>;
-					hactive = <1280>;
-					vactive = <800>;
-					hfront-porch = <70>;
-					hsync-len = <2>;
-					hback-porch = <88>;
-					vfront-porch = <7>;
-					vsync-len = <4>;
-					vback-porch = <17>;
-					hsync-active = <21>;
-					vsync-active = <0>;
-					de-active = <0>;
-					pixelclk-active = <0>;			
-					};
-				};
-				ports {
-					panel_in: endpoint {
-					remote-endpoint = <&edp_out>;
-						};
-					};   
-				};
+};
 };
 
 &combphy0_us {
@@ -311,10 +248,6 @@
  * video_phy0 needs to be enabled
  * when dsi0 is enabled
  */
-&video_phy0 {
-	status = "disabled";
-};
-
 &dsi0 {
 	status = "disabled";
 };
@@ -335,10 +268,6 @@
  * video_phy1 needs to be enabled
  * when dsi1 is enabled
  */
- 
-&video_phy1 {
-	status = "okay";
-}; 
 &dsi1 {
 	status = "disabled";
 };
@@ -348,102 +277,29 @@
 };
 
 &dsi1_in_vp1 {
-	status = "okay";
+	status = "disabled";
 };
 
 &dsi1_panel {
-	power-supply = <&vcc3v3_lcd1_n>;   //MIPI_3V3EN_GPIO3_A3_d_3V3
-    vddio-mipi = <&gpio3 RK_PA4 GPIO_ACTIVE_HIGH>; //MIPI_EN_1V8_GPIO3_A4_d_3V3
-    reset-gpios = <&gpio3 RK_PC7 GPIO_ACTIVE_LOW>; //MIPI_RST_L_GPIO3_C7
-    vcc-5v-gpio = <&gpio1 RK_PA4 GPIO_ACTIVE_HIGH>; //VCC5_IO_EN_GPIO1_A4_3V3
-    pinctrl-names = "default";
-    pinctrl-0 = <&lcd1_rst_gpio>;
+	power-supply = <&vcc3v3_lcd1_n>;
 };
-
-&route_dsi1 {
-	status = "disabled";
-	connect = <&vp1_out_dsi1>;
-};
-
-
-/*
-*  edp_start
-*/
 
 &edp {
-    force-hpd;
-    status = "okay";
-    ports {
-        port@1 {
-            reg = <1>;
-            edp_out: endpoint {
-                remote-endpoint = <&panel_in>;
-            };
-        };
-    };
+	hpd-gpios = <&gpio0 RK_PC2 GPIO_ACTIVE_HIGH>;
+	status = "okay";
 };
 
 &edp_phy {
-  status = "okay";
-
+	status = "okay";
 };
 
 &edp_in_vp0 {
-    status = "disabled";
+	status = "okay";
 };
 
 &edp_in_vp1 {
-    status = "okay";
-
-};
-
-&route_edp {
-    status = "okay";
-    connect = <&vp1_out_edp>;
-};
-
-&route_edp {
-	status = "okay";
-};
-/*
-*  edp_end
-*/
-
-/*
-*  Hdmi_start
-*/
-
-&hdmi {
-	status = "okay";
-	rockchip,phy-table =
-		<92812500  0x8009 0x0000 0x0270>,
-		<165000000 0x800b 0x0000 0x026d>,
-		<185625000 0x800b 0x0000 0x01ed>,
-		<297000000 0x800b 0x0000 0x01ad>,
-		<594000000 0x8029 0x0000 0x0088>,
-		<000000000 0x0000 0x0000 0x0000>;
-};
-
-&route_hdmi {
-	status = "okay";
-	connect = <&vp0_out_hdmi>;
-};
-
-&hdmi_in_vp0 {
-	status = "okay";
-};
-
-&hdmi_in_vp1 {
 	status = "disabled";
 };
-
-&hdmi_sound {
-	status = "okay";
-};
-
-/*
- *  Hdmi_END
-*/
 
 &gmac0 {
 	phy-mode = "rgmii";
@@ -507,24 +363,8 @@
 	power-supply = <&vcc3v3_lcd0_n>;
 };
 
-&i2c3 {
-	status = "okay";
-       //mac eeprom
-        eeprom@51 {
-                //compatible = "atmel,24c02";
-                compatible = "atmel,24c256";
-                reg = <0x51>;
-        };
-	
-	  //nk-mcu
-        nkmcu@15 {
-                compatible = "nk_mcu";
-                reg = <0x15>;
-        };
-};
-
 &i2c4 {
-	status = "okay";
+	status = "disabled";
 	gc8034: gc8034@37 {
 		compatible = "galaxycore,gc8034";
 		status = "okay";
@@ -570,7 +410,7 @@
 		};
 	};
 	ov5695: ov5695@36 {
-		status = "okay";
+		status = "disabled";
 		compatible = "ovti,ov5695";
 		reg = <0x36>;
 		clocks = <&cru CLK_CIF_OUT>;
@@ -593,19 +433,6 @@
 	};
 };
 
-&i2c5 {
-	status = "okay";
-
-	hym8563: hym8563@51 {
-		compatible = "haoyu,hym8563";
-		reg = <0x51>;
-		#clock-cells = <0>;
-		clock-frequency = <32768>;
-		clock-output-names = "xin32k";
-		/* rtc_int is not connected */
-	};
-};
-
 &mdio0 {
 	rgmii_phy0: phy@0 {
 		compatible = "ethernet-phy-ieee802.3-c22";
@@ -620,51 +447,50 @@
 	};
 };
 
+&video_phy0 {
+	status = "disabled";
+};
 
+&video_phy1 {
+	status = "disabled";
+};
 
 &pcie30phy {
 	status = "okay";
 };
 
-&pcie2x1 {
-	reset-gpios = <&gpio3 RK_PC1 GPIO_ACTIVE_HIGH>;
+&pcie3x2 {
+	reset-gpios = <&gpio2 RK_PD6 GPIO_ACTIVE_HIGH>;
 	vpcie3v3-supply = <&vcc3v3_pcie>;
 	status = "okay";
 };
 
 &pinctrl {
-//	cam {
-//		camera_pwr: camera-pwr {
-//			rockchip,pins =
-//				/* camera power en */
-//				<0 RK_PC1 RK_FUNC_GPIO &pcfg_pull_none>;
-//		};
-//	};
+	cam {
+		camera_pwr: camera-pwr {
+			rockchip,pins =
+				/* camera power en */
+				<0 RK_PC1 RK_FUNC_GPIO &pcfg_pull_none>;
+		};
+	};
 	headphone {
 		hp_det: hp-det {
-			rockchip,pins = <0 RK_PD5 RK_FUNC_GPIO &pcfg_pull_down>,
-							<4 RK_PC2 RK_FUNC_GPIO &pcfg_pull_down>;
+			rockchip,pins = <3 RK_PC2 RK_FUNC_GPIO &pcfg_pull_down>;
 		};
 	};
 
 	wireless-wlan {
 		wifi_host_wake_irq: wifi-host-wake-irq {
-			rockchip,pins = <2 RK_PB2 RK_FUNC_GPIO &pcfg_pull_down>;
+			rockchip,pins = <3 RK_PD4 RK_FUNC_GPIO &pcfg_pull_down>;
 		};
 	};
 
 	wireless-bluetooth {
-		uart1_gpios: uart1-gpios {
-			rockchip,pins = <2 RK_PB5 RK_FUNC_GPIO &pcfg_pull_none>;
+		uart8_gpios: uart8-gpios {
+			rockchip,pins = <2 RK_PB1 RK_FUNC_GPIO &pcfg_pull_none>;
 		};
 	};
 	
-	lcd1 {
-        lcd1_rst_gpio: lcd1-rst-gpio {
-            rockchip,pins = <3 RK_PC7 RK_FUNC_GPIO &pcfg_pull_none>;
-        };
-    };
-		
 	nk_io_init{
 		nk_io_gpio: nk-io-gpio{
 			rockchip,pins = <0 RK_PB0 RK_FUNC_GPIO &pcfg_pull_none>,
@@ -692,6 +518,10 @@
 	};
 };
 
+&rk809_sound {
+	hp-det-gpio = <&gpio3 RK_PC2 GPIO_ACTIVE_LOW>;
+};
+
 &rkisp {
 	status = "disabled";
 };
@@ -701,7 +531,7 @@
 };
 
 &rkisp_vir0 {
-	status = "disabled";
+	status = "okay";
 
 	port {
 		#address-cells = <1>;
@@ -714,32 +544,34 @@
 	};
 };
 
+&route_dsi0 {
+	status = "disabled";
+	connect = <&vp1_out_dsi0>;
+};
 
-
-
+&route_edp {
+	status = "okay";
+	connect = <&vp0_out_edp>;
+};
 
 &sata2 {
 	status = "okay";
 };
 
 &sdmmc2 {
-        status = "disabled";
-};
-
-&sdmmc1 {
-        max-frequency = <150000000>;
-        supports-sdio;
-        bus-width = <4>;
-        disable-wp;
-        cap-sd-highspeed;
-        cap-sdio-irq;
-        keep-power-in-suspend;
-        mmc-pwrseq = <&sdio_pwrseq>;
-        non-removable;
-        pinctrl-names = "default";
-        pinctrl-0 = <&sdmmc1_bus4 &sdmmc1_cmd &sdmmc1_clk>;
-        sd-uhs-sdr104;
-        status = "okay";
+	max-frequency = <150000000>;
+	supports-sdio;
+	bus-width = <4>;
+	disable-wp;
+	cap-sd-highspeed;
+	cap-sdio-irq;
+	keep-power-in-suspend;
+	mmc-pwrseq = <&sdio_pwrseq>;
+	non-removable;
+	pinctrl-names = "default";
+	pinctrl-0 = <&sdmmc2m0_bus4 &sdmmc2m0_cmd &sdmmc2m0_clk>;
+	sd-uhs-sdr104;
+	status = "okay";
 };
 
 &spdif_8ch {
@@ -749,25 +581,25 @@
 };
 
 &uart8 {
-	status = "disabled";
+	status = "okay";
 	pinctrl-names = "default";
 	pinctrl-0 = <&uart8m0_xfer &uart8m0_ctsn>;
 };
 
 &vcc3v3_lcd0_n {
-	gpio = <&gpio0 RK_PC4 GPIO_ACTIVE_HIGH>; 
+	gpio = <&gpio0 RK_PC7 GPIO_ACTIVE_HIGH>;
 	enable-active-high;
 };
 
 &vcc3v3_lcd1_n {
-	gpio = <&gpio3 RK_PA3 GPIO_ACTIVE_HIGH>; //MIPI_3V3EN_GPIO3_A3_d_3V3
+	gpio = <&gpio0 RK_PC5 GPIO_ACTIVE_HIGH>;
 	enable-active-high;
 };
 
 &wireless_wlan {
 	pinctrl-names = "default";
 	pinctrl-0 = <&wifi_host_wake_irq>;
-	WIFI,host_wake_irq = <&gpio2 RK_PB2 GPIO_ACTIVE_HIGH>;
+	WIFI,host_wake_irq = <&gpio3 RK_PD4 GPIO_ACTIVE_HIGH>;
 };
 
 &wireless_bluetooth {
@@ -775,47 +607,12 @@
 	clocks = <&rk809 1>;
 	clock-names = "ext_clock";
 	//wifi-bt-power-toggle;
-	uart_rts_gpios = <&gpio2 RK_PB5 GPIO_ACTIVE_LOW>;
+	uart_rts_gpios = <&gpio2 RK_PB1 GPIO_ACTIVE_LOW>;
 	pinctrl-names = "default", "rts_gpio";
-	pinctrl-0 = <&uart1m0_rtsn>;
-	pinctrl-1 = <&uart1_gpios>;
-	BT,reset_gpio    = <&gpio2 RK_PB7 GPIO_ACTIVE_HIGH>;
-    BT,wake_gpio     = <&gpio2 RK_PC0 GPIO_ACTIVE_HIGH>;
-    BT,wake_host_irq = <&gpio2 RK_PC1 GPIO_ACTIVE_HIGH>;
+	pinctrl-0 = <&uart8m0_rtsn>;
+	pinctrl-1 = <&uart8_gpios>;
+	BT,reset_gpio    = <&gpio3 RK_PA0 GPIO_ACTIVE_HIGH>;
+	BT,wake_gpio     = <&gpio3 RK_PA2 GPIO_ACTIVE_HIGH>;
+	BT,wake_host_irq = <&gpio3 RK_PA1 GPIO_ACTIVE_HIGH>;
 	status = "okay";
-};
-
-&uart0 {
-	status = "okay";
-};
-
-&uart1 {	
-	pinctrl-names = "default";	
-	pinctrl-0 = <&uart1m0_xfer &uart1m0_ctsn>;	
-	status = "okay";		
-};
-
-&uart3 {
-	status = "okay";
-	pinctrl-0 = <&uart3m1_xfer>;
-};
-
-&uart4 {
-	status = "okay";
-	pinctrl-0 = <&uart4m1_xfer>;
-};
-
-&uart5 {
-	status = "okay";
-	pinctrl-0 = <&uart5m1_xfer>;
-};
-
-&uart7 {
-	status = "okay";
-	pinctrl-0 = <&uart7m1_xfer>;
-};
-
-&uart9 {
-	status = "okay";
-	pinctrl-0 = <&uart9m1_xfer>;
 };
diff --git a/kernel/arch/arm64/boot/dts/rockchip/px30-evb-ddr3-v10.dtsi b/kernel/arch/arm64/boot/dts/rockchip/px30-evb-ddr3-v10.dtsi
index 8848618..ae7622c 100644
--- a/kernel/arch/arm64/boot/dts/rockchip/px30-evb-ddr3-v10.dtsi
+++ b/kernel/arch/arm64/boot/dts/rockchip/px30-evb-ddr3-v10.dtsi
@@ -99,33 +99,26 @@
 		status = "okay";
 	};
 
-	rk809-sound {
-		compatible = "simple-audio-card";
-		simple-audio-card,format = "i2s";
-		simple-audio-card,name = "rockchip,rk809-codec";
-		simple-audio-card,mclk-fs = <256>;
-		simple-audio-card,widgets =
-			"Microphone", "Mic Jack",
-			"Headphone", "Headphone Jack";
-		simple-audio-card,routing =
-			"Mic Jack", "MICBIAS1",
-			"IN1P", "Mic Jack",
-			"Headphone Jack", "HPOL",
-			"Headphone Jack", "HPOR";
-		simple-audio-card,cpu {
-			sound-dai = <&i2s1_2ch>;
-		};
-		simple-audio-card,codec {
-			sound-dai = <&rk809_codec>;
-		};
-	};
-
-	rk_headset: rk-headset {
-		compatible = "rockchip_headset";
-		headset_gpio = <&gpio3 RK_PA4 GPIO_ACTIVE_LOW>;
+	rk809_sound: rk809-sound {
+		status = "okay";
+		compatible = "rockchip,multicodecs-card";
+		rockchip,card-name = "rockchip-rk809";
+		hp-det-gpio = <&gpio2 RK_PB0 GPIO_ACTIVE_LOW>;
+		io-channels = <&saradc 1>;
+		io-channel-names = "adc-detect";
+		keyup-threshold-microvolt = <1800000>;
+		poll-interval = <100>;
+		rockchip,format = "i2s";
+		rockchip,mclk-fs = <256>;
+		rockchip,cpu = <&i2s1_2ch>;
+		rockchip,codec = <&rk809_codec>;
 		pinctrl-names = "default";
 		pinctrl-0 = <&hp_det>;
-		io-channels = <&saradc 1>;
+		play-pause-key {
+			label = "playpause";
+			linux,code = <KEY_PLAYPAUSE>;
+			press-threshold-microvolt = <2000>;
+		};
 	};
 
 	sdio_pwrseq: sdio-pwrseq {
diff --git a/kernel/arch/arm64/boot/dts/rockchip/px30-evb-ddr4-v10-linux.dts b/kernel/arch/arm64/boot/dts/rockchip/px30-evb-ddr4-v10-linux.dts
new file mode 100644
index 0000000..e54b0f7
--- /dev/null
+++ b/kernel/arch/arm64/boot/dts/rockchip/px30-evb-ddr4-v10-linux.dts
@@ -0,0 +1,13 @@
+// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
+/*
+ * Copyright (c) 2022 Rockchip Electronics Co., Ltd
+ */
+
+/dts-v1/;
+#include "px30-evb-ddr3-v10-linux.dts"
+#include "px30-ddr4p416dd6-timing.dtsi"
+
+/ {
+	model = "Rockchip linux PX30 evb ddr4 board";
+	compatible = "rockchip,px30-evb-ddr4-v10-linux", "rockchip,px30";
+};
diff --git a/kernel/arch/arm64/boot/dts/rockchip/px30.dtsi b/kernel/arch/arm64/boot/dts/rockchip/px30.dtsi
index 917a0e6..0d75f2a 100644
--- a/kernel/arch/arm64/boot/dts/rockchip/px30.dtsi
+++ b/kernel/arch/arm64/boot/dts/rockchip/px30.dtsi
@@ -982,6 +982,7 @@
 	pwm0: pwm@ff200000 {
 		compatible = "rockchip,px30-pwm", "rockchip,rk3328-pwm";
 		reg = <0x0 0xff200000 0x0 0x10>;
+		interrupts = <GIC_SPI 24 IRQ_TYPE_LEVEL_HIGH>;
 		#pwm-cells = <3>;
 		pinctrl-names = "active";
 		pinctrl-0 = <&pwm0_pin>;
@@ -993,6 +994,7 @@
 	pwm1: pwm@ff200010 {
 		compatible = "rockchip,px30-pwm", "rockchip,rk3328-pwm";
 		reg = <0x0 0xff200010 0x0 0x10>;
+		interrupts = <GIC_SPI 24 IRQ_TYPE_LEVEL_HIGH>;
 		#pwm-cells = <3>;
 		pinctrl-names = "active";
 		pinctrl-0 = <&pwm1_pin>;
@@ -1004,6 +1006,7 @@
 	pwm2: pwm@ff200020 {
 		compatible = "rockchip,px30-pwm", "rockchip,rk3328-pwm";
 		reg = <0x0 0xff200020 0x0 0x10>;
+		interrupts = <GIC_SPI 24 IRQ_TYPE_LEVEL_HIGH>;
 		#pwm-cells = <3>;
 		pinctrl-names = "active";
 		pinctrl-0 = <&pwm2_pin>;
@@ -1015,6 +1018,8 @@
 	pwm3: pwm@ff200030 {
 		compatible = "rockchip,px30-pwm", "rockchip,rk3328-pwm";
 		reg = <0x0 0xff200030 0x0 0x10>;
+		interrupts = <GIC_SPI 24 IRQ_TYPE_LEVEL_HIGH>,
+			     <GIC_SPI 89 IRQ_TYPE_LEVEL_HIGH>;
 		#pwm-cells = <3>;
 		pinctrl-names = "active";
 		pinctrl-0 = <&pwm3_pin>;
@@ -1026,6 +1031,7 @@
 	pwm4: pwm@ff208000 {
 		compatible = "rockchip,px30-pwm", "rockchip,rk3328-pwm";
 		reg = <0x0 0xff208000 0x0 0x10>;
+		interrupts = <GIC_SPI 25 IRQ_TYPE_LEVEL_HIGH>;
 		#pwm-cells = <3>;
 		pinctrl-names = "active";
 		pinctrl-0 = <&pwm4_pin>;
@@ -1037,6 +1043,7 @@
 	pwm5: pwm@ff208010 {
 		compatible = "rockchip,px30-pwm", "rockchip,rk3328-pwm";
 		reg = <0x0 0xff208010 0x0 0x10>;
+		interrupts = <GIC_SPI 25 IRQ_TYPE_LEVEL_HIGH>;
 		#pwm-cells = <3>;
 		pinctrl-names = "active";
 		pinctrl-0 = <&pwm5_pin>;
@@ -1048,6 +1055,7 @@
 	pwm6: pwm@ff208020 {
 		compatible = "rockchip,px30-pwm", "rockchip,rk3328-pwm";
 		reg = <0x0 0xff208020 0x0 0x10>;
+		interrupts = <GIC_SPI 25 IRQ_TYPE_LEVEL_HIGH>;
 		#pwm-cells = <3>;
 		pinctrl-names = "active";
 		pinctrl-0 = <&pwm6_pin>;
@@ -1059,6 +1067,8 @@
 	pwm7: pwm@ff208030 {
 		compatible = "rockchip,px30-pwm", "rockchip,rk3328-pwm";
 		reg = <0x0 0xff208030 0x0 0x10>;
+		interrupts = <GIC_SPI 25 IRQ_TYPE_LEVEL_HIGH>,
+			     <GIC_SPI 90 IRQ_TYPE_LEVEL_HIGH>;
 		#pwm-cells = <3>;
 		pinctrl-names = "active";
 		pinctrl-0 = <&pwm7_pin>;
diff --git a/kernel/arch/arm64/boot/dts/rockchip/px30s-dram-default-timing.dtsi b/kernel/arch/arm64/boot/dts/rockchip/px30s-dram-default-timing.dtsi
index c0b4f5d..aefe70a 100644
--- a/kernel/arch/arm64/boot/dts/rockchip/px30s-dram-default-timing.dtsi
+++ b/kernel/arch/arm64/boot/dts/rockchip/px30s-dram-default-timing.dtsi
@@ -310,12 +310,12 @@
 		dram_dll_dis_freq = <IGNORE_THIS>;
 		phy_dll_dis_freq = <IGNORE_THIS>;
 		/* drv when odt on */
-		phy_dq_drv_odten = <35>;
+		phy_dq_drv_odten = <44>;
 		phy_ca_drv_odten = <38>;
 		phy_clk_drv_odten = <47>;
 		dram_dq_drv_odten = <40>;
 		/* drv when odt off */
-		phy_dq_drv_odtoff = <35>;
+		phy_dq_drv_odtoff = <44>;
 		phy_ca_drv_odtoff = <38>;
 		phy_clk_drv_odtoff = <47>;
 		dram_dq_drv_odtoff = <40>;
@@ -328,11 +328,11 @@
 		dram_dq_odt_en_freq = <800>;
 		phy_odt_en_freq = <800>;
 		/* slew rate when odt enable */
-		phy_dq_sr_odten = <0x0>;
+		phy_dq_sr_odten = <0x7>;
 		phy_ca_sr_odten = <0x1>;
 		phy_clk_sr_odten = <0x1>;
 		/* slew rate when odt disable */
-		phy_dq_sr_odtoff = <0x0>;
+		phy_dq_sr_odtoff = <0x7>;
 		phy_ca_sr_odtoff = <0x1>;
 		phy_clk_sr_odtoff = <0x1>;
 		/* ssmod setting*/
@@ -371,7 +371,7 @@
 		lp4_dq_vref_odten = <276>;
 		lp4_ca_vref_odten = <380>;
 		/* lp4 vref info when odt disable */
-		phy_lp4_dq_vref_odtoff = <340>;
+		phy_lp4_dq_vref_odtoff = <420>;
 		lp4_dq_vref_odtoff = <420>;
 		lp4_ca_vref_odtoff = <420>;
 	};
diff --git a/kernel/arch/arm64/boot/dts/rockchip/rk-stb-ir-keymap.dtsi b/kernel/arch/arm64/boot/dts/rockchip/rk-stb-ir-keymap.dtsi
new file mode 100644
index 0000000..d18351e
--- /dev/null
+++ b/kernel/arch/arm64/boot/dts/rockchip/rk-stb-ir-keymap.dtsi
@@ -0,0 +1,397 @@
+// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
+/*
+ * Copyright (c) 2022 Rockchip Electronics Co., Ltd.
+ */
+#include <dt-bindings/input/rk-ir.h>
+
+&pwm3 {
+	ir_key1 {
+		rockchip,usercode = <0xff00>;
+		rockchip,key_table =
+			<0xf9	KEY_HOME>,
+			<0xbf	KEY_BACK>,
+			<0xfb	KEY_MENU>,
+			<0xaa	KEY_REPLY>,
+			<0xb9	KEY_UP>,
+			<0xe9	KEY_DOWN>,
+			<0xb8	KEY_LEFT>,
+			<0xea	KEY_RIGHT>,
+			<0xeb	KEY_VOLUMEDOWN>,
+			<0xef	KEY_VOLUMEUP>,
+			<0xf7	KEY_MUTE>,
+			<0xe7	KEY_POWER>,
+			<0xfc	KEY_POWER>,
+			<0xa9	KEY_VOLUMEDOWN>,
+			<0xa8	KEY_PLAYPAUSE>,
+			<0xe0	KEY_VOLUMEDOWN>,
+			<0xa5	KEY_VOLUMEDOWN>,
+			<0xab	183>,
+			<0xb7	388>,
+			<0xe8	388>,
+			<0xf8	184>,
+			<0xaf	185>,
+			<0xed	KEY_VOLUMEDOWN>,
+			<0xee	186>,
+			<0xb3	KEY_VOLUMEDOWN>,
+			<0xf1	KEY_VOLUMEDOWN>,
+			<0xf2	KEY_VOLUMEDOWN>,
+			<0xf3	KEY_SEARCH>,
+			<0xb4	KEY_VOLUMEDOWN>,
+			<0xa4	KEY_SETUP>,
+			<0xbe	KEY_SEARCH>;
+	};
+
+	/*for IPTV ltjc*/
+	ir_key2 {
+		rockchip,usercode = <0xc43b>;
+		rockchip,key_table =
+			<0x7e	KEY_REPLY>,
+			<0x7f	KEY_BACK>,
+			<0x7a	KEY_UP>,
+			<0x78	KEY_DOWN>,
+			<0x7b	KEY_LEFT>,
+			<0x79	KEY_RIGHT>,
+			<0x66	KEY_VOLUMEUP>,
+			<0x65	KEY_VOLUMEDOWN>,
+			<0x69	KEY_POWER>,
+			<0x64	KEY_MUTE>,
+			<0x76	KEY_1>,
+			<0x75	KEY_2>,
+			<0x74	KEY_3>,
+			<0x73	KEY_4>,
+			<0x72	KEY_5>,
+			<0x71	KEY_6>,
+			<0x70	KEY_7>,
+			<0x6f	KEY_8>,
+			<0x6e	KEY_9>,
+			<0x77	KEY_0>,
+			<0x7c	KEY_PAGEDOWN>,
+			<0x7d	KEY_PAGEUP>,
+			<0x6a	KEY_SETUP>,
+			<0x68	KEY_CHANNEL_UP>,
+			<0x67	KEY_CHANNEL_DN>,
+			<0x39	KEY_PORTAL>,
+			<0x29	KEY_HOME_PAGE>,
+			<0x33	KEY_CH_CUT_BACK>,
+			<0x34   KEY_LOCAL>,
+			<0x2d	KEY_REVIEW>,
+			<0x2c	KEY_ON_DEMAND>,
+			<0x2b	KEY_INFO1>,
+			<0x2e	KEY_DIRECT_SEEDING>,
+			<0x2d	KEY_REVIEW>,
+			<0x2c	KEY_ON_DEMAND>,
+			<0x2b	KEY_INFO1>,
+			<0x63	KEY_SOUND1>,
+			<0x6c	KEY_X1>,
+			<0x6d	KEY_X2>,
+			<0x62	KEY_PLAYPAUSE>,
+			<0x6b	KEY_EQUAL>,
+			<0x61	KEY_FASTFORWARD>,
+			<0x60	KEY_REWIND>,
+			<0x3b	KEY_STOP>,
+			<0x35  KEY_BLUE>,
+			<0x36  KEY_YELLOW>,
+			<0x37  KEY_GREEN>,
+			<0x38  KEY_RED>,
+			<0x00  KEY_AUTOPAIR>;
+	};
+
+	ir_key3 {
+		rockchip,usercode = <0x1dcc>;
+		rockchip,key_table =
+			<0xee	KEY_REPLY>,
+			<0xf0	KEY_BACK>,
+			<0xf8	KEY_UP>,
+			<0xbb	KEY_DOWN>,
+			<0xef	KEY_LEFT>,
+			<0xed	KEY_RIGHT>,
+			<0xfc	KEY_HOME>,
+			<0xf1	KEY_VOLUMEUP>,
+			<0xfd	KEY_VOLUMEDOWN>,
+			<0xb7	KEY_SEARCH>,
+			<0xff	KEY_POWER>,
+			<0xf3	KEY_MUTE>,
+			<0xbf	KEY_MENU>,
+			<0xf9	0x191>,
+			<0xf5	0x192>,
+			<0xb3	388>,
+			<0xbe	KEY_1>,
+			<0xba	KEY_2>,
+			<0xb2	KEY_3>,
+			<0xbd	KEY_4>,
+			<0xf9	KEY_5>,
+			<0xb1	KEY_6>,
+			<0xfc	KEY_7>,
+			<0xf8	KEY_8>,
+			<0xb0	KEY_9>,
+			<0xb6	KEY_0>,
+			<0xb5	KEY_BACKSPACE>;
+	};
+
+	/* for IPTV */
+	ir_key4 {
+		rockchip,usercode = <0x4db2>;
+		rockchip,key_table =
+			<0x31   KEY_REPLY>,
+			<0x3a   KEY_BACK>,
+			<0x35   KEY_UP>,
+			<0x2d   KEY_DOWN>,
+			<0x66   KEY_LEFT>,
+			<0x3e   KEY_RIGHT>,
+			<0x7f   KEY_VOLUMEUP>,
+			<0xfe   KEY_VOLUMEDOWN>,
+			<0x23   KEY_POWER>,
+			<0x63   KEY_MUTE>,
+			<0x6d   KEY_1>,
+			<0x6c   KEY_2>,
+			<0x33   KEY_3>,
+			<0x71   KEY_4>,
+			<0x70   KEY_5>,
+			<0x37   KEY_6>,
+			<0x75   KEY_7>,
+			<0x74   KEY_8>,
+			<0x3b   KEY_9>,
+			<0x78   KEY_0>,
+			<0x73   KEY_PAGEDOWN>,
+			<0x22   KEY_PAGEUP>,
+			<0x72   KEY_SETUP>,
+			<0x7a   KEY_CHANNEL_UP>,
+			<0x79   KEY_CHANNEL_DN>,
+			<0x77   KEY_HOME_PAGE>,
+			<0x29   KEY_CH_CUT_BACK>,
+			<0x32   KEY_DIRECT_SEEDING>,
+			<0x6e   KEY_REVIEW>,
+			<0x7c   KEY_ON_DEMAND>,
+			<0x3c   KEY_INFO1>,
+			<0x67   KEY_SOUND1>,
+			<0x25   KEY_X1>,
+			<0x2f   KEY_X2>,
+			<0x7d   KEY_LOCAL>,
+			<0x6a   KEY_PLAYPAUSE>,
+			<0x0b   KEY_EQUAL>;
+	};
+
+	/* for CMCC */
+	ir_key5 {
+		rockchip,usercode = <0x1608>;
+		rockchip,key_table =
+			<0x4c   KEY_REPLY>,
+			<0x4d   KEY_BACK>,
+			<0x4b   KEY_UP>,
+			<0x4a   KEY_DOWN>,
+			<0x49   KEY_LEFT>,
+			<0x48   KEY_RIGHT>,
+			<0x4e   KEY_HOME>,
+			<0x0b   KEY_VOLUMEUP>,
+			<0x0c   KEY_VOLUMEDOWN>,
+			<0x23   KEY_POWER>,
+			<0x45   KEY_MUTE>,
+			<0x44   KEY_MENU>,
+			<0x78   KEY_1>,
+			<0x77   KEY_2>,
+			<0x76   KEY_3>,
+			<0x75   KEY_4>,
+			<0x74   KEY_5>,
+			<0x73   KEY_6>,
+			<0x72   KEY_7>,
+			<0x71   KEY_8>,
+			<0x70   KEY_9>,
+			<0x79   KEY_0>,
+			<0x43   KEY_EQUAL>,
+			<0x72   KEY_X1>,
+			<0x5f   KEY_SETUP>,
+			<0x25   KEY_DIRECT_SEEDING>,
+			<0x24   KEY_REVIEW>,
+			<0x21   KEY_ON_DEMAND>,
+			<0x20   KEY_INFO1>;
+	};
+
+	/* rk new remote */
+	ir_key6 {
+		rockchip,usercode = <0xfe01>;
+		rockchip,key_table =
+			<0xec   KEY_REPLY>,
+			<0xe6   KEY_BACK>,
+			<0xe9   KEY_UP>,
+			<0xe5   KEY_DOWN>,
+			<0xae   KEY_LEFT>,
+			<0xaf   KEY_RIGHT>,
+			<0xee   KEY_HOME>,
+			<0xe7   KEY_VOLUMEUP>,
+			<0xef   KEY_VOLUMEDOWN>,
+			<0xbf   KEY_POWER>,
+			<0xbe   KEY_MUTE>,
+			<0xb3   KEY_MENU>,
+			<0xff   388>,
+			<0xb1   KEY_1>,
+			<0xf2   KEY_2>,
+			<0xf3   KEY_3>,
+			<0xb5   KEY_4>,
+			<0xf6   KEY_5>,
+			<0xf7   KEY_6>,
+			<0xb9   KEY_7>,
+			<0xfa   KEY_8>,
+			<0xfb   KEY_9>,
+			<0xfe   KEY_0>,
+			<0xbd   KEY_EQUAL>,
+			<0xbc   KEY_SETUP>,
+			<0xf0   KEY_LOCAL>,
+			<0x0d   KEY_DIRECT_SEEDING>,
+			<0x0c   KEY_REVIEW>,
+			<0x0b   KEY_ON_DEMAND>,
+			<0x0a   KEY_INFO1>,
+			<0x0e   KEY_CH_CUT_BACK>;
+	};
+
+	/* for CTC */
+	ir_key7 {
+		rockchip,usercode = <0x4cb3>;
+		rockchip,key_table =
+			<0x31   KEY_REPLY>,
+			<0x3a   KEY_BACK>,
+			<0x35   KEY_UP>,
+			<0x2d   KEY_DOWN>,
+			<0x66   KEY_LEFT>,
+			<0x3e   KEY_RIGHT>,
+			<0x7f   KEY_VOLUMEUP>,
+			<0x7e   KEY_VOLUMEDOWN>,
+			<0x23   KEY_POWER>,
+			<0x63   KEY_MUTE>,
+			<0x6d   KEY_1>,
+			<0x6c   KEY_2>,
+			<0x33   KEY_3>,
+			<0x71   KEY_4>,
+			<0x70   KEY_5>,
+			<0x37   KEY_6>,
+			<0x75   KEY_7>,
+			<0x74   KEY_8>,
+			<0x3b   KEY_9>,
+			<0x78   KEY_0>,
+			<0x73   KEY_PAGEDOWN>,
+			<0x22   KEY_PAGEUP>,
+			<0x72   KEY_SETUP>,
+			<0x7a   KEY_CHANNEL_UP>,
+			<0x79   KEY_CHANNEL_DN>,
+			<0x77   KEY_MENU>,
+			<0x29   KEY_CH_CUT_BACK>,
+			<0x32   KEY_DIRECT_SEEDING>,
+			<0x6e   KEY_REVIEW>,
+			<0x7c   KEY_ON_DEMAND>,
+			<0x3c   KEY_AUTOPAIR>,
+			<0x67   KEY_SOUND1>,
+			<0x25   KEY_X1>,
+			<0x2f   KEY_X2>,
+			<0x7d   KEY_HOME_PAGE>,
+			<0x6a   KEY_PLAYPAUSE>,
+			<0x0b   KEY_EQUAL>,
+			<0x1a   KEY_F12>,
+			<0xbc   KEY_F22>;
+	};
+
+	/* for CMCC */
+	ir_key8 {
+		rockchip,usercode = <0xdd22>;
+		rockchip,key_table =
+			<0x31   KEY_REPLY>,
+			<0x6a   KEY_BACK>,
+			<0x35   KEY_UP>,
+			<0x2d   KEY_DOWN>,
+			<0x66   KEY_LEFT>,
+			<0x3e   KEY_RIGHT>,
+			<0x7f   KEY_VOLUMEUP>,
+			<0x7e   KEY_VOLUMEDOWN>,
+			<0x23   KEY_POWER>,
+			<0x63   KEY_MUTE>,
+			<0x6d   KEY_1>,
+			<0x6c   KEY_2>,
+			<0x33   KEY_3>,
+			<0x71   KEY_4>,
+			<0x70   KEY_5>,
+			<0x37   KEY_6>,
+			<0x75   KEY_7>,
+			<0x74   KEY_8>,
+			<0x3b   KEY_9>,
+			<0x78   KEY_0>,
+			<0x73   KEY_PAGEDOWN>,
+			<0x22   KEY_PAGEUP>,
+			<0x72   KEY_SETUP>,
+			<0x7a   KEY_CHANNEL_UP>,
+			<0x79   KEY_CHANNEL_DN>,
+			<0x77   KEY_HOME_PAGE>,
+			<0x2f   KEY_CH_CUT_BACK>,
+			<0x32   KEY_DIRECT_SEEDING>,
+			<0x6e   KEY_REVIEW>,
+			<0x7c   KEY_ON_DEMAND>,
+			<0x3c   KEY_INFO1>,
+			<0x3a   KEY_HELP>,
+			<0x67   KEY_SOUND1>,
+			<0x25   KEY_X2>,
+			<0x7d   KEY_MENU>,
+			<0x3f   KEY_EQUAL>,
+			<0x29   388>,
+			<0x26   KEY_PLAYPAUSE>,
+			<0x76   401>,
+			<0x7b   400>,
+			<0x69   66>;
+	};
+
+	/* for BJLT IPTV */
+	ir_key9 {
+		rockchip,usercode = <0x3bc4>;
+		rockchip,key_table =
+			<0x81   KEY_REPLY>,
+			<0x80   KEY_BACK>,
+			<0x85   KEY_UP>,
+			<0x87   KEY_DOWN>,
+			<0x84   KEY_LEFT>,
+			<0x86   KEY_RIGHT>,
+			<0x99   KEY_VOLUMEUP>,
+			<0x9a   KEY_VOLUMEDOWN>,
+			<0x96   KEY_POWER>,
+			<0x9b   KEY_MUTE>,
+			<0x89   KEY_1>,
+			<0x8a   KEY_2>,
+			<0x8b   KEY_3>,
+			<0x8c   KEY_4>,
+			<0x8d   KEY_5>,
+			<0x8e   KEY_6>,
+			<0x8f   KEY_7>,
+			<0x90   KEY_8>,
+			<0x91   KEY_9>,
+			<0x88   KEY_0>,
+			<0x83   KEY_PAGEDOWN>,
+			<0x82   KEY_PAGEUP>,
+			<0x95   KEY_SETUP>,
+			<0x97   KEY_CHANNEL_UP>,
+			<0x98   KEY_CHANNEL_DN>,
+			<0xc6   KEY_LOCAL>,
+			<0xd6   KEY_HOME_PAGE>,
+			<0xd7   KEY_TRACK>,
+			<0xcc   KEY_CH_CUT_BACK>,
+			<0xc3   KEY_INTERX>,
+			<0xd1   KEY_DIRECT_SEEDING>,
+			<0xd2   KEY_REVIEW>,
+			<0xd3   KEY_ON_DEMAND>,
+			<0xd4   KEY_INFO1>,
+			<0xc7   KEY_DIRECT_SEEDING>,
+			<0xc8   KEY_REVIEW>,
+			<0xc9   KEY_ON_DEMAND>,
+			<0xca   KEY_INFO1>,
+			<0xcd   KEY_FAVORITE>,
+			<0xce   KEY_CHANNEL_POS>,
+			<0xcf   KEY_HELP>,
+			<0xd0   KEY_EVENT>,
+			<0x9c   KEY_SOUND1>,
+			<0x93   KEY_X1>,
+			<0x92   KEY_X2>,
+			<0xc0   KEY_END>,
+			<0xc1   KEY_GO_BEGINNING>,
+			<0x9d   KEY_PLAYPAUSE>,
+			<0xc4   KEY_STOP>,
+			<0x94   KEY_EQUAL>,
+			<0x9e   KEY_YELLOW>,
+			<0x9f   KEY_BLUE>,
+			<0xcb   KEY_APPLICATION>,
+			<0xc5   KEY_POS>;
+	};
+};
diff --git a/kernel/arch/arm64/boot/dts/rockchip/rk3326-linux.dtsi b/kernel/arch/arm64/boot/dts/rockchip/rk3326-linux.dtsi
index a386cd2..9c897ba 100644
--- a/kernel/arch/arm64/boot/dts/rockchip/rk3326-linux.dtsi
+++ b/kernel/arch/arm64/boot/dts/rockchip/rk3326-linux.dtsi
@@ -43,6 +43,12 @@
 / {
 	compatible = "rockchip,linux", "rockchip,rk3326";
 
+	aliases {
+		mmc0 = &emmc;
+		mmc1 = &sdmmc;
+		mmc2 = &sdio;
+	};
+
 	chosen {
 		bootargs = "earlycon=uart8250,mmio32,0xff160000 console=ttyFIQ0 rw root=PARTUUID=614e0000-0000 rootwait";
 	};
diff --git a/kernel/arch/arm64/boot/dts/rockchip/rk3328.dtsi b/kernel/arch/arm64/boot/dts/rockchip/rk3328.dtsi
index 61199e7..13e9723 100644
--- a/kernel/arch/arm64/boot/dts/rockchip/rk3328.dtsi
+++ b/kernel/arch/arm64/boot/dts/rockchip/rk3328.dtsi
@@ -1006,6 +1006,7 @@
 		reg-io-width = <4>;
 		interrupts = <GIC_SPI 35 IRQ_TYPE_LEVEL_HIGH>,
 			     <GIC_SPI 71 IRQ_TYPE_LEVEL_HIGH>;
+		interrupt-names = "hdmi", "hdmi_wakeup";
 		clocks = <&cru PCLK_HDMI>,
 			 <&cru SCLK_HDMI_SFC>,
 			 <&cru SCLK_RTC32K>,
diff --git a/kernel/arch/arm64/boot/dts/rockchip/rk3358-linux.dtsi b/kernel/arch/arm64/boot/dts/rockchip/rk3358-linux.dtsi
index cdaecbc..97d6434 100644
--- a/kernel/arch/arm64/boot/dts/rockchip/rk3358-linux.dtsi
+++ b/kernel/arch/arm64/boot/dts/rockchip/rk3358-linux.dtsi
@@ -33,6 +33,15 @@
 			compatible = "rockchip,drm-logo";
 			reg = <0x0 0x0 0x0 0x0>;
 		};
+
+		ramoops: ramoops@110000 {
+			compatible = "ramoops";
+			reg = <0x0 0x110000 0x0 0xf0000>;
+			record-size = <0x20000>;
+			console-size = <0x80000>;
+			ftrace-size = <0x00000>;
+			pmsg-size = <0x50000>;
+		};
 	};
 };
 
diff --git a/kernel/arch/arm64/boot/dts/rockchip/rk3368.dtsi b/kernel/arch/arm64/boot/dts/rockchip/rk3368.dtsi
index 04fd195..c370fc1 100644
--- a/kernel/arch/arm64/boot/dts/rockchip/rk3368.dtsi
+++ b/kernel/arch/arm64/boot/dts/rockchip/rk3368.dtsi
@@ -1658,7 +1658,8 @@
 		compatible = "rockchip,rk3368-dw-hdmi";
 		reg = <0x0 0xff980000 0x0 0x20000>;
 		reg-io-width = <4>;
-		interrupts = <GIC_SPI 103 IRQ_TYPE_LEVEL_HIGH>;
+		interrupts = <GIC_SPI 103 IRQ_TYPE_LEVEL_HIGH>, <GIC_SPI 102 IRQ_TYPE_LEVEL_HIGH>;
+		interrupt-names = "hdmi", "hdmi_wakeup";
 		clocks = <&cru PCLK_HDMI_CTRL>, <&cru SCLK_HDMI_HDCP>, <&cru SCLK_HDMI_CEC>;
 		clock-names = "iahb", "isfr", "cec";
 		pinctrl-names = "default";
diff --git a/kernel/arch/arm64/boot/dts/rockchip/rk3399-linux.dtsi b/kernel/arch/arm64/boot/dts/rockchip/rk3399-linux.dtsi
index bbe1eed..6bd7174 100644
--- a/kernel/arch/arm64/boot/dts/rockchip/rk3399-linux.dtsi
+++ b/kernel/arch/arm64/boot/dts/rockchip/rk3399-linux.dtsi
@@ -46,6 +46,12 @@
 / {
 	compatible = "rockchip,linux", "rockchip,rk3399";
 
+	aliases {
+		mmc0 = &sdhci;
+		mmc1 = &sdmmc;
+		mmc2 = &sdio0;
+	};
+
 	chosen {
 		bootargs = "earlycon=uart8250,mmio32,0xff1a0000 console=ttyFIQ0 rw root=PARTUUID=614e0000-0000 rootfstype=ext4 rootwait coherent_pool=1m";
 	};
diff --git a/kernel/arch/arm64/boot/dts/rockchip/rk3399.dtsi b/kernel/arch/arm64/boot/dts/rockchip/rk3399.dtsi
index 36011b4..a9e8aec 100644
--- a/kernel/arch/arm64/boot/dts/rockchip/rk3399.dtsi
+++ b/kernel/arch/arm64/boot/dts/rockchip/rk3399.dtsi
@@ -448,6 +448,16 @@
 		status = "disabled";
 	};
 
+	debug: debug@fe430000 {
+		compatible = "rockchip,debug";
+		reg = <0x0 0xfe430000 0x0 0x1000>,
+		      <0x0 0xfe432000 0x0 0x1000>,
+		      <0x0 0xfe434000 0x0 0x1000>,
+		      <0x0 0xfe436000 0x0 0x1000>,
+		      <0x0 0xfe610000 0x0 0x1000>,
+		      <0x0 0xfe710000 0x0 0x1000>;
+	};
+
 	usbdrd3_0: usb@fe800000 {
 		compatible = "rockchip,rk3399-dwc3";
 		#address-cells = <2>;
@@ -2045,7 +2055,9 @@
 	hdmi: hdmi@ff940000 {
 		compatible = "rockchip,rk3399-dw-hdmi";
 		reg = <0x0 0xff940000 0x0 0x20000>;
-		interrupts = <GIC_SPI 23 IRQ_TYPE_LEVEL_HIGH 0>;
+		interrupts = <GIC_SPI 23 IRQ_TYPE_LEVEL_HIGH 0>,
+			     <GIC_SPI 24 IRQ_TYPE_LEVEL_HIGH 0>;
+		interrupt-names = "hdmi", "hdmi_wakeup";
 		clocks = <&cru PCLK_HDMI_CTRL>,
 			 <&cru SCLK_HDMI_SFR>,
 			 <&cru PLL_VPLL>,
@@ -2301,6 +2313,29 @@
 		reg = <0x0 0xffa8f800 0x0 0x400>;
 	};
 
+	cci: cci@ffb00000 {
+		compatible = "arm,cci-500";
+		reg = <0x0 0xffb00000 0x0 0x10000>;
+		ranges = <0x0 0x0 0xffb00000 0xa0000>;
+		#address-cells = <1>;
+		#size-cells = <1>;
+		status = "disabled";
+
+		cci_pmu: pmu@10000 {
+			compatible = "arm,cci-500-pmu,r0";
+			reg = <0x10000 0x80000>;
+			interrupts = <GIC_SPI 79 IRQ_TYPE_LEVEL_HIGH 0>,
+				     <GIC_SPI 79 IRQ_TYPE_LEVEL_HIGH 0>,
+				     <GIC_SPI 79 IRQ_TYPE_LEVEL_HIGH 0>,
+				     <GIC_SPI 79 IRQ_TYPE_LEVEL_HIGH 0>,
+				     <GIC_SPI 79 IRQ_TYPE_LEVEL_HIGH 0>,
+				     <GIC_SPI 79 IRQ_TYPE_LEVEL_HIGH 0>,
+				     <GIC_SPI 79 IRQ_TYPE_LEVEL_HIGH 0>,
+				     <GIC_SPI 79 IRQ_TYPE_LEVEL_HIGH 0>;
+			status = "disabled";
+		};
+	};
+
 	rockchip_system_monitor: rockchip-system-monitor {
 		compatible = "rockchip,system-monitor";
 
diff --git a/kernel/arch/arm64/boot/dts/rockchip/rk3528-android.dtsi b/kernel/arch/arm64/boot/dts/rockchip/rk3528-android.dtsi
new file mode 100644
index 0000000..396bfdb
--- /dev/null
+++ b/kernel/arch/arm64/boot/dts/rockchip/rk3528-android.dtsi
@@ -0,0 +1,106 @@
+// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
+/*
+ * Copyright (c) 2022 Rockchip Electronics Co., Ltd.
+ *
+ */
+
+/ {
+	chosen: chosen {
+		bootargs = "earlycon=uart8250,mmio32,0xff9f0000 console=ttyFIQ0 driver_async_probe=dwmmc_rockchip,rk_gmac-dwmac,rockchip-drm drm_kms_helper.fbdev_emulation=0";
+	};
+
+	fiq-debugger {
+		compatible = "rockchip,fiq-debugger";
+		rockchip,serial-id = <0>;
+		rockchip,wake-irq = <0>;
+		/* If enable uart uses irq instead of fiq */
+		rockchip,irq-mode-enable = <1>;
+		rockchip,baudrate = <1500000>;  /* Only 115200 and 1500000 */
+		interrupts = <GIC_SPI 186 IRQ_TYPE_LEVEL_HIGH>;
+		pinctrl-names = "default";
+		pinctrl-0 = <&uart0m0_xfer>;
+		status = "okay";
+	};
+
+	firmware {
+		optee {
+			compatible = "linaro,optee-tz";
+			method = "smc";
+		};
+	};
+
+	reserved_memory: reserved-memory {
+		#address-cells = <2>;
+		#size-cells = <2>;
+		ranges;
+
+		cma {
+			compatible = "shared-dma-pool";
+			reusable;
+			size = <0x0 0x00800000>;
+			linux,cma-default;
+		};
+
+		drm_logo: drm-logo@00000000 {
+			compatible = "rockchip,drm-logo";
+			reg = <0x0 0x0 0x0 0x0>;
+		};
+
+		drm_cubic_lut: drm-cubic-lut@00000000 {
+			compatible = "rockchip,drm-cubic-lut";
+			reg = <0x0 0x0 0x0 0x0>;
+		};
+
+		ramoops: ramoops@110000 {
+			compatible = "ramoops";
+			/* 0x110000 to 0x1f0000 is for ramoops */
+			reg = <0x0 0x110000 0x0 0xe0000>;
+			boot-log-size = <0x8000>;	/* do not change */
+			boot-log-count = <0x1>;		/* do not change */
+			console-size = <0x80000>;
+			pmsg-size = <0x30000>;
+			ftrace-size = <0x00000>;
+			record-size = <0x14000>;
+		};
+	};
+};
+
+&display_subsystem {
+	memory-region = <&drm_logo>, <&drm_cubic_lut>;
+	memory-region-names = "drm-logo", "drm-cubic-lut";
+	/* devfreq = <&dmc>; */
+
+	route {
+		route_hdmi: route-hdmi {
+			status = "okay";
+			logo,uboot = "logo.bmp";
+			logo,kernel = "logo_kernel.bmp";
+			logo,mode = "fullscreen";
+			charge_logo,mode = "center";
+			connect = <&vp0_out_hdmi>;
+		};
+		route_tve: route-tve {
+			status = "okay";
+			logo,uboot = "logo.bmp";
+			logo,kernel = "logo_kernel.bmp";
+			logo,mode = "fullscreen";
+			charge_logo,mode = "center";
+			connect = <&vp1_out_tve>;
+		};
+	};
+};
+
+&rng {
+	status = "okay";
+};
+
+&vop {
+	/*
+	 * 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,
+	 */
+	esmart_lb_mode = /bits/ 8 <3>;
+	support-multi-area;
+};
diff --git a/kernel/arch/arm64/boot/dts/rockchip/rk3528-demo.dtsi b/kernel/arch/arm64/boot/dts/rockchip/rk3528-demo.dtsi
new file mode 100644
index 0000000..aebd946
--- /dev/null
+++ b/kernel/arch/arm64/boot/dts/rockchip/rk3528-demo.dtsi
@@ -0,0 +1,497 @@
+// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
+/*
+ * Copyright (c) 2022 Rockchip Electronics Co., Ltd.
+ *
+ */
+
+#include "rk3528.dtsi"
+#include <dt-bindings/gpio/gpio.h>
+#include <dt-bindings/input/rk-input.h>
+#include <dt-bindings/pinctrl/rockchip.h>
+#include "rk-stb-ir-keymap.dtsi"
+
+/ {
+	acodec_sound: acodec-sound {
+		status = "okay";
+		compatible = "simple-audio-card";
+		simple-audio-card,name = "rk3528-acodec";
+		simple-audio-card,format = "i2s";
+		simple-audio-card,mclk-fs = <256>;
+		simple-audio-card,cpu {
+			sound-dai = <&sai2>;
+		};
+		simple-audio-card,codec {
+			sound-dai = <&acodec>;
+		};
+	};
+
+	adc_keys: adc-keys {
+		status = "okay";
+		compatible = "adc-keys";
+		io-channels = <&saradc 1>;
+		io-channel-names = "buttons";
+		keyup-threshold-microvolt = <1800000>;
+		poll-interval = <100>;
+
+		vol-up-key {
+			label = "volume up";
+			linux,code = <KEY_VOLUMEUP>;
+			press-threshold-microvolt = <1750>;
+		};
+	};
+
+	bt_sco: bt-sco {
+		status = "disabled";
+		compatible = "delta,dfbmcs320";
+		#sound-dai-cells = <1>;
+	};
+
+	bt_sound: bt-sound {
+		status = "disabled";
+		compatible = "simple-audio-card";
+		simple-audio-card,format = "dsp_a";
+		simple-audio-card,bitclock-inversion = <0>;
+		simple-audio-card,mclk-fs = <256>;
+		simple-audio-card,name = "rockchip,bt";
+		simple-audio-card,cpu {
+			sound-dai = <&sai0>;
+		};
+		simple-audio-card,codec {
+			sound-dai = <&bt_sco 1>;
+		};
+	};
+
+	dc_12v: dc-12v {
+		compatible = "regulator-fixed";
+		regulator-name = "dc_12v";
+		regulator-always-on;
+		regulator-boot-on;
+		regulator-min-microvolt = <12000000>;
+		regulator-max-microvolt = <12000000>;
+	};
+
+	leds: gpio-leds {
+		compatible = "gpio-leds";
+		ir {
+			gpios = <&gpio4 RK_PB7 GPIO_ACTIVE_HIGH>;
+			linux,default-trigger = "none";
+			default-state = "off";
+		};
+		net-red {
+			gpios = <&gpio4 RK_PB5 GPIO_ACTIVE_HIGH>;
+			linux,default-trigger = "none";
+			default-state = "off";
+		};
+		net-green {
+			gpios = <&gpio4 RK_PC0 GPIO_ACTIVE_HIGH>;
+			linux,default-trigger = "none";
+			default-state = "off";
+		};
+		pwr-red {
+			gpios = <&gpio4 RK_PB3 GPIO_ACTIVE_HIGH>;
+			linux,default-trigger = "none";
+			default-state = "off";
+			retain-state-suspended;
+			retain-state-shutdown;
+		};
+		pwr-green {
+			gpios = <&gpio4 RK_PC1 GPIO_ACTIVE_HIGH>;
+			linux,default-trigger = "none";
+			default-state = "on";
+			retain-state-suspended;
+			retain-state-shutdown;
+		};
+	};
+
+	hdmi_sound: hdmi-sound {
+		compatible = "rockchip,hdmi";
+		rockchip,mclk-fs = <128>;
+		rockchip,card-name = "rockchip,hdmi";
+		rockchip,cpu = <&sai3>;
+		rockchip,codec = <&hdmi>;
+		rockchip,jack-det;
+	};
+
+	pdmics: dummy-codec {
+		status = "disabled";
+		compatible = "rockchip,dummy-codec";
+		#sound-dai-cells = <0>;
+	};
+
+	pdm_mic_array: pdm-mic-array {
+		status = "disabled";
+		compatible = "simple-audio-card";
+		simple-audio-card,name = "rockchip,pdm-mic-array";
+		simple-audio-card,cpu {
+			sound-dai = <&pdm>;
+		};
+		simple-audio-card,codec {
+			sound-dai = <&pdmics>;
+		};
+	};
+
+	spdif-sound {
+		status = "okay";
+		compatible = "simple-audio-card";
+		simple-audio-card,name = "ROCKCHIP,SPDIF";
+		simple-audio-card,cpu {
+			sound-dai = <&spdif_8ch>;
+		};
+		simple-audio-card,codec {
+			sound-dai = <&spdif_out>;
+		};
+	};
+
+	spdif_out: spdif-out {
+		status = "okay";
+		compatible = "linux,spdif-dit";
+		#sound-dai-cells = <0>;
+	};
+
+	vcc5v0_sys: vcc5v0-sys {
+		compatible = "regulator-fixed";
+		regulator-name = "vcc5v0_sys";
+		regulator-always-on;
+		regulator-boot-on;
+		regulator-min-microvolt = <5000000>;
+		regulator-max-microvolt = <5000000>;
+		vin-supply = <&dc_12v>;
+	};
+
+	vcc5v0_host: vcc5v0-host-regulator {
+		compatible = "regulator-fixed";
+		regulator-name = "vcc5v0_host";
+		regulator-boot-on;
+		regulator-always-on;
+		regulator-min-microvolt = <5000000>;
+		regulator-max-microvolt = <5000000>;
+		enable-active-high;
+		gpio = <&gpio4 RK_PB4 GPIO_ACTIVE_HIGH>;
+		vin-supply = <&vcc5v0_sys>;
+		pinctrl-names = "default";
+		pinctrl-0 = <&vcc5v0_host_en>;
+	};
+
+	vdd_logic: vdd-logic {
+		compatible = "pwm-regulator";
+		pwms = <&pwm2 0 5000 1>;
+		regulator-name = "vdd_logic";
+		regulator-min-microvolt = <703000>;
+		regulator-max-microvolt = <1006000>;
+		regulator-init-microvolt = <900000>;
+		regulator-always-on;
+		regulator-boot-on;
+		regulator-settling-time-up-us = <250>;
+		pwm-supply = <&vcc5v0_sys>;
+		status = "okay";
+	};
+
+	vdd_cpu: vdd-cpu {
+		compatible = "pwm-regulator";
+		pwms = <&pwm1 0 5000 1>;
+		regulator-name = "vdd_cpu";
+		regulator-min-microvolt = <746000>;
+		regulator-max-microvolt = <1201000>;
+		regulator-init-microvolt = <953000>;
+		regulator-always-on;
+		regulator-boot-on;
+		regulator-settling-time-up-us = <250>;
+		pwm-supply = <&vcc5v0_sys>;
+		status = "okay";
+	};
+
+	vdd_0v9_s3: vdd-0v9-s3 {
+		compatible = "regulator-fixed";
+		regulator-name = "vdd_0v9_s3";
+		regulator-always-on;
+		regulator-boot-on;
+		regulator-min-microvolt = <900000>;
+		regulator-max-microvolt = <900000>;
+		vin-supply = <&vcc5v0_sys>;
+	};
+
+	vdd_1v8_s3: vdd-1v8-s3 {
+		compatible = "regulator-fixed";
+		regulator-name = "vdd_1v8_s3";
+		regulator-always-on;
+		regulator-boot-on;
+		regulator-min-microvolt = <1800000>;
+		regulator-max-microvolt = <1800000>;
+		vin-supply = <&vcc5v0_sys>;
+	};
+
+	vcc_3v3_s3: vcc-3v3-s3 {
+		compatible = "regulator-fixed";
+		regulator-name = "vcc_3v3_s3";
+		regulator-always-on;
+		regulator-boot-on;
+		regulator-min-microvolt = <3300000>;
+		regulator-max-microvolt = <3300000>;
+		vin-supply = <&vcc5v0_sys>;
+	};
+
+	vcc_ddr_s3: vcc-ddr-s3 {
+		compatible = "regulator-fixed";
+		regulator-name = "vcc_ddr_s3";
+		regulator-always-on;
+		regulator-boot-on;
+		regulator-min-microvolt = <1200000>;
+		regulator-max-microvolt = <1200000>;
+		vin-supply = <&vcc5v0_sys>;
+	};
+};
+
+&acodec {
+	pa-ctl-gpios = <&gpio0 RK_PA0 GPIO_ACTIVE_HIGH>;
+	status = "okay";
+};
+
+&avsd {
+	status = "okay";
+};
+
+&cpu0 {
+	cpu-supply = <&vdd_cpu>;
+};
+
+&crypto {
+	status = "okay";
+};
+
+&dfi {
+	status = "okay";
+};
+
+&display_subsystem {
+	status = "okay";
+};
+
+&dmc {
+	center-supply = <&vdd_logic>;
+	status = "okay";
+};
+
+&gmac0 {
+	status = "okay";
+};
+
+&gpu {
+	mali-supply = <&vdd_logic>;
+	status = "okay";
+};
+
+&gpu_bus {
+	bus-supply = <&vdd_logic>;
+	status = "okay";
+};
+
+&hdmi {
+	status = "okay";
+};
+
+&hdmi_in_vp0 {
+	status = "okay";
+};
+
+&hdmiphy {
+	status = "okay";
+};
+
+&iep {
+	status = "okay";
+};
+
+&iep_mmu {
+	status = "okay";
+};
+
+&jpegd {
+	status = "okay";
+};
+
+&jpegd_mmu {
+	status = "okay";
+};
+
+&mpp_srv {
+	status = "okay";
+};
+
+&pinctrl {
+	usb {
+		vcc5v0_host_en: vcc5v0-host-en {
+			rockchip,pins = <4 RK_PB4 RK_FUNC_GPIO &pcfg_pull_none>;
+		};
+	};
+};
+
+&pwm1 {
+	status = "okay";
+};
+
+&pwm2 {
+	status = "okay";
+};
+
+&pwm3 {
+	compatible = "rockchip,remotectl-pwm";
+	pinctrl-names = "default";
+	pinctrl-0 = <&pwm3m0_pins>;
+	remote_pwm_id = <3>;
+	handle_cpu_id = <1>;
+	remote_support_psci = <0>;
+	status = "okay";
+};
+
+&rga2 {
+	status = "okay";
+};
+
+&rga2_mmu {
+	status = "okay";
+};
+
+&rkvdec {
+	status = "okay";
+};
+
+&rkvdec_mmu {
+	status = "okay";
+};
+
+&rkvenc {
+	status = "okay";
+};
+
+&rkvenc_mmu {
+	status = "okay";
+};
+
+&rmii0_phy {
+	/delete-property/ pinctrl-names;
+	/delete-property/ pinctrl-0;
+};
+
+&rockchip_suspend {
+	status = "okay";
+	rockchip,sleep-debug-en = <1>;
+	rockchip,virtual-poweroff = <1>;
+	rockchip,sleep-mode-config = <
+		(0
+		| RKPM_SLP_ARMPD
+		)
+	>;
+	rockchip,wakeup-config = <
+		(0
+		| RKPM_CPU0_WKUP_EN
+		| RKPM_GPIO_WKUP_EN
+		)
+	>;
+	rockchip,pwm-regulator-config = <
+		(0
+		| RKPM_PWM1_M0_REGULATOR_EN
+		)
+	>;
+};
+
+&sai0 {
+	pinctrl-0 = <&i2s0m0_lrck &i2s0m0_sclk &i2s0m0_sdi &i2s0m0_sdo>;
+	status = "disabled";
+};
+
+&sai2 {
+	status = "okay";
+};
+
+&sai3 {
+	status = "okay";
+};
+
+&saradc {
+	status = "okay";
+	vref-supply = <&vdd_1v8_s3>;
+};
+
+&sdhci {
+	bus-width = <8>;
+	supports-emmc;
+	non-removable;
+	mmc-hs400-1_8v;
+	mmc-hs400-enhanced-strobe;
+	max-frequency = <200000000>;
+	fixed-emmc-driver-type = <4>;
+	status = "okay";
+};
+
+&spdif_8ch {
+	status = "okay";
+};
+
+&tsadc {
+	status = "okay";
+};
+
+&tve {
+	status = "okay";
+};
+
+&tve_in_vp1 {
+	status = "okay";
+};
+
+&u2phy_host {
+	phy-supply = <&vcc5v0_host>;
+	status = "okay";
+};
+
+&u2phy_otg {
+	phy-supply = <&vcc5v0_host>;
+	status = "okay";
+};
+
+&usb2phy {
+	status = "okay";
+};
+
+&usb_host0_ehci {
+	status = "okay";
+};
+
+&usb_host0_ohci {
+	status = "okay";
+};
+
+&usbdrd30 {
+	status = "okay";
+};
+
+&usbdrd_dwc3 {
+	dr_mode = "otg";
+	maximum-speed = "high-speed";
+	extcon = <&usb2phy>;
+	phys = <&u2phy_otg>;
+	phy-names = "usb2-phy";
+	snps,dis_u2_susphy_quirk;
+	snps,usb2-lpm-disable;
+	status = "okay";
+};
+
+&vdpp {
+	status = "okay";
+};
+
+&vdpu {
+	status = "okay";
+};
+
+&vdpu_mmu {
+	status = "okay";
+};
+
+&vop {
+	status = "okay";
+};
+
+&vop_mmu {
+	status = "okay";
+};
diff --git a/kernel/arch/arm64/boot/dts/rockchip/rk3528-demo1-lp4-v10.dts b/kernel/arch/arm64/boot/dts/rockchip/rk3528-demo1-lp4-v10.dts
new file mode 100644
index 0000000..d1084a5
--- /dev/null
+++ b/kernel/arch/arm64/boot/dts/rockchip/rk3528-demo1-lp4-v10.dts
@@ -0,0 +1,31 @@
+// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
+/*
+ * Copyright (c) 2022 Rockchip Electronics Co., Ltd.
+ *
+ */
+
+#include "rk3528-demo1-lp4-v10.dtsi"
+#include "rk3528-android.dtsi"
+
+/{
+	firmware {
+		android {
+			compatible = "android,firmware";
+			boot_devices = "ffbf0000.mmc";
+			vbmeta {
+				compatible = "android,vbmeta";
+				parts = "vbmeta,boot,system,vendor,dtbo";
+			};
+			fstab {
+				compatible = "android,fstab";
+				vendor {
+					compatible = "android,vendor";
+					dev = "/dev/block/by-name/vendor";
+					type = "ext4";
+					mnt_flags = "ro,barrier=1,inode_readahead_blks=8";
+					fsmgr_flags = "wait,avb";
+				};
+			};
+		};
+	};
+};
diff --git a/kernel/arch/arm64/boot/dts/rockchip/rk3528-demo1-lp4-v10.dtsi b/kernel/arch/arm64/boot/dts/rockchip/rk3528-demo1-lp4-v10.dtsi
new file mode 100644
index 0000000..c1f34d0
--- /dev/null
+++ b/kernel/arch/arm64/boot/dts/rockchip/rk3528-demo1-lp4-v10.dtsi
@@ -0,0 +1,92 @@
+// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
+/*
+ * Copyright (c) 2022 Rockchip Electronics Co., Ltd.
+ *
+ */
+
+/dts-v1/;
+
+#include "rk3528.dtsi"
+#include "rk3528-demo.dtsi"
+
+/ {
+	model = "Rockchip RK3528 DEMO1 LP4 V10 Board";
+	compatible = "rockchip,rk3528-demo1-lp4-v10", "rockchip,rk3528";
+
+	sdio_pwrseq: sdio-pwrseq {
+		compatible = "mmc-pwrseq-simple";
+		pinctrl-names = "default";
+		pinctrl-0 = <&wifi_enable_h &wifi_reset &clkm0_32k_out>;
+		reset-gpios = <&gpio3 RK_PB2 GPIO_ACTIVE_LOW>;
+	};
+
+	wireless_bluetooth: wireless-bluetooth {
+		compatible = "bluetooth-platdata";
+		//wifi-bt-power-toggle;
+		uart_rts_gpios = <&gpio3 RK_PA2 GPIO_ACTIVE_LOW>;
+		pinctrl-names = "default", "rts_gpio";
+		pinctrl-0 = <&uart2m0_rtsn>;
+		pinctrl-1 = <&uart2m0_gpios>;
+		BT,reset_gpio    = <&gpio3 RK_PC2 GPIO_ACTIVE_HIGH>;
+		BT,wake_host_irq = <&gpio3 RK_PC1 GPIO_ACTIVE_HIGH>;
+		status = "okay";
+	};
+
+	wireless_wlan: wireless-wlan {
+		compatible = "wlan-platdata";
+		rockchip,grf = <&grf>;
+		wifi_chip_type = "rtl8822cs";
+		pinctrl-names = "default";
+		pinctrl-0 = <&wifi_host_wake_irq>;
+		WIFI,host_wake_irq = <&gpio3 RK_PB3 GPIO_ACTIVE_HIGH>;
+		status = "okay";
+	};
+};
+
+&sdio1 {
+	max-frequency = <200000000>;
+	no-sd;
+	no-mmc;
+	supports-sdio;
+	bus-width = <4>;
+	disable-wp;
+	cap-sd-highspeed;
+	cap-sdio-irq;
+	keep-power-in-suspend;
+	non-removable;
+	mmc-pwrseq = <&sdio_pwrseq>;
+	pinctrl-names = "default";
+	pinctrl-0 = <&sdio1_bus4 &sdio1_cmd &sdio1_clk>;
+	sd-uhs-sdr104;
+	status = "okay";
+};
+
+&uart2 {
+	status = "okay";
+	pinctrl-names = "default";
+	pinctrl-0 = <&uart2m0_xfer &uart2m0_ctsn>;
+};
+
+&pinctrl {
+	sdio-pwrseq {
+		wifi_enable_h: wifi-enable-h {
+			rockchip,pins = <3 RK_PB2 RK_FUNC_GPIO &pcfg_pull_none>;
+		};
+	};
+
+	wireless-wlan {
+		wifi_host_wake_irq: wifi-host-wake-irq {
+			rockchip,pins = <3 RK_PB3 RK_FUNC_GPIO &pcfg_pull_down>;
+		};
+
+		wifi_reset: wifi-reset {
+			rockchip,pins = <3 RK_PB4 RK_FUNC_GPIO &pcfg_output_high>;
+		};
+	};
+
+	wireless-bluetooth {
+		uart2m0_gpios: uart2m0-gpios {
+			rockchip,pins = <3 RK_PA2 RK_FUNC_GPIO &pcfg_pull_none>;
+		};
+	};
+};
diff --git a/kernel/arch/arm64/boot/dts/rockchip/rk3528-demo4-ddr4-v10.dts b/kernel/arch/arm64/boot/dts/rockchip/rk3528-demo4-ddr4-v10.dts
new file mode 100644
index 0000000..189753c
--- /dev/null
+++ b/kernel/arch/arm64/boot/dts/rockchip/rk3528-demo4-ddr4-v10.dts
@@ -0,0 +1,32 @@
+// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
+/*
+ * Copyright (c) 2022 Rockchip Electronics Co., Ltd.
+ *
+ */
+
+#include "rk3528-demo4-ddr4-v10.dtsi"
+#include "rk3528-android.dtsi"
+
+
+/{
+	firmware {
+		android {
+			compatible = "android,firmware";
+			boot_devices = "ffbf0000.mmc";
+			vbmeta {
+				compatible = "android,vbmeta";
+				parts = "vbmeta,boot,system,vendor,dtbo";
+			};
+			fstab {
+				compatible = "android,fstab";
+				vendor {
+					compatible = "android,vendor";
+					dev = "/dev/block/by-name/vendor";
+					type = "ext4";
+					mnt_flags = "ro,barrier=1,inode_readahead_blks=8";
+					fsmgr_flags = "wait,avb";
+				};
+			};
+		};
+	};
+};
diff --git a/kernel/arch/arm64/boot/dts/rockchip/rk3528-demo4-ddr4-v10.dtsi b/kernel/arch/arm64/boot/dts/rockchip/rk3528-demo4-ddr4-v10.dtsi
new file mode 100644
index 0000000..c2af2c2
--- /dev/null
+++ b/kernel/arch/arm64/boot/dts/rockchip/rk3528-demo4-ddr4-v10.dtsi
@@ -0,0 +1,92 @@
+// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
+/*
+ * Copyright (c) 2022 Rockchip Electronics Co., Ltd.
+ *
+ */
+
+/dts-v1/;
+
+#include "rk3528.dtsi"
+#include "rk3528-demo.dtsi"
+
+/ {
+	model = "Rockchip RK3528 DEMO4 DDR4 V10 Board";
+	compatible = "rockchip,rk3528-demo4-ddr4-v10", "rockchip,rk3528";
+
+	sdio_pwrseq: sdio-pwrseq {
+		compatible = "mmc-pwrseq-simple";
+		pinctrl-names = "default";
+		pinctrl-0 = <&wifi_enable_h &wifi_reset>;
+		reset-gpios = <&gpio3 RK_PB2 GPIO_ACTIVE_LOW>;
+	};
+
+	wireless_bluetooth: wireless-bluetooth {
+		compatible = "bluetooth-platdata";
+		//wifi-bt-power-toggle;
+		uart_rts_gpios = <&gpio3 RK_PA2 GPIO_ACTIVE_LOW>;
+		pinctrl-names = "default", "rts_gpio";
+		pinctrl-0 = <&uart2m0_rtsn>;
+		pinctrl-1 = <&uart2m0_gpios>;
+		BT,reset_gpio    = <&gpio3 RK_PC2 GPIO_ACTIVE_HIGH>;
+		BT,wake_host_irq = <&gpio3 RK_PC1 GPIO_ACTIVE_HIGH>;
+		status = "okay";
+	};
+
+	wireless_wlan: wireless-wlan {
+		compatible = "wlan-platdata";
+		rockchip,grf = <&grf>;
+		wifi_chip_type = "rtl8822cs";
+		pinctrl-names = "default";
+		pinctrl-0 = <&wifi_host_wake_irq>;
+		WIFI,host_wake_irq = <&gpio3 RK_PB3 GPIO_ACTIVE_HIGH>;
+		status = "okay";
+	};
+};
+
+&sdio1 {
+	max-frequency = <200000000>;
+	no-sd;
+	no-mmc;
+	supports-sdio;
+	bus-width = <4>;
+	disable-wp;
+	cap-sd-highspeed;
+	cap-sdio-irq;
+	keep-power-in-suspend;
+	non-removable;
+	mmc-pwrseq = <&sdio_pwrseq>;
+	pinctrl-names = "default";
+	pinctrl-0 = <&sdio1_bus4 &sdio1_cmd &sdio1_clk>;
+	sd-uhs-sdr104;
+	status = "okay";
+};
+
+&uart2 {
+	status = "okay";
+	pinctrl-names = "default";
+	pinctrl-0 = <&uart2m0_xfer &uart2m0_ctsn>;
+};
+
+&pinctrl {
+	sdio-pwrseq {
+		wifi_enable_h: wifi-enable-h {
+			rockchip,pins = <3 RK_PB2 RK_FUNC_GPIO &pcfg_pull_none>;
+		};
+	};
+
+	wireless-wlan {
+		wifi_host_wake_irq: wifi-host-wake-irq {
+			rockchip,pins = <3 RK_PB3 RK_FUNC_GPIO &pcfg_pull_down>;
+		};
+
+		wifi_reset: wifi-reset {
+			rockchip,pins = <3 RK_PB4 RK_FUNC_GPIO &pcfg_output_high>;
+		};
+	};
+
+	wireless-bluetooth {
+		uart2m0_gpios: uart2m0-gpios {
+			rockchip,pins = <3 RK_PA2 RK_FUNC_GPIO &pcfg_pull_none>;
+		};
+	};
+};
diff --git a/kernel/arch/arm64/boot/dts/rockchip/rk3528-evb.dtsi b/kernel/arch/arm64/boot/dts/rockchip/rk3528-evb.dtsi
new file mode 100644
index 0000000..58c9d22
--- /dev/null
+++ b/kernel/arch/arm64/boot/dts/rockchip/rk3528-evb.dtsi
@@ -0,0 +1,672 @@
+// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
+/*
+ * Copyright (c) 2022 Rockchip Electronics Co., Ltd.
+ *
+ */
+
+#include "rk3528.dtsi"
+#include <dt-bindings/gpio/gpio.h>
+#include <dt-bindings/input/rk-input.h>
+#include <dt-bindings/pinctrl/rockchip.h>
+
+/ {
+	acodec_sound: acodec-sound {
+		status = "okay";
+		compatible = "simple-audio-card";
+		simple-audio-card,name = "rk3528-acodec";
+		simple-audio-card,format = "i2s";
+		simple-audio-card,mclk-fs = <256>;
+		simple-audio-card,cpu {
+			sound-dai = <&sai2>;
+		};
+		simple-audio-card,codec {
+			sound-dai = <&acodec>;
+		};
+	};
+
+	adc_keys: adc-keys {
+		status = "okay";
+		compatible = "adc-keys";
+		io-channels = <&saradc 1>;
+		io-channel-names = "buttons";
+		keyup-threshold-microvolt = <1800000>;
+		poll-interval = <100>;
+
+		vol-up-key {
+			label = "volume up";
+			linux,code = <KEY_VOLUMEUP>;
+			press-threshold-microvolt = <1750>;
+		};
+	};
+
+	bt_sco: bt-sco {
+		status = "disabled";
+		compatible = "delta,dfbmcs320";
+		#sound-dai-cells = <1>;
+	};
+
+	bt_sound: bt-sound {
+		status = "disabled";
+		compatible = "simple-audio-card";
+		simple-audio-card,format = "dsp_a";
+		simple-audio-card,bitclock-inversion = <0>;
+		simple-audio-card,mclk-fs = <256>;
+		simple-audio-card,name = "rockchip,bt";
+		simple-audio-card,cpu {
+			sound-dai = <&sai0>;
+		};
+		simple-audio-card,codec {
+			sound-dai = <&bt_sco 1>;
+		};
+	};
+
+	dc_12v: dc-12v {
+		compatible = "regulator-fixed";
+		regulator-name = "dc_12v";
+		regulator-always-on;
+		regulator-boot-on;
+		regulator-min-microvolt = <12000000>;
+		regulator-max-microvolt = <12000000>;
+	};
+
+	es7243_sound: es7243-sound {
+		status = "disabled";
+		compatible = "simple-audio-card";
+		simple-audio-card,name = "rockchip,es7243";
+		simple-audio-card,format = "i2s";
+		simple-audio-card,mclk-fs = <256>;
+
+		simple-audio-card,cpu {
+			sound-dai = <&sai1>;
+		};
+		simple-audio-card,codec {
+			sound-dai = <&es7243e>;
+		};
+	};
+
+	hdmi_sound: hdmi-sound {
+		compatible = "rockchip,hdmi";
+		rockchip,mclk-fs = <128>;
+		rockchip,card-name = "rockchip,hdmi";
+		rockchip,cpu = <&sai3>;
+		rockchip,codec = <&hdmi>;
+		rockchip,jack-det;
+	};
+
+	pdmics: dummy-codec {
+		status = "disabled";
+		compatible = "rockchip,dummy-codec";
+		#sound-dai-cells = <0>;
+	};
+
+	pdm_mic_array: pdm-mic-array {
+		status = "disabled";
+		compatible = "simple-audio-card";
+		simple-audio-card,name = "rockchip,pdm-mic-array";
+		simple-audio-card,cpu {
+			sound-dai = <&pdm>;
+		};
+		simple-audio-card,codec {
+			sound-dai = <&pdmics>;
+		};
+	};
+
+	spdif-sound {
+		status = "okay";
+		compatible = "simple-audio-card";
+		simple-audio-card,name = "ROCKCHIP,SPDIF";
+		simple-audio-card,cpu {
+			sound-dai = <&spdif_8ch>;
+		};
+		simple-audio-card,codec {
+			sound-dai = <&spdif_out>;
+		};
+	};
+
+	spdif_out: spdif-out {
+		status = "okay";
+		compatible = "linux,spdif-dit";
+		#sound-dai-cells = <0>;
+	};
+
+	vcc5v0_sys: vcc5v0-sys {
+		compatible = "regulator-fixed";
+		regulator-name = "vcc5v0_sys";
+		regulator-always-on;
+		regulator-boot-on;
+		regulator-min-microvolt = <5000000>;
+		regulator-max-microvolt = <5000000>;
+		vin-supply = <&dc_12v>;
+	};
+
+	vcc5v0_host: vcc5v0-host-regulator {
+		compatible = "regulator-fixed";
+		regulator-name = "vcc5v0_host";
+		regulator-boot-on;
+		regulator-always-on;
+		regulator-min-microvolt = <5000000>;
+		regulator-max-microvolt = <5000000>;
+		enable-active-high;
+		gpio = <&gpio4 RK_PB5 GPIO_ACTIVE_HIGH>;
+		vin-supply = <&vcc5v0_sys>;
+		pinctrl-names = "default";
+		pinctrl-0 = <&vcc5v0_host_en>;
+	};
+
+	vcc5v0_otg: vcc5v0-otg-regulator {
+		compatible = "regulator-fixed";
+		regulator-name = "vcc5v0_otg";
+		regulator-min-microvolt = <5000000>;
+		regulator-max-microvolt = <5000000>;
+		enable-active-high;
+		gpio = <&gpio4 RK_PC1 GPIO_ACTIVE_HIGH>;
+		vin-supply = <&vcc5v0_sys>;
+		pinctrl-names = "default";
+		pinctrl-0 = <&vcc5v0_otg_en>;
+	};
+
+	/omit-if-no-ref/
+	vccio_sd: vccio-sd {
+		compatible = "regulator-gpio";
+		regulator-name = "vccio_sd";
+		regulator-min-microvolt = <1800000>;
+		regulator-max-microvolt = <3300000>;
+		gpios = <&gpio4 RK_PB6 GPIO_ACTIVE_HIGH>;
+		vin-supply = <&vcc5v0_sys>;
+		states = <1800000 0x0
+			  3300000 0x1>;
+	};
+
+	vdd_logic: vdd-logic {
+		compatible = "pwm-regulator";
+		pwms = <&pwm2 0 5000 1>;
+		regulator-name = "vdd_logic";
+		regulator-min-microvolt = <705000>;
+		regulator-max-microvolt = <1006000>;
+		regulator-init-microvolt = <900000>;
+		regulator-always-on;
+		regulator-boot-on;
+		regulator-settling-time-up-us = <250>;
+		pwm-supply = <&vcc5v0_sys>;
+		status = "okay";
+	};
+
+	vdd_cpu: vdd-cpu {
+		compatible = "pwm-regulator";
+		pwms = <&pwm1 0 5000 1>;
+		regulator-name = "vdd_cpu";
+		regulator-min-microvolt = <746000>;
+		regulator-max-microvolt = <1201000>;
+		regulator-init-microvolt = <953000>;
+		regulator-always-on;
+		regulator-boot-on;
+		regulator-settling-time-up-us = <250>;
+		pwm-supply = <&vcc5v0_sys>;
+		status = "okay";
+	};
+
+	vdd_gpu: vdd-gpu {
+		compatible = "pwm-regulator";
+		pwms = <&pwm0 0 5000 1>;
+		regulator-name = "vdd_gpu";
+		regulator-min-microvolt = <705000>;
+		regulator-max-microvolt = <1148000>;
+		regulator-init-microvolt = <900000>;
+		regulator-always-on;
+		regulator-boot-on;
+		regulator-settling-time-up-us = <250>;
+		pwm-supply = <&vcc5v0_sys>;
+		status = "okay";
+	};
+
+	vdd_0v9_s3: vdd-0v9-s3 {
+		compatible = "regulator-fixed";
+		regulator-name = "vdd_0v9_s3";
+		regulator-always-on;
+		regulator-boot-on;
+		regulator-min-microvolt = <900000>;
+		regulator-max-microvolt = <900000>;
+		vin-supply = <&vcc5v0_sys>;
+	};
+
+	vdd_1v8_s3: vdd-1v8-s3 {
+		compatible = "regulator-fixed";
+		regulator-name = "vdd_1v8_s3";
+		regulator-always-on;
+		regulator-boot-on;
+		regulator-min-microvolt = <1800000>;
+		regulator-max-microvolt = <1800000>;
+		vin-supply = <&vcc5v0_sys>;
+	};
+
+	vcc_3v3_s3: vcc-3v3-s3 {
+		compatible = "regulator-fixed";
+		regulator-name = "vcc_3v3_s3";
+		regulator-always-on;
+		regulator-boot-on;
+		regulator-min-microvolt = <3300000>;
+		regulator-max-microvolt = <3300000>;
+		vin-supply = <&vcc5v0_sys>;
+	};
+
+	/omit-if-no-ref/
+	vcc_sd: vcc-sd {
+		compatible = "regulator-fixed";
+		gpio = <&gpio4 RK_PA1 GPIO_ACTIVE_LOW>;
+		regulator-name = "vcc_sd";
+		regulator-boot-on;
+		regulator-min-microvolt = <3300000>;
+		regulator-max-microvolt = <3300000>;
+		vin-supply = <&vcc_3v3_s3>;
+	};
+
+	vcc_ddr_s3: vcc-ddr-s3 {
+		compatible = "regulator-fixed";
+		regulator-name = "vcc_ddr_s3";
+		regulator-always-on;
+		regulator-boot-on;
+		regulator-min-microvolt = <1200000>;
+		regulator-max-microvolt = <1200000>;
+		vin-supply = <&vcc5v0_sys>;
+	};
+};
+
+&acodec {
+	pa-ctl-gpios = <&gpio0 RK_PA0 GPIO_ACTIVE_HIGH>;
+	status = "okay";
+};
+
+&avsd {
+	status = "okay";
+};
+
+&combphy_pu {
+	status = "okay";
+};
+
+&cpu0 {
+	cpu-supply = <&vdd_cpu>;
+};
+
+&crypto {
+	status = "okay";
+};
+
+&dfi {
+	status = "okay";
+};
+
+&display_subsystem {
+	status = "okay";
+};
+
+&dmc {
+	center-supply = <&vdd_logic>;
+	status = "okay";
+};
+
+&gmac0 {
+	status = "okay";
+};
+
+&gpu {
+	mali-supply = <&vdd_gpu>;
+	status = "okay";
+};
+
+&gpu_bus {
+	bus-supply = <&vdd_logic>;
+	status = "okay";
+};
+
+&hdmi {
+	status = "okay";
+};
+
+&hdmi_in_vp0 {
+	status = "okay";
+};
+
+&hdmiphy {
+	status = "okay";
+};
+
+&i2c6 {
+	status = "disabled";
+	es7243e: es7243e@10 {
+		status = "okay";
+		#sound-dai-cells = <0>;
+		compatible = "ES7243E_MicArray_0";
+		reg = <0x10>;
+	};
+
+	es7243e_11: es7243e@11 {
+		status = "okay";
+		#sound-dai-cells = <0>;
+		compatible = "ES7243E_MicArray_1";
+		reg = <0x11>;
+	};
+
+	es7243e_12: es7243e@12 {
+		status = "okay";
+		#sound-dai-cells = <0>;
+		compatible = "ES7243E_MicArray_2";
+		reg = <0x12>;
+	};
+};
+
+&iep {
+	status = "okay";
+};
+
+&iep_mmu {
+	status = "okay";
+};
+
+&jpegd {
+	status = "okay";
+};
+
+&jpegd_mmu {
+	status = "okay";
+};
+
+&mpp_srv {
+	status = "okay";
+};
+
+&pinctrl {
+	usb {
+		vcc5v0_host_en: vcc5v0-host-en {
+			rockchip,pins = <4 RK_PB5 RK_FUNC_GPIO &pcfg_pull_none>;
+		};
+
+		vcc5v0_otg_en: vcc5v0-otg-en {
+			rockchip,pins = <4 RK_PC1 RK_FUNC_GPIO &pcfg_pull_none>;
+		};
+	};
+};
+
+&pwm0 {
+	status = "okay";
+};
+
+&pwm1 {
+	status = "okay";
+};
+
+&pwm2 {
+	status = "okay";
+};
+
+&pwm3 {
+	compatible = "rockchip,remotectl-pwm";
+	pinctrl-names = "default";
+	pinctrl-0 = <&pwm3m0_pins>;
+	remote_pwm_id = <3>;
+	handle_cpu_id = <1>;
+	remote_support_psci = <0>;
+	status = "okay";
+
+	ir_key1 {
+		rockchip,usercode = <0x4040>;
+		rockchip,key_table =
+			<0xf2	KEY_REPLY>,
+			<0xba	KEY_BACK>,
+			<0xf4	KEY_UP>,
+			<0xf1	KEY_DOWN>,
+			<0xef	KEY_LEFT>,
+			<0xee	KEY_RIGHT>,
+			<0xbd	KEY_HOME>,
+			<0xea	KEY_VOLUMEUP>,
+			<0xe3	KEY_VOLUMEDOWN>,
+			<0xe2	KEY_SEARCH>,
+			<0xb2	KEY_POWER>,
+			<0xbc	KEY_MUTE>,
+			<0xec	KEY_MENU>,
+			<0xbf	0x190>,
+			<0xe0	0x191>,
+			<0xe1	0x192>,
+			<0xe9	183>,
+			<0xe6	248>,
+			<0xe8	185>,
+			<0xe7	186>,
+			<0xf0	388>,
+			<0xbe	0x175>;
+	};
+
+	ir_key2 {
+		rockchip,usercode = <0xff00>;
+		rockchip,key_table =
+			<0xf9	KEY_HOME>,
+			<0xbf	KEY_BACK>,
+			<0xfb	KEY_MENU>,
+			<0xaa	KEY_REPLY>,
+			<0xb9	KEY_UP>,
+			<0xe9	KEY_DOWN>,
+			<0xb8	KEY_LEFT>,
+			<0xea	KEY_RIGHT>,
+			<0xeb	KEY_VOLUMEDOWN>,
+			<0xef	KEY_VOLUMEUP>,
+			<0xf7	KEY_MUTE>,
+			<0xe7	KEY_POWER>,
+			<0xfc	KEY_POWER>,
+			<0xa9	KEY_VOLUMEDOWN>,
+			<0xa8	KEY_PLAYPAUSE>,
+			<0xe0	KEY_VOLUMEDOWN>,
+			<0xa5	KEY_VOLUMEDOWN>,
+			<0xab	183>,
+			<0xb7	388>,
+			<0xe8	388>,
+			<0xf8	184>,
+			<0xaf	185>,
+			<0xed	KEY_VOLUMEDOWN>,
+			<0xee	186>,
+			<0xb3	KEY_VOLUMEDOWN>,
+			<0xf1	KEY_VOLUMEDOWN>,
+			<0xf2	KEY_VOLUMEDOWN>,
+			<0xf3	KEY_SEARCH>,
+			<0xb4	KEY_VOLUMEDOWN>,
+			<0xa4	KEY_SETUP>,
+			<0xbe	KEY_SEARCH>;
+	};
+
+	ir_key3 {
+		rockchip,usercode = <0x1dcc>;
+		rockchip,key_table =
+			<0xee	KEY_REPLY>,
+			<0xf0	KEY_BACK>,
+			<0xf8	KEY_UP>,
+			<0xbb	KEY_DOWN>,
+			<0xef	KEY_LEFT>,
+			<0xed	KEY_RIGHT>,
+			<0xfc	KEY_HOME>,
+			<0xf1	KEY_VOLUMEUP>,
+			<0xfd	KEY_VOLUMEDOWN>,
+			<0xb7	KEY_SEARCH>,
+			<0xff	KEY_POWER>,
+			<0xf3	KEY_MUTE>,
+			<0xbf	KEY_MENU>,
+			<0xf9	0x191>,
+			<0xf5	0x192>,
+			<0xb3	388>,
+			<0xbe	KEY_1>,
+			<0xba	KEY_2>,
+			<0xb2	KEY_3>,
+			<0xbd	KEY_4>,
+			<0xf9	KEY_5>,
+			<0xb1	KEY_6>,
+			<0xfc	KEY_7>,
+			<0xf8	KEY_8>,
+			<0xb0	KEY_9>,
+			<0xb6	KEY_0>,
+			<0xb5	KEY_BACKSPACE>;
+	};
+};
+
+&rga2 {
+	status = "okay";
+};
+
+&rga2_mmu {
+	status = "okay";
+};
+
+&rkvdec {
+	status = "okay";
+};
+
+&rkvdec_mmu {
+	status = "okay";
+};
+
+&rkvenc {
+	status = "okay";
+};
+
+&rkvenc_mmu {
+	status = "okay";
+};
+
+&rockchip_suspend {
+	status = "okay";
+	rockchip,sleep-debug-en = <1>;
+	rockchip,virtual-poweroff = <1>;
+	rockchip,sleep-mode-config = <
+		(0
+		| RKPM_SLP_ARMPD
+		)
+	>;
+	rockchip,wakeup-config = <
+		(0
+		| RKPM_CPU0_WKUP_EN
+		| RKPM_GPIO_WKUP_EN
+		)
+	>;
+	rockchip,pwm-regulator-config = <
+		(0
+		| RKPM_PWM0_M0_REGULATOR_EN
+		| RKPM_PWM1_M0_REGULATOR_EN
+		)
+	>;
+};
+
+&sai0 {
+	pinctrl-0 = <&i2s0m1_lrck &i2s0m1_sclk &i2s0m1_sdi &i2s0m1_sdo>;
+	status = "disabled";
+};
+
+&sai2 {
+	status = "okay";
+};
+
+&sai3 {
+	status = "okay";
+};
+
+&saradc {
+	status = "okay";
+	vref-supply = <&vdd_1v8_s3>;
+};
+
+&sdhci {
+	bus-width = <8>;
+	supports-emmc;
+	non-removable;
+	mmc-hs400-1_8v;
+	mmc-hs400-enhanced-strobe;
+	max-frequency = <200000000>;
+	fixed-emmc-driver-type = <4>;
+	status = "okay";
+};
+
+&sdmmc {
+	bus-width = <4>;
+	cap-mmc-highspeed;
+	cap-sd-highspeed;
+	disable-wp;
+	max-frequency = <150000000>;
+	pinctrl-names = "default";
+	pinctrl-0 = <&sdmmc_clk &sdmmc_cmd &sdmmc_det &sdmmc_bus4>;
+	rockchip,default-sample-phase = <90>;
+	supports-sd;
+	sd-uhs-sdr12;
+	sd-uhs-sdr25;
+	sd-uhs-sdr50;
+	sd-uhs-sdr104;
+	vqmmc-supply = <&vccio_sd>;
+	vmmc-supply = <&vcc_sd>;
+	status = "disabled";
+};
+
+&sfc {
+	status = "okay";
+};
+
+&spdif_8ch {
+	status = "okay";
+};
+
+&tsadc {
+	status = "okay";
+};
+
+&tve {
+	status = "okay";
+};
+
+&tve_in_vp1 {
+	status = "okay";
+};
+
+&u2phy_host {
+	phy-supply = <&vcc5v0_host>;
+	status = "okay";
+};
+
+&u2phy_otg {
+	vbus-supply = <&vcc5v0_otg>;
+	status = "okay";
+};
+
+&usb2phy {
+	status = "okay";
+};
+
+&usb_host0_ehci {
+	status = "okay";
+};
+
+&usb_host0_ohci {
+	status = "okay";
+};
+
+&usbdrd30 {
+	status = "okay";
+};
+
+&usbdrd_dwc3 {
+	dr_mode = "otg";
+	extcon = <&usb2phy>;
+	status = "okay";
+};
+
+&vdpp {
+	status = "okay";
+};
+
+&vdpu {
+	status = "okay";
+};
+
+&vdpu_mmu {
+	status = "okay";
+};
+
+&vop {
+	status = "okay";
+};
+
+&vop_mmu {
+	status = "okay";
+};
diff --git a/kernel/arch/arm64/boot/dts/rockchip/rk3528-evb1-ddr4-v10-linux.dts b/kernel/arch/arm64/boot/dts/rockchip/rk3528-evb1-ddr4-v10-linux.dts
new file mode 100644
index 0000000..28a1711
--- /dev/null
+++ b/kernel/arch/arm64/boot/dts/rockchip/rk3528-evb1-ddr4-v10-linux.dts
@@ -0,0 +1,8 @@
+// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
+/*
+ * Copyright (c) 2022 Rockchip Electronics Co., Ltd.
+ *
+ */
+
+#include "rk3528-evb1-ddr4-v10.dtsi"
+#include "rk3528-linux.dtsi"
diff --git a/kernel/arch/arm64/boot/dts/rockchip/rk3528-evb1-ddr4-v10.dts b/kernel/arch/arm64/boot/dts/rockchip/rk3528-evb1-ddr4-v10.dts
new file mode 100644
index 0000000..ea05dde
--- /dev/null
+++ b/kernel/arch/arm64/boot/dts/rockchip/rk3528-evb1-ddr4-v10.dts
@@ -0,0 +1,35 @@
+// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
+/*
+ * Copyright (c) 2022 Rockchip Electronics Co., Ltd.
+ *
+ */
+
+#include "rk3528-evb1-ddr4-v10.dtsi"
+#include "rk3528-android.dtsi"
+
+/{
+	firmware {
+		android {
+			compatible = "android,firmware";
+			boot_devices = "ffbf0000.mmc";
+			vbmeta {
+				compatible = "android,vbmeta";
+				parts = "vbmeta,boot,system,vendor,dtbo";
+			};
+			fstab {
+				compatible = "android,fstab";
+				vendor {
+					compatible = "android,vendor";
+					dev = "/dev/block/by-name/vendor";
+					type = "ext4";
+					mnt_flags = "ro,barrier=1,inode_readahead_blks=8";
+					fsmgr_flags = "wait,avb";
+				};
+			};
+		};
+	};
+};
+
+&sdmmc {
+	status = "okay";
+};
diff --git a/kernel/arch/arm64/boot/dts/rockchip/rk3528-evb1-ddr4-v10.dtsi b/kernel/arch/arm64/boot/dts/rockchip/rk3528-evb1-ddr4-v10.dtsi
new file mode 100644
index 0000000..822d614
--- /dev/null
+++ b/kernel/arch/arm64/boot/dts/rockchip/rk3528-evb1-ddr4-v10.dtsi
@@ -0,0 +1,137 @@
+// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
+/*
+ * Copyright (c) 2022 Rockchip Electronics Co., Ltd.
+ *
+ */
+
+/dts-v1/;
+
+#include "rk3528.dtsi"
+#include "rk3528-evb.dtsi"
+
+/ {
+	model = "Rockchip RK3528 EVB1 DDR4 V10 Board";
+	compatible = "rockchip,rk3528-evb1-ddr4-v10", "rockchip,rk3528";
+
+	sdio_pwrseq: sdio-pwrseq {
+		compatible = "mmc-pwrseq-simple";
+		pinctrl-names = "default";
+		pinctrl-0 = <&wifi_enable_h &clkm1_32k_out>;
+		reset-gpios = <&gpio1 RK_PA6 GPIO_ACTIVE_LOW>;
+	};
+
+	wireless_bluetooth: wireless-bluetooth {
+		compatible = "bluetooth-platdata";
+		//wifi-bt-power-toggle;
+		uart_rts_gpios = <&gpio1 RK_PB2 GPIO_ACTIVE_LOW>;
+		pinctrl-names = "default", "rts_gpio";
+		pinctrl-0 = <&uart2m1_rtsn>;
+		pinctrl-1 = <&uart2m1_gpios>;
+		BT,reset_gpio    = <&gpio1 RK_PC1 GPIO_ACTIVE_HIGH>;
+		BT,wake_gpio     = <&gpio1 RK_PB4 GPIO_ACTIVE_HIGH>;
+		BT,wake_host_irq = <&gpio1 RK_PC2 GPIO_ACTIVE_HIGH>;
+		status = "okay";
+	};
+
+	wireless_wlan: wireless-wlan {
+		compatible = "wlan-platdata";
+		rockchip,grf = <&grf>;
+		wifi_chip_type = "ap6275s";
+		pinctrl-names = "default";
+		pinctrl-0 = <&wifi_host_wake_irq>;
+		WIFI,host_wake_irq = <&gpio1 RK_PA7 GPIO_ACTIVE_HIGH>;
+		status = "okay";
+	};
+
+};
+
+&es7243_sound {
+	status = "disabled";
+};
+
+&gmac1 {
+	/* Use rgmii-rxid mode to disable rx delay inside Soc */
+	phy-mode = "rgmii-rxid";
+	clock_in_out = "output";
+
+	snps,reset-gpio = <&gpio4 RK_PC2 GPIO_ACTIVE_LOW>;
+	snps,reset-active-low;
+	/* Reset time is 20ms, 100ms for rtl8211f */
+	snps,reset-delays-us = <0 20000 100000>;
+
+	tx_delay = <0x30>;
+	/* rx_delay = <0x3f>; */
+
+	pinctrl-names = "default";
+	pinctrl-0 = <&rgmii_miim
+		     &rgmii_tx_bus2
+		     &rgmii_rx_bus2
+		     &rgmii_rgmii_clk
+		     &rgmii_rgmii_bus>;
+
+	phy-handle = <&rgmii_phy>;
+	status = "okay";
+};
+
+&i2c6 {
+	status = "okay";
+};
+
+&mdio1 {
+	rgmii_phy: phy@1 {
+		compatible = "ethernet-phy-ieee802.3-c22";
+		reg = <0x1>;
+	};
+};
+
+&sai1 {
+	status = "okay";
+};
+
+&sdio0 {
+	max-frequency = <200000000>;
+	no-sd;
+	no-mmc;
+	supports-sdio;
+	bus-width = <4>;
+	disable-wp;
+	cap-sd-highspeed;
+	cap-sdio-irq;
+	keep-power-in-suspend;
+	non-removable;
+	mmc-pwrseq = <&sdio_pwrseq>;
+	pinctrl-names = "default";
+	pinctrl-0 = <&sdio0_bus4 &sdio0_cmd &sdio0_clk>;
+	sd-uhs-sdr104;
+	status = "okay";
+};
+
+&uart2 {
+	status = "okay";
+	pinctrl-names = "default";
+	pinctrl-0 = <&uart2m1_xfer &uart2m1_ctsn>;
+};
+
+&pinctrl {
+	sdio-pwrseq {
+		wifi_enable_h: wifi-enable-h {
+			rockchip,pins = <1 RK_PA6 RK_FUNC_GPIO &pcfg_pull_none>;
+		};
+
+		wifi_32k: wifi-32k {
+			rockchip,pins = <1 RK_PC3 1 &pcfg_pull_none>;
+		};
+	};
+
+	wireless-wlan {
+		wifi_host_wake_irq: wifi-host-wake-irq {
+			rockchip,pins = <1 RK_PA7 RK_FUNC_GPIO &pcfg_pull_down>;
+		};
+	};
+
+	wireless-bluetooth {
+		uart2m1_gpios: uart2m1-gpios {
+			rockchip,pins = <1 RK_PB2 RK_FUNC_GPIO &pcfg_pull_none>;
+		};
+	};
+};
diff --git a/kernel/arch/arm64/boot/dts/rockchip/rk3528-evb2-ddr3-v10.dts b/kernel/arch/arm64/boot/dts/rockchip/rk3528-evb2-ddr3-v10.dts
new file mode 100644
index 0000000..d94fbf1
--- /dev/null
+++ b/kernel/arch/arm64/boot/dts/rockchip/rk3528-evb2-ddr3-v10.dts
@@ -0,0 +1,31 @@
+// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
+/*
+ * Copyright (c) 2022 Rockchip Electronics Co., Ltd.
+ *
+ */
+
+#include "rk3528-evb2-ddr3-v10.dtsi"
+#include "rk3528-android.dtsi"
+
+/{
+	firmware {
+		android {
+			compatible = "android,firmware";
+			boot_devices = "ffbf0000.mmc";
+			vbmeta {
+				compatible = "android,vbmeta";
+				parts = "vbmeta,boot,system,vendor,dtbo";
+			};
+			fstab {
+				compatible = "android,fstab";
+				vendor {
+					compatible = "android,vendor";
+					dev = "/dev/block/by-name/vendor";
+					type = "ext4";
+					mnt_flags = "ro,barrier=1,inode_readahead_blks=8";
+					fsmgr_flags = "wait,avb";
+				};
+			};
+		};
+	};
+};
diff --git a/kernel/arch/arm64/boot/dts/rockchip/rk3528-evb2-ddr3-v10.dtsi b/kernel/arch/arm64/boot/dts/rockchip/rk3528-evb2-ddr3-v10.dtsi
new file mode 100644
index 0000000..2cd94a6
--- /dev/null
+++ b/kernel/arch/arm64/boot/dts/rockchip/rk3528-evb2-ddr3-v10.dtsi
@@ -0,0 +1,138 @@
+// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
+/*
+ * Copyright (c) 2022 Rockchip Electronics Co., Ltd.
+ *
+ */
+
+/dts-v1/;
+
+#include "rk3528.dtsi"
+#include "rk3528-evb.dtsi"
+
+/ {
+	model = "Rockchip RK3528 EVB2 DDR3 V10 Board";
+	compatible = "rockchip,rk3528-evb2-ddr3-v10", "rockchip,rk3528";
+
+	pcie20_usb30_avdd0v9: pcie20-usb30-avdd0v9 {
+		compatible = "regulator-fixed";
+		regulator-name = "pcie20_usb30-avdd0v9";
+		regulator-boot-on;
+		regulator-always-on;
+		regulator-min-microvolt = <900000>;
+		regulator-max-microvolt = <900000>;
+		vin-supply = <&vdd_0v9_s3>;
+	};
+
+	pcie20_usb30_avdd1v8: pcie20-usb30-avdd1v8 {
+		compatible = "regulator-fixed";
+		regulator-name = "pcie20_usb30_avdd1v8";
+		regulator-boot-on;
+		regulator-always-on;
+		regulator-min-microvolt = <1800000>;
+		regulator-max-microvolt = <1800000>;
+		vin-supply = <&vdd_1v8_s3>;
+	};
+
+	sdio_pwrseq: sdio-pwrseq {
+		compatible = "mmc-pwrseq-simple";
+		pinctrl-names = "default";
+		pinctrl-0 = <&wifi_enable_h &clkm1_32k_out>;
+		reset-gpios = <&gpio1 RK_PA6 GPIO_ACTIVE_LOW>;
+	};
+
+	vcc3v3_pcie20: vcc3v3-pcie20 {
+		compatible = "regulator-fixed";
+		regulator-name = "vcc3v3_pcie20";
+		regulator-min-microvolt = <3300000>;
+		regulator-max-microvolt = <3300000>;
+		enable-active-high;
+		gpio = <&gpio4 RK_PB2 GPIO_ACTIVE_HIGH>;
+		startup-delay-us = <5000>;
+		vin-supply = <&dc_12v>;
+	};
+
+	wireless_bluetooth: wireless-bluetooth {
+		compatible = "bluetooth-platdata";
+		//wifi-bt-power-toggle;
+		uart_rts_gpios = <&gpio1 RK_PB2 GPIO_ACTIVE_LOW>;
+		pinctrl-names = "default", "rts_gpio";
+		pinctrl-0 = <&uart2m1_rtsn>;
+		pinctrl-1 = <&uart2m1_gpios>;
+		BT,reset_gpio    = <&gpio1 RK_PC1 GPIO_ACTIVE_HIGH>;
+		BT,wake_gpio     = <&gpio1 RK_PB4 GPIO_ACTIVE_HIGH>;
+		BT,wake_host_irq = <&gpio1 RK_PC2 GPIO_ACTIVE_HIGH>;
+		status = "okay";
+	};
+
+	wireless_wlan: wireless-wlan {
+		compatible = "wlan-platdata";
+		rockchip,grf = <&grf>;
+		wifi_chip_type = "ap6275s";
+		pinctrl-names = "default";
+		pinctrl-0 = <&wifi_host_wake_irq>;
+		WIFI,host_wake_irq = <&gpio1 RK_PA7 GPIO_ACTIVE_HIGH>;
+		status = "okay";
+	};
+};
+
+&pcie2x1 {
+	reset-gpios = <&gpio3 RK_PB0 GPIO_ACTIVE_HIGH>;
+	vpcie3v3-supply = <&vcc3v3_pcie20>;
+	status = "okay";
+};
+
+&sdio0 {
+	max-frequency = <200000000>;
+	no-sd;
+	no-mmc;
+	supports-sdio;
+	bus-width = <4>;
+	disable-wp;
+	cap-sd-highspeed;
+	cap-sdio-irq;
+	keep-power-in-suspend;
+	non-removable;
+	mmc-pwrseq = <&sdio_pwrseq>;
+	pinctrl-names = "default";
+	pinctrl-0 = <&sdio0_bus4 &sdio0_cmd &sdio0_clk>;
+	sd-uhs-sdr104;
+	status = "okay";
+};
+
+&uart2 {
+	status = "okay";
+	pinctrl-names = "default";
+	pinctrl-0 = <&uart2m1_xfer &uart2m1_ctsn>;
+};
+
+&usbdrd_dwc3 {
+	phys = <&u2phy_otg>;
+	phy-names = "usb2-phy";
+	maximum-speed = "high-speed";
+	snps,dis_u2_susphy_quirk;
+	snps,usb2-lpm-disable;
+};
+
+&pinctrl {
+	sdio-pwrseq {
+		wifi_enable_h: wifi-enable-h {
+			rockchip,pins = <1 RK_PA6 RK_FUNC_GPIO &pcfg_pull_none>;
+		};
+
+		wifi_32k: wifi-32k {
+			rockchip,pins = <1 RK_PC3 1 &pcfg_pull_none>;
+		};
+	};
+
+	wireless-wlan {
+		wifi_host_wake_irq: wifi-host-wake-irq {
+			rockchip,pins = <1 RK_PA7 RK_FUNC_GPIO &pcfg_pull_down>;
+		};
+	};
+
+	wireless-bluetooth {
+		uart2m1_gpios: uart2m1-gpios {
+			rockchip,pins = <1 RK_PB2 RK_FUNC_GPIO &pcfg_pull_none>;
+		};
+	};
+};
diff --git a/kernel/arch/arm64/boot/dts/rockchip/rk3528-evb3-lp4x-v10.dts b/kernel/arch/arm64/boot/dts/rockchip/rk3528-evb3-lp4x-v10.dts
new file mode 100644
index 0000000..8bfbdb5
--- /dev/null
+++ b/kernel/arch/arm64/boot/dts/rockchip/rk3528-evb3-lp4x-v10.dts
@@ -0,0 +1,50 @@
+// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
+/*
+ * Copyright (c) 2022 Rockchip Electronics Co., Ltd.
+ *
+ */
+
+#include "rk3528-evb3-lp4x-v10.dtsi"
+#include "rk3528-android.dtsi"
+
+/{
+	firmware {
+		android {
+			compatible = "android,firmware";
+			boot_devices = "ffbf0000.mmc";
+			vbmeta {
+				compatible = "android,vbmeta";
+				parts = "vbmeta,boot,system,vendor,dtbo";
+			};
+			fstab {
+				compatible = "android,fstab";
+				vendor {
+					compatible = "android,vendor";
+					dev = "/dev/block/by-name/vendor";
+					type = "ext4";
+					mnt_flags = "ro,barrier=1,inode_readahead_blks=8";
+					fsmgr_flags = "wait,avb";
+				};
+			};
+		};
+	};
+};
+
+&pdm {
+	status = "okay";
+	pinctrl-0 = <&pdm_clk1
+		     &pdm_sdi0
+		     &pdm_sdi2>;
+};
+
+&pdmics {
+	status = "okay";
+};
+
+&pdm_mic_array {
+	status = "okay";
+};
+
+&sdmmc {
+	status = "okay";
+};
diff --git a/kernel/arch/arm64/boot/dts/rockchip/rk3528-evb3-lp4x-v10.dtsi b/kernel/arch/arm64/boot/dts/rockchip/rk3528-evb3-lp4x-v10.dtsi
new file mode 100644
index 0000000..a427da4
--- /dev/null
+++ b/kernel/arch/arm64/boot/dts/rockchip/rk3528-evb3-lp4x-v10.dtsi
@@ -0,0 +1,132 @@
+// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
+/*
+ * Copyright (c) 2022 Rockchip Electronics Co., Ltd.
+ *
+ */
+
+/dts-v1/;
+
+#include "rk3528.dtsi"
+#include "rk3528-evb.dtsi"
+
+/ {
+	model = "Rockchip RK3528 EVB3 LP4X V10 Board";
+	compatible = "rockchip,rk3528-evb3-lp4x-v10", "rockchip,rk3528";
+
+	vcc5v0_sys_s0: vcc5v0-sys-s0 {
+		compatible = "regulator-fixed";
+		regulator-name = "vcc5v0_sys_s0";
+		regulator-always-on;
+		regulator-boot-on;
+		regulator-min-microvolt = <5000000>;
+		regulator-max-microvolt = <5000000>;
+		vin-supply = <&vcc5v0_sys>;
+	};
+
+	vcc_1v8_s0: vcc-1v8-s0 {
+		compatible = "regulator-fixed";
+		regulator-name = "vcc_1v8_s0";
+		regulator-always-on;
+		regulator-boot-on;
+		regulator-min-microvolt = <1800000>;
+		regulator-max-microvolt = <1800000>;
+		vin-supply = <&vcc5v0_sys_s0>;
+	};
+
+	vcc_3v3_s0: vcc-3v3-s0 {
+		compatible = "regulator-fixed";
+		regulator-name = "vcc_3v3";
+		regulator-always-on;
+		regulator-boot-on;
+		regulator-min-microvolt = <3300000>;
+		regulator-max-microvolt = <3300000>;
+		vin-supply = <&vcc5v0_sys_s0>;
+	};
+
+	vdd_0v9_s0: vdd-0v9-s0 {
+		compatible = "regulator-fixed";
+		regulator-name = "vdd_0v9_s0";
+		regulator-always-on;
+		regulator-boot-on;
+		regulator-min-microvolt = <900000>;
+		regulator-max-microvolt = <900000>;
+		vin-supply = <&vcc5v0_sys_s0>;
+	};
+
+	wireless_bluetooth: wireless-bluetooth {
+		compatible = "bluetooth-platdata";
+		uart_rts_gpios = <&gpio3 RK_PA2 GPIO_ACTIVE_LOW>;
+		pinctrl-names = "default", "rts_gpio";
+		pinctrl-0 = <&uart2m0_rtsn>;
+		pinctrl-1 = <&uart2m0_gpios>;
+		BT,reset_gpio    = <&gpio3 RK_PC2 GPIO_ACTIVE_HIGH>;
+		BT,wake_gpio     = <&gpio3 RK_PB4 GPIO_ACTIVE_HIGH>;
+		BT,wake_host_irq = <&gpio3 RK_PC1 GPIO_ACTIVE_HIGH>;
+		status = "okay";
+	};
+
+	wireless_wlan: wireless-wlan {
+		compatible = "wlan-platdata";
+		rockchip,grf = <&grf>;
+		wifi_chip_type = "ap6275p";
+		pinctrl-names = "default";
+		pinctrl-0 = <&wifi_enable &wifi_host_wake_irq &clkm0_32k_out>;
+		WIFI,reset_gpio = <&gpio3 RK_PB2 GPIO_ACTIVE_HIGH>;
+		WIFI,host_wake_irq = <&gpio3 RK_PB3 GPIO_ACTIVE_HIGH>;
+		status = "okay";
+	};
+};
+
+&pcie2x1 {
+	reset-gpios = <&gpio3 RK_PB0 GPIO_ACTIVE_HIGH>;
+	pinctrl-names = "default";
+	pinctrl-0 = <&wifi_perst>;
+	rockchip,skip-scan-in-resume;
+	status = "okay";
+};
+
+&sai0 {
+	pinctrl-0 = <&i2s0m0_lrck &i2s0m0_sclk &i2s0m0_sdi &i2s0m0_sdo>;
+	status = "disabled";
+};
+
+&uart2 {
+	status = "okay";
+	pinctrl-names = "default";
+	pinctrl-0 = <&uart2m0_xfer &uart2m0_ctsn>;
+};
+
+&usbdrd_dwc3 {
+	phys = <&u2phy_otg>;
+	phy-names = "usb2-phy";
+	maximum-speed = "high-speed";
+	snps,dis_u2_susphy_quirk;
+	snps,usb2-lpm-disable;
+};
+
+&pinctrl {
+	wireless-wlan {
+		wifi_perst: wifi-perst {
+			rockchip,pins = <3 RK_PB0 RK_FUNC_GPIO &pcfg_pull_up>;
+		};
+
+		wifi_enable: wifi-enable {
+			rockchip,pins = <3 RK_PB2 RK_FUNC_GPIO &pcfg_output_high>;
+		};
+
+		wifi_host_wake_irq: wifi-host-wake-irq {
+			rockchip,pins = <3 RK_PB3 RK_FUNC_GPIO &pcfg_pull_down>;
+		};
+	};
+
+	wireless-bluetooth {
+		uart2m0_gpios: uart2m0-gpios {
+			rockchip,pins = <3 RK_PA2 RK_FUNC_GPIO &pcfg_pull_none>;
+		};
+	};
+};
+
+&acodec {
+	pa-ctl-gpios = <&gpio3 RK_PA4 GPIO_ACTIVE_HIGH>;
+	status = "okay";
+};
diff --git a/kernel/arch/arm64/boot/dts/rockchip/rk3528-evb4-ddr4-v10.dts b/kernel/arch/arm64/boot/dts/rockchip/rk3528-evb4-ddr4-v10.dts
new file mode 100644
index 0000000..ea05dde
--- /dev/null
+++ b/kernel/arch/arm64/boot/dts/rockchip/rk3528-evb4-ddr4-v10.dts
@@ -0,0 +1,35 @@
+// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
+/*
+ * Copyright (c) 2022 Rockchip Electronics Co., Ltd.
+ *
+ */
+
+#include "rk3528-evb1-ddr4-v10.dtsi"
+#include "rk3528-android.dtsi"
+
+/{
+	firmware {
+		android {
+			compatible = "android,firmware";
+			boot_devices = "ffbf0000.mmc";
+			vbmeta {
+				compatible = "android,vbmeta";
+				parts = "vbmeta,boot,system,vendor,dtbo";
+			};
+			fstab {
+				compatible = "android,fstab";
+				vendor {
+					compatible = "android,vendor";
+					dev = "/dev/block/by-name/vendor";
+					type = "ext4";
+					mnt_flags = "ro,barrier=1,inode_readahead_blks=8";
+					fsmgr_flags = "wait,avb";
+				};
+			};
+		};
+	};
+};
+
+&sdmmc {
+	status = "okay";
+};
diff --git a/kernel/arch/arm64/boot/dts/rockchip/rk3528-iotest-lp3-v10.dts b/kernel/arch/arm64/boot/dts/rockchip/rk3528-iotest-lp3-v10.dts
new file mode 100644
index 0000000..2483985
--- /dev/null
+++ b/kernel/arch/arm64/boot/dts/rockchip/rk3528-iotest-lp3-v10.dts
@@ -0,0 +1,203 @@
+// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
+/*
+ * Copyright (c) 2022 Rockchip Electronics Co., Ltd.
+ *
+ */
+
+/dts-v1/;
+
+#include <dt-bindings/gpio/gpio.h>
+
+#include "rk3528.dtsi"
+#include "rk3528-android.dtsi"
+
+/ {
+	model = "Rockchip RK3528 IOTEST LP3 V10 Board";
+	compatible = "rockchip,rk3528-iotest-lp3-v10", "rockchip,rk3528";
+
+	firmware {
+		android {
+			compatible = "android,firmware";
+			boot_devices = "ffbf0000.mmc";
+			vbmeta {
+				compatible = "android,vbmeta";
+				parts = "vbmeta,boot,system,vendor,dtbo";
+			};
+			fstab {
+				compatible = "android,fstab";
+				vendor {
+					compatible = "android,vendor";
+					dev = "/dev/block/by-name/vendor";
+					type = "ext4";
+					mnt_flags = "ro,barrier=1,inode_readahead_blks=8";
+					fsmgr_flags = "wait,avb";
+				};
+			};
+		};
+	};
+
+	dc_12v: dc-12v {
+		compatible = "regulator-fixed";
+		regulator-name = "dc_12v";
+		regulator-always-on;
+		regulator-boot-on;
+		regulator-min-microvolt = <12000000>;
+		regulator-max-microvolt = <12000000>;
+	};
+
+	vcc5v0_sys: vcc5v0-sys {
+		compatible = "regulator-fixed";
+		regulator-name = "vcc5v0_sys";
+		regulator-always-on;
+		regulator-boot-on;
+		regulator-min-microvolt = <5000000>;
+		regulator-max-microvolt = <5000000>;
+		vin-supply = <&dc_12v>;
+	};
+
+	vdd_logic: vdd-logic {
+		compatible = "pwm-regulator";
+		pwms = <&pwm2 0 5000 1>;
+		regulator-name = "vdd_logic";
+		regulator-min-microvolt = <705000>;
+		regulator-max-microvolt = <1006000>;
+		regulator-init-microvolt = <900000>;
+		regulator-always-on;
+		regulator-boot-on;
+		regulator-settling-time-up-us = <250>;
+		pwm-supply = <&vcc5v0_sys>;
+		status = "okay";
+	};
+
+	vdd_cpu: vdd-cpu {
+		compatible = "pwm-regulator";
+		pwms = <&pwm1 0 5000 1>;
+		regulator-name = "vdd_cpu";
+		regulator-min-microvolt = <746000>;
+		regulator-max-microvolt = <1201000>;
+		regulator-init-microvolt = <953000>;
+		regulator-always-on;
+		regulator-boot-on;
+		regulator-settling-time-up-us = <250>;
+		pwm-supply = <&vcc5v0_sys>;
+		status = "okay";
+	};
+
+	vdd_gpu: vdd-gpu {
+		compatible = "pwm-regulator";
+		pwms = <&pwm0 0 5000 1>;
+		regulator-name = "vdd_gpu";
+		regulator-min-microvolt = <705000>;
+		regulator-max-microvolt = <1148000>;
+		regulator-init-microvolt = <900000>;
+		regulator-always-on;
+		regulator-boot-on;
+		regulator-settling-time-up-us = <250>;
+		pwm-supply = <&vcc5v0_sys>;
+		status = "okay";
+	};
+
+	vdd_0v9_s3: vdd-0v9-s3 {
+		compatible = "regulator-fixed";
+		regulator-name = "vdd_0v9_s3";
+		regulator-always-on;
+		regulator-boot-on;
+		regulator-min-microvolt = <900000>;
+		regulator-max-microvolt = <900000>;
+		vin-supply = <&vcc5v0_sys>;
+	};
+
+	vdd_1v8_s3: vdd-1v8-s3 {
+		compatible = "regulator-fixed";
+		regulator-name = "vdd_1v8_s3";
+		regulator-always-on;
+		regulator-boot-on;
+		regulator-min-microvolt = <1800000>;
+		regulator-max-microvolt = <1800000>;
+		vin-supply = <&vcc5v0_sys>;
+	};
+
+	vcc_3v3_s3: vcc-3v3-s3 {
+		compatible = "regulator-fixed";
+		regulator-name = "vcc_3v3_s3";
+		regulator-always-on;
+		regulator-boot-on;
+		regulator-min-microvolt = <3300000>;
+		regulator-max-microvolt = <3300000>;
+		vin-supply = <&vcc5v0_sys>;
+	};
+
+	vcc_ddr_s3: vcc-ddr-s3 {
+		compatible = "regulator-fixed";
+		regulator-name = "vcc_ddr_s3";
+		regulator-always-on;
+		regulator-boot-on;
+		regulator-min-microvolt = <1200000>;
+		regulator-max-microvolt = <1200000>;
+		vin-supply = <&vcc5v0_sys>;
+	};
+};
+
+&cpu0 {
+	cpu-supply = <&vdd_cpu>;
+};
+
+&cpu0_opp_table {
+	/delete-node/ opp-1416000000;
+	/delete-node/ opp-1608000000;
+};
+
+&pwm0 {
+	status = "okay";
+};
+
+&pwm1 {
+	status = "okay";
+};
+
+&pwm2 {
+	status = "okay";
+};
+
+&sdhci {
+	bus-width = <8>;
+	supports-emmc;
+	non-removable;
+	max-frequency = <200000000>;
+	status = "okay";
+};
+
+&u2phy_host {
+	status = "okay";
+};
+
+&u2phy_otg {
+	status = "okay";
+};
+
+&usb2phy {
+	status = "okay";
+};
+
+&usb_host0_ehci {
+	status = "okay";
+};
+
+&usb_host0_ohci {
+	status = "okay";
+};
+
+&usbdrd30 {
+	status = "okay";
+};
+
+&usbdrd_dwc3 {
+	dr_mode = "peripheral";
+	maximum-speed = "high-speed";
+	extcon = <&usb2phy>;
+	phys = <&u2phy_otg>;
+	phy-names = "usb2-phy";
+	snps,dis_u2_susphy_quirk;
+	snps,usb2-lpm-disable;
+	status = "okay";
+};
diff --git a/kernel/arch/arm64/boot/dts/rockchip/rk3528-linux.dtsi b/kernel/arch/arm64/boot/dts/rockchip/rk3528-linux.dtsi
new file mode 100644
index 0000000..dd31a07
--- /dev/null
+++ b/kernel/arch/arm64/boot/dts/rockchip/rk3528-linux.dtsi
@@ -0,0 +1,88 @@
+// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
+/*
+ * Copyright (c) 2022 Rockchip Electronics Co., Ltd.
+ *
+ */
+
+/ {
+	chosen: chosen {
+		bootargs = "earlycon=uart8250,mmio32,0xff9f0000 console=ttyFIQ0 root=PARTUUID=614e0000-0000 rw rootwait";
+	};
+
+	fiq-debugger {
+		compatible = "rockchip,fiq-debugger";
+		rockchip,serial-id = <0>;
+		rockchip,wake-irq = <0>;
+		/* If enable uart uses irq instead of fiq */
+		rockchip,irq-mode-enable = <1>;
+		rockchip,baudrate = <1500000>;  /* Only 115200 and 1500000 */
+		interrupts = <GIC_SPI 186 IRQ_TYPE_LEVEL_HIGH>;
+		pinctrl-names = "default";
+		pinctrl-0 = <&uart0m0_xfer>;
+		status = "okay";
+	};
+
+	firmware {
+		optee {
+			compatible = "linaro,optee-tz";
+			method = "smc";
+		};
+	};
+
+	reserved_memory: reserved-memory {
+		#address-cells = <2>;
+		#size-cells = <2>;
+		ranges;
+
+		drm_logo: drm-logo@00000000 {
+			compatible = "rockchip,drm-logo";
+			reg = <0x0 0x0 0x0 0x0>;
+		};
+
+		drm_cubic_lut: drm-cubic-lut@00000000 {
+			compatible = "rockchip,drm-cubic-lut";
+			reg = <0x0 0x0 0x0 0x0>;
+		};
+
+		ramoops: ramoops@110000 {
+			compatible = "ramoops";
+			/* 0x110000 to 0x1f0000 is for ramoops */
+			reg = <0x0 0x110000 0x0 0xe0000>;
+			boot-log-size = <0x8000>;	/* do not change */
+			boot-log-count = <0x1>;		/* do not change */
+			console-size = <0x80000>;
+			pmsg-size = <0x30000>;
+			ftrace-size = <0x00000>;
+			record-size = <0x14000>;
+		};
+	};
+};
+
+&display_subsystem {
+	memory-region = <&drm_logo>, <&drm_cubic_lut>;
+	memory-region-names = "drm-logo", "drm-cubic-lut";
+	/* devfreq = <&dmc>; */
+
+	route {
+		route_hdmi: route-hdmi {
+			status = "disabled";
+			logo,uboot = "logo.bmp";
+			logo,kernel = "logo_kernel.bmp";
+			logo,mode = "center";
+			charge_logo,mode = "center";
+			connect = <&vp0_out_hdmi>;
+		};
+		route_tve: route-tve {
+			status = "disabled";
+			logo,uboot = "logo.bmp";
+			logo,kernel = "logo_kernel.bmp";
+			logo,mode = "center";
+			charge_logo,mode = "center";
+			connect = <&vp1_out_tve>;
+		};
+	};
+};
+
+&rng {
+	status = "okay";
+};
diff --git a/kernel/arch/arm64/boot/dts/rockchip/rk3528-pinctrl.dtsi b/kernel/arch/arm64/boot/dts/rockchip/rk3528-pinctrl.dtsi
new file mode 100644
index 0000000..7035a4e
--- /dev/null
+++ b/kernel/arch/arm64/boot/dts/rockchip/rk3528-pinctrl.dtsi
@@ -0,0 +1,1406 @@
+// 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 {
+		/omit-if-no-ref/
+		arm_pins: arm-pins {
+			rockchip,pins =
+				/* arm_avs */
+				<4 RK_PC4 3 &pcfg_pull_none>;
+		};
+	};
+
+	clk {
+		/omit-if-no-ref/
+		clkm0_32k_out: clkm0-32k-out {
+			rockchip,pins =
+				/* clkm0_32k_out */
+				<3 RK_PC3 3 &pcfg_pull_none>;
+		};
+
+		/omit-if-no-ref/
+		clkm1_32k_out: clkm1-32k-out {
+			rockchip,pins =
+				/* clkm1_32k_out */
+				<1 RK_PC3 1 &pcfg_pull_none>;
+		};
+	};
+
+	emmc {
+		/omit-if-no-ref/
+		emmc_rstnout: emmc-rstnout {
+			rockchip,pins =
+				/* emmc_rstn */
+				<1 RK_PD6 1 &pcfg_pull_none>;
+		};
+
+		/omit-if-no-ref/
+		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>;
+		};
+
+		/omit-if-no-ref/
+		emmc_clk: emmc-clk {
+			rockchip,pins =
+				/* emmc_clk */
+				<1 RK_PD5 1 &pcfg_pull_up_drv_level_2>;
+		};
+
+		/omit-if-no-ref/
+		emmc_cmd: emmc-cmd {
+			rockchip,pins =
+				/* emmc_cmd */
+				<1 RK_PD4 1 &pcfg_pull_up_drv_level_2>;
+		};
+
+		/omit-if-no-ref/
+		emmc_strb: emmc-strb {
+			rockchip,pins =
+				/* emmc_strb */
+				<1 RK_PD7 1 &pcfg_pull_none>;
+		};
+	};
+
+	eth {
+		/omit-if-no-ref/
+		eth_pins: eth-pins {
+			rockchip,pins =
+				/* eth_clk_25m_out */
+				<3 RK_PB5 2 &pcfg_pull_none_drv_level_2>;
+		};
+	};
+
+	fephy {
+		/omit-if-no-ref/
+		fephym0_led_dpx: fephym0-led_dpx {
+			rockchip,pins =
+				/* fephy_led_dpx_m0 */
+				<4 RK_PB5 2 &pcfg_pull_none>;
+		};
+
+		/omit-if-no-ref/
+		fephym0_led_link: fephym0-led_link {
+			rockchip,pins =
+				/* fephy_led_link_m0 */
+				<4 RK_PC0 2 &pcfg_pull_none>;
+		};
+
+		/omit-if-no-ref/
+		fephym0_led_spd: fephym0-led_spd {
+			rockchip,pins =
+				/* fephy_led_spd_m0 */
+				<4 RK_PB7 2 &pcfg_pull_none>;
+		};
+
+		/omit-if-no-ref/
+		fephym1_led_dpx: fephym1-led_dpx {
+			rockchip,pins =
+				/* fephy_led_dpx_m1 */
+				<2 RK_PA4 5 &pcfg_pull_none>;
+		};
+
+		/omit-if-no-ref/
+		fephym1_led_link: fephym1-led_link {
+			rockchip,pins =
+				/* fephy_led_link_m1 */
+				<2 RK_PA6 5 &pcfg_pull_none>;
+		};
+
+		/omit-if-no-ref/
+		fephym1_led_spd: fephym1-led_spd {
+			rockchip,pins =
+				/* fephy_led_spd_m1 */
+				<2 RK_PA5 5 &pcfg_pull_none>;
+		};
+	};
+
+	fspi {
+		/omit-if-no-ref/
+		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>;
+		};
+
+		/omit-if-no-ref/
+		fspi_csn0: fspi-csn0 {
+			rockchip,pins =
+				/* fspi_csn0 */
+				<1 RK_PD0 2 &pcfg_pull_none>;
+		};
+		/omit-if-no-ref/
+		fspi_csn1: fspi-csn1 {
+			rockchip,pins =
+				/* fspi_csn1 */
+				<1 RK_PD1 2 &pcfg_pull_none>;
+		};
+	};
+
+	gpu {
+		/omit-if-no-ref/
+		gpu_pins: gpu-pins {
+			rockchip,pins =
+				/* gpu_avs */
+				<4 RK_PC3 3 &pcfg_pull_none>;
+		};
+	};
+
+	hdmi {
+		/omit-if-no-ref/
+		hdmi_pins: hdmi-pins {
+			rockchip,pins =
+				/* hdmi_tx_cec */
+				<0 RK_PA3 1 &pcfg_pull_none>,
+				/* hdmi_tx_scl */
+				<0 RK_PA4 1 &pcfg_pull_none_smt>,
+				/* hdmi_tx_sda */
+				<0 RK_PA5 1 &pcfg_pull_none_smt>;
+		};
+
+		/omit-if-no-ref/
+		hdmi_pins_idle: hdmi-pins-idle {
+			rockchip,pins =
+				/* hdmi_tx_cec */
+				<0 RK_PA3 1 &pcfg_pull_none>,
+				/* hdmi_tx_scl */
+				<0 RK_PA4 0 &pcfg_output_low_pull_down>,
+				/* hdmi_tx_sda */
+				<0 RK_PA5 0 &pcfg_output_low_pull_down>;
+		};
+	};
+
+	hsm {
+		/omit-if-no-ref/
+		hsmm0_pins: hsmm0-pins {
+			rockchip,pins =
+				/* hsm_clk_out_m0 */
+				<2 RK_PA2 4 &pcfg_pull_none>;
+		};
+
+		/omit-if-no-ref/
+		hsmm1_pins: hsmm1-pins {
+			rockchip,pins =
+				/* hsm_clk_out_m1 */
+				<1 RK_PA4 3 &pcfg_pull_none>;
+		};
+	};
+
+	i2c0 {
+		/omit-if-no-ref/
+		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>;
+		};
+
+		/omit-if-no-ref/
+		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 {
+		/omit-if-no-ref/
+		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>;
+		};
+
+		/omit-if-no-ref/
+		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 {
+		/omit-if-no-ref/
+		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>;
+		};
+
+		/omit-if-no-ref/
+		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 {
+		/omit-if-no-ref/
+		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>;
+		};
+
+		/omit-if-no-ref/
+		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 {
+		/omit-if-no-ref/
+		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 {
+		/omit-if-no-ref/
+		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>;
+		};
+
+		/omit-if-no-ref/
+		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 {
+		/omit-if-no-ref/
+		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>;
+		};
+
+		/omit-if-no-ref/
+		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 {
+		/omit-if-no-ref/
+		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 {
+		/omit-if-no-ref/
+		i2s0m0_lrck: i2s0m0-lrck {
+			rockchip,pins =
+				/* i2s0_lrck_m0 */
+				<3 RK_PB6 1 &pcfg_pull_none>;
+		};
+
+		/omit-if-no-ref/
+		i2s0m0_mclk: i2s0m0-mclk {
+			rockchip,pins =
+				/* i2s0_mclk_m0 */
+				<3 RK_PB4 1 &pcfg_pull_none>;
+		};
+
+		/omit-if-no-ref/
+		i2s0m0_sclk: i2s0m0-sclk {
+			rockchip,pins =
+				/* i2s0_sclk_m0 */
+				<3 RK_PB5 1 &pcfg_pull_none>;
+		};
+
+		/omit-if-no-ref/
+		i2s0m0_sdi: i2s0m0-sdi {
+			rockchip,pins =
+				/* i2s0m0_sdi */
+				<3 RK_PB7 1 &pcfg_pull_none>;
+		};
+		/omit-if-no-ref/
+		i2s0m0_sdo: i2s0m0-sdo {
+			rockchip,pins =
+				/* i2s0m0_sdo */
+				<3 RK_PC0 1 &pcfg_pull_none>;
+		};
+
+		/omit-if-no-ref/
+		i2s0m1_lrck: i2s0m1-lrck {
+			rockchip,pins =
+				/* i2s0_lrck_m1 */
+				<1 RK_PB6 1 &pcfg_pull_none>;
+		};
+
+		/omit-if-no-ref/
+		i2s0m1_mclk: i2s0m1-mclk {
+			rockchip,pins =
+				/* i2s0_mclk_m1 */
+				<1 RK_PB4 1 &pcfg_pull_none>;
+		};
+
+		/omit-if-no-ref/
+		i2s0m1_sclk: i2s0m1-sclk {
+			rockchip,pins =
+				/* i2s0_sclk_m1 */
+				<1 RK_PB5 1 &pcfg_pull_none>;
+		};
+
+		/omit-if-no-ref/
+		i2s0m1_sdi: i2s0m1-sdi {
+			rockchip,pins =
+				/* i2s0m1_sdi */
+				<1 RK_PB7 1 &pcfg_pull_none>;
+		};
+		/omit-if-no-ref/
+		i2s0m1_sdo: i2s0m1-sdo {
+			rockchip,pins =
+				/* i2s0m1_sdo */
+				<1 RK_PC0 1 &pcfg_pull_none>;
+		};
+	};
+
+	i2s1 {
+		/omit-if-no-ref/
+		i2s1_lrck: i2s1-lrck {
+			rockchip,pins =
+				/* i2s1_lrck */
+				<4 RK_PA6 1 &pcfg_pull_none>;
+		};
+
+		/omit-if-no-ref/
+		i2s1_mclk: i2s1-mclk {
+			rockchip,pins =
+				/* i2s1_mclk */
+				<4 RK_PA4 1 &pcfg_pull_none>;
+		};
+
+		/omit-if-no-ref/
+		i2s1_sclk: i2s1-sclk {
+			rockchip,pins =
+				/* i2s1_sclk */
+				<4 RK_PA5 1 &pcfg_pull_none>;
+		};
+
+		/omit-if-no-ref/
+		i2s1_sdi0: i2s1-sdi0 {
+			rockchip,pins =
+				/* i2s1_sdi0 */
+				<4 RK_PB4 1 &pcfg_pull_none>;
+		};
+
+		/omit-if-no-ref/
+		i2s1_sdi1: i2s1-sdi1 {
+			rockchip,pins =
+				/* i2s1_sdi1 */
+				<4 RK_PB3 1 &pcfg_pull_none>;
+		};
+
+		/omit-if-no-ref/
+		i2s1_sdi2: i2s1-sdi2 {
+			rockchip,pins =
+				/* i2s1_sdi2 */
+				<4 RK_PA3 1 &pcfg_pull_none>;
+		};
+
+		/omit-if-no-ref/
+		i2s1_sdi3: i2s1-sdi3 {
+			rockchip,pins =
+				/* i2s1_sdi3 */
+				<4 RK_PA2 1 &pcfg_pull_none>;
+		};
+
+		/omit-if-no-ref/
+		i2s1_sdo0: i2s1-sdo0 {
+			rockchip,pins =
+				/* i2s1_sdo0 */
+				<4 RK_PA7 1 &pcfg_pull_none>;
+		};
+
+		/omit-if-no-ref/
+		i2s1_sdo1: i2s1-sdo1 {
+			rockchip,pins =
+				/* i2s1_sdo1 */
+				<4 RK_PB0 1 &pcfg_pull_none>;
+		};
+
+		/omit-if-no-ref/
+		i2s1_sdo2: i2s1-sdo2 {
+			rockchip,pins =
+				/* i2s1_sdo2 */
+				<4 RK_PB1 1 &pcfg_pull_none>;
+		};
+
+		/omit-if-no-ref/
+		i2s1_sdo3: i2s1-sdo3 {
+			rockchip,pins =
+				/* i2s1_sdo3 */
+				<4 RK_PB2 1 &pcfg_pull_none>;
+		};
+	};
+
+	jtag {
+		/omit-if-no-ref/
+		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>;
+		};
+
+		/omit-if-no-ref/
+		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 {
+		/omit-if-no-ref/
+		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>;
+		};
+
+		/omit-if-no-ref/
+		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 {
+		/omit-if-no-ref/
+		pdm_clk0: pdm-clk0 {
+			rockchip,pins =
+				/* pdm_clk0 */
+				<4 RK_PB5 3 &pcfg_pull_none>;
+		};
+
+		/omit-if-no-ref/
+		pdm_clk1: pdm-clk1 {
+			rockchip,pins =
+				/* pdm_clk1 */
+				<4 RK_PA4 3 &pcfg_pull_none>;
+		};
+
+		/omit-if-no-ref/
+		pdm_sdi0: pdm-sdi0 {
+			rockchip,pins =
+				/* pdm_sdi0 */
+				<4 RK_PB2 3 &pcfg_pull_none>;
+		};
+
+		/omit-if-no-ref/
+		pdm_sdi1: pdm-sdi1 {
+			rockchip,pins =
+				/* pdm_sdi1 */
+				<4 RK_PB1 3 &pcfg_pull_none>;
+		};
+
+		/omit-if-no-ref/
+		pdm_sdi2: pdm-sdi2 {
+			rockchip,pins =
+				/* pdm_sdi2 */
+				<4 RK_PB3 3 &pcfg_pull_none>;
+		};
+
+		/omit-if-no-ref/
+		pdm_sdi3: pdm-sdi3 {
+			rockchip,pins =
+				/* pdm_sdi3 */
+				<4 RK_PC1 3 &pcfg_pull_none>;
+		};
+	};
+
+	pmu {
+		/omit-if-no-ref/
+		pmu_pins: pmu-pins {
+			rockchip,pins =
+				/* pmu_debug */
+				<4 RK_PA0 4 &pcfg_pull_none>;
+		};
+	};
+
+	pwm0 {
+		/omit-if-no-ref/
+		pwm0m0_pins: pwm0m0-pins {
+			rockchip,pins =
+				/* pwm0_m0 */
+				<4 RK_PC3 1 &pcfg_pull_none_drv_level_0>;
+		};
+
+		/omit-if-no-ref/
+		pwm0m1_pins: pwm0m1-pins {
+			rockchip,pins =
+				/* pwm0_m1 */
+				<1 RK_PA2 5 &pcfg_pull_none_drv_level_0>;
+		};
+	};
+
+	pwm1 {
+		/omit-if-no-ref/
+		pwm1m0_pins: pwm1m0-pins {
+			rockchip,pins =
+				/* pwm1_m0 */
+				<4 RK_PC4 1 &pcfg_pull_none_drv_level_0>;
+		};
+
+		/omit-if-no-ref/
+		pwm1m1_pins: pwm1m1-pins {
+			rockchip,pins =
+				/* pwm1_m1 */
+				<1 RK_PA3 4 &pcfg_pull_none_drv_level_0>;
+		};
+	};
+
+	pwm2 {
+		/omit-if-no-ref/
+		pwm2m0_pins: pwm2m0-pins {
+			rockchip,pins =
+				/* pwm2_m0 */
+				<4 RK_PC5 1 &pcfg_pull_none_drv_level_0>;
+		};
+
+		/omit-if-no-ref/
+		pwm2m1_pins: pwm2m1-pins {
+			rockchip,pins =
+				/* pwm2_m1 */
+				<1 RK_PA7 2 &pcfg_pull_none_drv_level_0>;
+		};
+	};
+
+	pwm3 {
+		/omit-if-no-ref/
+		pwm3m0_pins: pwm3m0-pins {
+			rockchip,pins =
+				/* pwm3_m0 */
+				<4 RK_PC6 1 &pcfg_pull_none_drv_level_0>;
+		};
+
+		/omit-if-no-ref/
+		pwm3m1_pins: pwm3m1-pins {
+			rockchip,pins =
+				/* pwm3_m1 */
+				<2 RK_PA4 3 &pcfg_pull_none_drv_level_0>;
+		};
+	};
+
+	pwm4 {
+		/omit-if-no-ref/
+		pwm4m0_pins: pwm4m0-pins {
+			rockchip,pins =
+				/* pwm4_m0 */
+				<4 RK_PB7 1 &pcfg_pull_none_drv_level_0>;
+		};
+
+		/omit-if-no-ref/
+		pwm4m1_pins: pwm4m1-pins {
+			rockchip,pins =
+				/* pwm4_m1 */
+				<1 RK_PA4 2 &pcfg_pull_none_drv_level_0>;
+		};
+	};
+
+	pwm5 {
+		/omit-if-no-ref/
+		pwm5m0_pins: pwm5m0-pins {
+			rockchip,pins =
+				/* pwm5_m0 */
+				<4 RK_PC0 1 &pcfg_pull_none_drv_level_0>;
+		};
+
+		/omit-if-no-ref/
+		pwm5m1_pins: pwm5m1-pins {
+			rockchip,pins =
+				/* pwm5_m1 */
+				<3 RK_PC3 1 &pcfg_pull_none_drv_level_0>;
+		};
+	};
+
+	pwm6 {
+		/omit-if-no-ref/
+		pwm6m0_pins: pwm6m0-pins {
+			rockchip,pins =
+				/* pwm6_m0 */
+				<4 RK_PC1 1 &pcfg_pull_none_drv_level_0>;
+		};
+
+		/omit-if-no-ref/
+		pwm6m1_pins: pwm6m1-pins {
+			rockchip,pins =
+				/* pwm6_m1 */
+				<1 RK_PC3 3 &pcfg_pull_none_drv_level_0>;
+		};
+
+		/omit-if-no-ref/
+		pwm6m2_pins: pwm6m2-pins {
+			rockchip,pins =
+				/* pwm6_m2 */
+				<3 RK_PC1 1 &pcfg_pull_none_drv_level_0>;
+		};
+	};
+
+	pwm7 {
+		/omit-if-no-ref/
+		pwm7m0_pins: pwm7m0-pins {
+			rockchip,pins =
+				/* pwm7_m0 */
+				<4 RK_PC2 1 &pcfg_pull_none_drv_level_0>;
+		};
+
+		/omit-if-no-ref/
+		pwm7m1_pins: pwm7m1-pins {
+			rockchip,pins =
+				/* pwm7_m1 */
+				<1 RK_PC2 2 &pcfg_pull_none_drv_level_0>;
+		};
+	};
+
+	pwr {
+		/omit-if-no-ref/
+		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 {
+		/omit-if-no-ref/
+		refm0_pins: refm0-pins {
+			rockchip,pins =
+				/* ref_clk_out_m0 */
+				<0 RK_PA1 1 &pcfg_pull_none>;
+		};
+
+		/omit-if-no-ref/
+		refm1_pins: refm1-pins {
+			rockchip,pins =
+				/* ref_clk_out_m1 */
+				<3 RK_PC3 6 &pcfg_pull_none>;
+		};
+	};
+
+	rgmii {
+		/omit-if-no-ref/
+		rgmii_miim: rgmii-miim {
+			rockchip,pins =
+				/* rgmii_mdc */
+				<3 RK_PB6 2 &pcfg_pull_none_drv_level_2>,
+				/* rgmii_mdio */
+				<3 RK_PB7 2 &pcfg_pull_none_drv_level_2>;
+		};
+
+		/omit-if-no-ref/
+		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>;
+		};
+
+		/omit-if-no-ref/
+		rgmii_tx_bus2: rgmii-tx_bus2 {
+			rockchip,pins =
+				/* rgmii_txd0 */
+				<3 RK_PA1 2 &pcfg_pull_none_drv_level_2>,
+				/* rgmii_txd1 */
+				<3 RK_PA0 2 &pcfg_pull_none_drv_level_2>,
+				/* rgmii_txen */
+				<3 RK_PC0 2 &pcfg_pull_none>;
+		};
+
+		/omit-if-no-ref/
+		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_drv_level_2>;
+		};
+
+		/omit-if-no-ref/
+		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_drv_level_2>,
+				/* rgmii_txd3 */
+				<3 RK_PB0 2 &pcfg_pull_none_drv_level_2>;
+		};
+
+		/omit-if-no-ref/
+		rgmii_clk: rgmii-clk {
+			rockchip,pins =
+				/* rgmii_clk */
+				<3 RK_PB4 2 &pcfg_pull_none>;
+		};
+		/omit-if-no-ref/
+		rgmii_txer: rgmii-txer {
+			rockchip,pins =
+				/* rgmii_txer */
+				<3 RK_PC1 2 &pcfg_pull_none>;
+		};
+	};
+
+	scr {
+		/omit-if-no-ref/
+		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>;
+		};
+
+		/omit-if-no-ref/
+		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 {
+		/omit-if-no-ref/
+		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>;
+		};
+
+		/omit-if-no-ref/
+		sdio0_clk: sdio0-clk {
+			rockchip,pins =
+				/* sdio0_clk */
+				<1 RK_PA5 1 &pcfg_pull_up_drv_level_2>;
+		};
+
+		/omit-if-no-ref/
+		sdio0_cmd: sdio0-cmd {
+			rockchip,pins =
+				/* sdio0_cmd */
+				<1 RK_PA4 1 &pcfg_pull_up_drv_level_2>;
+		};
+
+		/omit-if-no-ref/
+		sdio0_det: sdio0-det {
+			rockchip,pins =
+				/* sdio0_det */
+				<1 RK_PA6 1 &pcfg_pull_up>;
+		};
+
+		/omit-if-no-ref/
+		sdio0_pwren: sdio0-pwren {
+			rockchip,pins =
+				/* sdio0_pwren */
+				<1 RK_PA7 1 &pcfg_pull_none>;
+		};
+	};
+
+	sdio1 {
+		/omit-if-no-ref/
+		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>;
+		};
+
+		/omit-if-no-ref/
+		sdio1_clk: sdio1-clk {
+			rockchip,pins =
+				/* sdio1_clk */
+				<3 RK_PA4 1 &pcfg_pull_up_drv_level_2>;
+		};
+
+		/omit-if-no-ref/
+		sdio1_cmd: sdio1-cmd {
+			rockchip,pins =
+				/* sdio1_cmd */
+				<3 RK_PA5 1 &pcfg_pull_up_drv_level_2>;
+		};
+
+		/omit-if-no-ref/
+		sdio1_det: sdio1-det {
+			rockchip,pins =
+				/* sdio1_det */
+				<3 RK_PB3 1 &pcfg_pull_up>;
+		};
+
+		/omit-if-no-ref/
+		sdio1_pwren: sdio1-pwren {
+			rockchip,pins =
+				/* sdio1_pwren */
+				<3 RK_PB2 1 &pcfg_pull_none>;
+		};
+	};
+
+	sdmmc {
+		/omit-if-no-ref/
+		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>;
+		};
+
+		/omit-if-no-ref/
+		sdmmc_clk: sdmmc-clk {
+			rockchip,pins =
+				/* sdmmc_clk */
+				<2 RK_PA5 1 &pcfg_pull_up_drv_level_2>;
+		};
+
+		/omit-if-no-ref/
+		sdmmc_cmd: sdmmc-cmd {
+			rockchip,pins =
+				/* sdmmc_cmd */
+				<2 RK_PA4 1 &pcfg_pull_up_drv_level_2>;
+		};
+
+		/omit-if-no-ref/
+		sdmmc_det: sdmmc-det {
+			rockchip,pins =
+				/* sdmmc_detn */
+				<2 RK_PA6 1 &pcfg_pull_up>;
+		};
+
+		/omit-if-no-ref/
+		sdmmc_pwren: sdmmc-pwren {
+			rockchip,pins =
+				/* sdmmc_pwren */
+				<4 RK_PA1 1 &pcfg_pull_none>;
+		};
+	};
+
+	spdif {
+		/omit-if-no-ref/
+		spdifm0_pins: spdifm0-pins {
+			rockchip,pins =
+				/* spdif_tx_m0 */
+				<4 RK_PA0 1 &pcfg_pull_none>;
+		};
+
+		/omit-if-no-ref/
+		spdifm1_pins: spdifm1-pins {
+			rockchip,pins =
+				/* spdif_tx_m1 */
+				<1 RK_PC3 2 &pcfg_pull_none>;
+		};
+
+		/omit-if-no-ref/
+		spdifm2_pins: spdifm2-pins {
+			rockchip,pins =
+				/* spdif_tx_m2 */
+				<3 RK_PC3 2 &pcfg_pull_none>;
+		};
+	};
+
+	spi0 {
+		/omit-if-no-ref/
+		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>;
+		};
+
+		/omit-if-no-ref/
+		spi0_csn0: spi0-csn0 {
+			rockchip,pins =
+				/* spi0_csn0 */
+				<4 RK_PB6 2 &pcfg_pull_none>;
+		};
+		/omit-if-no-ref/
+		spi0_csn1: spi0-csn1 {
+			rockchip,pins =
+				/* spi0_csn1 */
+				<4 RK_PC1 2 &pcfg_pull_none>;
+		};
+	};
+
+	spi1 {
+		/omit-if-no-ref/
+		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>;
+		};
+
+		/omit-if-no-ref/
+		spi1_csn0: spi1-csn0 {
+			rockchip,pins =
+				/* spi1_csn0 */
+				<1 RK_PC1 1 &pcfg_pull_none>;
+		};
+		/omit-if-no-ref/
+		spi1_csn1: spi1-csn1 {
+			rockchip,pins =
+				/* spi1_csn1 */
+				<1 RK_PC2 1 &pcfg_pull_none>;
+		};
+	};
+
+	tsi0 {
+		/omit-if-no-ref/
+		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 {
+		/omit-if-no-ref/
+		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 {
+		/omit-if-no-ref/
+		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>;
+		};
+
+		/omit-if-no-ref/
+		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 {
+		/omit-if-no-ref/
+		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>;
+		};
+
+		/omit-if-no-ref/
+		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>;
+		};
+
+		/omit-if-no-ref/
+		uart1_ctsn: uart1-ctsn {
+			rockchip,pins =
+				/* uart1_ctsn */
+				<4 RK_PA4 2 &pcfg_pull_none>;
+		};
+		/omit-if-no-ref/
+		uart1_rtsn: uart1-rtsn {
+			rockchip,pins =
+				/* uart1_rtsn */
+				<4 RK_PA5 2 &pcfg_pull_none>;
+		};
+	};
+
+	uart2 {
+		/omit-if-no-ref/
+		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>;
+		};
+
+		/omit-if-no-ref/
+		uart2m0_ctsn: uart2m0-ctsn {
+			rockchip,pins =
+				/* uart2m0_ctsn */
+				<3 RK_PA3 1 &pcfg_pull_none>;
+		};
+		/omit-if-no-ref/
+		uart2m0_rtsn: uart2m0-rtsn {
+			rockchip,pins =
+				/* uart2m0_rtsn */
+				<3 RK_PA2 1 &pcfg_pull_none>;
+		};
+
+		/omit-if-no-ref/
+		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>;
+		};
+
+		/omit-if-no-ref/
+		uart2m1_ctsn: uart2m1-ctsn {
+			rockchip,pins =
+				/* uart2m1_ctsn */
+				<1 RK_PB3 1 &pcfg_pull_none>;
+		};
+		/omit-if-no-ref/
+		uart2m1_rtsn: uart2m1-rtsn {
+			rockchip,pins =
+				/* uart2m1_rtsn */
+				<1 RK_PB2 1 &pcfg_pull_none>;
+		};
+	};
+
+	uart3 {
+		/omit-if-no-ref/
+		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>;
+		};
+
+		/omit-if-no-ref/
+		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>;
+		};
+
+		/omit-if-no-ref/
+		uart3_ctsn: uart3-ctsn {
+			rockchip,pins =
+				/* uart3_ctsn */
+				<4 RK_PA3 3 &pcfg_pull_none>;
+		};
+		/omit-if-no-ref/
+		uart3_rtsn: uart3-rtsn {
+			rockchip,pins =
+				/* uart3_rtsn */
+				<4 RK_PA2 3 &pcfg_pull_none>;
+		};
+	};
+
+	uart4 {
+		/omit-if-no-ref/
+		uart4_xfer: uart4-xfer {
+			rockchip,pins =
+				/* uart4_rx */
+				<2 RK_PA2 3 &pcfg_pull_up>,
+				/* uart4_tx */
+				<2 RK_PA3 3 &pcfg_pull_up>;
+		};
+
+		/omit-if-no-ref/
+		uart4_ctsn: uart4-ctsn {
+			rockchip,pins =
+				/* uart4_ctsn */
+				<2 RK_PA1 3 &pcfg_pull_none>;
+		};
+		/omit-if-no-ref/
+		uart4_rtsn: uart4-rtsn {
+			rockchip,pins =
+				/* uart4_rtsn */
+				<2 RK_PA0 3 &pcfg_pull_none>;
+		};
+	};
+
+	uart5 {
+		/omit-if-no-ref/
+		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>;
+		};
+
+		/omit-if-no-ref/
+		uart5m0_ctsn: uart5m0-ctsn {
+			rockchip,pins =
+				/* uart5m0_ctsn */
+				<1 RK_PA6 2 &pcfg_pull_none>;
+		};
+		/omit-if-no-ref/
+		uart5m0_rtsn: uart5m0-rtsn {
+			rockchip,pins =
+				/* uart5m0_rtsn */
+				<1 RK_PA5 2 &pcfg_pull_none>;
+		};
+
+		/omit-if-no-ref/
+		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>;
+		};
+
+		/omit-if-no-ref/
+		uart5m1_ctsn: uart5m1-ctsn {
+			rockchip,pins =
+				/* uart5m1_ctsn */
+				<1 RK_PD3 2 &pcfg_pull_none>;
+		};
+		/omit-if-no-ref/
+		uart5m1_rtsn: uart5m1-rtsn {
+			rockchip,pins =
+				/* uart5m1_rtsn */
+				<1 RK_PD2 2 &pcfg_pull_none>;
+		};
+	};
+
+	uart6 {
+		/omit-if-no-ref/
+		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>;
+		};
+
+		/omit-if-no-ref/
+		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>;
+		};
+
+		/omit-if-no-ref/
+		uart6_ctsn: uart6-ctsn {
+			rockchip,pins =
+				/* uart6_ctsn */
+				<3 RK_PA4 4 &pcfg_pull_none>;
+		};
+		/omit-if-no-ref/
+		uart6_rtsn: uart6-rtsn {
+			rockchip,pins =
+				/* uart6_rtsn */
+				<3 RK_PA5 4 &pcfg_pull_none>;
+		};
+	};
+
+	uart7 {
+		/omit-if-no-ref/
+		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>;
+		};
+
+		/omit-if-no-ref/
+		uart7m0_ctsn: uart7m0-ctsn {
+			rockchip,pins =
+				/* uart7m0_ctsn */
+				<3 RK_PB0 4 &pcfg_pull_none>;
+		};
+		/omit-if-no-ref/
+		uart7m0_rtsn: uart7m0-rtsn {
+			rockchip,pins =
+				/* uart7m0_rtsn */
+				<3 RK_PB1 4 &pcfg_pull_none>;
+		};
+
+		/omit-if-no-ref/
+		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>;
+		};
+
+		/omit-if-no-ref/
+		uart7m1_ctsn: uart7m1-ctsn {
+			rockchip,pins =
+				/* uart7m1_ctsn */
+				<1 RK_PB0 4 &pcfg_pull_none>;
+		};
+		/omit-if-no-ref/
+		uart7m1_rtsn: uart7m1-rtsn {
+			rockchip,pins =
+				/* uart7m1_rtsn */
+				<1 RK_PB1 4 &pcfg_pull_none>;
+		};
+	};
+};
diff --git a/kernel/arch/arm64/boot/dts/rockchip/rk3528.dtsi b/kernel/arch/arm64/boot/dts/rockchip/rk3528.dtsi
new file mode 100644
index 0000000..adf9222
--- /dev/null
+++ b/kernel/arch/arm64/boot/dts/rockchip/rk3528.dtsi
@@ -0,0 +1,2489 @@
+// 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;
+	};
+
+	clocks {
+		compatible = "simple-bus";
+		#address-cells = <2>;
+		#size-cells = <2>;
+		ranges;
+
+		xin24m: xin24m {
+			compatible = "fixed-clock";
+			#clock-cells = <0>;
+			clock-frequency = <24000000>;
+			clock-output-names = "xin24m";
+		};
+
+		mclkin_sai0: mclkin-sai0 {
+			compatible = "fixed-clock";
+			#clock-cells = <0>;
+			clock-frequency = <0>;
+			clock-output-names = "i2s0_mclkin";
+		};
+
+		mclkin_sai1: mclkin-sai1 {
+			compatible = "fixed-clock";
+			#clock-cells = <0>;
+			clock-frequency = <0>;
+			clock-output-names = "i2s1_mclkin";
+		};
+
+		mclkout_sai0: mclkout-sai0@ff340014 {
+			compatible = "rockchip,clk-out";
+			reg = <0 0xff340014 0 0x4>;
+			clocks = <&cru MCLK_SAI_I2S0>;
+			#clock-cells = <0>;
+			clock-output-names = "mclk_sai0_to_io";
+			rockchip,bit-shift = <1>;
+			rockchip,bit-set-to-disable;
+		};
+
+		mclkout_sai1: mclkout-sai1@ff320004 {
+			compatible = "rockchip,clk-out";
+			reg = <0 0xff320004 0 0x4>;
+			clocks = <&cru MCLK_SAI_I2S1>;
+			#clock-cells = <0>;
+			clock-output-names = "mclk_sai1_to_io";
+			rockchip,bit-shift = <14>;
+			rockchip,bit-set-to-disable;
+		};
+	};
+
+	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>;
+			#cooling-cells = <2>; /* min followed by max */
+			dynamic-power-coefficient = <147>;
+			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;
+
+		mbist-vmin = <825000 925000 975000>;
+		nvmem-cells = <&cpu_leakage>, <&cpu_opp_info>, <&cpu_mbist_vmin>;
+		nvmem-cell-names = "leakage", "opp-info", "mbist-vmin";
+
+		rockchip,video-4k-freq = <1200000>;
+		rockchip,pvtm-voltage-sel = <
+			0	1320	0
+			1321	1350	1
+			1351	1375	2
+			1376	1405	3
+			1406	1435	4
+			1436	1470	5
+			1471	1505	6
+			1506	1540	7
+			1541	1575	8
+			1576	1610	9
+			1611	1640	10
+			1641	9999	11
+		>;
+		rockchip,pvtm-pvtpll;
+		rockchip,pvtm-offset = <0x18>;
+		rockchip,pvtm-sample-time = <1100>;
+		rockchip,pvtm-freq = <1608000>;
+		rockchip,pvtm-volt = <900000>;
+		rockchip,pvtm-ref-temp = <40>;
+		rockchip,pvtm-temp-prop = <0 0>;
+		rockchip,pvtm-thermal-zone = "soc-thermal";
+		rockchip,grf = <&grf>;
+		rockchip,temp-hysteresis = <5000>;
+		rockchip,low-temp = <10000>;
+		rockchip,low-temp-min-volt = <900000>;
+
+		opp-408000000 {
+			opp-hz = /bits/ 64 <408000000>;
+			opp-microvolt = <825000 825000 1100000>;
+			opp-microvolt-L0 = <875000 875000 1100000>;
+			opp-microvolt-L1 = <875000 875000 1100000>;
+			opp-microvolt-L2 = <875000 875000 1100000>;
+			opp-microvolt-L3 = <875000 875000 1100000>;
+			opp-microvolt-L4 = <875000 875000 1100000>;
+			opp-microvolt-L5 = <850000 850000 1100000>;
+			clock-latency-ns = <40000>;
+			opp-suspend;
+		};
+		opp-600000000 {
+			opp-hz = /bits/ 64 <600000000>;
+			opp-microvolt = <825000 825000 1100000>;
+			opp-microvolt-L0 = <875000 875000 1100000>;
+			opp-microvolt-L1 = <875000 875000 1100000>;
+			opp-microvolt-L2 = <875000 875000 1100000>;
+			opp-microvolt-L3 = <875000 875000 1100000>;
+			opp-microvolt-L4 = <875000 875000 1100000>;
+			opp-microvolt-L5 = <850000 850000 1100000>;
+			clock-latency-ns = <40000>;
+		};
+		opp-816000000 {
+			opp-hz = /bits/ 64 <816000000>;
+			opp-microvolt = <825000 825000 1100000>;
+			opp-microvolt-L0 = <875000 875000 1100000>;
+			opp-microvolt-L1 = <875000 875000 1100000>;
+			opp-microvolt-L2 = <875000 875000 1100000>;
+			opp-microvolt-L3 = <875000 875000 1100000>;
+			opp-microvolt-L4 = <875000 875000 1100000>;
+			opp-microvolt-L5 = <850000 850000 1100000>;
+			clock-latency-ns = <40000>;
+		};
+		opp-1008000000 {
+			opp-hz = /bits/ 64 <1008000000>;
+			opp-microvolt = <825000 825000 1100000>;
+			opp-microvolt-L0 = <875000 875000 1100000>;
+			opp-microvolt-L1 = <875000 875000 1100000>;
+			opp-microvolt-L2 = <875000 875000 1100000>;
+			opp-microvolt-L3 = <875000 875000 1100000>;
+			opp-microvolt-L4 = <875000 875000 1100000>;
+			opp-microvolt-L5 = <850000 850000 1100000>;
+			clock-latency-ns = <40000>;
+		};
+		opp-1200000000 {
+			opp-hz = /bits/ 64 <1200000000>;
+			opp-microvolt = <825000 825000 1100000>;
+			opp-microvolt-L0 = <900000 900000 1100000>;
+			opp-microvolt-L1 = <887500 887500 1100000>;
+			opp-microvolt-L2 = <875000 875000 1100000>;
+			opp-microvolt-L3 = <875000 875000 1100000>;
+			opp-microvolt-L4 = <875000 875000 1100000>;
+			opp-microvolt-L5 = <862500 862500 1100000>;
+			opp-microvolt-L6 = <850000 850000 1100000>;
+			clock-latency-ns = <40000>;
+		};
+		opp-1416000000 {
+			opp-hz = /bits/ 64 <1416000000>;
+			opp-microvolt = <962500 962500 1100000>;
+			opp-microvolt-L1 = <950000 950000 1100000>;
+			opp-microvolt-L2 = <950000 950000 1100000>;
+			opp-microvolt-L3 = <937500 937500 1100000>;
+			opp-microvolt-L4 = <925000 925000 1100000>;
+			opp-microvolt-L5 = <912500 912500 1100000>;
+			opp-microvolt-L6 = <900000 900000 1100000>;
+			opp-microvolt-L7 = <887500 887000 1100000>;
+			opp-microvolt-L8 = <875000 875000 1100000>;
+			opp-microvolt-L9 = <862500 862500 1100000>;
+			opp-microvolt-L10 = <850000 850000 1100000>;
+			opp-microvolt-L11 = <850000 850000 1100000>;
+			clock-latency-ns = <40000>;
+		};
+		opp-1608000000 {
+			opp-hz = /bits/ 64 <1608000000>;
+			opp-microvolt = <1012500 1012500 1100000>;
+			opp-microvolt-L2 = <1000000 1000000 1100000>;
+			opp-microvolt-L3 = <987500 987500 1100000>;
+			opp-microvolt-L4 = <975000 975000 1100000>;
+			opp-microvolt-L5 = <962500 962500 1100000>;
+			opp-microvolt-L6 = <950000 950000 1100000>;
+			opp-microvolt-L7 = <937500 937500 1100000>;
+			opp-microvolt-L8 = <925000 925000 1100000>;
+			opp-microvolt-L9 = <912500 912500 1100000>;
+			opp-microvolt-L10 = <900000 900000 1100000>;
+			opp-microvolt-L11 = <887500 887500 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>;
+			opp-microvolt-L7 = <975000 975000 1100000>;
+			opp-microvolt-L8 = <962500 962500 1100000>;
+			opp-microvolt-L9 = <950000 950000 1100000>;
+			opp-microvolt-L10 = <937500 937500 1100000>;
+			opp-microvolt-L11 = <925000 925000 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>;
+			opp-microvolt-L7 = <1012500 1012500 1100000>;
+			opp-microvolt-L8 = <1000000 1000000 1100000>;
+			opp-microvolt-L9 = <987500 987500 1100000>;
+			opp-microvolt-L10 = <975000 975000 1100000>;
+			opp-microvolt-L11 = <962500 962500 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";
+	};
+
+	dmc: dmc {
+		compatible = "rockchip,rk3528-dmc";
+		interrupts = <GIC_SPI 17 IRQ_TYPE_LEVEL_HIGH>;
+		interrupt-names = "complete";
+		devfreq-events = <&dfi>;
+		clocks = <&scmi_clk SCMI_CLK_DDR>;
+		clock-names = "dmc_clk";
+		operating-points-v2 = <&dmc_opp_table>;
+		upthreshold = <40>;
+		downdifferential = <20>;
+		system-status-level = <
+			/* system status	freq level */
+			SYS_STATUS_NORMAL	DMC_FREQ_LEVEL_HIGH
+		>;
+		auto-min-freq = <324000>;
+		auto-freq-en = <0>;
+		status = "disabled";
+	};
+
+	dmc_opp_table: dmc-opp-table {
+		compatible = "operating-points-v2";
+
+		mbist-vmin = <850000 900000>;
+		nvmem-cells = <&log_leakage>, <&dmc_opp_info>, <&logic_mbist_vmin>;
+		nvmem-cell-names = "leakage", "opp-info", "mbist-vmin";
+
+		rockchip,temp-hysteresis = <5000>;
+		rockchip,low-temp = <10000>;
+		rockchip,low-temp-min-volt = <900000>;
+
+		rockchip,leakage-voltage-sel = <
+			1   10   0
+			11  14   1
+			15  22   2
+			23  28   3
+			29  254  4
+		>;
+
+		opp-920000000 {
+			opp-hz = /bits/ 64 <920000000>;
+			opp-microvolt = <850000 850000 1000000>;
+		};
+		opp-1056000000 {
+			opp-hz = /bits/ 64 <1056000000>;
+			opp-microvolt = <850000 850000 1000000>;
+			opp-microvolt-L0 = <875000 875000 1000000>;
+			opp-microvolt-L1 = <850000 850000 1000000>;
+			opp-microvolt-L2 = <850000 850000 1000000>;
+			opp-microvolt-L3 = <850000 850000 1000000>;
+			opp-microvolt-L4 = <850000 850000 1000000>;
+		};
+		opp-1184000000 {
+			opp-hz = /bits/ 64 <1184000000>;
+			opp-microvolt = <900000 900000 1000000>;
+			opp-microvolt-L0 = <950000 950000 1000000>;
+			opp-microvolt-L1 = <925000 925000 1000000>;
+			opp-microvolt-L2 = <900000 900000 1000000>;
+			opp-microvolt-L3 = <875000 875000 1000000>;
+			opp-microvolt-L4 = <862500 862500 1000000>;
+			status = "disabled";
+		};
+	};
+
+	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>;
+
+				assigned-clocks = <&scmi_clk SCMI_CLK_CPU>;
+				assigned-clock-rates = <1200000000>;
+			};
+		};
+	};
+
+	mpp_srv: mpp-srv {
+		compatible = "rockchip,mpp-service";
+		rockchip,taskqueue-count = <5>;
+		rockchip,resetgroup-count = <5>;
+		rockchip,grf = <&grf>;
+		rockchip,grf-mem-offset = <0x20010>, <0x40034>, <0x40034>,
+					  <0x600e0>, <0x600e0>;
+		rockchip,grf-mem-on-values =  <0x00000021>, <0x0f040000>, <0x0f040000>,
+					      <0xf0040000>, <0xf0040000>;
+		rockchip,grf-mem-off-values = <0xffff0021>, <0x0f040f04>, <0x0f040f04>,
+					      <0xf004f004>, <0xf004f004>;
+		rockchip,grf-names = "grf_rkvenc2", "grf_vdpu1", "grf_vdpu2",
+				     "grf_iep2", "grf_vdpp";
+		status = "disabled";
+	};
+
+	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";
+		rockchip,polling-delay = <200>; /* milliseconds */
+		rockchip,temp-hysteresis = <5000>; /* millicelsius */
+		rockchip,offline-cpu-temp = <105000>; /* millicelsius */
+		rockchip,temp-offline-cpus = "2-3";
+	};
+
+	thermal_zones: thermal-zones {
+		soc_thermal: soc-thermal {
+			polling-delay-passive = <20>; /* milliseconds */
+			polling-delay = <1000>; /* milliseconds */
+			sustainable-power = <638>; /* milliwatts */
+
+			thermal-sensors = <&tsadc 0>;
+
+			trips {
+				threshold: trip-point-0 {
+					temperature = <95000>;
+					hysteresis = <2000>;
+					type = "passive";
+				};
+				target: trip-point-1 {
+					temperature = <110000>;
+					hysteresis = <2000>;
+					type = "passive";
+				};
+				soc_crit: soc-crit {
+					temperature = <120000>; /* millicelsius */
+					hysteresis = <2000>; /* millicelsius */
+					type = "critical";
+				};
+			};
+
+			cooling-maps {
+				map0 {
+					trip = <&target>;
+					cooling-device =
+						<&cpu0 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>;
+					contribution = <1024>;
+				};
+				map1 {
+					trip = <&target>;
+					cooling-device =
+						<&gpu THERMAL_NO_LIMIT THERMAL_NO_LIMIT>;
+					contribution = <1024>;
+				};
+			};
+
+		};
+	};
+
+	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>;
+	};
+
+	sram: sram@fe480000 {
+		compatible = "mmio-sram";
+		reg = <0x0 0xfe480000 0x0 0xc000>;
+
+		#address-cells = <1>;
+		#size-cells = <1>;
+		ranges = <0x0 0x0 0xfe480000 0xc000>;
+
+		/* start address and size should be 4k algin */
+		rkvdec_sram: rkvdec-sram@0 {
+			reg = <0x0 0xc000>;
+		};
+	};
+
+	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>;
+		priority-init = <0x202>;
+	};
+
+	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 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>,
+			<&cru ACLK_VO_ROOT>,
+			<&cru ACLK_VPU_ROOT>,
+			<&cru ACLK_VPU_L_ROOT>;
+
+		assigned-clock-rates =
+			<32768>,
+			<1188000000>,
+			<1000000000>,
+			<996000000>,
+			<250000000>,
+			<500000000>,
+			<50000000>,
+			<100000000>,
+			<150000000>,
+			<200000000>,
+			<300000000>,
+			<340000000>,
+			<400000000>,
+			<600000000>,
+			<50000000>,
+			<100000000>,
+			<125000000>,
+			<500000000>,
+			<340000000>,
+			<300000000>,
+			<200000000>;
+	};
+
+	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>;
+				pm_qos = <&qos_vdpp>;
+			};
+			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>;
+		#cooling-cells = <2>;
+		rockchip,grf = <&grf>;
+		status = "disabled";
+
+		gpu_power_model: power-model {
+			compatible = "simple-power-model";
+			leakage-range= <1 3>;
+			ls = <(-15658) 67354 0>;
+			static-coefficient = <10000>;
+			dynamic-coefficient = <724>;
+			ts = <3156546 120154 (-2506) 39>;
+			thermal-zone = "soc-thermal";
+		};
+	};
+
+	gpu_opp_table: gpu-opp-table {
+		compatible = "operating-points-v2";
+
+		mbist-vmin = <825000 925000>;
+		nvmem-cells = <&gpu_leakage>, <&gpu_opp_info>, <&gpu_mbist_vmin>;
+		nvmem-cell-names = "leakage", "opp-info", "mbist-vmin";
+
+		rockchip,pvtm-voltage-sel = <
+			0	750	0
+			751	770	1
+			771	790	2
+			791	810	3
+			811	830	4
+			831	850	5
+			851	870	6
+			871	890	7
+			891	9999	8
+		>;
+		rockchip,pvtm-pvtpll;
+		rockchip,pvtm-offset = <0x10018>;
+		rockchip,pvtm-sample-time = <1100>;
+		rockchip,pvtm-freq = <800000>;
+		rockchip,pvtm-volt = <900000>;
+		rockchip,pvtm-ref-temp = <40>;
+		rockchip,pvtm-temp-prop = <0 0>;
+		rockchip,pvtm-thermal-zone = "soc-thermal";
+		rockchip,grf = <&grf>;
+		rockchip,temp-hysteresis = <5000>;
+		rockchip,low-temp = <10000>;
+		rockchip,low-temp-min-volt = <900000>;
+
+		opp-300000000 {
+			opp-hz = /bits/ 64 <300000000>;
+			opp-microvolt = <875000 875000 1000000>;
+			opp-microvolt-L5 = <850000 850000 1000000>;
+			opp-microvolt-L6 = <837500 837500 1000000>;
+			opp-microvolt-L7 = <825000 825000 1000000>;
+			opp-microvolt-L8 = <825000 825000 1000000>;
+		};
+		opp-500000000 {
+			opp-hz = /bits/ 64 <500000000>;
+			opp-microvolt = <875000 875000 1000000>;
+			opp-microvolt-L5 = <850000 850000 1000000>;
+			opp-microvolt-L6 = <837500 837500 1000000>;
+			opp-microvolt-L7 = <825000 825000 1000000>;
+			opp-microvolt-L8 = <825000 825000 1000000>;
+		};
+		opp-600000000 {
+			opp-hz = /bits/ 64 <600000000>;
+			opp-microvolt = <875000 875000 1000000>;
+			opp-microvolt-L5 = <850000 850000 1000000>;
+			opp-microvolt-L6 = <837500 837500 1000000>;
+			opp-microvolt-L7 = <825000 825000 1000000>;
+			opp-microvolt-L8 = <825000 825000 1000000>;
+		};
+		opp-700000000 {
+			opp-hz = /bits/ 64 <700000000>;
+			opp-microvolt = <900000 900000 1000000>;
+			opp-microvolt-L1 = <887500 887500 1000000>;
+			opp-microvolt-L2 = <875000 875000 1000000>;
+			opp-microvolt-L3 = <875000 875000 1000000>;
+			opp-microvolt-L4 = <875000 875000 1000000>;
+			opp-microvolt-L5 = <850000 850000 1000000>;
+			opp-microvolt-L6 = <837500 837500 1000000>;
+			opp-microvolt-L7 = <825000 825000 1000000>;
+			opp-microvolt-L8 = <825000 825000 1000000>;
+			clock-latency-ns = <40000>;
+		};
+		opp-800000000 {
+			opp-hz = /bits/ 64 <800000000>;
+			opp-microvolt = <950000 950000 1000000>;
+			opp-microvolt-L1 = <937500 937500 1000000>;
+			opp-microvolt-L2 = <925000 925000 1000000>;
+			opp-microvolt-L3 = <912500 912500 1000000>;
+			opp-microvolt-L4 = <900000 900000 1000000>;
+			opp-microvolt-L5 = <887500 887500 1000000>;
+			opp-microvolt-L6 = <875000 875000 1000000>;
+			opp-microvolt-L7 = <862500 862500 1000000>;
+			opp-microvolt-L8 = <850000 850000 1000000>;
+			clock-latency-ns = <40000>;
+		};
+	};
+
+	gpu_bus: gpu-bus {
+		compatible = "rockchip,rk3528-bus";
+		rockchip,busfreq-policy = "clkfreq";
+		clocks = <&scmi_clk SCMI_CLK_GPU>;
+		clock-names = "bus";
+		operating-points-v2 = <&gpu_bus_opp_table>;
+		status = "disabled";
+	};
+
+	gpu_bus_opp_table: gpu-bus-opp-table {
+		compatible = "operating-points-v2";
+
+		nvmem-cells = <&log_leakage>;
+		nvmem-cell-names = "leakage";
+
+		rockchip,leakage-voltage-sel = <
+			1   22   0
+			23  254  1
+		>;
+
+		opp-700000000 {
+			opp-hz = /bits/ 64 <700000000>;
+			opp-microvolt = <850000 850000 1000000>;
+		};
+		opp-800000000 {
+			opp-hz = /bits/ 64 <800000000>;
+			opp-microvolt = <875000 875000 1000000>;
+			opp-microvolt-L1 = <850000 850000 1000000>;
+		};
+	};
+
+	rkvdec: rkvdec@ff740100 {
+		compatible = "rockchip,rkv-decoder-rk3528", "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";
+		iommus = <&rkvdec_mmu>;
+		rockchip,srv = <&mpp_srv>;
+		rockchip,taskqueue-node = <0>;
+		rockchip,resetgroup-node = <0>;
+		rockchip,task-capacity = <16>;
+		rockchip,sram = <&rkvdec_sram>;
+		/* rcb_iova: start and size */
+		rockchip,rcb-iova = <0x10000000 65536>;
+		rockchip,rcb-min-width = <512>;
+		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";
+		#iommu-cells = <0>;
+		rockchip,shootdown-entire;
+		rockchip,master-handle-irq;
+		status = "disabled";
+	};
+
+	rkvenc: rkvenc@ff780000 {
+		compatible = "rockchip,rkv-encoder-rk3528", "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>;
+		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";
+		#iommu-cells = <0>;
+		rockchip,shootdown-entire;
+		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";
+		rockchip,normal-rates = <300000000>, <0>;
+		assigned-clocks = <&cru ACLK_VPU>;
+		assigned-clock-rates = <300000000>;
+		resets = <&cru SRST_ARESETN_VPU>, <&cru SRST_HRESETN_VPU>;
+		reset-names = "shared_video_a", "shared_video_h";
+		iommus = <&vdpu_mmu>;
+		rockchip,srv = <&mpp_srv>;
+		rockchip,taskqueue-node = <2>;
+		rockchip,resetgroup-node = <2>;
+		rockchip,disable-auto-freq;
+		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>;
+		#iommu-cells = <0>;
+		rockchip,shootdown-entire;
+		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";
+		rockchip,normal-rates = <300000000>, <0>;
+		assigned-clocks = <&cru ACLK_VPU>;
+		assigned-clock-rates = <300000000>;
+		resets = <&cru SRST_ARESETN_VPU>, <&cru SRST_HRESETN_VPU>;
+		reset-names = "shared_video_a", "shared_video_h";
+		iommus = <&vdpu_mmu>;
+		rockchip,srv = <&mpp_srv>;
+		rockchip,taskqueue-node = <2>;
+		rockchip,resetgroup-node = <2>;
+		rockchip,disable-auto-freq;
+		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 = <&inno_hdmiphy_clk>;
+		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>;
+		rockchip,grf = <&grf>;
+		rockchip,grf-offset = <0x600e0>;
+		rockchip,grf-values = <0x0ff10000>, <0x0ff10ff1>;
+		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>;
+		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>;
+		rockchip,shootdown-entire;
+		rockchip,disable-mmu-reset;
+		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>;
+		rockchip,disable-auto-freq;
+		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,normal-rates = <340000000>, <0>;
+		assigned-clocks = <&cru ACLK_JPEG_DECODER>;
+		assigned-clock-rates = <340000000>;
+		rockchip,disable-auto-freq;
+		resets = <&cru SRST_ARESETN_JPEG_DECODER>, <&cru SRST_HRESETN_JPEG_DECODER>;
+		reset-names = "video_a", "video_h";
+		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>;
+		#iommu-cells = <0>;
+		rockchip,shootdown-entire;
+		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 = <0x0ff80006>;
+		rockchip,lumafilter1 = <0x00090010>;
+		rockchip,lumafilter2 = <0x0ffb0fd8>;
+		rockchip,lumafilter3 = <0x00080057>;
+		rockchip,lumafilter4 = <0x0fef0f64>;
+		rockchip,lumafilter5 = <0x0016010a>;
+		rockchip,lumafilter6 = <0x0f830df7>;
+		rockchip,lumafilter7 = <0x08de055f>;
+		rockchip,tve-upsample = <DCLK_UPSAMPLEx4>;
+		rockchip,grf = <&grf>;
+		nvmem-cells = <&vdac_out_current>, <&test_version>;
+		nvmem-cell-names = "out-current", "version";
+		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>;
+		interrupt-names = "hdmi", "hdmi_wakeup";
+		clocks = <&cru PCLK_HDMI>,
+			 <&cru CLK_SFR_HDMI>,
+			 <&cru CLK_CEC_HDMI>,
+			 <&inno_hdmiphy_clk>;
+		clock-names = "iahb", "isfr", "cec", "dclk_vop";
+		ddc-i2c-scl-high-time-ns = <9625>;
+		ddc-i2c-scl-low-time-ns = <10000>;
+		reg-io-width = <4>;
+		rockchip,grf = <&grf>;
+		pinctrl-names = "default", "idle";
+		pinctrl-0 = <&hdmi_pins>;
+		pinctrl-1 = <&hdmi_pins_idle>;
+		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";
+				};
+			};
+		};
+	};
+
+	dfi: dfi@ff930000 {
+		reg = <0x0 0xff930000 0x0 0x400>;
+		compatible = "rockchip,rk3528-dfi";
+		rockchip,grf = <&grf>;
+		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>, <&cru SCLK_IN_SPI0>;
+		clock-names = "spiclk", "apb_pclk", "sclk_in";
+		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>, <&cru SCLK_IN_SPI1>;
+		clock-names = "spiclk", "apb_pclk", "sclk_in";
+		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";
+		resets = <&cru SRST_PRESETN_WDT_NS>;
+		reset-names = "reset";
+		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";
+		assigned-clocks = <&cru MCLK_SAI_I2S3>;
+		assigned-clock-rates = <6144000>;
+		dmas = <&dmac 5>;
+		dma-names = "tx";
+		resets = <&cru SRST_MRESETN_SAI_I2S3>, <&cru SRST_HRESETN_SAI_I2S3>;
+		reset-names = "m", "h";
+		rockchip,always-on;
+		#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_lrck
+			     &i2s0m0_sclk
+			     &i2s0m0_sdi
+			     &i2s0m0_sdo>;
+		#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_sclk
+			     &i2s1_lrck
+			     &i2s1_sdi0
+			     &i2s1_sdi1
+			     &i2s1_sdi2
+			     &i2s1_sdi3
+			     &i2s1_sdo0
+			     &i2s1_sdo1
+			     &i2s1_sdo2
+			     &i2s1_sdo3>;
+		#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;
+		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>;
+		};
+		cpu_mbist_vmin: cpu-mbist-vmin@9 {
+			reg = <0x09 0x1>;
+			bits = <0 3>;
+		};
+		gpu_mbist_vmin: gpu-mbist-vmin@9 {
+			reg = <0x09 0x1>;
+			bits = <3 2>;
+		};
+		logic_mbist_vmin: logic-mbist-vmin@9 {
+			reg = <0x09 0x1>;
+			bits = <5 2>;
+		};
+		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>;
+		};
+		test_version: test-version@29 {
+			reg = <0x29 0x1>;
+		};
+		macphy_bgs: macphy-bgs@2d {
+			reg = <0x2d 0x1>;
+		};
+		macphy_txlevel: macphy-txlevel@2e {
+			reg = <0x2e 0x2>;
+		};
+		vdac_out_current: vdac-out-current@30 {
+			reg = <0x30 0x1>;
+		};
+		cpu_opp_info: cpu-opp-info@32 {
+			reg = <0x32 0x6>;
+		};
+		gpu_opp_info: gpu-opp-info@38 {
+			reg = <0x38 0x6>;
+		};
+		dmc_opp_info: dmc-opp-info@3e {
+			reg = <0x3e 0x6>;
+		};
+	};
+
+	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";
+		status = "disabled";
+
+		inno_hdmiphy_clk: clk-port {
+			#clock-cells = <0>;
+			clock-output-names = "clk_hdmiphy_pixel_io";
+			status = "okay";
+		};
+	};
+
+	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/kernel/arch/arm64/boot/dts/rockchip/rk3566-box.dtsi b/kernel/arch/arm64/boot/dts/rockchip/rk3566-box.dtsi
index 36f43fe..471782c 100644
--- a/kernel/arch/arm64/boot/dts/rockchip/rk3566-box.dtsi
+++ b/kernel/arch/arm64/boot/dts/rockchip/rk3566-box.dtsi
@@ -32,6 +32,27 @@
 		};
 	};
 
+	bt_sco: bt-sco {
+		status = "disabled";
+		compatible = "delta,dfbmcs320";
+		#sound-dai-cells = <1>;
+	};
+
+	bt_sound: bt-sound {
+		status = "disabled";
+		compatible = "simple-audio-card";
+		simple-audio-card,format = "dsp_a";
+		simple-audio-card,bitclock-inversion = <0>;
+		simple-audio-card,mclk-fs = <256>;
+		simple-audio-card,name = "rockchip,bt";
+		simple-audio-card,cpu {
+			sound-dai = <&i2s2_2ch>;
+		};
+		simple-audio-card,codec {
+			sound-dai = <&bt_sco 1>;
+		};
+	};
+
 	dc_12v: dc-12v {
 		compatible = "regulator-fixed";
 		regulator-name = "dc_12v";
@@ -215,6 +236,12 @@
 		     &i2s1m0_sdo0>;
 };
 
+&i2s2_2ch {
+	pinctrl-0 = <&i2s2m0_sclktx &i2s2m0_lrcktx &i2s2m0_sdi &i2s2m0_sdo>;
+	rockchip,bclk-fs = <32>;
+	status = "disabled";
+};
+
 &iep {
 	status = "okay";
 };
diff --git a/kernel/arch/arm64/boot/dts/rockchip/rk3566-eink.dtsi b/kernel/arch/arm64/boot/dts/rockchip/rk3566-eink.dtsi
index 400aba7..cf4f9f8 100644
--- a/kernel/arch/arm64/boot/dts/rockchip/rk3566-eink.dtsi
+++ b/kernel/arch/arm64/boot/dts/rockchip/rk3566-eink.dtsi
@@ -14,7 +14,7 @@
 		};
 
 		display_reserved: framebuffer@10900000 {
-			reg = <0x0 0x10900000 0x0 0x3000000>;
+			reg = <0x0 0x10900000 0x0 0x3300000>;
 		};
 	};
 
diff --git a/kernel/arch/arm64/boot/dts/rockchip/rk3566-evb1-ddr4-v10.dts b/kernel/arch/arm64/boot/dts/rockchip/rk3566-evb1-ddr4-v10.dts
index f602ed9..55e31aa 100644
--- a/kernel/arch/arm64/boot/dts/rockchip/rk3566-evb1-ddr4-v10.dts
+++ b/kernel/arch/arm64/boot/dts/rockchip/rk3566-evb1-ddr4-v10.dts
@@ -5,3 +5,15 @@
 
 #include "rk3566-evb1-ddr4-v10.dtsi"
 #include "rk3568-android.dtsi"
+
+&bt_sco {
+	status = "okay";
+};
+
+&bt_sound {
+	status = "okay";
+};
+
+&i2s3_2ch {
+	status = "okay";
+};
diff --git a/kernel/arch/arm64/boot/dts/rockchip/rk3566-evb1-ddr4-v10.dtsi b/kernel/arch/arm64/boot/dts/rockchip/rk3566-evb1-ddr4-v10.dtsi
index 92ea490..037cb76 100644
--- a/kernel/arch/arm64/boot/dts/rockchip/rk3566-evb1-ddr4-v10.dtsi
+++ b/kernel/arch/arm64/boot/dts/rockchip/rk3566-evb1-ddr4-v10.dtsi
@@ -25,13 +25,6 @@
 		vin-supply = <&dc_12v>;
 	};
 
-	rk_headset: rk-headset {
-		compatible = "rockchip_headset";
-		headset_gpio = <&gpio3 RK_PA1 GPIO_ACTIVE_LOW>;
-		pinctrl-names = "default";
-		pinctrl-0 = <&hp_det>;
-	};
-
 	vcc3v3_vga: vcc3v3-vga {
 		compatible = "regulator-fixed";
 		regulator-name = "vcc3v3_vga";
@@ -54,6 +47,13 @@
 	};
 };
 
+&bt_sound {
+	status = "disabled";
+	simple-audio-card,cpu {
+		sound-dai = <&i2s2_2ch>;
+	};
+};
+
 &audiopwmout_diff {
 	status = "disabled";
 };
@@ -67,11 +67,11 @@
 };
 
 &csi2_dphy_hw {
-	status = "okay";
+	status = "disabled";
 };
 
 &csi2_dphy1 {
-	status = "okay";
+	status = "disabled";
 
 	/*
 	 * dphy1 only used for split mode,
@@ -108,7 +108,7 @@
 };
 
 &csi2_dphy2 {
-	status = "okay";
+	status = "disabled";
 
 	/*
 	 * dphy2 only used for split mode,
@@ -160,7 +160,7 @@
  * when dsi0 is enabled
  */
 &dsi0 {
-	status = "okay";
+	status = "disabled";
 };
 
 &dsi0_in_vp0 {
@@ -168,7 +168,7 @@
 };
 
 &dsi0_in_vp1 {
-	status = "okay";
+	status = "disabled";
 };
 
 &dsi0_panel {
@@ -216,6 +216,33 @@
 
 &edp_in_vp1 {
 	status = "disabled";
+};
+
+&gmac1 {
+	phy-mode = "rgmii";
+	clock_in_out = "output";
+
+	snps,reset-gpio = <&gpio3 RK_PB0 GPIO_ACTIVE_LOW>;
+	snps,reset-active-low;
+	/* Reset time is 20ms, 100ms for rtl8211f */
+	snps,reset-delays-us = <0 20000 100000>;
+
+	assigned-clocks = <&cru SCLK_GMAC1_RX_TX>, <&cru SCLK_GMAC1>;
+	assigned-clock-parents = <&cru SCLK_GMAC1_RGMII_SPEED>, <&cru CLK_MAC1_2TOP>;
+	assigned-clock-rates = <0>, <125000000>;
+
+	pinctrl-names = "default";
+	pinctrl-0 = <&gmac1m1_miim
+		     &gmac1m1_tx_bus2
+		     &gmac1m1_rx_bus2
+		     &gmac1m1_rgmii_clk
+		     &gmac1m1_rgmii_bus>;
+
+	tx_delay = <0x4f>;
+	rx_delay = <0x26>;
+
+	phy-handle = <&rgmii_phy1>;
+	status = "okay";
 };
 
 /*
@@ -280,6 +307,12 @@
 	};
 };
 
+&i2s2_2ch {
+	pinctrl-0 = <&i2s2m1_sclktx &i2s2m1_lrcktx &i2s2m1_sdi &i2s2m1_sdo>;
+	rockchip,bclk-fs = <32>;
+	status = "disabled";
+};
+
 &i2s3_2ch {
 	status = "disabled";
 };
@@ -318,7 +351,7 @@
 };
 
 &video_phy0 {
-	status = "okay";
+	status = "disabled";
 };
 
 &video_phy1 {
@@ -368,15 +401,15 @@
 };
 
 &rkisp {
-	status = "okay";
+	status = "disabled";
 };
 
 &rkisp_mmu {
-	status = "okay";
+	status = "disabled";
 };
 
 &rkisp_vir0 {
-	status = "okay";
+	status = "disabled";
 
 	port {
 		#address-cells = <1>;
@@ -390,7 +423,7 @@
 };
 
 &route_dsi0 {
-	status = "okay";
+	status = "disabled";
 	connect = <&vp1_out_dsi0>;
 };
 
@@ -443,6 +476,9 @@
 	WIFI,host_wake_irq = <&gpio3 RK_PD4 GPIO_ACTIVE_HIGH>;
 };
 
+&work_led {
+	gpios = <&gpio2 RK_PB2 GPIO_ACTIVE_HIGH>;
+};
 
 &pinctrl {
 	cam {
@@ -450,12 +486,6 @@
 			rockchip,pins =
 				/* camera power en */
 				<0 RK_PC1 RK_FUNC_GPIO &pcfg_pull_none>;
-		};
-	};
-
-	headphone {
-		hp_det: hp-det {
-			rockchip,pins = <3 RK_PA1 RK_FUNC_GPIO &pcfg_pull_down>;
 		};
 	};
 
diff --git a/kernel/arch/arm64/boot/dts/rockchip/rk3566-evb2-lp4x-v10-linux.dts b/kernel/arch/arm64/boot/dts/rockchip/rk3566-evb2-lp4x-v10-linux.dts
index 1df8e34..957a99b 100644
--- a/kernel/arch/arm64/boot/dts/rockchip/rk3566-evb2-lp4x-v10-linux.dts
+++ b/kernel/arch/arm64/boot/dts/rockchip/rk3566-evb2-lp4x-v10-linux.dts
@@ -6,13 +6,3 @@
 
 #include "rk3566-evb2-lp4x-v10.dtsi"
 #include "rk3568-linux.dtsi"
-#include <dt-bindings/display/rockchip_vop.h>
-
-&vp0 {
-	cursor-win-id = <ROCKCHIP_VOP2_CLUSTER0>;
-};
-
-&vp1 {
-	cursor-win-id = <ROCKCHIP_VOP2_CLUSTER1>;
-};
-
diff --git a/kernel/arch/arm64/boot/dts/rockchip/rk3566-evb2-lp4x-v10.dtsi b/kernel/arch/arm64/boot/dts/rockchip/rk3566-evb2-lp4x-v10.dtsi
index 2c9361e..7550829 100644
--- a/kernel/arch/arm64/boot/dts/rockchip/rk3566-evb2-lp4x-v10.dtsi
+++ b/kernel/arch/arm64/boot/dts/rockchip/rk3566-evb2-lp4x-v10.dtsi
@@ -16,13 +16,6 @@
 	model = "Rockchip RK3566 EVB2 LP4X V10 Board";
 	compatible = "rockchip,rk3566-evb2-lp4x-v10", "rockchip,rk3566";
 
-	rk_headset: rk-headset {
-		compatible = "rockchip_headset";
-		headset_gpio = <&gpio3 RK_PA1 GPIO_ACTIVE_LOW>;
-		pinctrl-names = "default";
-		pinctrl-0 = <&hp_det>;
-	};
-
 	vcc_camera: vcc-camera-regulator {
 		compatible = "regulator-fixed";
 		gpio = <&gpio0 RK_PC1 GPIO_ACTIVE_HIGH>;
@@ -43,6 +36,13 @@
 		gpio = <&gpio0 RK_PC2 GPIO_ACTIVE_HIGH>;
 		startup-delay-us = <5000>;
 		vin-supply = <&dc_12v>;
+	};
+};
+
+&bt_sound {
+	status = "disabled";
+	simple-audio-card,cpu {
+		sound-dai = <&i2s2_2ch>;
 	};
 };
 
@@ -369,6 +369,12 @@
 	};
 };
 
+&i2s2_2ch {
+	pinctrl-0 = <&i2s2m0_sclktx &i2s2m0_lrcktx &i2s2m0_sdi &i2s2m0_sdo>;
+	rockchip,bclk-fs = <32>;
+	status = "disabled";
+};
+
 &mdio1 {
 	rgmii_phy0: phy@0 {
 		compatible = "ethernet-phy-ieee802.3-c22";
@@ -439,12 +445,6 @@
 			rockchip,pins =
 				/* camera power en */
 				<0 RK_PC1 RK_FUNC_GPIO &pcfg_pull_none>;
-		};
-	};
-
-	headphone {
-		hp_det: hp-det {
-			rockchip,pins = <3 RK_PA1 RK_FUNC_GPIO &pcfg_pull_down>;
 		};
 	};
 
@@ -594,6 +594,9 @@
 	WIFI,host_wake_irq = <&gpio2 RK_PB2 GPIO_ACTIVE_HIGH>;
 };
 
+&work_led {
+	gpios = <&gpio0 RK_PB7 GPIO_ACTIVE_HIGH>;
+};
 
 &wireless_bluetooth {
 	compatible = "bluetooth-platdata";
diff --git a/kernel/arch/arm64/boot/dts/rockchip/rk3566-evb3-ddr3-v10.dtsi b/kernel/arch/arm64/boot/dts/rockchip/rk3566-evb3-ddr3-v10.dtsi
index 740ee86..c57602c 100644
--- a/kernel/arch/arm64/boot/dts/rockchip/rk3566-evb3-ddr3-v10.dtsi
+++ b/kernel/arch/arm64/boot/dts/rockchip/rk3566-evb3-ddr3-v10.dtsi
@@ -44,6 +44,13 @@
 	};
 };
 
+&bt_sound {
+	status = "disabled";
+	simple-audio-card,cpu {
+		sound-dai = <&i2s2_2ch>;
+	};
+};
+
 &combphy1_usq {
 	status = "okay";
 };
@@ -263,6 +270,12 @@
 };
 
 &i2s1_8ch {
+	status = "disabled";
+};
+
+&i2s2_2ch {
+	pinctrl-0 = <&i2s2m0_sclktx &i2s2m0_lrcktx &i2s2m0_sdi &i2s2m0_sdo>;
+	rockchip,bclk-fs = <32>;
 	status = "disabled";
 };
 
@@ -493,3 +506,6 @@
 	WIFI,host_wake_irq = <&gpio2 RK_PB2 GPIO_ACTIVE_HIGH>;
 };
 
+&work_led {
+	gpios = <&gpio0 RK_PD3 GPIO_ACTIVE_HIGH>;
+};
diff --git a/kernel/arch/arm64/boot/dts/rockchip/rk3566-evb5-lp4x-v10.dtsi b/kernel/arch/arm64/boot/dts/rockchip/rk3566-evb5-lp4x-v10.dtsi
index ed52312..55bfa76 100644
--- a/kernel/arch/arm64/boot/dts/rockchip/rk3566-evb5-lp4x-v10.dtsi
+++ b/kernel/arch/arm64/boot/dts/rockchip/rk3566-evb5-lp4x-v10.dtsi
@@ -47,6 +47,13 @@
 	status = "disabled";
 };
 
+&bt_sound {
+	status = "disabled";
+	simple-audio-card,cpu {
+		sound-dai = <&i2s2_2ch>;
+	};
+};
+
 &combphy1_usq {
 	status = "okay";
 };
@@ -169,6 +176,12 @@
 	status = "disabled";
 };
 
+&i2s2_2ch {
+	pinctrl-0 = <&i2s2m0_sclktx &i2s2m0_lrcktx &i2s2m0_sdi &i2s2m0_sdo>;
+	rockchip,bclk-fs = <32>;
+	status = "disabled";
+};
+
 &i2s3_2ch {
 	status = "disabled";
 };
@@ -280,6 +293,9 @@
 	status = "disabled";
 };
 
+&work_led {
+	status = "disabled";
+};
 
 &pinctrl {
 	headphone {
diff --git a/kernel/arch/arm64/boot/dts/rockchip/rk3566.dtsi b/kernel/arch/arm64/boot/dts/rockchip/rk3566.dtsi
index 60c299e..eeb3945 100644
--- a/kernel/arch/arm64/boot/dts/rockchip/rk3566.dtsi
+++ b/kernel/arch/arm64/boot/dts/rockchip/rk3566.dtsi
@@ -38,7 +38,7 @@
 };
 
 &rkisp {
-	rockchip,iq-feature = /bits/ 64 <0x3FBF7FE67FF>;
+	rockchip,iq-feature = /bits/ 64 <0x1BFBF7FE67FF>;
 };
 
 &usbdrd_dwc3 {
@@ -54,6 +54,7 @@
 /delete-node/ &gmac0_clkin;
 /delete-node/ &gmac0_xpcsclk;
 /delete-node/ &gmac0;
+/delete-node/ &gmac_uio0;
 /delete-node/ &pcie30_phy_grf;
 /delete-node/ &pcie30phy;
 /delete-node/ &pcie3x1;
diff --git a/kernel/arch/arm64/boot/dts/rockchip/rk3568-amp.dtsi b/kernel/arch/arm64/boot/dts/rockchip/rk3568-amp.dtsi
index 7eb6ffd..4f75dec 100644
--- a/kernel/arch/arm64/boot/dts/rockchip/rk3568-amp.dtsi
+++ b/kernel/arch/arm64/boot/dts/rockchip/rk3568-amp.dtsi
@@ -7,7 +7,8 @@
 	rockchip_amp: rockchip-amp {
 		compatible = "rockchip,rk3568-amp";
 		clocks = <&cru SCLK_UART4>, <&cru PCLK_UART4>,
-			<&cru PCLK_TIMER>, <&cru CLK_TIMER4>, <&cru CLK_TIMER5>;
+			 <&cru PCLK_TIMER>, <&cru CLK_TIMER4>, <&cru CLK_TIMER5>,
+			 <&cru ACLK_MCU>;
 		clock-names = "baudclk", "apb_pclk", "pclk", "timer";
 		assigned-clocks = <&cru SCLK_UART4>,
 				<&cru CLK_TIMER4>,
@@ -60,6 +61,12 @@
 			reg = <0x0 0x8000000 0x0 0x100000>;
 			no-map;
 		};
+
+		/* mcu address */
+		mcu_reserved: mcu@8200000 {
+			reg = <0x0 0x8200000 0x0 0x100000>;
+			no-map;
+		};
 	};
 };
 
diff --git a/kernel/arch/arm64/boot/dts/rockchip/rk3568-android.dtsi b/kernel/arch/arm64/boot/dts/rockchip/rk3568-android.dtsi
index 67a6953..12e9c2d 100644
--- a/kernel/arch/arm64/boot/dts/rockchip/rk3568-android.dtsi
+++ b/kernel/arch/arm64/boot/dts/rockchip/rk3568-android.dtsi
@@ -6,7 +6,7 @@
 
 / {
 	chosen: chosen {
-		bootargs = "earlycon=uart8250,mmio32,0xfe660000 console=ttyFIQ0 root=PARTUUID=614e0000-0000 rw rootwait net.ifnames=0";
+		bootargs = "earlycon=uart8250,mmio32,0xfe660000 console=ttyFIQ0 root=PARTUUID=614e0000-0000 rw rootwait net.ifnames=0 isolcpus=3 nohz_full=3";
 	};
 
 	aliases {
diff --git a/kernel/arch/arm64/boot/dts/rockchip/rk3568-dram-default-timing.dtsi b/kernel/arch/arm64/boot/dts/rockchip/rk3568-dram-default-timing.dtsi
index 99247fb..abe5eb1 100644
--- a/kernel/arch/arm64/boot/dts/rockchip/rk3568-dram-default-timing.dtsi
+++ b/kernel/arch/arm64/boot/dts/rockchip/rk3568-dram-default-timing.dtsi
@@ -94,7 +94,7 @@
 		standby_idle = <0>;
 		pd_dis_freq = <1066>;
 		sr_dis_freq = <800>;
-		dram_dll_dis_freq = <625>;
+		dram_dll_dis_freq = <500>;
 		phy_dll_dis_freq = <IGNORE_THIS>;
 		/* drv when odt on */
 		phy_dq_drv_odten = <37>;
@@ -393,7 +393,7 @@
 		lp4_dq_vref_odten = <228>;
 		lp4_ca_vref_odten = <343>;
 		/* lp4 vref info when odt disable */
-		phy_lp4_dq_vref_odtoff = <420>;
+		phy_lp4_dq_vref_odtoff = <245>;
 		lp4_dq_vref_odtoff = <420>;
 		lp4_ca_vref_odtoff = <343>;
 	};
diff --git a/kernel/arch/arm64/boot/dts/rockchip/rk3568-evb.dtsi b/kernel/arch/arm64/boot/dts/rockchip/rk3568-evb.dtsi
old mode 100755
new mode 100644
index 4063bc3..f5802f1
--- a/kernel/arch/arm64/boot/dts/rockchip/rk3568-evb.dtsi
+++ b/kernel/arch/arm64/boot/dts/rockchip/rk3568-evb.dtsi
@@ -103,7 +103,7 @@
 
 	backlight1: backlight1 {
 		compatible = "pwm-backlight";
-		pwms = <&pwm6 0 25000 0>;
+		pwms = <&pwm5 0 25000 0>;
 		brightness-levels = <
 			  0  20  20  21  21  22  22  23
 			 23  24  24  25  25  26  26  27
@@ -141,6 +141,27 @@
 		default-brightness-level = <200>;
 	};
 
+	bt_sco: bt-sco {
+		status = "disabled";
+		compatible = "delta,dfbmcs320";
+		#sound-dai-cells = <1>;
+	};
+
+	bt_sound: bt-sound {
+		status = "disabled";
+		compatible = "simple-audio-card";
+		simple-audio-card,format = "dsp_a";
+		simple-audio-card,bitclock-inversion = <0>;
+		simple-audio-card,mclk-fs = <256>;
+		simple-audio-card,name = "rockchip,bt";
+		simple-audio-card,cpu {
+			sound-dai = <&i2s3_2ch>;
+		};
+		simple-audio-card,codec {
+			sound-dai = <&bt_sco 1>;
+		};
+	};
+
 	dc_12v: dc-12v {
 		compatible = "regulator-fixed";
 		regulator-name = "dc_12v";
@@ -161,8 +182,8 @@
 
 	leds: leds {
 		compatible = "gpio-leds";
-		sys_led: sys_led {
-			gpios = <&gpio3 RK_PD0 GPIO_ACTIVE_HIGH>;
+		work_led: work {
+			gpios = <&gpio0 RK_PC0 GPIO_ACTIVE_HIGH>;
 			linux,default-trigger = "heartbeat";
 		};
 	};
@@ -187,17 +208,15 @@
 
 	rk809_sound: rk809-sound {
 		status = "okay";
-		compatible = "simple-audio-card";
-		simple-audio-card,format = "i2s";
-		simple-audio-card,name = "rockchip,rk809-codec";
-		simple-audio-card,mclk-fs = <256>;
-
-		simple-audio-card,cpu {
-			sound-dai = <&i2s1_8ch>;
-		};
-		simple-audio-card,codec {
-			sound-dai = <&rk809_codec>;
-		};
+		compatible = "rockchip,multicodecs-card";
+		rockchip,card-name = "rockchip-rk809";
+		hp-det-gpio = <&gpio3 RK_PA1 GPIO_ACTIVE_LOW>;
+		rockchip,format = "i2s";
+		rockchip,mclk-fs = <256>;
+		rockchip,cpu = <&i2s1_8ch>;
+		rockchip,codec = <&rk809_codec>;
+		pinctrl-names = "default";
+		pinctrl-0 = <&hp_det>;
 	};
 
 	spdif-sound {
@@ -273,8 +292,6 @@
 	vcc5v0_otg: vcc5v0-otg-regulator {
 		compatible = "regulator-fixed";
 		regulator-name = "vcc5v0_otg";
-		egulator-boot-on;
-		regulator-always-on;
 		regulator-min-microvolt = <5000000>;
 		regulator-max-microvolt = <5000000>;
 		enable-active-high;
@@ -291,7 +308,7 @@
 		regulator-min-microvolt = <3300000>;
 		regulator-max-microvolt = <3300000>;
 		enable-active-high;
-		gpio = <&gpio0 RK_PC4 GPIO_ACTIVE_HIGH>;  //VCC3_IO_EN_GPIO0_C4_3V3
+		gpio = <&gpio0 RK_PC7 GPIO_ACTIVE_HIGH>;
 		vin-supply = <&vcc3v3_sys>;
 
 		regulator-state-mem {
@@ -328,7 +345,7 @@
 		 * - PDN (power down when low)
 		 */
 		post-power-on-delay-ms = <200>;
-		reset-gpios = <&gpio2 RK_PB1 GPIO_ACTIVE_LOW>;
+		reset-gpios = <&gpio3 RK_PD5 GPIO_ACTIVE_LOW>;
 	};
 
 	wireless_wlan: wireless-wlan {
@@ -419,198 +436,267 @@
 		dsi,format = <MIPI_DSI_FMT_RGB888>;
 		dsi,lanes  = <4>;
 		panel-init-sequence = [
-			39 00 05 FF 03 98 81 03
-			39 00 03 01 01 00
-			39 00 03 02 01 00
-			39 00 03 03 01 53     
-			39 00 03 04 01 D3     
-			39 00 03 05 01 00     
-			39 00 03 06 01 0D     
-			39 00 03 07 01 08     
-			39 00 03 08 01 00     
-			39 00 03 09 01 00     
-			39 00 03 0a 01 00     
-			39 00 03 0b 01 00     
-			39 00 03 0c 01 00     
-			39 00 03 0d 01 00     
-			39 00 03 0e 01 00     
-			39 00 03 0f 01 28     
-			39 00 03 10 01 28     
-			39 00 03 11 01 00     
-			39 00 03 12 01 00     
-			39 00 03 13 01 00     
-			39 00 03 14 01 00     
-			39 00 03 15 01 00     
-			39 00 03 16 01 00     
-			39 00 03 17 01 00     
-			39 00 03 18 01 00     
-			39 00 03 19 01 00     
-			39 00 03 1a 01 00     
-			39 00 03 1b 01 00     
-			39 00 03 1c 01 00     
-			39 00 03 1d 01 00     
-			39 00 03 1e 01 40     
-			39 00 03 1f 01 80     
-			39 00 03 20 01 06     
-			39 00 03 21 01 01     
-			39 00 03 22 01 00     
-			39 00 03 23 01 00     
-			39 00 03 24 01 00     
-			39 00 03 25 01 00     
-			39 00 03 26 01 00     
-			39 00 03 27 01 00     
-			39 00 03 28 01 33     
-			39 00 03 29 01 33     
-			39 00 03 2a 01 00     
-			39 00 03 2b 01 00     
-			39 00 03 2c 01 00     
-			39 00 03 2d 01 00     
-			39 00 03 2e 01 00     
-			39 00 03 2f 01 00     
-			39 00 03 30 01 00     
-			39 00 03 31 01 00     
-			39 00 03 32 01 00     
-			39 00 03 33 01 00     
-			39 00 03 34 01 03     
-			39 00 03 35 01 00     
-			39 00 03 36 01 00     
-			39 00 03 37 01 00     
-			39 00 03 38 01 96     
-			39 00 03 39 01 00
-			39 00 03 3a 01 00 
-			39 00 03 3b 01 00
-			39 00 03 3c 01 00
-			39 00 03 3d 01 00
-			39 00 03 3e 01 00
-			39 00 03 3f 01 00
-			39 00 03 40 01 00
-			39 00 03 41 01 00
-			39 00 03 42 01 00
-			39 00 03 43 01 00  
-			39 00 03 44 01 00	 
-			39 00 03 50 01 00
-			39 00 03 51 01 23
-			39 00 03 52 01 45
-			39 00 03 53 01 67
-			39 00 03 54 01 89
-			39 00 03 55 01 AB
-			39 00 03 56 01 01
-			39 00 03 57 01 23
-			39 00 03 58 01 45
-			39 00 03 59 01 67
-			39 00 03 5a 01 89
-			39 00 03 5b 01 AB
-			39 00 03 5c 01 CD
-			39 00 03 5d 01 EF
-			39 00 03 5e 01 00
-			39 00 03 5f 01 08     
-			39 00 03 60 01 08     
-			39 00 03 61 01 06     
-			39 00 03 62 01 06     
-			39 00 03 63 01 01     
-			39 00 03 64 01 01     
-			39 00 03 65 01 00     
-			39 00 03 66 01 00     
-			39 00 03 67 01 02     
-			39 00 03 68 01 15     
-			39 00 03 69 01 15     
-			39 00 03 6a 01 14     
-			39 00 03 6b 01 14     
-			39 00 03 6c 01 0D     
-			39 00 03 6d 01 0D     
-			39 00 03 6e 01 0C      
-			39 00 03 6f 01 0C     
-			39 00 03 70 01 0F     
-			39 00 03 71 01 0F     
-			39 00 03 72 01 0E     
-			39 00 03 73 01 0E     
-			39 00 03 74 01 02     
-			39 00 03 75 01 08     
-			39 00 03 76 01 08     
-			39 00 03 77 01 06     
-			39 00 03 78 01 06     
-			39 00 03 79 01 01     
-			39 00 03 7a 01 01     
-			39 00 03 7b 01 00     
-			39 00 03 7c 01 00     
-			39 00 03 7d 01 02     
-			39 00 03 7e 01 15     
-			39 00 03 7f 01 15     
-			39 00 03 80 01 14     
-			39 00 03 81 01 14     
-			39 00 03 82 01 0D     
-			39 00 03 83 01 0D     
-			39 00 03 84 01 0C     
-			39 00 03 85 01 0C     
-			39 00 03 86 01 0F     
-			39 00 03 87 01 0F     
-			39 00 03 88 01 0E     
-			39 00 03 89 01 0E     
-			39 00 03 8A 01 02     
-			39 00 05 FF 03 98 81 04
-			39 00 03 C5 01 3A      
-			39 00 03 6E 01 2B      
-			39 00 03 6F 01 37      
-			39 00 03 3A 01 24      
-			39 00 03 8D 01 1A      
-			39 00 03 87 01 BA      
-			39 00 03 B2 01 D1
-			39 00 03 88 01 0B
-			39 00 03 38 01 01      
-			39 00 03 39 01 00
-			39 00 03 B5 01 02      
-			39 00 03 31 01 25      
-			39 00 03 3B 01 98  		
-			39 00 05 FF 03 98 81 01
-			39 00 03 22 01 0A      
-			39 00 03 31 01 00      
-			39 00 03 53 01 3D      
-			39 00 03 55 01 3D      
-			39 00 03 50 01 85      
-			39 00 03 51 01 80      
-			39 00 03 60 01 06      
-			39 00 03 62 01 20
-			39 00 03 A0 01 00
-			39 00 03 A1 01 21
-			39 00 03 A2 01 35
-			39 00 03 A3 01 19
-			39 00 03 A4 01 1E
-			39 00 03 A5 01 33
-			39 00 03 A6 01 27
-			39 00 03 A7 01 26
-			39 00 03 A8 01 AF
-			39 00 03 A9 01 1B
-			39 00 03 AA 01 27
-			39 00 03 AB 01 8D
-			39 00 03 AC 01 1A
-			39 00 03 AD 01 1B
-			39 00 03 AE 01 50
-			39 00 03 AF 01 26
-			39 00 03 B0 01 2B
-			39 00 03 B1 01 54
-			39 00 03 B2 01 5E
-			39 00 03 B3 01 23
-			39 00 03 C0 01 00
-			39 00 03 C1 01 21
-			39 00 03 C2 01 35
-			39 00 03 C3 01 19
-			39 00 03 C4 01 1E
-			39 00 03 C5 01 33
-			39 00 03 C6 01 27
-			39 00 03 C7 01 26
-			39 00 03 C8 01 AF
-			39 00 03 C9 01 1B
-			39 00 03 CA 01 27
-			39 00 03 CB 01 8D
-			39 00 03 CC 01 1A
-			39 00 03 CD 01 1B
-			39 00 03 CE 01 50
-			39 00 03 CF 01 26
-			39 00 03 D0 01 2B
-			39 00 03 D1 01 54
-			39 00 03 D2 01 5E
-			39 00 03 D3 01 23		
-			39 00 05 FF 03 98 81 00
+			23 00 02 FE 21
+			23 00 02 04 00
+			23 00 02 00 64
+			23 00 02 2A 00
+			23 00 02 26 64
+			23 00 02 54 00
+			23 00 02 50 64
+			23 00 02 7B 00
+			23 00 02 77 64
+			23 00 02 A2 00
+			23 00 02 9D 64
+			23 00 02 C9 00
+			23 00 02 C5 64
+			23 00 02 01 71
+			23 00 02 27 71
+			23 00 02 51 71
+			23 00 02 78 71
+			23 00 02 9E 71
+			23 00 02 C6 71
+			23 00 02 02 89
+			23 00 02 28 89
+			23 00 02 52 89
+			23 00 02 79 89
+			23 00 02 9F 89
+			23 00 02 C7 89
+			23 00 02 03 9E
+			23 00 02 29 9E
+			23 00 02 53 9E
+			23 00 02 7A 9E
+			23 00 02 A0 9E
+			23 00 02 C8 9E
+			23 00 02 09 00
+			23 00 02 05 B0
+			23 00 02 31 00
+			23 00 02 2B B0
+			23 00 02 5A 00
+			23 00 02 55 B0
+			23 00 02 80 00
+			23 00 02 7C B0
+			23 00 02 A7 00
+			23 00 02 A3 B0
+			23 00 02 CE 00
+			23 00 02 CA B0
+			23 00 02 06 C0
+			23 00 02 2D C0
+			23 00 02 56 C0
+			23 00 02 7D C0
+			23 00 02 A4 C0
+			23 00 02 CB C0
+			23 00 02 07 CF
+			23 00 02 2F CF
+			23 00 02 58 CF
+			23 00 02 7E CF
+			23 00 02 A5 CF
+			23 00 02 CC CF
+			23 00 02 08 DD
+			23 00 02 30 DD
+			23 00 02 59 DD
+			23 00 02 7F DD
+			23 00 02 A6 DD
+			23 00 02 CD DD
+			23 00 02 0E 15
+			23 00 02 0A E9
+			23 00 02 36 15
+			23 00 02 32 E9
+			23 00 02 5F 15
+			23 00 02 5B E9
+			23 00 02 85 15
+			23 00 02 81 E9
+			23 00 02 AD 15
+			23 00 02 A9 E9
+			23 00 02 D3 15
+			23 00 02 CF E9
+			23 00 02 0B 14
+			23 00 02 33 14
+			23 00 02 5C 14
+			23 00 02 82 14
+			23 00 02 AA 14
+			23 00 02 D0 14
+			23 00 02 0C 36
+			23 00 02 34 36
+			23 00 02 5D 36
+			23 00 02 83 36
+			23 00 02 AB 36
+			23 00 02 D1 36
+			23 00 02 0D 6B
+			23 00 02 35 6B
+			23 00 02 5E 6B
+			23 00 02 84 6B
+			23 00 02 AC 6B
+			23 00 02 D2 6B
+			23 00 02 13 5A
+			23 00 02 0F 94
+			23 00 02 3B 5A
+			23 00 02 37 94
+			23 00 02 64 5A
+			23 00 02 60 94
+			23 00 02 8A 5A
+			23 00 02 86 94
+			23 00 02 B2 5A
+			23 00 02 AE 94
+			23 00 02 D8 5A
+			23 00 02 D4 94
+			23 00 02 10 D1
+			23 00 02 38 D1
+			23 00 02 61 D1
+			23 00 02 87 D1
+			23 00 02 AF D1
+			23 00 02 D5 D1
+			23 00 02 11 04
+			23 00 02 39 04
+			23 00 02 62 04
+			23 00 02 88 04
+			23 00 02 B0 04
+			23 00 02 D6 04
+			23 00 02 12 05
+			23 00 02 3A 05
+			23 00 02 63 05
+			23 00 02 89 05
+			23 00 02 B1 05
+			23 00 02 D7 05
+			23 00 02 18 AA
+			23 00 02 14 36
+			23 00 02 42 AA
+			23 00 02 3D 36
+			23 00 02 69 AA
+			23 00 02 65 36
+			23 00 02 8F AA
+			23 00 02 8B 36
+			23 00 02 B7 AA
+			23 00 02 B3 36
+			23 00 02 DD AA
+			23 00 02 D9 36
+			23 00 02 15 74
+			23 00 02 3F 74
+			23 00 02 66 74
+			23 00 02 8C 74
+			23 00 02 B4 74
+			23 00 02 DA 74
+			23 00 02 16 9F
+			23 00 02 40 9F
+			23 00 02 67 9F
+			23 00 02 8D 9F
+			23 00 02 B5 9F
+			23 00 02 DB 9F
+			23 00 02 17 DC
+			23 00 02 41 DC
+			23 00 02 68 DC
+			23 00 02 8E DC
+			23 00 02 B6 DC
+			23 00 02 DC DC
+			23 00 02 1D FF
+			23 00 02 19 03
+			23 00 02 47 FF
+			23 00 02 43 03
+			23 00 02 6E FF
+			23 00 02 6A 03
+			23 00 02 94 FF
+			23 00 02 90 03
+			23 00 02 BC FF
+			23 00 02 B8 03
+			23 00 02 E2 FF
+			23 00 02 DE 03
+			23 00 02 1A 35
+			23 00 02 44 35
+			23 00 02 6B 35
+			23 00 02 91 35
+			23 00 02 B9 35
+			23 00 02 DF 35
+			23 00 02 1B 45
+			23 00 02 45 45
+			23 00 02 6C 45
+			23 00 02 92 45
+			23 00 02 BA 45
+			23 00 02 E0 45
+			23 00 02 1C 55
+			23 00 02 46 55
+			23 00 02 6D 55
+			23 00 02 93 55
+			23 00 02 BB 55
+			23 00 02 E1 55
+			23 00 02 22 FF
+			23 00 02 1E 68
+			23 00 02 4C FF
+			23 00 02 48 68
+			23 00 02 73 FF
+			23 00 02 6F 68
+			23 00 02 99 FF
+			23 00 02 95 68
+			23 00 02 C1 FF
+			23 00 02 BD 68
+			23 00 02 E7 FF
+			23 00 02 E3 68
+			23 00 02 1F 7E
+			23 00 02 49 7E
+			23 00 02 70 7E
+			23 00 02 96 7E
+			23 00 02 BE 7E
+			23 00 02 E4 7E
+			23 00 02 20 97
+			23 00 02 4A 97
+			23 00 02 71 97
+			23 00 02 97 97
+			23 00 02 BF 97
+			23 00 02 E5 97
+			23 00 02 21 B5
+			23 00 02 4B B5
+			23 00 02 72 B5
+			23 00 02 98 B5
+			23 00 02 C0 B5
+			23 00 02 E6 B5
+			23 00 02 25 F0
+			23 00 02 23 E8
+			23 00 02 4F F0
+			23 00 02 4D E8
+			23 00 02 76 F0
+			23 00 02 74 E8
+			23 00 02 9C F0
+			23 00 02 9A E8
+			23 00 02 C4 F0
+			23 00 02 C2 E8
+			23 00 02 EA F0
+			23 00 02 E8 E8
+			23 00 02 24 FF
+			23 00 02 4E FF
+			23 00 02 75 FF
+			23 00 02 9B FF
+			23 00 02 C3 FF
+			23 00 02 E9 FF
+			23 00 02 FE 3D
+			23 00 02 00 04
+			23 00 02 FE 23
+			23 00 02 08 82
+			23 00 02 0A 00
+			23 00 02 0B 00
+			23 00 02 0C 01
+			23 00 02 16 00
+			23 00 02 18 02
+			23 00 02 1B 04
+			23 00 02 19 04
+			23 00 02 1C 81
+			23 00 02 1F 00
+			23 00 02 20 03
+			23 00 02 23 04
+			23 00 02 21 01
+			23 00 02 54 63
+			23 00 02 55 54
+			23 00 02 6E 45
+			23 00 02 6D 36
+			23 00 02 FE 3D
+			23 00 02 55 78
+			23 00 02 FE 20
+			23 00 02 26 30
+			23 00 02 FE 3D
+			23 00 02 20 71
+			23 00 02 50 8F
+			23 00 02 51 8F
+			23 00 02 FE 00
+			23 00 02 35 00
+			05 78 01 11
+			05 1E 01 29
 		];
 
 		panel-exit-sequence = [
@@ -671,242 +757,303 @@
 		status = "okay";
 		compatible = "simple-panel-dsi";
 		reg = <0>;
-		power-supply = <&vcc3v3_lcd1_n>;   //MIPI_3V3EN_GPIO3_A3_d_3V3
-		vddio-mipi = <&gpio3 RK_PA4 GPIO_ACTIVE_HIGH>; //MIPI_EN_1V8_GPIO3_A4_d_3V3
-		reset-gpios = <&gpio3 RK_PC7 GPIO_ACTIVE_LOW>; //MIPI_RST_L_GPIO3_C7
-		vcc-5v-gpio = <&gpio1 RK_PA4 GPIO_ACTIVE_HIGH>; //VCC5_IO_EN_GPIO1_A4_3V3
-		reset-delay-ms = <200>;
-        enable-delay-ms = <60>;
-        init-delay-ms = <120>;
-        disable-delay-ms = <60>;
-        prepare-delay-ms = <120>;
-        unprepare-delay-ms = <120>;
-        backlight = <&backlight1>;
-        dsi,flags = <(MIPI_DSI_MODE_VIDEO | MIPI_DSI_MODE_VIDEO_BURST |
-                MIPI_DSI_MODE_LPM | MIPI_DSI_MODE_EOT_PACKET)>;
-        dsi,format = <MIPI_DSI_FMT_RGB888>;
-        dsi,lanes  = <4>;
+		backlight = <&backlight1>;
+		reset-delay-ms = <60>;
+		enable-delay-ms = <60>;
+		prepare-delay-ms = <60>;
+		unprepare-delay-ms = <60>;
+		disable-delay-ms = <60>;
+		dsi,flags = <(MIPI_DSI_MODE_VIDEO | MIPI_DSI_MODE_VIDEO_BURST |
+			MIPI_DSI_MODE_LPM | MIPI_DSI_MODE_EOT_PACKET)>;
+		dsi,format = <MIPI_DSI_FMT_RGB888>;
+		dsi,lanes  = <4>;
+		panel-init-sequence = [
+			23 00 02 FE 21
+			23 00 02 04 00
+			23 00 02 00 64
+			23 00 02 2A 00
+			23 00 02 26 64
+			23 00 02 54 00
+			23 00 02 50 64
+			23 00 02 7B 00
+			23 00 02 77 64
+			23 00 02 A2 00
+			23 00 02 9D 64
+			23 00 02 C9 00
+			23 00 02 C5 64
+			23 00 02 01 71
+			23 00 02 27 71
+			23 00 02 51 71
+			23 00 02 78 71
+			23 00 02 9E 71
+			23 00 02 C6 71
+			23 00 02 02 89
+			23 00 02 28 89
+			23 00 02 52 89
+			23 00 02 79 89
+			23 00 02 9F 89
+			23 00 02 C7 89
+			23 00 02 03 9E
+			23 00 02 29 9E
+			23 00 02 53 9E
+			23 00 02 7A 9E
+			23 00 02 A0 9E
+			23 00 02 C8 9E
+			23 00 02 09 00
+			23 00 02 05 B0
+			23 00 02 31 00
+			23 00 02 2B B0
+			23 00 02 5A 00
+			23 00 02 55 B0
+			23 00 02 80 00
+			23 00 02 7C B0
+			23 00 02 A7 00
+			23 00 02 A3 B0
+			23 00 02 CE 00
+			23 00 02 CA B0
+			23 00 02 06 C0
+			23 00 02 2D C0
+			23 00 02 56 C0
+			23 00 02 7D C0
+			23 00 02 A4 C0
+			23 00 02 CB C0
+			23 00 02 07 CF
+			23 00 02 2F CF
+			23 00 02 58 CF
+			23 00 02 7E CF
+			23 00 02 A5 CF
+			23 00 02 CC CF
+			23 00 02 08 DD
+			23 00 02 30 DD
+			23 00 02 59 DD
+			23 00 02 7F DD
+			23 00 02 A6 DD
+			23 00 02 CD DD
+			23 00 02 0E 15
+			23 00 02 0A E9
+			23 00 02 36 15
+			23 00 02 32 E9
+			23 00 02 5F 15
+			23 00 02 5B E9
+			23 00 02 85 15
+			23 00 02 81 E9
+			23 00 02 AD 15
+			23 00 02 A9 E9
+			23 00 02 D3 15
+			23 00 02 CF E9
+			23 00 02 0B 14
+			23 00 02 33 14
+			23 00 02 5C 14
+			23 00 02 82 14
+			23 00 02 AA 14
+			23 00 02 D0 14
+			23 00 02 0C 36
+			23 00 02 34 36
+			23 00 02 5D 36
+			23 00 02 83 36
+			23 00 02 AB 36
+			23 00 02 D1 36
+			23 00 02 0D 6B
+			23 00 02 35 6B
+			23 00 02 5E 6B
+			23 00 02 84 6B
+			23 00 02 AC 6B
+			23 00 02 D2 6B
+			23 00 02 13 5A
+			23 00 02 0F 94
+			23 00 02 3B 5A
+			23 00 02 37 94
+			23 00 02 64 5A
+			23 00 02 60 94
+			23 00 02 8A 5A
+			23 00 02 86 94
+			23 00 02 B2 5A
+			23 00 02 AE 94
+			23 00 02 D8 5A
+			23 00 02 D4 94
+			23 00 02 10 D1
+			23 00 02 38 D1
+			23 00 02 61 D1
+			23 00 02 87 D1
+			23 00 02 AF D1
+			23 00 02 D5 D1
+			23 00 02 11 04
+			23 00 02 39 04
+			23 00 02 62 04
+			23 00 02 88 04
+			23 00 02 B0 04
+			23 00 02 D6 04
+			23 00 02 12 05
+			23 00 02 3A 05
+			23 00 02 63 05
+			23 00 02 89 05
+			23 00 02 B1 05
+			23 00 02 D7 05
+			23 00 02 18 AA
+			23 00 02 14 36
+			23 00 02 42 AA
+			23 00 02 3D 36
+			23 00 02 69 AA
+			23 00 02 65 36
+			23 00 02 8F AA
+			23 00 02 8B 36
+			23 00 02 B7 AA
+			23 00 02 B3 36
+			23 00 02 DD AA
+			23 00 02 D9 36
+			23 00 02 15 74
+			23 00 02 3F 74
+			23 00 02 66 74
+			23 00 02 8C 74
+			23 00 02 B4 74
+			23 00 02 DA 74
+			23 00 02 16 9F
+			23 00 02 40 9F
+			23 00 02 67 9F
+			23 00 02 8D 9F
+			23 00 02 B5 9F
+			23 00 02 DB 9F
+			23 00 02 17 DC
+			23 00 02 41 DC
+			23 00 02 68 DC
+			23 00 02 8E DC
+			23 00 02 B6 DC
+			23 00 02 DC DC
+			23 00 02 1D FF
+			23 00 02 19 03
+			23 00 02 47 FF
+			23 00 02 43 03
+			23 00 02 6E FF
+			23 00 02 6A 03
+			23 00 02 94 FF
+			23 00 02 90 03
+			23 00 02 BC FF
+			23 00 02 B8 03
+			23 00 02 E2 FF
+			23 00 02 DE 03
+			23 00 02 1A 35
+			23 00 02 44 35
+			23 00 02 6B 35
+			23 00 02 91 35
+			23 00 02 B9 35
+			23 00 02 DF 35
+			23 00 02 1B 45
+			23 00 02 45 45
+			23 00 02 6C 45
+			23 00 02 92 45
+			23 00 02 BA 45
+			23 00 02 E0 45
+			23 00 02 1C 55
+			23 00 02 46 55
+			23 00 02 6D 55
+			23 00 02 93 55
+			23 00 02 BB 55
+			23 00 02 E1 55
+			23 00 02 22 FF
+			23 00 02 1E 68
+			23 00 02 4C FF
+			23 00 02 48 68
+			23 00 02 73 FF
+			23 00 02 6F 68
+			23 00 02 99 FF
+			23 00 02 95 68
+			23 00 02 C1 FF
+			23 00 02 BD 68
+			23 00 02 E7 FF
+			23 00 02 E3 68
+			23 00 02 1F 7E
+			23 00 02 49 7E
+			23 00 02 70 7E
+			23 00 02 96 7E
+			23 00 02 BE 7E
+			23 00 02 E4 7E
+			23 00 02 20 97
+			23 00 02 4A 97
+			23 00 02 71 97
+			23 00 02 97 97
+			23 00 02 BF 97
+			23 00 02 E5 97
+			23 00 02 21 B5
+			23 00 02 4B B5
+			23 00 02 72 B5
+			23 00 02 98 B5
+			23 00 02 C0 B5
+			23 00 02 E6 B5
+			23 00 02 25 F0
+			23 00 02 23 E8
+			23 00 02 4F F0
+			23 00 02 4D E8
+			23 00 02 76 F0
+			23 00 02 74 E8
+			23 00 02 9C F0
+			23 00 02 9A E8
+			23 00 02 C4 F0
+			23 00 02 C2 E8
+			23 00 02 EA F0
+			23 00 02 E8 E8
+			23 00 02 24 FF
+			23 00 02 4E FF
+			23 00 02 75 FF
+			23 00 02 9B FF
+			23 00 02 C3 FF
+			23 00 02 E9 FF
+			23 00 02 FE 3D
+			23 00 02 00 04
+			23 00 02 FE 23
+			23 00 02 08 82
+			23 00 02 0A 00
+			23 00 02 0B 00
+			23 00 02 0C 01
+			23 00 02 16 00
+			23 00 02 18 02
+			23 00 02 1B 04
+			23 00 02 19 04
+			23 00 02 1C 81
+			23 00 02 1F 00
+			23 00 02 20 03
+			23 00 02 23 04
+			23 00 02 21 01
+			23 00 02 54 63
+			23 00 02 55 54
+			23 00 02 6E 45
+			23 00 02 6D 36
+			23 00 02 FE 3D
+			23 00 02 55 78
+			23 00 02 FE 20
+			23 00 02 26 30
+			23 00 02 FE 3D
+			23 00 02 20 71
+			23 00 02 50 8F
+			23 00 02 51 8F
+			23 00 02 FE 00
+			23 00 02 35 00
+			05 78 01 11
+			05 1E 01 29
+		];
 
-        panel-init-sequence = [
-            39 00 04 FF 98 81 03
-			15 00 02 01 00
-			15 00 02 02 00
-			15 00 02 03 53     
-			15 00 02 04 D3     
-			15 00 02 05 00     
-			15 00 02 06 0D     
-			15 00 02 07 08     
-			15 00 02 08 00     
-			15 00 02 09 00     
-			15 00 02 0a 00     
-			15 00 02 0b 00     
-			15 00 02 0c 00     
-			15 00 02 0d 00     
-			15 00 02 0e 00     
-			15 00 02 0f 28     
-			15 00 02 10 28     
-			15 00 02 11 00     
-			15 00 02 12 00     
-			15 00 02 13 00     
-			15 00 02 14 00     
-			15 00 02 15 00     
-			15 00 02 16 00     
-			15 00 02 17 00     
-			15 00 02 18 00     
-			15 00 02 19 00     
-			15 00 02 1a 00     
-			15 00 02 1b 00     
-			15 00 02 1c 00     
-			15 00 02 1d 00     
-			15 00 02 1e 40     
-			15 00 02 1f 80     
-			15 00 02 20 06     
-			15 00 02 21 01     
-			15 00 02 22 00     
-			15 00 02 23 00     
-			15 00 02 24 00     
-			15 00 02 25 00     
-			15 00 02 26 00     
-			15 00 02 27 00     
-			15 00 02 28 33     
-			15 00 02 29 33     
-			15 00 02 2a 00     
-			15 00 02 2b 00     
-			15 00 02 2c 00     
-			15 00 02 2d 00     
-			15 00 02 2e 00     
-			15 00 02 2f 00     
-			15 00 02 30 00     
-			15 00 02 31 00     
-			15 00 02 32 00     
-			15 00 02 33 00     
-			15 00 02 34 03     
-			15 00 02 35 00     
-			15 00 02 36 00     
-			15 00 02 37 00     
-			15 00 02 38 96     
-			15 00 02 39 00
-			15 00 02 3a 00 
-			15 00 02 3b 00
-			15 00 02 3c 00
-			15 00 02 3d 00
-			15 00 02 3e 00
-			15 00 02 3f 00
-			15 00 02 40 00
-			15 00 02 41 00
-			15 00 02 42 00
-			15 00 02 43 00  
-			15 00 02 44 00	 
-			15 00 02 50 00
-			15 00 02 51 23
-			15 00 02 52 45
-			15 00 02 53 67
-			15 00 02 54 89
-			15 00 02 55 AB
-			15 00 02 56 01
-			15 00 02 57 23
-			15 00 02 58 45
-			15 00 02 59 67
-			15 00 02 5a 89
-			15 00 02 5b AB
-			15 00 02 5c CD
-			15 00 02 5d EF
-			15 00 02 5e 00
-			15 00 02 5f 08     
-			15 00 02 60 08     
-			15 00 02 61 06     
-			15 00 02 62 06     
-			15 00 02 63 01     
-			15 00 02 64 01     
-			15 00 02 65 00     
-			15 00 02 66 00     
-			15 00 02 67 02     
-			15 00 02 68 15     
-			15 00 02 69 15     
-			15 00 02 6a 14     
-			15 00 02 6b 14     
-			15 00 02 6c 0D     
-			15 00 02 6d 0D     
-			15 00 02 6e 0C      
-			15 00 02 6f 0C     
-			15 00 02 70 0F     
-			15 00 02 71 0F     
-			15 00 02 72 0E     
-			15 00 02 73 0E     
-			15 00 02 74 02     
-			15 00 02 75 08     
-			15 00 02 76 08     
-			15 00 02 77 06     
-			15 00 02 78 06     
-			15 00 02 79 01     
-			15 00 02 7a 01     
-			15 00 02 7b 00     
-			15 00 02 7c 00     
-			15 00 02 7d 02     
-			15 00 02 7e 15     
-			15 00 02 7f 15     
-			15 00 02 80 14     
-			15 00 02 81 14     
-			15 00 02 82 0D     
-			15 00 02 83 0D     
-			15 00 02 84 0C     
-			15 00 02 85 0C     
-			15 00 02 86 0F     
-			15 00 02 87 0F     
-			15 00 02 88 0E     
-			15 00 02 89 0E     
-			15 00 02 8A 02     
-			39 00 04 FF 98 81 04
-			15 00 02 C5 3A      
-			15 00 02 6E 2B      
-			15 00 02 6F 37      
-			15 00 02 3A 24      
-			15 00 02 8D 1A      
-			15 00 02 87 BA      
-			15 00 02 B2 D1
-			15 00 02 88 0B
-			15 00 02 38 01      
-			15 00 02 39 00
-			15 00 02 B5 02      
-			15 00 02 31 25      
-			15 00 02 3B 98  		
-			39 00 04 FF 98 81 01
-			15 00 02 22 0A      
-			15 00 02 31 00      
-			15 00 02 53 3D      
-			15 00 02 55 3D      
-			15 00 02 50 85      
-			15 00 02 51 80      
-			15 00 02 60 06      
-			15 00 02 62 20
-			15 00 02 A0 00
-			15 00 02 A1 21
-			15 00 02 A2 35
-			15 00 02 A3 19
-			15 00 02 A4 1E
-			15 00 02 A5 33
-			15 00 02 A6 27
-			15 00 02 A7 26
-			15 00 02 A8 AF
-			15 00 02 A9 1B
-			15 00 02 AA 27
-			15 00 02 AB 8D
-			15 00 02 AC 1A
-			15 00 02 AD 1B
-			15 00 02 AE 50
-			15 00 02 AF 26
-			15 00 02 B0 2B
-			15 00 02 B1 54
-			15 00 02 B2 5E
-			15 00 02 B3 23
-			15 00 02 C0 00
-			15 00 02 C1 21
-			15 00 02 C2 35
-			15 00 02 C3 19
-			15 00 02 C4 1E
-			15 00 02 C5 33
-			15 00 02 C6 27
-			15 00 02 C7 26
-			15 00 02 C8 AF
-			15 00 02 C9 1B
-			15 00 02 CA 27
-			15 00 02 CB 8D
-			15 00 02 CC 1A
-			15 00 02 CD 1B
-			15 00 02 CE 50
-			15 00 02 CF 26
-			15 00 02 D0 2B
-			15 00 02 D1 54
-			15 00 02 D2 5E
-			15 00 02 D3 23		
-			39 00 04 FF 98 81 00
-			15 78 01 11 
-            15 05 01 29 
-        ];
+		panel-exit-sequence = [
+			05 00 01 28
+			05 00 01 10
+		];
 
-        panel-exit-sequence = [
-                05 00 01 28
-                05 00 01 10
-        ];
-
-         disp_timings1: display-timings {
-                                        native-mode = <&dsi1_timing0>;
-                                        dsi1_timing0: timing0 {
-                                        clock-frequency = <69000000>;
-                                        hactive = <800>;
-                                        vactive = <1280>;
-                                        hfront-porch = <32>;
-                                        hsync-len = <20>;
-                                        hback-porch = <20>;
-                                        vfront-porch = <16>;
-                                        vsync-len = <5>;
-                                        vback-porch = <12>;
-                                        hsync-active = <0>;
-                                        vsync-active = <0>;
-                                        de-active = <0>;
-                                        pixelclk-active = <1>;
-                                };
-                        };
+		disp_timings1: display-timings {
+			native-mode = <&dsi1_timing0>;
+			dsi1_timing0: timing0 {
+				clock-frequency = <132000000>;
+				hactive = <1080>;
+				vactive = <1920>;
+				hfront-porch = <15>;
+				hsync-len = <2>;
+				hback-porch = <30>;
+				vfront-porch = <15>;
+				vsync-len = <2>;
+				vback-porch = <15>;
+				hsync-active = <0>;
+				vsync-active = <0>;
+				de-active = <0>;
+				pixelclk-active = <1>;
+			};
+		};
 
 		ports {
 			#address-cells = <1>;
@@ -940,7 +1087,28 @@
 	status = "okay";
 };
 
+&hdmi {
+	status = "okay";
+	rockchip,phy-table =
+		<92812500  0x8009 0x0000 0x0270>,
+		<165000000 0x800b 0x0000 0x026d>,
+		<185625000 0x800b 0x0000 0x01ed>,
+		<297000000 0x800b 0x0000 0x01ad>,
+		<594000000 0x8029 0x0000 0x0088>,
+		<000000000 0x0000 0x0000 0x0000>;
+};
 
+&hdmi_in_vp0 {
+	status = "okay";
+};
+
+&hdmi_in_vp1 {
+	status = "disabled";
+};
+
+&hdmi_sound {
+	status = "okay";
+};
 
 &i2c0 {
 	status = "okay";
@@ -954,7 +1122,6 @@
 		regulator-min-microvolt = <712500>;
 		regulator-max-microvolt = <1390000>;
 		regulator-init-microvolt = <900000>;
-		regulator-initial-mode = <1>;
 		regulator-ramp-delay = <2300>;
 		fcs,suspend-voltage-selector = <1>;
 		regulator-boot-on;
@@ -1116,8 +1283,8 @@
 			vccio_acodec: LDO_REG4 {
 				regulator-always-on;
 				regulator-boot-on;
-				regulator-min-microvolt = <3300000>;
-				regulator-max-microvolt = <3300000>;
+				regulator-min-microvolt = <3000000>;
+				regulator-max-microvolt = <3000000>;
 				regulator-name = "vccio_acodec";
 				regulator-state-mem {
 					regulator-off-in-suspend;
@@ -1274,6 +1441,12 @@
 		     &i2s1m0_sdo0>;
 };
 
+&i2s3_2ch {
+	pinctrl-0 = <&i2s3m0_sclk &i2s3m0_lrck &i2s3m0_sdi &i2s3m0_sdo>;
+	rockchip,bclk-fs = <32>;
+	status = "disabled";
+};
+
 &iep {
 	status = "okay";
 };
@@ -1309,6 +1482,12 @@
 };
 
 &pinctrl {
+
+	headphone {
+		hp_det: hp-det {
+			rockchip,pins = <3 RK_PA1 RK_FUNC_GPIO &pcfg_pull_down>;
+		};
+	};
 
 	mxc6655xa {
 		mxc6655xa_irq_gpio: mxc6655xa_irq_gpio {
@@ -1348,8 +1527,7 @@
 
 	sdio-pwrseq {
 		wifi_enable_h: wifi-enable-h {
-			rockchip,pins = <2 RK_PB1 RK_FUNC_GPIO &pcfg_pull_none>;
-			//WIFI_REG_ON_H_GPIO2_B1
+			rockchip,pins = <3 RK_PD5 RK_FUNC_GPIO &pcfg_pull_none>;
 		};
 	};
 
@@ -1398,10 +1576,6 @@
 };
 
 &pwm4 {
-	status = "okay";
-};
-
-&pwm6 {
 	status = "okay";
 };
 
@@ -1544,7 +1718,10 @@
 	status = "okay";
 };
 
-
+&route_hdmi {
+	status = "okay";
+	connect = <&vp0_out_hdmi>;
+};
 
 &saradc {
 	status = "okay";
@@ -1641,15 +1818,6 @@
 };
 
 &usbhost_dwc3 {
-//	phys = <&u2phy0_host>;
-//	phy-names = "usb2-phy";
-//	maximum-speed = "high-speed";
-//	snps,dis_u2_susphy_quirk;
-	status = "okay";
-};
-
-&combphy1_usq {
-//	rockchip,dis-u3otg1-port;
 	status = "okay";
 };
 
@@ -1682,8 +1850,8 @@
 
 &vop {
 	status = "okay";
-	assigned-clocks = <&cru DCLK_VOP0>, <&cru DCLK_VOP1>;
-	assigned-clock-parents = <&pmucru PLL_HPLL>, <&cru PLL_VPLL>;
+	assigned-clocks = <&cru DCLK_VOP0>, <&cru DCLK_VOP1>, <&cru DCLK_VOP2>;
+	assigned-clock-parents = <&pmucru PLL_HPLL>, <&cru PLL_VPLL>, <&cru PLL_GPLL>;
 };
 
 &vop_mmu {
diff --git a/kernel/arch/arm64/boot/dts/rockchip/rk3568-evb1-ddr4-v10-linux-amp.dts b/kernel/arch/arm64/boot/dts/rockchip/rk3568-evb1-ddr4-v10-linux-amp.dts
index 51f93da..3df954f 100644
--- a/kernel/arch/arm64/boot/dts/rockchip/rk3568-evb1-ddr4-v10-linux-amp.dts
+++ b/kernel/arch/arm64/boot/dts/rockchip/rk3568-evb1-ddr4-v10-linux-amp.dts
@@ -11,7 +11,7 @@
 	memory {
 		device_type = "memory";
 		reg = <0x0 0x03880000 0x0 0x04b80000>,
-		      <0x0 0x08400000 0x0 0x77c00000>;
+		      <0x0 0x0a200000 0x0 0x75e00000>;
 	};
 };
 
diff --git a/kernel/arch/arm64/boot/dts/rockchip/rk3568-evb1-ddr4-v10.dts b/kernel/arch/arm64/boot/dts/rockchip/rk3568-evb1-ddr4-v10.dts
index 00c28f3..c505c37 100644
--- a/kernel/arch/arm64/boot/dts/rockchip/rk3568-evb1-ddr4-v10.dts
+++ b/kernel/arch/arm64/boot/dts/rockchip/rk3568-evb1-ddr4-v10.dts
@@ -6,3 +6,15 @@
 
 #include "rk3568-evb1-ddr4-v10.dtsi"
 #include "rk3568-android.dtsi"
+
+&bt_sco {
+	status = "okay";
+};
+
+&bt_sound {
+	status = "okay";
+};
+
+&i2s3_2ch {
+	status = "okay";
+};
diff --git a/kernel/arch/arm64/boot/dts/rockchip/rk3568-evb1-ddr4-v10.dtsi b/kernel/arch/arm64/boot/dts/rockchip/rk3568-evb1-ddr4-v10.dtsi
index 0cb57e9..f45ce09 100644
--- a/kernel/arch/arm64/boot/dts/rockchip/rk3568-evb1-ddr4-v10.dtsi
+++ b/kernel/arch/arm64/boot/dts/rockchip/rk3568-evb1-ddr4-v10.dtsi
@@ -15,13 +15,6 @@
 	model = "Rockchip RK3568 EVB1 DDR4 V10 Board";
 	compatible = "rockchip,rk3568-evb1-ddr4-v10", "rockchip,rk3568";
 
-	rk_headset: rk-headset {
-		compatible = "rockchip_headset";
-		headset_gpio = <&gpio3 RK_PC2 GPIO_ACTIVE_LOW>;
-		pinctrl-names = "default";
-		pinctrl-0 = <&hp_det>;
-	};
-
 	vcc2v5_sys: vcc2v5-ddr {
 		compatible = "regulator-fixed";
 		regulator-name = "vcc2v5-sys";
@@ -82,7 +75,7 @@
 		regulator-max-microvolt = <3300000>;
 		vin-supply = <&vcc5v0_sys>;
 	};
-
+#if 0
 	vcc_camera: vcc-camera-regulator {
 		compatible = "regulator-fixed";
 		gpio = <&gpio0 RK_PC1 GPIO_ACTIVE_HIGH>;
@@ -93,6 +86,106 @@
 		regulator-always-on;
 		regulator-boot-on;
 	};
+#endif
+
+	ndj_io_init {
+         	compatible = "nk_io_control";	
+			pinctrl-names = "default";
+        	pinctrl-0 = <&nk_io_gpio>;
+			
+			//gpio_op0 = <&gpio1 RK_PD0 GPIO_ACTIVE_HIGH>;
+			
+			vcc_5v {
+				gpio_num = <&gpio1 RK_PA4 GPIO_ACTIVE_HIGH>; //VCC5_IO_EN_GPIO1_A4_3V3
+				gpio_function = <0>;	
+			};
+			
+			vcc_12v {
+				gpio_num = <&gpio0 RK_PC7 GPIO_ACTIVE_HIGH>;  //VCC12_IO_EN_GPIO0_C7_3V3
+				gpio_function = <0>;
+			};
+			
+			hub_host2_rst {
+				gpio_num = <&gpio4 RK_PD2 GPIO_ACTIVE_HIGH>;  //HUB_RST_GPIO4_D2_3V3
+				gpio_function = <3>;
+			};
+			
+			hub_host3 {
+				gpio_num = <&gpio4 RK_PB2 GPIO_ACTIVE_HIGH>; //HOST3_EN_GPIO4_B2_1V8
+				gpio_function = <0>;
+			};
+			
+			wake_4g {
+				gpio_num = <&gpio1 RK_PB1 GPIO_ACTIVE_LOW>; //4G_WAKEUP_GPIO01_B1_3V3
+				gpio_function = <0>;
+			};
+			
+			air_mode_4g {
+				gpio_num = <&gpio1 RK_PB0 GPIO_ACTIVE_LOW>; //4G_AIR_MODE_GPIO01_B0_3V3
+				gpio_function = <0>;
+			};
+			
+			reset_4g {
+				gpio_num = <&gpio1 RK_PB2 GPIO_ACTIVE_LOW>; //4G_RST_GPIO01_B2_3V3
+				gpio_function = <3>;
+			};
+			
+			en_4g {
+				gpio_num = <&gpio0 RK_PC6 GPIO_ACTIVE_HIGH>; //4G_PWREN_H_GPIO0_C6
+				gpio_function = <0>;
+			};
+			
+			hp_en {
+				gpio_num = <&gpio3 RK_PA6 GPIO_ACTIVE_HIGH>;//HP_EN_GPIO3_A6_3V3
+				gpio_function = <0>;
+			};
+			
+			wifi_power_en {
+				gpio_num = <&gpio3 RK_PC6 GPIO_ACTIVE_HIGH>; //WIFI_PWREN_GPIO3_C6_1V8
+				gpio_function = <0>;
+			};
+	#if 0		
+			do1 {
+				gpio_num = <&gpio1 RK_PD0 GPIO_ACTIVE_LOW>; 
+				gpio_function = <0>;
+			};
+			
+			do2 {
+				gpio_num = <&gpio1 RK_PD2 GPIO_ACTIVE_HIGH>;
+				gpio_function = <0>;
+			};
+			
+			do3 {
+				gpio_num = <&gpio1 RK_PD1 GPIO_ACTIVE_HIGH>;
+				gpio_function = <0>;
+			};
+			
+			do4 {
+				gpio_num = <&gpio1 RK_PD3 GPIO_ACTIVE_HIGH>;
+				gpio_function = <0>;
+			};
+			
+			do5 {
+				gpio_num = <&gpio2 RK_PD6 GPIO_ACTIVE_LOW>; 
+				gpio_function = <0>;
+			};
+			
+			do6 {
+				gpio_num = <&gpio2 RK_PD7 GPIO_ACTIVE_LOW>; 
+				gpio_function = <0>;
+			};
+			
+			do7 {
+				gpio_num = <&gpio3 RK_PA0 GPIO_ACTIVE_LOW>; 
+				gpio_function = <0>;
+			};
+			
+			di1 {
+				gpio_num = <&gpio2 RK_PD5 GPIO_ACTIVE_HIGH>;
+				gpio_function = <1>;
+			};
+	#endif
+};
 };
 
 &combphy0_us {
@@ -108,11 +201,11 @@
 };
 
 &csi2_dphy_hw {
-	status = "okay";
+	status = "disabled";
 };
 
 &csi2_dphy0 {
-	status = "okay";
+	status = "disabled";
 
 	ports {
 		#address-cells = <1>;
@@ -156,7 +249,7 @@
  * when dsi0 is enabled
  */
 &dsi0 {
-	status = "okay";
+	status = "disabled";
 };
 
 &dsi0_in_vp0 {
@@ -164,7 +257,7 @@
 };
 
 &dsi0_in_vp1 {
-	status = "okay";
+	status = "disabled";
 };
 
 &dsi0_panel {
@@ -232,14 +325,14 @@
 	rx_delay = <0x2f>;
 
 	phy-handle = <&rgmii_phy0>;
-	status = "okay";
+	status = "disabled";
 };
 
 &gmac1 {
 	phy-mode = "rgmii";
 	clock_in_out = "output";
 
-	snps,reset-gpio = <&gpio2 RK_PD1 GPIO_ACTIVE_LOW>;
+	snps,reset-gpio = <&gpio3 RK_PB0 GPIO_ACTIVE_LOW>;
 	snps,reset-active-low;
 	/* Reset time is 20ms, 100ms for rtl8211f */
 	snps,reset-delays-us = <0 20000 100000>;
@@ -271,7 +364,7 @@
 };
 
 &i2c4 {
-	status = "okay";
+	status = "disabled";
 	gc8034: gc8034@37 {
 		compatible = "galaxycore,gc8034";
 		status = "okay";
@@ -317,7 +410,7 @@
 		};
 	};
 	ov5695: ov5695@36 {
-		status = "okay";
+		status = "disabled";
 		compatible = "ovti,ov5695";
 		reg = <0x36>;
 		clocks = <&cru CLK_CIF_OUT>;
@@ -355,7 +448,7 @@
 };
 
 &video_phy0 {
-	status = "okay";
+	status = "disabled";
 };
 
 &video_phy1 {
@@ -397,14 +490,44 @@
 			rockchip,pins = <2 RK_PB1 RK_FUNC_GPIO &pcfg_pull_none>;
 		};
 	};
+	
+	nk_io_init{
+		nk_io_gpio: nk-io-gpio{
+			rockchip,pins = <0 RK_PB0 RK_FUNC_GPIO &pcfg_pull_none>,
+							<0 RK_PB7 RK_FUNC_GPIO &pcfg_pull_none>,
+							<0 RK_PC4 RK_FUNC_GPIO &pcfg_pull_none>,
+							<4 RK_PD2 RK_FUNC_GPIO &pcfg_pull_none>,
+							<4 RK_PB2 RK_FUNC_GPIO &pcfg_pull_none>,
+							<1 RK_PA4 RK_FUNC_GPIO &pcfg_pull_none>,
+							<0 RK_PC7 RK_FUNC_GPIO &pcfg_pull_none>,
+							<1 RK_PB2 RK_FUNC_GPIO &pcfg_pull_none>, 
+							<1 RK_PB0 RK_FUNC_GPIO &pcfg_pull_none>,
+							<1 RK_PB1 RK_FUNC_GPIO &pcfg_pull_none>,
+							<3 RK_PA6 RK_FUNC_GPIO &pcfg_pull_none>,
+							<3 RK_PD2 RK_FUNC_GPIO &pcfg_pull_none>,
+							<3 RK_PD3 RK_FUNC_GPIO &pcfg_pull_none>,
+							<3 RK_PD4 RK_FUNC_GPIO &pcfg_pull_none>,
+							<3 RK_PD5 RK_FUNC_GPIO &pcfg_pull_none>,
+							<3 RK_PD1 RK_FUNC_GPIO &pcfg_pull_none>,
+							<2 RK_PD5 RK_FUNC_GPIO &pcfg_pull_none>,//93 SPI2_CS0_M1_3V3
+							<2 RK_PD6 RK_FUNC_GPIO &pcfg_pull_none>,//94 SPI2_MOSI_M1_3V3
+							<2 RK_PD7 RK_FUNC_GPIO &pcfg_pull_none>,//95 SPI2_MISO_M1_3V3
+							<3 RK_PA0 RK_FUNC_GPIO &pcfg_pull_none>,//96 SPI2_CLK_M1_3V3
+							<0 RK_PC6 RK_FUNC_GPIO &pcfg_pull_none>;
+		};
+	};
+};
+
+&rk809_sound {
+	hp-det-gpio = <&gpio3 RK_PC2 GPIO_ACTIVE_LOW>;
 };
 
 &rkisp {
-	status = "okay";
+	status = "disabled";
 };
 
 &rkisp_mmu {
-	status = "okay";
+	status = "disabled";
 };
 
 &rkisp_vir0 {
@@ -422,7 +545,7 @@
 };
 
 &route_dsi0 {
-	status = "okay";
+	status = "disabled";
 	connect = <&vp1_out_dsi0>;
 };
 
diff --git a/kernel/arch/arm64/boot/dts/rockchip/rk3568-evb2-lp4x-v10.dtsi b/kernel/arch/arm64/boot/dts/rockchip/rk3568-evb2-lp4x-v10.dtsi
index 55caf89..e73325e 100644
--- a/kernel/arch/arm64/boot/dts/rockchip/rk3568-evb2-lp4x-v10.dtsi
+++ b/kernel/arch/arm64/boot/dts/rockchip/rk3568-evb2-lp4x-v10.dtsi
@@ -72,6 +72,13 @@
 	};
 };
 
+&bt_sound {
+	status = "disabled";
+	simple-audio-card,cpu {
+		sound-dai = <&i2s2_2ch>;
+	};
+};
+
 &combphy0_us {
 	status = "okay";
 };
@@ -219,6 +226,12 @@
 	status = "disabled";
 };
 
+&i2s2_2ch {
+	pinctrl-0 = <&i2s2m0_sclktx &i2s2m0_lrcktx &i2s2m0_sdi &i2s2m0_sdo>;
+	rockchip,bclk-fs = <32>;
+	status = "disabled";
+};
+
 &mdio1 {
 	qsgmii_phy0: phy@0 {
 		compatible = "ethernet-phy-id001c.c942", "ethernet-phy-ieee802.3-c22";
diff --git a/kernel/arch/arm64/boot/dts/rockchip/rk3568-evb5-ddr4-v10.dtsi b/kernel/arch/arm64/boot/dts/rockchip/rk3568-evb5-ddr4-v10.dtsi
index fb47739..22617ca 100644
--- a/kernel/arch/arm64/boot/dts/rockchip/rk3568-evb5-ddr4-v10.dtsi
+++ b/kernel/arch/arm64/boot/dts/rockchip/rk3568-evb5-ddr4-v10.dtsi
@@ -84,6 +84,13 @@
 	};
 };
 
+&bt_sound {
+	status = "disabled";
+	simple-audio-card,cpu {
+		sound-dai = <&i2s2_2ch>;
+	};
+};
+
 &combphy0_us {
 	status = "okay";
 };
@@ -356,6 +363,12 @@
 	status = "disabled";
 };
 
+&i2s2_2ch {
+	pinctrl-0 = <&i2s2m0_sclktx &i2s2m0_lrcktx &i2s2m0_sdi &i2s2m0_sdo>;
+	rockchip,bclk-fs = <32>;
+	status = "disabled";
+};
+
 &mdio0 {
 	sgmii_phy: phy@1 {
 		compatible = "ethernet-phy-ieee802.3-c22";
diff --git a/kernel/arch/arm64/boot/dts/rockchip/rk3568-evb6-ddr3-v10.dtsi b/kernel/arch/arm64/boot/dts/rockchip/rk3568-evb6-ddr3-v10.dtsi
index 4452111..f268186 100644
--- a/kernel/arch/arm64/boot/dts/rockchip/rk3568-evb6-ddr3-v10.dtsi
+++ b/kernel/arch/arm64/boot/dts/rockchip/rk3568-evb6-ddr3-v10.dtsi
@@ -50,6 +50,13 @@
 	};
 };
 
+&bt_sound {
+	status = "disabled";
+	simple-audio-card,cpu {
+		sound-dai = <&i2s2_2ch>;
+	};
+};
+
 &combphy0_us {
 	status = "okay";
 };
@@ -235,6 +242,12 @@
 	/delete-node/ mxc6655xa@15;
 };
 
+&i2s2_2ch {
+	pinctrl-0 = <&i2s2m0_sclktx &i2s2m0_lrcktx &i2s2m0_sdi &i2s2m0_sdo>;
+	rockchip,bclk-fs = <32>;
+	status = "disabled";
+};
+
 &csi2_dphy_hw {
 	status = "okay";
 };
diff --git a/kernel/arch/arm64/boot/dts/rockchip/rk3568-linux.dtsi b/kernel/arch/arm64/boot/dts/rockchip/rk3568-linux.dtsi
index 5623aa8..c7e3096 100644
--- a/kernel/arch/arm64/boot/dts/rockchip/rk3568-linux.dtsi
+++ b/kernel/arch/arm64/boot/dts/rockchip/rk3568-linux.dtsi
@@ -5,6 +5,13 @@
  */
 
 / {
+	aliases {
+		mmc0 = &sdhci;
+		mmc1 = &sdmmc0;
+		mmc2 = &sdmmc1;
+		mmc3 = &sdmmc2;
+	};
+
 	chosen: chosen {
 		bootargs = "earlycon=uart8250,mmio32,0xfe660000 console=ttyFIQ0 root=PARTUUID=614e0000-0000 rw rootwait";
 	};
@@ -37,27 +44,6 @@
 			<0x0 0xfd90e000 0x0 0x1000>,
 			<0x0 0xfd90f000 0x0 0x1000>;
 	};
-
-	rk809_sound: rk809-sound {
-		status = "okay";
-		compatible = "simple-audio-card";
-		simple-audio-card,format = "i2s";
-		simple-audio-card,hp-det-gpio = <&gpio3 RK_PC2 GPIO_ACTIVE_HIGH>;
-		simple-audio-card,name = "rockchip,rk809-codec";
-		simple-audio-card,widgets = "Headphones", "Headphones Jack";
-		simple-audio-card,mclk-fs = <256>;
-		simple-audio-card,cpu {
-			sound-dai = <&i2s1_8ch>;
-		};
-		simple-audio-card,codec {
-			sound-dai = <&rk809_codec>;
-		};
-	};
-};
-
-&hdmi_sound {
-	status = "okay";
-	rockchip,jack-det;
 };
 
 &reserved_memory {
@@ -69,25 +55,6 @@
 		ftrace-size = <0x00000>;
 		pmsg-size = <0x50000>;
 	};
-};
-
-&rk809_codec {
-	#sound-dai-cells = <0>;
-	compatible = "rockchip,rk809-codec", "rockchip,rk817-codec";
-	clocks = <&cru I2S1_MCLKOUT>;
-	clock-names = "mclk";
-	assigned-clocks = <&cru I2S1_MCLKOUT>, <&cru I2S1_MCLK_TX_IOE>;
-	assigned-clock-rates = <12288000>;
-	assigned-clock-parents = <&cru I2S1_MCLKOUT_TX>, <&cru I2S1_MCLKOUT_TX>;
-	pinctrl-names = "default";
-	pinctrl-0 = <&i2s1m0_mclk &hp_det>;
-	hp-volume = <20>;
-	spk-volume = <3>;
-	status = "okay";
-};
-
-&rk_headset {
-	status = "disabled";
 };
 
 &rng {
diff --git a/kernel/arch/arm64/boot/dts/rockchip/rk3568-nvr-demo-v10.dtsi b/kernel/arch/arm64/boot/dts/rockchip/rk3568-nvr-demo-v10.dtsi
index 16e0539..8a1dc80 100644
--- a/kernel/arch/arm64/boot/dts/rockchip/rk3568-nvr-demo-v10.dtsi
+++ b/kernel/arch/arm64/boot/dts/rockchip/rk3568-nvr-demo-v10.dtsi
@@ -35,13 +35,23 @@
 		compatible = "simple-audio-card";
 		simple-audio-card,format = "i2s";
 		simple-audio-card,mclk-fs = <256>;
-		simple-audio-card,name = "rockchip,i2s1-sound";
+		simple-audio-card,name = "rockchip-i2s1";
 		simple-audio-card,cpu {
 			sound-dai = <&i2s1_8ch>;
 		};
 		simple-audio-card,codec {
 			sound-dai = <&es8311>;
 		};
+	};
+
+	rk618_hdmi_sound: rk618-hdmi-sound {
+		status = "okay";
+		compatible = "rockchip,hdmi";
+		rockchip,mclk-fs = <128>;
+		rockchip,card-name = "rk618-hdmi";
+		rockchip,cpu = <&spdif_8ch>;
+		rockchip,codec = <&rk618_hdmi>;
+		rockchip,jack-det;
 	};
 
 	vcc2v5_sys: vcc2v5-ddr {
@@ -230,7 +240,7 @@
 			status = "okay";
 		};
 
-		hdmi {
+		rk618_hdmi: hdmi {
 			compatible = "rockchip,rk618-hdmi";
 			clocks = <&clock HDMI_CLK>;
 			clock-names = "hdmi";
@@ -238,6 +248,8 @@
 			assigned-clock-parents = <&clock VIF0_CLK>;
 			interrupt-parent = <&gpio0>;
 			interrupts = <8 IRQ_TYPE_LEVEL_HIGH>;
+			rockchip,format = "spdif";
+			#sound-dai-cells = <0>;
 			status = "okay";
 
 			ports {
@@ -420,6 +432,20 @@
 	status = "okay";
 };
 
+&spdif_out {
+	status = "disabled";
+};
+
+&spdif_sound {
+	status = "disabled";
+};
+
+&spdif_8ch {
+	status = "okay";
+	pinctrl-names = "default";
+	pinctrl-0 = <&spdifm1_tx>;
+};
+
 &pinctrl {
 	rk618 {
 		rk618_reset: rk618-reeset {
diff --git a/kernel/arch/arm64/boot/dts/rockchip/rk3568-nvr.dtsi b/kernel/arch/arm64/boot/dts/rockchip/rk3568-nvr.dtsi
index 94b0e27..c82fbef 100644
--- a/kernel/arch/arm64/boot/dts/rockchip/rk3568-nvr.dtsi
+++ b/kernel/arch/arm64/boot/dts/rockchip/rk3568-nvr.dtsi
@@ -42,24 +42,19 @@
 	};
 
 	hdmi_sound: hdmi-sound {
-		compatible = "simple-audio-card";
-		simple-audio-card,format = "i2s";
-		simple-audio-card,mclk-fs = <128>;
-		simple-audio-card,name = "hdmi-sound";
 		status = "okay";
-
-		simple-audio-card,cpu {
-				sound-dai = <&i2s0_8ch>;
-		};
-		simple-audio-card,codec {
-				sound-dai = <&hdmi>;
-		};
+		compatible = "rockchip,hdmi";
+		rockchip,mclk-fs = <128>;
+		rockchip,card-name = "rockchip-hdmi0";
+		rockchip,cpu = <&i2s0_8ch>;
+		rockchip,codec = <&hdmi>;
+		rockchip,jack-det;
 	};
 
-	spdif-sound {
+	spdif_sound: spdif-sound {
 		status = "okay";
 		compatible = "simple-audio-card";
-		simple-audio-card,name = "ROCKCHIP,SPDIF";
+		simple-audio-card,name = "ROCKCHIP-SPDIF";
 		simple-audio-card,cpu {
 				sound-dai = <&spdif_8ch>;
 		};
diff --git a/kernel/arch/arm64/boot/dts/rockchip/rk3568.dtsi b/kernel/arch/arm64/boot/dts/rockchip/rk3568.dtsi
old mode 100755
new mode 100644
index 9b53dab..32a4478
--- a/kernel/arch/arm64/boot/dts/rockchip/rk3568.dtsi
+++ b/kernel/arch/arm64/boot/dts/rockchip/rk3568.dtsi
@@ -22,7 +22,6 @@
 	#address-cells = <2>;
 	#size-cells = <2>;
 
-
 	aliases {
 		csi2dphy0 = &csi2_dphy0;
 		csi2dphy1 = &csi2_dphy1;
@@ -127,12 +126,14 @@
 		opp-shared;
 
 		mbist-vmin = <825000 900000 950000>;
-		nvmem-cells = <&cpu_leakage>, <&core_pvtm>, <&mbist_vmin>;
-		nvmem-cell-names = "leakage", "pvtm", "mbist-vmin";
+		nvmem-cells = <&cpu_leakage>, <&core_pvtm>, <&mbist_vmin>, <&cpu_opp_info>;
+		nvmem-cell-names = "leakage", "pvtm", "mbist-vmin", "opp-info";
+		rockchip,max-volt = <1150000>;
 		rockchip,pvtm-voltage-sel = <
 			0        84000   0
-			84001    91000   1
-			91001    100000  2
+			84001    87000   1
+			87001    91000   2
+			91001    100000  3
 		>;
 		rockchip,pvtm-freq = <408000>;
 		rockchip,pvtm-volt = <900000>;
@@ -147,31 +148,22 @@
 		rockchip,low-temp = <0>;
 		rockchip,low-temp-adjust-volt = <
 			/* MHz    MHz    uV */
-			   0      1608   75000
+			   0      1992   75000
 		>;
 
 		opp-408000000 {
 			opp-hz = /bits/ 64 <408000000>;
 			opp-microvolt = <850000 850000 1150000>;
-			opp-microvolt-L0 = <850000 850000 1150000>;
-			opp-microvolt-L1 = <825000 825000 1150000>;
-			opp-microvolt-L2 = <825000 825000 1150000>;
 			clock-latency-ns = <40000>;
 		};
 		opp-600000000 {
 			opp-hz = /bits/ 64 <600000000>;
-			opp-microvolt = <850000 825000 1150000>;
-			opp-microvolt-L0 = <850000 850000 1150000>;
-			opp-microvolt-L1 = <825000 825000 1150000>;
-			opp-microvolt-L2 = <825000 825000 1150000>;
+			opp-microvolt = <850000 850000 1150000>;
 			clock-latency-ns = <40000>;
 		};
 		opp-816000000 {
 			opp-hz = /bits/ 64 <816000000>;
 			opp-microvolt = <850000 850000 1150000>;
-			opp-microvolt-L0 = <850000 850000 1150000>;
-			opp-microvolt-L1 = <825000 825000 1150000>;
-			opp-microvolt-L2 = <825000 825000 1150000>;
 			clock-latency-ns = <40000>;
 			opp-suspend;
 		};
@@ -179,40 +171,45 @@
 			opp-hz = /bits/ 64 <1104000000>;
 			opp-microvolt = <900000 900000 1150000>;
 			opp-microvolt-L0 = <900000 900000 1150000>;
-			opp-microvolt-L1 = <825000 825000 1150000>;
-			opp-microvolt-L2 = <825000 825000 1150000>;
+			opp-microvolt-L1 = <850000 850000 1150000>;
+			opp-microvolt-L2 = <850000 850000 1150000>;
+			opp-microvolt-L3 = <850000 850000 1150000>;
 			clock-latency-ns = <40000>;
 		};
 		opp-1416000000 {
 			opp-hz = /bits/ 64 <1416000000>;
-			opp-microvolt = <1000000 1000000 1150000>;
-			opp-microvolt-L0 = <1000000 1000000 1150000>;
-			opp-microvolt-L1 = <925000 925000 1150000>;
-			opp-microvolt-L2 = <925000 925000 1150000>;
+			opp-microvolt = <1025000 1025000 1150000>;
+			opp-microvolt-L0 = <1025000 1025000 1150000>;
+			opp-microvolt-L1 = <975000 975000 1150000>;
+			opp-microvolt-L2 = <950000 950000 1150000>;
+			opp-microvolt-L3 = <925000 925000 1150000>;
 			clock-latency-ns = <40000>;
 		};
 		opp-1608000000 {
 			opp-hz = /bits/ 64 <1608000000>;
-			opp-microvolt = <1075000 1075000 1150000>;
-			opp-microvolt-L0 = <1075000 1075000 1150000>;
-			opp-microvolt-L1 = <1000000 1000000 1150000>;
-			opp-microvolt-L2 = <1000000 1000000 1150000>;
+			opp-microvolt = <1100000 1100000 1150000>;
+			opp-microvolt-L0 = <1100000 1100000 1150000>;
+			opp-microvolt-L1 = <1050000 1050000 1150000>;
+			opp-microvolt-L2 = <1025000 1025000 1150000>;
+			opp-microvolt-L3 = <1000000 1000000 1150000>;
 			clock-latency-ns = <40000>;
 		};
 		opp-1800000000 {
 			opp-hz = /bits/ 64 <1800000000>;
-			opp-microvolt = <1125000 1125000 1150000>;
-			opp-microvolt-L0 = <1125000 1125000 1150000>;
-			opp-microvolt-L1 = <1050000 1050000 1150000>;
-			opp-microvolt-L2 = <1050000 1050000 1150000>;
+			opp-microvolt = <1150000 1150000 1150000>;
+			opp-microvolt-L0 = <1150000 1150000 1150000>;
+			opp-microvolt-L1 = <1100000 1100000 1150000>;
+			opp-microvolt-L2 = <1075000 1075000 1150000>;
+			opp-microvolt-L3 = <1050000 1050000 1150000>;
 			clock-latency-ns = <40000>;
 		};
 		opp-1992000000 {
 			opp-hz = /bits/ 64 <1992000000>;
 			opp-microvolt = <1150000 1150000 1150000>;
 			opp-microvolt-L0 = <1150000 1150000 1150000>;
-			opp-microvolt-L1 = <1100000 1100000 1150000>;
-			opp-microvolt-L2 = <1075000 1075000 1150000>;
+			opp-microvolt-L1 = <1150000 1150000 1150000>;
+			opp-microvolt-L2 = <1125000 1125000 1150000>;
+			opp-microvolt-L3 = <1100000 1100000 1150000>;
 			clock-latency-ns = <40000>;
 		};
 	};
@@ -254,7 +251,7 @@
 				logo,kernel = "logo_kernel.bmp";
 				logo,mode = "center";
 				charge_logo,mode = "center";
-				connect = <&vp1_out_dsi1>;
+				connect = <&vp0_out_dsi1>;
 			};
 			route_edp: route-edp {
 				status = "disabled";
@@ -262,7 +259,7 @@
 				logo,kernel = "logo_kernel.bmp";
 				logo,mode = "center";
 				charge_logo,mode = "center";
-				connect = <&vp1_out_edp>;
+				connect = <&vp0_out_edp>;
 			};
 			route_hdmi: route-hdmi {
 				status = "disabled";
@@ -270,7 +267,7 @@
 				logo,kernel = "logo_kernel.bmp";
 				logo,mode = "center";
 				charge_logo,mode = "center";
-				connect = <&vp0_out_hdmi>;
+				connect = <&vp1_out_hdmi>;
 			};
 			route_lvds: route-lvds {
 				status = "disabled";
@@ -308,7 +305,7 @@
 				reg = <0x14>;
 				#clock-cells = <1>;
 
-				rockchip,clk-init = <1416000000>;
+				rockchip,clk-init = <1104000000>;
 			};
 		};
 
@@ -939,7 +936,7 @@
 		dmas = <&dmac0 0>, <&dmac0 1>;
 		pinctrl-names = "default";
 		pinctrl-0 = <&uart0_xfer>;
-		status = "okay";
+		status = "disabled";
 	};
 
 	pwm0: pwm@fdd70000 {
@@ -1110,76 +1107,70 @@
 		compatible = "operating-points-v2";
 
 		mbist-vmin = <825000 900000 950000>;
-		nvmem-cells = <&npu_leakage>, <&core_pvtm>, <&mbist_vmin>;
-		nvmem-cell-names = "leakage", "pvtm", "mbist-vmin";
+		nvmem-cells = <&npu_leakage>, <&core_pvtm>, <&mbist_vmin>, <&npu_opp_info>;
+		nvmem-cell-names = "leakage", "pvtm", "mbist-vmin", "opp-info";
+		rockchip,max-volt = <1000000>;
 		rockchip,temp-hysteresis = <5000>;
 		rockchip,low-temp = <0>;
 		rockchip,low-temp-adjust-volt = <
 			/* MHz    MHz    uV */
-			   0      700    50000
+			   0      1000    50000
 		>;
 		rockchip,pvtm-voltage-sel = <
 			0        84000   0
-			84001    91000   1
-			91001    100000  2
+			84001    87000   1
+			87001    91000   2
+			91001    100000  3
 		>;
 		rockchip,pvtm-ch = <0 5>;
 
 		opp-200000000 {
 			opp-hz = /bits/ 64 <200000000>;
 			opp-microvolt = <850000 850000 1000000>;
-			opp-microvolt-L0 = <850000 850000 1000000>;
-			opp-microvolt-L1 = <825000 825000 1000000>;
-			opp-microvolt-L2 = <825000 825000 1000000>;
 		};
 		opp-300000000 {
 			opp-hz = /bits/ 64 <297000000>;
 			opp-microvolt = <850000 850000 1000000>;
-			opp-microvolt-L0 = <850000 850000 1000000>;
-			opp-microvolt-L1 = <825000 825000 1000000>;
-			opp-microvolt-L2 = <825000 825000 1000000>;
 		};
 		opp-400000000 {
 			opp-hz = /bits/ 64 <400000000>;
 			opp-microvolt = <850000 850000 1000000>;
-			opp-microvolt-L0 = <850000 850000 1000000>;
-			opp-microvolt-L1 = <825000 825000 1000000>;
-			opp-microvolt-L2 = <825000 825000 1000000>;
 		};
 		opp-600000000 {
 			opp-hz = /bits/ 64 <600000000>;
-			opp-microvolt = <875000 875000 1000000>;
-			opp-microvolt-L0 = <875000 875000 1000000>;
-			opp-microvolt-L1 = <825000 825000 1000000>;
-			opp-microvolt-L2 = <825000 825000 1000000>;
+			opp-microvolt = <850000 850000 1000000>;
 		};
 		opp-700000000 {
 			opp-hz = /bits/ 64 <700000000>;
-			opp-microvolt = <900000 900000 1000000>;
-			opp-microvolt-L0 = <900000 900000 1000000>;
+			opp-microvolt = <875000 875000 1000000>;
+			opp-microvolt-L0 = <875000 875000 1000000>;
 			opp-microvolt-L1 = <850000 850000 1000000>;
 			opp-microvolt-L2 = <850000 850000 1000000>;
+			opp-microvolt-L3 = <850000 850000 1000000>;
 		};
 		opp-800000000 {
 			opp-hz = /bits/ 64 <800000000>;
 			opp-microvolt = <925000 925000 1000000>;
 			opp-microvolt-L0 = <925000 925000 1000000>;
-			opp-microvolt-L1 = <875000 875000 1000000>;
+			opp-microvolt-L1 = <900000 900000 1000000>;
 			opp-microvolt-L2 = <875000 875000 1000000>;
+			opp-microvolt-L3 = <875000 875000 1000000>;
 		};
 		opp-900000000 {
 			opp-hz = /bits/ 64 <900000000>;
 			opp-microvolt = <975000 975000 1000000>;
 			opp-microvolt-L0 = <975000 975000 1000000>;
-			opp-microvolt-L1 = <925000 925000 1000000>;
-			opp-microvolt-L2 = <900000 900000 1000000>;
+			opp-microvolt-L1 = <950000 950000 1000000>;
+			opp-microvolt-L2 = <925000 925000 1000000>;
+			opp-microvolt-L3 = <900000 900000 1000000>;
 		};
 		opp-1000000000 {
 			opp-hz = /bits/ 64 <1000000000>;
 			opp-microvolt = <1000000 1000000 1000000>;
 			opp-microvolt-L0 = <1000000 1000000 1000000>;
-			opp-microvolt-L1 = <950000 950000 1000000>;
-			opp-microvolt-L2 = <925000 925000 1000000>;
+			opp-microvolt-L1 = <975000 975000 1000000>;
+			opp-microvolt-L2 = <950000 950000 1000000>;
+			opp-microvolt-L3 = <925000 925000 1000000>;
 			status = "disabled";
 		};
 	};
@@ -1210,8 +1201,8 @@
 			opp-hz = /bits/ 64 <700000000>;
 			opp-microvolt = <900000>;
 			opp-microvolt-L0 = <900000>;
-			opp-microvolt-L1 = <850000>;
-			opp-microvolt-L2 = <850000>;
+			opp-microvolt-L1 = <875000>;
+			opp-microvolt-L2 = <875000>;
 		};
 		opp-900000000 {
 			opp-hz = /bits/ 64 <900000000>;
@@ -1272,56 +1263,58 @@
 		compatible = "operating-points-v2";
 
 		mbist-vmin = <825000 900000 950000>;
-		nvmem-cells = <&gpu_leakage>, <&core_pvtm>, <&mbist_vmin>;
-		nvmem-cell-names = "leakage", "pvtm", "mbist-vmin";
+		nvmem-cells = <&gpu_leakage>, <&core_pvtm>, <&mbist_vmin>, <&gpu_opp_info>;
+		nvmem-cell-names = "leakage", "pvtm", "mbist-vmin", "opp-info";
+		rockchip,max-volt = <1000000>;
+		rockchip,temp-hysteresis = <5000>;
+		rockchip,low-temp = <0>;
+		rockchip,low-temp-adjust-volt = <
+			/* MHz    MHz    uV */
+			   0      800    50000
+		>;
 		rockchip,pvtm-voltage-sel = <
 			0        84000   0
-			84001    91000   1
-			91001    100000  2
+			84001    87000   1
+			87001    91000   2
+			91001    100000  3
 		>;
 		rockchip,pvtm-ch = <0 5>;
 
 		opp-200000000 {
 			opp-hz = /bits/ 64 <200000000>;
-			opp-microvolt = <850000>;
-			opp-microvolt-L0 = <850000>;
-			opp-microvolt-L1 = <825000>;
-			opp-microvolt-L2 = <825000>;
+			opp-microvolt = <850000 850000 1000000>;
 		};
 		opp-300000000 {
 			opp-hz = /bits/ 64 <300000000>;
-			opp-microvolt = <850000>;
-			opp-microvolt-L0 = <850000>;
-			opp-microvolt-L1 = <825000>;
-			opp-microvolt-L2 = <825000>;
+			opp-microvolt = <850000 850000 1000000>;
 		};
 		opp-400000000 {
 			opp-hz = /bits/ 64 <400000000>;
-			opp-microvolt = <850000>;
-			opp-microvolt-L0 = <850000>;
-			opp-microvolt-L1 = <825000>;
-			opp-microvolt-L2 = <825000>;
+			opp-microvolt = <850000 850000 1000000>;
 		};
 		opp-600000000 {
 			opp-hz = /bits/ 64 <600000000>;
-			opp-microvolt = <875000>;
-			opp-microvolt-L0 = <875000>;
-			opp-microvolt-L1 = <825000>;
-			opp-microvolt-L2 = <825000>;
+			opp-microvolt = <900000 900000 1000000>;
+			opp-microvolt-L0 = <900000 900000 1000000>;
+			opp-microvolt-L1 = <875000 875000 1000000>;
+			opp-microvolt-L2 = <850000 850000 1000000>;
+			opp-microvolt-L3 = <850000 850000 1000000>;
 		};
 		opp-700000000 {
 			opp-hz = /bits/ 64 <700000000>;
-			opp-microvolt = <950000>;
-			opp-microvolt-L0 = <950000>;
-			opp-microvolt-L1 = <900000>;
-			opp-microvolt-L2 = <850000>;
+			opp-microvolt = <950000 950000 1000000>;
+			opp-microvolt-L0 = <950000 950000 1000000>;
+			opp-microvolt-L1 = <925000 925000 1000000>;
+			opp-microvolt-L2 = <900000 900000 1000000>;
+			opp-microvolt-L3 = <875000 875000 1000000>;
 		};
 		opp-800000000 {
 			opp-hz = /bits/ 64 <800000000>;
-			opp-microvolt = <1000000>;
-			opp-microvolt-L0 = <1000000>;
-			opp-microvolt-L1 = <950000>;
-			opp-microvolt-L2 = <900000>;
+			opp-microvolt = <1000000 1000000 1000000>;
+			opp-microvolt-L0 = <1000000 1000000 1000000>;
+			opp-microvolt-L1 = <975000 975000 1000000>;
+			opp-microvolt-L2 = <950000 950000 1000000>;
+			opp-microvolt-L3 = <925000 925000 1000000>;
 		};
 	};
 
@@ -1381,6 +1374,7 @@
 		clock-names = "aclk", "iface";
 		clocks = <&cru ACLK_VPU>, <&cru HCLK_VPU>;
 		power-domains = <&power RK3568_PD_VPU>;
+		rockchip,shootdown-entire;
 		#iommu-cells = <0>;
 		status = "disabled";
 	};
@@ -1433,6 +1427,7 @@
 		clock-names = "aclk", "iface";
 		clocks = <&cru ACLK_JDEC>, <&cru HCLK_JDEC>;
 		power-domains = <&power RK3568_PD_RGA>;
+		rockchip,shootdown-entire;
 		#iommu-cells = <0>;
 		status = "disabled";
 	};
@@ -1462,6 +1457,7 @@
 		clock-names = "aclk", "iface";
 		clocks = <&cru ACLK_JENC>, <&cru HCLK_JENC>;
 		power-domains = <&power RK3568_PD_RGA>;
+		rockchip,shootdown-entire;
 		#iommu-cells = <0>;
 		status = "disabled";
 	};
@@ -1492,6 +1488,7 @@
 		clock-names = "aclk", "iface";
 		#iommu-cells = <0>;
 		power-domains = <&power RK3568_PD_RGA>;
+		rockchip,shootdown-entire;
 		//rockchip,disable-device-link-resume;
 		status = "disabled";
 	};
@@ -1545,8 +1542,8 @@
 			opp-hz = /bits/ 64 <297000000>;
 			opp-microvolt = <900000>;
 			opp-microvolt-L0 = <900000>;
-			opp-microvolt-L1 = <850000>;
-			opp-microvolt-L2 = <850000>;
+			opp-microvolt-L1 = <875000>;
+			opp-microvolt-L2 = <875000>;
 		};
 		opp-400000000 {
 			opp-hz = /bits/ 64 <400000000>;
@@ -1567,6 +1564,7 @@
 		clock-names = "aclk", "iface";
 		rockchip,disable-mmu-reset;
 		rockchip,enable-cmd-retry;
+		rockchip,shootdown-entire;
 		#iommu-cells = <0>;
 		power-domains = <&power RK3568_PD_RKVENC>;
 		status = "disabled";
@@ -1630,7 +1628,7 @@
 			opp-hz = /bits/ 64 <297000000>;
 			opp-microvolt = <900000>;
 			opp-microvolt-L0 = <900000>;
-			opp-microvolt-L1 = <850000>;
+			opp-microvolt-L1 = <875000>;
 		};
 		opp-400000000 {
 			opp-hz = /bits/ 64 <400000000>;
@@ -1646,6 +1644,7 @@
 		clocks = <&cru ACLK_RKVDEC>, <&cru HCLK_RKVDEC>;
 		clock-names = "aclk", "iface";
 		power-domains = <&power RK3568_PD_RKVDEC>;
+		rockchip,shootdown-entire;
 		#iommu-cells = <0>;
 		status = "disabled";
 	};
@@ -1740,7 +1739,7 @@
 		rockchip,grf = <&grf>;
 		power-domains = <&power RK3568_PD_VI>;
 		iommus = <&rkisp_mmu>;
-		rockchip,iq-feature = /bits/ 64 <0x3FBFFFE67FF>;
+		rockchip,iq-feature = /bits/ 64 <0x1BFBFFFE67FF>;
 		status = "disabled";
 	};
 
@@ -1769,6 +1768,13 @@
 		status = "disabled";
 	};
 
+	gmac_uio1: uio@fe010000 {
+		compatible = "rockchip,uio-gmac";
+		reg = <0x0 0xfe010000 0x0 0x10000>;
+		rockchip,ethernet = <&gmac1>;
+		status = "disabled";
+	};
+
 	gmac1: ethernet@fe010000 {
 		compatible = "rockchip,rk3568-gmac", "snps,dwmac-4.20a";
 		reg = <0x0 0xfe010000 0x0 0x10000>;
@@ -1780,12 +1786,12 @@
 			 <&cru SCLK_GMAC1_RX_TX>, <&cru CLK_MAC1_REFOUT>,
 			 <&cru ACLK_GMAC1>, <&cru PCLK_GMAC1>,
 			 <&cru SCLK_GMAC1_RX_TX>, <&cru CLK_GMAC1_PTP_REF>,
-			 <&cru PCLK_XPCS>;
+			 <&cru PCLK_XPCS>, <&cru CLK_XPCS_EEE>;
 		clock-names = "stmmaceth", "mac_clk_rx",
 			      "mac_clk_tx", "clk_mac_refout",
 			      "aclk_mac", "pclk_mac",
 			      "clk_mac_speed", "ptp_ref",
-			      "pclk_xpcs";
+			      "pclk_xpcs", "clk_xpcs_eee";
 		resets = <&cru SRST_A_GMAC1>;
 		reset-names = "stmmaceth";
 
@@ -2006,7 +2012,8 @@
 	hdmi: hdmi@fe0a0000 {
 		compatible = "rockchip,rk3568-dw-hdmi";
 		reg = <0x0 0xfe0a0000 0x0 0x20000>;
-		interrupts = <GIC_SPI 45 IRQ_TYPE_LEVEL_HIGH>;
+		interrupts = <GIC_SPI 45 IRQ_TYPE_LEVEL_HIGH>, <GIC_SPI 44 IRQ_TYPE_LEVEL_HIGH>;
+		interrupt-names = "hdmi", "hdmi_wakeup";
 		clocks = <&cru PCLK_HDMI_HOST>,
 			 <&cru CLK_HDMI_SFR>,
 			 <&cru CLK_HDMI_CEC>,
@@ -2325,8 +2332,9 @@
 		compatible = "operating-points-v2";
 
 		mbist-vmin = <825000 900000 950000>;
-		nvmem-cells = <&log_leakage>, <&core_pvtm>, <&mbist_vmin>;
-		nvmem-cell-names = "leakage", "pvtm", "mbist-vmin";
+		nvmem-cells = <&log_leakage>, <&core_pvtm>, <&mbist_vmin>, <&dmc_opp_info>;
+		nvmem-cell-names = "leakage", "pvtm", "mbist-vmin", "opp-info";
+		rockchip,max-volt = <1000000>;
 		rockchip,temp-hysteresis = <5000>;
 		rockchip,low-temp = <0>;
 		rockchip,low-temp-adjust-volt = <
@@ -2345,9 +2353,9 @@
 
 		opp-1560000000 {
 			opp-hz = /bits/ 64 <1560000000>;
-			opp-microvolt = <900000>;
-			opp-microvolt-L0 = <900000>;
-			opp-microvolt-L1 = <850000>;
+			opp-microvolt = <900000 900000 1000000>;
+			opp-microvolt-L0 = <900000 900000 1000000>;
+			opp-microvolt-L1 = <875000 875000 1000000>;
 		};
 	};
 
@@ -2398,7 +2406,7 @@
 		reg-names = "pcie-dbi", "pcie-apb";
 		resets = <&cru SRST_PCIE20_POWERUP>;
 		reset-names = "pipe";
-		status = "okay";
+		status = "disabled";
 
 		pcie2x1_intc: legacy-interrupt-controller {
 			interrupt-controller;
@@ -2517,6 +2525,13 @@
 		};
 	};
 
+	gmac_uio0: uio@fe2a0000 {
+		compatible = "rockchip,uio-gmac";
+		reg = <0x0 0xfe2a0000 0x0 0x10000>;
+		rockchip,ethernet = <&gmac0>;
+		status = "disabled";
+	};
+
 	gmac0: ethernet@fe2a0000 {
 		compatible = "rockchip,rk3568-gmac", "snps,dwmac-4.20a";
 		reg = <0x0 0xfe2a0000 0x0 0x10000>;
@@ -2528,12 +2543,12 @@
 			 <&cru SCLK_GMAC0_RX_TX>, <&cru CLK_MAC0_REFOUT>,
 			 <&cru ACLK_GMAC0>, <&cru PCLK_GMAC0>,
 			 <&cru SCLK_GMAC0_RX_TX>, <&cru CLK_GMAC0_PTP_REF>,
-			 <&cru PCLK_XPCS>;
+			 <&cru PCLK_XPCS>, <&cru CLK_XPCS_EEE>;
 		clock-names = "stmmaceth", "mac_clk_rx",
 			      "mac_clk_tx", "clk_mac_refout",
 			      "aclk_mac", "pclk_mac",
 			      "clk_mac_speed", "ptp_ref",
-			      "pclk_xpcs";
+			      "pclk_xpcs", "clk_xpcs_eee";
 		resets = <&cru SRST_A_GMAC0>;
 		reset-names = "stmmaceth";
 
@@ -2718,6 +2733,18 @@
 		};
 		tsadc_trim_base: tsadc-trim-base@32 {
 			reg = <0x32 0x1>;
+		};
+		cpu_opp_info: cpu-opp-info@36 {
+			reg = <0x36 0x6>;
+		};
+		gpu_opp_info: gpu-opp-info@3c {
+			reg = <0x3c 0x6>;
+		};
+		npu_opp_info: npu-opp-info@42 {
+			reg = <0x42 0x6>;
+		};
+		dmc_opp_info: dmc-opp-info@48 {
+			reg = <0x48 0x6>;
 		};
 	};
 
@@ -3112,7 +3139,7 @@
 		dmas = <&dmac0 2>, <&dmac0 3>;
 		pinctrl-names = "default";
 		pinctrl-0 = <&uart1m0_xfer>;
-		status = "okay";
+		status = "disabled";
 	};
 
 	uart2: serial@fe660000 {
diff --git a/kernel/arch/arm64/boot/dts/rockchip/rk3568j.dtsi b/kernel/arch/arm64/boot/dts/rockchip/rk3568j.dtsi
index e86cf3e..0b05c46 100644
--- a/kernel/arch/arm64/boot/dts/rockchip/rk3568j.dtsi
+++ b/kernel/arch/arm64/boot/dts/rockchip/rk3568j.dtsi
@@ -85,7 +85,7 @@
 	/delete-node/ opp-1560000000;
 	opp-780000000 {
 		opp-hz = /bits/ 64 <780000000>;
-		opp-microvolt = <850000>;
+		opp-microvolt = <875000>;
 	};
 };
 
diff --git a/kernel/arch/arm64/configs/px30_linux_defconfig b/kernel/arch/arm64/configs/px30_linux_defconfig
index b71b414..d3b7a7f 100644
--- a/kernel/arch/arm64/configs/px30_linux_defconfig
+++ b/kernel/arch/arm64/configs/px30_linux_defconfig
@@ -365,9 +365,6 @@
 CONFIG_DEVFREQ_EVENT_ROCKCHIP_NOCP=y
 CONFIG_MEMORY=y
 CONFIG_IIO=y
-CONFIG_IIO_BUFFER=y
-CONFIG_IIO_KFIFO_BUF=y
-CONFIG_IIO_TRIGGER=y
 CONFIG_ROCKCHIP_SARADC=y
 CONFIG_SENSORS_ISL29018=y
 CONFIG_SENSORS_TSL2563=y
@@ -403,6 +400,8 @@
 CONFIG_SQUASHFS=y
 CONFIG_PSTORE=y
 CONFIG_PSTORE_CONSOLE=y
+CONFIG_PSTORE_PMSG=y
+CONFIG_PSTORE_FTRACE=y
 CONFIG_PSTORE_RAM=y
 CONFIG_NFS_FS=y
 CONFIG_NFS_V3_ACL=y
diff --git a/kernel/arch/arm64/configs/rk3326_linux.config b/kernel/arch/arm64/configs/rk3326_linux.config
index 02bdbca..51e7dca 100644
--- a/kernel/arch/arm64/configs/rk3326_linux.config
+++ b/kernel/arch/arm64/configs/rk3326_linux.config
@@ -1,26 +1,13 @@
 # CONFIG_ETHERNET is not set
 CONFIG_MD=y
-CONFIG_PSTORE=y
 # CONFIG_ROCKCHIP_ANALOGIX_DP is not set
-CONFIG_SND_SOC_ROCKCHIP_MULTICODECS=y
 CONFIG_SND_SOC_ROCKCHIP_MULTI_DAIS=y
-CONFIG_SND_SOC_ROCKCHIP_PDM=y
-CONFIG_USB_CONFIGFS_F_MTP=y
 CONFIG_VIDEO_GC2155=y
 CONFIG_VIDEO_ROCKCHIP_CIF=y
 # CONFIG_BCACHE is not set
 # CONFIG_BLK_DEV_DM is not set
 # CONFIG_BLK_DEV_MD is not set
-# CONFIG_DPM_WATCHDOG is not set
-CONFIG_PSTORE_CONSOLE=y
-# CONFIG_PSTORE_FTRACE is not set
-# CONFIG_PSTORE_PMSG is not set
-CONFIG_PSTORE_RAM=y
-CONFIG_REED_SOLOMON=y
-CONFIG_REED_SOLOMON_DEC8=y
-CONFIG_REED_SOLOMON_ENC8=y
+CONFIG_ROCKCHIP_CIF_USE_DUMMY_BUF=y
+# CONFIG_ROCKCHIP_CIF_USE_NONE_DUMMY_BUF is not set
 # CONFIG_ROCKCHIP_CIF_WORKMODE_ONEFRAME is not set
 CONFIG_ROCKCHIP_CIF_WORKMODE_PINGPONG=y
-# CONFIG_USB_CONFIGFS_F_PTP is not set
-CONFIG_USB_F_MTP=y
-CONFIG_ZLIB_DEFLATE=y
diff --git a/kernel/arch/arm64/configs/rk3358_linux.config b/kernel/arch/arm64/configs/rk3358_linux.config
index 4be7a7c..5884a7b 100644
--- a/kernel/arch/arm64/configs/rk3358_linux.config
+++ b/kernel/arch/arm64/configs/rk3358_linux.config
@@ -1,2 +1,15 @@
+# CONFIG_ETHERNET is not set
 CONFIG_LTE=y
+CONFIG_MD=y
+# CONFIG_ROCKCHIP_ANALOGIX_DP is not set
+CONFIG_SND_SOC_ROCKCHIP_MULTI_DAIS=y
+CONFIG_VIDEO_GC2155=y
+CONFIG_VIDEO_ROCKCHIP_CIF=y
+# CONFIG_BCACHE is not set
+# CONFIG_BLK_DEV_DM is not set
+# CONFIG_BLK_DEV_MD is not set
 CONFIG_LTE_RM310=y
+CONFIG_ROCKCHIP_CIF_USE_DUMMY_BUF=y
+# CONFIG_ROCKCHIP_CIF_USE_NONE_DUMMY_BUF is not set
+# CONFIG_ROCKCHIP_CIF_WORKMODE_ONEFRAME is not set
+CONFIG_ROCKCHIP_CIF_WORKMODE_PINGPONG=y
diff --git a/kernel/arch/arm64/configs/rk3528_box.config b/kernel/arch/arm64/configs/rk3528_box.config
new file mode 100644
index 0000000..7e1102d
--- /dev/null
+++ b/kernel/arch/arm64/configs/rk3528_box.config
@@ -0,0 +1,65 @@
+# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
+# CONFIG_BATTERY_CW2015 is not set
+# CONFIG_CHARGER_BQ25700 is not set
+# CONFIG_CPU_PX30 is not set
+# CONFIG_CPU_RK3328 is not set
+# CONFIG_CPU_RK3368 is not set
+# CONFIG_CPU_RK3399 is not set
+# CONFIG_CPU_RK3568 is not set
+# CONFIG_CRYPTO_DEV_ROCKCHIP_V1 is not set
+# CONFIG_CRYPTO_DEV_ROCKCHIP_V2 is not set
+# CONFIG_DRM_ROCKCHIP_RK618 is not set
+# CONFIG_DRM_ROCKCHIP_RK628 is not set
+# CONFIG_FUSB_30X is not set
+# CONFIG_INPUT_TOUCHSCREEN is not set
+# CONFIG_LEDS_RGB13H is not set
+# CONFIG_MALI_BIFROST is not set
+# CONFIG_MALI_MIDGARD is not set
+# CONFIG_REGULATOR_ACT8865 is not set
+# CONFIG_REGULATOR_DIO5632 is not set
+# CONFIG_REGULATOR_FAN53555 is not set
+# CONFIG_REGULATOR_LP8752 is not set
+# CONFIG_REGULATOR_MP8865 is not set
+# CONFIG_REGULATOR_TPS65132 is not set
+# CONFIG_REGULATOR_XZ3216 is not set
+# CONFIG_RK_NAND is not set
+# CONFIG_ROCKCHIP_ANALOGIX_DP is not set
+# CONFIG_ROCKCHIP_CDN_DP is not set
+# CONFIG_ROCKCHIP_CLK_BOOST is not set
+# CONFIG_ROCKCHIP_DDRCLK_SIP is not set
+# CONFIG_ROCKCHIP_DW_MIPI_DSI is not set
+# CONFIG_ROCKCHIP_INNO_HDMI is not set
+# CONFIG_ROCKCHIP_LVDS is not set
+# CONFIG_ROCKCHIP_PLL_RK3066 is not set
+# CONFIG_ROCKCHIP_PLL_RK3399 is not set
+# CONFIG_ROCKCHIP_RGB is not set
+# CONFIG_ROCKCHIP_RKNPU is not set
+# CONFIG_ROCKCHIP_VOP is not set
+# CONFIG_SENSOR_DEVICE is not set
+# CONFIG_VIDEO_DW9714 is not set
+# CONFIG_VIDEO_GC0312 is not set
+# CONFIG_VIDEO_GC032A is not set
+# CONFIG_VIDEO_GC2053 is not set
+# CONFIG_VIDEO_GC2093 is not set
+# CONFIG_VIDEO_GC2145 is not set
+# CONFIG_VIDEO_GC2355 is not set
+# CONFIG_VIDEO_GC2385 is not set
+# CONFIG_VIDEO_GC4C33 is not set
+# CONFIG_VIDEO_GC8034 is not set
+# CONFIG_VIDEO_LT6911UXC is not set
+# CONFIG_VIDEO_LT8619C is not set
+# CONFIG_VIDEO_OV13850 is not set
+# CONFIG_VIDEO_OV2680 is not set
+# CONFIG_VIDEO_OV5648 is not set
+# CONFIG_VIDEO_OV5695 is not set
+# CONFIG_VIDEO_OV8858 is not set
+# CONFIG_VIDEO_RK628_CSI is not set
+# CONFIG_VIDEO_ROCKCHIP_ISP is not set
+# CONFIG_VIDEO_ROCKCHIP_ISP1 is not set
+# CONFIG_VIDEO_SGM3784 is not set
+# CONFIG_VIDEO_TC35874X is not set
+# CONFIG_VIDEO_VM149C is not set
+CONFIG_VLAN_8021Q=y
+# CONFIG_BRIDGE_VLAN_FILTERING is not set
+# CONFIG_VLAN_8021Q_GVRP is not set
+# CONFIG_VLAN_8021Q_MVRP is not set
diff --git a/kernel/arch/arm64/configs/rockchip_defconfig b/kernel/arch/arm64/configs/rockchip_defconfig
index 639f853..1dc96ba 100644
--- a/kernel/arch/arm64/configs/rockchip_defconfig
+++ b/kernel/arch/arm64/configs/rockchip_defconfig
@@ -675,6 +675,7 @@
 CONFIG_SND_SOC_ES8316=y
 CONFIG_SND_SOC_ES8396=y
 CONFIG_SND_SOC_RK3328=y
+CONFIG_SND_SOC_RK3528=y
 CONFIG_SND_SOC_RK817=y
 CONFIG_SND_SOC_RK_CODEC_DIGITAL=y
 CONFIG_SND_SOC_RT5640=y
@@ -844,6 +845,7 @@
 CONFIG_CPU_RK3328=y
 CONFIG_CPU_RK3368=y
 CONFIG_CPU_RK3399=y
+CONFIG_CPU_RK3528=y
 CONFIG_CPU_RK3568=y
 CONFIG_ANDROID_VERSION=0x08000000
 CONFIG_ROCKCHIP_PM_DOMAINS=y
diff --git a/kernel/arch/arm64/configs/rockchip_linux_defconfig b/kernel/arch/arm64/configs/rockchip_linux_defconfig
index f37d5dc..2efcace 100644
--- a/kernel/arch/arm64/configs/rockchip_linux_defconfig
+++ b/kernel/arch/arm64/configs/rockchip_linux_defconfig
@@ -4,10 +4,10 @@
 #
 
 #
-# Compiler: aarch64-linux-gnu-gcc (Linaro GCC 6.3-2017.05) 6.3.1 20170404
+# Compiler: aarch64-none-linux-gnu-gcc (GNU Toolchain for the A-profile Architecture 10.3-2021.07 (arm-10.29)) 10.3.1 20210621
 #
 CONFIG_CC_IS_GCC=y
-CONFIG_GCC_VERSION=60301
+CONFIG_GCC_VERSION=100301
 CONFIG_CLANG_VERSION=0
 CONFIG_LLD_VERSION=0
 CONFIG_CC_HAS_ASM_GOTO=y
@@ -28,11 +28,10 @@
 CONFIG_KERNEL_GZIP=y
 # CONFIG_KERNEL_LZ4 is not set
 CONFIG_DEFAULT_HOSTNAME="localhost"
-CONFIG_SWAP=y
+# CONFIG_SWAP is not set
 CONFIG_SYSVIPC=y
 CONFIG_SYSVIPC_SYSCTL=y
-CONFIG_POSIX_MQUEUE=y
-CONFIG_POSIX_MQUEUE_SYSCTL=y
+# CONFIG_POSIX_MQUEUE is not set
 CONFIG_CROSS_MEMORY_ATTACH=y
 # CONFIG_USELIB is not set
 # CONFIG_AUDIT is not set
@@ -67,15 +66,22 @@
 # Timers subsystem
 #
 CONFIG_TICK_ONESHOT=y
-CONFIG_NO_HZ_COMMON=y
-# CONFIG_HZ_PERIODIC is not set
-CONFIG_NO_HZ_IDLE=y
+CONFIG_HZ_PERIODIC=y
+# CONFIG_NO_HZ_IDLE is not set
 # CONFIG_NO_HZ_FULL is not set
 CONFIG_NO_HZ=y
 CONFIG_HIGH_RES_TIMERS=y
+CONFIG_PREEMPT=y
+CONFIG_PREEMPT_RT_BASE=y
+CONFIG_PREEMPT_RT=y
+CONFIG_HAVE_PREEMPT_LAZY=y
+CONFIG_PREEMPT_LAZY=y
 # CONFIG_PREEMPT_NONE is not set
-CONFIG_PREEMPT_VOLUNTARY=y
-# CONFIG_PREEMPT is not set
+# CONFIG_PREEMPT_VOLUNTARY is not set
+# CONFIG_PREEMPT__LL is not set
+# CONFIG_PREEMPT_RTB is not set
+CONFIG_PREEMPT_RT_FULL=y
+CONFIG_PREEMPT_COUNT=y
 
 #
 # CPU/Task time and stats accounting
@@ -91,12 +97,15 @@
 #
 # RCU Subsystem
 #
-CONFIG_TREE_RCU=y
+CONFIG_PREEMPT_RCU=y
 # CONFIG_RCU_EXPERT is not set
 CONFIG_SRCU=y
 CONFIG_TREE_SRCU=y
+CONFIG_TASKS_RCU=y
 CONFIG_RCU_STALL_COMMON=y
 CONFIG_RCU_NEED_SEGCBLIST=y
+CONFIG_RCU_BOOST=y
+CONFIG_RCU_BOOST_DELAY=500
 CONFIG_BUILD_BIN2C=y
 CONFIG_IKCONFIG=y
 CONFIG_IKCONFIG_PROC=y
@@ -112,26 +121,17 @@
 CONFIG_ARCH_SUPPORTS_NUMA_BALANCING=y
 CONFIG_ARCH_SUPPORTS_INT128=y
 CONFIG_CGROUPS=y
-CONFIG_PAGE_COUNTER=y
-CONFIG_MEMCG=y
-# CONFIG_MEMCG_SWAP is not set
-CONFIG_MEMCG_KMEM=y
+# CONFIG_MEMCG is not set
 # CONFIG_BLK_CGROUP is not set
-CONFIG_CGROUP_SCHED=y
-CONFIG_FAIR_GROUP_SCHED=y
-CONFIG_CFS_BANDWIDTH=y
-# CONFIG_RT_GROUP_SCHED is not set
+# CONFIG_CGROUP_SCHED is not set
 # CONFIG_CGROUP_PIDS is not set
 # CONFIG_CGROUP_RDMA is not set
 CONFIG_CGROUP_FREEZER=y
 CONFIG_CPUSETS=y
 CONFIG_PROC_PID_CPUSET=y
 CONFIG_CGROUP_DEVICE=y
-CONFIG_CGROUP_CPUACCT=y
-# CONFIG_CGROUP_PERF is not set
-CONFIG_CGROUP_BPF=y
+# CONFIG_CGROUP_CPUACCT is not set
 # CONFIG_CGROUP_DEBUG is not set
-CONFIG_SOCK_CGROUP_DATA=y
 CONFIG_NAMESPACES=y
 CONFIG_UTS_NS=y
 CONFIG_IPC_NS=y
@@ -185,8 +185,7 @@
 CONFIG_KALLSYMS=y
 # CONFIG_KALLSYMS_ALL is not set
 CONFIG_KALLSYMS_BASE_RELATIVE=y
-CONFIG_BPF_SYSCALL=y
-# CONFIG_BPF_UNPRIV_DEFAULT_OFF is not set
+# CONFIG_BPF_SYSCALL is not set
 # CONFIG_USERFAULTFD is not set
 CONFIG_ARCH_HAS_MEMBARRIER_SYNC_CORE=y
 CONFIG_RSEQ=y
@@ -198,23 +197,17 @@
 #
 # Kernel Performance Events And Counters
 #
-CONFIG_PERF_EVENTS=y
-# CONFIG_DEBUG_PERF_USE_VMALLOC is not set
+# CONFIG_PERF_EVENTS is not set
 CONFIG_VM_EVENT_COUNTERS=y
 CONFIG_SLUB_SYSFS=y
 CONFIG_SLUB_DEBUG=y
-# CONFIG_SLUB_MEMCG_SYSFS_ON is not set
 # CONFIG_COMPAT_BRK is not set
-# CONFIG_SLAB is not set
 CONFIG_SLUB=y
-# CONFIG_SLOB is not set
 CONFIG_SLAB_MERGE_DEFAULT=y
 # CONFIG_SLAB_FREELIST_RANDOM is not set
 # CONFIG_SLAB_FREELIST_HARDENED is not set
-CONFIG_SLUB_CPU_PARTIAL=y
 CONFIG_SYSTEM_DATA_VERIFICATION=y
-CONFIG_PROFILING=y
-CONFIG_TRACEPOINTS=y
+# CONFIG_PROFILING is not set
 CONFIG_ARM64=y
 CONFIG_64BIT=y
 CONFIG_MMU=y
@@ -334,6 +327,7 @@
 CONFIG_PCIE_DW_ROCKCHIP=y
 # CONFIG_PCIE_DW_DMATEST is not set
 # CONFIG_PCIE_DW_ROCKCHIP_EP is not set
+CONFIG_PCIE_RK_THREADED_INIT=y
 # CONFIG_PCI_HISI is not set
 # CONFIG_PCIE_KIRIN is not set
 
@@ -391,9 +385,9 @@
 CONFIG_HOLES_IN_ZONE=y
 # CONFIG_HZ_100 is not set
 # CONFIG_HZ_250 is not set
-CONFIG_HZ_300=y
-# CONFIG_HZ_1000 is not set
-CONFIG_HZ=300
+# CONFIG_HZ_300 is not set
+CONFIG_HZ_1000=y
+CONFIG_HZ=1000
 CONFIG_SCHED_HRTICK=y
 CONFIG_ARCH_SUPPORTS_DEBUG_PAGEALLOC=y
 CONFIG_ARCH_HAS_HOLES_MEMORYMODEL=y
@@ -402,7 +396,6 @@
 CONFIG_ARCH_SELECT_MEMORY_MODEL=y
 CONFIG_ARCH_FLATMEM_ENABLE=y
 CONFIG_HAVE_ARCH_PFN_VALID=y
-CONFIG_HW_PERF_EVENTS=y
 CONFIG_SYS_SUPPORTS_HUGETLBFS=y
 CONFIG_ARCH_WANT_HUGE_PMD_SHARE=y
 CONFIG_ARCH_HAS_CACHE_LINE_SIZE=y
@@ -460,7 +453,6 @@
 # CONFIG_SUSPEND_SKIP_SYNC is not set
 CONFIG_HAS_WAKELOCK=y
 CONFIG_WAKELOCK=y
-# CONFIG_HIBERNATION is not set
 CONFIG_PM_SLEEP=y
 CONFIG_PM_SLEEP_SMP=y
 # CONFIG_PM_AUTOSLEEP is not set
@@ -489,15 +481,13 @@
 # CPU Idle
 #
 CONFIG_CPU_IDLE=y
-CONFIG_CPU_IDLE_MULTIPLE_DRIVERS=y
 # CONFIG_CPU_IDLE_GOV_LADDER is not set
 CONFIG_CPU_IDLE_GOV_MENU=y
-CONFIG_DT_IDLE_STATES=y
 
 #
 # ARM CPU Idle Drivers
 #
-CONFIG_ARM_CPUIDLE=y
+# CONFIG_ARM_CPUIDLE is not set
 
 #
 # CPU Frequency scaling
@@ -507,13 +497,13 @@
 CONFIG_CPU_FREQ_GOV_COMMON=y
 # CONFIG_CPU_FREQ_STAT is not set
 # CONFIG_CPU_FREQ_TIMES is not set
-# CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE is not set
+CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE=y
 # CONFIG_CPU_FREQ_DEFAULT_GOV_POWERSAVE is not set
 # CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE is not set
 # CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND is not set
 # CONFIG_CPU_FREQ_DEFAULT_GOV_CONSERVATIVE is not set
 # CONFIG_CPU_FREQ_DEFAULT_GOV_SCHEDUTIL is not set
-CONFIG_CPU_FREQ_DEFAULT_GOV_INTERACTIVE=y
+# CONFIG_CPU_FREQ_DEFAULT_GOV_INTERACTIVE is not set
 CONFIG_CPU_FREQ_GOV_PERFORMANCE=y
 CONFIG_CPU_FREQ_GOV_POWERSAVE=y
 CONFIG_CPU_FREQ_GOV_USERSPACE=y
@@ -554,30 +544,15 @@
 CONFIG_ARM64_CRYPTO=y
 CONFIG_CRYPTO_SHA256_ARM64=y
 # CONFIG_CRYPTO_SHA512_ARM64 is not set
-CONFIG_CRYPTO_SHA1_ARM64_CE=y
-CONFIG_CRYPTO_SHA2_ARM64_CE=y
-# CONFIG_CRYPTO_SHA512_ARM64_CE is not set
-# CONFIG_CRYPTO_SHA3_ARM64 is not set
-# CONFIG_CRYPTO_SM3_ARM64_CE is not set
-# CONFIG_CRYPTO_SM4_ARM64_CE is not set
-CONFIG_CRYPTO_GHASH_ARM64_CE=y
-# CONFIG_CRYPTO_CRCT10DIF_ARM64_CE is not set
 # CONFIG_CRYPTO_CRC32_ARM64_CE is not set
 CONFIG_CRYPTO_AES_ARM64=y
-CONFIG_CRYPTO_AES_ARM64_CE=y
-CONFIG_CRYPTO_AES_ARM64_CE_CCM=y
-CONFIG_CRYPTO_AES_ARM64_CE_BLK=y
-# CONFIG_CRYPTO_AES_ARM64_NEON_BLK is not set
-# CONFIG_CRYPTO_CHACHA20_NEON is not set
 # CONFIG_CRYPTO_POLY1305_NEON is not set
-# CONFIG_CRYPTO_AES_ARM64_BS is not set
 
 #
 # General architecture-dependent options
 #
 # CONFIG_KPROBES is not set
 # CONFIG_JUMP_LABEL is not set
-CONFIG_UPROBES=y
 CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS=y
 CONFIG_HAVE_KPROBES=y
 CONFIG_HAVE_KRETPROBES=y
@@ -592,7 +567,6 @@
 CONFIG_HAVE_REGS_AND_STACK_ACCESS_API=y
 CONFIG_HAVE_RSEQ=y
 CONFIG_HAVE_CLK=y
-CONFIG_HAVE_HW_BREAKPOINT=y
 CONFIG_HAVE_PERF_REGS=y
 CONFIG_HAVE_PERF_USER_STACK_DUMP=y
 CONFIG_HAVE_ARCH_JUMP_LABEL=y
@@ -662,7 +636,6 @@
 # CONFIG_MODULE_SIG is not set
 # CONFIG_MODULE_COMPRESS is not set
 # CONFIG_TRIM_UNUSED_KSYMS is not set
-CONFIG_MODULES_TREE_LOOKUP=y
 CONFIG_BLOCK=y
 CONFIG_BLK_SCSI_REQUEST=y
 CONFIG_BLK_DEV_BSG=y
@@ -716,37 +689,7 @@
 CONFIG_MQ_IOSCHED_KYBER=y
 # CONFIG_IOSCHED_BFQ is not set
 CONFIG_ASN1=y
-CONFIG_ARCH_INLINE_SPIN_TRYLOCK=y
-CONFIG_ARCH_INLINE_SPIN_TRYLOCK_BH=y
-CONFIG_ARCH_INLINE_SPIN_LOCK=y
-CONFIG_ARCH_INLINE_SPIN_LOCK_BH=y
-CONFIG_ARCH_INLINE_SPIN_LOCK_IRQ=y
-CONFIG_ARCH_INLINE_SPIN_LOCK_IRQSAVE=y
-CONFIG_ARCH_INLINE_SPIN_UNLOCK=y
-CONFIG_ARCH_INLINE_SPIN_UNLOCK_BH=y
-CONFIG_ARCH_INLINE_SPIN_UNLOCK_IRQ=y
-CONFIG_ARCH_INLINE_SPIN_UNLOCK_IRQRESTORE=y
-CONFIG_ARCH_INLINE_READ_LOCK=y
-CONFIG_ARCH_INLINE_READ_LOCK_BH=y
-CONFIG_ARCH_INLINE_READ_LOCK_IRQ=y
-CONFIG_ARCH_INLINE_READ_LOCK_IRQSAVE=y
-CONFIG_ARCH_INLINE_READ_UNLOCK=y
-CONFIG_ARCH_INLINE_READ_UNLOCK_BH=y
-CONFIG_ARCH_INLINE_READ_UNLOCK_IRQ=y
-CONFIG_ARCH_INLINE_READ_UNLOCK_IRQRESTORE=y
-CONFIG_ARCH_INLINE_WRITE_LOCK=y
-CONFIG_ARCH_INLINE_WRITE_LOCK_BH=y
-CONFIG_ARCH_INLINE_WRITE_LOCK_IRQ=y
-CONFIG_ARCH_INLINE_WRITE_LOCK_IRQSAVE=y
-CONFIG_ARCH_INLINE_WRITE_UNLOCK=y
-CONFIG_ARCH_INLINE_WRITE_UNLOCK_BH=y
-CONFIG_ARCH_INLINE_WRITE_UNLOCK_IRQ=y
-CONFIG_ARCH_INLINE_WRITE_UNLOCK_IRQRESTORE=y
-CONFIG_UNINLINE_SPIN_UNLOCK=y
 CONFIG_ARCH_SUPPORTS_ATOMIC_RMW=y
-CONFIG_MUTEX_SPIN_ON_OWNER=y
-CONFIG_RWSEM_SPIN_ON_OWNER=y
-CONFIG_LOCK_SPIN_ON_OWNER=y
 CONFIG_ARCH_USE_QUEUED_SPINLOCKS=y
 CONFIG_QUEUED_SPINLOCKS=y
 CONFIG_ARCH_USE_QUEUED_RWLOCKS=y
@@ -802,9 +745,7 @@
 CONFIG_DEFAULT_MMAP_MIN_ADDR=32768
 CONFIG_ARCH_SUPPORTS_MEMORY_FAILURE=y
 # CONFIG_MEMORY_FAILURE is not set
-# CONFIG_TRANSPARENT_HUGEPAGE is not set
 # CONFIG_CLEANCACHE is not set
-# CONFIG_FRONTSWAP is not set
 CONFIG_CMA=y
 # CONFIG_CMA_DEBUG is not set
 # CONFIG_CMA_DEBUGFS is not set
@@ -844,7 +785,6 @@
 # CONFIG_XFRM_STATISTICS is not set
 CONFIG_NET_KEY=y
 # CONFIG_NET_KEY_MIGRATE is not set
-# CONFIG_XDP_SOCKETS is not set
 CONFIG_INET=y
 CONFIG_IP_MULTICAST=y
 CONFIG_IP_ADVANCED_ROUTER=y
@@ -896,60 +836,30 @@
 # CONFIG_NETWORK_PHY_TIMESTAMPING is not set
 CONFIG_NETFILTER=y
 CONFIG_NETFILTER_ADVANCED=y
-CONFIG_BRIDGE_NETFILTER=y
 
 #
 # Core Netfilter Configuration
 #
 CONFIG_NETFILTER_INGRESS=y
-CONFIG_NETFILTER_FAMILY_BRIDGE=y
 # CONFIG_NETFILTER_NETLINK_ACCT is not set
 # CONFIG_NETFILTER_NETLINK_QUEUE is not set
 # CONFIG_NETFILTER_NETLINK_LOG is not set
 # CONFIG_NETFILTER_NETLINK_OSF is not set
-CONFIG_NF_CONNTRACK=y
+# CONFIG_NF_CONNTRACK is not set
 # CONFIG_NF_LOG_NETDEV is not set
-# CONFIG_NF_CONNTRACK_MARK is not set
-# CONFIG_NF_CONNTRACK_ZONES is not set
-CONFIG_NF_CONNTRACK_PROCFS=y
-# CONFIG_NF_CONNTRACK_EVENTS is not set
-# CONFIG_NF_CONNTRACK_TIMEOUT is not set
-# CONFIG_NF_CONNTRACK_TIMESTAMP is not set
-# CONFIG_NF_CONNTRACK_LABELS is not set
-CONFIG_NF_CT_PROTO_DCCP=y
-CONFIG_NF_CT_PROTO_SCTP=y
-CONFIG_NF_CT_PROTO_UDPLITE=y
-# CONFIG_NF_CONNTRACK_AMANDA is not set
-# CONFIG_NF_CONNTRACK_FTP is not set
-# CONFIG_NF_CONNTRACK_H323 is not set
-# CONFIG_NF_CONNTRACK_IRC is not set
-# CONFIG_NF_CONNTRACK_NETBIOS_NS is not set
-# CONFIG_NF_CONNTRACK_SNMP is not set
-# CONFIG_NF_CONNTRACK_PPTP is not set
-# CONFIG_NF_CONNTRACK_SANE is not set
-# CONFIG_NF_CONNTRACK_SIP is not set
-# CONFIG_NF_CONNTRACK_TFTP is not set
-# CONFIG_NF_CT_NETLINK is not set
-CONFIG_NF_NAT=y
-CONFIG_NF_NAT_NEEDED=y
-CONFIG_NF_NAT_PROTO_DCCP=y
-CONFIG_NF_NAT_PROTO_UDPLITE=y
-CONFIG_NF_NAT_PROTO_SCTP=y
 # CONFIG_NF_TABLES is not set
 CONFIG_NETFILTER_XTABLES=y
 
 #
 # Xtables combined modules
 #
-CONFIG_NETFILTER_XT_MARK=y
-# CONFIG_NETFILTER_XT_CONNMARK is not set
+# CONFIG_NETFILTER_XT_MARK is not set
 
 #
 # Xtables targets
 #
 # CONFIG_NETFILTER_XT_TARGET_CHECKSUM is not set
 # CONFIG_NETFILTER_XT_TARGET_CLASSIFY is not set
-# CONFIG_NETFILTER_XT_TARGET_CONNMARK is not set
 # CONFIG_NETFILTER_XT_TARGET_DSCP is not set
 # CONFIG_NETFILTER_XT_TARGET_HL is not set
 # CONFIG_NETFILTER_XT_TARGET_HMARK is not set
@@ -957,12 +867,9 @@
 # CONFIG_NETFILTER_XT_TARGET_LED is not set
 # CONFIG_NETFILTER_XT_TARGET_LOG is not set
 # CONFIG_NETFILTER_XT_TARGET_MARK is not set
-CONFIG_NETFILTER_XT_NAT=y
-# CONFIG_NETFILTER_XT_TARGET_NETMAP is not set
 # CONFIG_NETFILTER_XT_TARGET_NFLOG is not set
 # CONFIG_NETFILTER_XT_TARGET_NFQUEUE is not set
 # CONFIG_NETFILTER_XT_TARGET_RATEEST is not set
-# CONFIG_NETFILTER_XT_TARGET_REDIRECT is not set
 # CONFIG_NETFILTER_XT_TARGET_TEE is not set
 # CONFIG_NETFILTER_XT_TARGET_TPROXY is not set
 # CONFIG_NETFILTER_XT_TARGET_TCPMSS is not set
@@ -971,16 +878,10 @@
 #
 # Xtables matches
 #
-CONFIG_NETFILTER_XT_MATCH_ADDRTYPE=y
+# CONFIG_NETFILTER_XT_MATCH_ADDRTYPE is not set
 # CONFIG_NETFILTER_XT_MATCH_BPF is not set
 # CONFIG_NETFILTER_XT_MATCH_CGROUP is not set
-# CONFIG_NETFILTER_XT_MATCH_CLUSTER is not set
 # CONFIG_NETFILTER_XT_MATCH_COMMENT is not set
-# CONFIG_NETFILTER_XT_MATCH_CONNBYTES is not set
-# CONFIG_NETFILTER_XT_MATCH_CONNLABEL is not set
-# CONFIG_NETFILTER_XT_MATCH_CONNLIMIT is not set
-# CONFIG_NETFILTER_XT_MATCH_CONNMARK is not set
-CONFIG_NETFILTER_XT_MATCH_CONNTRACK=y
 # CONFIG_NETFILTER_XT_MATCH_CPU is not set
 # CONFIG_NETFILTER_XT_MATCH_DCCP is not set
 # CONFIG_NETFILTER_XT_MATCH_DEVGROUP is not set
@@ -988,11 +889,9 @@
 # CONFIG_NETFILTER_XT_MATCH_ECN is not set
 # CONFIG_NETFILTER_XT_MATCH_ESP is not set
 # CONFIG_NETFILTER_XT_MATCH_HASHLIMIT is not set
-# CONFIG_NETFILTER_XT_MATCH_HELPER is not set
 # CONFIG_NETFILTER_XT_MATCH_HL is not set
 # CONFIG_NETFILTER_XT_MATCH_IPCOMP is not set
 # CONFIG_NETFILTER_XT_MATCH_IPRANGE is not set
-CONFIG_NETFILTER_XT_MATCH_IPVS=y
 # CONFIG_NETFILTER_XT_MATCH_L2TP is not set
 # CONFIG_NETFILTER_XT_MATCH_LENGTH is not set
 # CONFIG_NETFILTER_XT_MATCH_LIMIT is not set
@@ -1003,7 +902,6 @@
 # CONFIG_NETFILTER_XT_MATCH_OSF is not set
 # CONFIG_NETFILTER_XT_MATCH_OWNER is not set
 # CONFIG_NETFILTER_XT_MATCH_POLICY is not set
-# CONFIG_NETFILTER_XT_MATCH_PHYSDEV is not set
 # CONFIG_NETFILTER_XT_MATCH_PKTTYPE is not set
 # CONFIG_NETFILTER_XT_MATCH_QUOTA is not set
 # CONFIG_NETFILTER_XT_MATCH_QUOTA2 is not set
@@ -1012,85 +910,30 @@
 # CONFIG_NETFILTER_XT_MATCH_RECENT is not set
 # CONFIG_NETFILTER_XT_MATCH_SCTP is not set
 # CONFIG_NETFILTER_XT_MATCH_SOCKET is not set
-# CONFIG_NETFILTER_XT_MATCH_STATE is not set
 # CONFIG_NETFILTER_XT_MATCH_STATISTIC is not set
 # CONFIG_NETFILTER_XT_MATCH_STRING is not set
 # CONFIG_NETFILTER_XT_MATCH_TCPMSS is not set
 # CONFIG_NETFILTER_XT_MATCH_TIME is not set
 # CONFIG_NETFILTER_XT_MATCH_U32 is not set
 # CONFIG_IP_SET is not set
-CONFIG_IP_VS=y
-# CONFIG_IP_VS_IPV6 is not set
-# CONFIG_IP_VS_DEBUG is not set
-CONFIG_IP_VS_TAB_BITS=12
-
-#
-# IPVS transport protocol load balancing support
-#
-# CONFIG_IP_VS_PROTO_TCP is not set
-# CONFIG_IP_VS_PROTO_UDP is not set
-# CONFIG_IP_VS_PROTO_ESP is not set
-# CONFIG_IP_VS_PROTO_AH is not set
-# CONFIG_IP_VS_PROTO_SCTP is not set
-
-#
-# IPVS scheduler
-#
-# CONFIG_IP_VS_RR is not set
-# CONFIG_IP_VS_WRR is not set
-# CONFIG_IP_VS_LC is not set
-# CONFIG_IP_VS_WLC is not set
-# CONFIG_IP_VS_FO is not set
-# CONFIG_IP_VS_OVF is not set
-# CONFIG_IP_VS_LBLC is not set
-# CONFIG_IP_VS_LBLCR is not set
-# CONFIG_IP_VS_DH is not set
-# CONFIG_IP_VS_SH is not set
-# CONFIG_IP_VS_MH is not set
-# CONFIG_IP_VS_SED is not set
-# CONFIG_IP_VS_NQ is not set
-
-#
-# IPVS SH scheduler
-#
-CONFIG_IP_VS_SH_TAB_BITS=8
-
-#
-# IPVS MH scheduler
-#
-CONFIG_IP_VS_MH_TAB_INDEX=12
-
-#
-# IPVS application helper
-#
-# CONFIG_IP_VS_NFCT is not set
+# CONFIG_IP_VS is not set
 
 #
 # IP: Netfilter Configuration
 #
-CONFIG_NF_DEFRAG_IPV4=y
 # CONFIG_NF_SOCKET_IPV4 is not set
 # CONFIG_NF_TPROXY_IPV4 is not set
 # CONFIG_NF_DUP_IPV4 is not set
 # CONFIG_NF_LOG_ARP is not set
 # CONFIG_NF_LOG_IPV4 is not set
 # CONFIG_NF_REJECT_IPV4 is not set
-CONFIG_NF_NAT_IPV4=y
-CONFIG_NF_NAT_MASQUERADE_IPV4=y
 CONFIG_IP_NF_IPTABLES=y
 # CONFIG_IP_NF_MATCH_AH is not set
 # CONFIG_IP_NF_MATCH_ECN is not set
 # CONFIG_IP_NF_MATCH_RPFILTER is not set
 # CONFIG_IP_NF_MATCH_TTL is not set
-CONFIG_IP_NF_FILTER=y
-# CONFIG_IP_NF_TARGET_REJECT is not set
-# CONFIG_IP_NF_TARGET_SYNPROXY is not set
-CONFIG_IP_NF_NAT=y
-CONFIG_IP_NF_TARGET_MASQUERADE=y
-# CONFIG_IP_NF_TARGET_NETMAP is not set
-# CONFIG_IP_NF_TARGET_REDIRECT is not set
+# CONFIG_IP_NF_FILTER is not set
 CONFIG_IP_NF_MANGLE=y
-# CONFIG_IP_NF_TARGET_CLUSTERIP is not set
 # CONFIG_IP_NF_TARGET_ECN is not set
 # CONFIG_IP_NF_TARGET_TTL is not set
 # CONFIG_IP_NF_RAW is not set
@@ -1104,10 +947,7 @@
 # CONFIG_NF_DUP_IPV6 is not set
 # CONFIG_NF_REJECT_IPV6 is not set
 # CONFIG_NF_LOG_IPV6 is not set
-# CONFIG_NF_NAT_IPV6 is not set
 # CONFIG_IP6_NF_IPTABLES is not set
-CONFIG_NF_DEFRAG_IPV6=y
-# CONFIG_BRIDGE_NF_EBTABLES is not set
 # CONFIG_BPFILTER is not set
 # CONFIG_IP_DCCP is not set
 # CONFIG_IP_SCTP is not set
@@ -1115,14 +955,11 @@
 # CONFIG_TIPC is not set
 # CONFIG_ATM is not set
 # CONFIG_L2TP is not set
-CONFIG_STP=y
-CONFIG_BRIDGE=y
-CONFIG_BRIDGE_IGMP_SNOOPING=y
+# CONFIG_BRIDGE is not set
 CONFIG_HAVE_NET_DSA=y
 # CONFIG_NET_DSA is not set
 # CONFIG_VLAN_8021Q is not set
 # CONFIG_DECNET is not set
-CONFIG_LLC=y
 # CONFIG_LLC2 is not set
 # CONFIG_ATALK is not set
 # CONFIG_X25 is not set
@@ -1148,10 +985,8 @@
 CONFIG_XPS=y
 # CONFIG_CGROUP_NET_PRIO is not set
 # CONFIG_CGROUP_NET_CLASSID is not set
-CONFIG_NET_RX_BUSY_POLL=y
 CONFIG_BQL=y
 # CONFIG_BPF_JIT is not set
-# CONFIG_BPF_STREAM_PARSER is not set
 CONFIG_ETHTOOL=y
 CONFIG_FILTER=y
 CONFIG_NET_FLOW_LIMIT=y
@@ -1160,7 +995,6 @@
 # Network testing
 #
 # CONFIG_NET_PKTGEN is not set
-# CONFIG_NET_DROP_MONITOR is not set
 # CONFIG_HAMRADIO is not set
 # CONFIG_CAN is not set
 CONFIG_BT=y
@@ -1344,7 +1178,6 @@
 # CONFIG_SSFDC is not set
 # CONFIG_SM_FTL is not set
 # CONFIG_MTD_OOPS is not set
-# CONFIG_MTD_SWAP is not set
 # CONFIG_MTD_PARTITIONED_MASTER is not set
 
 #
@@ -1419,9 +1252,7 @@
 # CONFIG_BLK_DEV_NULL_BLK is not set
 CONFIG_CDROM=y
 # CONFIG_BLK_DEV_PCIESSD_MTIP32XX is not set
-CONFIG_ZRAM=y
-# CONFIG_ZRAM_WRITEBACK is not set
-# CONFIG_ZRAM_MEMORY_TRACKING is not set
+# CONFIG_ZRAM is not set
 # CONFIG_BLK_DEV_DAC960 is not set
 # CONFIG_BLK_DEV_UMEM is not set
 CONFIG_BLK_DEV_LOOP=y
@@ -1480,7 +1311,7 @@
 #
 # EEPROM support
 #
-CONFIG_EEPROM_AT24=y
+# CONFIG_EEPROM_AT24 is not set
 # CONFIG_EEPROM_AT25 is not set
 # CONFIG_EEPROM_LEGACY is not set
 # CONFIG_EEPROM_MAX6875 is not set
@@ -1638,7 +1469,6 @@
 # CONFIG_ATA_SFF is not set
 CONFIG_MD=y
 # CONFIG_BLK_DEV_MD is not set
-# CONFIG_BCACHE is not set
 # CONFIG_BLK_DEV_DM is not set
 # CONFIG_TARGET_CORE is not set
 # CONFIG_FUSION is not set
@@ -1664,9 +1494,9 @@
 # CONFIG_GTP is not set
 # CONFIG_MACSEC is not set
 # CONFIG_NETCONSOLE is not set
-CONFIG_TUN=y
+# CONFIG_TUN is not set
 # CONFIG_TUN_VNET_CROSS_LE is not set
-CONFIG_VETH=y
+# CONFIG_VETH is not set
 # CONFIG_VIRTIO_NET is not set
 # CONFIG_NLMON is not set
 # CONFIG_ARCNET is not set
@@ -1751,10 +1581,15 @@
 CONFIG_NET_VENDOR_SOCIONEXT=y
 CONFIG_NET_VENDOR_STMICRO=y
 CONFIG_STMMAC_ETH=y
+# CONFIG_STMMAC_UIO is not set
+CONFIG_STMMAC_ETHTOOL=y
+CONFIG_STMMAC_FULL=y
+CONFIG_STMMAC_PTP=y
 CONFIG_STMMAC_PLATFORM=y
 # CONFIG_DWMAC_DWC_QOS_ETH is not set
 CONFIG_DWMAC_GENERIC=y
 CONFIG_DWMAC_ROCKCHIP=y
+CONFIG_DWMAC_ROCKCHIP_TOOL=y
 # CONFIG_STMMAC_PCI is not set
 # CONFIG_NET_VENDOR_SUN is not set
 # CONFIG_NET_VENDOR_SYNOPSYS is not set
@@ -1819,39 +1654,30 @@
 # CONFIG_VITESSE_PHY is not set
 # CONFIG_XILINX_GMII2RGMII is not set
 # CONFIG_MICREL_KS8995MA is not set
-CONFIG_PPP=y
-CONFIG_PPP_BSDCOMP=y
-CONFIG_PPP_DEFLATE=y
-CONFIG_PPP_FILTER=y
-CONFIG_PPP_MPPE=y
-CONFIG_PPP_MULTILINK=y
-CONFIG_PPPOE=y
-CONFIG_PPP_ASYNC=y
-CONFIG_PPP_SYNC_TTY=y
+# CONFIG_PPP is not set
 # CONFIG_SLIP is not set
-CONFIG_SLHC=y
 CONFIG_USB_NET_DRIVERS=y
 # CONFIG_USB_CATC is not set
 # CONFIG_USB_KAWETH is not set
 # CONFIG_USB_PEGASUS is not set
-# CONFIG_USB_RTL8150 is not set
-# CONFIG_USB_RTL8152 is not set
+CONFIG_USB_RTL8150=y
+CONFIG_USB_RTL8152=y
 # CONFIG_USB_LAN78XX is not set
 CONFIG_USB_USBNET=y
 CONFIG_USB_NET_AX8817X=y
 CONFIG_USB_NET_AX88179_178A=y
 CONFIG_USB_NET_CDCETHER=y
-CONFIG_USB_NET_CDC_EEM=y
+# CONFIG_USB_NET_CDC_EEM is not set
 CONFIG_USB_NET_CDC_NCM=y
 # CONFIG_USB_NET_HUAWEI_CDC_NCM is not set
-# CONFIG_USB_NET_CDC_MBIM is not set
+CONFIG_USB_NET_CDC_MBIM=y
 # CONFIG_USB_NET_DM9601 is not set
 # CONFIG_USB_NET_SR9700 is not set
 # CONFIG_USB_NET_SR9800 is not set
 # CONFIG_USB_NET_SMSC75XX is not set
 # CONFIG_USB_NET_SMSC95XX is not set
 # CONFIG_USB_NET_GL620A is not set
-CONFIG_USB_NET_NET1080=y
+# CONFIG_USB_NET_NET1080 is not set
 # CONFIG_USB_NET_PLUSB is not set
 # CONFIG_USB_NET_MCS7830 is not set
 CONFIG_USB_NET_RNDIS_HOST=y
@@ -1868,32 +1694,95 @@
 # CONFIG_USB_NET_CH9200 is not set
 CONFIG_WLAN=y
 # CONFIG_WIRELESS_WDS is not set
-# CONFIG_WLAN_VENDOR_ADMTEK is not set
-# CONFIG_WLAN_VENDOR_ATH is not set
-# CONFIG_WLAN_VENDOR_ATMEL is not set
-# CONFIG_WLAN_VENDOR_BROADCOM is not set
-# CONFIG_WLAN_VENDOR_CISCO is not set
-# CONFIG_WLAN_VENDOR_INTEL is not set
-# CONFIG_WLAN_VENDOR_INTERSIL is not set
-# CONFIG_WLAN_VENDOR_MARVELL is not set
-# CONFIG_WLAN_VENDOR_MEDIATEK is not set
-# CONFIG_WLAN_VENDOR_RALINK is not set
-# CONFIG_WLAN_VENDOR_REALTEK is not set
-# CONFIG_WLAN_VENDOR_RSI is not set
-# CONFIG_WLAN_VENDOR_ST is not set
-# CONFIG_WLAN_VENDOR_TI is not set
-# CONFIG_WLAN_VENDOR_ZYDAS is not set
-# CONFIG_WLAN_VENDOR_QUANTENNA is not set
+CONFIG_WLAN_VENDOR_ADMTEK=y
+# CONFIG_ADM8211 is not set
+CONFIG_WLAN_VENDOR_ATH=y
+# CONFIG_ATH_DEBUG is not set
+# CONFIG_ATH5K is not set
+# CONFIG_ATH5K_PCI is not set
+# CONFIG_ATH9K is not set
+# CONFIG_ATH9K_HTC is not set
+# CONFIG_CARL9170 is not set
+# CONFIG_ATH6KL is not set
+# CONFIG_AR5523 is not set
+# CONFIG_WIL6210 is not set
+# CONFIG_ATH10K is not set
+# CONFIG_WCN36XX is not set
+CONFIG_WLAN_VENDOR_ATMEL=y
+# CONFIG_ATMEL is not set
+# CONFIG_AT76C50X_USB is not set
+CONFIG_WLAN_VENDOR_BROADCOM=y
+# CONFIG_B43 is not set
+# CONFIG_B43LEGACY is not set
+# CONFIG_BRCMSMAC is not set
+# CONFIG_BRCMFMAC is not set
+CONFIG_WLAN_VENDOR_CISCO=y
+CONFIG_WLAN_VENDOR_INTEL=y
+# CONFIG_IPW2100 is not set
+# CONFIG_IPW2200 is not set
+# CONFIG_IWL4965 is not set
+# CONFIG_IWL3945 is not set
+# CONFIG_IWLWIFI is not set
+CONFIG_WLAN_VENDOR_INTERSIL=y
+# CONFIG_HOSTAP is not set
+# CONFIG_HERMES is not set
+# CONFIG_P54_COMMON is not set
+# CONFIG_PRISM54 is not set
+CONFIG_WLAN_VENDOR_MARVELL=y
+# CONFIG_LIBERTAS is not set
+CONFIG_LIBERTAS_THINFIRM=y
+# CONFIG_LIBERTAS_THINFIRM_DEBUG is not set
+# CONFIG_LIBERTAS_THINFIRM_USB is not set
+CONFIG_MWIFIEX=m
+CONFIG_MWIFIEX_SDIO=m
+# CONFIG_MWIFIEX_PCIE is not set
+# CONFIG_MWIFIEX_USB is not set
+# CONFIG_MWL8K is not set
+CONFIG_WLAN_VENDOR_MEDIATEK=y
+# CONFIG_MT7601U is not set
+# CONFIG_MT76x0U is not set
+# CONFIG_MT76x2E is not set
+# CONFIG_MT76x2U is not set
+CONFIG_WLAN_VENDOR_RALINK=y
+# CONFIG_RT2X00 is not set
+CONFIG_WLAN_VENDOR_REALTEK=y
+# CONFIG_RTL8180 is not set
+# CONFIG_RTL8187 is not set
+CONFIG_RTL_CARDS=y
+# CONFIG_RTL8192CE is not set
+# CONFIG_RTL8192SE is not set
+# CONFIG_RTL8192DE is not set
+# CONFIG_RTL8723AE is not set
+# CONFIG_RTL8723BE is not set
+# CONFIG_RTL8188EE is not set
+# CONFIG_RTL8192EE is not set
+# CONFIG_RTL8821AE is not set
+# CONFIG_RTL8192CU is not set
+# CONFIG_RTL8XXXU is not set
+CONFIG_WLAN_VENDOR_RSI=y
+# CONFIG_RSI_91X is not set
+CONFIG_WLAN_VENDOR_ST=y
+# CONFIG_CW1200 is not set
+CONFIG_WLAN_VENDOR_TI=y
+# CONFIG_WL1251 is not set
+# CONFIG_WL12XX is not set
+# CONFIG_WL18XX is not set
+# CONFIG_WLCORE is not set
+CONFIG_WLAN_VENDOR_ZYDAS=y
+# CONFIG_USB_ZD1201 is not set
+# CONFIG_ZD1211RW is not set
+CONFIG_WLAN_VENDOR_QUANTENNA=y
+# CONFIG_QTNFMAC_PEARL_PCIE is not set
 CONFIG_WL_ROCKCHIP=y
 CONFIG_WIFI_BUILD_MODULE=y
-# CONFIG_WIFI_LOAD_DRIVER_WHEN_KERNEL_BOOTUP is not set
+CONFIG_WIFI_LOAD_DRIVER_WHEN_KERNEL_BOOTUP=y
 # CONFIG_WIFI_GENERATE_RANDOM_MAC_ADDR is not set
 CONFIG_BCMDHD=y
 CONFIG_AP6XXX=m
 # CONFIG_AP6XXX_WIFI6 is not set
 # CONFIG_AP6XXX_INDEP_POWER is not set
-CONFIG_BCMDHD_FW_PATH="/etc/firmware/fw_bcmdhd.bin"
-CONFIG_BCMDHD_NVRAM_PATH="/etc/firmware/nvram_ap6398s.txt"
+CONFIG_BCMDHD_FW_PATH="/vendor/etc/firmware/fw_bcmdhd.bin"
+CONFIG_BCMDHD_NVRAM_PATH="/vendor/etc/firmware/nvram.txt"
 # CONFIG_BCMDHD_STATIC_IF is not set
 CONFIG_RTL_WIRELESS_SOLUTION=y
 # CONFIG_RTL8188EU is not set
@@ -1907,7 +1796,7 @@
 # CONFIG_CYW_BCMDHD is not set
 # CONFIG_UWE5621DS is not set
 # CONFIG_MAC80211_HWSIM is not set
-# CONFIG_USB_NET_RNDIS_WLAN is not set
+CONFIG_USB_NET_RNDIS_WLAN=y
 # CONFIG_VIRT_WIFI is not set
 
 #
@@ -1953,7 +1842,7 @@
 # CONFIG_KEYBOARD_LKKBD is not set
 CONFIG_KEYBOARD_GPIO=y
 CONFIG_KEYBOARD_GPIO_POLLED=y
-CONFIG_KEYBOARD_TCA6416=m
+# CONFIG_KEYBOARD_TCA6416 is not set
 # CONFIG_KEYBOARD_TCA8418 is not set
 # CONFIG_KEYBOARD_MATRIX is not set
 # CONFIG_KEYBOARD_LM8323 is not set
@@ -2361,6 +2250,7 @@
 # CONFIG_HSI is not set
 CONFIG_PPS=y
 # CONFIG_PPS_DEBUG is not set
+# CONFIG_NTP_PPS is not set
 
 #
 # PPS clients support
@@ -2922,6 +2812,8 @@
 #
 # USB HDMI CEC adapters
 #
+# CONFIG_USB_PULSE8_CEC is not set
+# CONFIG_USB_RAINSHADOW_CEC is not set
 # CONFIG_MEDIA_PCI_SUPPORT is not set
 CONFIG_V4L_PLATFORM_DRIVERS=y
 # CONFIG_VIDEO_CAFE_CCIC is not set
@@ -3056,6 +2948,7 @@
 # CONFIG_VIDEO_IMX178 is not set
 # CONFIG_VIDEO_IMX214 is not set
 # CONFIG_VIDEO_IMX219 is not set
+# CONFIG_VIDEO_IMX241 is not set
 # CONFIG_VIDEO_IMX258 is not set
 # CONFIG_VIDEO_IMX274 is not set
 # CONFIG_VIDEO_IMX307 is not set
@@ -3524,11 +3417,12 @@
 # RGA
 #
 # CONFIG_ROCKCHIP_RGA is not set
-CONFIG_ROCKCHIP_RGA2=y
-# CONFIG_ROCKCHIP_RGA2_PROC_FS is not set
-CONFIG_ROCKCHIP_RGA2_DEBUG_FS=y
-CONFIG_ROCKCHIP_RGA2_DEBUGGER=y
-# CONFIG_ROCKCHIP_MULTI_RGA is not set
+# CONFIG_ROCKCHIP_RGA2 is not set
+CONFIG_ROCKCHIP_MULTI_RGA=y
+CONFIG_ROCKCHIP_RGA_ASYNC=y
+# CONFIG_ROCKCHIP_RGA_PROC_FS is not set
+CONFIG_ROCKCHIP_RGA_DEBUG_FS=y
+CONFIG_ROCKCHIP_RGA_DEBUGGER=y
 
 #
 # IEP
@@ -3540,14 +3434,14 @@
 CONFIG_ROCKCHIP_MPP_RKVDEC=y
 CONFIG_ROCKCHIP_MPP_RKVDEC2=y
 CONFIG_ROCKCHIP_MPP_RKVENC=y
-# CONFIG_ROCKCHIP_MPP_RKVENC2 is not set
+CONFIG_ROCKCHIP_MPP_RKVENC2=y
 CONFIG_ROCKCHIP_MPP_VDPU1=y
 CONFIG_ROCKCHIP_MPP_VEPU1=y
 CONFIG_ROCKCHIP_MPP_VDPU2=y
 CONFIG_ROCKCHIP_MPP_VEPU2=y
 CONFIG_ROCKCHIP_MPP_IEP2=y
 CONFIG_ROCKCHIP_MPP_JPGDEC=y
-# CONFIG_ROCKCHIP_MPP_VDPP is not set
+CONFIG_ROCKCHIP_MPP_VDPP=y
 CONFIG_VIDEOMODE_HELPERS=y
 CONFIG_HDMI=y
 
@@ -3641,7 +3535,7 @@
 CONFIG_SND_SOC_ROCKCHIP_I2S_TDM=y
 # CONFIG_SND_SOC_ROCKCHIP_MULTI_DAIS is not set
 CONFIG_SND_SOC_ROCKCHIP_PDM=y
-# CONFIG_SND_SOC_ROCKCHIP_SAI is not set
+CONFIG_SND_SOC_ROCKCHIP_SAI=y
 CONFIG_SND_SOC_ROCKCHIP_SPDIF=y
 # CONFIG_SND_SOC_ROCKCHIP_VAD is not set
 CONFIG_SND_SOC_ROCKCHIP_MAX98090=y
@@ -3734,6 +3628,7 @@
 # CONFIG_SND_SOC_RK3228 is not set
 # CONFIG_SND_SOC_RK3308 is not set
 CONFIG_SND_SOC_RK3328=y
+CONFIG_SND_SOC_RK3528=y
 # CONFIG_SND_SOC_RK630 is not set
 CONFIG_SND_SOC_RK817=y
 CONFIG_SND_SOC_RK_CODEC_DIGITAL=y
@@ -3960,9 +3855,9 @@
 #
 # USB Device Class drivers
 #
-# CONFIG_USB_ACM is not set
+CONFIG_USB_ACM=y
 # CONFIG_USB_PRINTER is not set
-# CONFIG_USB_WDM is not set
+CONFIG_USB_WDM=y
 # CONFIG_USB_TMC is not set
 
 #
@@ -4274,9 +4169,8 @@
 # CONFIG_LEDS_TRIGGER_ONESHOT is not set
 # CONFIG_LEDS_TRIGGER_DISK is not set
 # CONFIG_LEDS_TRIGGER_MTD is not set
-CONFIG_LEDS_TRIGGER_HEARTBEAT=y
+# CONFIG_LEDS_TRIGGER_HEARTBEAT is not set
 # CONFIG_LEDS_TRIGGER_BACKLIGHT is not set
-# CONFIG_LEDS_TRIGGER_CPU is not set
 # CONFIG_LEDS_TRIGGER_ACTIVITY is not set
 # CONFIG_LEDS_TRIGGER_GPIO is not set
 # CONFIG_LEDS_TRIGGER_DEFAULT_ON is not set
@@ -4322,7 +4216,7 @@
 CONFIG_RTC_DRV_HYM8563=y
 # CONFIG_RTC_DRV_MAX6900 is not set
 # CONFIG_RTC_DRV_RK630 is not set
-# CONFIG_RTC_DRV_RK808 is not set
+CONFIG_RTC_DRV_RK808=y
 # CONFIG_RTC_DRV_RK_TIMER is not set
 # CONFIG_RTC_DRV_RS5C372 is not set
 # CONFIG_RTC_DRV_ISL1208 is not set
@@ -4439,10 +4333,11 @@
 CONFIG_DMABUF_CACHE=y
 CONFIG_SYNC_FILE=y
 # CONFIG_SW_SYNC is not set
-# CONFIG_DMABUF_HEAPS is not set
-# CONFIG_DMABUF_PAGE_POOL is not set
-# CONFIG_DMABUF_HEAPS_DEFERRED_FREE is not set
-# CONFIG_DMABUF_HEAPS_PAGE_POOL is not set
+CONFIG_DMABUF_HEAPS=y
+CONFIG_DMABUF_HEAPS_DEFERRED_FREE=y
+CONFIG_DMABUF_HEAPS_PAGE_POOL=y
+CONFIG_DMABUF_HEAPS_SYSTEM=y
+CONFIG_DMABUF_HEAPS_CMA=y
 # CONFIG_AUXDISPLAY is not set
 # CONFIG_UIO is not set
 # CONFIG_VFIO is not set
@@ -4600,6 +4495,7 @@
 # CONFIG_ROCKCHIP_CLK_COMPENSATION is not set
 CONFIG_ROCKCHIP_CLK_BOOST=y
 CONFIG_ROCKCHIP_CLK_INV=y
+CONFIG_ROCKCHIP_CLK_OUT=y
 CONFIG_ROCKCHIP_CLK_PVTM=y
 CONFIG_ROCKCHIP_DCLK_DIV=y
 # CONFIG_ROCKCHIP_DDRCLK_SCPI is not set
@@ -4699,7 +4595,9 @@
 CONFIG_CPU_RK3328=y
 # CONFIG_CPU_RK3368 is not set
 CONFIG_CPU_RK3399=y
+CONFIG_CPU_RK3528=y
 CONFIG_CPU_RK3568=y
+CONFIG_NO_GKI=y
 CONFIG_ANDROID_VERSION=0x08010000
 CONFIG_ROCKCHIP_AMP=y
 CONFIG_ROCKCHIP_CPUINFO=y
@@ -4739,7 +4637,7 @@
 # DEVFREQ Drivers
 #
 CONFIG_ARM_ROCKCHIP_BUS_DEVFREQ=y
-CONFIG_ARM_ROCKCHIP_DMC_DEVFREQ=y
+# CONFIG_ARM_ROCKCHIP_DMC_DEVFREQ is not set
 CONFIG_ARM_ROCKCHIP_DMC_DEBUG=y
 CONFIG_PM_DEVFREQ_EVENT=y
 CONFIG_DEVFREQ_EVENT_ROCKCHIP_DFI=y
@@ -5177,15 +5075,6 @@
 # CONFIG_PHY_SAMSUNG_USB2 is not set
 # CONFIG_POWERCAP is not set
 # CONFIG_MCB is not set
-
-#
-# Performance monitor support
-#
-# CONFIG_ARM_CCI_PMU is not set
-# CONFIG_ARM_CCN is not set
-CONFIG_ARM_PMU=y
-# CONFIG_ARM_DSU_PMU is not set
-# CONFIG_ARM_SPE_PMU is not set
 CONFIG_RAS=y
 
 #
@@ -5243,6 +5132,7 @@
 CONFIG_ROCKCHIP_RKNPU_DEBUG_FS=y
 # CONFIG_ROCKCHIP_RKNPU_PROC_FS is not set
 # CONFIG_ROCKCHIP_RKNPU_FENCE is not set
+# CONFIG_ROCKCHIP_RKNPU_SRAM is not set
 CONFIG_ROCKCHIP_RKNPU_DRM_GEM=y
 
 #
@@ -5292,12 +5182,7 @@
 # CONFIG_AUTOFS_FS is not set
 CONFIG_FUSE_FS=y
 # CONFIG_CUSE is not set
-CONFIG_OVERLAY_FS=y
-CONFIG_OVERLAY_FS_REDIRECT_DIR=y
-CONFIG_OVERLAY_FS_REDIRECT_ALWAYS_FOLLOW=y
-CONFIG_OVERLAY_FS_INDEX=y
-CONFIG_OVERLAY_FS_XINO_AUTO=y
-CONFIG_OVERLAY_FS_METACOPY=y
+# CONFIG_OVERLAY_FS is not set
 # CONFIG_INCREMENTAL_FS is not set
 
 #
@@ -5407,9 +5292,8 @@
 CONFIG_PSTORE_CONSOLE=y
 # CONFIG_PSTORE_CONSOLE_FORCE is not set
 # CONFIG_PSTORE_PMSG is not set
-# CONFIG_PSTORE_FTRACE is not set
 CONFIG_PSTORE_RAM=y
-# CONFIG_PSTORE_MCU_LOG is not set
+# CONFIG_PSTORE_BOOT_LOG is not set
 # CONFIG_SYSV_FS is not set
 # CONFIG_UFS_FS is not set
 CONFIG_NETWORK_FILESYSTEMS=y
@@ -5418,7 +5302,6 @@
 CONFIG_NFS_V3=y
 CONFIG_NFS_V3_ACL=y
 CONFIG_NFS_V4=y
-CONFIG_NFS_SWAP=y
 # CONFIG_NFS_V4_1 is not set
 # CONFIG_NFS_USE_LEGACY_DNS is not set
 CONFIG_NFS_USE_KERNEL_DNS=y
@@ -5430,7 +5313,6 @@
 CONFIG_NFS_COMMON=y
 CONFIG_SUNRPC=y
 CONFIG_SUNRPC_GSS=y
-CONFIG_SUNRPC_SWAP=y
 # CONFIG_SUNRPC_DEBUG is not set
 # CONFIG_CEPH_FS is not set
 # CONFIG_CIFS is not set
@@ -5502,7 +5384,6 @@
 # CONFIG_ENCRYPTED_KEYS is not set
 # CONFIG_KEY_DH_OPERATIONS is not set
 # CONFIG_SECURITY_DMESG_RESTRICT is not set
-# CONFIG_SECURITY_PERF_EVENTS_RESTRICT is not set
 # CONFIG_SECURITY is not set
 CONFIG_SECURITYFS=y
 CONFIG_HAVE_HARDENED_USERCOPY_ALLOCATOR=y
@@ -5561,7 +5442,6 @@
 # CONFIG_CRYPTO_MCRYPTD is not set
 # CONFIG_CRYPTO_AUTHENC is not set
 # CONFIG_CRYPTO_TEST is not set
-CONFIG_CRYPTO_SIMD=y
 # CONFIG_CRYPTO_CURVE25519 is not set
 
 #
@@ -5692,7 +5572,7 @@
 CONFIG_CRYPTO_DEV_ROCKCHIP=y
 CONFIG_CRYPTO_DEV_ROCKCHIP_V1=y
 CONFIG_CRYPTO_DEV_ROCKCHIP_V2=y
-# CONFIG_CRYPTO_DEV_ROCKCHIP_V3 is not set
+CONFIG_CRYPTO_DEV_ROCKCHIP_V3=y
 CONFIG_CRYPTO_DEV_ROCKCHIP_DEV=y
 # CONFIG_CRYPTO_DEV_VIRTIO is not set
 # CONFIG_CRYPTO_DEV_CCREE is not set
@@ -5712,7 +5592,6 @@
 # CONFIG_SYSTEM_EXTRA_CERTIFICATE is not set
 # CONFIG_SECONDARY_TRUSTED_KEYRING is not set
 # CONFIG_SYSTEM_BLACKLIST_KEYRING is not set
-CONFIG_BINARY_PRINTF=y
 
 #
 # Library routines
@@ -5850,7 +5729,6 @@
 # CONFIG_PAGE_EXTENSION is not set
 # CONFIG_DEBUG_PAGEALLOC is not set
 # CONFIG_PAGE_POISONING is not set
-# CONFIG_DEBUG_PAGE_REF is not set
 # CONFIG_DEBUG_RODATA_TEST is not set
 # CONFIG_DEBUG_OBJECTS is not set
 # CONFIG_SLUB_DEBUG_ON is not set
@@ -5876,19 +5754,26 @@
 #
 # Debug Lockups and Hangs
 #
-# CONFIG_SOFTLOCKUP_DETECTOR is not set
+CONFIG_LOCKUP_DETECTOR=y
+CONFIG_SOFTLOCKUP_DETECTOR=y
+# CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC is not set
+CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC_VALUE=0
 CONFIG_HAVE_HARDLOCKUP_DETECTOR_OTHER_CPU=y
-# CONFIG_HARDLOCKUP_DETECTOR is not set
+CONFIG_HARDLOCKUP_DETECTOR_OTHER_CPU=y
+CONFIG_HARDLOCKUP_DETECTOR=y
+# CONFIG_BOOTPARAM_HARDLOCKUP_PANIC is not set
+CONFIG_BOOTPARAM_HARDLOCKUP_PANIC_VALUE=0
 # CONFIG_DETECT_HUNG_TASK is not set
 # CONFIG_WQ_WATCHDOG is not set
 # CONFIG_PANIC_ON_OOPS is not set
 CONFIG_PANIC_ON_OOPS_VALUE=0
 CONFIG_PANIC_TIMEOUT=0
-CONFIG_SCHED_DEBUG=y
+# CONFIG_SCHED_DEBUG is not set
 CONFIG_SCHED_INFO=y
 CONFIG_SCHEDSTATS=y
 # CONFIG_SCHED_STACK_END_CHECK is not set
 # CONFIG_DEBUG_TIMEKEEPING is not set
+CONFIG_DEBUG_PREEMPT=y
 
 #
 # Lock Debugging (spinlocks, mutexes, etc...)
@@ -5897,13 +5782,11 @@
 # CONFIG_PROVE_LOCKING is not set
 # CONFIG_LOCK_STAT is not set
 # CONFIG_DEBUG_RT_MUTEXES is not set
-CONFIG_DEBUG_SPINLOCK=y
+# CONFIG_DEBUG_SPINLOCK is not set
 # CONFIG_DEBUG_MUTEXES is not set
 # CONFIG_DEBUG_WW_MUTEX_SLOWPATH is not set
-# CONFIG_DEBUG_RWSEMS is not set
 # CONFIG_DEBUG_LOCK_ALLOC is not set
 # CONFIG_DEBUG_ATOMIC_SLEEP is not set
-# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
 # CONFIG_LOCK_TORTURE_TEST is not set
 # CONFIG_WW_MUTEX_SELFTEST is not set
 CONFIG_STACKTRACE=y
@@ -5933,7 +5816,6 @@
 # CONFIG_NOTIFIER_ERROR_INJECTION is not set
 # CONFIG_FAULT_INJECTION is not set
 # CONFIG_LATENCYTOP is not set
-CONFIG_NOP_TRACER=y
 CONFIG_HAVE_FUNCTION_TRACER=y
 CONFIG_HAVE_FUNCTION_GRAPH_TRACER=y
 CONFIG_HAVE_DYNAMIC_FTRACE=y
@@ -5941,40 +5823,8 @@
 CONFIG_HAVE_SYSCALL_TRACEPOINTS=y
 CONFIG_HAVE_C_RECORDMCOUNT=y
 CONFIG_TRACE_CLOCK=y
-CONFIG_RING_BUFFER=y
-CONFIG_EVENT_TRACING=y
-CONFIG_CONTEXT_SWITCH_TRACER=y
-CONFIG_TRACING=y
-CONFIG_GENERIC_TRACER=y
 CONFIG_TRACING_SUPPORT=y
-CONFIG_FTRACE=y
-CONFIG_FUNCTION_TRACER=y
-CONFIG_FUNCTION_GRAPH_TRACER=y
-# CONFIG_PREEMPTIRQ_EVENTS is not set
-# CONFIG_IRQSOFF_TRACER is not set
-# CONFIG_SCHED_TRACER is not set
-# CONFIG_HWLAT_TRACER is not set
-# CONFIG_FTRACE_SYSCALLS is not set
-# CONFIG_TRACER_SNAPSHOT is not set
-CONFIG_BRANCH_PROFILE_NONE=y
-# CONFIG_PROFILE_ANNOTATED_BRANCHES is not set
-# CONFIG_PROFILE_ALL_BRANCHES is not set
-# CONFIG_STACK_TRACER is not set
-CONFIG_BLK_DEV_IO_TRACE=y
-CONFIG_UPROBE_EVENTS=y
-CONFIG_BPF_EVENTS=y
-CONFIG_PROBE_EVENTS=y
-CONFIG_DYNAMIC_FTRACE=y
-# CONFIG_FUNCTION_PROFILER is not set
-CONFIG_FTRACE_MCOUNT_RECORD=y
-# CONFIG_FTRACE_STARTUP_TEST is not set
-# CONFIG_HIST_TRIGGERS is not set
-# CONFIG_TRACEPOINT_BENCHMARK is not set
-# CONFIG_RING_BUFFER_BENCHMARK is not set
-# CONFIG_RING_BUFFER_STARTUP_TEST is not set
-# CONFIG_PREEMPTIRQ_DELAY_TEST is not set
-# CONFIG_TRACE_EVAL_MAP_FILE is not set
-CONFIG_TRACING_EVENTS_GPIO=y
+# CONFIG_FTRACE is not set
 # CONFIG_DMA_API_DEBUG is not set
 CONFIG_RUNTIME_TESTING_MENU=y
 CONFIG_LKDTM=y
diff --git a/kernel/arch/arm64/configs/rockchip_rt.config b/kernel/arch/arm64/configs/rockchip_rt.config
new file mode 100644
index 0000000..6754436
--- /dev/null
+++ b/kernel/arch/arm64/configs/rockchip_rt.config
@@ -0,0 +1,22 @@
+# CONFIG_ARM_CPUIDLE is not set
+# CONFIG_ARM_ROCKCHIP_DMC_DEVFREQ is not set
+# CONFIG_CGROUP_CPUACCT is not set
+# CONFIG_CGROUP_SCHED is not set
+# CONFIG_CPU_FREQ_TIMES is not set
+# CONFIG_DEBUG_SPINLOCK is not set
+# CONFIG_FTRACE is not set
+# CONFIG_IRQ_TIME_ACCOUNTING is not set
+# CONFIG_MALI_BIFROST_ENABLE_TRACE is not set
+# CONFIG_MALI_BIFROST_SYSTEM_TRACE is not set
+# CONFIG_PSI is not set
+# CONFIG_PERF_EVENTS is not set
+# CONFIG_PROFILING is not set
+# CONFIG_SCHED_DEBUG is not set
+# CONFIG_SCHED_INFO is not set
+# CONFIG_SWAP is not set
+# CONFIG_TASKSTATS is not set
+# CONFIG_ZRAM is not set
+CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE=y
+CONFIG_HZ_PERIODIC=y
+CONFIG_HZ_1000=y
+CONFIG_PREEMPT_RT_FULL=y
diff --git a/kernel/arch/arm64/crypto/Kconfig b/kernel/arch/arm64/crypto/Kconfig
index 273d727..263d4ef 100644
--- a/kernel/arch/arm64/crypto/Kconfig
+++ b/kernel/arch/arm64/crypto/Kconfig
@@ -19,43 +19,43 @@
 
 config CRYPTO_SHA1_ARM64_CE
 	tristate "SHA-1 digest algorithm (ARMv8 Crypto Extensions)"
-	depends on KERNEL_MODE_NEON
+	depends on KERNEL_MODE_NEON && !PREEMPT_RT_BASE
 	select CRYPTO_HASH
 	select CRYPTO_SHA1
 
 config CRYPTO_SHA2_ARM64_CE
 	tristate "SHA-224/SHA-256 digest algorithm (ARMv8 Crypto Extensions)"
-	depends on KERNEL_MODE_NEON
+	depends on KERNEL_MODE_NEON && !PREEMPT_RT_BASE
 	select CRYPTO_HASH
 	select CRYPTO_SHA256_ARM64
 
 config CRYPTO_SHA512_ARM64_CE
 	tristate "SHA-384/SHA-512 digest algorithm (ARMv8 Crypto Extensions)"
-	depends on KERNEL_MODE_NEON
+	depends on KERNEL_MODE_NEON && !PREEMPT_RT_BASE
 	select CRYPTO_HASH
 	select CRYPTO_SHA512_ARM64
 
 config CRYPTO_SHA3_ARM64
 	tristate "SHA3 digest algorithm (ARMv8.2 Crypto Extensions)"
-	depends on KERNEL_MODE_NEON
+	depends on KERNEL_MODE_NEON && !PREEMPT_RT_BASE
 	select CRYPTO_HASH
 	select CRYPTO_SHA3
 
 config CRYPTO_SM3_ARM64_CE
 	tristate "SM3 digest algorithm (ARMv8.2 Crypto Extensions)"
-	depends on KERNEL_MODE_NEON
+	depends on KERNEL_MODE_NEON && !PREEMPT_RT_BASE
 	select CRYPTO_HASH
 	select CRYPTO_SM3
 
 config CRYPTO_SM4_ARM64_CE
 	tristate "SM4 symmetric cipher (ARMv8.2 Crypto Extensions)"
-	depends on KERNEL_MODE_NEON
+	depends on KERNEL_MODE_NEON && !PREEMPT_RT_BASE
 	select CRYPTO_ALGAPI
 	select CRYPTO_SM4
 
 config CRYPTO_GHASH_ARM64_CE
 	tristate "GHASH/AES-GCM using ARMv8 Crypto Extensions"
-	depends on KERNEL_MODE_NEON
+	depends on KERNEL_MODE_NEON && !PREEMPT_RT_BASE
 	select CRYPTO_HASH
 	select CRYPTO_GF128MUL
 	select CRYPTO_AES
@@ -63,7 +63,7 @@
 
 config CRYPTO_CRCT10DIF_ARM64_CE
 	tristate "CRCT10DIF digest algorithm using PMULL instructions"
-	depends on KERNEL_MODE_NEON && CRC_T10DIF
+	depends on KERNEL_MODE_NEON && CRC_T10DIF && !PREEMPT_RT_BASE
 	select CRYPTO_HASH
 
 config CRYPTO_CRC32_ARM64_CE
@@ -77,13 +77,13 @@
 
 config CRYPTO_AES_ARM64_CE
 	tristate "AES core cipher using ARMv8 Crypto Extensions"
-	depends on ARM64 && KERNEL_MODE_NEON
+	depends on ARM64 && KERNEL_MODE_NEON && !PREEMPT_RT_BASE
 	select CRYPTO_ALGAPI
 	select CRYPTO_AES_ARM64
 
 config CRYPTO_AES_ARM64_CE_CCM
 	tristate "AES in CCM mode using ARMv8 Crypto Extensions"
-	depends on ARM64 && KERNEL_MODE_NEON
+	depends on ARM64 && KERNEL_MODE_NEON && !PREEMPT_RT_BASE
 	select CRYPTO_ALGAPI
 	select CRYPTO_AES_ARM64_CE
 	select CRYPTO_AES_ARM64
@@ -91,7 +91,7 @@
 
 config CRYPTO_AES_ARM64_CE_BLK
 	tristate "AES in ECB/CBC/CTR/XTS modes using ARMv8 Crypto Extensions"
-	depends on KERNEL_MODE_NEON
+	depends on KERNEL_MODE_NEON && !PREEMPT_RT_BASE
 	select CRYPTO_BLKCIPHER
 	select CRYPTO_AES_ARM64_CE
 	select CRYPTO_AES_ARM64
@@ -99,7 +99,7 @@
 
 config CRYPTO_AES_ARM64_NEON_BLK
 	tristate "AES in ECB/CBC/CTR/XTS modes using NEON instructions"
-	depends on KERNEL_MODE_NEON
+	depends on KERNEL_MODE_NEON && !PREEMPT_RT_BASE
 	select CRYPTO_BLKCIPHER
 	select CRYPTO_AES_ARM64
 	select CRYPTO_AES
@@ -107,7 +107,7 @@
 
 config CRYPTO_CHACHA20_NEON
 	tristate "ChaCha20, XChaCha20, and XChaCha12 stream ciphers using NEON instructions"
-	depends on KERNEL_MODE_NEON
+	depends on KERNEL_MODE_NEON && !PREEMPT_RT_BASE
 	select CRYPTO_BLKCIPHER
 	select CRYPTO_LIB_CHACHA_GENERIC
 	select CRYPTO_ARCH_HAVE_LIB_CHACHA
@@ -120,7 +120,7 @@
 
 config CRYPTO_AES_ARM64_BS
 	tristate "AES in ECB/CBC/CTR/XTS modes using bit-sliced NEON algorithm"
-	depends on KERNEL_MODE_NEON
+	depends on KERNEL_MODE_NEON && !PREEMPT_RT_BASE
 	select CRYPTO_BLKCIPHER
 	select CRYPTO_AES_ARM64_NEON_BLK
 	select CRYPTO_AES_ARM64
diff --git a/kernel/arch/arm64/crypto/crc32-ce-glue.c b/kernel/arch/arm64/crypto/crc32-ce-glue.c
index 34b4e3d..ae055cd 100644
--- a/kernel/arch/arm64/crypto/crc32-ce-glue.c
+++ b/kernel/arch/arm64/crypto/crc32-ce-glue.c
@@ -208,7 +208,8 @@
 
 static int __init crc32_pmull_mod_init(void)
 {
-	if (IS_ENABLED(CONFIG_KERNEL_MODE_NEON) && (elf_hwcap & HWCAP_PMULL)) {
+	if (IS_ENABLED(CONFIG_KERNEL_MODE_NEON) &&
+	    !IS_ENABLED(CONFIG_PREEMPT_RT_BASE) && (elf_hwcap & HWCAP_PMULL)) {
 		crc32_pmull_algs[0].update = crc32_pmull_update;
 		crc32_pmull_algs[1].update = crc32c_pmull_update;
 
diff --git a/kernel/arch/arm64/include/asm/alternative.h b/kernel/arch/arm64/include/asm/alternative.h
index bb616e2..0d7a627 100644
--- a/kernel/arch/arm64/include/asm/alternative.h
+++ b/kernel/arch/arm64/include/asm/alternative.h
@@ -35,6 +35,12 @@
 static inline void apply_alternatives_module(void *start, size_t length) { }
 #endif
 
+#ifdef CONFIG_KVM_ARM_HOST
+void kvm_compute_layout(void);
+#else
+static inline void kvm_compute_layout(void) { }
+#endif
+
 #define ALTINSTR_ENTRY(feature)					              \
 	" .word 661b - .\n"				/* label           */ \
 	" .word 663f - .\n"				/* new instruction */ \
diff --git a/kernel/arch/arm64/include/asm/spinlock_types.h b/kernel/arch/arm64/include/asm/spinlock_types.h
index a157ff4..f952fdd 100644
--- a/kernel/arch/arm64/include/asm/spinlock_types.h
+++ b/kernel/arch/arm64/include/asm/spinlock_types.h
@@ -16,10 +16,6 @@
 #ifndef __ASM_SPINLOCK_TYPES_H
 #define __ASM_SPINLOCK_TYPES_H
 
-#if !defined(__LINUX_SPINLOCK_TYPES_H) && !defined(__ASM_SPINLOCK_H)
-# error "please don't include this file directly"
-#endif
-
 #include <asm-generic/qspinlock_types.h>
 #include <asm-generic/qrwlock_types.h>
 
diff --git a/kernel/arch/arm64/include/asm/thread_info.h b/kernel/arch/arm64/include/asm/thread_info.h
index e445e87..7271a41 100644
--- a/kernel/arch/arm64/include/asm/thread_info.h
+++ b/kernel/arch/arm64/include/asm/thread_info.h
@@ -43,6 +43,7 @@
 	u64			ttbr0;		/* saved TTBR0_EL1 */
 #endif
 	int			preempt_count;	/* 0 => preemptable, <0 => bug */
+	int                     preempt_lazy_count; /* 0 => preemptable, <0 => bug */
 #ifdef CONFIG_SHADOW_CALL_STACK
 	void			*shadow_call_stack;
 #endif
@@ -79,6 +80,7 @@
 #define TIF_FOREIGN_FPSTATE	3	/* CPU's FP state is not current's */
 #define TIF_UPROBE		4	/* uprobe breakpoint or singlestep */
 #define TIF_FSCHECK		5	/* Check FS is USER_DS on return */
+#define TIF_NEED_RESCHED_LAZY	6
 #define TIF_NOHZ		7
 #define TIF_SYSCALL_TRACE	8
 #define TIF_SYSCALL_AUDIT	9
@@ -98,6 +100,7 @@
 #define _TIF_NEED_RESCHED	(1 << TIF_NEED_RESCHED)
 #define _TIF_NOTIFY_RESUME	(1 << TIF_NOTIFY_RESUME)
 #define _TIF_FOREIGN_FPSTATE	(1 << TIF_FOREIGN_FPSTATE)
+#define _TIF_NEED_RESCHED_LAZY	(1 << TIF_NEED_RESCHED_LAZY)
 #define _TIF_NOHZ		(1 << TIF_NOHZ)
 #define _TIF_SYSCALL_TRACE	(1 << TIF_SYSCALL_TRACE)
 #define _TIF_SYSCALL_AUDIT	(1 << TIF_SYSCALL_AUDIT)
@@ -111,8 +114,9 @@
 
 #define _TIF_WORK_MASK		(_TIF_NEED_RESCHED | _TIF_SIGPENDING | \
 				 _TIF_NOTIFY_RESUME | _TIF_FOREIGN_FPSTATE | \
-				 _TIF_UPROBE | _TIF_FSCHECK)
+				 _TIF_UPROBE | _TIF_FSCHECK | _TIF_NEED_RESCHED_LAZY)
 
+#define _TIF_NEED_RESCHED_MASK	(_TIF_NEED_RESCHED | _TIF_NEED_RESCHED_LAZY)
 #define _TIF_SYSCALL_WORK	(_TIF_SYSCALL_TRACE | _TIF_SYSCALL_AUDIT | \
 				 _TIF_SYSCALL_TRACEPOINT | _TIF_SECCOMP | \
 				 _TIF_NOHZ)
diff --git a/kernel/arch/arm64/kernel/alternative.c b/kernel/arch/arm64/kernel/alternative.c
index 0dd30d0..c3d9b90 100644
--- a/kernel/arch/arm64/kernel/alternative.c
+++ b/kernel/arch/arm64/kernel/alternative.c
@@ -212,6 +212,7 @@
 void __init apply_alternatives_all(void)
 {
 	/* better not try code patching on a live SMP system */
+	kvm_compute_layout();
 	stop_machine(__apply_alternatives_multi_stop, NULL, cpu_online_mask);
 }
 
diff --git a/kernel/arch/arm64/kernel/asm-offsets.c b/kernel/arch/arm64/kernel/asm-offsets.c
index b8f83cf..15ae400 100644
--- a/kernel/arch/arm64/kernel/asm-offsets.c
+++ b/kernel/arch/arm64/kernel/asm-offsets.c
@@ -42,6 +42,7 @@
   BLANK();
   DEFINE(TSK_TI_FLAGS,		offsetof(struct task_struct, thread_info.flags));
   DEFINE(TSK_TI_PREEMPT,	offsetof(struct task_struct, thread_info.preempt_count));
+  DEFINE(TSK_TI_PREEMPT_LAZY,	offsetof(struct task_struct, thread_info.preempt_lazy_count));
   DEFINE(TSK_TI_ADDR_LIMIT,	offsetof(struct task_struct, thread_info.addr_limit));
 #ifdef CONFIG_ARM64_SW_TTBR0_PAN
   DEFINE(TSK_TI_TTBR0,		offsetof(struct task_struct, thread_info.ttbr0));
diff --git a/kernel/arch/arm64/kernel/cpufeature.c b/kernel/arch/arm64/kernel/cpufeature.c
index 38ee272..641d064 100644
--- a/kernel/arch/arm64/kernel/cpufeature.c
+++ b/kernel/arch/arm64/kernel/cpufeature.c
@@ -1115,14 +1115,14 @@
 static void cpu_enable_ssbs(const struct arm64_cpu_capabilities *__unused)
 {
 	static bool undef_hook_registered = false;
-	static DEFINE_SPINLOCK(hook_lock);
+	static DEFINE_RAW_SPINLOCK(hook_lock);
 
-	spin_lock(&hook_lock);
+	raw_spin_lock(&hook_lock);
 	if (!undef_hook_registered) {
 		register_undef_hook(&ssbs_emulation_hook);
 		undef_hook_registered = true;
 	}
-	spin_unlock(&hook_lock);
+	raw_spin_unlock(&hook_lock);
 
 	if (arm64_get_ssbd_state() == ARM64_SSBD_FORCE_DISABLE) {
 		sysreg_clear_set(sctlr_el1, 0, SCTLR_ELx_DSSBS);
diff --git a/kernel/arch/arm64/kernel/entry.S b/kernel/arch/arm64/kernel/entry.S
index 8f50a54..833595d 100644
--- a/kernel/arch/arm64/kernel/entry.S
+++ b/kernel/arch/arm64/kernel/entry.S
@@ -646,11 +646,16 @@
 
 #ifdef CONFIG_PREEMPT
 	ldr	w24, [tsk, #TSK_TI_PREEMPT]	// get preempt count
-	cbnz	w24, 1f				// preempt count != 0
+	cbnz	w24, 2f				// preempt count != 0
 	ldr	x0, [tsk, #TSK_TI_FLAGS]	// get flags
-	tbz	x0, #TIF_NEED_RESCHED, 1f	// needs rescheduling?
-	bl	el1_preempt
+	tbnz	x0, #TIF_NEED_RESCHED, 1f	// needs rescheduling?
+
+	ldr	w24, [tsk, #TSK_TI_PREEMPT_LAZY] // get preempt lazy count
+	cbnz	w24, 2f				// preempt lazy count != 0
+	tbz	x0, #TIF_NEED_RESCHED_LAZY, 2f	// needs rescheduling?
 1:
+	bl	el1_preempt
+2:
 #endif
 #ifdef CONFIG_TRACE_IRQFLAGS
 	bl	trace_hardirqs_on
@@ -664,6 +669,7 @@
 1:	bl	preempt_schedule_irq		// irq en/disable is done inside
 	ldr	x0, [tsk, #TSK_TI_FLAGS]	// get new tasks TI_FLAGS
 	tbnz	x0, #TIF_NEED_RESCHED, 1b	// needs rescheduling?
+	tbnz	x0, #TIF_NEED_RESCHED_LAZY, 1b	// needs rescheduling?
 	ret	x24
 #endif
 
diff --git a/kernel/arch/arm64/kernel/fpsimd.c b/kernel/arch/arm64/kernel/fpsimd.c
index 89ab68c..481793a 100644
--- a/kernel/arch/arm64/kernel/fpsimd.c
+++ b/kernel/arch/arm64/kernel/fpsimd.c
@@ -159,6 +159,16 @@
 	__sve_free(task);
 }
 
+static void *sve_free_atomic(struct task_struct *task)
+{
+	void *sve_state = task->thread.sve_state;
+
+	WARN_ON(test_tsk_thread_flag(task, TIF_SVE));
+
+	task->thread.sve_state = NULL;
+	return sve_state;
+}
+
 /*
  * TIF_SVE controls whether a task can use SVE without trapping while
  * in userspace, and also the way a task's FPSIMD/SVE state is stored
@@ -549,6 +559,7 @@
 	 * non-SVE thread.
 	 */
 	if (task == current) {
+		preempt_disable();
 		local_bh_disable();
 
 		fpsimd_save();
@@ -559,8 +570,10 @@
 	if (test_and_clear_tsk_thread_flag(task, TIF_SVE))
 		sve_to_fpsimd(task);
 
-	if (task == current)
+	if (task == current) {
 		local_bh_enable();
+		preempt_enable();
+	}
 
 	/*
 	 * Force reallocation of task SVE state to the correct size
@@ -815,6 +828,7 @@
 
 	sve_alloc(current);
 
+	preempt_disable();
 	local_bh_disable();
 
 	fpsimd_save();
@@ -828,6 +842,7 @@
 		WARN_ON(1); /* SVE access shouldn't have trapped */
 
 	local_bh_enable();
+	preempt_enable();
 }
 
 /*
@@ -894,10 +909,12 @@
 void fpsimd_flush_thread(void)
 {
 	int vl, supported_vl;
+	void *mem = NULL;
 
 	if (!system_supports_fpsimd())
 		return;
 
+	preempt_disable();
 	local_bh_disable();
 
 	memset(&current->thread.uw.fpsimd_state, 0,
@@ -906,7 +923,7 @@
 
 	if (system_supports_sve()) {
 		clear_thread_flag(TIF_SVE);
-		sve_free(current);
+		mem = sve_free_atomic(current);
 
 		/*
 		 * Reset the task vector length as required.
@@ -942,6 +959,8 @@
 	set_thread_flag(TIF_FOREIGN_FPSTATE);
 
 	local_bh_enable();
+	preempt_enable();
+	kfree(mem);
 }
 
 /*
@@ -953,9 +972,11 @@
 	if (!system_supports_fpsimd())
 		return;
 
+	preempt_disable();
 	local_bh_disable();
 	fpsimd_save();
 	local_bh_enable();
+	preempt_enable();
 }
 
 /*
@@ -1026,6 +1047,7 @@
 		return;
 	}
 
+	preempt_disable();
 	local_bh_disable();
 
 	if (test_and_clear_thread_flag(TIF_FOREIGN_FPSTATE)) {
@@ -1034,6 +1056,7 @@
 	}
 
 	local_bh_enable();
+	preempt_enable();
 }
 
 /*
@@ -1046,6 +1069,7 @@
 	if (WARN_ON(!system_supports_fpsimd()))
 		return;
 
+	preempt_disable();
 	local_bh_disable();
 
 	current->thread.uw.fpsimd_state = *state;
@@ -1058,6 +1082,7 @@
 	clear_thread_flag(TIF_FOREIGN_FPSTATE);
 
 	local_bh_enable();
+	preempt_enable();
 }
 
 /*
@@ -1104,6 +1129,7 @@
 
 	BUG_ON(!may_use_simd());
 
+	preempt_disable();
 	local_bh_disable();
 
 	__this_cpu_write(kernel_neon_busy, true);
@@ -1117,6 +1143,7 @@
 	preempt_disable();
 
 	local_bh_enable();
+	preempt_enable();
 }
 EXPORT_SYMBOL(kernel_neon_begin);
 
diff --git a/kernel/arch/arm64/kernel/process.c b/kernel/arch/arm64/kernel/process.c
index 1e86ef0..4338838 100644
--- a/kernel/arch/arm64/kernel/process.c
+++ b/kernel/arch/arm64/kernel/process.c
@@ -232,7 +232,7 @@
 	 * don't attempt to dump non-kernel addresses or
 	 * values that are probably just small negative numbers
 	 */
-	if (addr < PAGE_OFFSET || addr > -4096UL)
+	if (addr < VA_START || addr > -4096UL)
 		return;
 
 	printk("\n%s: %#lx:\n", name, addr + nbytes / 2);
diff --git a/kernel/arch/arm64/kernel/signal.c b/kernel/arch/arm64/kernel/signal.c
index ca56585..3f321da 100644
--- a/kernel/arch/arm64/kernel/signal.c
+++ b/kernel/arch/arm64/kernel/signal.c
@@ -919,7 +919,7 @@
 		/* Check valid user FS if needed */
 		addr_limit_user_check();
 
-		if (thread_flags & _TIF_NEED_RESCHED) {
+		if (thread_flags & _TIF_NEED_RESCHED_MASK) {
 			/* Unmask Debug and SError for the next task */
 			local_daif_restore(DAIF_PROCCTX_NOIRQ);
 
diff --git a/kernel/arch/arm64/kvm/va_layout.c b/kernel/arch/arm64/kvm/va_layout.c
index c712a73..792da0e 100644
--- a/kernel/arch/arm64/kvm/va_layout.c
+++ b/kernel/arch/arm64/kvm/va_layout.c
@@ -33,7 +33,7 @@
 static u64 tag_val;
 static u64 va_mask;
 
-static void compute_layout(void)
+__init void kvm_compute_layout(void)
 {
 	phys_addr_t idmap_addr = __pa_symbol(__hyp_idmap_text_start);
 	u64 hyp_va_msb;
@@ -121,8 +121,6 @@
 
 	BUG_ON(nr_inst != 5);
 
-	if (!has_vhe() && !va_mask)
-		compute_layout();
 
 	for (i = 0; i < nr_inst; i++) {
 		u32 rd, rn, insn, oinsn;
@@ -166,9 +164,6 @@
 		WARN_ON_ONCE(cpus_have_const_cap(ARM64_HARDEN_EL2_VECTORS));
 		return;
 	}
-
-	if (!va_mask)
-		compute_layout();
 
 	/*
 	 * Compute HYP VA by using the same computation as kern_hyp_va()
diff --git a/kernel/arch/hexagon/include/asm/spinlock_types.h b/kernel/arch/hexagon/include/asm/spinlock_types.h
index 7a906b5..d8f596f 100644
--- a/kernel/arch/hexagon/include/asm/spinlock_types.h
+++ b/kernel/arch/hexagon/include/asm/spinlock_types.h
@@ -21,10 +21,6 @@
 #ifndef _ASM_SPINLOCK_TYPES_H
 #define _ASM_SPINLOCK_TYPES_H
 
-#ifndef __LINUX_SPINLOCK_TYPES_H
-# error "please don't include this file directly"
-#endif
-
 typedef struct {
 	volatile unsigned int lock;
 } arch_spinlock_t;
diff --git a/kernel/arch/ia64/include/asm/spinlock_types.h b/kernel/arch/ia64/include/asm/spinlock_types.h
index 6e345fe..681408d 100644
--- a/kernel/arch/ia64/include/asm/spinlock_types.h
+++ b/kernel/arch/ia64/include/asm/spinlock_types.h
@@ -2,10 +2,6 @@
 #ifndef _ASM_IA64_SPINLOCK_TYPES_H
 #define _ASM_IA64_SPINLOCK_TYPES_H
 
-#ifndef __LINUX_SPINLOCK_TYPES_H
-# error "please don't include this file directly"
-#endif
-
 typedef struct {
 	volatile unsigned int lock;
 } arch_spinlock_t;
diff --git a/kernel/arch/ia64/kernel/mca.c b/kernel/arch/ia64/kernel/mca.c
index d7400b2..40abc24 100644
--- a/kernel/arch/ia64/kernel/mca.c
+++ b/kernel/arch/ia64/kernel/mca.c
@@ -1824,7 +1824,7 @@
 	ti->cpu = cpu;
 	p->stack = ti;
 	p->state = TASK_UNINTERRUPTIBLE;
-	cpumask_set_cpu(cpu, &p->cpus_allowed);
+	cpumask_set_cpu(cpu, &p->cpus_mask);
 	INIT_LIST_HEAD(&p->tasks);
 	p->parent = p->real_parent = p->group_leader = p;
 	INIT_LIST_HEAD(&p->children);
diff --git a/kernel/arch/mips/Kconfig b/kernel/arch/mips/Kconfig
index 5913065..a5b3027 100644
--- a/kernel/arch/mips/Kconfig
+++ b/kernel/arch/mips/Kconfig
@@ -2525,7 +2525,7 @@
 #
 config HIGHMEM
 	bool "High Memory Support"
-	depends on 32BIT && CPU_SUPPORTS_HIGHMEM && SYS_SUPPORTS_HIGHMEM && !CPU_MIPS32_3_5_EVA
+	depends on 32BIT && CPU_SUPPORTS_HIGHMEM && SYS_SUPPORTS_HIGHMEM && !CPU_MIPS32_3_5_EVA && !PREEMPT_RT_FULL
 
 config CPU_SUPPORTS_HIGHMEM
 	bool
diff --git a/kernel/arch/mips/include/asm/switch_to.h b/kernel/arch/mips/include/asm/switch_to.h
index e610473..1428b4f 100644
--- a/kernel/arch/mips/include/asm/switch_to.h
+++ b/kernel/arch/mips/include/asm/switch_to.h
@@ -42,7 +42,7 @@
  * inline to try to keep the overhead down. If we have been forced to run on
  * a "CPU" with an FPU because of a previous high level of FP computation,
  * but did not actually use the FPU during the most recent time-slice (CU1
- * isn't set), we undo the restriction on cpus_allowed.
+ * isn't set), we undo the restriction on cpus_mask.
  *
  * We're not calling set_cpus_allowed() here, because we have no need to
  * force prompt migration - we're already switching the current CPU to a
@@ -57,7 +57,7 @@
 	    test_ti_thread_flag(__prev_ti, TIF_FPUBOUND) &&		\
 	    (!(KSTK_STATUS(prev) & ST0_CU1))) {				\
 		clear_ti_thread_flag(__prev_ti, TIF_FPUBOUND);		\
-		prev->cpus_allowed = prev->thread.user_cpus_allowed;	\
+		prev->cpus_mask = prev->thread.user_cpus_allowed;	\
 	}								\
 	next->thread.emulated_fp = 0;					\
 } while(0)
diff --git a/kernel/arch/mips/kernel/mips-mt-fpaff.c b/kernel/arch/mips/kernel/mips-mt-fpaff.c
index a7c0f97..1a08428 100644
--- a/kernel/arch/mips/kernel/mips-mt-fpaff.c
+++ b/kernel/arch/mips/kernel/mips-mt-fpaff.c
@@ -177,7 +177,7 @@
 	if (retval)
 		goto out_unlock;
 
-	cpumask_or(&allowed, &p->thread.user_cpus_allowed, &p->cpus_allowed);
+	cpumask_or(&allowed, &p->thread.user_cpus_allowed, p->cpus_ptr);
 	cpumask_and(&mask, &allowed, cpu_active_mask);
 
 out_unlock:
diff --git a/kernel/arch/mips/kernel/traps.c b/kernel/arch/mips/kernel/traps.c
index b9da2ce..f3e1242 100644
--- a/kernel/arch/mips/kernel/traps.c
+++ b/kernel/arch/mips/kernel/traps.c
@@ -1174,12 +1174,12 @@
 		 * restricted the allowed set to exclude any CPUs with FPUs,
 		 * we'll skip the procedure.
 		 */
-		if (cpumask_intersects(&current->cpus_allowed, &mt_fpu_cpumask)) {
+		if (cpumask_intersects(&current->cpus_mask, &mt_fpu_cpumask)) {
 			cpumask_t tmask;
 
 			current->thread.user_cpus_allowed
-				= current->cpus_allowed;
-			cpumask_and(&tmask, &current->cpus_allowed,
+				= current->cpus_mask;
+			cpumask_and(&tmask, &current->cpus_mask,
 				    &mt_fpu_cpumask);
 			set_cpus_allowed_ptr(current, &tmask);
 			set_thread_flag(TIF_FPUBOUND);
diff --git a/kernel/arch/powerpc/Kconfig b/kernel/arch/powerpc/Kconfig
index f0e09d5..4536d04 100644
--- a/kernel/arch/powerpc/Kconfig
+++ b/kernel/arch/powerpc/Kconfig
@@ -105,10 +105,11 @@
 
 config RWSEM_GENERIC_SPINLOCK
 	bool
+	default y if PREEMPT_RT_FULL
 
 config RWSEM_XCHGADD_ALGORITHM
 	bool
-	default y
+	default y if !PREEMPT_RT_FULL
 
 config GENERIC_LOCKBREAK
 	bool
@@ -216,6 +217,7 @@
 	select HAVE_HARDLOCKUP_DETECTOR_PERF	if PERF_EVENTS && HAVE_PERF_EVENTS_NMI && !HAVE_HARDLOCKUP_DETECTOR_ARCH
 	select HAVE_PERF_REGS
 	select HAVE_PERF_USER_STACK_DUMP
+	select HAVE_PREEMPT_LAZY
 	select HAVE_RCU_TABLE_FREE		if SMP
 	select HAVE_REGS_AND_STACK_ACCESS_API
 	select HAVE_RELIABLE_STACKTRACE		if PPC64 && CPU_LITTLE_ENDIAN
@@ -399,7 +401,7 @@
 
 config HIGHMEM
 	bool "High memory support"
-	depends on PPC32
+	depends on PPC32 && !PREEMPT_RT_FULL
 
 source kernel/Kconfig.hz
 
diff --git a/kernel/arch/powerpc/include/asm/spinlock_types.h b/kernel/arch/powerpc/include/asm/spinlock_types.h
index 87adaf1..7305cb6 100644
--- a/kernel/arch/powerpc/include/asm/spinlock_types.h
+++ b/kernel/arch/powerpc/include/asm/spinlock_types.h
@@ -2,10 +2,6 @@
 #ifndef _ASM_POWERPC_SPINLOCK_TYPES_H
 #define _ASM_POWERPC_SPINLOCK_TYPES_H
 
-#ifndef __LINUX_SPINLOCK_TYPES_H
-# error "please don't include this file directly"
-#endif
-
 typedef struct {
 	volatile unsigned int slock;
 } arch_spinlock_t;
diff --git a/kernel/arch/powerpc/include/asm/thread_info.h b/kernel/arch/powerpc/include/asm/thread_info.h
index 3c00020..64c3d1a 100644
--- a/kernel/arch/powerpc/include/asm/thread_info.h
+++ b/kernel/arch/powerpc/include/asm/thread_info.h
@@ -37,6 +37,8 @@
 	int		cpu;			/* cpu we're on */
 	int		preempt_count;		/* 0 => preemptable,
 						   <0 => BUG */
+	int		preempt_lazy_count;	/* 0 => preemptable,
+						   <0 => BUG */
 	unsigned long	local_flags;		/* private flags for thread */
 #ifdef CONFIG_LIVEPATCH
 	unsigned long *livepatch_sp;
@@ -81,18 +83,18 @@
 #define TIF_SIGPENDING		1	/* signal pending */
 #define TIF_NEED_RESCHED	2	/* rescheduling necessary */
 #define TIF_FSCHECK		3	/* Check FS is USER_DS on return */
-#define TIF_32BIT		4	/* 32 bit binary */
 #define TIF_RESTORE_TM		5	/* need to restore TM FP/VEC/VSX */
 #define TIF_PATCH_PENDING	6	/* pending live patching update */
 #define TIF_SYSCALL_AUDIT	7	/* syscall auditing active */
 #define TIF_SINGLESTEP		8	/* singlestepping active */
 #define TIF_NOHZ		9	/* in adaptive nohz mode */
 #define TIF_SECCOMP		10	/* secure computing */
-#define TIF_RESTOREALL		11	/* Restore all regs (implies NOERROR) */
-#define TIF_NOERROR		12	/* Force successful syscall return */
+
+#define TIF_NEED_RESCHED_LAZY	11	/* lazy rescheduling necessary */
+#define TIF_SYSCALL_TRACEPOINT	12	/* syscall tracepoint instrumentation */
+
 #define TIF_NOTIFY_RESUME	13	/* callback before returning to user */
 #define TIF_UPROBE		14	/* breakpointed or single-stepping */
-#define TIF_SYSCALL_TRACEPOINT	15	/* syscall tracepoint instrumentation */
 #define TIF_EMULATE_STACK_STORE	16	/* Is an instruction emulation
 						for stack store? */
 #define TIF_MEMDIE		17	/* is terminating due to OOM killer */
@@ -100,6 +102,10 @@
 #define TIF_ELF2ABI		18	/* function descriptors must die! */
 #endif
 #define TIF_POLLING_NRFLAG	19	/* true if poll_idle() is polling TIF_NEED_RESCHED */
+#define TIF_32BIT		20	/* 32 bit binary */
+#define TIF_RESTOREALL		21	/* Restore all regs (implies NOERROR) */
+#define TIF_NOERROR		22	/* Force successful syscall return */
+
 
 /* as above, but as bit values */
 #define _TIF_SYSCALL_TRACE	(1<<TIF_SYSCALL_TRACE)
@@ -119,6 +125,7 @@
 #define _TIF_SYSCALL_TRACEPOINT	(1<<TIF_SYSCALL_TRACEPOINT)
 #define _TIF_EMULATE_STACK_STORE	(1<<TIF_EMULATE_STACK_STORE)
 #define _TIF_NOHZ		(1<<TIF_NOHZ)
+#define _TIF_NEED_RESCHED_LAZY	(1<<TIF_NEED_RESCHED_LAZY)
 #define _TIF_FSCHECK		(1<<TIF_FSCHECK)
 #define _TIF_SYSCALL_DOTRACE	(_TIF_SYSCALL_TRACE | _TIF_SYSCALL_AUDIT | \
 				 _TIF_SECCOMP | _TIF_SYSCALL_TRACEPOINT | \
@@ -127,8 +134,9 @@
 #define _TIF_USER_WORK_MASK	(_TIF_SIGPENDING | _TIF_NEED_RESCHED | \
 				 _TIF_NOTIFY_RESUME | _TIF_UPROBE | \
 				 _TIF_RESTORE_TM | _TIF_PATCH_PENDING | \
-				 _TIF_FSCHECK)
+				 _TIF_FSCHECK | _TIF_NEED_RESCHED_LAZY)
 #define _TIF_PERSYSCALL_MASK	(_TIF_RESTOREALL|_TIF_NOERROR)
+#define _TIF_NEED_RESCHED_MASK	(_TIF_NEED_RESCHED | _TIF_NEED_RESCHED_LAZY)
 
 /* Bits in local_flags */
 /* Don't move TLF_NAPPING without adjusting the code in entry_32.S */
diff --git a/kernel/arch/powerpc/kernel/asm-offsets.c b/kernel/arch/powerpc/kernel/asm-offsets.c
index 50400f2..1bb82c5 100644
--- a/kernel/arch/powerpc/kernel/asm-offsets.c
+++ b/kernel/arch/powerpc/kernel/asm-offsets.c
@@ -156,6 +156,7 @@
 	OFFSET(TI_FLAGS, thread_info, flags);
 	OFFSET(TI_LOCAL_FLAGS, thread_info, local_flags);
 	OFFSET(TI_PREEMPT, thread_info, preempt_count);
+	OFFSET(TI_PREEMPT_LAZY, thread_info, preempt_lazy_count);
 	OFFSET(TI_TASK, thread_info, task);
 	OFFSET(TI_CPU, thread_info, cpu);
 
diff --git a/kernel/arch/powerpc/kernel/entry_32.S b/kernel/arch/powerpc/kernel/entry_32.S
index 26b3f85..44bcf15 100644
--- a/kernel/arch/powerpc/kernel/entry_32.S
+++ b/kernel/arch/powerpc/kernel/entry_32.S
@@ -393,7 +393,9 @@
 	MTMSRD(r10)
 	lwz	r9,TI_FLAGS(r12)
 	li	r8,-MAX_ERRNO
-	andi.	r0,r9,(_TIF_SYSCALL_DOTRACE|_TIF_SINGLESTEP|_TIF_USER_WORK_MASK|_TIF_PERSYSCALL_MASK)
+	lis	r0,(_TIF_SYSCALL_DOTRACE|_TIF_SINGLESTEP|_TIF_USER_WORK_MASK|_TIF_PERSYSCALL_MASK)@h
+	ori	r0,r0, (_TIF_SYSCALL_DOTRACE|_TIF_SINGLESTEP|_TIF_USER_WORK_MASK|_TIF_PERSYSCALL_MASK)@l
+	and.	r0,r9,r0
 	bne-	syscall_exit_work
 	cmplw	0,r3,r8
 	blt+	syscall_exit_cont
@@ -511,13 +513,13 @@
 	b	syscall_dotrace_cont
 
 syscall_exit_work:
-	andi.	r0,r9,_TIF_RESTOREALL
+	andis.	r0,r9,_TIF_RESTOREALL@h
 	beq+	0f
 	REST_NVGPRS(r1)
 	b	2f
 0:	cmplw	0,r3,r8
 	blt+	1f
-	andi.	r0,r9,_TIF_NOERROR
+	andis.	r0,r9,_TIF_NOERROR@h
 	bne-	1f
 	lwz	r11,_CCR(r1)			/* Load CR */
 	neg	r3,r3
@@ -526,12 +528,12 @@
 
 1:	stw	r6,RESULT(r1)	/* Save result */
 	stw	r3,GPR3(r1)	/* Update return value */
-2:	andi.	r0,r9,(_TIF_PERSYSCALL_MASK)
+2:	andis.	r0,r9,(_TIF_PERSYSCALL_MASK)@h
 	beq	4f
 
 	/* Clear per-syscall TIF flags if any are set.  */
 
-	li	r11,_TIF_PERSYSCALL_MASK
+	lis	r11,_TIF_PERSYSCALL_MASK@h
 	addi	r12,r12,TI_FLAGS
 3:	lwarx	r8,0,r12
 	andc	r8,r8,r11
@@ -888,7 +890,14 @@
 	cmpwi	0,r0,0		/* if non-zero, just restore regs and return */
 	bne	restore
 	andi.	r8,r8,_TIF_NEED_RESCHED
+	bne+	1f
+	lwz	r0,TI_PREEMPT_LAZY(r9)
+	cmpwi	0,r0,0		/* if non-zero, just restore regs and return */
+	bne	restore
+	lwz	r0,TI_FLAGS(r9)
+	andi.	r0,r0,_TIF_NEED_RESCHED_LAZY
 	beq+	restore
+1:
 	lwz	r3,_MSR(r1)
 	andi.	r0,r3,MSR_EE	/* interrupts off? */
 	beq	restore		/* don't schedule if so */
@@ -899,11 +908,11 @@
 	 */
 	bl	trace_hardirqs_off
 #endif
-1:	bl	preempt_schedule_irq
+2:	bl	preempt_schedule_irq
 	CURRENT_THREAD_INFO(r9, r1)
 	lwz	r3,TI_FLAGS(r9)
-	andi.	r0,r3,_TIF_NEED_RESCHED
-	bne-	1b
+	andi.	r0,r3,_TIF_NEED_RESCHED_MASK
+	bne-	2b
 #ifdef CONFIG_TRACE_IRQFLAGS
 	/* And now, to properly rebalance the above, we tell lockdep they
 	 * are being turned back on, which will happen when we return
@@ -1232,7 +1241,7 @@
 #endif /* !(CONFIG_4xx || CONFIG_BOOKE) */
 
 do_work:			/* r10 contains MSR_KERNEL here */
-	andi.	r0,r9,_TIF_NEED_RESCHED
+	andi.	r0,r9,_TIF_NEED_RESCHED_MASK
 	beq	do_user_signal
 
 do_resched:			/* r10 contains MSR_KERNEL here */
@@ -1253,7 +1262,7 @@
 	MTMSRD(r10)		/* disable interrupts */
 	CURRENT_THREAD_INFO(r9, r1)
 	lwz	r9,TI_FLAGS(r9)
-	andi.	r0,r9,_TIF_NEED_RESCHED
+	andi.	r0,r9,_TIF_NEED_RESCHED_MASK
 	bne-	do_resched
 	andi.	r0,r9,_TIF_USER_WORK_MASK
 	beq	restore_user
diff --git a/kernel/arch/powerpc/kernel/entry_64.S b/kernel/arch/powerpc/kernel/entry_64.S
index 58b5096..229cdb0 100644
--- a/kernel/arch/powerpc/kernel/entry_64.S
+++ b/kernel/arch/powerpc/kernel/entry_64.S
@@ -176,7 +176,7 @@
  * based on caller's run-mode / personality.
  */
 	ld	r11,SYS_CALL_TABLE@toc(2)
-	andi.	r10,r10,_TIF_32BIT
+	andis.	r10,r10,_TIF_32BIT@h
 	beq	15f
 	addi	r11,r11,8	/* use 32-bit syscall entries */
 	clrldi	r3,r3,32
@@ -250,7 +250,9 @@
 
 	ld	r9,TI_FLAGS(r12)
 	li	r11,-MAX_ERRNO
-	andi.	r0,r9,(_TIF_SYSCALL_DOTRACE|_TIF_SINGLESTEP|_TIF_USER_WORK_MASK|_TIF_PERSYSCALL_MASK)
+	lis	r0,(_TIF_SYSCALL_DOTRACE|_TIF_SINGLESTEP|_TIF_USER_WORK_MASK|_TIF_PERSYSCALL_MASK)@h
+	ori	r0,r0,(_TIF_SYSCALL_DOTRACE|_TIF_SINGLESTEP|_TIF_USER_WORK_MASK|_TIF_PERSYSCALL_MASK)@l
+	and.	r0,r9,r0
 	bne-	.Lsyscall_exit_work
 
 	andi.	r0,r8,MSR_FP
@@ -363,25 +365,25 @@
 	/* If TIF_RESTOREALL is set, don't scribble on either r3 or ccr.
 	 If TIF_NOERROR is set, just save r3 as it is. */
 
-	andi.	r0,r9,_TIF_RESTOREALL
+	andis.	r0,r9,_TIF_RESTOREALL@h
 	beq+	0f
 	REST_NVGPRS(r1)
 	b	2f
 0:	cmpld	r3,r11		/* r11 is -MAX_ERRNO */
 	blt+	1f
-	andi.	r0,r9,_TIF_NOERROR
+	andis.	r0,r9,_TIF_NOERROR@h
 	bne-	1f
 	ld	r5,_CCR(r1)
 	neg	r3,r3
 	oris	r5,r5,0x1000	/* Set SO bit in CR */
 	std	r5,_CCR(r1)
 1:	std	r3,GPR3(r1)
-2:	andi.	r0,r9,(_TIF_PERSYSCALL_MASK)
+2:	andis.	r0,r9,(_TIF_PERSYSCALL_MASK)@h
 	beq	4f
 
 	/* Clear per-syscall TIF flags if any are set.  */
 
-	li	r11,_TIF_PERSYSCALL_MASK
+	lis	r11,(_TIF_PERSYSCALL_MASK)@h
 	addi	r12,r12,TI_FLAGS
 3:	ldarx	r10,0,r12
 	andc	r10,r10,r11
@@ -774,7 +776,7 @@
 	bl	restore_math
 	b	restore
 #endif
-1:	andi.	r0,r4,_TIF_NEED_RESCHED
+1:	andi.	r0,r4,_TIF_NEED_RESCHED_MASK
 	beq	2f
 	bl	restore_interrupts
 	SCHEDULE_USER
@@ -836,10 +838,18 @@
 
 #ifdef CONFIG_PREEMPT
 	/* Check if we need to preempt */
-	andi.	r0,r4,_TIF_NEED_RESCHED
-	beq+	restore
-	/* Check that preempt_count() == 0 and interrupts are enabled */
 	lwz	r8,TI_PREEMPT(r9)
+	cmpwi	0,r8,0		/* if non-zero, just restore regs and return */
+	bne	restore
+	andi.	r0,r4,_TIF_NEED_RESCHED
+	bne+	check_count
+
+	andi.	r0,r4,_TIF_NEED_RESCHED_LAZY
+	beq+	restore
+	lwz	r8,TI_PREEMPT_LAZY(r9)
+
+	/* Check that preempt_count() == 0 and interrupts are enabled */
+check_count:
 	cmpwi	cr0,r8,0
 	bne	restore
 	ld	r0,SOFTE(r1)
@@ -856,7 +866,7 @@
 	/* Re-test flags and eventually loop */
 	CURRENT_THREAD_INFO(r9, r1)
 	ld	r4,TI_FLAGS(r9)
-	andi.	r0,r4,_TIF_NEED_RESCHED
+	andi.	r0,r4,_TIF_NEED_RESCHED_MASK
 	bne	1b
 
 	/*
diff --git a/kernel/arch/powerpc/kernel/irq.c b/kernel/arch/powerpc/kernel/irq.c
index d37704e..b45a984 100644
--- a/kernel/arch/powerpc/kernel/irq.c
+++ b/kernel/arch/powerpc/kernel/irq.c
@@ -766,6 +766,7 @@
 	}
 }
 
+#ifndef CONFIG_PREEMPT_RT_FULL
 void do_softirq_own_stack(void)
 {
 	struct thread_info *curtp, *irqtp;
@@ -783,6 +784,7 @@
 	if (irqtp->flags)
 		set_bits(irqtp->flags, &curtp->flags);
 }
+#endif
 
 irq_hw_number_t virq_to_hw(unsigned int virq)
 {
diff --git a/kernel/arch/powerpc/kernel/misc_32.S b/kernel/arch/powerpc/kernel/misc_32.S
index 695b24a..032ada2 100644
--- a/kernel/arch/powerpc/kernel/misc_32.S
+++ b/kernel/arch/powerpc/kernel/misc_32.S
@@ -42,6 +42,7 @@
  * We store the saved ksp_limit in the unused part
  * of the STACK_FRAME_OVERHEAD
  */
+#ifndef CONFIG_PREEMPT_RT_FULL
 _GLOBAL(call_do_softirq)
 	mflr	r0
 	stw	r0,4(r1)
@@ -58,6 +59,7 @@
 	stw	r10,THREAD+KSP_LIMIT(r2)
 	mtlr	r0
 	blr
+#endif
 
 /*
  * void call_do_irq(struct pt_regs *regs, struct thread_info *irqtp);
diff --git a/kernel/arch/powerpc/kernel/misc_64.S b/kernel/arch/powerpc/kernel/misc_64.S
index facc029..8b17741 100644
--- a/kernel/arch/powerpc/kernel/misc_64.S
+++ b/kernel/arch/powerpc/kernel/misc_64.S
@@ -32,6 +32,7 @@
 
 	.text
 
+#ifndef CONFIG_PREEMPT_RT_FULL
 _GLOBAL(call_do_softirq)
 	mflr	r0
 	std	r0,16(r1)
@@ -42,6 +43,7 @@
 	ld	r0,16(r1)
 	mtlr	r0
 	blr
+#endif
 
 _GLOBAL(call_do_irq)
 	mflr	r0
diff --git a/kernel/arch/powerpc/kvm/Kconfig b/kernel/arch/powerpc/kvm/Kconfig
index e058d02..19a283f 100644
--- a/kernel/arch/powerpc/kvm/Kconfig
+++ b/kernel/arch/powerpc/kvm/Kconfig
@@ -177,6 +177,7 @@
 config KVM_MPIC
 	bool "KVM in-kernel MPIC emulation"
 	depends on KVM && E500
+	depends on !PREEMPT_RT_FULL
 	select HAVE_KVM_IRQCHIP
 	select HAVE_KVM_IRQFD
 	select HAVE_KVM_IRQ_ROUTING
diff --git a/kernel/arch/powerpc/platforms/cell/spufs/sched.c b/kernel/arch/powerpc/platforms/cell/spufs/sched.c
index 9fcccb4..a24010d 100644
--- a/kernel/arch/powerpc/platforms/cell/spufs/sched.c
+++ b/kernel/arch/powerpc/platforms/cell/spufs/sched.c
@@ -141,7 +141,7 @@
 	 * runqueue. The context will be rescheduled on the proper node
 	 * if it is timesliced or preempted.
 	 */
-	cpumask_copy(&ctx->cpus_allowed, &current->cpus_allowed);
+	cpumask_copy(&ctx->cpus_allowed, current->cpus_ptr);
 
 	/* Save the current cpu id for spu interrupt routing. */
 	ctx->last_ran = raw_smp_processor_id();
diff --git a/kernel/arch/powerpc/platforms/ps3/device-init.c b/kernel/arch/powerpc/platforms/ps3/device-init.c
index e7075aa..1580464 100644
--- a/kernel/arch/powerpc/platforms/ps3/device-init.c
+++ b/kernel/arch/powerpc/platforms/ps3/device-init.c
@@ -752,8 +752,8 @@
 	}
 	pr_debug("%s:%u: notification %s issued\n", __func__, __LINE__, op);
 
-	res = wait_event_interruptible(dev->done.wait,
-				       dev->done.done || kthread_should_stop());
+	res = swait_event_interruptible_exclusive(dev->done.wait,
+						  dev->done.done || kthread_should_stop());
 	if (kthread_should_stop())
 		res = -EINTR;
 	if (res) {
diff --git a/kernel/arch/powerpc/platforms/pseries/iommu.c b/kernel/arch/powerpc/platforms/pseries/iommu.c
index b1a08cb..8ef818a 100644
--- a/kernel/arch/powerpc/platforms/pseries/iommu.c
+++ b/kernel/arch/powerpc/platforms/pseries/iommu.c
@@ -38,6 +38,7 @@
 #include <linux/of.h>
 #include <linux/iommu.h>
 #include <linux/rculist.h>
+#include <linux/locallock.h>
 #include <asm/io.h>
 #include <asm/prom.h>
 #include <asm/rtas.h>
@@ -212,6 +213,7 @@
 }
 
 static DEFINE_PER_CPU(__be64 *, tce_page);
+static DEFINE_LOCAL_IRQ_LOCK(tcp_page_lock);
 
 static int tce_buildmulti_pSeriesLP(struct iommu_table *tbl, long tcenum,
 				     long npages, unsigned long uaddr,
@@ -233,7 +235,8 @@
 		                           direction, attrs);
 	}
 
-	local_irq_save(flags);	/* to protect tcep and the page behind it */
+	/* to protect tcep and the page behind it */
+	local_lock_irqsave(tcp_page_lock, flags);
 
 	tcep = __this_cpu_read(tce_page);
 
@@ -244,7 +247,7 @@
 		tcep = (__be64 *)__get_free_page(GFP_ATOMIC);
 		/* If allocation fails, fall back to the loop implementation */
 		if (!tcep) {
-			local_irq_restore(flags);
+			local_unlock_irqrestore(tcp_page_lock, flags);
 			return tce_build_pSeriesLP(tbl->it_index, tcenum,
 					tbl->it_page_shift,
 					npages, uaddr, direction, attrs);
@@ -279,7 +282,7 @@
 		tcenum += limit;
 	} while (npages > 0 && !rc);
 
-	local_irq_restore(flags);
+	local_unlock_irqrestore(tcp_page_lock, flags);
 
 	if (unlikely(rc == H_NOT_ENOUGH_RESOURCES)) {
 		ret = (int)rc;
@@ -450,13 +453,14 @@
 				DMA_BIDIRECTIONAL, 0);
 	}
 
-	local_irq_disable();	/* to protect tcep and the page behind it */
+	/* to protect tcep and the page behind it */
+	local_lock_irq(tcp_page_lock);
 	tcep = __this_cpu_read(tce_page);
 
 	if (!tcep) {
 		tcep = (__be64 *)__get_free_page(GFP_ATOMIC);
 		if (!tcep) {
-			local_irq_enable();
+			local_unlock_irq(tcp_page_lock);
 			return -ENOMEM;
 		}
 		__this_cpu_write(tce_page, tcep);
@@ -502,7 +506,7 @@
 
 	/* error cleanup: caller will clear whole range */
 
-	local_irq_enable();
+	local_unlock_irq(tcp_page_lock);
 	return rc;
 }
 
diff --git a/kernel/arch/s390/include/asm/spinlock_types.h b/kernel/arch/s390/include/asm/spinlock_types.h
index cfed272..8e28e81 100644
--- a/kernel/arch/s390/include/asm/spinlock_types.h
+++ b/kernel/arch/s390/include/asm/spinlock_types.h
@@ -2,10 +2,6 @@
 #ifndef __ASM_SPINLOCK_TYPES_H
 #define __ASM_SPINLOCK_TYPES_H
 
-#ifndef __LINUX_SPINLOCK_TYPES_H
-# error "please don't include this file directly"
-#endif
-
 typedef struct {
 	int lock;
 } __attribute__ ((aligned (4))) arch_spinlock_t;
diff --git a/kernel/arch/sh/include/asm/spinlock_types.h b/kernel/arch/sh/include/asm/spinlock_types.h
index e82369f..22ca9a9 100644
--- a/kernel/arch/sh/include/asm/spinlock_types.h
+++ b/kernel/arch/sh/include/asm/spinlock_types.h
@@ -2,10 +2,6 @@
 #ifndef __ASM_SH_SPINLOCK_TYPES_H
 #define __ASM_SH_SPINLOCK_TYPES_H
 
-#ifndef __LINUX_SPINLOCK_TYPES_H
-# error "please don't include this file directly"
-#endif
-
 typedef struct {
 	volatile unsigned int lock;
 } arch_spinlock_t;
diff --git a/kernel/arch/sh/kernel/irq.c b/kernel/arch/sh/kernel/irq.c
index 5717c7c..66dd399 100644
--- a/kernel/arch/sh/kernel/irq.c
+++ b/kernel/arch/sh/kernel/irq.c
@@ -148,6 +148,7 @@
 	hardirq_ctx[cpu] = NULL;
 }
 
+#ifndef CONFIG_PREEMPT_RT_FULL
 void do_softirq_own_stack(void)
 {
 	struct thread_info *curctx;
@@ -175,6 +176,7 @@
 		  "r5", "r6", "r7", "r8", "r9", "r15", "t", "pr"
 	);
 }
+#endif
 #else
 static inline void handle_one_irq(unsigned int irq)
 {
diff --git a/kernel/arch/sparc/kernel/irq_64.c b/kernel/arch/sparc/kernel/irq_64.c
index 713670e..5dfc715 100644
--- a/kernel/arch/sparc/kernel/irq_64.c
+++ b/kernel/arch/sparc/kernel/irq_64.c
@@ -854,6 +854,7 @@
 	set_irq_regs(old_regs);
 }
 
+#ifndef CONFIG_PREEMPT_RT_FULL
 void do_softirq_own_stack(void)
 {
 	void *orig_sp, *sp = softirq_stack[smp_processor_id()];
@@ -868,6 +869,7 @@
 	__asm__ __volatile__("mov %0, %%sp"
 			     : : "r" (orig_sp));
 }
+#endif
 
 #ifdef CONFIG_HOTPLUG_CPU
 void fixup_irqs(void)
diff --git a/kernel/arch/x86/Kconfig b/kernel/arch/x86/Kconfig
index a12dc21..1a51b69 100644
--- a/kernel/arch/x86/Kconfig
+++ b/kernel/arch/x86/Kconfig
@@ -182,6 +182,7 @@
 	select HAVE_HARDLOCKUP_DETECTOR_PERF	if PERF_EVENTS && HAVE_PERF_EVENTS_NMI
 	select HAVE_PERF_REGS
 	select HAVE_PERF_USER_STACK_DUMP
+	select HAVE_PREEMPT_LAZY
 	select HAVE_RCU_TABLE_FREE		if PARAVIRT
 	select HAVE_RCU_TABLE_INVALIDATE	if HAVE_RCU_TABLE_FREE
 	select HAVE_REGS_AND_STACK_ACCESS_API
@@ -267,8 +268,11 @@
 	def_bool y
 	depends on ISA_DMA_API
 
+config RWSEM_GENERIC_SPINLOCK
+	def_bool PREEMPT_RT_FULL
+
 config RWSEM_XCHGADD_ALGORITHM
-	def_bool y
+	def_bool !RWSEM_GENERIC_SPINLOCK && !PREEMPT_RT_FULL
 
 config GENERIC_CALIBRATE_DELAY
 	def_bool y
@@ -938,7 +942,7 @@
 config MAXSMP
 	bool "Enable Maximum number of SMP Processors and NUMA Nodes"
 	depends on X86_64 && SMP && DEBUG_KERNEL
-	select CPUMASK_OFFSTACK
+	select CPUMASK_OFFSTACK if !PREEMPT_RT_FULL
 	---help---
 	  Enable maximum number of CPUS and NUMA Nodes for this architecture.
 	  If unsure, say N.
diff --git a/kernel/arch/x86/crypto/aesni-intel_glue.c b/kernel/arch/x86/crypto/aesni-intel_glue.c
index 917f25e..58d8c03 100644
--- a/kernel/arch/x86/crypto/aesni-intel_glue.c
+++ b/kernel/arch/x86/crypto/aesni-intel_glue.c
@@ -434,14 +434,14 @@
 
 	err = skcipher_walk_virt(&walk, req, true);
 
-	kernel_fpu_begin();
 	while ((nbytes = walk.nbytes)) {
+		kernel_fpu_begin();
 		aesni_ecb_enc(ctx, walk.dst.virt.addr, walk.src.virt.addr,
 			      nbytes & AES_BLOCK_MASK);
+		kernel_fpu_end();
 		nbytes &= AES_BLOCK_SIZE - 1;
 		err = skcipher_walk_done(&walk, nbytes);
 	}
-	kernel_fpu_end();
 
 	return err;
 }
@@ -456,14 +456,14 @@
 
 	err = skcipher_walk_virt(&walk, req, true);
 
-	kernel_fpu_begin();
 	while ((nbytes = walk.nbytes)) {
+		kernel_fpu_begin();
 		aesni_ecb_dec(ctx, walk.dst.virt.addr, walk.src.virt.addr,
 			      nbytes & AES_BLOCK_MASK);
+		kernel_fpu_end();
 		nbytes &= AES_BLOCK_SIZE - 1;
 		err = skcipher_walk_done(&walk, nbytes);
 	}
-	kernel_fpu_end();
 
 	return err;
 }
@@ -478,14 +478,14 @@
 
 	err = skcipher_walk_virt(&walk, req, true);
 
-	kernel_fpu_begin();
 	while ((nbytes = walk.nbytes)) {
+		kernel_fpu_begin();
 		aesni_cbc_enc(ctx, walk.dst.virt.addr, walk.src.virt.addr,
 			      nbytes & AES_BLOCK_MASK, walk.iv);
+		kernel_fpu_end();
 		nbytes &= AES_BLOCK_SIZE - 1;
 		err = skcipher_walk_done(&walk, nbytes);
 	}
-	kernel_fpu_end();
 
 	return err;
 }
@@ -500,14 +500,14 @@
 
 	err = skcipher_walk_virt(&walk, req, true);
 
-	kernel_fpu_begin();
 	while ((nbytes = walk.nbytes)) {
+		kernel_fpu_begin();
 		aesni_cbc_dec(ctx, walk.dst.virt.addr, walk.src.virt.addr,
 			      nbytes & AES_BLOCK_MASK, walk.iv);
+		kernel_fpu_end();
 		nbytes &= AES_BLOCK_SIZE - 1;
 		err = skcipher_walk_done(&walk, nbytes);
 	}
-	kernel_fpu_end();
 
 	return err;
 }
@@ -557,18 +557,20 @@
 
 	err = skcipher_walk_virt(&walk, req, true);
 
-	kernel_fpu_begin();
 	while ((nbytes = walk.nbytes) >= AES_BLOCK_SIZE) {
+		kernel_fpu_begin();
 		aesni_ctr_enc_tfm(ctx, walk.dst.virt.addr, walk.src.virt.addr,
 			              nbytes & AES_BLOCK_MASK, walk.iv);
+		kernel_fpu_end();
 		nbytes &= AES_BLOCK_SIZE - 1;
 		err = skcipher_walk_done(&walk, nbytes);
 	}
 	if (walk.nbytes) {
+		kernel_fpu_begin();
 		ctr_crypt_final(ctx, &walk);
+		kernel_fpu_end();
 		err = skcipher_walk_done(&walk, 0);
 	}
-	kernel_fpu_end();
 
 	return err;
 }
diff --git a/kernel/arch/x86/crypto/cast5_avx_glue.c b/kernel/arch/x86/crypto/cast5_avx_glue.c
index 4103474..d4bf7fc 100644
--- a/kernel/arch/x86/crypto/cast5_avx_glue.c
+++ b/kernel/arch/x86/crypto/cast5_avx_glue.c
@@ -61,7 +61,7 @@
 
 static int ecb_crypt(struct skcipher_request *req, bool enc)
 {
-	bool fpu_enabled = false;
+	bool fpu_enabled;
 	struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req);
 	struct cast5_ctx *ctx = crypto_skcipher_ctx(tfm);
 	struct skcipher_walk walk;
@@ -76,7 +76,7 @@
 		u8 *wsrc = walk.src.virt.addr;
 		u8 *wdst = walk.dst.virt.addr;
 
-		fpu_enabled = cast5_fpu_begin(fpu_enabled, &walk, nbytes);
+		fpu_enabled = cast5_fpu_begin(false, &walk, nbytes);
 
 		/* Process multi-block batch */
 		if (nbytes >= bsize * CAST5_PARALLEL_BLOCKS) {
@@ -105,10 +105,9 @@
 		} while (nbytes >= bsize);
 
 done:
+		cast5_fpu_end(fpu_enabled);
 		err = skcipher_walk_done(&walk, nbytes);
 	}
-
-	cast5_fpu_end(fpu_enabled);
 	return err;
 }
 
@@ -212,7 +211,7 @@
 {
 	struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req);
 	struct cast5_ctx *ctx = crypto_skcipher_ctx(tfm);
-	bool fpu_enabled = false;
+	bool fpu_enabled;
 	struct skcipher_walk walk;
 	unsigned int nbytes;
 	int err;
@@ -220,12 +219,11 @@
 	err = skcipher_walk_virt(&walk, req, false);
 
 	while ((nbytes = walk.nbytes)) {
-		fpu_enabled = cast5_fpu_begin(fpu_enabled, &walk, nbytes);
+		fpu_enabled = cast5_fpu_begin(false, &walk, nbytes);
 		nbytes = __cbc_decrypt(ctx, &walk);
+		cast5_fpu_end(fpu_enabled);
 		err = skcipher_walk_done(&walk, nbytes);
 	}
-
-	cast5_fpu_end(fpu_enabled);
 	return err;
 }
 
@@ -292,7 +290,7 @@
 {
 	struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req);
 	struct cast5_ctx *ctx = crypto_skcipher_ctx(tfm);
-	bool fpu_enabled = false;
+	bool fpu_enabled;
 	struct skcipher_walk walk;
 	unsigned int nbytes;
 	int err;
@@ -300,12 +298,11 @@
 	err = skcipher_walk_virt(&walk, req, false);
 
 	while ((nbytes = walk.nbytes) >= CAST5_BLOCK_SIZE) {
-		fpu_enabled = cast5_fpu_begin(fpu_enabled, &walk, nbytes);
+		fpu_enabled = cast5_fpu_begin(false, &walk, nbytes);
 		nbytes = __ctr_crypt(&walk, ctx);
+		cast5_fpu_end(fpu_enabled);
 		err = skcipher_walk_done(&walk, nbytes);
 	}
-
-	cast5_fpu_end(fpu_enabled);
 
 	if (walk.nbytes) {
 		ctr_crypt_final(&walk, ctx);
diff --git a/kernel/arch/x86/crypto/glue_helper.c b/kernel/arch/x86/crypto/glue_helper.c
index a78ef99..dac489a 100644
--- a/kernel/arch/x86/crypto/glue_helper.c
+++ b/kernel/arch/x86/crypto/glue_helper.c
@@ -38,7 +38,7 @@
 	void *ctx = crypto_skcipher_ctx(crypto_skcipher_reqtfm(req));
 	const unsigned int bsize = 128 / 8;
 	struct skcipher_walk walk;
-	bool fpu_enabled = false;
+	bool fpu_enabled;
 	unsigned int nbytes;
 	int err;
 
@@ -51,7 +51,7 @@
 		unsigned int i;
 
 		fpu_enabled = glue_fpu_begin(bsize, gctx->fpu_blocks_limit,
-					     &walk, fpu_enabled, nbytes);
+					     &walk, false, nbytes);
 		for (i = 0; i < gctx->num_funcs; i++) {
 			func_bytes = bsize * gctx->funcs[i].num_blocks;
 
@@ -69,10 +69,9 @@
 			if (nbytes < bsize)
 				break;
 		}
+		glue_fpu_end(fpu_enabled);
 		err = skcipher_walk_done(&walk, nbytes);
 	}
-
-	glue_fpu_end(fpu_enabled);
 	return err;
 }
 EXPORT_SYMBOL_GPL(glue_ecb_req_128bit);
@@ -115,7 +114,7 @@
 	void *ctx = crypto_skcipher_ctx(crypto_skcipher_reqtfm(req));
 	const unsigned int bsize = 128 / 8;
 	struct skcipher_walk walk;
-	bool fpu_enabled = false;
+	bool fpu_enabled;
 	unsigned int nbytes;
 	int err;
 
@@ -129,7 +128,7 @@
 		u128 last_iv;
 
 		fpu_enabled = glue_fpu_begin(bsize, gctx->fpu_blocks_limit,
-					     &walk, fpu_enabled, nbytes);
+					     &walk, false, nbytes);
 		/* Start of the last block. */
 		src += nbytes / bsize - 1;
 		dst += nbytes / bsize - 1;
@@ -161,10 +160,10 @@
 done:
 		u128_xor(dst, dst, (u128 *)walk.iv);
 		*(u128 *)walk.iv = last_iv;
+		glue_fpu_end(fpu_enabled);
 		err = skcipher_walk_done(&walk, nbytes);
 	}
 
-	glue_fpu_end(fpu_enabled);
 	return err;
 }
 EXPORT_SYMBOL_GPL(glue_cbc_decrypt_req_128bit);
@@ -175,7 +174,7 @@
 	void *ctx = crypto_skcipher_ctx(crypto_skcipher_reqtfm(req));
 	const unsigned int bsize = 128 / 8;
 	struct skcipher_walk walk;
-	bool fpu_enabled = false;
+	bool fpu_enabled;
 	unsigned int nbytes;
 	int err;
 
@@ -189,7 +188,7 @@
 		le128 ctrblk;
 
 		fpu_enabled = glue_fpu_begin(bsize, gctx->fpu_blocks_limit,
-					     &walk, fpu_enabled, nbytes);
+					     &walk, false, nbytes);
 
 		be128_to_le128(&ctrblk, (be128 *)walk.iv);
 
@@ -213,10 +212,9 @@
 		}
 
 		le128_to_be128((be128 *)walk.iv, &ctrblk);
+		glue_fpu_end(fpu_enabled);
 		err = skcipher_walk_done(&walk, nbytes);
 	}
-
-	glue_fpu_end(fpu_enabled);
 
 	if (nbytes) {
 		le128 ctrblk;
@@ -278,7 +276,7 @@
 {
 	const unsigned int bsize = 128 / 8;
 	struct skcipher_walk walk;
-	bool fpu_enabled = false;
+	bool fpu_enabled;
 	unsigned int nbytes;
 	int err;
 
@@ -289,20 +287,23 @@
 
 	/* set minimum length to bsize, for tweak_fn */
 	fpu_enabled = glue_fpu_begin(bsize, gctx->fpu_blocks_limit,
-				     &walk, fpu_enabled,
+				     &walk, false,
 				     nbytes < bsize ? bsize : nbytes);
 
 	/* calculate first value of T */
 	tweak_fn(tweak_ctx, walk.iv, walk.iv);
 
 	while (nbytes) {
+		fpu_enabled = glue_fpu_begin(bsize, gctx->fpu_blocks_limit,
+					     &walk, fpu_enabled,
+					     nbytes < bsize ? bsize : nbytes);
 		nbytes = __glue_xts_req_128bit(gctx, crypt_ctx, &walk);
 
+		glue_fpu_end(fpu_enabled);
+		fpu_enabled = false;
 		err = skcipher_walk_done(&walk, nbytes);
 		nbytes = walk.nbytes;
 	}
-
-	glue_fpu_end(fpu_enabled);
 
 	return err;
 }
diff --git a/kernel/arch/x86/entry/common.c b/kernel/arch/x86/entry/common.c
index 8353348..3b5e41d 100644
--- a/kernel/arch/x86/entry/common.c
+++ b/kernel/arch/x86/entry/common.c
@@ -134,7 +134,7 @@
 
 #define EXIT_TO_USERMODE_LOOP_FLAGS				\
 	(_TIF_SIGPENDING | _TIF_NOTIFY_RESUME | _TIF_UPROBE |	\
-	 _TIF_NEED_RESCHED | _TIF_USER_RETURN_NOTIFY | _TIF_PATCH_PENDING)
+	 _TIF_NEED_RESCHED_MASK | _TIF_USER_RETURN_NOTIFY | _TIF_PATCH_PENDING)
 
 static void exit_to_usermode_loop(struct pt_regs *regs, u32 cached_flags)
 {
@@ -149,9 +149,16 @@
 		/* We have work to do. */
 		local_irq_enable();
 
-		if (cached_flags & _TIF_NEED_RESCHED)
+		if (cached_flags & _TIF_NEED_RESCHED_MASK)
 			schedule();
 
+#ifdef ARCH_RT_DELAYS_SIGNAL_SEND
+		if (unlikely(current->forced_info.si_signo)) {
+			struct task_struct *t = current;
+			force_sig_info(t->forced_info.si_signo, &t->forced_info, t);
+			t->forced_info.si_signo = 0;
+		}
+#endif
 		if (cached_flags & _TIF_UPROBE)
 			uprobe_notify_resume(regs);
 
diff --git a/kernel/arch/x86/entry/entry_32.S b/kernel/arch/x86/entry/entry_32.S
index 37d9016..d8b4008 100644
--- a/kernel/arch/x86/entry/entry_32.S
+++ b/kernel/arch/x86/entry/entry_32.S
@@ -750,8 +750,25 @@
 ENTRY(resume_kernel)
 	DISABLE_INTERRUPTS(CLBR_ANY)
 .Lneed_resched:
+	# preempt count == 0 + NEED_RS set?
 	cmpl	$0, PER_CPU_VAR(__preempt_count)
+#ifndef CONFIG_PREEMPT_LAZY
 	jnz	restore_all_kernel
+#else
+	jz	test_int_off
+
+	# atleast preempt count == 0 ?
+	cmpl $_PREEMPT_ENABLED,PER_CPU_VAR(__preempt_count)
+	jne	restore_all_kernel
+
+	movl	PER_CPU_VAR(current_task), %ebp
+	cmpl	$0,TASK_TI_preempt_lazy_count(%ebp)	# non-zero preempt_lazy_count ?
+	jnz	restore_all_kernel
+
+	testl	$_TIF_NEED_RESCHED_LAZY, TASK_TI_flags(%ebp)
+	jz	restore_all_kernel
+test_int_off:
+#endif
 	testl	$X86_EFLAGS_IF, PT_EFLAGS(%esp)	# interrupts off (exception path) ?
 	jz	restore_all_kernel
 	call	preempt_schedule_irq
diff --git a/kernel/arch/x86/entry/entry_64.S b/kernel/arch/x86/entry/entry_64.S
index dfe26f3..94fccaa 100644
--- a/kernel/arch/x86/entry/entry_64.S
+++ b/kernel/arch/x86/entry/entry_64.S
@@ -733,7 +733,23 @@
 	btl	$9, EFLAGS(%rsp)		/* were interrupts off? */
 	jnc	1f
 0:	cmpl	$0, PER_CPU_VAR(__preempt_count)
+#ifndef CONFIG_PREEMPT_LAZY
 	jnz	1f
+#else
+	jz	do_preempt_schedule_irq
+
+	# atleast preempt count == 0 ?
+	cmpl $_PREEMPT_ENABLED,PER_CPU_VAR(__preempt_count)
+	jnz	1f
+
+	movq	PER_CPU_VAR(current_task), %rcx
+	cmpl	$0, TASK_TI_preempt_lazy_count(%rcx)
+	jnz	1f
+
+	btl	$TIF_NEED_RESCHED_LAZY,TASK_TI_flags(%rcx)
+	jnc	1f
+do_preempt_schedule_irq:
+#endif
 	call	preempt_schedule_irq
 	jmp	0b
 1:
@@ -1084,6 +1100,7 @@
 	jmp	2b
 	.previous
 
+#ifndef CONFIG_PREEMPT_RT_FULL
 /* Call softirq on interrupt stack. Interrupts are off. */
 ENTRY(do_softirq_own_stack)
 	pushq	%rbp
@@ -1094,6 +1111,7 @@
 	leaveq
 	ret
 ENDPROC(do_softirq_own_stack)
+#endif
 
 #ifdef CONFIG_XEN
 idtentry hypervisor_callback xen_do_hypervisor_callback has_error_code=0
diff --git a/kernel/arch/x86/include/asm/fpu/api.h b/kernel/arch/x86/include/asm/fpu/api.h
index b56d504..e51c709 100644
--- a/kernel/arch/x86/include/asm/fpu/api.h
+++ b/kernel/arch/x86/include/asm/fpu/api.h
@@ -20,6 +20,7 @@
  */
 extern void kernel_fpu_begin(void);
 extern void kernel_fpu_end(void);
+extern void kernel_fpu_resched(void);
 extern bool irq_fpu_usable(void);
 
 /*
diff --git a/kernel/arch/x86/include/asm/preempt.h b/kernel/arch/x86/include/asm/preempt.h
index 7f2dbd9..afa0e42 100644
--- a/kernel/arch/x86/include/asm/preempt.h
+++ b/kernel/arch/x86/include/asm/preempt.h
@@ -86,9 +86,24 @@
  * a decrement which hits zero means we have no preempt_count and should
  * reschedule.
  */
-static __always_inline bool __preempt_count_dec_and_test(void)
+static __always_inline bool ____preempt_count_dec_and_test(void)
 {
 	GEN_UNARY_RMWcc("decl", __preempt_count, __percpu_arg(0), e);
+}
+
+static __always_inline bool __preempt_count_dec_and_test(void)
+{
+	if (____preempt_count_dec_and_test())
+		return true;
+#ifdef CONFIG_PREEMPT_LAZY
+	if (preempt_count())
+		return false;
+	if (current_thread_info()->preempt_lazy_count)
+		return false;
+	return test_thread_flag(TIF_NEED_RESCHED_LAZY);
+#else
+	return false;
+#endif
 }
 
 /*
@@ -96,7 +111,23 @@
  */
 static __always_inline bool should_resched(int preempt_offset)
 {
+#ifdef CONFIG_PREEMPT_LAZY
+	u32 tmp;
+
+	tmp = raw_cpu_read_4(__preempt_count);
+	if (tmp == preempt_offset)
+		return true;
+
+	/* preempt count == 0 ? */
+	tmp &= ~PREEMPT_NEED_RESCHED;
+	if (tmp != preempt_offset)
+		return false;
+	if (current_thread_info()->preempt_lazy_count)
+		return false;
+	return test_thread_flag(TIF_NEED_RESCHED_LAZY);
+#else
 	return unlikely(raw_cpu_read_4(__preempt_count) == preempt_offset);
+#endif
 }
 
 #ifdef CONFIG_PREEMPT
diff --git a/kernel/arch/x86/include/asm/signal.h b/kernel/arch/x86/include/asm/signal.h
index 33d3c88..c00e27a 100644
--- a/kernel/arch/x86/include/asm/signal.h
+++ b/kernel/arch/x86/include/asm/signal.h
@@ -28,6 +28,19 @@
 #define SA_IA32_ABI	0x02000000u
 #define SA_X32_ABI	0x01000000u
 
+/*
+ * Because some traps use the IST stack, we must keep preemption
+ * disabled while calling do_trap(), but do_trap() may call
+ * force_sig_info() which will grab the signal spin_locks for the
+ * task, which in PREEMPT_RT_FULL are mutexes.  By defining
+ * ARCH_RT_DELAYS_SIGNAL_SEND the force_sig_info() will set
+ * TIF_NOTIFY_RESUME and set up the signal to be sent on exit of the
+ * trap.
+ */
+#if defined(CONFIG_PREEMPT_RT_FULL)
+#define ARCH_RT_DELAYS_SIGNAL_SEND
+#endif
+
 #ifndef CONFIG_COMPAT
 typedef sigset_t compat_sigset_t;
 #endif
diff --git a/kernel/arch/x86/include/asm/stackprotector.h b/kernel/arch/x86/include/asm/stackprotector.h
index 9c556ea..b136992 100644
--- a/kernel/arch/x86/include/asm/stackprotector.h
+++ b/kernel/arch/x86/include/asm/stackprotector.h
@@ -65,7 +65,7 @@
  */
 static __always_inline void boot_init_stack_canary(void)
 {
-	u64 canary;
+	u64 uninitialized_var(canary);
 	u64 tsc;
 
 #ifdef CONFIG_X86_64
@@ -76,8 +76,14 @@
 	 * of randomness. The TSC only matters for very early init,
 	 * there it already has some randomness on most systems. Later
 	 * on during the bootup the random pool has true entropy too.
+	 * For preempt-rt we need to weaken the randomness a bit, as
+	 * we can't call into the random generator from atomic context
+	 * due to locking constraints. We just leave canary
+	 * uninitialized and use the TSC based randomness on top of it.
 	 */
+#ifndef CONFIG_PREEMPT_RT_FULL
 	get_random_bytes(&canary, sizeof(canary));
+#endif
 	tsc = rdtsc();
 	canary += tsc + (tsc << 32UL);
 	canary &= CANARY_MASK;
diff --git a/kernel/arch/x86/include/asm/thread_info.h b/kernel/arch/x86/include/asm/thread_info.h
index b5e4c35..d311dc0 100644
--- a/kernel/arch/x86/include/asm/thread_info.h
+++ b/kernel/arch/x86/include/asm/thread_info.h
@@ -56,16 +56,23 @@
 struct thread_info {
 	unsigned long		flags;		/* low level flags */
 	u32			status;		/* thread synchronous flags */
+	int			preempt_lazy_count;	/* 0 => lazy preemptable
+							  <0 => BUG */
 };
 
 #define INIT_THREAD_INFO(tsk)			\
 {						\
 	.flags		= 0,			\
+	.preempt_lazy_count = 0,		\
 }
 
 #else /* !__ASSEMBLY__ */
 
 #include <asm/asm-offsets.h>
+
+#define GET_THREAD_INFO(reg) \
+	_ASM_MOV PER_CPU_VAR(cpu_current_top_of_stack),reg ; \
+	_ASM_SUB $(THREAD_SIZE),reg ;
 
 #endif
 
@@ -91,6 +98,7 @@
 #define TIF_NOCPUID		15	/* CPUID is not accessible in userland */
 #define TIF_NOTSC		16	/* TSC is not accessible in userland */
 #define TIF_IA32		17	/* IA32 compatibility process */
+#define TIF_NEED_RESCHED_LAZY	18	/* lazy rescheduling necessary */
 #define TIF_NOHZ		19	/* in adaptive nohz mode */
 #define TIF_MEMDIE		20	/* is terminating due to OOM killer */
 #define TIF_POLLING_NRFLAG	21	/* idle is polling for TIF_NEED_RESCHED */
@@ -120,6 +128,7 @@
 #define _TIF_NOCPUID		(1 << TIF_NOCPUID)
 #define _TIF_NOTSC		(1 << TIF_NOTSC)
 #define _TIF_IA32		(1 << TIF_IA32)
+#define _TIF_NEED_RESCHED_LAZY	(1 << TIF_NEED_RESCHED_LAZY)
 #define _TIF_NOHZ		(1 << TIF_NOHZ)
 #define _TIF_POLLING_NRFLAG	(1 << TIF_POLLING_NRFLAG)
 #define _TIF_IO_BITMAP		(1 << TIF_IO_BITMAP)
@@ -165,6 +174,8 @@
 #define _TIF_WORK_CTXSW_PREV (_TIF_WORK_CTXSW|_TIF_USER_RETURN_NOTIFY)
 #define _TIF_WORK_CTXSW_NEXT (_TIF_WORK_CTXSW)
 
+#define _TIF_NEED_RESCHED_MASK	(_TIF_NEED_RESCHED | _TIF_NEED_RESCHED_LAZY)
+
 #define STACK_WARN		(THREAD_SIZE/8)
 
 /*
diff --git a/kernel/arch/x86/kernel/apic/io_apic.c b/kernel/arch/x86/kernel/apic/io_apic.c
index 677508b..b1a7f45 100644
--- a/kernel/arch/x86/kernel/apic/io_apic.c
+++ b/kernel/arch/x86/kernel/apic/io_apic.c
@@ -1732,7 +1732,7 @@
 	return false;
 }
 
-static inline bool ioapic_irqd_mask(struct irq_data *data)
+static inline bool ioapic_prepare_move(struct irq_data *data)
 {
 	/* If we are moving the IRQ we need to mask it */
 	if (unlikely(irqd_is_setaffinity_pending(data))) {
@@ -1743,9 +1743,9 @@
 	return false;
 }
 
-static inline void ioapic_irqd_unmask(struct irq_data *data, bool masked)
+static inline void ioapic_finish_move(struct irq_data *data, bool moveit)
 {
-	if (unlikely(masked)) {
+	if (unlikely(moveit)) {
 		/* Only migrate the irq if the ack has been received.
 		 *
 		 * On rare occasions the broadcast level triggered ack gets
@@ -1780,11 +1780,11 @@
 	}
 }
 #else
-static inline bool ioapic_irqd_mask(struct irq_data *data)
+static inline bool ioapic_prepare_move(struct irq_data *data)
 {
 	return false;
 }
-static inline void ioapic_irqd_unmask(struct irq_data *data, bool masked)
+static inline void ioapic_finish_move(struct irq_data *data, bool moveit)
 {
 }
 #endif
@@ -1793,11 +1793,11 @@
 {
 	struct irq_cfg *cfg = irqd_cfg(irq_data);
 	unsigned long v;
-	bool masked;
+	bool moveit;
 	int i;
 
 	irq_complete_move(cfg);
-	masked = ioapic_irqd_mask(irq_data);
+	moveit = ioapic_prepare_move(irq_data);
 
 	/*
 	 * It appears there is an erratum which affects at least version 0x11
@@ -1852,7 +1852,7 @@
 		eoi_ioapic_pin(cfg->vector, irq_data->chip_data);
 	}
 
-	ioapic_irqd_unmask(irq_data, masked);
+	ioapic_finish_move(irq_data, moveit);
 }
 
 static void ioapic_ir_ack_level(struct irq_data *irq_data)
diff --git a/kernel/arch/x86/kernel/asm-offsets.c b/kernel/arch/x86/kernel/asm-offsets.c
index 01de31d..ce1c5b9 100644
--- a/kernel/arch/x86/kernel/asm-offsets.c
+++ b/kernel/arch/x86/kernel/asm-offsets.c
@@ -38,6 +38,7 @@
 
 	BLANK();
 	OFFSET(TASK_TI_flags, task_struct, thread_info.flags);
+	OFFSET(TASK_TI_preempt_lazy_count, task_struct, thread_info.preempt_lazy_count);
 	OFFSET(TASK_addr_limit, task_struct, thread.addr_limit);
 
 	BLANK();
@@ -94,6 +95,7 @@
 
 	BLANK();
 	DEFINE(PTREGS_SIZE, sizeof(struct pt_regs));
+	DEFINE(_PREEMPT_ENABLED, PREEMPT_ENABLED);
 
 	/* TLB state for the entry code */
 	OFFSET(TLB_STATE_user_pcid_flush_mask, tlb_state, user_pcid_flush_mask);
diff --git a/kernel/arch/x86/kernel/cpu/intel_rdt_pseudo_lock.c b/kernel/arch/x86/kernel/cpu/intel_rdt_pseudo_lock.c
index a999a58..d6410d0 100644
--- a/kernel/arch/x86/kernel/cpu/intel_rdt_pseudo_lock.c
+++ b/kernel/arch/x86/kernel/cpu/intel_rdt_pseudo_lock.c
@@ -1445,7 +1445,7 @@
 	 * may be scheduled elsewhere and invalidate entries in the
 	 * pseudo-locked region.
 	 */
-	if (!cpumask_subset(&current->cpus_allowed, &plr->d->cpu_mask)) {
+	if (!cpumask_subset(current->cpus_ptr, &plr->d->cpu_mask)) {
 		mutex_unlock(&rdtgroup_mutex);
 		return -EINVAL;
 	}
diff --git a/kernel/arch/x86/kernel/fpu/core.c b/kernel/arch/x86/kernel/fpu/core.c
index 2e5003f..768c537 100644
--- a/kernel/arch/x86/kernel/fpu/core.c
+++ b/kernel/arch/x86/kernel/fpu/core.c
@@ -136,6 +136,18 @@
 }
 EXPORT_SYMBOL_GPL(kernel_fpu_end);
 
+void kernel_fpu_resched(void)
+{
+	WARN_ON_FPU(!this_cpu_read(in_kernel_fpu));
+
+	if (should_resched(PREEMPT_OFFSET)) {
+		kernel_fpu_end();
+		cond_resched();
+		kernel_fpu_begin();
+	}
+}
+EXPORT_SYMBOL_GPL(kernel_fpu_resched);
+
 /*
  * Save the FPU state (mark it for reload if necessary):
  *
diff --git a/kernel/arch/x86/kernel/fpu/signal.c b/kernel/arch/x86/kernel/fpu/signal.c
index 86a2313..e5c8d52 100644
--- a/kernel/arch/x86/kernel/fpu/signal.c
+++ b/kernel/arch/x86/kernel/fpu/signal.c
@@ -351,10 +351,12 @@
 			sanitize_restored_xstate(tsk, &env, xfeatures, fx_only);
 		}
 
+		preempt_disable();
 		local_bh_disable();
 		fpu->initialized = 1;
 		fpu__restore(fpu);
 		local_bh_enable();
+		preempt_enable();
 
 		/* Failure is already handled */
 		return err;
diff --git a/kernel/arch/x86/kernel/irq_32.c b/kernel/arch/x86/kernel/irq_32.c
index 95600a9..9192d76 100644
--- a/kernel/arch/x86/kernel/irq_32.c
+++ b/kernel/arch/x86/kernel/irq_32.c
@@ -130,6 +130,7 @@
 	       cpu, per_cpu(hardirq_stack, cpu),  per_cpu(softirq_stack, cpu));
 }
 
+#ifndef CONFIG_PREEMPT_RT_FULL
 void do_softirq_own_stack(void)
 {
 	struct irq_stack *irqstk;
@@ -146,6 +147,7 @@
 
 	call_on_stack(__do_softirq, isp);
 }
+#endif
 
 bool handle_irq(struct irq_desc *desc, struct pt_regs *regs)
 {
diff --git a/kernel/arch/x86/kernel/process_32.c b/kernel/arch/x86/kernel/process_32.c
index 020efe0..5d0c975 100644
--- a/kernel/arch/x86/kernel/process_32.c
+++ b/kernel/arch/x86/kernel/process_32.c
@@ -38,6 +38,7 @@
 #include <linux/io.h>
 #include <linux/kdebug.h>
 #include <linux/syscalls.h>
+#include <linux/highmem.h>
 
 #include <asm/pgtable.h>
 #include <asm/ldt.h>
@@ -205,6 +206,35 @@
 }
 EXPORT_SYMBOL_GPL(start_thread);
 
+#ifdef CONFIG_PREEMPT_RT_FULL
+static void switch_kmaps(struct task_struct *prev_p, struct task_struct *next_p)
+{
+	int i;
+
+	/*
+	 * Clear @prev's kmap_atomic mappings
+	 */
+	for (i = 0; i < prev_p->kmap_idx; i++) {
+		int idx = i + KM_TYPE_NR * smp_processor_id();
+		pte_t *ptep = kmap_pte - idx;
+
+		kpte_clear_flush(ptep, __fix_to_virt(FIX_KMAP_BEGIN + idx));
+	}
+	/*
+	 * Restore @next_p's kmap_atomic mappings
+	 */
+	for (i = 0; i < next_p->kmap_idx; i++) {
+		int idx = i + KM_TYPE_NR * smp_processor_id();
+
+		if (!pte_none(next_p->kmap_pte[i]))
+			set_pte(kmap_pte - idx, next_p->kmap_pte[i]);
+	}
+}
+#else
+static inline void
+switch_kmaps(struct task_struct *prev_p, struct task_struct *next_p) { }
+#endif
+
 
 /*
  *	switch_to(x,y) should switch tasks from x to y.
@@ -274,6 +304,8 @@
 
 	switch_to_extra(prev_p, next_p);
 
+	switch_kmaps(prev_p, next_p);
+
 	/*
 	 * Leave lazy mode, flushing any hypercalls made here.
 	 * This must be done before restoring TLS segments so
diff --git a/kernel/arch/x86/kvm/lapic.c b/kernel/arch/x86/kvm/lapic.c
index 56a4b97..556c4b6 100644
--- a/kernel/arch/x86/kvm/lapic.c
+++ b/kernel/arch/x86/kvm/lapic.c
@@ -2261,7 +2261,7 @@
 	apic->vcpu = vcpu;
 
 	hrtimer_init(&apic->lapic_timer.timer, CLOCK_MONOTONIC,
-		     HRTIMER_MODE_ABS_PINNED);
+		     HRTIMER_MODE_ABS_PINNED_HARD);
 	apic->lapic_timer.timer.function = apic_timer_fn;
 
 	/*
diff --git a/kernel/arch/x86/kvm/x86.c b/kernel/arch/x86/kvm/x86.c
index 417abc9..9829e0f 100644
--- a/kernel/arch/x86/kvm/x86.c
+++ b/kernel/arch/x86/kvm/x86.c
@@ -6875,6 +6875,13 @@
 		goto out;
 	}
 
+#ifdef CONFIG_PREEMPT_RT_FULL
+	if (!boot_cpu_has(X86_FEATURE_CONSTANT_TSC)) {
+		printk(KERN_ERR "RT requires X86_FEATURE_CONSTANT_TSC\n");
+		return -EOPNOTSUPP;
+	}
+#endif
+
 	r = kvm_mmu_module_init();
 	if (r)
 		goto out_free_percpu;
diff --git a/kernel/arch/x86/mm/highmem_32.c b/kernel/arch/x86/mm/highmem_32.c
index 6d18b70..f752724 100644
--- a/kernel/arch/x86/mm/highmem_32.c
+++ b/kernel/arch/x86/mm/highmem_32.c
@@ -32,10 +32,11 @@
  */
 void *kmap_atomic_prot(struct page *page, pgprot_t prot)
 {
+	pte_t pte = mk_pte(page, prot);
 	unsigned long vaddr;
 	int idx, type;
 
-	preempt_disable();
+	preempt_disable_nort();
 	pagefault_disable();
 
 	if (!PageHighMem(page))
@@ -45,7 +46,10 @@
 	idx = type + KM_TYPE_NR*smp_processor_id();
 	vaddr = __fix_to_virt(FIX_KMAP_BEGIN + idx);
 	BUG_ON(!pte_none(*(kmap_pte-idx)));
-	set_pte(kmap_pte-idx, mk_pte(page, prot));
+#ifdef CONFIG_PREEMPT_RT_FULL
+	current->kmap_pte[type] = pte;
+#endif
+	set_pte(kmap_pte-idx, pte);
 	arch_flush_lazy_mmu_mode();
 
 	return (void *)vaddr;
@@ -88,6 +92,9 @@
 		 * is a bad idea also, in case the page changes cacheability
 		 * attributes or becomes a protected page in a hypervisor.
 		 */
+#ifdef CONFIG_PREEMPT_RT_FULL
+		current->kmap_pte[type] = __pte(0);
+#endif
 		kpte_clear_flush(kmap_pte-idx, vaddr);
 		kmap_atomic_idx_pop();
 		arch_flush_lazy_mmu_mode();
@@ -100,7 +107,7 @@
 #endif
 
 	pagefault_enable();
-	preempt_enable();
+	preempt_enable_nort();
 }
 EXPORT_SYMBOL(__kunmap_atomic);
 
diff --git a/kernel/arch/x86/mm/iomap_32.c b/kernel/arch/x86/mm/iomap_32.c
index b3294d3..c0ec8d4 100644
--- a/kernel/arch/x86/mm/iomap_32.c
+++ b/kernel/arch/x86/mm/iomap_32.c
@@ -59,6 +59,7 @@
 
 void *kmap_atomic_prot_pfn(unsigned long pfn, pgprot_t prot)
 {
+	pte_t pte = pfn_pte(pfn, prot);
 	unsigned long vaddr;
 	int idx, type;
 
@@ -68,7 +69,12 @@
 	type = kmap_atomic_idx_push();
 	idx = type + KM_TYPE_NR * smp_processor_id();
 	vaddr = __fix_to_virt(FIX_KMAP_BEGIN + idx);
-	set_pte(kmap_pte - idx, pfn_pte(pfn, prot));
+	WARN_ON(!pte_none(*(kmap_pte - idx)));
+
+#ifdef CONFIG_PREEMPT_RT_FULL
+	current->kmap_pte[type] = pte;
+#endif
+	set_pte(kmap_pte - idx, pte);
 	arch_flush_lazy_mmu_mode();
 
 	return (void *)vaddr;
@@ -119,6 +125,9 @@
 		 * is a bad idea also, in case the page changes cacheability
 		 * attributes or becomes a protected page in a hypervisor.
 		 */
+#ifdef CONFIG_PREEMPT_RT_FULL
+		current->kmap_pte[type] = __pte(0);
+#endif
 		kpte_clear_flush(kmap_pte-idx, vaddr);
 		kmap_atomic_idx_pop();
 	}
diff --git a/kernel/arch/x86/mm/pageattr.c b/kernel/arch/x86/mm/pageattr.c
index 101f3ad..0b03962 100644
--- a/kernel/arch/x86/mm/pageattr.c
+++ b/kernel/arch/x86/mm/pageattr.c
@@ -688,11 +688,17 @@
 
 	spin_lock(&pgd_lock);
 	/*
+	 * Keep preemption disabled after __flush_tlb_all() which expects not be
+	 * preempted during the flush of the local TLB.
+	 */
+	preempt_disable();
+	/*
 	 * Check for races, another CPU might have split this page
 	 * up for us already:
 	 */
 	tmp = _lookup_address_cpa(cpa, address, &level);
 	if (tmp != kpte) {
+		preempt_enable();
 		spin_unlock(&pgd_lock);
 		return 1;
 	}
@@ -726,6 +732,7 @@
 		break;
 
 	default:
+		preempt_enable();
 		spin_unlock(&pgd_lock);
 		return 1;
 	}
@@ -764,6 +771,7 @@
 	 * going on.
 	 */
 	__flush_tlb_all();
+	preempt_enable();
 	spin_unlock(&pgd_lock);
 
 	return 0;
diff --git a/kernel/arch/x86/platform/efi/efi_64.c b/kernel/arch/x86/platform/efi/efi_64.c
index 77d05b5..cd7e4bf 100644
--- a/kernel/arch/x86/platform/efi/efi_64.c
+++ b/kernel/arch/x86/platform/efi/efi_64.c
@@ -619,18 +619,16 @@
 
 /*
  * Makes the calling thread switch to/from efi_mm context. Can be used
- * for SetVirtualAddressMap() i.e. current->active_mm == init_mm as well
- * as during efi runtime calls i.e current->active_mm == current_mm.
- * We are not mm_dropping()/mm_grabbing() any mm, because we are not
- * losing/creating any references.
+ * in a kernel thread and user context. Preemption needs to remain disabled
+ * while the EFI-mm is borrowed. mmgrab()/mmdrop() is not used because the mm
+ * can not change under us.
+ * It should be ensured that there are no concurent calls to this function.
  */
 void efi_switch_mm(struct mm_struct *mm)
 {
-	task_lock(current);
 	efi_scratch.prev_mm = current->active_mm;
 	current->active_mm = mm;
 	switch_mm(efi_scratch.prev_mm, mm, NULL);
-	task_unlock(current);
 }
 
 #ifdef CONFIG_EFI_MIXED
diff --git a/kernel/arch/xtensa/include/asm/spinlock_types.h b/kernel/arch/xtensa/include/asm/spinlock_types.h
index bb1fe6c..8a22f1e 100644
--- a/kernel/arch/xtensa/include/asm/spinlock_types.h
+++ b/kernel/arch/xtensa/include/asm/spinlock_types.h
@@ -2,10 +2,6 @@
 #ifndef __ASM_SPINLOCK_TYPES_H
 #define __ASM_SPINLOCK_TYPES_H
 
-#ifndef __LINUX_SPINLOCK_TYPES_H
-# error "please don't include this file directly"
-#endif
-
 typedef struct {
 	volatile unsigned int slock;
 } arch_spinlock_t;
diff --git a/kernel/block/blk-core.c b/kernel/block/blk-core.c
index a33775c..0c0eeb3 100644
--- a/kernel/block/blk-core.c
+++ b/kernel/block/blk-core.c
@@ -191,6 +191,9 @@
 
 	INIT_LIST_HEAD(&rq->queuelist);
 	INIT_LIST_HEAD(&rq->timeout_list);
+#ifdef CONFIG_PREEMPT_RT_FULL
+	INIT_WORK(&rq->work, __blk_mq_complete_request_remote_work);
+#endif
 	rq->cpu = -1;
 	rq->q = q;
 	rq->__sector = (sector_t) -1;
@@ -972,12 +975,21 @@
 	percpu_ref_put(&q->q_usage_counter);
 }
 
+static void blk_queue_usage_counter_release_wrk(struct work_struct *work)
+{
+	struct request_queue *q =
+		container_of(work, struct request_queue, mq_pcpu_wake);
+
+	wake_up_all(&q->mq_freeze_wq);
+}
+
 static void blk_queue_usage_counter_release(struct percpu_ref *ref)
 {
 	struct request_queue *q =
 		container_of(ref, struct request_queue, q_usage_counter);
 
-	wake_up_all(&q->mq_freeze_wq);
+	if (wq_has_sleeper(&q->mq_freeze_wq))
+		schedule_work(&q->mq_pcpu_wake);
 }
 
 static void blk_rq_timed_out_timer(struct timer_list *t)
@@ -1076,6 +1088,7 @@
 	queue_flag_set_unlocked(QUEUE_FLAG_BYPASS, q);
 
 	init_waitqueue_head(&q->mq_freeze_wq);
+	INIT_WORK(&q->mq_pcpu_wake, blk_queue_usage_counter_release_wrk);
 
 	/*
 	 * Init percpu_ref in atomic mode so that it's faster to shutdown.
diff --git a/kernel/block/blk-ioc.c b/kernel/block/blk-ioc.c
index 4c81096..48089f5 100644
--- a/kernel/block/blk-ioc.c
+++ b/kernel/block/blk-ioc.c
@@ -9,6 +9,7 @@
 #include <linux/blkdev.h>
 #include <linux/slab.h>
 #include <linux/sched/task.h>
+#include <linux/delay.h>
 
 #include "blk.h"
 
@@ -119,7 +120,7 @@
 			spin_unlock(q->queue_lock);
 		} else {
 			spin_unlock_irqrestore(&ioc->lock, flags);
-			cpu_relax();
+			cpu_chill();
 			spin_lock_irqsave_nested(&ioc->lock, flags, 1);
 		}
 	}
@@ -203,7 +204,7 @@
 				spin_unlock(icq->q->queue_lock);
 			} else {
 				spin_unlock_irqrestore(&ioc->lock, flags);
-				cpu_relax();
+				cpu_chill();
 				goto retry;
 			}
 		}
diff --git a/kernel/block/blk-mq.c b/kernel/block/blk-mq.c
index ae70b48..0f8dcb6 100644
--- a/kernel/block/blk-mq.c
+++ b/kernel/block/blk-mq.c
@@ -320,6 +320,9 @@
 	rq->extra_len = 0;
 	rq->__deadline = 0;
 
+#ifdef CONFIG_PREEMPT_RT_FULL
+	INIT_WORK(&rq->work, __blk_mq_complete_request_remote_work);
+#endif
 	INIT_LIST_HEAD(&rq->timeout_list);
 	rq->timeout = 0;
 
@@ -547,12 +550,24 @@
 }
 EXPORT_SYMBOL(blk_mq_end_request);
 
+#ifdef CONFIG_PREEMPT_RT_FULL
+
+void __blk_mq_complete_request_remote_work(struct work_struct *work)
+{
+	struct request *rq = container_of(work, struct request, work);
+
+	rq->q->softirq_done_fn(rq);
+}
+
+#else
+
 static void __blk_mq_complete_request_remote(void *data)
 {
 	struct request *rq = data;
 
 	rq->q->softirq_done_fn(rq);
 }
+#endif
 
 static void __blk_mq_complete_request(struct request *rq)
 {
@@ -570,19 +585,27 @@
 		return;
 	}
 
-	cpu = get_cpu();
+	cpu = get_cpu_light();
 	if (!test_bit(QUEUE_FLAG_SAME_FORCE, &rq->q->queue_flags))
 		shared = cpus_share_cache(cpu, ctx->cpu);
 
 	if (cpu != ctx->cpu && !shared && cpu_online(ctx->cpu)) {
+#ifdef CONFIG_PREEMPT_RT_FULL
+		/*
+		 * We could force QUEUE_FLAG_SAME_FORCE then we would not get in
+		 * here. But we could try to invoke it one the CPU like this.
+		 */
+		schedule_work_on(ctx->cpu, &rq->work);
+#else
 		rq->csd.func = __blk_mq_complete_request_remote;
 		rq->csd.info = rq;
 		rq->csd.flags = 0;
 		smp_call_function_single_async(ctx->cpu, &rq->csd);
+#endif
 	} else {
 		rq->q->softirq_done_fn(rq);
 	}
-	put_cpu();
+	put_cpu_light();
 }
 
 static void hctx_unlock(struct blk_mq_hw_ctx *hctx, int srcu_idx)
@@ -1387,14 +1410,14 @@
 		return;
 
 	if (!async && !(hctx->flags & BLK_MQ_F_BLOCKING)) {
-		int cpu = get_cpu();
+		int cpu = get_cpu_light();
 		if (cpumask_test_cpu(cpu, hctx->cpumask)) {
 			__blk_mq_run_hw_queue(hctx);
-			put_cpu();
+			put_cpu_light();
 			return;
 		}
 
-		put_cpu();
+		put_cpu_light();
 	}
 
 	kblockd_mod_delayed_work_on(blk_mq_hctx_next_cpu(hctx), &hctx->run_work,
@@ -3139,10 +3162,9 @@
 	kt = nsecs;
 
 	mode = HRTIMER_MODE_REL;
-	hrtimer_init_on_stack(&hs.timer, CLOCK_MONOTONIC, mode);
+	hrtimer_init_sleeper_on_stack(&hs, CLOCK_MONOTONIC, mode, current);
 	hrtimer_set_expires(&hs.timer, kt);
 
-	hrtimer_init_sleeper(&hs, current);
 	do {
 		if (blk_mq_rq_state(rq) == MQ_RQ_COMPLETE)
 			break;
diff --git a/kernel/block/blk-mq.h b/kernel/block/blk-mq.h
index 5ad9251..5a96c97 100644
--- a/kernel/block/blk-mq.h
+++ b/kernel/block/blk-mq.h
@@ -113,12 +113,12 @@
  */
 static inline struct blk_mq_ctx *blk_mq_get_ctx(struct request_queue *q)
 {
-	return __blk_mq_get_ctx(q, get_cpu());
+	return __blk_mq_get_ctx(q, get_cpu_light());
 }
 
 static inline void blk_mq_put_ctx(struct blk_mq_ctx *ctx)
 {
-	put_cpu();
+	put_cpu_light();
 }
 
 struct blk_mq_alloc_data {
diff --git a/kernel/block/blk-softirq.c b/kernel/block/blk-softirq.c
index 15c1f5e..1628277 100644
--- a/kernel/block/blk-softirq.c
+++ b/kernel/block/blk-softirq.c
@@ -53,6 +53,7 @@
 		raise_softirq_irqoff(BLOCK_SOFTIRQ);
 
 	local_irq_restore(flags);
+	preempt_check_resched_rt();
 }
 
 /*
@@ -91,6 +92,7 @@
 			 this_cpu_ptr(&blk_cpu_done));
 	raise_softirq_irqoff(BLOCK_SOFTIRQ);
 	local_irq_enable();
+	preempt_check_resched_rt();
 
 	return 0;
 }
@@ -143,6 +145,7 @@
 		goto do_local;
 
 	local_irq_restore(flags);
+	preempt_check_resched_rt();
 }
 EXPORT_SYMBOL(__blk_complete_request);
 
diff --git a/kernel/crypto/cryptd.c b/kernel/crypto/cryptd.c
index e0c8e90..e079f9a 100644
--- a/kernel/crypto/cryptd.c
+++ b/kernel/crypto/cryptd.c
@@ -39,6 +39,7 @@
 struct cryptd_cpu_queue {
 	struct crypto_queue queue;
 	struct work_struct work;
+	spinlock_t qlock;
 };
 
 struct cryptd_queue {
@@ -117,6 +118,7 @@
 		cpu_queue = per_cpu_ptr(queue->cpu_queue, cpu);
 		crypto_init_queue(&cpu_queue->queue, max_cpu_qlen);
 		INIT_WORK(&cpu_queue->work, cryptd_queue_worker);
+		spin_lock_init(&cpu_queue->qlock);
 	}
 	pr_info("cryptd: max_cpu_qlen set to %d\n", max_cpu_qlen);
 	return 0;
@@ -141,8 +143,10 @@
 	struct cryptd_cpu_queue *cpu_queue;
 	atomic_t *refcnt;
 
-	cpu = get_cpu();
-	cpu_queue = this_cpu_ptr(queue->cpu_queue);
+	cpu_queue = raw_cpu_ptr(queue->cpu_queue);
+	spin_lock_bh(&cpu_queue->qlock);
+	cpu = smp_processor_id();
+
 	err = crypto_enqueue_request(&cpu_queue->queue, request);
 
 	refcnt = crypto_tfm_ctx(request->tfm);
@@ -158,7 +162,7 @@
 	atomic_inc(refcnt);
 
 out_put_cpu:
-	put_cpu();
+	spin_unlock_bh(&cpu_queue->qlock);
 
 	return err;
 }
@@ -174,16 +178,11 @@
 	cpu_queue = container_of(work, struct cryptd_cpu_queue, work);
 	/*
 	 * Only handle one request at a time to avoid hogging crypto workqueue.
-	 * preempt_disable/enable is used to prevent being preempted by
-	 * cryptd_enqueue_request(). local_bh_disable/enable is used to prevent
-	 * cryptd_enqueue_request() being accessed from software interrupts.
 	 */
-	local_bh_disable();
-	preempt_disable();
+	spin_lock_bh(&cpu_queue->qlock);
 	backlog = crypto_get_backlog(&cpu_queue->queue);
 	req = crypto_dequeue_request(&cpu_queue->queue);
-	preempt_enable();
-	local_bh_enable();
+	spin_unlock_bh(&cpu_queue->qlock);
 
 	if (!req)
 		return;
diff --git a/kernel/crypto/scompress.c b/kernel/crypto/scompress.c
index 968bbcf..c2f0077 100644
--- a/kernel/crypto/scompress.c
+++ b/kernel/crypto/scompress.c
@@ -24,6 +24,7 @@
 #include <linux/cryptouser.h>
 #include <net/netlink.h>
 #include <linux/scatterlist.h>
+#include <linux/locallock.h>
 #include <crypto/scatterwalk.h>
 #include <crypto/internal/acompress.h>
 #include <crypto/internal/scompress.h>
@@ -34,6 +35,7 @@
 static void * __percpu *scomp_dst_scratches;
 static int scomp_scratch_users;
 static DEFINE_MUTEX(scomp_lock);
+static DEFINE_LOCAL_IRQ_LOCK(scomp_scratches_lock);
 
 #ifdef CONFIG_NET
 static int crypto_scomp_report(struct sk_buff *skb, struct crypto_alg *alg)
@@ -146,7 +148,7 @@
 	void **tfm_ctx = acomp_tfm_ctx(tfm);
 	struct crypto_scomp *scomp = *tfm_ctx;
 	void **ctx = acomp_request_ctx(req);
-	const int cpu = get_cpu();
+	const int cpu = local_lock_cpu(scomp_scratches_lock);
 	u8 *scratch_src = *per_cpu_ptr(scomp_src_scratches, cpu);
 	u8 *scratch_dst = *per_cpu_ptr(scomp_dst_scratches, cpu);
 	int ret;
@@ -181,7 +183,7 @@
 					 1);
 	}
 out:
-	put_cpu();
+	local_unlock_cpu(scomp_scratches_lock);
 	return ret;
 }
 
diff --git a/kernel/drivers/block/zram/zcomp.c b/kernel/drivers/block/zram/zcomp.c
index 4ed0a78..eece022 100644
--- a/kernel/drivers/block/zram/zcomp.c
+++ b/kernel/drivers/block/zram/zcomp.c
@@ -116,12 +116,20 @@
 
 struct zcomp_strm *zcomp_stream_get(struct zcomp *comp)
 {
-	return *get_cpu_ptr(comp->stream);
+	struct zcomp_strm *zstrm;
+
+	zstrm = *get_local_ptr(comp->stream);
+	spin_lock(&zstrm->zcomp_lock);
+	return zstrm;
 }
 
 void zcomp_stream_put(struct zcomp *comp)
 {
-	put_cpu_ptr(comp->stream);
+	struct zcomp_strm *zstrm;
+
+	zstrm = *this_cpu_ptr(comp->stream);
+	spin_unlock(&zstrm->zcomp_lock);
+	put_local_ptr(zstrm);
 }
 
 int zcomp_compress(struct zcomp_strm *zstrm,
@@ -171,6 +179,7 @@
 		pr_err("Can't allocate a compression stream\n");
 		return -ENOMEM;
 	}
+	spin_lock_init(&zstrm->zcomp_lock);
 	*per_cpu_ptr(comp->stream, cpu) = zstrm;
 	return 0;
 }
diff --git a/kernel/drivers/block/zram/zcomp.h b/kernel/drivers/block/zram/zcomp.h
index 41c1002..d424eaf 100644
--- a/kernel/drivers/block/zram/zcomp.h
+++ b/kernel/drivers/block/zram/zcomp.h
@@ -14,6 +14,7 @@
 	/* compression/decompression buffer */
 	void *buffer;
 	struct crypto_comp *tfm;
+	spinlock_t zcomp_lock;
 };
 
 /* dynamic per-device compression frontend */
diff --git a/kernel/drivers/block/zram/zram_drv.c b/kernel/drivers/block/zram/zram_drv.c
index 70fe119..6d17aee 100644
--- a/kernel/drivers/block/zram/zram_drv.c
+++ b/kernel/drivers/block/zram/zram_drv.c
@@ -56,6 +56,40 @@
 				u32 index, int offset, struct bio *bio);
 
 
+#ifdef CONFIG_PREEMPT_RT_BASE
+static void zram_meta_init_table_locks(struct zram *zram, size_t num_pages)
+{
+	size_t index;
+
+	for (index = 0; index < num_pages; index++)
+		spin_lock_init(&zram->table[index].lock);
+}
+
+static int zram_slot_trylock(struct zram *zram, u32 index)
+{
+	int ret;
+
+	ret = spin_trylock(&zram->table[index].lock);
+	if (ret)
+		__set_bit(ZRAM_LOCK, &zram->table[index].value);
+	return ret;
+}
+
+static void zram_slot_lock(struct zram *zram, u32 index)
+{
+	spin_lock(&zram->table[index].lock);
+	__set_bit(ZRAM_LOCK, &zram->table[index].value);
+}
+
+static void zram_slot_unlock(struct zram *zram, u32 index)
+{
+	__clear_bit(ZRAM_LOCK, &zram->table[index].value);
+	spin_unlock(&zram->table[index].lock);
+}
+
+#else
+static void zram_meta_init_table_locks(struct zram *zram, size_t num_pages) { }
+
 static int zram_slot_trylock(struct zram *zram, u32 index)
 {
 	return bit_spin_trylock(ZRAM_LOCK, &zram->table[index].flags);
@@ -70,6 +104,7 @@
 {
 	bit_spin_unlock(ZRAM_LOCK, &zram->table[index].flags);
 }
+#endif
 
 static inline bool init_done(struct zram *zram)
 {
@@ -1145,6 +1180,8 @@
 #endif
 static DEVICE_ATTR_RO(debug_stat);
 
+
+
 static void zram_meta_free(struct zram *zram, u64 disksize)
 {
 	size_t num_pages = disksize >> PAGE_SHIFT;
@@ -1175,6 +1212,7 @@
 
 	if (!huge_class_size)
 		huge_class_size = zs_huge_class_size(zram->mem_pool);
+	zram_meta_init_table_locks(zram, num_pages);
 	return true;
 }
 
@@ -1237,6 +1275,7 @@
 	unsigned long handle;
 	unsigned int size;
 	void *src, *dst;
+	struct zcomp_strm *zstrm;
 
 	zram_slot_lock(zram, index);
 	if (zram_test_flag(zram, index, ZRAM_WB)) {
@@ -1267,6 +1306,7 @@
 
 	size = zram_get_obj_size(zram, index);
 
+	zstrm = zcomp_stream_get(zram->comp);
 	src = zs_map_object(zram->mem_pool, handle, ZS_MM_RO);
 	if (size == PAGE_SIZE) {
 		dst = kmap_atomic(page);
@@ -1274,14 +1314,13 @@
 		kunmap_atomic(dst);
 		ret = 0;
 	} else {
-		struct zcomp_strm *zstrm = zcomp_stream_get(zram->comp);
 
 		dst = kmap_atomic(page);
 		ret = zcomp_decompress(zstrm, src, size, dst);
 		kunmap_atomic(dst);
-		zcomp_stream_put(zram->comp);
 	}
 	zs_unmap_object(zram->mem_pool, handle);
+	zcomp_stream_put(zram->comp);
 	zram_slot_unlock(zram, index);
 
 	/* Should NEVER happen. Return bio error if it does. */
diff --git a/kernel/drivers/block/zram/zram_drv.h b/kernel/drivers/block/zram/zram_drv.h
index f2fd46d..be1fd12 100644
--- a/kernel/drivers/block/zram/zram_drv.h
+++ b/kernel/drivers/block/zram/zram_drv.h
@@ -63,6 +63,9 @@
 		unsigned long element;
 	};
 	unsigned long flags;
+#ifdef CONFIG_PREEMPT_RT_BASE
+	spinlock_t lock;
+#endif
 #ifdef CONFIG_ZRAM_MEMORY_TRACKING
 	ktime_t ac_time;
 #endif
diff --git a/kernel/drivers/char/hw_random/rockchip-rng.c b/kernel/drivers/char/hw_random/rockchip-rng.c
index 08ad081..93c7068 100644
--- a/kernel/drivers/char/hw_random/rockchip-rng.c
+++ b/kernel/drivers/char/hw_random/rockchip-rng.c
@@ -87,6 +87,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 */
+
 struct rk_rng_soc_data {
 	u32 default_offset;
 
@@ -178,7 +199,7 @@
 		*(u32 *)(buf + i) = be32_to_cpu(rk_rng_readl(rng, offset + i));
 }
 
-static int rk_crypto_v1_read(struct hwrng *rng, void *buf, size_t max, bool wait)
+static int crypto_v1_read(struct hwrng *rng, void *buf, size_t max, bool wait)
 {
 	int ret = 0;
 	u32 reg_ctrl = 0;
@@ -211,7 +232,7 @@
 	return ret;
 }
 
-static int rk_crypto_v2_read(struct hwrng *rng, void *buf, size_t max, bool wait)
+static int crypto_v2_read(struct hwrng *rng, void *buf, size_t max, bool wait)
 {
 	int ret = 0;
 	u32 reg_ctrl = 0;
@@ -246,18 +267,12 @@
 	return ret;
 }
 
-static int rk_trng_v1_init(struct hwrng *rng)
+static int trng_v1_init(struct hwrng *rng)
 {
 	int ret;
 	uint32_t auto_reseed_cnt = 1000;
 	uint32_t reg_ctrl, status, version;
 	struct rk_rng *rk_rng = container_of(rng, struct rk_rng, rng);
-
-	ret = pm_runtime_get_sync(rk_rng->dev);
-	if (ret < 0) {
-		pm_runtime_put_noidle(rk_rng->dev);
-		return ret;
-	}
 
 	version = rk_rng_readl(rk_rng, TRNG_V1_VERSION);
 	if (version != TRNG_v1_VERSION_CODE) {
@@ -296,13 +311,11 @@
 
 	ret = 0;
 exit:
-	pm_runtime_mark_last_busy(rk_rng->dev);
-	pm_runtime_put_sync_autosuspend(rk_rng->dev);
 
 	return ret;
 }
 
-static int rk_trng_v1_read(struct hwrng *rng, void *buf, size_t max, bool wait)
+static int trng_v1_read(struct hwrng *rng, void *buf, size_t max, bool wait)
 {
 	int ret = 0;
 	u32 reg_ctrl = 0;
@@ -345,37 +358,92 @@
 	return ret;
 }
 
-static const struct rk_rng_soc_data rk_crypto_v1_soc_data = {
+static int rkrng_init(struct hwrng *rng)
+{
+	struct rk_rng *rk_rng = container_of(rng, struct rk_rng, rng);
+	u32 reg = 0;
+
+	rk_rng_writel(rk_rng, HIWORD_UPDATE(0, 0xffff, 0), RKRNG_CTRL);
+
+	reg = rk_rng_readl(rk_rng, RKRNG_STATE);
+	rk_rng_writel(rk_rng, reg, RKRNG_STATE);
+
+	return 0;
+}
+
+static int rkrng_read(struct hwrng *rng, void *buf, size_t max, bool wait)
+{
+	struct rk_rng *rk_rng = container_of(rng, struct rk_rng, rng);
+	u32 reg_ctrl = 0;
+	int ret;
+
+	reg_ctrl = RKRNG_CTRL_SW_DRNG_REQ;
+
+	rk_rng_writel(rk_rng, HIWORD_UPDATE(reg_ctrl, 0xffff, 0), RKRNG_CTRL);
+
+	ret = readl_poll_timeout(rk_rng->mem + RKRNG_STATE, reg_ctrl,
+				 (reg_ctrl & RKRNG_STATE_SW_DRNG_ACK),
+				 ROCKCHIP_POLL_PERIOD_US,
+				 ROCKCHIP_POLL_TIMEOUT_US);
+
+	if (ret)
+		goto exit;
+
+	rk_rng_writel(rk_rng, reg_ctrl, RKRNG_STATE);
+
+	ret = min_t(size_t, max, RK_MAX_RNG_BYTE);
+
+	rk_rng_read_regs(rk_rng, RKRNG_DRNG_DATA_0, buf, ret);
+
+exit:
+	/* close TRNG */
+	rk_rng_writel(rk_rng, HIWORD_UPDATE(0, 0xffff, 0), RKRNG_CTRL);
+
+	return ret;
+}
+
+static const struct rk_rng_soc_data crypto_v1_soc_data = {
 	.default_offset = 0,
 
-	.rk_rng_read = rk_crypto_v1_read,
+	.rk_rng_read = crypto_v1_read,
 };
 
-static const struct rk_rng_soc_data rk_crypto_v2_soc_data = {
+static const struct rk_rng_soc_data crypto_v2_soc_data = {
 	.default_offset = CRYPTO_V2_RNG_DEFAULT_OFFSET,
 
-	.rk_rng_read = rk_crypto_v2_read,
+	.rk_rng_read = crypto_v2_read,
 };
 
-static const struct rk_rng_soc_data rk_trng_v1_soc_data = {
+static const struct rk_rng_soc_data trng_v1_soc_data = {
 	.default_offset = 0,
 
-	.rk_rng_init = rk_trng_v1_init,
-	.rk_rng_read = rk_trng_v1_read,
+	.rk_rng_init = trng_v1_init,
+	.rk_rng_read = trng_v1_read,
+};
+
+static const struct rk_rng_soc_data rkrng_soc_data = {
+	.default_offset = 0,
+
+	.rk_rng_init = rkrng_init,
+	.rk_rng_read = rkrng_read,
 };
 
 static const struct of_device_id rk_rng_dt_match[] = {
 	{
 		.compatible = "rockchip,cryptov1-rng",
-		.data = (void *)&rk_crypto_v1_soc_data,
+		.data = (void *)&crypto_v1_soc_data,
 	},
 	{
 		.compatible = "rockchip,cryptov2-rng",
-		.data = (void *)&rk_crypto_v2_soc_data,
+		.data = (void *)&crypto_v2_soc_data,
 	},
 	{
 		.compatible = "rockchip,trngv1",
-		.data = (void *)&rk_trng_v1_soc_data,
+		.data = (void *)&trng_v1_soc_data,
+	},
+		{
+		.compatible = "rockchip,rkrng",
+		.data = (void *)&rkrng_soc_data,
 	},
 	{ },
 };
@@ -445,9 +513,15 @@
 	}
 
 	/* for some platform need hardware operation when probe */
-	if (rk_rng->soc_data->rk_rng_init)
+	if (rk_rng->soc_data->rk_rng_init) {
+		pm_runtime_get_sync(rk_rng->dev);
+
 		ret = rk_rng->soc_data->rk_rng_init(&rk_rng->rng);
 
+		pm_runtime_mark_last_busy(rk_rng->dev);
+		pm_runtime_put_sync_autosuspend(rk_rng->dev);
+	}
+
 	return ret;
 }
 
diff --git a/kernel/drivers/char/random.c b/kernel/drivers/char/random.c
index 6e1cbc5..8aaa816 100644
--- a/kernel/drivers/char/random.c
+++ b/kernel/drivers/char/random.c
@@ -1229,28 +1229,27 @@
 	return *ptr;
 }
 
-void add_interrupt_randomness(int irq, int irq_flags)
+void add_interrupt_randomness(int irq, int irq_flags, __u64 ip)
 {
 	struct entropy_store	*r;
 	struct fast_pool	*fast_pool = this_cpu_ptr(&irq_randomness);
-	struct pt_regs		*regs = get_irq_regs();
 	unsigned long		now = jiffies;
 	cycles_t		cycles = random_get_entropy();
 	__u32			c_high, j_high;
-	__u64			ip;
 	unsigned long		seed;
 	int			credit = 0;
 
 	if (cycles == 0)
-		cycles = get_reg(fast_pool, regs);
+		cycles = get_reg(fast_pool, NULL);
 	c_high = (sizeof(cycles) > 4) ? cycles >> 32 : 0;
 	j_high = (sizeof(now) > 4) ? now >> 32 : 0;
 	fast_pool->pool[0] ^= cycles ^ j_high ^ irq;
 	fast_pool->pool[1] ^= now ^ c_high;
-	ip = regs ? instruction_pointer(regs) : _RET_IP_;
+	if (!ip)
+		ip = _RET_IP_;
 	fast_pool->pool[2] ^= ip;
 	fast_pool->pool[3] ^= (sizeof(ip) > 4) ? ip >> 32 :
-		get_reg(fast_pool, regs);
+		get_reg(fast_pool, NULL);
 
 	fast_mix(fast_pool);
 	add_interrupt_bench(cycles);
diff --git a/kernel/drivers/char/tpm/tpm_tis.c b/kernel/drivers/char/tpm/tpm_tis.c
index 5a3a4f0..5ecca65 100644
--- a/kernel/drivers/char/tpm/tpm_tis.c
+++ b/kernel/drivers/char/tpm/tpm_tis.c
@@ -54,6 +54,31 @@
 	return container_of(data, struct tpm_tis_tcg_phy, priv);
 }
 
+#ifdef CONFIG_PREEMPT_RT_FULL
+/*
+ * Flushes previous write operations to chip so that a subsequent
+ * ioread*()s won't stall a cpu.
+ */
+static inline void tpm_tis_flush(void __iomem *iobase)
+{
+	ioread8(iobase + TPM_ACCESS(0));
+}
+#else
+#define tpm_tis_flush(iobase) do { } while (0)
+#endif
+
+static inline void tpm_tis_iowrite8(u8 b, void __iomem *iobase, u32 addr)
+{
+	iowrite8(b, iobase + addr);
+	tpm_tis_flush(iobase);
+}
+
+static inline void tpm_tis_iowrite32(u32 b, void __iomem *iobase, u32 addr)
+{
+	iowrite32(b, iobase + addr);
+	tpm_tis_flush(iobase);
+}
+
 static int interrupts = -1;
 module_param(interrupts, int, 0444);
 MODULE_PARM_DESC(interrupts, "Enable interrupts");
@@ -173,7 +198,7 @@
 	struct tpm_tis_tcg_phy *phy = to_tpm_tis_tcg_phy(data);
 
 	while (len--)
-		iowrite8(*value++, phy->iobase + addr);
+		tpm_tis_iowrite8(*value++, phy->iobase, addr);
 
 	return 0;
 }
@@ -200,7 +225,7 @@
 {
 	struct tpm_tis_tcg_phy *phy = to_tpm_tis_tcg_phy(data);
 
-	iowrite32(value, phy->iobase + addr);
+	tpm_tis_iowrite32(value, phy->iobase, addr);
 
 	return 0;
 }
diff --git a/kernel/drivers/clk/rockchip/Kconfig b/kernel/drivers/clk/rockchip/Kconfig
index ad828ef..cacc74e 100644
--- a/kernel/drivers/clk/rockchip/Kconfig
+++ b/kernel/drivers/clk/rockchip/Kconfig
@@ -26,6 +26,12 @@
 	help
 	  Say y here to enable clk Inverter.
 
+config ROCKCHIP_CLK_OUT
+	tristate "Rockchip Clk Out / Input Switch"
+	default y if !CPU_RV1126
+	help
+	  Say y here to enable clk out / input switch.
+
 config ROCKCHIP_CLK_PVTM
 	bool "Rockchip Clk Pvtm"
 	default y if !CPU_RV1126
diff --git a/kernel/drivers/clk/rockchip/Makefile b/kernel/drivers/clk/rockchip/Makefile
index 92a8de5..3737b80 100644
--- a/kernel/drivers/clk/rockchip/Makefile
+++ b/kernel/drivers/clk/rockchip/Makefile
@@ -27,7 +27,10 @@
 obj-$(CONFIG_CPU_RK3308)	+= clk-rk3308.o
 obj-$(CONFIG_CPU_RK3328)	+= clk-rk3328.o
 obj-$(CONFIG_CPU_RK3368)	+= clk-rk3368.o
+obj-$(CONFIG_CPU_RK3528)	+= clk-rk3528.o
 obj-$(CONFIG_CPU_RK3568)	+= clk-rk3568.o
 obj-$(CONFIG_CPU_RK3399)	+= clk-rk3399.o
 
 obj-$(CONFIG_COMMON_CLK_ROCKCHIP_REGMAP)	+= regmap/
+
+obj-$(CONFIG_ROCKCHIP_CLK_OUT)  += clk-out.o
diff --git a/kernel/drivers/clk/rockchip/clk-out.c b/kernel/drivers/clk/rockchip/clk-out.c
new file mode 100644
index 0000000..22dcd98
--- /dev/null
+++ b/kernel/drivers/clk/rockchip/clk-out.c
@@ -0,0 +1,99 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * Copyright (c) 2023 Rockchip Electronics Co., Ltd
+ */
+
+#include <linux/clk-provider.h>
+#include <linux/io.h>
+#include <linux/module.h>
+#include <linux/of_address.h>
+#include <linux/platform_device.h>
+#include <linux/pm_runtime.h>
+
+static DEFINE_SPINLOCK(clk_out_lock);
+
+static int rockchip_clk_out_probe(struct platform_device *pdev)
+{
+	struct device *dev = &pdev->dev;
+	struct device_node *node = pdev->dev.of_node;
+	struct clk_hw *hw;
+	struct resource *res;
+	const char *clk_name = node->name;
+	const char *parent_name;
+	void __iomem *reg;
+	u32 shift = 0;
+	u8 clk_gate_flags = CLK_GATE_HIWORD_MASK;
+	int ret;
+
+	ret = device_property_read_string(dev, "clock-output-names", &clk_name);
+	if (ret)
+		return ret;
+
+	ret = device_property_read_u32(dev, "rockchip,bit-shift", &shift);
+	if (ret)
+		return ret;
+
+	if (device_property_read_bool(dev, "rockchip,bit-set-to-disable"))
+		clk_gate_flags |= CLK_GATE_SET_TO_DISABLE;
+
+	ret = of_clk_parent_fill(node, &parent_name, 1);
+	if (ret != 1)
+		return -EINVAL;
+
+	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+	if (!res)
+		return -ENOMEM;
+
+	reg = devm_ioremap(dev, res->start, resource_size(res));
+	if (!reg)
+		return -ENOMEM;
+
+	pm_runtime_enable(dev);
+
+	hw = clk_hw_register_gate(dev, clk_name, parent_name, CLK_SET_RATE_PARENT,
+				  reg, shift, clk_gate_flags, &clk_out_lock);
+	if (IS_ERR(hw)) {
+		ret = -EINVAL;
+		goto err_disable_pm_runtime;
+	}
+
+	of_clk_add_hw_provider(node, of_clk_hw_simple_get, hw);
+
+	return 0;
+
+err_disable_pm_runtime:
+	pm_runtime_disable(dev);
+
+	return ret;
+}
+
+static int rockchip_clk_out_remove(struct platform_device *pdev)
+{
+	struct device_node *node = pdev->dev.of_node;
+
+	of_clk_del_provider(node);
+	pm_runtime_disable(&pdev->dev);
+
+	return 0;
+}
+
+static const struct of_device_id rockchip_clk_out_match[] = {
+	{ .compatible = "rockchip,clk-out", },
+	{},
+};
+
+static struct platform_driver rockchip_clk_out_driver = {
+	.driver = {
+		.name = "rockchip-clk-out",
+		.of_match_table = rockchip_clk_out_match,
+	},
+	.probe = rockchip_clk_out_probe,
+	.remove = rockchip_clk_out_remove,
+};
+
+module_platform_driver(rockchip_clk_out_driver);
+
+MODULE_DESCRIPTION("Rockchip Clock Input-Output-Switch");
+MODULE_AUTHOR("Sugar Zhang <sugar.zhang@rock-chips.com>");
+MODULE_LICENSE("GPL");
+MODULE_DEVICE_TABLE(of, rockchip_clk_out_match);
diff --git a/kernel/drivers/clk/rockchip/clk-pvtm.c b/kernel/drivers/clk/rockchip/clk-pvtm.c
index 23c108e..e5da301 100644
--- a/kernel/drivers/clk/rockchip/clk-pvtm.c
+++ b/kernel/drivers/clk/rockchip/clk-pvtm.c
@@ -106,11 +106,12 @@
 	rockchip_clock_pvtm_delay(time_us);
 
 	check_cnt = 100;
-	while (check_cnt--) {
+	while (check_cnt) {
 		regmap_read(pvtm->grf, info->sta, &sta);
 		if (sta & 0x1)
 			break;
 		udelay(4);
+		check_cnt--;
 	}
 
 	if (check_cnt) {
diff --git a/kernel/drivers/clk/rockchip/clk-rk3399.c b/kernel/drivers/clk/rockchip/clk-rk3399.c
index a14ece7..a8f46c7 100644
--- a/kernel/drivers/clk/rockchip/clk-rk3399.c
+++ b/kernel/drivers/clk/rockchip/clk-rk3399.c
@@ -671,9 +671,9 @@
 	MUX(SCLK_RMII_SRC, "clk_rmii_src", mux_rmii_p, CLK_SET_RATE_PARENT,
 			RK3399_CLKSEL_CON(19), 4, 1, MFLAGS),
 	GATE(SCLK_MACREF_OUT, "clk_mac_refout", "clk_rmii_src", 0,
-			RK3399_CLKGATE_CON(5), 6, GFLAGS),
-	GATE(SCLK_MACREF, "clk_mac_ref", "clk_rmii_src", 0,
 			RK3399_CLKGATE_CON(5), 7, GFLAGS),
+	GATE(SCLK_MACREF, "clk_mac_ref", "clk_rmii_src", 0,
+			RK3399_CLKGATE_CON(5), 6, GFLAGS),
 	GATE(SCLK_MAC_RX, "clk_rmii_rx", "clk_rmii_src", 0,
 			RK3399_CLKGATE_CON(5), 8, GFLAGS),
 	GATE(SCLK_MAC_TX, "clk_rmii_tx", "clk_rmii_src", 0,
diff --git a/kernel/drivers/clk/rockchip/clk-rk3528.c b/kernel/drivers/clk/rockchip/clk-rk3528.c
new file mode 100644
index 0000000..3e1143b
--- /dev/null
+++ b/kernel/drivers/clk/rockchip/clk-rk3528.c
@@ -0,0 +1,1175 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright (c) 2022 Rockchip Electronics Co. Ltd.
+ * Author: Joseph Chen <chenjh@rock-chips.com>
+ */
+
+#include <linux/clk-provider.h>
+#include <linux/module.h>
+#include <linux/of.h>
+#include <linux/of_device.h>
+#include <linux/of_address.h>
+#include <linux/syscore_ops.h>
+#include <dt-bindings/clock/rk3528-cru.h>
+#include "clk.h"
+
+/* A placeholder for rk3066 pll type. We are rk3328 pll type */
+#define RK3528_GRF_SOC_STATUS0		0x1a0
+
+enum rk3528_plls {
+	apll, cpll, gpll, ppll, dpll,
+};
+
+/*
+ *	## 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.
+ *
+ *
+ *	## CRU access attention.
+ *
+ * pclk_cru => pclk_vo_root => aclk_vo_root
+ * pclk_cru_pcie => pclk_vpu_root => aclk_vpu_root
+ * pclk_cru_ddrphy => hclk_rkvdec_root => aclk_rkvdec_root
+ */
+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 */ },
+};
+
+#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
+
+#define RK3528_CLKSEL39(_aclk_m_core)					\
+{									\
+	.reg = RK3528_CLKSEL_CON(39),					\
+	.val = HIWORD_UPDATE(_aclk_m_core, RK3528_DIV_ACLK_M_CORE_MASK,	\
+			     RK3528_DIV_ACLK_M_CORE_SHIFT),		\
+}
+
+#define RK3528_CLKSEL40(_pclk_dbg)					\
+{									\
+	.reg = RK3528_CLKSEL_CON(40),					\
+	.val = HIWORD_UPDATE(_pclk_dbg, RK3528_DIV_PCLK_DBG_MASK,	\
+			     RK3528_DIV_PCLK_DBG_SHIFT),		\
+}
+
+/* SIGN-OFF: _aclk_m_core: 550M, _pclk_dbg: 137.5M, */
+#define RK3528_CPUCLK_RATE(_prate, _aclk_m_core, _pclk_dbg)		\
+{									\
+	.prate = _prate,						\
+	.divs = {							\
+		RK3528_CLKSEL39(_aclk_m_core),				\
+		RK3528_CLKSEL40(_pclk_dbg),				\
+	},								\
+}
+
+static struct rockchip_cpuclk_rate_table rk3528_cpuclk_rates[] __initdata = {
+	/* APLL(CPU) rate <= 1900M, due to APLL VCO limit */
+	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),
+};
+
+static const struct rockchip_cpuclk_reg_data rk3528_cpuclk_data = {
+	.core_reg[0] = RK3528_CLKSEL_CON(39),
+	.div_core_shift[0] = 5,
+	.div_core_mask[0] = 0x1f,
+	.num_cores = 1,
+	.mux_core_alt = 1,
+	.mux_core_main = 0,
+	.mux_core_shift = 10,
+	.mux_core_mask = 0x1,
+};
+
+PNAME(mux_pll_p)                        = { "xin24m" };
+PNAME(mux_24m_32k_p)                    = { "xin24m", "clk_32k" };
+PNAME(mux_apll_gpll_p)                  = { "apll", "gpll" };
+PNAME(mux_gpll_cpll_p)                  = { "gpll", "cpll" };
+PNAME(mux_gpll_cpll_xin24m_p)           = { "gpll", "cpll", "xin24m" };
+PNAME(mux_100m_50m_24m_p)               = { "clk_100m_src", "clk_50m_src", "xin24m" };
+PNAME(mux_150m_100m_24m_p)              = { "clk_150m_src", "clk_100m_src", "xin24m" };
+PNAME(mux_200m_100m_24m_p)              = { "clk_200m_src", "clk_100m_src", "xin24m" };
+PNAME(mux_200m_100m_50m_24m_p)          = { "clk_200m_src", "clk_100m_src", "clk_50m_src", "xin24m" };
+PNAME(mux_300m_200m_100m_24m_p)         = { "clk_300m_src", "clk_200m_src", "clk_100m_src", "xin24m" };
+PNAME(mux_339m_200m_100m_24m_p)         = { "clk_339m_src", "clk_200m_src", "clk_100m_src", "xin24m" };
+PNAME(mux_500m_200m_100m_24m_p)         = { "clk_500m_src", "clk_200m_src", "clk_100m_src", "xin24m" };
+PNAME(mux_500m_300m_100m_24m_p)         = { "clk_500m_src", "clk_300m_src", "clk_100m_src", "xin24m" };
+PNAME(mux_600m_300m_200m_24m_p)         = { "clk_600m_src", "clk_300m_src", "clk_200m_src", "xin24m" };
+PNAME(aclk_gpu_p)                       = { "aclk_gpu_root", "clk_gpu_pvtpll_src" };
+PNAME(aclk_rkvdec_pvtmux_root_p)        = { "aclk_rkvdec_root", "clk_rkvdec_pvtpll_src" };
+PNAME(clk_i2c2_p)                       = { "clk_200m_src", "clk_100m_src", "xin24m", "clk_32k" };
+PNAME(clk_ref_pcie_inner_phy_p)         = { "clk_ppll_100m_src", "xin24m" };
+PNAME(dclk_vop0_p)                      = { "dclk_vop_src0", "clk_hdmiphy_pixel_io" };
+PNAME(mclk_i2s0_2ch_sai_src_p)          = { "clk_i2s0_2ch_src", "clk_i2s0_2ch_frac", "xin12m" };
+PNAME(mclk_i2s1_8ch_sai_src_p)          = { "clk_i2s1_8ch_src", "clk_i2s1_8ch_frac", "xin12m" };
+PNAME(mclk_i2s2_2ch_sai_src_p)          = { "clk_i2s2_2ch_src", "clk_i2s2_2ch_frac", "xin12m" };
+PNAME(mclk_i2s3_8ch_sai_src_p)          = { "clk_i2s3_8ch_src", "clk_i2s3_8ch_frac", "xin12m" };
+PNAME(mclk_sai_i2s0_p)                  = { "mclk_i2s0_2ch_sai_src", "i2s0_mclkin" };
+PNAME(mclk_sai_i2s1_p)                  = { "mclk_i2s1_8ch_sai_src", "i2s1_mclkin" };
+PNAME(mclk_spdif_src_p)                 = { "clk_spdif_src", "clk_spdif_frac", "xin12m" };
+PNAME(sclk_uart0_src_p)                 = { "clk_uart0_src", "clk_uart0_frac", "xin24m" };
+PNAME(sclk_uart1_src_p)                 = { "clk_uart1_src", "clk_uart1_frac", "xin24m" };
+PNAME(sclk_uart2_src_p)                 = { "clk_uart2_src", "clk_uart2_frac", "xin24m" };
+PNAME(sclk_uart3_src_p)                 = { "clk_uart3_src", "clk_uart3_frac", "xin24m" };
+PNAME(sclk_uart4_src_p)                 = { "clk_uart4_src", "clk_uart4_frac", "xin24m" };
+PNAME(sclk_uart5_src_p)                 = { "clk_uart5_src", "clk_uart5_frac", "xin24m" };
+PNAME(sclk_uart6_src_p)                 = { "clk_uart6_src", "clk_uart6_frac", "xin24m" };
+PNAME(sclk_uart7_src_p)                 = { "clk_uart7_src", "clk_uart7_frac", "xin24m" };
+PNAME(clk_32k_p)                        = { "xin_osc0_div", "clk_pvtm_32k" };
+
+/* Pass 0 to PLL() '_lshift' as a placeholder for rk3066 pll type. We are rk3328 pll type */
+static struct rockchip_pll_clock rk3528_pll_clks[] __initdata = {
+	[apll] = PLL(pll_rk3328, PLL_APLL, "apll", mux_pll_p,
+		     CLK_IS_CRITICAL, RK3528_PLL_CON(0),
+		     RK3528_MODE_CON, 0, 0, 0, rk3528_pll_rates),
+
+	[cpll] = PLL(pll_rk3328, PLL_CPLL, "cpll", mux_pll_p,
+		     CLK_IS_CRITICAL, RK3528_PLL_CON(8),
+		     RK3528_MODE_CON, 2, 0, 0, rk3528_pll_rates),
+
+	[gpll] = PLL(pll_rk3328, PLL_GPLL, "gpll", mux_pll_p,
+		     CLK_IS_CRITICAL, RK3528_PLL_CON(24),
+		     RK3528_MODE_CON, 4, 0, 0, rk3528_pll_rates),
+
+	[ppll] = PLL(pll_rk3328, PLL_PPLL, "ppll", mux_pll_p,
+		     CLK_IS_CRITICAL, RK3528_PCIE_PLL_CON(32),
+		     RK3528_MODE_CON, 6, 0,
+		     ROCKCHIP_PLL_FIXED_MODE, rk3528_pll_rates),
+
+	[dpll] = PLL(pll_rk3328, PLL_DPLL, "dpll", mux_pll_p,
+		     CLK_IGNORE_UNUSED, RK3528_DDRPHY_PLL_CON(16),
+		     RK3528_DDRPHY_MODE_CON, 0, 0, 0, rk3528_pll_rates),
+};
+
+#define MFLAGS CLK_MUX_HIWORD_MASK
+#define DFLAGS CLK_DIVIDER_HIWORD_MASK
+#define GFLAGS (CLK_GATE_HIWORD_MASK | CLK_GATE_SET_TO_DISABLE)
+
+#define RK3528_FRAC_MAX_PRATE		1188000000
+
+static struct rockchip_clk_branch rk3528_uart0_fracmux __initdata =
+	MUX(CLK_UART0, "clk_uart0", sclk_uart0_src_p, CLK_SET_RATE_PARENT,
+	    RK3528_CLKSEL_CON(6), 0, 2, MFLAGS);
+
+static struct rockchip_clk_branch rk3528_uart1_fracmux __initdata =
+	MUX(CLK_UART1, "clk_uart1", sclk_uart1_src_p, CLK_SET_RATE_PARENT,
+	    RK3528_CLKSEL_CON(8), 0, 2, MFLAGS);
+
+static struct rockchip_clk_branch rk3528_uart2_fracmux __initdata =
+	MUX(CLK_UART2, "clk_uart2", sclk_uart2_src_p, CLK_SET_RATE_PARENT,
+	    RK3528_CLKSEL_CON(10), 0, 2, MFLAGS);
+
+static struct rockchip_clk_branch rk3528_uart3_fracmux __initdata =
+	MUX(CLK_UART3, "clk_uart3", sclk_uart3_src_p, CLK_SET_RATE_PARENT,
+	    RK3528_CLKSEL_CON(12), 0, 2, MFLAGS);
+
+static struct rockchip_clk_branch rk3528_uart4_fracmux __initdata =
+	MUX(CLK_UART4, "clk_uart4", sclk_uart4_src_p, CLK_SET_RATE_PARENT,
+	    RK3528_CLKSEL_CON(14), 0, 2, MFLAGS);
+
+static struct rockchip_clk_branch rk3528_uart5_fracmux __initdata =
+	MUX(CLK_UART5, "clk_uart5", sclk_uart5_src_p, CLK_SET_RATE_PARENT,
+	    RK3528_CLKSEL_CON(16), 0, 2, MFLAGS);
+
+static struct rockchip_clk_branch rk3528_uart6_fracmux __initdata =
+	MUX(CLK_UART6, "clk_uart6", sclk_uart6_src_p, CLK_SET_RATE_PARENT,
+	    RK3528_CLKSEL_CON(18), 0, 2, MFLAGS);
+
+static struct rockchip_clk_branch rk3528_uart7_fracmux __initdata =
+	MUX(CLK_UART7, "clk_uart7", sclk_uart7_src_p, CLK_SET_RATE_PARENT,
+	    RK3528_CLKSEL_CON(20), 0, 2, MFLAGS);
+
+static struct rockchip_clk_branch mclk_i2s0_2ch_sai_src_fracmux __initdata =
+	MUX(MCLK_I2S0_2CH_SAI_SRC_PRE, "mclk_i2s0_2ch_sai_src_pre", mclk_i2s0_2ch_sai_src_p, CLK_SET_RATE_PARENT,
+	    RK3528_CLKSEL_CON(22), 0, 2, MFLAGS);
+
+static struct rockchip_clk_branch mclk_i2s1_8ch_sai_src_fracmux __initdata =
+	MUX(MCLK_I2S1_8CH_SAI_SRC_PRE, "mclk_i2s1_8ch_sai_src_pre", mclk_i2s1_8ch_sai_src_p, CLK_SET_RATE_PARENT,
+	    RK3528_CLKSEL_CON(26), 0, 2, MFLAGS);
+
+static struct rockchip_clk_branch mclk_i2s2_2ch_sai_src_fracmux __initdata =
+	MUX(MCLK_I2S2_2CH_SAI_SRC_PRE, "mclk_i2s2_2ch_sai_src_pre", mclk_i2s2_2ch_sai_src_p, CLK_SET_RATE_PARENT,
+	    RK3528_CLKSEL_CON(28), 0, 2, MFLAGS);
+
+static struct rockchip_clk_branch mclk_i2s3_8ch_sai_src_fracmux __initdata =
+	MUX(MCLK_I2S3_8CH_SAI_SRC_PRE, "mclk_i2s3_8ch_sai_src_pre", mclk_i2s3_8ch_sai_src_p, CLK_SET_RATE_PARENT,
+	    RK3528_CLKSEL_CON(24), 0, 2, MFLAGS);
+
+static struct rockchip_clk_branch mclk_spdif_src_fracmux __initdata =
+	MUX(MCLK_SDPDIF_SRC_PRE, "mclk_spdif_src_pre", mclk_spdif_src_p, CLK_SET_RATE_PARENT,
+	    RK3528_CLKSEL_CON(32), 0, 2, MFLAGS);
+
+/*
+ * CRU Clock-Architecture
+ */
+static struct rockchip_clk_branch rk3528_clk_branches[] __initdata = {
+	/* top */
+	FACTOR(0, "xin12m", "xin24m", 0, 1, 2),
+
+	COMPOSITE(CLK_MATRIX_250M_SRC, "clk_250m_src", mux_gpll_cpll_p, CLK_IS_CRITICAL,
+	          RK3528_CLKSEL_CON(1), 15, 1, MFLAGS, 10, 5, DFLAGS,
+	          RK3528_CLKGATE_CON(0), 5, GFLAGS),
+	COMPOSITE(CLK_MATRIX_500M_SRC, "clk_500m_src", mux_gpll_cpll_p, CLK_IS_CRITICAL,
+	          RK3528_CLKSEL_CON(3), 11, 1, MFLAGS, 6, 5, DFLAGS,
+	          RK3528_CLKGATE_CON(0), 10, GFLAGS),
+	COMPOSITE_NOMUX(CLK_MATRIX_50M_SRC, "clk_50m_src", "cpll", CLK_IS_CRITICAL,
+	                RK3528_CLKSEL_CON(0), 2, 5, DFLAGS,
+	                RK3528_CLKGATE_CON(0), 1, GFLAGS),
+	COMPOSITE_NOMUX(CLK_MATRIX_100M_SRC, "clk_100m_src", "cpll", CLK_IS_CRITICAL,
+	                RK3528_CLKSEL_CON(0), 7, 5, DFLAGS,
+	                RK3528_CLKGATE_CON(0), 2, GFLAGS),
+	COMPOSITE_NOMUX(CLK_MATRIX_150M_SRC, "clk_150m_src", "gpll", CLK_IS_CRITICAL,
+	                RK3528_CLKSEL_CON(1), 0, 5, DFLAGS,
+	                RK3528_CLKGATE_CON(0), 3, GFLAGS),
+	COMPOSITE_NOMUX(CLK_MATRIX_200M_SRC, "clk_200m_src", "gpll", CLK_IS_CRITICAL,
+	                RK3528_CLKSEL_CON(1), 5, 5, DFLAGS,
+	                RK3528_CLKGATE_CON(0), 4, GFLAGS),
+	COMPOSITE_NOMUX(CLK_MATRIX_300M_SRC, "clk_300m_src", "gpll", CLK_IS_CRITICAL,
+	                RK3528_CLKSEL_CON(2), 0, 5, DFLAGS,
+	                RK3528_CLKGATE_CON(0), 6, GFLAGS),
+	COMPOSITE_NOMUX_HALFDIV(CLK_MATRIX_339M_SRC, "clk_339m_src", "gpll", CLK_IS_CRITICAL,
+	                RK3528_CLKSEL_CON(2), 5, 5, DFLAGS,
+	                RK3528_CLKGATE_CON(0), 7, GFLAGS),
+	COMPOSITE_NOMUX(CLK_MATRIX_400M_SRC, "clk_400m_src", "gpll", CLK_IGNORE_UNUSED,
+	                RK3528_CLKSEL_CON(2), 10, 5, DFLAGS,
+	                RK3528_CLKGATE_CON(0), 8, GFLAGS),
+	COMPOSITE_NOMUX(CLK_MATRIX_600M_SRC, "clk_600m_src", "gpll", CLK_IS_CRITICAL,
+	                RK3528_CLKSEL_CON(4), 0, 5, DFLAGS,
+	                RK3528_CLKGATE_CON(0), 11, GFLAGS),
+	COMPOSITE(DCLK_VOP_SRC0, "dclk_vop_src0", mux_gpll_cpll_p, 0,
+	          RK3528_CLKSEL_CON(32), 10, 1, MFLAGS, 2, 8, DFLAGS,
+	          RK3528_CLKGATE_CON(3), 7, GFLAGS),
+	COMPOSITE(DCLK_VOP_SRC1, "dclk_vop_src1", mux_gpll_cpll_p, 0,
+	          RK3528_CLKSEL_CON(33), 8, 1, MFLAGS, 0, 8, DFLAGS,
+	          RK3528_CLKGATE_CON(3), 8, GFLAGS),
+	COMPOSITE_NOMUX(CLK_HSM, "clk_hsm", "xin24m", 0,
+	                RK3528_CLKSEL_CON(36), 5, 5, DFLAGS,
+	                RK3528_CLKGATE_CON(3), 13, GFLAGS),
+
+	COMPOSITE_NOMUX(CLK_UART0_SRC, "clk_uart0_src", "gpll", 0,
+	                RK3528_CLKSEL_CON(4), 5, 5, DFLAGS,
+	                RK3528_CLKGATE_CON(0), 12, GFLAGS),
+	COMPOSITE_FRACMUX(CLK_UART0_FRAC, "clk_uart0_frac", "clk_uart0_src", CLK_SET_RATE_PARENT,
+	                  RK3528_CLKSEL_CON(5), 0,
+	                  RK3528_CLKGATE_CON(0), 13, GFLAGS, &rk3528_uart0_fracmux, RK3528_FRAC_MAX_PRATE),
+	GATE(SCLK_UART0, "sclk_uart0", "clk_uart0", 0,
+	     RK3528_CLKGATE_CON(0), 14, GFLAGS),
+
+	COMPOSITE_NOMUX(CLK_UART1_SRC, "clk_uart1_src", "gpll", 0,
+	                RK3528_CLKSEL_CON(6), 2, 5, DFLAGS,
+	                RK3528_CLKGATE_CON(0), 15, GFLAGS),
+	COMPOSITE_FRACMUX(CLK_UART1_FRAC, "clk_uart1_frac", "clk_uart1_src", CLK_SET_RATE_PARENT,
+	                  RK3528_CLKSEL_CON(7), 0,
+	                  RK3528_CLKGATE_CON(1), 0, GFLAGS, &rk3528_uart1_fracmux, RK3528_FRAC_MAX_PRATE),
+	GATE(SCLK_UART1, "sclk_uart1", "clk_uart1", 0,
+	     RK3528_CLKGATE_CON(1), 1, GFLAGS),
+
+	COMPOSITE_NOMUX(CLK_UART2_SRC, "clk_uart2_src", "gpll", 0,
+	                RK3528_CLKSEL_CON(8), 2, 5, DFLAGS,
+	                RK3528_CLKGATE_CON(1), 2, GFLAGS),
+	COMPOSITE_FRACMUX(CLK_UART2_FRAC, "clk_uart2_frac", "clk_uart2_src", CLK_SET_RATE_PARENT,
+	                  RK3528_CLKSEL_CON(9), 0,
+	                  RK3528_CLKGATE_CON(1), 3, GFLAGS, &rk3528_uart2_fracmux, RK3528_FRAC_MAX_PRATE),
+	GATE(SCLK_UART2, "sclk_uart2", "clk_uart2", 0,
+	     RK3528_CLKGATE_CON(1), 4, GFLAGS),
+
+	COMPOSITE_NOMUX(CLK_UART3_SRC, "clk_uart3_src", "gpll", 0,
+	                RK3528_CLKSEL_CON(10), 2, 5, DFLAGS,
+	                RK3528_CLKGATE_CON(1), 5, GFLAGS),
+	COMPOSITE_FRACMUX(CLK_UART3_FRAC, "clk_uart3_frac", "clk_uart3_src", CLK_SET_RATE_PARENT,
+	                  RK3528_CLKSEL_CON(11), 0,
+	                  RK3528_CLKGATE_CON(1), 6, GFLAGS, &rk3528_uart3_fracmux, RK3528_FRAC_MAX_PRATE),
+	GATE(SCLK_UART3, "sclk_uart3", "clk_uart3", 0,
+	     RK3528_CLKGATE_CON(1), 7, GFLAGS),
+
+	COMPOSITE_NOMUX(CLK_UART4_SRC, "clk_uart4_src", "gpll", 0,
+	                RK3528_CLKSEL_CON(12), 2, 5, DFLAGS,
+	                RK3528_CLKGATE_CON(1), 8, GFLAGS),
+	COMPOSITE_FRACMUX(CLK_UART4_FRAC, "clk_uart4_frac", "clk_uart4_src", CLK_SET_RATE_PARENT,
+	                  RK3528_CLKSEL_CON(13), 0,
+	                  RK3528_CLKGATE_CON(1), 9, GFLAGS, &rk3528_uart4_fracmux, RK3528_FRAC_MAX_PRATE),
+	GATE(SCLK_UART4, "sclk_uart4", "clk_uart4", 0,
+	     RK3528_CLKGATE_CON(1), 10, GFLAGS),
+
+	COMPOSITE_NOMUX(CLK_UART5_SRC, "clk_uart5_src", "gpll", 0,
+	                RK3528_CLKSEL_CON(14), 2, 5, DFLAGS,
+	                RK3528_CLKGATE_CON(1), 11, GFLAGS),
+	COMPOSITE_FRACMUX(CLK_UART5_FRAC, "clk_uart5_frac", "clk_uart5_src", CLK_SET_RATE_PARENT,
+	                  RK3528_CLKSEL_CON(15), 0,
+	                  RK3528_CLKGATE_CON(1), 12, GFLAGS, &rk3528_uart5_fracmux, RK3528_FRAC_MAX_PRATE),
+	GATE(SCLK_UART5, "sclk_uart5", "clk_uart5", 0,
+	     RK3528_CLKGATE_CON(1), 13, GFLAGS),
+
+	COMPOSITE_NOMUX(CLK_UART6_SRC, "clk_uart6_src", "gpll", 0,
+	                RK3528_CLKSEL_CON(16), 2, 5, DFLAGS,
+	                RK3528_CLKGATE_CON(1), 14, GFLAGS),
+	COMPOSITE_FRACMUX(CLK_UART6_FRAC, "clk_uart6_frac", "clk_uart6_src", CLK_SET_RATE_PARENT,
+	                  RK3528_CLKSEL_CON(17), 0,
+	                  RK3528_CLKGATE_CON(1), 15, GFLAGS, &rk3528_uart6_fracmux, RK3528_FRAC_MAX_PRATE),
+	GATE(SCLK_UART6, "sclk_uart6", "clk_uart6", 0,
+	     RK3528_CLKGATE_CON(2), 0, GFLAGS),
+
+	COMPOSITE_NOMUX(CLK_UART7_SRC, "clk_uart7_src", "gpll", 0,
+	                RK3528_CLKSEL_CON(18), 2, 5, DFLAGS,
+	                RK3528_CLKGATE_CON(2), 1, GFLAGS),
+	COMPOSITE_FRACMUX(CLK_UART7_FRAC, "clk_uart7_frac", "clk_uart7_src", CLK_SET_RATE_PARENT,
+	                  RK3528_CLKSEL_CON(19), 0,
+	                  RK3528_CLKGATE_CON(2), 2, GFLAGS, &rk3528_uart7_fracmux, RK3528_FRAC_MAX_PRATE),
+	GATE(SCLK_UART7, "sclk_uart7", "clk_uart7", 0,
+	     RK3528_CLKGATE_CON(2), 3, GFLAGS),
+
+	COMPOSITE_NOMUX(CLK_I2S0_2CH_SRC, "clk_i2s0_2ch_src", "gpll", 0,
+	                RK3528_CLKSEL_CON(20), 8, 5, DFLAGS,
+	                RK3528_CLKGATE_CON(2), 5, GFLAGS),
+	COMPOSITE_FRACMUX(CLK_I2S0_2CH_FRAC, "clk_i2s0_2ch_frac", "clk_i2s0_2ch_src", CLK_SET_RATE_PARENT,
+	                  RK3528_CLKSEL_CON(21), 0,
+	                  RK3528_CLKGATE_CON(2), 6, GFLAGS, &mclk_i2s0_2ch_sai_src_fracmux, RK3528_FRAC_MAX_PRATE),
+	GATE(MCLK_I2S0_2CH_SAI_SRC, "mclk_i2s0_2ch_sai_src", "mclk_i2s0_2ch_sai_src_pre", 0,
+	     RK3528_CLKGATE_CON(2), 7, GFLAGS),
+
+	COMPOSITE_NOMUX(CLK_I2S1_8CH_SRC, "clk_i2s1_8ch_src", "gpll", 0,
+	                RK3528_CLKSEL_CON(24), 3, 5, DFLAGS,
+	                RK3528_CLKGATE_CON(2), 11, GFLAGS),
+	COMPOSITE_FRACMUX(CLK_I2S1_8CH_FRAC, "clk_i2s1_8ch_frac", "clk_i2s1_8ch_src", CLK_SET_RATE_PARENT,
+	                  RK3528_CLKSEL_CON(25), 0,
+	                  RK3528_CLKGATE_CON(2), 12, GFLAGS, &mclk_i2s1_8ch_sai_src_fracmux, RK3528_FRAC_MAX_PRATE),
+	GATE(MCLK_I2S1_8CH_SAI_SRC, "mclk_i2s1_8ch_sai_src", "mclk_i2s1_8ch_sai_src_pre", 0,
+	     RK3528_CLKGATE_CON(2), 13, GFLAGS),
+
+	COMPOSITE_NOMUX(CLK_I2S2_2CH_SRC, "clk_i2s2_2ch_src", "gpll", 0,
+	                RK3528_CLKSEL_CON(26), 3, 5, DFLAGS,
+	                RK3528_CLKGATE_CON(2), 14, GFLAGS),
+	COMPOSITE_FRACMUX(CLK_I2S2_2CH_FRAC, "clk_i2s2_2ch_frac", "clk_i2s2_2ch_src", CLK_SET_RATE_PARENT,
+	                  RK3528_CLKSEL_CON(27), 0,
+	                  RK3528_CLKGATE_CON(2), 15, GFLAGS, &mclk_i2s2_2ch_sai_src_fracmux, RK3528_FRAC_MAX_PRATE),
+	GATE(MCLK_I2S2_2CH_SAI_SRC, "mclk_i2s2_2ch_sai_src", "mclk_i2s2_2ch_sai_src_pre", 0,
+	     RK3528_CLKGATE_CON(3), 0, GFLAGS),
+
+	COMPOSITE_NOMUX(CLK_I2S3_8CH_SRC, "clk_i2s3_8ch_src", "gpll", 0,
+	                RK3528_CLKSEL_CON(22), 3, 5, DFLAGS,
+	                RK3528_CLKGATE_CON(2), 8, GFLAGS),
+	COMPOSITE_FRACMUX(CLK_I2S3_8CH_FRAC, "clk_i2s3_8ch_frac", "clk_i2s3_8ch_src", CLK_SET_RATE_PARENT,
+	                  RK3528_CLKSEL_CON(23), 0,
+	                  RK3528_CLKGATE_CON(2), 9, GFLAGS, &mclk_i2s3_8ch_sai_src_fracmux, RK3528_FRAC_MAX_PRATE),
+	GATE(MCLK_I2S3_8CH_SAI_SRC, "mclk_i2s3_8ch_sai_src", "mclk_i2s3_8ch_sai_src_pre", 0,
+	     RK3528_CLKGATE_CON(2), 10, GFLAGS),
+
+	COMPOSITE_NOMUX(CLK_SPDIF_SRC, "clk_spdif_src", "gpll", 0,
+	                RK3528_CLKSEL_CON(30), 2, 5, DFLAGS,
+	                RK3528_CLKGATE_CON(3), 4, GFLAGS),
+	COMPOSITE_FRACMUX(CLK_SPDIF_FRAC, "clk_spdif_frac", "clk_spdif_src", CLK_SET_RATE_PARENT,
+	                  RK3528_CLKSEL_CON(31), 0,
+	                  RK3528_CLKGATE_CON(3), 5, GFLAGS, &mclk_spdif_src_fracmux, RK3528_FRAC_MAX_PRATE),
+	GATE(MCLK_SPDIF_SRC, "mclk_spdif_src", "mclk_spdif_src_pre", 0,
+	     RK3528_CLKGATE_CON(3), 6, GFLAGS),
+
+	/* bus */
+	COMPOSITE_NODIV(ACLK_BUS_M_ROOT, "aclk_bus_m_root", mux_300m_200m_100m_24m_p, CLK_IS_CRITICAL,
+	                RK3528_CLKSEL_CON(43), 12, 2, MFLAGS,
+	                RK3528_CLKGATE_CON(8), 7, GFLAGS),
+	GATE(ACLK_GIC, "aclk_gic", "aclk_bus_m_root", CLK_IS_CRITICAL,
+	     RK3528_CLKGATE_CON(9), 1, GFLAGS),
+
+	COMPOSITE_NODIV(ACLK_BUS_ROOT, "aclk_bus_root", mux_200m_100m_24m_p, CLK_IS_CRITICAL,
+	                RK3528_CLKSEL_CON(43), 6, 2, MFLAGS,
+	                RK3528_CLKGATE_CON(8), 4, GFLAGS),
+	GATE(ACLK_SPINLOCK, "aclk_spinlock", "aclk_bus_root", 0,
+	     RK3528_CLKGATE_CON(9), 2, GFLAGS),
+	GATE(ACLK_DMAC, "aclk_dmac", "aclk_bus_root", 0,
+	     RK3528_CLKGATE_CON(9), 4, GFLAGS),
+	GATE(ACLK_DCF, "aclk_dcf", "aclk_bus_root", 0,
+	     RK3528_CLKGATE_CON(11), 11, GFLAGS),
+	COMPOSITE(ACLK_BUS_VOPGL_ROOT, "aclk_bus_vopgl_root", mux_gpll_cpll_p, CLK_IS_CRITICAL,
+	          RK3528_CLKSEL_CON(43), 3, 1, MFLAGS, 0, 3, DFLAGS,
+	          RK3528_CLKGATE_CON(8), 0, GFLAGS),
+	COMPOSITE_NODIV(ACLK_BUS_H_ROOT, "aclk_bus_h_root", mux_500m_200m_100m_24m_p, CLK_IS_CRITICAL,
+	                RK3528_CLKSEL_CON(43), 4, 2, MFLAGS,
+	                RK3528_CLKGATE_CON(8), 2, GFLAGS),
+	GATE(ACLK_DMA2DDR, "aclk_dma2ddr", "aclk_bus_h_root", 0,
+	     RK3528_CLKGATE_CON(10), 14, GFLAGS),
+
+	COMPOSITE_NODIV(HCLK_BUS_ROOT, "hclk_bus_root", mux_200m_100m_50m_24m_p, CLK_IS_CRITICAL,
+	                RK3528_CLKSEL_CON(43), 8, 2, MFLAGS,
+	                RK3528_CLKGATE_CON(8), 5, GFLAGS),
+
+	COMPOSITE_NODIV(PCLK_BUS_ROOT, "pclk_bus_root", mux_100m_50m_24m_p, CLK_IS_CRITICAL,
+	                RK3528_CLKSEL_CON(43), 10, 2, MFLAGS,
+	                RK3528_CLKGATE_CON(8), 6, GFLAGS),
+	GATE(PCLK_DFT2APB, "pclk_dft2apb", "pclk_bus_root", 0,
+	     RK3528_CLKGATE_CON(8), 13, GFLAGS),
+	GATE(PCLK_BUS_GRF, "pclk_bus_grf", "pclk_bus_root", CLK_IS_CRITICAL,
+	     RK3528_CLKGATE_CON(8), 15, GFLAGS),
+	GATE(PCLK_TIMER, "pclk_timer", "pclk_bus_root", 0,
+	     RK3528_CLKGATE_CON(9), 5, GFLAGS),
+	GATE(PCLK_JDBCK_DAP, "pclk_jdbck_dap", "pclk_bus_root", 0,
+	     RK3528_CLKGATE_CON(9), 12, GFLAGS),
+	GATE(PCLK_WDT_NS, "pclk_wdt_ns", "pclk_bus_root", 0,
+	     RK3528_CLKGATE_CON(9), 15, GFLAGS),
+	GATE(PCLK_UART0, "pclk_uart0", "pclk_bus_root", 0,
+	     RK3528_CLKGATE_CON(10), 7, GFLAGS),
+	GATE(PCLK_PWM0, "pclk_pwm0", "pclk_bus_root", 0,
+	     RK3528_CLKGATE_CON(11), 4, GFLAGS),
+	GATE(PCLK_PWM1, "pclk_pwm1", "pclk_bus_root", 0,
+	     RK3528_CLKGATE_CON(11), 7, GFLAGS),
+	GATE(PCLK_DMA2DDR, "pclk_dma2ddr", "pclk_bus_root", 0,
+	     RK3528_CLKGATE_CON(10), 13, GFLAGS),
+	GATE(PCLK_SCR, "pclk_scr", "pclk_bus_root", 0,
+	     RK3528_CLKGATE_CON(11), 10, GFLAGS),
+	GATE(PCLK_INTMUX, "pclk_intmux", "pclk_bus_root", CLK_IGNORE_UNUSED,
+	     RK3528_CLKGATE_CON(11), 12, GFLAGS),
+
+	COMPOSITE_NODIV(CLK_PWM0, "clk_pwm0", mux_100m_50m_24m_p, 0,
+	                RK3528_CLKSEL_CON(44), 6, 2, MFLAGS,
+	                RK3528_CLKGATE_CON(11), 5, GFLAGS),
+	COMPOSITE_NODIV(CLK_PWM1, "clk_pwm1", mux_100m_50m_24m_p, 0,
+	                RK3528_CLKSEL_CON(44), 8, 2, MFLAGS,
+	                RK3528_CLKGATE_CON(11), 8, GFLAGS),
+
+	GATE(CLK_CAPTURE_PWM1, "clk_capture_pwm1", "xin24m", 0,
+	     RK3528_CLKGATE_CON(11), 9, GFLAGS),
+	GATE(CLK_CAPTURE_PWM0, "clk_capture_pwm0", "xin24m", 0,
+	     RK3528_CLKGATE_CON(11), 6, GFLAGS),
+	GATE(CLK_JDBCK_DAP, "clk_jdbck_dap", "xin24m", 0,
+	     RK3528_CLKGATE_CON(9), 13, GFLAGS),
+	GATE(TCLK_WDT_NS, "tclk_wdt_ns", "xin24m", 0,
+	     RK3528_CLKGATE_CON(10), 0, GFLAGS),
+
+	GATE(CLK_TIMER_ROOT, "clk_timer_root", "xin24m", 0,
+	     RK3528_CLKGATE_CON(8), 9, GFLAGS),
+	GATE(CLK_TIMER0, "clk_timer0", "clk_timer_root", 0,
+	     RK3528_CLKGATE_CON(9), 6, GFLAGS),
+	GATE(CLK_TIMER1, "clk_timer1", "clk_timer_root", 0,
+	     RK3528_CLKGATE_CON(9), 7, GFLAGS),
+	GATE(CLK_TIMER2, "clk_timer2", "clk_timer_root", 0,
+	     RK3528_CLKGATE_CON(9), 8, GFLAGS),
+	GATE(CLK_TIMER3, "clk_timer3", "clk_timer_root", 0,
+	     RK3528_CLKGATE_CON(9), 9, GFLAGS),
+	GATE(CLK_TIMER4, "clk_timer4", "clk_timer_root", 0,
+	     RK3528_CLKGATE_CON(9), 10, GFLAGS),
+	GATE(CLK_TIMER5, "clk_timer5", "clk_timer_root", 0,
+	     RK3528_CLKGATE_CON(9), 11, GFLAGS),
+
+	/* pmu */
+	GATE(HCLK_PMU_ROOT, "hclk_pmu_root", "clk_100m_src", CLK_IGNORE_UNUSED,
+	     RK3528_PMU_CLKGATE_CON(0), 1, GFLAGS),
+	GATE(PCLK_PMU_ROOT, "pclk_pmu_root", "clk_100m_src", CLK_IGNORE_UNUSED,
+	     RK3528_PMU_CLKGATE_CON(0), 0, GFLAGS),
+
+	GATE(FCLK_MCU, "fclk_mcu", "hclk_pmu_root", 0,
+	     RK3528_PMU_CLKGATE_CON(0), 7, GFLAGS),
+	GATE(HCLK_PMU_SRAM, "hclk_pmu_sram", "hclk_pmu_root", CLK_IS_CRITICAL,
+	     RK3528_PMU_CLKGATE_CON(5), 4, GFLAGS),
+
+	GATE(PCLK_I2C2, "pclk_i2c2", "pclk_pmu_root", 0,
+	     RK3528_PMU_CLKGATE_CON(0), 2, GFLAGS),
+	GATE(PCLK_PMU_HP_TIMER, "pclk_pmu_hp_timer", "pclk_pmu_root", 0,
+	     RK3528_PMU_CLKGATE_CON(1), 2, GFLAGS),
+	GATE(PCLK_PMU_IOC, "pclk_pmu_ioc", "pclk_pmu_root", CLK_IS_CRITICAL,
+	     RK3528_PMU_CLKGATE_CON(1), 5, GFLAGS),
+	GATE(PCLK_PMU_CRU, "pclk_pmu_cru", "pclk_pmu_root", CLK_IS_CRITICAL,
+	     RK3528_PMU_CLKGATE_CON(1), 6, GFLAGS),
+	GATE(PCLK_PMU_GRF, "pclk_pmu_grf", "pclk_pmu_root", CLK_IS_CRITICAL,
+	     RK3528_PMU_CLKGATE_CON(1), 7, GFLAGS),
+	GATE(PCLK_PMU_WDT, "pclk_pmu_wdt", "pclk_pmu_root", 0,
+	     RK3528_PMU_CLKGATE_CON(1), 10, GFLAGS),
+	GATE(PCLK_PMU, "pclk_pmu", "pclk_pmu_root", CLK_IS_CRITICAL,
+	     RK3528_PMU_CLKGATE_CON(0), 13, GFLAGS),
+	GATE(PCLK_GPIO0, "pclk_gpio0", "pclk_pmu_root", 0,
+	     RK3528_PMU_CLKGATE_CON(0), 14, GFLAGS),
+	GATE(PCLK_OSCCHK, "pclk_oscchk", "pclk_pmu_root", 0,
+	     RK3528_PMU_CLKGATE_CON(0), 9, GFLAGS),
+	GATE(PCLK_PMU_MAILBOX, "pclk_pmu_mailbox", "pclk_pmu_root", 0,
+	     RK3528_PMU_CLKGATE_CON(1), 12, GFLAGS),
+	GATE(PCLK_SCRKEYGEN, "pclk_scrkeygen", "pclk_pmu_root", 0,
+	     RK3528_PMU_CLKGATE_CON(1), 15, GFLAGS),
+	GATE(PCLK_PVTM_PMU, "pclk_pvtm_pmu", "pclk_pmu_root", 0,
+	     RK3528_PMU_CLKGATE_CON(5), 1, GFLAGS),
+
+	COMPOSITE_NODIV(CLK_I2C2, "clk_i2c2", clk_i2c2_p, 0,
+	                RK3528_PMU_CLKSEL_CON(0), 0, 2, MFLAGS,
+	                RK3528_PMU_CLKGATE_CON(0), 3, GFLAGS),
+
+	GATE(CLK_REFOUT, "clk_refout", "xin24m", 0,
+	     RK3528_PMU_CLKGATE_CON(2), 4, GFLAGS),
+	COMPOSITE_NOMUX(CLK_PVTM_PMU, "clk_pvtm_pmu", "xin24m", 0,
+	                RK3528_PMU_CLKSEL_CON(5), 0, 5, DFLAGS,
+	                RK3528_PMU_CLKGATE_CON(5), 0, GFLAGS),
+
+	COMPOSITE_FRAC(XIN_OSC0_DIV, "xin_osc0_div", "xin24m", 0,
+	               RK3528_PMU_CLKSEL_CON(1), 0,
+	               RK3528_PMU_CLKGATE_CON(1), 0, GFLAGS, 0),
+	/* clk_32k: internal! No path from external osc 32k */
+	MUX(CLK_DEEPSLOW, "clk_32k", clk_32k_p, CLK_IS_CRITICAL,
+	    RK3528_PMU_CLKSEL_CON(2), 0, 1, MFLAGS),
+	GATE(RTC_CLK_MCU, "rtc_clk_mcu", "clk_32k", 0,
+	     RK3528_PMU_CLKGATE_CON(0), 8, GFLAGS),
+	GATE(CLK_DDR_FAIL_SAFE, "clk_ddr_fail_safe", "xin24m", CLK_IGNORE_UNUSED,
+	     RK3528_PMU_CLKGATE_CON(1), 1, GFLAGS),
+
+	COMPOSITE_NODIV(DBCLK_GPIO0, "dbclk_gpio0", mux_24m_32k_p, 0,
+	                RK3528_PMU_CLKSEL_CON(0), 2, 1, MFLAGS,
+	                RK3528_PMU_CLKGATE_CON(0), 15, GFLAGS),
+	COMPOSITE_NODIV(TCLK_PMU_WDT, "tclk_pmu_wdt", mux_24m_32k_p, 0,
+	                RK3528_PMU_CLKSEL_CON(2), 1, 1, MFLAGS,
+	                RK3528_PMU_CLKGATE_CON(1), 11, GFLAGS),
+
+	/* core */
+	COMPOSITE_NOMUX(ACLK_M_CORE_BIU, "aclk_m_core", "armclk", CLK_IS_CRITICAL,
+	                RK3528_CLKSEL_CON(39), 11, 5, DFLAGS | CLK_DIVIDER_READ_ONLY,
+	                RK3528_CLKGATE_CON(5), 12, GFLAGS),
+	COMPOSITE_NOMUX(PCLK_DBG, "pclk_dbg", "armclk", CLK_IS_CRITICAL,
+	                RK3528_CLKSEL_CON(40), 1, 5, DFLAGS | CLK_DIVIDER_READ_ONLY,
+	                RK3528_CLKGATE_CON(5), 13, GFLAGS),
+	GATE(PCLK_CPU_ROOT, "pclk_cpu_root", "pclk_dbg", CLK_IS_CRITICAL,
+	     RK3528_CLKGATE_CON(6), 1, GFLAGS),
+	GATE(PCLK_CORE_GRF, "pclk_core_grf", "pclk_cpu_root", CLK_IS_CRITICAL,
+	     RK3528_CLKGATE_CON(6), 2, GFLAGS),
+
+	/* ddr */
+	GATE(CLK_DDRC_SRC, "clk_ddrc_src", "dpll", CLK_IS_CRITICAL,
+	     RK3528_DDRPHY_CLKGATE_CON(0), 0, GFLAGS),
+	GATE(CLK_DDR_PHY, "clk_ddr_phy", "dpll", CLK_IS_CRITICAL,
+	     RK3528_DDRPHY_CLKGATE_CON(0), 1, GFLAGS),
+
+	COMPOSITE_NODIV(PCLK_DDR_ROOT, "pclk_ddr_root", mux_100m_50m_24m_p, CLK_IS_CRITICAL,
+	                RK3528_CLKSEL_CON(90), 0, 2, MFLAGS,
+	                RK3528_CLKGATE_CON(45), 0, GFLAGS),
+	GATE(PCLK_DDRMON, "pclk_ddrmon", "pclk_ddr_root", CLK_IGNORE_UNUSED,
+	     RK3528_CLKGATE_CON(45), 3, GFLAGS),
+	GATE(PCLK_DDR_HWLP, "pclk_ddr_hwlp", "pclk_ddr_root", CLK_IGNORE_UNUSED,
+	     RK3528_CLKGATE_CON(45), 8, GFLAGS),
+	GATE(CLK_TIMER_DDRMON, "clk_timer_ddrmon", "xin24m", CLK_IGNORE_UNUSED,
+	     RK3528_CLKGATE_CON(45), 4, GFLAGS),
+
+	GATE(PCLK_DDRC, "pclk_ddrc", "pclk_ddr_root", CLK_IS_CRITICAL,
+	     RK3528_CLKGATE_CON(45), 2, GFLAGS),
+	GATE(PCLK_DDR_GRF, "pclk_ddr_grf", "pclk_ddr_root", CLK_IS_CRITICAL,
+	     RK3528_CLKGATE_CON(45), 6, GFLAGS),
+	GATE(PCLK_DDRPHY, "pclk_ddrphy", "pclk_ddr_root", CLK_IS_CRITICAL,
+	     RK3528_CLKGATE_CON(45), 9, GFLAGS),
+
+	GATE(ACLK_DDR_UPCTL, "aclk_ddr_upctl", "clk_ddrc_src", CLK_IS_CRITICAL,
+	     RK3528_CLKGATE_CON(45), 11, GFLAGS),
+	GATE(CLK_DDR_UPCTL, "clk_ddr_upctl", "clk_ddrc_src", CLK_IS_CRITICAL,
+	     RK3528_CLKGATE_CON(45), 12, GFLAGS),
+	GATE(CLK_DDRMON, "clk_ddrmon", "clk_ddrc_src", CLK_IS_CRITICAL,
+	     RK3528_CLKGATE_CON(45), 13, GFLAGS),
+	GATE(ACLK_DDR_SCRAMBLE, "aclk_ddr_scramble", "clk_ddrc_src", CLK_IS_CRITICAL,
+	     RK3528_CLKGATE_CON(45), 14, GFLAGS),
+	GATE(ACLK_SPLIT, "aclk_split", "clk_ddrc_src", CLK_IS_CRITICAL,
+	     RK3528_CLKGATE_CON(45), 15, GFLAGS),
+
+	/* gpu */
+	COMPOSITE_NODIV(ACLK_GPU_ROOT, "aclk_gpu_root", mux_500m_300m_100m_24m_p, CLK_IS_CRITICAL,
+	                RK3528_CLKSEL_CON(76), 0, 2, MFLAGS,
+	                RK3528_CLKGATE_CON(34), 0, GFLAGS),
+	COMPOSITE_NODIV(ACLK_GPU, "aclk_gpu", aclk_gpu_p, CLK_SET_RATE_PARENT,
+	                RK3528_CLKSEL_CON(76), 6, 1, MFLAGS,
+	                RK3528_CLKGATE_CON(34), 7, GFLAGS),
+	GATE(ACLK_GPU_MALI, "aclk_gpu_mali", "aclk_gpu", 0,
+	     RK3528_CLKGATE_CON(34), 8, GFLAGS),
+	COMPOSITE_NODIV(PCLK_GPU_ROOT, "pclk_gpu_root", mux_100m_50m_24m_p, CLK_IS_CRITICAL,
+	                RK3528_CLKSEL_CON(76), 4, 2, MFLAGS,
+	                RK3528_CLKGATE_CON(34), 2, GFLAGS),
+
+	/* rkvdec */
+	COMPOSITE_NODIV(ACLK_RKVDEC_ROOT_NDFT, "aclk_rkvdec_root", mux_339m_200m_100m_24m_p, CLK_IS_CRITICAL,
+	                RK3528_CLKSEL_CON(88), 6, 2, MFLAGS,
+	                RK3528_CLKGATE_CON(44), 3, GFLAGS),
+	COMPOSITE_NODIV(HCLK_RKVDEC_ROOT, "hclk_rkvdec_root", mux_200m_100m_50m_24m_p, CLK_IS_CRITICAL,
+	                RK3528_CLKSEL_CON(88), 4, 2, MFLAGS,
+	                RK3528_CLKGATE_CON(44), 2, GFLAGS),
+	GATE(PCLK_DDRPHY_CRU, "pclk_ddrphy_cru", "hclk_rkvdec_root", CLK_IS_CRITICAL,
+	     RK3528_CLKGATE_CON(44), 4, GFLAGS),
+	GATE(HCLK_RKVDEC, "hclk_rkvdec", "hclk_rkvdec_root", 0,
+	     RK3528_CLKGATE_CON(44), 9, GFLAGS),
+	COMPOSITE_NODIV(CLK_HEVC_CA_RKVDEC, "clk_hevc_ca_rkvdec", mux_600m_300m_200m_24m_p, 0,
+	                RK3528_CLKSEL_CON(88), 11, 2, MFLAGS,
+	                RK3528_CLKGATE_CON(44), 11, GFLAGS),
+	MUX(ACLK_RKVDEC_PVTMUX_ROOT, "aclk_rkvdec_pvtmux_root", aclk_rkvdec_pvtmux_root_p, CLK_IS_CRITICAL | CLK_SET_RATE_PARENT,
+	    RK3528_CLKSEL_CON(88), 13, 1, MFLAGS),
+	GATE(ACLK_RKVDEC, "aclk_rkvdec", "aclk_rkvdec_pvtmux_root", 0,
+	     RK3528_CLKGATE_CON(44), 8, GFLAGS),
+
+	/* rkvenc */
+	COMPOSITE_NODIV(ACLK_RKVENC_ROOT, "aclk_rkvenc_root", mux_300m_200m_100m_24m_p, CLK_IS_CRITICAL,
+	                RK3528_CLKSEL_CON(79), 2, 2, MFLAGS,
+	                RK3528_CLKGATE_CON(36), 1, GFLAGS),
+	GATE(ACLK_RKVENC, "aclk_rkvenc", "aclk_rkvenc_root", 0,
+	     RK3528_CLKGATE_CON(36), 7, GFLAGS),
+
+	COMPOSITE_NODIV(PCLK_RKVENC_ROOT, "pclk_rkvenc_root", mux_100m_50m_24m_p, CLK_IS_CRITICAL,
+	                RK3528_CLKSEL_CON(79), 4, 2, MFLAGS,
+	                RK3528_CLKGATE_CON(36), 2, GFLAGS),
+	GATE(PCLK_RKVENC_IOC, "pclk_rkvenc_ioc", "pclk_rkvenc_root", CLK_IS_CRITICAL,
+	     RK3528_CLKGATE_CON(37), 10, GFLAGS),
+	GATE(PCLK_RKVENC_GRF, "pclk_rkvenc_grf", "pclk_rkvenc_root", CLK_IS_CRITICAL,
+	     RK3528_CLKGATE_CON(38), 6, GFLAGS),
+	GATE(PCLK_I2C1, "pclk_i2c1", "pclk_rkvenc_root", 0,
+	     RK3528_CLKGATE_CON(36), 11, GFLAGS),
+	GATE(PCLK_I2C0, "pclk_i2c0", "pclk_rkvenc_root", 0,
+	     RK3528_CLKGATE_CON(36), 13, GFLAGS),
+	GATE(PCLK_SPI0, "pclk_spi0", "pclk_rkvenc_root", 0,
+	     RK3528_CLKGATE_CON(37), 2, GFLAGS),
+	GATE(PCLK_GPIO4, "pclk_gpio4", "pclk_rkvenc_root", 0,
+	     RK3528_CLKGATE_CON(37), 8, GFLAGS),
+	GATE(PCLK_UART1, "pclk_uart1", "pclk_rkvenc_root", 0,
+	     RK3528_CLKGATE_CON(38), 2, GFLAGS),
+	GATE(PCLK_UART3, "pclk_uart3", "pclk_rkvenc_root", 0,
+	     RK3528_CLKGATE_CON(38), 4, GFLAGS),
+	GATE(PCLK_CAN0, "pclk_can0", "pclk_rkvenc_root", 0,
+	     RK3528_CLKGATE_CON(38), 7, GFLAGS),
+	GATE(PCLK_CAN1, "pclk_can1", "pclk_rkvenc_root", 0,
+	     RK3528_CLKGATE_CON(38), 9, GFLAGS),
+
+	COMPOSITE_NODIV(MCLK_PDM, "mclk_pdm", mux_150m_100m_24m_p, 0,
+	                RK3528_CLKSEL_CON(80), 12, 2, MFLAGS,
+	                RK3528_CLKGATE_CON(38), 1, GFLAGS),
+	COMPOSITE(CLK_CAN0, "clk_can0", mux_gpll_cpll_p, 0,
+	          RK3528_CLKSEL_CON(81), 6, 1, MFLAGS, 0, 6, DFLAGS,
+	          RK3528_CLKGATE_CON(38), 8, GFLAGS),
+	COMPOSITE(CLK_CAN1, "clk_can1", mux_gpll_cpll_p, 0,
+	          RK3528_CLKSEL_CON(81), 13, 1, MFLAGS, 7, 6, DFLAGS,
+	          RK3528_CLKGATE_CON(38), 10, GFLAGS),
+
+	COMPOSITE_NODIV(HCLK_RKVENC_ROOT, "hclk_rkvenc_root", mux_200m_100m_50m_24m_p, CLK_IS_CRITICAL,
+	                RK3528_CLKSEL_CON(79), 0, 2, MFLAGS,
+	                RK3528_CLKGATE_CON(36), 0, GFLAGS),
+	GATE(HCLK_SAI_I2S1, "hclk_sai_i2s1", "hclk_rkvenc_root", 0,
+	     RK3528_CLKGATE_CON(36), 9, GFLAGS),
+	GATE(HCLK_SPDIF, "hclk_spdif", "hclk_rkvenc_root", 0,
+	     RK3528_CLKGATE_CON(37), 14, GFLAGS),
+	GATE(HCLK_PDM, "hclk_pdm", "hclk_rkvenc_root", 0,
+	     RK3528_CLKGATE_CON(38), 0, GFLAGS),
+	GATE(HCLK_RKVENC, "hclk_rkvenc", "hclk_rkvenc_root", 0,
+	     RK3528_CLKGATE_CON(36), 6, GFLAGS),
+
+	COMPOSITE_NODIV(CLK_CORE_RKVENC, "clk_core_rkvenc", mux_300m_200m_100m_24m_p, 0,
+	                RK3528_CLKSEL_CON(79), 6, 2, MFLAGS,
+	                RK3528_CLKGATE_CON(36), 8, GFLAGS),
+	COMPOSITE_NODIV(CLK_I2C0, "clk_i2c0", mux_200m_100m_50m_24m_p, 0,
+	                RK3528_CLKSEL_CON(79), 11, 2, MFLAGS,
+	                RK3528_CLKGATE_CON(36), 14, GFLAGS),
+	COMPOSITE_NODIV(CLK_I2C1, "clk_i2c1", mux_200m_100m_50m_24m_p, 0,
+	                RK3528_CLKSEL_CON(79), 9, 2, MFLAGS,
+	                RK3528_CLKGATE_CON(36), 12, GFLAGS),
+#if 0
+	GATE(SCLK_IN_SPI0, "sclk_in_spi0", "sclk_in_spi0_io", 0,
+	     RK3528_CLKGATE_CON(37), 4, GFLAGS),
+	GATE(CLK_UART_JTAG, "clk_uart_jtag", "xin24m", 0,
+	     RK3528_CLKGATE_CON(37), 0, GFLAGS),
+#endif
+	COMPOSITE_NODIV(CLK_SPI0, "clk_spi0", mux_200m_100m_50m_24m_p, 0,
+	                RK3528_CLKSEL_CON(79), 13, 2, MFLAGS,
+	                RK3528_CLKGATE_CON(37), 3, GFLAGS),
+	COMPOSITE_NODIV(MCLK_SAI_I2S1, "mclk_sai_i2s1", mclk_sai_i2s1_p, CLK_SET_RATE_PARENT,
+	                RK3528_CLKSEL_CON(79), 8, 1, MFLAGS,
+	                RK3528_CLKGATE_CON(36), 10, GFLAGS),
+	GATE(DBCLK_GPIO4, "dbclk_gpio4", "xin24m", 0,
+	     RK3528_CLKGATE_CON(37), 9, GFLAGS),
+
+	/* vo */
+	COMPOSITE_NODIV(HCLK_VO_ROOT, "hclk_vo_root", mux_150m_100m_24m_p, CLK_IS_CRITICAL,
+	                RK3528_CLKSEL_CON(83), 2, 2, MFLAGS,
+	                RK3528_CLKGATE_CON(39), 1, GFLAGS),
+	GATE(HCLK_VOP, "hclk_vop", "hclk_vo_root", 0,
+	     RK3528_CLKGATE_CON(40), 2, GFLAGS),
+	GATE(HCLK_USBHOST, "hclk_usbhost", "hclk_vo_root", 0,
+	     RK3528_CLKGATE_CON(43), 3, GFLAGS),
+	GATE(HCLK_JPEG_DECODER, "hclk_jpeg_decoder", "hclk_vo_root", 0,
+	     RK3528_CLKGATE_CON(41), 7, GFLAGS),
+	GATE(HCLK_VDPP, "hclk_vdpp", "hclk_vo_root", 0,
+	     RK3528_CLKGATE_CON(39), 10, GFLAGS),
+	GATE(HCLK_CVBS, "hclk_cvbs", "hclk_vo_root", 0,
+	     RK3528_CLKGATE_CON(41), 3, GFLAGS),
+	GATE(HCLK_USBHOST_ARB, "hclk_usbhost_arb", "hclk_vo_root", 0,
+	     RK3528_CLKGATE_CON(43), 4, GFLAGS),
+	GATE(HCLK_SAI_I2S3, "hclk_sai_i2s3", "hclk_vo_root", 0,
+	     RK3528_CLKGATE_CON(42), 1, GFLAGS),
+	GATE(HCLK_HDCP, "hclk_hdcp", "hclk_vo_root", 0,
+	     RK3528_CLKGATE_CON(41), 1, GFLAGS),
+	GATE(HCLK_RGA2E, "hclk_rga2e", "hclk_vo_root", 0,
+	     RK3528_CLKGATE_CON(39), 7, GFLAGS),
+	GATE(HCLK_SDMMC0, "hclk_sdmmc0", "hclk_vo_root", 0,
+	     RK3528_CLKGATE_CON(42), 9, GFLAGS),
+	GATE(HCLK_HDCP_KEY, "hclk_hdcp_key", "hclk_vo_root", 0,
+	     RK3528_CLKGATE_CON(40), 15, GFLAGS),
+
+	COMPOSITE_NODIV(ACLK_VO_L_ROOT, "aclk_vo_l_root", mux_150m_100m_24m_p, CLK_IS_CRITICAL,
+	                RK3528_CLKSEL_CON(84), 1, 2, MFLAGS,
+	                RK3528_CLKGATE_CON(41), 8, GFLAGS),
+	GATE(ACLK_MAC_VO, "aclk_gmac0", "aclk_vo_l_root", 0,
+	     RK3528_CLKGATE_CON(41), 10, GFLAGS),
+
+	COMPOSITE_NODIV(PCLK_VO_ROOT, "pclk_vo_root", mux_100m_50m_24m_p, CLK_IS_CRITICAL,
+	                RK3528_CLKSEL_CON(83), 4, 2, MFLAGS,
+	                RK3528_CLKGATE_CON(39), 2, GFLAGS),
+	GATE(PCLK_MAC_VO, "pclk_gmac0", "pclk_vo_root", 0,
+	     RK3528_CLKGATE_CON(41), 11, GFLAGS),
+	GATE(PCLK_VCDCPHY, "pclk_vcdcphy", "pclk_vo_root", 0,
+	     RK3528_CLKGATE_CON(42), 4, GFLAGS),
+	GATE(PCLK_GPIO2, "pclk_gpio2", "pclk_vo_root", 0,
+	     RK3528_CLKGATE_CON(42), 5, GFLAGS),
+	GATE(PCLK_VO_IOC, "pclk_vo_ioc", "pclk_vo_root", CLK_IS_CRITICAL,
+	     RK3528_CLKGATE_CON(42), 7, GFLAGS),
+	GATE(PCLK_OTPC_NS, "pclk_otpc_ns", "pclk_vo_root", 0,
+	     RK3528_CLKGATE_CON(42), 11, GFLAGS),
+	GATE(PCLK_UART4, "pclk_uart4", "pclk_vo_root", 0,
+	     RK3528_CLKGATE_CON(43), 7, GFLAGS),
+	GATE(PCLK_I2C4, "pclk_i2c4", "pclk_vo_root", 0,
+	     RK3528_CLKGATE_CON(43), 9, GFLAGS),
+	GATE(PCLK_I2C7, "pclk_i2c7", "pclk_vo_root", 0,
+	     RK3528_CLKGATE_CON(43), 11, GFLAGS),
+
+	GATE(PCLK_USBPHY, "pclk_usbphy", "pclk_vo_root", 0,
+	     RK3528_CLKGATE_CON(43), 13, GFLAGS),
+
+	GATE(PCLK_VO_GRF, "pclk_vo_grf", "pclk_vo_root", CLK_IS_CRITICAL,
+	     RK3528_CLKGATE_CON(39), 13, GFLAGS),
+	GATE(PCLK_CRU, "pclk_cru", "pclk_vo_root", CLK_IS_CRITICAL,
+	     RK3528_CLKGATE_CON(39), 15, GFLAGS),
+	GATE(PCLK_HDMI, "pclk_hdmi", "pclk_vo_root", 0,
+	     RK3528_CLKGATE_CON(40), 6, GFLAGS),
+	GATE(PCLK_HDMIPHY, "pclk_hdmiphy", "pclk_vo_root", 0,
+	     RK3528_CLKGATE_CON(40), 14, GFLAGS),
+	GATE(PCLK_HDCP, "pclk_hdcp", "pclk_vo_root", 0,
+	     RK3528_CLKGATE_CON(41), 2, GFLAGS),
+
+	COMPOSITE_NODIV(CLK_CORE_VDPP, "clk_core_vdpp", mux_339m_200m_100m_24m_p, 0,
+	                RK3528_CLKSEL_CON(83), 10, 2, MFLAGS,
+	                RK3528_CLKGATE_CON(39), 12, GFLAGS),
+	COMPOSITE_NODIV(CLK_CORE_RGA2E, "clk_core_rga2e", mux_339m_200m_100m_24m_p, 0,
+	                RK3528_CLKSEL_CON(83), 8, 2, MFLAGS,
+	                RK3528_CLKGATE_CON(39), 9, GFLAGS),
+	COMPOSITE_NODIV(ACLK_JPEG_ROOT, "aclk_jpeg_root", mux_339m_200m_100m_24m_p, CLK_IS_CRITICAL,
+	                RK3528_CLKSEL_CON(84), 9, 2, MFLAGS,
+	                RK3528_CLKGATE_CON(41), 15, GFLAGS),
+	GATE(ACLK_JPEG_DECODER, "aclk_jpeg_decoder", "aclk_jpeg_root", 0,
+	     RK3528_CLKGATE_CON(41), 6, GFLAGS),
+
+	COMPOSITE_NODIV(ACLK_VO_ROOT, "aclk_vo_root", mux_339m_200m_100m_24m_p, CLK_IS_CRITICAL,
+	                RK3528_CLKSEL_CON(83), 0, 2, MFLAGS,
+	                RK3528_CLKGATE_CON(39), 0, GFLAGS),
+	GATE(ACLK_RGA2E, "aclk_rga2e", "aclk_vo_root", 0,
+	     RK3528_CLKGATE_CON(39), 8, GFLAGS | CLK_GATE_NO_SET_RATE),
+	GATE(ACLK_VDPP, "aclk_vdpp", "aclk_vo_root", 0,
+	     RK3528_CLKGATE_CON(39), 11, GFLAGS | CLK_GATE_NO_SET_RATE),
+	GATE(ACLK_HDCP, "aclk_hdcp", "aclk_vo_root", 0,
+	     RK3528_CLKGATE_CON(41), 0, GFLAGS | CLK_GATE_NO_SET_RATE),
+
+	COMPOSITE(CCLK_SRC_SDMMC0, "cclk_src_sdmmc0", mux_gpll_cpll_xin24m_p, 0,
+	          RK3528_CLKSEL_CON(85), 6, 2, MFLAGS, 0, 6, DFLAGS,
+	          RK3528_CLKGATE_CON(42), 8, GFLAGS),
+
+	COMPOSITE(ACLK_VOP_ROOT, "aclk_vop_root", mux_gpll_cpll_p, CLK_IS_CRITICAL,
+	          RK3528_CLKSEL_CON(83), 15, 1, MFLAGS, 12, 3, DFLAGS,
+	          RK3528_CLKGATE_CON(40), 0, GFLAGS),
+	GATE(ACLK_VOP, "aclk_vop", "aclk_vop_root", 0,
+	     RK3528_CLKGATE_CON(40), 5, GFLAGS),
+
+	COMPOSITE_NODIV(CLK_I2C4, "clk_i2c4", mux_200m_100m_50m_24m_p, 0,
+	                RK3528_CLKSEL_CON(85), 13, 2, MFLAGS,
+	                RK3528_CLKGATE_CON(43), 10, GFLAGS),
+	COMPOSITE_NODIV(CLK_I2C7, "clk_i2c7", mux_200m_100m_50m_24m_p, 0,
+	                RK3528_CLKSEL_CON(86), 0, 2, MFLAGS,
+	                RK3528_CLKGATE_CON(43), 12, GFLAGS),
+	GATE(DBCLK_GPIO2, "dbclk_gpio2", "xin24m", 0,
+	     RK3528_CLKGATE_CON(42), 6, GFLAGS),
+
+	GATE(CLK_HDMIHDP0, "clk_hdmihdp0", "xin24m", 0,
+	     RK3528_CLKGATE_CON(43), 2, GFLAGS),
+	GATE(CLK_MACPHY, "clk_macphy", "xin24m", 0,
+	     RK3528_CLKGATE_CON(42), 3, GFLAGS),
+	GATE(CLK_REF_USBPHY, "clk_ref_usbphy", "xin24m", 0,
+	     RK3528_CLKGATE_CON(43), 14, GFLAGS),
+	GATE(CLK_SBPI_OTPC_NS, "clk_sbpi_otpc_ns", "xin24m", 0,
+	     RK3528_CLKGATE_CON(42), 12, GFLAGS),
+	FACTOR(CLK_USER_OTPC_NS, "clk_user_otpc_ns", "clk_sbpi_otpc_ns", 0, 1, 2),
+
+	GATE(MCLK_SAI_I2S3, "mclk_sai_i2s3", "mclk_i2s3_8ch_sai_src", 0,
+	     RK3528_CLKGATE_CON(42), 2, GFLAGS),
+	COMPOSITE_NODIV(DCLK_VOP0, "dclk_vop0", dclk_vop0_p, CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT,
+	                RK3528_CLKSEL_CON(84), 0, 1, MFLAGS,
+	                RK3528_CLKGATE_CON(40), 3, GFLAGS),
+	GATE(DCLK_VOP1, "dclk_vop1", "dclk_vop_src1", CLK_SET_RATE_PARENT,
+	     RK3528_CLKGATE_CON(40), 4, GFLAGS),
+	FACTOR_GATE(DCLK_CVBS, "dclk_cvbs", "dclk_vop1", 0, 1, 4,
+	            RK3528_CLKGATE_CON(41), 4, GFLAGS),
+	GATE(DCLK_4X_CVBS, "dclk_4x_cvbs", "dclk_vop1", 0,
+	     RK3528_CLKGATE_CON(41), 5, GFLAGS),
+
+	FACTOR_GATE(CLK_SFR_HDMI, "clk_sfr_hdmi", "dclk_vop_src1", 0, 1, 4,
+	            RK3528_CLKGATE_CON(40), 7, GFLAGS),
+
+	GATE(CLK_SPDIF_HDMI, "clk_spdif_hdmi", "mclk_spdif_src", 0,
+	     RK3528_CLKGATE_CON(40), 10, GFLAGS),
+	GATE(MCLK_SPDIF, "mclk_spdif", "mclk_spdif_src", 0,
+	     RK3528_CLKGATE_CON(37), 15, GFLAGS),
+	GATE(CLK_CEC_HDMI, "clk_cec_hdmi", "clk_32k", 0,
+	     RK3528_CLKGATE_CON(40), 8, GFLAGS),
+#if 0
+	GATE(CLK_USBHOST_OHCI, "clk_usbhost_ohci", "clk_usbhost_ohci_io", 0,
+	     RK3528_CLKGATE_CON(43), 5, GFLAGS),
+	GATE(CLK_USBHOST_UTMI, "clk_usbhost_utmi", "clk_usbhost_utmi_io", 0,
+	     RK3528_CLKGATE_CON(43), 6, GFLAGS),
+	GATE(CLK_HDMIPHY_TMDSSRC, "clk_hdmiphy_tmdssrc", "clk_hdmiphy_tmdssrc_io", 0,
+	     RK3528_CLKGATE_CON(40), 11, GFLAGS),
+	GATE(CLK_HDMIPHY_PREP, "clk_hdmiphy_prep", "clk_hdmiphy_prep_io", 0,
+	     RK3528_CLKGATE_CON(40), 12, GFLAGS),
+#endif
+	/* vpu */
+	GATE(DBCLK_GPIO1, "dbclk_gpio1", "xin24m", 0,
+	     RK3528_CLKGATE_CON(26), 5, GFLAGS),
+	GATE(DBCLK_GPIO3, "dbclk_gpio3", "xin24m", 0,
+	     RK3528_CLKGATE_CON(27), 1, GFLAGS),
+	GATE(CLK_SUSPEND_USB3OTG, "clk_suspend_usb3otg", "xin24m", 0,
+	     RK3528_CLKGATE_CON(33), 4, GFLAGS),
+	GATE(CLK_PCIE_AUX, "clk_pcie_aux", "xin24m", 0,
+	     RK3528_CLKGATE_CON(30), 2, GFLAGS),
+	GATE(TCLK_EMMC, "tclk_emmc", "xin24m", 0,
+	     RK3528_CLKGATE_CON(26), 3, GFLAGS),
+	GATE(CLK_REF_USB3OTG, "clk_ref_usb3otg", "xin24m", 0,
+	     RK3528_CLKGATE_CON(33), 2, GFLAGS),
+	COMPOSITE(CCLK_SRC_SDIO0, "cclk_src_sdio0", mux_gpll_cpll_xin24m_p, 0,
+	          RK3528_CLKSEL_CON(72), 6, 2, MFLAGS, 0, 6, DFLAGS,
+	          RK3528_CLKGATE_CON(32), 1, GFLAGS),
+
+	COMPOSITE_NODIV(PCLK_VPU_ROOT, "pclk_vpu_root", mux_100m_50m_24m_p, CLK_IS_CRITICAL,
+	                RK3528_CLKSEL_CON(61), 4, 2, MFLAGS,
+	                RK3528_CLKGATE_CON(25), 5, GFLAGS),
+	GATE(PCLK_VPU_GRF, "pclk_vpu_grf", "pclk_vpu_root", CLK_IS_CRITICAL,
+	     RK3528_CLKGATE_CON(25), 12, GFLAGS),
+	GATE(PCLK_CRU_PCIE, "pclk_cru_pcie", "pclk_vpu_root", CLK_IS_CRITICAL,
+	     RK3528_CLKGATE_CON(25), 11, GFLAGS),
+	GATE(PCLK_UART6, "pclk_uart6", "pclk_vpu_root", 0,
+	     RK3528_CLKGATE_CON(27), 11, GFLAGS),
+	GATE(PCLK_CAN2, "pclk_can2", "pclk_vpu_root", 0,
+	     RK3528_CLKGATE_CON(32), 7, GFLAGS),
+	GATE(PCLK_SPI1, "pclk_spi1", "pclk_vpu_root", 0,
+	     RK3528_CLKGATE_CON(27), 4, GFLAGS),
+	GATE(PCLK_CAN3, "pclk_can3", "pclk_vpu_root", 0,
+	     RK3528_CLKGATE_CON(32), 9, GFLAGS),
+	GATE(PCLK_GPIO3, "pclk_gpio3", "pclk_vpu_root", 0,
+	     RK3528_CLKGATE_CON(27), 0, GFLAGS),
+	GATE(PCLK_GPIO1, "pclk_gpio1", "pclk_vpu_root", 0,
+	     RK3528_CLKGATE_CON(26), 4, GFLAGS),
+	GATE(PCLK_SARADC, "pclk_saradc", "pclk_vpu_root", 0,
+	     RK3528_CLKGATE_CON(32), 11, GFLAGS),
+	GATE(PCLK_ACODEC, "pclk_acodec", "pclk_vpu_root", 0,
+	     RK3528_CLKGATE_CON(26), 13, GFLAGS),
+	GATE(PCLK_UART7, "pclk_uart7", "pclk_vpu_root", 0,
+	     RK3528_CLKGATE_CON(27), 13, GFLAGS),
+	GATE(PCLK_UART5, "pclk_uart5", "pclk_vpu_root", 0,
+	     RK3528_CLKGATE_CON(27), 9, GFLAGS),
+	GATE(PCLK_TSADC, "pclk_tsadc", "pclk_vpu_root", 0,
+	     RK3528_CLKGATE_CON(32), 14, GFLAGS),
+	GATE(PCLK_PCIE, "pclk_pcie", "pclk_vpu_root", 0,
+	     RK3528_CLKGATE_CON(30), 1, GFLAGS),
+	GATE(PCLK_UART2, "pclk_uart2", "pclk_vpu_root", 0,
+	     RK3528_CLKGATE_CON(27), 7, GFLAGS),
+	GATE(PCLK_VPU_IOC, "pclk_vpu_ioc", "pclk_vpu_root", CLK_IS_CRITICAL,
+	     RK3528_CLKGATE_CON(26), 8, GFLAGS),
+	GATE(PCLK_PIPE_GRF, "pclk_pipe_grf", "pclk_vpu_root", CLK_IS_CRITICAL,
+	     RK3528_CLKGATE_CON(30), 7, GFLAGS),
+	GATE(PCLK_I2C5, "pclk_i2c5", "pclk_vpu_root", 0,
+	     RK3528_CLKGATE_CON(28), 1, GFLAGS),
+	GATE(PCLK_PCIE_PHY, "pclk_pcie_phy", "pclk_vpu_root", 0,
+	     RK3528_CLKGATE_CON(30), 6, GFLAGS),
+	GATE(PCLK_I2C3, "pclk_i2c3", "pclk_vpu_root", 0,
+	     RK3528_CLKGATE_CON(27), 15, GFLAGS),
+	GATE(PCLK_MAC_VPU, "pclk_gmac1", "pclk_vpu_root", CLK_IS_CRITICAL,
+	     RK3528_CLKGATE_CON(28), 6, GFLAGS),
+	GATE(PCLK_I2C6, "pclk_i2c6", "pclk_vpu_root", 0,
+	     RK3528_CLKGATE_CON(28), 3, GFLAGS),
+
+	COMPOSITE_NODIV(ACLK_VPU_L_ROOT, "aclk_vpu_l_root", mux_200m_100m_24m_p, CLK_IS_CRITICAL,
+	                RK3528_CLKSEL_CON(60), 0, 2, MFLAGS,
+	                RK3528_CLKGATE_CON(25), 0, GFLAGS),
+	GATE(ACLK_EMMC, "aclk_emmc", "aclk_vpu_l_root", 0,
+	     RK3528_CLKGATE_CON(26), 1, GFLAGS | CLK_GATE_NO_SET_RATE),
+	GATE(ACLK_MAC_VPU, "aclk_gmac1", "aclk_vpu_l_root", 0,
+	     RK3528_CLKGATE_CON(28), 5, GFLAGS | CLK_GATE_NO_SET_RATE),
+	GATE(ACLK_PCIE, "aclk_pcie", "aclk_vpu_l_root", 0,
+	     RK3528_CLKGATE_CON(30), 3, GFLAGS | CLK_GATE_NO_SET_RATE),
+
+	GATE(ACLK_USB3OTG, "aclk_usb3otg", "aclk_vpu_l_root", 0,
+	     RK3528_CLKGATE_CON(33), 1, GFLAGS | CLK_GATE_NO_SET_RATE),
+
+	COMPOSITE_NODIV(HCLK_VPU_ROOT, "hclk_vpu_root", mux_200m_100m_50m_24m_p, CLK_IS_CRITICAL,
+	                RK3528_CLKSEL_CON(61), 2, 2, MFLAGS,
+	                RK3528_CLKGATE_CON(25), 4, GFLAGS),
+	GATE(HCLK_VPU, "hclk_vpu", "hclk_vpu_root", 0,
+	     RK3528_CLKGATE_CON(25), 10, GFLAGS),
+	GATE(HCLK_SFC, "hclk_sfc", "hclk_vpu_root", 0,
+	     RK3528_CLKGATE_CON(25), 13, GFLAGS),
+	GATE(HCLK_EMMC, "hclk_emmc", "hclk_vpu_root", 0,
+	     RK3528_CLKGATE_CON(26), 0, GFLAGS),
+	GATE(HCLK_SAI_I2S0, "hclk_sai_i2s0", "hclk_vpu_root", 0,
+	     RK3528_CLKGATE_CON(26), 9, GFLAGS),
+	GATE(HCLK_SAI_I2S2, "hclk_sai_i2s2", "hclk_vpu_root", 0,
+	     RK3528_CLKGATE_CON(26), 11, GFLAGS),
+
+	GATE(HCLK_PCIE_SLV, "hclk_pcie_slv", "hclk_vpu_root", 0,
+	     RK3528_CLKGATE_CON(30), 4, GFLAGS),
+	GATE(HCLK_PCIE_DBI, "hclk_pcie_dbi", "hclk_vpu_root", 0,
+	     RK3528_CLKGATE_CON(30), 5, GFLAGS),
+	GATE(HCLK_SDIO0, "hclk_sdio0", "hclk_vpu_root", 0,
+	     RK3528_CLKGATE_CON(32), 2, GFLAGS),
+	GATE(HCLK_SDIO1, "hclk_sdio1", "hclk_vpu_root", 0,
+	     RK3528_CLKGATE_CON(32), 4, GFLAGS),
+
+	COMPOSITE_NOMUX(CLK_GMAC1_VPU_25M, "clk_gmac1_25m", "ppll", 0,
+	                RK3528_CLKSEL_CON(60), 2, 8, DFLAGS,
+	                RK3528_CLKGATE_CON(25), 1, GFLAGS),
+	COMPOSITE_NOMUX(CLK_PPLL_125M_MATRIX, "clk_ppll_125m_src", "ppll", 0,
+	                RK3528_CLKSEL_CON(60), 10, 5, DFLAGS,
+	                RK3528_CLKGATE_CON(25), 2, GFLAGS),
+
+	COMPOSITE(CLK_CAN3, "clk_can3", mux_gpll_cpll_p, 0,
+	          RK3528_CLKSEL_CON(73), 13, 1, MFLAGS, 7, 6, DFLAGS,
+	          RK3528_CLKGATE_CON(32), 10, GFLAGS),
+	COMPOSITE_NODIV(CLK_I2C6, "clk_i2c6", mux_200m_100m_50m_24m_p, 0,
+	                RK3528_CLKSEL_CON(64), 0, 2, MFLAGS,
+	                RK3528_CLKGATE_CON(28), 4, GFLAGS),
+
+	COMPOSITE(SCLK_SFC, "sclk_sfc", mux_gpll_cpll_xin24m_p, 0,
+	          RK3528_CLKSEL_CON(61), 12, 2, MFLAGS, 6, 6, DFLAGS,
+	          RK3528_CLKGATE_CON(25), 14, GFLAGS),
+	COMPOSITE(CCLK_SRC_EMMC, "cclk_src_emmc", mux_gpll_cpll_xin24m_p, 0,
+	          RK3528_CLKSEL_CON(62), 6, 2, MFLAGS, 0, 6, DFLAGS,
+	          RK3528_CLKGATE_CON(25), 15, GFLAGS),
+
+	COMPOSITE_NODIV(ACLK_VPU_ROOT, "aclk_vpu_root", mux_300m_200m_100m_24m_p, CLK_IS_CRITICAL,
+	                RK3528_CLKSEL_CON(61), 0, 2, MFLAGS,
+	                RK3528_CLKGATE_CON(25), 3, GFLAGS),
+	GATE(ACLK_VPU, "aclk_vpu", "aclk_vpu_root", 0,
+	     RK3528_CLKGATE_CON(25), 9, GFLAGS | CLK_GATE_NO_SET_RATE),
+
+	COMPOSITE_NODIV(CLK_SPI1, "clk_spi1", mux_200m_100m_50m_24m_p, 0,
+	                RK3528_CLKSEL_CON(63), 10, 2, MFLAGS,
+	                RK3528_CLKGATE_CON(27), 5, GFLAGS),
+	COMPOSITE(CCLK_SRC_SDIO1, "cclk_src_sdio1", mux_gpll_cpll_xin24m_p, 0,
+	          RK3528_CLKSEL_CON(72), 14, 2, MFLAGS, 8, 6, DFLAGS,
+	          RK3528_CLKGATE_CON(32), 3, GFLAGS),
+	COMPOSITE(CLK_CAN2, "clk_can2", mux_gpll_cpll_p, 0,
+	          RK3528_CLKSEL_CON(73), 6, 1, MFLAGS, 0, 6, DFLAGS,
+	          RK3528_CLKGATE_CON(32), 8, GFLAGS),
+	COMPOSITE_NOMUX(CLK_TSADC, "clk_tsadc", "xin24m", 0,
+	                RK3528_CLKSEL_CON(74), 3, 5, DFLAGS,
+	                RK3528_CLKGATE_CON(32), 15, GFLAGS),
+	COMPOSITE_NOMUX(CLK_SARADC, "clk_saradc", "xin24m", 0,
+	                RK3528_CLKSEL_CON(74), 0, 3, DFLAGS,
+	                RK3528_CLKGATE_CON(32), 12, GFLAGS),
+	COMPOSITE_NOMUX(CLK_TSADC_TSEN, "clk_tsadc_tsen", "xin24m", 0,
+	                RK3528_CLKSEL_CON(74), 8, 5, DFLAGS,
+	                RK3528_CLKGATE_CON(33), 0, GFLAGS),
+	COMPOSITE_NODIV(BCLK_EMMC, "bclk_emmc", mux_200m_100m_50m_24m_p, 0,
+	                RK3528_CLKSEL_CON(62), 8, 2, MFLAGS,
+	                RK3528_CLKGATE_CON(26), 2, GFLAGS),
+	COMPOSITE_NOMUX(MCLK_ACODEC_TX, "mclk_acodec_tx", "mclk_i2s2_2ch_sai_src", 0,
+	                RK3528_CLKSEL_CON(63), 0, 8, DFLAGS,
+	                RK3528_CLKGATE_CON(26), 14, GFLAGS),
+	COMPOSITE_NODIV(CLK_I2C3, "clk_i2c3", mux_200m_100m_50m_24m_p, 0,
+	                RK3528_CLKSEL_CON(63), 12, 2, MFLAGS,
+	                RK3528_CLKGATE_CON(28), 0, GFLAGS),
+	COMPOSITE_NODIV(CLK_I2C5, "clk_i2c5", mux_200m_100m_50m_24m_p, 0,
+	                RK3528_CLKSEL_CON(63), 14, 2, MFLAGS,
+	                RK3528_CLKGATE_CON(28), 2, GFLAGS),
+	COMPOSITE_NODIV(MCLK_SAI_I2S0, "mclk_sai_i2s0", mclk_sai_i2s0_p, CLK_SET_RATE_PARENT,
+	                RK3528_CLKSEL_CON(62), 10, 1, MFLAGS,
+	                RK3528_CLKGATE_CON(26), 10, GFLAGS),
+	GATE(MCLK_SAI_I2S2, "mclk_sai_i2s2", "mclk_i2s2_2ch_sai_src", 0,
+	     RK3528_CLKGATE_CON(26), 12, GFLAGS),
+#if 0
+	GATE(SCLK_IN_SPI1, "sclk_in_spi1", "sclk_in_spi1_io", 0,
+	     RK3528_CLKGATE_CON(27), 6, GFLAGS),
+
+	/* vpuphy */
+	GATE(CLK_PIPE_USB3OTG_COMBO, "clk_pipe_usb3otg_combo", "clk_pipe_usb3otg_io", 0,
+	     RK3528_CLKGATE_CON(31), 0, GFLAGS),
+	GATE(CLK_UTMI_USB3OTG, "clk_utmi_usb3otg", "clk_utmi_usb3otg_io", 0,
+	     RK3528_CLKGATE_CON(31), 1, GFLAGS),
+	GATE(CLK_PCIE_PIPE_PHY, "clk_pcie_pipe_phy", "clk_pipe_usb3otg_io", 0,
+	     RK3528_CLKGATE_CON(31), 2, GFLAGS),
+#endif
+	/* pcie */
+	COMPOSITE_NOMUX(CLK_PPLL_100M_MATRIX, "clk_ppll_100m_src", "ppll", CLK_IS_CRITICAL,
+	                RK3528_PCIE_CLKSEL_CON(1), 2, 5, DFLAGS,
+	                RK3528_PCIE_CLKGATE_CON(0), 1, GFLAGS),
+	COMPOSITE_NOMUX(CLK_PPLL_50M_MATRIX, "clk_ppll_50m_src", "ppll", CLK_IS_CRITICAL,
+	                RK3528_PCIE_CLKSEL_CON(1), 7, 5, DFLAGS,
+	                RK3528_PCIE_CLKGATE_CON(0), 2, GFLAGS),
+	MUX(CLK_REF_PCIE_INNER_PHY, "clk_ref_pcie_inner_phy", clk_ref_pcie_inner_phy_p, 0,
+	    RK3528_PCIE_CLKSEL_CON(1), 13, 1, MFLAGS),
+	FACTOR(CLK_REF_PCIE_100M_PHY, "clk_ref_pcie_100m_phy", "clk_ppll_100m_src", 0, 1, 1),
+
+	/* gmac */
+	FACTOR(CLK_GMAC1_RMII_VPU, "clk_gmac1_50m", "clk_ppll_50m_src", 0, 1, 1),
+	FACTOR(CLK_GMAC1_SRC_VPU, "clk_gmac1_125m", "clk_ppll_125m_src", 0, 1, 1),
+
+	/* they are orphans */
+	DIV(CLK_GMAC0_SRC, "clk_gmac0_src", "clk_gmac0_io_i", 0,
+	    RK3528_CLKSEL_CON(84), 3, 6, DFLAGS),
+	GATE(CLK_GMAC0_TX, "clk_gmac0_tx", "clk_gmac0_src", 0,
+	     RK3528_CLKGATE_CON(41), 13, GFLAGS),
+	GATE(CLK_GMAC0_RX, "clk_gmac0_rx", "clk_gmac0_src", 0,
+	     RK3528_CLKGATE_CON(41), 14, GFLAGS),
+	GATE(CLK_GMAC0_RMII_50M, "clk_gmac0_rmii_50m", "clk_gmac0_io_i", 0,
+	     RK3528_CLKGATE_CON(41), 12, GFLAGS),
+	GATE(CLK_SCRKEYGEN, "clk_scrkeygen", "clk_pmupvtm_out", 0,
+	     RK3528_PMU_CLKGATE_CON(2), 0, GFLAGS),
+	GATE(CLK_PVTM_OSCCHK, "clk_pvtm_oscchk", "clk_pmupvtm_out", 0,
+	     RK3528_PMU_CLKGATE_CON(2), 1, GFLAGS),
+};
+
+static struct rockchip_clk_branch rk3528_grf_clk_branches[] __initdata = {
+	MMC(SCLK_SDMMC_DRV, "sdmmc_drv", "cclk_src_sdmmc0", RK3528_SDMMC_CON0, 1),
+	MMC(SCLK_SDMMC_SAMPLE, "sdmmc_sample", "cclk_src_sdmmc0", RK3528_SDMMC_CON1, 1),
+	MMC(SCLK_SDIO0_DRV, "sdio0_drv", "cclk_src_sdio0", RK3528_SDIO0_CON0, 1),
+	MMC(SCLK_SDIO0_SAMPLE, "sdio0_sample", "cclk_src_sdio0", RK3528_SDIO0_CON1, 1),
+	MMC(SCLK_SDIO1_DRV, "sdio1_drv", "cclk_src_sdio1", RK3528_SDIO1_CON0, 1),
+	MMC(SCLK_SDIO1_SAMPLE, "sdio1_sample", "cclk_src_sdio1", RK3528_SDIO1_CON1, 1),
+};
+
+static void __iomem *rk3528_cru_base;
+
+static void rk3528_dump_cru(void)
+{
+	if (rk3528_cru_base) {
+		pr_warn("CRU:\n");
+		print_hex_dump(KERN_WARNING, "", DUMP_PREFIX_OFFSET,
+			       32, 4, rk3528_cru_base,
+			       0x8b8, false);
+		pr_warn("PCIE CRU:\n");
+		print_hex_dump(KERN_WARNING, "", DUMP_PREFIX_OFFSET,
+			       32, 4, rk3528_cru_base + RK3528_PCIE_CRU_BASE,
+			       0x804, false);
+		pr_warn("DDRPHY CRU:\n");
+		print_hex_dump(KERN_WARNING, "", DUMP_PREFIX_OFFSET,
+			       32, 4, rk3528_cru_base + RK3528_DDRPHY_CRU_BASE,
+			       0x804, false);
+	}
+}
+
+static void __init rk3528_clk_init(struct device_node *np)
+{
+	struct rockchip_clk_provider *ctx;
+	void __iomem *reg_base;
+
+	reg_base = of_iomap(np, 0);
+	if (!reg_base) {
+		pr_err("%s: could not map cru region\n", __func__);
+		return;
+	}
+
+	rk3528_cru_base = reg_base;
+
+	ctx = rockchip_clk_init(np, reg_base, CLK_NR_CLKS);
+	if (IS_ERR(ctx)) {
+		pr_err("%s: rockchip clk init failed\n", __func__);
+		iounmap(reg_base);
+		return;
+	}
+
+	rockchip_clk_register_plls(ctx, rk3528_pll_clks,
+				   ARRAY_SIZE(rk3528_pll_clks),
+				   RK3528_GRF_SOC_STATUS0);
+
+	rockchip_clk_register_armclk(ctx, ARMCLK, "armclk",
+				     mux_apll_gpll_p, ARRAY_SIZE(mux_apll_gpll_p),
+				     &rk3528_cpuclk_data, rk3528_cpuclk_rates,
+				     ARRAY_SIZE(rk3528_cpuclk_rates));
+	rockchip_clk_register_branches(ctx, rk3528_clk_branches,
+				       ARRAY_SIZE(rk3528_clk_branches));
+
+	rockchip_register_softrst(np, 47, reg_base + RK3528_SOFTRST_CON(0),
+				  ROCKCHIP_SOFTRST_HIWORD_MASK);
+	rockchip_register_restart_notifier(ctx, RK3528_GLB_SRST_FST, NULL);
+
+	rockchip_clk_of_add_provider(np, ctx);
+
+	if (!rk_dump_cru)
+		rk_dump_cru = rk3528_dump_cru;
+
+}
+
+CLK_OF_DECLARE(rk3528_cru, "rockchip,rk3528-cru", rk3528_clk_init);
+
+static void __init rk3528_grf_clk_init(struct device_node *np)
+{
+	struct rockchip_clk_provider *ctx;
+	void __iomem *reg_base;
+
+	reg_base = of_iomap(of_get_parent(np), 0);
+	if (!reg_base) {
+		pr_err("%s: could not map cru grf region\n", __func__);
+		return;
+	}
+
+	ctx = rockchip_clk_init(np, reg_base, CLK_NR_GRF_CLKS);
+	if (IS_ERR(ctx)) {
+		pr_err("%s: rockchip grf clk init failed\n", __func__);
+		return;
+	}
+
+	rockchip_clk_register_branches(ctx, rk3528_grf_clk_branches,
+				       ARRAY_SIZE(rk3528_grf_clk_branches));
+
+	rockchip_clk_of_add_provider(np, ctx);
+}
+
+CLK_OF_DECLARE(rk3528_grf_cru, "rockchip,rk3528-grf-cru", rk3528_grf_clk_init);
+
diff --git a/kernel/drivers/clk/rockchip/clk-rk3568.c b/kernel/drivers/clk/rockchip/clk-rk3568.c
index 73dda8e..bf83b6d 100644
--- a/kernel/drivers/clk/rockchip/clk-rk3568.c
+++ b/kernel/drivers/clk/rockchip/clk-rk3568.c
@@ -1421,21 +1421,21 @@
 			RK3568_CLKSEL_CON(72), 6, 1, MFLAGS, RK3568_CLKGATE_CON(31), 1, GFLAGS),
 	GATE(PCLK_PWM1, "pclk_pwm1", "pclk_bus", 0, RK3568_CLKGATE_CON(31), 10, GFLAGS),
 	COMPOSITE_NODIV(CLK_PWM1, "clk_pwm1", gpll100_xin24m_cpll100_p, 0,
-			RK3568_CLKSEL_CON(72), 8, 1, MFLAGS,
+			RK3568_CLKSEL_CON(72), 8, 2, MFLAGS,
 			RK3568_CLKGATE_CON(31), 11, GFLAGS),
 	GATE(CLK_PWM1_CAPTURE, "clk_pwm1_capture", "xin24m", 0,
 			RK3568_CLKGATE_CON(31), 12, GFLAGS),
 	GATE(PCLK_PWM2, "pclk_pwm2", "pclk_bus", 0,
 			RK3568_CLKGATE_CON(31), 13, GFLAGS),
 	COMPOSITE_NODIV(CLK_PWM2, "clk_pwm2", gpll100_xin24m_cpll100_p, 0,
-			RK3568_CLKSEL_CON(72), 10, 1, MFLAGS,
+			RK3568_CLKSEL_CON(72), 10, 2, MFLAGS,
 			RK3568_CLKGATE_CON(31), 14, GFLAGS),
 	GATE(CLK_PWM2_CAPTURE, "clk_pwm2_capture", "xin24m", 0,
 			RK3568_CLKGATE_CON(31), 15, GFLAGS),
 	GATE(PCLK_PWM3, "pclk_pwm3", "pclk_bus", 0,
 			RK3568_CLKGATE_CON(32), 0, GFLAGS),
 	COMPOSITE_NODIV(CLK_PWM3, "clk_pwm3", gpll100_xin24m_cpll100_p, 0,
-			RK3568_CLKSEL_CON(72), 12, 1, MFLAGS,
+			RK3568_CLKSEL_CON(72), 12, 2, MFLAGS,
 			RK3568_CLKGATE_CON(32), 1, GFLAGS),
 	GATE(CLK_PWM3_CAPTURE, "clk_pwm3_capture", "xin24m", 0,
 			RK3568_CLKGATE_CON(32), 2, GFLAGS),
diff --git a/kernel/drivers/clk/rockchip/clk.h b/kernel/drivers/clk/rockchip/clk.h
index 2c19e31..e47fb59 100644
--- a/kernel/drivers/clk/rockchip/clk.h
+++ b/kernel/drivers/clk/rockchip/clk.h
@@ -255,6 +255,34 @@
 #define RK3399_PMU_CLKGATE_CON(x)	((x) * 0x4 + 0x100)
 #define RK3399_PMU_SOFTRST_CON(x)	((x) * 0x4 + 0x110)
 
+#define RK3528_PMU_CRU_BASE		0x10000
+#define RK3528_PCIE_CRU_BASE		0x20000
+#define RK3528_DDRPHY_CRU_BASE		0x28000
+#define RK3528_VPU_GRF_BASE		0x40000
+#define RK3528_VO_GRF_BASE		0x60000
+#define RK3528_SDMMC_CON0		(RK3528_VO_GRF_BASE + 0x24)
+#define RK3528_SDMMC_CON1		(RK3528_VO_GRF_BASE + 0x28)
+#define RK3528_SDIO0_CON0		(RK3528_VPU_GRF_BASE + 0x4)
+#define RK3528_SDIO0_CON1		(RK3528_VPU_GRF_BASE + 0x8)
+#define RK3528_SDIO1_CON0		(RK3528_VPU_GRF_BASE + 0xc)
+#define RK3528_SDIO1_CON1		(RK3528_VPU_GRF_BASE + 0x10)
+#define RK3528_PLL_CON(x)		RK2928_PLL_CON(x)
+#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_CLKGATE_CON(x)		((x) * 0x4 + 0x800)
+#define RK3528_SOFTRST_CON(x)		((x) * 0x4 + 0xa00)
+#define RK3528_PMU_CLKSEL_CON(x)	((x) * 0x4 + 0x300 + RK3528_PMU_CRU_BASE)
+#define RK3528_PMU_CLKGATE_CON(x)	((x) * 0x4 + 0x800 + RK3528_PMU_CRU_BASE)
+#define RK3528_PCIE_CLKSEL_CON(x)	((x) * 0x4 + 0x300 + RK3528_PCIE_CRU_BASE)
+#define RK3528_PCIE_CLKGATE_CON(x)	((x) * 0x4 + 0x800 + RK3528_PCIE_CRU_BASE)
+#define RK3528_DDRPHY_CLKGATE_CON(x)	((x) * 0x4 + 0x800 + RK3528_DDRPHY_CRU_BASE)
+#define RK3528_DDRPHY_MODE_CON		(0x280 + RK3528_DDRPHY_CRU_BASE)
+#define RK3528_GLB_CNT_TH		0xc00
+#define RK3528_GLB_SRST_FST		0xc08
+#define RK3528_GLB_SRST_SND		0xc0c
+
 #define RK3568_PLL_CON(x)		RK2928_PLL_CON(x)
 #define RK3568_MODE_CON0		0xc0
 #define RK3568_MISC_CON0		0xc4
diff --git a/kernel/drivers/clocksource/Kconfig b/kernel/drivers/clocksource/Kconfig
index 0650438..1dbd40f 100644
--- a/kernel/drivers/clocksource/Kconfig
+++ b/kernel/drivers/clocksource/Kconfig
@@ -405,8 +405,11 @@
 	  This options enables support for the ARMv7M system timer unit
 
 config ATMEL_PIT
+	bool "Microchip ARM Periodic Interval Timer (PIT)" if COMPILE_TEST
 	select TIMER_OF if OF
-	def_bool SOC_AT91SAM9 || SOC_SAMA5
+	help
+	  This enables build of clocksource and clockevent driver for
+	  the integrated PIT in Microchip ARM SoCs.
 
 config ATMEL_ST
 	bool "Atmel ST timer support" if COMPILE_TEST
@@ -416,6 +419,14 @@
 	help
 	  Support for the Atmel ST timer.
 
+config ATMEL_ARM_TCB_CLKSRC
+	bool "Microchip ARM TC Block" if COMPILE_TEST
+	select REGMAP_MMIO
+	depends on GENERIC_CLOCKEVENTS
+	help
+	  This enables build of clocksource and clockevent driver for
+	  the integrated Timer Counter Blocks in Microchip ARM SoCs.
+
 config CLKSRC_EXYNOS_MCT
 	bool "Exynos multi core timer driver" if COMPILE_TEST
 	depends on ARM || ARM64
diff --git a/kernel/drivers/clocksource/Makefile b/kernel/drivers/clocksource/Makefile
index db51b24..0df9384 100644
--- a/kernel/drivers/clocksource/Makefile
+++ b/kernel/drivers/clocksource/Makefile
@@ -3,7 +3,8 @@
 obj-$(CONFIG_TIMER_PROBE)	+= timer-probe.o
 obj-$(CONFIG_ATMEL_PIT)		+= timer-atmel-pit.o
 obj-$(CONFIG_ATMEL_ST)		+= timer-atmel-st.o
-obj-$(CONFIG_ATMEL_TCB_CLKSRC)	+= tcb_clksrc.o
+obj-$(CONFIG_ATMEL_TCB_CLKSRC) += tcb_clksrc.o
+obj-$(CONFIG_ATMEL_ARM_TCB_CLKSRC)	+= timer-atmel-tcb.o
 obj-$(CONFIG_X86_PM_TIMER)	+= acpi_pm.o
 obj-$(CONFIG_SCx200HR_TIMER)	+= scx200_hrt.o
 obj-$(CONFIG_CS5535_CLOCK_EVENT_SRC)	+= cs5535-clockevt.o
diff --git a/kernel/drivers/clocksource/tcb_clksrc.c b/kernel/drivers/clocksource/tcb_clksrc.c
index 43f4d5c..ba15242 100644
--- a/kernel/drivers/clocksource/tcb_clksrc.c
+++ b/kernel/drivers/clocksource/tcb_clksrc.c
@@ -25,8 +25,7 @@
  *     this 32 bit free-running counter. the second channel is not used.
  *
  *   - The third channel may be used to provide a 16-bit clockevent
- *     source, used in either periodic or oneshot mode.  This runs
- *     at 32 KiHZ, and can handle delays of up to two seconds.
+ *     source, used in either periodic or oneshot mode.
  *
  * A boot clocksource and clockevent source are also currently needed,
  * unless the relevant platforms (ARM/AT91, AVR32/AT32) are changed so
@@ -126,6 +125,8 @@
 struct tc_clkevt_device {
 	struct clock_event_device	clkevt;
 	struct clk			*clk;
+	bool				clk_enabled;
+	u32				freq;
 	void __iomem			*regs;
 };
 
@@ -134,14 +135,25 @@
 	return container_of(clkevt, struct tc_clkevt_device, clkevt);
 }
 
-/* For now, we always use the 32K clock ... this optimizes for NO_HZ,
- * because using one of the divided clocks would usually mean the
- * tick rate can never be less than several dozen Hz (vs 0.5 Hz).
- *
- * A divided clock could be good for high resolution timers, since
- * 30.5 usec resolution can seem "low".
- */
 static u32 timer_clock;
+
+static void tc_clk_disable(struct clock_event_device *d)
+{
+	struct tc_clkevt_device *tcd = to_tc_clkevt(d);
+
+	clk_disable(tcd->clk);
+	tcd->clk_enabled = false;
+}
+
+static void tc_clk_enable(struct clock_event_device *d)
+{
+	struct tc_clkevt_device *tcd = to_tc_clkevt(d);
+
+	if (tcd->clk_enabled)
+		return;
+	clk_enable(tcd->clk);
+	tcd->clk_enabled = true;
+}
 
 static int tc_shutdown(struct clock_event_device *d)
 {
@@ -150,8 +162,14 @@
 
 	writel(0xff, regs + ATMEL_TC_REG(2, IDR));
 	writel(ATMEL_TC_CLKDIS, regs + ATMEL_TC_REG(2, CCR));
+	return 0;
+}
+
+static int tc_shutdown_clk_off(struct clock_event_device *d)
+{
+	tc_shutdown(d);
 	if (!clockevent_state_detached(d))
-		clk_disable(tcd->clk);
+		tc_clk_disable(d);
 
 	return 0;
 }
@@ -164,9 +182,9 @@
 	if (clockevent_state_oneshot(d) || clockevent_state_periodic(d))
 		tc_shutdown(d);
 
-	clk_enable(tcd->clk);
+	tc_clk_enable(d);
 
-	/* slow clock, count up to RC, then irq and stop */
+	/* count up to RC, then irq and stop */
 	writel(timer_clock | ATMEL_TC_CPCSTOP | ATMEL_TC_WAVE |
 		     ATMEL_TC_WAVESEL_UP_AUTO, regs + ATMEL_TC_REG(2, CMR));
 	writel(ATMEL_TC_CPCS, regs + ATMEL_TC_REG(2, IER));
@@ -186,12 +204,12 @@
 	/* By not making the gentime core emulate periodic mode on top
 	 * of oneshot, we get lower overhead and improved accuracy.
 	 */
-	clk_enable(tcd->clk);
+	tc_clk_enable(d);
 
-	/* slow clock, count up to RC, then irq and restart */
+	/* count up to RC, then irq and restart */
 	writel(timer_clock | ATMEL_TC_WAVE | ATMEL_TC_WAVESEL_UP_AUTO,
 		     regs + ATMEL_TC_REG(2, CMR));
-	writel((32768 + HZ / 2) / HZ, tcaddr + ATMEL_TC_REG(2, RC));
+	writel((tcd->freq + HZ / 2) / HZ, tcaddr + ATMEL_TC_REG(2, RC));
 
 	/* Enable clock and interrupts on RC compare */
 	writel(ATMEL_TC_CPCS, regs + ATMEL_TC_REG(2, IER));
@@ -218,9 +236,13 @@
 		.features		= CLOCK_EVT_FEAT_PERIODIC |
 					  CLOCK_EVT_FEAT_ONESHOT,
 		/* Should be lower than at91rm9200's system timer */
+#ifdef CONFIG_ATMEL_TCB_CLKSRC_USE_SLOW_CLOCK
 		.rating			= 125,
+#else
+		.rating			= 200,
+#endif
 		.set_next_event		= tc_next_event,
-		.set_state_shutdown	= tc_shutdown,
+		.set_state_shutdown	= tc_shutdown_clk_off,
 		.set_state_periodic	= tc_set_periodic,
 		.set_state_oneshot	= tc_set_oneshot,
 	},
@@ -240,8 +262,9 @@
 	return IRQ_NONE;
 }
 
-static int __init setup_clkevents(struct atmel_tc *tc, int clk32k_divisor_idx)
+static int __init setup_clkevents(struct atmel_tc *tc, int divisor_idx)
 {
+	unsigned divisor = atmel_tc_divisors[divisor_idx];
 	int ret;
 	struct clk *t2_clk = tc->clk[2];
 	int irq = tc->irq[2];
@@ -262,7 +285,11 @@
 	clkevt.regs = tc->regs;
 	clkevt.clk = t2_clk;
 
-	timer_clock = clk32k_divisor_idx;
+	timer_clock = divisor_idx;
+	if (!divisor)
+		clkevt.freq = 32768;
+	else
+		clkevt.freq = clk_get_rate(t2_clk) / divisor;
 
 	clkevt.clkevt.cpumask = cpumask_of(0);
 
@@ -273,7 +300,7 @@
 		return ret;
 	}
 
-	clockevents_config_and_register(&clkevt.clkevt, 32768, 1, 0xffff);
+	clockevents_config_and_register(&clkevt.clkevt, clkevt.freq, 1, 0xffff);
 
 	return ret;
 }
@@ -410,7 +437,11 @@
 		goto err_disable_t1;
 
 	/* channel 2:  periodic and oneshot timer support */
+#ifdef CONFIG_ATMEL_TCB_CLKSRC_USE_SLOW_CLOCK
 	ret = setup_clkevents(tc, clk32k_divisor_idx);
+#else
+	ret = setup_clkevents(tc, best_divisor_idx);
+#endif
 	if (ret)
 		goto err_unregister_clksrc;
 
diff --git a/kernel/drivers/clocksource/timer-atmel-tcb.c b/kernel/drivers/clocksource/timer-atmel-tcb.c
new file mode 100644
index 0000000..63ce3b6
--- /dev/null
+++ b/kernel/drivers/clocksource/timer-atmel-tcb.c
@@ -0,0 +1,617 @@
+// SPDX-License-Identifier: GPL-2.0
+#include <linux/clk.h>
+#include <linux/clockchips.h>
+#include <linux/clocksource.h>
+#include <linux/interrupt.h>
+#include <linux/kernel.h>
+#include <linux/mfd/syscon.h>
+#include <linux/of_address.h>
+#include <linux/of_irq.h>
+#include <linux/regmap.h>
+#include <linux/sched_clock.h>
+#include <soc/at91/atmel_tcb.h>
+
+struct atmel_tcb_clksrc {
+	struct clocksource clksrc;
+	struct clock_event_device clkevt;
+	struct regmap *regmap;
+	void __iomem *base;
+	struct clk *clk[2];
+	char name[20];
+	int channels[2];
+	int bits;
+	int irq;
+	struct {
+		u32 cmr;
+		u32 imr;
+		u32 rc;
+		bool clken;
+	} cache[2];
+	u32 bmr_cache;
+	bool registered;
+	bool clk_enabled;
+};
+
+static struct atmel_tcb_clksrc tc, tce;
+
+static struct clk *tcb_clk_get(struct device_node *node, int channel)
+{
+	struct clk *clk;
+	char clk_name[] = "t0_clk";
+
+	clk_name[1] += channel;
+	clk = of_clk_get_by_name(node->parent, clk_name);
+	if (!IS_ERR(clk))
+		return clk;
+
+	return of_clk_get_by_name(node->parent, "t0_clk");
+}
+
+/*
+ * Clockevent device using its own channel
+ */
+
+static void tc_clkevt2_clk_disable(struct clock_event_device *d)
+{
+	clk_disable(tce.clk[0]);
+	tce.clk_enabled = false;
+}
+
+static void tc_clkevt2_clk_enable(struct clock_event_device *d)
+{
+	if (tce.clk_enabled)
+		return;
+	clk_enable(tce.clk[0]);
+	tce.clk_enabled = true;
+}
+
+static int tc_clkevt2_stop(struct clock_event_device *d)
+{
+	writel(0xff, tce.base + ATMEL_TC_IDR(tce.channels[0]));
+	writel(ATMEL_TC_CCR_CLKDIS, tce.base + ATMEL_TC_CCR(tce.channels[0]));
+
+	return 0;
+}
+
+static int tc_clkevt2_shutdown(struct clock_event_device *d)
+{
+	tc_clkevt2_stop(d);
+	if (!clockevent_state_detached(d))
+		tc_clkevt2_clk_disable(d);
+
+	return 0;
+}
+
+/* For now, we always use the 32K clock ... this optimizes for NO_HZ,
+ * because using one of the divided clocks would usually mean the
+ * tick rate can never be less than several dozen Hz (vs 0.5 Hz).
+ *
+ * A divided clock could be good for high resolution timers, since
+ * 30.5 usec resolution can seem "low".
+ */
+static int tc_clkevt2_set_oneshot(struct clock_event_device *d)
+{
+	if (clockevent_state_oneshot(d) || clockevent_state_periodic(d))
+		tc_clkevt2_stop(d);
+
+	tc_clkevt2_clk_enable(d);
+
+	/* slow clock, count up to RC, then irq and stop */
+	writel(ATMEL_TC_CMR_TCLK(4) | ATMEL_TC_CMR_CPCSTOP |
+	       ATMEL_TC_CMR_WAVE | ATMEL_TC_CMR_WAVESEL_UPRC,
+	       tce.base + ATMEL_TC_CMR(tce.channels[0]));
+	writel(ATMEL_TC_CPCS, tce.base + ATMEL_TC_IER(tce.channels[0]));
+
+	return 0;
+}
+
+static int tc_clkevt2_set_periodic(struct clock_event_device *d)
+{
+	if (clockevent_state_oneshot(d) || clockevent_state_periodic(d))
+		tc_clkevt2_stop(d);
+
+	/* By not making the gentime core emulate periodic mode on top
+	 * of oneshot, we get lower overhead and improved accuracy.
+	 */
+	tc_clkevt2_clk_enable(d);
+
+	/* slow clock, count up to RC, then irq and restart */
+	writel(ATMEL_TC_CMR_TCLK(4) | ATMEL_TC_CMR_WAVE |
+	       ATMEL_TC_CMR_WAVESEL_UPRC,
+	       tce.base + ATMEL_TC_CMR(tce.channels[0]));
+	writel((32768 + HZ / 2) / HZ, tce.base + ATMEL_TC_RC(tce.channels[0]));
+
+	/* Enable clock and interrupts on RC compare */
+	writel(ATMEL_TC_CPCS, tce.base + ATMEL_TC_IER(tce.channels[0]));
+	writel(ATMEL_TC_CCR_CLKEN | ATMEL_TC_CCR_SWTRG,
+	       tce.base + ATMEL_TC_CCR(tce.channels[0]));
+
+	return 0;
+}
+
+static int tc_clkevt2_next_event(unsigned long delta,
+				 struct clock_event_device *d)
+{
+	writel(delta, tce.base + ATMEL_TC_RC(tce.channels[0]));
+	writel(ATMEL_TC_CCR_CLKEN | ATMEL_TC_CCR_SWTRG,
+	       tce.base + ATMEL_TC_CCR(tce.channels[0]));
+
+	return 0;
+}
+
+static irqreturn_t tc_clkevt2_irq(int irq, void *handle)
+{
+	unsigned int sr;
+
+	sr = readl(tce.base + ATMEL_TC_SR(tce.channels[0]));
+	if (sr & ATMEL_TC_CPCS) {
+		tce.clkevt.event_handler(&tce.clkevt);
+		return IRQ_HANDLED;
+	}
+
+	return IRQ_NONE;
+}
+
+static void tc_clkevt2_suspend(struct clock_event_device *d)
+{
+	tce.cache[0].cmr = readl(tce.base + ATMEL_TC_CMR(tce.channels[0]));
+	tce.cache[0].imr = readl(tce.base + ATMEL_TC_IMR(tce.channels[0]));
+	tce.cache[0].rc = readl(tce.base + ATMEL_TC_RC(tce.channels[0]));
+	tce.cache[0].clken = !!(readl(tce.base + ATMEL_TC_SR(tce.channels[0])) &
+				ATMEL_TC_CLKSTA);
+}
+
+static void tc_clkevt2_resume(struct clock_event_device *d)
+{
+	/* Restore registers for the channel, RA and RB are not used  */
+	writel(tce.cache[0].cmr, tc.base + ATMEL_TC_CMR(tce.channels[0]));
+	writel(tce.cache[0].rc, tc.base + ATMEL_TC_RC(tce.channels[0]));
+	writel(0, tc.base + ATMEL_TC_RA(tce.channels[0]));
+	writel(0, tc.base + ATMEL_TC_RB(tce.channels[0]));
+	/* Disable all the interrupts */
+	writel(0xff, tc.base + ATMEL_TC_IDR(tce.channels[0]));
+	/* Reenable interrupts that were enabled before suspending */
+	writel(tce.cache[0].imr, tc.base + ATMEL_TC_IER(tce.channels[0]));
+
+	/* Start the clock if it was used */
+	if (tce.cache[0].clken)
+		writel(ATMEL_TC_CCR_CLKEN | ATMEL_TC_CCR_SWTRG,
+		       tc.base + ATMEL_TC_CCR(tce.channels[0]));
+}
+
+static int __init tc_clkevt_register(struct device_node *node,
+				     struct regmap *regmap, void __iomem *base,
+				     int channel, int irq, int bits)
+{
+	int ret;
+	struct clk *slow_clk;
+
+	tce.regmap = regmap;
+	tce.base = base;
+	tce.channels[0] = channel;
+	tce.irq = irq;
+
+	slow_clk = of_clk_get_by_name(node->parent, "slow_clk");
+	if (IS_ERR(slow_clk))
+		return PTR_ERR(slow_clk);
+
+	ret = clk_prepare_enable(slow_clk);
+	if (ret)
+		return ret;
+
+	tce.clk[0] = tcb_clk_get(node, tce.channels[0]);
+	if (IS_ERR(tce.clk[0])) {
+		ret = PTR_ERR(tce.clk[0]);
+		goto err_slow;
+	}
+
+	snprintf(tce.name, sizeof(tce.name), "%s:%d",
+		 kbasename(node->parent->full_name), channel);
+	tce.clkevt.cpumask = cpumask_of(0);
+	tce.clkevt.name = tce.name;
+	tce.clkevt.set_next_event = tc_clkevt2_next_event,
+	tce.clkevt.set_state_shutdown = tc_clkevt2_shutdown,
+	tce.clkevt.set_state_periodic = tc_clkevt2_set_periodic,
+	tce.clkevt.set_state_oneshot = tc_clkevt2_set_oneshot,
+	tce.clkevt.suspend = tc_clkevt2_suspend,
+	tce.clkevt.resume = tc_clkevt2_resume,
+	tce.clkevt.features = CLOCK_EVT_FEAT_PERIODIC | CLOCK_EVT_FEAT_ONESHOT;
+	tce.clkevt.rating = 140;
+
+	/* try to enable clk to avoid future errors in mode change */
+	ret = clk_prepare_enable(tce.clk[0]);
+	if (ret)
+		goto err_slow;
+	clk_disable(tce.clk[0]);
+
+	clockevents_config_and_register(&tce.clkevt, 32768, 1,
+					CLOCKSOURCE_MASK(bits));
+
+	ret = request_irq(tce.irq, tc_clkevt2_irq, IRQF_TIMER | IRQF_SHARED,
+			  tce.clkevt.name, &tce);
+	if (ret)
+		goto err_clk;
+
+	tce.registered = true;
+
+	return 0;
+
+err_clk:
+	clk_unprepare(tce.clk[0]);
+err_slow:
+	clk_disable_unprepare(slow_clk);
+
+	return ret;
+}
+
+/*
+ * Clocksource and clockevent using the same channel(s)
+ */
+static u64 tc_get_cycles(struct clocksource *cs)
+{
+	u32 lower, upper;
+
+	do {
+		upper = readl_relaxed(tc.base + ATMEL_TC_CV(tc.channels[1]));
+		lower = readl_relaxed(tc.base + ATMEL_TC_CV(tc.channels[0]));
+	} while (upper != readl_relaxed(tc.base + ATMEL_TC_CV(tc.channels[1])));
+
+	return (upper << 16) | lower;
+}
+
+static u64 tc_get_cycles32(struct clocksource *cs)
+{
+	return readl_relaxed(tc.base + ATMEL_TC_CV(tc.channels[0]));
+}
+
+static u64 notrace tc_sched_clock_read(void)
+{
+	return tc_get_cycles(&tc.clksrc);
+}
+
+static u64 notrace tc_sched_clock_read32(void)
+{
+	return tc_get_cycles32(&tc.clksrc);
+}
+
+static int tcb_clkevt_next_event(unsigned long delta,
+				 struct clock_event_device *d)
+{
+	u32 old, next, cur;
+
+	old = readl(tc.base + ATMEL_TC_CV(tc.channels[0]));
+	next = old + delta;
+	writel(next, tc.base + ATMEL_TC_RC(tc.channels[0]));
+	cur = readl(tc.base + ATMEL_TC_CV(tc.channels[0]));
+
+	/* check whether the delta elapsed while setting the register */
+	if ((next < old && cur < old && cur > next) ||
+	    (next > old && (cur < old || cur > next))) {
+		/*
+		 * Clear the CPCS bit in the status register to avoid
+		 * generating a spurious interrupt next time a valid
+		 * timer event is configured.
+		 */
+		old = readl(tc.base + ATMEL_TC_SR(tc.channels[0]));
+		return -ETIME;
+	}
+
+	writel(ATMEL_TC_CPCS, tc.base + ATMEL_TC_IER(tc.channels[0]));
+
+	return 0;
+}
+
+static irqreturn_t tc_clkevt_irq(int irq, void *handle)
+{
+	unsigned int sr;
+
+	sr = readl(tc.base + ATMEL_TC_SR(tc.channels[0]));
+	if (sr & ATMEL_TC_CPCS) {
+		tc.clkevt.event_handler(&tc.clkevt);
+		return IRQ_HANDLED;
+	}
+
+	return IRQ_NONE;
+}
+
+static int tcb_clkevt_oneshot(struct clock_event_device *dev)
+{
+	if (clockevent_state_oneshot(dev))
+		return 0;
+
+	/*
+	 * Because both clockevent devices may share the same IRQ, we don't want
+	 * the less likely one to stay requested
+	 */
+	return request_irq(tc.irq, tc_clkevt_irq, IRQF_TIMER | IRQF_SHARED,
+			   tc.name, &tc);
+}
+
+static int tcb_clkevt_shutdown(struct clock_event_device *dev)
+{
+	writel(0xff, tc.base + ATMEL_TC_IDR(tc.channels[0]));
+	if (tc.bits == 16)
+		writel(0xff, tc.base + ATMEL_TC_IDR(tc.channels[1]));
+
+	if (!clockevent_state_detached(dev))
+		free_irq(tc.irq, &tc);
+
+	return 0;
+}
+
+static void __init tcb_setup_dual_chan(struct atmel_tcb_clksrc *tc,
+				       int mck_divisor_idx)
+{
+	/* first channel: waveform mode, input mclk/8, clock TIOA on overflow */
+	writel(mck_divisor_idx			/* likely divide-by-8 */
+	       | ATMEL_TC_CMR_WAVE
+	       | ATMEL_TC_CMR_WAVESEL_UP	/* free-run */
+	       | ATMEL_TC_CMR_ACPA(SET)		/* TIOA rises at 0 */
+	       | ATMEL_TC_CMR_ACPC(CLEAR),	/* (duty cycle 50%) */
+	       tc->base + ATMEL_TC_CMR(tc->channels[0]));
+	writel(0x0000, tc->base + ATMEL_TC_RA(tc->channels[0]));
+	writel(0x8000, tc->base + ATMEL_TC_RC(tc->channels[0]));
+	writel(0xff, tc->base + ATMEL_TC_IDR(tc->channels[0]));	/* no irqs */
+	writel(ATMEL_TC_CCR_CLKEN, tc->base + ATMEL_TC_CCR(tc->channels[0]));
+
+	/* second channel: waveform mode, input TIOA */
+	writel(ATMEL_TC_CMR_XC(tc->channels[1])		/* input: TIOA */
+	       | ATMEL_TC_CMR_WAVE
+	       | ATMEL_TC_CMR_WAVESEL_UP,		/* free-run */
+	       tc->base + ATMEL_TC_CMR(tc->channels[1]));
+	writel(0xff, tc->base + ATMEL_TC_IDR(tc->channels[1]));	/* no irqs */
+	writel(ATMEL_TC_CCR_CLKEN, tc->base + ATMEL_TC_CCR(tc->channels[1]));
+
+	/* chain both channel, we assume the previous channel */
+	regmap_write(tc->regmap, ATMEL_TC_BMR,
+		     ATMEL_TC_BMR_TCXC(1 + tc->channels[1], tc->channels[1]));
+	/* then reset all the timers */
+	regmap_write(tc->regmap, ATMEL_TC_BCR, ATMEL_TC_BCR_SYNC);
+}
+
+static void __init tcb_setup_single_chan(struct atmel_tcb_clksrc *tc,
+					 int mck_divisor_idx)
+{
+	/* channel 0:  waveform mode, input mclk/8 */
+	writel(mck_divisor_idx			/* likely divide-by-8 */
+	       | ATMEL_TC_CMR_WAVE
+	       | ATMEL_TC_CMR_WAVESEL_UP,	/* free-run */
+	       tc->base + ATMEL_TC_CMR(tc->channels[0]));
+	writel(0xff, tc->base + ATMEL_TC_IDR(tc->channels[0]));	/* no irqs */
+	writel(ATMEL_TC_CCR_CLKEN, tc->base + ATMEL_TC_CCR(tc->channels[0]));
+
+	/* then reset all the timers */
+	regmap_write(tc->regmap, ATMEL_TC_BCR, ATMEL_TC_BCR_SYNC);
+}
+
+static void tc_clksrc_suspend(struct clocksource *cs)
+{
+	int i;
+
+	for (i = 0; i < 1 + (tc.bits == 16); i++) {
+		tc.cache[i].cmr = readl(tc.base + ATMEL_TC_CMR(tc.channels[i]));
+		tc.cache[i].imr = readl(tc.base + ATMEL_TC_IMR(tc.channels[i]));
+		tc.cache[i].rc = readl(tc.base + ATMEL_TC_RC(tc.channels[i]));
+		tc.cache[i].clken = !!(readl(tc.base +
+					     ATMEL_TC_SR(tc.channels[i])) &
+				       ATMEL_TC_CLKSTA);
+	}
+
+	if (tc.bits == 16)
+		regmap_read(tc.regmap, ATMEL_TC_BMR, &tc.bmr_cache);
+}
+
+static void tc_clksrc_resume(struct clocksource *cs)
+{
+	int i;
+
+	for (i = 0; i < 1 + (tc.bits == 16); i++) {
+		/* Restore registers for the channel, RA and RB are not used  */
+		writel(tc.cache[i].cmr, tc.base + ATMEL_TC_CMR(tc.channels[i]));
+		writel(tc.cache[i].rc, tc.base + ATMEL_TC_RC(tc.channels[i]));
+		writel(0, tc.base + ATMEL_TC_RA(tc.channels[i]));
+		writel(0, tc.base + ATMEL_TC_RB(tc.channels[i]));
+		/* Disable all the interrupts */
+		writel(0xff, tc.base + ATMEL_TC_IDR(tc.channels[i]));
+		/* Reenable interrupts that were enabled before suspending */
+		writel(tc.cache[i].imr, tc.base + ATMEL_TC_IER(tc.channels[i]));
+
+		/* Start the clock if it was used */
+		if (tc.cache[i].clken)
+			writel(ATMEL_TC_CCR_CLKEN, tc.base +
+			       ATMEL_TC_CCR(tc.channels[i]));
+	}
+
+	/* in case of dual channel, chain channels */
+	if (tc.bits == 16)
+		regmap_write(tc.regmap, ATMEL_TC_BMR, tc.bmr_cache);
+	/* Finally, trigger all the channels*/
+	regmap_write(tc.regmap, ATMEL_TC_BCR, ATMEL_TC_BCR_SYNC);
+}
+
+static int __init tcb_clksrc_register(struct device_node *node,
+				      struct regmap *regmap, void __iomem *base,
+				      int channel, int channel1, int irq,
+				      int bits)
+{
+	u32 rate, divided_rate = 0;
+	int best_divisor_idx = -1;
+	int i, err = -1;
+	u64 (*tc_sched_clock)(void);
+
+	tc.regmap = regmap;
+	tc.base = base;
+	tc.channels[0] = channel;
+	tc.channels[1] = channel1;
+	tc.irq = irq;
+	tc.bits = bits;
+
+	tc.clk[0] = tcb_clk_get(node, tc.channels[0]);
+	if (IS_ERR(tc.clk[0]))
+		return PTR_ERR(tc.clk[0]);
+	err = clk_prepare_enable(tc.clk[0]);
+	if (err) {
+		pr_debug("can't enable T0 clk\n");
+		goto err_clk;
+	}
+
+	/* How fast will we be counting?  Pick something over 5 MHz.  */
+	rate = (u32)clk_get_rate(tc.clk[0]);
+	for (i = 0; i < 5; i++) {
+		unsigned int divisor = atmel_tc_divisors[i];
+		unsigned int tmp;
+
+		if (!divisor)
+			continue;
+
+		tmp = rate / divisor;
+		pr_debug("TC: %u / %-3u [%d] --> %u\n", rate, divisor, i, tmp);
+		if (best_divisor_idx > 0) {
+			if (tmp < 5 * 1000 * 1000)
+				continue;
+		}
+		divided_rate = tmp;
+		best_divisor_idx = i;
+	}
+
+	if (tc.bits == 32) {
+		tc.clksrc.read = tc_get_cycles32;
+		tcb_setup_single_chan(&tc, best_divisor_idx);
+		tc_sched_clock = tc_sched_clock_read32;
+		snprintf(tc.name, sizeof(tc.name), "%s:%d",
+			 kbasename(node->parent->full_name), tc.channels[0]);
+	} else {
+		tc.clk[1] = tcb_clk_get(node, tc.channels[1]);
+		if (IS_ERR(tc.clk[1]))
+			goto err_disable_t0;
+
+		err = clk_prepare_enable(tc.clk[1]);
+		if (err) {
+			pr_debug("can't enable T1 clk\n");
+			goto err_clk1;
+		}
+		tc.clksrc.read = tc_get_cycles,
+		tcb_setup_dual_chan(&tc, best_divisor_idx);
+		tc_sched_clock = tc_sched_clock_read;
+		snprintf(tc.name, sizeof(tc.name), "%s:%d,%d",
+			 kbasename(node->parent->full_name), tc.channels[0],
+			 tc.channels[1]);
+	}
+
+	pr_debug("%s at %d.%03d MHz\n", tc.name,
+		 divided_rate / 1000000,
+		 ((divided_rate + 500000) % 1000000) / 1000);
+
+	tc.clksrc.name = tc.name;
+	tc.clksrc.suspend = tc_clksrc_suspend;
+	tc.clksrc.resume = tc_clksrc_resume;
+	tc.clksrc.rating = 200;
+	tc.clksrc.mask = CLOCKSOURCE_MASK(32);
+	tc.clksrc.flags = CLOCK_SOURCE_IS_CONTINUOUS;
+
+	err = clocksource_register_hz(&tc.clksrc, divided_rate);
+	if (err)
+		goto err_disable_t1;
+
+	sched_clock_register(tc_sched_clock, 32, divided_rate);
+
+	tc.registered = true;
+
+	/* Set up and register clockevents */
+	tc.clkevt.name = tc.name;
+	tc.clkevt.cpumask = cpumask_of(0);
+	tc.clkevt.set_next_event = tcb_clkevt_next_event;
+	tc.clkevt.set_state_oneshot = tcb_clkevt_oneshot;
+	tc.clkevt.set_state_shutdown = tcb_clkevt_shutdown;
+	tc.clkevt.features = CLOCK_EVT_FEAT_ONESHOT;
+	tc.clkevt.rating = 125;
+
+	clockevents_config_and_register(&tc.clkevt, divided_rate, 1,
+					BIT(tc.bits) - 1);
+
+	return 0;
+
+err_disable_t1:
+	if (tc.bits == 16)
+		clk_disable_unprepare(tc.clk[1]);
+
+err_clk1:
+	if (tc.bits == 16)
+		clk_put(tc.clk[1]);
+
+err_disable_t0:
+	clk_disable_unprepare(tc.clk[0]);
+
+err_clk:
+	clk_put(tc.clk[0]);
+
+	pr_err("%s: unable to register clocksource/clockevent\n",
+	       tc.clksrc.name);
+
+	return err;
+}
+
+static int __init tcb_clksrc_init(struct device_node *node)
+{
+	const struct of_device_id *match;
+	struct regmap *regmap;
+	void __iomem *tcb_base;
+	u32 channel;
+	int irq, err, chan1 = -1;
+	unsigned bits;
+
+	if (tc.registered && tce.registered)
+		return -ENODEV;
+
+	/*
+	 * The regmap has to be used to access registers that are shared
+	 * between channels on the same TCB but we keep direct IO access for
+	 * the counters to avoid the impact on performance
+	 */
+	regmap = syscon_node_to_regmap(node->parent);
+	if (IS_ERR(regmap))
+		return PTR_ERR(regmap);
+
+	tcb_base = of_iomap(node->parent, 0);
+	if (!tcb_base) {
+		pr_err("%s +%d %s\n", __FILE__, __LINE__, __func__);
+		return -ENXIO;
+	}
+
+	match = of_match_node(atmel_tcb_dt_ids, node->parent);
+	bits = (uintptr_t)match->data;
+
+	err = of_property_read_u32_index(node, "reg", 0, &channel);
+	if (err)
+		return err;
+
+	irq = of_irq_get(node->parent, channel);
+	if (irq < 0) {
+		irq = of_irq_get(node->parent, 0);
+		if (irq < 0)
+			return irq;
+	}
+
+	if (tc.registered)
+		return tc_clkevt_register(node, regmap, tcb_base, channel, irq,
+					  bits);
+
+	if (bits == 16) {
+		of_property_read_u32_index(node, "reg", 1, &chan1);
+		if (chan1 == -1) {
+			if (tce.registered) {
+				pr_err("%s: clocksource needs two channels\n",
+				       node->parent->full_name);
+				return -EINVAL;
+			} else {
+				return tc_clkevt_register(node, regmap,
+							  tcb_base, channel,
+							  irq, bits);
+			}
+		}
+	}
+
+	return tcb_clksrc_register(node, regmap, tcb_base, channel, chan1, irq,
+				   bits);
+}
+TIMER_OF_DECLARE(atmel_tcb_clksrc, "atmel,tcb-timer", tcb_clksrc_init);
diff --git a/kernel/drivers/connector/cn_proc.c b/kernel/drivers/connector/cn_proc.c
index ad48fd5..c5264b3 100644
--- a/kernel/drivers/connector/cn_proc.c
+++ b/kernel/drivers/connector/cn_proc.c
@@ -32,6 +32,7 @@
 #include <linux/pid_namespace.h>
 
 #include <linux/cn_proc.h>
+#include <linux/locallock.h>
 
 /*
  * Size of a cn_msg followed by a proc_event structure.  Since the
@@ -54,10 +55,11 @@
 
 /* proc_event_counts is used as the sequence number of the netlink message */
 static DEFINE_PER_CPU(__u32, proc_event_counts) = { 0 };
+static DEFINE_LOCAL_IRQ_LOCK(send_msg_lock);
 
 static inline void send_msg(struct cn_msg *msg)
 {
-	preempt_disable();
+	local_lock(send_msg_lock);
 
 	msg->seq = __this_cpu_inc_return(proc_event_counts) - 1;
 	((struct proc_event *)msg->data)->cpu = smp_processor_id();
@@ -70,7 +72,7 @@
 	 */
 	cn_netlink_send(msg, 0, CN_IDX_PROC, GFP_NOWAIT);
 
-	preempt_enable();
+	local_unlock(send_msg_lock);
 }
 
 void proc_fork_connector(struct task_struct *task)
diff --git a/kernel/drivers/cpufreq/Kconfig.x86 b/kernel/drivers/cpufreq/Kconfig.x86
index 35f7182..bb4a616 100644
--- a/kernel/drivers/cpufreq/Kconfig.x86
+++ b/kernel/drivers/cpufreq/Kconfig.x86
@@ -125,7 +125,7 @@
 
 config X86_POWERNOW_K8
 	tristate "AMD Opteron/Athlon64 PowerNow!"
-	depends on ACPI && ACPI_PROCESSOR && X86_ACPI_CPUFREQ
+	depends on ACPI && ACPI_PROCESSOR && X86_ACPI_CPUFREQ && !PREEMPT_RT_BASE
 	help
 	  This adds the CPUFreq driver for K8/early Opteron/Athlon64 processors.
 	  Support for K10 and newer processors is now in acpi-cpufreq.
diff --git a/kernel/drivers/cpufreq/cpufreq_interactive.c b/kernel/drivers/cpufreq/cpufreq_interactive.c
index 06f7679..d9c8c7d 100644
--- a/kernel/drivers/cpufreq/cpufreq_interactive.c
+++ b/kernel/drivers/cpufreq/cpufreq_interactive.c
@@ -37,6 +37,7 @@
 #include <linux/slab.h>
 #include <uapi/linux/sched/types.h>
 #include <linux/sched/clock.h>
+#include <soc/rockchip/rockchip_system_monitor.h>
 
 #define CREATE_TRACE_POINTS
 #include <trace/events/cpufreq_interactive.h>
@@ -100,6 +101,7 @@
 	int touchboostpulse_duration_val;
 	/* End time of touchboost pulse in ktime converted to usecs */
 	u64 touchboostpulse_endtime;
+	bool touchboost, is_touchboosted;
 #endif
 	bool boosted;
 
@@ -520,7 +522,8 @@
 			sampling_rate = icpu->ipolicy->tunables->sampling_rate;
 			icpu->last_sample_time = local_clock();
 			icpu->next_sample_jiffies = usecs_to_jiffies(sampling_rate) + jiffies;
-			cpufreq_interactive_update(icpu);
+			icpu->work_in_progress = true;
+			irq_work_queue_on(&icpu->irq_work, icpu->cpu);
 		}
 	}
 
@@ -606,7 +609,44 @@
 	for_each_cpu(cpu, &tmp_mask) {
 		struct interactive_cpu *icpu = &per_cpu(interactive_cpu, cpu);
 		struct cpufreq_policy *policy;
+#ifdef CONFIG_ARCH_ROCKCHIP
+		struct interactive_tunables *tunables;
+		bool update_policy = false;
+		u64 now;
 
+		now = ktime_to_us(ktime_get());
+		if (!down_read_trylock(&icpu->enable_sem))
+			continue;
+
+		if (!icpu->ipolicy) {
+			up_read(&icpu->enable_sem);
+			continue;
+		}
+
+		tunables = icpu->ipolicy->tunables;
+		if (!tunables) {
+			up_read(&icpu->enable_sem);
+			continue;
+		}
+
+		if (tunables->touchboost &&
+		    now > tunables->touchboostpulse_endtime) {
+			tunables->touchboost = false;
+			rockchip_monitor_clear_boosted();
+			update_policy = true;
+		}
+
+		if (!tunables->is_touchboosted && tunables->touchboost) {
+			rockchip_monitor_set_boosted();
+			update_policy = true;
+		}
+
+		tunables->is_touchboosted = tunables->touchboost;
+
+		up_read(&icpu->enable_sem);
+		if (update_policy)
+			cpufreq_update_policy(cpu);
+#endif
 		policy = cpufreq_cpu_get(cpu);
 		if (!policy)
 			continue;
@@ -1012,6 +1052,44 @@
 	return count;
 }
 
+static ssize_t store_touchboost_freq(struct gov_attr_set *attr_set,
+				     const char *buf, size_t count)
+{
+	struct interactive_tunables *tunables = to_tunables(attr_set);
+	unsigned long val;
+	int ret;
+
+	ret = kstrtoul(buf, 0, &val);
+	if (ret < 0)
+		return ret;
+
+	tunables->touchboost_freq = val;
+
+	return count;
+}
+
+static ssize_t show_touchboost_duration(struct gov_attr_set *attr_set, char *buf)
+{
+	struct interactive_tunables *tunables = to_tunables(attr_set);
+
+	return sprintf(buf, "%d\n", tunables->touchboostpulse_duration_val);
+}
+
+static ssize_t store_touchboost_duration(struct gov_attr_set *attr_set,
+					 const char *buf, size_t count)
+{
+	struct interactive_tunables *tunables = to_tunables(attr_set);
+	int val, ret;
+
+	ret = kstrtoint(buf, 0, &val);
+	if (ret < 0)
+		return ret;
+
+	tunables->touchboostpulse_duration_val = val;
+
+	return count;
+}
+
 show_one(hispeed_freq, "%u");
 show_one(go_hispeed_load, "%lu");
 show_one(min_sample_time, "%lu");
@@ -1019,6 +1097,7 @@
 show_one(boost, "%u");
 show_one(boostpulse_duration, "%u");
 show_one(io_is_busy, "%u");
+show_one(touchboost_freq, "%lu");
 
 gov_attr_rw(target_loads);
 gov_attr_rw(above_hispeed_delay);
@@ -1031,6 +1110,8 @@
 gov_attr_wo(boostpulse);
 gov_attr_rw(boostpulse_duration);
 gov_attr_rw(io_is_busy);
+gov_attr_rw(touchboost_freq);
+gov_attr_rw(touchboost_duration);
 
 static struct attribute *interactive_attributes[] = {
 	&target_loads.attr,
@@ -1044,6 +1125,8 @@
 	&boostpulse.attr,
 	&boostpulse_duration.attr,
 	&io_is_busy.attr,
+	&touchboost_freq.attr,
+	&touchboost_duration.attr,
 	NULL
 };
 
@@ -1245,6 +1328,7 @@
 			cpumask_set_cpu(i, &speedchange_cpumask);
 			pcpu->loc_hispeed_val_time =
 					ktime_to_us(ktime_get());
+			tunables->touchboost = true;
 			anyboost = 1;
 		}
 
@@ -1555,6 +1639,10 @@
 		idle_notifier_unregister(&cpufreq_interactive_idle_nb);
 #ifdef CONFIG_ARCH_ROCKCHIP
 		input_unregister_handler(&cpufreq_interactive_input_handler);
+		if (tunables->touchboost) {
+			tunables->touchboost = false;
+			rockchip_monitor_clear_boosted();
+		}
 #endif
 	}
 
diff --git a/kernel/drivers/crypto/caam/qi.c b/kernel/drivers/crypto/caam/qi.c
index 67f7f8c..b84e6c8 100644
--- a/kernel/drivers/crypto/caam/qi.c
+++ b/kernel/drivers/crypto/caam/qi.c
@@ -84,13 +84,6 @@
 #endif
 
 /*
- * CPU from where the module initialised. This is required because QMan driver
- * requires CGRs to be removed from same CPU from where they were originally
- * allocated.
- */
-static int mod_init_cpu;
-
-/*
  * This is a a cache of buffers, from which the users of CAAM QI driver
  * can allocate short (CAAM_QI_MEMCACHE_SIZE) buffers. It's faster than
  * doing malloc on the hotpath.
@@ -492,12 +485,11 @@
 }
 EXPORT_SYMBOL(caam_drv_ctx_rel);
 
-int caam_qi_shutdown(struct device *qidev)
+void caam_qi_shutdown(struct device *qidev)
 {
-	int i, ret;
+	int i;
 	struct caam_qi_priv *priv = dev_get_drvdata(qidev);
 	const cpumask_t *cpus = qman_affine_cpus();
-	struct cpumask old_cpumask = current->cpus_allowed;
 
 	for_each_cpu(i, cpus) {
 		struct napi_struct *irqtask;
@@ -510,26 +502,12 @@
 			dev_err(qidev, "Rsp FQ kill failed, cpu: %d\n", i);
 	}
 
-	/*
-	 * QMan driver requires CGRs to be deleted from same CPU from where they
-	 * were instantiated. Hence we get the module removal execute from the
-	 * same CPU from where it was originally inserted.
-	 */
-	set_cpus_allowed_ptr(current, get_cpu_mask(mod_init_cpu));
-
-	ret = qman_delete_cgr(&priv->cgr);
-	if (ret)
-		dev_err(qidev, "Deletion of CGR failed: %d\n", ret);
-	else
-		qman_release_cgrid(priv->cgr.cgrid);
+	qman_delete_cgr_safe(&priv->cgr);
+	qman_release_cgrid(priv->cgr.cgrid);
 
 	kmem_cache_destroy(qi_cache);
 
-	/* Now that we're done with the CGRs, restore the cpus allowed mask */
-	set_cpus_allowed_ptr(current, &old_cpumask);
-
 	platform_device_unregister(priv->qi_pdev);
-	return ret;
 }
 
 static void cgr_cb(struct qman_portal *qm, struct qman_cgr *cgr, int congested)
@@ -718,21 +696,10 @@
 	struct device *ctrldev = &caam_pdev->dev, *qidev;
 	struct caam_drv_private *ctrlpriv;
 	const cpumask_t *cpus = qman_affine_cpus();
-	struct cpumask old_cpumask = current->cpus_allowed;
 	static struct platform_device_info qi_pdev_info = {
 		.name = "caam_qi",
 		.id = PLATFORM_DEVID_NONE
 	};
-
-	/*
-	 * QMAN requires CGRs to be removed from same CPU+portal from where it
-	 * was originally allocated. Hence we need to note down the
-	 * initialisation CPU and use the same CPU for module exit.
-	 * We select the first CPU to from the list of portal owning CPUs.
-	 * Then we pin module init to this CPU.
-	 */
-	mod_init_cpu = cpumask_first(cpus);
-	set_cpus_allowed_ptr(current, get_cpu_mask(mod_init_cpu));
 
 	qi_pdev_info.parent = ctrldev;
 	qi_pdev_info.dma_mask = dma_get_mask(ctrldev);
@@ -795,8 +762,6 @@
 		return -ENOMEM;
 	}
 
-	/* Done with the CGRs; restore the cpus allowed mask */
-	set_cpus_allowed_ptr(current, &old_cpumask);
 #ifdef CONFIG_DEBUG_FS
 	debugfs_create_file("qi_congested", 0444, ctrlpriv->ctl,
 			    &times_congested, &caam_fops_u64_ro);
diff --git a/kernel/drivers/crypto/caam/qi.h b/kernel/drivers/crypto/caam/qi.h
index 357b69f..b6c8acc 100644
--- a/kernel/drivers/crypto/caam/qi.h
+++ b/kernel/drivers/crypto/caam/qi.h
@@ -174,7 +174,7 @@
 void caam_drv_ctx_rel(struct caam_drv_ctx *drv_ctx);
 
 int caam_qi_init(struct platform_device *pdev);
-int caam_qi_shutdown(struct device *dev);
+void caam_qi_shutdown(struct device *dev);
 
 /**
  * qi_cache_alloc - Allocate buffers from CAAM-QI cache
diff --git a/kernel/drivers/crypto/rockchip/Kconfig b/kernel/drivers/crypto/rockchip/Kconfig
index a25fbb0..b7402e8 100644
--- a/kernel/drivers/crypto/rockchip/Kconfig
+++ b/kernel/drivers/crypto/rockchip/Kconfig
@@ -10,8 +10,8 @@
 	default y if CPU_RV1126 || CPU_RK1808 || CPU_RK3308 || CPU_PX30 || CPU_RK3568 || CPU_RK3588
 
 config CRYPTO_DEV_ROCKCHIP_V3
-	bool "crypto v3 for RV1106"
-	default y if CPU_RV1106
+	bool "crypto v3/v4 for RV1106/RK3528/RK3562"
+	default y if CPU_RV1106 || CPU_RK3528 || CPU_RK3562
 
 endif
 
diff --git a/kernel/drivers/crypto/rockchip/rk_crypto_ahash_utils.c b/kernel/drivers/crypto/rockchip/rk_crypto_ahash_utils.c
index 4e6cc9a..495c554 100644
--- a/kernel/drivers/crypto/rockchip/rk_crypto_ahash_utils.c
+++ b/kernel/drivers/crypto/rockchip/rk_crypto_ahash_utils.c
@@ -286,7 +286,6 @@
 	struct crypto_ahash *tfm = crypto_ahash_reqtfm(req);
 	struct rk_crypto_algt *algt = rk_ahash_get_algt(tfm);
 	struct scatterlist *src_sg;
-	unsigned long flags;
 	unsigned int nbytes;
 	int ret = 0;
 
@@ -378,14 +377,12 @@
 		     ctx->hash_tmp_len, ctx->lastc_len, nbytes);
 
 	if (nbytes) {
-		spin_lock_irqsave(&rk_dev->lock, flags);
 		if (ctx->calc_cnt == 0)
 			alg_ctx->ops.hw_init(rk_dev, algt->algo, algt->type);
 
 		/* flush all 64byte key buffer for hmac */
 		alg_ctx->ops.hw_write_key(ctx->rk_dev, ctx->authkey, sizeof(ctx->authkey));
 		ret = rk_ahash_set_data_start(rk_dev, rctx->flag);
-		spin_unlock_irqrestore(&rk_dev->lock, flags);
 	}
 exit:
 	return ret;
diff --git a/kernel/drivers/crypto/rockchip/rk_crypto_core.c b/kernel/drivers/crypto/rockchip/rk_crypto_core.c
index f25d722..56a50d5 100644
--- a/kernel/drivers/crypto/rockchip/rk_crypto_core.c
+++ b/kernel/drivers/crypto/rockchip/rk_crypto_core.c
@@ -281,9 +281,11 @@
 static irqreturn_t rk_crypto_irq_handle(int irq, void *dev_id)
 {
 	struct rk_crypto_dev *rk_dev  = platform_get_drvdata(dev_id);
-	struct rk_alg_ctx *alg_ctx = rk_alg_ctx_cast(rk_dev->async_req);
+	struct rk_alg_ctx *alg_ctx;
 
 	spin_lock(&rk_dev->lock);
+
+	alg_ctx = rk_alg_ctx_cast(rk_dev->async_req);
 
 	rk_dev->stat.irq_cnt++;
 
@@ -390,23 +392,22 @@
 	struct crypto_async_request *async_req, *backlog;
 	unsigned long flags;
 
+	spin_lock_irqsave(&rk_dev->lock, flags);
 	if (rk_dev->async_req) {
 		dev_err(rk_dev->dev, "%s: Unexpected crypto paths.\n", __func__);
-		return;
+		goto exit;
 	}
 
 	rk_dev->err = 0;
-	spin_lock_irqsave(&rk_dev->lock, flags);
+
 	backlog   = crypto_get_backlog(&rk_dev->queue);
 	async_req = crypto_dequeue_request(&rk_dev->queue);
 
 	if (!async_req) {
 		rk_dev->busy = false;
-		spin_unlock_irqrestore(&rk_dev->lock, flags);
-		return;
+		goto exit;
 	}
 	rk_dev->stat.dequeue_cnt++;
-	spin_unlock_irqrestore(&rk_dev->lock, flags);
 
 	if (backlog) {
 		backlog->complete(backlog, -EINPROGRESS);
@@ -417,12 +418,26 @@
 	rk_dev->err = rk_start_op(rk_dev);
 	if (rk_dev->err)
 		rk_complete_op(rk_dev, rk_dev->err);
+
+exit:
+	spin_unlock_irqrestore(&rk_dev->lock, flags);
 }
 
 static void rk_crypto_done_task_cb(unsigned long data)
 {
 	struct rk_crypto_dev *rk_dev = (struct rk_crypto_dev *)data;
-	struct rk_alg_ctx *alg_ctx = rk_alg_ctx_cast(rk_dev->async_req);
+	struct rk_alg_ctx *alg_ctx;
+	unsigned long flags;
+
+	spin_lock_irqsave(&rk_dev->lock, flags);
+
+	if (!rk_dev->async_req) {
+		dev_err(rk_dev->dev, "done task receive invalid async_req\n");
+		spin_unlock_irqrestore(&rk_dev->lock, flags);
+		return;
+	}
+
+	alg_ctx = rk_alg_ctx_cast(rk_dev->async_req);
 
 	rk_dev->stat.done_cnt++;
 
@@ -440,9 +455,12 @@
 	if (rk_dev->err)
 		goto exit;
 
+	spin_unlock_irqrestore(&rk_dev->lock, flags);
+
 	return;
 exit:
 	rk_complete_op(rk_dev, rk_dev->err);
+	spin_unlock_irqrestore(&rk_dev->lock, flags);
 }
 
 static struct rk_crypto_algt *rk_crypto_find_algs(struct rk_crypto_dev *rk_dev,
@@ -663,6 +681,12 @@
 static const struct of_device_id crypto_of_id_table[] = {
 
 #if IS_ENABLED(CONFIG_CRYPTO_DEV_ROCKCHIP_V3)
+	/* crypto v4 in belows same with crypto-v3*/
+	{
+		.compatible = "rockchip,crypto-v4",
+		.data = (void *)&cryto_v3_soc_data,
+	},
+
 	/* crypto v3 in belows */
 	{
 		.compatible = "rockchip,crypto-v3",
diff --git a/kernel/drivers/crypto/rockchip/rk_crypto_skcipher_utils.c b/kernel/drivers/crypto/rockchip/rk_crypto_skcipher_utils.c
index dff8cc1..eb6a8ac 100644
--- a/kernel/drivers/crypto/rockchip/rk_crypto_skcipher_utils.c
+++ b/kernel/drivers/crypto/rockchip/rk_crypto_skcipher_utils.c
@@ -331,7 +331,6 @@
 	struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req);
 	struct rk_crypto_algt *algt = rk_cipher_get_algt(tfm);
 	struct rk_alg_ctx *alg_ctx = rk_cipher_alg_ctx(rk_dev);
-	unsigned long flags;
 	int err = 0;
 
 	alg_ctx->left_bytes = req->cryptlen;
@@ -345,10 +344,9 @@
 
 	CRYPTO_TRACE("total = %u", alg_ctx->total);
 
-	spin_lock_irqsave(&rk_dev->lock, flags);
 	alg_ctx->ops.hw_init(rk_dev, algt->algo, algt->mode);
 	err = rk_set_data_start(rk_dev);
-	spin_unlock_irqrestore(&rk_dev->lock, flags);
+
 	return err;
 }
 
@@ -443,7 +441,6 @@
 	struct rk_crypto_algt *algt = rk_aead_get_algt(tfm);
 	struct rk_alg_ctx *alg_ctx = rk_cipher_alg_ctx(rk_dev);
 	unsigned int total = 0, authsize;
-	unsigned long flags;
 	int err = 0;
 
 	total = req->cryptlen + req->assoclen;
@@ -464,10 +461,9 @@
 	CRYPTO_TRACE("is_enc = %d, authsize = %u, cryptlen = %u, total = %u, assoclen = %u",
 		     ctx->is_enc, authsize, req->cryptlen, alg_ctx->total, alg_ctx->assoclen);
 
-	spin_lock_irqsave(&rk_dev->lock, flags);
 	alg_ctx->ops.hw_init(rk_dev, algt->algo, algt->mode);
 	err = rk_set_data_start(rk_dev);
-	spin_unlock_irqrestore(&rk_dev->lock, flags);
+
 	return err;
 }
 
diff --git a/kernel/drivers/crypto/rockchip/rk_crypto_v1_skcipher.c b/kernel/drivers/crypto/rockchip/rk_crypto_v1_skcipher.c
index a4c4a9a..0cd270f 100644
--- a/kernel/drivers/crypto/rockchip/rk_crypto_v1_skcipher.c
+++ b/kernel/drivers/crypto/rockchip/rk_crypto_v1_skcipher.c
@@ -269,7 +269,6 @@
 	struct skcipher_request *req =
 		skcipher_request_cast(rk_dev->async_req);
 	struct rk_alg_ctx *alg_ctx = rk_alg_ctx_cast(rk_dev);
-	unsigned long flags;
 	int err = 0;
 
 	alg_ctx->left_bytes = req->cryptlen;
@@ -281,10 +280,9 @@
 	alg_ctx->req_dst    = req->dst;
 	alg_ctx->dst_nents  = sg_nents_for_len(req->dst, req->cryptlen);
 
-	spin_lock_irqsave(&rk_dev->lock, flags);
 	rk_ablk_hw_init(rk_dev);
 	err = rk_set_data_start(rk_dev);
-	spin_unlock_irqrestore(&rk_dev->lock, flags);
+
 	return err;
 }
 
diff --git a/kernel/drivers/crypto/rockchip/rk_crypto_v2_akcipher.c b/kernel/drivers/crypto/rockchip/rk_crypto_v2_akcipher.c
index fa92b07..397c62f 100644
--- a/kernel/drivers/crypto/rockchip/rk_crypto_v2_akcipher.c
+++ b/kernel/drivers/crypto/rockchip/rk_crypto_v2_akcipher.c
@@ -160,7 +160,7 @@
 		goto exit;
 
 	out = rk_bn_alloc(key_byte_size);
-	if (!in)
+	if (!out)
 		goto exit;
 
 	tmp_buf = kzalloc(key_byte_size, GFP_KERNEL);
diff --git a/kernel/drivers/devfreq/event/rockchip-dfi.c b/kernel/drivers/devfreq/event/rockchip-dfi.c
index a5ccecb..d407f45 100644
--- a/kernel/drivers/devfreq/event/rockchip-dfi.c
+++ b/kernel/drivers/devfreq/event/rockchip-dfi.c
@@ -56,6 +56,10 @@
 #define RK3368_DFI_EN			(0x30003 << 5)
 #define RK3368_DFI_DIS			(0x30000 << 5)
 
+#define RK3528_PMUGRF_OFFSET		0x70000
+#define RK3528_PMUGRF_OS_REG18		0x248
+#define RK3528_PMUGRF_OS_REG19		0x24c
+
 #define MAX_DMC_NUM_CH			2
 #define READ_DRAMTYPE_INFO(n)		(((n) >> 13) & 0x7)
 #define READ_CH_INFO(n)			(((n) >> 28) & 0x3)
@@ -111,6 +115,7 @@
 	struct regmap *regmap_pmugrf;
 	struct clk *clk;
 	u32 dram_type;
+	u32 count_rate;
 	/*
 	 * available mask, 1: available, 0: not available
 	 * each bit represent a channel
@@ -377,8 +382,12 @@
 	u32 tmp, max = 0;
 	u32 i, busier_ch = 0;
 	void __iomem *dfi_regs = info->regs;
+	u32 count_rate = 1;
 
 	rockchip_dfi_stop_hardware_counter(edev);
+
+	if (info->count_rate)
+		count_rate = info->count_rate;
 
 	/* Find out which channel is busier */
 	for (i = 0; i < MAX_DMC_NUM_CH; i++) {
@@ -386,7 +395,7 @@
 			continue;
 
 		info->ch_usage[i].total = readl_relaxed(dfi_regs +
-				DDRMON_CH0_COUNT_NUM + i * 20);
+				DDRMON_CH0_COUNT_NUM + i * 20) * count_rate;
 
 		/* LPDDR4 and LPDDR4X BL = 16,other DDR type BL = 8 */
 		tmp = readl_relaxed(dfi_regs +
@@ -639,6 +648,41 @@
 	return 0;
 }
 
+static __maybe_unused __init int rk3528_dfi_init(struct platform_device *pdev,
+						 struct rockchip_dfi *data,
+						 struct devfreq_event_desc *desc)
+{
+	struct device_node *np = pdev->dev.of_node, *node;
+	struct resource *res;
+	u32 val_18, val_19;
+
+	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+	data->regs = devm_ioremap_resource(&pdev->dev, res);
+	if (IS_ERR(data->regs))
+		return PTR_ERR(data->regs);
+
+	node = of_parse_phandle(np, "rockchip,grf", 0);
+	if (node) {
+		data->regmap_grf = syscon_node_to_regmap(node);
+		if (IS_ERR(data->regmap_grf))
+			return PTR_ERR(data->regmap_grf);
+	}
+
+	regmap_read(data->regmap_grf, RK3528_PMUGRF_OFFSET + RK3528_PMUGRF_OS_REG18, &val_18);
+	regmap_read(data->regmap_grf, RK3528_PMUGRF_OFFSET + RK3528_PMUGRF_OS_REG19, &val_19);
+	if (READ_SYSREG_VERSION(val_19) >= 0x3)
+		data->dram_type = READ_DRAMTYPE_INFO_V3(val_18, val_19);
+	else
+		data->dram_type = READ_DRAMTYPE_INFO(val_18);
+	data->count_rate = 2;
+	data->ch_msk = 1;
+	data->clk = NULL;
+
+	desc->ops = &rockchip_dfi_ops;
+
+	return 0;
+}
+
 static const struct of_device_id rockchip_dfi_id_match[] = {
 #ifdef CONFIG_CPU_PX30
 	{ .compatible = "rockchip,px30-dfi", .data = px30_dfi_init },
@@ -661,6 +705,9 @@
 #ifdef CONFIG_CPU_RK3399
 	{ .compatible = "rockchip,rk3399-dfi", .data = rockchip_dfi_init },
 #endif
+#ifdef CONFIG_CPU_RK3528
+	{ .compatible = "rockchip,rk3528-dfi", .data = rk3528_dfi_init },
+#endif
 #ifdef CONFIG_CPU_RK3568
 	{ .compatible = "rockchip,rk3568-dfi", .data = px30_dfi_init },
 #endif
diff --git a/kernel/drivers/devfreq/rockchip_bus.c b/kernel/drivers/devfreq/rockchip_bus.c
index 4d4206e..8409ce3 100644
--- a/kernel/drivers/devfreq/rockchip_bus.c
+++ b/kernel/drivers/devfreq/rockchip_bus.c
@@ -447,6 +447,7 @@
 	{ .compatible = "rockchip,rk3288-bus", },
 	{ .compatible = "rockchip,rk3368-bus", },
 	{ .compatible = "rockchip,rk3399-bus", },
+	{ .compatible = "rockchip,rk3528-bus", },
 	{ .compatible = "rockchip,rk3568-bus", },
 	{ .compatible = "rockchip,rv1126-bus", },
 	{ },
diff --git a/kernel/drivers/devfreq/rockchip_dmc.c b/kernel/drivers/devfreq/rockchip_dmc.c
index d75c21e..d9a9dca 100644
--- a/kernel/drivers/devfreq/rockchip_dmc.c
+++ b/kernel/drivers/devfreq/rockchip_dmc.c
@@ -156,6 +156,7 @@
 	unsigned long video_1080p_rate;
 	unsigned long video_4k_rate;
 	unsigned long video_4k_10b_rate;
+	unsigned long video_4k_60p_rate;
 	unsigned long performance_rate;
 	unsigned long hdmi_rate;
 	unsigned long idle_rate;
@@ -1765,6 +1766,79 @@
 	return 0;
 }
 
+static __maybe_unused int rk3528_dmc_init(struct platform_device *pdev,
+					  struct rockchip_dmcfreq *dmcfreq)
+{
+	struct arm_smccc_res res;
+	int ret;
+	int complt_irq;
+	u32 complt_hwirq;
+	struct irq_data *complt_irq_data;
+
+	res = sip_smc_dram(0, 0, ROCKCHIP_SIP_CONFIG_DRAM_GET_VERSION);
+	dev_notice(&pdev->dev, "current ATF version 0x%lx\n", res.a1);
+	if (res.a0 || res.a1 < 0x100) {
+		dev_err(&pdev->dev, "trusted firmware need update to V1.00 and above.\n");
+		return -ENXIO;
+	}
+
+	/*
+	 * first 4KB is used for interface parameters
+	 * after 4KB is dts parameters
+	 * request share memory size 4KB * 2
+	 */
+	res = sip_smc_request_share_mem(2, SHARE_PAGE_TYPE_DDR);
+	if (res.a0 != 0) {
+		dev_err(&pdev->dev, "no ATF memory for init\n");
+		return -ENOMEM;
+	}
+	ddr_psci_param = (struct share_params *)res.a1;
+	/* Clear ddr_psci_param, size is 4KB * 2 */
+	memset_io(ddr_psci_param, 0x0, 4096 * 2);
+
+	wait_ctrl.dcf_en = 0;
+
+	init_waitqueue_head(&wait_ctrl.wait_wq);
+	wait_ctrl.wait_en = 1;
+	wait_ctrl.wait_time_out_ms = 17 * 5;
+
+	complt_irq = platform_get_irq_byname(pdev, "complete");
+	if (complt_irq < 0) {
+		dev_err(&pdev->dev, "no IRQ for complt_irq: %d\n", complt_irq);
+		return complt_irq;
+	}
+	wait_ctrl.complt_irq = complt_irq;
+
+	ret = devm_request_irq(&pdev->dev, complt_irq, wait_dcf_complete_irq,
+			       0, dev_name(&pdev->dev), &wait_ctrl);
+	if (ret < 0) {
+		dev_err(&pdev->dev, "cannot request complt_irq\n");
+		return ret;
+	}
+	disable_irq(complt_irq);
+
+	complt_irq_data = irq_get_irq_data(complt_irq);
+	complt_hwirq = irqd_to_hwirq(complt_irq_data);
+	ddr_psci_param->complt_hwirq = complt_hwirq;
+
+	res = sip_smc_dram(SHARE_PAGE_TYPE_DDR, 0, ROCKCHIP_SIP_CONFIG_DRAM_INIT);
+	if (res.a0) {
+		dev_err(&pdev->dev, "rockchip_sip_config_dram_init error:%lx\n", res.a0);
+		return -ENOMEM;
+	}
+
+	ret = rockchip_get_freq_info(dmcfreq);
+	if (ret < 0) {
+		dev_err(&pdev->dev, "cannot get frequency info\n");
+		return ret;
+	}
+	dmcfreq->is_set_rate_direct = true;
+
+	dmcfreq->set_auto_self_refresh = rockchip_ddr_set_auto_self_refresh;
+
+	return 0;
+}
+
 static __maybe_unused int rk3568_dmc_init(struct platform_device *pdev,
 					  struct rockchip_dmcfreq *dmcfreq)
 {
@@ -1945,6 +2019,9 @@
 #endif
 #ifdef CONFIG_CPU_RK3399
 	{ .compatible = "rockchip,rk3399-dmc", .data = rk3399_dmc_init },
+#endif
+#ifdef CONFIG_CPU_RK3528
+	{ .compatible = "rockchip,rk3528-dmc", .data = rk3528_dmc_init },
 #endif
 #ifdef CONFIG_CPU_RK3568
 	{ .compatible = "rockchip,rk3568-dmc", .data = rk3568_dmc_init },
@@ -2222,6 +2299,11 @@
 			dev_info(dmcfreq->dev, "video_4k_10b_rate = %ld\n",
 				 dmcfreq->video_4k_10b_rate);
 			break;
+		case SYS_STATUS_VIDEO_4K_60P:
+			dmcfreq->video_4k_60p_rate = rockchip_freq_level_2_rate(dmcfreq, level);
+			dev_info(dmcfreq->dev, "video_4k_60p_rate = %ld\n",
+				 dmcfreq->video_4k_60p_rate);
+			break;
 		case SYS_STATUS_PERFORMANCE:
 			dmcfreq->performance_rate = rockchip_freq_level_2_rate(dmcfreq, level);
 			dev_info(dmcfreq->dev, "performance_rate = %ld\n",
@@ -2337,6 +2419,11 @@
 	if (dmcfreq->video_4k_10b_rate && (status & SYS_STATUS_VIDEO_4K_10B)) {
 		if (dmcfreq->video_4k_10b_rate > target_rate)
 			target_rate = dmcfreq->video_4k_10b_rate;
+	}
+
+	if (dmcfreq->video_4k_60p_rate && (status & SYS_STATUS_VIDEO_4K_60P)) {
+		if (dmcfreq->video_4k_60p_rate > target_rate)
+			target_rate = dmcfreq->video_4k_60p_rate;
 	}
 
 	if (dmcfreq->video_1080p_rate && (status & SYS_STATUS_VIDEO_1080P)) {
@@ -2978,8 +3065,16 @@
 	return 0;
 }
 
+static int rockchip_dmcfreq_low_temp_adjust_volt(struct monitor_dev_info *mdev_info)
+{
+	struct rockchip_dmcfreq *dmcfreq = dev_get_drvdata(mdev_info->dev);
+
+	return rockchip_dmcfreq_set_volt_only(dmcfreq);
+}
+
 static struct monitor_dev_profile dmc_mdevp = {
 	.type = MONITOR_TPYE_DEV,
+	.low_temp_adjust_volt = rockchip_dmcfreq_low_temp_adjust_volt,
 	.low_temp_adjust = rockchip_monitor_dev_low_temp_adjust,
 	.high_temp_adjust = rockchip_monitor_dev_high_temp_adjust,
 };
@@ -2988,14 +3083,15 @@
 {
 	int ret;
 
-	if (vop_register_dmc())
-		dev_err(dmcfreq->dev, "fail to register notify to vop.\n");
+	if (dmcfreq->system_status_en || dmcfreq->auto_freq_en) {
+		if (vop_register_dmc())
+			dev_err(dmcfreq->dev, "fail to register notify to vop.\n");
 
-	dmcfreq->status_nb.notifier_call =
-		rockchip_dmcfreq_system_status_notifier;
-	ret = rockchip_register_system_status_notifier(&dmcfreq->status_nb);
-	if (ret)
-		dev_err(dmcfreq->dev, "failed to register system_status nb\n");
+		dmcfreq->status_nb.notifier_call = rockchip_dmcfreq_system_status_notifier;
+		ret = rockchip_register_system_status_notifier(&dmcfreq->status_nb);
+		if (ret)
+			dev_err(dmcfreq->dev, "failed to register system_status nb\n");
+	}
 
 	dmc_mdevp.data = dmcfreq->devfreq;
 	dmcfreq->mdev_info = rockchip_system_monitor_register(dmcfreq->dev,
@@ -3279,14 +3375,15 @@
 		return ret;
 
 	rockchip_dmcfreq_parse_dt(data);
+	platform_set_drvdata(pdev, data);
 	if (!data->system_status_en && !data->auto_freq_en) {
 		dev_info(dev, "don't add devfreq feature\n");
+		rockchip_dmcfreq_register_notifier(data);
 		return rockchip_dmcfreq_set_volt_only(data);
 	}
 
 	pm_qos_add_request(&pm_qos, PM_QOS_CPU_DMA_LATENCY,
 			   PM_QOS_DEFAULT_VALUE);
-	platform_set_drvdata(pdev, data);
 
 	ret = devfreq_add_governor(&devfreq_dmc_ondemand);
 	if (ret)
@@ -3323,10 +3420,12 @@
 	if (ret)
 		return ret;
 
-	ret = devfreq_suspend_device(dmcfreq->devfreq);
-	if (ret < 0) {
-		dev_err(dev, "failed to suspend the devfreq devices\n");
-		return ret;
+	if (dmcfreq->devfreq) {
+		ret = devfreq_suspend_device(dmcfreq->devfreq);
+		if (ret < 0) {
+			dev_err(dev, "failed to suspend the devfreq devices\n");
+			return ret;
+		}
 	}
 
 	return 0;
@@ -3344,11 +3443,14 @@
 	if (ret)
 		return ret;
 
-	ret = devfreq_resume_device(dmcfreq->devfreq);
-	if (ret < 0) {
-		dev_err(dev, "failed to resume the devfreq devices\n");
-		return ret;
+	if (dmcfreq->devfreq) {
+		ret = devfreq_resume_device(dmcfreq->devfreq);
+		if (ret < 0) {
+			dev_err(dev, "failed to resume the devfreq devices\n");
+			return ret;
+		}
 	}
+
 	return ret;
 }
 
diff --git a/kernel/drivers/devfreq/rockchip_dmc_dbg.c b/kernel/drivers/devfreq/rockchip_dmc_dbg.c
index c0b9bae..ec9fa3f 100644
--- a/kernel/drivers/devfreq/rockchip_dmc_dbg.c
+++ b/kernel/drivers/devfreq/rockchip_dmc_dbg.c
@@ -81,54 +81,6 @@
 	unsigned int dramid[3];
 };
 
-struct lpddrx_id {
-	unsigned int dramid;
-	char *name;
-};
-
-static const struct lpddrx_id lp23_manuf_id[] = {
-	{ 0x1, "Samsung" },
-	{ 0x2, "Qimonda" },
-	{ 0x3, "Elpida" },
-	{ 0x4, "Etron" },
-	{ 0x5, "Nanya" },
-	{ 0x6, "SK hynix" },
-	{ 0x7, "Mosel" },
-	{ 0x8, "Winbond" },
-	{ 0x9, "ESMT" },
-	{ 0xa, "Zentel" },
-	{ 0xb, "Spansion" },
-	{ 0xc, "SST" },
-	{ 0xd, "ZMOS" },
-	{ 0xe, "Intel" },
-	{ 0x12, "Being Advanced Memory Corp" },
-	{ 0x1a, "Xi'an UniIC Semiconductors Co., Ltd" },
-	{ 0x1b, "ISSI" },
-	{ 0x1c, "JSC" },
-	{ 0xaa, "Tezzaron" },
-	{ 0xc2, "Macronix" },
-	{ 0xf8, "Fidelix" },
-	{ 0xfc, "eveRAM" },
-	{ 0xfd, "AP Memory" },
-	{ 0xfe, "Numonyx" },
-	{ 0xff, "Micron" }
-};
-
-static const struct lpddrx_id lp4_manuf_id[] = {
-	{ 0x1, "Samsung" },
-	{ 0x5, "Nanya" },
-	{ 0x6, "SK hynix" },
-	{ 0x8, "Winbond" },
-	{ 0x9, "ESMT" },
-	{ 0x13, "CXMT" },
-	{ 0x1a, "Xi'an UniIC Semiconductors Co., Ltd" },
-	{ 0x1c, "JSC" },
-	{ 0xf8, "Fidelix" },
-	{ 0xf9, "Ultra Memory" },
-	{ 0xfd, "AP Memory" },
-	{ 0xff, "Micron" }
-};
-
 static const char * const power_save_msg[] = {
 	"auto power down enable",
 	"auto power down idle cycle",
@@ -270,46 +222,16 @@
 	seq_printf(m, "DramType:	%s\n", p_dram_info->dramtype);
 	if (p_dram_info->version >= 0x2) {
 		if ((strcmp(p_dram_info->dramtype, "LPDDR2") == 0) ||
-		    (strcmp(p_dram_info->dramtype, "LPDDR3") == 0)) {
-			for (i = 0; i < ARRAY_SIZE(lp23_manuf_id); i++) {
-				if (lp23_manuf_id[i].dramid == p_dram_info->dramid[0]) {
-					seq_printf(m,
-						   "Dram ID:	%s(MR5=0x%x,MR6=0x%x,MR7=0x%x)\n",
-						   lp23_manuf_id[i].name,
-						   p_dram_info->dramid[0],
-						   p_dram_info->dramid[1],
-						   p_dram_info->dramid[2]);
-					break;
-				}
-			}
-			if (i == ARRAY_SIZE(lp23_manuf_id))
-				seq_printf(m,
-					   "Dram ID:	Unknown(MR5=0x%x,MR6=0x%x,MR7=0x%x)\n",
-					   p_dram_info->dramid[0],
-					   p_dram_info->dramid[1],
-					   p_dram_info->dramid[2]);
-		} else if ((strcmp(p_dram_info->dramtype, "LPDDR4") == 0) ||
-			   (strcmp(p_dram_info->dramtype, "LPDDR4X") == 0)) {
-			for (i = 0; i < ARRAY_SIZE(lp4_manuf_id); i++) {
-				if (lp4_manuf_id[i].dramid == p_dram_info->dramid[0]) {
-					seq_printf(m,
-						   "Dram ID:	%s(MR5=0x%x,MR6=0x%x,MR7=0x%x)\n",
-						   lp4_manuf_id[i].name,
-						   p_dram_info->dramid[0],
-						   p_dram_info->dramid[1],
-						   p_dram_info->dramid[2]);
-					break;
-				}
-			}
-			if (i == ARRAY_SIZE(lp4_manuf_id))
-				seq_printf(m,
-					   "Dram ID:	Unknown(MR5=0x%x,MR6=0x%x,MR7=0x%x)\n",
-					   p_dram_info->dramid[0],
-					   p_dram_info->dramid[1],
-					   p_dram_info->dramid[2]);
-		} else {
+		    (strcmp(p_dram_info->dramtype, "LPDDR3") == 0) ||
+		    (strcmp(p_dram_info->dramtype, "LPDDR4") == 0) ||
+		    (strcmp(p_dram_info->dramtype, "LPDDR4X") == 0))
+			seq_printf(m,
+				   "Dram ID:	MR5=0x%x,MR6=0x%x,MR7=0x%x\n",
+				   p_dram_info->dramid[0],
+				   p_dram_info->dramid[1],
+				   p_dram_info->dramid[2]);
+		else
 			seq_printf(m, "Dram ID:	None\n");
-		}
 	}
 	/* dram capacity information */
 	seq_printf(m, "\n"
diff --git a/kernel/drivers/dma-buf/dma-buf.c b/kernel/drivers/dma-buf/dma-buf.c
index 20a7524..0d36aef 100644
--- a/kernel/drivers/dma-buf/dma-buf.c
+++ b/kernel/drivers/dma-buf/dma-buf.c
@@ -266,7 +266,7 @@
 		return 0;
 
 retry:
-	seq = read_seqcount_begin(&resv->seq);
+	seq = read_seqbegin(&resv->seq);
 	rcu_read_lock();
 
 	fobj = rcu_dereference(resv->fence);
@@ -275,7 +275,7 @@
 	else
 		shared_count = 0;
 	fence_excl = rcu_dereference(resv->fence_excl);
-	if (read_seqcount_retry(&resv->seq, seq)) {
+	if (read_seqretry(&resv->seq, seq)) {
 		rcu_read_unlock();
 		goto retry;
 	}
@@ -1432,12 +1432,12 @@
 
 		robj = buf_obj->resv;
 		while (true) {
-			seq = read_seqcount_begin(&robj->seq);
+			seq = read_seqbegin(&robj->seq);
 			rcu_read_lock();
 			fobj = rcu_dereference(robj->fence);
 			shared_count = fobj ? fobj->shared_count : 0;
 			fence = rcu_dereference(robj->fence_excl);
-			if (!read_seqcount_retry(&robj->seq, seq))
+			if (!read_seqretry(&robj->seq, seq))
 				break;
 			rcu_read_unlock();
 		}
diff --git a/kernel/drivers/dma-buf/heaps/Makefile b/kernel/drivers/dma-buf/heaps/Makefile
index c565022..4e134a2 100644
--- a/kernel/drivers/dma-buf/heaps/Makefile
+++ b/kernel/drivers/dma-buf/heaps/Makefile
@@ -2,4 +2,4 @@
 obj-$(CONFIG_DMABUF_HEAPS_DEFERRED_FREE) += deferred-free-helper.o
 obj-$(CONFIG_DMABUF_HEAPS_PAGE_POOL)	+= page_pool.o
 obj-$(CONFIG_DMABUF_HEAPS_SYSTEM)	+= rk_system_heap.o
-obj-$(CONFIG_DMABUF_HEAPS_CMA)		+= cma_heap.o
+obj-$(CONFIG_DMABUF_HEAPS_CMA)		+= rk_cma_heap.o
diff --git a/kernel/drivers/dma-buf/heaps/rk_cma_heap.c b/kernel/drivers/dma-buf/heaps/rk_cma_heap.c
new file mode 100644
index 0000000..12557dc
--- /dev/null
+++ b/kernel/drivers/dma-buf/heaps/rk_cma_heap.c
@@ -0,0 +1,616 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * DMABUF CMA heap exporter
+ *
+ * Copyright (C) 2012, 2019, 2020 Linaro Ltd.
+ * Author: <benjamin.gaignard@linaro.org> for ST-Ericsson.
+ *
+ * Also utilizing parts of Andrew Davis' SRAM heap:
+ * Copyright (C) 2019 Texas Instruments Incorporated - http://www.ti.com/
+ *	Andrew F. Davis <afd@ti.com>
+ *
+ * Copyright (C) 2021, 2022 Rockchip Electronics Co. Ltd.
+ */
+
+#include <linux/cma.h>
+#include <linux/dma-buf.h>
+#include <linux/dma-heap.h>
+#include <linux/dma-contiguous.h>
+#include <linux/err.h>
+#include <linux/highmem.h>
+#include <linux/io.h>
+#include <linux/mm.h>
+#include <linux/module.h>
+#include <linux/scatterlist.h>
+#include <linux/slab.h>
+#include <linux/vmalloc.h>
+#include <uapi/linux/dma-heap.h>
+
+struct cma_heap {
+	struct dma_heap *heap;
+	struct cma *cma;
+};
+
+struct cma_heap_buffer {
+	struct cma_heap *heap;
+	struct list_head attachments;
+	struct mutex lock;
+	unsigned long len;
+	struct page *cma_pages;
+	struct page **pages;
+	pgoff_t pagecount;
+	int vmap_cnt;
+	void *vaddr;
+
+	bool uncached;
+};
+
+struct dma_heap_attachment {
+	struct device *dev;
+	struct sg_table table;
+	struct list_head list;
+	bool mapped;
+
+	bool uncached;
+};
+
+static int cma_heap_attach(struct dma_buf *dmabuf,
+			   struct dma_buf_attachment *attachment)
+{
+	struct cma_heap_buffer *buffer = dmabuf->priv;
+	struct dma_heap_attachment *a;
+	int ret;
+
+	a = kzalloc(sizeof(*a), GFP_KERNEL);
+	if (!a)
+		return -ENOMEM;
+
+	ret = sg_alloc_table_from_pages(&a->table, buffer->pages,
+					buffer->pagecount, 0,
+					buffer->pagecount << PAGE_SHIFT,
+					GFP_KERNEL);
+	if (ret) {
+		kfree(a);
+		return ret;
+	}
+
+	a->dev = attachment->dev;
+	INIT_LIST_HEAD(&a->list);
+	a->mapped = false;
+
+	a->uncached = buffer->uncached;
+	attachment->priv = a;
+
+	mutex_lock(&buffer->lock);
+	list_add(&a->list, &buffer->attachments);
+	mutex_unlock(&buffer->lock);
+
+	return 0;
+}
+
+static void cma_heap_detach(struct dma_buf *dmabuf,
+			    struct dma_buf_attachment *attachment)
+{
+	struct cma_heap_buffer *buffer = dmabuf->priv;
+	struct dma_heap_attachment *a = attachment->priv;
+
+	mutex_lock(&buffer->lock);
+	list_del(&a->list);
+	mutex_unlock(&buffer->lock);
+
+	sg_free_table(&a->table);
+	kfree(a);
+}
+
+static struct sg_table *cma_heap_map_dma_buf(struct dma_buf_attachment *attachment,
+					     enum dma_data_direction direction)
+{
+	struct dma_heap_attachment *a = attachment->priv;
+	struct sg_table *table = &a->table;
+	int attrs = attachment->dma_map_attrs;
+	int ret;
+
+	if (a->uncached)
+		attrs |= DMA_ATTR_SKIP_CPU_SYNC;
+
+	ret = dma_map_sgtable(attachment->dev, table, direction, attrs);
+	if (ret)
+		return ERR_PTR(-ENOMEM);
+	a->mapped = true;
+	return table;
+}
+
+static void cma_heap_unmap_dma_buf(struct dma_buf_attachment *attachment,
+				   struct sg_table *table,
+				   enum dma_data_direction direction)
+{
+	struct dma_heap_attachment *a = attachment->priv;
+	int attrs = attachment->dma_map_attrs;
+
+	a->mapped = false;
+
+	if (a->uncached)
+		attrs |= DMA_ATTR_SKIP_CPU_SYNC;
+
+	dma_unmap_sgtable(attachment->dev, table, direction, attrs);
+}
+
+static int
+cma_heap_dma_buf_begin_cpu_access_partial(struct dma_buf *dmabuf,
+					  enum dma_data_direction direction,
+					  unsigned int offset,
+					  unsigned int len)
+{
+	struct cma_heap_buffer *buffer = dmabuf->priv;
+	phys_addr_t phys = page_to_phys(buffer->cma_pages);
+
+	if (buffer->vmap_cnt)
+		invalidate_kernel_vmap_range(buffer->vaddr, buffer->len);
+
+	if (buffer->uncached)
+		return 0;
+
+	mutex_lock(&buffer->lock);
+	dma_sync_single_for_cpu(dma_heap_get_dev(buffer->heap->heap),
+				phys + offset,
+				len,
+				direction);
+	mutex_unlock(&buffer->lock);
+
+	return 0;
+}
+
+static int
+cma_heap_dma_buf_end_cpu_access_partial(struct dma_buf *dmabuf,
+					enum dma_data_direction direction,
+					unsigned int offset,
+					unsigned int len)
+{
+	struct cma_heap_buffer *buffer = dmabuf->priv;
+	phys_addr_t phys = page_to_phys(buffer->cma_pages);
+
+	if (buffer->vmap_cnt)
+		flush_kernel_vmap_range(buffer->vaddr, buffer->len);
+
+	if (buffer->uncached)
+		return 0;
+
+	mutex_lock(&buffer->lock);
+	dma_sync_single_for_device(dma_heap_get_dev(buffer->heap->heap),
+				   phys + offset,
+				   len,
+				   direction);
+	mutex_unlock(&buffer->lock);
+
+	return 0;
+}
+
+static int cma_heap_dma_buf_begin_cpu_access(struct dma_buf *dmabuf,
+					     enum dma_data_direction direction)
+{
+	struct cma_heap_buffer *buffer = dmabuf->priv;
+	struct dma_heap_attachment *a;
+
+	if (buffer->vmap_cnt)
+		invalidate_kernel_vmap_range(buffer->vaddr, buffer->len);
+
+	mutex_lock(&buffer->lock);
+	list_for_each_entry(a, &buffer->attachments, list) {
+		if (!a->mapped)
+			continue;
+		dma_sync_sgtable_for_cpu(a->dev, &a->table, direction);
+	}
+	mutex_unlock(&buffer->lock);
+
+	return 0;
+}
+
+static int cma_heap_dma_buf_end_cpu_access(struct dma_buf *dmabuf,
+					   enum dma_data_direction direction)
+{
+	struct cma_heap_buffer *buffer = dmabuf->priv;
+	struct dma_heap_attachment *a;
+
+	if (buffer->vmap_cnt)
+		flush_kernel_vmap_range(buffer->vaddr, buffer->len);
+
+	mutex_lock(&buffer->lock);
+	list_for_each_entry(a, &buffer->attachments, list) {
+		if (!a->mapped)
+			continue;
+		dma_sync_sgtable_for_device(a->dev, &a->table, direction);
+	}
+	mutex_unlock(&buffer->lock);
+
+	return 0;
+}
+
+static vm_fault_t cma_heap_vm_fault(struct vm_fault *vmf)
+{
+	struct vm_area_struct *vma = vmf->vma;
+	struct cma_heap_buffer *buffer = vma->vm_private_data;
+
+	if (vmf->pgoff > buffer->pagecount)
+		return VM_FAULT_SIGBUS;
+
+	vmf->page = buffer->pages[vmf->pgoff];
+	get_page(vmf->page);
+
+	return 0;
+}
+
+static const struct vm_operations_struct dma_heap_vm_ops = {
+	.fault = cma_heap_vm_fault,
+};
+
+static int cma_heap_mmap(struct dma_buf *dmabuf, struct vm_area_struct *vma)
+{
+	struct cma_heap_buffer *buffer = dmabuf->priv;
+
+	if ((vma->vm_flags & (VM_SHARED | VM_MAYSHARE)) == 0)
+		return -EINVAL;
+
+	if (buffer->uncached)
+		vma->vm_page_prot = pgprot_writecombine(vma->vm_page_prot);
+
+	vma->vm_ops = &dma_heap_vm_ops;
+	vma->vm_private_data = buffer;
+
+	return 0;
+}
+
+static void *cma_heap_do_vmap(struct cma_heap_buffer *buffer)
+{
+	void *vaddr;
+	pgprot_t pgprot = PAGE_KERNEL;
+
+	if (buffer->uncached)
+		pgprot = pgprot_writecombine(PAGE_KERNEL);
+
+	vaddr = vmap(buffer->pages, buffer->pagecount, VM_MAP, pgprot);
+	if (!vaddr)
+		return ERR_PTR(-ENOMEM);
+
+	return vaddr;
+}
+
+static void *cma_heap_vmap(struct dma_buf *dmabuf)
+{
+	struct cma_heap_buffer *buffer = dmabuf->priv;
+	void *vaddr;
+
+	mutex_lock(&buffer->lock);
+	if (buffer->vmap_cnt) {
+		buffer->vmap_cnt++;
+		vaddr = buffer->vaddr;
+		goto out;
+	}
+
+	vaddr = cma_heap_do_vmap(buffer);
+	if (IS_ERR(vaddr))
+		goto out;
+
+	buffer->vaddr = vaddr;
+	buffer->vmap_cnt++;
+out:
+	mutex_unlock(&buffer->lock);
+
+	return vaddr;
+}
+
+static void cma_heap_vunmap(struct dma_buf *dmabuf, void *vaddr)
+{
+	struct cma_heap_buffer *buffer = dmabuf->priv;
+
+	mutex_lock(&buffer->lock);
+	if (!--buffer->vmap_cnt) {
+		vunmap(buffer->vaddr);
+		buffer->vaddr = NULL;
+	}
+	mutex_unlock(&buffer->lock);
+}
+
+static void cma_heap_dma_buf_release(struct dma_buf *dmabuf)
+{
+	struct cma_heap_buffer *buffer = dmabuf->priv;
+	struct cma_heap *cma_heap = buffer->heap;
+
+	if (buffer->vmap_cnt > 0) {
+		WARN(1, "%s: buffer still mapped in the kernel\n", __func__);
+		vunmap(buffer->vaddr);
+	}
+
+	/* free page list */
+	kfree(buffer->pages);
+	/* release memory */
+	cma_release(cma_heap->cma, buffer->cma_pages, buffer->pagecount);
+	kfree(buffer);
+}
+
+static const struct dma_buf_ops cma_heap_buf_ops = {
+	.attach = cma_heap_attach,
+	.detach = cma_heap_detach,
+	.map_dma_buf = cma_heap_map_dma_buf,
+	.unmap_dma_buf = cma_heap_unmap_dma_buf,
+	.begin_cpu_access = cma_heap_dma_buf_begin_cpu_access,
+	.end_cpu_access = cma_heap_dma_buf_end_cpu_access,
+	.begin_cpu_access_partial = cma_heap_dma_buf_begin_cpu_access_partial,
+	.end_cpu_access_partial = cma_heap_dma_buf_end_cpu_access_partial,
+	.mmap = cma_heap_mmap,
+	.vmap = cma_heap_vmap,
+	.vunmap = cma_heap_vunmap,
+	.release = cma_heap_dma_buf_release,
+};
+
+static struct dma_buf *cma_heap_do_allocate(struct dma_heap *heap,
+					 unsigned long len,
+					 unsigned long fd_flags,
+					 unsigned long heap_flags, bool uncached)
+{
+	struct cma_heap *cma_heap = dma_heap_get_drvdata(heap);
+	struct cma_heap_buffer *buffer;
+	DEFINE_DMA_BUF_EXPORT_INFO(exp_info);
+	size_t size = PAGE_ALIGN(len);
+	pgoff_t pagecount = size >> PAGE_SHIFT;
+	unsigned long align = get_order(size);
+	struct page *cma_pages;
+	struct dma_buf *dmabuf;
+	int ret = -ENOMEM;
+	pgoff_t pg;
+	dma_addr_t dma;
+
+	buffer = kzalloc(sizeof(*buffer), GFP_KERNEL);
+	if (!buffer)
+		return ERR_PTR(-ENOMEM);
+
+	buffer->uncached = uncached;
+
+	INIT_LIST_HEAD(&buffer->attachments);
+	mutex_init(&buffer->lock);
+	buffer->len = size;
+
+	if (align > CONFIG_CMA_ALIGNMENT)
+		align = CONFIG_CMA_ALIGNMENT;
+
+	cma_pages = cma_alloc(cma_heap->cma, pagecount, align, GFP_KERNEL);
+	if (!cma_pages)
+		goto free_buffer;
+
+	/* Clear the cma pages */
+	if (PageHighMem(cma_pages)) {
+		unsigned long nr_clear_pages = pagecount;
+		struct page *page = cma_pages;
+
+		while (nr_clear_pages > 0) {
+			void *vaddr = kmap_atomic(page);
+
+			memset(vaddr, 0, PAGE_SIZE);
+			kunmap_atomic(vaddr);
+			/*
+			 * Avoid wasting time zeroing memory if the process
+			 * has been killed by SIGKILL
+			 */
+			if (fatal_signal_pending(current))
+				goto free_cma;
+			page++;
+			nr_clear_pages--;
+		}
+	} else {
+		memset(page_address(cma_pages), 0, size);
+	}
+
+	buffer->pages = kmalloc_array(pagecount, sizeof(*buffer->pages), GFP_KERNEL);
+	if (!buffer->pages) {
+		ret = -ENOMEM;
+		goto free_cma;
+	}
+
+	for (pg = 0; pg < pagecount; pg++)
+		buffer->pages[pg] = &cma_pages[pg];
+
+	buffer->cma_pages = cma_pages;
+	buffer->heap = cma_heap;
+	buffer->pagecount = pagecount;
+
+	/* create the dmabuf */
+	exp_info.exp_name = dma_heap_get_name(heap);
+	exp_info.ops = &cma_heap_buf_ops;
+	exp_info.size = buffer->len;
+	exp_info.flags = fd_flags;
+	exp_info.priv = buffer;
+	dmabuf = dma_buf_export(&exp_info);
+	if (IS_ERR(dmabuf)) {
+		ret = PTR_ERR(dmabuf);
+		goto free_pages;
+	}
+
+	if (buffer->uncached) {
+		dma = dma_map_page(dma_heap_get_dev(heap), buffer->cma_pages, 0,
+			     buffer->pagecount * PAGE_SIZE, DMA_FROM_DEVICE);
+		dma_unmap_page(dma_heap_get_dev(heap), dma,
+			       buffer->pagecount * PAGE_SIZE, DMA_FROM_DEVICE);
+	}
+
+	return dmabuf;
+
+free_pages:
+	kfree(buffer->pages);
+free_cma:
+	cma_release(cma_heap->cma, cma_pages, pagecount);
+free_buffer:
+	kfree(buffer);
+
+	return ERR_PTR(ret);
+}
+
+static struct dma_buf *cma_heap_allocate(struct dma_heap *heap,
+					 unsigned long len,
+					 unsigned long fd_flags,
+					 unsigned long heap_flags)
+{
+	return cma_heap_do_allocate(heap, len, fd_flags, heap_flags, false);
+}
+
+#if IS_ENABLED(CONFIG_NO_GKI)
+static int cma_heap_get_phys(struct dma_heap *heap,
+			     struct dma_heap_phys_data *phys)
+{
+	struct cma_heap *cma_heap = dma_heap_get_drvdata(heap);
+	struct cma_heap_buffer *buffer;
+	struct dma_buf *dmabuf;
+
+	phys->paddr = (__u64)-1;
+
+	if (IS_ERR_OR_NULL(phys))
+		return -EINVAL;
+
+	dmabuf = dma_buf_get(phys->fd);
+	if (IS_ERR_OR_NULL(dmabuf))
+		return -EBADFD;
+
+	buffer = dmabuf->priv;
+	if (IS_ERR_OR_NULL(buffer))
+		goto err;
+
+	if (buffer->heap != cma_heap)
+		goto err;
+
+	phys->paddr = page_to_phys(buffer->cma_pages);
+
+err:
+	dma_buf_put(dmabuf);
+
+	return (phys->paddr == (__u64)-1) ? -EINVAL : 0;
+}
+#endif
+
+static const struct dma_heap_ops cma_heap_ops = {
+	.allocate = cma_heap_allocate,
+#if IS_ENABLED(CONFIG_NO_GKI)
+	.get_phys = cma_heap_get_phys,
+#endif
+};
+
+static struct dma_buf *cma_uncached_heap_allocate(struct dma_heap *heap,
+					 unsigned long len,
+					 unsigned long fd_flags,
+					 unsigned long heap_flags)
+{
+	return cma_heap_do_allocate(heap, len, fd_flags, heap_flags, true);
+}
+
+static struct dma_buf *cma_uncached_heap_not_initialized(struct dma_heap *heap,
+					 unsigned long len,
+					 unsigned long fd_flags,
+					 unsigned long heap_flags)
+{
+	pr_info("heap %s not initialized\n", dma_heap_get_name(heap));
+	return ERR_PTR(-EBUSY);
+}
+
+static struct dma_heap_ops cma_uncached_heap_ops = {
+	.allocate = cma_uncached_heap_not_initialized,
+};
+
+static int set_heap_dev_dma(struct device *heap_dev)
+{
+	int err = 0;
+
+	if (!heap_dev)
+		return -EINVAL;
+
+	arch_setup_dma_ops(heap_dev, 0, 0, NULL, 0);
+
+	dma_coerce_mask_and_coherent(heap_dev, DMA_BIT_MASK(64));
+
+	if (!heap_dev->dma_parms) {
+		heap_dev->dma_parms = devm_kzalloc(heap_dev,
+						   sizeof(*heap_dev->dma_parms),
+						   GFP_KERNEL);
+		if (!heap_dev->dma_parms)
+			return -ENOMEM;
+
+		err = dma_set_max_seg_size(heap_dev, (unsigned int)DMA_BIT_MASK(64));
+		if (err) {
+			devm_kfree(heap_dev, heap_dev->dma_parms);
+			dev_err(heap_dev, "Failed to set DMA segment size, err:%d\n", err);
+			return err;
+		}
+	}
+
+	return 0;
+}
+
+static int __add_cma_heap(struct cma *cma, void *data)
+{
+	struct cma_heap *cma_heap, *cma_uncached_heap;
+	struct dma_heap_export_info exp_info;
+	int ret;
+
+	cma_heap = kzalloc(sizeof(*cma_heap), GFP_KERNEL);
+	if (!cma_heap)
+		return -ENOMEM;
+	cma_heap->cma = cma;
+
+	exp_info.name = "cma";
+	exp_info.ops = &cma_heap_ops;
+	exp_info.priv = cma_heap;
+
+	cma_heap->heap = dma_heap_add(&exp_info);
+	if (IS_ERR(cma_heap->heap)) {
+		ret = PTR_ERR(cma_heap->heap);
+		goto free_cma_heap;
+	}
+
+	cma_uncached_heap = kzalloc(sizeof(*cma_heap), GFP_KERNEL);
+	if (!cma_uncached_heap) {
+		ret = -ENOMEM;
+		goto put_cma_heap;
+	}
+
+	cma_uncached_heap->cma = cma;
+
+	exp_info.name = "cma-uncached";
+	exp_info.ops = &cma_uncached_heap_ops;
+	exp_info.priv = cma_uncached_heap;
+
+	cma_uncached_heap->heap = dma_heap_add(&exp_info);
+	if (IS_ERR(cma_uncached_heap->heap)) {
+		ret = PTR_ERR(cma_uncached_heap->heap);
+		goto free_uncached_cma_heap;
+	}
+
+	ret = set_heap_dev_dma(dma_heap_get_dev(cma_uncached_heap->heap));
+	if (ret)
+		goto put_uncached_cma_heap;
+
+	mb(); /* make sure we only set allocate after dma_mask is set */
+	cma_uncached_heap_ops.allocate = cma_uncached_heap_allocate;
+
+	return 0;
+
+put_uncached_cma_heap:
+	dma_heap_put(cma_uncached_heap->heap);
+free_uncached_cma_heap:
+	kfree(cma_uncached_heap);
+put_cma_heap:
+	dma_heap_put(cma_heap->heap);
+free_cma_heap:
+	kfree(cma_heap);
+
+	return ret;
+}
+
+static int add_default_cma_heap(void)
+{
+	struct cma *default_cma = dev_get_cma_area(NULL);
+	int ret = 0;
+
+	if (default_cma)
+		ret = __add_cma_heap(default_cma, NULL);
+
+	return ret;
+}
+module_init(add_default_cma_heap);
+MODULE_DESCRIPTION("DMA-BUF CMA Heap");
+MODULE_LICENSE("GPL");
diff --git a/kernel/drivers/dma-buf/reservation.c b/kernel/drivers/dma-buf/reservation.c
index 49ab094..f11d584 100644
--- a/kernel/drivers/dma-buf/reservation.c
+++ b/kernel/drivers/dma-buf/reservation.c
@@ -109,8 +109,7 @@
 
 	dma_fence_get(fence);
 
-	preempt_disable();
-	write_seqcount_begin(&obj->seq);
+	write_seqlock(&obj->seq);
 
 	for (i = 0; i < fobj->shared_count; ++i) {
 		struct dma_fence *old_fence;
@@ -121,8 +120,7 @@
 		if (old_fence->context == fence->context) {
 			/* memory barrier is added by write_seqcount_begin */
 			RCU_INIT_POINTER(fobj->shared[i], fence);
-			write_seqcount_end(&obj->seq);
-			preempt_enable();
+			write_sequnlock(&obj->seq);
 
 			dma_fence_put(old_fence);
 			return;
@@ -146,8 +144,7 @@
 		fobj->shared_count++;
 	}
 
-	write_seqcount_end(&obj->seq);
-	preempt_enable();
+	write_sequnlock(&obj->seq);
 
 	dma_fence_put(signaled);
 }
@@ -191,15 +188,13 @@
 	fobj->shared_count++;
 
 done:
-	preempt_disable();
-	write_seqcount_begin(&obj->seq);
+	write_seqlock(&obj->seq);
 	/*
 	 * RCU_INIT_POINTER can be used here,
 	 * seqcount provides the necessary barriers
 	 */
 	RCU_INIT_POINTER(obj->fence, fobj);
-	write_seqcount_end(&obj->seq);
-	preempt_enable();
+	write_sequnlock(&obj->seq);
 
 	if (!old)
 		return;
@@ -259,14 +254,11 @@
 	if (fence)
 		dma_fence_get(fence);
 
-	preempt_disable();
-	write_seqcount_begin(&obj->seq);
-	/* write_seqcount_begin provides the necessary memory barrier */
+	write_seqlock(&obj->seq);
 	RCU_INIT_POINTER(obj->fence_excl, fence);
 	if (old)
 		old->shared_count = 0;
-	write_seqcount_end(&obj->seq);
-	preempt_enable();
+	write_sequnlock(&obj->seq);
 
 	/* inplace update, no shared fences */
 	while (i--)
@@ -349,13 +341,10 @@
 	src_list = reservation_object_get_list(dst);
 	old = reservation_object_get_excl(dst);
 
-	preempt_disable();
-	write_seqcount_begin(&dst->seq);
-	/* write_seqcount_begin provides the necessary memory barrier */
+	write_seqlock(&dst->seq);
 	RCU_INIT_POINTER(dst->fence_excl, new);
 	RCU_INIT_POINTER(dst->fence, dst_list);
-	write_seqcount_end(&dst->seq);
-	preempt_enable();
+	write_sequnlock(&dst->seq);
 
 	if (src_list)
 		kfree_rcu(src_list, rcu);
@@ -396,7 +385,7 @@
 		shared_count = i = 0;
 
 		rcu_read_lock();
-		seq = read_seqcount_begin(&obj->seq);
+		seq = read_seqbegin(&obj->seq);
 
 		fence_excl = rcu_dereference(obj->fence_excl);
 		if (fence_excl && !dma_fence_get_rcu(fence_excl))
@@ -445,7 +434,7 @@
 			}
 		}
 
-		if (i != shared_count || read_seqcount_retry(&obj->seq, seq)) {
+		if (i != shared_count || read_seqretry(&obj->seq, seq)) {
 			while (i--)
 				dma_fence_put(shared[i]);
 			dma_fence_put(fence_excl);
@@ -494,7 +483,7 @@
 
 retry:
 	shared_count = 0;
-	seq = read_seqcount_begin(&obj->seq);
+	seq = read_seqbegin(&obj->seq);
 	rcu_read_lock();
 	i = -1;
 
@@ -541,7 +530,7 @@
 
 	rcu_read_unlock();
 	if (fence) {
-		if (read_seqcount_retry(&obj->seq, seq)) {
+		if (read_seqretry(&obj->seq, seq)) {
 			dma_fence_put(fence);
 			goto retry;
 		}
@@ -597,7 +586,7 @@
 retry:
 	ret = true;
 	shared_count = 0;
-	seq = read_seqcount_begin(&obj->seq);
+	seq = read_seqbegin(&obj->seq);
 
 	if (test_all) {
 		unsigned i;
@@ -618,7 +607,7 @@
 				break;
 		}
 
-		if (read_seqcount_retry(&obj->seq, seq))
+		if (read_seqretry(&obj->seq, seq))
 			goto retry;
 	}
 
@@ -631,7 +620,7 @@
 			if (ret < 0)
 				goto retry;
 
-			if (read_seqcount_retry(&obj->seq, seq))
+			if (read_seqretry(&obj->seq, seq))
 				goto retry;
 		}
 	}
diff --git a/kernel/drivers/extcon/extcon.c b/kernel/drivers/extcon/extcon.c
index def0649..148c07a 100644
--- a/kernel/drivers/extcon/extcon.c
+++ b/kernel/drivers/extcon/extcon.c
@@ -158,6 +158,11 @@
 		.id = EXTCON_DISP_HDMI,
 		.name = "HDMI",
 	},
+	[EXTCON_DISP_HDMI_AUDIO] = {
+		.type = EXTCON_TYPE_DISP,
+		.id = EXTCON_DISP_HDMI_AUDIO,
+		.name = "HDMI-AUDIO",
+	},
 	[EXTCON_DISP_MHL] = {
 		.type = EXTCON_TYPE_DISP,
 		.id = EXTCON_DISP_MHL,
diff --git a/kernel/drivers/firmware/arm_sdei.c b/kernel/drivers/firmware/arm_sdei.c
index 08e8286..63b17b6 100644
--- a/kernel/drivers/firmware/arm_sdei.c
+++ b/kernel/drivers/firmware/arm_sdei.c
@@ -924,6 +924,47 @@
 
 	return err;
 }
+
+static int sdei_api_interrupt_bind(u32 intr_num, u64 *result)
+{
+	return invoke_sdei_fn(SDEI_1_0_FN_SDEI_INTERRUPT_BIND, intr_num, 0, 0, 0,
+			      0, result);
+}
+
+int sdei_interrupt_bind(u32 intr_num, u32 *event_num)
+{
+	int err;
+	u64 result;
+
+	err = sdei_api_interrupt_bind(intr_num, &result);
+	if (!err)
+		*event_num = (u32)result;
+
+	return err;
+}
+
+static int sdei_api_interrupt_release(u32 event_num)
+{
+	return invoke_sdei_fn(SDEI_1_0_FN_SDEI_INTERRUPT_RELEASE, event_num, 0, 0, 0,
+			      0, NULL);
+}
+
+int sdei_interrupt_release(u32 event_num)
+{
+	struct sdei_event *event;
+
+	mutex_lock(&sdei_events_lock);
+	event = sdei_event_find(event_num);
+	mutex_unlock(&sdei_events_lock);
+
+	if (event) {
+		pr_err("%s: need unregister event:%d before release\n",
+		       __func__, event_num);
+		return SDEI_DENIED;
+	}
+
+	return sdei_api_interrupt_release(event_num);
+}
 #endif
 
 static int sdei_get_conduit(struct platform_device *pdev)
diff --git a/kernel/drivers/firmware/efi/efi.c b/kernel/drivers/firmware/efi/efi.c
index a8180f9..e03e37a 100644
--- a/kernel/drivers/firmware/efi/efi.c
+++ b/kernel/drivers/firmware/efi/efi.c
@@ -87,7 +87,7 @@
 
 struct workqueue_struct *efi_rts_wq;
 
-static bool disable_runtime;
+static bool disable_runtime = IS_ENABLED(CONFIG_PREEMPT_RT_BASE);
 static int __init setup_noefi(char *arg)
 {
 	disable_runtime = true;
@@ -113,6 +113,9 @@
 	if (parse_option_str(str, "noruntime"))
 		disable_runtime = true;
 
+	if (parse_option_str(str, "runtime"))
+		disable_runtime = false;
+
 	return 0;
 }
 early_param("efi", parse_efi_cmdline);
diff --git a/kernel/drivers/firmware/rockchip_sip.c b/kernel/drivers/firmware/rockchip_sip.c
index 8658fa6..7f2073c 100644
--- a/kernel/drivers/firmware/rockchip_sip.c
+++ b/kernel/drivers/firmware/rockchip_sip.c
@@ -291,17 +291,20 @@
  */
 #ifdef CONFIG_ARM64
 #define SIP_UARTDBG_FN		SIP_UARTDBG_CFG64
+#define SIP_FIQ_DBG_STACK_SIZE	IRQ_STACK_SIZE
 #else
 #define SIP_UARTDBG_FN		SIP_UARTDBG_CFG
+#define SIP_FIQ_DBG_STACK_SIZE	SZ_8K
+
 static int firmware_64_32bit;
 #endif
 
 static int fiq_sip_enabled;
 static int fiq_target_cpu;
+static unsigned long fiq_stack_top;
 static phys_addr_t ft_fiq_mem_phy;
 static void __iomem *ft_fiq_mem_base;
-static void (*sip_fiq_debugger_uart_irq_tf)(struct pt_regs *_pt_regs,
-					    uint32_t cpu);
+static sip_fiq_debugger_uart_irq_tf_cb_t sip_fiq_debugger_uart_irq_tf;
 static struct pt_regs fiq_pt_regs;
 
 int sip_fiq_debugger_is_enabled(void)
@@ -388,7 +391,7 @@
 
 static void sip_fiq_debugger_uart_irq_tf_cb(unsigned long sp_el1,
 					    unsigned long offset,
-					    uint32_t cpu)
+					    unsigned long cpu)
 {
 	char *cpu_context;
 
@@ -403,15 +406,30 @@
 	__invoke_sip_fn_smc(SIP_UARTDBG_FN, 0, 0, UARTDBG_CFG_OSHDL_TO_OS);
 }
 
-int sip_fiq_debugger_uart_irq_tf_init(u32 irq_id, void *callback_fn)
+int sip_fiq_debugger_uart_irq_tf_init(u32 irq_id, sip_fiq_debugger_uart_irq_tf_cb_t callback_fn)
 {
 	struct arm_smccc_res res;
 
+	/* Alloc a page for fiq_debugger's stack */
+	if (fiq_stack_top == 0) {
+		fiq_stack_top = __get_free_pages(GFP_KERNEL | __GFP_ZERO,
+						 get_order(SIP_FIQ_DBG_STACK_SIZE));
+		if (fiq_stack_top) {
+			fiq_stack_top += SIP_FIQ_DBG_STACK_SIZE;
+		} else {
+			pr_err("%s: alloc stack failed\n", __func__);
+			return -ENOMEM;
+		}
+	}
+
 	/* init fiq debugger callback */
 	sip_fiq_debugger_uart_irq_tf = callback_fn;
-	res = __invoke_sip_fn_smc(SIP_UARTDBG_FN, irq_id,
-				  (unsigned long)sip_fiq_debugger_uart_irq_tf_cb,
-				  UARTDBG_CFG_INIT);
+	arm_smccc_smc(SIP_UARTDBG_FN,
+		      irq_id,
+		      (unsigned long)sip_fiq_debugger_uart_irq_tf_cb,
+		      UARTDBG_CFG_INIT,
+		      fiq_stack_top, 0, 0, 0, &res);
+
 	if (IS_SIP_ERROR(res.a0)) {
 		pr_err("%s error: %d\n", __func__, (int)res.a0);
 		return res.a0;
diff --git a/kernel/drivers/gpio/gpiolib-sysfs.c b/kernel/drivers/gpio/gpiolib-sysfs.c
index 1c2a983..e0ccc79 100644
--- a/kernel/drivers/gpio/gpiolib-sysfs.c
+++ b/kernel/drivers/gpio/gpiolib-sysfs.c
@@ -80,18 +80,13 @@
 	struct gpiod_data *data = dev_get_drvdata(dev);
 	struct gpio_desc *desc = data->desc;
 	ssize_t			status;
-	int offset;
 
 	mutex_lock(&data->mutex);
 
-	offset = gpio_chip_hwgpio(desc);
 	if (sysfs_streq(buf, "high"))
 		status = gpiod_direction_output_raw(desc, 1);
 	else if (sysfs_streq(buf, "out") || sysfs_streq(buf, "low"))
-		if (( offset == 26 ) || ( offset == 25 ) || ( offset == 27 ))
-			status = gpiod_direction_output_raw(desc, 1);
-		else
-			status = gpiod_direction_output_raw(desc, 0);
+		status = gpiod_direction_output_raw(desc, 0);
 	else if (sysfs_streq(buf, "in"))
 		status = gpiod_direction_input(desc);
 	else
diff --git a/kernel/drivers/gpu/arm/mali400/mali/common/mali_control_timer.c b/kernel/drivers/gpu/arm/mali400/mali/common/mali_control_timer.c
index 5bed27a..90f14f2 100755
--- a/kernel/drivers/gpu/arm/mali400/mali/common/mali_control_timer.c
+++ b/kernel/drivers/gpu/arm/mali400/mali/common/mali_control_timer.c
@@ -19,7 +19,7 @@
 static u64 period_start_time = 0;
 
 /** .KP : mali_control_timer */
-static _mali_osk_timer_t *mali_control_timer = NULL;
+static _mali_osk_timer_t mali_control_timer;
 static mali_bool timer_running = MALI_FALSE;
 
 /**
@@ -30,12 +30,12 @@
 
 void mali_control_timer_add(u32 timeout)/* 'timeout' : 以 ms 为单位. */
 {
-	_mali_osk_timer_add(mali_control_timer, _mali_osk_time_mstoticks(timeout));
+	_mali_osk_timer_add(&mali_control_timer, _mali_osk_time_mstoticks(timeout));
 }
 
 void mali_control_timer_mod(u32 timeout_in_ms)
 {
-	_mali_osk_timer_mod(mali_control_timer, _mali_osk_time_mstoticks(timeout_in_ms));
+	_mali_osk_timer_mod(&mali_control_timer, _mali_osk_time_mstoticks(timeout_in_ms));
 }
 
 static void mali_control_timer_callback(void *arg)
@@ -76,23 +76,15 @@
 		}
 	}
 
-	mali_control_timer = _mali_osk_timer_init(mali_control_timer_callback);
-	if (NULL == mali_control_timer) {
-		return _MALI_OSK_ERR_FAULT;
-	}
-	_mali_osk_timer_setcallback(mali_control_timer, mali_control_timer_callback, NULL);
+	_mali_osk_timer_init(&mali_control_timer, mali_control_timer_callback);
 
 	return _MALI_OSK_ERR_OK;
 }
 
 void mali_control_timer_term(void)
 {
-	if (NULL != mali_control_timer) {
-		_mali_osk_timer_del(mali_control_timer);
-		timer_running = MALI_FALSE;
-		_mali_osk_timer_term(mali_control_timer);
-		mali_control_timer = NULL;
-	}
+	_mali_osk_timer_del(&mali_control_timer);
+	timer_running = MALI_FALSE;
 }
 
 mali_bool mali_control_timer_resume(u64 time_now)
@@ -130,7 +122,7 @@
 		mali_utilization_data_unlock();
 
 		if (suspend == MALI_TRUE) {
-			_mali_osk_timer_del(mali_control_timer);
+			_mali_osk_timer_del(&mali_control_timer);
 			mali_utilization_reset();
 		}
 	} else {
diff --git a/kernel/drivers/gpu/arm/mali400/mali/common/mali_group.c b/kernel/drivers/gpu/arm/mali400/mali/common/mali_group.c
index 47979a2..3e76c54 100755
--- a/kernel/drivers/gpu/arm/mali400/mali/common/mali_group.c
+++ b/kernel/drivers/gpu/arm/mali400/mali/common/mali_group.c
@@ -65,27 +65,23 @@
 
 	group = _mali_osk_calloc(1, sizeof(struct mali_group));
 	if (NULL != group) {
-		group->timeout_timer = _mali_osk_timer_init(mali_group_timeout);
-		if (NULL != group->timeout_timer) {
-			_mali_osk_timer_setcallback(group->timeout_timer, mali_group_timeout, (void *)group);
+		_mali_osk_timer_init(&group->timeout_timer, mali_group_timeout);
 
-			group->l2_cache_core[0] = core;
-			_mali_osk_list_init(&group->group_list);
-			_mali_osk_list_init(&group->executor_list);
-			_mali_osk_list_init(&group->pm_domain_list);
-			group->bcast_core = bcast;
-			group->dlbu_core = dlbu;
+		group->l2_cache_core[0] = core;
+		_mali_osk_list_init(&group->group_list);
+		_mali_osk_list_init(&group->executor_list);
+		_mali_osk_list_init(&group->pm_domain_list);
+		group->bcast_core = bcast;
+		group->dlbu_core = dlbu;
 
-			/* register this object as a part of the correct power domain */
-			if ((NULL != core) || (NULL != dlbu) || (NULL != bcast))
-				group->pm_domain = mali_pm_register_group(domain_index, group);
+		/* register this object as a part of the correct power domain */
+		if ((NULL != core) || (NULL != dlbu) || (NULL != bcast))
+			group->pm_domain = mali_pm_register_group(domain_index, group);
 
-			mali_global_groups[mali_global_num_groups] = group;
-			mali_global_num_groups++;
+		mali_global_groups[mali_global_num_groups] = group;
+		mali_global_num_groups++;
 
-			return group;
-		}
-		_mali_osk_free(group);
+		return group;
 	}
 
 	return NULL;
@@ -147,10 +143,7 @@
 		}
 	}
 
-	if (NULL != group->timeout_timer) {
-		_mali_osk_timer_del(group->timeout_timer);
-		_mali_osk_timer_term(group->timeout_timer);
-	}
+	_mali_osk_timer_del(&group->timeout_timer);
 
 	if (NULL != group->bottom_half_work_mmu) {
 		_mali_osk_wq_delete_work(group->bottom_half_work_mmu);
@@ -879,7 +872,7 @@
 
 	/* Setup SW timer and record start time */
 	group->start_time = _mali_osk_time_tickcount();
-	_mali_osk_timer_mod(group->timeout_timer, _mali_osk_time_mstoticks(mali_max_job_runtime));
+	_mali_osk_timer_mod(&group->timeout_timer, _mali_osk_time_mstoticks(mali_max_job_runtime));
 
 	MALI_DEBUG_PRINT(4, ("Group: Started GP job 0x%08X on group %s at %u\n",
 			     job,
@@ -1034,7 +1027,7 @@
 
 	/* Setup SW timer and record start time */
 	group->start_time = _mali_osk_time_tickcount();
-	_mali_osk_timer_mod(group->timeout_timer, _mali_osk_time_mstoticks(mali_max_job_runtime));
+	_mali_osk_timer_mod(&group->timeout_timer, _mali_osk_time_mstoticks(mali_max_job_runtime));
 
 	MALI_DEBUG_PRINT(4, ("Group: Started PP job 0x%08X part %u/%u on group %s at %u\n",
 			     job, sub_job + 1,
@@ -1124,7 +1117,7 @@
 	MALI_DEBUG_ASSERT(MALI_TRUE == group->is_working);
 
 	/* Stop/clear the timeout timer. */
-	_mali_osk_timer_del_async(group->timeout_timer);
+	_mali_osk_timer_del_async(&group->timeout_timer);
 
 	if (NULL != group->pp_running_job) {
 
@@ -1237,7 +1230,7 @@
 	MALI_DEBUG_ASSERT(MALI_TRUE == group->is_working);
 
 	/* Stop/clear the timeout timer. */
-	_mali_osk_timer_del_async(group->timeout_timer);
+	_mali_osk_timer_del_async(&group->timeout_timer);
 
 	if (NULL != group->gp_running_job) {
 		mali_gp_update_performance_counters(group->gp_core, group->gp_running_job);
@@ -1780,7 +1773,8 @@
 
 static void mali_group_timeout(void *data)
 {
-	struct mali_group *group = (struct mali_group *)data;
+	_mali_osk_timer_t *timer = (_mali_osk_timer_t *)data;
+	struct mali_group *group = container_of(timer, struct mali_group, timeout_timer);
 	MALI_DEBUG_ASSERT_POINTER(group);
 
 	MALI_DEBUG_PRINT(2, ("Group: timeout handler for %s at %u\n",
diff --git a/kernel/drivers/gpu/arm/mali400/mali/common/mali_group.h b/kernel/drivers/gpu/arm/mali400/mali/common/mali_group.h
index 32481e4..0e3202b 100755
--- a/kernel/drivers/gpu/arm/mali400/mali/common/mali_group.h
+++ b/kernel/drivers/gpu/arm/mali400/mali/common/mali_group.h
@@ -84,7 +84,7 @@
 	_mali_osk_wq_work_t         *bottom_half_work_gp;
 	_mali_osk_wq_work_t         *bottom_half_work_pp;
 
-	_mali_osk_timer_t           *timeout_timer;
+	_mali_osk_timer_t           timeout_timer;
 };
 
 /** @brief Create a new Mali group object
diff --git a/kernel/drivers/gpu/arm/mali400/mali/common/mali_osk.h b/kernel/drivers/gpu/arm/mali400/mali/common/mali_osk.h
index 9ade362..5a180e5 100755
--- a/kernel/drivers/gpu/arm/mali400/mali/common/mali_osk.h
+++ b/kernel/drivers/gpu/arm/mali400/mali/common/mali_osk.h
@@ -950,23 +950,24 @@
 
 /** @brief Initialize a timer
  *
- * Allocates resources for a new timer, and initializes them. This does not
- * start the timer.
- *
- * @return a pointer to the allocated timer object, or NULL on failure.
+ * Initializes a given timer instance.
+ * This does not start the timer.
+
+ * @param tim the timer to init.
+ * @param callback the callback that would be called when 'tim' times out.
  */
-_mali_osk_timer_t *_mali_osk_timer_init(_mali_osk_timer_callback_t callback);
+void _mali_osk_timer_init(_mali_osk_timer_t *tim, _mali_osk_timer_callback_t callback);
 
 /** @brief Start a timer
  *
  * It is an error to start a timer without setting the callback via
- * _mali_osk_timer_setcallback().
+ * _mali_osk_timer_init().
  *
  * It is an error to use this to start an already started timer.
  *
  * The timer will expire in \a ticks_to_expire ticks, at which point, the
  * callback function will be invoked with the callback-specific data,
- * as registered by _mali_osk_timer_setcallback().
+ * as registered by _mali_osk_timer_init().
  *
  * @param tim the timer to start
  * @param ticks_to_expire the amount of time in ticks for the timer to run
@@ -980,11 +981,11 @@
  * stopped. If \a ticks_to_expire 0 the timer fires immediately.
  *
  * It is an error to modify a timer without setting the callback via
- *  _mali_osk_timer_setcallback().
+ *  _mali_osk_timer_init().
  *
  * The timer will expire at \a ticks_to_expire from the time of the call, at
  * which point, the callback function will be invoked with the
- * callback-specific data, as set by _mali_osk_timer_setcallback().
+ * callback-specific data, as set by _mali_osk_timer_init().
  *
  * @param tim the timer to modify, and start if necessary
  * @param ticks_to_expire the \em absolute time in ticks at which this timer
@@ -1033,34 +1034,6 @@
  * @return MALI_TRUE if time is active, MALI_FALSE if it is not active
  */
 mali_bool _mali_osk_timer_pending(_mali_osk_timer_t *tim);
-
-/** @brief Set a timer's callback parameters.
- *
- * This must be called at least once before a timer is started/modified.
- *
- * After a timer has been stopped or expires, the callback remains set. This
- * means that restarting the timer will call the same function with the same
- * parameters on expiry.
- *
- * @param tim the timer to set callback on.
- * @param callback Function to call when timer expires
- * @param data Function-specific data to supply to the function on expiry.
- */
-void _mali_osk_timer_setcallback(_mali_osk_timer_t *tim, _mali_osk_timer_callback_t callback, void *data);
-
-/** @brief Terminate a timer, and deallocate resources.
- *
- * The timer must first be stopped by calling _mali_osk_timer_del().
- *
- * It is a programming error for _mali_osk_timer_term() to be called on:
- * - timer that is currently running
- * - a timer that is currently executing its callback.
- *
- * @param tim the timer to deallocate.
- */
-void _mali_osk_timer_term(_mali_osk_timer_t *tim);
-/** @} */ /* end group _mali_osk_timer */
-
 
 /** @defgroup _mali_osk_time OSK Time functions
  *
diff --git a/kernel/drivers/gpu/arm/mali400/mali/common/mali_osk_mali.h b/kernel/drivers/gpu/arm/mali400/mali/common/mali_osk_mali.h
index bf69925..a4c1618 100755
--- a/kernel/drivers/gpu/arm/mali400/mali/common/mali_osk_mali.h
+++ b/kernel/drivers/gpu/arm/mali400/mali/common/mali_osk_mali.h
@@ -28,9 +28,12 @@
 	struct device *dev;
 #ifdef CONFIG_HAVE_CLK
 	struct clk *clock;
+	struct clk_bulk_data *clks;
+	int num_clks;
 #endif
 #ifdef CONFIG_REGULATOR
 	struct regulator *regulator;
+	struct opp_table *opp_table;
 #endif
 #ifdef CONFIG_PM_DEVFREQ
 	struct devfreq_dev_profile devfreq_profile;
diff --git a/kernel/drivers/gpu/arm/mali400/mali/common/mali_osk_types.h b/kernel/drivers/gpu/arm/mali400/mali/common/mali_osk_types.h
index b6fa94c..60ae190 100755
--- a/kernel/drivers/gpu/arm/mali400/mali/common/mali_osk_types.h
+++ b/kernel/drivers/gpu/arm/mali400/mali/common/mali_osk_types.h
@@ -20,6 +20,8 @@
 extern "C" {
 #endif
 
+#include <linux/timer.h>
+
 /**
  * @addtogroup uddapi Unified Device Driver (UDD) APIs
  *
@@ -394,11 +396,11 @@
  * the callback. Therefore, the callback may not obtain any mutexes also held
  * by any callers of _mali_osk_timer_del(). Otherwise, a deadlock may occur.
  *
- * @param arg Function-specific data */
+ * @param arg the pointer to current _mali_osk_timer_t(timer_list) instance. */
 typedef void (*_mali_osk_timer_callback_t)(void *arg);
 
 /** @brief Private type for Timer Callback Objects */
-typedef struct _mali_osk_timer_t_struct _mali_osk_timer_t;
+typedef struct timer_list _mali_osk_timer_t;
 /** @} */ /* end group _mali_osk_timer */
 
 
diff --git a/kernel/drivers/gpu/arm/mali400/mali/linux/mali_devfreq.c b/kernel/drivers/gpu/arm/mali400/mali/linux/mali_devfreq.c
index 260c2a8..6023495 100644
--- a/kernel/drivers/gpu/arm/mali400/mali/linux/mali_devfreq.c
+++ b/kernel/drivers/gpu/arm/mali400/mali/linux/mali_devfreq.c
@@ -12,6 +12,7 @@
 #include "mali_kernel_common.h"
 
 #include <linux/clk.h>
+#include <linux/clk-provider.h>
 #include <linux/devfreq.h>
 #include <linux/regulator/consumer.h>
 #include <linux/regulator/driver.h>
@@ -87,13 +88,17 @@
 		return 0;
 	}
 
+	err = clk_bulk_enable(mdev->num_clks, mdev->clks);
+	if (err)
+		return err;
+
 #ifdef CONFIG_REGULATOR
 	if (mdev->regulator && mdev->current_voltage != voltage &&
 	    old_freq < freq) {
 		err = regulator_set_voltage(mdev->regulator, voltage, INT_MAX);
 		if (err) {
 			MALI_PRINT_ERROR(("Failed to increase voltage (%d)\n", err));
-			return err;
+			goto err;
 		}
 	}
 #endif
@@ -101,8 +106,9 @@
 	err = clk_set_rate(mdev->clock, freq);
 	if (err) {
 		MALI_PRINT_ERROR(("Failed to set clock %lu (target %lu)\n", freq, *target_freq));
-		return err;
+		goto err;
 	}
+
 	*target_freq = freq;
 	mdev->current_freq = freq;
 	if (mdev->devfreq)
@@ -114,7 +120,7 @@
 		err = regulator_set_voltage(mdev->regulator, voltage, INT_MAX);
 		if (err) {
 			MALI_PRINT_ERROR(("Failed to decrease voltage (%d)\n", err));
-			return err;
+			goto err;
 		}
 	}
 #endif
@@ -122,6 +128,8 @@
 	mdev->current_voltage = voltage;
 
 	mali_pm_reset_dvfs_utilisation(mdev);
+err:
+	clk_bulk_disable(mdev->num_clks, mdev->clks);
 
 	return err;
 }
diff --git a/kernel/drivers/gpu/arm/mali400/mali/linux/mali_internal_sync.c b/kernel/drivers/gpu/arm/mali400/mali/linux/mali_internal_sync.c
index e13cbad..831a476 100644
--- a/kernel/drivers/gpu/arm/mali400/mali/linux/mali_internal_sync.c
+++ b/kernel/drivers/gpu/arm/mali400/mali/linux/mali_internal_sync.c
@@ -77,7 +77,7 @@
 	struct mali_internal_sync_fence_waiter *waiter;
 #endif
 	struct mali_internal_sync_fence *sync_fence;
-	int ret;
+	int ret = 0;
 	MALI_DEBUG_ASSERT_POINTER(cb);
 	MALI_IGNORE(fence);
 #if LINUX_VERSION_CODE < KERNEL_VERSION(4, 9, 0)
@@ -92,7 +92,11 @@
 	if (ret)
 		wake_up_all(&sync_fence->wq);
 #else
-	ret = sync_fence->fence->ops->signaled(sync_fence->fence);
+	if (!sync_fence)
+		return;
+
+	if ((sync_fence->fence) && (sync_fence->fence->ops) && (sync_fence->fence->ops->signaled))
+		ret = sync_fence->fence->ops->signaled(sync_fence->fence);
 
 	if (0 > ret)
 		MALI_PRINT_ERROR(("Mali internal sync:Failed to wait fence  0x%x for sync_fence 0x%x.\n", fence, sync_fence));
@@ -682,7 +686,7 @@
 
 
 	spin_lock_irqsave(fence->lock, flags);
-	if (WARN_ON_ONCE(!list_empty(&sync_pt->sync_pt_list)))
+	if (!list_empty(&sync_pt->sync_pt_list))
 		list_del(&sync_pt->sync_pt_list);
 	spin_unlock_irqrestore(fence->lock, flags);
 
diff --git a/kernel/drivers/gpu/arm/mali400/mali/linux/mali_kernel_linux.c b/kernel/drivers/gpu/arm/mali400/mali/linux/mali_kernel_linux.c
index 08df33d..6e003c2 100755
--- a/kernel/drivers/gpu/arm/mali400/mali/linux/mali_kernel_linux.c
+++ b/kernel/drivers/gpu/arm/mali400/mali/linux/mali_kernel_linux.c
@@ -31,6 +31,7 @@
 #include <linux/clk.h>
 #include <linux/regulator/consumer.h>
 #include <linux/mali/mali_utgard.h>
+#include <linux/pm_runtime.h>
 #include <soc/rockchip/rockchip_opp_select.h>
 
 #include "mali_kernel_common.h"
@@ -521,6 +522,7 @@
 	int err;
 #ifdef CONFIG_MALI_DEVFREQ
 	struct mali_device *mdev;
+	const char *name = "mali";
 #endif
 
 	MALI_DEBUG_PRINT(2, ("mali_probe(): Called for platform device %s\n", pdev->name));
@@ -575,25 +577,38 @@
 		mdev->regulator = NULL;
 		/* Allow probe to continue without regulator */
 	}
+	if (mdev->regulator) {
+		mdev->opp_table = dev_pm_opp_set_regulators(mdev->dev, &name, 1);
+		if (IS_ERR(mdev->opp_table)) {
+			mdev->opp_table = NULL;
+			MALI_DEBUG_PRINT(2, ("Continuing without opp regulator\n"));
+		}
+	}
 #endif /* LINUX_VERSION_CODE >= 3, 12, 0 */
+
+	mdev->num_clks = devm_clk_bulk_get_all(mdev->dev, &mdev->clks);
+	if (mdev->num_clks < 1) {
+		MALI_DEBUG_PRINT(2, ("Continuing without Mali clock control\n"));
+		mdev->num_clks = 0;
+		mdev->clock = NULL;
+	} else {
+		/* Get "clk_mali" in the device tree for gpu dvfs */
+		mdev->clock = clk_get(mdev->dev, "clk_mali");
+		if (IS_ERR_OR_NULL(mdev->clock)) {
+			MALI_DEBUG_PRINT(2, ("Continuing without Mali dvfs clock\n"));
+			/* Allow probe to continue without clock. */
+			mdev->clock = NULL;
+		}
+	}
+	err = clk_bulk_prepare_enable(mdev->num_clks, mdev->clks);
+	if (err) {
+		MALI_PRINT_ERROR(("Failed to prepare clock (%d)\n", err));
+		goto clock_prepare_failed;
+	}
 
 	err = rk_platform_init_opp_table(mdev->dev);
 	if (err)
 		MALI_DEBUG_PRINT(3, ("Failed to init_opp_table\n"));
-
-	/* Need to name the gpu clock "clk_mali" in the device tree */
-	mdev->clock = clk_get(mdev->dev, "clk_mali");
-	if (IS_ERR_OR_NULL(mdev->clock)) {
-		MALI_DEBUG_PRINT(2, ("Continuing without Mali clock control\n"));
-		mdev->clock = NULL;
-		/* Allow probe to continue without clock. */
-	} else {
-		err = clk_prepare(mdev->clock);
-		if (err) {
-			MALI_PRINT_ERROR(("Failed to prepare clock (%d)\n", err));
-			goto clock_prepare_failed;
-		}
-	}
 
 	/* initilize pm metrics related */
 	if (mali_pm_metrics_init(mdev) < 0) {
@@ -605,6 +620,7 @@
 		MALI_DEBUG_PRINT(2, ("mali devfreq init failed\n"));
 		goto devfreq_init_failed;
 	}
+	clk_bulk_disable(mdev->num_clks, mdev->clks);
 #endif
 
 
@@ -640,8 +656,9 @@
 devfreq_init_failed:
 	mali_pm_metrics_term(mdev);
 pm_metrics_init_failed:
-	clk_unprepare(mdev->clock);
+	clk_bulk_disable_unprepare(mdev->num_clks, mdev->clks);
 clock_prepare_failed:
+	clk_bulk_put(mdev->num_clks, mdev->clks);
 	clk_put(mdev->clock);
 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 19, 0)) && defined(CONFIG_OF) \
                         && defined(CONFIG_PM_OPP)
@@ -651,6 +668,7 @@
 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 12, 0)) && defined(CONFIG_OF) \
                         && defined(CONFIG_REGULATOR)
 	regulator_put(mdev->regulator);
+	dev_pm_opp_put_regulators(mdev->opp_table);
 #endif /* LINUX_VERSION_CODE >= 3, 12, 0 */
 	mali_device_free(mdev);
 #endif
@@ -680,10 +698,12 @@
 	mali_pm_metrics_term(mdev);
 
 	if (mdev->clock) {
-		clk_unprepare(mdev->clock);
 		clk_put(mdev->clock);
 		mdev->clock = NULL;
 	}
+	clk_bulk_unprepare(mdev->num_clks, mdev->clks);
+	clk_bulk_put(mdev->num_clks, mdev->clks);
+
 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 19, 0)) && defined(CONFIG_OF) \
                         && defined(CONFIG_PM_OPP)
 	dev_pm_opp_of_remove_table(mdev->dev);
@@ -692,6 +712,7 @@
 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 12, 0)) && defined(CONFIG_OF) \
                         && defined(CONFIG_REGULATOR)
 	regulator_put(mdev->regulator);
+	dev_pm_opp_put_regulators(mdev->opp_table);
 #endif /* LINUX_VERSION_CODE >= 3, 12, 0 */
 	mali_device_free(mdev);
 #endif
@@ -733,6 +754,7 @@
 		return -ENODEV;
 #endif
 
+	pm_runtime_force_suspend(dev);
 #if defined(CONFIG_MALI_DEVFREQ) && \
                 (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 8, 0))
 	devfreq_suspend_device(mdev->devfreq);
@@ -777,6 +799,7 @@
                 (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 8, 0))
 	devfreq_resume_device(mdev->devfreq);
 #endif
+	pm_runtime_force_resume(dev);
 
 	return 0;
 }
diff --git a/kernel/drivers/gpu/arm/mali400/mali/linux/mali_osk_timers.c b/kernel/drivers/gpu/arm/mali400/mali/linux/mali_osk_timers.c
index d01c114..72d3980 100755
--- a/kernel/drivers/gpu/arm/mali400/mali/linux/mali_osk_timers.c
+++ b/kernel/drivers/gpu/arm/mali400/mali/linux/mali_osk_timers.c
@@ -18,59 +18,44 @@
 #include "mali_osk.h"
 #include "mali_kernel_common.h"
 
-struct _mali_osk_timer_t_struct {
-	struct timer_list timer;
-};
-
 typedef void (*timer_timeout_function_t)(unsigned long);
 
-_mali_osk_timer_t *_mali_osk_timer_init(_mali_osk_timer_callback_t callback)
+void _mali_osk_timer_init(_mali_osk_timer_t *tim, _mali_osk_timer_callback_t callback)
 {
-	_mali_osk_timer_t *t = (_mali_osk_timer_t *)kmalloc(sizeof(_mali_osk_timer_t), GFP_KERNEL);
+	_mali_osk_timer_t *t = tim;
 	if (NULL != t)
-		timer_setup(&t->timer,
+		timer_setup(t,
 			    (void (*)(struct timer_list *))callback, 0);
-	return t;
 }
 
 void _mali_osk_timer_add(_mali_osk_timer_t *tim, unsigned long ticks_to_expire)
 {
 	MALI_DEBUG_ASSERT_POINTER(tim);
-	tim->timer.expires = jiffies + ticks_to_expire;
-	add_timer(&(tim->timer));
+	tim->expires = jiffies + ticks_to_expire;
+	add_timer(tim);
 }
 
 void _mali_osk_timer_mod(_mali_osk_timer_t *tim, unsigned long ticks_to_expire)
 {
 	MALI_DEBUG_ASSERT_POINTER(tim);
-	mod_timer(&(tim->timer), jiffies + ticks_to_expire);
+	mod_timer(tim, jiffies + ticks_to_expire);
 }
 
 void _mali_osk_timer_del(_mali_osk_timer_t *tim)
 {
 	MALI_DEBUG_ASSERT_POINTER(tim);
-	del_timer_sync(&(tim->timer));
+	del_timer_sync(tim);
 }
 
 void _mali_osk_timer_del_async(_mali_osk_timer_t *tim)
 {
 	MALI_DEBUG_ASSERT_POINTER(tim);
-	del_timer(&(tim->timer));
+	del_timer(tim);
 }
 
 mali_bool _mali_osk_timer_pending(_mali_osk_timer_t *tim)
 {
 	MALI_DEBUG_ASSERT_POINTER(tim);
-	return 1 == timer_pending(&(tim->timer));
+	return 1 == timer_pending(tim);
 }
 
-void _mali_osk_timer_setcallback(_mali_osk_timer_t *tim, _mali_osk_timer_callback_t callback, void *data)
-{
-	MALI_DEBUG_ASSERT_POINTER(tim);
-}
-
-void _mali_osk_timer_term(_mali_osk_timer_t *tim)
-{
-	MALI_DEBUG_ASSERT_POINTER(tim);
-	kfree(tim);
-}
diff --git a/kernel/drivers/gpu/arm/mali400/mali/platform/rk/rk.c b/kernel/drivers/gpu/arm/mali400/mali/platform/rk/rk.c
index 9a012fd..4c6e7f9 100644
--- a/kernel/drivers/gpu/arm/mali400/mali/platform/rk/rk.c
+++ b/kernel/drivers/gpu/arm/mali400/mali/platform/rk/rk.c
@@ -34,7 +34,10 @@
 #include <linux/dma-mapping.h>
 #include <linux/pm_runtime.h>
 #include <linux/delay.h>
+#include <linux/regmap.h>
+#include <linux/mfd/syscon.h>
 #include <linux/rockchip/cpu.h>
+#include <soc/rockchip/rockchip_ipa.h>
 #include <soc/rockchip/rockchip_opp_select.h>
 
 #include <linux/mali/mali_utgard.h>
@@ -47,6 +50,7 @@
 
 /*---------------------------------------------------------------------------*/
 
+#define RK3528_GPU_SD_SLP_HAST	0x10024
 #define DEFAULT_UTILISATION_PERIOD_IN_MS (100)
 
 /*
@@ -55,6 +59,7 @@
 struct rk_context {
 	/* mali device. */
 	struct device *dev;
+	struct regmap *grf;
 	/* is the GPU powered on?  */
 	bool is_powered;
 	/* debug only, the period in ms to count gpu_utilisation. */
@@ -183,6 +188,10 @@
 	}
 
 	platform->dev = dev;
+	platform->grf = syscon_regmap_lookup_by_phandle(dev->of_node,
+							"rockchip,grf");
+	if (IS_ERR(platform->grf))
+		platform->grf = NULL;
 	platform->is_powered = false;
 
 	platform->utilisation_period = DEFAULT_UTILISATION_PERIOD_IN_MS;
@@ -232,73 +241,7 @@
 static u32 static_coefficient;
 static s32 ts[4];
 static struct thermal_zone_device *gpu_tz;
-
-static int power_model_simple_init(struct platform_device *pdev)
-{
-	struct device_node *power_model_node;
-	const char *tz_name;
-	u32 static_power, dynamic_power;
-	u32 voltage, voltage_squared, voltage_cubed, frequency;
-
-	power_model_node = of_get_child_by_name(pdev->dev.of_node,
-			"power_model");
-	if (!power_model_node) {
-		dev_err(&pdev->dev, "could not find power_model node\n");
-		return -ENODEV;
-	}
-	if (!of_device_is_compatible(power_model_node,
-			"arm,mali-simple-power-model")) {
-		dev_err(&pdev->dev, "power_model incompatible with simple power model\n");
-		return -ENODEV;
-	}
-
-	if (of_property_read_string(power_model_node, "thermal-zone",
-			&tz_name)) {
-		dev_err(&pdev->dev, "ts in power_model not available\n");
-		return -EINVAL;
-	}
-
-	gpu_tz = thermal_zone_get_zone_by_name(tz_name);
-	if (IS_ERR(gpu_tz)) {
-		pr_warn_ratelimited("Error getting gpu thermal zone '%s'(%ld), not yet ready?\n",
-				tz_name,
-				PTR_ERR(gpu_tz));
-		gpu_tz = NULL;
-	}
-
-	if (of_property_read_u32(power_model_node, "static-power",
-			&static_power)) {
-		dev_err(&pdev->dev, "static-power in power_model not available\n");
-		return -EINVAL;
-	}
-	if (of_property_read_u32(power_model_node, "dynamic-power",
-			&dynamic_power)) {
-		dev_err(&pdev->dev, "dynamic-power in power_model not available\n");
-		return -EINVAL;
-	}
-	if (of_property_read_u32(power_model_node, "voltage",
-			&voltage)) {
-		dev_err(&pdev->dev, "voltage in power_model not available\n");
-		return -EINVAL;
-	}
-	if (of_property_read_u32(power_model_node, "frequency",
-			&frequency)) {
-		dev_err(&pdev->dev, "frequency in power_model not available\n");
-		return -EINVAL;
-	}
-	voltage_squared = (voltage * voltage) / 1000;
-	voltage_cubed = voltage * voltage * voltage;
-	static_coefficient = (static_power << 20) / (voltage_cubed >> 10);
-	dynamic_coefficient = (((dynamic_power * 1000) / voltage_squared)
-			* 1000) / frequency;
-
-	if (of_property_read_u32_array(power_model_node, "ts", (u32 *)ts, 4)) {
-		dev_err(&pdev->dev, "ts in power_model not available\n");
-		return -EINVAL;
-	}
-
-	return 0;
-}
+static struct ipa_power_model_data *model_data;
 
 /* Calculate gpu static power example for reference */
 static unsigned long rk_model_static_power(struct devfreq *devfreq,
@@ -360,10 +303,107 @@
 	return dynamic_power;
 }
 
-struct devfreq_cooling_power rk_cooling_ops = {
+static struct devfreq_cooling_power rk_cooling_ops = {
 	.get_static_power = rk_model_static_power,
 	.get_dynamic_power = rk_model_dynamic_power,
 };
+
+static unsigned long mali_devfreq_get_static_power(struct devfreq *devfreq,
+						   unsigned long voltage)
+{
+	return rockchip_ipa_get_static_power(model_data, voltage);
+}
+
+static int power_model_simple_init(struct platform_device *pdev)
+{
+	struct device_node *power_model_node;
+	const char *tz_name;
+	u32 static_power, dynamic_power;
+	u32 voltage, voltage_squared, voltage_cubed, frequency;
+
+	if (of_find_compatible_node(pdev->dev.of_node, NULL, "simple-power-model")) {
+		of_property_read_u32(pdev->dev.of_node,
+				     "dynamic-power-coefficient",
+				     (u32 *)&rk_cooling_ops.dyn_power_coeff);
+		model_data = rockchip_ipa_power_model_init(&pdev->dev,
+							   "gpu_leakage");
+		if (IS_ERR_OR_NULL(model_data)) {
+			model_data = NULL;
+			dev_err(&pdev->dev, "failed to initialize power model\n");
+		} else if (model_data->dynamic_coefficient) {
+			rk_cooling_ops.dyn_power_coeff =
+			model_data->dynamic_coefficient;
+			rk_cooling_ops.get_dynamic_power = NULL;
+			rk_cooling_ops.get_static_power = mali_devfreq_get_static_power;
+		}
+		if (!rk_cooling_ops.dyn_power_coeff) {
+			dev_err(&pdev->dev, "failed to get dynamic-coefficient\n");
+			return -EINVAL;
+		}
+
+		return 0;
+	}
+
+	power_model_node = of_get_child_by_name(pdev->dev.of_node,
+			"power_model");
+	if (!power_model_node) {
+		dev_err(&pdev->dev, "could not find power_model node\n");
+		return -ENODEV;
+	}
+	if (!of_device_is_compatible(power_model_node,
+			"arm,mali-simple-power-model")) {
+		dev_err(&pdev->dev, "power_model incompatible with simple power model\n");
+		return -ENODEV;
+	}
+
+	if (of_property_read_string(power_model_node, "thermal-zone",
+			&tz_name)) {
+		dev_err(&pdev->dev, "ts in power_model not available\n");
+		return -EINVAL;
+	}
+
+	gpu_tz = thermal_zone_get_zone_by_name(tz_name);
+	if (IS_ERR(gpu_tz)) {
+		pr_warn_ratelimited("Error getting gpu thermal zone '%s'(%ld), not yet ready?\n",
+				tz_name,
+				PTR_ERR(gpu_tz));
+		gpu_tz = NULL;
+	}
+
+	if (of_property_read_u32(power_model_node, "static-power",
+			&static_power)) {
+		dev_err(&pdev->dev, "static-power in power_model not available\n");
+		return -EINVAL;
+	}
+	if (of_property_read_u32(power_model_node, "dynamic-power",
+			&dynamic_power)) {
+		dev_err(&pdev->dev, "dynamic-power in power_model not available\n");
+		return -EINVAL;
+	}
+	if (of_property_read_u32(power_model_node, "voltage",
+			&voltage)) {
+		dev_err(&pdev->dev, "voltage in power_model not available\n");
+		return -EINVAL;
+	}
+	if (of_property_read_u32(power_model_node, "frequency",
+			&frequency)) {
+		dev_err(&pdev->dev, "frequency in power_model not available\n");
+		return -EINVAL;
+	}
+	voltage_squared = (voltage * voltage) / 1000;
+	voltage_cubed = voltage * voltage * voltage;
+	static_coefficient = (static_power << 20) / (voltage_cubed >> 10);
+	dynamic_coefficient = (((dynamic_power * 1000) / voltage_squared)
+			* 1000) / frequency;
+
+	if (of_property_read_u32_array(power_model_node, "ts", (u32 *)ts, 4)) {
+		dev_err(&pdev->dev, "ts in power_model not available\n");
+		return -EINVAL;
+	}
+
+	return 0;
+}
+
 #endif
 
 /*---------------------------------------------------------------------------*/
@@ -376,8 +416,7 @@
 #if defined(CONFIG_MALI_DEVFREQ) && defined(CONFIG_HAVE_CLK)
 	struct mali_device *mdev = dev_get_drvdata(dev);
 
-	if (mdev->clock)
-		ret = clk_enable(mdev->clock);
+	ret = clk_bulk_enable(mdev->num_clks, mdev->clks);
 #endif
 	return ret;
 }
@@ -387,8 +426,7 @@
 #if defined(CONFIG_MALI_DEVFREQ) && defined(CONFIG_HAVE_CLK)
 	struct mali_device *mdev = dev_get_drvdata(dev);
 
-	if (mdev->clock)
-		clk_disable(mdev->clock);
+	clk_bulk_disable(mdev->num_clks, mdev->clks);
 #endif
 }
 
@@ -432,6 +470,18 @@
 			goto fail_to_enable_regulator;
 		}
 
+		if (cpu_is_rk3528()) {
+#if defined(CONFIG_MALI_DEVFREQ) && defined(CONFIG_HAVE_CLK)
+			struct mali_device *mdev = dev_get_drvdata(dev);
+
+			clk_set_rate(mdev->clock, mdev->current_freq);
+#endif
+			if (platform->grf)
+				regmap_write(platform->grf,
+					     RK3528_GPU_SD_SLP_HAST,
+					     0xffff0000);
+		}
+
 		platform->is_powered = true;
 	}
 
@@ -449,6 +499,18 @@
 	struct rk_context *platform = s_rk_context;
 
 	if (platform->is_powered) {
+		if (cpu_is_rk3528()) {
+#if defined(CONFIG_MALI_DEVFREQ) && defined(CONFIG_HAVE_CLK)
+			struct mali_device *mdev = dev_get_drvdata(dev);
+
+			//use normal pll 200M for gpu when suspend
+			clk_set_rate(mdev->clock, 200000000);
+#endif
+			if (platform->grf)
+				regmap_write(platform->grf,
+					     RK3528_GPU_SD_SLP_HAST,
+					     0xfffffffd);
+		}
 		rk_platform_disable_clk_gpu(dev);
 		rk_platform_disable_gpu_regulator(dev);
 
diff --git a/kernel/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c b/kernel/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c
index 40339d0..5fef2ba 100644
--- a/kernel/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c
+++ b/kernel/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c
@@ -261,11 +261,9 @@
 	}
 
 	/* Install the new fence list, seqcount provides the barriers */
-	preempt_disable();
-	write_seqcount_begin(&resv->seq);
+	write_seqlock(&resv->seq);
 	RCU_INIT_POINTER(resv->fence, new);
-	write_seqcount_end(&resv->seq);
-	preempt_enable();
+	write_sequnlock(&resv->seq);
 
 	/* Drop the references to the removed fences or move them to ef_list */
 	for (i = j, k = 0; i < old->shared_count; ++i) {
diff --git a/kernel/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c b/kernel/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c
index ed20d49..8f05fac 100644
--- a/kernel/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c
+++ b/kernel/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c
@@ -47,8 +47,16 @@
 				     const struct drm_display_mode *mode,
 				     unsigned int rate, unsigned int lanes)
 {
+	const struct drm_display_info *info;
 	u32 max_bw, req_bw, bpp = 24;
 
+	if (dp->plat_data->skip_connector)
+		return true;
+
+	info = &dp->connector.display_info;
+	if (info->bpc)
+		bpp = 3 * info->bpc;
+
 	req_bw = mode->clock * bpp / 8;
 	max_bw = lanes * rate;
 	if (req_bw > max_bw)
diff --git a/kernel/drivers/gpu/drm/bridge/analogix/analogix_dp_reg.c b/kernel/drivers/gpu/drm/bridge/analogix/analogix_dp_reg.c
index 5e966d5..7ea8132 100644
--- a/kernel/drivers/gpu/drm/bridge/analogix/analogix_dp_reg.c
+++ b/kernel/drivers/gpu/drm/bridge/analogix/analogix_dp_reg.c
@@ -117,8 +117,6 @@
 	reg = CH3_AMP_400_MV | CH2_AMP_400_MV |
 		CH1_AMP_400_MV | CH0_AMP_400_MV;
 	analogix_dp_write(dp, ANALOGIX_DP_TX_AMP_TUNING_CTL, reg);
-
-	analogix_dp_write(dp, ANALOGIX_DP_AUX, 0x4);
 }
 
 void analogix_dp_init_interrupt(struct analogix_dp_device *dp)
diff --git a/kernel/drivers/gpu/drm/bridge/icn6211.c b/kernel/drivers/gpu/drm/bridge/icn6211.c
deleted file mode 100644
index 9696376..0000000
--- a/kernel/drivers/gpu/drm/bridge/icn6211.c
+++ /dev/null
@@ -1,597 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0
-/*
- * Copyright (c) 2018 Rockchip Electronics Co. Ltd.
- *
- * Author: Wyon Bi <bivvy.bi@rock-chips.com>
- */
-
-#include <linux/kernel.h>
-#include <linux/delay.h>
-#include <linux/clk.h>
-#include <linux/gpio/consumer.h>
-#include <linux/regulator/consumer.h>
-#include <linux/i2c.h>
-#include <linux/module.h>
-#include <linux/of.h>
-#include <linux/of_gpio.h>
-#include <linux/regmap.h>
-
-#include <drm/drmP.h>
-#include <drm/drm_of.h>
-#include <drm/drm_atomic.h>
-#include <drm/drm_crtc_helper.h>
-#include <drm/drm_atomic_helper.h>
-#include <drm/drm_panel.h>
-#include <drm/drm_mipi_dsi.h>
-
-#define VENDOR_ID		0x0000
-#define DEVICE_ID_H		0x0001
-#define DEVICE_ID_L		0x0002
-#define VERSION_ID		0x0003
-#define FIRMWARE_VERSION	0x0008
-#define CONFIG_FINISH		0x0009
-#define PD_CTRL_0		0x000a
-#define PD_CTRL_1		0x000b
-#define PD_CTRL_2		0x000c
-#define PD_CTRL_3		0x000d
-#define RST_CTRL_0		0x000e
-#define RST_CTRL_1		0x000f
-#define SYS_CTRL_0		0x0010
-#define SYS_CTRL_1		0x0011
-#define SYS_CTRL_2		0x0012
-#define SYS_CTRL_3		0x0013
-#define SYS_CTRL_4		0x0014
-#define RGB_DRV_0		0x0018
-#define RGB_DRV_1		0x0019
-#define RGB_DRV_2		0x001a
-#define RGB_DRV_3		0x001b
-#define RGB_DLY_0		0x001c
-#define RGB_DLY_1		0x001d
-#define RGB_TEST_CTRL		0x001e
-#define ATE_PLL_EN		0x001f
-#define HACTIVE_L		0x0020
-#define VACTIVE_L		0x0021
-#define VACTIVE_HACTIVE_H	0x0022
-#define HFP_L			0x0023
-#define HSW_L			0x0024
-#define HBP_L			0x0025
-#define HFP_HSW_HBP_H		0x0026
-#define VFP			0x0027
-#define VSW			0x0028
-#define VBP			0x0029
-#define BIST_POL		0x002a
-#define BIST_RED		0x002b
-#define BIST_GREEN		0x002c
-#define BIST_BLUE		0x002d
-#define BIST_CHESS_X		0x002e
-#define BIST_CHESS_Y		0x002f
-#define BIST_CHESS_XY_H		0x0030
-#define BIST_FRAME_TIME_L	0x0031
-#define BIST_FRAME_TIME_H	0x0032
-#define FIFO_MAX_ADDR_LOW	0x0033
-#define SYNC_EVENT_DLY_LOW	0x0034
-#define HSW_MIN			0x0035
-#define HFP_MIN			0x0036
-#define LOGIC_RST_NUM		0x0037
-#define OSC_CTRL_0		0x0048
-#define	OSC_CTRL_1		0x0049
-#define OSC_CTRL_2		0x004a
-#define OSC_CTRL_3		0x004b
-#define OSC_CTRL_4		0x004c
-#define OSC_CTRL_5		0x004d
-#define BG_CTRL			0x004e
-#define LDO_PLL			0x004f
-#define PLL_CTRL_0		0x0050
-#define PLL_CTRL_1		0x0051
-#define PLL_CTRL_2		0x0052
-#define	PLL_CTRL_3		0x0053
-#define PLL_CTRL_4		0x0054
-#define PLL_CTRL_5		0x0055
-#define PLL_CTRL_6		0x0056
-#define PLL_CTRL_7		0x0057
-#define PLL_CTRL_8		0x0058
-#define PLL_CTRL_9		0x0059
-#define PLL_CTRL_A		0x005a
-#define PLL_CTRL_B		0x005b
-#define PLL_CTRL_C		0x005c
-#define PLL_CTRL_D		0x005d
-#define PLL_CTRL_E		0x005e
-#define PLL_CTRL_F		0x005f
-#define PLL_REM_0		0x0060
-#define PLL_REM_1		0x0061
-#define PLL_REM_2		0x0062
-#define PLL_DIV_0		0x0063
-#define PLL_DIV_1		0x0064
-#define PLL_DIV_2		0x0065
-#define PLL_FRAC_0		0x0066
-#define PLL_FRAC_1		0x0067
-#define PLL_FRAC_2		0x0068
-#define PLL_INT_0		0x0069
-#define PLL_INT_1		0x006a
-#define PLL_REF_DIV		0x006b
-#define PLL_SSC_P0		0x006c
-#define PLL_SSC_P1		0x006d
-#define PLL_SSC_P2		0x006e
-#define PLL_SSC_STEP0		0x006f
-#define PLL_SSC_STEP1		0x0070
-#define PLL_SSC_STEP2		0x0071
-#define PLL_SSC_OFFSET0		0x0072
-#define PLL_SSC_OFFSET1		0x0073
-#define PLL_SSC_OFFSET2		0x0074
-#define PLL_SSC_OFFSET3		0x0075
-#define GPIO_OEN		0x0079
-#define MIPI_CFG_PW		0x007a
-#define GPIO_0_SEL		0x007b
-#define GPIO_1_SEL		0x007c
-#define IRQ_SEL			0x007d
-#define DBG_SEL			0x007e
-#define DBG_SIGNAL		0x007f
-#define MIPI_ERR_VECTOR_L	0x0080
-#define MIPI_ERR_VECTOR_H	0x0081
-#define MIPI_ERR_VECTOR_EN_L	0x0082
-#define MIPI_ERR_VECTOR_EN_H	0x0083
-#define MIPI_MAX_SIZE_L		0x0084
-#define MIPI_MAX_SIZE_H		0x0085
-#define DSI_CTRL		0x0086
-#define MIPI_PN_SWAP		0x0087
-#define MIPI_SOT_SYNC_BIT_0	0x0088
-#define MIPI_SOT_SYNC_BIT_1	0x0089
-#define MIPI_ULPS_CTRL		0x008a
-#define MIPI_CLK_CHK_VAR	0x008e
-#define MIPI_CLK_CHK_INI	0x008f
-#define MIPI_T_TERM_EN		0x0090
-#define MIPI_T_HS_SETTLE	0x0091
-#define MIPI_T_TA_SURE_PRE	0x0092
-#define MIPI_T_LPX_SET		0x0094
-#define MIPI_T_CLK_MISS		0x0095
-#define MIPI_INIT_TIME_L	0x0096
-#define MIPI_INIT_TIME_H	0x0097
-#define MIPI_T_CLK_TERM_EN	0x0099
-#define MIPI_T_CLK_SETTLE	0x009a
-#define MIPI_TO_HS_RX_L		0x009e
-#define MIPI_TO_HS_RX_H		0x009f
-#define MIPI_PHY_0		0x00a0
-#define MIPI_PHY_1		0x00a1
-#define MIPI_PHY_2		0x00a2
-#define MIPI_PHY_3		0x00a3
-#define MIPI_PHY_4		0x00a4
-#define MIPI_PHY_5		0x00a5
-#define MIPI_PD_RX		0x00b0
-#define MIPI_PD_TERM		0x00b1
-#define MIPI_PD_HSRX		0x00b2
-#define MIPI_PD_LPTX		0x00b3
-#define MIPI_PD_LPRX		0x00b4
-#define MIPI_PD_CK_LANE		0x00b5
-#define MIPI_FORCE_0		0x00b6
-#define MIPI_RST_CTRL		0x00b7
-#define MIPI_RST_NUM		0x00b8
-#define MIPI_DBG_SET_0		0x00c0
-#define MIPI_DBG_SET_1		0x00c1
-#define MIPI_DBG_SET_2		0x00c2
-#define MIPI_DBG_SET_3		0x00c3
-#define MIPI_DBG_SET_4		0x00c4
-#define MIPI_DBG_SET_5		0x00c5
-#define MIPI_DBG_SET_6		0x00c6
-#define MIPI_DBG_SET_7		0x00c7
-#define MIPI_DBG_SET_8		0x00c8
-#define MIPI_DBG_SET_9		0x00c9
-#define MIPI_DBG_SEL		0x00e0
-#define MIPI_DBG_DATA		0x00e1
-#define MIPI_ATE_TEST_SEL	0x00e2
-#define MIPI_ATE_STATUS_0	0x00e3
-#define MIPI_ATE_STATUS_1	0x00e4
-#define ICN6211_MAX_REGISTER	MIPI_ATE_STATUS_1
-
-struct icn6211 {
-	struct drm_bridge base;
-	struct drm_connector connector;
-	struct drm_panel *panel;
-	struct drm_bridge *bridge;
-	struct drm_display_mode mode;
-
-	struct device *dev;
-	struct i2c_client *client;
-	struct mipi_dsi_device dsi;
-	struct regmap *regmap;
-	struct clk *refclk;	/* reference clock for RGB output clock */
-	struct regulator *vdd1;	/* MIPI RX power supply, can be 1.8V-3.3V */
-	struct regulator *vdd2; /* PLL power supply, can be 1.8V-3.3V */
-	struct regulator *vdd3;	/* RGB output power supply, can be 1.8V-3.3V */
-	struct gpio_desc *enable_gpio;	/* When EN is low, this chip is reset */
-};
-
-static inline struct icn6211 *bridge_to_icn6211(struct drm_bridge *b)
-{
-	return container_of(b, struct icn6211, base);
-}
-
-static inline struct icn6211 *connector_to_icn6211(struct drm_connector *c)
-{
-	return container_of(c, struct icn6211, connector);
-}
-
-static enum drm_connector_status
-icn6211_connector_detect(struct drm_connector *connector, bool force)
-{
-	return connector_status_connected;
-}
-
-static const struct drm_connector_funcs icn6211_connector_funcs = {
-	.dpms = drm_atomic_helper_connector_dpms,
-	.detect = icn6211_connector_detect,
-	.fill_modes = drm_helper_probe_single_connector_modes,
-	.destroy = drm_connector_cleanup,
-	.reset = drm_atomic_helper_connector_reset,
-	.atomic_duplicate_state = drm_atomic_helper_connector_duplicate_state,
-	.atomic_destroy_state = drm_atomic_helper_connector_destroy_state,
-};
-
-static struct drm_encoder *
-icn6211_connector_best_encoder(struct drm_connector *connector)
-{
-	struct icn6211 *icn6211 = connector_to_icn6211(connector);
-
-	return icn6211->base.encoder;
-}
-
-static int icn6211_connector_get_modes(struct drm_connector *connector)
-{
-	struct icn6211 *icn6211 = connector_to_icn6211(connector);
-
-	return drm_panel_get_modes(icn6211->panel);
-}
-
-static const struct drm_connector_helper_funcs
-icn6211_connector_helper_funcs = {
-	.get_modes = icn6211_connector_get_modes,
-	.best_encoder = icn6211_connector_best_encoder,
-};
-
-static void icn6211_bridge_disable(struct drm_bridge *bridge)
-{
-	struct icn6211 *icn6211 = bridge_to_icn6211(bridge);
-
-	if (icn6211->panel)
-		drm_panel_disable(icn6211->panel);
-}
-
-static void icn6211_bridge_enable(struct drm_bridge *bridge)
-{
-	struct icn6211 *icn6211 = bridge_to_icn6211(bridge);
-
-	if (icn6211->panel)
-		drm_panel_enable(icn6211->panel);
-}
-
-static void icn6211_bridge_post_disable(struct drm_bridge *bridge)
-{
-	struct icn6211 *icn6211 = bridge_to_icn6211(bridge);
-
-	if (icn6211->panel)
-		drm_panel_unprepare(icn6211->panel);
-
-	if (icn6211->enable_gpio)
-		gpiod_direction_output(icn6211->enable_gpio, 0);
-
-	regulator_disable(icn6211->vdd3);
-	regulator_disable(icn6211->vdd2);
-	regulator_disable(icn6211->vdd1);
-
-	clk_disable_unprepare(icn6211->refclk);
-}
-
-static void icn6211_bridge_pre_enable(struct drm_bridge *bridge)
-{
-	struct icn6211 *icn6211 = bridge_to_icn6211(bridge);
-	const struct drm_display_mode *mode = &icn6211->mode;
-	u32 hactive, hfp, hsw, hbp, vactive, vfp, vsw, vbp;
-	u8 hactive_l, hactive_h, hfp_l, hfp_h, hbp_l, hbp_h, hsw_l, hsw_h;
-	u8 vactive_l, vactive_h;
-	u32 device_id_h, device_id_l;
-	u32 pll_refdiv, pll_extra_div, pll_dv, pll_int;
-	unsigned long refclk = clk_get_rate(icn6211->refclk);
-	int ret;
-
-	clk_prepare_enable(icn6211->refclk);
-
-	ret = regulator_enable(icn6211->vdd1);
-	if (ret)
-		dev_err(icn6211->dev,
-			"failed to enable vdd1 supply: %d\n", ret);
-
-	ret = regulator_enable(icn6211->vdd2);
-	if (ret)
-		dev_err(icn6211->dev,
-			"failed to enable vdd2 supply: %d\n", ret);
-
-	ret = regulator_enable(icn6211->vdd3);
-	if (ret)
-		dev_err(icn6211->dev,
-			"failed to enable vdd3 supply: %d\n", ret);
-
-	if (icn6211->enable_gpio)
-		gpiod_direction_output(icn6211->enable_gpio, 1);
-
-	usleep_range(10000, 11000);
-
-	regmap_read(icn6211->regmap, DEVICE_ID_H, &device_id_h);
-	regmap_read(icn6211->regmap, DEVICE_ID_L, &device_id_l);
-	dev_info(icn6211->dev, "The ID of device: 0x%04x\n",
-		 (device_id_h << 8) | device_id_l);
-
-	hactive = mode->hdisplay;
-	hfp = mode->hsync_start - mode->hdisplay;
-	hsw = mode->hsync_end - mode->hsync_start;
-	hbp = mode->htotal - mode->hsync_end;
-	vactive = mode->vdisplay;
-	vfp = mode->vsync_start - mode->vdisplay;
-	vsw = mode->vsync_end - mode->vsync_start;
-	vbp = mode->vtotal - mode->vsync_end;
-
-	hactive_l = hactive & 0xff;
-	hactive_h = (hactive >> 8) & 0xf;
-	vactive_l = vactive & 0xff;
-	vactive_h = (vactive >> 8) & 0xf;
-	hfp_l = hfp & 0xff;
-	hfp_h = (hfp >> 8) & 0x3;
-	hsw_l = hsw & 0xff;
-	hsw_h = (hsw >> 8) & 0x3;
-	hbp_l = hbp & 0xff;
-	hbp_h = (hbp >> 8) & 0x3;
-
-	regmap_write(icn6211->regmap, HACTIVE_L, hactive_l);
-	regmap_write(icn6211->regmap, VACTIVE_L, vactive_l);
-	regmap_write(icn6211->regmap, VACTIVE_HACTIVE_H,
-		     (vactive_h << 4) | hactive_h);
-	regmap_write(icn6211->regmap, HFP_L, hfp_l);
-	regmap_write(icn6211->regmap, HSW_L, hsw_l);
-	regmap_write(icn6211->regmap, HBP_L, hbp_l);
-	regmap_write(icn6211->regmap, HFP_HSW_HBP_H,
-		     (hfp_h << 4) | (hsw_h << 2) | hbp_h);
-	regmap_write(icn6211->regmap, VFP, vfp);
-	regmap_write(icn6211->regmap, VSW, vsw);
-	regmap_write(icn6211->regmap, VBP, vbp);
-	regmap_write(icn6211->regmap, SYNC_EVENT_DLY_LOW, 0x80);
-	regmap_write(icn6211->regmap, HFP_MIN, hfp);
-	regmap_write(icn6211->regmap, MIPI_PD_CK_LANE, 0xa0);
-	regmap_write(icn6211->regmap, PLL_CTRL_C, 0xff);
-	regmap_write(icn6211->regmap, BIST_POL, 0x01);
-	regmap_write(icn6211->regmap, PLL_CTRL_6, 0x90);
-
-	/*
-	 * FIXME:
-	 * fout = fin / pll_refdiv / pll_extra_div * pll_int / pll_dv / 2
-	 */
-	pll_refdiv = 1;
-	pll_extra_div = 2;
-
-	if (mode->clock <= 44000) {
-		pll_dv = 8;
-		regmap_write(icn6211->regmap, PLL_REF_DIV, 0x71);
-	} else if (mode->clock <= 88000) {
-		pll_dv = 4;
-		regmap_write(icn6211->regmap, PLL_REF_DIV, 0x51);
-	} else {
-		pll_dv = 2;
-		regmap_write(icn6211->regmap, PLL_REF_DIV, 0x31);
-	}
-
-	pll_int = DIV_ROUND_UP(mode->clock * 1000 * 2 * pll_dv,
-			       refclk / pll_refdiv / pll_extra_div);
-	regmap_write(icn6211->regmap, PLL_INT_0, pll_int);
-
-	dev_dbg(icn6211->dev,
-		"pll_refdiv=%d, pll_extra_div=%d, pll_int=%d, pll_dv=%d\n",
-		pll_refdiv, pll_extra_div, pll_int, pll_dv);
-	dev_dbg(icn6211->dev, "fin=%ld, fout=%ld\n", refclk,
-		refclk / pll_refdiv / pll_extra_div * pll_int / pll_dv / 2);
-
-	/*
-	 * TODO:
-	 *			RGB color swap mode
-	 * RGB_SWAP	000	001	010	011	100	101
-	 * Group_0	Red	Red	Green	Green	Blue	Blue
-	 * Group_1	Green	Blue	Red	Blue	Red	Green
-	 * Group_2	Blue	Green	Blue	Red	Green	Red
-	 *
-	 *			Data bit order mode
-	 * BIT_ORDER	000	 001	  010	   011	    100	     101
-	 * Group_X[7]	invalid	 invalid  Color[5] Color[0] Color[7] Color[0]
-	 * Group_X[6]	invalid	 invalid  Color[4] Color[1] Color[6] Color[1]
-	 * Group_X[5]	Color[5] Color[0] Color[3] Color[2] Color[5] Color[2]
-	 * Group_X[4]	Color[4] Color[1] Color[2] Color[3] Color[4] Color[3]
-	 * Group_X[3]	Color[3] Color[2] Color[1] Color[4] Color[3] Color[4]
-	 * Group_X[2]	Color[2] Color[3] Color[0] Color[5] Color[2] Color[5]
-	 * Group_X[1]	Color[1] Color[4] invaild  invaild  Color[1] Color[6]
-	 * Group_X[0]	Color[0] Color[5] invaild  invaild  Color[0] Color[7]
-	 *
-	 * Note: Group_0[7:0] = DATA[7:0]
-	 *	 Group_1[7:0] = DATA[15:8]
-	 *	 Group_2[7:0] = DATA[23:16]
-	 */
-	regmap_write(icn6211->regmap, SYS_CTRL_0, 0x45);
-	regmap_write(icn6211->regmap, SYS_CTRL_1, 0x88);
-	regmap_write(icn6211->regmap, MIPI_FORCE_0, 0x20);
-	regmap_write(icn6211->regmap, PLL_CTRL_1, 0x20);
-	regmap_write(icn6211->regmap, CONFIG_FINISH, 0x10);
-
-	if (icn6211->panel)
-		drm_panel_prepare(icn6211->panel);
-}
-
-static void icn6211_bridge_mode_set(struct drm_bridge *bridge,
-				    struct drm_display_mode *mode,
-				    struct drm_display_mode *adj)
-{
-	struct icn6211 *icn6211 = bridge_to_icn6211(bridge);
-
-	drm_mode_copy(&icn6211->mode, adj);
-}
-
-static int icn6211_bridge_attach(struct drm_bridge *bridge)
-{
-	struct icn6211 *icn6211 = bridge_to_icn6211(bridge);
-	struct drm_connector *connector = &icn6211->connector;
-	struct drm_device *drm = bridge->dev;
-	struct mipi_dsi_host *host = bridge->driver_private;
-	struct mipi_dsi_device *dsi = &icn6211->dsi;
-	int ret;
-
-	dsi->lanes = 4;
-	dsi->channel = 0;
-	dsi->format = MIPI_DSI_FMT_RGB888;
-	dsi->mode_flags = MIPI_DSI_MODE_VIDEO | MIPI_DSI_MODE_VIDEO_BURST |
-			  MIPI_DSI_MODE_LPM | MIPI_DSI_MODE_EOT_PACKET;
-	dsi->host = host;
-
-	ret = mipi_dsi_attach(dsi);
-	if (ret) {
-		dev_err(icn6211->dev, "failed to attach dsi host: %d\n", ret);
-		return ret;
-	}
-
-	if (icn6211->bridge) {
-		icn6211->bridge->encoder = bridge->encoder;
-
-		ret = drm_bridge_attach(drm, icn6211->bridge);
-		if (ret) {
-			dev_err(icn6211->dev,
-				"failed to attach bridge: %d\n", ret);
-			return ret;
-		}
-
-		bridge->next = icn6211->bridge;
-	} else {
-		ret = drm_connector_init(drm, connector,
-					 &icn6211_connector_funcs,
-					 DRM_MODE_CONNECTOR_DPI);
-		if (ret) {
-			dev_err(icn6211->dev,
-				"failed to initialize connector\n");
-			return ret;
-		}
-
-		drm_connector_helper_add(connector,
-					 &icn6211_connector_helper_funcs);
-		drm_mode_connector_attach_encoder(connector, bridge->encoder);
-		drm_panel_attach(icn6211->panel, connector);
-	}
-
-	return 0;
-}
-
-static const struct drm_bridge_funcs icn6211_bridge_funcs = {
-	.attach = icn6211_bridge_attach,
-	.mode_set = icn6211_bridge_mode_set,
-	.pre_enable = icn6211_bridge_pre_enable,
-	.enable = icn6211_bridge_enable,
-	.disable = icn6211_bridge_disable,
-	.post_disable = icn6211_bridge_post_disable,
-};
-
-static const struct regmap_config icn6211_regmap_config = {
-	.name = "icn6211",
-	.reg_bits = 8,
-	.val_bits = 8,
-	.max_register = ICN6211_MAX_REGISTER,
-};
-
-static int icn6211_i2c_probe(struct i2c_client *client,
-			     const struct i2c_device_id *id)
-{
-	struct device *dev = &client->dev;
-	struct icn6211 *icn6211;
-	int ret;
-
-	icn6211 = devm_kzalloc(dev, sizeof(*icn6211), GFP_KERNEL);
-	if (!icn6211)
-		return -ENOMEM;
-
-	icn6211->dev = dev;
-	icn6211->client = client;
-	i2c_set_clientdata(client, icn6211);
-
-	ret = drm_of_find_panel_or_bridge(dev->of_node, 1, -1,
-					  &icn6211->panel, &icn6211->bridge);
-	if (ret)
-		return ret;
-
-	icn6211->refclk = devm_clk_get(dev, "refclk");
-	if (IS_ERR(icn6211->refclk)) {
-		ret = PTR_ERR(icn6211->refclk);
-		dev_err(dev, "failed to get ref clk: %d\n", ret);
-		return ret;
-	}
-
-	icn6211->vdd1 = devm_regulator_get(dev, "vdd1");
-	if (IS_ERR(icn6211->vdd1))
-		return PTR_ERR(icn6211->vdd1);
-
-	icn6211->vdd2 = devm_regulator_get(dev, "vdd2");
-	if (IS_ERR(icn6211->vdd2))
-		return PTR_ERR(icn6211->vdd2);
-
-	icn6211->vdd3 = devm_regulator_get(dev, "vdd3");
-	if (IS_ERR(icn6211->vdd3))
-		return PTR_ERR(icn6211->vdd3);
-
-	icn6211->enable_gpio = devm_gpiod_get_optional(dev, "enable", 0);
-	if (IS_ERR(icn6211->enable_gpio)) {
-		ret = PTR_ERR(icn6211->enable_gpio);
-		dev_err(dev, "failed to request enable GPIO: %d\n", ret);
-		return ret;
-	}
-
-	icn6211->regmap = devm_regmap_init_i2c(client, &icn6211_regmap_config);
-	if (IS_ERR(icn6211->regmap)) {
-		ret = PTR_ERR(icn6211->regmap);
-		dev_err(dev, "failed to initialize regmap: %d\n", ret);
-		return ret;
-	}
-
-	icn6211->base.funcs = &icn6211_bridge_funcs;
-	icn6211->base.of_node = dev->of_node;
-	ret = drm_bridge_add(&icn6211->base);
-	if (ret) {
-		dev_err(dev, "failed to add drm_bridge: %d\n", ret);
-		return ret;
-	}
-
-	return 0;
-}
-
-static int icn6211_i2c_remove(struct i2c_client *client)
-{
-	struct icn6211 *icn6211 = i2c_get_clientdata(client);
-
-	drm_bridge_remove(&icn6211->base);
-
-	return 0;
-}
-
-static const struct i2c_device_id icn6211_i2c_table[] = {
-	{ "icn6211", 0 },
-	{}
-};
-MODULE_DEVICE_TABLE(i2c, icn6211_i2c_table);
-
-static const struct of_device_id icn6211_of_match[] = {
-	{ .compatible = "chipone,icn6211" },
-	{}
-};
-MODULE_DEVICE_TABLE(of, icn6211_of_match);
-
-static struct i2c_driver icn6211_i2c_driver = {
-	.driver = {
-		.name = "icn6211",
-		.of_match_table = icn6211_of_match,
-	},
-	.probe = icn6211_i2c_probe,
-	.remove = icn6211_i2c_remove,
-	.id_table = icn6211_i2c_table,
-};
-module_i2c_driver(icn6211_i2c_driver);
-
-MODULE_AUTHOR("Wyon Bi <bivvy.bi@rock-chips.com>");
-MODULE_DESCRIPTION("Chipone ICN6211 MIPI-DSI to RGB bridge chip driver");
-MODULE_LICENSE("GPL v2");
diff --git a/kernel/drivers/gpu/drm/bridge/lontium-lt9611.c b/kernel/drivers/gpu/drm/bridge/lontium-lt9611.c
index 8ae33c6..1908080 100644
--- a/kernel/drivers/gpu/drm/bridge/lontium-lt9611.c
+++ b/kernel/drivers/gpu/drm/bridge/lontium-lt9611.c
@@ -93,6 +93,8 @@
 	{ 1920, 1080, 60, 4, 1 }, /* 1080P 24bit 60Hz 4lane 1port */
 	{ 1920, 1080, 30, 3, 1 }, /* 1080P 24bit 30Hz 3lane 1port */
 	{ 1920, 1080, 24, 3, 1 },
+	{ 1280, 720, 60, 4, 1 },
+	{ 1280, 720, 30, 4, 1 },
 	{ 720, 480, 60, 4, 1 },
 	{ 720, 576, 50, 2, 1 },
 	{ 640, 480, 60, 2, 1 },
@@ -228,8 +230,14 @@
 	case 640:
 		regmap_write(lt9611->regmap, 0x8326, 0x14);
 		break;
+	case 1280:
+		regmap_write(lt9611->regmap, 0x8326, 0x1c);
+		break;
 	case 1920:
-		regmap_write(lt9611->regmap, 0x8326, 0x37);
+		if (drm_mode_vrefresh(mode) == 30)
+			regmap_write(lt9611->regmap, 0x8326, 0x1c);
+		else
+			regmap_write(lt9611->regmap, 0x8326, 0x37);
 		break;
 	case 3840:
 		regmap_multi_reg_write(lt9611->regmap, reg_cfg2, ARRAY_SIZE(reg_cfg2));
diff --git a/kernel/drivers/gpu/drm/bridge/lt8912.c b/kernel/drivers/gpu/drm/bridge/lt8912.c
deleted file mode 100644
index db33c81..0000000
--- a/kernel/drivers/gpu/drm/bridge/lt8912.c
+++ /dev/null
@@ -1,484 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0
-/*
- * Copyright (c) 2018 Rockchip Electronics Co. Ltd.
- */
-
-#include <linux/kernel.h>
-#include <linux/delay.h>
-#include <linux/gpio.h>
-#include <linux/gpio/consumer.h>
-#include <linux/i2c.h>
-#include <linux/module.h>
-#include <linux/of.h>
-#include <linux/of_irq.h>
-#include <linux/of_graph.h>
-#include <linux/regmap.h>
-#include <video/of_display_timing.h>
-
-#include <drm/drmP.h>
-#include <drm/drm_of.h>
-#include <drm/drm_atomic.h>
-#include <drm/drm_crtc_helper.h>
-#include <drm/drm_atomic_helper.h>
-#include <drm/drm_panel.h>
-#include <drm/drm_mipi_dsi.h>
-
-struct lt8912 {
-	struct drm_bridge bridge;
-	struct drm_connector connector;
-	struct drm_display_mode mode;
-	struct device *dev;
-	struct mipi_dsi_device *dsi;
-	struct regmap *regmap[3];
-	struct gpio_desc *reset_n;
-};
-
-static inline struct lt8912 *bridge_to_lt8912(struct drm_bridge *b)
-{
-	return container_of(b, struct lt8912, bridge);
-}
-
-static inline struct lt8912 *connector_to_lt8912(struct drm_connector *c)
-{
-	return container_of(c, struct lt8912, connector);
-}
-
-/* LT8912 MIPI to HDMI & LVDS REG setting - 20180115.txt */
-static void lt8912_init(struct lt8912 *lt8912)
-{
-	u8 lanes = lt8912->dsi->lanes;
-	const struct drm_display_mode *mode = &lt8912->mode;
-	u32 hactive, hfp, hsync, hbp, vfp, vsync, vbp, htotal, vtotal;
-	unsigned int version[2];
-
-	/* TODO: lvds output init */
-
-	hactive = mode->hdisplay;
-	hfp = mode->hsync_start - mode->hdisplay;
-	hsync = mode->hsync_end - mode->hsync_start;
-	hbp = mode->htotal - mode->hsync_end;
-	vfp = mode->vsync_start - mode->vdisplay;
-	vsync = mode->vsync_end - mode->vsync_start;
-	vbp = mode->vtotal - mode->vsync_end;
-	htotal = mode->htotal;
-	vtotal = mode->vtotal;
-
-	regmap_read(lt8912->regmap[0], 0x00, &version[0]);
-	regmap_read(lt8912->regmap[0], 0x01, &version[1]);
-
-	dev_info(lt8912->dev, "LT8912 ID: %02x, %02x\n",
-		 version[0], version[1]);
-
-	/* DigitalClockEn */
-	regmap_write(lt8912->regmap[0], 0x08, 0xff);
-	regmap_write(lt8912->regmap[0], 0x09, 0x81);
-	regmap_write(lt8912->regmap[0], 0x0a, 0xff);
-	regmap_write(lt8912->regmap[0], 0x0b, 0x64);
-	regmap_write(lt8912->regmap[0], 0x0c, 0xff);
-
-	regmap_write(lt8912->regmap[0], 0x44, 0x31);
-	regmap_write(lt8912->regmap[0], 0x51, 0x1f);
-
-	/* TxAnalog */
-	regmap_write(lt8912->regmap[0], 0x31, 0xa1);
-	regmap_write(lt8912->regmap[0], 0x32, 0xa1);
-	regmap_write(lt8912->regmap[0], 0x33, 0x03);
-	regmap_write(lt8912->regmap[0], 0x37, 0x00);
-	regmap_write(lt8912->regmap[0], 0x38, 0x22);
-	regmap_write(lt8912->regmap[0], 0x60, 0x82);
-
-	/* CbusAnalog */
-	regmap_write(lt8912->regmap[0], 0x39, 0x45);
-	regmap_write(lt8912->regmap[0], 0x3b, 0x00);
-
-	/* HDMIPllAnalog */
-	regmap_write(lt8912->regmap[0], 0x44, 0x31);
-	regmap_write(lt8912->regmap[0], 0x55, 0x44);
-	regmap_write(lt8912->regmap[0], 0x57, 0x01);
-	regmap_write(lt8912->regmap[0], 0x5a, 0x02);
-
-	/* MipiBasicSet */
-	regmap_write(lt8912->regmap[1], 0x10, 0x01);
-	regmap_write(lt8912->regmap[1], 0x11, 0x08);
-	regmap_write(lt8912->regmap[1], 0x12, 0x04);
-	regmap_write(lt8912->regmap[1], 0x13, lanes % 4);
-	regmap_write(lt8912->regmap[1], 0x14, 0x00);
-
-	regmap_write(lt8912->regmap[1], 0x15, 0x00);
-	regmap_write(lt8912->regmap[1], 0x1a, 0x03);
-	regmap_write(lt8912->regmap[1], 0x1b, 0x03);
-
-	/* MIPIDig */
-	regmap_write(lt8912->regmap[1], 0x18, hsync);
-	regmap_write(lt8912->regmap[1], 0x19, vsync);
-	regmap_write(lt8912->regmap[1], 0x1c, hactive);
-	regmap_write(lt8912->regmap[1], 0x1d, hactive >> 8);
-
-	regmap_write(lt8912->regmap[1], 0x1e, 0x67);
-	regmap_write(lt8912->regmap[1], 0x2f, 0x0c);
-
-	regmap_write(lt8912->regmap[1], 0x34, htotal);
-	regmap_write(lt8912->regmap[1], 0x35, htotal >> 8);
-	regmap_write(lt8912->regmap[1], 0x36, vtotal);
-	regmap_write(lt8912->regmap[1], 0x37, vtotal >> 8);
-	regmap_write(lt8912->regmap[1], 0x38, vbp);
-	regmap_write(lt8912->regmap[1], 0x39, vbp >> 8);
-	regmap_write(lt8912->regmap[1], 0x3a, vfp);
-	regmap_write(lt8912->regmap[1], 0x3b, vfp >> 8);
-	regmap_write(lt8912->regmap[1], 0x3c, hbp);
-	regmap_write(lt8912->regmap[1], 0x3d, hbp >> 8);
-	regmap_write(lt8912->regmap[1], 0x3e, hfp);
-	regmap_write(lt8912->regmap[1], 0x3f, hfp >> 8);
-
-	/* DDSConfig */
-	regmap_write(lt8912->regmap[1], 0x4e, 0x52);
-	regmap_write(lt8912->regmap[1], 0x4f, 0xde);
-	regmap_write(lt8912->regmap[1], 0x50, 0xc0);
-	regmap_write(lt8912->regmap[1], 0x51, 0x80);
-	regmap_write(lt8912->regmap[1], 0x51, 0x00);
-
-	regmap_write(lt8912->regmap[1], 0x1f, 0x5e);
-	regmap_write(lt8912->regmap[1], 0x20, 0x01);
-	regmap_write(lt8912->regmap[1], 0x21, 0x2c);
-	regmap_write(lt8912->regmap[1], 0x22, 0x01);
-	regmap_write(lt8912->regmap[1], 0x23, 0xfa);
-	regmap_write(lt8912->regmap[1], 0x24, 0x00);
-	regmap_write(lt8912->regmap[1], 0x25, 0xc8);
-	regmap_write(lt8912->regmap[1], 0x26, 0x00);
-	regmap_write(lt8912->regmap[1], 0x27, 0x5e);
-	regmap_write(lt8912->regmap[1], 0x28, 0x01);
-	regmap_write(lt8912->regmap[1], 0x29, 0x2c);
-	regmap_write(lt8912->regmap[1], 0x2a, 0x01);
-	regmap_write(lt8912->regmap[1], 0x2b, 0xfa);
-	regmap_write(lt8912->regmap[1], 0x2c, 0x00);
-	regmap_write(lt8912->regmap[1], 0x2d, 0xc8);
-	regmap_write(lt8912->regmap[1], 0x2e, 0x00);
-
-	regmap_write(lt8912->regmap[0], 0x03, 0x7f);
-	usleep_range(10000, 20000);
-	regmap_write(lt8912->regmap[0], 0x03, 0xff);
-
-	regmap_write(lt8912->regmap[1], 0x42, 0x64);
-	regmap_write(lt8912->regmap[1], 0x43, 0x00);
-	regmap_write(lt8912->regmap[1], 0x44, 0x04);
-	regmap_write(lt8912->regmap[1], 0x45, 0x00);
-	regmap_write(lt8912->regmap[1], 0x46, 0x59);
-	regmap_write(lt8912->regmap[1], 0x47, 0x00);
-	regmap_write(lt8912->regmap[1], 0x48, 0xf2);
-	regmap_write(lt8912->regmap[1], 0x49, 0x06);
-	regmap_write(lt8912->regmap[1], 0x4a, 0x00);
-	regmap_write(lt8912->regmap[1], 0x4b, 0x72);
-	regmap_write(lt8912->regmap[1], 0x4c, 0x45);
-	regmap_write(lt8912->regmap[1], 0x4d, 0x00);
-	regmap_write(lt8912->regmap[1], 0x52, 0x08);
-	regmap_write(lt8912->regmap[1], 0x53, 0x00);
-	regmap_write(lt8912->regmap[1], 0x54, 0xb2);
-	regmap_write(lt8912->regmap[1], 0x55, 0x00);
-	regmap_write(lt8912->regmap[1], 0x56, 0xe4);
-	regmap_write(lt8912->regmap[1], 0x57, 0x0d);
-	regmap_write(lt8912->regmap[1], 0x58, 0x00);
-	regmap_write(lt8912->regmap[1], 0x59, 0xe4);
-	regmap_write(lt8912->regmap[1], 0x5a, 0x8a);
-	regmap_write(lt8912->regmap[1], 0x5b, 0x00);
-	regmap_write(lt8912->regmap[1], 0x5c, 0x34);
-	regmap_write(lt8912->regmap[1], 0x1e, 0x4f);
-	regmap_write(lt8912->regmap[1], 0x51, 0x00);
-
-	regmap_write(lt8912->regmap[0], 0xb2, 0x01);
-
-	/* AudioIIsEn */
-	regmap_write(lt8912->regmap[2], 0x06, 0x08);
-	regmap_write(lt8912->regmap[2], 0x07, 0xf0);
-
-	regmap_write(lt8912->regmap[2], 0x34, 0xd2);
-
-	regmap_write(lt8912->regmap[2], 0x3c, 0x41);
-
-	/* MIPIRxLogicRes */
-	regmap_write(lt8912->regmap[0], 0x03, 0x7f);
-	usleep_range(10000, 20000);
-	regmap_write(lt8912->regmap[0], 0x03, 0xff);
-
-	regmap_write(lt8912->regmap[1], 0x51, 0x80);
-	usleep_range(10000, 20000);
-	regmap_write(lt8912->regmap[1], 0x51, 0x00);
-}
-
-static void lt8912_exit(struct lt8912 *lt8912)
-{
-	regmap_write(lt8912->regmap[0], 0x08, 0x00);
-	regmap_write(lt8912->regmap[0], 0x09, 0x81);
-	regmap_write(lt8912->regmap[0], 0x0a, 0x00);
-	regmap_write(lt8912->regmap[0], 0x0b, 0x20);
-	regmap_write(lt8912->regmap[0], 0x0c, 0x00);
-
-	regmap_write(lt8912->regmap[0], 0x54, 0x1d);
-	regmap_write(lt8912->regmap[0], 0x51, 0x15);
-
-	regmap_write(lt8912->regmap[0], 0x44, 0x31);
-	regmap_write(lt8912->regmap[0], 0x41, 0xbd);
-	regmap_write(lt8912->regmap[0], 0x5c, 0x11);
-
-	regmap_write(lt8912->regmap[0], 0x30, 0x08);
-	regmap_write(lt8912->regmap[0], 0x31, 0x00);
-	regmap_write(lt8912->regmap[0], 0x32, 0x00);
-	regmap_write(lt8912->regmap[0], 0x33, 0x00);
-	regmap_write(lt8912->regmap[0], 0x34, 0x00);
-	regmap_write(lt8912->regmap[0], 0x35, 0x00);
-	regmap_write(lt8912->regmap[0], 0x36, 0x00);
-	regmap_write(lt8912->regmap[0], 0x37, 0x00);
-	regmap_write(lt8912->regmap[0], 0x38, 0x00);
-}
-
-static void lt8912_power_on(struct lt8912 *lt8912)
-{
-	gpiod_direction_output(lt8912->reset_n, 1);
-	msleep(120);
-	gpiod_direction_output(lt8912->reset_n, 0);
-}
-
-static void lt8912_power_off(struct lt8912 *lt8912)
-{
-	gpiod_direction_output(lt8912->reset_n, 1);
-}
-
-static enum drm_connector_status
-lt8912_connector_detect(struct drm_connector *connector, bool force)
-{
-	/* TODO: HPD handing (reg[0xc1] - bit[7]) */
-	return connector_status_connected;
-}
-
-static const struct drm_connector_funcs lt8912_connector_funcs = {
-	.dpms = drm_atomic_helper_connector_dpms,
-	.detect = lt8912_connector_detect,
-	.fill_modes = drm_helper_probe_single_connector_modes,
-	.destroy = drm_connector_cleanup,
-	.reset = drm_atomic_helper_connector_reset,
-	.atomic_duplicate_state = drm_atomic_helper_connector_duplicate_state,
-	.atomic_destroy_state = drm_atomic_helper_connector_destroy_state,
-};
-
-static struct drm_encoder *
-lt8912_connector_best_encoder(struct drm_connector *connector)
-{
-	struct lt8912 *lt8912 = connector_to_lt8912(connector);
-
-	return lt8912->bridge.encoder;
-}
-
-static int lt8912_connector_get_modes(struct drm_connector *connector)
-{
-	int num_modes = 0;
-
-	num_modes = drm_add_modes_noedid(connector, 1920, 1080);
-	drm_set_preferred_mode(connector, 1920, 1080);
-
-	return num_modes;
-}
-
-static const struct drm_connector_helper_funcs lt8912_connector_helper_funcs = {
-	.get_modes = lt8912_connector_get_modes,
-	.best_encoder = lt8912_connector_best_encoder,
-};
-
-static void lt8912_bridge_post_disable(struct drm_bridge *bridge)
-{
-	struct lt8912 *lt8912 = bridge_to_lt8912(bridge);
-
-	lt8912_power_off(lt8912);
-}
-
-static void lt8912_bridge_disable(struct drm_bridge *bridge)
-{
-	struct lt8912 *lt8912 = bridge_to_lt8912(bridge);
-
-	lt8912_exit(lt8912);
-}
-
-static void lt8912_bridge_enable(struct drm_bridge *bridge)
-{
-	struct lt8912 *lt8912 = bridge_to_lt8912(bridge);
-
-	lt8912_init(lt8912);
-}
-
-static void lt8912_bridge_pre_enable(struct drm_bridge *bridge)
-{
-	struct lt8912 *lt8912 = bridge_to_lt8912(bridge);
-
-	lt8912_power_on(lt8912);
-}
-
-static void lt8912_bridge_mode_set(struct drm_bridge *bridge,
-				   struct drm_display_mode *mode,
-				   struct drm_display_mode *adj)
-{
-	struct lt8912 *lt8912 = bridge_to_lt8912(bridge);
-
-	drm_mode_copy(&lt8912->mode, adj);
-}
-
-static int lt8912_bridge_attach(struct drm_bridge *bridge)
-{
-	struct lt8912 *lt8912 = bridge_to_lt8912(bridge);
-	struct drm_connector *connector = &lt8912->connector;
-	int ret;
-
-	ret = drm_connector_init(bridge->dev, connector,
-				 &lt8912_connector_funcs,
-				 DRM_MODE_CONNECTOR_HDMIA);
-	if (ret) {
-		dev_err(lt8912->dev, "failed to initialize connector\n");
-		return ret;
-	}
-
-	drm_connector_helper_add(connector, &lt8912_connector_helper_funcs);
-	drm_mode_connector_attach_encoder(connector, bridge->encoder);
-
-	return 0;
-}
-
-static const struct drm_bridge_funcs lt8912_bridge_funcs = {
-	.attach = lt8912_bridge_attach,
-	.mode_set = lt8912_bridge_mode_set,
-	.pre_enable = lt8912_bridge_pre_enable,
-	.enable = lt8912_bridge_enable,
-	.disable = lt8912_bridge_disable,
-	.post_disable = lt8912_bridge_post_disable,
-};
-
-static const struct regmap_config lt8912_regmap_config = {
-	.reg_bits = 8,
-	.val_bits = 8,
-	.max_register = 0xff,
-};
-
-static int lt8912_i2c_init(struct lt8912 *lt8912,
-			   struct i2c_adapter *adapter)
-{
-	struct i2c_board_info info[] = {
-		{ I2C_BOARD_INFO("lt8912p0", 0x48), },
-		{ I2C_BOARD_INFO("lt8912p1", 0x49), },
-		{ I2C_BOARD_INFO("lt8912p2", 0x4a), }
-	};
-	struct regmap *regmap;
-	unsigned int i;
-	int ret;
-
-	for (i = 0; i < ARRAY_SIZE(info); i++) {
-		struct i2c_client *client;
-
-		client = i2c_new_device(adapter, &info[i]);
-		if (!client)
-			return -ENODEV;
-
-		regmap = devm_regmap_init_i2c(client, &lt8912_regmap_config);
-		if (IS_ERR(regmap)) {
-			ret = PTR_ERR(regmap);
-			dev_err(lt8912->dev,
-				"Failed to initialize regmap: %d\n", ret);
-			return ret;
-		}
-
-		lt8912->regmap[i] = regmap;
-	}
-
-	return 0;
-}
-
-static int lt8912_probe(struct mipi_dsi_device *dsi)
-{
-	struct device *dev = &dsi->dev;
-	struct lt8912 *lt8912;
-	struct device_node *node;
-	struct i2c_adapter *adapter;
-	int ret;
-
-	lt8912 = devm_kzalloc(dev, sizeof(*lt8912), GFP_KERNEL);
-	if (!lt8912)
-		return -ENOMEM;
-
-	lt8912->dev = dev;
-	lt8912->dsi = dsi;
-	mipi_dsi_set_drvdata(dsi, lt8912);
-
-	lt8912->reset_n = devm_gpiod_get(dev, "reset", GPIOD_ASIS);
-	if (IS_ERR(lt8912->reset_n)) {
-		ret = PTR_ERR(lt8912->reset_n);
-		dev_err(dev, "failed to request reset GPIO: %d\n", ret);
-		return ret;
-	}
-
-	node = of_parse_phandle(dev->of_node, "i2c-bus", 0);
-	if (!node) {
-		dev_err(dev, "No i2c-bus found\n");
-		return -ENODEV;
-	}
-
-	adapter = of_find_i2c_adapter_by_node(node);
-	of_node_put(node);
-	if (!adapter) {
-		dev_err(dev, "No i2c adapter found\n");
-		return -EPROBE_DEFER;
-	}
-
-	ret = lt8912_i2c_init(lt8912, adapter);
-	if (ret)
-		return ret;
-
-	/* TODO: interrupt handing */
-
-	lt8912->bridge.funcs = &lt8912_bridge_funcs;
-	lt8912->bridge.of_node = dev->of_node;
-	ret = drm_bridge_add(&lt8912->bridge);
-	if (ret) {
-		dev_err(dev, "failed to add bridge: %d\n", ret);
-		return ret;
-	}
-
-	dsi->lanes = 4;
-	dsi->format = MIPI_DSI_FMT_RGB888;
-	dsi->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;
-
-	ret = mipi_dsi_attach(dsi);
-	if (ret) {
-		drm_bridge_remove(&lt8912->bridge);
-		dev_err(dev, "failed to attach dsi to host: %d\n", ret);
-		return ret;
-	}
-
-	return 0;
-}
-
-static int lt8912_remove(struct mipi_dsi_device *dsi)
-{
-	struct lt8912 *lt8912 = mipi_dsi_get_drvdata(dsi);
-
-	mipi_dsi_detach(dsi);
-	drm_bridge_remove(&lt8912->bridge);
-
-	return 0;
-}
-
-static const struct of_device_id lt8912_of_match[] = {
-	{ .compatible = "lontium,lt8912" },
-	{}
-};
-MODULE_DEVICE_TABLE(of, lt8912_of_match);
-
-static struct mipi_dsi_driver lt8912_driver = {
-	.driver = {
-		.name = "lt8912",
-		.of_match_table = lt8912_of_match,
-	},
-	.probe = lt8912_probe,
-	.remove = lt8912_remove,
-};
-module_mipi_dsi_driver(lt8912_driver);
-
-MODULE_AUTHOR("Wyon Bi <bivvy.bi@rock-chips.com>");
-MODULE_DESCRIPTION("Lontium LT8912 MIPI-DSI to LVDS and HDMI/MHL bridge");
-MODULE_LICENSE("GPL v2");
diff --git a/kernel/drivers/gpu/drm/bridge/synopsys/dw-hdmi-cec.c b/kernel/drivers/gpu/drm/bridge/synopsys/dw-hdmi-cec.c
index 6c32351..993f525 100644
--- a/kernel/drivers/gpu/drm/bridge/synopsys/dw-hdmi-cec.c
+++ b/kernel/drivers/gpu/drm/bridge/synopsys/dw-hdmi-cec.c
@@ -7,8 +7,10 @@
  * it under the terms of the GNU General Public License version 2 as
  * published by the Free Software Foundation.
  */
+#include <linux/input.h>
 #include <linux/interrupt.h>
 #include <linux/io.h>
+#include <linux/miscdevice.h>
 #include <linux/module.h>
 #include <linux/platform_device.h>
 #include <linux/sched.h>
@@ -24,8 +26,11 @@
 enum {
 	HDMI_IH_CEC_STAT0	= 0x0106,
 	HDMI_IH_MUTE_CEC_STAT0	= 0x0186,
+	HDMI_IH_MUTE		= 0x01ff,
 
 	HDMI_CEC_CTRL		= 0x7d00,
+	CEC_TRANS_MASK		= 0x7,
+	CEC_CTRL_STANDBY	= BIT(4),
 	CEC_CTRL_START		= BIT(0),
 	CEC_CTRL_FRAME_TYP	= 3 << 1,
 	CEC_CTRL_RETRY		= 0 << 1,
@@ -50,12 +55,15 @@
 	HDMI_CEC_RX_CNT		= 0x7d08,
 	HDMI_CEC_TX_DATA0	= 0x7d10,
 	HDMI_CEC_RX_DATA0	= 0x7d20,
+	HDMI_CEC_RX_DATA1	= 0x7d21,
 	HDMI_CEC_LOCK		= 0x7d30,
 	HDMI_CEC_WKUPCTRL	= 0x7d31,
 };
 
 struct dw_hdmi_cec {
+	struct device *dev;
 	struct dw_hdmi *hdmi;
+	struct miscdevice misc_dev;
 	const struct dw_hdmi_cec_ops *ops;
 	u32 addresses;
 	struct cec_adapter *adap;
@@ -64,7 +72,12 @@
 	bool tx_done;
 	bool rx_done;
 	struct cec_notifier *notify;
+	struct input_dev *devinput;
 	int irq;
+	int wake_irq;
+	bool wake_en;
+	bool standby_en;
+	struct mutex wake_lock;
 };
 
 static void dw_hdmi_write(struct dw_hdmi_cec *cec, u8 val, int offset)
@@ -75,6 +88,11 @@
 static u8 dw_hdmi_read(struct dw_hdmi_cec *cec, int offset)
 {
 	return cec->ops->read(cec->hdmi, offset);
+}
+
+static void dw_hdmi_mod(struct dw_hdmi_cec *cec, unsigned int offset, u8 mask, u8 val)
+{
+	cec->ops->mod(cec->hdmi, val, mask, offset);
 }
 
 static int dw_hdmi_cec_log_addr(struct cec_adapter *adap, u8 logical_addr)
@@ -115,7 +133,7 @@
 		dw_hdmi_write(cec, msg->msg[i], HDMI_CEC_TX_DATA0 + i);
 
 	dw_hdmi_write(cec, msg->len, HDMI_CEC_TX_CNT);
-	dw_hdmi_write(cec, ctrl | CEC_CTRL_START, HDMI_CEC_CTRL);
+	dw_hdmi_mod(cec, HDMI_CEC_CTRL, CEC_TRANS_MASK, ctrl | CEC_CTRL_START);
 
 	return 0;
 }
@@ -191,19 +209,27 @@
 	struct dw_hdmi_cec *cec = cec_get_drvdata(adap);
 
 	if (!enable) {
-		dw_hdmi_write(cec, ~0, HDMI_CEC_MASK);
-		dw_hdmi_write(cec, ~0, HDMI_IH_MUTE_CEC_STAT0);
 		dw_hdmi_write(cec, 0, HDMI_CEC_POLARITY);
 
-		cec->ops->disable(cec->hdmi);
+		if (cec->wake_en && cec->standby_en) {
+			dw_hdmi_write(cec, 0xff, HDMI_IH_CEC_STAT0);
+			dw_hdmi_mod(cec, HDMI_CEC_CTRL, CEC_CTRL_STANDBY, CEC_CTRL_STANDBY);
+			dw_hdmi_write(cec, 0, HDMI_CEC_LOCK);
+			dw_hdmi_write(cec, 0xff, HDMI_CEC_WKUPCTRL);
+			dw_hdmi_write(cec, ~(1 << 6), HDMI_CEC_MASK);
+			dw_hdmi_write(cec, ~(1 << 6), HDMI_IH_MUTE_CEC_STAT0);
+			dw_hdmi_write(cec, 0x01, HDMI_IH_MUTE);
+		} else {
+			cec->ops->disable(cec->hdmi);
+		}
 	} else {
 		unsigned int irqs;
 
-		dw_hdmi_write(cec, 0, HDMI_CEC_CTRL);
+		dw_hdmi_cec_log_addr(cec->adap, CEC_LOG_ADDR_INVALID);
+		dw_hdmi_mod(cec, HDMI_CEC_CTRL, CEC_CTRL_STANDBY, 0);
+		dw_hdmi_write(cec, 0x02, HDMI_IH_MUTE);
 		dw_hdmi_write(cec, ~0, HDMI_IH_CEC_STAT0);
 		dw_hdmi_write(cec, 0, HDMI_CEC_LOCK);
-
-		dw_hdmi_cec_log_addr(cec->adap, CEC_LOG_ADDR_INVALID);
 
 		cec->ops->enable(cec->hdmi);
 
@@ -229,6 +255,170 @@
 	cec_delete_adapter(cec->adap);
 }
 
+static irqreturn_t dw_hdmi_cec_wake_irq(int irq, void *data)
+{
+	struct cec_adapter *adap = data;
+	struct dw_hdmi_cec *cec = cec_get_drvdata(adap);
+	u8 cec_int;
+
+	cec_int = dw_hdmi_read(cec, HDMI_IH_CEC_STAT0);
+	if (!cec_int)
+		return IRQ_NONE;
+
+	dw_hdmi_write(cec, 0x02, HDMI_IH_MUTE);
+	dw_hdmi_write(cec, cec_int, HDMI_IH_CEC_STAT0);
+	dw_hdmi_write(cec, 0x00, HDMI_CEC_WKUPCTRL);
+
+	if (!cec->wake_en)
+		return IRQ_HANDLED;
+
+	return IRQ_WAKE_THREAD;
+}
+
+static irqreturn_t dw_hdmi_cec_wake_thread(int irq, void *data)
+{
+	struct cec_adapter *adap = data;
+	struct dw_hdmi_cec *cec = cec_get_drvdata(adap);
+
+	mutex_lock(&cec->wake_lock);
+
+	if (!cec->standby_en) {
+		mutex_unlock(&cec->wake_lock);
+		return IRQ_HANDLED;
+	}
+	cec->standby_en = false;
+
+	dev_dbg(cec->dev, "wakeup opcode:0x%x\n", dw_hdmi_read(cec, HDMI_CEC_RX_DATA1));
+	input_event(cec->devinput, EV_KEY, KEY_POWER, 1);
+	input_sync(cec->devinput);
+	input_event(cec->devinput, EV_KEY, KEY_POWER, 0);
+	input_sync(cec->devinput);
+	mutex_unlock(&cec->wake_lock);
+
+	return IRQ_HANDLED;
+}
+
+static int rockchip_hdmi_cec_input_init(struct dw_hdmi_cec *cec)
+{
+	int err;
+
+	cec->devinput = devm_input_allocate_device(cec->dev);
+	if (!cec->devinput)
+		return -EPERM;
+
+	cec->devinput->name = "hdmi_cec_key";
+	cec->devinput->phys = "hdmi_cec_key/input0";
+	cec->devinput->id.bustype = BUS_HOST;
+	cec->devinput->id.vendor = 0x0001;
+	cec->devinput->id.product = 0x0001;
+	cec->devinput->id.version = 0x0100;
+
+	err = input_register_device(cec->devinput);
+	if (err < 0) {
+		input_free_device(cec->devinput);
+		return err;
+	}
+	input_set_capability(cec->devinput, EV_KEY, KEY_POWER);
+
+	return 0;
+}
+
+static long cec_standby(struct cec_adapter *adap, __u8 __user *parg)
+{
+	u8 en;
+	int ret;
+	struct dw_hdmi_cec *cec = cec_get_drvdata(adap);
+
+	mutex_lock(&cec->wake_lock);
+	if (copy_from_user(&en, parg, sizeof(en))) {
+		mutex_unlock(&cec->wake_lock);
+		return -EFAULT;
+	}
+
+	cec->standby_en = !en;
+	ret = adap->ops->adap_enable(adap, en);
+	mutex_unlock(&cec->wake_lock);
+
+	return ret;
+}
+
+static long cec_func_en(struct dw_hdmi_cec *cec, int __user *parg)
+{
+	int en_mask;
+
+	if (copy_from_user(&en_mask, parg, sizeof(en_mask)))
+		return -EFAULT;
+
+	cec->wake_en = (en_mask & CEC_EN) && (en_mask & CEC_WAKE);
+
+	return 0;
+}
+
+static long dw_hdmi_cec_ioctl(struct file *f, unsigned int cmd, unsigned long arg)
+{
+	struct dw_hdmi_cec *cec;
+	struct miscdevice *misc_dev;
+	void __user *data;
+
+	if (!f)
+		return -EFAULT;
+
+	misc_dev = f->private_data;
+	cec = container_of(misc_dev, struct dw_hdmi_cec, misc_dev);
+	data = (void __user *)arg;
+
+	switch (cmd) {
+	case CEC_STANDBY:
+		return cec_standby(cec->adap, data);
+	case CEC_FUNC_EN:
+		return cec_func_en(cec, data);
+	default:
+		return -EINVAL;
+	}
+
+	return -ENOTTY;
+}
+
+static int dw_hdmi_cec_open(struct inode *inode, struct file *f)
+{
+	return 0;
+}
+
+static int dw_hdmi_cec_release(struct inode *inode, struct file *f)
+{
+	return 0;
+}
+
+static const struct file_operations dw_hdmi_cec_file_operations = {
+	.compat_ioctl = dw_hdmi_cec_ioctl,
+	.unlocked_ioctl = dw_hdmi_cec_ioctl,
+	.open = dw_hdmi_cec_open,
+	.release = dw_hdmi_cec_release,
+	.owner = THIS_MODULE,
+};
+
+void dw_hdmi_hpd_wake_up(struct platform_device *pdev)
+{
+	struct dw_hdmi_cec *cec = platform_get_drvdata(pdev);
+
+	mutex_lock(&cec->wake_lock);
+
+	if (!cec->standby_en) {
+		mutex_unlock(&cec->wake_lock);
+		return;
+	}
+	cec->standby_en = false;
+
+	dw_hdmi_write(cec, 0x02, HDMI_IH_MUTE);
+
+	input_event(cec->devinput, EV_KEY, KEY_POWER, 1);
+	input_sync(cec->devinput);
+	input_event(cec->devinput, EV_KEY, KEY_POWER, 0);
+	input_sync(cec->devinput);
+	mutex_unlock(&cec->wake_lock);
+}
+EXPORT_SYMBOL_GPL(dw_hdmi_hpd_wake_up);
+
 static int dw_hdmi_cec_probe(struct platform_device *pdev)
 {
 	struct dw_hdmi_cec_data *data = dev_get_platdata(&pdev->dev);
@@ -247,9 +437,13 @@
 	if (!cec)
 		return -ENOMEM;
 
+	cec->dev = &pdev->dev;
 	cec->irq = data->irq;
+	cec->wake_irq = data->wake_irq;
 	cec->ops = data->ops;
 	cec->hdmi = data->hdmi;
+
+	mutex_init(&cec->wake_lock);
 
 	platform_set_drvdata(pdev, cec);
 
@@ -276,10 +470,26 @@
 
 	ret = devm_request_threaded_irq(&pdev->dev, cec->irq,
 					dw_hdmi_cec_hardirq,
-					dw_hdmi_cec_thread, IRQF_SHARED,
+					dw_hdmi_cec_thread, IRQF_SHARED | IRQF_ONESHOT,
 					"dw-hdmi-cec", cec->adap);
 	if (ret < 0)
 		return ret;
+
+	if (cec->wake_irq > 0) {
+		ret = devm_request_threaded_irq(&pdev->dev, cec->wake_irq,
+						dw_hdmi_cec_wake_irq,
+						dw_hdmi_cec_wake_thread,
+						IRQF_TRIGGER_HIGH | IRQF_ONESHOT,
+						"cec-wakeup", cec->adap);
+		if (ret) {
+			dev_err(&pdev->dev,
+				"hdmi_cec request_irq failed (%d).\n",
+				ret);
+			return ret;
+		}
+		device_init_wakeup(&pdev->dev, 1);
+		enable_irq_wake(cec->wake_irq);
+	}
 
 	cec->notify = cec_notifier_get(pdev->dev.parent);
 	if (!cec->notify)
@@ -298,8 +508,18 @@
 	devm_remove_action(&pdev->dev, dw_hdmi_cec_del, cec);
 
 	cec_register_cec_notifier(cec->adap, cec->notify);
+	rockchip_hdmi_cec_input_init(cec);
 
-	return 0;
+	cec->misc_dev.name = devm_kasprintf(&pdev->dev, GFP_KERNEL, "rk_cec");
+	if (!cec->misc_dev.name)
+		return -ENOMEM;
+	cec->misc_dev.minor = MISC_DYNAMIC_MINOR;
+	cec->misc_dev.fops = &dw_hdmi_cec_file_operations;
+	cec->misc_dev.mode = 0666;
+
+	ret = misc_register(&cec->misc_dev);
+
+	return ret;
 }
 
 static int dw_hdmi_cec_remove(struct platform_device *pdev)
@@ -308,6 +528,7 @@
 
 	cec_unregister_adapter(cec->adap);
 	cec_notifier_put(cec->notify);
+	misc_deregister(&cec->misc_dev);
 
 	return 0;
 }
diff --git a/kernel/drivers/gpu/drm/bridge/synopsys/dw-hdmi-cec.h b/kernel/drivers/gpu/drm/bridge/synopsys/dw-hdmi-cec.h
index cf4dc12..ec10660 100644
--- a/kernel/drivers/gpu/drm/bridge/synopsys/dw-hdmi-cec.h
+++ b/kernel/drivers/gpu/drm/bridge/synopsys/dw-hdmi-cec.h
@@ -3,17 +3,24 @@
 
 struct dw_hdmi;
 
+#define CEC_EN			BIT(0)
+#define CEC_WAKE		BIT(1)
+
 struct dw_hdmi_cec_ops {
 	void (*write)(struct dw_hdmi *hdmi, u8 val, int offset);
 	u8 (*read)(struct dw_hdmi *hdmi, int offset);
 	void (*enable)(struct dw_hdmi *hdmi);
 	void (*disable)(struct dw_hdmi *hdmi);
+	void (*mod)(struct dw_hdmi *hdmi, u8 data, u8 mask, unsigned int reg);
 };
 
 struct dw_hdmi_cec_data {
 	struct dw_hdmi *hdmi;
 	const struct dw_hdmi_cec_ops *ops;
 	int irq;
+	int wake_irq;
 };
 
+void dw_hdmi_hpd_wake_up(struct platform_device *pdev);
+
 #endif
diff --git a/kernel/drivers/gpu/drm/bridge/synopsys/dw-hdmi-i2s-audio.c b/kernel/drivers/gpu/drm/bridge/synopsys/dw-hdmi-i2s-audio.c
index 507cb76..6127d19 100644
--- a/kernel/drivers/gpu/drm/bridge/synopsys/dw-hdmi-i2s-audio.c
+++ b/kernel/drivers/gpu/drm/bridge/synopsys/dw-hdmi-i2s-audio.c
@@ -51,6 +51,8 @@
 	u8 inputclkfs = 0;
 	u8 val;
 
+	dw_hdmi_audio_disable(hdmi);
+
 	/* it cares I2S only */
 	if ((fmt->fmt != HDMI_I2S) ||
 	    (fmt->bit_clk_master | fmt->frame_clk_master)) {
@@ -202,21 +204,6 @@
 	return 0;
 }
 
-static void dw_hdmi_i2s_audio_shutdown(struct device *dev, void *data)
-{
-	struct dw_hdmi_i2s_audio_data *audio = data;
-	struct dw_hdmi *hdmi = audio->hdmi;
-
-	dw_hdmi_audio_disable(hdmi);
-
-	hdmi_update_bits(audio,
-			 HDMI_AUD_CONF0_SW_RESET,
-			 HDMI_AUD_CONF0_SW_RESET |
-				(HDMI_AUD_CONF0_I2S_ALL_ENABLE ^
-				 HDMI_AUD_CONF0_I2S_SELECT_MASK),
-			 HDMI_AUD_CONF0);
-}
-
 static int dw_hdmi_i2s_get_dai_id(struct snd_soc_component *component,
 				  struct device_node *endpoint)
 {
@@ -249,7 +236,6 @@
 
 static struct hdmi_codec_ops dw_hdmi_i2s_ops = {
 	.hw_params	= dw_hdmi_i2s_hw_params,
-	.audio_shutdown	= dw_hdmi_i2s_audio_shutdown,
 	.get_dai_id	= dw_hdmi_i2s_get_dai_id,
 	.hook_plugged_cb = dw_hdmi_i2s_hook_plugged_cb,
 };
diff --git a/kernel/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c b/kernel/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
index ee7f83a..7ba60fb 100644
--- a/kernel/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
+++ b/kernel/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
@@ -49,6 +49,7 @@
 #define DDC_SEGMENT_ADDR	0x30
 
 #define HDMI_EDID_LEN		512
+#define HDMI_EDID_BLOCK_LEN	128
 
 /* DW-HDMI Controller >= 0x200a are at least compliant with SCDC version 1 */
 #define SCDC_MIN_SOURCE_VERSION	0x1
@@ -320,6 +321,7 @@
 	struct drm_display_mode previous_mode;
 
 	struct i2c_adapter *ddc;
+	struct cec_adapter *cec_adap;
 	void __iomem *regs;
 	bool sink_is_hdmi;
 	bool sink_has_audio;
@@ -358,10 +360,13 @@
 	struct cec_notifier *cec_notifier;
 
 	bool initialized;		/* hdmi is enabled before bind */
+	bool logo_plug_out;		/* hdmi is plug out when kernel logo */
 	hdmi_codec_plugged_cb plugged_cb;
 	struct device *codec_dev;
 	enum drm_connector_status last_connector_result;
 	bool rgb_quant_range_selectable;
+	bool update;
+	bool hdr2sdr;			/* from hdr to sdr */
 };
 
 #define HDMI_IH_PHY_STAT0_RX_SENSE \
@@ -456,10 +461,11 @@
 		change = drm_helper_hpd_irq_event(hdmi->bridge.dev);
 
 #ifdef CONFIG_CEC_NOTIFIER
-		if (change)
+		if (change) {
 			cec_notifier_repo_cec_hpd(hdmi->cec_notifier,
 						  hdmi->hpd_state,
 						  ktime_get());
+		}
 #endif
 	}
 }
@@ -568,7 +574,8 @@
 			    unsigned char *buf, unsigned int length)
 {
 	struct dw_hdmi_i2c *i2c = hdmi->i2c;
-	int stat;
+	int stat, retry, i;
+	bool read_edid = false;
 
 	if (!i2c->is_regaddr) {
 		dev_dbg(hdmi->dev, "set read register address to 0\n");
@@ -576,27 +583,81 @@
 		i2c->is_regaddr = true;
 	}
 
-	while (length--) {
-		reinit_completion(&i2c->cmp);
+	/* edid reads are in 128 bytes. scdc reads are in 1 byte */
+	if (length == HDMI_EDID_BLOCK_LEN)
+		read_edid = true;
 
-		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);
+	while (length > 0) {
+		retry = 100;
+		hdmi_writeb(hdmi, i2c->slave_reg, HDMI_I2CM_ADDRESS);
 
-		stat = wait_for_completion_timeout(&i2c->cmp, HZ / 10);
-		if (!stat)
-			return -EAGAIN;
+		if (read_edid) {
+			i2c->slave_reg += 8;
+			length -= 8;
+		} else {
+			i2c->slave_reg++;
+			length--;
+		}
 
-		/* Check for error condition on the bus */
-		if (i2c->stat & HDMI_IH_I2CM_STAT0_ERROR)
+		while (retry > 0) {
+			if (!(hdmi_readb(hdmi, HDMI_PHY_STAT0) & HDMI_PHY_HPD)) {
+				void *data = hdmi->plat_data->phy_data;
+
+				dev_dbg(hdmi->dev, "hdmi disconnect, stop ddc read\n");
+				if (hdmi->plat_data->set_ddc_io)
+					hdmi->plat_data->set_ddc_io(data, false);
+				return -EPERM;
+			}
+			reinit_completion(&i2c->cmp);
+			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);
+			}
+			stat = wait_for_completion_timeout(&i2c->cmp, HZ / 10);
+			if (!stat) {
+				dev_dbg(hdmi->dev, "ddc read time out\n");
+				hdmi_writeb(hdmi, 0, HDMI_I2CM_SOFTRSTZ);
+				hdmi_writeb(hdmi, HDMI_I2CM_OPERATION_BUS_CLEAR,
+					    HDMI_I2CM_OPERATION);
+				retry -= 10;
+				continue;
+			}
+			/* Check for error condition on the bus */
+			if (i2c->stat & HDMI_IH_I2CM_STAT0_ERROR) {
+				dev_dbg(hdmi->dev, "ddc read err\n");
+				hdmi_writeb(hdmi, 0, HDMI_I2CM_SOFTRSTZ);
+				hdmi_writeb(hdmi, HDMI_I2CM_OPERATION_BUS_CLEAR,
+					    HDMI_I2CM_OPERATION);
+				retry--;
+				usleep_range(10000, 11000);
+				continue;
+			}
+			/* read success */
+			break;
+		}
+		if (retry <= 0) {
+			dev_err(hdmi->dev, "ddc read failed\n");
 			return -EIO;
+		}
 
-		*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;
 
 	return 0;
@@ -606,7 +667,7 @@
 			     unsigned char *buf, unsigned int length)
 {
 	struct dw_hdmi_i2c *i2c = hdmi->i2c;
-	int stat;
+	int stat, retry;
 
 	if (!i2c->is_regaddr) {
 		/* Use the first write byte as register address */
@@ -617,20 +678,53 @@
 	}
 
 	while (length--) {
-		reinit_completion(&i2c->cmp);
+		retry = 100;
 
 		hdmi_writeb(hdmi, *buf++, HDMI_I2CM_DATAO);
 		hdmi_writeb(hdmi, i2c->slave_reg++, HDMI_I2CM_ADDRESS);
-		hdmi_writeb(hdmi, HDMI_I2CM_OPERATION_WRITE,
-			    HDMI_I2CM_OPERATION);
 
-		stat = wait_for_completion_timeout(&i2c->cmp, HZ / 10);
-		if (!stat)
-			return -EAGAIN;
+		while (retry > 0) {
+			if (!(hdmi_readb(hdmi, HDMI_PHY_STAT0) & HDMI_PHY_HPD)) {
+				void *data = hdmi->plat_data->phy_data;
 
-		/* Check for error condition on the bus */
-		if (i2c->stat & HDMI_IH_I2CM_STAT0_ERROR)
+				dev_dbg(hdmi->dev, "hdmi disconnect, stop ddc write\n");
+				if (hdmi->plat_data->set_ddc_io)
+					hdmi->plat_data->set_ddc_io(data, false);
+				return -EPERM;
+			}
+			reinit_completion(&i2c->cmp);
+			hdmi_writeb(hdmi, HDMI_I2CM_OPERATION_WRITE,
+				    HDMI_I2CM_OPERATION);
+
+			stat = wait_for_completion_timeout(&i2c->cmp, HZ / 10);
+			if (!stat) {
+				dev_dbg(hdmi->dev, "ddc write time out\n");
+				hdmi_writeb(hdmi, 0, HDMI_I2CM_SOFTRSTZ);
+				hdmi_writeb(hdmi, HDMI_I2CM_OPERATION_BUS_CLEAR,
+					    HDMI_I2CM_OPERATION);
+				retry -= 10;
+				continue;
+			}
+
+			/* Check for error condition on the bus */
+			if (i2c->stat & HDMI_IH_I2CM_STAT0_ERROR) {
+				dev_dbg(hdmi->dev, "ddc write err\n");
+				hdmi_writeb(hdmi, 0, HDMI_I2CM_SOFTRSTZ);
+				hdmi_writeb(hdmi, HDMI_I2CM_OPERATION_BUS_CLEAR,
+					    HDMI_I2CM_OPERATION);
+				retry--;
+				usleep_range(10000, 11000);
+				continue;
+			}
+
+			/* write success */
+			break;
+		}
+
+		if (retry <= 0) {
+			dev_err(hdmi->dev, "ddc write failed\n");
 			return -EIO;
+		}
 	}
 
 	return 0;
@@ -642,6 +736,7 @@
 	struct dw_hdmi *hdmi = i2c_get_adapdata(adap);
 	struct dw_hdmi_i2c *i2c = hdmi->i2c;
 	u8 addr = msgs[0].addr;
+	void *data = hdmi->plat_data->phy_data;
 	int i, ret = 0;
 
 	if (addr == DDC_CI_ADDR)
@@ -665,6 +760,12 @@
 	}
 
 	mutex_lock(&i2c->lock);
+
+	if (hdmi->plat_data->set_ddc_io)
+		hdmi->plat_data->set_ddc_io(data, true);
+
+	hdmi_writeb(hdmi, 0, HDMI_I2CM_SOFTRSTZ);
+	udelay(100);
 
 	/* Unmute DONE and ERROR interrupts */
 	hdmi_writeb(hdmi, 0x00, HDMI_IH_MUTE_I2CM_STAT0);
@@ -1378,14 +1479,7 @@
 		  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);
 
 	if (output_select == HDMI_VP_CONF_OUTPUT_SELECTOR_PP) {
@@ -1943,10 +2037,22 @@
 					HDMI_EXTENDED_COLORIMETRY_XV_YCC_601;
 			break;
 		}
+		frame.ycc_quantization_range = HDMI_YCC_QUANTIZATION_RANGE_LIMITED;
 	} else {
-		frame.colorimetry = HDMI_COLORIMETRY_NONE;
-		frame.extended_colorimetry =
-			HDMI_EXTENDED_COLORIMETRY_XV_YCC_601;
+		if (hdmi->hdmi_data.enc_out_encoding == V4L2_YCBCR_ENC_BT2020) {
+			frame.colorimetry = HDMI_COLORIMETRY_EXTENDED;
+			frame.extended_colorimetry =
+				HDMI_EXTENDED_COLORIMETRY_BT2020;
+		} else {
+			frame.colorimetry = HDMI_COLORIMETRY_NONE;
+			frame.extended_colorimetry =
+				HDMI_EXTENDED_COLORIMETRY_XV_YCC_601;
+		}
+
+		if (is_hdmi2 && frame.quantization_range == HDMI_QUANTIZATION_RANGE_FULL)
+			frame.ycc_quantization_range = HDMI_YCC_QUANTIZATION_RANGE_FULL;
+		else
+			frame.ycc_quantization_range = HDMI_YCC_QUANTIZATION_RANGE_LIMITED;
 	}
 
 	frame.scan_mode = HDMI_SCAN_MODE_NONE;
@@ -1986,7 +2092,11 @@
 	hdmi_writeb(hdmi, val, HDMI_FC_AVICONF2);
 
 	/* AVI data byte 4 differences: none */
-	val = frame.video_code & 0x7f;
+	if (hdmi_bus_fmt_is_yuv420(hdmi->hdmi_data.enc_out_bus_format) ||
+	    hdmi->connector.display_info.hdmi.scdc.supported)
+		val = hdmi->vic;
+	else
+		val = frame.video_code & 0x7f;
 	hdmi_writeb(hdmi, val, HDMI_FC_AVIVID);
 
 	/* AVI Data Byte 5- set up input and output pixel repetition */
@@ -2023,6 +2133,14 @@
 	struct hdmi_vendor_infoframe frame;
 	u8 buffer[10];
 	ssize_t err;
+
+	/* if sink support hdmi2.0, don't send vsi */
+	if (hdmi_bus_fmt_is_yuv420(hdmi->hdmi_data.enc_out_bus_format) ||
+	    hdmi->connector.display_info.hdmi.scdc.supported) {
+		hdmi_mask_writeb(hdmi, 0, HDMI_FC_DATAUTO0, HDMI_FC_DATAUTO0_VSD_OFFSET,
+				 HDMI_FC_DATAUTO0_VSD_MASK);
+		return;
+	}
 
 	err = drm_hdmi_vendor_infoframe_from_display_mode(&frame,
 							  &hdmi->connector,
@@ -2188,6 +2306,11 @@
 	hdmi_writeb(hdmi, HDR_LSB(frame.max_fall), HDMI_FC_DRM_PB24);
 	hdmi_writeb(hdmi, HDR_MSB(frame.max_fall), HDMI_FC_DRM_PB25);
 	hdmi_writeb(hdmi, 1, HDMI_FC_DRM_UP);
+	/*
+	 * avi and hdr infoframe cannot be sent at the same time
+	 * for compatibility with Huawei TV
+	 */
+	msleep(300);
 	hdmi_modb(hdmi, HDMI_FC_PACKET_DRM_TX_EN,
 		  HDMI_FC_PACKET_DRM_TX_EN_MASK, HDMI_FC_PACKET_TX_EN);
 
@@ -2215,6 +2338,9 @@
 	vmode->mtmdsclock = hdmi_get_tmdsclock(hdmi, vmode->mpixelclock);
 	if (hdmi_bus_fmt_is_yuv420(hdmi->hdmi_data.enc_out_bus_format))
 		vmode->mtmdsclock /= 2;
+
+	if (hdmi->update)
+		return;
 
 	/* Set up HDMI_FC_INVIDCONF
 	 * Some display equipments require that the interval
@@ -2373,11 +2499,13 @@
 	hdmi_writeb(hdmi, 0x21, HDMI_FC_CH2PREAM);
 
 	/* Enable pixel clock and tmds data path */
-	hdmi->mc_clkdis |= HDMI_MC_CLKDIS_HDCPCLK_DISABLE |
-			   HDMI_MC_CLKDIS_CSCCLK_DISABLE |
-			   HDMI_MC_CLKDIS_AUDCLK_DISABLE |
-			   HDMI_MC_CLKDIS_PREPCLK_DISABLE |
-			   HDMI_MC_CLKDIS_TMDSCLK_DISABLE;
+
+	if (!hdmi->update)
+		hdmi->mc_clkdis |= HDMI_MC_CLKDIS_HDCPCLK_DISABLE |
+			HDMI_MC_CLKDIS_CSCCLK_DISABLE |
+			HDMI_MC_CLKDIS_AUDCLK_DISABLE |
+			HDMI_MC_CLKDIS_PREPCLK_DISABLE |
+			HDMI_MC_CLKDIS_TMDSCLK_DISABLE;
 	hdmi->mc_clkdis &= ~HDMI_MC_CLKDIS_PIXELCLK_DISABLE;
 	hdmi_writeb(hdmi, hdmi->mc_clkdis, HDMI_MC_CLKDIS);
 
@@ -2455,11 +2583,42 @@
 		    HDMI_IH_MUTE_FC_STAT2);
 }
 
+static void dw_hdmi_force_output_pattern(struct dw_hdmi *hdmi, struct drm_display_mode *mode)
+{
+	/* force output black */
+	if (hdmi_bus_fmt_is_rgb(hdmi->hdmi_data.enc_out_bus_format)) {
+		enum hdmi_quantization_range rgb_quant_range = drm_default_rgb_quant_range(mode);
+
+		if (hdmi->hdmi_data.quant_range == HDMI_QUANTIZATION_RANGE_FULL) {
+			hdmi_writeb(hdmi, 0x00, HDMI_FC_DBGTMDS2);	/*R*/
+			hdmi_writeb(hdmi, 0x00, HDMI_FC_DBGTMDS1);	/*G*/
+			hdmi_writeb(hdmi, 0x00, HDMI_FC_DBGTMDS0);	/*B*/
+		} else if (hdmi->hdmi_data.quant_range == HDMI_QUANTIZATION_RANGE_LIMITED) {
+			hdmi_writeb(hdmi, 0x10, HDMI_FC_DBGTMDS2);	/*R*/
+			hdmi_writeb(hdmi, 0x10, HDMI_FC_DBGTMDS1);	/*G*/
+			hdmi_writeb(hdmi, 0x10, HDMI_FC_DBGTMDS0);	/*B*/
+		} else if (hdmi->hdmi_data.quant_range == HDMI_QUANTIZATION_RANGE_DEFAULT) {
+			if (rgb_quant_range == HDMI_QUANTIZATION_RANGE_FULL) {
+				hdmi_writeb(hdmi, 0x00, HDMI_FC_DBGTMDS2);	/*R*/
+				hdmi_writeb(hdmi, 0x00, HDMI_FC_DBGTMDS1);	/*G*/
+				hdmi_writeb(hdmi, 0x00, HDMI_FC_DBGTMDS0);	/*B*/
+			} else if (rgb_quant_range == HDMI_QUANTIZATION_RANGE_LIMITED) {
+				hdmi_writeb(hdmi, 0x10, HDMI_FC_DBGTMDS2);	/*R*/
+				hdmi_writeb(hdmi, 0x10, HDMI_FC_DBGTMDS1);	/*G*/
+				hdmi_writeb(hdmi, 0x10, HDMI_FC_DBGTMDS0);	/*B*/
+			}
+		}
+	} else {
+		hdmi_writeb(hdmi, 0x80, HDMI_FC_DBGTMDS2);	/*Cr*/
+		hdmi_writeb(hdmi, 0x10, HDMI_FC_DBGTMDS1);	/*Y*/
+		hdmi_writeb(hdmi, 0x80, HDMI_FC_DBGTMDS0);	/*Cb*/
+	}
+}
+
 static int dw_hdmi_setup(struct dw_hdmi *hdmi, struct drm_display_mode *mode)
 {
 	int ret;
 	void *data = hdmi->plat_data->phy_data;
-	bool need_delay = false;
 
 	hdmi_disable_overflow_interrupts(hdmi);
 
@@ -2508,6 +2667,9 @@
 		hdmi->hdmi_data.enc_out_bus_format =
 			MEDIA_BUS_FMT_RGB888_1X24;
 
+	if (hdmi->plat_data->set_prev_bus_format)
+		hdmi->plat_data->set_prev_bus_format(data, hdmi->hdmi_data.enc_out_bus_format);
+
 	/* TOFIX: Get input encoding from plat data or fallback to none */
 	if (hdmi->plat_data->get_enc_in_encoding)
 		hdmi->hdmi_data.enc_in_encoding =
@@ -2537,23 +2699,11 @@
 		(mode->flags & DRM_MODE_FLAG_DBLCLK) ? 1 : 0;
 	hdmi->hdmi_data.video_mode.mdataenablepolarity = true;
 
+	dw_hdmi_force_output_pattern(hdmi, mode);
+
 	/* HDMI Initialization Step B.1 */
 	hdmi_av_composer(hdmi, mode);
 
-	/* HDMI Initializateion Step B.2 */
-	if (!hdmi->phy.enabled ||
-	    hdmi->hdmi_data.video_mode.previous_pixelclock !=
-	    hdmi->hdmi_data.video_mode.mpixelclock ||
-	    hdmi->hdmi_data.video_mode.previous_tmdsclock !=
-	    hdmi->hdmi_data.video_mode.mtmdsclock) {
-		ret = hdmi->phy.ops->init(hdmi, hdmi->phy.data,
-					  &hdmi->previous_mode);
-		if (ret)
-			return ret;
-		hdmi->phy.enabled = true;
-	} else {
-		need_delay = true;
-	}
 	/* HDMI Initialization Step B.3 */
 	dw_hdmi_enable_video_path(hdmi);
 
@@ -2582,11 +2732,31 @@
 	hdmi_video_sample(hdmi);
 	hdmi_tx_hdcp_config(hdmi, mode);
 
+	/* HDMI Enable phy output */
+	if (!hdmi->phy.enabled ||
+	    hdmi->hdmi_data.video_mode.previous_pixelclock !=
+	    hdmi->hdmi_data.video_mode.mpixelclock ||
+	    hdmi->hdmi_data.video_mode.previous_tmdsclock !=
+	    hdmi->hdmi_data.video_mode.mtmdsclock) {
+		ret = hdmi->phy.ops->init(hdmi, hdmi->phy.data,
+					  &hdmi->previous_mode);
+		if (ret)
+			return ret;
+		hdmi->phy.enabled = true;
+	}
+
 	dw_hdmi_clear_overflow(hdmi);
 
-	/* XXX: Add delay to make csc work before unmute video. */
-	if (need_delay)
+	/*
+	 * konka tv should switch pattern after set to yuv420 10bit or
+	 * the TV might not recognize the signal.
+	 */
+	if (!hdmi->update) {
+		hdmi_writeb(hdmi, 1, HDMI_FC_DBGFORCE);
 		msleep(50);
+		hdmi_writeb(hdmi, 0, HDMI_FC_DBGFORCE);
+	}
+
 	return 0;
 }
 
@@ -2686,6 +2856,7 @@
 		if (hdmi->initialized) {
 			hdmi->initialized = false;
 			hdmi->disabled = true;
+			hdmi->logo_plug_out = true;
 		}
 		if (hdmi->bridge_is_on)
 			dw_hdmi_poweroff(hdmi);
@@ -2793,6 +2964,8 @@
 
 	edid = drm_get_edid(connector, hdmi->ddc);
 	if (edid) {
+		int vic = 0;
+
 		dev_dbg(hdmi->dev, "got edid: width[%d] x height[%d]\n",
 			edid->width_cm, edid->height_cm);
 
@@ -2802,7 +2975,18 @@
 		drm_connector_update_edid_property(connector, edid);
 		cec_notifier_set_phys_addr_from_edid(hdmi->cec_notifier, edid);
 		ret = drm_add_edid_modes(connector, edid);
-		dw_hdmi_update_hdr_property(connector);
+
+		list_for_each_entry(mode, &connector->probed_modes, head) {
+			vic = drm_match_cea_mode(mode);
+
+			if (mode->picture_aspect_ratio == HDMI_PICTURE_ASPECT_NONE) {
+				if (vic >= 93 && vic <= 95)
+					mode->picture_aspect_ratio = HDMI_PICTURE_ASPECT_16_9;
+				else if (vic == 98)
+					mode->picture_aspect_ratio = HDMI_PICTURE_ASPECT_256_135;
+			}
+		}
+
 		kfree(edid);
 	} else {
 		hdmi->support_hdmi = true;
@@ -2815,11 +2999,8 @@
 
 			mode = drm_mode_duplicate(connector->dev, ptr);
 			if (mode) {
-				if (!i) {
+				if (!i)
 					mode->type = DRM_MODE_TYPE_PREFERRED;
-					mode->picture_aspect_ratio =
-						HDMI_PICTURE_ASPECT_NONE;
-				}
 				drm_mode_probed_add(connector, mode);
 				ret++;
 			}
@@ -2830,6 +3011,7 @@
 
 		dev_info(hdmi->dev, "failed to get edid\n");
 	}
+	dw_hdmi_update_hdr_property(connector);
 	dw_hdmi_check_output_type_changed(hdmi);
 
 	return ret;
@@ -2892,19 +3074,86 @@
 	return ret;
 }
 
-static bool hdr_metadata_equal(const struct drm_connector_state *old_state,
+static bool hdr_metadata_equal(struct dw_hdmi *hdmi, const struct drm_connector_state *old_state,
 			       const struct drm_connector_state *new_state)
 {
 	struct drm_property_blob *old_blob = old_state->hdr_output_metadata;
 	struct drm_property_blob *new_blob = new_state->hdr_output_metadata;
+	int i, ret;
+	u8 *data;
 
-	if (!old_blob || !new_blob)
-		return old_blob == new_blob;
+	hdmi->hdr2sdr = false;
+
+	if (!old_blob && !new_blob)
+		return true;
+
+	if (!old_blob) {
+		data = (u8 *)new_blob->data;
+
+		for (i = 0; i < new_blob->length; i++)
+			if (data[i])
+				return false;
+
+		return true;
+	}
+
+	if (!new_blob) {
+		data = (u8 *)old_blob->data;
+
+		for (i = 0; i < old_blob->length; i++)
+			if (data[i])
+				return false;
+
+		return true;
+	}
 
 	if (old_blob->length != new_blob->length)
 		return false;
 
-	return !memcmp(old_blob->data, new_blob->data, old_blob->length);
+	ret = !memcmp(old_blob->data, new_blob->data, old_blob->length);
+
+	if (!ret && new_blob) {
+		data = (u8 *)new_blob->data;
+
+		for (i = 0; i < new_blob->length; i++)
+			if (data[i])
+				break;
+
+		if (i == new_blob->length)
+			hdmi->hdr2sdr = true;
+	}
+
+	return ret;
+}
+
+static bool check_hdr_color_change(struct drm_connector_state *old_state,
+				   struct drm_connector_state *new_state,
+				   struct dw_hdmi *hdmi)
+{
+	void *data = hdmi->plat_data->phy_data;
+
+	if (!hdr_metadata_equal(hdmi, old_state, new_state)) {
+		hdmi->plat_data->check_hdr_color_change(new_state, data);
+		return true;
+	}
+
+	return false;
+}
+
+static bool check_hdmi_format_change(struct drm_connector_state *old_state,
+				     struct drm_connector_state *new_state,
+				     struct drm_connector *connector,
+				     struct dw_hdmi *hdmi)
+{
+	bool hdr_change, color_change;
+
+	hdr_change = check_hdr_color_change(old_state, new_state, hdmi);
+	color_change = dw_hdmi_color_changed(connector);
+
+	if (hdr_change || color_change)
+		return true;
+
+	return false;
 }
 
 static int dw_hdmi_connector_atomic_check(struct drm_connector *connector,
@@ -2925,12 +3174,19 @@
 	if (!crtc)
 		return 0;
 
+	crtc_state = drm_atomic_get_crtc_state(state, crtc);
+	if (IS_ERR(crtc_state))
+		return PTR_ERR(crtc_state);
+
+	mode = &crtc_state->mode;
+
 	/*
 	 * If HDMI is enabled in uboot, it's need to record
 	 * drm_display_mode and set phy status to enabled.
 	 */
 	if (!vmode->mpixelclock) {
-		crtc_state = drm_atomic_get_crtc_state(state, crtc);
+		u8 val;
+
 		if (hdmi->plat_data->get_enc_in_encoding)
 			hdmi->hdmi_data.enc_in_encoding =
 				hdmi->plat_data->get_enc_in_encoding(data);
@@ -2944,27 +3200,84 @@
 			hdmi->hdmi_data.enc_out_bus_format =
 				hdmi->plat_data->get_output_bus_format(data);
 
-		mode = &crtc_state->mode;
 		memcpy(&hdmi->previous_mode, mode, sizeof(hdmi->previous_mode));
 		vmode->mpixelclock = mode->crtc_clock * 1000;
-		vmode->previous_pixelclock = mode->clock;
-		vmode->previous_tmdsclock = mode->clock;
+		vmode->previous_pixelclock = mode->clock * 1000;
+		vmode->previous_tmdsclock = mode->clock * 1000;
 		vmode->mtmdsclock = hdmi_get_tmdsclock(hdmi,
 						       vmode->mpixelclock);
 		if (hdmi_bus_fmt_is_yuv420(hdmi->hdmi_data.enc_out_bus_format))
 			vmode->mtmdsclock /= 2;
+
+		dw_hdmi_force_output_pattern(hdmi, mode);
+
+		hdmi_clk_regenerator_update_pixel_clock(hdmi);
+		hdmi_enable_audio_clk(hdmi, hdmi->audio_enable);
+
+		drm_scdc_readb(hdmi->ddc, SCDC_TMDS_CONFIG, &val);
+
+		/* if plug out before hdmi bind, reset hdmi */
+		if (vmode->mtmdsclock >= 340000000 && !(val & SCDC_TMDS_BIT_CLOCK_RATIO_BY_40))
+			hdmi->logo_plug_out = true;
 	}
 
-	if (!hdr_metadata_equal(old_state, new_state) ||
-	    dw_hdmi_color_changed(connector)) {
-		crtc_state = drm_atomic_get_crtc_state(state, crtc);
-		if (IS_ERR(crtc_state))
-			return PTR_ERR(crtc_state);
+	if (check_hdmi_format_change(old_state, new_state, connector, hdmi) ||
+	    hdmi->logo_plug_out) {
+		u32 mtmdsclk;
 
-		crtc_state->mode_changed = true;
+		if (hdmi->plat_data->update_color_format)
+			hdmi->plat_data->update_color_format(new_state, data);
+		if (hdmi->plat_data->get_enc_in_encoding)
+			hdmi->hdmi_data.enc_in_encoding =
+				hdmi->plat_data->get_enc_in_encoding(data);
+		if (hdmi->plat_data->get_enc_out_encoding)
+			hdmi->hdmi_data.enc_out_encoding =
+				hdmi->plat_data->get_enc_out_encoding(data);
+		if (hdmi->plat_data->get_input_bus_format)
+			hdmi->hdmi_data.enc_in_bus_format =
+				hdmi->plat_data->get_input_bus_format(data);
+		if (hdmi->plat_data->get_output_bus_format)
+			hdmi->hdmi_data.enc_out_bus_format =
+				hdmi->plat_data->get_output_bus_format(data);
+
+		mtmdsclk = hdmi_get_tmdsclock(hdmi, mode->clock);
+
+		if (hdmi_bus_fmt_is_yuv420(hdmi->hdmi_data.enc_out_bus_format))
+			mtmdsclk /= 2;
+
+		if (!(hdmi_readb(hdmi, HDMI_PHY_STAT0) & HDMI_PHY_HPD))
+			return 0;
+
+		if (hdmi->hdmi_data.video_mode.mpixelclock == (mode->clock * 1000) &&
+		    hdmi->hdmi_data.video_mode.mtmdsclock == (mtmdsclk * 1000) &&
+		    !hdmi->logo_plug_out && !hdmi->disabled) {
+			hdmi->update = true;
+			hdmi_writeb(hdmi, HDMI_FC_GCP_SET_AVMUTE, HDMI_FC_GCP);
+			mdelay(180);
+			handle_plugged_change(hdmi, false);
+		} else {
+			hdmi->update = false;
+			crtc_state->mode_changed = true;
+			hdmi->logo_plug_out = false;
+		}
 	}
 
 	return 0;
+}
+
+static void dw_hdmi_connector_atomic_commit(struct drm_connector *connector,
+					    struct drm_connector_state *state)
+{
+	struct dw_hdmi *hdmi =
+		container_of(connector, struct dw_hdmi, connector);
+
+	if (hdmi->update) {
+		dw_hdmi_setup(hdmi, &hdmi->previous_mode);
+		mdelay(50);
+		handle_plugged_change(hdmi, true);
+		hdmi_writeb(hdmi, HDMI_FC_GCP_CLEAR_AVMUTE, HDMI_FC_GCP);
+		hdmi->update = false;
+	}
 }
 
 void dw_hdmi_set_quant_range(struct dw_hdmi *hdmi)
@@ -3006,6 +3319,15 @@
 }
 EXPORT_SYMBOL_GPL(dw_hdmi_get_output_type_cap);
 
+void dw_hdmi_set_hpd_wake(struct dw_hdmi *hdmi)
+{
+	if (!hdmi->cec)
+		return;
+
+	dw_hdmi_hpd_wake_up(hdmi->cec);
+}
+EXPORT_SYMBOL_GPL(dw_hdmi_set_hpd_wake);
+
 static void dw_hdmi_connector_force(struct drm_connector *connector)
 {
 	struct dw_hdmi *hdmi = container_of(connector, struct dw_hdmi,
@@ -3045,6 +3367,7 @@
 	.get_modes = dw_hdmi_connector_get_modes,
 	.best_encoder = drm_atomic_helper_best_encoder,
 	.atomic_check = dw_hdmi_connector_atomic_check,
+	.atomic_commit = dw_hdmi_connector_atomic_commit,
 };
 
 static void dw_hdmi_attach_properties(struct dw_hdmi *hdmi)
@@ -3172,6 +3495,9 @@
 	if (hdmi->next_bridge)
 		return MODE_OK;
 
+	if (!(hdmi_readb(hdmi, HDMI_PHY_STAT0) & HDMI_PHY_HPD) && hdmi->hdr2sdr)
+		return MODE_OK;
+
 	if (hdmi->plat_data->mode_valid)
 		mode_status = hdmi->plat_data->mode_valid(connector, mode);
 
@@ -3195,12 +3521,21 @@
 static void dw_hdmi_bridge_disable(struct drm_bridge *bridge)
 {
 	struct dw_hdmi *hdmi = bridge->driver_private;
+	void *data = hdmi->plat_data->phy_data;
 
 	mutex_lock(&hdmi->mutex);
 	hdmi->disabled = true;
+	handle_plugged_change(hdmi, false);
 	dw_hdmi_update_power(hdmi);
 	dw_hdmi_update_phy_mask(hdmi);
+	if (hdmi->plat_data->dclk_set)
+		hdmi->plat_data->dclk_set(hdmi->plat_data->phy_data, false, 0);
 	mutex_unlock(&hdmi->mutex);
+
+	mutex_lock(&hdmi->i2c->lock);
+	if (hdmi->plat_data->set_ddc_io)
+		hdmi->plat_data->set_ddc_io(data, false);
+	mutex_unlock(&hdmi->i2c->lock);
 }
 
 static void dw_hdmi_bridge_enable(struct drm_bridge *bridge)
@@ -3209,8 +3544,11 @@
 
 	mutex_lock(&hdmi->mutex);
 	hdmi->disabled = false;
+	if (hdmi->plat_data->dclk_set)
+		hdmi->plat_data->dclk_set(hdmi->plat_data->phy_data, true, 0);
 	dw_hdmi_update_power(hdmi);
 	dw_hdmi_update_phy_mask(hdmi);
+	handle_plugged_change(hdmi, true);
 	mutex_unlock(&hdmi->mutex);
 }
 
@@ -3456,6 +3794,7 @@
 static const struct dw_hdmi_cec_ops dw_hdmi_cec_ops = {
 	.write = hdmi_writeb,
 	.read = hdmi_readb,
+	.mod = hdmi_modb,
 	.enable = dw_hdmi_cec_enable,
 	.disable = dw_hdmi_cec_disable,
 };
@@ -3464,14 +3803,14 @@
 	.reg_bits	= 32,
 	.val_bits	= 8,
 	.reg_stride	= 1,
-	.max_register	= HDMI_I2CM_FS_SCL_LCNT_0_ADDR,
+	.max_register	= HDMI_I2CM_SCDC_UPDATE1,
 };
 
 static const struct regmap_config hdmi_regmap_32bit_config = {
 	.reg_bits	= 32,
 	.val_bits	= 32,
 	.reg_stride	= 4,
-	.max_register	= HDMI_I2CM_FS_SCL_LCNT_0_ADDR << 2,
+	.max_register	= HDMI_I2CM_SCDC_UPDATE1 << 2,
 };
 
 static int dw_hdmi_status_show(struct seq_file *s, void *v)
@@ -3852,6 +4191,7 @@
 	hdmi->connector.stereo_allowed = 1;
 	hdmi->plat_data = plat_data;
 	hdmi->dev = dev;
+	hdmi->audio_enable = true;
 	hdmi->sample_rate = 48000;
 	hdmi->disabled = true;
 	hdmi->rxsense = true;
@@ -3983,6 +4323,7 @@
 	if (ret)
 		goto err_iahb;
 
+	hdmi->logo_plug_out = false;
 	hdmi->initialized = false;
 	ret = hdmi_readb(hdmi, HDMI_PHY_STAT0);
 	if (((ret & HDMI_PHY_TX_PHY_LOCK) && (ret & HDMI_PHY_HPD) &&
@@ -3992,8 +4333,14 @@
 		hdmi->bridge_is_on = true;
 		hdmi->phy.enabled = true;
 		hdmi->initialized = true;
+		if (hdmi->plat_data->set_ddc_io)
+			hdmi->plat_data->set_ddc_io(hdmi->plat_data->phy_data, true);
+		if (hdmi->plat_data->dclk_set)
+			hdmi->plat_data->dclk_set(hdmi->plat_data->phy_data, true, 0);
 	} else if (ret & HDMI_PHY_TX_PHY_LOCK) {
 		hdmi->phy.ops->disable(hdmi, hdmi->phy.data);
+		if (hdmi->plat_data->set_ddc_io)
+			hdmi->plat_data->set_ddc_io(hdmi->plat_data->phy_data, false);
 	}
 
 	init_hpd_work(hdmi);
@@ -4007,7 +4354,7 @@
 
 	hdmi->irq = irq;
 	ret = devm_request_threaded_irq(dev, irq, dw_hdmi_hardirq,
-					dw_hdmi_irq, IRQF_SHARED,
+					dw_hdmi_irq, IRQF_SHARED | IRQF_ONESHOT,
 					dev_name(dev), hdmi);
 	if (ret)
 		goto err_iahb;
@@ -4126,6 +4473,12 @@
 		cec.ops = &dw_hdmi_cec_ops;
 		cec.irq = irq;
 
+		irq = platform_get_irq(pdev, 1);
+		if (irq < 0)
+			dev_dbg(hdmi->dev, "can't get cec wake up irq\n");
+
+		cec.wake_irq = irq;
+
 		pdevinfo.name = "dw-hdmi-cec";
 		pdevinfo.data = &cec;
 		pdevinfo.size_data = sizeof(cec);
@@ -4136,7 +4489,8 @@
 
 	hdmi->extcon = devm_extcon_dev_allocate(hdmi->dev, dw_hdmi_cable);
 	if (IS_ERR(hdmi->extcon)) {
-		dev_err(hdmi->dev, "allocate extcon failed\n");
+		ret = PTR_ERR(hdmi->extcon);
+		dev_err(hdmi->dev, "allocate extcon failed: %d\n", ret);
 		goto err_iahb;
 	}
 
diff --git a/kernel/drivers/gpu/drm/bridge/synopsys/dw-hdmi.h b/kernel/drivers/gpu/drm/bridge/synopsys/dw-hdmi.h
index bb53a5c..b7d3137 100644
--- a/kernel/drivers/gpu/drm/bridge/synopsys/dw-hdmi.h
+++ b/kernel/drivers/gpu/drm/bridge/synopsys/dw-hdmi.h
@@ -586,6 +586,16 @@
 #define HDMI_I2CM_FS_SCL_LCNT_1_ADDR            0x7E11
 #define HDMI_I2CM_FS_SCL_LCNT_0_ADDR            0x7E12
 #define HDMI_I2CM_SDA_HOLD                      0x7E13
+#define HDMI_I2CM_SCDC_READ_UPDATE              0x7E14
+#define HDMI_I2CM_READ_REQ_EN_MSK               BIT(4)
+#define HDMI_I2CM_READ_REQ_EN_OFFSET            4
+#define HDMI_I2CM_READ_UPDATE_MSK               BIT(0)
+#define HDMI_I2CM_READ_UPDATE_OFFSET            0
+#define HDMI_I2CM_I2CM_UPRD_VSYNC_EN_MSK        BIT(5)
+#define HDMI_I2CM_I2CM_UPRD_VSYNC_EN_OFFSET     5
+#define	HDMI_I2CM_READ_BUFF0                    0x7E20
+#define	HDMI_I2CM_SCDC_UPDATE0                  0x7E30
+#define	HDMI_I2CM_SCDC_UPDATE1                  0x7E31
 
 enum {
 /* PRODUCT_ID0 field values */
@@ -1152,7 +1162,10 @@
 	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,
 	HDMI_I2CM_OPERATION_READ_EXT = 0x2,
 	HDMI_I2CM_OPERATION_READ = 0x1,
 
diff --git a/kernel/drivers/gpu/drm/drm_edid.c b/kernel/drivers/gpu/drm/drm_edid.c
index 05aa5c2..46e6148 100644
--- a/kernel/drivers/gpu/drm/drm_edid.c
+++ b/kernel/drivers/gpu/drm/drm_edid.c
@@ -4120,6 +4120,113 @@
 	hdmi->y420_cmdb_map = map;
 }
 
+#ifdef CONFIG_NO_GKI
+static int drm_find_all_edid_extension(const struct edid *edid,
+				       int ext_id, int *ext_list)
+{
+	u8 *edid_ext = NULL;
+	int i, count = 0;
+
+	/* No EDID or EDID extensions */
+	if (edid == NULL || edid->extensions == 0)
+		return -EINVAL;
+
+	/* too many EDID extensions */
+	if (edid->extensions > 32)
+		return -EINVAL;
+
+	/* Find CEA extension */
+	for (i = 0; i < edid->extensions; i++) {
+		edid_ext = (u8 *)edid + EDID_LENGTH * (i + 1);
+		if (edid_ext[0] == ext_id) {
+			*ext_list = i;
+			ext_list++;
+			count++;
+		}
+	}
+
+	return count;
+}
+
+/*
+ * Search EDID for CEA extension block.
+ */
+static u8 *drm_find_edid_extension_from_index(const struct edid *edid,
+					      int ext_id, int *ext_index)
+{
+	u8 *edid_ext = NULL;
+	int i;
+	/* No EDID or EDID extensions */
+	if (edid == NULL || edid->extensions == 0)
+		return NULL;
+	/* Find CEA extension */
+	for (i = *ext_index; i < edid->extensions; i++) {
+		edid_ext = (u8 *)edid + EDID_LENGTH * (i + 1);
+		if (edid_ext[0] == ext_id)
+			break;
+	}
+	if (i >= edid->extensions)
+		return NULL;
+	*ext_index = i + 1;
+	return edid_ext;
+}
+
+static int
+add_cea_modes(struct drm_connector *connector, struct edid *edid)
+{
+	const u8 *cea;
+	const u8 *db, *hdmi = NULL, *video = NULL;
+	u8 dbl, hdmi_len, video_len = 0;
+	int i, count = 0, modes = 0;
+	int ext_index = 0;
+	int ext_list[32];
+
+	count = drm_find_all_edid_extension(edid, CEA_EXT, ext_list);
+	for (i = 0; i < count; i++) {
+		ext_index = ext_list[i];
+		cea = drm_find_edid_extension_from_index(edid, CEA_EXT, &ext_index);
+		if (cea && cea_revision(cea) >= 3) {
+			int i, start, end;
+
+			if (cea_db_offsets(cea, &start, &end))
+				return 0;
+
+			for_each_cea_db(cea, i, start, end) {
+				db = &cea[i];
+				dbl = cea_db_payload_len(db);
+
+				if (cea_db_tag(db) == VIDEO_BLOCK) {
+					video = db + 1;
+					video_len = dbl;
+					modes += do_cea_modes(connector, video, dbl);
+				} else if (cea_db_is_hdmi_vsdb(db)) {
+					hdmi = db;
+					hdmi_len = dbl;
+				} else if (cea_db_is_y420vdb(db)) {
+					const u8 *vdb420 = &db[2];
+
+					/* Add 4:2:0(only) modes present in EDID */
+					modes += do_y420vdb_modes(connector,
+								  vdb420,
+								  dbl - 1);
+				}
+			}
+		}
+
+		/*
+		 * We parse the HDMI VSDB after having added the cea modes as we will
+		 * be patching their flags when the sink supports stereo 3D.
+		 */
+		if (hdmi)
+			modes += do_hdmi_vsdb_modes(connector, hdmi, hdmi_len, video,
+						    video_len);
+	}
+
+	return modes;
+}
+
+#else
+
 static int
 add_cea_modes(struct drm_connector *connector, struct edid *edid)
 {
@@ -4166,6 +4273,7 @@
 
 	return modes;
 }
+#endif
 
 static void fixup_detailed_cea_mode_clock(struct drm_display_mode *mode)
 {
diff --git a/kernel/drivers/gpu/drm/drm_gem.c b/kernel/drivers/gpu/drm/drm_gem.c
index 2835ba2..fdda429 100644
--- a/kernel/drivers/gpu/drm/drm_gem.c
+++ b/kernel/drivers/gpu/drm/drm_gem.c
@@ -175,21 +175,6 @@
 }
 EXPORT_SYMBOL(drm_gem_private_object_init);
 
-static void
-drm_gem_remove_prime_handles(struct drm_gem_object *obj, struct drm_file *filp)
-{
-	/*
-	 * Note: obj->dma_buf can't disappear as long as we still hold a
-	 * handle reference in obj->handle_count.
-	 */
-	mutex_lock(&filp->prime.lock);
-	if (obj->dma_buf) {
-		drm_prime_remove_buf_handle_locked(&filp->prime,
-						   obj->dma_buf);
-	}
-	mutex_unlock(&filp->prime.lock);
-}
-
 /**
  * drm_gem_object_handle_free - release resources bound to userspace handles
  * @obj: GEM object to clean up.
@@ -262,7 +247,7 @@
 		dev->driver->gem_close_object(obj, file_priv);
 
 	if (drm_core_check_feature(dev, DRIVER_PRIME))
-		drm_gem_remove_prime_handles(obj, file_priv);
+		drm_prime_remove_buf_handle(&file_priv->prime, id);
 	drm_vma_node_revoke(&obj->vma_node, file_priv);
 
 	drm_gem_object_handle_put_unlocked(obj);
diff --git a/kernel/drivers/gpu/drm/drm_internal.h b/kernel/drivers/gpu/drm/drm_internal.h
index 6d03513..b3ece55 100644
--- a/kernel/drivers/gpu/drm/drm_internal.h
+++ b/kernel/drivers/gpu/drm/drm_internal.h
@@ -44,8 +44,8 @@
 
 void drm_prime_init_file_private(struct drm_prime_file_private *prime_fpriv);
 void drm_prime_destroy_file_private(struct drm_prime_file_private *prime_fpriv);
-void drm_prime_remove_buf_handle_locked(struct drm_prime_file_private *prime_fpriv,
-					struct dma_buf *dma_buf);
+void drm_prime_remove_buf_handle(struct drm_prime_file_private *prime_fpriv,
+				 uint32_t handle);
 
 /* drm_drv.c */
 struct drm_minor *drm_minor_acquire(unsigned int minor_id);
diff --git a/kernel/drivers/gpu/drm/drm_prime.c b/kernel/drivers/gpu/drm/drm_prime.c
index 0183b85..441113b 100644
--- a/kernel/drivers/gpu/drm/drm_prime.c
+++ b/kernel/drivers/gpu/drm/drm_prime.c
@@ -252,29 +252,33 @@
 }
 EXPORT_SYMBOL(drm_gem_map_detach);
 
-void drm_prime_remove_buf_handle_locked(struct drm_prime_file_private *prime_fpriv,
-					struct dma_buf *dma_buf)
+void drm_prime_remove_buf_handle(struct drm_prime_file_private *prime_fpriv,
+				 uint32_t handle)
 {
 	struct rb_node *rb;
 
-	rb = prime_fpriv->dmabufs.rb_node;
+	mutex_lock(&prime_fpriv->lock);
+
+	rb = prime_fpriv->handles.rb_node;
 	while (rb) {
 		struct drm_prime_member *member;
 
-		member = rb_entry(rb, struct drm_prime_member, dmabuf_rb);
-		if (member->dma_buf == dma_buf) {
+		member = rb_entry(rb, struct drm_prime_member, handle_rb);
+		if (member->handle == handle) {
 			rb_erase(&member->handle_rb, &prime_fpriv->handles);
 			rb_erase(&member->dmabuf_rb, &prime_fpriv->dmabufs);
 
-			dma_buf_put(dma_buf);
+			dma_buf_put(member->dma_buf);
 			kfree(member);
-			return;
-		} else if (member->dma_buf < dma_buf) {
+			break;
+		} else if (member->handle < handle) {
 			rb = rb->rb_right;
 		} else {
 			rb = rb->rb_left;
 		}
 	}
+
+	mutex_unlock(&prime_fpriv->lock);
 }
 
 /**
diff --git a/kernel/drivers/gpu/drm/i915/i915_gem.c b/kernel/drivers/gpu/drm/i915/i915_gem.c
index fe40f46..8f83a31 100644
--- a/kernel/drivers/gpu/drm/i915/i915_gem.c
+++ b/kernel/drivers/gpu/drm/i915/i915_gem.c
@@ -516,7 +516,7 @@
 				 long timeout,
 				 struct intel_rps_client *rps_client)
 {
-	unsigned int seq = __read_seqcount_begin(&resv->seq);
+	unsigned int seq = read_seqbegin(&resv->seq);
 	struct dma_fence *excl;
 	bool prune_fences = false;
 
@@ -569,9 +569,9 @@
 	 * signaled and that the reservation object has not been changed (i.e.
 	 * no new fences have been added).
 	 */
-	if (prune_fences && !__read_seqcount_retry(&resv->seq, seq)) {
+	if (prune_fences && !read_seqretry(&resv->seq, seq)) {
 		if (reservation_object_trylock(resv)) {
-			if (!__read_seqcount_retry(&resv->seq, seq))
+			if (!read_seqretry(&resv->seq, seq))
 				reservation_object_add_excl_fence(resv, NULL);
 			reservation_object_unlock(resv);
 		}
@@ -4719,7 +4719,7 @@
 	 *
 	 */
 retry:
-	seq = raw_read_seqcount(&obj->resv->seq);
+	seq = read_seqbegin(&obj->resv->seq);
 
 	/* Translate the exclusive fence to the READ *and* WRITE engine */
 	args->busy = busy_check_writer(rcu_dereference(obj->resv->fence_excl));
@@ -4737,7 +4737,7 @@
 		}
 	}
 
-	if (args->busy && read_seqcount_retry(&obj->resv->seq, seq))
+	if (args->busy && read_seqretry(&obj->resv->seq, seq))
 		goto retry;
 
 	err = 0;
diff --git a/kernel/drivers/gpu/drm/i915/i915_irq.c b/kernel/drivers/gpu/drm/i915/i915_irq.c
index b7c3982..eed1ba3 100644
--- a/kernel/drivers/gpu/drm/i915/i915_irq.c
+++ b/kernel/drivers/gpu/drm/i915/i915_irq.c
@@ -1025,6 +1025,7 @@
 	spin_lock_irqsave(&dev_priv->uncore.lock, irqflags);
 
 	/* preempt_disable_rt() should go right here in PREEMPT_RT patchset. */
+	preempt_disable_rt();
 
 	/* Get optional system timestamp before query. */
 	if (stime)
@@ -1076,6 +1077,7 @@
 		*etime = ktime_get();
 
 	/* preempt_enable_rt() should go right here in PREEMPT_RT patchset. */
+	preempt_enable_rt();
 
 	spin_unlock_irqrestore(&dev_priv->uncore.lock, irqflags);
 
diff --git a/kernel/drivers/gpu/drm/i915/i915_request.c b/kernel/drivers/gpu/drm/i915/i915_request.c
index 5c2c93c..7124510 100644
--- a/kernel/drivers/gpu/drm/i915/i915_request.c
+++ b/kernel/drivers/gpu/drm/i915/i915_request.c
@@ -356,9 +356,7 @@
 
 	GEM_BUG_ON(!i915_request_completed(rq));
 
-	local_irq_disable();
-
-	spin_lock(&engine->timeline.lock);
+	spin_lock_irq(&engine->timeline.lock);
 	GEM_BUG_ON(!list_is_first(&rq->link, &engine->timeline.requests));
 	list_del_init(&rq->link);
 	spin_unlock(&engine->timeline.lock);
@@ -372,9 +370,7 @@
 		GEM_BUG_ON(!atomic_read(&rq->i915->gt_pm.rps.num_waiters));
 		atomic_dec(&rq->i915->gt_pm.rps.num_waiters);
 	}
-	spin_unlock(&rq->lock);
-
-	local_irq_enable();
+	spin_unlock_irq(&rq->lock);
 
 	/*
 	 * The backing object for the context is done after switching to the
diff --git a/kernel/drivers/gpu/drm/i915/i915_trace.h b/kernel/drivers/gpu/drm/i915/i915_trace.h
index b50c6b8..33028d8 100644
--- a/kernel/drivers/gpu/drm/i915/i915_trace.h
+++ b/kernel/drivers/gpu/drm/i915/i915_trace.h
@@ -2,6 +2,10 @@
 #if !defined(_I915_TRACE_H_) || defined(TRACE_HEADER_MULTI_READ)
 #define _I915_TRACE_H_
 
+#ifdef CONFIG_PREEMPT_RT_BASE
+#define NOTRACE
+#endif
+
 #include <linux/stringify.h>
 #include <linux/types.h>
 #include <linux/tracepoint.h>
@@ -679,7 +683,7 @@
 	    TP_ARGS(rq)
 );
 
-#if defined(CONFIG_DRM_I915_LOW_LEVEL_TRACEPOINTS)
+#if defined(CONFIG_DRM_I915_LOW_LEVEL_TRACEPOINTS) && !defined(NOTRACE)
 DEFINE_EVENT(i915_request, i915_request_submit,
 	     TP_PROTO(struct i915_request *rq),
 	     TP_ARGS(rq)
diff --git a/kernel/drivers/gpu/drm/i915/intel_sprite.c b/kernel/drivers/gpu/drm/i915/intel_sprite.c
index f7026e8..07e4dde 100644
--- a/kernel/drivers/gpu/drm/i915/intel_sprite.c
+++ b/kernel/drivers/gpu/drm/i915/intel_sprite.c
@@ -36,6 +36,7 @@
 #include <drm/drm_rect.h>
 #include <drm/drm_atomic.h>
 #include <drm/drm_plane_helper.h>
+#include <linux/locallock.h>
 #include "intel_drv.h"
 #include "intel_frontbuffer.h"
 #include <drm/i915_drm.h>
@@ -59,6 +60,8 @@
 #else
 #define VBLANK_EVASION_TIME_US 100
 #endif
+
+static DEFINE_LOCAL_IRQ_LOCK(pipe_update_lock);
 
 /**
  * intel_pipe_update_start() - start update of a set of display registers
@@ -107,7 +110,7 @@
 	if (intel_psr_wait_for_idle(new_crtc_state))
 		DRM_ERROR("PSR idle timed out, atomic update may fail\n");
 
-	local_irq_disable();
+	local_lock_irq(pipe_update_lock);
 
 	crtc->debug.min_vbl = min;
 	crtc->debug.max_vbl = max;
@@ -131,11 +134,11 @@
 			break;
 		}
 
-		local_irq_enable();
+		local_unlock_irq(pipe_update_lock);
 
 		timeout = schedule_timeout(timeout);
 
-		local_irq_disable();
+		local_lock_irq(pipe_update_lock);
 	}
 
 	finish_wait(wq, &wait);
@@ -168,7 +171,7 @@
 	return;
 
 irq_disable:
-	local_irq_disable();
+	local_lock_irq(pipe_update_lock);
 }
 
 /**
@@ -204,7 +207,7 @@
 		new_crtc_state->base.event = NULL;
 	}
 
-	local_irq_enable();
+	local_unlock_irq(pipe_update_lock);
 
 	if (intel_vgpu_active(dev_priv))
 		return;
diff --git a/kernel/drivers/gpu/drm/radeon/radeon_display.c b/kernel/drivers/gpu/drm/radeon/radeon_display.c
index 5985efc..de2552a 100644
--- a/kernel/drivers/gpu/drm/radeon/radeon_display.c
+++ b/kernel/drivers/gpu/drm/radeon/radeon_display.c
@@ -1818,6 +1818,7 @@
 	struct radeon_device *rdev = dev->dev_private;
 
 	/* preempt_disable_rt() should go right here in PREEMPT_RT patchset. */
+	preempt_disable_rt();
 
 	/* Get optional system timestamp before query. */
 	if (stime)
@@ -1910,6 +1911,7 @@
 		*etime = ktime_get();
 
 	/* preempt_enable_rt() should go right here in PREEMPT_RT patchset. */
+	preempt_enable_rt();
 
 	/* Decode into vertical and horizontal scanout position. */
 	*vpos = position & 0x1fff;
diff --git a/kernel/drivers/gpu/drm/rockchip/Makefile b/kernel/drivers/gpu/drm/rockchip/Makefile
index a5384c9..e2a7d20 100644
--- a/kernel/drivers/gpu/drm/rockchip/Makefile
+++ b/kernel/drivers/gpu/drm/rockchip/Makefile
@@ -9,7 +9,7 @@
 rockchipdrm-$(CONFIG_ROCKCHIP_PSR) += rockchip_drm_psr.o
 
 rockchipdrm-$(CONFIG_ROCKCHIP_VOP) += rockchip_drm_vop.o rockchip_vop_reg.o
-rockchipdrm-$(CONFIG_ROCKCHIP_VOP2) += rockchip_drm_vop2.o rockchip_vop2_reg.o
+rockchipdrm-$(CONFIG_ROCKCHIP_VOP2) += rockchip_drm_vop2.o rockchip_vop2_reg.o rockchip_post_csc.o
 
 rockchipdrm-$(CONFIG_DRM_FBDEV_EMULATION) += rockchip_drm_fbdev.o
 
diff --git a/kernel/drivers/gpu/drm/rockchip/cdn-dp-core.c b/kernel/drivers/gpu/drm/rockchip/cdn-dp-core.c
index bf67c88..913615b 100644
--- a/kernel/drivers/gpu/drm/rockchip/cdn-dp-core.c
+++ b/kernel/drivers/gpu/drm/rockchip/cdn-dp-core.c
@@ -729,6 +729,8 @@
 static void cdn_dp_encoder_disable(struct drm_encoder *encoder)
 {
 	struct cdn_dp_device *dp = encoder_to_dp(encoder);
+	struct drm_crtc *crtc = encoder->crtc;
+	struct rockchip_crtc_state *s = to_rockchip_crtc_state(crtc->state);
 	int ret;
 
 	mutex_lock(&dp->lock);
@@ -752,6 +754,8 @@
 	 */
 	if (!dp->connected && cdn_dp_connected_port(dp))
 		schedule_work(&dp->event_work);
+
+	s->output_if &= ~VOP_OUTPUT_IF_DP0;
 }
 
 static int cdn_dp_encoder_atomic_check(struct drm_encoder *encoder,
@@ -773,6 +777,7 @@
 	}
 
 	s->output_mode = ROCKCHIP_OUT_MODE_AAAA;
+	s->output_if |= VOP_OUTPUT_IF_DP0;
 	s->output_type = DRM_MODE_CONNECTOR_DisplayPort;
 	s->tv_state = &conn_state->tv;
 	s->eotf = TRADITIONAL_GAMMA_SDR;
diff --git a/kernel/drivers/gpu/drm/rockchip/dw-mipi-dsi.c b/kernel/drivers/gpu/drm/rockchip/dw-mipi-dsi.c
index c2d7db8..bd8e944 100644
--- a/kernel/drivers/gpu/drm/rockchip/dw-mipi-dsi.c
+++ b/kernel/drivers/gpu/drm/rockchip/dw-mipi-dsi.c
@@ -1091,6 +1091,8 @@
 static void dw_mipi_dsi_encoder_disable(struct drm_encoder *encoder)
 {
 	struct dw_mipi_dsi *dsi = encoder_to_dsi(encoder);
+	struct drm_crtc *crtc = encoder->crtc;
+	struct rockchip_crtc_state *s = to_rockchip_crtc_state(crtc->state);
 
 	if (dsi->panel)
 		drm_panel_disable(dsi->panel);
@@ -1105,6 +1107,11 @@
 
 	if (IS_ENABLED(CONFIG_CPU_RK3568) && dsi->pdata->soc_type == RK3568)
 		vop2_standby(encoder->crtc, 0);
+
+	if (dsi->slave)
+		s->output_if &= ~(VOP_OUTPUT_IF_MIPI1 | VOP_OUTPUT_IF_MIPI0);
+	else
+		s->output_if &= ~(dsi->id ? VOP_OUTPUT_IF_MIPI1 : VOP_OUTPUT_IF_MIPI0);
 }
 
 static void dw_mipi_dsi_vop_routing(struct dw_mipi_dsi *dsi)
diff --git a/kernel/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c b/kernel/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c
index 25cf927..27efb38 100644
--- a/kernel/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c
+++ b/kernel/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c
@@ -8,8 +8,10 @@
  */
 
 #include <linux/clk.h>
+#include <linux/gpio/consumer.h>
 #include <linux/mfd/syscon.h>
 #include <linux/module.h>
+#include <linux/of_gpio.h>
 #include <linux/platform_device.h>
 #include <linux/phy/phy.h>
 #include <linux/regmap.h>
@@ -57,6 +59,22 @@
 #define RK3399_GRF_SOC_CON20		0x6250
 #define RK3399_HDMI_LCDC_SEL		BIT(6)
 
+#define RK3528_VO_GRF_HDMI_MASK		0x60014
+#define RK3528_HDMI_SNKDET_SEL		BIT(6)
+#define RK3528_HDMI_SNKDET		BIT(5)
+#define RK3528_HDMI_CECIN_MSK		BIT(2)
+#define RK3528_HDMI_SDAIN_MSK		BIT(1)
+#define RK3528_HDMI_SCLIN_MSK		BIT(0)
+
+#define RK3528PMU_GRF_SOC_CON6		0x70018
+#define RK3528_HDMI_SDA5V_GRF		BIT(6)
+#define RK3528_HDMI_SCL5V_GRF		BIT(5)
+#define RK3528_HDMI_CEC5V_GRF		BIT(4)
+#define RK3528_HDMI_HPD5V_GRF		BIT(3)
+
+#define RK3528_GPIO_SWPORT_DR_L		0x0000
+#define RK3528_GPIO0_A2_DR		BIT(2)
+
 #define RK3568_GRF_VO_CON1		0x0364
 #define RK3568_HDMI_SDAIN_MSK		BIT(15)
 #define RK3568_HDMI_SCLIN_MSK		BIT(14)
@@ -103,12 +121,14 @@
 struct rockchip_hdmi {
 	struct device *dev;
 	struct regmap *regmap;
+	void __iomem *gpio_base;
 	struct drm_encoder encoder;
 	const struct rockchip_hdmi_chip_data *chip_data;
 	struct clk *phyref_clk;
 	struct clk *grf_clk;
 	struct clk *hclk_vio;
 	struct clk *hclk_vop;
+	struct clk *dclk_vop;
 	struct dw_hdmi *hdmi;
 
 	struct phy *phy;
@@ -117,12 +137,14 @@
 	bool unsupported_deep_color;
 	bool skip_check_420_mode;
 	bool mode_changed;
+	bool hpd_wake_en;
 	u8 force_output;
 	u8 id;
 
 	unsigned long bus_format;
 	unsigned long output_bus_format;
 	unsigned long enc_out_encoding;
+	unsigned long prev_bus_format;
 	int color_changed;
 
 	struct drm_property *color_depth_property;
@@ -143,6 +165,12 @@
 	unsigned int phy_bus_width;
 	enum drm_hdmi_output_type hdmi_output;
 	struct rockchip_drm_sub_dev sub_dev;
+
+	struct gpio_desc *hpd_gpiod;
+	struct pinctrl *p;
+	struct pinctrl_state *idle_state;
+	struct pinctrl_state *default_state;
+	int hpd_irq;
 };
 
 #define to_rockchip_hdmi(x)	container_of(x, struct rockchip_hdmi, x)
@@ -460,6 +488,37 @@
 	{ ~0UL,      0x0000, 0x0000, 0x0000},
 };
 
+static int hdmi_bus_fmt_color_depth(unsigned int bus_format)
+{
+	switch (bus_format) {
+	case MEDIA_BUS_FMT_RGB888_1X24:
+	case MEDIA_BUS_FMT_YUV8_1X24:
+	case MEDIA_BUS_FMT_UYVY8_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_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_UYYVYY12_0_5X36:
+		return 12;
+
+	case MEDIA_BUS_FMT_RGB161616_1X48:
+	case MEDIA_BUS_FMT_YUV16_1X48:
+	case MEDIA_BUS_FMT_UYYVYY16_0_5X48:
+		return 16;
+
+	default:
+		return 0;
+	}
+}
+
 static int rockchip_hdmi_update_phy_table(struct rockchip_hdmi *hdmi,
 					  u32 *config,
 					  int phy_table_size)
@@ -482,6 +541,55 @@
 	}
 
 	return 0;
+}
+
+static irqreturn_t rockchip_hdmi_hpd_irq_handler(int irq, void *arg)
+{
+	u32 val;
+	struct rockchip_hdmi *hdmi = arg;
+
+	val = gpiod_get_value(hdmi->hpd_gpiod);
+	if (val) {
+		val = HIWORD_UPDATE(RK3528_HDMI_SNKDET, RK3528_HDMI_SNKDET);
+		if (hdmi->hdmi && hdmi->hpd_wake_en && hdmi->hpd_gpiod)
+			dw_hdmi_set_hpd_wake(hdmi->hdmi);
+	} else {
+		val = HIWORD_UPDATE(0, RK3528_HDMI_SNKDET);
+	}
+	regmap_write(hdmi->regmap, RK3528_VO_GRF_HDMI_MASK, val);
+
+	return IRQ_HANDLED;
+}
+
+static void dw_hdmi_rk3528_gpio_hpd_init(struct rockchip_hdmi *hdmi)
+{
+	u32 val;
+
+	if (hdmi->hpd_gpiod) {
+		/* gpio0_a2's input enable is controlled by gpio output data bit */
+		val = HIWORD_UPDATE(RK3528_GPIO0_A2_DR, RK3528_GPIO0_A2_DR);
+		writel(val, hdmi->gpio_base + RK3528_GPIO_SWPORT_DR_L);
+
+		val = HIWORD_UPDATE(RK3528_HDMI_SNKDET_SEL | RK3528_HDMI_SDAIN_MSK |
+				    RK3528_HDMI_SCLIN_MSK,
+				    RK3528_HDMI_SNKDET_SEL | RK3528_HDMI_SDAIN_MSK |
+				    RK3528_HDMI_SCLIN_MSK);
+	} else {
+		val = HIWORD_UPDATE(RK3528_HDMI_SDAIN_MSK | RK3528_HDMI_SCLIN_MSK,
+				    RK3528_HDMI_SDAIN_MSK | RK3528_HDMI_SCLIN_MSK);
+	}
+
+	regmap_write(hdmi->regmap, RK3528_VO_GRF_HDMI_MASK, val);
+
+	val = gpiod_get_value(hdmi->hpd_gpiod);
+	if (val) {
+		val = HIWORD_UPDATE(RK3528_HDMI_SNKDET, RK3528_HDMI_SNKDET);
+		if (hdmi->hdmi && hdmi->hpd_wake_en && hdmi->hpd_gpiod)
+			dw_hdmi_set_hpd_wake(hdmi->hdmi);
+	} else {
+		val = HIWORD_UPDATE(0, RK3528_HDMI_SNKDET);
+	}
+	regmap_write(hdmi->regmap, RK3528_VO_GRF_HDMI_MASK, val);
 }
 
 static int rockchip_hdmi_parse_dt(struct rockchip_hdmi *hdmi)
@@ -539,6 +647,12 @@
 		return PTR_ERR(hdmi->hclk_vop);
 	}
 
+	hdmi->dclk_vop = devm_clk_get_optional(hdmi->dev, "dclk_vop");
+	if (IS_ERR(hdmi->dclk_vop)) {
+		dev_err(hdmi->dev, "failed to get dclk_vop\n");
+		return PTR_ERR(hdmi->dclk_vop);
+	}
+
 	ret = of_property_read_u32(np, "max-tmdsclk",
 				   &hdmi->max_tmdsclk);
 	if (ret != -EINVAL && ret < 0) {
@@ -576,6 +690,70 @@
 		kfree(phy_config);
 	} else {
 		dev_dbg(hdmi->dev, "use default hdmi phy table\n");
+	}
+
+	hdmi->hpd_gpiod = devm_gpiod_get_optional(hdmi->dev, "hpd", GPIOD_IN);
+
+	if (IS_ERR(hdmi->hpd_gpiod)) {
+		dev_err(hdmi->dev, "error getting HDP GPIO: %ld\n",
+			PTR_ERR(hdmi->hpd_gpiod));
+		return PTR_ERR(hdmi->hpd_gpiod);
+	}
+
+	if (hdmi->hpd_gpiod) {
+		struct resource *res;
+		struct platform_device *pdev = to_platform_device(hdmi->dev);
+
+		/* gpio interrupt reflects hpd status */
+		hdmi->hpd_irq = gpiod_to_irq(hdmi->hpd_gpiod);
+		if (hdmi->hpd_irq < 0)
+			return -EINVAL;
+
+		res = platform_get_resource(pdev, IORESOURCE_MEM, 1);
+		if (!res) {
+			DRM_DEV_ERROR(hdmi->dev, "failed to get gpio regs\n");
+			return -EINVAL;
+		}
+
+		hdmi->gpio_base = devm_ioremap(hdmi->dev, res->start, resource_size(res));
+		if (IS_ERR(hdmi->gpio_base)) {
+			DRM_DEV_ERROR(hdmi->dev, "Unable to get gpio ioregmap\n");
+			return PTR_ERR(hdmi->gpio_base);
+		}
+
+		dw_hdmi_rk3528_gpio_hpd_init(hdmi);
+		ret = devm_request_threaded_irq(hdmi->dev, hdmi->hpd_irq, NULL,
+						rockchip_hdmi_hpd_irq_handler,
+						IRQF_TRIGGER_RISING |
+						IRQF_TRIGGER_FALLING |
+						IRQF_ONESHOT,
+						"hdmi-hpd", hdmi);
+		if (ret) {
+			dev_err(hdmi->dev, "failed to request hpd IRQ: %d\n", ret);
+			return ret;
+		}
+
+		hdmi->hpd_wake_en = device_property_read_bool(hdmi->dev, "hpd-wake-up");
+		if (hdmi->hpd_wake_en)
+			enable_irq_wake(hdmi->hpd_irq);
+	}
+
+	hdmi->p = devm_pinctrl_get(hdmi->dev);
+	if (IS_ERR(hdmi->p)) {
+		dev_err(hdmi->dev, "could not get pinctrl\n");
+		return PTR_ERR(hdmi->p);
+	}
+
+	hdmi->idle_state = pinctrl_lookup_state(hdmi->p, "idle");
+	if (IS_ERR(hdmi->idle_state)) {
+		dev_dbg(hdmi->dev, "idle state is not defined\n");
+		return 0;
+	}
+
+	hdmi->default_state = pinctrl_lookup_state(hdmi->p, "default");
+	if (IS_ERR(hdmi->default_state)) {
+		dev_err(hdmi->dev, "could not find default state\n");
+		return PTR_ERR(hdmi->default_state);
 	}
 
 	return 0;
@@ -670,6 +848,9 @@
 	struct drm_crtc *crtc = encoder->crtc;
 	struct rockchip_crtc_state *s = to_rockchip_crtc_state(crtc->state);
 
+	if (WARN_ON(!crtc || !crtc->state))
+		return;
+
 	if (!hdmi->mode_changed)
 		s->output_if &= ~VOP_OUTPUT_IF_HDMI0;
 	/*
@@ -754,6 +935,7 @@
 	unsigned int color_depth;
 	bool support_dc = false;
 	bool sink_is_hdmi = dw_hdmi_get_output_whether_hdmi(hdmi->hdmi);
+	bool yuv422_out = false;
 	int max_tmds_clock = info->max_tmds_clock;
 	int output_eotf;
 
@@ -829,22 +1011,27 @@
 			*eotf = output_eotf;
 	}
 
-	if ((*eotf > TRADITIONAL_GAMMA_HDR &&
-	     conn_state->connector->hdr_sink_metadata.hdmi_type1.eotf &
-	     BIT(*eotf)) || (hdmi->colorimetry ==
-	     RK_HDMI_COLORIMETRY_BT2020 && info->hdmi.colorimetry &
-	     (BIT(6) | BIT(7))))
+	/* bt2020 sdr/hdr output */
+	if (hdmi->colorimetry == RK_HDMI_COLORIMETRY_BT2020 &&
+	    info->hdmi.colorimetry & (BIT(6) | BIT(7))) {
 		*enc_out_encoding = V4L2_YCBCR_ENC_BT2020;
-	else if ((vic == 6) || (vic == 7) || (vic == 21) || (vic == 22) ||
-		 (vic == 2) || (vic == 3) || (vic == 17) || (vic == 18))
-		*enc_out_encoding = V4L2_YCBCR_ENC_601;
-	else
+		yuv422_out = true;
+	/* bt709 hdr output */
+	} else if (hdmi->colorimetry != RK_HDMI_COLORIMETRY_BT2020 &&
+		   (conn_state->connector->hdr_sink_metadata.hdmi_type1.eotf & BIT(*eotf) &&
+		    *eotf > TRADITIONAL_GAMMA_HDR)) {
 		*enc_out_encoding = V4L2_YCBCR_ENC_709;
+		yuv422_out = true;
+	} else if ((vic == 6) || (vic == 7) || (vic == 21) || (vic == 22) ||
+		   (vic == 2) || (vic == 3) || (vic == 17) || (vic == 18)) {
+		*enc_out_encoding = V4L2_YCBCR_ENC_601;
+	} else {
+		*enc_out_encoding = V4L2_YCBCR_ENC_709;
+	}
 
-	if (*enc_out_encoding == V4L2_YCBCR_ENC_BT2020) {
-		/* BT2020 require color depth at lest 10bit */
-		color_depth = 10;
-		/* We prefer use YCbCr422 to send 10bit */
+	if ((yuv422_out || hdmi->hdmi_output == DRM_HDMI_OUTPUT_YCBCR_HQ) &&
+	    color_depth == 10 && hdmi_bus_fmt_color_depth(hdmi->prev_bus_format) == 8) {
+		/* We prefer use YCbCr422 to send hdr 10bit */
 		if (info->color_formats & DRM_COLOR_FORMAT_YCRCB422)
 			*color_format = DRM_HDMI_OUTPUT_YCBCR422;
 	}
@@ -1063,6 +1250,14 @@
 	return hdmi->hdr_panel_blob_ptr;
 }
 
+static void dw_hdmi_rockchip_update_color_format(struct drm_connector_state *conn_state,
+						 void *data)
+{
+	struct rockchip_hdmi *hdmi = (struct rockchip_hdmi *)data;
+
+	dw_hdmi_rockchip_check_color(conn_state, hdmi);
+}
+
 static bool
 dw_hdmi_rockchip_get_color_changed(void *data)
 {
@@ -1072,6 +1267,63 @@
 	if (hdmi->color_changed)
 		ret = true;
 	hdmi->color_changed = 0;
+
+	return ret;
+}
+
+static bool
+dw_hdmi_rockchip_check_hdr_color_change(struct drm_connector_state *conn_state,
+					void *data)
+{
+	struct rockchip_hdmi *hdmi = (struct rockchip_hdmi *)data;
+
+	if (!conn_state || !data)
+		return false;
+
+	if (dw_hdmi_rockchip_check_color(conn_state, hdmi))
+		return true;
+
+	return false;
+}
+
+static void dw_hdmi_rockchip_set_prev_bus_format(void *data, unsigned long bus_format)
+{
+	struct rockchip_hdmi *hdmi = (struct rockchip_hdmi *)data;
+
+	hdmi->prev_bus_format = bus_format;
+}
+
+static void dw_hdmi_rockchip_set_ddc_io(void *data, bool enable)
+{
+	struct rockchip_hdmi *hdmi = (struct rockchip_hdmi *)data;
+
+	if (!hdmi->p || !hdmi->idle_state || !hdmi->default_state)
+		return;
+
+	if (!enable) {
+		if (pinctrl_select_state(hdmi->p, hdmi->idle_state))
+			dev_err(hdmi->dev, "could not select idle state\n");
+	} else {
+		if (pinctrl_select_state(hdmi->p, hdmi->default_state))
+			dev_err(hdmi->dev, "could not select default state\n");
+	}
+}
+
+static int dw_hdmi_rockchip_dclk_set(void *data, bool enable, int vp_id)
+{
+	struct rockchip_hdmi *hdmi = (struct rockchip_hdmi *)data;
+	int ret = 0;
+
+	if (!hdmi->dclk_vop)
+		return 0;
+
+	if (enable) {
+		ret = clk_prepare_enable(hdmi->dclk_vop);
+		if (ret < 0)
+			dev_err(hdmi->dev, "failed to enable dclk_vop\n");
+	} else {
+		clk_disable_unprepare(hdmi->dclk_vop);
+	}
 
 	return ret;
 }
@@ -1158,6 +1410,7 @@
 	}
 
 	hdmi->bus_format = color;
+	hdmi->prev_bus_format = color;
 
 	if (hdmi->hdmi_output == DRM_HDMI_OUTPUT_YCBCR422) {
 		if (hdmi->colordepth == 12)
@@ -1581,6 +1834,20 @@
 	.setup_hpd	= dw_hdmi_rk3328_setup_hpd,
 };
 
+static enum drm_connector_status
+dw_hdmi_rk3528_read_hpd(struct dw_hdmi *dw_hdmi, void *data)
+{
+	return dw_hdmi_phy_read_hpd(dw_hdmi, data);
+}
+
+static const struct dw_hdmi_phy_ops rk3528_hdmi_phy_ops = {
+	.init		= dw_hdmi_rockchip_genphy_init,
+	.disable	= dw_hdmi_rockchip_genphy_disable,
+	.read_hpd	= dw_hdmi_rk3528_read_hpd,
+	.update_hpd	= dw_hdmi_phy_update_hpd,
+	.setup_hpd	= dw_hdmi_phy_setup_hpd,
+};
+
 static struct rockchip_hdmi_chip_data rk3328_chip_data = {
 	.lcdsel_grf_reg = -1,
 };
@@ -1627,6 +1894,22 @@
 	.ycbcr_420_allowed = true,
 };
 
+static struct rockchip_hdmi_chip_data rk3528_chip_data = {
+	.lcdsel_grf_reg = -1,
+};
+
+static const struct dw_hdmi_plat_data rk3528_hdmi_drv_data = {
+	.mode_valid = dw_hdmi_rockchip_mode_valid,
+	.mpll_cfg = rockchip_mpll_cfg,
+	.cur_ctr = rockchip_cur_ctr,
+	.phy_config = rockchip_phy_config,
+	.phy_data = &rk3528_chip_data,
+	.phy_ops = &rk3528_hdmi_phy_ops,
+	.phy_name = "inno_dw_hdmi_phy2",
+	.phy_force_vendor = true,
+	.ycbcr_420_allowed = true,
+};
+
 static struct rockchip_hdmi_chip_data rk3568_chip_data = {
 	.lcdsel_grf_reg = -1,
 	.ddc_en_reg = RK3568_GRF_VO_CON1,
@@ -1658,6 +1941,9 @@
 	},
 	{ .compatible = "rockchip,rk3399-dw-hdmi",
 	  .data = &rk3399_hdmi_drv_data
+	},
+	{ .compatible = "rockchip,rk3528-dw-hdmi",
+	  .data = &rk3528_hdmi_drv_data
 	},
 	{ .compatible = "rockchip,rk3568-dw-hdmi",
 	  .data = &rk3568_hdmi_drv_data
@@ -1713,6 +1999,16 @@
 		dw_hdmi_rockchip_get_hdr_blob;
 	plat_data->get_color_changed =
 		dw_hdmi_rockchip_get_color_changed;
+	plat_data->update_color_format =
+		dw_hdmi_rockchip_update_color_format;
+	plat_data->check_hdr_color_change =
+		dw_hdmi_rockchip_check_hdr_color_change;
+	plat_data->set_prev_bus_format =
+		dw_hdmi_rockchip_set_prev_bus_format;
+	plat_data->set_ddc_io =
+		dw_hdmi_rockchip_set_ddc_io;
+	plat_data->dclk_set =
+		dw_hdmi_rockchip_dclk_set;
 	plat_data->property_ops = &dw_hdmi_rockchip_property_ops;
 
 	encoder = &hdmi->encoder;
@@ -1780,7 +2076,6 @@
 	platform_set_drvdata(pdev, hdmi);
 
 	hdmi->hdmi = dw_hdmi_bind(pdev, encoder, plat_data);
-
 	/*
 	 * If dw_hdmi_bind() fails we'll never call dw_hdmi_unbind(),
 	 * which would have called the encoder cleanup.  Do it manually.
@@ -1833,6 +2128,11 @@
 	if (!hdmi)
 		return;
 
+	if (hdmi->hpd_gpiod) {
+		disable_irq(hdmi->hpd_irq);
+		if (hdmi->hpd_wake_en)
+			disable_irq_wake(hdmi->hpd_irq);
+	}
 	dw_hdmi_suspend(&pdev->dev, hdmi->hdmi);
 	pm_runtime_put_sync(&pdev->dev);
 }
@@ -1849,6 +2149,8 @@
 {
 	struct rockchip_hdmi *hdmi = dev_get_drvdata(dev);
 
+	if (hdmi->hpd_gpiod)
+		disable_irq(hdmi->hpd_irq);
 	dw_hdmi_suspend(dev, hdmi->hdmi);
 	pm_runtime_put_sync(dev);
 
@@ -1859,6 +2161,10 @@
 {
 	struct rockchip_hdmi *hdmi = dev_get_drvdata(dev);
 
+	if (hdmi->hpd_gpiod) {
+		dw_hdmi_rk3528_gpio_hpd_init(hdmi);
+		enable_irq(hdmi->hpd_irq);
+	}
 	pm_runtime_get_sync(dev);
 	dw_hdmi_resume(dev, hdmi->hdmi);
 
diff --git a/kernel/drivers/gpu/drm/rockchip/ebc-dev/Makefile b/kernel/drivers/gpu/drm/rockchip/ebc-dev/Makefile
index 848ac22..b648e33 100644
--- a/kernel/drivers/gpu/drm/rockchip/ebc-dev/Makefile
+++ b/kernel/drivers/gpu/drm/rockchip/ebc-dev/Makefile
@@ -7,3 +7,4 @@
 obj-$(CONFIG_ROCKCHIP_EBC_DEV)   += tcon/
 
 rkebc-$(CONFIG_ARM64) += ebc_dev_v8.o
+#rkebc-$(CONFIG_ARM64) += ebc_dev_y8_v8.o
diff --git a/kernel/drivers/gpu/drm/rockchip/ebc-dev/bufmanage/buf_manage.c b/kernel/drivers/gpu/drm/rockchip/ebc-dev/bufmanage/buf_manage.c
index 6d83f49..262f4d5 100644
--- a/kernel/drivers/gpu/drm/rockchip/ebc-dev/bufmanage/buf_manage.c
+++ b/kernel/drivers/gpu/drm/rockchip/ebc-dev/bufmanage/buf_manage.c
@@ -76,6 +76,29 @@
 	}
 }
 
+int ebc_drop_one_dsp_buf(void)
+{
+	struct ebc_buf_s *temp_buf;
+	int temp_pos;
+
+	mutex_lock(&ebc_buf_info.dsp_buf_lock);
+	if (ebc_buf_info.dsp_buf_list) {
+		if (ebc_buf_info.dsp_buf_list->nb_elt > 0) {
+			temp_pos = ebc_buf_info.dsp_buf_list->nb_elt - 1;
+			temp_buf = (struct ebc_buf_s *)buf_list_get(ebc_buf_info.dsp_buf_list, temp_pos);
+			if (temp_buf->needpic == 2) {
+				buf_list_remove(ebc_buf_info.dsp_buf_list, temp_pos);
+				ebc_buf_release(temp_buf);
+				mutex_unlock(&ebc_buf_info.dsp_buf_lock);
+				return BUF_SUCCESS;
+			}
+		}
+	}
+	mutex_unlock(&ebc_buf_info.dsp_buf_lock);
+
+	return BUF_ERROR;
+}
+
 int ebc_add_to_dsp_buf_list(struct ebc_buf_s *dsp_buf)
 {
 	mutex_lock(&ebc_buf_info.dsp_buf_lock);
diff --git a/kernel/drivers/gpu/drm/rockchip/ebc-dev/bufmanage/buf_manage.h b/kernel/drivers/gpu/drm/rockchip/ebc-dev/bufmanage/buf_manage.h
index 9885660..c13af6c 100644
--- a/kernel/drivers/gpu/drm/rockchip/ebc-dev/bufmanage/buf_manage.h
+++ b/kernel/drivers/gpu/drm/rockchip/ebc-dev/bufmanage/buf_manage.h
@@ -33,6 +33,7 @@
 	int needpic;
 };
 
+int ebc_drop_one_dsp_buf(void);
 struct ebc_buf_s *ebc_empty_osd_buf_get(void);
 struct ebc_buf_s *ebc_osd_buf_clone(void);
 int ebc_buf_release(struct ebc_buf_s *release_buf);
diff --git a/kernel/drivers/gpu/drm/rockchip/ebc-dev/ebc_dev.h b/kernel/drivers/gpu/drm/rockchip/ebc-dev/ebc_dev.h
index 5e6554f..6e12427 100644
--- a/kernel/drivers/gpu/drm/rockchip/ebc-dev/ebc_dev.h
+++ b/kernel/drivers/gpu/drm/rockchip/ebc-dev/ebc_dev.h
@@ -11,13 +11,13 @@
 #include <linux/notifier.h>
 
 /*
-* max support panel size 2232x1680
+* max support panel size 2560x1920
 * ebc module display buf use 4bit per pixel
 * eink module display buf use 8bit per pixel
 * ebc module direct mode display buf use 2bit per pixel
 */
 #define EBC_FB_SIZE		0x200000 /* 2M */
-#define EINK_FB_SIZE		0x400000 /* 4M */
+#define EINK_FB_SIZE		0x500000 /* 5M */
 #define DIRECT_FB_SIZE		0x200000 /* 2M */
 #define LUT_TABLE_SIZE		0x100000 /* 1M */
 #define FRAME_COUNT_SIZE 0x500000 /* 5M */
@@ -31,6 +31,12 @@
 #define WF_5BIT		32
 
 /*
+* ebc buf format
+*/
+#define EBC_Y4 (0)
+#define EBC_Y8 (1)
+
+/*
  * ebc status notify
  */
 #define EBC_OFF			(0)
@@ -41,22 +47,24 @@
 /*
  * ebc system ioctl command
  */
-#define EBC_GET_BUFFER		(0x7000)
-#define EBC_SEND_BUFFER		(0x7001)
-#define EBC_GET_BUFFER_INFO	(0x7002)
+#define EBC_GET_BUFFER				(0x7000)
+#define EBC_SEND_BUFFER			(0x7001)
+#define EBC_GET_BUFFER_INFO		(0x7002)
 #define EBC_SET_FULL_MODE_NUM	(0x7003)
-#define EBC_ENABLE_OVERLAY	(0x7004)
-#define EBC_DISABLE_OVERLAY	(0x7005)
-#define EBC_GET_OSD_BUFFER	(0x7006)
-#define EBC_SEND_OSD_BUFFER	(0x7007)
-#define EBC_NEW_BUF_PREPARE	(0x7008)
-#define EBC_SET_DIFF_PERCENT	(0x7009)
-#define EBC_WAIT_NEW_BUF_TIME (0x700a)
+#define EBC_ENABLE_OVERLAY		(0x7004)
+#define EBC_DISABLE_OVERLAY		(0x7005)
+#define EBC_GET_OSD_BUFFER		(0x7006)
+#define EBC_SEND_OSD_BUFFER		(0x7007)
+#define EBC_NEW_BUF_PREPARE		(0x7008)
+#define EBC_SET_DIFF_PERCENT		(0x7009)
+#define EBC_WAIT_NEW_BUF_TIME	(0x700a)
 #define EBC_GET_OVERLAY_STATUS	(0x700b)
-#define EBC_ENABLE_BG_CONTROL (0x700c)
-#define EBC_DISABLE_BG_CONTROL (0x700d)
-#define EBC_ENABLE_RESUME_COUNT (0x700e)
-#define EBC_DISABLE_RESUME_COUNT (0x700f)
+#define EBC_ENABLE_BG_CONTROL	(0x700c)
+#define EBC_DISABLE_BG_CONTROL	(0x700d)
+#define EBC_ENABLE_RESUME_COUNT	(0x700e)
+#define EBC_DISABLE_RESUME_COUNT	(0x700f)
+#define EBC_GET_BUF_FORMAT		(0x7010)
+#define EBC_DROP_PREV_BUFFER		(0x7011)
 
 /*
  * IMPORTANT: Those values is corresponding to android hardware program,
@@ -105,7 +113,7 @@
 	int win_y2;
 	int width_mm;
 	int height_mm;
-	int needpic;
+	int needpic;	// 1: buf can not be drop by ebc, 0: buf can drop by ebc 2: regal buf, can not be drop by ebc
 	char tid_name[16];
 };
 
diff --git a/kernel/drivers/gpu/drm/rockchip/ebc-dev/ebc_dev_v8.S b/kernel/drivers/gpu/drm/rockchip/ebc-dev/ebc_dev_v8.S
index cad58de..cae08ae 100644
--- a/kernel/drivers/gpu/drm/rockchip/ebc-dev/ebc_dev_v8.S
+++ b/kernel/drivers/gpu/drm/rockchip/ebc-dev/ebc_dev_v8.S
@@ -23,31 +23,31 @@
 get_overlay_image_area:
 .LFB2822:
 	.file 1 "drivers/gpu/drm/rockchip/ebc-dev/ebc_dev.c"
-	.loc 1 760 0
+	.loc 1 759 0
 	.cfi_startproc
 .LVL0:
 	stp	x29, x30, [sp, -128]!
 	.cfi_def_cfa_offset 128
 	.cfi_offset 29, -128
 	.cfi_offset 30, -120
-	.loc 1 761 0
-	adrp	x6, .LANCHOR0
 	.loc 1 760 0
+	adrp	x6, .LANCHOR0
+	.loc 1 759 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
 	stp	x25, x26, [sp, 64]
 	.cfi_offset 25, -64
 	.cfi_offset 26, -56
-	.loc 1 761 0
+	.loc 1 760 0
 	ldr	x26, [x6, #:lo12:.LANCHOR0]
-	.loc 1 760 0
+	.loc 1 759 0
 	str	x0, [x29, 104]
-	.loc 1 784 0
-	ldr	x0, [x5, 248]
+	.loc 1 783 0
+	ldr	x0, [x5, 240]
 .LVL1:
-	.loc 1 776 0
+	.loc 1 775 0
 	add	x26, x26, 24
-	.loc 1 760 0
+	.loc 1 759 0
 	stp	x19, x20, [sp, 16]
 	stp	x21, x22, [sp, 32]
 	stp	x27, x28, [sp, 80]
@@ -60,71 +60,71 @@
 	.cfi_offset 28, -40
 	.cfi_offset 23, -80
 	.cfi_offset 24, -72
-	.loc 1 789 0
+	.loc 1 788 0
 	ldr	w19, [x5, 96]
-	.loc 1 786 0
+	.loc 1 785 0
 	ldp	w7, w23, [x0, 48]
-	.loc 1 789 0
+	.loc 1 788 0
 	add	w27, w19, 7
-	.loc 1 776 0
+	.loc 1 775 0
 	ldr	w6, [x26, 156]
 	str	w6, [x29, 124]
-	.loc 1 784 0
+	.loc 1 783 0
 	cmp	w7, 0
-	.loc 1 787 0
+	.loc 1 786 0
 	ldp	w6, w28, [x0, 56]
-	.loc 1 784 0
+	.loc 1 783 0
 	add	w25, w7, 7
 	csel	w25, w25, w7, lt
-	.loc 1 790 0
+	.loc 1 789 0
 	ldr	w0, [x5, 92]
-	.loc 1 785 0
+	.loc 1 784 0
 	cmp	w6, 0
 	add	w21, w6, 7
 	csel	w21, w21, w6, lt
-	.loc 1 789 0
+	.loc 1 788 0
 	cmp	w19, 0
 	csel	w27, w27, w19, lt
-	.loc 1 785 0
+	.loc 1 784 0
 	asr	w21, w21, 3
 	add	w21, w21, 1
 .LVL2:
-	.loc 1 789 0
+	.loc 1 788 0
 	asr	w27, w27, 3
 .LVL3:
-	.loc 1 792 0
+	.loc 1 791 0
 	cmp	w21, w27
 	sub	w6, w27, #1
 	csel	w21, w6, w21, ge
 .LVL4:
-	.loc 1 794 0
+	.loc 1 793 0
 	cmp	w28, w0
 	sub	w0, w0, #1
 .LVL5:
 	csel	w28, w0, w28, ge
 .LVL6:
-	.loc 1 796 0
+	.loc 1 795 0
 	cmp	w28, w23
 	blt	.L1
 	asr	w25, w25, 3
 .LVL7:
-	.loc 1 815 0
+	.loc 1 814 0
 	mov	w22, 1
 	lsl	w0, w25, 1
 	str	w0, [x29, 120]
 	lsl	w0, w25, 3
 	str	w0, [x29, 116]
-	.loc 1 797 0
+	.loc 1 796 0
 	ldr	w0, [x29, 124]
 	mul	w20, w23, w27
-	.loc 1 896 0
+	.loc 1 895 0
 	mov	w30, w22
-	.loc 1 797 0
+	.loc 1 796 0
 	cbz	w0, .L6
 .LVL8:
 	.p2align 2
 .L50:
-	.loc 1 798 0
+	.loc 1 797 0
 	ldp	w0, w15, [x26, 84]
 .LVL9:
 	sub	w15, w15, #1
@@ -136,252 +136,252 @@
 	add	x15, x0, x15
 .LVL11:
 .L7:
-	.loc 1 803 0
+	.loc 1 802 0
 	mul	w19, w23, w19
-	.loc 1 806 0
+	.loc 1 805 0
 	mov	w10, w25
 	cmp	w21, w25
 	ldp	w14, w11, [x29, 116]
-	.loc 1 803 0
+	.loc 1 802 0
 	sxtw	x19, w19
-	.loc 1 806 0
+	.loc 1 805 0
 	blt	.L20
 .LVL12:
 	.p2align 2
 .L37:
-	.loc 1 810 0
+	.loc 1 809 0
 	sbfiz	x0, x10, 2, 32
 .LVL13:
 	add	x0, x0, x20, sxtw 2
 	ldr	w8, [x1, x0]
 .LVL14:
-	.loc 1 811 0
+	.loc 1 810 0
 	ldr	w7, [x2, x0]
 .LVL15:
-	.loc 1 814 0
+	.loc 1 813 0
 	cmp	w8, w7
 	beq	.L10
 	add	x9, x19, x14, sxtw
-	.loc 1 809 0
+	.loc 1 808 0
 	ldrb	w13, [x15, w11, sxtw]
-	.loc 1 815 0
+	.loc 1 814 0
 	str	w22, [x5, 60]
-	.loc 1 816 0
+	.loc 1 815 0
 	eor	w6, w8, w7
 .LVL16:
-	.loc 1 807 0
+	.loc 1 806 0
 	add	x12, x15, x11, sxtw
-	.loc 1 812 0
+	.loc 1 811 0
 	add	x0, x3, x9
 .LVL17:
-	.loc 1 818 0
+	.loc 1 817 0
 	ldrb	w16, [x3, x9]
 .LVL18:
 	tst	x6, 15
 	ccmp	w16, 0, 0, ne
-	.loc 1 813 0
+	.loc 1 812 0
 	add	x16, x4, x9
 .LVL19:
-	.loc 1 818 0
+	.loc 1 817 0
 	bne	.L11
-	.loc 1 820 0
+	.loc 1 819 0
 	ldrb	w17, [x4, x9]
-	.loc 1 821 0
-	and	w24, w8, 15
 	.loc 1 820 0
+	and	w24, w8, 15
+	.loc 1 819 0
 	add	x17, x17, 16
-	.loc 1 821 0
+	.loc 1 820 0
 	ldr	x18, [x5, x17, lsl 3]
 	ubfiz	w17, w7, 5, 4
 	orr	w17, w17, w24
-	.loc 1 822 0
+	.loc 1 821 0
 	ldrb	w17, [x18, w17, uxtw]
-	.loc 1 823 0
-	strb	w22, [x3, x9]
 	.loc 1 822 0
+	strb	w22, [x3, x9]
+	.loc 1 821 0
 	orr	w13, w13, w17
 	and	w13, w13, 255
 .L11:
-	.loc 1 828 0
+	.loc 1 827 0
 	ldrb	w9, [x0, 1]
 	tst	w6, 240
 	ccmp	w9, 0, 0, ne
 	bne	.L12
-	.loc 1 830 0
+	.loc 1 829 0
 	ldrb	w9, [x16, 1]
-	.loc 1 831 0
-	ubfx	x18, x8, 4, 4
 	.loc 1 830 0
+	ubfx	x18, x8, 4, 4
+	.loc 1 829 0
 	add	x9, x9, 16
-	.loc 1 831 0
+	.loc 1 830 0
 	ldr	x17, [x5, x9, lsl 3]
 	lsr	w9, w7, 4
 	ubfiz	w9, w9, 5, 4
 	orr	w9, w9, w18
-	.loc 1 832 0
+	.loc 1 831 0
 	ldrb	w9, [x17, w9, uxtw]
-	.loc 1 833 0
-	strb	w30, [x0, 1]
 	.loc 1 832 0
+	strb	w30, [x0, 1]
+	.loc 1 831 0
 	orr	w13, w13, w9, lsl 2
 	and	w13, w13, 255
 .L12:
-	.loc 1 838 0
+	.loc 1 837 0
 	ldrb	w9, [x0, 2]
 	tst	w6, 3840
 	ccmp	w9, 0, 0, ne
 	bne	.L13
-	.loc 1 840 0
+	.loc 1 839 0
 	ldrb	w9, [x16, 2]
-	.loc 1 841 0
-	ubfx	x18, x8, 8, 4
 	.loc 1 840 0
+	ubfx	x18, x8, 8, 4
+	.loc 1 839 0
 	add	x9, x9, 16
-	.loc 1 841 0
+	.loc 1 840 0
 	ldr	x17, [x5, x9, lsl 3]
 	lsr	w9, w7, 8
 	ubfiz	w9, w9, 5, 4
 	orr	w9, w9, w18
-	.loc 1 842 0
+	.loc 1 841 0
 	ldrb	w9, [x17, w9, uxtw]
-	.loc 1 843 0
-	strb	w30, [x0, 2]
 	.loc 1 842 0
+	strb	w30, [x0, 2]
+	.loc 1 841 0
 	orr	w13, w13, w9, lsl 4
 	and	w13, w13, 255
 .L13:
-	.loc 1 848 0
+	.loc 1 847 0
 	ldrb	w9, [x0, 3]
 	tst	w6, 61440
 	ccmp	w9, 0, 0, ne
 	bne	.L14
-	.loc 1 850 0
+	.loc 1 849 0
 	ldrb	w9, [x16, 3]
-	.loc 1 851 0
-	ubfx	x18, x8, 12, 4
 	.loc 1 850 0
+	ubfx	x18, x8, 12, 4
+	.loc 1 849 0
 	add	x9, x9, 16
-	.loc 1 851 0
+	.loc 1 850 0
 	ldr	x17, [x5, x9, lsl 3]
 	lsr	w9, w7, 12
 	ubfiz	w9, w9, 5, 4
 	orr	w9, w9, w18
-	.loc 1 852 0
+	.loc 1 851 0
 	ldrb	w9, [x17, w9, uxtw]
-	.loc 1 853 0
-	strb	w30, [x0, 3]
 	.loc 1 852 0
+	strb	w30, [x0, 3]
+	.loc 1 851 0
 	orr	w13, w13, w9, lsl 6
 	and	w13, w13, 255
 .L14:
-	.loc 1 855 0
+	.loc 1 854 0
 	strb	w13, [x12]
-	.loc 1 861 0
+	.loc 1 860 0
 	tst	w6, 983040
-	.loc 1 857 0
+	.loc 1 856 0
 	ldrb	w9, [x12, 1]
-	.loc 1 861 0
+	.loc 1 860 0
 	ldrb	w13, [x0, 4]
 	ccmp	w13, 0, 0, ne
 	bne	.L15
-	.loc 1 863 0
+	.loc 1 862 0
 	ldrb	w13, [x16, 4]
-	.loc 1 864 0
-	ubfx	x18, x8, 16, 4
 	.loc 1 863 0
+	ubfx	x18, x8, 16, 4
+	.loc 1 862 0
 	add	x13, x13, 16
-	.loc 1 864 0
+	.loc 1 863 0
 	ldr	x17, [x5, x13, lsl 3]
 	lsr	w13, w7, 16
 	ubfiz	w13, w13, 5, 4
 	orr	w13, w13, w18
-	.loc 1 865 0
+	.loc 1 864 0
 	ldrb	w13, [x17, w13, uxtw]
-	.loc 1 866 0
-	strb	w30, [x0, 4]
 	.loc 1 865 0
+	strb	w30, [x0, 4]
+	.loc 1 864 0
 	orr	w9, w9, w13
 	and	w9, w9, 255
 .L15:
-	.loc 1 871 0
+	.loc 1 870 0
 	ldrb	w13, [x0, 5]
 	tst	w6, 15728640
 	ccmp	w13, 0, 0, ne
 	bne	.L16
-	.loc 1 873 0
+	.loc 1 872 0
 	ldrb	w13, [x16, 5]
-	.loc 1 874 0
-	ubfx	x18, x8, 20, 4
 	.loc 1 873 0
+	ubfx	x18, x8, 20, 4
+	.loc 1 872 0
 	add	x13, x13, 16
-	.loc 1 874 0
+	.loc 1 873 0
 	ldr	x17, [x5, x13, lsl 3]
 	lsr	w13, w7, 20
 	ubfiz	w13, w13, 5, 4
 	orr	w13, w13, w18
-	.loc 1 875 0
+	.loc 1 874 0
 	ldrb	w13, [x17, w13, uxtw]
-	.loc 1 876 0
-	strb	w30, [x0, 5]
 	.loc 1 875 0
+	strb	w30, [x0, 5]
+	.loc 1 874 0
 	orr	w9, w9, w13, lsl 2
 	and	w9, w9, 255
 .L16:
-	.loc 1 881 0
+	.loc 1 880 0
 	ldrb	w13, [x0, 6]
 	tst	w6, 251658240
 	ccmp	w13, 0, 0, ne
 	bne	.L17
-	.loc 1 883 0
+	.loc 1 882 0
 	ldrb	w13, [x16, 6]
-	.loc 1 884 0
-	ubfx	x18, x8, 24, 4
 	.loc 1 883 0
+	ubfx	x18, x8, 24, 4
+	.loc 1 882 0
 	add	x13, x13, 16
-	.loc 1 884 0
+	.loc 1 883 0
 	ldr	x17, [x5, x13, lsl 3]
 	lsr	w13, w7, 24
 	ubfiz	w13, w13, 5, 4
 	orr	w13, w13, w18
-	.loc 1 885 0
+	.loc 1 884 0
 	ldrb	w13, [x17, w13, uxtw]
-	.loc 1 886 0
-	strb	w30, [x0, 6]
 	.loc 1 885 0
+	strb	w30, [x0, 6]
+	.loc 1 884 0
 	orr	w9, w9, w13, lsl 4
 	and	w9, w9, 255
 .L17:
-	.loc 1 891 0
+	.loc 1 890 0
 	tst	w6, -268435456
 	ldrb	w6, [x0, 7]
 .LVL20:
 	ccmp	w6, 0, 0, ne
 	bne	.L18
-	.loc 1 893 0
+	.loc 1 892 0
 	ldrb	w6, [x16, 7]
-	.loc 1 894 0
+	.loc 1 893 0
 	lsr	w7, w7, 28
 .LVL21:
 	lsr	w8, w8, 28
 .LVL22:
-	.loc 1 893 0
+	.loc 1 892 0
 	add	x6, x6, 16
-	.loc 1 894 0
+	.loc 1 893 0
 	add	w7, w8, w7, lsl 5
 	ldr	x6, [x5, x6, lsl 3]
-	.loc 1 895 0
+	.loc 1 894 0
 	ldrb	w6, [x6, w7, uxtw]
-	.loc 1 896 0
-	strb	w30, [x0, 7]
 	.loc 1 895 0
+	strb	w30, [x0, 7]
+	.loc 1 894 0
 	orr	w9, w9, w6, lsl 6
 	and	w9, w9, 255
 .LVL23:
 .L18:
-	.loc 1 898 0
+	.loc 1 897 0
 	strb	w9, [x12, 1]
 .L10:
-	.loc 1 806 0 discriminator 2
+	.loc 1 805 0 discriminator 2
 	add	w10, w10, 1
 	add	w11, w11, 2
 	add	w14, w14, 8
@@ -389,18 +389,18 @@
 	bge	.L37
 .LVL24:
 .L20:
-	.loc 1 796 0
+	.loc 1 795 0
 	add	w23, w23, 1
 	add	w20, w20, w27
 	cmp	w28, w23
 	blt	.L1
-	.loc 1 797 0
+	.loc 1 796 0
 	ldr	w0, [x29, 124]
 .LVL25:
 	ldr	w19, [x5, 96]
 	cbnz	w0, .L50
 .L6:
-	.loc 1 800 0
+	.loc 1 799 0
 	ldr	w15, [x26, 84]
 .LVL26:
 	ldr	x0, [x29, 104]
@@ -412,7 +412,7 @@
 	b	.L7
 .LVL29:
 .L1:
-	.loc 1 902 0
+	.loc 1 901 0
 	ldp	x19, x20, [sp, 16]
 	ldp	x21, x22, [sp, 32]
 .LVL30:
@@ -445,74 +445,74 @@
 	.type	get_auto_image, %function
 get_auto_image:
 .LFB2825:
-	.loc 1 1050 0
+	.loc 1 1049 0
 	.cfi_startproc
 .LVL34:
 	stp	x29, x30, [sp, -64]!
 	.cfi_def_cfa_offset 64
 	.cfi_offset 29, -64
 	.cfi_offset 30, -56
-	.loc 1 1051 0
-	adrp	x6, .LANCHOR0
-	.loc 1 1070 0
-	cmp	w5, 2
 	.loc 1 1050 0
+	adrp	x6, .LANCHOR0
+	.loc 1 1069 0
+	cmp	w5, 2
+	.loc 1 1049 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 1051 0
-	ldr	x17, [x6, #:lo12:.LANCHOR0]
 	.loc 1 1050 0
+	ldr	x17, [x6, #:lo12:.LANCHOR0]
+	.loc 1 1049 0
 	stp	x19, x20, [sp, 16]
 	.cfi_offset 19, -48
 	.cfi_offset 20, -40
-	.loc 1 1065 0
+	.loc 1 1064 0
 	add	x20, x4, 60
 .LVL35:
-	.loc 1 1061 0
+	.loc 1 1060 0
 	add	x17, x17, 24
-	.loc 1 1050 0
+	.loc 1 1049 0
 	stp	x21, x22, [sp, 32]
 	stp	x23, x24, [sp, 48]
 	.cfi_offset 21, -32
 	.cfi_offset 22, -24
 	.cfi_offset 23, -16
 	.cfi_offset 24, -8
-	.loc 1 1058 0
+	.loc 1 1057 0
 	ldrb	w13, [x4, 56]
 .LVL36:
-	.loc 1 1068 0
-	ldp	w6, w24, [x17, 84]
-	.loc 1 1061 0
-	ldr	w30, [x17, 156]
 	.loc 1 1067 0
+	ldp	w6, w24, [x17, 84]
+	.loc 1 1060 0
+	ldr	w30, [x17, 156]
+	.loc 1 1066 0
 	lsr	w14, w6, 3
-	.loc 1 1070 0
+	.loc 1 1069 0
 	beq	.L106
-	.loc 1 1073 0
+	.loc 1 1072 0
 	cmp	w5, 3
-	.loc 1 1080 0
+	.loc 1 1079 0
 	mov	w18, 0
 .LVL37:
-	.loc 1 1073 0
+	.loc 1 1072 0
 	beq	.L107
 .LVL38:
 .L55:
-	.loc 1 1083 0 discriminator 1
+	.loc 1 1082 0 discriminator 1
 	cmp	w18, w24
 	bge	.L79
 	sub	w16, w14, #1
-	.loc 1 1083 0 is_stmt 0
+	.loc 1 1082 0 is_stmt 0
 	mov	w8, 0
 .LVL39:
 	add	x16, x16, 1
 	lsl	x19, x16, 3
 	lsl	x16, x16, 2
-	.loc 1 1084 0 is_stmt 1
+	.loc 1 1083 0 is_stmt 1
 	cbz	w30, .L56
 .LVL40:
 	.p2align 2
 .L116:
-	.loc 1 1085 0
+	.loc 1 1084 0
 	ldr	w10, [x17, 88]
 	sub	w10, w10, #1
 	sub	w10, w10, w18
@@ -524,293 +524,293 @@
 	add	x6, x3, 8
 	add	x10, x10, 2
 .LVL42:
-	.loc 1 1089 0 discriminator 1
+	.loc 1 1088 0 discriminator 1
 	mov	x9, 0
 	cbz	w14, .L58
 	.p2align 2
 .L95:
-	.loc 1 1092 0
+	.loc 1 1091 0
 	ldr	w7, [x1, x9, lsl 2]
 .LVL43:
-	.loc 1 1093 0
+	.loc 1 1092 0
 	ldr	w5, [x2, x9, lsl 2]
 .LVL44:
-	.loc 1 1094 0
+	.loc 1 1093 0
 	cmp	w7, w5
 	beq	.L60
-	.loc 1 1096 0
+	.loc 1 1095 0
 	eor	w8, w7, w5
 .LVL45:
-	.loc 1 1091 0
+	.loc 1 1090 0
 	mov	w11, 0
-	.loc 1 1097 0
+	.loc 1 1096 0
 	tst	x8, 15
 	beq	.L61
-	.loc 1 1098 0
+	.loc 1 1097 0
 	ldrb	w21, [x6, -8]
-	.loc 1 1100 0
+	.loc 1 1099 0
 	and	w22, w7, 15
 	ubfiz	w11, w5, 5, 4
 	ldr	x15, [x4, 128]
 	orr	w11, w11, w22
-	.loc 1 1102 0
+	.loc 1 1101 0
 	add	w12, w21, 1
-	.loc 1 1100 0
-	add	x11, x15, x11
 	.loc 1 1099 0
+	add	x11, x15, x11
+	.loc 1 1098 0
 	lsl	w21, w21, 10
-	.loc 1 1102 0
+	.loc 1 1101 0
 	and	w12, w12, 255
-	.loc 1 1103 0
+	.loc 1 1102 0
 	cmp	w13, w12
-	.loc 1 1100 0
+	.loc 1 1099 0
 	ldrb	w11, [x11, w21, sxtw]
-	.loc 1 1103 0
+	.loc 1 1102 0
 	beq	.L108
 .L62:
-	.loc 1 1107 0
+	.loc 1 1106 0
 	strb	w12, [x6, -8]
 .L61:
-	.loc 1 1110 0
+	.loc 1 1109 0
 	tst	w8, 240
 	beq	.L63
-	.loc 1 1113 0
+	.loc 1 1112 0
 	lsr	w12, w5, 4
-	.loc 1 1111 0
+	.loc 1 1110 0
 	ldrb	w21, [x6, -7]
-	.loc 1 1113 0
+	.loc 1 1112 0
 	ubfx	x22, x7, 4, 4
 	ubfiz	w12, w12, 5, 4
 	orr	w12, w12, w22
 	ldr	x22, [x4, 128]
-	.loc 1 1112 0
+	.loc 1 1111 0
 	lsl	w23, w21, 10
-	.loc 1 1115 0
-	add	w21, w21, 1
-	.loc 1 1113 0
-	add	x12, x22, x12
-	.loc 1 1115 0
-	and	w21, w21, 255
-	.loc 1 1116 0
-	cmp	w13, w21
 	.loc 1 1114 0
+	add	w21, w21, 1
+	.loc 1 1112 0
+	add	x12, x22, x12
+	.loc 1 1114 0
+	and	w21, w21, 255
+	.loc 1 1115 0
+	cmp	w13, w21
+	.loc 1 1113 0
 	ldrb	w12, [x12, w23, sxtw]
 	orr	w11, w11, w12, lsl 2
 	and	w11, w11, 255
-	.loc 1 1116 0
+	.loc 1 1115 0
 	beq	.L109
 .L64:
-	.loc 1 1120 0
+	.loc 1 1119 0
 	strb	w21, [x6, -7]
 .L63:
-	.loc 1 1123 0
+	.loc 1 1122 0
 	tst	w8, 3840
 	beq	.L65
-	.loc 1 1126 0
+	.loc 1 1125 0
 	lsr	w12, w5, 8
-	.loc 1 1124 0
+	.loc 1 1123 0
 	ldrb	w21, [x6, -6]
-	.loc 1 1126 0
+	.loc 1 1125 0
 	ubfx	x22, x7, 8, 4
 	ubfiz	w12, w12, 5, 4
 	orr	w12, w12, w22
 	ldr	x22, [x4, 128]
-	.loc 1 1125 0
+	.loc 1 1124 0
 	lsl	w23, w21, 10
-	.loc 1 1128 0
-	add	w21, w21, 1
-	.loc 1 1126 0
-	add	x12, x22, x12
-	.loc 1 1128 0
-	and	w21, w21, 255
-	.loc 1 1129 0
-	cmp	w13, w21
 	.loc 1 1127 0
+	add	w21, w21, 1
+	.loc 1 1125 0
+	add	x12, x22, x12
+	.loc 1 1127 0
+	and	w21, w21, 255
+	.loc 1 1128 0
+	cmp	w13, w21
+	.loc 1 1126 0
 	ldrb	w12, [x12, w23, sxtw]
 	orr	w11, w11, w12, lsl 4
 	and	w11, w11, 255
-	.loc 1 1129 0
+	.loc 1 1128 0
 	beq	.L110
 .L66:
-	.loc 1 1133 0
+	.loc 1 1132 0
 	strb	w21, [x6, -6]
 .L65:
-	.loc 1 1136 0
+	.loc 1 1135 0
 	tst	w8, 61440
 	beq	.L67
-	.loc 1 1139 0
+	.loc 1 1138 0
 	lsr	w12, w5, 12
-	.loc 1 1137 0
+	.loc 1 1136 0
 	ldrb	w21, [x6, -5]
-	.loc 1 1139 0
+	.loc 1 1138 0
 	ubfx	x22, x7, 12, 4
 	ubfiz	w12, w12, 5, 4
 	orr	w12, w12, w22
 	ldr	x22, [x4, 128]
-	.loc 1 1138 0
+	.loc 1 1137 0
 	lsl	w23, w21, 10
-	.loc 1 1141 0
-	add	w21, w21, 1
-	.loc 1 1139 0
-	add	x12, x22, x12
-	.loc 1 1141 0
-	and	w21, w21, 255
-	.loc 1 1142 0
-	cmp	w13, w21
 	.loc 1 1140 0
+	add	w21, w21, 1
+	.loc 1 1138 0
+	add	x12, x22, x12
+	.loc 1 1140 0
+	and	w21, w21, 255
+	.loc 1 1141 0
+	cmp	w13, w21
+	.loc 1 1139 0
 	ldrb	w12, [x12, w23, sxtw]
 	orr	w11, w11, w12, lsl 6
 	and	w11, w11, 255
-	.loc 1 1142 0
+	.loc 1 1141 0
 	beq	.L111
 .L68:
-	.loc 1 1146 0
+	.loc 1 1145 0
 	strb	w21, [x6, -5]
 .L67:
-	.loc 1 1149 0
+	.loc 1 1148 0
 	strb	w11, [x10, -2]
-	.loc 1 1152 0
-	tst	w8, 983040
 	.loc 1 1151 0
+	tst	w8, 983040
+	.loc 1 1150 0
 	mov	w11, 0
-	.loc 1 1152 0
+	.loc 1 1151 0
 	beq	.L69
-	.loc 1 1155 0
+	.loc 1 1154 0
 	lsr	w11, w5, 16
-	.loc 1 1153 0
+	.loc 1 1152 0
 	ldrb	w12, [x6, -4]
-	.loc 1 1155 0
+	.loc 1 1154 0
 	ubfx	x21, x7, 16, 4
 	ubfiz	w11, w11, 5, 4
 	orr	w11, w11, w21
 	ldr	x21, [x4, 128]
-	.loc 1 1154 0
+	.loc 1 1153 0
 	lsl	w22, w12, 10
-	.loc 1 1157 0
+	.loc 1 1156 0
 	add	w12, w12, 1
-	.loc 1 1155 0
+	.loc 1 1154 0
 	add	x11, x21, x11
-	.loc 1 1157 0
+	.loc 1 1156 0
 	and	w12, w12, 255
-	.loc 1 1158 0
+	.loc 1 1157 0
 	cmp	w13, w12
-	.loc 1 1155 0
+	.loc 1 1154 0
 	ldrb	w11, [x11, w22, sxtw]
-	.loc 1 1158 0
+	.loc 1 1157 0
 	beq	.L112
 .L70:
-	.loc 1 1162 0
+	.loc 1 1161 0
 	strb	w12, [x6, -4]
 .L69:
-	.loc 1 1165 0
+	.loc 1 1164 0
 	tst	w8, 15728640
 	beq	.L71
-	.loc 1 1168 0
+	.loc 1 1167 0
 	lsr	w12, w5, 20
-	.loc 1 1166 0
+	.loc 1 1165 0
 	ldrb	w21, [x6, -3]
-	.loc 1 1168 0
+	.loc 1 1167 0
 	ubfx	x22, x7, 20, 4
 	ubfiz	w12, w12, 5, 4
 	orr	w12, w12, w22
 	ldr	x22, [x4, 128]
-	.loc 1 1167 0
+	.loc 1 1166 0
 	lsl	w23, w21, 10
-	.loc 1 1170 0
-	add	w21, w21, 1
-	.loc 1 1168 0
-	add	x12, x22, x12
-	.loc 1 1170 0
-	and	w21, w21, 255
-	.loc 1 1171 0
-	cmp	w13, w21
 	.loc 1 1169 0
+	add	w21, w21, 1
+	.loc 1 1167 0
+	add	x12, x22, x12
+	.loc 1 1169 0
+	and	w21, w21, 255
+	.loc 1 1170 0
+	cmp	w13, w21
+	.loc 1 1168 0
 	ldrb	w12, [x12, w23, sxtw]
 	orr	w11, w11, w12, lsl 2
 	and	w11, w11, 255
-	.loc 1 1171 0
+	.loc 1 1170 0
 	beq	.L113
 .L72:
-	.loc 1 1175 0
+	.loc 1 1174 0
 	strb	w21, [x6, -3]
 .L71:
-	.loc 1 1178 0
+	.loc 1 1177 0
 	tst	w8, 251658240
 	beq	.L73
-	.loc 1 1181 0
+	.loc 1 1180 0
 	lsr	w12, w5, 24
-	.loc 1 1179 0
+	.loc 1 1178 0
 	ldrb	w21, [x6, -2]
-	.loc 1 1181 0
+	.loc 1 1180 0
 	ubfx	x22, x7, 24, 4
 	ubfiz	w12, w12, 5, 4
 	orr	w12, w12, w22
 	ldr	x22, [x4, 128]
-	.loc 1 1180 0
+	.loc 1 1179 0
 	lsl	w23, w21, 10
-	.loc 1 1183 0
-	add	w21, w21, 1
-	.loc 1 1181 0
-	add	x12, x22, x12
-	.loc 1 1183 0
-	and	w21, w21, 255
-	.loc 1 1184 0
-	cmp	w13, w21
 	.loc 1 1182 0
+	add	w21, w21, 1
+	.loc 1 1180 0
+	add	x12, x22, x12
+	.loc 1 1182 0
+	and	w21, w21, 255
+	.loc 1 1183 0
+	cmp	w13, w21
+	.loc 1 1181 0
 	ldrb	w12, [x12, w23, sxtw]
 	orr	w11, w11, w12, lsl 4
 	and	w11, w11, 255
-	.loc 1 1184 0
+	.loc 1 1183 0
 	beq	.L114
 .L74:
-	.loc 1 1188 0
+	.loc 1 1187 0
 	strb	w21, [x6, -2]
 .L73:
-	.loc 1 1191 0
+	.loc 1 1190 0
 	tst	w8, -268435456
 	beq	.L75
-	.loc 1 1192 0
+	.loc 1 1191 0
 	ldrb	w21, [x6, -1]
-	.loc 1 1194 0
+	.loc 1 1193 0
 	lsr	w8, w5, 28
 .LVL46:
 	mov	w12, w8
 	lsr	w22, w7, 28
 	ldr	x15, [x4, 128]
 	add	w8, w22, w12, lsl 5
-	.loc 1 1196 0
-	add	w12, w21, 1
-	.loc 1 1193 0
-	lsl	w21, w21, 10
-	.loc 1 1194 0
-	add	x8, x15, x8
-	.loc 1 1196 0
-	and	w12, w12, 255
-	.loc 1 1197 0
-	cmp	w13, w12
 	.loc 1 1195 0
+	add	w12, w21, 1
+	.loc 1 1192 0
+	lsl	w21, w21, 10
+	.loc 1 1193 0
+	add	x8, x15, x8
+	.loc 1 1195 0
+	and	w12, w12, 255
+	.loc 1 1196 0
+	cmp	w13, w12
+	.loc 1 1194 0
 	ldrb	w8, [x8, w21, sxtw]
 	orr	w11, w11, w8, lsl 6
 	and	w11, w11, 255
-	.loc 1 1197 0
+	.loc 1 1196 0
 	beq	.L115
 .L76:
-	.loc 1 1201 0
+	.loc 1 1200 0
 	strb	w12, [x6, -1]
 .LVL47:
 .L75:
-	.loc 1 1204 0
+	.loc 1 1203 0
 	str	w5, [x2, x9, lsl 2]
-	.loc 1 1095 0
+	.loc 1 1094 0
 	mov	w8, 1
 .LVL48:
-	.loc 1 1205 0
+	.loc 1 1204 0
 	strb	w11, [x10, -1]
 .L77:
 	add	x9, x9, 1
 	add	x6, x6, 8
 	add	x10, x10, 2
-	.loc 1 1089 0 discriminator 2
+	.loc 1 1088 0 discriminator 2
 	cmp	w14, w9
 	bgt	.L95
 	add	x3, x3, x19
@@ -818,15 +818,15 @@
 	add	x1, x1, x16
 .LVL49:
 .L58:
-	.loc 1 1083 0
+	.loc 1 1082 0
 	add	w18, w18, 1
 	cmp	w24, w18
 	beq	.L53
 	ldr	w6, [x17, 84]
-	.loc 1 1084 0
+	.loc 1 1083 0
 	cbnz	w30, .L116
 .L56:
-	.loc 1 1087 0
+	.loc 1 1086 0
 	mul	w10, w18, w6
 	lsr	w10, w10, 2
 	add	x10, x0, x10
@@ -835,107 +835,107 @@
 .LVL51:
 	.p2align 3
 .L115:
-	.loc 1 1199 0
+	.loc 1 1198 0
 	and	w5, w5, 268435455
 .LVL52:
 	and	w7, w7, -268435456
 .LVL53:
 	orr	w5, w7, w5
 .LVL54:
-	.loc 1 1198 0
+	.loc 1 1197 0
 	mov	w12, 0
 	b	.L76
 .LVL55:
 	.p2align 3
 .L114:
-	.loc 1 1186 0
+	.loc 1 1185 0
 	and	w5, w5, -251658241
 .LVL56:
 	and	w12, w7, 251658240
 	orr	w5, w12, w5
 .LVL57:
-	.loc 1 1185 0
+	.loc 1 1184 0
 	mov	w21, 0
 	b	.L74
 	.p2align 3
 .L112:
-	.loc 1 1160 0
+	.loc 1 1159 0
 	and	w12, w7, 983040
 	and	w5, w5, -983041
 .LVL58:
 	orr	w5, w12, w5
 .LVL59:
-	.loc 1 1159 0
+	.loc 1 1158 0
 	mov	w12, 0
 	b	.L70
 	.p2align 3
 .L113:
-	.loc 1 1173 0
+	.loc 1 1172 0
 	and	w5, w5, -15728641
 .LVL60:
 	and	w12, w7, 15728640
 	orr	w5, w12, w5
 .LVL61:
-	.loc 1 1172 0
+	.loc 1 1171 0
 	mov	w21, 0
 	b	.L72
 	.p2align 3
 .L111:
-	.loc 1 1144 0
+	.loc 1 1143 0
 	and	w5, w5, -61441
 .LVL62:
 	and	w12, w7, 61440
 	orr	w5, w12, w5
 .LVL63:
-	.loc 1 1143 0
+	.loc 1 1142 0
 	mov	w21, 0
 	b	.L68
 	.p2align 3
 .L109:
-	.loc 1 1118 0
+	.loc 1 1117 0
 	and	w5, w5, -241
 .LVL64:
 	and	w12, w7, 240
 	orr	w5, w12, w5
 .LVL65:
-	.loc 1 1117 0
+	.loc 1 1116 0
 	mov	w21, 0
 	b	.L64
 	.p2align 3
 .L110:
-	.loc 1 1131 0
+	.loc 1 1130 0
 	and	w5, w5, -3841
 .LVL66:
 	and	w12, w7, 3840
 	orr	w5, w12, w5
 .LVL67:
-	.loc 1 1130 0
+	.loc 1 1129 0
 	mov	w21, 0
 	b	.L66
 	.p2align 3
 .L108:
-	.loc 1 1105 0
-	bfi	w5, w22, 0, 4
 	.loc 1 1104 0
+	bfi	w5, w22, 0, 4
+	.loc 1 1103 0
 	mov	w12, 0
 	b	.L62
 .LVL68:
 	.p2align 3
 .L60:
-	.loc 1 1208 0
+	.loc 1 1207 0
 	strb	wzr, [x10, -2]
-	.loc 1 1209 0
+	.loc 1 1208 0
 	strb	wzr, [x10, -1]
 	b	.L77
 .LVL69:
 .L79:
-	.loc 1 1083 0
+	.loc 1 1082 0
 	mov	w8, 0
 .LVL70:
 .L53:
-	.loc 1 1216 0
+	.loc 1 1215 0
 	str	w8, [x20]
-	.loc 1 1217 0
+	.loc 1 1216 0
 	ldp	x19, x20, [sp, 16]
 .LVL71:
 	ldp	x21, x22, [sp, 32]
@@ -956,29 +956,29 @@
 .LVL73:
 .L106:
 	.cfi_restore_state
-	.loc 1 1072 0
+	.loc 1 1071 0
 	add	w18, w24, w24, lsr 31
 	asr	w24, w18, 1
-	.loc 1 1071 0
+	.loc 1 1070 0
 	mov	w18, 0
 .LVL74:
 	b	.L55
 .LVL75:
 .L107:
-	.loc 1 1074 0
+	.loc 1 1073 0
 	add	w15, w24, w24, lsr 31
-	.loc 1 1078 0
+	.loc 1 1077 0
 	add	x20, x4, 64
-	.loc 1 1074 0
+	.loc 1 1073 0
 	asr	w18, w15, 1
-	.loc 1 1075 0
+	.loc 1 1074 0
 	mul	w5, w14, w18
 .LVL76:
 	sbfiz	x5, x5, 2, 32
 	add	x1, x1, x5
-	.loc 1 1076 0
+	.loc 1 1075 0
 	add	x2, x2, x5
-	.loc 1 1077 0
+	.loc 1 1076 0
 	mul	w5, w18, w6
 	add	x3, x3, x5
 	b	.L55
@@ -990,15 +990,15 @@
 	.type	waveform_open, %function
 waveform_open:
 .LFB2853:
-	.loc 1 3164 0
+	.loc 1 3172 0
 	.cfi_startproc
 .LVL77:
-	.loc 1 3168 0
+	.loc 1 3176 0
 	mov	w0, 0
 .LVL78:
-	.loc 1 3165 0
+	.loc 1 3173 0
 	str	xzr, [x1, 104]
-	.loc 1 3168 0
+	.loc 1 3176 0
 	ret
 	.cfi_endproc
 .LFE2853:
@@ -1008,22 +1008,22 @@
 	.type	ebc_exit, %function
 ebc_exit:
 .LFB2874:
-	.loc 1 3779 0
+	.loc 1 3791 0
 	.cfi_startproc
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
-	.loc 1 3780 0
+	.loc 1 3792 0
 	adrp	x0, .LANCHOR1
 	add	x0, x0, :lo12:.LANCHOR1
-	.loc 1 3779 0
+	.loc 1 3791 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 3780 0
+	.loc 1 3792 0
 	bl	platform_driver_unregister
 .LVL79:
-	.loc 1 3781 0
+	.loc 1 3793 0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
 	.cfi_restore 29
@@ -1038,7 +1038,7 @@
 	.type	ebc_resume, %function
 ebc_resume:
 .LFB2872:
-	.loc 1 3741 0
+	.loc 1 3753 0
 	.cfi_startproc
 .LVL80:
 	stp	x29, x30, [sp, -32]!
@@ -1049,17 +1049,17 @@
 	.cfi_def_cfa_register 29
 	str	x19, [sp, 16]
 	.cfi_offset 19, -16
-.LBB1056:
-.LBB1057:
+.LBB1088:
+.LBB1089:
 	.file 2 "./include/linux/device.h"
 	.loc 2 1181 0
 	ldr	x19, [x0, 184]
-.LBE1057:
-.LBE1056:
-	.loc 1 3745 0
+.LBE1089:
+.LBE1088:
+	.loc 1 3757 0
 	ldr	x1, [x19, 16]
-.LBB1058:
-.LBB1059:
+.LBB1090:
+.LBB1091:
 	.file 3 "drivers/gpu/drm/rockchip/ebc-dev/pmic/ebc_pmic.h"
 	.loc 3 45 0
 	mov	x0, x1
@@ -1067,17 +1067,17 @@
 	ldr	x1, [x1, 48]
 	blr	x1
 .LVL82:
-.LBE1059:
-.LBE1058:
-	.loc 1 3746 0
-	str	wzr, [x19, 796]
-	.loc 1 3747 0
+.LBE1091:
+.LBE1090:
+	.loc 1 3758 0
+	str	wzr, [x19, 780]
+	.loc 1 3759 0
 	ldr	x0, [x19, 296]
 	adrp	x1, .LC0
 	add	x1, x1, :lo12:.LC0
 	bl	_dev_info
 .LVL83:
-	.loc 1 3750 0
+	.loc 1 3762 0
 	ldr	x19, [sp, 16]
 	mov	w0, 0
 	ldp	x29, x30, [sp], 32
@@ -1094,34 +1094,34 @@
 	.type	ebc_frame_control_timeout, %function
 ebc_frame_control_timeout:
 .LFB2846:
-	.loc 1 2835 0
+	.loc 1 2838 0
 	.cfi_startproc
 .LVL84:
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
-	.loc 1 2836 0
+	.loc 1 2839 0
 	adrp	x0, .LANCHOR0
 .LVL85:
-	.loc 1 2838 0
+	.loc 1 2841 0
 	mov	w3, 1
-	.loc 1 2839 0
+	.loc 1 2842 0
 	adrp	x1, .LC1
-	.loc 1 2835 0
+	.loc 1 2838 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 2836 0
-	ldr	x2, [x0, #:lo12:.LANCHOR0]
 	.loc 1 2839 0
+	ldr	x2, [x0, #:lo12:.LANCHOR0]
+	.loc 1 2842 0
 	add	x1, x1, :lo12:.LC1
 	ldr	x0, [x2, 296]
-	.loc 1 2838 0
-	str	w3, [x2, 808]
-	.loc 1 2839 0
+	.loc 1 2841 0
+	str	w3, [x2, 792]
+	.loc 1 2842 0
 	bl	_dev_info
 .LVL86:
-	.loc 1 2842 0
+	.loc 1 2845 0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
 	.cfi_restore 29
@@ -1135,27 +1135,27 @@
 	.type	ebc_remove, %function
 ebc_remove:
 .LFB2870:
-	.loc 1 3717 0
+	.loc 1 3729 0
 	.cfi_startproc
 .LVL87:
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
-	.loc 1 3718 0
+	.loc 1 3730 0
 	adrp	x0, .LANCHOR1
 .LVL88:
 	add	x0, x0, :lo12:.LANCHOR1
-	.loc 1 3717 0
+	.loc 1 3729 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 3718 0
+	.loc 1 3730 0
 	add	x0, x0, 224
-	.loc 1 3717 0
-	.loc 1 3718 0
+	.loc 1 3729 0
+	.loc 1 3730 0
 	bl	misc_deregister
 .LVL89:
-	.loc 1 3721 0
+	.loc 1 3733 0
 	mov	w0, 0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
@@ -1170,7 +1170,7 @@
 	.type	ebc_mmap, %function
 ebc_mmap:
 .LFB2850:
-	.loc 1 3110 0
+	.loc 1 3118 0
 	.cfi_startproc
 .LVL90:
 	stp	x29, x30, [sp, -32]!
@@ -1181,33 +1181,33 @@
 	.cfi_def_cfa_register 29
 	str	x19, [sp, 16]
 	.cfi_offset 19, -16
-	.loc 1 3110 0
+	.loc 1 3118 0
 	mov	x19, x1
-	.loc 1 3113 0
+	.loc 1 3121 0
 	bl	ebc_phy_buf_base_get
 .LVL91:
-	.loc 1 3116 0
+	.loc 1 3124 0
 	lsr	x2, x0, 12
-	.loc 1 3114 0
+	.loc 1 3122 0
 	mov	x6, 16384
-	.loc 1 3116 0
+	.loc 1 3124 0
 	mov	x0, x19
-	.loc 1 3114 0
+	.loc 1 3122 0
 	ldp	x4, x5, [x19, 72]
 	movk	x6, 0x404, lsl 16
-	.loc 1 3116 0
+	.loc 1 3124 0
 	ldp	x1, x3, [x19]
-	.loc 1 3114 0
+	.loc 1 3122 0
 	orr	x5, x5, x6
 	str	x5, [x19, 80]
-	.loc 1 3116 0
+	.loc 1 3124 0
 	sub	x3, x3, x1
 	bl	remap_pfn_range
 .LVL92:
-	.loc 1 3119 0
+	.loc 1 3127 0
 	cmp	w0, 0
 	mov	w1, -11
-	.loc 1 3122 0
+	.loc 1 3130 0
 	ldr	x19, [sp, 16]
 .LVL93:
 	csel	w0, w0, w1, eq
@@ -1225,47 +1225,47 @@
 	.type	waveform_mmap, %function
 waveform_mmap:
 .LFB2852:
-	.loc 1 3148 0
+	.loc 1 3156 0
 	.cfi_startproc
 .LVL94:
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
-	.loc 1 3149 0
+	.loc 1 3157 0
 	adrp	x2, .LANCHOR0
-	.loc 1 3153 0
+	.loc 1 3161 0
 	mov	x7, 16384
-	.loc 1 3155 0
+	.loc 1 3163 0
 	mov	x0, x1
 .LVL95:
-	.loc 1 3148 0
+	.loc 1 3156 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 3152 0
+	.loc 1 3160 0
 	ldr	x2, [x2, #:lo12:.LANCHOR0]
-	.loc 1 3153 0
+	.loc 1 3161 0
 	movk	x7, 0x404, lsl 16
 	ldp	x4, x5, [x1, 72]
-	.loc 1 3155 0
+	.loc 1 3163 0
 	ldp	x6, x3, [x1]
-	.loc 1 3153 0
+	.loc 1 3161 0
 	orr	x5, x5, x7
-	.loc 1 3152 0
+	.loc 1 3160 0
 	ldr	x2, [x2, 232]
-	.loc 1 3153 0
+	.loc 1 3161 0
 	str	x5, [x1, 80]
-	.loc 1 3155 0
+	.loc 1 3163 0
 	sub	x3, x3, x6
 	mov	x1, x6
 .LVL96:
 	lsr	x2, x2, 12
 	bl	remap_pfn_range
 .LVL97:
-	.loc 1 3158 0
+	.loc 1 3166 0
 	cmp	w0, 0
 	mov	w1, -11
-	.loc 1 3161 0
+	.loc 1 3169 0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
 	.cfi_restore 29
@@ -1280,7 +1280,7 @@
 	.type	ebc_io_ctl, %function
 ebc_io_ctl:
 .LFB2849:
-	.loc 1 2924 0
+	.loc 1 2927 0
 	.cfi_startproc
 .LVL98:
 	stp	x29, x30, [sp, -160]!
@@ -1304,122 +1304,272 @@
 	mov	x21, x2
 	str	x25, [sp, 64]
 	.cfi_offset 25, -96
-	.loc 1 2924 0
+	.loc 1 2927 0
 	ldr	x3, [x0]
 	str	x3, [x29, 152]
 	mov	x3,0
-	.loc 1 2934 0
+	.loc 1 2937 0
 	mov	w0, 28679
-	.loc 1 2926 0
+	.loc 1 2929 0
 	adrp	x3, .LANCHOR0
-	.loc 1 2934 0
+	.loc 1 2937 0
 	cmp	w1, w0
-	.loc 1 2926 0
+	.loc 1 2929 0
 	ldr	x20, [x3, #:lo12:.LANCHOR0]
-	.loc 1 2934 0
+	.loc 1 2937 0
 	bhi	.L136
 	mov	w0, 28678
 	cmp	w1, w0
 	bcs	.L137
 	sub	w0, w1, #28672
 	cmp	w0, 3
-	bls	.L137
+	bhi	.L135
+.L137:
+	.loc 1 2948 0
+	cbz	x21, .L252
+.L257:
+	sub	w0, w1, #28672
 .L135:
-	.loc 1 2953 0
-	mov	w0, 28679
-	cmp	w1, w0
-	beq	.L140
-	bls	.L255
-	mov	w0, 28683
-	cmp	w1, w0
-	beq	.L150
-	bls	.L256
-	mov	w0, 28685
-	cmp	w1, w0
-	beq	.L155
-	bcc	.L156
-	mov	w0, 28686
-	cmp	w1, w0
-	beq	.L157
-	mov	w0, 28687
-	cmp	w1, w0
-	bne	.L139
-	.loc 1 3049 0
+	.loc 1 2957 0
+	cmp	w0, 16
+	bls	.L260
+	.loc 1 3110 0
 	ldr	x0, [x20, 296]
-	adrp	x1, .LC6
+	adrp	x2, .LANCHOR2
+	adrp	x1, .LC13
 .LVL100:
-	.loc 1 3048 0
-	str	wzr, [x20, 816]
-	.loc 1 3049 0
-	add	x1, x1, :lo12:.LC6
-	bl	_dev_info
+	add	x2, x2, :lo12:.LANCHOR2
+	add	x1, x1, :lo12:.LC13
+	bl	_dev_err
 .LVL101:
-	.loc 1 3050 0
+	.loc 1 3111 0
 	mov	x0, 0
 	b	.L134
 .LVL102:
 	.p2align 3
 .L136:
-	.loc 1 2934 0
-	mov	w0, -28681
-	add	w0, w1, w0
-	cmp	w0, 2
-	bhi	.L135
-.L137:
-	.loc 1 2944 0
-	cbnz	x21, .L135
-	.loc 1 2945 0
-	ldr	x0, [x20, 296]
-	adrp	x2, .LANCHOR2
-	adrp	x1, .LC2
-.LVL103:
-	add	x2, x2, :lo12:.LANCHOR2
-	add	x1, x1, :lo12:.LC2
-	bl	_dev_err
-.LVL104:
-	.loc 1 2946 0
-	mov	x0, -14
-	b	.L134
-.LVL105:
+	.loc 1 2937 0
+	mov	w0, 28681
+	cmp	w1, w0
+	bcc	.L257
+	mov	w0, 28683
+	cmp	w1, w0
+	bls	.L137
+	mov	w0, 28688
+	cmp	w1, w0
+	bne	.L257
+	.loc 1 2948 0
+	cbnz	x21, .L257
+	b	.L252
 	.p2align 3
-.L255:
-	.loc 1 2953 0
-	mov	w0, 28675
-	cmp	w1, w0
-	beq	.L142
-	bls	.L257
-	mov	w0, 28677
-	cmp	w1, w0
-	beq	.L147
-	bhi	.L258
-	.loc 1 3053 0
-	ldr	x0, [x20, 296]
-	.loc 1 3052 0
-	mov	w2, 1
-	str	w2, [x20, 804]
-	.loc 1 3053 0
-	adrp	x1, .LC7
+.L260:
+	.loc 1 2957 0
+	adrp	x1, .L141
+.LVL103:
+	add	x1, x1, :lo12:.L141
+	ldrh	w0, [x1,w0,uxtw #1]
+	adr	x1, .Lrtx141
+	add	x0, x1, w0, sxth #2
+	br	x0
+.Lrtx141:
+	.section	.rodata
+	.align	0
+	.align	2
+.L141:
+	.2byte	(.L140 - .Lrtx141) / 4
+	.2byte	(.L142 - .Lrtx141) / 4
+	.2byte	(.L143 - .Lrtx141) / 4
+	.2byte	(.L144 - .Lrtx141) / 4
+	.2byte	(.L145 - .Lrtx141) / 4
+	.2byte	(.L146 - .Lrtx141) / 4
+	.2byte	(.L147 - .Lrtx141) / 4
+	.2byte	(.L148 - .Lrtx141) / 4
+	.2byte	(.L258 - .Lrtx141) / 4
+	.2byte	(.L150 - .Lrtx141) / 4
+	.2byte	(.L151 - .Lrtx141) / 4
+	.2byte	(.L152 - .Lrtx141) / 4
+	.2byte	(.L153 - .Lrtx141) / 4
+	.2byte	(.L154 - .Lrtx141) / 4
+	.2byte	(.L155 - .Lrtx141) / 4
+	.2byte	(.L156 - .Lrtx141) / 4
+	.2byte	(.L157 - .Lrtx141) / 4
+	.text
+	.p2align 3
+.L151:
+.LBB1092:
+.LBB1093:
+.LBB1094:
+.LBB1095:
+.LBB1096:
+.LBB1097:
+.LBB1098:
+	.file 4 "./arch/arm64/include/asm/current.h"
+	.loc 4 19 0
+#APP
+// 19 "./arch/arm64/include/asm/current.h" 1
+	mrs x0, sp_el0
+// 0 "" 2
+.LVL104:
+#NO_APP
+.LBE1098:
+.LBE1097:
+	.file 5 "./arch/arm64/include/asm/uaccess.h"
+	.loc 5 85 0
+	ldr	w2, [x0, 52]
+.LBE1096:
+.LBE1095:
+.LBE1094:
+.LBE1093:
+.LBE1092:
+	.loc 1 3103 0
+	add	x22, x20, 440
+.LBB1123:
+.LBB1120:
+.LBB1117:
+.LBB1107:
+.LBB1105:
+	.loc 5 77 0
+	ldr	x1, [x0, 8]
+.LVL105:
+	.loc 5 84 0
+	tbnz	x2, 21, .L201
+.LBB1099:
+.LBB1100:
+.LBB1101:
+	.file 6 "./include/asm-generic/bitops/non-atomic.h"
+	.loc 6 106 0
+	ldr	x2, [x0]
+.LBE1101:
+.LBE1100:
+.LBE1099:
+.LBE1105:
+.LBE1107:
+.LBE1117:
+.LBE1120:
+.LBE1123:
+	.loc 1 2928 0
+	mov	x0, x21
 .LVL106:
-	add	x1, x1, :lo12:.LC7
-	bl	_dev_info
+.LBB1124:
+.LBB1121:
+.LBB1118:
+.LBB1108:
+.LBB1106:
+	.loc 5 84 0
+	tbz	x2, 26, .L202
 .LVL107:
-	.loc 1 3054 0
-	mov	x0, 0
+.L201:
+.LBB1102:
+.LBB1103:
+.LBB1104:
+	.file 7 "./include/linux/bitops.h"
+	.loc 7 157 0
+	sbfx	x0, x21, 0, 56
 .LVL108:
-	.p2align 2
-.L134:
+.LBE1104:
+.LBE1103:
+	.loc 5 86 0
+	and	x0, x0, x21
+.LVL109:
+.L202:
+.LBE1102:
+	.loc 5 89 0
+#APP
+// 89 "./arch/arm64/include/asm/uaccess.h" 1
+		adds	x0, x0, 4
+	csel	x1, xzr, x1, hi
+	csinv	x0, x0, xzr, cc
+	sbcs	xzr, x0, x1
+	cset	x0, ls
+
+// 0 "" 2
+.LVL110:
+#NO_APP
+	mov	x3, x0
+.LBE1106:
+.LBE1108:
+	.file 8 "./include/linux/uaccess.h"
+	.loc 8 114 0
+	cbz	x0, .L225
+.LBB1109:
+.LBB1110:
+.LBB1111:
+.LBB1112:
+.LBB1113:
+	.loc 7 157 0
+	sbfx	x0, x21, 0, 56
+.LBE1113:
+.LBE1112:
+.LBE1111:
+.LBB1114:
+.LBB1115:
+	.loc 4 19 0
+#APP
+// 19 "./arch/arm64/include/asm/current.h" 1
+	mrs x1, sp_el0
+// 0 "" 2
+.LVL111:
+#NO_APP
+.LBE1115:
+.LBE1114:
+.LBB1116:
+	.loc 5 254 0
+	and	x0, x0, x21
+.LVL112:
+.LBE1116:
+	.loc 5 249 0
+	ldr	x2, [x1, 8]
+#APP
+// 249 "./arch/arm64/include/asm/uaccess.h" 1
+		bics	xzr, x0, x2
+	csel	x1, x21, xzr, eq
+
+// 0 "" 2
+.LVL113:
+	.loc 5 257 0
+// 257 "./arch/arm64/include/asm/uaccess.h" 1
+	hint #20
+// 0 "" 2
+#NO_APP
+.LBE1110:
+.LBE1109:
+	.loc 8 116 0
+	mov	x2, 4
+	mov	x0, x22
+.LVL114:
+	bl	__arch_copy_from_user
+.LVL115:
+	.loc 8 118 0
+	cbnz	x0, .L261
+.LBE1118:
+.LBE1121:
+.LBE1124:
 	.loc 1 3107 0
+	add	x20, x20, 192
+	ldr	w2, [x20, 248]
+	ldr	x0, [x20, 104]
+.LVL116:
+	adrp	x1, .LC16
+	add	x1, x1, :lo12:.LC16
+	bl	_dev_info
+.LVL117:
+.L258:
+	.loc 1 3108 0
+	mov	x0, 0
+.LVL118:
+.L134:
+	.loc 1 3115 0
 	add	x19, x19, :lo12:__stack_chk_guard
 	ldr	x2, [x29, 152]
 	ldr	x1, [x19]
 	eor	x1, x2, x1
-.LVL109:
-	cbnz	x1, .L259
+.LVL119:
+	cbnz	x1, .L262
 	ldp	x19, x20, [sp, 16]
 	ldp	x21, x22, [sp, 32]
-.LVL110:
+.LVL120:
 	ldp	x23, x24, [sp, 48]
-.LVL111:
+.LVL121:
 	ldr	x25, [sp, 64]
 	ldp	x29, x30, [sp], 160
 	.cfi_remember_state
@@ -1434,477 +1584,106 @@
 	.cfi_restore 20
 	.cfi_def_cfa 31, 0
 	ret
-.LVL112:
-	.p2align 3
-.L257:
-	.cfi_restore_state
-	.loc 1 2953 0
-	mov	w0, 28673
-	cmp	w1, w0
-	beq	.L144
-	bhi	.L145
-	cmp	w1, 28672
-	bne	.L139
-.LBB1060:
-.LBB1061:
-.LBB1062:
-.LBB1063:
-.LBB1064:
-.LBB1065:
-.LBB1066:
-	.file 4 "./arch/arm64/include/asm/current.h"
-	.loc 4 19 0
-#APP
-// 19 "./arch/arm64/include/asm/current.h" 1
-	mrs x0, sp_el0
-// 0 "" 2
-.LVL113:
-#NO_APP
-.LBE1066:
-.LBE1065:
-	.file 5 "./arch/arm64/include/asm/uaccess.h"
-	.loc 5 85 0
-	ldr	w2, [x0, 52]
-	.loc 5 77 0
-	ldr	x1, [x0, 8]
-.LVL114:
-	.loc 5 84 0
-	tbz	x2, 21, .L260
-.LVL115:
-.L164:
-.LBB1067:
-.LBB1068:
-.LBB1069:
-	.file 6 "./include/linux/bitops.h"
-	.loc 6 157 0
-	sbfx	x0, x21, 0, 56
-.LVL116:
-.LBE1069:
-.LBE1068:
-	.loc 5 86 0
-	and	x0, x0, x21
-.LVL117:
-.L165:
-.LBE1067:
-	.loc 5 89 0
-#APP
-// 89 "./arch/arm64/include/asm/uaccess.h" 1
-		adds	x0, x0, 64
-	csel	x1, xzr, x1, hi
-	csinv	x0, x0, xzr, cc
-	sbcs	xzr, x0, x1
-	cset	x0, ls
-
-// 0 "" 2
-.LVL118:
-#NO_APP
-.LBE1064:
-.LBE1063:
-	.file 7 "./include/linux/uaccess.h"
-	.loc 7 114 0
-	cbz	x0, .L249
-.LBB1075:
-.LBB1076:
-.LBB1077:
-.LBB1078:
-.LBB1079:
-	.loc 6 157 0
-	lsl	x23, x21, 8
-.LBE1079:
-.LBE1078:
-.LBE1077:
-.LBB1080:
-.LBB1081:
-	.loc 4 19 0
-#APP
-// 19 "./arch/arm64/include/asm/current.h" 1
-	mrs x0, sp_el0
-// 0 "" 2
-.LVL119:
-#NO_APP
-.LBE1081:
-.LBE1080:
-.LBB1082:
-	.loc 5 254 0
-	and	x2, x21, x23, asr 8
-.LVL120:
-.LBE1082:
-	.loc 5 249 0
-	ldr	x0, [x0, 8]
-.LVL121:
-#APP
-// 249 "./arch/arm64/include/asm/uaccess.h" 1
-		bics	xzr, x2, x0
-	csel	x1, x21, xzr, eq
-
-// 0 "" 2
 .LVL122:
-	.loc 5 257 0
-// 257 "./arch/arm64/include/asm/uaccess.h" 1
-	hint #20
-// 0 "" 2
-#NO_APP
-.LBE1076:
-.LBE1075:
-	.loc 7 116 0
-	add	x24, x29, 88
-	mov	x2, 64
+	.p2align 3
+.L156:
+	.cfi_restore_state
+	.loc 1 3054 0
+	ldr	x0, [x20, 296]
+	adrp	x1, .LC6
+	.loc 1 3053 0
+	str	wzr, [x20, 800]
+	.loc 1 3054 0
+	add	x1, x1, :lo12:.LC6
+	bl	_dev_info
 .LVL123:
-	mov	x0, x24
-	bl	__arch_copy_from_user
-.LVL124:
-	mov	x22, x0
-.LVL125:
-	.loc 7 118 0
-	cbnz	x0, .L167
-.L170:
-.LBE1062:
-.LBE1061:
-.LBE1060:
-	.loc 1 2974 0
-	add	x0, x24, 48
-	bl	ebc_empty_buf_get
-.LVL126:
-	mov	x25, x0
-	.loc 1 2975 0
-	cbz	x0, .L168
-	.loc 1 2978 0
-	ldr	x22, [x0, 8]
-.LVL127:
-	bl	ebc_phy_buf_base_get
-.LVL128:
-	.loc 1 2982 0
-	ldp	w3, w1, [x20, 108]
-	.loc 1 2981 0
-	stp	w1, w3, [x29, 96]
-.LBB1091:
-.LBB1092:
-.LBB1093:
-.LBB1094:
-.LBB1095:
-.LBB1096:
-.LBB1097:
-	.loc 4 19 0
-#APP
-// 19 "./arch/arm64/include/asm/current.h" 1
-	mrs x2, sp_el0
-// 0 "" 2
-.LVL129:
-#NO_APP
-.LBE1097:
-.LBE1096:
-	.loc 5 85 0
-	ldr	w3, [x2, 52]
-.LBE1095:
-.LBE1094:
-.LBE1093:
-.LBE1092:
-.LBE1091:
-	.loc 1 2978 0
-	sub	w0, w22, w0
-	.loc 1 2983 0
-	ldr	w1, [x20, 176]
-	.loc 1 2984 0
-	str	wzr, [x29, 132]
-	.loc 1 2983 0
-	str	w1, [x29, 104]
-	.loc 1 2980 0
-	str	w0, [x29, 88]
-.LBB1121:
-.LBB1117:
-.LBB1113:
-.LBB1105:
-.LBB1102:
-	.loc 5 77 0
-	ldr	x1, [x2, 8]
-.LVL130:
-	.loc 5 84 0
-	tbnz	x3, 21, .L171
-.LBB1098:
-.LBB1099:
-.LBB1100:
-	.file 8 "./include/asm-generic/bitops/non-atomic.h"
-	.loc 8 106 0
-	ldr	x2, [x2]
-.LVL131:
-.LBE1100:
-.LBE1099:
-.LBE1098:
-.LBE1102:
-.LBE1105:
-.LBE1113:
-.LBE1117:
-.LBE1121:
-	.loc 1 2925 0
-	mov	x0, x21
-.LVL132:
-.LBB1122:
-.LBB1118:
-.LBB1114:
-.LBB1106:
-.LBB1103:
-	.loc 5 84 0
-	tbnz	x2, 26, .L171
-.LVL133:
-.L172:
-	.loc 5 89 0
-#APP
-// 89 "./arch/arm64/include/asm/uaccess.h" 1
-		adds	x0, x0, 64
-	csel	x1, xzr, x1, hi
-	csinv	x0, x0, xzr, cc
-	sbcs	xzr, x0, x1
-	cset	x0, ls
-
-// 0 "" 2
-.LVL134:
-#NO_APP
-.LBE1103:
-.LBE1106:
-	.loc 7 132 0
-	cbnz	x0, .L173
-.LVL135:
-.L174:
-.LBE1114:
-.LBE1118:
-.LBE1122:
-	.loc 1 2988 0
-	mov	x0, x25
-.LVL136:
-	bl	ebc_buf_release
-.LVL137:
-	.loc 1 2989 0
-	mov	x0, -14
+	.loc 1 3055 0
+	mov	x0, 0
 	b	.L134
-.LVL138:
 	.p2align 3
 .L155:
-	.loc 1 3041 0
+	.loc 1 3050 0
+	ldr	x0, [x20, 296]
+	.loc 1 3049 0
+	mov	w2, 1
+	str	w2, [x20, 800]
+	.loc 1 3050 0
+	adrp	x1, .LC5
+	add	x1, x1, :lo12:.LC5
+	bl	_dev_info
+.LVL124:
+	.loc 1 3051 0
+	mov	x0, 0
+	b	.L134
+	.p2align 3
+.L154:
+	.loc 1 3046 0
 	ldr	x0, [x20, 296]
 	adrp	x1, .LC4
-.LVL139:
-	.loc 1 3040 0
-	str	wzr, [x20, 812]
-	.loc 1 3041 0
+	.loc 1 3045 0
+	str	wzr, [x20, 796]
+	.loc 1 3046 0
 	add	x1, x1, :lo12:.LC4
 	bl	_dev_info
-.LVL140:
+.LVL125:
+	.loc 1 3047 0
+	mov	x0, 0
+	b	.L134
+	.p2align 3
+.L153:
 	.loc 1 3042 0
-	mov	x0, 0
-	b	.L134
-.LVL141:
-	.p2align 3
-.L256:
-	.loc 1 2953 0
-	mov	w0, 28681
-	cmp	w1, w0
-	beq	.L152
-	bhi	.L261
-	.loc 1 3091 0
 	ldr	x0, [x20, 296]
-	.loc 1 3090 0
-	mov	w21, 1
-.LVL142:
-	str	w21, [x20, 448]
-	.loc 1 3091 0
-	adrp	x1, .LC12
-.LVL143:
-	add	x1, x1, :lo12:.LC12
+	.loc 1 3041 0
+	mov	w2, 1
+	str	w2, [x20, 796]
+	.loc 1 3042 0
+	adrp	x1, .LC3
+	add	x1, x1, :lo12:.LC3
 	bl	_dev_info
-.LVL144:
-	.loc 1 3092 0
-	adrp	x0, .LANCHOR1
-	add	x0, x0, :lo12:.LANCHOR1
-	add	x0, x0, 304
-	mov	w2, w21
-	mov	w1, w21
-	bl	__wake_up_sync
-.LVL145:
-	.loc 1 3093 0
+.LVL126:
+	.loc 1 3043 0
 	mov	x0, 0
 	b	.L134
-.LVL146:
 	.p2align 3
-.L140:
-.LBB1123:
-.LBB1124:
+.L152:
 .LBB1125:
 .LBB1126:
 .LBB1127:
 .LBB1128:
 .LBB1129:
-	.loc 4 19 0
-#APP
-// 19 "./arch/arm64/include/asm/current.h" 1
-	mrs x0, sp_el0
-// 0 "" 2
-.LVL147:
-#NO_APP
-.LBE1129:
-.LBE1128:
-	.loc 5 85 0
-	ldr	w2, [x0, 52]
-	.loc 5 77 0
-	ldr	x1, [x0, 8]
-.LVL148:
-	.loc 5 84 0
-	tbz	x2, 21, .L262
-.LVL149:
-.L181:
 .LBB1130:
 .LBB1131:
-.LBB1132:
-	.loc 6 157 0
-	sbfx	x0, x21, 0, 56
-.LVL150:
-.LBE1132:
+	.loc 4 19 0
+#APP
+// 19 "./arch/arm64/include/asm/current.h" 1
+	mrs x1, sp_el0
+// 0 "" 2
+.LVL127:
+#NO_APP
 .LBE1131:
-	.loc 5 86 0
-	and	x0, x0, x21
-.LVL151:
-.L182:
 .LBE1130:
-	.loc 5 89 0
-#APP
-// 89 "./arch/arm64/include/asm/uaccess.h" 1
-		adds	x0, x0, 64
-	csel	x1, xzr, x1, hi
-	csinv	x0, x0, xzr, cc
-	sbcs	xzr, x0, x1
-	cset	x0, ls
-
-// 0 "" 2
-.LVL152:
-#NO_APP
-.LBE1127:
-.LBE1126:
-	.loc 7 114 0
-	cbz	x0, .L249
-.LBB1138:
-.LBB1139:
-.LBB1140:
-.LBB1141:
-.LBB1142:
-	.loc 6 157 0
-	sbfx	x0, x21, 0, 56
-.LVL153:
-.LBE1142:
-.LBE1141:
-.LBE1140:
-.LBB1143:
-.LBB1144:
-	.loc 4 19 0
-#APP
-// 19 "./arch/arm64/include/asm/current.h" 1
-	mrs x1, sp_el0
-// 0 "" 2
-.LVL154:
-#NO_APP
-.LBE1144:
-.LBE1143:
-.LBB1145:
-	.loc 5 254 0
-	and	x0, x0, x21
-.LVL155:
-.LBE1145:
-	.loc 5 249 0
-	ldr	x2, [x1, 8]
-#APP
-// 249 "./arch/arm64/include/asm/uaccess.h" 1
-		bics	xzr, x0, x2
-	csel	x1, x21, xzr, eq
-
-// 0 "" 2
-.LVL156:
-	.loc 5 257 0
-// 257 "./arch/arm64/include/asm/uaccess.h" 1
-	hint #20
-// 0 "" 2
-#NO_APP
-.LBE1139:
-.LBE1138:
-	.loc 7 116 0
-	mov	x2, 64
-	add	x0, x29, 88
-.LVL157:
-	bl	__arch_copy_from_user
-.LVL158:
-	.loc 7 118 0
-	cbnz	x0, .L249
-.LBE1125:
-.LBE1124:
-.LBE1123:
-	.loc 1 3019 0
-	bl	ebc_osd_buf_clone
-.LVL159:
-	mov	x1, x0
-	.loc 1 3020 0
-	cbz	x0, .L248
-	.loc 1 3021 0
-	ldr	w6, [x29, 92]
-	.loc 1 3029 0
-	add	x20, x20, 192
-	.loc 1 3025 0
-	ldp	w5, w3, [x29, 108]
-	.loc 1 3021 0
-	str	w6, [x1, 40]
-	.loc 1 3026 0
-	ldp	w4, w2, [x29, 116]
-	.loc 1 3025 0
-	stp	w5, w3, [x1, 48]
-	.loc 1 3026 0
-	stp	w4, w2, [x1, 56]
-	.loc 1 3028 0
-	bl	ebc_add_to_osd_buf_list
-.LVL160:
-	.loc 1 3029 0
-	ldr	w0, [x20, 100]
-	cbz	w0, .L250
-.L248:
-	.loc 1 3100 0
-	mov	x0, 0
-	b	.L134
-.LVL161:
-	.p2align 3
-.L150:
-.LBB1152:
-.LBB1153:
-.LBB1154:
-.LBB1155:
-.LBB1156:
-.LBB1157:
-.LBB1158:
-	.loc 4 19 0
-#APP
-// 19 "./arch/arm64/include/asm/current.h" 1
-	mrs x1, sp_el0
-// 0 "" 2
-.LVL162:
-#NO_APP
-.LBE1158:
-.LBE1157:
 	.loc 5 85 0
 	ldr	w2, [x1, 52]
 	.loc 5 77 0
 	ldr	x0, [x1, 8]
-.LVL163:
+.LVL128:
 	.loc 5 84 0
 	tbz	x2, 21, .L263
-.LVL164:
-.L184:
-.LBB1159:
-.LBB1160:
-.LBB1161:
-	.loc 6 157 0
+.LVL129:
+.L183:
+.LBB1132:
+.LBB1133:
+.LBB1134:
+	.loc 7 157 0
 	sbfx	x1, x21, 0, 56
-.LVL165:
-.LBE1161:
-.LBE1160:
+.LVL130:
+.LBE1134:
+.LBE1133:
 	.loc 5 86 0
 	and	x1, x1, x21
-.LVL166:
-.L185:
-.LBE1159:
+.LVL131:
+.L184:
+.LBE1132:
 	.loc 5 89 0
 #APP
 // 89 "./arch/arm64/include/asm/uaccess.h" 1
@@ -1915,123 +1694,122 @@
 	cset	x1, ls
 
 // 0 "" 2
-.LVL167:
+.LVL132:
 #NO_APP
-.LBE1156:
-.LBE1155:
-	.loc 7 132 0
+.LBE1129:
+.LBE1128:
+	.loc 8 132 0
 	mov	x0, 4
-.LVL168:
+.LVL133:
 	cbz	x1, .L134
-.LBB1167:
-.LBB1168:
-.LBB1169:
-.LBB1170:
-.LBB1171:
-	.loc 6 157 0
+.LBB1140:
+.LBB1141:
+.LBB1142:
+.LBB1143:
+.LBB1144:
+	.loc 7 157 0
 	sbfx	x1, x21, 0, 56
-.LVL169:
-.LBE1171:
-.LBE1170:
-.LBE1169:
-.LBB1172:
-.LBB1173:
+.LVL134:
+.LBE1144:
+.LBE1143:
+.LBE1142:
+.LBB1145:
+.LBB1146:
 	.loc 4 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
 	mrs x2, sp_el0
 // 0 "" 2
-.LVL170:
+.LVL135:
 #NO_APP
-.LBE1173:
-.LBE1172:
-.LBB1174:
+.LBE1146:
+.LBE1145:
+.LBB1147:
 	.loc 5 254 0
 	and	x1, x1, x21
-.LVL171:
-.LBE1174:
+.LVL136:
+.LBE1147:
 	.loc 5 249 0
 	ldr	x2, [x2, 8]
-.LVL172:
+.LVL137:
 #APP
 // 249 "./arch/arm64/include/asm/uaccess.h" 1
 		bics	xzr, x1, x2
 	csel	x3, x21, xzr, eq
 
 // 0 "" 2
-.LVL173:
+.LVL138:
 	.loc 5 257 0
 // 257 "./arch/arm64/include/asm/uaccess.h" 1
 	hint #20
 // 0 "" 2
 #NO_APP
-.LBE1168:
-.LBE1167:
-	.loc 7 134 0
+.LBE1141:
+.LBE1140:
+	.loc 8 134 0
 	mov	x2, x0
-	add	x1, x20, 804
-.LVL174:
+	add	x1, x20, 788
+.LVL139:
 	mov	x0, x3
 	bl	__arch_copy_to_user
-.LVL175:
+.LVL140:
 	sxtw	x0, w0
 	b	.L134
-.LVL176:
 	.p2align 3
-.L261:
-.LBE1154:
-.LBE1153:
-.LBE1152:
-.LBB1181:
-.LBB1182:
-.LBB1183:
-.LBB1184:
-.LBB1185:
-.LBB1186:
-.LBB1187:
+.L150:
+.LBE1127:
+.LBE1126:
+.LBE1125:
+.LBB1154:
+.LBB1155:
+.LBB1156:
+.LBB1157:
+.LBB1158:
+.LBB1159:
+.LBB1160:
 	.loc 4 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
 	mrs x0, sp_el0
 // 0 "" 2
-.LVL177:
+.LVL141:
 #NO_APP
-.LBE1187:
-.LBE1186:
+.LBE1160:
+.LBE1159:
 	.loc 5 85 0
 	ldr	w2, [x0, 52]
-.LBE1185:
-.LBE1184:
-.LBE1183:
-.LBE1182:
-.LBE1181:
-	.loc 1 3095 0
-	add	x22, x20, 452
-.LBB1216:
-.LBB1212:
-.LBB1208:
-.LBB1197:
-.LBB1194:
+.LBE1158:
+.LBE1157:
+.LBE1156:
+.LBE1155:
+.LBE1154:
+	.loc 1 3094 0
+	add	x22, x20, 280
+.LBB1189:
+.LBB1185:
+.LBB1181:
+.LBB1170:
+.LBB1167:
 	.loc 5 77 0
 	ldr	x1, [x0, 8]
-.LVL178:
+.LVL142:
 	.loc 5 84 0
 	tbz	x2, 21, .L264
-.LVL179:
-.L199:
-.LBB1188:
-.LBB1189:
-.LBB1190:
-	.loc 6 157 0
+.LVL143:
+.L197:
+.LBB1161:
+.LBB1162:
+.LBB1163:
+	.loc 7 157 0
 	sbfx	x0, x21, 0, 56
-.LVL180:
-.LBE1190:
-.LBE1189:
+.LVL144:
+.LBE1163:
+.LBE1162:
 	.loc 5 86 0
 	and	x0, x0, x21
-.LVL181:
-.L200:
-.LBE1188:
+.LVL145:
+.L198:
+.LBE1161:
 	.loc 5 89 0
 #APP
 // 89 "./arch/arm64/include/asm/uaccess.h" 1
@@ -2042,39 +1820,39 @@
 	cset	x0, ls
 
 // 0 "" 2
-.LVL182:
+.LVL146:
 #NO_APP
 	mov	x3, x0
-.LBE1194:
-.LBE1197:
-	.loc 7 114 0
-	cbz	x0, .L220
-.LBB1198:
-.LBB1199:
-.LBB1200:
-.LBB1201:
-.LBB1202:
-	.loc 6 157 0
+.LBE1167:
+.LBE1170:
+	.loc 8 114 0
+	cbz	x0, .L223
+.LBB1171:
+.LBB1172:
+.LBB1173:
+.LBB1174:
+.LBB1175:
+	.loc 7 157 0
 	sbfx	x0, x21, 0, 56
-.LBE1202:
-.LBE1201:
-.LBE1200:
-.LBB1203:
-.LBB1204:
+.LBE1175:
+.LBE1174:
+.LBE1173:
+.LBB1176:
+.LBB1177:
 	.loc 4 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
 	mrs x1, sp_el0
 // 0 "" 2
-.LVL183:
+.LVL147:
 #NO_APP
-.LBE1204:
-.LBE1203:
-.LBB1205:
+.LBE1177:
+.LBE1176:
+.LBB1178:
 	.loc 5 254 0
 	and	x0, x0, x21
-.LVL184:
-.LBE1205:
+.LVL148:
+.LBE1178:
 	.loc 5 249 0
 	ldr	x2, [x1, 8]
 #APP
@@ -2083,279 +1861,257 @@
 	csel	x1, x21, xzr, eq
 
 // 0 "" 2
-.LVL185:
+.LVL149:
 	.loc 5 257 0
 // 257 "./arch/arm64/include/asm/uaccess.h" 1
 	hint #20
 // 0 "" 2
 #NO_APP
-.LBE1199:
-.LBE1198:
-	.loc 7 116 0
+.LBE1172:
+.LBE1171:
+	.loc 8 116 0
 	mov	x2, 4
 	mov	x0, x22
-.LVL186:
+.LVL150:
 	bl	__arch_copy_from_user
-.LVL187:
-	.loc 7 118 0
+.LVL151:
+	.loc 8 118 0
 	cbnz	x0, .L265
-.LBE1208:
-.LBE1212:
-.LBE1216:
-	.loc 1 3099 0
-	add	x20, x20, 192
-	ldr	x0, [x20, 104]
-.LVL188:
-	ldr	w2, [x20, 260]
-	adrp	x1, .LC17
-	add	x1, x1, :lo12:.LC17
+.LBE1181:
+.LBE1185:
+.LBE1189:
+	.loc 1 3098 0
+	ldr	x0, [x20, 296]
+.LVL152:
+	adrp	x1, .LC15
+	ldr	w2, [x20, 280]
+	add	x1, x1, :lo12:.LC15
 	bl	_dev_info
-.LVL189:
-	.loc 1 3100 0
+.LVL153:
+	.loc 1 3099 0
 	mov	x0, 0
 	b	.L134
-.LVL190:
 	.p2align 3
-.L152:
-.LBB1217:
-.LBB1218:
+.L148:
+.LBB1190:
+.LBB1191:
+.LBB1192:
+.LBB1193:
+.LBB1194:
+.LBB1195:
+.LBB1196:
+	.loc 4 19 0
+#APP
+// 19 "./arch/arm64/include/asm/current.h" 1
+	mrs x0, sp_el0
+// 0 "" 2
+.LVL154:
+#NO_APP
+.LBE1196:
+.LBE1195:
+	.loc 5 85 0
+	ldr	w2, [x0, 52]
+	.loc 5 77 0
+	ldr	x1, [x0, 8]
+.LVL155:
+	.loc 5 84 0
+	tbz	x2, 21, .L266
+.LVL156:
+.L180:
+.LBB1197:
+.LBB1198:
+.LBB1199:
+	.loc 7 157 0
+	sbfx	x0, x21, 0, 56
+.LVL157:
+.LBE1199:
+.LBE1198:
+	.loc 5 86 0
+	and	x0, x0, x21
+.LVL158:
+.L181:
+.LBE1197:
+	.loc 5 89 0
+#APP
+// 89 "./arch/arm64/include/asm/uaccess.h" 1
+		adds	x0, x0, 64
+	csel	x1, xzr, x1, hi
+	csinv	x0, x0, xzr, cc
+	sbcs	xzr, x0, x1
+	cset	x0, ls
+
+// 0 "" 2
+.LVL159:
+#NO_APP
+.LBE1194:
+.LBE1193:
+	.loc 8 114 0
+	cbz	x0, .L259
+.LBB1205:
+.LBB1206:
+.LBB1207:
+.LBB1208:
+.LBB1209:
+	.loc 7 157 0
+	sbfx	x0, x21, 0, 56
+.LVL160:
+.LBE1209:
+.LBE1208:
+.LBE1207:
+.LBB1210:
+.LBB1211:
+	.loc 4 19 0
+#APP
+// 19 "./arch/arm64/include/asm/current.h" 1
+	mrs x1, sp_el0
+// 0 "" 2
+.LVL161:
+#NO_APP
+.LBE1211:
+.LBE1210:
+.LBB1212:
+	.loc 5 254 0
+	and	x0, x0, x21
+.LVL162:
+.LBE1212:
+	.loc 5 249 0
+	ldr	x2, [x1, 8]
+#APP
+// 249 "./arch/arm64/include/asm/uaccess.h" 1
+		bics	xzr, x0, x2
+	csel	x1, x21, xzr, eq
+
+// 0 "" 2
+.LVL163:
+	.loc 5 257 0
+// 257 "./arch/arm64/include/asm/uaccess.h" 1
+	hint #20
+// 0 "" 2
+#NO_APP
+.LBE1206:
+.LBE1205:
+	.loc 8 116 0
+	mov	x2, 64
+	add	x0, x29, 88
+.LVL164:
+	bl	__arch_copy_from_user
+.LVL165:
+	.loc 8 118 0
+	cbnz	x0, .L259
+.LBE1192:
+.LBE1191:
+.LBE1190:
+	.loc 1 3024 0
+	bl	ebc_osd_buf_clone
+.LVL166:
+	mov	x1, x0
+	.loc 1 3025 0
+	cbz	x0, .L258
+	.loc 1 3026 0
+	ldr	w6, [x29, 92]
+	.loc 1 3034 0
+	add	x20, x20, 192
+	.loc 1 3030 0
+	ldp	w5, w3, [x29, 108]
+	.loc 1 3026 0
+	str	w6, [x1, 40]
+	.loc 1 3031 0
+	ldp	w4, w2, [x29, 116]
+	.loc 1 3030 0
+	stp	w5, w3, [x1, 48]
+	.loc 1 3031 0
+	stp	w4, w2, [x1, 56]
+	.loc 1 3033 0
+	bl	ebc_add_to_osd_buf_list
+.LVL167:
+	.loc 1 3034 0
+	ldr	w0, [x20, 100]
+	cbnz	w0, .L258
+	.loc 1 3035 0
+	mov	w2, 1
+	str	w2, [x20, 100]
+	.loc 1 3036 0
+	adrp	x0, .LANCHOR1
+	add	x0, x0, :lo12:.LANCHOR1
+	add	x0, x0, 304
+	mov	w1, w2
+	bl	__wake_up_sync
+.LVL168:
+	mov	x0, 0
+	b	.L134
+	.p2align 3
+.L147:
+	.loc 1 2959 0
+	bl	ebc_empty_osd_buf_get
+.LVL169:
+	.loc 1 2960 0
+	cbz	x0, .L166
+	.loc 1 2963 0
+	ldr	x22, [x0, 8]
+	bl	ebc_phy_buf_base_get
+.LVL170:
 .LBB1219:
 .LBB1220:
 .LBB1221:
 .LBB1222:
 .LBB1223:
+.LBB1224:
+.LBB1225:
 	.loc 4 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
-	mrs x0, sp_el0
+	mrs x1, sp_el0
 // 0 "" 2
-.LVL191:
+.LVL171:
 #NO_APP
+.LBE1225:
+.LBE1224:
+	.loc 5 85 0
+	ldr	w2, [x1, 52]
 .LBE1223:
 .LBE1222:
-	.loc 5 85 0
-	ldr	w2, [x0, 52]
 .LBE1221:
 .LBE1220:
 .LBE1219:
-.LBE1218:
-.LBE1217:
-	.loc 1 3083 0
-	add	x22, x20, 280
-.LBB1252:
-.LBB1248:
-.LBB1244:
-.LBB1233:
-.LBB1230:
-	.loc 5 77 0
-	ldr	x1, [x0, 8]
-.LVL192:
-	.loc 5 84 0
-	tbz	x2, 21, .L266
-.LVL193:
-.L195:
-.LBB1224:
-.LBB1225:
-.LBB1226:
-	.loc 6 157 0
-	sbfx	x0, x21, 0, 56
-.LVL194:
-.LBE1226:
-.LBE1225:
-	.loc 5 86 0
-	and	x0, x0, x21
-.LVL195:
-.L196:
-.LBE1224:
-	.loc 5 89 0
-#APP
-// 89 "./arch/arm64/include/asm/uaccess.h" 1
-		adds	x0, x0, 4
-	csel	x1, xzr, x1, hi
-	csinv	x0, x0, xzr, cc
-	sbcs	xzr, x0, x1
-	cset	x0, ls
-
-// 0 "" 2
-.LVL196:
-#NO_APP
-	mov	x3, x0
-.LBE1230:
-.LBE1233:
-	.loc 7 114 0
-	cbz	x0, .L218
-.LBB1234:
-.LBB1235:
-.LBB1236:
-.LBB1237:
-.LBB1238:
-	.loc 6 157 0
-	sbfx	x0, x21, 0, 56
-.LBE1238:
-.LBE1237:
-.LBE1236:
-.LBB1239:
-.LBB1240:
-	.loc 4 19 0
-#APP
-// 19 "./arch/arm64/include/asm/current.h" 1
-	mrs x1, sp_el0
-// 0 "" 2
-.LVL197:
-#NO_APP
-.LBE1240:
-.LBE1239:
-.LBB1241:
-	.loc 5 254 0
-	and	x0, x0, x21
-.LVL198:
-.LBE1241:
-	.loc 5 249 0
-	ldr	x2, [x1, 8]
-#APP
-// 249 "./arch/arm64/include/asm/uaccess.h" 1
-		bics	xzr, x0, x2
-	csel	x1, x21, xzr, eq
-
-// 0 "" 2
-.LVL199:
-	.loc 5 257 0
-// 257 "./arch/arm64/include/asm/uaccess.h" 1
-	hint #20
-// 0 "" 2
-#NO_APP
-.LBE1235:
-.LBE1234:
-	.loc 7 116 0
-	mov	x2, 4
-	mov	x0, x22
-.LVL200:
-	bl	__arch_copy_from_user
-.LVL201:
-	.loc 7 118 0
-	cbnz	x0, .L267
-.LBE1244:
-.LBE1248:
-.LBE1252:
-	.loc 1 3087 0
-	ldr	x0, [x20, 296]
-.LVL202:
-	adrp	x1, .LC16
-	ldr	w2, [x20, 280]
-	add	x1, x1, :lo12:.LC16
-	bl	_dev_info
-.LVL203:
-	.loc 1 3088 0
-	mov	x0, 0
-	b	.L134
-.LVL204:
-	.p2align 3
-.L157:
-	.loc 1 3045 0
-	ldr	x0, [x20, 296]
-	.loc 1 3044 0
-	mov	w2, 1
-	str	w2, [x20, 816]
-	.loc 1 3045 0
-	adrp	x1, .LC5
-.LVL205:
-	add	x1, x1, :lo12:.LC5
-	bl	_dev_info
-.LVL206:
-	.loc 1 3046 0
-	mov	x0, 0
-	b	.L134
-.LVL207:
-	.p2align 3
-.L156:
-	.loc 1 3037 0
-	ldr	x0, [x20, 296]
-	.loc 1 3036 0
-	mov	w2, 1
-	str	w2, [x20, 812]
-	.loc 1 3037 0
-	adrp	x1, .LC3
-.LVL208:
-	add	x1, x1, :lo12:.LC3
-	bl	_dev_info
-.LVL209:
-	.loc 1 3038 0
-	mov	x0, 0
-	b	.L134
-.LVL210:
-	.p2align 3
-.L258:
-	.loc 1 2955 0
-	bl	ebc_empty_osd_buf_get
-.LVL211:
-	.loc 1 2956 0
-	cbz	x0, .L168
-	.loc 1 2959 0
-	ldr	x22, [x0, 8]
-	bl	ebc_phy_buf_base_get
-.LVL212:
-.LBB1253:
-.LBB1254:
-.LBB1255:
-.LBB1256:
-.LBB1257:
-.LBB1258:
-.LBB1259:
-	.loc 4 19 0
-#APP
-// 19 "./arch/arm64/include/asm/current.h" 1
-	mrs x1, sp_el0
-// 0 "" 2
-.LVL213:
-#NO_APP
-.LBE1259:
-.LBE1258:
-	.loc 5 85 0
-	ldr	w2, [x1, 52]
-.LBE1257:
-.LBE1256:
-.LBE1255:
-.LBE1254:
-.LBE1253:
-	.loc 1 2959 0
-	sub	w0, w22, w0
 	.loc 1 2963 0
+	sub	w0, w22, w0
+	.loc 1 2967 0
 	ldp	w5, w4, [x20, 108]
-	.loc 1 2961 0
-	str	w0, [x29, 88]
-	.loc 1 2964 0
-	ldr	w3, [x20, 176]
-	.loc 1 2962 0
-	stp	w4, w5, [x29, 96]
-	.loc 1 2964 0
-	str	w3, [x29, 104]
 	.loc 1 2965 0
+	str	w0, [x29, 88]
+	.loc 1 2968 0
+	ldr	w3, [x20, 176]
+	.loc 1 2966 0
+	stp	w4, w5, [x29, 96]
+	.loc 1 2968 0
+	str	w3, [x29, 104]
+	.loc 1 2969 0
 	str	wzr, [x29, 132]
-.LBB1286:
-.LBB1283:
-.LBB1280:
-.LBB1269:
-.LBB1266:
+.LBB1252:
+.LBB1249:
+.LBB1246:
+.LBB1235:
+.LBB1232:
 	.loc 5 77 0
 	ldr	x0, [x1, 8]
-.LVL214:
+.LVL172:
 	.loc 5 84 0
-	tbz	x2, 21, .L268
-.LVL215:
-.L160:
-.LBB1260:
-.LBB1261:
-.LBB1262:
-	.loc 6 157 0
+	tbz	x2, 21, .L267
+.LVL173:
+.L159:
+.LBB1226:
+.LBB1227:
+.LBB1228:
+	.loc 7 157 0
 	sbfx	x1, x21, 0, 56
-.LVL216:
-.LBE1262:
-.LBE1261:
+.LVL174:
+.LBE1228:
+.LBE1227:
 	.loc 5 86 0
 	and	x1, x1, x21
-.LVL217:
-.L161:
-.LBE1260:
+.LVL175:
+.L160:
+.LBE1226:
 	.loc 5 89 0
 #APP
 // 89 "./arch/arm64/include/asm/uaccess.h" 1
@@ -2366,139 +2122,151 @@
 	cset	x1, ls
 
 // 0 "" 2
-.LVL218:
+.LVL176:
 #NO_APP
-.LBE1266:
-.LBE1269:
-	.loc 7 132 0
+.LBE1232:
+.LBE1235:
+	.loc 8 132 0
 	mov	x0, 64
-.LVL219:
+.LVL177:
 	cbz	x1, .L134
-.LBB1270:
-.LBB1271:
-.LBB1272:
-.LBB1273:
-.LBB1274:
-	.loc 6 157 0
+.LBB1236:
+.LBB1237:
+.LBB1238:
+.LBB1239:
+.LBB1240:
+	.loc 7 157 0
 	sbfx	x1, x21, 0, 56
-.LVL220:
-.LBE1274:
-.LBE1273:
-.LBE1272:
-.LBB1275:
-.LBB1276:
+.LVL178:
+.LBE1240:
+.LBE1239:
+.LBE1238:
+.LBB1241:
+.LBB1242:
 	.loc 4 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
 	mrs x2, sp_el0
 // 0 "" 2
-.LVL221:
+.LVL179:
 #NO_APP
-.LBE1276:
-.LBE1275:
-.LBB1277:
+.LBE1242:
+.LBE1241:
+.LBB1243:
 	.loc 5 254 0
 	and	x1, x1, x21
-.LVL222:
-.LBE1277:
+.LVL180:
+.LBE1243:
 	.loc 5 249 0
 	ldr	x2, [x2, 8]
-.LVL223:
+.LVL181:
 #APP
 // 249 "./arch/arm64/include/asm/uaccess.h" 1
 		bics	xzr, x1, x2
 	csel	x3, x21, xzr, eq
 
 // 0 "" 2
-.LVL224:
+.LVL182:
 	.loc 5 257 0
 // 257 "./arch/arm64/include/asm/uaccess.h" 1
 	hint #20
 // 0 "" 2
 #NO_APP
-.LBE1271:
-.LBE1270:
-	.loc 7 134 0
+.LBE1237:
+.LBE1236:
+	.loc 8 134 0
 	mov	x2, x0
 	add	x1, x29, 88
-.LVL225:
+.LVL183:
 	mov	x0, x3
 	bl	__arch_copy_to_user
-.LVL226:
+.LVL184:
 	sxtw	x0, w0
 	b	.L134
-.LVL227:
 	.p2align 3
-.L147:
-.LBE1280:
-.LBE1283:
-.LBE1286:
-	.loc 1 3057 0
+.L146:
+.LBE1246:
+.LBE1249:
+.LBE1252:
+	.loc 1 3062 0
 	ldr	x0, [x20, 296]
 	adrp	x1, .LC8
-.LVL228:
-	.loc 1 3056 0
-	str	wzr, [x20, 804]
-	.loc 1 3057 0
+	.loc 1 3061 0
+	str	wzr, [x20, 788]
+	.loc 1 3062 0
 	add	x1, x1, :lo12:.LC8
 	bl	_dev_info
-.LVL229:
-	.loc 1 3058 0
+.LVL185:
+	.loc 1 3063 0
 	mov	x0, 0
 	b	.L134
-.LVL230:
 	.p2align 3
-.L142:
-.LBB1287:
-.LBB1288:
-.LBB1289:
-.LBB1290:
-.LBB1291:
-.LBB1292:
-.LBB1293:
+.L145:
+	.loc 1 3058 0
+	ldr	x0, [x20, 296]
+	.loc 1 3057 0
+	mov	w2, 1
+	str	w2, [x20, 788]
+	.loc 1 3058 0
+	adrp	x1, .LC7
+	add	x1, x1, :lo12:.LC7
+	bl	_dev_info
+.LVL186:
+	.loc 1 3059 0
+	mov	x0, 0
+	b	.L134
+	.p2align 3
+.L144:
+.LBB1253:
+.LBB1254:
+.LBB1255:
+.LBB1256:
+.LBB1257:
+.LBB1258:
+.LBB1259:
 	.loc 4 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
 	mrs x0, sp_el0
 // 0 "" 2
-.LVL231:
+.LVL187:
 #NO_APP
-.LBE1293:
-.LBE1292:
+.LBE1259:
+.LBE1258:
 	.loc 5 85 0
 	ldr	w2, [x0, 52]
-.LBE1291:
-.LBE1290:
-.LBE1289:
-.LBE1288:
-.LBE1287:
-	.loc 1 3063 0
+.LBE1257:
+.LBE1256:
+.LBE1255:
+.LBE1254:
+.LBE1253:
+	.loc 1 3074 0
 	add	x22, x20, 276
-.LBB1322:
-.LBB1318:
-.LBB1314:
-.LBB1303:
-.LBB1300:
+.LBB1288:
+.LBB1284:
+.LBB1280:
+.LBB1269:
+.LBB1266:
 	.loc 5 77 0
 	ldr	x1, [x0, 8]
-.LVL232:
+.LVL188:
 	.loc 5 84 0
-	tbz	x2, 21, .L269
-.LVL233:
-.L187:
-.LBB1294:
-.LBB1295:
-.LBB1296:
-	.loc 6 157 0
+	tbz	x2, 21, .L268
+.LVL189:
+.L189:
+.LBB1260:
+.LBB1261:
+.LBB1262:
+	.loc 7 157 0
 	sbfx	x0, x21, 0, 56
-.LVL234:
-.LBE1296:
-.LBE1295:
+.LVL190:
+.LBE1262:
+.LBE1261:
 	.loc 5 86 0
 	and	x0, x0, x21
-.LVL235:
-.L188:
-.LBE1294:
+.LVL191:
+.L190:
+.LBE1260:
 	.loc 5 89 0
 #APP
 // 89 "./arch/arm64/include/asm/uaccess.h" 1
@@ -2509,39 +2277,39 @@
 	cset	x0, ls
 
 // 0 "" 2
-.LVL236:
+.LVL192:
 #NO_APP
 	mov	x3, x0
-.LBE1300:
-.LBE1303:
-	.loc 7 114 0
-	cbz	x0, .L215
-.LBB1304:
-.LBB1305:
-.LBB1306:
-.LBB1307:
-.LBB1308:
-	.loc 6 157 0
+.LBE1266:
+.LBE1269:
+	.loc 8 114 0
+	cbz	x0, .L220
+.LBB1270:
+.LBB1271:
+.LBB1272:
+.LBB1273:
+.LBB1274:
+	.loc 7 157 0
 	sbfx	x0, x21, 0, 56
-.LBE1308:
-.LBE1307:
-.LBE1306:
-.LBB1309:
-.LBB1310:
+.LBE1274:
+.LBE1273:
+.LBE1272:
+.LBB1275:
+.LBB1276:
 	.loc 4 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
 	mrs x1, sp_el0
 // 0 "" 2
-.LVL237:
+.LVL193:
 #NO_APP
-.LBE1310:
-.LBE1309:
-.LBB1311:
+.LBE1276:
+.LBE1275:
+.LBB1277:
 	.loc 5 254 0
 	and	x0, x0, x21
-.LVL238:
-.LBE1311:
+.LVL194:
+.LBE1277:
 	.loc 5 249 0
 	ldr	x2, [x1, 8]
 #APP
@@ -2550,116 +2318,98 @@
 	csel	x1, x21, xzr, eq
 
 // 0 "" 2
-.LVL239:
+.LVL195:
 	.loc 5 257 0
 // 257 "./arch/arm64/include/asm/uaccess.h" 1
 	hint #20
 // 0 "" 2
 #NO_APP
-.LBE1305:
-.LBE1304:
-	.loc 7 116 0
+.LBE1271:
+.LBE1270:
+	.loc 8 116 0
 	mov	x2, 4
 	mov	x0, x22
-.LVL240:
+.LVL196:
 	bl	__arch_copy_from_user
-.LVL241:
-	.loc 7 118 0
-	cbnz	x0, .L270
-.LBE1314:
-.LBE1318:
-.LBE1322:
-	.loc 1 3067 0
+.LVL197:
+	.loc 8 118 0
+	cbnz	x0, .L269
+.LBE1280:
+.LBE1284:
+.LBE1288:
+	.loc 1 3078 0
 	ldr	x0, [x20, 296]
-.LVL242:
-	adrp	x1, .LC15
-	ldr	w2, [x20, 276]
-	add	x1, x1, :lo12:.LC15
-	bl	_dev_info
-.LVL243:
-	.loc 1 3068 0
-	mov	x0, 0
-	b	.L134
-.LVL244:
-	.p2align 3
-.L139:
-	.loc 1 3102 0
-	ldr	x0, [x20, 296]
-	adrp	x2, .LANCHOR2
+.LVL198:
 	adrp	x1, .LC14
-.LVL245:
-	add	x2, x2, :lo12:.LANCHOR2
+	ldr	w2, [x20, 276]
 	add	x1, x1, :lo12:.LC14
-	bl	_dev_err
-.LVL246:
-	.loc 1 3103 0
+	bl	_dev_info
+.LVL199:
+	.loc 1 3079 0
 	mov	x0, 0
-	.loc 1 3106 0
 	b	.L134
-.LVL247:
 	.p2align 3
-.L145:
-.LBB1323:
-.LBB1324:
-.LBB1325:
-.LBB1326:
-.LBB1327:
-.LBB1328:
-.LBB1329:
+.L143:
+.LBB1289:
+.LBB1290:
+.LBB1291:
+.LBB1292:
+.LBB1293:
+.LBB1294:
+.LBB1295:
 	.loc 4 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
 	mrs x2, sp_el0
 // 0 "" 2
-.LVL248:
+.LVL200:
 #NO_APP
-.LBE1329:
-.LBE1328:
+.LBE1295:
+.LBE1294:
 	.loc 5 85 0
 	ldr	w3, [x2, 52]
-.LBE1327:
-.LBE1326:
-.LBE1325:
-.LBE1324:
-.LBE1323:
-	.loc 1 3074 0
+.LBE1293:
+.LBE1292:
+.LBE1291:
+.LBE1290:
+.LBE1289:
+	.loc 1 3085 0
 	ldp	w1, w0, [x20, 116]
-.LVL249:
 	stp	w1, w0, [x29, 124]
-	.loc 1 3071 0
+	.loc 1 3082 0
 	ldp	w6, w5, [x20, 108]
-	.loc 1 3070 0
+	.loc 1 3081 0
 	stp	w5, w6, [x29, 96]
-	.loc 1 3072 0
+	.loc 1 3083 0
 	ldr	w4, [x20, 176]
 	str	w4, [x29, 104]
-	.loc 1 3075 0
+	.loc 1 3086 0
 	str	wzr, [x29, 132]
-.LBB1358:
-.LBB1354:
-.LBB1350:
-.LBB1339:
-.LBB1336:
+.LBB1324:
+.LBB1320:
+.LBB1316:
+.LBB1305:
+.LBB1302:
 	.loc 5 77 0
 	ldr	x1, [x2, 8]
-.LVL250:
+.LVL201:
 	.loc 5 84 0
-	tbz	x3, 21, .L271
-.LVL251:
-.L191:
-.LBB1330:
-.LBB1331:
-.LBB1332:
-	.loc 6 157 0
+	tbz	x3, 21, .L270
+.LVL202:
+.L193:
+.LBB1296:
+.LBB1297:
+.LBB1298:
+	.loc 7 157 0
 	sbfx	x0, x21, 0, 56
-.LVL252:
-.LBE1332:
-.LBE1331:
+.LVL203:
+.LBE1298:
+.LBE1297:
 	.loc 5 86 0
 	and	x0, x0, x21
-.LVL253:
-.L192:
-.LBE1330:
+.LVL204:
+.L194:
+.LBE1296:
 	.loc 5 89 0
 #APP
 // 89 "./arch/arm64/include/asm/uaccess.h" 1
@@ -2670,68 +2420,67 @@
 	cset	x0, ls
 
 // 0 "" 2
-.LVL254:
+.LVL205:
 #NO_APP
-.LBE1336:
-.LBE1339:
-	.loc 7 132 0
-	cbnz	x0, .L193
-.L194:
-.LBE1350:
-.LBE1354:
-.LBE1358:
-	.loc 1 3078 0
+.LBE1302:
+.LBE1305:
+	.loc 8 132 0
+	cbnz	x0, .L195
+.L196:
+.LBE1316:
+.LBE1320:
+.LBE1324:
+	.loc 1 3089 0
 	ldr	x0, [x20, 296]
-.LVL255:
+.LVL206:
 	adrp	x1, .LC10
-.LVL256:
+.LVL207:
 	add	x1, x1, :lo12:.LC10
 	bl	_dev_err
-.LVL257:
-	.loc 1 3079 0
+.LVL208:
+	.loc 1 3090 0
 	mov	x0, -14
 	b	.L134
-.LVL258:
 	.p2align 3
-.L144:
-.LBB1359:
-.LBB1360:
-.LBB1361:
-.LBB1362:
-.LBB1363:
-.LBB1364:
-.LBB1365:
+.L142:
+.LBB1325:
+.LBB1326:
+.LBB1327:
+.LBB1328:
+.LBB1329:
+.LBB1330:
+.LBB1331:
 	.loc 4 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
 	mrs x0, sp_el0
 // 0 "" 2
-.LVL259:
+.LVL209:
 #NO_APP
-.LBE1365:
-.LBE1364:
+.LBE1331:
+.LBE1330:
 	.loc 5 85 0
 	ldr	w2, [x0, 52]
 	.loc 5 77 0
 	ldr	x1, [x0, 8]
-.LVL260:
+.LVL210:
 	.loc 5 84 0
-	tbz	x2, 21, .L272
-.LVL261:
-.L175:
-.LBB1366:
-.LBB1367:
-.LBB1368:
-	.loc 6 157 0
+	tbz	x2, 21, .L271
+.LVL211:
+.L173:
+.LBB1332:
+.LBB1333:
+.LBB1334:
+	.loc 7 157 0
 	sbfx	x0, x21, 0, 56
-.LVL262:
-.LBE1368:
-.LBE1367:
+.LVL212:
+.LBE1334:
+.LBE1333:
 	.loc 5 86 0
 	and	x0, x0, x21
-.LVL263:
-.L176:
-.LBE1366:
+.LVL213:
+.L174:
+.LBE1332:
 	.loc 5 89 0
 #APP
 // 89 "./arch/arm64/include/asm/uaccess.h" 1
@@ -2742,39 +2491,39 @@
 	cset	x0, ls
 
 // 0 "" 2
-.LVL264:
+.LVL214:
 #NO_APP
-.LBE1363:
-.LBE1362:
-	.loc 7 114 0
-	cbz	x0, .L249
-.LBB1374:
-.LBB1375:
-.LBB1376:
-.LBB1377:
-.LBB1378:
-	.loc 6 157 0
+.LBE1329:
+.LBE1328:
+	.loc 8 114 0
+	cbz	x0, .L259
+.LBB1340:
+.LBB1341:
+.LBB1342:
+.LBB1343:
+.LBB1344:
+	.loc 7 157 0
 	sbfx	x0, x21, 0, 56
-.LVL265:
-.LBE1378:
-.LBE1377:
-.LBE1376:
-.LBB1379:
-.LBB1380:
+.LVL215:
+.LBE1344:
+.LBE1343:
+.LBE1342:
+.LBB1345:
+.LBB1346:
 	.loc 4 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
 	mrs x1, sp_el0
 // 0 "" 2
-.LVL266:
+.LVL216:
 #NO_APP
-.LBE1380:
-.LBE1379:
-.LBB1381:
+.LBE1346:
+.LBE1345:
+.LBB1347:
 	.loc 5 254 0
 	and	x0, x0, x21
-.LVL267:
-.LBE1381:
+.LVL217:
+.LBE1347:
 	.loc 5 249 0
 	ldr	x2, [x1, 8]
 #APP
@@ -2783,684 +2532,1060 @@
 	csel	x1, x21, xzr, eq
 
 // 0 "" 2
-.LVL268:
+.LVL218:
 	.loc 5 257 0
 // 257 "./arch/arm64/include/asm/uaccess.h" 1
 	hint #20
 // 0 "" 2
 #NO_APP
-.LBE1375:
-.LBE1374:
-	.loc 7 116 0
+.LBE1341:
+.LBE1340:
+	.loc 8 116 0
 	mov	x2, 64
 	add	x0, x29, 88
-.LVL269:
+.LVL219:
 	bl	__arch_copy_from_user
-.LVL270:
-	.loc 7 118 0
-	cbnz	x0, .L249
-.LBE1361:
-.LBE1360:
-.LBE1359:
-	.loc 1 2997 0
+.LVL220:
+	.loc 8 118 0
+	cbnz	x0, .L259
+.LBE1327:
+.LBE1326:
+.LBE1325:
+	.loc 1 3001 0
 	bl	ebc_phy_buf_base_get
-.LVL271:
+.LVL221:
 	ldrsw	x1, [x29, 88]
-	.loc 1 2998 0
+	.loc 1 3002 0
 	add	x0, x1, x0
 	bl	ebc_find_buf_by_phy_addr
-.LVL272:
-	mov	x1, x0
-	.loc 1 2999 0
-	cbz	x0, .L248
-	.loc 1 3000 0
-	ldr	w2, [x29, 92]
-	.loc 1 3008 0
-	add	x20, x20, 192
-	.loc 1 3000 0
-	str	w2, [x1, 40]
+.LVL222:
+	mov	x21, x0
+.LVL223:
+	.loc 1 3003 0
+	cbz	x0, .L258
 	.loc 1 3004 0
-	ldp	w6, w3, [x29, 108]
-	stp	w6, w3, [x1, 48]
-	.loc 1 3003 0
-	ldr	w4, [x29, 116]
-	.loc 1 3005 0
-	ldr	w2, [x29, 120]
-	.loc 1 3001 0
-	ldr	w5, [x29, 132]
-	.loc 1 3003 0
-	str	w4, [x1, 56]
-	.loc 1 3001 0
-	stp	w2, w5, [x1, 60]
-	.loc 1 3007 0
-	bl	ebc_add_to_dsp_buf_list
-.LVL273:
+	ldr	w1, [x29, 92]
+	.loc 1 3012 0
+	add	x20, x20, 192
+	.loc 1 3004 0
+	str	w1, [x21, 40]
 	.loc 1 3008 0
-	str	wzr, [x20, 256]
+	ldp	w4, w2, [x29, 108]
+	stp	w4, w2, [x21, 48]
+	.loc 1 3007 0
+	ldr	w3, [x29, 116]
 	.loc 1 3009 0
+	ldr	w1, [x29, 120]
+	.loc 1 3005 0
+	ldr	w5, [x29, 132]
+	.loc 1 3007 0
+	str	w3, [x21, 56]
+	.loc 1 3005 0
+	stp	w1, w5, [x21, 60]
+	.loc 1 3011 0
+	bl	ebc_add_to_dsp_buf_list
+.LVL224:
+	.loc 1 3012 0
 	ldr	w0, [x20, 100]
-	cbnz	w0, .L248
-.L250:
-	.loc 1 3030 0
-	mov	w2, 1
-	str	w2, [x20, 100]
-	.loc 1 3031 0
-	adrp	x0, .LANCHOR1
-	add	x0, x0, :lo12:.LANCHOR1
-	add	x0, x0, 304
-	mov	w1, w2
-	bl	__wake_up_sync
-.LVL274:
+	cbz	w0, .L272
+.L178:
+	.loc 1 3016 0
+	ldr	w0, [x21, 40]
+	sub	w0, w0, #18
+	tst	w0, -3
+	bne	.L258
+	.loc 1 3017 0
+	mov	w1, 1
 	mov	x0, 0
+	str	w1, [x20, 612]
 	b	.L134
-.LVL275:
+.LVL225:
 	.p2align 3
-.L271:
-.LBB1388:
+.L140:
+.LBB1354:
 .LBB1355:
-.LBB1351:
-.LBB1340:
-.LBB1337:
-.LBB1333:
-.LBB1334:
-.LBB1335:
-	.loc 8 106 0
-	ldr	x2, [x2]
-.LVL276:
-.LBE1335:
-.LBE1334:
-.LBE1333:
-.LBE1337:
-.LBE1340:
-.LBE1351:
-.LBE1355:
-.LBE1388:
-	.loc 1 2925 0
-	mov	x0, x21
-.LVL277:
-.LBB1389:
 .LBB1356:
-.LBB1352:
-.LBB1341:
-.LBB1338:
+.LBB1357:
+.LBB1358:
+.LBB1359:
+.LBB1360:
+	.loc 4 19 0
+#APP
+// 19 "./arch/arm64/include/asm/current.h" 1
+	mrs x0, sp_el0
+// 0 "" 2
+.LVL226:
+#NO_APP
+.LBE1360:
+.LBE1359:
+	.loc 5 85 0
+	ldr	w2, [x0, 52]
+	.loc 5 77 0
+	ldr	x1, [x0, 8]
+.LVL227:
 	.loc 5 84 0
-	tbz	x2, 26, .L192
-	b	.L191
-.LVL278:
-	.p2align 3
-.L260:
-.LBE1338:
-.LBE1341:
-.LBE1352:
-.LBE1356:
-.LBE1389:
-.LBB1390:
-.LBB1088:
-.LBB1085:
-.LBB1083:
-.LBB1073:
-.LBB1070:
-.LBB1071:
-.LBB1072:
-	.loc 8 106 0
-	ldr	x2, [x0]
-.LBE1072:
-.LBE1071:
-.LBE1070:
-.LBE1073:
-.LBE1083:
-.LBE1085:
-.LBE1088:
-.LBE1390:
-	.loc 1 2925 0
-	mov	x0, x21
-.LVL279:
-.LBB1391:
-.LBB1089:
-.LBB1086:
-.LBB1084:
-.LBB1074:
-	.loc 5 84 0
-	tbz	x2, 26, .L165
-	b	.L164
-.LVL280:
-	.p2align 3
-.L272:
-.LBE1074:
-.LBE1084:
-.LBE1086:
-.LBE1089:
-.LBE1391:
-.LBB1392:
-.LBB1386:
-.LBB1384:
-.LBB1382:
-.LBB1372:
+	tbz	x2, 21, .L273
+.LVL228:
+.L162:
+.LBB1361:
+.LBB1362:
+.LBB1363:
+	.loc 7 157 0
+	sbfx	x0, x21, 0, 56
+.LVL229:
+.LBE1363:
+.LBE1362:
+	.loc 5 86 0
+	and	x0, x0, x21
+.LVL230:
+.L163:
+.LBE1361:
+	.loc 5 89 0
+#APP
+// 89 "./arch/arm64/include/asm/uaccess.h" 1
+		adds	x0, x0, 64
+	csel	x1, xzr, x1, hi
+	csinv	x0, x0, xzr, cc
+	sbcs	xzr, x0, x1
+	cset	x0, ls
+
+// 0 "" 2
+.LVL231:
+#NO_APP
+.LBE1358:
+.LBE1357:
+	.loc 8 114 0
+	cbz	x0, .L259
 .LBB1369:
 .LBB1370:
 .LBB1371:
-	.loc 8 106 0
-	ldr	x2, [x0]
+.LBB1372:
+.LBB1373:
+	.loc 7 157 0
+	lsl	x23, x21, 8
+.LBE1373:
+.LBE1372:
 .LBE1371:
+.LBB1374:
+.LBB1375:
+	.loc 4 19 0
+#APP
+// 19 "./arch/arm64/include/asm/current.h" 1
+	mrs x0, sp_el0
+// 0 "" 2
+.LVL232:
+#NO_APP
+.LBE1375:
+.LBE1374:
+.LBB1376:
+	.loc 5 254 0
+	and	x2, x21, x23, asr 8
+.LVL233:
+.LBE1376:
+	.loc 5 249 0
+	ldr	x0, [x0, 8]
+.LVL234:
+#APP
+// 249 "./arch/arm64/include/asm/uaccess.h" 1
+		bics	xzr, x2, x0
+	csel	x1, x21, xzr, eq
+
+// 0 "" 2
+.LVL235:
+	.loc 5 257 0
+// 257 "./arch/arm64/include/asm/uaccess.h" 1
+	hint #20
+// 0 "" 2
+#NO_APP
 .LBE1370:
 .LBE1369:
-.LBE1372:
-.LBE1382:
-.LBE1384:
-.LBE1386:
-.LBE1392:
-	.loc 1 2925 0
-	mov	x0, x21
-.LVL281:
-.LBB1393:
-.LBB1387:
+	.loc 8 116 0
+	add	x24, x29, 88
+	mov	x2, 64
+.LVL236:
+	mov	x0, x24
+	bl	__arch_copy_from_user
+.LVL237:
+	mov	x22, x0
+.LVL238:
+	.loc 8 118 0
+	cbnz	x0, .L165
+.L168:
+.LBE1356:
+.LBE1355:
+.LBE1354:
+	.loc 1 2978 0
+	add	x0, x24, 48
+	bl	ebc_empty_buf_get
+.LVL239:
+	mov	x25, x0
+	.loc 1 2979 0
+	cbz	x0, .L166
+	.loc 1 2982 0
+	ldr	x22, [x0, 8]
+.LVL240:
+	bl	ebc_phy_buf_base_get
+.LVL241:
+	.loc 1 2986 0
+	ldp	w3, w1, [x20, 108]
+	.loc 1 2985 0
+	stp	w1, w3, [x29, 96]
 .LBB1385:
-.LBB1383:
-.LBB1373:
-	.loc 5 84 0
-	tbz	x2, 26, .L176
-	b	.L175
-.LVL282:
-	.p2align 3
-.L262:
-.LBE1373:
-.LBE1383:
-.LBE1385:
+.LBB1386:
+.LBB1387:
+.LBB1388:
+.LBB1389:
+.LBB1390:
+.LBB1391:
+	.loc 4 19 0
+#APP
+// 19 "./arch/arm64/include/asm/current.h" 1
+	mrs x2, sp_el0
+// 0 "" 2
+.LVL242:
+#NO_APP
+.LBE1391:
+.LBE1390:
+	.loc 5 85 0
+	ldr	w3, [x2, 52]
+.LBE1389:
+.LBE1388:
 .LBE1387:
-.LBE1393:
-.LBB1394:
-.LBB1150:
-.LBB1148:
-.LBB1146:
-.LBB1136:
-.LBB1133:
-.LBB1134:
-.LBB1135:
-	.loc 8 106 0
-	ldr	x2, [x0]
-.LBE1135:
-.LBE1134:
-.LBE1133:
-.LBE1136:
-.LBE1146:
-.LBE1148:
-.LBE1150:
-.LBE1394:
-	.loc 1 2925 0
-	mov	x0, x21
-.LVL283:
-.LBB1395:
-.LBB1151:
-.LBB1149:
-.LBB1147:
-.LBB1137:
-	.loc 5 84 0
-	tbz	x2, 26, .L182
-	b	.L181
-.LVL284:
-	.p2align 3
-.L263:
-.LBE1137:
-.LBE1147:
-.LBE1149:
-.LBE1151:
-.LBE1395:
-.LBB1396:
-.LBB1179:
-.LBB1177:
-.LBB1175:
-.LBB1165:
-.LBB1162:
-.LBB1163:
-.LBB1164:
-	.loc 8 106 0
-	ldr	x2, [x1]
-.LBE1164:
-.LBE1163:
-.LBE1162:
-.LBE1165:
-.LBE1175:
-.LBE1177:
-.LBE1179:
-.LBE1396:
-	.loc 1 2925 0
-	mov	x1, x21
-.LVL285:
-.LBB1397:
-.LBB1180:
-.LBB1178:
-.LBB1176:
-.LBB1166:
-	.loc 5 84 0
-	tbz	x2, 26, .L185
-	b	.L184
-.LVL286:
-	.p2align 3
-.L264:
-.LBE1166:
-.LBE1176:
-.LBE1178:
-.LBE1180:
-.LBE1397:
-.LBB1398:
-.LBB1213:
-.LBB1209:
-.LBB1206:
-.LBB1195:
-.LBB1191:
-.LBB1192:
-.LBB1193:
-	.loc 8 106 0
-	ldr	x2, [x0]
-.LBE1193:
-.LBE1192:
-.LBE1191:
-.LBE1195:
-.LBE1206:
-.LBE1209:
-.LBE1213:
-.LBE1398:
-	.loc 1 2925 0
-	mov	x0, x21
-.LVL287:
+.LBE1386:
+.LBE1385:
+	.loc 1 2982 0
+	sub	w0, w22, w0
+	.loc 1 2987 0
+	ldr	w1, [x20, 176]
+	.loc 1 2988 0
+	str	wzr, [x29, 132]
+	.loc 1 2987 0
+	str	w1, [x29, 104]
+	.loc 1 2984 0
+	str	w0, [x29, 88]
+.LBB1415:
+.LBB1411:
+.LBB1407:
 .LBB1399:
-.LBB1214:
-.LBB1210:
-.LBB1207:
-.LBB1196:
+.LBB1396:
+	.loc 5 77 0
+	ldr	x1, [x2, 8]
+.LVL243:
 	.loc 5 84 0
-	tbz	x2, 26, .L200
-	b	.L199
-.LVL288:
+	tbnz	x3, 21, .L169
+.LBB1392:
+.LBB1393:
+.LBB1394:
+	.loc 6 106 0
+	ldr	x2, [x2]
+.LVL244:
+.LBE1394:
+.LBE1393:
+.LBE1392:
+.LBE1396:
+.LBE1399:
+.LBE1407:
+.LBE1411:
+.LBE1415:
+	.loc 1 2928 0
+	mov	x0, x21
+.LVL245:
+.LBB1416:
+.LBB1412:
+.LBB1408:
+.LBB1400:
+.LBB1397:
+	.loc 5 84 0
+	tbnz	x2, 26, .L169
+.LVL246:
+.L170:
+	.loc 5 89 0
+#APP
+// 89 "./arch/arm64/include/asm/uaccess.h" 1
+		adds	x0, x0, 64
+	csel	x1, xzr, x1, hi
+	csinv	x0, x0, xzr, cc
+	sbcs	xzr, x0, x1
+	cset	x0, ls
+
+// 0 "" 2
+.LVL247:
+#NO_APP
+.LBE1397:
+.LBE1400:
+	.loc 8 132 0
+	cbnz	x0, .L171
+.LVL248:
+.L172:
+.LBE1408:
+.LBE1412:
+.LBE1416:
+	.loc 1 2992 0
+	mov	x0, x25
+.LVL249:
+	bl	ebc_buf_release
+.LVL250:
+	.loc 1 2993 0
+	mov	x0, -14
+	b	.L134
+.LVL251:
+	.p2align 3
+.L157:
+.LBB1417:
+.LBB1418:
+.LBB1419:
+.LBB1420:
+.LBB1421:
+.LBB1422:
+.LBB1423:
+.LBB1424:
+	.loc 4 19 0
+#APP
+// 19 "./arch/arm64/include/asm/current.h" 1
+	mrs x1, sp_el0
+// 0 "" 2
+.LVL252:
+#NO_APP
+.LBE1424:
+.LBE1423:
+	.loc 5 85 0
+	ldr	w2, [x1, 52]
+.LBE1422:
+.LBE1421:
+.LBE1420:
+.LBE1419:
+.LBE1418:
+	.loc 1 3069 0
+	str	wzr, [x29, 84]
+.LVL253:
+.LBB1449:
+.LBB1447:
+.LBB1445:
+.LBB1434:
+.LBB1431:
+	.loc 5 77 0
+	ldr	x0, [x1, 8]
+.LVL254:
+	.loc 5 84 0
+	tbz	x2, 21, .L274
+.LVL255:
+.L186:
+.LBB1425:
+.LBB1426:
+.LBB1427:
+	.loc 7 157 0
+	sbfx	x1, x21, 0, 56
+.LVL256:
+.LBE1427:
+.LBE1426:
+	.loc 5 86 0
+	and	x1, x1, x21
+.LVL257:
+.L187:
+.LBE1425:
+	.loc 5 89 0
+#APP
+// 89 "./arch/arm64/include/asm/uaccess.h" 1
+		adds	x1, x1, 4
+	csel	x0, xzr, x0, hi
+	csinv	x1, x1, xzr, cc
+	sbcs	xzr, x1, x0
+	cset	x1, ls
+
+// 0 "" 2
+.LVL258:
+#NO_APP
+.LBE1431:
+.LBE1434:
+	.loc 8 132 0
+	mov	x0, 4
+.LVL259:
+	cbz	x1, .L134
+.LBB1435:
+.LBB1436:
+.LBB1437:
+.LBB1438:
+.LBB1439:
+	.loc 7 157 0
+	sbfx	x1, x21, 0, 56
+.LVL260:
+.LBE1439:
+.LBE1438:
+.LBE1437:
+.LBB1440:
+.LBB1441:
+	.loc 4 19 0
+#APP
+// 19 "./arch/arm64/include/asm/current.h" 1
+	mrs x2, sp_el0
+// 0 "" 2
+.LVL261:
+#NO_APP
+.LBE1441:
+.LBE1440:
+.LBB1442:
+	.loc 5 254 0
+	and	x1, x1, x21
+.LVL262:
+.LBE1442:
+	.loc 5 249 0
+	ldr	x2, [x2, 8]
+.LVL263:
+#APP
+// 249 "./arch/arm64/include/asm/uaccess.h" 1
+		bics	xzr, x1, x2
+	csel	x3, x21, xzr, eq
+
+// 0 "" 2
+.LVL264:
+	.loc 5 257 0
+// 257 "./arch/arm64/include/asm/uaccess.h" 1
+	hint #20
+// 0 "" 2
+#NO_APP
+.LBE1436:
+.LBE1435:
+	.loc 8 134 0
+	mov	x2, x0
+	add	x1, x29, 84
+.LVL265:
+	mov	x0, x3
+	bl	__arch_copy_to_user
+.LVL266:
+	sxtw	x0, w0
+	b	.L134
+.LVL267:
+	.p2align 3
+.L274:
+.LBB1443:
+.LBB1432:
+.LBB1428:
+.LBB1429:
+.LBB1430:
+	.loc 6 106 0
+	ldr	x2, [x1]
+.LBE1430:
+.LBE1429:
+.LBE1428:
+.LBE1432:
+.LBE1443:
+.LBE1445:
+.LBE1447:
+.LBE1449:
+.LBE1417:
+	.loc 1 2928 0
+	mov	x1, x21
+.LVL268:
+.LBB1451:
+.LBB1450:
+.LBB1448:
+.LBB1446:
+.LBB1444:
+.LBB1433:
+	.loc 5 84 0
+	tbz	x2, 26, .L187
+	b	.L186
+.LVL269:
 	.p2align 3
 .L266:
-.LBE1196:
-.LBE1207:
-.LBE1210:
-.LBE1214:
-.LBE1399:
-.LBB1400:
-.LBB1249:
-.LBB1245:
-.LBB1242:
-.LBB1231:
-.LBB1227:
-.LBB1228:
-.LBB1229:
-	.loc 8 106 0
+.LBE1433:
+.LBE1444:
+.LBE1446:
+.LBE1448:
+.LBE1450:
+.LBE1451:
+.LBB1452:
+.LBB1217:
+.LBB1215:
+.LBB1213:
+.LBB1203:
+.LBB1200:
+.LBB1201:
+.LBB1202:
+	.loc 6 106 0
 	ldr	x2, [x0]
-.LBE1229:
-.LBE1228:
-.LBE1227:
-.LBE1231:
-.LBE1242:
-.LBE1245:
-.LBE1249:
-.LBE1400:
-	.loc 1 2925 0
+.LBE1202:
+.LBE1201:
+.LBE1200:
+.LBE1203:
+.LBE1213:
+.LBE1215:
+.LBE1217:
+.LBE1452:
+	.loc 1 2928 0
 	mov	x0, x21
-.LVL289:
-.LBB1401:
-.LBB1250:
-.LBB1246:
-.LBB1243:
-.LBB1232:
+.LVL270:
+.LBB1453:
+.LBB1218:
+.LBB1216:
+.LBB1214:
+.LBB1204:
 	.loc 5 84 0
-	tbz	x2, 26, .L196
-	b	.L195
-.LVL290:
+	tbz	x2, 26, .L181
+	b	.L180
+.LVL271:
 	.p2align 3
-.L269:
-.LBE1232:
-.LBE1243:
-.LBE1246:
-.LBE1250:
-.LBE1401:
-.LBB1402:
-.LBB1319:
-.LBB1315:
-.LBB1312:
-.LBB1301:
-.LBB1297:
-.LBB1298:
-.LBB1299:
-	.loc 8 106 0
+.L273:
+.LBE1204:
+.LBE1214:
+.LBE1216:
+.LBE1218:
+.LBE1453:
+.LBB1454:
+.LBB1382:
+.LBB1379:
+.LBB1377:
+.LBB1367:
+.LBB1364:
+.LBB1365:
+.LBB1366:
+	.loc 6 106 0
 	ldr	x2, [x0]
-.LBE1299:
-.LBE1298:
-.LBE1297:
-.LBE1301:
-.LBE1312:
-.LBE1315:
-.LBE1319:
-.LBE1402:
-	.loc 1 2925 0
+.LBE1366:
+.LBE1365:
+.LBE1364:
+.LBE1367:
+.LBE1377:
+.LBE1379:
+.LBE1382:
+.LBE1454:
+	.loc 1 2928 0
 	mov	x0, x21
-.LVL291:
-.LBB1403:
-.LBB1320:
-.LBB1316:
-.LBB1313:
-.LBB1302:
+.LVL272:
+.LBB1455:
+.LBB1383:
+.LBB1380:
+.LBB1378:
+.LBB1368:
 	.loc 5 84 0
-	tbz	x2, 26, .L188
-	b	.L187
-.LVL292:
+	tbz	x2, 26, .L163
+	b	.L162
+.LVL273:
+	.p2align 3
+.L271:
+.LBE1368:
+.LBE1378:
+.LBE1380:
+.LBE1383:
+.LBE1455:
+.LBB1456:
+.LBB1352:
+.LBB1350:
+.LBB1348:
+.LBB1338:
+.LBB1335:
+.LBB1336:
+.LBB1337:
+	.loc 6 106 0
+	ldr	x2, [x0]
+.LBE1337:
+.LBE1336:
+.LBE1335:
+.LBE1338:
+.LBE1348:
+.LBE1350:
+.LBE1352:
+.LBE1456:
+	.loc 1 2928 0
+	mov	x0, x21
+.LVL274:
+.LBB1457:
+.LBB1353:
+.LBB1351:
+.LBB1349:
+.LBB1339:
+	.loc 5 84 0
+	tbz	x2, 26, .L174
+	b	.L173
+.LVL275:
+	.p2align 3
+.L270:
+.LBE1339:
+.LBE1349:
+.LBE1351:
+.LBE1353:
+.LBE1457:
+.LBB1458:
+.LBB1321:
+.LBB1317:
+.LBB1306:
+.LBB1303:
+.LBB1299:
+.LBB1300:
+.LBB1301:
+	.loc 6 106 0
+	ldr	x2, [x2]
+.LVL276:
+.LBE1301:
+.LBE1300:
+.LBE1299:
+.LBE1303:
+.LBE1306:
+.LBE1317:
+.LBE1321:
+.LBE1458:
+	.loc 1 2928 0
+	mov	x0, x21
+.LVL277:
+.LBB1459:
+.LBB1322:
+.LBB1318:
+.LBB1307:
+.LBB1304:
+	.loc 5 84 0
+	tbz	x2, 26, .L194
+	b	.L193
+.LVL278:
+	.p2align 3
+.L263:
+.LBE1304:
+.LBE1307:
+.LBE1318:
+.LBE1322:
+.LBE1459:
+.LBB1460:
+.LBB1152:
+.LBB1150:
+.LBB1148:
+.LBB1138:
+.LBB1135:
+.LBB1136:
+.LBB1137:
+	.loc 6 106 0
+	ldr	x2, [x1]
+.LBE1137:
+.LBE1136:
+.LBE1135:
+.LBE1138:
+.LBE1148:
+.LBE1150:
+.LBE1152:
+.LBE1460:
+	.loc 1 2928 0
+	mov	x1, x21
+.LVL279:
+.LBB1461:
+.LBB1153:
+.LBB1151:
+.LBB1149:
+.LBB1139:
+	.loc 5 84 0
+	tbz	x2, 26, .L184
+	b	.L183
+.LVL280:
+	.p2align 3
+.L264:
+.LBE1139:
+.LBE1149:
+.LBE1151:
+.LBE1153:
+.LBE1461:
+.LBB1462:
+.LBB1186:
+.LBB1182:
+.LBB1179:
+.LBB1168:
+.LBB1164:
+.LBB1165:
+.LBB1166:
+	.loc 6 106 0
+	ldr	x2, [x0]
+.LBE1166:
+.LBE1165:
+.LBE1164:
+.LBE1168:
+.LBE1179:
+.LBE1182:
+.LBE1186:
+.LBE1462:
+	.loc 1 2928 0
+	mov	x0, x21
+.LVL281:
+.LBB1463:
+.LBB1187:
+.LBB1183:
+.LBB1180:
+.LBB1169:
+	.loc 5 84 0
+	tbz	x2, 26, .L198
+	b	.L197
+.LVL282:
 	.p2align 3
 .L268:
-.LBE1302:
-.LBE1313:
-.LBE1316:
-.LBE1320:
-.LBE1403:
-.LBB1404:
-.LBB1284:
+.LBE1169:
+.LBE1180:
+.LBE1183:
+.LBE1187:
+.LBE1463:
+.LBB1464:
+.LBB1285:
 .LBB1281:
 .LBB1278:
 .LBB1267:
 .LBB1263:
 .LBB1264:
 .LBB1265:
-	.loc 8 106 0
-	ldr	x2, [x1]
+	.loc 6 106 0
+	ldr	x2, [x0]
 .LBE1265:
 .LBE1264:
 .LBE1263:
 .LBE1267:
 .LBE1278:
 .LBE1281:
-.LBE1284:
-.LBE1404:
-	.loc 1 2925 0
-	mov	x1, x21
-.LVL293:
-.LBB1405:
-.LBB1285:
+.LBE1285:
+.LBE1464:
+	.loc 1 2928 0
+	mov	x0, x21
+.LVL283:
+.LBB1465:
+.LBB1286:
 .LBB1282:
 .LBB1279:
 .LBB1268:
 	.loc 5 84 0
-	tbz	x2, 26, .L161
-	b	.L160
-.LVL294:
+	tbz	x2, 26, .L190
+	b	.L189
+.LVL284:
 	.p2align 3
-.L171:
+.L267:
 .LBE1268:
 .LBE1279:
 .LBE1282:
-.LBE1285:
-.LBE1405:
-.LBB1406:
-.LBB1119:
-.LBB1115:
-.LBB1107:
-.LBB1104:
-.LBB1101:
+.LBE1286:
+.LBE1465:
+.LBB1466:
+.LBB1250:
+.LBB1247:
+.LBB1244:
+.LBB1233:
+.LBB1229:
+.LBB1230:
+.LBB1231:
+	.loc 6 106 0
+	ldr	x2, [x1]
+.LBE1231:
+.LBE1230:
+.LBE1229:
+.LBE1233:
+.LBE1244:
+.LBE1247:
+.LBE1250:
+.LBE1466:
+	.loc 1 2928 0
+	mov	x1, x21
+.LVL285:
+.LBB1467:
+.LBB1251:
+.LBB1248:
+.LBB1245:
+.LBB1234:
+	.loc 5 84 0
+	tbz	x2, 26, .L160
+	b	.L159
+.LVL286:
+	.p2align 3
+.L169:
+.LBE1234:
+.LBE1245:
+.LBE1248:
+.LBE1251:
+.LBE1467:
+.LBB1468:
+.LBB1413:
+.LBB1409:
+.LBB1401:
+.LBB1398:
+.LBB1395:
 	.loc 5 86 0
 	and	x0, x21, x23, asr 8
-	b	.L172
-.LVL295:
+	b	.L170
+.LVL287:
+.L252:
+.LBE1395:
+.LBE1398:
+.LBE1401:
+.LBE1409:
+.LBE1413:
+.LBE1468:
+	.loc 1 2949 0
+	ldr	x0, [x20, 296]
+	adrp	x2, .LANCHOR2
+	adrp	x1, .LC2
+.LVL288:
+	add	x2, x2, :lo12:.LANCHOR2
+	add	x1, x1, :lo12:.LC2
+	bl	_dev_err
+.LVL289:
+	.loc 1 2950 0
+	mov	x0, -14
+	b	.L134
+.LVL290:
 .L220:
-.LBE1101:
-.LBE1104:
-.LBE1107:
-.LBE1115:
-.LBE1119:
-.LBE1406:
-.LBB1407:
-.LBB1215:
-.LBB1211:
-	.loc 7 112 0
+.LBB1469:
+.LBB1287:
+.LBB1283:
+	.loc 8 112 0
 	mov	x0, 4
-.LVL296:
-.L201:
-	.loc 7 119 0
+.LVL291:
+.L191:
+	.loc 8 119 0
 	mov	x2, x0
 	mov	w1, 0
-.LVL297:
+.LVL292:
 	add	x0, x22, x3
-.LVL298:
+.LVL293:
 	bl	memset
-.LVL299:
-.LBE1211:
-.LBE1215:
-.LBE1407:
-	.loc 1 3096 0
+.LVL294:
+.LBE1283:
+.LBE1287:
+.LBE1469:
+	.loc 1 3075 0
 	ldr	x0, [x20, 296]
-	adrp	x1, .LC13
-	add	x1, x1, :lo12:.LC13
+	adrp	x1, .LC9
+	add	x1, x1, :lo12:.LC9
 	bl	_dev_err
-.LVL300:
-.L249:
-	.loc 1 3097 0
+.LVL295:
+.L259:
+	.loc 1 3076 0
 	mov	x0, -14
-.LVL301:
+.LVL296:
 	b	.L134
-.LVL302:
+.LVL297:
 	.p2align 3
-.L193:
-.LBB1408:
-.LBB1357:
-.LBB1353:
-.LBB1342:
-.LBB1343:
-.LBB1344:
-.LBB1345:
-.LBB1346:
-	.loc 6 157 0
+.L195:
+.LBB1470:
+.LBB1323:
+.LBB1319:
+.LBB1308:
+.LBB1309:
+.LBB1310:
+.LBB1311:
+.LBB1312:
+	.loc 7 157 0
 	sbfx	x1, x21, 0, 56
-.LVL303:
-.LBE1346:
-.LBE1345:
-.LBE1344:
-.LBB1347:
-.LBB1348:
+.LVL298:
+.LBE1312:
+.LBE1311:
+.LBE1310:
+.LBB1313:
+.LBB1314:
 	.loc 4 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
 	mrs x0, sp_el0
 // 0 "" 2
-.LVL304:
+.LVL299:
 #NO_APP
-.LBE1348:
-.LBE1347:
-.LBB1349:
+.LBE1314:
+.LBE1313:
+.LBB1315:
 	.loc 5 254 0
 	and	x1, x1, x21
-.LVL305:
-.LBE1349:
+.LVL300:
+.LBE1315:
 	.loc 5 249 0
 	ldr	x2, [x0, 8]
-.LVL306:
+.LVL301:
 #APP
 // 249 "./arch/arm64/include/asm/uaccess.h" 1
 		bics	xzr, x1, x2
 	csel	x0, x21, xzr, eq
 
 // 0 "" 2
-.LVL307:
+.LVL302:
 	.loc 5 257 0
 // 257 "./arch/arm64/include/asm/uaccess.h" 1
 	hint #20
 // 0 "" 2
 #NO_APP
-.LBE1343:
-.LBE1342:
-	.loc 7 134 0
+.LBE1309:
+.LBE1308:
+	.loc 8 134 0
 	mov	x2, 64
 	add	x1, x29, 88
-.LVL308:
+.LVL303:
 	bl	__arch_copy_to_user
-.LVL309:
-.LBE1353:
-.LBE1357:
-.LBE1408:
-	.loc 1 3077 0
-	cbnz	x0, .L194
-	.loc 1 3100 0
-	mov	x0, 0
-	b	.L134
-.LVL310:
+.LVL304:
+.LBE1319:
+.LBE1323:
+.LBE1470:
+	.loc 1 3088 0
+	cbz	x0, .L258
+	b	.L196
+.LVL305:
 	.p2align 3
-.L173:
-.LBB1409:
-.LBB1120:
-.LBB1116:
-.LBB1108:
-.LBB1109:
-.LBB1110:
-.LBB1111:
+.L171:
+.LBB1471:
+.LBB1414:
+.LBB1410:
+.LBB1402:
+.LBB1403:
+.LBB1404:
+.LBB1405:
 	.loc 4 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
 	mrs x0, sp_el0
 // 0 "" 2
-.LVL311:
+.LVL306:
 #NO_APP
-.LBE1111:
-.LBE1110:
-.LBB1112:
+.LBE1405:
+.LBE1404:
+.LBB1406:
 	.loc 5 254 0
 	and	x23, x21, x23, asr 8
-.LVL312:
-.LBE1112:
+.LVL307:
+.LBE1406:
 	.loc 5 249 0
 	ldr	x1, [x0, 8]
-.LVL313:
+.LVL308:
 #APP
 // 249 "./arch/arm64/include/asm/uaccess.h" 1
 		bics	xzr, x23, x1
 	csel	x0, x21, xzr, eq
 
 // 0 "" 2
-.LVL314:
+.LVL309:
 	.loc 5 257 0
 // 257 "./arch/arm64/include/asm/uaccess.h" 1
 	hint #20
 // 0 "" 2
 #NO_APP
-.LBE1109:
-.LBE1108:
-	.loc 7 134 0
+.LBE1403:
+.LBE1402:
+	.loc 8 134 0
 	mov	x2, 64
-.LVL315:
+.LVL310:
 	mov	x1, x24
 	bl	__arch_copy_to_user
-.LVL316:
-.LBE1116:
-.LBE1120:
-.LBE1409:
-	.loc 1 2987 0
-	cbnz	w0, .L174
-	.loc 1 3100 0
-	mov	x0, 0
-	b	.L134
-.LVL317:
-.L215:
-.LBB1410:
-.LBB1321:
-.LBB1317:
-	.loc 7 112 0
-	mov	x0, 4
-.LVL318:
-.L189:
-	.loc 7 119 0
-	mov	x2, x0
-	mov	w1, 0
-.LVL319:
-	add	x0, x22, x3
-.LVL320:
-	bl	memset
-.LVL321:
-.LBE1317:
-.LBE1321:
+.LVL311:
 .LBE1410:
-	.loc 1 3064 0
-	ldr	x0, [x20, 296]
-	adrp	x1, .LC9
-	add	x1, x1, :lo12:.LC9
-	bl	_dev_err
-.LVL322:
-	.loc 1 3065 0
-	mov	x0, -14
-	b	.L134
-.LVL323:
-.L218:
-.LBB1411:
-.LBB1251:
-.LBB1247:
-	.loc 7 112 0
+.LBE1414:
+.LBE1471:
+	.loc 1 2991 0
+	cbz	w0, .L258
+	b	.L172
+.LVL312:
+	.p2align 3
+.L272:
+	.loc 1 3013 0
+	mov	w2, 1
+	str	w2, [x20, 100]
+	.loc 1 3014 0
+	adrp	x0, .LANCHOR1
+	add	x0, x0, :lo12:.LANCHOR1
+	mov	w1, w2
+	add	x0, x0, 304
+	bl	__wake_up_sync
+.LVL313:
+	b	.L178
+.LVL314:
+.L223:
+.LBB1472:
+.LBB1188:
+.LBB1184:
+	.loc 8 112 0
 	mov	x0, 4
-.LVL324:
-.L197:
-	.loc 7 119 0
+.LVL315:
+.L199:
+	.loc 8 119 0
 	mov	x2, x0
 	mov	w1, 0
-.LVL325:
+.LVL316:
 	add	x0, x22, x3
-.LVL326:
+.LVL317:
 	bl	memset
-.LVL327:
-.LBE1247:
-.LBE1251:
-.LBE1411:
-	.loc 1 3084 0
+.LVL318:
+.LBE1184:
+.LBE1188:
+.LBE1472:
+	.loc 1 3095 0
 	ldr	x0, [x20, 296]
 	adrp	x1, .LC11
 	add	x1, x1, :lo12:.LC11
 	bl	_dev_err
-.LVL328:
-	.loc 1 3085 0
+.LVL319:
+	.loc 1 3096 0
 	mov	x0, -14
 	b	.L134
-.LVL329:
-.L168:
-	.loc 1 2957 0
+.LVL320:
+.L225:
+.LBB1473:
+.LBB1122:
+.LBB1119:
+	.loc 8 112 0
+	mov	x0, 4
+.LVL321:
+.L203:
+	.loc 8 119 0
+	mov	x2, x0
+	mov	w1, 0
+.LVL322:
+	add	x0, x22, x3
+.LVL323:
+	bl	memset
+.LVL324:
+.LBE1119:
+.LBE1122:
+.LBE1473:
+	.loc 1 3104 0
+	ldr	x0, [x20, 296]
+	adrp	x1, .LC12
+	add	x1, x1, :lo12:.LC12
+	bl	_dev_err
+.LVL325:
+	.loc 1 3105 0
+	mov	x0, -14
+	b	.L134
+.LVL326:
+.L166:
+	.loc 1 2961 0
 	mov	x0, -1
 	b	.L134
-.LVL330:
-.L259:
-	.loc 1 3107 0
+.LVL327:
+.L262:
+	.loc 1 3115 0
 	bl	__stack_chk_fail
+.LVL328:
+.L165:
+.LBB1474:
+.LBB1384:
+.LBB1381:
+	.loc 8 119 0
+	sub	x0, x24, x0
+.LVL329:
+	mov	x2, x22
+	mov	w1, 0
+	add	x0, x0, 64
+	bl	memset
+.LVL330:
+.LBE1381:
+.LBE1384:
+.LBE1474:
+	.loc 1 2975 0
+	cbz	w22, .L168
+	.loc 1 3076 0
+	mov	x0, -14
+	b	.L134
 .LVL331:
 .L265:
 	mov	x3, 4
 	sub	x3, x3, x0
 .LVL332:
-	b	.L201
+	b	.L199
 .LVL333:
-.L267:
+.L261:
 	mov	x3, 4
 	sub	x3, x3, x0
 .LVL334:
-	b	.L197
+	b	.L203
 .LVL335:
-.L167:
-.LBB1412:
-.LBB1090:
-.LBB1087:
-	.loc 7 119 0
-	sub	x0, x24, x0
-.LVL336:
-	mov	x2, x22
-	mov	w1, 0
-	add	x0, x0, 64
-	bl	memset
-.LVL337:
-.LBE1087:
-.LBE1090:
-.LBE1412:
-	.loc 1 2971 0
-	cbz	w22, .L170
-	.loc 1 3097 0
-	mov	x0, -14
-	b	.L134
-.LVL338:
-.L270:
+.L269:
 	mov	x3, 4
 	sub	x3, x3, x0
-.LVL339:
-	b	.L189
+.LVL336:
+	b	.L191
 	.cfi_endproc
 .LFE2849:
 	.size	ebc_io_ctl, .-ebc_io_ctl
@@ -3469,28 +3594,28 @@
 	.type	get_overlay_image2, %function
 get_overlay_image2:
 .LFB2821:
-	.loc 1 667 0
+	.loc 1 666 0
 	.cfi_startproc
-.LVL340:
+.LVL337:
 	stp	x29, x30, [sp, -112]!
 	.cfi_def_cfa_offset 112
 	.cfi_offset 29, -112
 	.cfi_offset 30, -104
-	.loc 1 668 0
-	adrp	x7, .LANCHOR0
-	.loc 1 677 0
-	cmp	w6, 2
 	.loc 1 667 0
+	adrp	x7, .LANCHOR0
+	.loc 1 676 0
+	cmp	w6, 2
+	.loc 1 666 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, x0
-	.loc 1 668 0
-	ldr	x0, [x7, #:lo12:.LANCHOR0]
-.LVL341:
 	.loc 1 667 0
+	ldr	x0, [x7, #:lo12:.LANCHOR0]
+.LVL338:
+	.loc 1 666 0
 	stp	x19, x20, [sp, 16]
 	.cfi_offset 19, -96
 	.cfi_offset 20, -88
@@ -3506,29 +3631,29 @@
 	.cfi_offset 28, -24
 	.cfi_offset 23, -64
 	.cfi_offset 24, -56
-	.loc 1 667 0
+	.loc 1 666 0
 	mov	x27, x3
 	mov	x28, x4
-	.loc 1 671 0
+	.loc 1 670 0
 	add	x24, x5, 60
-.LVL342:
-	.loc 1 675 0
-	ldp	w1, w23, [x0, 108]
-.LVL343:
+.LVL339:
 	.loc 1 674 0
+	ldp	w1, w23, [x0, 108]
+.LVL340:
+	.loc 1 673 0
 	lsr	w20, w1, 3
-	.loc 1 677 0
-	beq	.L430
-	.loc 1 680 0
+	.loc 1 676 0
+	beq	.L432
+	.loc 1 679 0
 	cmp	w6, 3
-	beq	.L276
+	beq	.L278
 	lsr	w14, w1, 2
 	mov	x0, 0
-	.loc 1 688 0
+	.loc 1 687 0
 	mov	w21, 0
-.LVL344:
-.L275:
-	.loc 1 692 0
+.LVL341:
+.L277:
+	.loc 1 691 0
 	sub	w2, w23, w21
 	add	x0, x22, x0
 	mov	w1, 0
@@ -3536,65 +3661,65 @@
 	mul	w2, w2, w14
 	sxtw	x2, w2
 	bl	memset
-.LVL345:
-	.loc 1 694 0
+.LVL342:
+	.loc 1 693 0
 	cmp	w21, w23
-	bge	.L336
+	bge	.L338
 	ldr	w14, [x29, 108]
 	sub	w11, w20, #1
 	add	x11, x11, 1
 	mov	w5, 0
-.LVL346:
+.LVL343:
 	lsl	x12, x11, 3
 	lsl	x11, x11, 2
 	mul	w13, w21, w14
 	lsl	w14, w14, 1
-.LVL347:
+.LVL344:
 	.p2align 2
-.L335:
-.LBB1413:
-	.loc 1 695 0
+.L337:
+.LBB1475:
+	.loc 1 694 0
 	add	x10, x22, x13, sxtw
-	.loc 1 696 0
-	cbz	w20, .L278
+	.loc 1 695 0
+	cbz	w20, .L280
 	add	x1, x27, 8
 	add	x8, x28, 8
 	mov	x7, 0
-.LVL348:
+.LVL345:
 	.p2align 2
-.L306:
-.LBB1414:
-	.loc 1 697 0
+.L308:
+.LBB1476:
+	.loc 1 696 0
 	ldr	w6, [x26, x7, lsl 2]
-.LVL349:
-	.loc 1 698 0
+.LVL346:
+	.loc 1 697 0
 	ldr	w0, [x25, x7, lsl 2]
-.LVL350:
-	.loc 1 700 0
+.LVL347:
+	.loc 1 699 0
 	cmp	w6, w0
-	beq	.L279
-.LBB1415:
-	.loc 1 703 0
+	beq	.L281
+.LBB1477:
+	.loc 1 702 0
 	eor	w2, w6, w0
-	.loc 1 701 0
+	.loc 1 700 0
 	mov	w9, 0
-.LVL351:
-	.loc 1 706 0
+.LVL348:
+	.loc 1 705 0
 	ands	w5, w2, 15
-.LVL352:
-	beq	.L280
-.LBB1416:
-	.loc 1 706 0 is_stmt 0 discriminator 1
+.LVL349:
+	beq	.L282
+.LBB1478:
+	.loc 1 705 0 is_stmt 0 discriminator 1
 	ldrb	w30, [x8, -8]
-.LVL353:
+.LVL350:
 	and	w15, w6, 15
 	ldrb	w3, [x1, -8]
-.LVL354:
+.LVL351:
 	ubfiz	w4, w0, 5, 4
-.LVL355:
+.LVL352:
 	orr	w4, w4, w15
 	ldrb	w5, [x19, 56]
-.LVL356:
+.LVL353:
 	add	x18, x19, x30, sxtw 3
 	ldrb	w17, [x19, 57]
 	lsl	w16, w3, 10
@@ -3606,249 +3731,249 @@
 	cmp	w5, w3
 	add	x4, x18, x4, uxtw
 	ldrb	w5, [x4, w16, sxtw]
-.LVL357:
-	beq	.L431
-.L282:
-	.loc 1 706 0 discriminator 9
+.LVL354:
+	beq	.L433
+.L284:
+	.loc 1 705 0 discriminator 9
 	strb	w3, [x1, -8]
-.LVL358:
-.L280:
-.LBE1416:
-	.loc 1 707 0 is_stmt 1 discriminator 10
+.LVL355:
+.L282:
+.LBE1478:
+	.loc 1 706 0 is_stmt 1 discriminator 10
 	tst	w2, 240
-	beq	.L283
-.LBB1417:
-	.loc 1 707 0 is_stmt 0 discriminator 1
+	beq	.L285
+.LBB1479:
+	.loc 1 706 0 is_stmt 0 discriminator 1
 	ldrb	w16, [x8, -7]
-.LVL359:
+.LVL356:
 	lsr	w3, w0, 4
-.LVL360:
+.LVL357:
 	ldrb	w4, [x1, -7]
-.LVL361:
+.LVL358:
 	ubfx	x17, x6, 4, 4
 	cmp	w16, 0
 	ubfiz	w3, w3, 5, 4
 	add	x30, x19, x16, sxtw 3
-.LVL362:
+.LVL359:
 	orr	w3, w3, w17
 	lsl	w17, w4, 10
 	ldrb	w15, [x19, 56]
 	ldrb	w18, [x19, 57]
 	add	w4, w4, 1
 	ldr	x16, [x30, 128]
-.LVL363:
+.LVL360:
 	and	w4, w4, 255
 	csel	w15, w15, w18, eq
 	cmp	w15, w4
 	add	x3, x16, x3, uxtw
 	ldrb	w3, [x3, w17, sxtw]
-.LVL364:
+.LVL361:
 	orr	w5, w5, w3, lsl 4
-	beq	.L432
-.L285:
-	.loc 1 707 0 discriminator 9
+	beq	.L434
+.L287:
+	.loc 1 706 0 discriminator 9
 	strb	w4, [x1, -7]
-.LVL365:
-.L283:
-.LBE1417:
-	.loc 1 708 0 is_stmt 1 discriminator 10
+.LVL362:
+.L285:
+.LBE1479:
+	.loc 1 707 0 is_stmt 1 discriminator 10
 	tst	w2, 3840
-	beq	.L286
-.LBB1418:
-	.loc 1 708 0 is_stmt 0 discriminator 1
+	beq	.L288
+.LBB1480:
+	.loc 1 707 0 is_stmt 0 discriminator 1
 	ldrb	w16, [x8, -6]
-.LVL366:
+.LVL363:
 	lsr	w3, w0, 8
-.LVL367:
+.LVL364:
 	ldrb	w4, [x1, -6]
-.LVL368:
+.LVL365:
 	ubfx	x17, x6, 8, 4
 	cmp	w16, 0
 	ubfiz	w3, w3, 5, 4
 	add	x30, x19, x16, sxtw 3
-.LVL369:
+.LVL366:
 	orr	w3, w3, w17
 	lsl	w17, w4, 10
 	ldrb	w15, [x19, 56]
 	ldrb	w18, [x19, 57]
 	add	w4, w4, 1
 	ldr	x16, [x30, 128]
-.LVL370:
+.LVL367:
 	and	w4, w4, 255
 	csel	w15, w15, w18, eq
 	cmp	w15, w4
 	add	x3, x16, x3, uxtw
 	ldrb	w3, [x3, w17, sxtw]
-.LVL371:
+.LVL368:
 	orr	w5, w5, w3, lsl 8
-	beq	.L433
-.L288:
-	.loc 1 708 0 discriminator 9
+	beq	.L435
+.L290:
+	.loc 1 707 0 discriminator 9
 	strb	w4, [x1, -6]
-.LVL372:
-.L286:
-.LBE1418:
-	.loc 1 709 0 is_stmt 1 discriminator 10
+.LVL369:
+.L288:
+.LBE1480:
+	.loc 1 708 0 is_stmt 1 discriminator 10
 	tst	w2, 61440
-	beq	.L289
-.LBB1419:
-	.loc 1 709 0 is_stmt 0 discriminator 1
+	beq	.L291
+.LBB1481:
+	.loc 1 708 0 is_stmt 0 discriminator 1
 	ldrb	w16, [x8, -5]
-.LVL373:
+.LVL370:
 	lsr	w3, w0, 12
-.LVL374:
+.LVL371:
 	ldrb	w4, [x1, -5]
-.LVL375:
+.LVL372:
 	ubfx	x17, x6, 12, 4
 	cmp	w16, 0
 	ubfiz	w3, w3, 5, 4
 	add	x30, x19, x16, sxtw 3
-.LVL376:
+.LVL373:
 	orr	w3, w3, w17
 	lsl	w17, w4, 10
 	ldrb	w15, [x19, 56]
 	ldrb	w18, [x19, 57]
 	add	w4, w4, 1
 	ldr	x16, [x30, 128]
-.LVL377:
+.LVL374:
 	and	w4, w4, 255
 	csel	w15, w15, w18, eq
 	cmp	w15, w4
 	add	x3, x16, x3, uxtw
 	ldrb	w3, [x3, w17, sxtw]
-.LVL378:
+.LVL375:
 	orr	w5, w5, w3, lsl 12
-	beq	.L434
-.L291:
-	.loc 1 709 0 discriminator 9
+	beq	.L436
+.L293:
+	.loc 1 708 0 discriminator 9
 	strb	w4, [x1, -5]
-.LVL379:
-.L289:
-.LBE1419:
-	.loc 1 710 0 is_stmt 1 discriminator 10
+.LVL376:
+.L291:
+.LBE1481:
+	.loc 1 709 0 is_stmt 1 discriminator 10
 	tst	w2, 983040
-	beq	.L292
-.LBB1420:
-	.loc 1 710 0 is_stmt 0 discriminator 1
+	beq	.L294
+.LBB1482:
+	.loc 1 709 0 is_stmt 0 discriminator 1
 	ldrb	w16, [x8, -4]
-.LVL380:
+.LVL377:
 	lsr	w3, w0, 16
-.LVL381:
+.LVL378:
 	ldrb	w4, [x1, -4]
-.LVL382:
+.LVL379:
 	ubfx	x17, x6, 16, 4
 	cmp	w16, 0
 	ubfiz	w3, w3, 5, 4
 	add	x30, x19, x16, sxtw 3
-.LVL383:
+.LVL380:
 	orr	w3, w3, w17
 	lsl	w17, w4, 10
 	ldrb	w15, [x19, 56]
 	ldrb	w18, [x19, 57]
 	add	w4, w4, 1
 	ldr	x16, [x30, 128]
-.LVL384:
+.LVL381:
 	and	w4, w4, 255
 	csel	w15, w15, w18, eq
 	cmp	w15, w4
 	add	x3, x16, x3, uxtw
 	ldrb	w3, [x3, w17, sxtw]
-.LVL385:
+.LVL382:
 	orr	w5, w5, w3, lsl 16
-	beq	.L435
-.L294:
-	.loc 1 710 0 discriminator 9
+	beq	.L437
+.L296:
+	.loc 1 709 0 discriminator 9
 	strb	w4, [x1, -4]
-.LVL386:
-.L292:
-.LBE1420:
-	.loc 1 711 0 is_stmt 1 discriminator 10
+.LVL383:
+.L294:
+.LBE1482:
+	.loc 1 710 0 is_stmt 1 discriminator 10
 	tst	w2, 15728640
-	beq	.L295
-.LBB1421:
-	.loc 1 711 0 is_stmt 0 discriminator 1
+	beq	.L297
+.LBB1483:
+	.loc 1 710 0 is_stmt 0 discriminator 1
 	ldrb	w16, [x8, -3]
-.LVL387:
+.LVL384:
 	lsr	w3, w0, 20
-.LVL388:
+.LVL385:
 	ldrb	w4, [x1, -3]
-.LVL389:
+.LVL386:
 	ubfx	x17, x6, 20, 4
 	cmp	w16, 0
 	ubfiz	w3, w3, 5, 4
 	add	x30, x19, x16, sxtw 3
-.LVL390:
+.LVL387:
 	orr	w3, w3, w17
 	lsl	w17, w4, 10
 	ldrb	w15, [x19, 56]
 	ldrb	w18, [x19, 57]
 	add	w4, w4, 1
 	ldr	x16, [x30, 128]
-.LVL391:
+.LVL388:
 	and	w4, w4, 255
 	csel	w15, w15, w18, eq
 	cmp	w15, w4
 	add	x3, x16, x3, uxtw
 	ldrb	w3, [x3, w17, sxtw]
-.LVL392:
+.LVL389:
 	orr	w5, w5, w3, lsl 20
-	beq	.L436
-.L297:
-	.loc 1 711 0 discriminator 9
+	beq	.L438
+.L299:
+	.loc 1 710 0 discriminator 9
 	strb	w4, [x1, -3]
-.LVL393:
-.L295:
-.LBE1421:
-	.loc 1 712 0 is_stmt 1 discriminator 10
+.LVL390:
+.L297:
+.LBE1483:
+	.loc 1 711 0 is_stmt 1 discriminator 10
 	tst	w2, 251658240
-	beq	.L298
-.LBB1422:
-	.loc 1 712 0 is_stmt 0 discriminator 1
+	beq	.L300
+.LBB1484:
+	.loc 1 711 0 is_stmt 0 discriminator 1
 	ldrb	w16, [x8, -2]
-.LVL394:
+.LVL391:
 	lsr	w3, w0, 24
-.LVL395:
+.LVL392:
 	ldrb	w4, [x1, -2]
-.LVL396:
+.LVL393:
 	ubfx	x17, x6, 24, 4
 	cmp	w16, 0
 	ubfiz	w3, w3, 5, 4
 	add	x30, x19, x16, sxtw 3
-.LVL397:
+.LVL394:
 	orr	w3, w3, w17
 	lsl	w17, w4, 10
 	ldrb	w15, [x19, 56]
 	ldrb	w18, [x19, 57]
 	add	w4, w4, 1
 	ldr	x16, [x30, 128]
-.LVL398:
+.LVL395:
 	and	w4, w4, 255
 	csel	w15, w15, w18, eq
 	cmp	w15, w4
 	add	x3, x16, x3, uxtw
 	ldrb	w3, [x3, w17, sxtw]
-.LVL399:
+.LVL396:
 	orr	w5, w5, w3, lsl 24
-	beq	.L437
-.L300:
-	.loc 1 712 0 discriminator 9
+	beq	.L439
+.L302:
+	.loc 1 711 0 discriminator 9
 	strb	w4, [x1, -2]
-.LVL400:
-.L298:
-.LBE1422:
-	.loc 1 713 0 is_stmt 1 discriminator 10
+.LVL397:
+.L300:
+.LBE1484:
+	.loc 1 712 0 is_stmt 1 discriminator 10
 	tst	w2, -268435456
-	beq	.L301
-.LBB1423:
-	.loc 1 713 0 is_stmt 0 discriminator 1
+	beq	.L303
+.LBB1485:
+	.loc 1 712 0 is_stmt 0 discriminator 1
 	ldrb	w15, [x8, -1]
-.LVL401:
+.LVL398:
 	lsr	w4, w6, 28
-.LVL402:
+.LVL399:
 	ldrb	w2, [x1, -1]
-.LVL403:
+.LVL400:
 	lsr	w3, w0, 28
-.LVL404:
+.LVL401:
 	cmp	w15, 0
 	add	w3, w4, w3, lsl 5
 	add	x18, x19, x15, sxtw 3
@@ -3857,83 +3982,83 @@
 	ldrb	w17, [x19, 57]
 	add	w2, w2, 1
 	ldr	x15, [x18, 128]
-.LVL405:
+.LVL402:
 	and	w2, w2, 255
 	csel	w4, w4, w17, eq
 	cmp	w4, w2
 	add	x3, x15, x3, uxtw
 	ldrb	w3, [x3, w16, sxtw]
-.LVL406:
+.LVL403:
 	orr	w5, w5, w3, lsl 28
-	beq	.L438
-	.loc 1 713 0 discriminator 9
+	beq	.L440
+	.loc 1 712 0 discriminator 9
 	strb	w2, [x1, -1]
-.LVL407:
-.L301:
-.LBE1423:
-	.loc 1 714 0 is_stmt 1 discriminator 10
-	cbnz	w9, .L304
-.L305:
-	.loc 1 716 0
+.LVL404:
+.L303:
+.LBE1485:
+	.loc 1 713 0 is_stmt 1 discriminator 10
+	cbnz	w9, .L306
+.L307:
+	.loc 1 715 0
 	str	w5, [x10, x7, lsl 2]
-	.loc 1 705 0
+	.loc 1 704 0
 	mov	w5, 1
-.LVL408:
-.L279:
+.LVL405:
+.L281:
 	add	x7, x7, 1
 	add	x1, x1, 8
 	add	x8, x8, 8
-.LBE1415:
-.LBE1414:
-	.loc 1 696 0 discriminator 2
+.LBE1477:
+.LBE1476:
+	.loc 1 695 0 discriminator 2
 	cmp	w20, w7
-	bgt	.L306
+	bgt	.L308
 	add	x27, x27, x12
-.LVL409:
+.LVL406:
 	add	x28, x28, x12
-.LVL410:
+.LVL407:
 	add	x25, x25, x11
-.LVL411:
+.LVL408:
 	add	x26, x26, x11
 	add	x1, x27, 8
 	add	x8, x28, 8
-	.loc 1 696 0 is_stmt 0
+	.loc 1 695 0 is_stmt 0
 	mov	x6, 0
-.LVL412:
+.LVL409:
 	.p2align 2
-.L334:
-.LBB1433:
-	.loc 1 727 0 is_stmt 1
+.L336:
+.LBB1495:
+	.loc 1 726 0 is_stmt 1
 	ldr	w7, [x26, x6, lsl 2]
-.LVL413:
-	.loc 1 728 0
+.LVL410:
+	.loc 1 727 0
 	ldr	w0, [x25, x6, lsl 2]
-.LVL414:
-	.loc 1 730 0
+.LVL411:
+	.loc 1 729 0
 	cmp	w7, w0
-	beq	.L307
-.LBB1434:
-	.loc 1 733 0
+	beq	.L309
+.LBB1496:
+	.loc 1 732 0
 	eor	w5, w7, w0
-.LVL415:
-	.loc 1 731 0
+.LVL412:
+	.loc 1 730 0
 	mov	w4, 0
-	.loc 1 736 0
+	.loc 1 735 0
 	ands	w2, w5, 15
-.LVL416:
-	beq	.L308
-.LBB1435:
-	.loc 1 736 0 is_stmt 0 discriminator 1
+.LVL413:
+	beq	.L310
+.LBB1497:
+	.loc 1 735 0 is_stmt 0 discriminator 1
 	ldrb	w30, [x8, -8]
-.LVL417:
+.LVL414:
 	and	w15, w7, 15
 	ldrb	w3, [x1, -8]
-.LVL418:
+.LVL415:
 	ubfiz	w2, w0, 5, 4
-.LVL419:
+.LVL416:
 	orr	w2, w2, w15
 	ldrb	w9, [x19, 56]
-.LVL420:
+.LVL417:
 	add	x18, x19, x30, sxtw 3
 	ldrb	w17, [x19, 57]
 	lsl	w16, w3, 10
@@ -3945,251 +4070,251 @@
 	cmp	w9, w3
 	add	x2, x18, x2, uxtw
 	ldrb	w2, [x2, w16, sxtw]
-.LVL421:
+.LVL418:
 	lsl	w2, w2, 2
-.LVL422:
-	beq	.L439
-.L310:
-	.loc 1 736 0 discriminator 9
+.LVL419:
+	beq	.L441
+.L312:
+	.loc 1 735 0 discriminator 9
 	strb	w3, [x1, -8]
-.LVL423:
-.L308:
-.LBE1435:
-	.loc 1 737 0 is_stmt 1 discriminator 10
+.LVL420:
+.L310:
+.LBE1497:
+	.loc 1 736 0 is_stmt 1 discriminator 10
 	tst	w5, 240
-	beq	.L311
-.LBB1436:
-	.loc 1 737 0 is_stmt 0 discriminator 1
+	beq	.L313
+.LBB1498:
+	.loc 1 736 0 is_stmt 0 discriminator 1
 	ldrb	w16, [x8, -7]
-.LVL424:
+.LVL421:
 	lsr	w3, w0, 4
-.LVL425:
+.LVL422:
 	ldrb	w9, [x1, -7]
-.LVL426:
+.LVL423:
 	ubfx	x17, x7, 4, 4
 	cmp	w16, 0
 	ubfiz	w3, w3, 5, 4
 	add	x30, x19, x16, sxtw 3
-.LVL427:
+.LVL424:
 	orr	w3, w3, w17
 	lsl	w17, w9, 10
 	ldrb	w15, [x19, 56]
 	ldrb	w18, [x19, 57]
 	add	w9, w9, 1
 	ldr	x16, [x30, 128]
-.LVL428:
+.LVL425:
 	and	w9, w9, 255
 	csel	w15, w15, w18, eq
 	cmp	w15, w9
 	add	x3, x16, x3, uxtw
 	ldrb	w3, [x3, w17, sxtw]
-.LVL429:
+.LVL426:
 	orr	w2, w2, w3, lsl 6
-	beq	.L440
-.L313:
-	.loc 1 737 0 discriminator 9
+	beq	.L442
+.L315:
+	.loc 1 736 0 discriminator 9
 	strb	w9, [x1, -7]
-.LVL430:
-.L311:
-.LBE1436:
-	.loc 1 738 0 is_stmt 1 discriminator 10
+.LVL427:
+.L313:
+.LBE1498:
+	.loc 1 737 0 is_stmt 1 discriminator 10
 	tst	w5, 3840
-	beq	.L314
-.LBB1437:
-	.loc 1 738 0 is_stmt 0 discriminator 1
+	beq	.L316
+.LBB1499:
+	.loc 1 737 0 is_stmt 0 discriminator 1
 	ldrb	w16, [x8, -6]
-.LVL431:
+.LVL428:
 	lsr	w3, w0, 8
-.LVL432:
+.LVL429:
 	ldrb	w9, [x1, -6]
-.LVL433:
+.LVL430:
 	ubfx	x17, x7, 8, 4
 	cmp	w16, 0
 	ubfiz	w3, w3, 5, 4
 	add	x30, x19, x16, sxtw 3
-.LVL434:
+.LVL431:
 	orr	w3, w3, w17
 	lsl	w17, w9, 10
 	ldrb	w15, [x19, 56]
 	ldrb	w18, [x19, 57]
 	add	w9, w9, 1
 	ldr	x16, [x30, 128]
-.LVL435:
+.LVL432:
 	and	w9, w9, 255
 	csel	w15, w15, w18, eq
 	cmp	w15, w9
 	add	x3, x16, x3, uxtw
 	ldrb	w3, [x3, w17, sxtw]
-.LVL436:
+.LVL433:
 	orr	w2, w2, w3, lsl 10
-	beq	.L441
-.L316:
-	.loc 1 738 0 discriminator 9
+	beq	.L443
+.L318:
+	.loc 1 737 0 discriminator 9
 	strb	w9, [x1, -6]
-.LVL437:
-.L314:
-.LBE1437:
-	.loc 1 739 0 is_stmt 1 discriminator 10
+.LVL434:
+.L316:
+.LBE1499:
+	.loc 1 738 0 is_stmt 1 discriminator 10
 	tst	w5, 61440
-	beq	.L317
-.LBB1438:
-	.loc 1 739 0 is_stmt 0 discriminator 1
+	beq	.L319
+.LBB1500:
+	.loc 1 738 0 is_stmt 0 discriminator 1
 	ldrb	w16, [x8, -5]
-.LVL438:
+.LVL435:
 	lsr	w3, w0, 12
-.LVL439:
+.LVL436:
 	ldrb	w9, [x1, -5]
-.LVL440:
+.LVL437:
 	ubfx	x17, x7, 12, 4
 	cmp	w16, 0
 	ubfiz	w3, w3, 5, 4
 	add	x30, x19, x16, sxtw 3
-.LVL441:
+.LVL438:
 	orr	w3, w3, w17
 	lsl	w17, w9, 10
 	ldrb	w15, [x19, 56]
 	ldrb	w18, [x19, 57]
 	add	w9, w9, 1
 	ldr	x16, [x30, 128]
-.LVL442:
+.LVL439:
 	and	w9, w9, 255
 	csel	w15, w15, w18, eq
 	cmp	w15, w9
 	add	x3, x16, x3, uxtw
 	ldrb	w3, [x3, w17, sxtw]
-.LVL443:
+.LVL440:
 	orr	w2, w2, w3, lsl 14
-	beq	.L442
-.L319:
-	.loc 1 739 0 discriminator 9
+	beq	.L444
+.L321:
+	.loc 1 738 0 discriminator 9
 	strb	w9, [x1, -5]
-.LVL444:
-.L317:
-.LBE1438:
-	.loc 1 740 0 is_stmt 1 discriminator 10
+.LVL441:
+.L319:
+.LBE1500:
+	.loc 1 739 0 is_stmt 1 discriminator 10
 	tst	w5, 983040
-	beq	.L320
-.LBB1439:
-	.loc 1 740 0 is_stmt 0 discriminator 1
+	beq	.L322
+.LBB1501:
+	.loc 1 739 0 is_stmt 0 discriminator 1
 	ldrb	w16, [x8, -4]
-.LVL445:
+.LVL442:
 	lsr	w9, w0, 16
-.LVL446:
+.LVL443:
 	ldrb	w3, [x1, -4]
-.LVL447:
+.LVL444:
 	ubfx	x17, x7, 16, 4
 	cmp	w16, 0
 	ubfiz	w9, w9, 5, 4
 	add	x30, x19, x16, sxtw 3
-.LVL448:
+.LVL445:
 	orr	w9, w9, w17
 	lsl	w17, w3, 10
 	ldrb	w15, [x19, 56]
 	ldrb	w18, [x19, 57]
 	add	w3, w3, 1
 	ldr	x16, [x30, 128]
-.LVL449:
+.LVL446:
 	and	w3, w3, 255
 	csel	w15, w15, w18, eq
 	cmp	w15, w3
 	add	x9, x16, x9, uxtw
 	ldrb	w9, [x9, w17, sxtw]
-.LVL450:
+.LVL447:
 	orr	w2, w2, w9, lsl 18
-	beq	.L443
-.L322:
-	.loc 1 740 0 discriminator 9
+	beq	.L445
+.L324:
+	.loc 1 739 0 discriminator 9
 	strb	w3, [x1, -4]
-.LVL451:
-.L320:
-.LBE1439:
-	.loc 1 741 0 is_stmt 1 discriminator 10
+.LVL448:
+.L322:
+.LBE1501:
+	.loc 1 740 0 is_stmt 1 discriminator 10
 	tst	w5, 15728640
-	beq	.L323
-.LBB1440:
-	.loc 1 741 0 is_stmt 0 discriminator 1
+	beq	.L325
+.LBB1502:
+	.loc 1 740 0 is_stmt 0 discriminator 1
 	ldrb	w16, [x8, -3]
-.LVL452:
+.LVL449:
 	lsr	w9, w0, 20
-.LVL453:
+.LVL450:
 	ldrb	w3, [x1, -3]
-.LVL454:
+.LVL451:
 	ubfx	x17, x7, 20, 4
 	cmp	w16, 0
 	ubfiz	w9, w9, 5, 4
 	add	x30, x19, x16, sxtw 3
-.LVL455:
+.LVL452:
 	orr	w9, w9, w17
 	lsl	w17, w3, 10
 	ldrb	w15, [x19, 56]
 	ldrb	w18, [x19, 57]
 	add	w3, w3, 1
 	ldr	x16, [x30, 128]
-.LVL456:
+.LVL453:
 	and	w3, w3, 255
 	csel	w15, w15, w18, eq
 	cmp	w15, w3
 	add	x9, x16, x9, uxtw
 	ldrb	w9, [x9, w17, sxtw]
-.LVL457:
+.LVL454:
 	orr	w2, w2, w9, lsl 22
-	beq	.L444
-.L325:
-	.loc 1 741 0 discriminator 9
+	beq	.L446
+.L327:
+	.loc 1 740 0 discriminator 9
 	strb	w3, [x1, -3]
-.LVL458:
-.L323:
-.LBE1440:
-	.loc 1 742 0 is_stmt 1 discriminator 10
+.LVL455:
+.L325:
+.LBE1502:
+	.loc 1 741 0 is_stmt 1 discriminator 10
 	tst	w5, 251658240
-	beq	.L326
-.LBB1441:
-	.loc 1 742 0 is_stmt 0 discriminator 1
+	beq	.L328
+.LBB1503:
+	.loc 1 741 0 is_stmt 0 discriminator 1
 	ldrb	w16, [x8, -2]
-.LVL459:
+.LVL456:
 	lsr	w9, w0, 24
-.LVL460:
+.LVL457:
 	ldrb	w3, [x1, -2]
-.LVL461:
+.LVL458:
 	ubfx	x17, x7, 24, 4
 	cmp	w16, 0
 	ubfiz	w9, w9, 5, 4
 	add	x30, x19, x16, sxtw 3
-.LVL462:
+.LVL459:
 	orr	w9, w9, w17
 	lsl	w17, w3, 10
 	ldrb	w15, [x19, 56]
 	ldrb	w18, [x19, 57]
 	add	w3, w3, 1
 	ldr	x16, [x30, 128]
-.LVL463:
+.LVL460:
 	and	w3, w3, 255
 	csel	w15, w15, w18, eq
 	cmp	w15, w3
 	add	x9, x16, x9, uxtw
 	ldrb	w9, [x9, w17, sxtw]
-.LVL464:
+.LVL461:
 	orr	w2, w2, w9, lsl 26
-	beq	.L445
-.L328:
-	.loc 1 742 0 discriminator 9
+	beq	.L447
+.L330:
+	.loc 1 741 0 discriminator 9
 	strb	w3, [x1, -2]
-.LVL465:
-.L326:
-.LBE1441:
-	.loc 1 743 0 is_stmt 1 discriminator 10
+.LVL462:
+.L328:
+.LBE1503:
+	.loc 1 742 0 is_stmt 1 discriminator 10
 	tst	w5, -268435456
-	beq	.L329
-.LBB1442:
-	.loc 1 743 0 is_stmt 0 discriminator 1
+	beq	.L331
+.LBB1504:
+	.loc 1 742 0 is_stmt 0 discriminator 1
 	ldrb	w15, [x8, -1]
-.LVL466:
+.LVL463:
 	lsr	w9, w7, 28
-.LVL467:
+.LVL464:
 	ldrb	w3, [x1, -1]
-.LVL468:
+.LVL465:
 	lsr	w5, w0, 28
-.LVL469:
+.LVL466:
 	cmp	w15, 0
 	add	w5, w9, w5, lsl 5
 	add	x18, x19, x15, sxtw 3
@@ -4198,67 +4323,67 @@
 	ldrb	w17, [x19, 57]
 	add	w3, w3, 1
 	ldr	x15, [x18, 128]
-.LVL470:
+.LVL467:
 	and	w3, w3, 255
 	csel	w9, w9, w17, eq
 	cmp	w9, w3
 	add	x5, x15, x5, uxtw
 	ldrb	w5, [x5, w16, sxtw]
-.LVL471:
+.LVL468:
 	orr	w2, w2, w5, lsl 30
-	beq	.L446
-	.loc 1 743 0 discriminator 9
+	beq	.L448
+	.loc 1 742 0 discriminator 9
 	strb	w3, [x1, -1]
-.LVL472:
-.L329:
-.LBE1442:
-	.loc 1 744 0 is_stmt 1 discriminator 10
-	cbnz	w4, .L332
-.L333:
-	.loc 1 746 0
+.LVL469:
+.L331:
+.LBE1504:
+	.loc 1 743 0 is_stmt 1 discriminator 10
+	cbnz	w4, .L334
+.L335:
+	.loc 1 745 0
 	ldr	w0, [x10, x6, lsl 2]
-.LVL473:
-	.loc 1 735 0
+.LVL470:
+	.loc 1 734 0
 	mov	w5, 1
-.LVL474:
-	.loc 1 746 0
+.LVL471:
+	.loc 1 745 0
 	orr	w2, w0, w2
-.LVL475:
+.LVL472:
 	str	w2, [x10, x6, lsl 2]
-.LVL476:
-.L307:
+.LVL473:
+.L309:
 	add	x6, x6, 1
 	add	x1, x1, 8
 	add	x8, x8, 8
-.LBE1434:
-.LBE1433:
-	.loc 1 726 0 discriminator 2
+.LBE1496:
+.LBE1495:
+	.loc 1 725 0 discriminator 2
 	cmp	w20, w6
-	bgt	.L334
+	bgt	.L336
 	add	x27, x27, x12
 	add	x28, x28, x12
 	add	x25, x25, x11
 	add	x26, x26, x11
-.L278:
-.LBE1413:
-	.loc 1 694 0
+.L280:
+.LBE1475:
+	.loc 1 693 0
 	add	w21, w21, 2
 	add	w13, w13, w14
 	cmp	w23, w21
-	bgt	.L335
-	.loc 1 756 0
+	bgt	.L337
+	.loc 1 755 0
 	str	w5, [x24]
-	.loc 1 757 0
+	.loc 1 756 0
 	ldp	x19, x20, [sp, 16]
-.LVL477:
+.LVL474:
 	ldp	x21, x22, [sp, 32]
-.LVL478:
+.LVL475:
 	ldp	x23, x24, [sp, 48]
-.LVL479:
+.LVL476:
 	ldp	x25, x26, [sp, 64]
-.LVL480:
+.LVL477:
 	ldp	x27, x28, [sp, 80]
-.LVL481:
+.LVL478:
 	ldp	x29, x30, [sp], 112
 	.cfi_remember_state
 	.cfi_restore 30
@@ -4274,309 +4399,309 @@
 	.cfi_restore 19
 	.cfi_restore 20
 	.cfi_def_cfa 31, 0
-.LVL482:
+.LVL479:
 	ret
+.LVL480:
+	.p2align 3
+.L440:
+	.cfi_restore_state
+.LBB1516:
+.LBB1514:
+.LBB1494:
+.LBB1486:
+	.loc 1 712 0 discriminator 7
+	and	w0, w0, 268435455
+.LVL481:
+	and	w6, w6, -268435456
+.LVL482:
+	orr	w0, w6, w0
 .LVL483:
+	strb	wzr, [x1, -1]
+.LVL484:
+.L306:
+.LBE1486:
+	.loc 1 714 0
+	str	w0, [x25, x7, lsl 2]
+	b	.L307
+.LVL485:
+	.p2align 3
+.L439:
+.LBB1487:
+	.loc 1 711 0 discriminator 7
+	and	w0, w0, -251658241
+.LVL486:
+	and	w3, w6, 251658240
+.LVL487:
+	orr	w0, w3, w0
+.LVL488:
+	mov	w4, 0
+	mov	w9, 1
+	b	.L302
+.LVL489:
 	.p2align 3
 .L438:
-	.cfi_restore_state
-.LBB1454:
-.LBB1452:
-.LBB1432:
-.LBB1424:
-	.loc 1 713 0 discriminator 7
-	and	w0, w0, 268435455
-.LVL484:
-	and	w6, w6, -268435456
-.LVL485:
-	orr	w0, w6, w0
-.LVL486:
-	strb	wzr, [x1, -1]
-.LVL487:
-.L304:
-.LBE1424:
-	.loc 1 715 0
-	str	w0, [x25, x7, lsl 2]
-	b	.L305
-.LVL488:
+.LBE1487:
+.LBB1488:
+	.loc 1 710 0 discriminator 7
+	and	w0, w0, -15728641
+.LVL490:
+	and	w3, w6, 15728640
+.LVL491:
+	orr	w0, w3, w0
+.LVL492:
+	mov	w4, 0
+	mov	w9, 1
+	b	.L299
+.LVL493:
 	.p2align 3
 .L437:
-.LBB1425:
-	.loc 1 712 0 discriminator 7
-	and	w0, w0, -251658241
-.LVL489:
-	and	w3, w6, 251658240
-.LVL490:
+.LBE1488:
+.LBB1489:
+	.loc 1 709 0 discriminator 7
+	and	w0, w0, -983041
+.LVL494:
+	and	w3, w6, 983040
+.LVL495:
 	orr	w0, w3, w0
-.LVL491:
+.LVL496:
 	mov	w4, 0
 	mov	w9, 1
-	b	.L300
-.LVL492:
+	b	.L296
+.LVL497:
 	.p2align 3
 .L436:
-.LBE1425:
-.LBB1426:
-	.loc 1 711 0 discriminator 7
-	and	w0, w0, -15728641
-.LVL493:
-	and	w3, w6, 15728640
-.LVL494:
+.LBE1489:
+.LBB1490:
+	.loc 1 708 0 discriminator 7
+	and	w0, w0, -61441
+.LVL498:
+	and	w3, w6, 61440
+.LVL499:
 	orr	w0, w3, w0
-.LVL495:
+.LVL500:
 	mov	w4, 0
 	mov	w9, 1
-	b	.L297
-.LVL496:
+	b	.L293
+.LVL501:
 	.p2align 3
 .L435:
-.LBE1426:
-.LBB1427:
-	.loc 1 710 0 discriminator 7
-	and	w0, w0, -983041
-.LVL497:
-	and	w3, w6, 983040
-.LVL498:
+.LBE1490:
+.LBB1491:
+	.loc 1 707 0 discriminator 7
+	and	w0, w0, -3841
+.LVL502:
+	and	w3, w6, 3840
+.LVL503:
 	orr	w0, w3, w0
-.LVL499:
+.LVL504:
 	mov	w4, 0
 	mov	w9, 1
-	b	.L294
-.LVL500:
+	b	.L290
+.LVL505:
 	.p2align 3
 .L434:
-.LBE1427:
-.LBB1428:
-	.loc 1 709 0 discriminator 7
-	and	w0, w0, -61441
-.LVL501:
-	and	w3, w6, 61440
-.LVL502:
+.LBE1491:
+.LBB1492:
+	.loc 1 706 0 discriminator 7
+	and	w0, w0, -241
+.LVL506:
+	and	w3, w6, 240
+.LVL507:
 	orr	w0, w3, w0
-.LVL503:
+.LVL508:
 	mov	w4, 0
 	mov	w9, 1
-	b	.L291
-.LVL504:
+	b	.L287
+.LVL509:
 	.p2align 3
 .L433:
-.LBE1428:
-.LBB1429:
-	.loc 1 708 0 discriminator 7
-	and	w0, w0, -3841
-.LVL505:
-	and	w3, w6, 3840
-.LVL506:
-	orr	w0, w3, w0
-.LVL507:
-	mov	w4, 0
-	mov	w9, 1
-	b	.L288
-.LVL508:
-	.p2align 3
-.L432:
-.LBE1429:
-.LBB1430:
-	.loc 1 707 0 discriminator 7
-	and	w0, w0, -241
-.LVL509:
-	and	w3, w6, 240
-.LVL510:
-	orr	w0, w3, w0
-.LVL511:
-	mov	w4, 0
-	mov	w9, 1
-	b	.L285
-.LVL512:
-	.p2align 3
-.L431:
-.LBE1430:
-.LBB1431:
-	.loc 1 706 0 discriminator 7
+.LBE1492:
+.LBB1493:
+	.loc 1 705 0 discriminator 7
 	bfi	w0, w15, 0, 4
 	mov	w3, 0
 	mov	w9, 1
-	b	.L282
+	b	.L284
+.LVL510:
+	.p2align 3
+.L448:
+.LBE1493:
+.LBE1494:
+.LBE1514:
+.LBB1515:
+.LBB1513:
+.LBB1505:
+	.loc 1 742 0 discriminator 7
+	and	w0, w0, 268435455
+.LVL511:
+	and	w7, w7, -268435456
+.LVL512:
+	orr	w0, w7, w0
 .LVL513:
+	strb	wzr, [x1, -1]
+.LVL514:
+.L334:
+.LBE1505:
+	.loc 1 744 0
+	str	w0, [x25, x6, lsl 2]
+	b	.L335
+.LVL515:
 	.p2align 3
 .L446:
-.LBE1431:
-.LBE1432:
-.LBE1452:
-.LBB1453:
-.LBB1451:
-.LBB1443:
-	.loc 1 743 0 discriminator 7
-	and	w0, w0, 268435455
-.LVL514:
-	and	w7, w7, -268435456
-.LVL515:
-	orr	w0, w7, w0
-.LVL516:
-	strb	wzr, [x1, -1]
-.LVL517:
-.L332:
-.LBE1443:
-	.loc 1 745 0
-	str	w0, [x25, x6, lsl 2]
-	b	.L333
-.LVL518:
-	.p2align 3
-.L444:
-.LBB1444:
-	.loc 1 741 0 discriminator 7
+.LBB1506:
+	.loc 1 740 0 discriminator 7
 	and	w3, w7, 15728640
 	and	w0, w0, -15728641
+.LVL516:
+	orr	w0, w3, w0
+.LVL517:
+	mov	w4, 1
+	mov	w3, 0
+	b	.L327
+.LVL518:
+	.p2align 3
+.L447:
+.LBE1506:
+.LBB1507:
+	.loc 1 741 0 discriminator 7
+	and	w3, w7, 251658240
+	and	w0, w0, -251658241
 .LVL519:
 	orr	w0, w3, w0
 .LVL520:
 	mov	w4, 1
 	mov	w3, 0
-	b	.L325
+	b	.L330
 .LVL521:
 	.p2align 3
 .L445:
-.LBE1444:
-.LBB1445:
-	.loc 1 742 0 discriminator 7
-	and	w3, w7, 251658240
-	and	w0, w0, -251658241
+.LBE1507:
+.LBB1508:
+	.loc 1 739 0 discriminator 7
+	and	w3, w7, 983040
+	and	w0, w0, -983041
 .LVL522:
 	orr	w0, w3, w0
 .LVL523:
 	mov	w4, 1
 	mov	w3, 0
-	b	.L328
+	b	.L324
 .LVL524:
 	.p2align 3
-.L443:
-.LBE1445:
-.LBB1446:
-	.loc 1 740 0 discriminator 7
-	and	w3, w7, 983040
-	and	w0, w0, -983041
+.L444:
+.LBE1508:
+.LBB1509:
+	.loc 1 738 0 discriminator 7
+	and	w0, w0, -61441
 .LVL525:
-	orr	w0, w3, w0
+	and	w3, w7, 61440
 .LVL526:
-	mov	w4, 1
-	mov	w3, 0
-	b	.L322
+	orr	w0, w3, w0
 .LVL527:
+	mov	w9, 0
+	mov	w4, 1
+	b	.L321
+.LVL528:
+	.p2align 3
+.L443:
+.LBE1509:
+.LBB1510:
+	.loc 1 737 0 discriminator 7
+	and	w0, w0, -3841
+.LVL529:
+	and	w3, w7, 3840
+.LVL530:
+	orr	w0, w3, w0
+.LVL531:
+	mov	w9, 0
+	mov	w4, 1
+	b	.L318
+.LVL532:
 	.p2align 3
 .L442:
-.LBE1446:
-.LBB1447:
-	.loc 1 739 0 discriminator 7
-	and	w0, w0, -61441
-.LVL528:
-	and	w3, w7, 61440
-.LVL529:
+.LBE1510:
+.LBB1511:
+	.loc 1 736 0 discriminator 7
+	and	w0, w0, -241
+.LVL533:
+	and	w3, w7, 240
+.LVL534:
 	orr	w0, w3, w0
-.LVL530:
+.LVL535:
 	mov	w9, 0
 	mov	w4, 1
-	b	.L319
-.LVL531:
+	b	.L315
+.LVL536:
 	.p2align 3
 .L441:
-.LBE1447:
-.LBB1448:
-	.loc 1 738 0 discriminator 7
-	and	w0, w0, -3841
-.LVL532:
-	and	w3, w7, 3840
-.LVL533:
-	orr	w0, w3, w0
-.LVL534:
-	mov	w9, 0
-	mov	w4, 1
-	b	.L316
-.LVL535:
-	.p2align 3
-.L440:
-.LBE1448:
-.LBB1449:
-	.loc 1 737 0 discriminator 7
-	and	w0, w0, -241
-.LVL536:
-	and	w3, w7, 240
-.LVL537:
-	orr	w0, w3, w0
-.LVL538:
-	mov	w9, 0
-	mov	w4, 1
-	b	.L313
-.LVL539:
-	.p2align 3
-.L439:
-.LBE1449:
-.LBB1450:
-	.loc 1 736 0 discriminator 7
+.LBE1511:
+.LBB1512:
+	.loc 1 735 0 discriminator 7
 	bfi	w0, w15, 0, 4
 	mov	w3, 0
 	mov	w4, 1
-	b	.L310
-.LVL540:
-.L430:
-.LBE1450:
-.LBE1451:
-.LBE1453:
-.LBE1454:
-	.loc 1 679 0
+	b	.L312
+.LVL537:
+.L432:
+.LBE1512:
+.LBE1513:
+.LBE1515:
+.LBE1516:
+	.loc 1 678 0
 	add	w23, w23, w23, lsr 31
-.LVL541:
+.LVL538:
 	lsr	w14, w1, 2
 	asr	w23, w23, 1
-.LVL542:
+.LVL539:
 	mov	x0, 0
-	.loc 1 678 0
+	.loc 1 677 0
 	mov	w21, 0
-.LVL543:
-	b	.L275
-.LVL544:
-.L276:
-	.loc 1 681 0
+.LVL540:
+	b	.L277
+.LVL541:
+.L278:
+	.loc 1 680 0
 	add	w21, w23, w23, lsr 31
 	lsr	w14, w1, 2
 	asr	w21, w21, 1
-.LVL545:
-	.loc 1 686 0
+.LVL542:
+	.loc 1 685 0
 	add	x24, x5, 64
-	.loc 1 682 0
+	.loc 1 681 0
 	mul	w0, w20, w21
-	.loc 1 684 0
-	mul	w1, w21, w1
-	.loc 1 682 0
-	sbfiz	x0, x0, 2, 32
-	.loc 1 684 0
-	add	x27, x3, x1
-	.loc 1 682 0
-	add	x26, x26, x0
 	.loc 1 683 0
+	mul	w1, w21, w1
+	.loc 1 681 0
+	sbfiz	x0, x0, 2, 32
+	.loc 1 683 0
+	add	x27, x3, x1
+	.loc 1 681 0
+	add	x26, x26, x0
+	.loc 1 682 0
 	add	x25, x2, x0
 	mul	w0, w21, w14
-	.loc 1 685 0
+	.loc 1 684 0
 	add	x28, x4, x1
 	sxtw	x0, w0
-	b	.L275
-.LVL546:
-.L336:
-	.loc 1 670 0
+	b	.L277
+.LVL543:
+.L338:
+	.loc 1 669 0
 	mov	w5, 0
-.LVL547:
-	.loc 1 756 0
+.LVL544:
+	.loc 1 755 0
 	str	w5, [x24]
-	.loc 1 757 0
+	.loc 1 756 0
 	ldp	x19, x20, [sp, 16]
-.LVL548:
+.LVL545:
 	ldp	x21, x22, [sp, 32]
-.LVL549:
+.LVL546:
 	ldp	x23, x24, [sp, 48]
-.LVL550:
+.LVL547:
 	ldp	x25, x26, [sp, 64]
-.LVL551:
+.LVL548:
 	ldp	x27, x28, [sp, 80]
-.LVL552:
+.LVL549:
 	ldp	x29, x30, [sp], 112
 	.cfi_restore 20
 	.cfi_restore 19
@@ -4600,37 +4725,37 @@
 	.type	get_overlay_image, %function
 get_overlay_image:
 .LFB2820:
-	.loc 1 595 0
+	.loc 1 594 0
 	.cfi_startproc
-.LVL553:
+.LVL550:
 	stp	x29, x30, [sp, -112]!
 	.cfi_def_cfa_offset 112
 	.cfi_offset 29, -112
 	.cfi_offset 30, -104
-	.loc 1 596 0
-	adrp	x7, .LANCHOR0
-	.loc 1 605 0
-	cmp	w6, 2
 	.loc 1 595 0
+	adrp	x7, .LANCHOR0
+	.loc 1 604 0
+	cmp	w6, 2
+	.loc 1 594 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
 	stp	x23, x24, [sp, 48]
 	.cfi_offset 23, -64
 	.cfi_offset 24, -56
-	.loc 1 596 0
-	ldr	x23, [x7, #:lo12:.LANCHOR0]
 	.loc 1 595 0
+	ldr	x23, [x7, #:lo12:.LANCHOR0]
+	.loc 1 594 0
 	stp	x19, x20, [sp, 16]
 	.cfi_offset 19, -96
 	.cfi_offset 20, -88
 	mov	x19, x5
-	.loc 1 602 0
+	.loc 1 601 0
 	add	x23, x23, 24
-	.loc 1 595 0
+	.loc 1 594 0
 	stp	x21, x22, [sp, 32]
 	stp	x25, x26, [sp, 64]
 	mov	x5, x0
-.LVL554:
+.LVL551:
 	stp	x27, x28, [sp, 80]
 	.cfi_offset 21, -80
 	.cfi_offset 22, -72
@@ -4638,40 +4763,40 @@
 	.cfi_offset 26, -40
 	.cfi_offset 27, -32
 	.cfi_offset 28, -24
-	.loc 1 595 0
+	.loc 1 594 0
 	mov	x21, x1
 	mov	x20, x2
 	mov	x25, x3
-	.loc 1 603 0
-	ldp	w12, w0, [x23, 84]
-.LVL555:
-	.loc 1 595 0
-	mov	x26, x4
-	.loc 1 599 0
-	add	x28, x19, 60
-.LVL556:
 	.loc 1 602 0
+	ldp	w12, w0, [x23, 84]
+.LVL552:
+	.loc 1 594 0
+	mov	x26, x4
+	.loc 1 598 0
+	add	x28, x19, 60
+.LVL553:
+	.loc 1 601 0
 	lsr	w22, w12, 3
-	.loc 1 605 0
-	beq	.L530
+	.loc 1 604 0
+	beq	.L532
 	mov	w27, w0
-.LVL557:
-	.loc 1 608 0
+.LVL554:
+	.loc 1 607 0
 	cmp	w6, 3
-	.loc 1 616 0
+	.loc 1 615 0
 	mov	w24, 0
-.LVL558:
-	.loc 1 608 0
-	beq	.L531
-.L449:
-	.loc 1 620 0
-	ldr	w1, [x23, 156]
+.LVL555:
+	.loc 1 607 0
+	beq	.L533
+.L451:
 	.loc 1 619 0
+	ldr	w1, [x23, 156]
+	.loc 1 618 0
 	lsr	w12, w12, 2
-.LVL559:
+.LVL556:
+	.loc 1 619 0
+	cbz	w1, .L452
 	.loc 1 620 0
-	cbz	w1, .L450
-	.loc 1 621 0
 	sub	w2, w27, w24
 	sub	w0, w0, w27
 	str	x5, [x29, 96]
@@ -4682,73 +4807,73 @@
 	sxtw	x2, w2
 	add	x0, x5, x0
 	bl	memset
-.LVL560:
-	.loc 1 622 0
+.LVL557:
+	.loc 1 621 0
 	ldr	w0, [x23, 88]
-	.loc 1 629 0
+	.loc 1 628 0
 	cmp	w24, w27
-	.loc 1 622 0
+	.loc 1 621 0
 	ldr	w12, [x29, 108]
 	sub	w0, w0, #1
 	ldr	x5, [x29, 96]
-.LVL561:
+.LVL558:
 	sub	w0, w0, w24
-.LVL562:
+.LVL559:
 	mul	w0, w0, w12
-	.loc 1 623 0
-	neg	w12, w12
 	.loc 1 622 0
+	neg	w12, w12
+	.loc 1 621 0
 	add	x23, x5, x0
-.LVL563:
-	.loc 1 629 0
-	bge	.L485
-.L540:
+.LVL560:
+	.loc 1 628 0
+	bge	.L487
+.L542:
 	sub	w4, w22, #1
 	sxtw	x12, w12
-.LVL564:
+.LVL561:
 	add	x4, x4, 1
 	mov	w3, 0
-.LVL565:
+.LVL562:
 	lsl	x11, x4, 3
 	lsl	x4, x4, 2
-.LVL566:
+.LVL563:
 	.p2align 2
-.L452:
+.L454:
 	add	x1, x25, 8
 	add	x7, x26, 8
-	.loc 1 630 0 discriminator 1
+	.loc 1 629 0 discriminator 1
 	mov	x6, 0
-	cbz	w22, .L483
+	cbz	w22, .L485
 	.p2align 2
-.L519:
-.LBB1455:
-	.loc 1 631 0
+.L521:
+.LBB1517:
+	.loc 1 630 0
 	ldr	w2, [x21, x6, lsl 2]
-.LVL567:
-	.loc 1 632 0
+.LVL564:
+	.loc 1 631 0
 	ldr	w0, [x20, x6, lsl 2]
-.LVL568:
-	.loc 1 634 0
+.LVL565:
+	.loc 1 633 0
 	cmp	w2, w0
-	beq	.L454
-.LBB1456:
-	.loc 1 638 0
+	beq	.L456
+.LBB1518:
+	.loc 1 637 0
 	eor	w5, w2, w0
-	.loc 1 636 0
+	.loc 1 635 0
 	lsl	w9, w6, 1
-.LVL569:
+.LVL566:
 	add	x9, x23, x9
-.LVL570:
-	.loc 1 641 0
+.LVL567:
+	.loc 1 640 0
 	tst	x5, 15
-	beq	.L486
-.LBB1457:
-	.loc 1 641 0 is_stmt 0 discriminator 1
+	beq	.L488
+.LBB1519:
+	.loc 1 640 0 is_stmt 0 discriminator 1
 	ldrb	w13, [x7, -8]
-.LVL571:
+.LVL568:
 	and	w14, w2, 15
 	ldrb	w3, [x1, -8]
-.LVL572:
+.LVL569:
 	ubfiz	w8, w0, 5, 4
 	orr	w8, w8, w14
 	ldrb	w10, [x19, 56]
@@ -4760,32 +4885,32 @@
 	csel	w10, w10, w16, eq
 	ldr	x17, [x17, 128]
 	and	w3, w3, 255
-.LBE1457:
-	.loc 1 635 0 is_stmt 1 discriminator 1
+.LBE1519:
+	.loc 1 634 0 is_stmt 1 discriminator 1
 	mov	w13, 0
-.LVL573:
-.LBB1458:
-	.loc 1 641 0 discriminator 1
+.LVL570:
+.LBB1520:
+	.loc 1 640 0 discriminator 1
 	cmp	w10, w3
 	add	x8, x17, x8, uxtw
 	ldrb	w8, [x8, w15, sxtw]
-	beq	.L532
-.L457:
-	.loc 1 641 0 is_stmt 0 discriminator 9
+	beq	.L534
+.L459:
+	.loc 1 640 0 is_stmt 0 discriminator 9
 	strb	w3, [x1, -8]
-.LVL574:
-.L455:
-.LBE1458:
-	.loc 1 642 0 is_stmt 1 discriminator 10
+.LVL571:
+.L457:
+.LBE1520:
+	.loc 1 641 0 is_stmt 1 discriminator 10
 	tst	w5, 240
-	beq	.L458
-.LBB1459:
-	.loc 1 642 0 is_stmt 0 discriminator 1
+	beq	.L460
+.LBB1521:
+	.loc 1 641 0 is_stmt 0 discriminator 1
 	ldrb	w15, [x7, -7]
-.LVL575:
+.LVL572:
 	lsr	w10, w0, 4
 	ldrb	w3, [x1, -7]
-.LVL576:
+.LVL573:
 	ubfx	x16, x2, 4, 4
 	cmp	w15, 0
 	ubfiz	w10, w10, 5, 4
@@ -4796,7 +4921,7 @@
 	ldrb	w17, [x19, 57]
 	add	w3, w3, 1
 	ldr	x15, [x18, 128]
-.LVL577:
+.LVL574:
 	and	w3, w3, 255
 	csel	w14, w14, w17, eq
 	cmp	w14, w3
@@ -4804,22 +4929,22 @@
 	ldrb	w10, [x10, w16, sxtw]
 	ubfiz	w10, w10, 2, 6
 	orr	w8, w10, w8
-	beq	.L533
-.L460:
-	.loc 1 642 0 discriminator 9
+	beq	.L535
+.L462:
+	.loc 1 641 0 discriminator 9
 	strb	w3, [x1, -7]
-.LVL578:
-.L458:
-.LBE1459:
-	.loc 1 643 0 is_stmt 1 discriminator 10
+.LVL575:
+.L460:
+.LBE1521:
+	.loc 1 642 0 is_stmt 1 discriminator 10
 	tst	w5, 3840
-	beq	.L461
-.LBB1460:
-	.loc 1 643 0 is_stmt 0 discriminator 1
+	beq	.L463
+.LBB1522:
+	.loc 1 642 0 is_stmt 0 discriminator 1
 	ldrb	w15, [x7, -6]
-.LVL579:
+.LVL576:
 	lsr	w3, w0, 8
-.LVL580:
+.LVL577:
 	ldrb	w10, [x1, -6]
 	ubfx	x16, x2, 8, 4
 	cmp	w15, 0
@@ -4831,7 +4956,7 @@
 	ldrb	w17, [x19, 57]
 	add	w10, w10, 1
 	ldr	x15, [x18, 128]
-.LVL581:
+.LVL578:
 	and	w10, w10, 255
 	csel	w14, w14, w17, eq
 	cmp	w14, w10
@@ -4839,22 +4964,22 @@
 	ldrb	w3, [x3, w16, sxtw]
 	ubfiz	w3, w3, 4, 4
 	orr	w8, w3, w8
-	beq	.L534
-.L463:
-	.loc 1 643 0 discriminator 9
+	beq	.L536
+.L465:
+	.loc 1 642 0 discriminator 9
 	strb	w10, [x1, -6]
-.LVL582:
-.L461:
-.LBE1460:
-	.loc 1 644 0 is_stmt 1 discriminator 10
+.LVL579:
+.L463:
+.LBE1522:
+	.loc 1 643 0 is_stmt 1 discriminator 10
 	tst	w5, 61440
-	beq	.L464
-.LBB1461:
-	.loc 1 644 0 is_stmt 0 discriminator 1
+	beq	.L466
+.LBB1523:
+	.loc 1 643 0 is_stmt 0 discriminator 1
 	ldrb	w15, [x7, -5]
-.LVL583:
+.LVL580:
 	lsr	w3, w0, 12
-.LVL584:
+.LVL581:
 	ldrb	w10, [x1, -5]
 	ubfx	x16, x2, 12, 4
 	cmp	w15, 0
@@ -4866,7 +4991,7 @@
 	ldrb	w17, [x19, 57]
 	add	w10, w10, 1
 	ldr	x15, [x18, 128]
-.LVL585:
+.LVL582:
 	and	w10, w10, 255
 	csel	w14, w14, w17, eq
 	cmp	w14, w10
@@ -4874,27 +4999,27 @@
 	ldrb	w3, [x3, w16, sxtw]
 	ubfiz	w3, w3, 6, 2
 	orr	w8, w3, w8
-	beq	.L535
-.L466:
-	.loc 1 644 0 discriminator 9
+	beq	.L537
+.L468:
+	.loc 1 643 0 discriminator 9
 	strb	w10, [x1, -5]
-.LVL586:
-.L464:
-.LBE1461:
-	.loc 1 645 0 is_stmt 1 discriminator 10
+.LVL583:
+.L466:
+.LBE1523:
+	.loc 1 644 0 is_stmt 1 discriminator 10
 	strb	w8, [x9]
-	.loc 1 647 0 discriminator 10
-	tst	w5, 983040
 	.loc 1 646 0 discriminator 10
+	tst	w5, 983040
+	.loc 1 645 0 discriminator 10
 	mov	w8, 0
-	.loc 1 647 0 discriminator 10
-	beq	.L467
-.LBB1462:
-	.loc 1 647 0 is_stmt 0 discriminator 1
+	.loc 1 646 0 discriminator 10
+	beq	.L469
+.LBB1524:
+	.loc 1 646 0 is_stmt 0 discriminator 1
 	ldrb	w14, [x7, -4]
-.LVL587:
+.LVL584:
 	lsr	w3, w0, 16
-.LVL588:
+.LVL585:
 	ldrb	w10, [x1, -4]
 	ubfx	x15, x2, 16, 4
 	cmp	w14, 0
@@ -4906,28 +5031,28 @@
 	ldrb	w16, [x19, 57]
 	add	w10, w10, 1
 	ldr	x14, [x17, 128]
-.LVL589:
+.LVL586:
 	and	w10, w10, 255
 	csel	w8, w8, w16, eq
 	cmp	w8, w10
 	add	x3, x14, x3, uxtw
 	ldrb	w8, [x3, w15, sxtw]
-	beq	.L536
-.L469:
-	.loc 1 647 0 discriminator 9
+	beq	.L538
+.L471:
+	.loc 1 646 0 discriminator 9
 	strb	w10, [x1, -4]
-.LVL590:
-.L467:
-.LBE1462:
-	.loc 1 648 0 is_stmt 1 discriminator 10
+.LVL587:
+.L469:
+.LBE1524:
+	.loc 1 647 0 is_stmt 1 discriminator 10
 	tst	w5, 15728640
-	beq	.L470
-.LBB1463:
-	.loc 1 648 0 is_stmt 0 discriminator 1
+	beq	.L472
+.LBB1525:
+	.loc 1 647 0 is_stmt 0 discriminator 1
 	ldrb	w15, [x7, -3]
-.LVL591:
+.LVL588:
 	lsr	w3, w0, 20
-.LVL592:
+.LVL589:
 	ldrb	w10, [x1, -3]
 	ubfx	x16, x2, 20, 4
 	cmp	w15, 0
@@ -4939,7 +5064,7 @@
 	ldrb	w18, [x19, 57]
 	add	w10, w10, 1
 	ldr	x15, [x17, 128]
-.LVL593:
+.LVL590:
 	and	w10, w10, 255
 	csel	w14, w14, w18, eq
 	cmp	w14, w10
@@ -4947,22 +5072,22 @@
 	ldrb	w3, [x3, w16, sxtw]
 	ubfiz	w3, w3, 2, 6
 	orr	w8, w3, w8
-	beq	.L537
-.L472:
-	.loc 1 648 0 discriminator 9
+	beq	.L539
+.L474:
+	.loc 1 647 0 discriminator 9
 	strb	w10, [x1, -3]
-.LVL594:
-.L470:
-.LBE1463:
-	.loc 1 649 0 is_stmt 1 discriminator 10
+.LVL591:
+.L472:
+.LBE1525:
+	.loc 1 648 0 is_stmt 1 discriminator 10
 	tst	w5, 251658240
-	beq	.L473
-.LBB1464:
-	.loc 1 649 0 is_stmt 0 discriminator 1
+	beq	.L475
+.LBB1526:
+	.loc 1 648 0 is_stmt 0 discriminator 1
 	ldrb	w15, [x7, -2]
-.LVL595:
+.LVL592:
 	lsr	w3, w0, 24
-.LVL596:
+.LVL593:
 	ldrb	w10, [x1, -2]
 	ubfx	x16, x2, 24, 4
 	cmp	w15, 0
@@ -4974,7 +5099,7 @@
 	ldrb	w18, [x19, 57]
 	add	w10, w10, 1
 	ldr	x15, [x17, 128]
-.LVL597:
+.LVL594:
 	and	w10, w10, 255
 	csel	w14, w14, w18, eq
 	cmp	w14, w10
@@ -4982,25 +5107,25 @@
 	ldrb	w3, [x3, w16, sxtw]
 	ubfiz	w3, w3, 4, 4
 	orr	w8, w3, w8
-	beq	.L538
-.L475:
-	.loc 1 649 0 discriminator 9
+	beq	.L540
+.L477:
+	.loc 1 648 0 discriminator 9
 	strb	w10, [x1, -2]
-.LVL598:
-.L473:
-.LBE1464:
-	.loc 1 650 0 is_stmt 1 discriminator 10
+.LVL595:
+.L475:
+.LBE1526:
+	.loc 1 649 0 is_stmt 1 discriminator 10
 	tst	w5, -268435456
-	beq	.L476
-.LBB1465:
-	.loc 1 650 0 is_stmt 0 discriminator 1
+	beq	.L478
+.LBB1527:
+	.loc 1 649 0 is_stmt 0 discriminator 1
 	ldrb	w14, [x7, -1]
-.LVL599:
+.LVL596:
 	lsr	w10, w2, 28
 	ldrb	w3, [x1, -1]
-.LVL600:
+.LVL597:
 	lsr	w5, w0, 28
-.LVL601:
+.LVL598:
 	cmp	w14, 0
 	add	w5, w10, w5, lsl 5
 	add	x17, x19, x14, sxtw 3
@@ -5009,7 +5134,7 @@
 	ldrb	w16, [x19, 57]
 	add	w3, w3, 1
 	ldr	x14, [x17, 128]
-.LVL602:
+.LVL599:
 	and	w3, w3, 255
 	csel	w10, w10, w16, eq
 	cmp	w10, w3
@@ -5017,51 +5142,51 @@
 	ldrb	w5, [x5, w15, sxtw]
 	ubfiz	w5, w5, 6, 2
 	orr	w8, w5, w8
-	beq	.L539
-	.loc 1 650 0 discriminator 9
+	beq	.L541
+	.loc 1 649 0 discriminator 9
 	strb	w3, [x1, -1]
-.LVL603:
-.L476:
-.LBE1465:
-	.loc 1 651 0 is_stmt 1 discriminator 10
-	cbnz	w13, .L479
-.L480:
-	.loc 1 653 0
+.LVL600:
+.L478:
+.LBE1527:
+	.loc 1 650 0 is_stmt 1 discriminator 10
+	cbnz	w13, .L481
+.L482:
+	.loc 1 652 0
 	strb	w8, [x9, 1]
-	.loc 1 640 0
+	.loc 1 639 0
 	mov	w3, 1
-.L454:
+.L456:
 	add	x6, x6, 1
 	add	x1, x1, 8
 	add	x7, x7, 8
-.LBE1456:
-.LBE1455:
-	.loc 1 630 0 discriminator 2
+.LBE1518:
+.LBE1517:
+	.loc 1 629 0 discriminator 2
 	cmp	w22, w6
-	bgt	.L519
+	bgt	.L521
 	add	x25, x25, x11
 	add	x26, x26, x11
 	add	x20, x20, x4
 	add	x21, x21, x4
-.L483:
-	.loc 1 629 0
+.L485:
+	.loc 1 628 0
 	add	w24, w24, 1
 	add	x23, x23, x12
 	cmp	w27, w24
-	bne	.L452
-	.loc 1 663 0
+	bne	.L454
+	.loc 1 662 0
 	str	w3, [x28]
-	.loc 1 664 0
+	.loc 1 663 0
 	ldp	x19, x20, [sp, 16]
-.LVL604:
+.LVL601:
 	ldp	x21, x22, [sp, 32]
-.LVL605:
+.LVL602:
 	ldp	x23, x24, [sp, 48]
-.LVL606:
+.LVL603:
 	ldp	x25, x26, [sp, 64]
-.LVL607:
+.LVL604:
 	ldp	x27, x28, [sp, 80]
-.LVL608:
+.LVL605:
 	ldp	x29, x30, [sp], 112
 	.cfi_remember_state
 	.cfi_restore 30
@@ -5078,164 +5203,164 @@
 	.cfi_restore 20
 	.cfi_def_cfa 31, 0
 	ret
-.LVL609:
+.LVL606:
 	.p2align 3
-.L539:
+.L541:
 	.cfi_restore_state
-.LBB1475:
-.LBB1474:
-.LBB1466:
-	.loc 1 650 0 discriminator 7
-	and	w0, w0, 268435455
-.LVL610:
-	and	w2, w2, -268435456
-.LVL611:
-	orr	w0, w2, w0
-.LVL612:
-	strb	wzr, [x1, -1]
-.LVL613:
-.L479:
-.LBE1466:
-	.loc 1 652 0
-	str	w0, [x20, x6, lsl 2]
-	b	.L480
-.LVL614:
-	.p2align 3
-.L538:
-.LBB1467:
+.LBB1537:
+.LBB1536:
+.LBB1528:
 	.loc 1 649 0 discriminator 7
+	and	w0, w0, 268435455
+.LVL607:
+	and	w2, w2, -268435456
+.LVL608:
+	orr	w0, w2, w0
+.LVL609:
+	strb	wzr, [x1, -1]
+.LVL610:
+.L481:
+.LBE1528:
+	.loc 1 651 0
+	str	w0, [x20, x6, lsl 2]
+	b	.L482
+.LVL611:
+	.p2align 3
+.L540:
+.LBB1529:
+	.loc 1 648 0 discriminator 7
 	and	w0, w0, -251658241
-.LVL615:
+.LVL612:
 	and	w3, w2, 251658240
 	orr	w0, w3, w0
-.LVL616:
+.LVL613:
 	mov	w10, 0
 	mov	w13, 1
-	b	.L475
+	b	.L477
 	.p2align 3
-.L537:
-.LBE1467:
-.LBB1468:
-	.loc 1 648 0 discriminator 7
+.L539:
+.LBE1529:
+.LBB1530:
+	.loc 1 647 0 discriminator 7
 	and	w0, w0, -15728641
-.LVL617:
+.LVL614:
 	and	w3, w2, 15728640
 	orr	w0, w3, w0
-.LVL618:
+.LVL615:
 	mov	w10, 0
 	mov	w13, 1
-	b	.L472
+	b	.L474
 	.p2align 3
-.L535:
-.LBE1468:
-.LBB1469:
-	.loc 1 644 0 discriminator 7
+.L537:
+.LBE1530:
+.LBB1531:
+	.loc 1 643 0 discriminator 7
 	and	w0, w0, -61441
-.LVL619:
+.LVL616:
 	and	w3, w2, 61440
 	orr	w0, w3, w0
-.LVL620:
+.LVL617:
 	mov	w10, 0
 	mov	w13, 1
-	b	.L466
+	b	.L468
 	.p2align 3
-.L536:
-.LBE1469:
-.LBB1470:
-	.loc 1 647 0 discriminator 7
+.L538:
+.LBE1531:
+.LBB1532:
+	.loc 1 646 0 discriminator 7
 	and	w0, w0, -983041
-.LVL621:
+.LVL618:
 	and	w3, w2, 983040
 	orr	w0, w3, w0
-.LVL622:
+.LVL619:
 	mov	w10, 0
 	mov	w13, 1
-	b	.L469
+	b	.L471
 	.p2align 3
-.L534:
-.LBE1470:
-.LBB1471:
-	.loc 1 643 0 discriminator 7
+.L536:
+.LBE1532:
+.LBB1533:
+	.loc 1 642 0 discriminator 7
 	and	w0, w0, -3841
-.LVL623:
+.LVL620:
 	and	w3, w2, 3840
 	orr	w0, w3, w0
-.LVL624:
+.LVL621:
 	mov	w10, 0
 	mov	w13, 1
-	b	.L463
+	b	.L465
 	.p2align 3
-.L532:
-.LBE1471:
-.LBB1472:
-	.loc 1 641 0 discriminator 7
+.L534:
+.LBE1533:
+.LBB1534:
+	.loc 1 640 0 discriminator 7
 	bfi	w0, w14, 0, 4
 	mov	w3, 0
 	mov	w13, 1
-	b	.L457
+	b	.L459
 	.p2align 3
-.L533:
-.LBE1472:
-.LBB1473:
-	.loc 1 642 0 discriminator 7
+.L535:
+.LBE1534:
+.LBB1535:
+	.loc 1 641 0 discriminator 7
 	and	w3, w2, 240
 	and	w0, w0, -241
-.LVL625:
+.LVL622:
 	orr	w0, w3, w0
-.LVL626:
+.LVL623:
 	mov	w13, 1
 	mov	w3, 0
-	b	.L460
-.LVL627:
+	b	.L462
+.LVL624:
 	.p2align 3
-.L486:
-.LBE1473:
-	.loc 1 637 0
+.L488:
+.LBE1535:
+	.loc 1 636 0
 	mov	w8, 0
-	.loc 1 635 0
+	.loc 1 634 0
 	mov	w13, 0
-	b	.L455
-.LVL628:
-.L450:
-.LBE1474:
-.LBE1475:
-	.loc 1 626 0
-	sub	w2, w27, w24
+	b	.L457
+.LVL625:
+.L452:
+.LBE1536:
+.LBE1537:
 	.loc 1 625 0
+	sub	w2, w27, w24
+	.loc 1 624 0
 	mul	w23, w24, w12
 	str	w12, [x29, 108]
-	.loc 1 626 0
+	.loc 1 625 0
 	mov	w1, 0
 	mul	w2, w2, w12
-	.loc 1 625 0
+	.loc 1 624 0
 	add	x23, x5, x23, sxtw
-.LVL629:
-	.loc 1 626 0
+.LVL626:
+	.loc 1 625 0
 	mov	x0, x23
 	sxtw	x2, w2
 	bl	memset
-.LVL630:
+.LVL627:
 	ldr	w12, [x29, 108]
-	.loc 1 629 0
+	.loc 1 628 0
 	cmp	w24, w27
-	blt	.L540
-.LVL631:
-.L485:
+	blt	.L542
+.LVL628:
+.L487:
 	mov	w3, 0
-.LVL632:
-	.loc 1 663 0
+.LVL629:
+	.loc 1 662 0
 	str	w3, [x28]
-	.loc 1 664 0
+	.loc 1 663 0
 	ldp	x19, x20, [sp, 16]
-.LVL633:
+.LVL630:
 	ldp	x21, x22, [sp, 32]
-.LVL634:
+.LVL631:
 	ldp	x23, x24, [sp, 48]
-.LVL635:
+.LVL632:
 	ldp	x25, x26, [sp, 64]
-.LVL636:
+.LVL633:
 	ldp	x27, x28, [sp, 80]
-.LVL637:
+.LVL634:
 	ldp	x29, x30, [sp], 112
 	.cfi_remember_state
 	.cfi_restore 20
@@ -5252,39 +5377,39 @@
 	.cfi_restore 30
 	.cfi_def_cfa 31, 0
 	ret
-.LVL638:
-.L530:
+.LVL635:
+.L532:
 	.cfi_restore_state
-	.loc 1 607 0
-	add	w27, w0, w0, lsr 31
 	.loc 1 606 0
+	add	w27, w0, w0, lsr 31
+	.loc 1 605 0
 	mov	w24, 0
-.LVL639:
-	.loc 1 607 0
+.LVL636:
+	.loc 1 606 0
 	asr	w27, w27, 1
-.LVL640:
-	b	.L449
-.L531:
-	.loc 1 609 0
+.LVL637:
+	b	.L451
+.L533:
+	.loc 1 608 0
 	add	w24, w0, w0, lsr 31
-.LVL641:
-	.loc 1 614 0
+.LVL638:
+	.loc 1 613 0
 	add	x28, x19, 64
-	.loc 1 609 0
+	.loc 1 608 0
 	asr	w24, w24, 1
-.LVL642:
-	.loc 1 610 0
+.LVL639:
+	.loc 1 609 0
 	mul	w1, w22, w24
 	sbfiz	x1, x1, 2, 32
 	add	x21, x21, x1
-	.loc 1 611 0
+	.loc 1 610 0
 	add	x20, x2, x1
-	.loc 1 612 0
+	.loc 1 611 0
 	mul	w1, w24, w12
 	add	x25, x3, x1
-	.loc 1 613 0
+	.loc 1 612 0
 	add	x26, x4, x1
-	b	.L449
+	b	.L451
 	.cfi_endproc
 .LFE2820:
 	.size	get_overlay_image, .-get_overlay_image
@@ -5293,56 +5418,56 @@
 	.type	frame_done_callback, %function
 frame_done_callback:
 .LFB2838:
-	.loc 1 2067 0
+	.loc 1 2068 0
 	.cfi_startproc
 	stp	x29, x30, [sp, -48]!
 	.cfi_def_cfa_offset 48
 	.cfi_offset 29, -48
 	.cfi_offset 30, -40
-	.loc 1 2068 0
+	.loc 1 2069 0
 	adrp	x0, .LANCHOR0
-	.loc 1 2067 0
+	.loc 1 2068 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
 	stp	x19, x20, [sp, 16]
 	.cfi_offset 19, -32
 	.cfi_offset 20, -24
-	.loc 1 2068 0
+	.loc 1 2069 0
 	ldr	x20, [x0, #:lo12:.LANCHOR0]
-	.loc 1 2067 0
+	.loc 1 2068 0
 	str	x21, [sp, 32]
 	.cfi_offset 21, -16
-	.loc 1 2070 0
+	.loc 1 2071 0
 	add	x19, x20, 192
-	ldr	w1, [x19, 264]
+	ldr	w1, [x19, 252]
 	cmp	w1, 3
-	beq	.L543
+	beq	.L545
 	cmp	w1, 4
-	beq	.L560
+	beq	.L562
 	add	x2, x0, :lo12:.LANCHOR0
-	.loc 1 2103 0
+	.loc 1 2104 0
 	ldr	w0, [x19, 72]
-	cbnz	w0, .L561
-	.loc 1 2108 0
-	ldr	x0, [x19, 104]
-	adrp	x1, .LC20
-	.loc 1 2107 0
-	str	wzr, [x19, 52]
-	.loc 1 2108 0
-	add	x1, x1, :lo12:.LC20
-	bl	_dev_info
-.LVL643:
-.L559:
+	cbnz	w0, .L563
 	.loc 1 2109 0
+	ldr	x0, [x19, 104]
+	adrp	x1, .LC19
+	.loc 1 2108 0
+	str	wzr, [x19, 52]
+	.loc 1 2109 0
+	add	x1, x1, :lo12:.LC19
+	bl	_dev_info
+.LVL640:
+.L561:
+	.loc 1 2110 0
 	adrp	x0, .LANCHOR1
 	add	x0, x0, :lo12:.LANCHOR1
 	mov	w2, 1
 	add	x0, x0, 304
 	mov	w1, w2
 	bl	__wake_up_sync
-.LVL644:
-.L541:
-	.loc 1 2113 0
+.LVL641:
+.L543:
+	.loc 1 2114 0
 	ldp	x19, x20, [sp, 16]
 	ldr	x21, [sp, 32]
 	ldp	x29, x30, [sp], 48
@@ -5355,69 +5480,69 @@
 	.cfi_def_cfa 31, 0
 	ret
 	.p2align 3
-.L560:
+.L562:
 	.cfi_restore_state
-	.loc 1 2073 0
+	.loc 1 2074 0
 	ldr	w1, [x19, 60]
-	.loc 1 2072 0
+	.loc 1 2073 0
 	mov	w21, 1
 	str	w21, [x19, 76]
-	.loc 1 2073 0
-	cbnz	w1, .L548
-	.loc 1 2073 0 is_stmt 0 discriminator 1
+	.loc 1 2074 0
+	cbnz	w1, .L550
+	.loc 1 2074 0 is_stmt 0 discriminator 1
 	ldr	w1, [x19, 64]
-	cbnz	w1, .L548
-	.loc 1 2075 0 is_stmt 1
+	cbnz	w1, .L550
+	.loc 1 2076 0 is_stmt 1
 	ldr	w1, [x19, 68]
-	cbz	w1, .L548
-	.loc 1 2079 0
+	cbz	w1, .L550
+	.loc 1 2080 0
 	ldr	x0, [x19, 104]
-	adrp	x1, .LC18
-	add	x1, x1, :lo12:.LC18
+	adrp	x1, .LC17
+	add	x1, x1, :lo12:.LC17
 	bl	_dev_info
-.LVL645:
-	.loc 1 2081 0
+.LVL642:
+	.loc 1 2082 0
 	ldp	w3, w2, [x19, 92]
 	mov	w1, 0
-	ldr	x0, [x19, 176]
+	ldr	x0, [x19, 168]
 	mul	w2, w2, w3
 	sxtw	x2, w2
 	bl	memset
-.LVL646:
-	.loc 1 2082 0
+.LVL643:
+	.loc 1 2083 0
 	adrp	x2, jiffies
-	add	x0, x20, 736
+	add	x0, x20, 720
 	mov	x1, 402653184
 	ldr	x2, [x2, #:lo12:jiffies]
 	add	x1, x2, x1
 	bl	mod_timer
-.LVL647:
-	.loc 1 2083 0
-	str	wzr, [x19, 52]
+.LVL644:
 	.loc 1 2084 0
+	str	wzr, [x19, 52]
+	.loc 1 2085 0
 	adrp	x0, .LANCHOR1
 	add	x0, x0, :lo12:.LANCHOR1
 	mov	w2, w21
 	mov	w1, w21
 	add	x0, x0, 304
 	bl	__wake_up_sync
-.LVL648:
-	b	.L541
+.LVL645:
+	b	.L543
 	.p2align 3
-.L543:
-	.loc 1 2088 0
+.L545:
+	.loc 1 2089 0
 	ldr	w1, [x19, 60]
-	cbnz	w1, .L548
-	.loc 1 2088 0 is_stmt 0 discriminator 1
+	cbnz	w1, .L550
+	.loc 1 2089 0 is_stmt 0 discriminator 1
 	ldr	w1, [x19, 64]
-	cbz	w1, .L549
-.L548:
-	.loc 1 2089 0 is_stmt 1
+	cbz	w1, .L551
+.L550:
+	.loc 1 2090 0 is_stmt 1
 	add	x0, x0, :lo12:.LANCHOR0
 	ldr	x0, [x0, 8]
 	bl	wake_up_process
-.LVL649:
-	.loc 1 2113 0
+.LVL646:
+	.loc 1 2114 0
 	ldr	x21, [sp, 32]
 	ldp	x19, x20, [sp, 16]
 	ldp	x29, x30, [sp], 48
@@ -5430,47 +5555,47 @@
 	.cfi_def_cfa 31, 0
 	ret
 	.p2align 3
-.L549:
+.L551:
 	.cfi_restore_state
-	.loc 1 2090 0
+	.loc 1 2091 0
 	ldr	w1, [x19, 68]
-	cbz	w1, .L548
-	.loc 1 2094 0
+	cbz	w1, .L550
+	.loc 1 2095 0
 	ldr	x0, [x19, 104]
-	adrp	x1, .LC19
-	add	x1, x1, :lo12:.LC19
+	adrp	x1, .LC18
+	add	x1, x1, :lo12:.LC18
 	bl	_dev_info
-.LVL650:
-	.loc 1 2096 0
+.LVL647:
+	.loc 1 2097 0
 	ldp	w3, w2, [x19, 92]
 	mov	w1, 0
-	ldr	x0, [x19, 176]
+	ldr	x0, [x19, 168]
 	mul	w2, w2, w3
 	sxtw	x2, w2
 	bl	memset
-.LVL651:
-	.loc 1 2097 0
+.LVL648:
+	.loc 1 2098 0
 	adrp	x2, jiffies
 	mov	x1, 402653184
-	add	x0, x20, 736
+	add	x0, x20, 720
 	ldr	x2, [x2, #:lo12:jiffies]
 	add	x1, x2, x1
 	bl	mod_timer
-.LVL652:
-	.loc 1 2098 0
+.LVL649:
+	.loc 1 2099 0
 	str	wzr, [x19, 52]
-	b	.L559
+	b	.L561
 	.p2align 3
-.L561:
-	.loc 1 2105 0
+.L563:
+	.loc 1 2106 0
 	ldr	x0, [x2, 8]
-	.loc 1 2104 0
+	.loc 1 2105 0
 	mov	w1, 1
 	str	w1, [x19, 52]
-	.loc 1 2105 0
+	.loc 1 2106 0
 	bl	wake_up_process
-.LVL653:
-	.loc 1 2113 0
+.LVL650:
+	.loc 1 2114 0
 	ldr	x21, [sp, 32]
 	ldp	x19, x20, [sp, 16]
 	ldp	x29, x30, [sp], 48
@@ -5489,19 +5614,19 @@
 	.type	ebc_frame_timeout, %function
 ebc_frame_timeout:
 .LFB2847:
-	.loc 1 2845 0
+	.loc 1 2848 0
 	.cfi_startproc
-.LVL654:
+.LVL651:
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 2846 0
+	.loc 1 2849 0
 	bl	frame_done_callback
-.LVL655:
-	.loc 1 2848 0
+.LVL652:
+	.loc 1 2851 0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
 	.cfi_restore 29
@@ -5515,16 +5640,16 @@
 	.type	ebc_lut_update, %function
 ebc_lut_update:
 .LFB2840:
-	.loc 1 2159 0
+	.loc 1 2160 0
 	.cfi_startproc
-.LVL656:
+.LVL653:
 	stp	x29, x30, [sp, -64]!
 	.cfi_def_cfa_offset 64
 	.cfi_offset 29, -64
 	.cfi_offset 30, -56
-	.loc 1 2161 0
+	.loc 1 2162 0
 	mov	w4, 25
-	.loc 1 2159 0
+	.loc 1 2160 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
 	stp	x19, x20, [sp, 16]
@@ -5534,91 +5659,92 @@
 	stp	x21, x22, [sp, 32]
 	.cfi_offset 21, -32
 	.cfi_offset 22, -24
-	.loc 1 2161 0
+	.loc 1 2162 0
 	add	x0, x29, 64
-.LVL657:
-	.loc 1 2159 0
+.LVL654:
+	.loc 1 2160 0
 	adrp	x19, __stack_chk_guard
 	add	x3, x19, :lo12:__stack_chk_guard
-	.loc 1 2166 0
+	.loc 1 2167 0
 	ldr	x2, [x20, 16]
-	.loc 1 2159 0
+	.loc 1 2160 0
 	mov	w22, w1
-	.loc 1 2161 0
+	.loc 1 2162 0
 	str	w4, [x0, -12]!
-.LVL658:
-	.loc 1 2159 0
+.LVL655:
+	.loc 1 2160 0
 	ldr	x1, [x3]
 	str	x1, [x29, 56]
 	mov	x1,0
-.LVL659:
-.LBB1476:
-.LBB1477:
+.LVL656:
+.LBB1538:
+.LBB1539:
 	.loc 3 50 0
 	mov	x1, x0
 	mov	x0, x2
 	ldr	x2, [x2, 56]
 	blr	x2
-.LVL660:
-.LBE1477:
-.LBE1476:
-	.loc 1 2167 0
-	cbnz	w0, .L565
-.LVL661:
+.LVL657:
+.LBE1539:
+.LBE1538:
 	.loc 1 2168 0
-	ldr	w2, [x29, 52]
+	cbnz	w0, .L567
+.LVL658:
 	.loc 1 2169 0
+	ldr	w2, [x29, 52]
+	.loc 1 2170 0
 	add	x21, x20, 192
-	.loc 1 2168 0
-	tbnz	w2, #31, .L588
-	.loc 1 2172 0
+	.loc 1 2169 0
+	tbnz	w2, #31, .L590
+	.loc 1 2173 0
 	cmp	w2, 50
-	bgt	.L589
-.L567:
-	.loc 1 2180 0
+	bgt	.L591
+.L569:
+	.loc 1 2181 0
+	ldr	x0, [x21, 104]
+	adrp	x1, .LC23
+	add	x1, x1, :lo12:.LC23
+	bl	_dev_info
+.LVL659:
+	.loc 1 2184 0
+	cmp	w22, 23
+	bls	.L592
+.L570:
+	.loc 1 2240 0
+	mov	w0, 12
+	.loc 1 2241 0
+	mov	w1, 3
+	.loc 1 2240 0
+	str	w0, [x21, 144]
+	.p2align 2
+.L573:
+	.loc 1 2244 0
+	ldr	w2, [x29, 52]
+	add	x0, x20, 304
+	mov	w3, 16
+	bl	epd_lut_get
+.LVL660:
+	mov	w20, w0
+.LVL661:
+	.loc 1 2245 0
+	cbz	w0, .L566
+	.loc 1 2246 0
 	ldr	x0, [x21, 104]
 	adrp	x1, .LC24
 	add	x1, x1, :lo12:.LC24
-	bl	_dev_info
-.LVL662:
-	.loc 1 2183 0
-	cmp	w22, 23
-	bls	.L590
-.L568:
-	.loc 1 2239 0
-	mov	w0, 12
-	.loc 1 2240 0
-	mov	w1, 3
-	.loc 1 2239 0
-	str	w0, [x21, 144]
-	.p2align 2
-.L571:
-	.loc 1 2243 0
-	ldr	w2, [x29, 52]
-	add	x0, x20, 304
-	bl	epd_lut_get
-.LVL663:
-	mov	w20, w0
-.LVL664:
-	.loc 1 2244 0
-	cbz	w0, .L564
-	.loc 1 2245 0
-	ldr	x0, [x21, 104]
-	adrp	x1, .LC25
-	add	x1, x1, :lo12:.LC25
 	bl	_dev_err
-.LVL665:
-.L564:
-	.loc 1 2250 0
+.LVL662:
+.L566:
+	.loc 1 2251 0
 	add	x19, x19, :lo12:__stack_chk_guard
 	mov	w0, w20
 	ldr	x2, [x29, 56]
 	ldr	x1, [x19]
 	eor	x1, x2, x1
-	cbnz	x1, .L591
+	cbnz	x1, .L593
 	ldp	x19, x20, [sp, 16]
 	ldp	x21, x22, [sp, 32]
-.LVL666:
+.LVL663:
 	ldp	x29, x30, [sp], 64
 	.cfi_remember_state
 	.cfi_restore 30
@@ -5629,164 +5755,164 @@
 	.cfi_restore 20
 	.cfi_def_cfa 31, 0
 	ret
-.LVL667:
+.LVL664:
 	.p2align 3
-.L590:
+.L592:
 	.cfi_restore_state
-	.loc 1 2183 0
-	adrp	x0, .L570
-	add	x0, x0, :lo12:.L570
+	.loc 1 2184 0
+	adrp	x0, .L572
+	add	x0, x0, :lo12:.L572
 	ldrb	w0, [x0,w22,uxtw]
-	adr	x1, .Lrtx570
+	adr	x1, .Lrtx572
 	add	x0, x1, w0, sxtb #2
 	br	x0
-.Lrtx570:
+.Lrtx572:
 	.section	.rodata
 	.align	0
 	.align	2
-.L570:
-	.byte	(.L568 - .Lrtx570) / 4
-	.byte	(.L582 - .Lrtx570) / 4
-	.byte	(.L568 - .Lrtx570) / 4
-	.byte	(.L572 - .Lrtx570) / 4
-	.byte	(.L573 - .Lrtx570) / 4
-	.byte	(.L574 - .Lrtx570) / 4
-	.byte	(.L575 - .Lrtx570) / 4
-	.byte	(.L568 - .Lrtx570) / 4
-	.byte	(.L572 - .Lrtx570) / 4
-	.byte	(.L573 - .Lrtx570) / 4
-	.byte	(.L574 - .Lrtx570) / 4
-	.byte	(.L575 - .Lrtx570) / 4
-	.byte	(.L576 - .Lrtx570) / 4
-	.byte	(.L576 - .Lrtx570) / 4
-	.byte	(.L577 - .Lrtx570) / 4
-	.byte	(.L578 - .Lrtx570) / 4
-	.byte	(.L577 - .Lrtx570) / 4
-	.byte	(.L579 - .Lrtx570) / 4
-	.byte	(.L568 - .Lrtx570) / 4
-	.byte	(.L568 - .Lrtx570) / 4
-	.byte	(.L568 - .Lrtx570) / 4
-	.byte	(.L568 - .Lrtx570) / 4
-	.byte	(.L577 - .Lrtx570) / 4
-	.byte	(.L578 - .Lrtx570) / 4
+.L572:
+	.byte	(.L570 - .Lrtx572) / 4
+	.byte	(.L584 - .Lrtx572) / 4
+	.byte	(.L570 - .Lrtx572) / 4
+	.byte	(.L574 - .Lrtx572) / 4
+	.byte	(.L575 - .Lrtx572) / 4
+	.byte	(.L576 - .Lrtx572) / 4
+	.byte	(.L577 - .Lrtx572) / 4
+	.byte	(.L570 - .Lrtx572) / 4
+	.byte	(.L574 - .Lrtx572) / 4
+	.byte	(.L575 - .Lrtx572) / 4
+	.byte	(.L576 - .Lrtx572) / 4
+	.byte	(.L577 - .Lrtx572) / 4
+	.byte	(.L578 - .Lrtx572) / 4
+	.byte	(.L578 - .Lrtx572) / 4
+	.byte	(.L579 - .Lrtx572) / 4
+	.byte	(.L580 - .Lrtx572) / 4
+	.byte	(.L579 - .Lrtx572) / 4
+	.byte	(.L581 - .Lrtx572) / 4
+	.byte	(.L570 - .Lrtx572) / 4
+	.byte	(.L570 - .Lrtx572) / 4
+	.byte	(.L570 - .Lrtx572) / 4
+	.byte	(.L570 - .Lrtx572) / 4
+	.byte	(.L579 - .Lrtx572) / 4
+	.byte	(.L580 - .Lrtx572) / 4
 	.text
-.LVL668:
+.LVL665:
 	.p2align 3
-.L565:
-	.loc 1 2178 0
+.L567:
+	.loc 1 2179 0
 	add	x21, x20, 192
 	mov	w2, w0
-	adrp	x1, .LC23
-	add	x1, x1, :lo12:.LC23
-	ldr	x0, [x21, 104]
-	bl	_dev_err
-.LVL669:
-	ldr	w2, [x29, 52]
-	b	.L567
-	.p2align 3
-.L589:
-	.loc 1 2173 0
-	ldr	x0, [x21, 104]
 	adrp	x1, .LC22
 	add	x1, x1, :lo12:.LC22
-	bl	_dev_info
-.LVL670:
+	ldr	x0, [x21, 104]
+	bl	_dev_err
+.LVL666:
+	ldr	w2, [x29, 52]
+	b	.L569
+	.p2align 3
+.L591:
 	.loc 1 2174 0
-	mov	w2, 50
-	str	w2, [x29, 52]
-.LVL671:
-	b	.L567
-	.p2align 3
-.L582:
-	.loc 1 2183 0
-	mov	w1, 10
-	b	.L571
-	.p2align 3
-.L579:
-	.loc 1 2187 0
-	mov	w1, 0
-	.loc 1 2186 0
-	str	wzr, [x21, 144]
-	.loc 1 2187 0
-	b	.L571
-	.p2align 3
-.L572:
-	.loc 1 2220 0
-	mov	w0, 12
-	.loc 1 2221 0
-	mov	w1, 4
-	.loc 1 2220 0
-	str	w0, [x21, 144]
-	.loc 1 2221 0
-	b	.L571
-	.p2align 3
-.L573:
-	.loc 1 2225 0
-	mov	w0, 12
-	.loc 1 2226 0
-	mov	w1, 5
-	.loc 1 2225 0
-	str	w0, [x21, 144]
-	.loc 1 2226 0
-	b	.L571
-	.p2align 3
-.L574:
-	.loc 1 2230 0
-	mov	w0, 12
-	.loc 1 2231 0
-	mov	w1, 6
-	.loc 1 2230 0
-	str	w0, [x21, 144]
-	.loc 1 2231 0
-	b	.L571
-	.p2align 3
-.L575:
-	.loc 1 2235 0
-	mov	w0, 12
-	.loc 1 2236 0
-	mov	w1, 8
-	.loc 1 2235 0
-	str	w0, [x21, 144]
-	.loc 1 2236 0
-	b	.L571
-	.p2align 3
-.L576:
-	.loc 1 2204 0
-	mov	w1, 7
-	str	w1, [x21, 144]
-	.loc 1 2205 0
-	b	.L571
-	.p2align 3
-.L577:
-	.loc 1 2210 0
-	mov	w1, 1
-	str	w1, [x21, 144]
-	.loc 1 2211 0
-	b	.L571
-	.p2align 3
-.L578:
-	.loc 1 2215 0
-	mov	w1, 2
-	str	w1, [x21, 144]
-	.loc 1 2216 0
-	b	.L571
-	.p2align 3
-.L588:
-	.loc 1 2169 0
 	ldr	x0, [x21, 104]
 	adrp	x1, .LC21
 	add	x1, x1, :lo12:.LC21
 	bl	_dev_info
-.LVL672:
+.LVL667:
+	.loc 1 2175 0
+	mov	w2, 50
+	str	w2, [x29, 52]
+.LVL668:
+	b	.L569
+	.p2align 3
+.L584:
+	.loc 1 2184 0
+	mov	w1, 10
+	b	.L573
+	.p2align 3
+.L581:
+	.loc 1 2188 0
+	mov	w1, 0
+	.loc 1 2187 0
+	str	wzr, [x21, 144]
+	.loc 1 2188 0
+	b	.L573
+	.p2align 3
+.L574:
+	.loc 1 2221 0
+	mov	w0, 12
+	.loc 1 2222 0
+	mov	w1, 4
+	.loc 1 2221 0
+	str	w0, [x21, 144]
+	.loc 1 2222 0
+	b	.L573
+	.p2align 3
+.L575:
+	.loc 1 2226 0
+	mov	w0, 12
+	.loc 1 2227 0
+	mov	w1, 5
+	.loc 1 2226 0
+	str	w0, [x21, 144]
+	.loc 1 2227 0
+	b	.L573
+	.p2align 3
+.L576:
+	.loc 1 2231 0
+	mov	w0, 12
+	.loc 1 2232 0
+	mov	w1, 6
+	.loc 1 2231 0
+	str	w0, [x21, 144]
+	.loc 1 2232 0
+	b	.L573
+	.p2align 3
+.L577:
+	.loc 1 2236 0
+	mov	w0, 12
+	.loc 1 2237 0
+	mov	w1, 8
+	.loc 1 2236 0
+	str	w0, [x21, 144]
+	.loc 1 2237 0
+	b	.L573
+	.p2align 3
+.L578:
+	.loc 1 2205 0
+	mov	w1, 7
+	str	w1, [x21, 144]
+	.loc 1 2206 0
+	b	.L573
+	.p2align 3
+.L579:
+	.loc 1 2211 0
+	mov	w1, 1
+	str	w1, [x21, 144]
+	.loc 1 2212 0
+	b	.L573
+	.p2align 3
+.L580:
+	.loc 1 2216 0
+	mov	w1, 2
+	str	w1, [x21, 144]
+	.loc 1 2217 0
+	b	.L573
+	.p2align 3
+.L590:
 	.loc 1 2170 0
+	ldr	x0, [x21, 104]
+	adrp	x1, .LC20
+	add	x1, x1, :lo12:.LC20
+	bl	_dev_info
+.LVL669:
+	.loc 1 2171 0
 	str	wzr, [x29, 52]
 	mov	w2, 0
-	b	.L567
-.LVL673:
-.L591:
-	.loc 1 2250 0
+	b	.L569
+.LVL670:
+.L593:
+	.loc 1 2251 0
 	bl	__stack_chk_fail
-.LVL674:
+.LVL671:
 	.cfi_endproc
 .LFE2840:
 	.size	ebc_lut_update, .-ebc_lut_update
@@ -5795,32 +5921,32 @@
 	.type	ebc_state_read, %function
 ebc_state_read:
 .LFB2860:
-	.loc 1 3266 0
+	.loc 1 3274 0
 	.cfi_startproc
-.LVL675:
+.LVL672:
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
-	.loc 1 3267 0
+	.loc 1 3275 0
 	adrp	x3, .LANCHOR0
-	.loc 1 3266 0
+	.loc 1 3274 0
 	mov	x0, x2
-.LVL676:
-	.loc 1 3267 0
-	adrp	x1, .LC26
-.LVL677:
-	.loc 1 3266 0
+.LVL673:
+	.loc 1 3275 0
+	adrp	x1, .LC25
+.LVL674:
+	.loc 1 3274 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 3267 0
+	.loc 1 3275 0
 	ldr	x2, [x3, #:lo12:.LANCHOR0]
-.LVL678:
-	add	x1, x1, :lo12:.LC26
-	ldr	w2, [x2, 672]
+.LVL675:
+	add	x1, x1, :lo12:.LC25
+	ldr	w2, [x2, 656]
 	bl	sprintf
-.LVL679:
-	.loc 1 3268 0
+.LVL676:
+	.loc 1 3276 0
 	sxtw	x0, w0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
@@ -5835,31 +5961,31 @@
 	.type	ebc_version_read, %function
 ebc_version_read:
 .LFB2859:
-	.loc 1 3257 0
+	.loc 1 3265 0
 	.cfi_startproc
-.LVL680:
+.LVL677:
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
 	mov	x0, x2
-.LVL681:
-	.loc 1 3258 0
-	adrp	x1, .LC28
-.LVL682:
-	adrp	x2, .LC27
-.LVL683:
-	.loc 1 3257 0
+.LVL678:
+	.loc 1 3266 0
+	adrp	x1, .LC27
+.LVL679:
+	adrp	x2, .LC26
+.LVL680:
+	.loc 1 3265 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 3258 0
-	add	x2, x2, :lo12:.LC27
-	.loc 1 3257 0
-	.loc 1 3258 0
-	add	x1, x1, :lo12:.LC28
+	.loc 1 3266 0
+	add	x2, x2, :lo12:.LC26
+	.loc 1 3265 0
+	.loc 1 3266 0
+	add	x1, x1, :lo12:.LC27
 	bl	sprintf
-.LVL684:
-	.loc 1 3259 0
+.LVL681:
+	.loc 1 3267 0
 	sxtw	x0, w0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
@@ -5874,49 +6000,49 @@
 	.type	pmic_vcom_read, %function
 pmic_vcom_read:
 .LFB2857:
-	.loc 1 3221 0
+	.loc 1 3229 0
 	.cfi_startproc
-.LVL685:
+.LVL682:
 	stp	x29, x30, [sp, -32]!
 	.cfi_def_cfa_offset 32
 	.cfi_offset 29, -32
 	.cfi_offset 30, -24
-	.loc 1 3222 0
+	.loc 1 3230 0
 	adrp	x0, .LANCHOR0
-.LVL686:
-	.loc 1 3221 0
+.LVL683:
+	.loc 1 3229 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 3225 0
+	.loc 1 3233 0
 	ldr	x0, [x0, #:lo12:.LANCHOR0]
-	.loc 1 3221 0
+	.loc 1 3229 0
 	str	x19, [sp, 16]
 	.cfi_offset 19, -16
-	.loc 1 3221 0
+	.loc 1 3229 0
 	mov	x19, x2
-	.loc 1 3225 0
+	.loc 1 3233 0
 	ldr	x1, [x0, 16]
-.LVL687:
-.LBB1478:
-.LBB1479:
+.LVL684:
+.LBB1540:
+.LBB1541:
 	.loc 3 55 0
 	mov	x0, x1
 	ldr	x1, [x1, 64]
 	blr	x1
-.LVL688:
-.LBE1479:
-.LBE1478:
-	.loc 1 3227 0
+.LVL685:
+.LBE1541:
+.LBE1540:
+	.loc 1 3235 0
 	mov	w2, w0
-	adrp	x1, .LC26
+	adrp	x1, .LC25
 	mov	x0, x19
-	add	x1, x1, :lo12:.LC26
+	add	x1, x1, :lo12:.LC25
 	bl	sprintf
-.LVL689:
-	.loc 1 3228 0
+.LVL686:
+	.loc 1 3236 0
 	sxtw	x0, w0
 	ldr	x19, [sp, 16]
-.LVL690:
+.LVL687:
 	ldp	x29, x30, [sp], 32
 	.cfi_restore 30
 	.cfi_restore 29
@@ -5931,65 +6057,65 @@
 	.type	pmic_temp_read, %function
 pmic_temp_read:
 .LFB2856:
-	.loc 1 3207 0
+	.loc 1 3215 0
 	.cfi_startproc
-.LVL691:
+.LVL688:
 	stp	x29, x30, [sp, -48]!
 	.cfi_def_cfa_offset 48
 	.cfi_offset 29, -48
 	.cfi_offset 30, -40
-	.loc 1 3208 0
+	.loc 1 3216 0
 	adrp	x0, .LANCHOR0
-.LVL692:
-	.loc 1 3207 0
+.LVL689:
+	.loc 1 3215 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 3211 0
+	.loc 1 3219 0
 	ldr	x0, [x0, #:lo12:.LANCHOR0]
-.LBB1480:
-.LBB1481:
+.LBB1542:
+.LBB1543:
 	.loc 3 50 0
 	add	x1, x29, 36
-.LVL693:
-.LBE1481:
-.LBE1480:
-	.loc 1 3207 0
+.LVL690:
+.LBE1543:
+.LBE1542:
+	.loc 1 3215 0
 	stp	x19, x20, [sp, 16]
 	.cfi_offset 19, -32
 	.cfi_offset 20, -24
-	.loc 1 3207 0
+	.loc 1 3215 0
 	adrp	x19, __stack_chk_guard
 	add	x19, x19, :lo12:__stack_chk_guard
 	mov	x20, x2
 	ldr	x2, [x19]
 	str	x2, [x29, 40]
 	mov	x2,0
-.LVL694:
-	.loc 1 3211 0
+.LVL691:
+	.loc 1 3219 0
 	ldr	x2, [x0, 16]
-.LBB1483:
-.LBB1482:
+.LBB1545:
+.LBB1544:
 	.loc 3 50 0
 	mov	x0, x2
 	ldr	x2, [x2, 56]
 	blr	x2
-.LVL695:
-.LBE1482:
-.LBE1483:
-	.loc 1 3213 0
+.LVL692:
+.LBE1544:
+.LBE1545:
+	.loc 1 3221 0
 	ldr	w2, [x29, 36]
-	adrp	x1, .LC26
+	adrp	x1, .LC25
 	mov	x0, x20
-	add	x1, x1, :lo12:.LC26
+	add	x1, x1, :lo12:.LC25
 	bl	sprintf
-.LVL696:
-	.loc 1 3214 0
+.LVL693:
+	.loc 1 3222 0
 	ldr	x2, [x29, 40]
 	ldr	x1, [x19]
 	eor	x1, x2, x1
-	cbnz	x1, .L601
+	cbnz	x1, .L603
 	ldp	x19, x20, [sp, 16]
-.LVL697:
+.LVL694:
 	sxtw	x0, w0
 	ldp	x29, x30, [sp], 48
 	.cfi_remember_state
@@ -5999,11 +6125,11 @@
 	.cfi_restore 20
 	.cfi_def_cfa 31, 0
 	ret
-.LVL698:
-.L601:
+.LVL695:
+.L603:
 	.cfi_restore_state
 	bl	__stack_chk_fail
-.LVL699:
+.LVL696:
 	.cfi_endproc
 .LFE2856:
 	.size	pmic_temp_read, .-pmic_temp_read
@@ -6012,33 +6138,33 @@
 	.type	pmic_name_read, %function
 pmic_name_read:
 .LFB2855:
-	.loc 1 3196 0
+	.loc 1 3204 0
 	.cfi_startproc
-.LVL700:
+.LVL697:
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
-	.loc 1 3197 0
+	.loc 1 3205 0
 	adrp	x3, .LANCHOR0
-	.loc 1 3196 0
+	.loc 1 3204 0
 	mov	x0, x2
-.LVL701:
-	.loc 1 3199 0
-	adrp	x1, .LC28
-.LVL702:
-	.loc 1 3196 0
+.LVL698:
+	.loc 1 3207 0
+	adrp	x1, .LC27
+.LVL699:
+	.loc 1 3204 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 3199 0
+	.loc 1 3207 0
 	ldr	x2, [x3, #:lo12:.LANCHOR0]
-.LVL703:
-	add	x1, x1, :lo12:.LC28
+.LVL700:
+	add	x1, x1, :lo12:.LC27
 	ldr	x2, [x2, 16]
 	add	x2, x2, 8
 	bl	sprintf
-.LVL704:
-	.loc 1 3200 0
+.LVL701:
+	.loc 1 3208 0
 	sxtw	x0, w0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
@@ -6053,23 +6179,23 @@
 	.type	ebc_buf_state_read, %function
 ebc_buf_state_read:
 .LFB2861:
-	.loc 1 3275 0
+	.loc 1 3283 0
 	.cfi_startproc
-.LVL705:
+.LVL702:
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
-	.loc 1 3276 0
+	.loc 1 3284 0
 	mov	x0, x2
-.LVL706:
-	.loc 1 3275 0
+.LVL703:
+	.loc 1 3283 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 3276 0
+	.loc 1 3284 0
 	bl	ebc_buf_state_show
-.LVL707:
-	.loc 1 3277 0
+.LVL704:
+	.loc 1 3285 0
 	sxtw	x0, w0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
@@ -6084,17 +6210,17 @@
 	.type	pmic_vcom_write, %function
 pmic_vcom_write:
 .LFB2858:
-	.loc 1 3233 0
+	.loc 1 3241 0
 	.cfi_startproc
-.LVL708:
+.LVL705:
 	stp	x29, x30, [sp, -64]!
 	.cfi_def_cfa_offset 64
 	.cfi_offset 29, -64
 	.cfi_offset 30, -56
-	.loc 1 3234 0
+	.loc 1 3242 0
 	adrp	x0, .LANCHOR0
-.LVL709:
-	.loc 1 3233 0
+.LVL706:
+	.loc 1 3241 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
 	stp	x19, x20, [sp, 16]
@@ -6104,47 +6230,47 @@
 	stp	x21, x22, [sp, 32]
 	.cfi_offset 21, -32
 	.cfi_offset 22, -24
-	.loc 1 3233 0
+	.loc 1 3241 0
 	add	x1, x19, :lo12:__stack_chk_guard
-.LVL710:
+.LVL707:
 	mov	x21, x2
-	.loc 1 3234 0
+	.loc 1 3242 0
 	ldr	x22, [x0, #:lo12:.LANCHOR0]
-.LVL711:
-	.loc 1 3233 0
+.LVL708:
+	.loc 1 3241 0
 	ldr	x2, [x1]
 	str	x2, [x29, 56]
 	mov	x2,0
-.LVL712:
+.LVL709:
 	mov	x20, x3
-	.loc 1 3237 0
+	.loc 1 3245 0
 	add	x2, x29, 52
 	mov	w1, 0
 	mov	x0, x21
 	bl	kstrtouint
-.LVL713:
-	.loc 1 3238 0
-	cbnz	w0, .L613
-.LVL714:
-	.loc 1 3242 0
+.LVL710:
+	.loc 1 3246 0
+	cbnz	w0, .L615
+.LVL711:
+	.loc 1 3250 0
 	ldr	w1, [x29, 52]
 	ldr	x0, [x22, 16]
 	bl	ebc_pmic_set_vcom
-.LVL715:
-	.loc 1 3243 0
-	cbnz	w0, .L614
-.L606:
-	.loc 1 3249 0
+.LVL712:
+	.loc 1 3251 0
+	cbnz	w0, .L616
+.L608:
+	.loc 1 3257 0
 	add	x19, x19, :lo12:__stack_chk_guard
 	mov	x0, x20
-.LVL716:
+.LVL713:
 	ldr	x2, [x29, 56]
 	ldr	x1, [x19]
 	eor	x1, x2, x1
-	cbnz	x1, .L615
+	cbnz	x1, .L617
 	ldp	x19, x20, [sp, 16]
 	ldp	x21, x22, [sp, 32]
-.LVL717:
+.LVL714:
 	ldp	x29, x30, [sp], 64
 	.cfi_remember_state
 	.cfi_restore 30
@@ -6155,42 +6281,42 @@
 	.cfi_restore 20
 	.cfi_def_cfa 31, 0
 	ret
+.LVL715:
+	.p2align 3
+.L615:
+	.cfi_restore_state
+	.loc 1 3247 0
+	ldr	x0, [x22]
+	adrp	x1, .LC28
+	mov	x2, x21
+	add	x1, x1, :lo12:.LC28
+	.loc 1 3248 0
+	mov	x20, -1
+.LVL716:
+	.loc 1 3247 0
+	bl	_dev_err
+.LVL717:
+	.loc 1 3248 0
+	b	.L608
 .LVL718:
 	.p2align 3
-.L613:
-	.cfi_restore_state
-	.loc 1 3239 0
+.L616:
+	.loc 1 3252 0
 	ldr	x0, [x22]
 	adrp	x1, .LC29
-	mov	x2, x21
-	add	x1, x1, :lo12:.LC29
-	.loc 1 3240 0
+	.loc 1 3253 0
 	mov	x20, -1
 .LVL719:
-	.loc 1 3239 0
+	.loc 1 3252 0
+	add	x1, x1, :lo12:.LC29
 	bl	_dev_err
 .LVL720:
-	.loc 1 3240 0
-	b	.L606
-.LVL721:
-	.p2align 3
-.L614:
-	.loc 1 3244 0
-	ldr	x0, [x22]
-	adrp	x1, .LC30
-	.loc 1 3245 0
-	mov	x20, -1
-.LVL722:
-	.loc 1 3244 0
-	add	x1, x1, :lo12:.LC30
-	bl	_dev_err
-.LVL723:
-	.loc 1 3245 0
-	b	.L606
-.L615:
-	.loc 1 3249 0
+	.loc 1 3253 0
+	b	.L608
+.L617:
+	.loc 1 3257 0
 	bl	__stack_chk_fail
-.LVL724:
+.LVL721:
 	.cfi_endproc
 .LFE2858:
 	.size	pmic_vcom_write, .-pmic_vcom_write
@@ -6199,9 +6325,9 @@
 	.type	waveform_version_read, %function
 waveform_version_read:
 .LFB2854:
-	.loc 1 3185 0
+	.loc 1 3193 0
 	.cfi_startproc
-.LVL725:
+.LVL722:
 	stp	x29, x30, [sp, -32]!
 	.cfi_def_cfa_offset 32
 	.cfi_offset 29, -32
@@ -6210,22 +6336,22 @@
 	.cfi_def_cfa_register 29
 	str	x19, [sp, 16]
 	.cfi_offset 19, -16
-	.loc 1 3185 0
+	.loc 1 3193 0
 	mov	x19, x2
-	.loc 1 3186 0
+	.loc 1 3194 0
 	bl	epd_lut_get_wf_version
-.LVL726:
-	.loc 1 3188 0
+.LVL723:
+	.loc 1 3196 0
 	mov	x2, x0
-	adrp	x1, .LC28
+	adrp	x1, .LC27
 	mov	x0, x19
-	add	x1, x1, :lo12:.LC28
+	add	x1, x1, :lo12:.LC27
 	bl	sprintf
-.LVL727:
-	.loc 1 3189 0
+.LVL724:
+	.loc 1 3197 0
 	sxtw	x0, w0
 	ldr	x19, [sp, 16]
-.LVL728:
+.LVL725:
 	ldp	x29, x30, [sp], 32
 	.cfi_restore 30
 	.cfi_restore 29
@@ -6240,23 +6366,23 @@
 	.type	ebc_init, %function
 ebc_init:
 .LFB2873:
-	.loc 1 3774 0
+	.loc 1 3786 0
 	.cfi_startproc
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
-	.loc 1 3775 0
+	.loc 1 3787 0
 	mov	x1, 0
 	adrp	x0, .LANCHOR1
 	add	x0, x0, :lo12:.LANCHOR1
-	.loc 1 3774 0
+	.loc 1 3786 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 3775 0
+	.loc 1 3787 0
 	bl	__platform_driver_register
-.LVL729:
-	.loc 1 3776 0
+.LVL726:
+	.loc 1 3788 0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
 	.cfi_restore 29
@@ -6271,31 +6397,31 @@
 	.type	get_overlay_image_area2.isra.0, %function
 get_overlay_image_area2.isra.0:
 .LFB2875:
-	.loc 1 997 0
+	.loc 1 996 0
 	.cfi_startproc
-.LVL730:
+.LVL727:
 	stp	x29, x30, [sp, -128]!
 	.cfi_def_cfa_offset 128
 	.cfi_offset 29, -128
 	.cfi_offset 30, -120
-	.loc 1 999 0
+	.loc 1 998 0
 	adrp	x5, .LANCHOR0
-	.loc 1 997 0
+	.loc 1 996 0
 	mov	x10, x0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 999 0
+	.loc 1 998 0
 	ldr	x5, [x5, #:lo12:.LANCHOR0]
-	.loc 1 997 0
+	.loc 1 996 0
 	stp	x19, x20, [sp, 16]
-	.loc 1 1027 0
+	.loc 1 1026 0
 	add	x5, x5, 24
-	.loc 1 997 0
+	.loc 1 996 0
 	stp	x5, x0, [x29, 96]
-	.loc 1 1015 0
-	ldr	x0, [x4, 248]
-.LVL731:
-	.loc 1 997 0
+	.loc 1 1014 0
+	ldr	x0, [x4, 240]
+.LVL728:
+	.loc 1 996 0
 	stp	x21, x22, [sp, 32]
 	stp	x23, x24, [sp, 48]
 	stp	x25, x26, [sp, 64]
@@ -6310,362 +6436,362 @@
 	.cfi_offset 26, -56
 	.cfi_offset 27, -48
 	.cfi_offset 28, -40
-	.loc 1 1020 0
+	.loc 1 1019 0
 	ldr	w17, [x4, 96]
-	.loc 1 1017 0
-	ldp	w7, w21, [x0, 48]
-	.loc 1 1027 0
-	ldr	w13, [x5, 84]
 	.loc 1 1016 0
-	ldr	w5, [x0, 56]
+	ldp	w7, w21, [x0, 48]
+	.loc 1 1026 0
+	ldr	w13, [x5, 84]
 	.loc 1 1015 0
+	ldr	w5, [x0, 56]
+	.loc 1 1014 0
 	cmp	w7, 0
 	add	w6, w7, 7
 	csel	w6, w6, w7, lt
-	.loc 1 1016 0
+	.loc 1 1015 0
 	add	w30, w5, 7
 	cmp	w5, 0
-	.loc 1 1015 0
+	.loc 1 1014 0
 	asr	w7, w6, 3
-.LVL732:
-	.loc 1 1016 0
+.LVL729:
+	.loc 1 1015 0
 	csel	w30, w30, w5, lt
-	.loc 1 1018 0
+	.loc 1 1017 0
 	ldr	w5, [x0, 60]
-	.loc 1 1020 0
+	.loc 1 1019 0
 	cmp	w17, 0
 	add	w0, w17, 7
 	csel	w0, w0, w17, lt
-	.loc 1 1016 0
+	.loc 1 1015 0
 	asr	w30, w30, 3
-.LVL733:
-	.loc 1 1018 0
+.LVL730:
+	.loc 1 1017 0
 	mov	w9, w5
-	.loc 1 1016 0
+	.loc 1 1015 0
 	add	w30, w30, 1
-.LVL734:
-	.loc 1 1020 0
+.LVL731:
+	.loc 1 1019 0
 	asr	w5, w0, 3
-.LVL735:
-	.loc 1 1021 0
-	ldr	w0, [x4, 92]
-	.loc 1 1023 0
-	cmp	w30, w5
-.LVL736:
-	.loc 1 1027 0
-	mul	w13, w21, w13
+.LVL732:
 	.loc 1 1020 0
+	ldr	w0, [x4, 92]
+	.loc 1 1022 0
+	cmp	w30, w5
+.LVL733:
+	.loc 1 1026 0
+	mul	w13, w21, w13
+	.loc 1 1019 0
 	mov	w6, w5
 	str	w5, [x29, 116]
-	.loc 1 1023 0
+	.loc 1 1022 0
 	sub	w5, w5, #1
-.LVL737:
-	.loc 1 1015 0
+.LVL734:
+	.loc 1 1014 0
 	str	w7, [x29, 124]
-	.loc 1 1023 0
+	.loc 1 1022 0
 	csel	w30, w5, w30, ge
-.LVL738:
-	.loc 1 1025 0
+.LVL735:
+	.loc 1 1024 0
 	cmp	w9, w0
 	sub	w0, w0, #1
-.LVL739:
-	.loc 1 1027 0
+.LVL736:
+	.loc 1 1026 0
 	lsr	w13, w13, 2
-	.loc 1 1025 0
+	.loc 1 1024 0
 	csel	w0, w0, w9, ge
-.LVL740:
+.LVL737:
 	str	w0, [x29, 120]
-	.loc 1 1027 0
+	.loc 1 1026 0
 	add	x13, x10, x13
-.LVL741:
-	.loc 1 1028 0
+.LVL738:
+	.loc 1 1027 0
 	cmp	w21, w0
-	bgt	.L620
+	bgt	.L622
 	mul	w18, w21, w6
-	.loc 1 1042 0
+	.loc 1 1041 0
 	mov	w19, 1
-.LBB1486:
-.LBB1487:
-	.loc 1 991 0
+.LBB1548:
+.LBB1549:
+	.loc 1 990 0
 	mov	w16, w19
 	lsl	w0, w7, 3
-.LVL742:
+.LVL739:
 	str	w0, [x29, 112]
-.LVL743:
+.LVL740:
 	.p2align 2
-.L624:
-.LBE1487:
-.LBE1486:
-	.loc 1 1029 0
+.L626:
+.LBE1549:
+.LBE1548:
+	.loc 1 1028 0
 	and	w0, w21, 1
-.LVL744:
-	tbnz	x21, 0, .L625
-	.loc 1 1030 0
+.LVL741:
+	tbnz	x21, 0, .L627
+	.loc 1 1029 0
 	ldr	x5, [x29, 96]
 	ldr	w13, [x5, 84]
-.LVL745:
+.LVL742:
 	ldr	x5, [x29, 104]
-.LVL746:
+.LVL743:
 	mul	w13, w21, w13
 	lsr	w13, w13, 2
 	add	x13, x5, x13
-.LVL747:
-.L625:
-	.loc 1 1033 0
+.LVL744:
+.L627:
+	.loc 1 1032 0
 	mul	w17, w21, w17
-	.loc 1 1036 0
+	.loc 1 1035 0
 	ldr	w5, [x29, 124]
 	cmp	w5, w30
-	.loc 1 1033 0
+	.loc 1 1032 0
 	sxtw	x17, w17
-	.loc 1 1036 0
-	bgt	.L638
+	.loc 1 1035 0
+	bgt	.L640
 	cmp	w0, 0
-.LBB1491:
-.LBB1488:
-	.loc 1 990 0
+.LBB1553:
+.LBB1550:
+	.loc 1 989 0
 	ldr	w11, [x29, 112]
 	mov	w0, 2
 	ldr	w9, [x29, 124]
-.LVL748:
+.LVL745:
 	csel	w20, w0, wzr, ne
-	.loc 1 930 0
+	.loc 1 929 0
 	add	w28, w20, 4
-	.loc 1 940 0
+	.loc 1 939 0
 	add	w27, w20, 8
-	.loc 1 950 0
+	.loc 1 949 0
 	add	w26, w20, 12
-	.loc 1 960 0
+	.loc 1 959 0
 	add	w25, w20, 16
-	.loc 1 970 0
+	.loc 1 969 0
 	add	w24, w20, 20
-	.loc 1 980 0
+	.loc 1 979 0
 	add	w23, w20, 24
-	.loc 1 990 0
+	.loc 1 989 0
 	add	w22, w20, 28
-.LVL749:
+.LVL746:
 	.p2align 2
-.L637:
-.LBE1488:
-.LBE1491:
-	.loc 1 1037 0
+.L639:
+.LBE1550:
+.LBE1553:
+	.loc 1 1036 0
 	sxtw	x8, w9
-.LVL750:
+.LVL747:
 	lsl	x0, x8, 2
 	add	x0, x0, x18, sxtw 2
 	ldr	w7, [x1, x0]
-.LVL751:
-	.loc 1 1038 0
+.LVL748:
+	.loc 1 1037 0
 	ldr	w6, [x2, x0]
-.LVL752:
-	.loc 1 1041 0
+.LVL749:
+	.loc 1 1040 0
 	cmp	w7, w6
-	beq	.L628
-	.loc 1 1039 0
+	beq	.L630
+	.loc 1 1038 0
 	add	x12, x17, x11, sxtw
-	.loc 1 1042 0
+	.loc 1 1041 0
 	str	w19, [x4, 60]
-.LBB1492:
-.LBB1489:
-	.loc 1 914 0
-	eor	w5, w7, w6
-.LVL753:
-.LBE1489:
-.LBE1492:
-	.loc 1 1039 0
-	add	x0, x3, x12
-.LVL754:
-.LBB1493:
-.LBB1490:
-	.loc 1 916 0
-	and	w14, w5, 15
+.LBB1554:
+.LBB1551:
 	.loc 1 913 0
+	eor	w5, w7, w6
+.LVL750:
+.LBE1551:
+.LBE1554:
+	.loc 1 1038 0
+	add	x0, x3, x12
+.LVL751:
+.LBB1555:
+.LBB1552:
+	.loc 1 915 0
+	and	w14, w5, 15
+	.loc 1 912 0
 	mov	w10, 0
-.LVL755:
-	.loc 1 916 0
+.LVL752:
+	.loc 1 915 0
 	ldrb	w15, [x3, x12]
 	cmp	w15, 0
 	ccmp	w14, 0, 4, eq
-	beq	.L629
-	.loc 1 919 0
+	beq	.L631
+	.loc 1 918 0
 	ldr	x14, [x4, 128]
 	ubfiz	w10, w6, 5, 4
-.LVL756:
+.LVL753:
 	and	w15, w7, 15
 	orr	w10, w10, w15
 	ldrb	w10, [x14, w10, uxtw]
-	.loc 1 921 0
-	strb	w19, [x3, x12]
 	.loc 1 920 0
+	strb	w19, [x3, x12]
+	.loc 1 919 0
 	lsl	w10, w10, w20
-.LVL757:
-.L629:
-	.loc 1 926 0
+.LVL754:
+.L631:
+	.loc 1 925 0
 	ldrb	w12, [x0, 1]
 	cmp	w12, 0
 	and	w12, w5, 240
 	ccmp	w12, 0, 4, eq
-	beq	.L630
-	.loc 1 929 0
+	beq	.L632
+	.loc 1 928 0
 	lsr	w12, w6, 4
 	ldr	x14, [x4, 128]
 	ubfiz	w12, w12, 5, 4
 	ubfx	x15, x7, 4, 4
 	orr	w12, w12, w15
 	ldrb	w12, [x14, w12, uxtw]
-	.loc 1 931 0
-	strb	w16, [x0, 1]
 	.loc 1 930 0
+	strb	w16, [x0, 1]
+	.loc 1 929 0
 	lsl	w12, w12, w28
 	orr	w10, w10, w12
-.L630:
-	.loc 1 936 0
+.L632:
+	.loc 1 935 0
 	ldrb	w12, [x0, 2]
 	cmp	w12, 0
 	and	w12, w5, 3840
 	ccmp	w12, 0, 4, eq
-	beq	.L631
-	.loc 1 939 0
+	beq	.L633
+	.loc 1 938 0
 	lsr	w12, w6, 8
 	ldr	x14, [x4, 128]
 	ubfiz	w12, w12, 5, 4
 	ubfx	x15, x7, 8, 4
 	orr	w12, w12, w15
 	ldrb	w12, [x14, w12, uxtw]
-	.loc 1 941 0
-	strb	w16, [x0, 2]
 	.loc 1 940 0
+	strb	w16, [x0, 2]
+	.loc 1 939 0
 	lsl	w12, w12, w27
 	orr	w10, w10, w12
-.L631:
-	.loc 1 946 0
+.L633:
+	.loc 1 945 0
 	ldrb	w12, [x0, 3]
 	tst	w5, 61440
 	ccmp	w12, 0, 0, ne
-	bne	.L632
-	.loc 1 949 0
+	bne	.L634
+	.loc 1 948 0
 	lsr	w12, w6, 12
 	ldr	x14, [x4, 128]
 	ubfiz	w12, w12, 5, 4
 	ubfx	x15, x7, 12, 4
 	orr	w12, w12, w15
 	ldrb	w12, [x14, w12, uxtw]
-	.loc 1 951 0
-	strb	w16, [x0, 3]
 	.loc 1 950 0
+	strb	w16, [x0, 3]
+	.loc 1 949 0
 	lsl	w12, w12, w26
 	orr	w10, w10, w12
-.L632:
-	.loc 1 956 0
+.L634:
+	.loc 1 955 0
 	ldrb	w12, [x0, 4]
 	cmp	w12, 0
 	and	w12, w5, 983040
 	ccmp	w12, 0, 4, eq
-	beq	.L633
-	.loc 1 959 0
+	beq	.L635
+	.loc 1 958 0
 	lsr	w12, w6, 16
 	ldr	x14, [x4, 128]
 	ubfiz	w12, w12, 5, 4
 	ubfx	x15, x7, 16, 4
 	orr	w12, w12, w15
 	ldrb	w12, [x14, w12, uxtw]
-	.loc 1 961 0
-	strb	w16, [x0, 4]
 	.loc 1 960 0
+	strb	w16, [x0, 4]
+	.loc 1 959 0
 	lsl	w12, w12, w25
 	orr	w10, w10, w12
-.L633:
-	.loc 1 966 0
+.L635:
+	.loc 1 965 0
 	ldrb	w12, [x0, 5]
 	cmp	w12, 0
 	and	w12, w5, 15728640
 	ccmp	w12, 0, 4, eq
-	beq	.L634
-	.loc 1 969 0
+	beq	.L636
+	.loc 1 968 0
 	lsr	w12, w6, 20
 	ldr	x14, [x4, 128]
 	ubfiz	w12, w12, 5, 4
 	ubfx	x15, x7, 20, 4
 	orr	w12, w12, w15
 	ldrb	w12, [x14, w12, uxtw]
-	.loc 1 971 0
-	strb	w16, [x0, 5]
 	.loc 1 970 0
+	strb	w16, [x0, 5]
+	.loc 1 969 0
 	lsl	w12, w12, w24
 	orr	w10, w10, w12
-.L634:
-	.loc 1 976 0
+.L636:
+	.loc 1 975 0
 	ldrb	w12, [x0, 6]
 	tst	w5, 251658240
 	ccmp	w12, 0, 0, ne
-	bne	.L635
-	.loc 1 979 0
+	bne	.L637
+	.loc 1 978 0
 	lsr	w12, w6, 24
 	ldr	x14, [x4, 128]
 	ubfiz	w12, w12, 5, 4
 	ubfx	x15, x7, 24, 4
 	orr	w12, w12, w15
 	ldrb	w12, [x14, w12, uxtw]
-	.loc 1 981 0
-	strb	w16, [x0, 6]
 	.loc 1 980 0
+	strb	w16, [x0, 6]
+	.loc 1 979 0
 	lsl	w12, w12, w23
 	orr	w10, w10, w12
-.L635:
-	.loc 1 986 0
+.L637:
+	.loc 1 985 0
 	tst	w5, -268435456
 	ldrb	w5, [x0, 7]
-.LVL758:
+.LVL755:
 	ccmp	w5, 0, 0, ne
-	bne	.L636
-	.loc 1 989 0
+	bne	.L638
+	.loc 1 988 0
 	ldr	x5, [x4, 128]
 	lsr	w6, w6, 28
-.LVL759:
+.LVL756:
 	lsr	w7, w7, 28
-.LVL760:
+.LVL757:
 	add	w6, w7, w6, lsl 5
 	ldrb	w5, [x5, w6, uxtw]
-	.loc 1 991 0
-	strb	w16, [x0, 7]
 	.loc 1 990 0
+	strb	w16, [x0, 7]
+	.loc 1 989 0
 	lsl	w0, w5, w22
-.LVL761:
+.LVL758:
 	orr	w10, w10, w0
-.LVL762:
-.L636:
-.LBE1490:
-.LBE1493:
-	.loc 1 1043 0
+.LVL759:
+.L638:
+.LBE1552:
+.LBE1555:
+	.loc 1 1042 0
 	ldr	w0, [x13, x8, lsl 2]
-.LVL763:
+.LVL760:
 	orr	w10, w0, w10
-.LVL764:
+.LVL761:
 	str	w10, [x13, x8, lsl 2]
-.LVL765:
-.L628:
-	.loc 1 1036 0
+.LVL762:
+.L630:
+	.loc 1 1035 0
 	add	w9, w9, 1
 	add	w11, w11, 8
 	cmp	w9, w30
-	ble	.L637
-.LVL766:
-.L638:
+	ble	.L639
+.LVL763:
+.L640:
 	ldr	w0, [x29, 116]
-	.loc 1 1028 0
+	.loc 1 1027 0
 	add	w21, w21, 1
 	add	w18, w18, w0
 	ldr	w0, [x29, 120]
-.LVL767:
+.LVL764:
 	cmp	w21, w0
-	bgt	.L620
+	bgt	.L622
 	ldr	w17, [x4, 96]
-	b	.L624
-.L620:
-	.loc 1 1047 0
+	b	.L626
+.L622:
+	.loc 1 1046 0
 	ldp	x19, x20, [sp, 16]
 	ldp	x21, x22, [sp, 32]
-.LVL768:
+.LVL765:
 	ldp	x23, x24, [sp, 48]
 	ldp	x25, x26, [sp, 64]
 	ldp	x27, x28, [sp, 80]
@@ -6683,7 +6809,7 @@
 	.cfi_restore 19
 	.cfi_restore 20
 	.cfi_def_cfa 31, 0
-.LVL769:
+.LVL766:
 	ret
 	.cfi_endproc
 .LFE2875:
@@ -6693,371 +6819,371 @@
 	.type	get_one_auto_image2.isra.1, %function
 get_one_auto_image2.isra.1:
 .LFB2876:
-	.loc 1 1219 0
+	.loc 1 1218 0
 	.cfi_startproc
-.LVL770:
-	.loc 1 1227 0
+.LVL767:
+	.loc 1 1226 0
 	ldr	w6, [x1]
-	.loc 1 1219 0
+	.loc 1 1218 0
 	and	w3, w3, 255
-.LVL771:
-	.loc 1 1231 0
+.LVL768:
+	.loc 1 1230 0
 	eor	w8, w6, w0
-.LVL772:
-	.loc 1 1232 0
+.LVL769:
+	.loc 1 1231 0
 	ands	w7, w8, 15
-	beq	.L665
-	.loc 1 1233 0
+	beq	.L667
+	.loc 1 1232 0
 	ldrb	w9, [x2]
-	.loc 1 1235 0
+	.loc 1 1234 0
 	and	w11, w0, 15
 	ldr	x10, [x4]
 	ubfiz	w7, w6, 5, 4
 	orr	w7, w7, w11
 	add	x7, x10, x7
-	.loc 1 1234 0
+	.loc 1 1233 0
 	lsl	w10, w9, 10
-	.loc 1 1237 0
+	.loc 1 1236 0
 	add	w9, w9, 1
 	and	w9, w9, 255
-	.loc 1 1235 0
+	.loc 1 1234 0
 	ldrb	w7, [x7, w10, sxtw]
-	.loc 1 1238 0
+	.loc 1 1237 0
 	cmp	w9, w3
-	.loc 1 1236 0
+	.loc 1 1235 0
 	lsl	w7, w7, w5
-	.loc 1 1238 0
-	beq	.L705
-.L666:
-	.loc 1 1242 0
+	.loc 1 1237 0
+	beq	.L707
+.L668:
+	.loc 1 1241 0
 	strb	w9, [x2]
-.L665:
-	.loc 1 1245 0
+.L667:
+	.loc 1 1244 0
 	tst	w8, 240
-	beq	.L667
-	.loc 1 1248 0
+	beq	.L669
+	.loc 1 1247 0
 	lsr	w10, w6, 4
-	.loc 1 1246 0
+	.loc 1 1245 0
 	ldrb	w9, [x2, 1]
-	.loc 1 1248 0
+	.loc 1 1247 0
 	ubfx	x11, x0, 4, 4
 	ubfiz	w10, w10, 5, 4
 	orr	w10, w10, w11
 	ldr	x11, [x4]
 	add	x10, x11, x10
-	.loc 1 1247 0
+	.loc 1 1246 0
 	lsl	w11, w9, 10
-	.loc 1 1250 0
+	.loc 1 1249 0
 	add	w9, w9, 1
 	and	w9, w9, 255
-	.loc 1 1248 0
+	.loc 1 1247 0
 	ldrb	w10, [x10, w11, sxtw]
-	.loc 1 1249 0
+	.loc 1 1248 0
 	add	w11, w5, 4
-	.loc 1 1251 0
+	.loc 1 1250 0
 	cmp	w9, w3
-	.loc 1 1249 0
+	.loc 1 1248 0
 	lsl	w10, w10, w11
 	orr	w7, w7, w10
-	.loc 1 1251 0
-	beq	.L706
-.L668:
-	.loc 1 1255 0
+	.loc 1 1250 0
+	beq	.L708
+.L670:
+	.loc 1 1254 0
 	strb	w9, [x2, 1]
-.L667:
-	.loc 1 1258 0
+.L669:
+	.loc 1 1257 0
 	tst	w8, 3840
-	beq	.L669
-	.loc 1 1261 0
+	beq	.L671
+	.loc 1 1260 0
 	lsr	w10, w6, 8
-	.loc 1 1259 0
+	.loc 1 1258 0
 	ldrb	w9, [x2, 2]
-	.loc 1 1261 0
+	.loc 1 1260 0
 	ubfx	x11, x0, 8, 4
 	ubfiz	w10, w10, 5, 4
 	orr	w10, w10, w11
 	ldr	x11, [x4]
 	add	x10, x11, x10
-	.loc 1 1260 0
+	.loc 1 1259 0
 	lsl	w11, w9, 10
-	.loc 1 1263 0
+	.loc 1 1262 0
 	add	w9, w9, 1
 	and	w9, w9, 255
-	.loc 1 1261 0
+	.loc 1 1260 0
 	ldrb	w10, [x10, w11, sxtw]
-	.loc 1 1262 0
+	.loc 1 1261 0
 	add	w11, w5, 8
-	.loc 1 1264 0
+	.loc 1 1263 0
 	cmp	w9, w3
-	.loc 1 1262 0
+	.loc 1 1261 0
 	lsl	w10, w10, w11
 	orr	w7, w7, w10
-	.loc 1 1264 0
-	beq	.L707
-.L670:
-	.loc 1 1268 0
+	.loc 1 1263 0
+	beq	.L709
+.L672:
+	.loc 1 1267 0
 	strb	w9, [x2, 2]
-.L669:
-	.loc 1 1271 0
+.L671:
+	.loc 1 1270 0
 	tst	w8, 61440
-	beq	.L671
-	.loc 1 1274 0
+	beq	.L673
+	.loc 1 1273 0
 	lsr	w10, w6, 12
-	.loc 1 1272 0
+	.loc 1 1271 0
 	ldrb	w9, [x2, 3]
-	.loc 1 1274 0
+	.loc 1 1273 0
 	ubfx	x11, x0, 12, 4
 	ubfiz	w10, w10, 5, 4
 	orr	w10, w10, w11
 	ldr	x11, [x4]
 	add	x10, x11, x10
-	.loc 1 1273 0
+	.loc 1 1272 0
 	lsl	w11, w9, 10
-	.loc 1 1276 0
+	.loc 1 1275 0
 	add	w9, w9, 1
 	and	w9, w9, 255
-	.loc 1 1274 0
+	.loc 1 1273 0
 	ldrb	w10, [x10, w11, sxtw]
-	.loc 1 1275 0
+	.loc 1 1274 0
 	add	w11, w5, 12
-	.loc 1 1277 0
+	.loc 1 1276 0
 	cmp	w9, w3
-	.loc 1 1275 0
+	.loc 1 1274 0
 	lsl	w10, w10, w11
 	orr	w7, w7, w10
-	.loc 1 1277 0
-	beq	.L708
-.L672:
-	.loc 1 1281 0
+	.loc 1 1276 0
+	beq	.L710
+.L674:
+	.loc 1 1280 0
 	strb	w9, [x2, 3]
-.L671:
-	.loc 1 1284 0
+.L673:
+	.loc 1 1283 0
 	tst	w8, 983040
-	beq	.L673
-	.loc 1 1287 0
+	beq	.L675
+	.loc 1 1286 0
 	lsr	w10, w6, 16
-	.loc 1 1285 0
+	.loc 1 1284 0
 	ldrb	w9, [x2, 4]
-	.loc 1 1287 0
+	.loc 1 1286 0
 	ubfx	x11, x0, 16, 4
 	ubfiz	w10, w10, 5, 4
 	orr	w10, w10, w11
 	ldr	x11, [x4]
 	add	x10, x11, x10
-	.loc 1 1286 0
+	.loc 1 1285 0
 	lsl	w11, w9, 10
-	.loc 1 1289 0
+	.loc 1 1288 0
 	add	w9, w9, 1
 	and	w9, w9, 255
-	.loc 1 1287 0
+	.loc 1 1286 0
 	ldrb	w10, [x10, w11, sxtw]
-	.loc 1 1288 0
+	.loc 1 1287 0
 	add	w11, w5, 16
-	.loc 1 1290 0
+	.loc 1 1289 0
 	cmp	w9, w3
-	.loc 1 1288 0
+	.loc 1 1287 0
 	lsl	w10, w10, w11
 	orr	w7, w7, w10
-	.loc 1 1290 0
-	beq	.L709
-.L674:
-	.loc 1 1294 0
+	.loc 1 1289 0
+	beq	.L711
+.L676:
+	.loc 1 1293 0
 	strb	w9, [x2, 4]
-.L673:
-	.loc 1 1297 0
+.L675:
+	.loc 1 1296 0
 	tst	w8, 15728640
-	beq	.L675
-	.loc 1 1300 0
+	beq	.L677
+	.loc 1 1299 0
 	lsr	w10, w6, 20
-	.loc 1 1298 0
+	.loc 1 1297 0
 	ldrb	w9, [x2, 5]
-	.loc 1 1300 0
+	.loc 1 1299 0
 	ubfx	x11, x0, 20, 4
 	ubfiz	w10, w10, 5, 4
 	orr	w10, w10, w11
 	ldr	x11, [x4]
 	add	x10, x11, x10
-	.loc 1 1299 0
+	.loc 1 1298 0
 	lsl	w11, w9, 10
-	.loc 1 1302 0
+	.loc 1 1301 0
 	add	w9, w9, 1
 	and	w9, w9, 255
-	.loc 1 1300 0
+	.loc 1 1299 0
 	ldrb	w10, [x10, w11, sxtw]
-	.loc 1 1301 0
+	.loc 1 1300 0
 	add	w11, w5, 20
-	.loc 1 1303 0
+	.loc 1 1302 0
 	cmp	w9, w3
-	.loc 1 1301 0
+	.loc 1 1300 0
 	lsl	w10, w10, w11
 	orr	w7, w7, w10
-	.loc 1 1303 0
-	beq	.L710
-.L676:
-	.loc 1 1307 0
+	.loc 1 1302 0
+	beq	.L712
+.L678:
+	.loc 1 1306 0
 	strb	w9, [x2, 5]
-.L675:
-	.loc 1 1310 0
+.L677:
+	.loc 1 1309 0
 	tst	w8, 251658240
-	beq	.L677
-	.loc 1 1313 0
+	beq	.L679
+	.loc 1 1312 0
 	lsr	w10, w6, 24
-	.loc 1 1311 0
+	.loc 1 1310 0
 	ldrb	w9, [x2, 6]
-	.loc 1 1313 0
+	.loc 1 1312 0
 	ubfx	x11, x0, 24, 4
 	ubfiz	w10, w10, 5, 4
 	orr	w10, w10, w11
 	ldr	x11, [x4]
 	add	x10, x11, x10
-	.loc 1 1312 0
+	.loc 1 1311 0
 	lsl	w11, w9, 10
-	.loc 1 1315 0
+	.loc 1 1314 0
 	add	w9, w9, 1
 	and	w9, w9, 255
-	.loc 1 1313 0
+	.loc 1 1312 0
 	ldrb	w10, [x10, w11, sxtw]
-	.loc 1 1314 0
+	.loc 1 1313 0
 	add	w11, w5, 24
-	.loc 1 1316 0
+	.loc 1 1315 0
 	cmp	w9, w3
-	.loc 1 1314 0
+	.loc 1 1313 0
 	lsl	w10, w10, w11
 	orr	w7, w7, w10
-	.loc 1 1316 0
-	beq	.L711
-.L678:
-	.loc 1 1320 0
+	.loc 1 1315 0
+	beq	.L713
+.L680:
+	.loc 1 1319 0
 	strb	w9, [x2, 6]
-.L677:
-	.loc 1 1323 0
+.L679:
+	.loc 1 1322 0
 	tst	w8, -268435456
-	beq	.L679
-	.loc 1 1324 0
+	beq	.L681
+	.loc 1 1323 0
 	ldrb	w9, [x2, 7]
-	.loc 1 1326 0
+	.loc 1 1325 0
 	lsr	w8, w6, 28
-.LVL773:
+.LVL770:
 	ldr	x10, [x4]
 	lsr	w11, w0, 28
 	add	w4, w11, w8, lsl 5
-	.loc 1 1328 0
+	.loc 1 1327 0
 	add	w8, w9, 1
-	.loc 1 1326 0
-	add	x4, x10, x4
 	.loc 1 1325 0
+	add	x4, x10, x4
+	.loc 1 1324 0
 	lsl	w9, w9, 10
-	.loc 1 1328 0
+	.loc 1 1327 0
 	and	w8, w8, 255
-	.loc 1 1327 0
-	add	w5, w5, 28
-.LVL774:
-	.loc 1 1329 0
-	cmp	w8, w3
 	.loc 1 1326 0
+	add	w5, w5, 28
+.LVL771:
+	.loc 1 1328 0
+	cmp	w8, w3
+	.loc 1 1325 0
 	ldrb	w3, [x4, w9, sxtw]
-	.loc 1 1327 0
+	.loc 1 1326 0
 	lsl	w5, w3, w5
 	orr	w7, w7, w5
-	.loc 1 1329 0
-	beq	.L712
-.L680:
-	.loc 1 1333 0
+	.loc 1 1328 0
+	beq	.L714
+.L682:
+	.loc 1 1332 0
 	strb	w8, [x2, 7]
-.LVL775:
-.L679:
-	.loc 1 1338 0
+.LVL772:
+.L681:
+	.loc 1 1337 0
 	mov	w0, w7
-	.loc 1 1335 0
+	.loc 1 1334 0
 	str	w6, [x1]
-	.loc 1 1338 0
+	.loc 1 1337 0
 	ret
-.LVL776:
+.LVL773:
 	.p2align 3
-.L712:
-	.loc 1 1331 0
+.L714:
+	.loc 1 1330 0
 	and	w6, w6, 268435455
-.LVL777:
+.LVL774:
 	and	w0, w0, -268435456
 	orr	w6, w0, w6
-.LVL778:
-	.loc 1 1330 0
+.LVL775:
+	.loc 1 1329 0
 	mov	w8, 0
-	b	.L680
-.LVL779:
+	b	.L682
+.LVL776:
 	.p2align 3
-.L705:
-	.loc 1 1240 0
-	bfi	w6, w11, 0, 4
+.L707:
 	.loc 1 1239 0
-	mov	w9, 0
-	b	.L666
-	.p2align 3
-.L706:
-	.loc 1 1253 0
-	and	w9, w0, 240
-	and	w6, w6, -241
-.LVL780:
-	orr	w6, w9, w6
-.LVL781:
-	.loc 1 1252 0
+	bfi	w6, w11, 0, 4
+	.loc 1 1238 0
 	mov	w9, 0
 	b	.L668
 	.p2align 3
-.L707:
-	.loc 1 1266 0
-	and	w9, w0, 3840
-	and	w6, w6, -3841
-.LVL782:
+.L708:
+	.loc 1 1252 0
+	and	w9, w0, 240
+	and	w6, w6, -241
+.LVL777:
 	orr	w6, w9, w6
-.LVL783:
-	.loc 1 1265 0
+.LVL778:
+	.loc 1 1251 0
 	mov	w9, 0
 	b	.L670
 	.p2align 3
-.L708:
-	.loc 1 1279 0
-	and	w9, w0, 61440
-	and	w6, w6, -61441
-.LVL784:
+.L709:
+	.loc 1 1265 0
+	and	w9, w0, 3840
+	and	w6, w6, -3841
+.LVL779:
 	orr	w6, w9, w6
-.LVL785:
-	.loc 1 1278 0
+.LVL780:
+	.loc 1 1264 0
 	mov	w9, 0
 	b	.L672
 	.p2align 3
-.L709:
-	.loc 1 1292 0
-	and	w9, w0, 983040
-	and	w6, w6, -983041
-.LVL786:
+.L710:
+	.loc 1 1278 0
+	and	w9, w0, 61440
+	and	w6, w6, -61441
+.LVL781:
 	orr	w6, w9, w6
-.LVL787:
-	.loc 1 1291 0
+.LVL782:
+	.loc 1 1277 0
 	mov	w9, 0
 	b	.L674
 	.p2align 3
-.L710:
-	.loc 1 1305 0
-	and	w9, w0, 15728640
-	and	w6, w6, -15728641
-.LVL788:
+.L711:
+	.loc 1 1291 0
+	and	w9, w0, 983040
+	and	w6, w6, -983041
+.LVL783:
 	orr	w6, w9, w6
-.LVL789:
-	.loc 1 1304 0
+.LVL784:
+	.loc 1 1290 0
 	mov	w9, 0
 	b	.L676
 	.p2align 3
-.L711:
-	.loc 1 1318 0
-	and	w9, w0, 251658240
-	and	w6, w6, -251658241
-.LVL790:
+.L712:
+	.loc 1 1304 0
+	and	w9, w0, 15728640
+	and	w6, w6, -15728641
+.LVL785:
 	orr	w6, w9, w6
-.LVL791:
-	.loc 1 1317 0
+.LVL786:
+	.loc 1 1303 0
 	mov	w9, 0
 	b	.L678
+	.p2align 3
+.L713:
+	.loc 1 1317 0
+	and	w9, w0, 251658240
+	and	w6, w6, -251658241
+.LVL787:
+	orr	w6, w9, w6
+.LVL788:
+	.loc 1 1316 0
+	mov	w9, 0
+	b	.L680
 	.cfi_endproc
 .LFE2876:
 	.size	get_one_auto_image2.isra.1, .-get_one_auto_image2.isra.1
@@ -7066,33 +7192,33 @@
 	.type	get_auto_image2, %function
 get_auto_image2:
 .LFB2827:
-	.loc 1 1341 0
+	.loc 1 1340 0
 	.cfi_startproc
-.LVL792:
+.LVL789:
 	stp	x29, x30, [sp, -112]!
 	.cfi_def_cfa_offset 112
 	.cfi_offset 29, -112
 	.cfi_offset 30, -104
-	.loc 1 1342 0
-	adrp	x6, .LANCHOR0
-	.loc 1 1355 0
-	cmp	w5, 2
 	.loc 1 1341 0
+	adrp	x6, .LANCHOR0
+	.loc 1 1354 0
+	cmp	w5, 2
+	.loc 1 1340 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
 	stp	x21, x22, [sp, 32]
 	.cfi_offset 21, -80
 	.cfi_offset 22, -72
-	.loc 1 1342 0
-	ldr	x21, [x6, #:lo12:.LANCHOR0]
 	.loc 1 1341 0
+	ldr	x21, [x6, #:lo12:.LANCHOR0]
+	.loc 1 1340 0
 	stp	x25, x26, [sp, 64]
 	.cfi_offset 25, -48
 	.cfi_offset 26, -40
 	mov	x25, x1
-	.loc 1 1352 0
+	.loc 1 1351 0
 	add	x21, x21, 24
-	.loc 1 1341 0
+	.loc 1 1340 0
 	stp	x19, x20, [sp, 16]
 	stp	x23, x24, [sp, 48]
 	.cfi_offset 19, -96
@@ -7103,178 +7229,178 @@
 	stp	x27, x28, [sp, 80]
 	.cfi_offset 27, -32
 	.cfi_offset 28, -24
-	.loc 1 1341 0
+	.loc 1 1340 0
 	mov	x26, x2
 	str	x0, [x29, 104]
-	.loc 1 1350 0
+	.loc 1 1349 0
 	add	x0, x4, 60
-.LVL793:
-	.loc 1 1353 0
-	ldp	w1, w22, [x21, 84]
-.LVL794:
-	.loc 1 1350 0
-	str	x0, [x29, 96]
-	.loc 1 1341 0
-	mov	x27, x3
+.LVL790:
 	.loc 1 1352 0
+	ldp	w1, w22, [x21, 84]
+.LVL791:
+	.loc 1 1349 0
+	str	x0, [x29, 96]
+	.loc 1 1340 0
+	mov	x27, x3
+	.loc 1 1351 0
 	lsr	w23, w1, 3
-	.loc 1 1355 0
-	beq	.L732
-	.loc 1 1358 0
+	.loc 1 1354 0
+	beq	.L734
+	.loc 1 1357 0
 	cmp	w5, 3
 	mov	x0, 0
-.LVL795:
-	.loc 1 1365 0
+.LVL792:
+	.loc 1 1364 0
 	mov	w20, 0
-.LVL796:
-	.loc 1 1358 0
-	beq	.L733
-.LVL797:
-.L715:
-	.loc 1 1368 0
+.LVL793:
+	.loc 1 1357 0
+	beq	.L735
+.LVL794:
+.L717:
+	.loc 1 1367 0
 	ldr	x2, [x29, 104]
-.LVL798:
+.LVL795:
 	add	x0, x2, x0
 	sub	w2, w22, w20
-.LVL799:
+.LVL796:
 	mul	w2, w2, w1
 	mov	w1, 0
 	lsr	w2, w2, 2
 	bl	memset
-.LVL800:
-	.loc 1 1369 0
+.LVL797:
+	.loc 1 1368 0
 	cmp	w20, w22
-	bge	.L724
+	bge	.L726
 	sub	w15, w23, #1
-	.loc 1 1376 0
+	.loc 1 1375 0
 	add	x14, x19, 128
 	add	x15, x15, 1
-	.loc 1 1369 0
+	.loc 1 1368 0
 	mov	w8, 0
-.LVL801:
+.LVL798:
 	lsl	x28, x15, 2
 	lsl	x15, x15, 3
-.LVL802:
+.LVL799:
 	.p2align 2
-.L722:
-	.loc 1 1370 0
+.L724:
+	.loc 1 1369 0
 	ldr	w6, [x21, 84]
 	ldr	x0, [x29, 104]
 	mul	w6, w20, w6
 	lsr	w6, w6, 2
 	add	x24, x0, x6
-	.loc 1 1371 0
-	cbz	w23, .L717
+	.loc 1 1370 0
+	cbz	w23, .L719
 	mov	x18, x27
-.LVL803:
+.LVL800:
 	mov	x13, x26
-.LVL804:
+.LVL801:
 	mov	x12, 0
 	.p2align 2
-.L719:
-	.loc 1 1372 0
+.L721:
+	.loc 1 1371 0
 	ldr	w3, [x25, x12]
-	.loc 1 1376 0
+	.loc 1 1375 0
 	mov	x2, x18
-	.loc 1 1374 0
+	.loc 1 1373 0
 	ldr	w9, [x13]
-	.loc 1 1376 0
+	.loc 1 1375 0
 	mov	x1, x13
 	mov	w5, 0
 	mov	x4, x14
 	mov	w0, w3
-.LVL805:
-	.loc 1 1374 0
+.LVL802:
+	.loc 1 1373 0
 	cmp	w3, w9
-	beq	.L718
-	.loc 1 1376 0
+	beq	.L720
+	.loc 1 1375 0
 	ldrb	w3, [x19, 56]
 	bl	get_one_auto_image2.isra.1
-.LVL806:
+.LVL803:
 	str	w0, [x24, x12]
-	.loc 1 1375 0
+	.loc 1 1374 0
 	mov	w8, 1
-.LVL807:
-.L718:
+.LVL804:
+.L720:
 	add	x12, x12, 4
-	.loc 1 1378 0 discriminator 2
+	.loc 1 1377 0 discriminator 2
 	add	x13, x13, 4
-	.loc 1 1380 0 discriminator 2
+	.loc 1 1379 0 discriminator 2
 	add	x18, x18, 8
-	.loc 1 1371 0 discriminator 2
+	.loc 1 1370 0 discriminator 2
 	cmp	x12, x28
-	bne	.L719
-.LVL808:
+	bne	.L721
+.LVL805:
 	add	x26, x26, x28
-.LVL809:
+.LVL806:
 	add	x27, x27, x15
 	add	x25, x25, x28
-	.loc 1 1371 0 is_stmt 0
+	.loc 1 1370 0 is_stmt 0
 	mov	x18, x27
 	mov	x13, x26
 	mov	x12, 0
 	.p2align 2
-.L721:
-	.loc 1 1383 0 is_stmt 1
+.L723:
+	.loc 1 1382 0 is_stmt 1
 	ldr	w3, [x25, x12]
-	.loc 1 1387 0
+	.loc 1 1386 0
 	mov	x2, x18
-	.loc 1 1385 0
+	.loc 1 1384 0
 	ldr	w9, [x13]
-	.loc 1 1387 0
+	.loc 1 1386 0
 	mov	x1, x13
 	mov	w5, 2
 	mov	x4, x14
-	.loc 1 1391 0
+	.loc 1 1390 0
 	add	x18, x18, 8
-	.loc 1 1387 0
+	.loc 1 1386 0
 	mov	w0, w3
-	.loc 1 1389 0
+	.loc 1 1388 0
 	add	x13, x13, 4
-	.loc 1 1385 0
+	.loc 1 1384 0
 	cmp	w3, w9
-	beq	.L720
-	.loc 1 1387 0
+	beq	.L722
+	.loc 1 1386 0
 	ldrb	w3, [x19, 56]
 	bl	get_one_auto_image2.isra.1
-.LVL810:
+.LVL807:
 	ldr	w1, [x24, x12]
-	.loc 1 1386 0
+	.loc 1 1385 0
 	mov	w8, 1
-.LVL811:
-	.loc 1 1387 0
+.LVL808:
+	.loc 1 1386 0
 	orr	w0, w1, w0
 	str	w0, [x24, x12]
-.L720:
+.L722:
 	add	x12, x12, 4
-	.loc 1 1382 0 discriminator 2
+	.loc 1 1381 0 discriminator 2
 	cmp	x12, x28
-	bne	.L721
+	bne	.L723
 	add	x26, x26, x28
 	add	x25, x25, x28
 	add	x27, x27, x15
-.LVL812:
-.L717:
-	.loc 1 1369 0
+.LVL809:
+.L719:
+	.loc 1 1368 0
 	add	w20, w20, 2
 	cmp	w22, w20
-	bgt	.L722
-.L716:
-	.loc 1 1394 0
+	bgt	.L724
+.L718:
+	.loc 1 1393 0
 	ldr	x0, [x29, 96]
-.LVL813:
+.LVL810:
 	str	w8, [x0]
-	.loc 1 1395 0
+	.loc 1 1394 0
 	ldp	x19, x20, [sp, 16]
-.LVL814:
+.LVL811:
 	ldp	x21, x22, [sp, 32]
-.LVL815:
+.LVL812:
 	ldp	x23, x24, [sp, 48]
-.LVL816:
+.LVL813:
 	ldp	x25, x26, [sp, 64]
-.LVL817:
+.LVL814:
 	ldp	x27, x28, [sp, 80]
-.LVL818:
+.LVL815:
 	ldp	x29, x30, [sp], 112
 	.cfi_remember_state
 	.cfi_restore 30
@@ -7291,51 +7417,51 @@
 	.cfi_restore 20
 	.cfi_def_cfa 31, 0
 	ret
-.LVL819:
-.L732:
+.LVL816:
+.L734:
 	.cfi_restore_state
-	.loc 1 1357 0
-	add	w22, w22, w22, lsr 31
-.LVL820:
-	mov	x0, 0
-.LVL821:
-	asr	w22, w22, 1
-.LVL822:
 	.loc 1 1356 0
+	add	w22, w22, w22, lsr 31
+.LVL817:
+	mov	x0, 0
+.LVL818:
+	asr	w22, w22, 1
+.LVL819:
+	.loc 1 1355 0
 	mov	w20, 0
-.LVL823:
-	b	.L715
-.LVL824:
-.L733:
-	.loc 1 1359 0
+.LVL820:
+	b	.L717
+.LVL821:
+.L735:
+	.loc 1 1358 0
 	add	w20, w22, w22, lsr 31
-.LVL825:
-	.loc 1 1363 0
+.LVL822:
+	.loc 1 1362 0
 	add	x0, x4, 64
-.LVL826:
-	.loc 1 1359 0
+.LVL823:
+	.loc 1 1358 0
 	asr	w20, w20, 1
-.LVL827:
-	.loc 1 1363 0
+.LVL824:
+	.loc 1 1362 0
 	str	x0, [x29, 96]
-	.loc 1 1360 0
+	.loc 1 1359 0
 	mul	w0, w23, w20
-.LVL828:
+.LVL825:
 	sbfiz	x0, x0, 2, 32
 	add	x25, x25, x0
-	.loc 1 1361 0
+	.loc 1 1360 0
 	add	x26, x2, x0
-	.loc 1 1362 0
+	.loc 1 1361 0
 	mul	w0, w20, w1
 	add	x27, x3, x0, uxtw
 	lsr	w0, w0, 2
-	b	.L715
-.LVL829:
-.L724:
-	.loc 1 1349 0
+	b	.L717
+.LVL826:
+.L726:
+	.loc 1 1348 0
 	mov	w8, 0
-.LVL830:
-	b	.L716
+.LVL827:
+	b	.L718
 	.cfi_endproc
 .LFE2827:
 	.size	get_auto_image2, .-get_auto_image2
@@ -7344,73 +7470,73 @@
 	.type	direct_mode_data_change.isra.2, %function
 direct_mode_data_change.isra.2:
 .LFB2877:
-	.loc 1 1397 0
+	.loc 1 1396 0
 	.cfi_startproc
-.LVL831:
-	.loc 1 1399 0
+.LVL828:
+	.loc 1 1398 0
 	adrp	x7, .LANCHOR0
-	.loc 1 1397 0
+	.loc 1 1396 0
 	and	w3, w3, 255
-	.loc 1 1404 0
+	.loc 1 1403 0
 	sub	w4, w3, w4
-.LVL832:
-	.loc 1 1411 0
+.LVL829:
+	.loc 1 1410 0
 	cmp	w6, 2
-	.loc 1 1399 0
+	.loc 1 1398 0
 	ldr	x3, [x7, #:lo12:.LANCHOR0]
-	.loc 1 1405 0
+	.loc 1 1404 0
 	lsl	w7, w4, 10
 	add	x5, x5, x7, sxtw
-.LVL833:
-	.loc 1 1408 0
+.LVL830:
+	.loc 1 1407 0
 	add	x4, x3, 24
-.LVL834:
-	.loc 1 1409 0
-	ldp	w7, w3, [x4, 84]
+.LVL831:
 	.loc 1 1408 0
+	ldp	w7, w3, [x4, 84]
+	.loc 1 1407 0
 	lsr	w11, w7, 3
-	.loc 1 1411 0
-	beq	.L754
-	.loc 1 1414 0
+	.loc 1 1410 0
+	beq	.L756
+	.loc 1 1413 0
 	cmp	w6, 3
 	mov	w14, w3
-.LVL835:
+.LVL832:
 	mov	w6, 0
-.LVL836:
-	.loc 1 1419 0
+.LVL833:
+	.loc 1 1418 0
 	mov	w12, 0
-.LVL837:
-	.loc 1 1414 0
-	beq	.L755
-.L736:
-	.loc 1 1422 0
+.LVL834:
+	.loc 1 1413 0
+	beq	.L757
+.L738:
+	.loc 1 1421 0
 	ldr	w4, [x4, 156]
-	cbz	w4, .L737
-	.loc 1 1423 0
+	cbz	w4, .L739
+	.loc 1 1422 0
 	sub	w3, w3, #1
-	.loc 1 1424 0
-	neg	w15, w7, lsr 2
-.LVL838:
 	.loc 1 1423 0
+	neg	w15, w7, lsr 2
+.LVL835:
+	.loc 1 1422 0
 	sub	w3, w3, w6
 	mul	w3, w3, w7
 	lsr	w3, w3, 2
 	add	x10, x0, x3
-.LVL839:
-.L740:
-	.loc 1 1430 0
+.LVL836:
+.L742:
+	.loc 1 1429 0
 	cmp	w12, w14
-	bge	.L748
+	bge	.L750
 	sub	w13, w11, #1
 	sxtw	x15, w15
-.LVL840:
+.LVL837:
 	add	x13, x13, 1
 	lsl	x13, x13, 2
-.L749:
-	.loc 1 1431 0
+.L751:
+	.loc 1 1430 0
 	mov	x6, 0
-	cbz	w11, .L756
-	.loc 1 1397 0
+	cbz	w11, .L758
+	.loc 1 1396 0
 	stp	x29, x30, [sp, -32]!
 	.cfi_def_cfa_offset 32
 	.cfi_offset 29, -32
@@ -7421,133 +7547,133 @@
 	.cfi_offset 19, -16
 	.cfi_offset 20, -8
 	.p2align 2
-.L745:
-	.loc 1 1433 0
-	ldr	w0, [x2, x6, lsl 2]
+.L747:
 	.loc 1 1432 0
+	ldr	w0, [x2, x6, lsl 2]
+	.loc 1 1431 0
 	ldr	w3, [x1, x6, lsl 2]
-.LVL841:
-.LBB1494:
-.LBB1495:
-	.loc 1 270 0
+.LVL838:
+.LBB1556:
+.LBB1557:
+	.loc 1 269 0
 	lsr	w16, w0, 11
-	.loc 1 268 0
+	.loc 1 267 0
 	lsr	w4, w0, 3
-.LVL842:
-	.loc 1 270 0
+.LVL839:
+	.loc 1 269 0
 	ubfx	x17, x3, 16, 4
-	.loc 1 268 0
+	.loc 1 267 0
 	ubfx	x7, x3, 8, 4
-	.loc 1 269 0
+	.loc 1 268 0
 	lsr	w30, w0, 7
-	.loc 1 267 0
+	.loc 1 266 0
 	lsl	w9, w0, 1
-	.loc 1 272 0
+	.loc 1 271 0
 	lsr	w8, w0, 19
-	.loc 1 270 0
+	.loc 1 269 0
 	and	w16, w16, 480
-	.loc 1 268 0
+	.loc 1 267 0
 	and	w4, w4, 480
-	.loc 1 270 0
+	.loc 1 269 0
 	orr	w16, w16, w17
-	.loc 1 268 0
+	.loc 1 267 0
 	orr	w4, w4, w7
-	.loc 1 267 0
+	.loc 1 266 0
 	ubfx	x17, x3, 4, 4
-	.loc 1 272 0
+	.loc 1 271 0
 	ubfx	x18, x3, 24, 4
-	.loc 1 269 0
+	.loc 1 268 0
 	ubfx	x20, x3, 12, 4
-	.loc 1 271 0
+	.loc 1 270 0
 	lsr	w7, w0, 15
-	.loc 1 269 0
+	.loc 1 268 0
 	and	w30, w30, 480
-	.loc 1 267 0
+	.loc 1 266 0
 	and	w9, w9, 480
-	.loc 1 272 0
+	.loc 1 271 0
 	and	w8, w8, 480
-	.loc 1 267 0
+	.loc 1 266 0
 	orr	w9, w9, w17
-	.loc 1 272 0
+	.loc 1 271 0
 	orr	w8, w8, w18
-	.loc 1 271 0
+	.loc 1 270 0
 	ubfx	x17, x3, 20, 4
-	.loc 1 273 0
-	lsr	w18, w0, 23
-	.loc 1 269 0
-	orr	w30, w30, w20
-	.loc 1 271 0
-	and	w7, w7, 480
-	.loc 1 266 0
-	and	w19, w3, 15
-	.loc 1 271 0
-	orr	w7, w7, w17
-	.loc 1 273 0
-	and	w18, w18, 480
-	.loc 1 266 0
-	ubfiz	w0, w0, 5, 4
-.LVL843:
-	.loc 1 270 0
-	ldrb	w17, [x5, w16, uxtw]
-	.loc 1 273 0
-	add	w3, w18, w3, lsr 28
-.LVL844:
-	.loc 1 268 0
-	ldrb	w16, [x5, w4, uxtw]
-	.loc 1 266 0
-	orr	w0, w0, w19
-	.loc 1 269 0
-	ldrb	w4, [x5, w30, uxtw]
-	.loc 1 267 0
-	ldrb	w9, [x5, w9, uxtw]
 	.loc 1 272 0
-	ldrb	w8, [x5, w8, uxtw]
+	lsr	w18, w0, 23
 	.loc 1 268 0
-	lsl	w16, w16, 4
-	.loc 1 271 0
-	ldrb	w7, [x5, w7, uxtw]
-	.loc 1 266 0
-	ldrb	w18, [x5, w0, uxtw]
+	orr	w30, w30, w20
 	.loc 1 270 0
+	and	w7, w7, 480
+	.loc 1 265 0
+	and	w19, w3, 15
+	.loc 1 270 0
+	orr	w7, w7, w17
+	.loc 1 272 0
+	and	w18, w18, 480
+	.loc 1 265 0
+	ubfiz	w0, w0, 5, 4
+.LVL840:
+	.loc 1 269 0
+	ldrb	w17, [x5, w16, uxtw]
+	.loc 1 272 0
+	add	w3, w18, w3, lsr 28
+.LVL841:
+	.loc 1 267 0
+	ldrb	w16, [x5, w4, uxtw]
+	.loc 1 265 0
+	orr	w0, w0, w19
+	.loc 1 268 0
+	ldrb	w4, [x5, w30, uxtw]
+	.loc 1 266 0
+	ldrb	w9, [x5, w9, uxtw]
+	.loc 1 271 0
+	ldrb	w8, [x5, w8, uxtw]
+	.loc 1 267 0
+	lsl	w16, w16, 4
+	.loc 1 270 0
+	ldrb	w7, [x5, w7, uxtw]
+	.loc 1 265 0
+	ldrb	w18, [x5, w0, uxtw]
+	.loc 1 269 0
 	lsl	w0, w17, 8
-	.loc 1 273 0
+	.loc 1 272 0
 	ldrb	w3, [x5, w3, uxtw]
 	orr	w0, w0, w4, lsl 6
 	orr	w9, w16, w9, lsl 2
-	.loc 1 272 0
+	.loc 1 271 0
 	lsl	w4, w8, 12
-	.loc 1 273 0
+	.loc 1 272 0
 	orr	w0, w0, w9
 	orr	w4, w4, w7, lsl 10
 	orr	w0, w0, w4
 	orr	w3, w18, w3, lsl 14
 	orr	w0, w0, w3
-.LBE1495:
-.LBE1494:
-	.loc 1 1434 0
+.LBE1557:
+.LBE1556:
+	.loc 1 1433 0
 	strh	w0, [x10, x6, lsl 1]
 	add	x6, x6, 1
-	.loc 1 1431 0
-	cmp	w11, w6
-	bgt	.L745
 	.loc 1 1430 0
+	cmp	w11, w6
+	bgt	.L747
+	.loc 1 1429 0
 	add	w12, w12, 1
 	add	x1, x1, x13
 	add	x2, x2, x13
 	add	x10, x10, x15
 	cmp	w12, w14
-	beq	.L734
-.L757:
-	.loc 1 1431 0
-	mov	x6, 0
-	cbnz	w11, .L745
+	beq	.L736
+.L759:
 	.loc 1 1430 0
+	mov	x6, 0
+	cbnz	w11, .L747
+	.loc 1 1429 0
 	add	w12, w12, 1
 	add	x10, x10, x15
 	cmp	w12, w14
-	bne	.L757
-.L734:
-	.loc 1 1437 0
+	bne	.L759
+.L736:
+	.loc 1 1436 0
 	ldp	x19, x20, [sp, 16]
 	ldp	x29, x30, [sp], 32
 	.cfi_restore 30
@@ -7556,53 +7682,53 @@
 	.cfi_restore 20
 	.cfi_def_cfa 31, 0
 	ret
-.L756:
-	.loc 1 1430 0
+.L758:
+	.loc 1 1429 0
 	add	w12, w12, 1
 	add	x10, x10, x15
 	cmp	w12, w14
-	bne	.L749
-.LVL845:
-.L748:
+	bne	.L751
+.LVL842:
+.L750:
 	ret
-.LVL846:
-.L737:
-	.loc 1 1426 0
+.LVL843:
+.L739:
+	.loc 1 1425 0
 	mul	w3, w7, w6
-	.loc 1 1427 0
-	lsr	w15, w7, 2
-.LVL847:
 	.loc 1 1426 0
+	lsr	w15, w7, 2
+.LVL844:
+	.loc 1 1425 0
 	lsr	w3, w3, 2
 	add	x10, x0, x3
-.LVL848:
-	b	.L740
-.LVL849:
-.L754:
-	.loc 1 1413 0
+.LVL845:
+	b	.L742
+.LVL846:
+.L756:
+	.loc 1 1412 0
 	add	w14, w3, w3, lsr 31
 	mov	w6, 0
-.LVL850:
+.LVL847:
 	asr	w14, w14, 1
-.LVL851:
-	.loc 1 1412 0
+.LVL848:
+	.loc 1 1411 0
 	mov	w12, 0
-.LVL852:
-	b	.L736
-.L755:
-	.loc 1 1415 0
+.LVL849:
+	b	.L738
+.L757:
+	.loc 1 1414 0
 	add	w12, w3, w3, lsr 31
-.LVL853:
+.LVL850:
 	asr	w12, w12, 1
-.LVL854:
+.LVL851:
 	mov	w6, w12
-	.loc 1 1416 0
+	.loc 1 1415 0
 	mul	w8, w11, w12
 	sbfiz	x8, x8, 2, 32
 	add	x1, x1, x8
-	.loc 1 1417 0
+	.loc 1 1416 0
 	add	x2, x2, x8
-	b	.L736
+	b	.L738
 	.cfi_endproc
 .LFE2877:
 	.size	direct_mode_data_change.isra.2, .-direct_mode_data_change.isra.2
@@ -7611,59 +7737,59 @@
 	.type	direct_mode_data_change2.isra.3, %function
 direct_mode_data_change2.isra.3:
 .LFB2878:
-	.loc 1 1484 0
+	.loc 1 1483 0
 	.cfi_startproc
-.LVL855:
-	.loc 1 1486 0
+.LVL852:
+	.loc 1 1485 0
 	adrp	x7, .LANCHOR0
-	.loc 1 1484 0
+	.loc 1 1483 0
 	and	w3, w3, 255
-	.loc 1 1491 0
+	.loc 1 1490 0
 	sub	w3, w3, w4
-.LVL856:
-	.loc 1 1499 0
+.LVL853:
+	.loc 1 1498 0
 	cmp	w6, 2
-	.loc 1 1486 0
+	.loc 1 1485 0
 	ldr	x4, [x7, #:lo12:.LANCHOR0]
-	.loc 1 1492 0
+	.loc 1 1491 0
 	lsl	w3, w3, 10
-.LVL857:
+.LVL854:
 	add	x5, x5, x3, sxtw
-.LVL858:
-	.loc 1 1497 0
-	ldp	w12, w13, [x4, 108]
+.LVL855:
 	.loc 1 1496 0
+	ldp	w12, w13, [x4, 108]
+	.loc 1 1495 0
 	lsr	w8, w12, 3
-	.loc 1 1499 0
-	beq	.L782
-	.loc 1 1507 0
+	.loc 1 1498 0
+	beq	.L784
+	.loc 1 1506 0
 	mov	w10, 0
-.LVL859:
-	.loc 1 1502 0
+.LVL856:
+	.loc 1 1501 0
 	cmp	w6, 3
-	beq	.L783
-.LVL860:
-.L760:
-	.loc 1 1510 0
+	beq	.L785
+.LVL857:
+.L762:
+	.loc 1 1509 0
 	lsr	w12, w12, 2
-.LVL861:
-	.loc 1 1511 0
+.LVL858:
+	.loc 1 1510 0
 	cmp	w13, w10
-	ble	.L775
-.L786:
+	ble	.L777
+.L788:
 	sub	w9, w8, #1
 	mul	w11, w12, w10
 	add	x9, x9, 1
 	lsl	w12, w12, 1
-.LVL862:
+.LVL859:
 	lsl	x9, x9, 2
-.LVL863:
-.L776:
-	.loc 1 1512 0
+.LVL860:
+.L778:
+	.loc 1 1511 0
 	add	x7, x0, x11, sxtw
-	.loc 1 1513 0
-	cbz	w8, .L784
-	.loc 1 1484 0
+	.loc 1 1512 0
+	cbz	w8, .L786
+	.loc 1 1483 0
 	stp	x29, x30, [sp, -64]!
 	.cfi_def_cfa_offset 64
 	.cfi_offset 29, -64
@@ -7679,246 +7805,246 @@
 	.cfi_offset 22, -24
 	.cfi_offset 23, -16
 	.p2align 2
-.L777:
-	.loc 1 1513 0
+.L779:
+	.loc 1 1512 0
 	mov	x14, 0
 	.p2align 2
-.L763:
-	.loc 1 1515 0
-	ldr	w3, [x2, x14, lsl 2]
+.L765:
 	.loc 1 1514 0
+	ldr	w3, [x2, x14, lsl 2]
+	.loc 1 1513 0
 	ldr	w4, [x1, x14, lsl 2]
-.LBB1496:
-.LBB1497:
-	.loc 1 282 0
+.LBB1558:
+.LBB1559:
+	.loc 1 281 0
 	lsr	w16, w3, 11
-	.loc 1 280 0
+	.loc 1 279 0
 	lsr	w6, w3, 3
-.LVL864:
-	.loc 1 282 0
+.LVL861:
+	.loc 1 281 0
 	ubfx	x17, x4, 16, 4
-	.loc 1 280 0
+	.loc 1 279 0
 	ubfx	x15, x4, 8, 4
-	.loc 1 281 0
+	.loc 1 280 0
 	lsr	w30, w3, 7
-	.loc 1 279 0
+	.loc 1 278 0
 	lsl	w21, w3, 1
-	.loc 1 284 0
-	lsr	w20, w3, 19
-	.loc 1 282 0
-	and	w16, w16, 480
-	.loc 1 280 0
-	and	w6, w6, 480
-	.loc 1 281 0
-	ubfx	x19, x4, 12, 4
-	.loc 1 282 0
-	orr	w16, w16, w17
-	.loc 1 279 0
-	ubfx	x18, x4, 4, 4
-	.loc 1 280 0
-	orr	w6, w6, w15
-	.loc 1 284 0
-	ubfx	x17, x4, 24, 4
 	.loc 1 283 0
-	lsr	w15, w3, 15
+	lsr	w20, w3, 19
 	.loc 1 281 0
-	and	w30, w30, 480
+	and	w16, w16, 480
 	.loc 1 279 0
+	and	w6, w6, 480
+	.loc 1 280 0
+	ubfx	x19, x4, 12, 4
+	.loc 1 281 0
+	orr	w16, w16, w17
+	.loc 1 278 0
+	ubfx	x18, x4, 4, 4
+	.loc 1 279 0
+	orr	w6, w6, w15
+	.loc 1 283 0
+	ubfx	x17, x4, 24, 4
+	.loc 1 282 0
+	lsr	w15, w3, 15
+	.loc 1 280 0
+	and	w30, w30, 480
+	.loc 1 278 0
 	and	w21, w21, 480
-	.loc 1 284 0
+	.loc 1 283 0
 	and	w20, w20, 480
 	orr	w20, w20, w17
-	.loc 1 281 0
+	.loc 1 280 0
 	orr	w30, w30, w19
-	.loc 1 279 0
+	.loc 1 278 0
 	orr	w21, w21, w18
-	.loc 1 285 0
+	.loc 1 284 0
 	lsr	w17, w3, 23
-	.loc 1 283 0
+	.loc 1 282 0
 	ubfx	x18, x4, 20, 4
 	and	w15, w15, 480
-	.loc 1 278 0
+	.loc 1 277 0
 	and	w22, w4, 15
-	.loc 1 283 0
+	.loc 1 282 0
 	orr	w15, w15, w18
-	.loc 1 285 0
-	and	w17, w17, 480
-	.loc 1 278 0
-	ubfiz	w3, w3, 5, 4
-	.loc 1 282 0
-	ldrb	w19, [x5, w16, uxtw]
-	.loc 1 285 0
-	add	w4, w17, w4, lsr 28
-	.loc 1 280 0
-	ldrb	w18, [x5, w6, uxtw]
-	.loc 1 278 0
-	orr	w3, w3, w22
-	.loc 1 281 0
-	ldrb	w6, [x5, w30, uxtw]
 	.loc 1 284 0
-	ldrb	w16, [x5, w20, uxtw]
+	and	w17, w17, 480
+	.loc 1 277 0
+	ubfiz	w3, w3, 5, 4
+	.loc 1 281 0
+	ldrb	w19, [x5, w16, uxtw]
+	.loc 1 284 0
+	add	w4, w17, w4, lsr 28
 	.loc 1 279 0
-	ldrb	w17, [x5, w21, uxtw]
+	ldrb	w18, [x5, w6, uxtw]
+	.loc 1 277 0
+	orr	w3, w3, w22
 	.loc 1 280 0
-	lsl	w18, w18, 8
+	ldrb	w6, [x5, w30, uxtw]
 	.loc 1 283 0
-	ldrb	w15, [x5, w15, uxtw]
+	ldrb	w16, [x5, w20, uxtw]
 	.loc 1 278 0
-	ldrb	w20, [x5, w3, uxtw]
+	ldrb	w17, [x5, w21, uxtw]
+	.loc 1 279 0
+	lsl	w18, w18, 8
 	.loc 1 282 0
+	ldrb	w15, [x5, w15, uxtw]
+	.loc 1 277 0
+	ldrb	w20, [x5, w3, uxtw]
+	.loc 1 281 0
 	lsl	w3, w19, 16
-	.loc 1 285 0
+	.loc 1 284 0
 	ldrb	w4, [x5, w4, uxtw]
 	orr	w3, w3, w6, lsl 12
 	orr	w17, w18, w17, lsl 4
-	.loc 1 284 0
+	.loc 1 283 0
 	lsl	w6, w16, 24
-	.loc 1 285 0
+	.loc 1 284 0
 	orr	w3, w3, w17
 	orr	w6, w6, w15, lsl 20
 	orr	w3, w3, w6
 	orr	w4, w20, w4, lsl 28
 	orr	w3, w3, w4
-.LBE1497:
-.LBE1496:
-	.loc 1 1516 0
+.LBE1559:
+.LBE1558:
+	.loc 1 1515 0
 	str	w3, [x7, x14, lsl 2]
 	add	x14, x14, 1
-	.loc 1 1513 0
+	.loc 1 1512 0
 	cmp	w8, w14
-	bgt	.L763
+	bgt	.L765
 	add	x1, x1, x9
 	add	x2, x2, x9
 	mov	x14, 0
 	.p2align 2
-.L764:
-	.loc 1 1520 0
-	ldr	w3, [x2, x14, lsl 2]
+.L766:
 	.loc 1 1519 0
+	ldr	w3, [x2, x14, lsl 2]
+	.loc 1 1518 0
 	ldr	w4, [x1, x14, lsl 2]
-	.loc 1 1521 0
+	.loc 1 1520 0
 	ldr	w16, [x7, x14, lsl 2]
-.LBB1498:
-.LBB1499:
-	.loc 1 293 0
-	lsr	w20, w3, 7
-	.loc 1 290 0
-	and	w6, w4, 15
-	.loc 1 293 0
-	ubfx	x15, x4, 12, 4
+.LBB1560:
+.LBB1561:
 	.loc 1 292 0
-	lsr	w19, w3, 3
+	lsr	w20, w3, 7
+	.loc 1 289 0
+	and	w6, w4, 15
+	.loc 1 292 0
+	ubfx	x15, x4, 12, 4
 	.loc 1 291 0
-	lsl	w18, w3, 1
+	lsr	w19, w3, 3
 	.loc 1 290 0
+	lsl	w18, w3, 1
+	.loc 1 289 0
 	ubfiz	w30, w3, 5, 4
-	.loc 1 295 0
+	.loc 1 294 0
 	lsr	w17, w3, 15
-	.loc 1 293 0
+	.loc 1 292 0
 	and	w20, w20, 480
 	orr	w20, w20, w15
-	.loc 1 291 0
-	ubfx	x21, x4, 4, 4
 	.loc 1 290 0
+	ubfx	x21, x4, 4, 4
+	.loc 1 289 0
 	orr	w30, w30, w6
-	.loc 1 295 0
+	.loc 1 294 0
 	ubfx	x22, x4, 20, 4
-	.loc 1 292 0
+	.loc 1 291 0
 	ubfx	x23, x4, 8, 4
-	.loc 1 294 0
+	.loc 1 293 0
 	lsr	w15, w3, 11
-	.loc 1 297 0
+	.loc 1 296 0
 	lsr	w6, w3, 23
-	.loc 1 292 0
+	.loc 1 291 0
 	and	w19, w19, 480
-	.loc 1 291 0
+	.loc 1 290 0
 	and	w18, w18, 480
-	.loc 1 295 0
+	.loc 1 294 0
 	and	w17, w17, 480
-	.loc 1 291 0
+	.loc 1 290 0
 	orr	w18, w18, w21
-	.loc 1 295 0
+	.loc 1 294 0
 	orr	w17, w17, w22
-	.loc 1 294 0
+	.loc 1 293 0
 	ubfx	x21, x4, 16, 4
-	.loc 1 292 0
+	.loc 1 291 0
 	orr	w19, w19, w23
-	.loc 1 297 0
+	.loc 1 296 0
 	and	w6, w6, 480
-	.loc 1 294 0
+	.loc 1 293 0
 	and	w15, w15, 480
-	.loc 1 296 0
+	.loc 1 295 0
 	lsr	w3, w3, 19
-	.loc 1 294 0
+	.loc 1 293 0
 	orr	w15, w15, w21
-	.loc 1 296 0
+	.loc 1 295 0
 	ubfx	x22, x4, 24, 4
 	and	w3, w3, 480
-	.loc 1 297 0
+	.loc 1 296 0
 	add	w4, w6, w4, lsr 28
-	.loc 1 293 0
-	ldrb	w21, [x5, w20, uxtw]
-	.loc 1 296 0
-	orr	w3, w3, w22
-	.loc 1 290 0
-	ldrb	w20, [x5, w30, uxtw]
 	.loc 1 292 0
-	ldrb	w6, [x5, w19, uxtw]
+	ldrb	w21, [x5, w20, uxtw]
 	.loc 1 295 0
-	ldrb	w30, [x5, w17, uxtw]
+	orr	w3, w3, w22
+	.loc 1 289 0
+	ldrb	w20, [x5, w30, uxtw]
 	.loc 1 291 0
-	ldrb	w19, [x5, w18, uxtw]
-	.loc 1 297 0
-	ldrb	w17, [x5, w4, uxtw]
-	.loc 1 293 0
-	lsl	w4, w21, 14
+	ldrb	w6, [x5, w19, uxtw]
 	.loc 1 294 0
-	ldrb	w18, [x5, w15, uxtw]
-	.loc 1 297 0
-	orr	w4, w4, w6, lsl 10
-	.loc 1 296 0
-	ldrb	w15, [x5, w3, uxtw]
+	ldrb	w30, [x5, w17, uxtw]
 	.loc 1 290 0
-	lsl	w3, w20, 2
-	.loc 1 297 0
-	orr	w3, w3, w19, lsl 6
+	ldrb	w19, [x5, w18, uxtw]
+	.loc 1 296 0
+	ldrb	w17, [x5, w4, uxtw]
+	.loc 1 292 0
+	lsl	w4, w21, 14
+	.loc 1 293 0
+	ldrb	w18, [x5, w15, uxtw]
+	.loc 1 296 0
+	orr	w4, w4, w6, lsl 10
 	.loc 1 295 0
+	ldrb	w15, [x5, w3, uxtw]
+	.loc 1 289 0
+	lsl	w3, w20, 2
+	.loc 1 296 0
+	orr	w3, w3, w19, lsl 6
+	.loc 1 294 0
 	lsl	w6, w30, 22
-	.loc 1 297 0
+	.loc 1 296 0
 	orr	w3, w4, w3
 	orr	w6, w6, w18, lsl 18
 	lsl	w4, w17, 30
 	orr	w3, w3, w6
 	orr	w4, w4, w15, lsl 26
 	orr	w3, w3, w4
-.LBE1499:
-.LBE1498:
-	.loc 1 1521 0
+.LBE1561:
+.LBE1560:
+	.loc 1 1520 0
 	orr	w3, w16, w3
 	str	w3, [x7, x14, lsl 2]
 	add	x14, x14, 1
-	.loc 1 1518 0
+	.loc 1 1517 0
 	cmp	w8, w14
-	bgt	.L764
-	.loc 1 1511 0
+	bgt	.L766
+	.loc 1 1510 0
 	add	w10, w10, 2
 	add	x1, x1, x9
 	add	x2, x2, x9
 	add	w11, w11, w12
 	cmp	w10, w13
-	bge	.L785
-.L765:
-	.loc 1 1512 0
-	add	x7, x0, x11, sxtw
-	.loc 1 1513 0
-	cbnz	w8, .L777
+	bge	.L787
+.L767:
 	.loc 1 1511 0
+	add	x7, x0, x11, sxtw
+	.loc 1 1512 0
+	cbnz	w8, .L779
+	.loc 1 1510 0
 	add	w10, w10, 2
 	add	w11, w11, w12
 	cmp	w10, w13
-	blt	.L765
-.L785:
-	.loc 1 1524 0
+	blt	.L767
+.L787:
+	.loc 1 1523 0
 	ldp	x19, x20, [sp, 16]
 	ldp	x21, x22, [sp, 32]
 	ldr	x23, [sp, 48]
@@ -7932,47 +8058,47 @@
 	.cfi_restore 20
 	.cfi_def_cfa 31, 0
 	ret
-.LVL865:
-.L784:
-	.loc 1 1511 0
+.LVL862:
+.L786:
+	.loc 1 1510 0
 	add	w10, w10, 2
 	add	w11, w11, w12
 	cmp	w10, w13
-	blt	.L776
+	blt	.L778
 	ret
-.LVL866:
-.L782:
-	.loc 1 1501 0
-	add	w13, w13, w13, lsr 31
-.LVL867:
+.LVL863:
+.L784:
 	.loc 1 1500 0
+	add	w13, w13, w13, lsr 31
+.LVL864:
+	.loc 1 1499 0
 	mov	w10, 0
-.LVL868:
-	.loc 1 1501 0
+.LVL865:
+	.loc 1 1500 0
 	asr	w13, w13, 1
-.LVL869:
-	.loc 1 1510 0
+.LVL866:
+	.loc 1 1509 0
 	lsr	w12, w12, 2
-.LVL870:
-	.loc 1 1511 0
+.LVL867:
+	.loc 1 1510 0
 	cmp	w13, w10
-	bgt	.L786
-.L775:
+	bgt	.L788
+.L777:
 	ret
-.LVL871:
-.L783:
-	.loc 1 1503 0
+.LVL868:
+.L785:
+	.loc 1 1502 0
 	add	w10, w13, w13, lsr 31
-.LVL872:
+.LVL869:
 	asr	w10, w10, 1
-.LVL873:
-	.loc 1 1504 0
+.LVL870:
+	.loc 1 1503 0
 	mul	w3, w8, w10
 	sbfiz	x3, x3, 2, 32
 	add	x1, x1, x3
-	.loc 1 1505 0
+	.loc 1 1504 0
 	add	x2, x2, x3
-	b	.L760
+	b	.L762
 	.cfi_endproc
 .LFE2878:
 	.size	direct_mode_data_change2.isra.3, .-direct_mode_data_change2.isra.3
@@ -7981,73 +8107,73 @@
 	.type	flip.isra.4, %function
 flip.isra.4:
 .LFB2879:
-	.loc 1 1573 0
+	.loc 1 1572 0
 	.cfi_startproc
-.LVL874:
+.LVL871:
 	stp	x29, x30, [sp, -32]!
 	.cfi_def_cfa_offset 32
 	.cfi_offset 29, -32
 	.cfi_offset 30, -24
-	.loc 1 1577 0
+	.loc 1 1576 0
 	sxtw	x2, w1
-	.loc 1 1573 0
+	.loc 1 1572 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
 	stp	x19, x20, [sp, 16]
 	.cfi_offset 19, -16
 	.cfi_offset 20, -8
-	.loc 1 1573 0
+	.loc 1 1572 0
 	mov	x20, x0
-	.loc 1 1575 0
+	.loc 1 1574 0
 	ldr	w19, [x0, 72]
-	.loc 1 1577 0
+	.loc 1 1576 0
 	ldr	x0, [x0]
-.LVL875:
-.LBB1500:
-.LBB1501:
-.LBB1502:
-.LBB1503:
+.LVL872:
+.LBB1562:
+.LBB1563:
+.LBB1564:
+.LBB1565:
 	.file 9 "./include/linux/dma-mapping.h"
 	.loc 9 266 0
-	cbz	x0, .L790
+	cbz	x0, .L792
 	ldr	x3, [x0, 648]
 	.loc 9 268 0
 	adrp	x4, dummy_dma_ops
 	add	x4, x4, :lo12:dummy_dma_ops
 	cmp	x3, 0
 	csel	x3, x4, x3, eq
-.L788:
-.LBE1503:
-.LBE1502:
+.L790:
+.LBE1565:
+.LBE1564:
 	.loc 9 434 0
 	ldr	x5, [x3, 88]
 	sxtw	x19, w19
-	cbz	x5, .L789
-.LBE1501:
-.LBE1500:
-	.loc 1 1577 0
+	cbz	x5, .L791
+.LBE1563:
+.LBE1562:
+	.loc 1 1576 0
 	add	x4, x19, x19, lsl 1
-.LBB1509:
-.LBB1506:
+.LBB1571:
+.LBB1568:
 	.loc 9 435 0
 	mov	w3, 1
-.LBE1506:
-.LBE1509:
-	.loc 1 1577 0
+.LBE1568:
+.LBE1571:
+	.loc 1 1576 0
 	add	x4, x20, x4, lsl 3
-.LBB1510:
-.LBB1507:
+.LBB1572:
+.LBB1569:
 	.loc 9 435 0
 	ldr	x1, [x4, 32]
 	blr	x5
-.LVL876:
-.L789:
-.LBE1507:
-.LBE1510:
-	.loc 1 1578 0
+.LVL873:
+.L791:
+.LBE1569:
+.LBE1572:
+	.loc 1 1577 0
 	ldr	x5, [x20, 8]
-.LBB1511:
-.LBB1512:
+.LBB1573:
+.LBB1574:
 	.file 10 "drivers/gpu/drm/rockchip/ebc-dev/tcon/ebc_tcon.h"
 	.loc 10 56 0
 	mov	w4, 0
@@ -8055,58 +8181,58 @@
 	mov	w2, 0
 	mov	x0, x5
 	mov	w1, 0
-.LBE1512:
-.LBE1511:
-	.loc 1 1579 0
+.LBE1574:
+.LBE1573:
+	.loc 1 1578 0
 	add	x19, x19, x19, lsl 1
-.LBB1515:
-.LBB1513:
+.LBB1577:
+.LBB1575:
 	.loc 10 56 0
 	ldr	x5, [x5, 64]
-.LBE1513:
-.LBE1515:
-	.loc 1 1579 0
+.LBE1575:
+.LBE1577:
+	.loc 1 1578 0
 	add	x19, x20, x19, lsl 3
-.LBB1516:
-.LBB1514:
+.LBB1578:
+.LBB1576:
 	.loc 10 56 0
 	blr	x5
-.LVL877:
-.LBE1514:
-.LBE1516:
-	.loc 1 1579 0
+.LVL874:
+.LBE1576:
+.LBE1578:
+	.loc 1 1578 0
 	ldr	x1, [x20, 8]
-.LBB1517:
-.LBB1518:
+.LBB1579:
+.LBB1580:
 	.loc 10 61 0
 	mov	w2, 0
 	mov	x0, x1
 	ldr	x3, [x1, 72]
 	ldr	w1, [x19, 32]
 	blr	x3
-.LVL878:
-.LBE1518:
-.LBE1517:
-	.loc 1 1580 0
+.LVL875:
+.LBE1580:
+.LBE1579:
+	.loc 1 1579 0
 	ldr	x2, [x20, 8]
-.LBB1519:
-.LBB1520:
+.LBB1581:
+.LBB1582:
 	.loc 10 76 0
 	mov	w1, 1
 	mov	x0, x2
 	ldr	x2, [x2, 96]
 	blr	x2
-.LVL879:
-.LBE1520:
-.LBE1519:
-	.loc 1 1581 0
+.LVL876:
+.LBE1582:
+.LBE1581:
+	.loc 1 1580 0
 	ldr	w1, [x20, 72]
 	mov	w0, 1
 	sub	w0, w0, w1
 	str	w0, [x20, 72]
-	.loc 1 1582 0
+	.loc 1 1581 0
 	ldp	x19, x20, [sp, 16]
-.LVL880:
+.LVL877:
 	ldp	x29, x30, [sp], 32
 	.cfi_remember_state
 	.cfi_restore 30
@@ -8115,22 +8241,22 @@
 	.cfi_restore 20
 	.cfi_def_cfa 31, 0
 	ret
-.LVL881:
+.LVL878:
 	.p2align 3
-.L790:
+.L792:
 	.cfi_restore_state
-.LBB1521:
-.LBB1508:
-.LBB1505:
-.LBB1504:
+.LBB1583:
+.LBB1570:
+.LBB1567:
+.LBB1566:
 	.loc 9 268 0
 	adrp	x3, dummy_dma_ops
 	add	x3, x3, :lo12:dummy_dma_ops
-	b	.L788
-.LBE1504:
-.LBE1505:
-.LBE1508:
-.LBE1521:
+	b	.L790
+.LBE1566:
+.LBE1567:
+.LBE1570:
+.LBE1583:
 	.cfi_endproc
 .LFE2879:
 	.size	flip.isra.4, .-flip.isra.4
@@ -8139,9 +8265,9 @@
 	.type	ebc_power_set.part.7, %function
 ebc_power_set.part.7:
 .LFB2882:
-	.loc 1 390 0
+	.loc 1 389 0
 	.cfi_startproc
-.LVL882:
+.LVL879:
 	stp	x29, x30, [sp, -32]!
 	.cfi_def_cfa_offset 32
 	.cfi_offset 29, -32
@@ -8151,47 +8277,47 @@
 	stp	x19, x20, [sp, 16]
 	.cfi_offset 19, -16
 	.cfi_offset 20, -8
-	.loc 1 390 0
+	.loc 1 389 0
 	mov	x19, x0
+	.loc 1 406 0
+	str	w1, [x0, 392]
 	.loc 1 407 0
-	str	w1, [x0, 400]
-	.loc 1 408 0
 	ldr	x1, [x0, 8]
-.LVL883:
-.LBB1522:
-.LBB1523:
+.LVL880:
+.LBB1584:
+.LBB1585:
 	.loc 10 50 0
 	mov	x0, x1
-.LVL884:
+.LVL881:
 	ldr	x1, [x1, 56]
 	blr	x1
-.LVL885:
-.LBE1523:
-.LBE1522:
-	.loc 1 409 0
+.LVL882:
+.LBE1585:
+.LBE1584:
+	.loc 1 408 0
 	ldr	x2, [x19, 16]
-.LBB1524:
-.LBB1525:
+.LBB1586:
+.LBB1587:
 	.loc 3 35 0
 	mov	w1, 0
 	mov	x0, x2
 	ldr	x2, [x2, 32]
 	blr	x2
-.LVL886:
-.LBE1525:
-.LBE1524:
-	.loc 1 410 0
-	ldr	w0, [x19, 672]
-	cbnz	w0, .L801
-	.loc 1 414 0
+.LVL883:
+.LBE1587:
+.LBE1586:
+	.loc 1 409 0
+	ldr	w0, [x19, 656]
+	cbnz	w0, .L803
+	.loc 1 413 0
 	ldr	x0, [x19]
-	adrp	x1, .LC31
-	add	x1, x1, :lo12:.LC31
+	adrp	x1, .LC30
+	add	x1, x1, :lo12:.LC30
 	bl	_dev_info
-.LVL887:
-	.loc 1 418 0
+.LVL884:
+	.loc 1 417 0
 	ldp	x19, x20, [sp, 16]
-.LVL888:
+.LVL885:
 	ldp	x29, x30, [sp], 32
 	.cfi_remember_state
 	.cfi_restore 30
@@ -8200,30 +8326,30 @@
 	.cfi_restore 20
 	.cfi_def_cfa 31, 0
 	ret
-.LVL889:
+.LVL886:
 	.p2align 3
-.L801:
+.L803:
 	.cfi_restore_state
-	.loc 1 411 0
-	str	wzr, [x19, 672]
-.LBB1526:
-.LBB1527:
+	.loc 1 410 0
+	str	wzr, [x19, 656]
+.LBB1588:
+.LBB1589:
 	.file 11 "./include/linux/wakelock.h"
 	.loc 11 68 0
-	add	x0, x19, 464
+	add	x0, x19, 448
 	bl	__pm_relax
-.LVL890:
-.LBE1527:
-.LBE1526:
-	.loc 1 414 0
+.LVL887:
+.LBE1589:
+.LBE1588:
+	.loc 1 413 0
 	ldr	x0, [x19]
-	adrp	x1, .LC31
-	add	x1, x1, :lo12:.LC31
+	adrp	x1, .LC30
+	add	x1, x1, :lo12:.LC30
 	bl	_dev_info
-.LVL891:
-	.loc 1 418 0
+.LVL888:
+	.loc 1 417 0
 	ldp	x19, x20, [sp, 16]
-.LVL892:
+.LVL889:
 	ldp	x29, x30, [sp], 32
 	.cfi_restore 20
 	.cfi_restore 19
@@ -8239,9 +8365,9 @@
 	.type	ebc_suspend, %function
 ebc_suspend:
 .LFB2871:
-	.loc 1 3724 0
+	.loc 1 3736 0
 	.cfi_startproc
-.LVL893:
+.LVL890:
 	stp	x29, x30, [sp, -32]!
 	.cfi_def_cfa_offset 32
 	.cfi_offset 29, -32
@@ -8251,40 +8377,40 @@
 	stp	x19, x20, [sp, 16]
 	.cfi_offset 19, -16
 	.cfi_offset 20, -8
-.LBB1528:
-.LBB1529:
+.LBB1590:
+.LBB1591:
 	.loc 2 1181 0
 	ldr	x20, [x0, 184]
-.LBE1529:
-.LBE1528:
-	.loc 1 3728 0
+.LBE1591:
+.LBE1590:
+	.loc 1 3740 0
 	add	x19, x20, 192
-	ldr	w0, [x19, 208]
-.LVL894:
+	ldr	w0, [x19, 200]
+.LVL891:
 	cmp	w0, 1
-	beq	.L805
-.L803:
-	.loc 1 3732 0
+	beq	.L807
+.L805:
+	.loc 1 3744 0
 	mov	w0, 1
-	str	w0, [x19, 604]
-	.loc 1 3734 0
+	str	w0, [x19, 588]
+	.loc 1 3746 0
 	ldr	x1, [x20, 16]
-.LBB1530:
-.LBB1531:
+.LBB1592:
+.LBB1593:
 	.loc 3 40 0
 	mov	x0, x1
 	ldr	x1, [x1, 40]
 	blr	x1
-.LVL895:
-.LBE1531:
-.LBE1530:
-	.loc 1 3735 0
+.LVL892:
+.LBE1593:
+.LBE1592:
+	.loc 1 3747 0
 	ldr	x0, [x19, 104]
-	adrp	x1, .LC33
-	add	x1, x1, :lo12:.LC33
+	adrp	x1, .LC32
+	add	x1, x1, :lo12:.LC32
 	bl	_dev_info
-.LVL896:
-	.loc 1 3738 0
+.LVL893:
+	.loc 1 3750 0
 	mov	w0, 0
 	ldp	x19, x20, [sp, 16]
 	ldp	x29, x30, [sp], 32
@@ -8296,25 +8422,25 @@
 	.cfi_def_cfa 31, 0
 	ret
 	.p2align 3
-.L805:
+.L807:
 	.cfi_restore_state
-	.loc 1 3729 0
+	.loc 1 3741 0
 	ldr	x0, [x19, 104]
 	adrp	x2, .LANCHOR3
 	add	x2, x2, :lo12:.LANCHOR3
-	adrp	x1, .LC32
-	add	x1, x1, :lo12:.LC32
+	adrp	x1, .LC31
+	add	x1, x1, :lo12:.LC31
 	bl	_dev_info
-.LVL897:
-.LBB1532:
-.LBB1533:
+.LVL894:
+.LBB1594:
+.LBB1595:
 	mov	w1, 0
 	mov	x0, x20
 	bl	ebc_power_set.part.7
-.LVL898:
-	b	.L803
-.LBE1533:
-.LBE1532:
+.LVL895:
+	b	.L805
+.LBE1595:
+.LBE1594:
 	.cfi_endproc
 .LFE2871:
 	.size	ebc_suspend, .-ebc_suspend
@@ -8323,42 +8449,42 @@
 	.type	direct_mode_data_change_part2.isra.8, %function
 direct_mode_data_change_part2.isra.8:
 .LFB2883:
-	.loc 1 1527 0
+	.loc 1 1526 0
 	.cfi_startproc
-.LVL899:
+.LVL896:
 	stp	x29, x30, [sp, -80]!
 	.cfi_def_cfa_offset 80
 	.cfi_offset 29, -80
 	.cfi_offset 30, -72
-	.loc 1 1529 0
+	.loc 1 1528 0
 	adrp	x7, .LANCHOR0
-	.loc 1 1527 0
+	.loc 1 1526 0
 	and	w3, w3, 255
-	.loc 1 1541 0
+	.loc 1 1540 0
 	cmp	w6, 2
-	.loc 1 1533 0
+	.loc 1 1532 0
 	sub	w3, w3, w4
-.LVL900:
-	.loc 1 1527 0
+.LVL897:
+	.loc 1 1526 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 1529 0
+	.loc 1 1528 0
 	ldr	x4, [x7, #:lo12:.LANCHOR0]
-	.loc 1 1527 0
+	.loc 1 1526 0
 	stp	x19, x20, [sp, 16]
-	.loc 1 1534 0
+	.loc 1 1533 0
 	lsl	w3, w3, 10
-.LVL901:
-	.loc 1 1527 0
+.LVL898:
+	.loc 1 1526 0
 	stp	x21, x22, [sp, 32]
 	.cfi_offset 19, -64
 	.cfi_offset 20, -56
 	.cfi_offset 21, -48
 	.cfi_offset 22, -40
-	.loc 1 1534 0
+	.loc 1 1533 0
 	add	x19, x5, x3, sxtw
-.LVL902:
-	.loc 1 1527 0
+.LVL899:
+	.loc 1 1526 0
 	stp	x23, x24, [sp, 48]
 	mov	x22, x0
 	stp	x25, x26, [sp, 64]
@@ -8366,543 +8492,543 @@
 	.cfi_offset 24, -24
 	.cfi_offset 25, -16
 	.cfi_offset 26, -8
-	.loc 1 1527 0
+	.loc 1 1526 0
 	mov	x24, x1
 	mov	x25, x2
-	.loc 1 1539 0
-	ldp	w9, w23, [x4, 108]
 	.loc 1 1538 0
+	ldp	w9, w23, [x4, 108]
+	.loc 1 1537 0
 	lsr	w20, w9, 3
-	.loc 1 1541 0
-	beq	.L871
-	.loc 1 1544 0
+	.loc 1 1540 0
+	beq	.L873
+	.loc 1 1543 0
 	cmp	w6, 3
-	beq	.L809
+	beq	.L811
 	lsr	w26, w9, 2
 	mov	x0, 0
-	.loc 1 1549 0
+	.loc 1 1548 0
 	mov	w21, 0
-.LVL903:
-.L808:
-	.loc 1 1553 0
+.LVL900:
+.L810:
+	.loc 1 1552 0
 	sub	w2, w23, w21
 	add	x0, x22, x0
 	mov	w1, 0
 	mul	w2, w2, w26
 	sxtw	x2, w2
 	bl	memset
-.LVL904:
-	.loc 1 1554 0
+.LVL901:
+	.loc 1 1553 0
 	cmp	w21, w23
-	bge	.L806
+	bge	.L808
 	sub	w7, w20, #1
 	mul	w8, w21, w26
 	add	x7, x7, 1
 	lsl	w9, w26, 1
 	lsl	x7, x7, 2
-.LBB1534:
-.LBB1535:
-	.loc 1 339 0
+.LBB1596:
+.LBB1597:
+	.loc 1 338 0
 	mov	w6, 3
-.LBE1535:
-.LBE1534:
-.LBB1568:
-.LBB1569:
-	.loc 1 369 0
+.LBE1597:
+.LBE1596:
+.LBB1630:
+.LBB1631:
+	.loc 1 368 0
 	mov	w5, 12
-.LVL905:
+.LVL902:
 	.p2align 2
-.L832:
-.LBE1569:
-.LBE1568:
-	.loc 1 1555 0
+.L834:
+.LBE1631:
+.LBE1630:
+	.loc 1 1554 0
 	add	x4, x22, x8, sxtw
-	.loc 1 1556 0
-	cbz	w20, .L811
+	.loc 1 1555 0
+	cbz	w20, .L813
 	mov	x10, 0
-.LVL906:
+.LVL903:
 	.p2align 2
-.L821:
-	.loc 1 1558 0
-	ldr	w0, [x25, x10, lsl 2]
+.L823:
 	.loc 1 1557 0
+	ldr	w0, [x25, x10, lsl 2]
+	.loc 1 1556 0
 	ldr	w1, [x24, x10, lsl 2]
-.LBB1605:
-.LBB1566:
-.LBB1536:
-.LBB1537:
-	.loc 1 280 0
+.LBB1667:
+.LBB1628:
+.LBB1598:
+.LBB1599:
+	.loc 1 279 0
 	lsr	w17, w0, 3
-	.loc 1 282 0
-	lsr	w16, w0, 11
-	.loc 1 284 0
-	lsr	w2, w0, 19
-	.loc 1 280 0
-	ubfx	x12, x1, 8, 4
-	.loc 1 282 0
-	ubfx	x11, x1, 16, 4
-	.loc 1 284 0
-	and	w2, w2, 480
-	.loc 1 279 0
-	lsl	w15, w0, 1
-	.loc 1 280 0
-	and	w17, w17, 480
 	.loc 1 281 0
-	lsr	w14, w0, 7
-	.loc 1 282 0
-	and	w16, w16, 480
-	.loc 1 284 0
-	ubfx	x13, x1, 24, 4
+	lsr	w16, w0, 11
+	.loc 1 283 0
+	lsr	w2, w0, 19
 	.loc 1 279 0
+	ubfx	x12, x1, 8, 4
+	.loc 1 281 0
+	ubfx	x11, x1, 16, 4
+	.loc 1 283 0
+	and	w2, w2, 480
+	.loc 1 278 0
+	lsl	w15, w0, 1
+	.loc 1 279 0
+	and	w17, w17, 480
+	.loc 1 280 0
+	lsr	w14, w0, 7
+	.loc 1 281 0
+	and	w16, w16, 480
+	.loc 1 283 0
+	ubfx	x13, x1, 24, 4
+	.loc 1 278 0
 	ubfx	x30, x1, 4, 4
 	and	w15, w15, 480
-	.loc 1 280 0
+	.loc 1 279 0
 	orr	w17, w17, w12
-	.loc 1 281 0
+	.loc 1 280 0
 	and	w14, w14, 480
 	ubfx	x12, x1, 12, 4
-	.loc 1 282 0
-	orr	w16, w16, w11
-	.loc 1 284 0
-	orr	w13, w2, w13
-	.loc 1 283 0
-	lsr	w11, w0, 15
-	.loc 1 285 0
-	lsr	w2, w0, 23
-	.loc 1 283 0
-	and	w11, w11, 480
-	.loc 1 278 0
-	and	w18, w1, 15
-	.loc 1 279 0
-	orr	w15, w15, w30
 	.loc 1 281 0
-	orr	w14, w14, w12
-	.loc 1 285 0
-	and	w2, w2, 480
+	orr	w16, w16, w11
 	.loc 1 283 0
-	ubfx	x12, x1, 20, 4
+	orr	w13, w2, w13
+	.loc 1 282 0
+	lsr	w11, w0, 15
+	.loc 1 284 0
+	lsr	w2, w0, 23
+	.loc 1 282 0
+	and	w11, w11, 480
+	.loc 1 277 0
+	and	w18, w1, 15
 	.loc 1 278 0
-	ubfiz	w30, w0, 5, 4
-	.loc 1 283 0
-	orr	w12, w11, w12
-.LBE1537:
-.LBE1536:
-	.loc 1 333 0
-	eor	w3, w1, w0
-.LVL907:
-.LBB1552:
-.LBB1538:
-	.loc 1 285 0
-	add	w11, w2, w1, lsr 28
-	.loc 1 278 0
-	orr	w18, w30, w18
-.LBE1538:
-.LBE1552:
-.LBE1566:
-.LBE1605:
-	.loc 1 1559 0
-	cmp	w1, w0
-	beq	.L812
-.LBB1606:
-.LBB1567:
-	.loc 1 339 0
-	ands	w0, w3, 15
-.LBB1553:
-.LBB1539:
+	orr	w15, w15, w30
 	.loc 1 280 0
+	orr	w14, w14, w12
+	.loc 1 284 0
+	and	w2, w2, 480
+	.loc 1 282 0
+	ubfx	x12, x1, 20, 4
+	.loc 1 277 0
+	ubfiz	w30, w0, 5, 4
+	.loc 1 282 0
+	orr	w12, w11, w12
+.LBE1599:
+.LBE1598:
+	.loc 1 332 0
+	eor	w3, w1, w0
+.LVL904:
+.LBB1614:
+.LBB1600:
+	.loc 1 284 0
+	add	w11, w2, w1, lsr 28
+	.loc 1 277 0
+	orr	w18, w30, w18
+.LBE1600:
+.LBE1614:
+.LBE1628:
+.LBE1667:
+	.loc 1 1558 0
+	cmp	w1, w0
+	beq	.L814
+.LBB1668:
+.LBB1629:
+	.loc 1 338 0
+	ands	w0, w3, 15
+.LBB1615:
+.LBB1601:
+	.loc 1 279 0
 	ldrb	w17, [x19, w17, uxtw]
-.LBE1539:
-.LBE1553:
-	.loc 1 339 0
+.LBE1601:
+.LBE1615:
+	.loc 1 338 0
 	csel	w0, w0, w6, eq
-	.loc 1 341 0
+	.loc 1 340 0
 	tst	w3, 240
 	orr	w1, w0, 48
-.LBB1554:
-.LBB1540:
-	.loc 1 282 0
+.LBB1616:
+.LBB1602:
+	.loc 1 281 0
 	ldrb	w30, [x19, w16, uxtw]
-.LBE1540:
-.LBE1554:
-	.loc 1 341 0
+.LBE1602:
+.LBE1616:
+	.loc 1 340 0
 	csel	w0, w1, w0, ne
-	.loc 1 343 0
+	.loc 1 342 0
 	tst	w3, 3840
 	orr	w1, w0, 768
-.LBB1555:
-.LBB1541:
-	.loc 1 279 0
+.LBB1617:
+.LBB1603:
+	.loc 1 278 0
 	ldrb	w2, [x19, w15, uxtw]
-.LBE1541:
-.LBE1555:
-	.loc 1 343 0
+.LBE1603:
+.LBE1617:
+	.loc 1 342 0
 	csel	w0, w1, w0, ne
-	.loc 1 345 0
+	.loc 1 344 0
 	tst	w3, 61440
 	orr	w1, w0, 12288
-.LBB1556:
-.LBB1542:
-	.loc 1 281 0
+.LBB1618:
+.LBB1604:
+	.loc 1 280 0
 	ldrb	w14, [x19, w14, uxtw]
-.LBE1542:
-.LBE1556:
-	.loc 1 345 0
+.LBE1604:
+.LBE1618:
+	.loc 1 344 0
 	csel	w0, w1, w0, ne
-	.loc 1 347 0
+	.loc 1 346 0
 	tst	w3, 983040
 	orr	w1, w0, 196608
-.LBB1557:
-.LBB1543:
-	.loc 1 284 0
-	ldrb	w13, [x19, w13, uxtw]
-.LBE1543:
-.LBE1557:
-	.loc 1 347 0
-	csel	w0, w1, w0, ne
-.LBB1558:
-.LBB1544:
+.LBB1619:
+.LBB1605:
 	.loc 1 283 0
+	ldrb	w13, [x19, w13, uxtw]
+.LBE1605:
+.LBE1619:
+	.loc 1 346 0
+	csel	w0, w1, w0, ne
+.LBB1620:
+.LBB1606:
+	.loc 1 282 0
 	ldrb	w12, [x19, w12, uxtw]
-.LBE1544:
-.LBE1558:
-	.loc 1 349 0
+.LBE1606:
+.LBE1620:
+	.loc 1 348 0
 	tst	w3, 15728640
 	orr	w1, w0, 3145728
 	csel	w0, w1, w0, ne
-.LBB1559:
-.LBB1545:
-	.loc 1 285 0
-	ldrb	w11, [x19, w11, uxtw]
-	.loc 1 278 0
-	ldrb	w16, [x19, w18, uxtw]
-	.loc 1 280 0
-	lsl	w1, w17, 8
-	.loc 1 282 0
-	lsl	w15, w30, 16
-.LBE1545:
-.LBE1559:
-	.loc 1 351 0
-	tst	w3, 251658240
-.LBB1560:
-.LBB1546:
-	.loc 1 285 0
-	orr	w1, w1, w2, lsl 4
-.LBE1546:
-.LBE1560:
-	.loc 1 351 0
-	orr	w17, w0, 50331648
-.LBB1561:
-.LBB1547:
-	.loc 1 285 0
-	orr	w14, w15, w14, lsl 12
+.LBB1621:
+.LBB1607:
 	.loc 1 284 0
+	ldrb	w11, [x19, w11, uxtw]
+	.loc 1 277 0
+	ldrb	w16, [x19, w18, uxtw]
+	.loc 1 279 0
+	lsl	w1, w17, 8
+	.loc 1 281 0
+	lsl	w15, w30, 16
+.LBE1607:
+.LBE1621:
+	.loc 1 350 0
+	tst	w3, 251658240
+.LBB1622:
+.LBB1608:
+	.loc 1 284 0
+	orr	w1, w1, w2, lsl 4
+.LBE1608:
+.LBE1622:
+	.loc 1 350 0
+	orr	w17, w0, 50331648
+.LBB1623:
+.LBB1609:
+	.loc 1 284 0
+	orr	w14, w15, w14, lsl 12
+	.loc 1 283 0
 	lsl	w13, w13, 24
-.LBE1547:
-.LBE1561:
-	.loc 1 351 0
+.LBE1609:
+.LBE1623:
+	.loc 1 350 0
 	csel	w0, w17, w0, ne
-.LBB1562:
-.LBB1548:
-	.loc 1 285 0
+.LBB1624:
+.LBB1610:
+	.loc 1 284 0
 	orr	w1, w1, w14
 	orr	w12, w13, w12, lsl 20
-.LBE1548:
-.LBE1562:
-	.loc 1 353 0
+.LBE1610:
+.LBE1624:
+	.loc 1 352 0
 	tst	w3, -268435456
-.LBB1563:
-.LBB1549:
-	.loc 1 285 0
+.LBB1625:
+.LBB1611:
+	.loc 1 284 0
 	orr	w1, w1, w12
-.LBE1549:
-.LBE1563:
-	.loc 1 353 0
+.LBE1611:
+.LBE1625:
+	.loc 1 352 0
 	orr	w3, w0, 805306368
-.LVL908:
-.LBB1564:
-.LBB1550:
-	.loc 1 285 0
+.LVL905:
+.LBB1626:
+.LBB1612:
+	.loc 1 284 0
 	orr	w2, w16, w11, lsl 28
-.LBE1550:
-.LBE1564:
-	.loc 1 353 0
+.LBE1612:
+.LBE1626:
+	.loc 1 352 0
 	csel	w0, w3, w0, ne
-.LBB1565:
-.LBB1551:
-	.loc 1 285 0
+.LBB1627:
+.LBB1613:
+	.loc 1 284 0
 	orr	w1, w1, w2
-.LBE1551:
-.LBE1565:
-	.loc 1 355 0
+.LBE1613:
+.LBE1627:
+	.loc 1 354 0
 	and	w0, w1, w0
-.LBE1567:
-.LBE1606:
-	.loc 1 1560 0
+.LBE1629:
+.LBE1668:
+	.loc 1 1559 0
 	str	w0, [x4, x10, lsl 2]
-.LVL909:
-.L812:
+.LVL906:
+.L814:
 	add	x10, x10, 1
-	.loc 1 1556 0
+	.loc 1 1555 0
 	cmp	w20, w10
-	bgt	.L821
+	bgt	.L823
 	add	x24, x24, x7
-.LVL910:
+.LVL907:
 	add	x25, x25, x7
-.LVL911:
+.LVL908:
 	mov	x10, 0
-.LVL912:
+.LVL909:
 	.p2align 2
-.L831:
-	.loc 1 1565 0
-	ldr	w0, [x25, x10, lsl 2]
+.L833:
 	.loc 1 1564 0
+	ldr	w0, [x25, x10, lsl 2]
+	.loc 1 1563 0
 	ldr	w1, [x24, x10, lsl 2]
-.LBB1607:
-.LBB1602:
-.LBB1570:
-.LBB1571:
-	.loc 1 293 0
+.LBB1669:
+.LBB1664:
+.LBB1632:
+.LBB1633:
+	.loc 1 292 0
 	lsr	w16, w0, 7
-	.loc 1 290 0
+	.loc 1 289 0
 	and	w2, w1, 15
-	.loc 1 293 0
+	.loc 1 292 0
 	ubfx	x11, x1, 12, 4
 	and	w16, w16, 480
-	.loc 1 291 0
+	.loc 1 290 0
 	lsl	w14, w0, 1
-	.loc 1 290 0
+	.loc 1 289 0
 	ubfiz	w17, w0, 5, 4
-	.loc 1 295 0
-	lsr	w13, w0, 15
-	.loc 1 291 0
-	ubfx	x18, x1, 4, 4
-	.loc 1 293 0
-	orr	w16, w16, w11
-	.loc 1 291 0
-	and	w14, w14, 480
-	.loc 1 290 0
-	orr	w17, w17, w2
 	.loc 1 294 0
+	lsr	w13, w0, 15
+	.loc 1 290 0
+	ubfx	x18, x1, 4, 4
+	.loc 1 292 0
+	orr	w16, w16, w11
+	.loc 1 290 0
+	and	w14, w14, 480
+	.loc 1 289 0
+	orr	w17, w17, w2
+	.loc 1 293 0
 	lsr	w11, w0, 11
-	.loc 1 295 0
+	.loc 1 294 0
 	ubfx	x2, x1, 20, 4
 	and	w13, w13, 480
-	.loc 1 294 0
+	.loc 1 293 0
 	and	w11, w11, 480
-	.loc 1 292 0
-	lsr	w15, w0, 3
-	.loc 1 297 0
-	lsr	w12, w0, 23
 	.loc 1 291 0
-	orr	w14, w14, w18
-	.loc 1 295 0
-	orr	w13, w13, w2
-	.loc 1 294 0
-	ubfx	x18, x1, 16, 4
+	lsr	w15, w0, 3
 	.loc 1 296 0
+	lsr	w12, w0, 23
+	.loc 1 290 0
+	orr	w14, w14, w18
+	.loc 1 294 0
+	orr	w13, w13, w2
+	.loc 1 293 0
+	ubfx	x18, x1, 16, 4
+	.loc 1 295 0
 	lsr	w2, w0, 19
-	.loc 1 292 0
+	.loc 1 291 0
 	and	w15, w15, 480
 	ubfx	x30, x1, 8, 4
-	.loc 1 297 0
-	and	w12, w12, 480
-	.loc 1 294 0
-	orr	w18, w11, w18
 	.loc 1 296 0
+	and	w12, w12, 480
+	.loc 1 293 0
+	orr	w18, w11, w18
+	.loc 1 295 0
 	and	w2, w2, 480
 	ubfx	x11, x1, 24, 4
-.LBE1571:
-.LBE1570:
-	.loc 1 363 0
+.LBE1633:
+.LBE1632:
+	.loc 1 362 0
 	eor	w3, w1, w0
-.LVL913:
-.LBB1587:
-.LBB1572:
-	.loc 1 292 0
+.LVL910:
+.LBB1649:
+.LBB1634:
+	.loc 1 291 0
 	orr	w15, w15, w30
-	.loc 1 297 0
-	add	w12, w12, w1, lsr 28
 	.loc 1 296 0
+	add	w12, w12, w1, lsr 28
+	.loc 1 295 0
 	orr	w11, w2, w11
-.LBE1572:
-.LBE1587:
-.LBE1602:
-.LBE1607:
-	.loc 1 1566 0
+.LBE1634:
+.LBE1649:
+.LBE1664:
+.LBE1669:
+	.loc 1 1565 0
 	cmp	w1, w0
-	beq	.L822
-.LBB1608:
-.LBB1603:
-	.loc 1 369 0
+	beq	.L824
+.LBB1670:
+.LBB1665:
+	.loc 1 368 0
 	ands	w0, w3, 15
-.LBB1588:
-.LBB1573:
-	.loc 1 293 0
+.LBB1650:
+.LBB1635:
+	.loc 1 292 0
 	ldrb	w30, [x19, w16, uxtw]
-.LBE1573:
-.LBE1588:
-	.loc 1 369 0
+.LBE1635:
+.LBE1650:
+	.loc 1 368 0
 	csel	w0, w0, w5, eq
-	.loc 1 371 0
+	.loc 1 370 0
 	tst	w3, 240
 	orr	w1, w0, 192
-.LBB1589:
-.LBB1574:
-	.loc 1 290 0
+.LBB1651:
+.LBB1636:
+	.loc 1 289 0
 	ldrb	w16, [x19, w17, uxtw]
-.LBE1574:
-.LBE1589:
-	.loc 1 371 0
+.LBE1636:
+.LBE1651:
+	.loc 1 370 0
 	csel	w0, w1, w0, ne
-	.loc 1 373 0
+	.loc 1 372 0
 	tst	w3, 3840
 	orr	w1, w0, 3072
-.LBB1590:
-.LBB1575:
-	.loc 1 292 0
+.LBB1652:
+.LBB1637:
+	.loc 1 291 0
 	ldrb	w2, [x19, w15, uxtw]
-.LBE1575:
-.LBE1590:
-	.loc 1 373 0
+.LBE1637:
+.LBE1652:
+	.loc 1 372 0
 	csel	w0, w1, w0, ne
-	.loc 1 375 0
+	.loc 1 374 0
 	tst	w3, 61440
 	orr	w1, w0, 49152
-.LBB1591:
-.LBB1576:
-	.loc 1 291 0
+.LBB1653:
+.LBB1638:
+	.loc 1 290 0
 	ldrb	w15, [x19, w14, uxtw]
-.LBE1576:
-.LBE1591:
-	.loc 1 375 0
+.LBE1638:
+.LBE1653:
+	.loc 1 374 0
 	csel	w0, w1, w0, ne
-	.loc 1 377 0
+	.loc 1 376 0
 	tst	w3, 983040
 	orr	w1, w0, 786432
-.LBB1592:
-.LBB1577:
-	.loc 1 295 0
-	ldrb	w14, [x19, w13, uxtw]
-.LBE1577:
-.LBE1592:
-	.loc 1 377 0
-	csel	w0, w1, w0, ne
-.LBB1593:
-.LBB1578:
-	.loc 1 297 0
-	ldrb	w12, [x19, w12, uxtw]
-.LBE1578:
-.LBE1593:
-	.loc 1 379 0
-	tst	w3, 15728640
-.LBB1594:
-.LBB1579:
+.LBB1654:
+.LBB1639:
 	.loc 1 294 0
-	ldrb	w13, [x19, w18, uxtw]
-.LBE1579:
-.LBE1594:
-	.loc 1 379 0
-	orr	w1, w0, 12582912
-.LBB1595:
-.LBB1580:
-	.loc 1 296 0
-	ldrb	w11, [x19, w11, uxtw]
-.LBE1580:
-.LBE1595:
-	.loc 1 379 0
+	ldrb	w14, [x19, w13, uxtw]
+.LBE1639:
+.LBE1654:
+	.loc 1 376 0
 	csel	w0, w1, w0, ne
-.LBB1596:
-.LBB1581:
-	.loc 1 290 0
-	lsl	w16, w16, 2
+.LBB1655:
+.LBB1640:
+	.loc 1 296 0
+	ldrb	w12, [x19, w12, uxtw]
+.LBE1640:
+.LBE1655:
+	.loc 1 378 0
+	tst	w3, 15728640
+.LBB1656:
+.LBB1641:
 	.loc 1 293 0
-	lsl	w1, w30, 14
-.LBE1581:
-.LBE1596:
-	.loc 1 381 0
-	tst	w3, 251658240
-.LBB1597:
-.LBB1582:
-	.loc 1 297 0
-	orr	w1, w1, w2, lsl 10
-.LBE1582:
-.LBE1597:
-	.loc 1 381 0
-	orr	w17, w0, 201326592
-.LBB1598:
-.LBB1583:
+	ldrb	w13, [x19, w18, uxtw]
+.LBE1641:
+.LBE1656:
+	.loc 1 378 0
+	orr	w1, w0, 12582912
+.LBB1657:
+.LBB1642:
 	.loc 1 295 0
+	ldrb	w11, [x19, w11, uxtw]
+.LBE1642:
+.LBE1657:
+	.loc 1 378 0
+	csel	w0, w1, w0, ne
+.LBB1658:
+.LBB1643:
+	.loc 1 289 0
+	lsl	w16, w16, 2
+	.loc 1 292 0
+	lsl	w1, w30, 14
+.LBE1643:
+.LBE1658:
+	.loc 1 380 0
+	tst	w3, 251658240
+.LBB1659:
+.LBB1644:
+	.loc 1 296 0
+	orr	w1, w1, w2, lsl 10
+.LBE1644:
+.LBE1659:
+	.loc 1 380 0
+	orr	w17, w0, 201326592
+.LBB1660:
+.LBB1645:
+	.loc 1 294 0
 	lsl	w2, w14, 22
-	.loc 1 297 0
+	.loc 1 296 0
 	orr	w15, w16, w15, lsl 6
-.LBE1583:
-.LBE1598:
-	.loc 1 381 0
+.LBE1645:
+.LBE1660:
+	.loc 1 380 0
 	csel	w0, w17, w0, ne
-.LBB1599:
-.LBB1584:
-	.loc 1 297 0
+.LBB1661:
+.LBB1646:
+	.loc 1 296 0
 	orr	w13, w2, w13, lsl 18
 	orr	w1, w1, w15
 	lsl	w2, w12, 30
-.LBE1584:
-.LBE1599:
-	.loc 1 383 0
+.LBE1646:
+.LBE1661:
+	.loc 1 382 0
 	tst	w3, -268435456
 	orr	w12, w0, -1073741824
-.LBB1600:
-.LBB1585:
-	.loc 1 297 0
+.LBB1662:
+.LBB1647:
+	.loc 1 296 0
 	orr	w3, w2, w11, lsl 26
-.LVL914:
+.LVL911:
 	orr	w1, w1, w13
-.LBE1585:
-.LBE1600:
-.LBE1603:
-.LBE1608:
-	.loc 1 1567 0
+.LBE1647:
+.LBE1662:
+.LBE1665:
+.LBE1670:
+	.loc 1 1566 0
 	ldr	w2, [x4, x10, lsl 2]
-.LBB1609:
-.LBB1604:
-	.loc 1 383 0
+.LBB1671:
+.LBB1666:
+	.loc 1 382 0
 	csel	w0, w12, w0, ne
-.LBB1601:
-.LBB1586:
-	.loc 1 297 0
+.LBB1663:
+.LBB1648:
+	.loc 1 296 0
 	orr	w1, w1, w3
-.LBE1586:
-.LBE1601:
-	.loc 1 385 0
+.LBE1648:
+.LBE1663:
+	.loc 1 384 0
 	and	w0, w1, w0
-.LBE1604:
-.LBE1609:
-	.loc 1 1567 0
+.LBE1666:
+.LBE1671:
+	.loc 1 1566 0
 	orr	w0, w2, w0
 	str	w0, [x4, x10, lsl 2]
-.LVL915:
-.L822:
+.LVL912:
+.L824:
 	add	x10, x10, 1
-	.loc 1 1563 0
+	.loc 1 1562 0
 	cmp	w20, w10
-	bgt	.L831
+	bgt	.L833
 	add	x24, x24, x7
 	add	x25, x25, x7
-.L811:
-	.loc 1 1554 0
+.L813:
+	.loc 1 1553 0
 	add	w21, w21, 2
 	add	w8, w8, w9
 	cmp	w23, w21
-	bgt	.L832
-.L806:
-	.loc 1 1571 0
+	bgt	.L834
+.L808:
+	.loc 1 1570 0
 	ldp	x19, x20, [sp, 16]
-.LVL916:
+.LVL913:
 	ldp	x21, x22, [sp, 32]
-.LVL917:
+.LVL914:
 	ldp	x23, x24, [sp, 48]
-.LVL918:
+.LVL915:
 	ldp	x25, x26, [sp, 64]
-.LVL919:
+.LVL916:
 	ldp	x29, x30, [sp], 80
 	.cfi_remember_state
 	.cfi_restore 30
@@ -8917,36 +9043,36 @@
 	.cfi_restore 20
 	.cfi_def_cfa 31, 0
 	ret
-.LVL920:
-.L871:
+.LVL917:
+.L873:
 	.cfi_restore_state
-	.loc 1 1543 0
+	.loc 1 1542 0
 	add	w23, w23, w23, lsr 31
-.LVL921:
+.LVL918:
 	lsr	w26, w9, 2
 	asr	w23, w23, 1
-.LVL922:
+.LVL919:
 	mov	x0, 0
-	.loc 1 1542 0
+	.loc 1 1541 0
 	mov	w21, 0
-.LVL923:
-	b	.L808
-.LVL924:
-.L809:
-	.loc 1 1545 0
+.LVL920:
+	b	.L810
+.LVL921:
+.L811:
+	.loc 1 1544 0
 	add	w21, w23, w23, lsr 31
 	lsr	w26, w9, 2
 	asr	w21, w21, 1
-.LVL925:
-	.loc 1 1546 0
+.LVL922:
+	.loc 1 1545 0
 	mul	w1, w20, w21
 	mul	w0, w21, w26
 	sbfiz	x1, x1, 2, 32
 	sxtw	x0, w0
 	add	x24, x24, x1
-	.loc 1 1547 0
+	.loc 1 1546 0
 	add	x25, x2, x1
-	b	.L808
+	b	.L810
 	.cfi_endproc
 .LFE2883:
 	.size	direct_mode_data_change_part2.isra.8, .-direct_mode_data_change_part2.isra.8
@@ -8955,37 +9081,37 @@
 	.type	direct_mode_data_change_part.isra.9, %function
 direct_mode_data_change_part.isra.9:
 .LFB2884:
-	.loc 1 1439 0
+	.loc 1 1438 0
 	.cfi_startproc
-.LVL926:
+.LVL923:
 	stp	x29, x30, [sp, -96]!
 	.cfi_def_cfa_offset 96
 	.cfi_offset 29, -96
 	.cfi_offset 30, -88
-	.loc 1 1441 0
+	.loc 1 1440 0
 	adrp	x7, .LANCHOR0
-	.loc 1 1439 0
+	.loc 1 1438 0
 	and	w3, w3, 255
-	.loc 1 1452 0
+	.loc 1 1451 0
 	cmp	w6, 2
-	.loc 1 1445 0
+	.loc 1 1444 0
 	sub	w4, w3, w4
-.LVL927:
-	.loc 1 1439 0
+.LVL924:
+	.loc 1 1438 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 1441 0
+	.loc 1 1440 0
 	ldr	x3, [x7, #:lo12:.LANCHOR0]
-	.loc 1 1439 0
+	.loc 1 1438 0
 	stp	x23, x24, [sp, 48]
-	.loc 1 1446 0
+	.loc 1 1445 0
 	lsl	w4, w4, 10
-.LVL928:
+.LVL925:
 	.cfi_offset 23, -48
 	.cfi_offset 24, -40
-	.loc 1 1449 0
+	.loc 1 1448 0
 	add	x23, x3, 24
-	.loc 1 1439 0
+	.loc 1 1438 0
 	stp	x19, x20, [sp, 16]
 	stp	x21, x22, [sp, 32]
 	.cfi_offset 19, -80
@@ -8999,36 +9125,36 @@
 	stp	x25, x26, [sp, 64]
 	.cfi_offset 25, -32
 	.cfi_offset 26, -24
-	.loc 1 1439 0
+	.loc 1 1438 0
 	mov	x21, x2
-	.loc 1 1446 0
+	.loc 1 1445 0
 	add	x19, x5, x4, sxtw
-.LVL929:
-	.loc 1 1450 0
-	ldp	w10, w0, [x23, 84]
-.LVL930:
+.LVL926:
 	.loc 1 1449 0
+	ldp	w10, w0, [x23, 84]
+.LVL927:
+	.loc 1 1448 0
 	lsr	w22, w10, 3
-	.loc 1 1452 0
-	beq	.L910
+	.loc 1 1451 0
+	beq	.L912
 	mov	w25, w0
-.LVL931:
-	.loc 1 1455 0
+.LVL928:
+	.loc 1 1454 0
 	cmp	w6, 3
-	.loc 1 1460 0
+	.loc 1 1459 0
 	mov	w24, 0
-.LVL932:
-	.loc 1 1455 0
-	beq	.L911
-.L874:
-	.loc 1 1464 0
-	ldr	w1, [x23, 156]
+.LVL929:
+	.loc 1 1454 0
+	beq	.L913
+.L876:
 	.loc 1 1463 0
+	ldr	w1, [x23, 156]
+	.loc 1 1462 0
 	lsr	w26, w10, 2
-.LVL933:
+.LVL930:
+	.loc 1 1463 0
+	cbz	w1, .L877
 	.loc 1 1464 0
-	cbz	w1, .L875
-	.loc 1 1465 0
 	sub	w2, w25, w24
 	sub	w0, w0, w25
 	mov	w1, 0
@@ -9037,303 +9163,303 @@
 	sxtw	x2, w2
 	add	x0, x27, x0
 	bl	memset
-.LVL934:
-	.loc 1 1466 0
+.LVL931:
+	.loc 1 1465 0
 	ldr	w0, [x23, 88]
 	sub	w0, w0, #1
 	sub	w0, w0, w24
 	mul	w0, w0, w26
 	neg	w26, w26
 	add	x27, x27, x0
-.L878:
-	.loc 1 1473 0
+.L880:
+	.loc 1 1472 0
 	cmp	w25, w24
-	ble	.L872
+	ble	.L874
 	sub	w9, w22, #1
 	sxtw	x10, w26
 	add	x9, x9, 1
-.LBB1610:
-.LBB1611:
-	.loc 1 302 0
+.LBB1672:
+.LBB1673:
+	.loc 1 301 0
 	mov	w8, 3
 	lsl	x9, x9, 2
-.LVL935:
+.LVL932:
 	.p2align 2
-.L877:
-.LBE1611:
-.LBE1610:
-	.loc 1 1474 0
+.L879:
+.LBE1673:
+.LBE1672:
+	.loc 1 1473 0
 	mov	x4, 0
-	cbz	w22, .L890
+	cbz	w22, .L892
 	.p2align 2
-.L907:
-	.loc 1 1476 0
-	ldr	w0, [x21, x4, lsl 2]
-.LVL936:
+.L909:
 	.loc 1 1475 0
+	ldr	w0, [x21, x4, lsl 2]
+.LVL933:
+	.loc 1 1474 0
 	ldr	w1, [x20, x4, lsl 2]
-.LVL937:
-.LBB1650:
-.LBB1648:
-.LBB1612:
-.LBB1613:
-	.loc 1 270 0
+.LVL934:
+.LBB1712:
+.LBB1710:
+.LBB1674:
+.LBB1675:
+	.loc 1 269 0
 	lsr	w15, w0, 11
-	.loc 1 268 0
+	.loc 1 267 0
 	lsr	w13, w0, 3
-.LVL938:
-	.loc 1 270 0
+.LVL935:
+	.loc 1 269 0
 	ubfx	x7, x1, 16, 4
 	and	w15, w15, 480
-	.loc 1 272 0
+	.loc 1 271 0
 	lsr	w2, w0, 19
-	.loc 1 268 0
+	.loc 1 267 0
 	ubfx	x5, x1, 8, 4
-	.loc 1 272 0
+	.loc 1 271 0
 	and	w2, w2, 480
-	.loc 1 269 0
+	.loc 1 268 0
 	lsr	w12, w0, 7
-	.loc 1 267 0
+	.loc 1 266 0
 	lsl	w6, w0, 1
-	.loc 1 268 0
+	.loc 1 267 0
 	and	w13, w13, 480
-	.loc 1 270 0
+	.loc 1 269 0
 	orr	w15, w15, w7
-	.loc 1 272 0
+	.loc 1 271 0
 	ubfx	x7, x1, 24, 4
-	.loc 1 269 0
-	ubfx	x16, x1, 12, 4
-	.loc 1 267 0
-	and	w6, w6, 480
-	.loc 1 269 0
-	and	w12, w12, 480
-	.loc 1 267 0
-	ubfx	x11, x1, 4, 4
 	.loc 1 268 0
-	orr	w13, w13, w5
-	.loc 1 272 0
-	orr	w7, w2, w7
-	.loc 1 271 0
-	lsr	w5, w0, 15
-	.loc 1 273 0
-	lsr	w2, w0, 23
-	.loc 1 271 0
-	and	w5, w5, 480
+	ubfx	x16, x1, 12, 4
 	.loc 1 266 0
-	and	w14, w1, 15
-	.loc 1 269 0
-	orr	w12, w12, w16
+	and	w6, w6, 480
+	.loc 1 268 0
+	and	w12, w12, 480
+	.loc 1 266 0
+	ubfx	x11, x1, 4, 4
 	.loc 1 267 0
-	orr	w11, w6, w11
-	.loc 1 273 0
-	and	w2, w2, 480
+	orr	w13, w13, w5
 	.loc 1 271 0
-	ubfx	x6, x1, 20, 4
-	.loc 1 266 0
-	ubfiz	w16, w0, 5, 4
-	.loc 1 271 0
-	orr	w6, w5, w6
-.LBE1613:
-.LBE1612:
-	.loc 1 303 0
-	eor	w3, w1, w0
-.LBB1631:
-.LBB1614:
-	.loc 1 273 0
-	add	w5, w2, w1, lsr 28
-	.loc 1 266 0
-	orr	w14, w16, w14
-.LBE1614:
-.LBE1631:
-.LBE1648:
-.LBE1650:
-	.loc 1 1477 0
-	cmp	w1, w0
-	beq	.L879
-.LBB1651:
-.LBB1649:
-	.loc 1 302 0
-	tst	x3, 15
-.LBB1632:
-.LBB1615:
+	orr	w7, w2, w7
 	.loc 1 270 0
-	ldrb	w1, [x19, w15, uxtw]
-.LVL939:
-.LBE1615:
-.LBE1632:
+	lsr	w5, w0, 15
+	.loc 1 272 0
+	lsr	w2, w0, 23
+	.loc 1 270 0
+	and	w5, w5, 480
+	.loc 1 265 0
+	and	w14, w1, 15
+	.loc 1 268 0
+	orr	w12, w12, w16
+	.loc 1 266 0
+	orr	w11, w6, w11
+	.loc 1 272 0
+	and	w2, w2, 480
+	.loc 1 270 0
+	ubfx	x6, x1, 20, 4
+	.loc 1 265 0
+	ubfiz	w16, w0, 5, 4
+	.loc 1 270 0
+	orr	w6, w5, w6
+.LBE1675:
+.LBE1674:
 	.loc 1 302 0
+	eor	w3, w1, w0
+.LBB1693:
+.LBB1676:
+	.loc 1 272 0
+	add	w5, w2, w1, lsr 28
+	.loc 1 265 0
+	orr	w14, w16, w14
+.LBE1676:
+.LBE1693:
+.LBE1710:
+.LBE1712:
+	.loc 1 1476 0
+	cmp	w1, w0
+	beq	.L881
+.LBB1713:
+.LBB1711:
+	.loc 1 301 0
+	tst	x3, 15
+.LBB1694:
+.LBB1677:
+	.loc 1 269 0
+	ldrb	w1, [x19, w15, uxtw]
+.LVL936:
+.LBE1677:
+.LBE1694:
+	.loc 1 301 0
 	csel	w0, w8, wzr, ne
-.LVL940:
-	.loc 1 311 0
+.LVL937:
+	.loc 1 310 0
 	tst	w3, 240
 	orr	w2, w0, 12
-.LBB1633:
-.LBB1616:
-	.loc 1 268 0
+.LBB1695:
+.LBB1678:
+	.loc 1 267 0
 	ldrb	w13, [x19, w13, uxtw]
-.LBE1616:
-.LBE1633:
-	.loc 1 311 0
+.LBE1678:
+.LBE1695:
+	.loc 1 310 0
 	csel	w0, w2, w0, ne
-	.loc 1 313 0
+	.loc 1 312 0
 	tst	w3, 3840
 	orr	w15, w0, 48
-.LBB1634:
-.LBB1617:
-	.loc 1 269 0
+.LBB1696:
+.LBB1679:
+	.loc 1 268 0
 	ldrb	w2, [x19, w12, uxtw]
-.LBE1617:
-.LBE1634:
-	.loc 1 313 0
+.LBE1679:
+.LBE1696:
+	.loc 1 312 0
 	csel	w0, w15, w0, ne
-	.loc 1 315 0
+	.loc 1 314 0
 	tst	w3, 61440
 	orr	w15, w0, 192
-.LBB1635:
-.LBB1618:
-	.loc 1 267 0
+.LBB1697:
+.LBB1680:
+	.loc 1 266 0
 	ldrb	w12, [x19, w11, uxtw]
-.LBE1618:
-.LBE1635:
-	.loc 1 315 0
+.LBE1680:
+.LBE1697:
+	.loc 1 314 0
 	and	w15, w15, 65535
-.LBB1636:
-.LBB1619:
-	.loc 1 272 0
-	ldrb	w11, [x19, w7, uxtw]
-.LBE1619:
-.LBE1636:
-	.loc 1 315 0
-	csel	w0, w15, w0, ne
-.LBB1637:
-.LBB1620:
+.LBB1698:
+.LBB1681:
 	.loc 1 271 0
+	ldrb	w11, [x19, w7, uxtw]
+.LBE1681:
+.LBE1698:
+	.loc 1 314 0
+	csel	w0, w15, w0, ne
+.LBB1699:
+.LBB1682:
+	.loc 1 270 0
 	ldrb	w7, [x19, w6, uxtw]
-.LBE1620:
-.LBE1637:
-	.loc 1 317 0
+.LBE1682:
+.LBE1699:
+	.loc 1 316 0
 	orr	w15, w0, 768
 	tst	w3, 983040
 	and	w6, w15, 65535
-.LBB1638:
-.LBB1621:
-	.loc 1 273 0
+.LBB1700:
+.LBB1683:
+	.loc 1 272 0
 	ldrb	w5, [x19, w5, uxtw]
-.LBE1621:
-.LBE1638:
-	.loc 1 317 0
+.LBE1683:
+.LBE1700:
+	.loc 1 316 0
 	csel	w0, w6, w0, ne
-	.loc 1 319 0
+	.loc 1 318 0
 	tst	w3, 15728640
 	orr	w6, w0, 3072
-.LBB1639:
-.LBB1622:
-	.loc 1 266 0
+.LBB1701:
+.LBB1684:
+	.loc 1 265 0
 	ldrb	w14, [x19, w14, uxtw]
-.LBE1622:
-.LBE1639:
-	.loc 1 319 0
+.LBE1684:
+.LBE1701:
+	.loc 1 318 0
 	and	w6, w6, 65535
-.LBB1640:
-.LBB1623:
-	.loc 1 270 0
+.LBB1702:
+.LBB1685:
+	.loc 1 269 0
 	lsl	w1, w1, 8
-.LBE1623:
-.LBE1640:
-	.loc 1 319 0
+.LBE1685:
+.LBE1702:
+	.loc 1 318 0
 	csel	w0, w6, w0, ne
-.LBB1641:
-.LBB1624:
-	.loc 1 268 0
+.LBB1703:
+.LBB1686:
+	.loc 1 267 0
 	lsl	w6, w13, 4
-.LBE1624:
-.LBE1641:
-	.loc 1 321 0
+.LBE1686:
+.LBE1703:
+	.loc 1 320 0
 	orr	w13, w0, 12288
 	tst	w3, 251658240
 	and	w13, w13, 65535
-.LBB1642:
-.LBB1625:
-	.loc 1 273 0
-	orr	w1, w1, w2, lsl 6
-.LBE1625:
-.LBE1642:
-	.loc 1 321 0
-	csel	w0, w13, w0, ne
-.LBB1643:
-.LBB1626:
-	.loc 1 273 0
-	orr	w12, w6, w12, lsl 2
+.LBB1704:
+.LBB1687:
 	.loc 1 272 0
+	orr	w1, w1, w2, lsl 6
+.LBE1687:
+.LBE1704:
+	.loc 1 320 0
+	csel	w0, w13, w0, ne
+.LBB1705:
+.LBB1688:
+	.loc 1 272 0
+	orr	w12, w6, w12, lsl 2
+	.loc 1 271 0
 	lsl	w11, w11, 12
-.LBE1626:
-.LBE1643:
-	.loc 1 323 0
+.LBE1688:
+.LBE1705:
+	.loc 1 322 0
 	orr	w6, w0, -16384
-.LBB1644:
-.LBB1627:
-	.loc 1 273 0
+.LBB1706:
+.LBB1689:
+	.loc 1 272 0
 	orr	w1, w1, w12
 	orr	w7, w11, w7, lsl 10
-.LBE1627:
-.LBE1644:
-	.loc 1 323 0
+.LBE1689:
+.LBE1706:
+	.loc 1 322 0
 	tst	w3, -268435456
-.LBB1645:
-.LBB1628:
-	.loc 1 273 0
+.LBB1707:
+.LBB1690:
+	.loc 1 272 0
 	orr	w1, w1, w7
-.LBE1628:
-.LBE1645:
-	.loc 1 323 0
+.LBE1690:
+.LBE1707:
+	.loc 1 322 0
 	and	w3, w6, 65535
-.LVL941:
-.LBB1646:
-.LBB1629:
-	.loc 1 273 0
+.LVL938:
+.LBB1708:
+.LBB1691:
+	.loc 1 272 0
 	orr	w2, w14, w5, lsl 14
-.LBE1629:
-.LBE1646:
-	.loc 1 323 0
+.LBE1691:
+.LBE1708:
+	.loc 1 322 0
 	csel	w0, w3, w0, ne
-.LBB1647:
-.LBB1630:
-	.loc 1 273 0
+.LBB1709:
+.LBB1692:
+	.loc 1 272 0
 	orr	w1, w1, w2
-.LBE1630:
-.LBE1647:
-	.loc 1 325 0
+.LBE1692:
+.LBE1709:
+	.loc 1 324 0
 	and	w0, w0, w1
-.LBE1649:
-.LBE1651:
-	.loc 1 1478 0
+.LBE1711:
+.LBE1713:
+	.loc 1 1477 0
 	strh	w0, [x27, x4, lsl 1]
-.LVL942:
-.L879:
+.LVL939:
+.L881:
 	add	x4, x4, 1
-	.loc 1 1474 0
+	.loc 1 1473 0
 	cmp	w22, w4
-	bgt	.L907
+	bgt	.L909
 	add	x20, x20, x9
 	add	x21, x21, x9
-.L890:
-	.loc 1 1473 0
+.L892:
+	.loc 1 1472 0
 	add	w24, w24, 1
 	add	x27, x27, x10
 	cmp	w25, w24
-	bne	.L877
-.L872:
-	.loc 1 1482 0
+	bne	.L879
+.L874:
+	.loc 1 1481 0
 	ldp	x19, x20, [sp, 16]
-.LVL943:
+.LVL940:
 	ldp	x21, x22, [sp, 32]
-.LVL944:
+.LVL941:
 	ldp	x23, x24, [sp, 48]
-.LVL945:
+.LVL942:
 	ldp	x25, x26, [sp, 64]
-.LVL946:
+.LVL943:
 	ldr	x27, [sp, 80]
-.LVL947:
+.LVL944:
 	ldp	x29, x30, [sp], 96
 	.cfi_remember_state
 	.cfi_restore 30
@@ -9349,48 +9475,48 @@
 	.cfi_restore 20
 	.cfi_def_cfa 31, 0
 	ret
-.LVL948:
-.L875:
+.LVL945:
+.L877:
 	.cfi_restore_state
-	.loc 1 1470 0
-	sub	w2, w25, w24
 	.loc 1 1469 0
+	sub	w2, w25, w24
+	.loc 1 1468 0
 	mul	w23, w26, w24
-	.loc 1 1470 0
+	.loc 1 1469 0
 	mov	w1, 0
 	mul	w2, w2, w26
-	.loc 1 1469 0
+	.loc 1 1468 0
 	add	x27, x27, x23, sxtw
-	.loc 1 1470 0
+	.loc 1 1469 0
 	mov	x0, x27
 	sxtw	x2, w2
 	bl	memset
-.LVL949:
-	b	.L878
-.LVL950:
-.L910:
-	.loc 1 1454 0
-	add	w25, w0, w0, lsr 31
+.LVL946:
+	b	.L880
+.LVL947:
+.L912:
 	.loc 1 1453 0
+	add	w25, w0, w0, lsr 31
+	.loc 1 1452 0
 	mov	w24, 0
-.LVL951:
-	.loc 1 1454 0
+.LVL948:
+	.loc 1 1453 0
 	asr	w25, w25, 1
-.LVL952:
-	b	.L874
-.L911:
-	.loc 1 1456 0
+.LVL949:
+	b	.L876
+.L913:
+	.loc 1 1455 0
 	add	w24, w0, w0, lsr 31
-.LVL953:
+.LVL950:
 	asr	w24, w24, 1
-.LVL954:
-	.loc 1 1457 0
+.LVL951:
+	.loc 1 1456 0
 	mul	w1, w22, w24
 	sbfiz	x1, x1, 2, 32
 	add	x20, x20, x1
-	.loc 1 1458 0
+	.loc 1 1457 0
 	add	x21, x2, x1
-	b	.L874
+	b	.L876
 	.cfi_endproc
 .LFE2884:
 	.size	direct_mode_data_change_part.isra.9, .-direct_mode_data_change_part.isra.9
@@ -9399,9 +9525,9 @@
 	.type	ebc_frame_start, %function
 ebc_frame_start:
 .LFB2835:
-	.loc 1 1641 0
+	.loc 1 1640 0
 	.cfi_startproc
-.LVL955:
+.LVL952:
 	stp	x29, x30, [sp, -48]!
 	.cfi_def_cfa_offset 48
 	.cfi_offset 29, -48
@@ -9411,361 +9537,347 @@
 	stp	x19, x20, [sp, 16]
 	.cfi_offset 19, -32
 	.cfi_offset 20, -24
-	.loc 1 1643 0
+	.loc 1 1642 0
 	add	x19, x0, 192
-	.loc 1 1641 0
+	.loc 1 1640 0
 	str	x21, [sp, 32]
 	.cfi_offset 21, -16
-	.loc 1 1641 0
+	.loc 1 1640 0
 	mov	x20, x0
-	.loc 1 1642 0
+	.loc 1 1641 0
 	add	x21, x0, 24
-	.loc 1 1645 0
-	ldr	w6, [x19, 264]
+	.loc 1 1644 0
+	ldr	w6, [x19, 252]
 	cmp	w6, 3
-	beq	.L914
+	beq	.L916
 	cmp	w6, 4
-	beq	.L915
+	beq	.L917
 	cmp	w6, 1
-	beq	.L936
-	.loc 1 1751 0
+	beq	.L940
+	.loc 1 1750 0
 	ldrb	w4, [x19, 56]
 	str	w4, [x19, 72]
-	.loc 1 1754 0
-	ldp	x2, x1, [x19, 224]
-	.loc 1 1752 0
-	ldr	w0, [x21, 164]
 	.loc 1 1753 0
-	ldr	x5, [x20, 320]
+	ldp	x2, x1, [x19, 216]
+	.loc 1 1751 0
+	ldr	w0, [x21, 164]
 	.loc 1 1752 0
-	cbnz	w0, .L937
-	.loc 1 1759 0
-	ldr	x1, [x1, 16]
-	mov	w6, 1
-	ldr	x2, [x2, 16]
-	mov	w3, w4
-	ldr	x0, [x19, 192]
-	bl	direct_mode_data_change.isra.2
-.LVL956:
-.L931:
-.LBB1652:
-.LBB1653:
-	.loc 1 1586 0
-	str	wzr, [x21, 72]
-	.loc 1 1587 0
-	mov	x0, x21
-	ldr	w1, [x20, 224]
-	bl	flip.isra.4
-.LVL957:
-.LBE1653:
-.LBE1652:
-	.loc 1 1765 0
-	ldr	w4, [x19, 72]
-	.loc 1 1768 0
-	ldp	x2, x1, [x19, 224]
-	.loc 1 1765 0
-	sub	w4, w4, #1
-	str	w4, [x19, 72]
-	.loc 1 1766 0
-	ldr	w0, [x21, 164]
-	.loc 1 1767 0
-	ldrb	w3, [x20, 248]
 	ldr	x5, [x20, 320]
-	.loc 1 1766 0
-	cbnz	w0, .L938
-	.loc 1 1773 0
-	ldr	x0, [x19, 200]
-	mov	w6, 1
-	ldr	x1, [x1, 16]
-	ldr	x2, [x2, 16]
-	bl	direct_mode_data_change.isra.2
-.LVL958:
-	.loc 1 1782 0
-	ldr	x21, [sp, 32]
-	ldp	x19, x20, [sp, 16]
-.LVL959:
-	ldp	x29, x30, [sp], 48
-	.cfi_remember_state
-	.cfi_restore 20
-	.cfi_restore 19
-	.cfi_restore 21
-	.cfi_restore 29
-	.cfi_restore 30
-	.cfi_def_cfa 31, 0
-	ret
-.LVL960:
-	.p2align 3
-.L936:
-	.cfi_restore_state
-	.loc 1 1721 0
-	ldrb	w4, [x19, 56]
-	str	w4, [x19, 72]
-	.loc 1 1725 0
-	ldr	x1, [x19, 224]
-	.loc 1 1722 0
-	ldr	w0, [x21, 164]
-.LVL961:
-	cbnz	w0, .L939
-	.loc 1 1730 0
-	ldr	x0, [x19, 232]
-	.loc 1 1729 0
-	mov	w3, w4
-	ldr	x2, [x1, 16]
-	ldr	x5, [x20, 320]
-	ldr	x1, [x0, 16]
-	ldr	x0, [x19, 192]
-	bl	direct_mode_data_change_part.isra.9
-.LVL962:
-.L928:
-.LBB1654:
-.LBB1655:
-	.loc 1 1586 0
-	str	wzr, [x21, 72]
-	.loc 1 1587 0
-	mov	x0, x21
-	ldr	w1, [x20, 224]
-	bl	flip.isra.4
-.LVL963:
-.LBE1655:
-.LBE1654:
-	.loc 1 1736 0
-	ldr	w4, [x19, 72]
-	.loc 1 1739 0
-	ldp	x2, x1, [x19, 224]
-	.loc 1 1736 0
-	sub	w4, w4, #1
-	str	w4, [x19, 72]
-	.loc 1 1737 0
-	ldr	w0, [x21, 164]
-	.loc 1 1738 0
-	ldrb	w3, [x20, 248]
-	ldr	x5, [x20, 320]
-	.loc 1 1737 0
-	cbz	w0, .L929
-	.loc 1 1738 0
-	ldr	x0, [x19, 200]
-	mov	w6, 1
-	ldr	x1, [x1, 16]
-	ldr	x2, [x2, 16]
-	bl	direct_mode_data_change_part2.isra.8
-.LVL964:
-	.loc 1 1782 0
-	ldr	x21, [sp, 32]
-	ldp	x19, x20, [sp, 16]
-.LVL965:
-	ldp	x29, x30, [sp], 48
-	.cfi_remember_state
-	.cfi_restore 20
-	.cfi_restore 19
-	.cfi_restore 21
-	.cfi_restore 29
-	.cfi_restore 30
-	.cfi_def_cfa 31, 0
-	ret
-.LVL966:
-	.p2align 3
-.L915:
-	.cfi_restore_state
-	.loc 1 1647 0
-	ldrsw	x2, [x19, 32]
-	mov	w1, 0
-	ldr	x0, [x19, 192]
-.LVL967:
-	bl	memset
-.LVL968:
-	.loc 1 1648 0
-	ldr	w0, [x21, 164]
-	cbnz	w0, .L940
-	.loc 1 1656 0
-	ldp	x1, x2, [x19, 152]
-	mov	x5, x19
-	ldp	x3, x4, [x19, 176]
-	ldr	x0, [x19, 192]
-	bl	get_overlay_image_area
-.LVL969:
-.L918:
-	.loc 1 1662 0
-	ldr	w0, [x19, 60]
-	cbz	w0, .L919
-.LBB1656:
-.LBB1657:
-	.loc 1 1586 0
-	str	wzr, [x21, 72]
-	.loc 1 1587 0
-	mov	x0, x21
-	ldr	w1, [x20, 224]
-	bl	flip.isra.4
-.LVL970:
-.LBE1657:
-.LBE1656:
-	.loc 1 1664 0
-	ldrsw	x2, [x19, 32]
-	mov	w1, 0
-	ldr	x0, [x19, 200]
-	bl	memset
-.LVL971:
-	.loc 1 1665 0
-	ldr	w0, [x21, 164]
-	cbz	w0, .L920
-	.loc 1 1666 0
-	ldp	x1, x2, [x19, 152]
-	mov	x4, x19
-	ldr	x3, [x19, 176]
-	ldr	x0, [x19, 200]
-	bl	get_overlay_image_area2.isra.0
-.LVL972:
-	b	.L912
-.LVL973:
-	.p2align 3
-.L914:
-	.loc 1 1685 0
-	ldr	w0, [x21, 164]
-.LVL974:
-	.loc 1 1686 0
-	ldp	x1, x2, [x19, 152]
-	ldr	x3, [x19, 176]
-	.loc 1 1685 0
+	.loc 1 1751 0
 	cbnz	w0, .L941
-	.loc 1 1693 0
-	ldr	x0, [x19, 192]
-	mov	w5, 1
-	mov	x4, x19
-	bl	get_auto_image
-.LVL975:
-.L923:
-	.loc 1 1699 0
-	ldr	w0, [x19, 60]
-	cbz	w0, .L924
-	.loc 1 1700 0
+	.loc 1 1758 0
+	ldr	x1, [x1, 16]
+	mov	w3, w4
+	ldr	x2, [x2, 16]
+	mov	w6, 1
+	ldr	x0, [x19, 184]
+	bl	direct_mode_data_change.isra.2
+.LVL953:
+	.loc 1 1763 0
+	ldr	w4, [x19, 72]
+	.loc 1 1766 0
+	ldp	x2, x1, [x19, 216]
+	.loc 1 1763 0
+	sub	w4, w4, #1
+	str	w4, [x19, 72]
+	.loc 1 1764 0
 	ldr	w0, [x21, 164]
-	.loc 1 1701 0
-	ldp	x1, x2, [x19, 152]
-	ldr	x3, [x19, 176]
-	.loc 1 1700 0
-	cbz	w0, .L925
-	.loc 1 1701 0
-	ldr	x0, [x19, 200]
-	mov	w5, 1
-	mov	x4, x19
-	bl	get_auto_image2
-.LVL976:
-.L926:
-.LBB1658:
-.LBB1659:
-	.loc 1 1586 0
-	str	wzr, [x21, 72]
-	.loc 1 1587 0
-	mov	x0, x21
-	ldr	w1, [x20, 224]
-	bl	flip.isra.4
-.LVL977:
-.L912:
-.LBE1659:
-.LBE1658:
-	.loc 1 1782 0
-	ldp	x19, x20, [sp, 16]
-.LVL978:
-	ldr	x21, [sp, 32]
-	ldp	x29, x30, [sp], 48
-	.cfi_remember_state
-	.cfi_restore 30
-	.cfi_restore 29
-	.cfi_restore 21
-	.cfi_restore 19
-	.cfi_restore 20
-	.cfi_def_cfa 31, 0
-	ret
-.LVL979:
-	.p2align 3
-.L941:
-	.cfi_restore_state
-	.loc 1 1686 0
+	.loc 1 1765 0
+	ldrb	w3, [x20, 248]
+	ldr	x5, [x20, 320]
+	.loc 1 1764 0
+	cbz	w0, .L935
+.L946:
+	.loc 1 1765 0
+	ldr	x1, [x1, 16]
+	mov	w6, 1
+	ldr	x2, [x2, 16]
 	ldr	x0, [x19, 192]
-	mov	w5, 1
-	mov	x4, x19
-	bl	get_auto_image2
-.LVL980:
-	b	.L923
+	bl	direct_mode_data_change2.isra.3
+.LVL954:
+	b	.L936
 	.p2align 3
 .L940:
-	.loc 1 1649 0
-	ldp	x1, x2, [x19, 152]
-	mov	x4, x19
-	ldr	x3, [x19, 176]
-	ldr	x0, [x19, 192]
-	bl	get_overlay_image_area2.isra.0
-.LVL981:
-	b	.L918
-	.p2align 3
-.L939:
+	.loc 1 1720 0
+	ldrb	w4, [x19, 56]
+	str	w4, [x19, 72]
 	.loc 1 1724 0
-	ldr	x0, [x19, 232]
-	.loc 1 1723 0
+	ldr	x1, [x19, 216]
+	.loc 1 1721 0
+	ldr	w0, [x21, 164]
+.LVL955:
+	cbnz	w0, .L942
+	.loc 1 1729 0
+	ldr	x0, [x19, 224]
+	.loc 1 1728 0
 	mov	w3, w4
 	ldr	x2, [x1, 16]
 	ldr	x5, [x20, 320]
 	ldr	x1, [x0, 16]
+	ldr	x0, [x19, 184]
+	bl	direct_mode_data_change_part.isra.9
+.LVL956:
+	.loc 1 1734 0
+	ldr	w4, [x19, 72]
+	.loc 1 1737 0
+	ldp	x2, x1, [x19, 216]
+	.loc 1 1734 0
+	sub	w4, w4, #1
+	str	w4, [x19, 72]
+	.loc 1 1735 0
+	ldr	w0, [x21, 164]
+	.loc 1 1736 0
+	ldrb	w3, [x20, 248]
+	ldr	x5, [x20, 320]
+	.loc 1 1735 0
+	cbz	w0, .L931
+.L945:
+	.loc 1 1736 0
+	ldr	x1, [x1, 16]
+	mov	w6, 1
+	ldr	x2, [x2, 16]
 	ldr	x0, [x19, 192]
 	bl	direct_mode_data_change_part2.isra.8
-.LVL982:
-	b	.L928
+.LVL957:
+	b	.L936
+.LVL958:
 	.p2align 3
-.L937:
-	.loc 1 1753 0
-	ldr	x1, [x1, 16]
-	mov	w6, 1
-	ldr	x2, [x2, 16]
-	mov	w3, w4
+.L917:
+	.loc 1 1646 0
+	ldrsw	x2, [x19, 32]
+	mov	w1, 0
+	ldr	x0, [x19, 184]
+.LVL959:
+	bl	memset
+.LVL960:
+	.loc 1 1647 0
+	ldr	w0, [x21, 164]
+	cbnz	w0, .L943
+	.loc 1 1655 0
+	ldp	x1, x2, [x19, 152]
+	mov	x5, x19
+	ldp	x3, x4, [x19, 168]
+	ldr	x0, [x19, 184]
+	bl	get_overlay_image_area
+.LVL961:
+.L920:
+	.loc 1 1661 0
+	ldr	w0, [x19, 60]
+	cbz	w0, .L921
+.LBB1714:
+.LBB1715:
+	.loc 1 1585 0
+	str	wzr, [x21, 72]
+	.loc 1 1586 0
+	mov	x0, x21
+	ldr	w1, [x20, 224]
+	bl	flip.isra.4
+.LVL962:
+.LBE1715:
+.LBE1714:
+	.loc 1 1663 0
+	ldrsw	x2, [x19, 32]
+	mov	w1, 0
 	ldr	x0, [x19, 192]
-	bl	direct_mode_data_change2.isra.3
-.LVL983:
-	b	.L931
+	bl	memset
+.LVL963:
+	.loc 1 1664 0
+	ldr	w0, [x21, 164]
+	cbz	w0, .L922
+	.loc 1 1665 0
+	ldp	x1, x2, [x19, 152]
+	mov	x4, x19
+	ldr	x3, [x19, 168]
+	ldr	x0, [x19, 192]
+	bl	get_overlay_image_area2.isra.0
+.LVL964:
+	b	.L914
+.LVL965:
 	.p2align 3
-.L929:
-	.loc 1 1744 0
-	ldr	x0, [x19, 200]
-	mov	w6, 1
-	ldr	x1, [x1, 16]
-	ldr	x2, [x2, 16]
-	bl	direct_mode_data_change_part.isra.9
-.LVL984:
-	.loc 1 1782 0
-	ldr	x21, [sp, 32]
-	ldp	x19, x20, [sp, 16]
-.LVL985:
-	ldp	x29, x30, [sp], 48
-	.cfi_remember_state
-	.cfi_restore 20
-	.cfi_restore 19
-	.cfi_restore 21
-	.cfi_restore 29
-	.cfi_restore 30
-	.cfi_def_cfa 31, 0
-	ret
-.LVL986:
-	.p2align 3
-.L925:
-	.cfi_restore_state
-	.loc 1 1708 0
-	ldr	x0, [x19, 200]
+.L916:
+	.loc 1 1684 0
+	ldr	w0, [x21, 164]
+.LVL966:
+	.loc 1 1685 0
+	ldp	x1, x2, [x19, 152]
+	ldr	x3, [x19, 168]
+	.loc 1 1684 0
+	cbnz	w0, .L944
+	.loc 1 1692 0
+	ldr	x0, [x19, 184]
 	mov	w5, 1
 	mov	x4, x19
 	bl	get_auto_image
-.LVL987:
-	b	.L926
+.LVL967:
+.L925:
+	.loc 1 1698 0
+	ldr	w0, [x19, 60]
+	cbz	w0, .L926
+	.loc 1 1699 0
+	ldr	w0, [x21, 164]
+	.loc 1 1700 0
+	ldp	x1, x2, [x19, 152]
+	ldr	x3, [x19, 168]
+	.loc 1 1699 0
+	cbz	w0, .L927
+	.loc 1 1700 0
+	ldr	x0, [x19, 192]
+	mov	w5, 1
+	mov	x4, x19
+	bl	get_auto_image2
+.LVL968:
+	.p2align 2
+.L936:
+.LBB1716:
+.LBB1717:
+	.loc 1 1585 0
+	str	wzr, [x21, 72]
+	.loc 1 1586 0
+	mov	x0, x21
+	ldr	w1, [x20, 224]
+	bl	flip.isra.4
+.LVL969:
+.L914:
+.LBE1717:
+.LBE1716:
+	.loc 1 1781 0
+	ldp	x19, x20, [sp, 16]
+.LVL970:
+	ldr	x21, [sp, 32]
+	ldp	x29, x30, [sp], 48
+	.cfi_remember_state
+	.cfi_restore 30
+	.cfi_restore 29
+	.cfi_restore 21
+	.cfi_restore 19
+	.cfi_restore 20
+	.cfi_def_cfa 31, 0
+	ret
+.LVL971:
 	.p2align 3
-.L938:
-	.loc 1 1767 0
+.L944:
+	.cfi_restore_state
+	.loc 1 1685 0
+	ldr	x0, [x19, 184]
+	mov	w5, 1
+	mov	x4, x19
+	bl	get_auto_image2
+.LVL972:
+	b	.L925
+	.p2align 3
+.L943:
+	.loc 1 1648 0
+	ldp	x1, x2, [x19, 152]
+	mov	x4, x19
+	ldr	x3, [x19, 168]
+	ldr	x0, [x19, 184]
+	bl	get_overlay_image_area2.isra.0
+.LVL973:
+	b	.L920
+	.p2align 3
+.L942:
+	.loc 1 1723 0
+	ldr	x0, [x19, 224]
+	.loc 1 1722 0
+	mov	w3, w4
+	ldr	x2, [x1, 16]
+	ldr	x5, [x20, 320]
+	ldr	x1, [x0, 16]
+	ldr	x0, [x19, 184]
+	bl	direct_mode_data_change_part2.isra.8
+.LVL974:
+	.loc 1 1734 0
+	ldr	w4, [x19, 72]
+	.loc 1 1737 0
+	ldp	x2, x1, [x19, 216]
+	.loc 1 1734 0
+	sub	w4, w4, #1
+	str	w4, [x19, 72]
+	.loc 1 1735 0
+	ldr	w0, [x21, 164]
+	.loc 1 1736 0
+	ldrb	w3, [x20, 248]
+	ldr	x5, [x20, 320]
+	.loc 1 1735 0
+	cbnz	w0, .L945
+.L931:
+	.loc 1 1742 0
 	ldr	x1, [x1, 16]
 	mov	w6, 1
 	ldr	x2, [x2, 16]
-	ldr	x0, [x19, 200]
-	bl	direct_mode_data_change2.isra.3
-.LVL988:
-	b	.L912
+	ldr	x0, [x19, 192]
+	bl	direct_mode_data_change_part.isra.9
+.LVL975:
+	b	.L936
 	.p2align 3
-.L919:
+.L941:
+	.loc 1 1752 0
+	ldr	x1, [x1, 16]
+	mov	w3, w4
+	ldr	x2, [x2, 16]
+	mov	w6, 1
+	ldr	x0, [x19, 184]
+	bl	direct_mode_data_change2.isra.3
+.LVL976:
+	.loc 1 1763 0
+	ldr	w4, [x19, 72]
+	.loc 1 1766 0
+	ldp	x2, x1, [x19, 216]
+	.loc 1 1763 0
+	sub	w4, w4, #1
+	str	w4, [x19, 72]
+	.loc 1 1764 0
+	ldr	w0, [x21, 164]
+	.loc 1 1765 0
+	ldrb	w3, [x20, 248]
+	ldr	x5, [x20, 320]
+	.loc 1 1764 0
+	cbnz	w0, .L946
+.L935:
+	.loc 1 1771 0
+	ldr	x1, [x1, 16]
+	mov	w6, 1
+	ldr	x2, [x2, 16]
+	ldr	x0, [x19, 192]
+	bl	direct_mode_data_change.isra.2
+.LVL977:
+	b	.L936
+	.p2align 3
+.L927:
+	.loc 1 1707 0
+	ldr	x0, [x19, 192]
+	mov	w5, 1
+	mov	x4, x19
+	bl	get_auto_image
+.LVL978:
+	b	.L936
+	.p2align 3
+.L921:
+	.loc 1 1679 0
+	ldr	x0, [x19, 104]
+	adrp	x2, .LANCHOR3
+	add	x2, x2, :lo12:.LANCHOR3
+	adrp	x1, .LC33
+	add	x2, x2, 16
+	add	x1, x1, :lo12:.LC33
+	bl	_dev_info
+.LVL979:
 	.loc 1 1680 0
+	str	wzr, [x19, 52]
+	b	.L914
+	.p2align 3
+.L922:
+	.loc 1 1672 0
+	ldp	x1, x2, [x19, 152]
+	mov	x5, x19
+	ldp	x3, x4, [x19, 168]
+	ldr	x0, [x19, 192]
+	bl	get_overlay_image_area
+.LVL980:
+	b	.L914
+	.p2align 3
+.L926:
+	.loc 1 1715 0
 	ldr	x0, [x19, 104]
 	adrp	x2, .LANCHOR3
 	add	x2, x2, :lo12:.LANCHOR3
@@ -9773,34 +9885,10 @@
 	add	x2, x2, 16
 	add	x1, x1, :lo12:.LC34
 	bl	_dev_info
-.LVL989:
-	.loc 1 1681 0
-	str	wzr, [x19, 52]
-	b	.L912
-	.p2align 3
-.L920:
-	.loc 1 1673 0
-	ldp	x1, x2, [x19, 152]
-	mov	x5, x19
-	ldp	x3, x4, [x19, 176]
-	ldr	x0, [x19, 200]
-	bl	get_overlay_image_area
-.LVL990:
-	b	.L912
-	.p2align 3
-.L924:
+.LVL981:
 	.loc 1 1716 0
-	ldr	x0, [x19, 104]
-	adrp	x2, .LANCHOR3
-	add	x2, x2, :lo12:.LANCHOR3
-	adrp	x1, .LC35
-	add	x2, x2, 16
-	add	x1, x1, :lo12:.LC35
-	bl	_dev_info
-.LVL991:
-	.loc 1 1717 0
 	str	wzr, [x19, 52]
-	b	.L912
+	b	.L914
 	.cfi_endproc
 .LFE2835:
 	.size	ebc_frame_start, .-ebc_frame_start
@@ -9809,18 +9897,18 @@
 	.type	ebc_auto_assist_tast_function, %function
 ebc_auto_assist_tast_function:
 .LFB2836:
-	.loc 1 1786 0
+	.loc 1 1785 0
 	.cfi_startproc
-.LVL992:
+.LVL982:
 	stp	x29, x30, [sp, -96]!
 	.cfi_def_cfa_offset 96
 	.cfi_offset 29, -96
 	.cfi_offset 30, -88
-	.loc 1 1787 0
-	adrp	x1, .LANCHOR0
 	.loc 1 1786 0
+	adrp	x1, .LANCHOR0
+	.loc 1 1785 0
 	adrp	x0, __stack_chk_guard
-.LVL993:
+.LVL983:
 	add	x0, x0, :lo12:__stack_chk_guard
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
@@ -9832,224 +9920,224 @@
 	.cfi_offset 22, -56
 	adrp	x22, .LANCHOR1
 	stp	x23, x24, [sp, 48]
-	.loc 1 1792 0
+	.loc 1 1791 0
 	add	x22, x22, :lo12:.LANCHOR1
-	.loc 1 1786 0
+	.loc 1 1785 0
 	str	x25, [sp, 64]
 	.cfi_offset 23, -48
 	.cfi_offset 24, -40
 	.cfi_offset 25, -32
-	.loc 1 1792 0
+	.loc 1 1791 0
 	add	x20, x22, 328
-	.loc 1 1787 0
+	.loc 1 1786 0
 	ldr	x25, [x1, #:lo12:.LANCHOR0]
-.LVL994:
-	.loc 1 1865 0
+.LVL984:
+	.loc 1 1864 0
 	add	x22, x22, 352
-.LBB1660:
-.LBB1661:
-.LBB1662:
+.LBB1718:
+.LBB1719:
+.LBB1720:
 	.file 12 "./include/linux/compiler.h"
 	.loc 12 290 0
 	mov	x24, 2
-.LBE1662:
-.LBE1661:
-.LBE1660:
-	.loc 1 1786 0
+.LBE1720:
+.LBE1719:
+.LBE1718:
+	.loc 1 1785 0
 	ldr	x1, [x0]
 	str	x1, [x29, 88]
 	mov	x1,0
-.LBB1667:
-.LBB1664:
-.LBB1665:
+.LBB1725:
+.LBB1722:
+.LBB1723:
 	.loc 4 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
 	mrs x23, sp_el0
 // 0 "" 2
-.LVL995:
+.LVL985:
 #NO_APP
-.LBE1665:
-.LBE1664:
-.LBE1667:
-	.loc 1 1789 0
+.LBE1723:
+.LBE1722:
+.LBE1725:
+	.loc 1 1788 0
 	add	x19, x25, 192
 	add	x21, x25, 24
-	b	.L952
+	b	.L957
 	.p2align 3
-.L964:
-	.loc 1 1797 0
+.L969:
+	.loc 1 1796 0
 	cmp	w5, 4
-	beq	.L945
+	beq	.L950
 	cmp	w5, 1
-	beq	.L963
-	.loc 1 1849 0
+	beq	.L968
+	.loc 1 1848 0
 	ldr	w4, [x19, 72]
-	cbz	w4, .L948
-	.loc 1 1851 0
+	cbz	w4, .L953
+	.loc 1 1850 0
 	ldr	w0, [x21, 164]
-	cbz	w0, .L951
-	.loc 1 1852 0
+	cbz	w0, .L956
+	.loc 1 1851 0
 	ldrsw	x0, [x21, 72]
 	mov	w6, 3
-	.loc 1 1853 0
-	ldp	x2, x1, [x19, 224]
 	.loc 1 1852 0
-	add	x0, x0, 24
+	ldp	x2, x1, [x19, 216]
+	.loc 1 1851 0
+	add	x0, x19, x0, lsl 3
 	ldrb	w3, [x25, 248]
 	ldr	x5, [x25, 320]
-	ldr	x0, [x19, x0, lsl 3]
 	ldr	x1, [x1, 16]
+	ldr	x0, [x0, 184]
 	ldr	x2, [x2, 16]
 	bl	direct_mode_data_change2.isra.3
-.LVL996:
+.LVL986:
 	.p2align 2
-.L948:
-	.loc 1 1865 0
+.L953:
+	.loc 1 1864 0
 	mov	x0, x22
 	bl	up
-.LVL997:
-	.loc 1 1866 0
+.LVL987:
+	.loc 1 1865 0
 	mov	x0, x20
 	bl	up
-.LVL998:
-	.loc 1 1867 0
+.LVL988:
+	.loc 1 1866 0
 	bl	schedule
-.LVL999:
-.L952:
-	.loc 1 1792 0
+.LVL989:
+.L957:
+	.loc 1 1791 0
 	mov	x0, x20
 	bl	down
-.LVL1000:
-.LBB1668:
-.LBB1666:
-.LBB1663:
+.LVL990:
+.LBB1726:
+.LBB1724:
+.LBB1721:
 	.loc 12 290 0
 	str	x24, [x23, 32]
-.LBE1663:
-.LBE1666:
-.LBE1668:
-	.loc 1 1796 0
+.LBE1721:
+.LBE1724:
+.LBE1726:
+	.loc 1 1795 0
 #APP
-// 1796 "drivers/gpu/drm/rockchip/ebc-dev/ebc_dev.c" 1
+// 1795 "drivers/gpu/drm/rockchip/ebc-dev/ebc_dev.c" 1
 	dmb ish
 // 0 "" 2
-	.loc 1 1797 0
+	.loc 1 1796 0
 #NO_APP
-	ldr	w5, [x19, 264]
+	ldr	w5, [x19, 252]
 	cmp	w5, 3
-	bne	.L964
-	.loc 1 1817 0
+	bne	.L969
+	.loc 1 1816 0
 	ldr	w0, [x21, 164]
-	cbz	w0, .L949
-	.loc 1 1818 0
+	cbz	w0, .L954
+	.loc 1 1817 0
 	ldrsw	x0, [x21, 72]
 	mov	x4, x19
 	ldp	x1, x2, [x19, 152]
-	add	x0, x0, 24
-	ldr	x3, [x19, 176]
-	ldr	x0, [x19, x0, lsl 3]
+	add	x0, x19, x0, lsl 3
+	ldr	x3, [x19, 168]
+	ldr	x0, [x0, 184]
 	bl	get_auto_image2
-.LVL1001:
-	b	.L948
+.LVL991:
+	b	.L953
 	.p2align 3
-.L963:
-	.loc 1 1833 0
+.L968:
+	.loc 1 1832 0
 	ldr	w4, [x19, 72]
-	cbz	w4, .L948
-	.loc 1 1835 0
+	cbz	w4, .L953
+	.loc 1 1834 0
 	ldr	w0, [x21, 164]
-	cbz	w0, .L950
-	.loc 1 1836 0
+	cbz	w0, .L955
+	.loc 1 1835 0
 	ldrsw	x0, [x21, 72]
 	mov	w6, 3
-	.loc 1 1837 0
-	ldp	x2, x1, [x19, 224]
 	.loc 1 1836 0
-	add	x0, x0, 24
+	ldp	x2, x1, [x19, 216]
+	.loc 1 1835 0
+	add	x0, x19, x0, lsl 3
 	ldrb	w3, [x25, 248]
 	ldr	x5, [x25, 320]
-	ldr	x0, [x19, x0, lsl 3]
 	ldr	x1, [x1, 16]
+	ldr	x0, [x0, 184]
 	ldr	x2, [x2, 16]
 	bl	direct_mode_data_change_part2.isra.8
-.LVL1002:
-	b	.L948
+.LVL992:
+	b	.L953
 	.p2align 3
-.L945:
-	.loc 1 1799 0
+.L950:
+	.loc 1 1798 0
 	ldr	w0, [x21, 164]
-	cbz	w0, .L947
-	.loc 1 1800 0
+	cbz	w0, .L952
+	.loc 1 1799 0
 	ldrsw	x0, [x21, 72]
 	mov	w6, 3
 	ldp	x1, x2, [x19, 152]
-	add	x0, x0, 24
-	ldp	x3, x4, [x19, 176]
 	mov	x5, x19
-	ldr	x0, [x19, x0, lsl 3]
+	add	x0, x19, x0, lsl 3
+	ldp	x3, x4, [x19, 168]
+	ldr	x0, [x0, 184]
 	bl	get_overlay_image2
-.LVL1003:
-	b	.L948
+.LVL993:
+	b	.L953
 	.p2align 3
-.L949:
-	.loc 1 1825 0
+.L954:
+	.loc 1 1824 0
 	ldrsw	x0, [x21, 72]
 	mov	x4, x19
 	ldp	x1, x2, [x19, 152]
-	add	x0, x0, 24
-	ldr	x3, [x19, 176]
-	ldr	x0, [x19, x0, lsl 3]
+	add	x0, x19, x0, lsl 3
+	ldr	x3, [x19, 168]
+	ldr	x0, [x0, 184]
 	bl	get_auto_image
-.LVL1004:
-	b	.L948
+.LVL994:
+	b	.L953
 	.p2align 3
-.L947:
-	.loc 1 1808 0
+.L952:
+	.loc 1 1807 0
 	ldrsw	x0, [x21, 72]
 	mov	w6, 3
 	ldp	x1, x2, [x19, 152]
-	add	x0, x0, 24
-	ldp	x3, x4, [x19, 176]
 	mov	x5, x19
-	ldr	x0, [x19, x0, lsl 3]
+	add	x0, x19, x0, lsl 3
+	ldp	x3, x4, [x19, 168]
+	ldr	x0, [x0, 184]
 	bl	get_overlay_image
-.LVL1005:
-	b	.L948
+.LVL995:
+	b	.L953
 	.p2align 3
-.L951:
-	.loc 1 1858 0
+.L956:
+	.loc 1 1857 0
 	ldrsw	x0, [x21, 72]
 	mov	w6, 3
-	.loc 1 1859 0
-	ldp	x2, x1, [x19, 224]
 	.loc 1 1858 0
-	add	x0, x0, 24
+	ldp	x2, x1, [x19, 216]
+	.loc 1 1857 0
+	add	x0, x19, x0, lsl 3
 	ldrb	w3, [x25, 248]
 	ldr	x5, [x25, 320]
-	ldr	x0, [x19, x0, lsl 3]
 	ldr	x1, [x1, 16]
+	ldr	x0, [x0, 184]
 	ldr	x2, [x2, 16]
 	bl	direct_mode_data_change.isra.2
-.LVL1006:
-	b	.L948
+.LVL996:
+	b	.L953
 	.p2align 3
-.L950:
-	.loc 1 1842 0
+.L955:
+	.loc 1 1841 0
 	ldrsw	x0, [x21, 72]
 	mov	w6, 3
-	.loc 1 1843 0
-	ldp	x2, x1, [x19, 224]
 	.loc 1 1842 0
-	add	x0, x0, 24
+	ldp	x2, x1, [x19, 216]
+	.loc 1 1841 0
+	add	x0, x19, x0, lsl 3
 	ldrb	w3, [x25, 248]
 	ldr	x5, [x25, 320]
-	ldr	x0, [x19, x0, lsl 3]
 	ldr	x1, [x1, 16]
+	ldr	x0, [x0, 184]
 	ldr	x2, [x2, 16]
 	bl	direct_mode_data_change_part.isra.9
-.LVL1007:
-	b	.L948
+.LVL997:
+	b	.L953
 	.cfi_endproc
 .LFE2836:
 	.size	ebc_auto_assist_tast_function, .-ebc_auto_assist_tast_function
@@ -10058,67 +10146,67 @@
 	.type	check_black_percent.isra.11, %function
 check_black_percent.isra.11:
 .LFB2886:
-	.loc 1 2252 0
+	.loc 1 2253 0
 	.cfi_startproc
-	.loc 1 2263 0
+	.loc 1 2264 0
 	mov	w2, 26215
-	.loc 1 2264 0
+	.loc 1 2265 0
 	cmp	w1, 0
-	.loc 1 2263 0
-	movk	w2, 0x6666, lsl 16
 	.loc 1 2264 0
+	movk	w2, 0x6666, lsl 16
+	.loc 1 2265 0
 	add	w5, w1, 7
 	csel	w5, w5, w1, lt
-	.loc 1 2263 0
-	smull	x4, w1, w2
 	.loc 1 2264 0
+	smull	x4, w1, w2
+	.loc 1 2265 0
 	asr	w5, w5, 3
 	cmp	w5, 0
-	.loc 1 2263 0
+	.loc 1 2264 0
 	asr	x4, x4, 34
 	sub	w4, w4, w1, asr 31
-.LVL1008:
-	.loc 1 2264 0
-	ble	.L966
+.LVL998:
+	.loc 1 2265 0
+	ble	.L971
 	mov	x1, 0
 	mov	w2, 0
-.LVL1009:
-	b	.L969
+.LVL999:
+	b	.L974
 	.p2align 3
-.L977:
+.L982:
 	cmp	w5, w1
-	ble	.L966
-.L969:
-	.loc 1 2266 0
+	ble	.L971
+.L974:
+	.loc 1 2267 0
 	ldr	x3, [x0, x1, lsl 3]
 	add	x1, x1, 1
-	.loc 1 2267 0
+	.loc 1 2268 0
 	cmp	x3, 0
 	cinc	w2, w2, ne
-	.loc 1 2268 0
-	cmp	w4, w2, lsl 3
-	bge	.L977
 	.loc 1 2269 0
+	cmp	w4, w2, lsl 3
+	bge	.L982
+	.loc 1 2270 0
 	mov	w0, 0
 	ret
-.L966:
-	.loc 1 2252 0
+.L971:
+	.loc 1 2253 0
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
-	.loc 1 2272 0
-	adrp	x0, .LC36
-	add	x0, x0, :lo12:.LC36
-	.loc 1 2252 0
+	.loc 1 2273 0
+	adrp	x0, .LC35
+	add	x0, x0, :lo12:.LC35
+	.loc 1 2253 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 2272 0
+	.loc 1 2273 0
 	bl	printk
-.LVL1010:
-	.loc 1 2274 0
-	mov	w0, 1
+.LVL1000:
 	.loc 1 2275 0
+	mov	w0, 1
+	.loc 1 2276 0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
 	.cfi_restore 29
@@ -10132,79 +10220,79 @@
 	.type	check_diff_percent.isra.12, %function
 check_diff_percent.isra.12:
 .LFB2887:
-	.loc 1 2300 0
+	.loc 1 2301 0
 	.cfi_startproc
-	.loc 1 2311 0
+	.loc 1 2312 0
 	mul	w8, w2, w3
 	mov	w4, 34079
 	movk	w4, 0x51eb, lsl 16
-	.loc 1 2312 0
+	.loc 1 2313 0
 	cmp	w2, 0
 	add	w7, w2, 7
 	csel	w7, w7, w2, lt
-	.loc 1 2311 0
-	smull	x4, w8, w4
 	.loc 1 2312 0
+	smull	x4, w8, w4
+	.loc 1 2313 0
 	asr	w7, w7, 3
 	cmp	w7, 0
-	.loc 1 2311 0
+	.loc 1 2312 0
 	asr	x4, x4, 37
 	sub	w8, w4, w8, asr 31
-.LVL1011:
-	.loc 1 2312 0
-	ble	.L983
+.LVL1001:
+	.loc 1 2313 0
+	ble	.L988
 	mov	x2, 0
 	mov	w9, 0
 	mov	w4, 0
-.LVL1012:
+.LVL1002:
 	.p2align 2
-.L982:
-	.loc 1 2316 0
+.L987:
+	.loc 1 2317 0
 	ldr	x6, [x0, x2, lsl 3]
 	ldr	x5, [x1, x2, lsl 3]
 	add	x2, x2, 1
 	cmp	x6, x5
-	beq	.L980
-	.loc 1 2318 0
+	beq	.L985
+	.loc 1 2319 0
 	add	w4, w4, 1
-	.loc 1 2317 0
+	.loc 1 2318 0
 	mov	w9, 1
-.L980:
-	.loc 1 2320 0
+.L985:
+	.loc 1 2321 0
 	cmp	w8, w4, lsl 3
-	blt	.L989
-	.loc 1 2312 0
+	blt	.L994
+	.loc 1 2313 0
 	cmp	w7, w2
-	bgt	.L982
-.L986:
-	.loc 1 2327 0
+	bgt	.L987
+.L991:
+	.loc 1 2328 0
 	mov	w0, w9
 	ret
-.LVL1013:
-.L983:
-	.loc 1 2304 0
+.LVL1003:
+.L988:
+	.loc 1 2305 0
 	mov	w9, 0
-	b	.L986
-.LVL1014:
-.L989:
-	.loc 1 2300 0
+	b	.L991
+.LVL1004:
+.L994:
+	.loc 1 2301 0
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
 	mov	w1, w3
-	.loc 1 2321 0
-	adrp	x0, .LC37
-	add	x0, x0, :lo12:.LC37
-	.loc 1 2300 0
+	.loc 1 2322 0
+	adrp	x0, .LC36
+	add	x0, x0, :lo12:.LC36
+	.loc 1 2301 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 2321 0
-	bl	printk
-.LVL1015:
 	.loc 1 2322 0
+	bl	printk
+.LVL1005:
+	.loc 1 2323 0
 	mov	w9, 2
-	.loc 1 2327 0
+	.loc 1 2328 0
 	mov	w0, w9
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
@@ -10219,36 +10307,36 @@
 	.type	ebc_probe, %function
 ebc_probe:
 .LFB2869:
-	.loc 1 3589 0
+	.loc 1 3601 0
 	.cfi_startproc
-.LVL1016:
+.LVL1006:
 	stp	x29, x30, [sp, -208]!
 	.cfi_def_cfa_offset 208
 	.cfi_offset 29, -208
 	.cfi_offset 30, -200
-.LBB1816:
-.LBB1817:
+.LBB1874:
+.LBB1875:
 	.loc 2 711 0
 	mov	w2, 32960
 	movk	w2, 0x60, lsl 16
-.LBE1817:
-.LBE1816:
-	.loc 1 3589 0
+.LBE1875:
+.LBE1874:
+	.loc 1 3601 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
 	stp	x21, x22, [sp, 32]
 	.cfi_offset 21, -176
 	.cfi_offset 22, -168
-	.loc 1 3590 0
+	.loc 1 3602 0
 	add	x22, x0, 16
-	.loc 1 3589 0
+	.loc 1 3601 0
 	stp	x23, x24, [sp, 48]
 	.cfi_offset 23, -160
 	.cfi_offset 24, -152
 	adrp	x23, __stack_chk_guard
 	stp	x19, x20, [sp, 16]
 	add	x0, x23, :lo12:__stack_chk_guard
-.LVL1017:
+.LVL1007:
 	stp	x25, x26, [sp, 64]
 	stp	x27, x28, [sp, 80]
 	.cfi_offset 19, -192
@@ -10257,148 +10345,148 @@
 	.cfi_offset 26, -136
 	.cfi_offset 27, -128
 	.cfi_offset 28, -120
-	.loc 1 3589 0
+	.loc 1 3601 0
 	ldr	x1, [x0]
 	str	x1, [x29, 200]
 	mov	x1,0
-.LBB1819:
-.LBB1818:
+.LBB1877:
+.LBB1876:
 	.loc 2 711 0
 	mov	x0, x22
-	mov	x1, 824
+	mov	x1, 808
 	bl	devm_kmalloc
-.LVL1018:
-.LBE1818:
-.LBE1819:
-	.loc 1 3605 0
-	cbz	x0, .L1045
-	.loc 1 3609 0
+.LVL1008:
+.LBE1876:
+.LBE1877:
+	.loc 1 3617 0
+	cbz	x0, .L1051
+	.loc 1 3621 0
 	adrp	x24, .LANCHOR0
 	mov	x20, x0
-	.loc 1 3611 0
-	adrp	x1, .LC38
+	.loc 1 3623 0
+	adrp	x1, .LC37
 	mov	w2, 0
-	.loc 1 3609 0
+	.loc 1 3621 0
 	str	x0, [x24, #:lo12:.LANCHOR0]
-	.loc 1 3611 0
-	add	x1, x1, :lo12:.LC38
+	.loc 1 3623 0
+	add	x1, x1, :lo12:.LC37
 	ldr	x0, [x22, 752]
-	.loc 1 3608 0
+	.loc 1 3620 0
 	str	x22, [x20]
-	.loc 1 3611 0
+	.loc 1 3623 0
 	bl	of_parse_phandle
-.LVL1019:
-	.loc 1 3612 0
-	cbz	x0, .L1079
-	.loc 1 3617 0
+.LVL1009:
+	.loc 1 3624 0
+	cbz	x0, .L1085
+	.loc 1 3629 0
 	bl	of_find_device_by_node
-.LVL1020:
-	.loc 1 3619 0
-	cbz	x0, .L994
-.LBB1820:
-.LBB1821:
-.LBB1822:
+.LVL1010:
+	.loc 1 3631 0
+	cbz	x0, .L999
+.LBB1878:
+.LBB1879:
+.LBB1880:
 	.loc 2 1181 0
 	ldr	x0, [x0, 200]
-.LVL1021:
-.LBE1822:
-.LBE1821:
-.LBE1820:
-	.loc 1 3622 0
+.LVL1011:
+.LBE1880:
+.LBE1879:
+.LBE1878:
+	.loc 1 3634 0
 	str	x0, [x20, 8]
-	.loc 1 3623 0
-	cbz	x0, .L994
-	.loc 1 3625 0
+	.loc 1 3635 0
+	cbz	x0, .L999
+	.loc 1 3637 0
 	adrp	x1, frame_done_callback
 	add	x1, x1, :lo12:frame_done_callback
 	str	x1, [x0, 104]
-	.loc 1 3627 0
+	.loc 1 3639 0
 	add	x2, x29, 96
-	adrp	x1, .LC40
-	add	x1, x1, :lo12:.LC40
+	adrp	x1, .LC39
+	add	x1, x1, :lo12:.LC39
 	ldr	x0, [x22, 752]
 	bl	of_get_property
-.LVL1022:
+.LVL1012:
 	mov	x21, x0
-.LVL1023:
-	.loc 1 3628 0
+.LVL1013:
+	.loc 1 3640 0
 	ldrsw	x0, [x29, 96]
-.LVL1024:
+.LVL1014:
 	lsr	x0, x0, 2
-.LVL1025:
+.LVL1015:
 	str	w0, [x29, 96]
-.LVL1026:
-	.loc 1 3629 0
+.LVL1016:
+	.loc 1 3641 0
 	cmp	w0, 0
-	beq	.L995
-	.loc 1 3634 0 discriminator 1
+	beq	.L1000
+	.loc 1 3646 0 discriminator 1
 	mov	w19, 0
-.LVL1027:
-	bgt	.L1067
-	b	.L997
+.LVL1017:
+	bgt	.L1073
+	b	.L1002
 	.p2align 3
-.L998:
-	.loc 1 3642 0
+.L1003:
+	.loc 1 3654 0
 	bl	of_find_i2c_device_by_node
-.LVL1028:
-	.loc 1 3644 0
-	cbz	x0, .L1080
-.LBB1823:
-.LBB1824:
-.LBB1825:
+.LVL1018:
+	.loc 1 3656 0
+	cbz	x0, .L1086
+.LBB1881:
+.LBB1882:
+.LBB1883:
 	.loc 2 1181 0
 	ldr	x0, [x0, 216]
-.LVL1029:
-.LBE1825:
-.LBE1824:
-.LBE1823:
-	.loc 1 3649 0
+.LVL1019:
+.LBE1883:
+.LBE1882:
+.LBE1881:
+	.loc 1 3661 0
 	str	x0, [x20, 16]
-	.loc 1 3650 0
-	cbnz	x0, .L1081
-	.loc 1 3634 0 discriminator 2
+	.loc 1 3662 0
+	cbnz	x0, .L1087
+	.loc 1 3646 0 discriminator 2
 	ldr	w0, [x29, 96]
 	add	w19, w19, 1
-.LVL1030:
+.LVL1020:
 	cmp	w0, w19
-	ble	.L1002
-.L1067:
+	ble	.L1007
+.L1073:
 	ldr	w0, [x21], 4
-	.loc 1 3636 0
+	.loc 1 3648 0
 	rev	w0, w0
 	bl	of_find_node_by_phandle
-.LVL1031:
-	.loc 1 3637 0
-	cbnz	x0, .L998
-	.loc 1 3638 0
-	adrp	x1, .LC42
+.LVL1021:
+	.loc 1 3649 0
+	cbnz	x0, .L1003
+	.loc 1 3650 0
+	adrp	x1, .LC41
 	mov	x0, x22
-	add	x1, x1, :lo12:.LC42
-	.loc 1 3639 0
+	add	x1, x1, :lo12:.LC41
+	.loc 1 3651 0
 	mov	w25, -19
-	.loc 1 3638 0
+	.loc 1 3650 0
 	bl	_dev_err
-.LVL1032:
+.LVL1022:
 	.p2align 2
-.L990:
-	.loc 1 3714 0
+.L995:
+	.loc 1 3726 0
 	add	x23, x23, :lo12:__stack_chk_guard
 	mov	w0, w25
-.LVL1033:
+.LVL1023:
 	ldr	x2, [x29, 200]
 	ldr	x1, [x23]
 	eor	x1, x2, x1
-	cbnz	x1, .L1082
+	cbnz	x1, .L1088
 	ldp	x19, x20, [sp, 16]
-.LVL1034:
+.LVL1024:
 	ldp	x21, x22, [sp, 32]
-.LVL1035:
+.LVL1025:
 	ldp	x23, x24, [sp, 48]
-.LVL1036:
+.LVL1026:
 	ldp	x25, x26, [sp, 64]
-.LVL1037:
+.LVL1027:
 	ldp	x27, x28, [sp, 80]
-.LVL1038:
+.LVL1028:
 	ldp	x29, x30, [sp], 208
 	.cfi_remember_state
 	.cfi_restore 30
@@ -10415,91 +10503,91 @@
 	.cfi_restore 20
 	.cfi_def_cfa 31, 0
 	ret
-.LVL1039:
+.LVL1029:
 	.p2align 3
-.L1081:
+.L1087:
 	.cfi_restore_state
-	.loc 1 3651 0
-	adrp	x1, .LC44
+	.loc 1 3663 0
+	adrp	x1, .LC43
 	mov	w2, w19
-	add	x1, x1, :lo12:.LC44
+	add	x1, x1, :lo12:.LC43
 	mov	x0, x22
 	bl	_dev_info
-.LVL1040:
-.L997:
-	.loc 1 3656 0
+.LVL1030:
+.L1002:
+	.loc 1 3668 0
 	ldr	x0, [x20, 16]
-	cbz	x0, .L1002
-	.loc 1 3662 0
+	cbz	x0, .L1007
+	.loc 1 3674 0
 	add	x19, x20, 192
-.LVL1041:
-	.loc 1 3664 0
+.LVL1031:
+	.loc 1 3676 0
 	add	x21, x20, 24
-.LVL1042:
-	.loc 1 3662 0
+.LVL1032:
+	.loc 1 3674 0
 	str	x22, [x19, 104]
-.LBB1826:
-.LBB1827:
-.LBB1828:
-.LBB1829:
-.LBB1830:
+.LBB1884:
+.LBB1885:
+.LBB1886:
+.LBB1887:
+.LBB1888:
 	.file 13 "./include/linux/of.h"
 	.loc 13 499 0
-	adrp	x1, .LC46
-.LBE1830:
-.LBE1829:
-.LBE1828:
-.LBE1827:
-.LBE1826:
-	.loc 1 3664 0
+	adrp	x1, .LC45
+.LBE1888:
+.LBE1887:
+.LBE1886:
+.LBE1885:
+.LBE1884:
+	.loc 1 3676 0
 	str	x22, [x20, 24]
-.LBB1906:
-.LBB1903:
-.LBB1837:
-.LBB1834:
-.LBB1831:
+.LBB1964:
+.LBB1961:
+.LBB1895:
+.LBB1892:
+.LBB1889:
 	.loc 13 499 0
 	mov	x4, 0
-.LBE1831:
-.LBE1834:
-.LBE1837:
-.LBE1903:
-.LBE1906:
-	.loc 1 3665 0
+.LBE1889:
+.LBE1892:
+.LBE1895:
+.LBE1961:
+.LBE1964:
+	.loc 1 3677 0
 	ldr	x2, [x20, 8]
-.LBB1907:
-.LBB1904:
-.LBB1838:
-.LBB1835:
-.LBB1832:
+.LBB1965:
+.LBB1962:
+.LBB1896:
+.LBB1893:
+.LBB1890:
 	.loc 13 499 0
-	add	x1, x1, :lo12:.LC46
-.LBE1832:
-.LBE1835:
-.LBE1838:
-.LBE1904:
-.LBE1907:
-	.loc 1 3666 0
+	add	x1, x1, :lo12:.LC45
+.LBE1890:
+.LBE1893:
+.LBE1896:
+.LBE1962:
+.LBE1965:
+	.loc 1 3678 0
 	stp	x2, x0, [x21, 8]
-.LBB1908:
-.LBB1905:
-.LBB1839:
-.LBB1836:
-.LBB1833:
+.LBB1966:
+.LBB1963:
+.LBB1897:
+.LBB1894:
+.LBB1891:
 	.loc 13 499 0
 	mov	x3, 1
 	ldr	x0, [x22, 752]
 	add	x2, x20, 100
 	bl	of_property_read_variable_u32_array
-.LVL1043:
+.LVL1033:
 	.loc 13 501 0
-	tbnz	w0, #31, .L1004
-.LBE1833:
-.LBE1836:
-.LBE1839:
-.LBB1840:
-.LBB1841:
-.LBB1842:
+	tbnz	w0, #31, .L1009
+.LBE1891:
+.LBE1894:
+.LBE1897:
+.LBB1898:
+.LBB1899:
+.LBB1900:
 	.loc 13 499 0
 	ldr	x0, [x22, 752]
 	adrp	x1, .LC79
@@ -10508,15 +10596,15 @@
 	add	x2, x20, 104
 	add	x1, x1, :lo12:.LC79
 	bl	of_property_read_variable_u32_array
-.LVL1044:
+.LVL1034:
 	.loc 13 501 0
-	tbnz	w0, #31, .L1004
-.LBE1842:
-.LBE1841:
-.LBE1840:
-.LBB1843:
-.LBB1844:
-.LBB1845:
+	tbnz	w0, #31, .L1009
+.LBE1900:
+.LBE1899:
+.LBE1898:
+.LBB1901:
+.LBB1902:
+.LBB1903:
 	.loc 13 499 0
 	ldr	x0, [x22, 752]
 	adrp	x1, .LC80
@@ -10525,15 +10613,15 @@
 	add	x2, x20, 108
 	add	x1, x1, :lo12:.LC80
 	bl	of_property_read_variable_u32_array
-.LVL1045:
+.LVL1035:
 	.loc 13 501 0
-	tbnz	w0, #31, .L1004
-.LBE1845:
-.LBE1844:
-.LBE1843:
-.LBB1846:
-.LBB1847:
-.LBB1848:
+	tbnz	w0, #31, .L1009
+.LBE1903:
+.LBE1902:
+.LBE1901:
+.LBB1904:
+.LBB1905:
+.LBB1906:
 	.loc 13 499 0
 	ldr	x0, [x22, 752]
 	adrp	x1, .LC81
@@ -10542,15 +10630,15 @@
 	add	x2, x20, 112
 	add	x1, x1, :lo12:.LC81
 	bl	of_property_read_variable_u32_array
-.LVL1046:
+.LVL1036:
 	.loc 13 501 0
-	tbnz	w0, #31, .L1004
-.LBE1848:
-.LBE1847:
-.LBE1846:
-.LBB1849:
-.LBB1850:
-.LBB1851:
+	tbnz	w0, #31, .L1009
+.LBE1906:
+.LBE1905:
+.LBE1904:
+.LBB1907:
+.LBB1908:
+.LBB1909:
 	.loc 13 499 0
 	ldr	x0, [x22, 752]
 	adrp	x1, .LC82
@@ -10559,15 +10647,15 @@
 	add	x2, x20, 128
 	add	x1, x1, :lo12:.LC82
 	bl	of_property_read_variable_u32_array
-.LVL1047:
+.LVL1037:
 	.loc 13 501 0
-	tbnz	w0, #31, .L1004
-.LBE1851:
-.LBE1850:
-.LBE1849:
-.LBB1852:
-.LBB1853:
-.LBB1854:
+	tbnz	w0, #31, .L1009
+.LBE1909:
+.LBE1908:
+.LBE1907:
+.LBB1910:
+.LBB1911:
+.LBB1912:
 	.loc 13 499 0
 	ldr	x0, [x22, 752]
 	adrp	x1, .LC83
@@ -10576,15 +10664,15 @@
 	add	x2, x20, 132
 	add	x1, x1, :lo12:.LC83
 	bl	of_property_read_variable_u32_array
-.LVL1048:
+.LVL1038:
 	.loc 13 501 0
-	tbnz	w0, #31, .L1004
-.LBE1854:
-.LBE1853:
-.LBE1852:
-.LBB1855:
-.LBB1856:
-.LBB1857:
+	tbnz	w0, #31, .L1009
+.LBE1912:
+.LBE1911:
+.LBE1910:
+.LBB1913:
+.LBB1914:
+.LBB1915:
 	.loc 13 499 0
 	ldr	x0, [x22, 752]
 	adrp	x1, .LC84
@@ -10593,15 +10681,15 @@
 	add	x2, x20, 136
 	add	x1, x1, :lo12:.LC84
 	bl	of_property_read_variable_u32_array
-.LVL1049:
+.LVL1039:
 	.loc 13 501 0
-	tbnz	w0, #31, .L1004
-.LBE1857:
-.LBE1856:
-.LBE1855:
-.LBB1858:
-.LBB1859:
-.LBB1860:
+	tbnz	w0, #31, .L1009
+.LBE1915:
+.LBE1914:
+.LBE1913:
+.LBB1916:
+.LBB1917:
+.LBB1918:
 	.loc 13 499 0
 	ldr	x0, [x22, 752]
 	adrp	x1, .LC85
@@ -10610,15 +10698,15 @@
 	add	x2, x20, 140
 	add	x1, x1, :lo12:.LC85
 	bl	of_property_read_variable_u32_array
-.LVL1050:
+.LVL1040:
 	.loc 13 501 0
-	tbnz	w0, #31, .L1004
-.LBE1860:
-.LBE1859:
-.LBE1858:
-.LBB1861:
-.LBB1862:
-.LBB1863:
+	tbnz	w0, #31, .L1009
+.LBE1918:
+.LBE1917:
+.LBE1916:
+.LBB1919:
+.LBB1920:
+.LBB1921:
 	.loc 13 499 0
 	ldr	x0, [x22, 752]
 	adrp	x1, .LC86
@@ -10627,15 +10715,15 @@
 	add	x2, x20, 144
 	add	x1, x1, :lo12:.LC86
 	bl	of_property_read_variable_u32_array
-.LVL1051:
+.LVL1041:
 	.loc 13 501 0
-	tbnz	w0, #31, .L1004
-.LBE1863:
-.LBE1862:
-.LBE1861:
-.LBB1864:
-.LBB1865:
-.LBB1866:
+	tbnz	w0, #31, .L1009
+.LBE1921:
+.LBE1920:
+.LBE1919:
+.LBB1922:
+.LBB1923:
+.LBB1924:
 	.loc 13 499 0
 	ldr	x0, [x22, 752]
 	adrp	x1, .LC87
@@ -10644,15 +10732,15 @@
 	add	x2, x20, 148
 	add	x1, x1, :lo12:.LC87
 	bl	of_property_read_variable_u32_array
-.LVL1052:
+.LVL1042:
 	.loc 13 501 0
-	tbnz	w0, #31, .L1004
-.LBE1866:
-.LBE1865:
-.LBE1864:
-.LBB1867:
-.LBB1868:
-.LBB1869:
+	tbnz	w0, #31, .L1009
+.LBE1924:
+.LBE1923:
+.LBE1922:
+.LBB1925:
+.LBB1926:
+.LBB1927:
 	.loc 13 499 0
 	ldr	x0, [x22, 752]
 	adrp	x1, .LC88
@@ -10661,15 +10749,15 @@
 	add	x2, x20, 152
 	add	x1, x1, :lo12:.LC88
 	bl	of_property_read_variable_u32_array
-.LVL1053:
+.LVL1043:
 	.loc 13 501 0
-	tbnz	w0, #31, .L1004
-.LBE1869:
-.LBE1868:
-.LBE1867:
-.LBB1870:
-.LBB1871:
-.LBB1872:
+	tbnz	w0, #31, .L1009
+.LBE1927:
+.LBE1926:
+.LBE1925:
+.LBB1928:
+.LBB1929:
+.LBB1930:
 	.loc 13 499 0
 	ldr	x0, [x22, 752]
 	adrp	x1, .LC89
@@ -10678,15 +10766,15 @@
 	add	x2, x20, 156
 	add	x1, x1, :lo12:.LC89
 	bl	of_property_read_variable_u32_array
-.LVL1054:
+.LVL1044:
 	.loc 13 501 0
-	tbnz	w0, #31, .L1004
-.LBE1872:
-.LBE1871:
-.LBE1870:
-.LBB1873:
-.LBB1874:
-.LBB1875:
+	tbnz	w0, #31, .L1009
+.LBE1930:
+.LBE1929:
+.LBE1928:
+.LBB1931:
+.LBB1932:
+.LBB1933:
 	.loc 13 499 0
 	ldr	x0, [x22, 752]
 	adrp	x1, .LC90
@@ -10695,15 +10783,15 @@
 	add	x2, x20, 160
 	add	x1, x1, :lo12:.LC90
 	bl	of_property_read_variable_u32_array
-.LVL1055:
+.LVL1045:
 	.loc 13 501 0
-	tbnz	w0, #31, .L1004
-.LBE1875:
-.LBE1874:
-.LBE1873:
-.LBB1876:
-.LBB1877:
-.LBB1878:
+	tbnz	w0, #31, .L1009
+.LBE1933:
+.LBE1932:
+.LBE1931:
+.LBB1934:
+.LBB1935:
+.LBB1936:
 	.loc 13 499 0
 	ldr	x0, [x22, 752]
 	adrp	x1, .LC91
@@ -10712,15 +10800,15 @@
 	add	x2, x20, 164
 	add	x1, x1, :lo12:.LC91
 	bl	of_property_read_variable_u32_array
-.LVL1056:
+.LVL1046:
 	.loc 13 501 0
-	tbnz	w0, #31, .L1004
-.LBE1878:
-.LBE1877:
-.LBE1876:
-.LBB1879:
-.LBB1880:
-.LBB1881:
+	tbnz	w0, #31, .L1009
+.LBE1936:
+.LBE1935:
+.LBE1934:
+.LBB1937:
+.LBB1938:
+.LBB1939:
 	.loc 13 499 0
 	ldr	x0, [x22, 752]
 	adrp	x1, .LC92
@@ -10729,15 +10817,15 @@
 	add	x2, x20, 168
 	add	x1, x1, :lo12:.LC92
 	bl	of_property_read_variable_u32_array
-.LVL1057:
+.LVL1047:
 	.loc 13 501 0
-	tbnz	w0, #31, .L1004
-.LBE1881:
-.LBE1880:
-.LBE1879:
-.LBB1882:
-.LBB1883:
-.LBB1884:
+	tbnz	w0, #31, .L1009
+.LBE1939:
+.LBE1938:
+.LBE1937:
+.LBB1940:
+.LBB1941:
+.LBB1942:
 	.loc 13 499 0
 	ldr	x0, [x22, 752]
 	adrp	x1, .LC93
@@ -10746,463 +10834,448 @@
 	add	x2, x20, 172
 	add	x1, x1, :lo12:.LC93
 	bl	of_property_read_variable_u32_array
-.LVL1058:
+.LVL1048:
 	.loc 13 501 0
-	tbz	w0, #31, .L1033
-.LBE1884:
-.LBE1883:
-.LBE1882:
-	.loc 1 2900 0
+	tbz	w0, #31, .L1039
+.LBE1942:
+.LBE1941:
+.LBE1940:
+	.loc 1 2903 0
 	str	wzr, [x21, 148]
-.L1033:
-.LBB1885:
-.LBB1886:
-.LBB1887:
+.L1039:
+.LBB1943:
+.LBB1944:
+.LBB1945:
+	.loc 13 499 0
+	ldr	x0, [x22, 752]
+	adrp	x1, .LC46
+	mov	x4, 0
+	mov	x3, 1
+	add	x2, x20, 176
+	add	x1, x1, :lo12:.LC46
+	bl	of_property_read_variable_u32_array
+.LVL1049:
+	.loc 13 501 0
+	tbz	w0, #31, .L1040
+.LBE1945:
+.LBE1944:
+.LBE1943:
+	.loc 1 2906 0
+	str	wzr, [x21, 152]
+.L1040:
+.LBB1946:
+.LBB1947:
+.LBB1948:
 	.loc 13 499 0
 	ldr	x0, [x22, 752]
 	adrp	x1, .LC47
 	mov	x4, 0
 	mov	x3, 1
-	add	x2, x20, 176
+	add	x2, x20, 180
 	add	x1, x1, :lo12:.LC47
 	bl	of_property_read_variable_u32_array
-.LVL1059:
+.LVL1050:
 	.loc 13 501 0
-	tbz	w0, #31, .L1034
-.LBE1887:
-.LBE1886:
-.LBE1885:
-	.loc 1 2903 0
-	str	wzr, [x21, 152]
-.L1034:
-.LBB1888:
-.LBB1889:
-.LBB1890:
+	tbz	w0, #31, .L1041
+.LBE1948:
+.LBE1947:
+.LBE1946:
+	.loc 1 2909 0
+	str	wzr, [x21, 156]
+.L1041:
+.LBB1949:
+.LBB1950:
+.LBB1951:
 	.loc 13 499 0
 	ldr	x0, [x22, 752]
 	adrp	x1, .LC48
 	mov	x4, 0
 	mov	x3, 1
-	add	x2, x20, 180
+	add	x2, x20, 116
 	add	x1, x1, :lo12:.LC48
 	bl	of_property_read_variable_u32_array
-.LVL1060:
+.LVL1051:
 	.loc 13 501 0
-	tbz	w0, #31, .L1035
-.LBE1890:
-.LBE1889:
-.LBE1888:
-	.loc 1 2906 0
-	str	wzr, [x21, 156]
-.L1035:
-.LBB1891:
-.LBB1892:
-.LBB1893:
+	tbz	w0, #31, .L1042
+.LBE1951:
+.LBE1950:
+.LBE1949:
+	.loc 1 2912 0
+	str	wzr, [x21, 92]
+.L1042:
+.LBB1952:
+.LBB1953:
+.LBB1954:
 	.loc 13 499 0
 	ldr	x0, [x22, 752]
 	adrp	x1, .LC49
 	mov	x4, 0
 	mov	x3, 1
-	add	x2, x20, 116
+	add	x2, x20, 120
 	add	x1, x1, :lo12:.LC49
 	bl	of_property_read_variable_u32_array
-.LVL1061:
+.LVL1052:
 	.loc 13 501 0
-	tbz	w0, #31, .L1036
-.LBE1893:
-.LBE1892:
-.LBE1891:
-	.loc 1 2909 0
-	str	wzr, [x21, 92]
-.L1036:
-.LBB1894:
-.LBB1895:
-.LBB1896:
+	tbz	w0, #31, .L1043
+.LBE1954:
+.LBE1953:
+.LBE1952:
+	.loc 1 2915 0
+	str	wzr, [x21, 96]
+.L1043:
+.LBB1955:
+.LBB1956:
+.LBB1957:
 	.loc 13 499 0
 	ldr	x0, [x22, 752]
 	adrp	x1, .LC50
 	mov	x4, 0
 	mov	x3, 1
-	add	x2, x20, 120
+	add	x2, x20, 184
 	add	x1, x1, :lo12:.LC50
 	bl	of_property_read_variable_u32_array
-.LVL1062:
+.LVL1053:
 	.loc 13 501 0
-	tbz	w0, #31, .L1037
-.LBE1896:
-.LBE1895:
-.LBE1894:
-	.loc 1 2912 0
-	str	wzr, [x21, 96]
-.L1037:
-.LBB1897:
-.LBB1898:
-.LBB1899:
+	tbz	w0, #31, .L1044
+.LBE1957:
+.LBE1956:
+.LBE1955:
+	.loc 1 2918 0
+	str	wzr, [x21, 160]
+.L1044:
+.LBB1958:
+.LBB1959:
+.LBB1960:
 	.loc 13 499 0
 	ldr	x0, [x22, 752]
 	adrp	x1, .LC51
 	mov	x4, 0
 	mov	x3, 1
-	add	x2, x20, 184
+	add	x2, x20, 188
 	add	x1, x1, :lo12:.LC51
 	bl	of_property_read_variable_u32_array
-.LVL1063:
+.LVL1054:
 	.loc 13 501 0
-	tbz	w0, #31, .L1038
-.LBE1899:
-.LBE1898:
-.LBE1897:
-	.loc 1 2915 0
-	str	wzr, [x21, 160]
-.L1038:
-.LBB1900:
-.LBB1901:
-.LBB1902:
-	.loc 13 499 0
-	ldr	x0, [x22, 752]
-	adrp	x1, .LC52
-	mov	x4, 0
-	mov	x3, 1
-	add	x2, x20, 188
-	add	x1, x1, :lo12:.LC52
-	bl	of_property_read_variable_u32_array
-.LVL1064:
-	.loc 13 501 0
-	tbz	w0, #31, .L1039
-.LBE1902:
-.LBE1901:
-.LBE1900:
-	.loc 1 2918 0
+	tbz	w0, #31, .L1045
+.LBE1960:
+.LBE1959:
+.LBE1958:
+	.loc 1 2921 0
 	str	wzr, [x21, 164]
-.L1039:
-.LBE1905:
-.LBE1908:
-	.loc 1 3674 0
+.L1045:
+.LBE1963:
+.LBE1966:
+	.loc 1 3686 0
 	ldr	w0, [x21, 88]
-.LBB1909:
-.LBB1910:
-	.loc 1 3373 0
-	mov	w2, 0
-.LBE1910:
-.LBE1909:
-	.loc 1 3674 0
 	str	w0, [x19, 92]
-	.loc 1 3675 0
+	.loc 1 3687 0
 	ldr	w1, [x21, 84]
 	str	w1, [x19, 96]
-	.loc 1 3676 0
+	.loc 1 3688 0
 	mul	w0, w0, w1
-.LBB1922:
-.LBB1915:
-	.loc 1 3373 0
-	adrp	x1, .LC53
-	add	x1, x1, :lo12:.LC53
-.LBE1915:
-.LBE1922:
-	.loc 1 3676 0
-	lsr	w3, w0, 1
-	.loc 1 3677 0
+	lsr	w1, w0, 1
+	.loc 1 3689 0
 	lsr	w0, w0, 2
-	stp	w3, w0, [x19, 28]
-.LBB1923:
-.LBB1916:
-	.loc 1 3363 0
+	stp	w1, w0, [x19, 28]
+.LBB1967:
+.LBB1968:
+	.loc 1 3380 0
+	cmp	w1, 5242880
+	.loc 1 3371 0
 	ldr	x26, [x20]
-.LVL1065:
-	.loc 1 3373 0
+.LVL1055:
+	.loc 1 3380 0
+	bhi	.L1089
+	.loc 1 3386 0
 	ldr	x0, [x26, 752]
+	adrp	x1, .LC53
+	mov	w2, 0
+	add	x1, x1, :lo12:.LC53
 	bl	of_parse_phandle
-.LVL1066:
-	.loc 1 3374 0
-	cbz	x0, .L1046
-	.loc 1 3377 0
+.LVL1056:
+	.loc 1 3387 0
+	cbz	x0, .L1052
+	.loc 1 3390 0
 	add	x2, x29, 104
 	mov	w1, 0
 	bl	of_address_to_resource
-.LVL1067:
+.LVL1057:
 	mov	w25, w0
-	.loc 1 3379 0
-	cbnz	w0, .L1083
-.LBB1911:
-.LBB1912:
+	.loc 1 3392 0
+	cbnz	w0, .L1090
+.LBB1969:
+.LBB1970:
 	.file 14 "./include/linux/ioport.h"
 	.loc 14 204 0
 	ldp	x1, x2, [x29, 104]
-.LBE1912:
-.LBE1911:
-	.loc 1 3384 0
+.LBE1970:
+.LBE1969:
+	.loc 1 3397 0
 	str	x1, [x20, 192]
-	.loc 1 3386 0
-	mov	w0, 50331647
-.LBB1914:
-.LBB1913:
+	.loc 1 3399 0
+	mov	w0, 53477375
+.LBB1972:
+.LBB1971:
 	.loc 14 204 0
 	add	x2, x2, 1
 	sub	x2, x2, x1
-.LBE1913:
-.LBE1914:
-	.loc 1 3385 0
+.LBE1971:
+.LBE1972:
+	.loc 1 3398 0
 	str	w2, [x19, 24]
-	.loc 1 3386 0
+	.loc 1 3399 0
 	cmp	w2, w0
-	ble	.L1084
-	.loc 1 3390 0
+	ble	.L1091
+	.loc 1 3403 0
 	sxtw	x2, w2
 	mov	x3, 1
 	mov	x0, x26
 	bl	devm_memremap
-.LVL1068:
+.LVL1058:
 	str	x0, [x19, 8]
-	.loc 1 3392 0
-	cbz	x0, .L1085
-	.loc 1 3401 0
+	.loc 1 3405 0
+	cbz	x0, .L1092
+	.loc 1 3414 0
 	mov	x1, x0
 	ldr	w2, [x19, 24]
 	ldr	x0, [x20, 192]
 	mov	w4, 4
-	mov	w3, 4194304
+	mov	w3, 5242880
 	bl	ebc_buf_init
-.LVL1069:
-	.loc 1 3402 0
-	cbnz	w0, .L1047
-	.loc 1 3405 0
+.LVL1059:
+	.loc 1 3415 0
+	cbnz	w0, .L1053
+	.loc 1 3418 0
 	ldr	x1, [x19, 8]
-	mov	x0, 16777216
-	.loc 1 3410 0
+	mov	x0, 20971520
+	.loc 1 3423 0
 	mov	x4, 2097152
-	.loc 1 3409 0
-	mov	x2, 20971520
-	.loc 1 3405 0
+	.loc 1 3422 0
+	mov	x2, 26214400
+	.loc 1 3418 0
 	add	x0, x1, x0
 	str	x0, [x19, 16]
-	.loc 1 3410 0
+	.loc 1 3423 0
 	str	x4, [x21, 40]
-	.loc 1 3409 0
+	.loc 1 3422 0
 	add	x6, x1, x2
 	str	x6, [x21, 24]
-	mov	x5, 23068672
+	mov	x5, 28311552
 	add	x3, x1, x5
-	.loc 1 3411 0
+	.loc 1 3424 0
 	ldr	x0, [x20, 192]
 	add	x2, x0, x2
 	str	x2, [x21, 32]
-	.loc 1 3412 0
-	str	x6, [x19, 192]
-	.loc 1 3411 0
+	.loc 1 3425 0
+	str	x6, [x19, 184]
+	.loc 1 3424 0
 	add	x0, x0, x5
-	.loc 1 3410 0
+	.loc 1 3423 0
 	str	x4, [x21, 64]
-	.loc 1 3417 0
-	mov	x2, 29360128
-	.loc 1 3411 0
+	.loc 1 3430 0
+	mov	x2, 35651584
+	.loc 1 3424 0
 	stp	x3, x0, [x21, 48]
-	.loc 1 3417 0
+	.loc 1 3430 0
 	add	x2, x1, x2
-	.loc 1 3416 0
-	mov	x0, 25165824
+	.loc 1 3429 0
+	mov	x0, 30408704
 	add	x0, x1, x0
-	.loc 1 3417 0
+	.loc 1 3430 0
 	stp	x0, x2, [x19, 152]
-	.loc 1 3421 0
-	mov	x2, 37748736
-	add	x2, x1, x2
-	.loc 1 3418 0
-	mov	x0, 33554432
+	.loc 1 3433 0
+	mov	x0, 40894464
+	.loc 1 3437 0
+	mov	x2, 51380224
+	.loc 1 3433 0
 	add	x0, x1, x0
-	.loc 1 3421 0
-	stp	x0, x2, [x19, 168]
-	.loc 1 3425 0
-	mov	x2, 48234496
+	.loc 1 3437 0
 	add	x2, x1, x2
-	.loc 1 3412 0
-	str	x3, [x19, 200]
-	.loc 1 3422 0
-	mov	x0, 42991616
 	.loc 1 3425 0
+	str	x3, [x19, 192]
+	.loc 1 3437 0
 	str	x2, [x19, 128]
-	.loc 1 3422 0
+	.loc 1 3438 0
+	mov	x2, 52428800
+	.loc 1 3433 0
+	str	x0, [x19, 168]
+	.loc 1 3434 0
+	mov	x0, 46137344
 	add	x0, x1, x0
-	.loc 1 3426 0
-	mov	x2, 49283072
-	.loc 1 3422 0
-	str	x0, [x19, 184]
-	.loc 1 3426 0
+	.loc 1 3438 0
 	add	x1, x1, x2
+	.loc 1 3434 0
+	str	x0, [x19, 176]
+	.loc 1 3438 0
 	str	x1, [x19, 136]
-	.loc 1 3428 0
+	.loc 1 3440 0
 	ldp	w2, w1, [x21, 84]
 	mul	w2, w2, w1
 	mov	w1, 0
 	bl	memset
-.LVL1070:
-	.loc 1 3429 0
+.LVL1060:
+	.loc 1 3441 0
 	ldp	w3, w2, [x21, 84]
 	mov	w1, 0
-	ldr	x0, [x19, 176]
+	ldr	x0, [x19, 168]
 	mul	w2, w3, w2
 	bl	memset
-.LVL1071:
-	.loc 1 3430 0
-	ldrsw	x2, [x19, 28]
-	mov	w1, 255
-	ldr	x0, [x19, 168]
-	bl	memset
-.LVL1072:
-.LBE1916:
-.LBE1923:
-.LBB1924:
-.LBB1925:
-	.loc 1 3320 0
+.LVL1061:
+.LBE1968:
+.LBE1967:
+.LBB1979:
+.LBB1980:
+	.loc 1 3328 0
 	ldr	x26, [x19, 104]
-.LVL1073:
-	.loc 1 3326 0
+.LVL1062:
+	.loc 1 3334 0
 	adrp	x1, .LC57
 	mov	w2, 0
 	add	x1, x1, :lo12:.LC57
 	ldr	x0, [x26, 752]
 	bl	of_parse_phandle
-.LVL1074:
-	.loc 1 3327 0
-	cbz	x0, .L1048
-	.loc 1 3330 0
+.LVL1063:
+	.loc 1 3335 0
+	cbz	x0, .L1054
+	.loc 1 3338 0
 	add	x2, x29, 104
 	mov	w1, 0
 	bl	of_address_to_resource
-.LVL1075:
+.LVL1064:
 	mov	w25, w0
-	.loc 1 3332 0
-	cbz	w0, .L1086
-.L1015:
-.LBE1925:
-.LBE1924:
-	.loc 1 3689 0
+	.loc 1 3340 0
+	cbz	w0, .L1093
+.L1021:
+.LBE1980:
+.LBE1979:
+	.loc 1 3701 0
 	adrp	x1, .LC95
 	mov	x0, x22
 	add	x1, x1, :lo12:.LC95
 	bl	_dev_err
-.LVL1076:
-	.loc 1 3690 0
-	b	.L990
-.LVL1077:
+.LVL1065:
+	.loc 1 3702 0
+	b	.L995
+.LVL1066:
 	.p2align 3
-.L1004:
-	.loc 1 3672 0
+.L1009:
+	.loc 1 3684 0
 	mov	w25, -22
-	.loc 1 3671 0
+	.loc 1 3683 0
 	adrp	x1, .LC99
 	mov	w2, w25
 	add	x1, x1, :lo12:.LC99
 	mov	x0, x22
 	bl	_dev_err
-.LVL1078:
-	.loc 1 3672 0
-	b	.L990
-.LVL1079:
+.LVL1067:
+	.loc 1 3684 0
+	b	.L995
+.LVL1068:
 	.p2align 3
-.L1080:
-	.loc 1 3645 0
-	adrp	x1, .LC43
-	mov	x0, x22
-.LVL1080:
-	add	x1, x1, :lo12:.LC43
-	.loc 1 3646 0
-	mov	w25, -19
-	.loc 1 3645 0
-	bl	_dev_err
-.LVL1081:
-	.loc 1 3646 0
-	b	.L990
-.LVL1082:
-	.p2align 3
-.L1002:
-	.loc 1 3657 0
-	adrp	x1, .LC45
-	mov	x0, x22
-	add	x1, x1, :lo12:.LC45
-	.loc 1 3658 0
-	mov	w25, -517
-	.loc 1 3657 0
-	bl	_dev_err
-.LVL1083:
-	.loc 1 3658 0
-	b	.L990
-.LVL1084:
 .L1086:
-.LBB1934:
-.LBB1930:
-	.loc 1 3341 0
+	.loc 1 3657 0
+	adrp	x1, .LC42
+	mov	x0, x22
+.LVL1069:
+	add	x1, x1, :lo12:.LC42
+	.loc 1 3658 0
+	mov	w25, -19
+	.loc 1 3657 0
+	bl	_dev_err
+.LVL1070:
+	.loc 1 3658 0
+	b	.L995
+.LVL1071:
+	.p2align 3
+.L1007:
+	.loc 1 3669 0
+	adrp	x1, .LC44
+	mov	x0, x22
+	add	x1, x1, :lo12:.LC44
+	.loc 1 3670 0
+	mov	w25, -517
+	.loc 1 3669 0
+	bl	_dev_err
+.LVL1072:
+	.loc 1 3670 0
+	b	.L995
+.LVL1073:
+.L1093:
+.LBB1989:
+.LBB1985:
+	.loc 1 3349 0
 	mov	x0, x26
 	mov	x3, 1
-.LBB1926:
-.LBB1927:
+.LBB1981:
+.LBB1982:
 	.loc 14 204 0
 	ldp	x1, x26, [x29, 104]
-.LVL1085:
-.LBE1927:
-.LBE1926:
-	.loc 1 3338 0
+.LVL1074:
+.LBE1982:
+.LBE1981:
+	.loc 1 3346 0
 	str	x1, [x19, 40]
-.LBB1929:
-.LBB1928:
+.LBB1984:
+.LBB1983:
 	.loc 14 204 0
 	add	x26, x26, 1
 	sub	x26, x26, x1
-.LBE1928:
-.LBE1929:
-	.loc 1 3339 0
+.LBE1983:
+.LBE1984:
+	.loc 1 3347 0
 	str	w26, [x19, 48]
-	.loc 1 3341 0
+	.loc 1 3349 0
 	sxtw	x2, w26
 	bl	devm_memremap
-.LVL1086:
-	str	x0, [x19, 216]
-	.loc 1 3343 0
-	cbz	x0, .L1087
-	.loc 1 3348 0
+.LVL1075:
+	str	x0, [x19, 208]
+	.loc 1 3351 0
+	cbz	x0, .L1094
+	.loc 1 3356 0
 	bl	epd_lut_from_mem_init
-.LVL1087:
-	.loc 1 3349 0
-	tbnz	w0, #31, .L1088
-.L1017:
-.LBE1930:
-.LBE1934:
-.LBB1935:
-.LBB1936:
-	.loc 1 3439 0
+.LVL1076:
+	.loc 1 3357 0
+	tbnz	w0, #31, .L1095
+.L1023:
+.LBE1985:
+.LBE1989:
+.LBB1990:
+.LBB1991:
+	.loc 1 3450 0
 	add	x24, x24, :lo12:.LANCHOR0
-	.loc 1 3437 0
+	.loc 1 3448 0
 	mov	w26, 99
-	.loc 1 3439 0
+	.loc 1 3450 0
 	adrp	x3, .LC96
 	adrp	x0, ebc_auto_tast_function
 	add	x3, x3, :lo12:.LC96
 	add	x0, x0, :lo12:ebc_auto_tast_function
 	mov	w2, -1
 	mov	x1, x19
-	.loc 1 3437 0
+	.loc 1 3448 0
 	str	w26, [x29, 104]
-	.loc 1 3439 0
+	.loc 1 3450 0
 	bl	kthread_create_on_node
-.LVL1088:
+.LVL1077:
 	str	x0, [x24, 8]
-	.loc 1 3440 0
+	.loc 1 3451 0
 	cmn	x0, #4096
-	bhi	.L1089
-	.loc 1 3444 0
+	bhi	.L1096
+	.loc 1 3455 0
 	add	x2, x29, 104
 	mov	w1, 1
 	bl	sched_setscheduler_nocheck
-.LVL1089:
-	.loc 1 3445 0
+.LVL1078:
+	.loc 1 3456 0
 	ldr	x2, [x24, 8]
-.LBB1937:
-.LBB1938:
+.LBB1992:
+.LBB1993:
 	.file 15 "./arch/arm64/include/asm/atomic_lse.h"
 	.loc 15 47 0
 	mov	w0, 1
-.LVL1090:
+.LVL1079:
 	add	x1, x2, 48
-.LVL1091:
+.LVL1080:
 #APP
 // 47 "./arch/arm64/include/asm/atomic_lse.h" 1
 	.arch_extension lse
@@ -11230,38 +11303,38 @@
 .endif
 
 // 0 "" 2
-.LVL1092:
+.LVL1081:
 #NO_APP
-.LBE1938:
-.LBE1937:
-	.loc 1 3448 0
+.LBE1993:
+.LBE1992:
+	.loc 1 3459 0
 	adrp	x3, .LC62
 	adrp	x0, ebc_auto_assist_tast_function
-.LVL1093:
+.LVL1082:
 	add	x3, x3, :lo12:.LC62
 	add	x0, x0, :lo12:ebc_auto_assist_tast_function
 	mov	w2, -1
 	mov	x1, x19
 	bl	kthread_create_on_node
-.LVL1094:
+.LVL1083:
 	str	x0, [x24, 16]
-	.loc 1 3449 0
+	.loc 1 3460 0
 	cmn	x0, #4096
-	bhi	.L1090
-	.loc 1 3453 0
+	bhi	.L1097
+	.loc 1 3464 0
 	add	x2, x29, 104
 	mov	w1, 1
 	bl	sched_setscheduler_nocheck
-.LVL1095:
-	.loc 1 3454 0
+.LVL1084:
+	.loc 1 3465 0
 	ldr	x2, [x24, 16]
-.LBB1939:
-.LBB1940:
+.LBB1994:
+.LBB1995:
 	.loc 15 47 0
 	mov	w0, 1
-.LVL1096:
+.LVL1085:
 	add	x1, x2, 48
-.LVL1097:
+.LVL1086:
 #APP
 // 47 "./arch/arm64/include/asm/atomic_lse.h" 1
 	.arch_extension lse
@@ -11289,21 +11362,21 @@
 .endif
 
 // 0 "" 2
-.LVL1098:
+.LVL1087:
 #NO_APP
-.LBE1940:
-.LBE1939:
-	.loc 1 3455 0
+.LBE1995:
+.LBE1994:
+	.loc 1 3466 0
 	ldr	x0, [x19, 104]
-.LVL1099:
+.LVL1088:
 	adrp	x1, .LC64
 	add	x1, x1, :lo12:.LC64
 	bl	_dev_info
-.LVL1100:
-	.loc 1 3458 0
+.LVL1089:
+	.loc 1 3469 0
 	str	w26, [x29, 104]
-.LBB1941:
-	.loc 1 3459 0
+.LBB1996:
+	.loc 1 3470 0
 	adrp	x3, .LC65
 	adrp	x0, ebc_thread
 	add	x3, x3, :lo12:.LC65
@@ -11311,30 +11384,30 @@
 	mov	w2, -1
 	mov	x1, x19
 	bl	kthread_create_on_node
-.LVL1101:
+.LVL1090:
 	mov	x26, x0
-.LVL1102:
+.LVL1091:
 	cmn	x0, #4096
-	bhi	.L1020
+	bhi	.L1026
 	bl	wake_up_process
-.LVL1103:
-.LBE1941:
+.LVL1092:
+.LBE1996:
 	str	x26, [x24, 24]
-	.loc 1 3464 0
+	.loc 1 3475 0
 	add	x2, x29, 104
 	mov	x0, x26
 	mov	w1, 1
 	bl	sched_setscheduler_nocheck
-.LVL1104:
-	.loc 1 3465 0
+.LVL1093:
+	.loc 1 3476 0
 	ldr	x2, [x24, 24]
-.LBB1942:
-.LBB1943:
+.LBB1997:
+.LBB1998:
 	.loc 15 47 0
 	mov	w0, 1
-.LVL1105:
+.LVL1094:
 	add	x1, x2, 48
-.LVL1106:
+.LVL1095:
 #APP
 // 47 "./arch/arm64/include/asm/atomic_lse.h" 1
 	.arch_extension lse
@@ -11362,72 +11435,62 @@
 .endif
 
 // 0 "" 2
-.LVL1107:
+.LVL1096:
 #NO_APP
-.LBE1943:
-.LBE1942:
-.LBE1936:
-.LBE1935:
-.LBB1947:
-.LBB1948:
-.LBB1949:
-.LBB1950:
-	.loc 11 39 0
-	add	x0, x20, 464
-.LVL1108:
-.LBE1950:
-.LBE1949:
-	.loc 1 3479 0
-	str	wzr, [x19, 52]
-	.loc 1 3480 0
-	str	wzr, [x19, 68]
-	.loc 1 3481 0
-	mov	w27, 1
-	.loc 1 3478 0
-	str	wzr, [x19, 100]
-	.loc 1 3474 0
+.LBE1998:
+.LBE1997:
+.LBE1991:
+.LBE1990:
+.LBB2002:
+.LBB2003:
+	.loc 1 3485 0
 	mov	w1, -1
-	.loc 1 3473 0
-	str	wzr, [x19, 208]
-	.loc 1 3492 0
-	add	x24, x20, 680
-	.loc 1 3475 0
+	.loc 1 3486 0
 	stp	w1, wzr, [x19, 84]
-.LBB1954:
-.LBB1951:
+	.loc 1 3497 0
+	add	x1, x19, 512
+.LBB2004:
+.LBB2005:
+	.loc 11 39 0
+	add	x0, x20, 448
+.LVL1097:
+.LBE2005:
+.LBE2004:
+	.loc 1 3490 0
+	str	wzr, [x19, 52]
+	.loc 1 3492 0
+	mov	w27, 1
+	.loc 1 3491 0
+	str	wzr, [x19, 68]
+	.loc 1 3504 0
+	add	x24, x20, 664
+	.loc 1 3489 0
+	str	wzr, [x19, 100]
+	.loc 1 3505 0
+	adrp	x26, jiffies
+.LVL1098:
+	.loc 1 3484 0
+	str	wzr, [x19, 200]
+	.loc 1 3505 0
+	mov	x28, 268435455
+	.loc 1 3492 0
+	stp	wzr, w27, [x19, 248]
+	.loc 1 3487 0
+	str	wzr, [x19, 584]
+	.loc 1 3488 0
+	str	wzr, [x19, 588]
+	.loc 1 3497 0
+	stp	w27, w27, [x1, 88]
+	stp	w27, wzr, [x1, 96]
+.LBB2007:
+.LBB2006:
 	.loc 11 43 0
 	adrp	x1, .LC66
-.LBE1951:
-.LBE1954:
-	.loc 1 3482 0
-	str	wzr, [x19, 260]
-.LBB1955:
-.LBB1952:
-	.loc 11 43 0
-	add	x1, x1, :lo12:.LC66
-.LBE1952:
-.LBE1955:
-	.loc 1 3481 0
-	str	w27, [x19, 264]
-	.loc 1 3493 0
-	adrp	x26, jiffies
-.LVL1109:
-	.loc 1 3476 0
-	str	wzr, [x19, 600]
-	.loc 1 3493 0
-	mov	x28, 268435455
-	.loc 1 3477 0
-	str	wzr, [x19, 604]
-	.loc 1 3483 0
-	str	w27, [x19, 616]
-	.loc 1 3484 0
-	str	w27, [x19, 620]
-	.loc 1 3485 0
-	str	w27, [x19, 624]
-.LBB1956:
-.LBB1953:
 	.loc 11 42 0
 	stp	xzr, xzr, [x0]
+	.loc 11 43 0
+	add	x1, x1, :lo12:.LC66
+	.loc 11 42 0
 	stp	xzr, xzr, [x0, 16]
 	stp	xzr, xzr, [x0, 32]
 	stp	xzr, xzr, [x0, 48]
@@ -11441,15 +11504,15 @@
 	stp	xzr, xzr, [x0, 176]
 	stp	xzr, xzr, [x0, 192]
 	.loc 11 43 0
-	str	x1, [x20, 464]
+	str	x1, [x20, 448]
 	.loc 11 45 0
 	bl	wakeup_source_add
-.LVL1110:
-.LBE1953:
-.LBE1956:
-	.loc 1 3489 0
-	str	wzr, [x19, 480]
-	.loc 1 3492 0
+.LVL1099:
+.LBE2006:
+.LBE2007:
+	.loc 1 3501 0
+	str	wzr, [x19, 464]
+	.loc 1 3504 0
 	mov	x4, 0
 	mov	x3, 0
 	mov	w2, 0
@@ -11457,17 +11520,17 @@
 	adrp	x1, ebc_frame_control_timeout
 	add	x1, x1, :lo12:ebc_frame_control_timeout
 	bl	init_timer_key
-.LVL1111:
-	.loc 1 3493 0
+.LVL1100:
+	.loc 1 3505 0
 	ldr	x1, [x26, #:lo12:jiffies]
 	mov	x0, x24
-	.loc 1 3496 0
-	add	x24, x20, 736
-	.loc 1 3493 0
+	.loc 1 3508 0
+	add	x24, x20, 720
+	.loc 1 3505 0
 	add	x1, x1, x28
 	bl	mod_timer
-.LVL1112:
-	.loc 1 3496 0
+.LVL1101:
+	.loc 1 3508 0
 	mov	x4, 0
 	mov	x3, 0
 	mov	w2, 0
@@ -11475,683 +11538,696 @@
 	adrp	x1, ebc_frame_timeout
 	add	x1, x1, :lo12:ebc_frame_timeout
 	bl	init_timer_key
-.LVL1113:
-	.loc 1 3497 0
+.LVL1102:
+	.loc 1 3509 0
 	ldr	x1, [x26, #:lo12:jiffies]
 	mov	x0, x24
 	add	x1, x1, x28
 	bl	mod_timer
-.LVL1114:
-.LBE1948:
-.LBE1947:
-.LBB1957:
-.LBB1958:
-	.loc 1 3507 0
+.LVL1103:
+.LBE2003:
+.LBE2002:
+.LBB2008:
+.LBB2009:
+	.loc 1 3519 0
 	adrp	x0, saved_command_line
 	adrp	x1, .LC67
-	.loc 1 3504 0
+	.loc 1 3516 0
 	stp	wzr, wzr, [x29, 100]
-.LVL1115:
-	.loc 1 3507 0
+.LVL1104:
+	.loc 1 3519 0
 	add	x1, x1, :lo12:.LC67
 	ldr	x24, [x0, #:lo12:saved_command_line]
 	mov	x0, x24
 	bl	strstr
-.LVL1116:
-	.loc 1 3508 0
+.LVL1105:
+	.loc 1 3520 0
 	adrp	x1, .LC68
-	.loc 1 3507 0
+	.loc 1 3519 0
 	mov	x26, x0
-.LVL1117:
-	.loc 1 3508 0
+.LVL1106:
+	.loc 1 3520 0
 	add	x1, x1, :lo12:.LC68
 	mov	x0, x24
 	bl	strstr
-.LVL1118:
+.LVL1107:
 	mov	x28, x0
-.LVL1119:
-	.loc 1 3513 0
-	cbz	x26, .L1021
-	.loc 1 3514 0
+.LVL1108:
+	.loc 1 3525 0
+	cbz	x26, .L1027
+	.loc 1 3526 0
 	add	x2, x29, 100
 	mov	x0, x26
 	adrp	x1, .LC69
 	add	x1, x1, :lo12:.LC69
 	bl	sscanf
-.LVL1120:
-	.loc 1 3515 0
+.LVL1109:
+	.loc 1 3527 0
 	ldr	w2, [x29, 100]
 	ldr	x0, [x20, 192]
 	cmp	x0, x2, uxtw
-	bls	.L1091
-.L1021:
-	.loc 1 3527 0
+	bls	.L1098
+.L1027:
+	.loc 1 3539 0
 	mov	w24, 0
-.LVL1121:
+.LVL1110:
 	mov	x26, 0
-.LVL1122:
-	.loc 1 3511 0
+.LVL1111:
+	.loc 1 3523 0
 	mov	x27, 0
-.LVL1123:
-	.loc 1 3527 0
-	cbz	x28, .L1043
-.L1042:
-	.loc 1 3528 0
+.LVL1112:
+	.loc 1 3539 0
+	cbz	x28, .L1049
+.L1048:
+	.loc 1 3540 0
 	add	x2, x29, 104
 	mov	x0, x28
 	adrp	x1, .LC72
 	add	x1, x1, :lo12:.LC72
 	bl	sscanf
-.LVL1124:
-	.loc 1 3506 0
+.LVL1113:
+	.loc 1 3518 0
 	mov	w28, 0
-.LVL1125:
-	.loc 1 3529 0
+.LVL1114:
+	.loc 1 3541 0
 	ldr	w2, [x29, 104]
-	.loc 1 3511 0
+	.loc 1 3523 0
 	mov	x27, 0
-	.loc 1 3529 0
+	.loc 1 3541 0
 	ldr	x0, [x20, 192]
 	cmp	x0, x2, uxtw
-	bls	.L1092
-.L1025:
-	.loc 1 3541 0
-	cbnz	w24, .L1024
-.LVL1126:
-.L1043:
-	.loc 1 3542 0
+	bls	.L1099
+.L1031:
+	.loc 1 3553 0
+	cbnz	w24, .L1030
+.LVL1115:
+.L1049:
+	.loc 1 3554 0
 	ldr	x0, [x19, 104]
 	adrp	x1, .LC75
 	add	x1, x1, :lo12:.LC75
 	bl	_dev_info
-.LVL1127:
-	.loc 1 3543 0
+.LVL1116:
+	.loc 1 3555 0
 	ldr	x0, [x20, 16]
 	bl	ebc_pmic_verity_vcom
-.LVL1128:
-.LBB1959:
-.LBB1960:
-	.loc 1 2821 0
+.LVL1117:
+.LBB2010:
+.LBB2011:
+	.loc 1 2824 0
 	adrp	x0, .LC76
 	add	x0, x0, :lo12:.LC76
 	bl	ebc_empty_buf_get
-.LVL1129:
+.LVL1118:
 	mov	x24, x0
-.LVL1130:
-	.loc 1 2822 0
+.LVL1119:
+	.loc 1 2825 0
 	ldp	w2, w0, [x20, 108]
 	mov	w1, 255
 	mul	w2, w2, w0
 	ldr	x0, [x24, 16]
 	lsr	w2, w2, 1
 	bl	memset
-.LVL1131:
-	.loc 1 2825 0
+.LVL1120:
+	.loc 1 2828 0
 	stp	wzr, wzr, [x24, 48]
-	.loc 1 2823 0
+	.loc 1 2826 0
 	mov	w0, 17
 	str	w0, [x24, 40]
-	.loc 1 2828 0
+	.loc 1 2831 0
 	mov	w2, 1
-	.loc 1 2829 0
+	.loc 1 2832 0
 	mov	x0, x24
-	.loc 1 2826 0
+	.loc 1 2829 0
 	ldr	w1, [x20, 108]
 	str	w1, [x24, 56]
-	.loc 1 2827 0
+	.loc 1 2830 0
 	ldr	w1, [x20, 112]
-	.loc 1 2828 0
+	.loc 1 2831 0
 	stp	w1, w2, [x24, 60]
-	.loc 1 2829 0
+	.loc 1 2832 0
 	bl	ebc_add_to_dsp_buf_list
-.LVL1132:
-.L1027:
-.LBE1960:
-.LBE1959:
-	.loc 1 3561 0
-	cbnz	w28, .L1093
-.L1029:
-	.loc 1 3575 0
+.LVL1121:
+.L1033:
+.LBE2011:
+.LBE2010:
+	.loc 1 3573 0
+	cbnz	w28, .L1100
+.L1035:
+	.loc 1 3587 0
 	ldr	w0, [x19, 100]
 	adrp	x21, .LANCHOR1
-	cbz	w0, .L1094
-.L1031:
-	.loc 1 3580 0
-	cbz	x26, .L1032
-	.loc 1 3581 0
+	cbz	w0, .L1101
+.L1037:
+	.loc 1 3592 0
+	cbz	x26, .L1038
+	.loc 1 3593 0
 	mov	x0, x26
 	bl	kfree
-.LVL1133:
-.L1032:
-	.loc 1 3582 0
-	cbz	x27, .L1023
-	.loc 1 3583 0
+.LVL1122:
+.L1038:
+	.loc 1 3594 0
+	cbz	x27, .L1029
+	.loc 1 3595 0
 	mov	x0, x27
 	bl	kfree
-.LVL1134:
-.L1023:
-.LBE1958:
-.LBE1957:
-.LBB1971:
-.LBB1972:
-.LBB1973:
+.LVL1123:
+.L1029:
+.LBE2009:
+.LBE2008:
+.LBB2021:
+.LBB2022:
+.LBB2023:
 	.loc 2 1186 0
 	str	x20, [x22, 184]
-.LBE1973:
-.LBE1972:
-.LBE1971:
-.LBB1974:
-.LBB1975:
-	.loc 1 3302 0
+.LBE2023:
+.LBE2022:
+.LBE2021:
+.LBB2024:
+.LBB2025:
+	.loc 1 3310 0
 	add	x21, x21, :lo12:.LANCHOR1
 	add	x0, x21, 224
 	bl	misc_register
-.LVL1135:
-	.loc 1 3303 0
+.LVL1124:
+	.loc 1 3311 0
 	add	x0, x21, 376
 	bl	misc_register
-.LVL1136:
-	.loc 1 3305 0
+.LVL1125:
+	.loc 1 3313 0
 	ldr	x0, [x20, 296]
 	add	x1, x21, 456
 	bl	device_create_file
-.LVL1137:
-	.loc 1 3306 0
+.LVL1126:
+	.loc 1 3314 0
 	ldr	x0, [x20, 296]
 	add	x1, x21, 488
 	bl	device_create_file
-.LVL1138:
-	.loc 1 3307 0
+.LVL1127:
+	.loc 1 3315 0
 	ldr	x0, [x20, 296]
 	add	x1, x21, 520
 	bl	device_create_file
-.LVL1139:
-	.loc 1 3308 0
+.LVL1128:
+	.loc 1 3316 0
 	ldr	x0, [x20, 296]
 	add	x1, x21, 552
 	bl	device_create_file
-.LVL1140:
-	.loc 1 3309 0
+.LVL1129:
+	.loc 1 3317 0
 	ldr	x0, [x20, 296]
 	add	x1, x21, 584
 	bl	device_create_file
-.LVL1141:
-	.loc 1 3310 0
+.LVL1130:
+	.loc 1 3318 0
 	ldr	x0, [x20, 296]
 	add	x1, x21, 616
 	bl	device_create_file
-.LVL1142:
-	.loc 1 3311 0
+.LVL1131:
+	.loc 1 3319 0
 	ldr	x0, [x20, 296]
 	add	x1, x21, 648
 	bl	device_create_file
-.LVL1143:
-	.loc 1 3312 0
+.LVL1132:
+	.loc 1 3320 0
 	ldr	x0, [x20, 296]
 	add	x1, x21, 680
 	bl	device_create_file
-.LVL1144:
-.LBE1975:
-.LBE1974:
-	.loc 1 3711 0
+.LVL1133:
+.LBE2025:
+.LBE2024:
+	.loc 1 3723 0
 	ldr	x0, [x19, 104]
-	adrp	x2, .LC27
+	adrp	x2, .LC26
 	adrp	x1, .LC78
-	add	x2, x2, :lo12:.LC27
+	add	x2, x2, :lo12:.LC26
 	add	x1, x1, :lo12:.LC78
 	bl	_dev_info
-.LVL1145:
-	.loc 1 3713 0
-	b	.L990
-.LVL1146:
-.L1083:
-.LBB1976:
-.LBB1917:
-	.loc 1 3380 0
+.LVL1134:
+	.loc 1 3725 0
+	b	.L995
+.LVL1135:
+.L1090:
+.LBB2026:
+.LBB1973:
+	.loc 1 3393 0
 	adrp	x1, .LC54
 	mov	x0, x26
 	add	x1, x1, :lo12:.LC54
 	bl	_dev_err
-.LVL1147:
-.L1011:
-.LBE1917:
-.LBE1976:
-	.loc 1 3682 0
+.LVL1136:
+.L1017:
+.LBE1973:
+.LBE2026:
+	.loc 1 3694 0
 	adrp	x1, .LC94
 	mov	x0, x22
 	add	x1, x1, :lo12:.LC94
 	bl	_dev_err
-.LVL1148:
-	.loc 1 3683 0
-	b	.L990
-.LVL1149:
-.L1094:
-.LBB1977:
-.LBB1967:
-	.loc 1 3576 0
+.LVL1137:
+	.loc 1 3695 0
+	b	.L995
+.LVL1138:
+.L1101:
+.LBB2027:
+.LBB2018:
+	.loc 1 3588 0
 	mov	w2, 1
 	str	w2, [x19, 100]
-	.loc 1 3577 0
+	.loc 1 3589 0
 	add	x0, x21, :lo12:.LANCHOR1
 	mov	w1, w2
 	add	x0, x0, 304
 	bl	__wake_up_sync
-.LVL1150:
-	b	.L1031
-.LVL1151:
-.L1092:
-	.loc 1 3531 0
+.LVL1139:
+	b	.L1037
+.LVL1140:
+.L1098:
+	.loc 1 3529 0
 	ldr	x0, [x19, 104]
-	adrp	x1, .LC73
-	add	x1, x1, :lo12:.LC73
+	adrp	x1, .LC70
+	add	x1, x1, :lo12:.LC70
 	bl	_dev_info
-.LVL1152:
-	.loc 1 3532 0
+.LVL1141:
+	.loc 1 3530 0
 	ldp	w0, w1, [x21, 84]
 	mul	w0, w0, w1
-.LBB1961:
-.LBB1962:
-.LBB1963:
+.LBB2012:
+.LBB2013:
+.LBB2014:
 	.file 16 "./include/linux/slab.h"
 	.loc 16 553 0
 	mov	w1, 32960
 	movk	w1, 0x60, lsl 16
 	lsr	w0, w0, 1
 	bl	__kmalloc
-.LVL1153:
-	mov	x27, x0
-.LBE1963:
-.LBE1962:
-.LBE1961:
-	.loc 1 3533 0
-	cbz	x0, .L1095
-	.loc 1 3537 0
-	ldp	w2, w1, [x21, 84]
-	.loc 1 3530 0
-	mov	w28, 1
-	.loc 1 3537 0
-	ldr	x3, [x20, 192]
-	mul	w2, w2, w1
-	ldr	w1, [x29, 104]
-.LVL1154:
-	sub	x1, x1, x3
-.LVL1155:
-	ldr	x3, [x19, 8]
-	lsr	w2, w2, 1
-	add	x1, x3, x1
-	bl	memcpy
-.LVL1156:
-	b	.L1025
-.LVL1157:
-.L1091:
-	.loc 1 3517 0
-	ldr	x0, [x19, 104]
-	adrp	x1, .LC70
-	add	x1, x1, :lo12:.LC70
-	bl	_dev_info
-.LVL1158:
-	.loc 1 3518 0
-	ldp	w0, w1, [x21, 84]
-	mul	w0, w0, w1
-.LBB1964:
-.LBB1965:
-.LBB1966:
-	.loc 16 553 0
-	mov	w1, 32960
-	movk	w1, 0x60, lsl 16
-	lsr	w0, w0, 1
-	bl	__kmalloc
-.LVL1159:
+.LVL1142:
 	mov	x26, x0
-.LVL1160:
-.LBE1966:
-.LBE1965:
-.LBE1964:
-	.loc 1 3519 0
-	cbz	x0, .L1096
-	.loc 1 3523 0
+.LVL1143:
+.LBE2014:
+.LBE2013:
+.LBE2012:
+	.loc 1 3531 0
+	cbz	x0, .L1102
+	.loc 1 3535 0
 	ldp	w2, w1, [x21, 84]
 	ldr	x3, [x20, 192]
 	mul	w2, w2, w1
 	ldr	w1, [x29, 100]
-.LVL1161:
+.LVL1144:
 	sub	x1, x1, x3
-.LVL1162:
+.LVL1145:
 	ldr	x3, [x19, 8]
 	lsr	w2, w2, 1
 	add	x1, x3, x1
 	bl	memcpy
-.LVL1163:
-	.loc 1 3527 0
-	cbnz	x28, .L1097
-	.loc 1 3506 0
+.LVL1146:
+	.loc 1 3539 0
+	cbnz	x28, .L1103
+	.loc 1 3518 0
 	mov	w28, 0
-.LVL1164:
-	.loc 1 3511 0
+.LVL1147:
+	.loc 1 3523 0
 	mov	x27, 0
-.LVL1165:
-.L1024:
-	.loc 1 3548 0
+.LVL1148:
+.L1030:
+	.loc 1 3560 0
 	adrp	x0, .LC77
 	add	x0, x0, :lo12:.LC77
 	bl	ebc_empty_buf_get
-.LVL1166:
+.LVL1149:
 	mov	x24, x0
-.LVL1167:
-	.loc 1 3549 0
-	cbz	x0, .L1027
-	.loc 1 3550 0
+.LVL1150:
+	.loc 1 3561 0
+	cbz	x0, .L1033
+	.loc 1 3562 0
 	ldp	w2, w0, [x21, 84]
 	mov	x1, x26
 	mul	w2, w2, w0
 	ldr	x0, [x24, 16]
 	lsr	w2, w2, 1
 	bl	memcpy
-.LVL1168:
-	.loc 1 3553 0
+.LVL1151:
+	.loc 1 3565 0
 	stp	wzr, wzr, [x24, 48]
-	.loc 1 3551 0
+	.loc 1 3563 0
 	mov	w0, 7
 	str	w0, [x24, 40]
-	.loc 1 3556 0
+	.loc 1 3568 0
 	mov	w2, 1
-	.loc 1 3557 0
+	.loc 1 3569 0
 	mov	x0, x24
-	.loc 1 3554 0
+	.loc 1 3566 0
 	ldr	w1, [x21, 84]
 	str	w1, [x24, 56]
-	.loc 1 3555 0
+	.loc 1 3567 0
 	ldr	w1, [x21, 88]
-	.loc 1 3556 0
+	.loc 1 3568 0
 	stp	w1, w2, [x24, 60]
-	.loc 1 3557 0
+	.loc 1 3569 0
 	bl	ebc_add_to_dsp_buf_list
-.LVL1169:
-	b	.L1027
-.LVL1170:
-.L994:
-.LBE1967:
-.LBE1977:
-	.loc 1 3620 0
+.LVL1152:
+	b	.L1033
+.LVL1153:
+.L1099:
+	.loc 1 3543 0
+	ldr	x0, [x19, 104]
+	adrp	x1, .LC73
+	add	x1, x1, :lo12:.LC73
+	bl	_dev_info
+.LVL1154:
+	.loc 1 3544 0
+	ldp	w0, w1, [x21, 84]
+	mul	w0, w0, w1
+.LBB2015:
+.LBB2016:
+.LBB2017:
+	.loc 16 553 0
+	mov	w1, 32960
+	movk	w1, 0x60, lsl 16
+	lsr	w0, w0, 1
+	bl	__kmalloc
+.LVL1155:
+	mov	x27, x0
+.LBE2017:
+.LBE2016:
+.LBE2015:
+	.loc 1 3545 0
+	cbz	x0, .L1104
+	.loc 1 3549 0
+	ldp	w2, w1, [x21, 84]
+	.loc 1 3542 0
+	mov	w28, 1
+	.loc 1 3549 0
+	ldr	x3, [x20, 192]
+	mul	w2, w2, w1
+	ldr	w1, [x29, 104]
+.LVL1156:
+	sub	x1, x1, x3
+.LVL1157:
+	ldr	x3, [x19, 8]
+	lsr	w2, w2, 1
+	add	x1, x3, x1
+	bl	memcpy
+.LVL1158:
+	b	.L1031
+.LVL1159:
+.L999:
+.LBE2018:
+.LBE2027:
+	.loc 1 3632 0
 	mov	w25, -517
-	b	.L990
-.LVL1171:
-.L1093:
-.LBB1978:
-.LBB1968:
-	.loc 1 3562 0
+	b	.L995
+.LVL1160:
+.L1100:
+.LBB2028:
+.LBB2019:
+	.loc 1 3574 0
 	adrp	x0, .LC77
 	add	x0, x0, :lo12:.LC77
 	bl	ebc_empty_buf_get
-.LVL1172:
+.LVL1161:
 	mov	x24, x0
-.LVL1173:
-	.loc 1 3563 0
-	cbz	x0, .L1029
-	.loc 1 3564 0
+.LVL1162:
+	.loc 1 3575 0
+	cbz	x0, .L1035
+	.loc 1 3576 0
 	ldp	w2, w0, [x21, 84]
 	mov	x1, x27
 	mul	w2, w2, w0
 	ldr	x0, [x24, 16]
 	lsr	w2, w2, 1
 	bl	memcpy
-.LVL1174:
-	.loc 1 3567 0
+.LVL1163:
+	.loc 1 3579 0
 	stp	wzr, wzr, [x24, 48]
-	.loc 1 3565 0
+	.loc 1 3577 0
 	mov	w0, 7
 	str	w0, [x24, 40]
-	.loc 1 3570 0
+	.loc 1 3582 0
 	mov	w1, 1
-	.loc 1 3568 0
+	.loc 1 3580 0
 	ldr	w0, [x21, 84]
 	str	w0, [x24, 56]
-	.loc 1 3569 0
+	.loc 1 3581 0
 	ldr	w0, [x21, 88]
-	.loc 1 3570 0
+	.loc 1 3582 0
 	stp	w0, w1, [x24, 60]
-	.loc 1 3571 0
+	.loc 1 3583 0
 	mov	x0, x24
 	bl	ebc_add_to_dsp_buf_list
-.LVL1175:
-	b	.L1029
-.LVL1176:
-.L1045:
-.LBE1968:
-.LBE1978:
-	.loc 1 3606 0
+.LVL1164:
+	b	.L1035
+.LVL1165:
+.L1051:
+.LBE2019:
+.LBE2028:
+	.loc 1 3618 0
 	mov	w25, -12
-	b	.L990
-.LVL1177:
-.L995:
-	.loc 1 3630 0
-	adrp	x1, .LC41
+	b	.L995
+.LVL1166:
+.L1000:
+	.loc 1 3642 0
+	adrp	x1, .LC40
 	mov	x0, x22
-	add	x1, x1, :lo12:.LC41
-	.loc 1 3631 0
+	add	x1, x1, :lo12:.LC40
+	.loc 1 3643 0
 	mov	w25, -22
-	.loc 1 3630 0
+	.loc 1 3642 0
 	bl	_dev_err
-.LVL1178:
-	.loc 1 3631 0
-	b	.L990
-.LVL1179:
-.L1088:
-.LBB1979:
-.LBB1931:
-	.loc 1 3350 0
+.LVL1167:
+	.loc 1 3643 0
+	b	.L995
+.LVL1168:
+.L1095:
+.LBB2029:
+.LBB1986:
+	.loc 1 3358 0
 	ldr	x0, [x19, 104]
 	adrp	x1, .LC59
 	add	x1, x1, :lo12:.LC59
 	bl	_dev_err
-.LVL1180:
-	.loc 1 3351 0
+.LVL1169:
+	.loc 1 3359 0
 	ldr	x0, [x19, 104]
 	mov	w2, w26
-	ldr	x1, [x19, 216]
+	ldr	x1, [x19, 208]
 	bl	epd_lut_from_file_init
-.LVL1181:
-	.loc 1 3352 0
-	tbz	w0, #31, .L1017
-	.loc 1 3353 0
+.LVL1170:
+	.loc 1 3360 0
+	tbz	w0, #31, .L1023
+	.loc 1 3361 0
 	ldr	x0, [x19, 104]
 	adrp	x1, .LC60
-	.loc 1 3354 0
+	.loc 1 3362 0
 	mov	w25, -1
-	.loc 1 3353 0
+	.loc 1 3361 0
 	add	x1, x1, :lo12:.LC60
 	bl	_dev_err
-.LVL1182:
-	b	.L1015
+.LVL1171:
+	b	.L1021
+.LVL1172:
 	.p2align 3
 .L1089:
-.LBE1931:
-.LBE1979:
-.LBB1980:
-.LBB1944:
-	.loc 1 3441 0
+.LBE1986:
+.LBE2029:
+.LBB2030:
+.LBB1974:
+	.loc 1 3381 0
+	adrp	x1, .LC52
+	mov	x0, x26
+	add	x1, x1, :lo12:.LC52
+	.loc 1 3382 0
+	mov	w25, -19
+	.loc 1 3381 0
+	bl	_dev_err
+.LVL1173:
+	b	.L1017
+.LVL1174:
+.L1096:
+.LBE1974:
+.LBE2030:
+.LBB2031:
+.LBB1999:
+	.loc 1 3452 0
 	ldr	x0, [x19, 104]
 	adrp	x1, .LC61
 	add	x1, x1, :lo12:.LC61
 	bl	_dev_err
-.LVL1183:
-.L1018:
-.LBE1944:
-.LBE1980:
-	.loc 1 3696 0
+.LVL1175:
+.L1024:
+.LBE1999:
+.LBE2031:
+	.loc 1 3708 0
 	adrp	x1, .LC98
 	mov	x0, x22
 	add	x1, x1, :lo12:.LC98
-	.loc 1 3697 0
+	.loc 1 3709 0
 	mov	w25, -1
-	.loc 1 3696 0
+	.loc 1 3708 0
 	bl	_dev_err
-.LVL1184:
-	.loc 1 3697 0
-	b	.L990
-.LVL1185:
-.L1090:
-.LBB1981:
-.LBB1945:
-	.loc 1 3450 0
+.LVL1176:
+	.loc 1 3709 0
+	b	.L995
+.LVL1177:
+.L1097:
+.LBB2032:
+.LBB2000:
+	.loc 1 3461 0
 	ldr	x0, [x19, 104]
 	adrp	x1, .LC63
 	add	x1, x1, :lo12:.LC63
 	bl	_dev_err
-.LVL1186:
-	b	.L1018
-.LVL1187:
-.L1084:
-.LBE1945:
-.LBE1981:
-.LBB1982:
-.LBB1918:
-	.loc 1 3387 0
-	adrp	x1, .LC55
-	mov	w2, 50331648
-	add	x1, x1, :lo12:.LC55
-	mov	x0, x26
-	.loc 1 3388 0
-	mov	w25, -19
-	.loc 1 3387 0
-	bl	_dev_err
-.LVL1188:
-	b	.L1011
-.LVL1189:
-.L1020:
-.LBE1918:
-.LBE1982:
-.LBB1983:
-.LBB1946:
-	.loc 1 3461 0
+.LVL1178:
+	b	.L1024
+.LVL1179:
+.L1053:
+.LBE2000:
+.LBE2032:
+.LBB2033:
+.LBB1975:
+	.loc 1 3416 0
+	mov	w25, -12
+	b	.L1017
+.LVL1180:
+.L1026:
+.LBE1975:
+.LBE2033:
+.LBB2034:
+.LBB2001:
+	.loc 1 3472 0
 	ldr	x0, [x19, 104]
-.LVL1190:
+.LVL1181:
 	adrp	x1, .LC97
-	.loc 1 3459 0
+	.loc 1 3470 0
 	str	x26, [x24, 24]
-	.loc 1 3461 0
+	.loc 1 3472 0
 	add	x1, x1, :lo12:.LC97
 	bl	_dev_err
-.LVL1191:
-	b	.L1018
-.LVL1192:
-.L1047:
-.LBE1946:
-.LBE1983:
-.LBB1984:
-.LBB1919:
-	.loc 1 3403 0
-	mov	w25, -12
-	b	.L1011
-.LVL1193:
-.L1079:
-.LBE1919:
-.LBE1984:
-	.loc 1 3613 0
-	adrp	x1, .LC39
-	mov	x0, x22
-	add	x1, x1, :lo12:.LC39
-	.loc 1 3614 0
+.LVL1182:
+	b	.L1024
+.LVL1183:
+.L1091:
+.LBE2001:
+.LBE2034:
+.LBB2035:
+.LBB1976:
+	.loc 1 3400 0
+	adrp	x1, .LC55
+	mov	w2, 53477376
+	add	x1, x1, :lo12:.LC55
+	mov	x0, x26
+	.loc 1 3401 0
 	mov	w25, -19
-	.loc 1 3613 0
+	.loc 1 3400 0
 	bl	_dev_err
-.LVL1194:
-	.loc 1 3614 0
-	b	.L990
-.LVL1195:
-.L1046:
-.LBB1985:
-.LBB1920:
-	.loc 1 3375 0
-	mov	w25, -19
-	b	.L1011
-.LVL1196:
-.L1048:
-.LBE1920:
-.LBE1985:
-.LBB1986:
-.LBB1932:
-	.loc 1 3328 0
-	mov	w25, -19
-	b	.L1015
-.LVL1197:
+.LVL1184:
+	b	.L1017
+.LVL1185:
 .L1085:
-.LBE1932:
-.LBE1986:
+.LBE1976:
+.LBE2035:
+	.loc 1 3625 0
+	adrp	x1, .LC38
+	mov	x0, x22
+	add	x1, x1, :lo12:.LC38
+	.loc 1 3626 0
+	mov	w25, -19
+	.loc 1 3625 0
+	bl	_dev_err
+.LVL1186:
+	.loc 1 3626 0
+	b	.L995
+.LVL1187:
+.L1052:
+.LBB2036:
+.LBB1977:
+	.loc 1 3388 0
+	mov	w25, -19
+	b	.L1017
+.LVL1188:
+.L1054:
+.LBE1977:
+.LBE2036:
+.LBB2037:
 .LBB1987:
-.LBB1921:
-	.loc 1 3393 0
+	.loc 1 3336 0
+	mov	w25, -19
+	b	.L1021
+.LVL1189:
+.L1092:
+.LBE1987:
+.LBE2037:
+.LBB2038:
+.LBB1978:
+	.loc 1 3406 0
 	adrp	x1, .LC56
 	mov	x0, x26
 	add	x1, x1, :lo12:.LC56
-	.loc 1 3394 0
+	.loc 1 3407 0
 	mov	w25, -12
-	.loc 1 3393 0
+	.loc 1 3406 0
 	bl	_dev_err
-.LVL1198:
-	b	.L1011
-.LVL1199:
-.L1095:
-.LBE1921:
-.LBE1987:
-.LBB1988:
-.LBB1969:
-	.loc 1 3534 0
-	ldr	x0, [x19, 104]
-.LVL1200:
-	adrp	x1, .LC74
-	adrp	x21, .LANCHOR1
-	add	x1, x1, :lo12:.LC74
-	bl	_dev_err
-.LVL1201:
-	b	.L1023
-.LVL1202:
-.L1082:
-.LBE1969:
-.LBE1988:
-	.loc 1 3714 0
+.LVL1190:
+	b	.L1017
+.LVL1191:
+.L1088:
+.LBE1978:
+.LBE2038:
+	.loc 1 3726 0
 	bl	__stack_chk_fail
-.LVL1203:
-.L1087:
-.LBB1989:
-.LBB1933:
-	.loc 1 3344 0
-	ldr	x0, [x19, 104]
-	adrp	x2, .LANCHOR3
-	add	x2, x2, :lo12:.LANCHOR3
-	adrp	x1, .LC58
-	mov	w3, 3344
-	add	x2, x2, 32
-	add	x1, x1, :lo12:.LC58
-	.loc 1 3345 0
-	mov	w25, -12
-	.loc 1 3344 0
-	bl	_dev_err
-.LVL1204:
-	b	.L1015
-.LVL1205:
-.L1097:
-.LBE1933:
-.LBE1989:
-.LBB1990:
-.LBB1970:
-	.loc 1 3516 0
+.LVL1192:
+.L1103:
+.LBB2039:
+.LBB2020:
+	.loc 1 3528 0
 	mov	w24, w27
-.LVL1206:
-	b	.L1042
-.LVL1207:
-.L1096:
-	.loc 1 3520 0
+.LVL1193:
+	b	.L1048
+.LVL1194:
+.L1102:
+	.loc 1 3532 0
 	ldr	x0, [x19, 104]
-.LVL1208:
+.LVL1195:
 	adrp	x1, .LC71
 	adrp	x21, .LANCHOR1
 	add	x1, x1, :lo12:.LC71
 	bl	_dev_err
-.LVL1209:
-	b	.L1023
-.LBE1970:
-.LBE1990:
+.LVL1196:
+	b	.L1029
+.LVL1197:
+.L1104:
+	.loc 1 3546 0
+	ldr	x0, [x19, 104]
+.LVL1198:
+	adrp	x1, .LC74
+	adrp	x21, .LANCHOR1
+	add	x1, x1, :lo12:.LC74
+	bl	_dev_err
+.LVL1199:
+	b	.L1029
+.LVL1200:
+.L1094:
+.LBE2020:
+.LBE2039:
+.LBB2040:
+.LBB1988:
+	.loc 1 3352 0
+	ldr	x0, [x19, 104]
+	adrp	x2, .LANCHOR3
+	add	x2, x2, :lo12:.LANCHOR3
+	adrp	x1, .LC58
+	mov	w3, 3352
+	add	x2, x2, 32
+	add	x1, x1, :lo12:.LC58
+	.loc 1 3353 0
+	mov	w25, -12
+	.loc 1 3352 0
+	bl	_dev_err
+.LVL1201:
+	b	.L1021
+.LBE1988:
+.LBE2040:
 	.cfi_endproc
 .LFE2869:
 	.size	ebc_probe, .-ebc_probe
@@ -12160,40 +12236,40 @@
 	.type	auto_frame_state_read, %function
 auto_frame_state_read:
 .LFB2862:
-	.loc 1 3284 0
+	.loc 1 3292 0
 	.cfi_startproc
-.LVL1210:
-	.loc 1 3285 0
+.LVL1202:
+	.loc 1 3293 0
 	adrp	x0, .LANCHOR0
-.LVL1211:
+.LVL1203:
 	ldr	x1, [x0, #:lo12:.LANCHOR0]
-.LVL1212:
-	.loc 1 3289 0
+.LVL1204:
+	.loc 1 3297 0
 	ldp	w0, w4, [x1, 108]
 	mul	w4, w4, w0
-	cbz	w4, .L1099
-	.loc 1 3290 0
-	ldr	x5, [x1, 368]
+	cbz	w4, .L1106
+	.loc 1 3298 0
+	ldr	x5, [x1, 360]
 	mov	w1, 0
-.LVL1213:
+.LVL1205:
 	ldrb	w3, [x5]
-	cbz	w3, .L1102
-	b	.L1100
+	cbz	w3, .L1109
+	b	.L1107
 	.p2align 3
-.L1104:
+.L1111:
 	ldrb	w3, [x5, w1, sxtw]
-	cbnz	w3, .L1100
-.L1102:
-	.loc 1 3289 0 discriminator 2
+	cbnz	w3, .L1107
+.L1109:
+	.loc 1 3297 0 discriminator 2
 	add	w1, w1, 1
 	cmp	w1, w4
-	bne	.L1104
-.L1099:
-.LBB1993:
-.LBB1994:
-	.loc 1 3295 0
+	bne	.L1111
+.L1106:
+.LBB2043:
+.LBB2044:
+	.loc 1 3303 0
 	adrp	x1, .LC100
-.LVL1214:
+.LVL1206:
 	add	x1, x1, :lo12:.LC100
 	mov	x0, 2
 	ldrh	w3, [x1]
@@ -12201,33 +12277,33 @@
 	strh	w3, [x2]
 	strb	w1, [x2, 2]
 	ret
-.LVL1215:
+.LVL1207:
 	.p2align 3
-.L1100:
-.LBE1994:
-.LBE1993:
-	.loc 1 3284 0
+.L1107:
+.LBE2044:
+.LBE2043:
+	.loc 1 3292 0
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
 	mov	x0, x2
-	.loc 1 3291 0
-	adrp	x1, .LC26
-.LVL1216:
+	.loc 1 3299 0
+	adrp	x1, .LC25
+.LVL1208:
 	mov	w2, w3
-.LVL1217:
-	.loc 1 3284 0
+.LVL1209:
+	.loc 1 3292 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 3291 0
-	add	x1, x1, :lo12:.LC26
-	.loc 1 3284 0
-	.loc 1 3291 0
+	.loc 1 3299 0
+	add	x1, x1, :lo12:.LC25
+	.loc 1 3292 0
+	.loc 1 3299 0
 	bl	sprintf
-.LVL1218:
+.LVL1210:
 	sxtw	x0, w0
-	.loc 1 3296 0
+	.loc 1 3304 0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
 	.cfi_restore 29
@@ -12241,9 +12317,9 @@
 	.type	ebc_power_set.constprop.15, %function
 ebc_power_set.constprop.15:
 .LFB2892:
-	.loc 1 390 0
+	.loc 1 389 0
 	.cfi_startproc
-.LVL1219:
+.LVL1211:
 	stp	x29, x30, [sp, -32]!
 	.cfi_def_cfa_offset 32
 	.cfi_offset 29, -32
@@ -12253,51 +12329,51 @@
 	stp	x19, x20, [sp, 16]
 	.cfi_offset 19, -16
 	.cfi_offset 20, -8
-	.loc 1 396 0
+	.loc 1 395 0
 	add	x20, x0, 192
-	.loc 1 390 0
+	.loc 1 389 0
 	mov	x19, x0
-	.loc 1 396 0
-	ldr	w0, [x20, 480]
-.LVL1220:
-	cbz	w0, .L1117
-.L1115:
-	.loc 1 400 0
+	.loc 1 395 0
+	ldr	w0, [x20, 464]
+.LVL1212:
+	cbz	w0, .L1124
+.L1122:
+	.loc 1 399 0
 	mov	w1, 1
-	str	w1, [x20, 208]
-	.loc 1 401 0
+	str	w1, [x20, 200]
+	.loc 1 400 0
 	ldr	x2, [x19, 16]
-.LBB1995:
-.LBB1996:
+.LBB2045:
+.LBB2046:
 	.loc 3 30 0
 	mov	x0, x2
 	ldr	x2, [x2, 32]
 	blr	x2
-.LVL1221:
-.LBE1996:
-.LBE1995:
-	.loc 1 402 0
+.LVL1213:
+.LBE2046:
+.LBE2045:
+	.loc 1 401 0
 	ldr	x2, [x19, 8]
-.LBB1997:
-.LBB1998:
+.LBB2047:
+.LBB2048:
 	.loc 10 45 0
 	add	x1, x19, 24
 	mov	x0, x2
 	ldr	x2, [x2, 48]
 	blr	x2
-.LVL1222:
-.LBE1998:
-.LBE1997:
-	.loc 1 403 0
+.LVL1214:
+.LBE2048:
+.LBE2047:
+	.loc 1 402 0
 	ldr	x0, [x19]
 	adrp	x1, .LC101
 	add	x1, x1, :lo12:.LC101
 	bl	_dev_info
-.LVL1223:
-	.loc 1 418 0
+.LVL1215:
+	.loc 1 417 0
 	mov	w0, 0
 	ldp	x19, x20, [sp, 16]
-.LVL1224:
+.LVL1216:
 	ldp	x29, x30, [sp], 32
 	.cfi_remember_state
 	.cfi_restore 30
@@ -12306,22 +12382,22 @@
 	.cfi_restore 20
 	.cfi_def_cfa 31, 0
 	ret
-.LVL1225:
+.LVL1217:
 	.p2align 3
-.L1117:
+.L1124:
 	.cfi_restore_state
-	.loc 1 397 0
+	.loc 1 396 0
 	mov	w0, 1
-	str	w0, [x20, 480]
-.LBB1999:
-.LBB2000:
+	str	w0, [x20, 464]
+.LBB2049:
+.LBB2050:
 	.loc 11 58 0
-	add	x0, x19, 464
+	add	x0, x19, 448
 	bl	__pm_stay_awake
-.LVL1226:
-	b	.L1115
-.LBE2000:
-.LBE1999:
+.LVL1218:
+	b	.L1122
+.LBE2050:
+.LBE2049:
 	.cfi_endproc
 .LFE2892:
 	.size	ebc_power_set.constprop.15, .-ebc_power_set.constprop.15
@@ -12343,31 +12419,31 @@
 	.type	refresh_new_image, %function
 refresh_new_image:
 .LFB2818:
-	.loc 1 486 0
+	.loc 1 485 0
 	.cfi_startproc
-.LVL1227:
-	.loc 1 494 0
+.LVL1219:
+	.loc 1 493 0
 	ldp	w18, w6, [x5, 92]
 	cmp	w6, 0
 	add	w12, w6, 7
 	csel	w12, w12, w6, lt
-.LVL1228:
-	.loc 1 496 0
+.LVL1220:
+	.loc 1 495 0
 	cmp	w18, 0
-	ble	.L1198
+	ble	.L1205
 	asr	w12, w12, 3
-.LVL1229:
-	.loc 1 486 0
+.LVL1221:
+	.loc 1 485 0
 	stp	x29, x30, [sp, -32]!
 	.cfi_def_cfa_offset 32
 	.cfi_offset 29, -32
 	.cfi_offset 30, -24
 	sub	w15, w12, #1
-	.loc 1 496 0
+	.loc 1 495 0
 	mov	w16, 0
-.LVL1230:
+.LVL1222:
 	add	x15, x15, 1
-	.loc 1 486 0
+	.loc 1 485 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
 	lsl	x17, x15, 3
@@ -12375,157 +12451,157 @@
 	stp	x19, x20, [sp, 16]
 	.cfi_offset 19, -16
 	.cfi_offset 20, -8
-.LBB2001:
-	.loc 1 513 0
+.LBB2051:
+	.loc 1 512 0
 	mov	w14, 251658240
-.LBE2001:
-.LBB2002:
-	.loc 1 514 0
+.LBE2051:
+.LBB2052:
+	.loc 1 513 0
 	mov	w13, -268435456
 	mov	w19, -536870912
-.LBE2002:
-.LBB2003:
-	.loc 1 513 0
+.LBE2052:
+.LBB2053:
+	.loc 1 512 0
 	mov	w30, 234881024
-.LVL1231:
+.LVL1223:
 	.p2align 2
-.L1121:
-.LBE2003:
-	.loc 1 497 0 discriminator 1
+.L1128:
+.LBE2053:
+	.loc 1 496 0 discriminator 1
 	mov	x7, 0
 	cmp	w12, 0
-	ble	.L1185
+	ble	.L1192
 	.p2align 2
-.L1193:
-	.loc 1 498 0
+.L1200:
+	.loc 1 497 0
 	ldr	x9, [x3, x7, lsl 3]
-	.loc 1 499 0
+	.loc 1 498 0
 	ldr	x11, [x4, x7, lsl 3]
-.LVL1232:
-	.loc 1 500 0
+.LVL1224:
+	.loc 1 499 0
 	ldr	w6, [x1, x7, lsl 2]
-	.loc 1 501 0
+	.loc 1 500 0
 	ldr	w8, [x0, x7, lsl 2]
-	.loc 1 502 0
+	.loc 1 501 0
 	ldr	w10, [x2, x7, lsl 2]
-.LVL1233:
-	.loc 1 505 0
-	cbnz	x9, .L1122
-.LVL1234:
-.LBB2004:
-	.loc 1 507 0
+.LVL1225:
+	.loc 1 504 0
+	cbnz	x9, .L1129
+.LVL1226:
+.LBB2054:
+	.loc 1 506 0
 	and	w5, w6, 15
-.LVL1235:
+.LVL1227:
 	cmp	w5, 15
-	bne	.L1206
-.L1123:
-.LBE2004:
-.LBB2005:
-	.loc 1 508 0
-	and	w11, w6, 240
-.LVL1236:
-	cmp	w11, 240
-	bne	.L1125
-.L1209:
-	.loc 1 508 0 is_stmt 0 discriminator 1
-	orr	w5, w5, 240
-.L1126:
-.LBE2005:
-.LBB2006:
-	.loc 1 509 0 is_stmt 1
-	and	w11, w6, 3840
-.LVL1237:
-	cmp	w11, 3840
-	bne	.L1129
-.L1210:
-	.loc 1 509 0 is_stmt 0 discriminator 1
-	orr	w5, w5, 3840
+	bne	.L1213
 .L1130:
-.LBE2006:
-.LBB2007:
-	.loc 1 510 0 is_stmt 1
+.LBE2054:
+.LBB2055:
+	.loc 1 507 0
+	and	w11, w6, 240
+.LVL1228:
+	cmp	w11, 240
+	bne	.L1132
+.L1216:
+	.loc 1 507 0 is_stmt 0 discriminator 1
+	orr	w5, w5, 240
+.L1133:
+.LBE2055:
+.LBB2056:
+	.loc 1 508 0 is_stmt 1
+	and	w11, w6, 3840
+.LVL1229:
+	cmp	w11, 3840
+	bne	.L1136
+.L1217:
+	.loc 1 508 0 is_stmt 0 discriminator 1
+	orr	w5, w5, 3840
+.L1137:
+.LBE2056:
+.LBB2057:
+	.loc 1 509 0 is_stmt 1
 	and	w11, w6, 61440
-.LVL1238:
+.LVL1230:
 	cmp	w11, 61440
-	bne	.L1133
-.L1211:
-	.loc 1 510 0 is_stmt 0 discriminator 1
+	bne	.L1140
+.L1218:
+	.loc 1 509 0 is_stmt 0 discriminator 1
 	orr	w5, w5, 61440
-.L1134:
-.LBE2007:
-.LBB2008:
-	.loc 1 511 0 is_stmt 1
+.L1141:
+.LBE2057:
+.LBB2058:
+	.loc 1 510 0 is_stmt 1
 	and	w11, w6, 983040
-.LVL1239:
+.LVL1231:
 	cmp	w11, 983040
-	bne	.L1137
-	.loc 1 511 0 is_stmt 0 discriminator 1
+	bne	.L1144
+	.loc 1 510 0 is_stmt 0 discriminator 1
 	orr	w5, w5, 983040
-.L1138:
-.LBE2008:
-.LBB2009:
-	.loc 1 512 0 is_stmt 1
+.L1145:
+.LBE2058:
+.LBB2059:
+	.loc 1 511 0 is_stmt 1
 	and	w11, w6, 15728640
-.LVL1240:
+.LVL1232:
 	cmp	w11, 15728640
-	bne	.L1141
-	.loc 1 512 0 is_stmt 0 discriminator 1
+	bne	.L1148
+	.loc 1 511 0 is_stmt 0 discriminator 1
 	orr	w5, w5, 15728640
-.L1142:
-.LBE2009:
-.LBB2010:
-	.loc 1 513 0 is_stmt 1
+.L1149:
+.LBE2059:
+.LBB2060:
+	.loc 1 512 0 is_stmt 1
 	and	w11, w6, 251658240
-.LVL1241:
+.LVL1233:
 	cmp	w11, w14
-	bne	.L1145
-	.loc 1 513 0 is_stmt 0 discriminator 1
+	bne	.L1152
+	.loc 1 512 0 is_stmt 0 discriminator 1
 	orr	w5, w5, 251658240
-.L1146:
-.LBE2010:
-.LBB2011:
-	.loc 1 514 0 is_stmt 1
+.L1153:
+.LBE2060:
+.LBB2061:
+	.loc 1 513 0 is_stmt 1
 	and	w11, w6, -268435456
-.LVL1242:
+.LVL1234:
 	cmp	w11, w13
-	bne	.L1180
-.LVL1243:
-.L1201:
-.LBE2011:
-.LBB2012:
-	.loc 1 523 0 discriminator 2
+	bne	.L1187
+.LVL1235:
+.L1208:
+.LBE2061:
+.LBB2062:
+	.loc 1 522 0 discriminator 2
 	orr	w5, w5, -268435456
-.L1150:
-.LVL1244:
-.LBE2012:
-	.loc 1 527 0 discriminator 2
+.L1157:
+.LVL1236:
+.LBE2062:
+	.loc 1 526 0 discriminator 2
 	and	w6, w6, w10
-.LVL1245:
-	.loc 1 528 0 discriminator 2
+.LVL1237:
+	.loc 1 527 0 discriminator 2
 	str	x9, [x4, x7, lsl 3]
 	eor	w6, w6, w8
 	and	w5, w6, w5
-.LVL1246:
-	.loc 1 527 0 discriminator 2
+.LVL1238:
+	.loc 1 526 0 discriminator 2
 	eor	w5, w8, w5
-	.loc 1 529 0 discriminator 2
+	.loc 1 528 0 discriminator 2
 	str	w5, [x0, x7, lsl 2]
 	add	x7, x7, 1
-	.loc 1 497 0 discriminator 2
+	.loc 1 496 0 discriminator 2
 	cmp	w12, w7
-	bgt	.L1193
+	bgt	.L1200
 	add	x3, x3, x17
 	add	x1, x1, x15
 	add	x2, x2, x15
 	add	x4, x4, x17
 	add	x0, x0, x15
-.LVL1247:
-.L1185:
-	.loc 1 496 0 discriminator 2
+.LVL1239:
+.L1192:
+	.loc 1 495 0 discriminator 2
 	add	w16, w16, 1
 	cmp	w18, w16
-	bne	.L1121
-	.loc 1 532 0
+	bne	.L1128
+	.loc 1 531 0
 	ldp	x19, x20, [sp, 16]
 	ldp	x29, x30, [sp], 32
 	.cfi_remember_state
@@ -12535,652 +12611,652 @@
 	.cfi_restore 20
 	.cfi_def_cfa 31, 0
 	ret
-.LVL1248:
+.LVL1240:
 	.p2align 3
-.L1122:
+.L1129:
 	.cfi_restore_state
-	.loc 1 516 0
+	.loc 1 515 0
 	and	x20, x9, 255
-	.loc 1 503 0
+	.loc 1 502 0
 	mov	w5, 0
-.LVL1249:
-	.loc 1 516 0
-	cbnz	x20, .L1153
-.LVL1250:
-.LBB2013:
-	.loc 1 516 0 is_stmt 0 discriminator 1
+.LVL1241:
+	.loc 1 515 0
+	cbnz	x20, .L1160
+.LVL1242:
+.LBB2063:
+	.loc 1 515 0 is_stmt 0 discriminator 1
 	and	w5, w6, 15
-.LBE2013:
+.LBE2063:
 	and	x11, x11, -256
-.LBB2014:
+.LBB2064:
 	cmp	w5, 15
-	bne	.L1207
-.L1153:
-.LBE2014:
-	.loc 1 517 0 is_stmt 1
-	tst	x9, 65280
-	bne	.L1156
-.LBB2015:
-	.loc 1 517 0 is_stmt 0 discriminator 1
-	and	w20, w6, 240
-.LVL1251:
-.LBE2015:
-	and	x11, x11, -65281
-.LBB2016:
-	cmp	w20, 240
-	bne	.L1157
-	.loc 1 517 0 discriminator 2
-	orr	w5, w5, 240
-.L1156:
-.LBE2016:
-	.loc 1 518 0 is_stmt 1
-	tst	x9, 16711680
-	bne	.L1160
-.LBB2017:
-	.loc 1 518 0 is_stmt 0 discriminator 1
-	and	w20, w6, 3840
-.LVL1252:
-.LBE2017:
-	and	x11, x11, -16711681
-.LBB2018:
-	cmp	w20, 3840
-	bne	.L1161
-	.loc 1 518 0 discriminator 2
-	orr	w5, w5, 3840
-.LVL1253:
+	bne	.L1214
 .L1160:
-.LBE2018:
-	.loc 1 519 0 is_stmt 1
-	tst	x9, 4278190080
+.LBE2064:
+	.loc 1 516 0 is_stmt 1
+	tst	x9, 65280
+	bne	.L1163
+.LBB2065:
+	.loc 1 516 0 is_stmt 0 discriminator 1
+	and	w20, w6, 240
+.LVL1243:
+.LBE2065:
+	and	x11, x11, -65281
+.LBB2066:
+	cmp	w20, 240
 	bne	.L1164
-.LBB2019:
-	.loc 1 519 0 is_stmt 0 discriminator 1
-	and	w20, w6, 61440
-.LVL1254:
-.LBE2019:
-	and	x11, x11, -4278190081
-.LBB2020:
-	cmp	w20, 61440
-	bne	.L1165
-	.loc 1 519 0 discriminator 2
-	orr	w5, w5, 61440
-.LVL1255:
-.L1164:
-.LBE2020:
-	.loc 1 520 0 is_stmt 1
-	tst	x9, 1095216660480
+	.loc 1 516 0 discriminator 2
+	orr	w5, w5, 240
+.L1163:
+.LBE2066:
+	.loc 1 517 0 is_stmt 1
+	tst	x9, 16711680
+	bne	.L1167
+.LBB2067:
+	.loc 1 517 0 is_stmt 0 discriminator 1
+	and	w20, w6, 3840
+.LVL1244:
+.LBE2067:
+	and	x11, x11, -16711681
+.LBB2068:
+	cmp	w20, 3840
 	bne	.L1168
-.LBB2021:
-	.loc 1 520 0 is_stmt 0 discriminator 1
-	and	w20, w6, 983040
-.LVL1256:
-.LBE2021:
-	and	x11, x11, -1095216660481
-.LBB2022:
-	cmp	w20, 983040
-	bne	.L1169
-	.loc 1 520 0 discriminator 2
-	orr	w5, w5, 983040
-.LVL1257:
-.L1168:
-.LBE2022:
-	.loc 1 521 0 is_stmt 1
-	tst	x9, 280375465082880
+	.loc 1 517 0 discriminator 2
+	orr	w5, w5, 3840
+.LVL1245:
+.L1167:
+.LBE2068:
+	.loc 1 518 0 is_stmt 1
+	tst	x9, 4278190080
+	bne	.L1171
+.LBB2069:
+	.loc 1 518 0 is_stmt 0 discriminator 1
+	and	w20, w6, 61440
+.LVL1246:
+.LBE2069:
+	and	x11, x11, -4278190081
+.LBB2070:
+	cmp	w20, 61440
 	bne	.L1172
-.LBB2023:
-	.loc 1 521 0 is_stmt 0 discriminator 1
-	and	w20, w6, 15728640
-.LVL1258:
-.LBE2023:
-	and	x11, x11, -280375465082881
-.LBB2024:
-	cmp	w20, 15728640
-	bne	.L1173
-	.loc 1 521 0 discriminator 2
-	orr	w5, w5, 15728640
-.LVL1259:
-.L1172:
-.LBE2024:
-	.loc 1 522 0 is_stmt 1
-	tst	x9, 71776119061217280
+	.loc 1 518 0 discriminator 2
+	orr	w5, w5, 61440
+.LVL1247:
+.L1171:
+.LBE2070:
+	.loc 1 519 0 is_stmt 1
+	tst	x9, 1095216660480
+	bne	.L1175
+.LBB2071:
+	.loc 1 519 0 is_stmt 0 discriminator 1
+	and	w20, w6, 983040
+.LVL1248:
+.LBE2071:
+	and	x11, x11, -1095216660481
+.LBB2072:
+	cmp	w20, 983040
 	bne	.L1176
-.LBB2025:
-	.loc 1 522 0 is_stmt 0 discriminator 1
+	.loc 1 519 0 discriminator 2
+	orr	w5, w5, 983040
+.LVL1249:
+.L1175:
+.LBE2072:
+	.loc 1 520 0 is_stmt 1
+	tst	x9, 280375465082880
+	bne	.L1179
+.LBB2073:
+	.loc 1 520 0 is_stmt 0 discriminator 1
+	and	w20, w6, 15728640
+.LVL1250:
+.LBE2073:
+	and	x11, x11, -280375465082881
+.LBB2074:
+	cmp	w20, 15728640
+	bne	.L1180
+	.loc 1 520 0 discriminator 2
+	orr	w5, w5, 15728640
+.LVL1251:
+.L1179:
+.LBE2074:
+	.loc 1 521 0 is_stmt 1
+	tst	x9, 71776119061217280
+	bne	.L1183
+.LBB2075:
+	.loc 1 521 0 is_stmt 0 discriminator 1
 	and	w20, w6, 251658240
-.LVL1260:
-.LBE2025:
+.LVL1252:
+.LBE2075:
 	and	x11, x11, -71776119061217281
-.LBB2026:
+.LBB2076:
 	cmp	w20, w14
-	bne	.L1177
-	.loc 1 522 0 discriminator 2
+	bne	.L1184
+	.loc 1 521 0 discriminator 2
 	orr	w5, w5, 251658240
-.LVL1261:
-.L1176:
-.LBE2026:
-	.loc 1 523 0 is_stmt 1
+.LVL1253:
+.L1183:
+.LBE2076:
+	.loc 1 522 0 is_stmt 1
 	and	x20, x9, -72057594037927936
-.LVL1262:
-.LBB2027:
+.LVL1254:
+.LBB2077:
 	mov	x9, x11
-.LBE2027:
-	cbnz	x20, .L1150
-.LBB2028:
-	.loc 1 523 0 is_stmt 0 discriminator 1
+.LBE2077:
+	cbnz	x20, .L1157
+.LBB2078:
+	.loc 1 522 0 is_stmt 0 discriminator 1
 	and	w11, w6, -268435456
-.LVL1263:
-.LBE2028:
+.LVL1255:
+.LBE2078:
 	and	x9, x9, 72057594037927935
-.LBB2029:
+.LBB2079:
 	cmp	w11, w13
-	beq	.L1201
-.LVL1264:
+	beq	.L1208
+.LVL1256:
 	.p2align 2
-.L1180:
-	.loc 1 523 0 discriminator 3
-	cbnz	w11, .L1181
-	.loc 1 523 0 discriminator 4
+.L1187:
+	.loc 1 522 0 discriminator 3
+	cbnz	w11, .L1188
+	.loc 1 522 0 discriminator 4
 	orr	w5, w5, -268435456
 	orr	x9, x9, 72057594037927936
-	b	.L1150
-.LVL1265:
+	b	.L1157
+.LVL1257:
 	.p2align 3
-.L1145:
-.LBE2029:
-.LBB2030:
-	.loc 1 513 0 is_stmt 1 discriminator 2
-	cbnz	w11, .L1147
-	.loc 1 513 0 is_stmt 0 discriminator 3
+.L1152:
+.LBE2079:
+.LBB2080:
+	.loc 1 512 0 is_stmt 1 discriminator 2
+	cbnz	w11, .L1154
+	.loc 1 512 0 is_stmt 0 discriminator 3
 	orr	w5, w5, 251658240
 	orr	x9, x9, 281474976710656
-	b	.L1146
-.LVL1266:
+	b	.L1153
+.LVL1258:
 	.p2align 3
-.L1141:
-.LBE2030:
-.LBB2031:
-	.loc 1 512 0 is_stmt 1 discriminator 2
-	cbnz	w11, .L1143
-	.loc 1 512 0 is_stmt 0 discriminator 3
+.L1148:
+.LBE2080:
+.LBB2081:
+	.loc 1 511 0 is_stmt 1 discriminator 2
+	cbnz	w11, .L1150
+	.loc 1 511 0 is_stmt 0 discriminator 3
 	orr	w5, w5, 15728640
 	orr	x9, x9, 1099511627776
-	b	.L1142
-.LVL1267:
+	b	.L1149
+.LVL1259:
 	.p2align 3
-.L1137:
-.LBE2031:
-.LBB2032:
-	.loc 1 511 0 is_stmt 1 discriminator 2
-	cbnz	w11, .L1139
-	.loc 1 511 0 is_stmt 0 discriminator 3
+.L1144:
+.LBE2081:
+.LBB2082:
+	.loc 1 510 0 is_stmt 1 discriminator 2
+	cbnz	w11, .L1146
+	.loc 1 510 0 is_stmt 0 discriminator 3
 	orr	w5, w5, 983040
 	orr	x9, x9, 4294967296
-	b	.L1138
-.LVL1268:
-	.p2align 3
-.L1206:
-.LBE2032:
-.LBB2033:
-	.loc 1 507 0 is_stmt 1 discriminator 2
-	cbz	w5, .L1186
-	.loc 1 507 0 is_stmt 0 discriminator 4
-	cmp	w5, 14
-	beq	.L1208
-	.loc 1 507 0 discriminator 6
-	and	w8, w8, -16
-.LBE2033:
-.LBB2034:
-	.loc 1 508 0 is_stmt 1 discriminator 6
-	and	w11, w6, 240
-.LVL1269:
-.LBE2034:
-.LBB2035:
-	.loc 1 507 0 discriminator 6
-	orr	w8, w5, w8
-.LBE2035:
-.LBB2036:
-	.loc 1 508 0 discriminator 6
-	cmp	w11, 240
-.LBE2036:
-	.loc 1 503 0 discriminator 6
-	mov	w5, 0
-.LBB2037:
-	.loc 1 508 0 discriminator 6
-	beq	.L1209
-	.p2align 2
-.L1125:
-	.loc 1 508 0 is_stmt 0 discriminator 2
-	cbnz	w11, .L1127
-.LBE2037:
-.LBB2038:
-	.loc 1 509 0 is_stmt 1 discriminator 3
-	and	w11, w6, 3840
-.LVL1270:
-.LBE2038:
-.LBB2039:
-	.loc 1 508 0 discriminator 3
-	orr	w5, w5, 240
-	orr	x9, x9, 256
-.LBE2039:
-.LBB2040:
-	.loc 1 509 0 discriminator 3
-	cmp	w11, 3840
-	beq	.L1210
-	.p2align 2
-.L1129:
-	.loc 1 509 0 is_stmt 0 discriminator 2
-	cbnz	w11, .L1131
-.LBE2040:
-.LBB2041:
-	.loc 1 510 0 is_stmt 1 discriminator 3
-	and	w11, w6, 61440
-.LVL1271:
-.LBE2041:
-.LBB2042:
-	.loc 1 509 0 discriminator 3
-	orr	w5, w5, 3840
-	orr	x9, x9, 65536
-.LBE2042:
-.LBB2043:
-	.loc 1 510 0 discriminator 3
-	cmp	w11, 61440
-	beq	.L1211
-	.p2align 2
-.L1133:
-	.loc 1 510 0 is_stmt 0 discriminator 2
-	cbnz	w11, .L1135
-	.loc 1 510 0 discriminator 3
-	orr	w5, w5, 61440
-	orr	x9, x9, 16777216
-	b	.L1134
-.LVL1272:
-	.p2align 3
-.L1181:
-.LBE2043:
-.LBB2044:
-	.loc 1 523 0 is_stmt 1 discriminator 5
-	cmp	w11, w19
-	beq	.L1212
-	.loc 1 523 0 is_stmt 0 discriminator 7
-	and	w8, w8, 268435455
-	orr	w8, w11, w8
-	b	.L1150
-.LVL1273:
-	.p2align 3
-.L1186:
-.LBE2044:
-.LBB2045:
-	.loc 1 507 0 is_stmt 1
-	mov	w5, 15
-	mov	x9, 1
-	b	.L1123
-.LVL1274:
-	.p2align 3
-.L1131:
-.LBE2045:
-.LBB2046:
-	.loc 1 509 0 discriminator 4
-	cmp	w11, 3584
-	beq	.L1213
-	.loc 1 509 0 is_stmt 0 discriminator 6
-	and	w8, w8, -3841
-	orr	w8, w11, w8
-	b	.L1130
-.LVL1275:
-	.p2align 3
-.L1147:
-.LBE2046:
-.LBB2047:
-	.loc 1 513 0 is_stmt 1 discriminator 4
-	cmp	w11, w30
-	beq	.L1214
-	.loc 1 513 0 is_stmt 0 discriminator 6
-	and	w8, w8, -251658241
-	orr	w8, w11, w8
-	b	.L1146
-.LVL1276:
-	.p2align 3
-.L1143:
-.LBE2047:
-.LBB2048:
-	.loc 1 512 0 is_stmt 1 discriminator 4
-	cmp	w11, 14680064
-	beq	.L1215
-	.loc 1 512 0 is_stmt 0 discriminator 6
-	and	w8, w8, -15728641
-	orr	w8, w11, w8
-	b	.L1142
-.LVL1277:
-	.p2align 3
-.L1139:
-.LBE2048:
-.LBB2049:
-	.loc 1 511 0 is_stmt 1 discriminator 4
-	cmp	w11, 917504
-	beq	.L1216
-	.loc 1 511 0 is_stmt 0 discriminator 6
-	and	w8, w8, -983041
-	orr	w8, w11, w8
-	b	.L1138
-.LVL1278:
-	.p2align 3
-.L1127:
-.LBE2049:
-.LBB2050:
-	.loc 1 508 0 is_stmt 1 discriminator 4
-	cmp	w11, 224
-	beq	.L1217
-	.loc 1 508 0 is_stmt 0 discriminator 6
-	and	w8, w8, -241
-	orr	w8, w11, w8
-	b	.L1126
-.LVL1279:
-	.p2align 3
-.L1135:
-.LBE2050:
-.LBB2051:
-	.loc 1 510 0 is_stmt 1 discriminator 4
-	cmp	w11, 57344
-	beq	.L1218
-	.loc 1 510 0 is_stmt 0 discriminator 6
-	and	w8, w8, -61441
-	orr	w8, w11, w8
-	b	.L1134
-.LVL1280:
-	.p2align 3
-.L1212:
-.LBE2051:
-.LBB2052:
-	.loc 1 523 0 is_stmt 1 discriminator 6
-	orr	w8, w8, -268435456
-	orr	x9, x9, 72057594037927936
-	b	.L1150
-.LVL1281:
+	b	.L1145
+.LVL1260:
 	.p2align 3
 .L1213:
-.LBE2052:
-.LBB2053:
-	.loc 1 509 0 discriminator 5
+.LBE2082:
+.LBB2083:
+	.loc 1 506 0 is_stmt 1 discriminator 2
+	cbz	w5, .L1193
+	.loc 1 506 0 is_stmt 0 discriminator 4
+	cmp	w5, 14
+	beq	.L1215
+	.loc 1 506 0 discriminator 6
+	and	w8, w8, -16
+.LBE2083:
+.LBB2084:
+	.loc 1 507 0 is_stmt 1 discriminator 6
+	and	w11, w6, 240
+.LVL1261:
+.LBE2084:
+.LBB2085:
+	.loc 1 506 0 discriminator 6
+	orr	w8, w5, w8
+.LBE2085:
+.LBB2086:
+	.loc 1 507 0 discriminator 6
+	cmp	w11, 240
+.LBE2086:
+	.loc 1 502 0 discriminator 6
+	mov	w5, 0
+.LBB2087:
+	.loc 1 507 0 discriminator 6
+	beq	.L1216
+	.p2align 2
+.L1132:
+	.loc 1 507 0 is_stmt 0 discriminator 2
+	cbnz	w11, .L1134
+.LBE2087:
+.LBB2088:
+	.loc 1 508 0 is_stmt 1 discriminator 3
+	and	w11, w6, 3840
+.LVL1262:
+.LBE2088:
+.LBB2089:
+	.loc 1 507 0 discriminator 3
+	orr	w5, w5, 240
+	orr	x9, x9, 256
+.LBE2089:
+.LBB2090:
+	.loc 1 508 0 discriminator 3
+	cmp	w11, 3840
+	beq	.L1217
+	.p2align 2
+.L1136:
+	.loc 1 508 0 is_stmt 0 discriminator 2
+	cbnz	w11, .L1138
+.LBE2090:
+.LBB2091:
+	.loc 1 509 0 is_stmt 1 discriminator 3
+	and	w11, w6, 61440
+.LVL1263:
+.LBE2091:
+.LBB2092:
+	.loc 1 508 0 discriminator 3
+	orr	w5, w5, 3840
+	orr	x9, x9, 65536
+.LBE2092:
+.LBB2093:
+	.loc 1 509 0 discriminator 3
+	cmp	w11, 61440
+	beq	.L1218
+	.p2align 2
+.L1140:
+	.loc 1 509 0 is_stmt 0 discriminator 2
+	cbnz	w11, .L1142
+	.loc 1 509 0 discriminator 3
+	orr	w5, w5, 61440
+	orr	x9, x9, 16777216
+	b	.L1141
+.LVL1264:
+	.p2align 3
+.L1188:
+.LBE2093:
+.LBB2094:
+	.loc 1 522 0 is_stmt 1 discriminator 5
+	cmp	w11, w19
+	beq	.L1219
+	.loc 1 522 0 is_stmt 0 discriminator 7
+	and	w8, w8, 268435455
+	orr	w8, w11, w8
+	b	.L1157
+.LVL1265:
+	.p2align 3
+.L1193:
+.LBE2094:
+.LBB2095:
+	.loc 1 506 0 is_stmt 1
+	mov	w5, 15
+	mov	x9, 1
+	b	.L1130
+.LVL1266:
+	.p2align 3
+.L1138:
+.LBE2095:
+.LBB2096:
+	.loc 1 508 0 discriminator 4
+	cmp	w11, 3584
+	beq	.L1220
+	.loc 1 508 0 is_stmt 0 discriminator 6
+	and	w8, w8, -3841
+	orr	w8, w11, w8
+	b	.L1137
+.LVL1267:
+	.p2align 3
+.L1154:
+.LBE2096:
+.LBB2097:
+	.loc 1 512 0 is_stmt 1 discriminator 4
+	cmp	w11, w30
+	beq	.L1221
+	.loc 1 512 0 is_stmt 0 discriminator 6
+	and	w8, w8, -251658241
+	orr	w8, w11, w8
+	b	.L1153
+.LVL1268:
+	.p2align 3
+.L1150:
+.LBE2097:
+.LBB2098:
+	.loc 1 511 0 is_stmt 1 discriminator 4
+	cmp	w11, 14680064
+	beq	.L1222
+	.loc 1 511 0 is_stmt 0 discriminator 6
+	and	w8, w8, -15728641
+	orr	w8, w11, w8
+	b	.L1149
+.LVL1269:
+	.p2align 3
+.L1146:
+.LBE2098:
+.LBB2099:
+	.loc 1 510 0 is_stmt 1 discriminator 4
+	cmp	w11, 917504
+	beq	.L1223
+	.loc 1 510 0 is_stmt 0 discriminator 6
+	and	w8, w8, -983041
+	orr	w8, w11, w8
+	b	.L1145
+.LVL1270:
+	.p2align 3
+.L1134:
+.LBE2099:
+.LBB2100:
+	.loc 1 507 0 is_stmt 1 discriminator 4
+	cmp	w11, 224
+	beq	.L1224
+	.loc 1 507 0 is_stmt 0 discriminator 6
+	and	w8, w8, -241
+	orr	w8, w11, w8
+	b	.L1133
+.LVL1271:
+	.p2align 3
+.L1142:
+.LBE2100:
+.LBB2101:
+	.loc 1 509 0 is_stmt 1 discriminator 4
+	cmp	w11, 57344
+	beq	.L1225
+	.loc 1 509 0 is_stmt 0 discriminator 6
+	and	w8, w8, -61441
+	orr	w8, w11, w8
+	b	.L1141
+.LVL1272:
+	.p2align 3
+.L1219:
+.LBE2101:
+.LBB2102:
+	.loc 1 522 0 is_stmt 1 discriminator 6
+	orr	w8, w8, -268435456
+	orr	x9, x9, 72057594037927936
+	b	.L1157
+.LVL1273:
+	.p2align 3
+.L1220:
+.LBE2102:
+.LBB2103:
+	.loc 1 508 0 discriminator 5
 	orr	w8, w8, 3840
 	orr	x9, x9, 65536
-	b	.L1130
-.LVL1282:
+	b	.L1137
+.LVL1274:
 	.p2align 3
-.L1215:
-.LBE2053:
-.LBB2054:
-	.loc 1 512 0 discriminator 5
+.L1222:
+.LBE2103:
+.LBB2104:
+	.loc 1 511 0 discriminator 5
 	orr	w8, w8, 15728640
 	orr	x9, x9, 1099511627776
-	b	.L1142
-.LVL1283:
+	b	.L1149
+.LVL1275:
 	.p2align 3
-.L1217:
-.LBE2054:
-.LBB2055:
-	.loc 1 508 0 discriminator 5
+.L1224:
+.LBE2104:
+.LBB2105:
+	.loc 1 507 0 discriminator 5
 	orr	w8, w8, 240
 	orr	x9, x9, 256
-	b	.L1126
-.LVL1284:
+	b	.L1133
+.LVL1276:
 	.p2align 3
-.L1214:
-.LBE2055:
-.LBB2056:
-	.loc 1 513 0 discriminator 5
+.L1221:
+.LBE2105:
+.LBB2106:
+	.loc 1 512 0 discriminator 5
 	orr	w8, w8, 251658240
 	orr	x9, x9, 281474976710656
-	b	.L1146
-.LVL1285:
+	b	.L1153
+.LVL1277:
 	.p2align 3
-.L1216:
-.LBE2056:
-.LBB2057:
-	.loc 1 511 0 discriminator 5
+.L1223:
+.LBE2106:
+.LBB2107:
+	.loc 1 510 0 discriminator 5
 	orr	w8, w8, 983040
 	orr	x9, x9, 4294967296
-	b	.L1138
-.LVL1286:
+	b	.L1145
+.LVL1278:
 	.p2align 3
-.L1208:
-.LBE2057:
-.LBB2058:
-	.loc 1 507 0 discriminator 5
+.L1215:
+.LBE2107:
+.LBB2108:
+	.loc 1 506 0 discriminator 5
 	orr	w8, w8, 15
-.LBE2058:
-	.loc 1 503 0 discriminator 5
+.LBE2108:
+	.loc 1 502 0 discriminator 5
 	mov	w5, 0
-.LBB2059:
-	.loc 1 507 0 discriminator 5
+.LBB2109:
+	.loc 1 506 0 discriminator 5
 	mov	x9, 1
-	b	.L1123
-.LVL1287:
+	b	.L1130
+.LVL1279:
 	.p2align 3
-.L1218:
-.LBE2059:
-.LBB2060:
-	.loc 1 510 0 discriminator 5
+.L1225:
+.LBE2109:
+.LBB2110:
+	.loc 1 509 0 discriminator 5
 	orr	w8, w8, 61440
 	orr	x9, x9, 16777216
-	b	.L1134
-.LVL1288:
-.L1177:
-.LBE2060:
-.LBB2061:
-	.loc 1 522 0 discriminator 3
-	cbz	w20, .L1219
-	.loc 1 522 0 is_stmt 0 discriminator 5
+	b	.L1141
+.LVL1280:
+.L1184:
+.LBE2110:
+.LBB2111:
+	.loc 1 521 0 discriminator 3
+	cbz	w20, .L1226
+	.loc 1 521 0 is_stmt 0 discriminator 5
 	cmp	w20, w30
-	beq	.L1220
-	.loc 1 522 0 discriminator 7
+	beq	.L1227
+	.loc 1 521 0 discriminator 7
 	and	w8, w8, -251658241
 	orr	w8, w20, w8
-	b	.L1176
-.LVL1289:
-.L1169:
-.LBE2061:
-.LBB2062:
-	.loc 1 520 0 is_stmt 1 discriminator 3
-	cbz	w20, .L1221
-	.loc 1 520 0 is_stmt 0 discriminator 5
+	b	.L1183
+.LVL1281:
+.L1176:
+.LBE2111:
+.LBB2112:
+	.loc 1 519 0 is_stmt 1 discriminator 3
+	cbz	w20, .L1228
+	.loc 1 519 0 is_stmt 0 discriminator 5
 	cmp	w20, 917504
-	beq	.L1222
-	.loc 1 520 0 discriminator 7
+	beq	.L1229
+	.loc 1 519 0 discriminator 7
 	and	w8, w8, -983041
 	orr	w8, w20, w8
-	b	.L1168
-.LVL1290:
-.L1173:
-.LBE2062:
-.LBB2063:
-	.loc 1 521 0 is_stmt 1 discriminator 3
-	cbz	w20, .L1223
-	.loc 1 521 0 is_stmt 0 discriminator 5
+	b	.L1175
+.LVL1282:
+.L1180:
+.LBE2112:
+.LBB2113:
+	.loc 1 520 0 is_stmt 1 discriminator 3
+	cbz	w20, .L1230
+	.loc 1 520 0 is_stmt 0 discriminator 5
 	cmp	w20, 14680064
-	beq	.L1224
-	.loc 1 521 0 discriminator 7
+	beq	.L1231
+	.loc 1 520 0 discriminator 7
 	and	w8, w8, -15728641
 	orr	w8, w20, w8
-	b	.L1172
-.LVL1291:
-.L1207:
-.LBE2063:
-.LBB2064:
-	.loc 1 516 0 is_stmt 1 discriminator 3
-	cbz	w5, .L1225
-	.loc 1 516 0 is_stmt 0 discriminator 5
+	b	.L1179
+.LVL1283:
+.L1214:
+.LBE2113:
+.LBB2114:
+	.loc 1 515 0 is_stmt 1 discriminator 3
+	cbz	w5, .L1232
+	.loc 1 515 0 is_stmt 0 discriminator 5
 	cmp	w5, 14
-	beq	.L1226
-	.loc 1 516 0 discriminator 7
+	beq	.L1233
+	.loc 1 515 0 discriminator 7
 	and	w8, w8, -16
 	orr	w8, w5, w8
-.LBE2064:
-	.loc 1 503 0 is_stmt 1 discriminator 7
+.LBE2114:
+	.loc 1 502 0 is_stmt 1 discriminator 7
 	mov	w5, 0
-	b	.L1153
-.LVL1292:
-.L1157:
-.LBB2065:
-	.loc 1 517 0 discriminator 3
-	cbz	w20, .L1227
-	.loc 1 517 0 is_stmt 0 discriminator 5
+	b	.L1160
+.LVL1284:
+.L1164:
+.LBB2115:
+	.loc 1 516 0 discriminator 3
+	cbz	w20, .L1234
+	.loc 1 516 0 is_stmt 0 discriminator 5
 	cmp	w20, 224
-	beq	.L1228
-	.loc 1 517 0 discriminator 7
+	beq	.L1235
+	.loc 1 516 0 discriminator 7
 	and	w8, w8, -241
 	orr	w8, w20, w8
-	b	.L1156
-.LVL1293:
-.L1161:
-.LBE2065:
-.LBB2066:
-	.loc 1 518 0 is_stmt 1 discriminator 3
-	cbz	w20, .L1229
-	.loc 1 518 0 is_stmt 0 discriminator 5
+	b	.L1163
+.LVL1285:
+.L1168:
+.LBE2115:
+.LBB2116:
+	.loc 1 517 0 is_stmt 1 discriminator 3
+	cbz	w20, .L1236
+	.loc 1 517 0 is_stmt 0 discriminator 5
 	cmp	w20, 3584
-	beq	.L1230
-	.loc 1 518 0 discriminator 7
+	beq	.L1237
+	.loc 1 517 0 discriminator 7
 	and	w8, w8, -3841
 	orr	w8, w20, w8
-	b	.L1160
-.LVL1294:
-.L1165:
-.LBE2066:
-.LBB2067:
-	.loc 1 519 0 is_stmt 1 discriminator 3
-	cbz	w20, .L1231
-	.loc 1 519 0 is_stmt 0 discriminator 5
+	b	.L1167
+.LVL1286:
+.L1172:
+.LBE2116:
+.LBB2117:
+	.loc 1 518 0 is_stmt 1 discriminator 3
+	cbz	w20, .L1238
+	.loc 1 518 0 is_stmt 0 discriminator 5
 	cmp	w20, 57344
-	beq	.L1232
-	.loc 1 519 0 discriminator 7
+	beq	.L1239
+	.loc 1 518 0 discriminator 7
 	and	w8, w8, -61441
 	orr	w8, w20, w8
-	b	.L1164
-.L1231:
-	.loc 1 519 0 discriminator 4
+	b	.L1171
+.L1238:
+	.loc 1 518 0 discriminator 4
 	orr	w5, w5, 61440
 	orr	x11, x11, 16777216
-	b	.L1164
-.LVL1295:
-.L1229:
-.LBE2067:
-.LBB2068:
-	.loc 1 518 0 is_stmt 1 discriminator 4
+	b	.L1171
+.LVL1287:
+.L1236:
+.LBE2117:
+.LBB2118:
+	.loc 1 517 0 is_stmt 1 discriminator 4
 	orr	w5, w5, 3840
 	orr	x11, x11, 65536
-	b	.L1160
-.LVL1296:
-.L1227:
-.LBE2068:
-.LBB2069:
-	.loc 1 517 0 discriminator 4
+	b	.L1167
+.LVL1288:
+.L1234:
+.LBE2118:
+.LBB2119:
+	.loc 1 516 0 discriminator 4
 	orr	w5, w5, 240
 	orr	x11, x11, 256
-	b	.L1156
-.LVL1297:
-.L1225:
-.LBE2069:
-.LBB2070:
-	.loc 1 516 0 discriminator 4
+	b	.L1163
+.LVL1289:
+.L1232:
+.LBE2119:
+.LBB2120:
+	.loc 1 515 0 discriminator 4
 	orr	x11, x11, 1
 	mov	w5, 15
-	b	.L1153
-.LVL1298:
-.L1223:
-.LBE2070:
-.LBB2071:
-	.loc 1 521 0 discriminator 4
+	b	.L1160
+.LVL1290:
+.L1230:
+.LBE2120:
+.LBB2121:
+	.loc 1 520 0 discriminator 4
 	orr	w5, w5, 15728640
 	orr	x11, x11, 1099511627776
-	b	.L1172
-.LVL1299:
-.L1221:
-.LBE2071:
-.LBB2072:
-	.loc 1 520 0 discriminator 4
+	b	.L1179
+.LVL1291:
+.L1228:
+.LBE2121:
+.LBB2122:
+	.loc 1 519 0 discriminator 4
 	orr	w5, w5, 983040
 	orr	x11, x11, 4294967296
-	b	.L1168
-.LVL1300:
-.L1219:
-.LBE2072:
-.LBB2073:
-	.loc 1 522 0 discriminator 4
+	b	.L1175
+.LVL1292:
+.L1226:
+.LBE2122:
+.LBB2123:
+	.loc 1 521 0 discriminator 4
 	orr	w5, w5, 251658240
 	orr	x11, x11, 281474976710656
-	b	.L1176
-.LVL1301:
-.L1198:
+	b	.L1183
+.LVL1293:
+.L1205:
 	.cfi_def_cfa 31, 0
 	.cfi_restore 19
 	.cfi_restore 20
 	.cfi_restore 29
 	.cfi_restore 30
 	ret
-.LVL1302:
-.L1220:
+.LVL1294:
+.L1227:
 	.cfi_def_cfa 29, 32
 	.cfi_offset 19, -16
 	.cfi_offset 20, -8
 	.cfi_offset 29, -32
 	.cfi_offset 30, -24
-	.loc 1 522 0 is_stmt 0 discriminator 6
+	.loc 1 521 0 is_stmt 0 discriminator 6
 	orr	w8, w8, 251658240
 	orr	x11, x11, 281474976710656
-	b	.L1176
-.LVL1303:
-.L1222:
-.LBE2073:
-.LBB2074:
-	.loc 1 520 0 is_stmt 1 discriminator 6
+	b	.L1183
+.LVL1295:
+.L1229:
+.LBE2123:
+.LBB2124:
+	.loc 1 519 0 is_stmt 1 discriminator 6
 	orr	w8, w8, 983040
 	orr	x11, x11, 4294967296
-	b	.L1168
-.LVL1304:
-.L1224:
-.LBE2074:
-.LBB2075:
-	.loc 1 521 0 discriminator 6
+	b	.L1175
+.LVL1296:
+.L1231:
+.LBE2124:
+.LBB2125:
+	.loc 1 520 0 discriminator 6
 	orr	w8, w8, 15728640
 	orr	x11, x11, 1099511627776
-	b	.L1172
-.LVL1305:
-.L1226:
-.LBE2075:
-.LBB2076:
-	.loc 1 516 0 discriminator 6
+	b	.L1179
+.LVL1297:
+.L1233:
+.LBE2125:
+.LBB2126:
+	.loc 1 515 0 discriminator 6
 	orr	w8, w8, 15
 	orr	x11, x11, 1
-.LBE2076:
-	.loc 1 503 0 discriminator 6
+.LBE2126:
+	.loc 1 502 0 discriminator 6
 	mov	w5, 0
-.LBB2077:
-	b	.L1153
-.LVL1306:
-.L1228:
-.LBE2077:
-.LBB2078:
-	.loc 1 517 0 discriminator 6
+.LBB2127:
+	b	.L1160
+.LVL1298:
+.L1235:
+.LBE2127:
+.LBB2128:
+	.loc 1 516 0 discriminator 6
 	orr	w8, w8, 240
 	orr	x11, x11, 256
-	b	.L1156
-.LVL1307:
-.L1230:
-.LBE2078:
-.LBB2079:
-	.loc 1 518 0 discriminator 6
+	b	.L1163
+.LVL1299:
+.L1237:
+.LBE2128:
+.LBB2129:
+	.loc 1 517 0 discriminator 6
 	orr	w8, w8, 3840
 	orr	x11, x11, 65536
-	b	.L1160
-.LVL1308:
-.L1232:
-.LBE2079:
-.LBB2080:
-	.loc 1 519 0 discriminator 6
+	b	.L1167
+.LVL1300:
+.L1239:
+.LBE2129:
+.LBB2130:
+	.loc 1 518 0 discriminator 6
 	orr	w8, w8, 61440
 	orr	x11, x11, 16777216
-	b	.L1164
-.LBE2080:
+	b	.L1171
+.LBE2130:
 	.cfi_endproc
 .LFE2818:
 	.size	refresh_new_image, .-refresh_new_image
@@ -13190,113 +13266,113 @@
 	.type	refresh_new_image_auto, %function
 refresh_new_image_auto:
 .LFB2819:
-	.loc 1 535 0
+	.loc 1 534 0
 	.cfi_startproc
-.LVL1309:
-	.loc 1 542 0
+.LVL1301:
+	.loc 1 541 0
 	ldp	w15, w4, [x3, 92]
 	cmp	w4, 0
 	add	w10, w4, 7
 	csel	w10, w10, w4, lt
-.LVL1310:
-	.loc 1 544 0
+.LVL1302:
+	.loc 1 543 0
 	cmp	w15, 0
-	.loc 1 542 0
+	.loc 1 541 0
 	asr	w10, w10, 3
-.LVL1311:
-	.loc 1 544 0
-	ble	.L1233
+.LVL1303:
+	.loc 1 543 0
+	ble	.L1240
 	sub	w14, w10, #1
 	mov	w12, 0
-.LVL1312:
+.LVL1304:
 	add	x14, x14, 1
-	.loc 1 557 0
+	.loc 1 556 0
 	mov	w11, 15
 	lsl	x13, x14, 2
 	lsl	x14, x14, 3
-.LVL1313:
+.LVL1305:
 	.p2align 2
-.L1235:
-	.loc 1 545 0 discriminator 1
+.L1242:
+	.loc 1 544 0 discriminator 1
 	cmp	w10, 0
-	ble	.L1246
+	ble	.L1253
 	add	x7, x0, 4
-	.loc 1 545 0 is_stmt 0
+	.loc 1 544 0 is_stmt 0
 	mov	x5, 0
 	.p2align 2
-.L1245:
-	.loc 1 547 0 is_stmt 1
+.L1252:
+	.loc 1 546 0 is_stmt 1
 	ldr	w3, [x1, x5, lsl 2]
-.LVL1314:
-	.loc 1 548 0
+.LVL1306:
+	.loc 1 547 0
 	ldr	w8, [x7, -4]
-.LVL1315:
+.LVL1307:
 	eor	w6, w3, w8
-	.loc 1 551 0
+	.loc 1 550 0
 	cmp	w3, w8
-	beq	.L1236
-	.loc 1 546 0
+	beq	.L1243
+	.loc 1 545 0
 	ldr	x4, [x2, x5, lsl 3]
-.LVL1316:
-	.loc 1 556 0
+.LVL1308:
+	.loc 1 555 0
 	and	x3, x4, 255
-.LVL1317:
-	.loc 1 557 0
+.LVL1309:
+	.loc 1 556 0
 	cmp	x3, 0
 	csel	w3, wzr, w11, ne
-.LVL1318:
-	.loc 1 561 0
+.LVL1310:
+	.loc 1 560 0
 	tst	x4, 65280
 	orr	w9, w3, 240
 	csel	w3, w9, w3, eq
-	.loc 1 565 0
+	.loc 1 564 0
 	tst	x4, 16711680
 	orr	w9, w3, 3840
 	csel	w3, w9, w3, eq
-	.loc 1 569 0
+	.loc 1 568 0
 	tst	x4, 4278190080
 	orr	w9, w3, 61440
 	csel	w3, w9, w3, eq
-	.loc 1 573 0
+	.loc 1 572 0
 	tst	x4, 1095216660480
 	orr	w9, w3, 983040
 	csel	w3, w9, w3, eq
-	.loc 1 577 0
+	.loc 1 576 0
 	tst	x4, 280375465082880
 	orr	w9, w3, 15728640
 	csel	w3, w9, w3, eq
-	.loc 1 581 0
+	.loc 1 580 0
 	tst	x4, 71776119061217280
 	orr	w9, w3, 251658240
 	csel	w3, w9, w3, eq
-	.loc 1 585 0
+	.loc 1 584 0
 	tst	x4, -72057594037927936
 	orr	w4, w3, -268435456
-.LVL1319:
+.LVL1311:
 	csel	w3, w4, w3, eq
 	and	w3, w6, w3
-.LVL1320:
-	.loc 1 588 0
+.LVL1312:
+	.loc 1 587 0
 	eor	w3, w3, w8
-	.loc 1 589 0
+	.loc 1 588 0
 	str	w3, [x7, -4]
-.LVL1321:
-.L1236:
+.LVL1313:
+.L1243:
 	add	x5, x5, 1
 	add	x7, x7, 4
-	.loc 1 545 0 discriminator 2
+	.loc 1 544 0 discriminator 2
 	cmp	w10, w5
-	bgt	.L1245
+	bgt	.L1252
 	add	x0, x0, x13
 	add	x2, x2, x14
 	add	x1, x1, x13
-.LVL1322:
-.L1246:
-	.loc 1 544 0 discriminator 2
+.LVL1314:
+.L1253:
+	.loc 1 543 0 discriminator 2
 	add	w12, w12, 1
 	cmp	w15, w12
-	bne	.L1235
-.L1233:
+	bne	.L1242
+.L1240:
 	ret
 	.cfi_endproc
 .LFE2819:
@@ -13306,957 +13382,139 @@
 	.type	ebc_thread, %function
 ebc_thread:
 .LFB2844:
-	.loc 1 2332 0
+	.loc 1 2333 0
 	.cfi_startproc
-.LVL1323:
+.LVL1315:
 	stp	x29, x30, [sp, -160]!
 	.cfi_def_cfa_offset 160
 	.cfi_offset 29, -160
 	.cfi_offset 30, -152
-	.loc 1 2333 0
+	.loc 1 2334 0
 	adrp	x1, .LANCHOR0
-	.loc 1 2332 0
+	.loc 1 2333 0
 	adrp	x0, __stack_chk_guard
-.LVL1324:
+.LVL1316:
 	add	x0, x0, :lo12:__stack_chk_guard
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
 	stp	x19, x20, [sp, 16]
 	.cfi_offset 19, -144
 	.cfi_offset 20, -136
-.LBB2168:
-.LBB2169:
-.LBB2170:
-	.loc 1 2785 0
-	adrp	x20, .LANCHOR1
-.LBE2170:
-.LBE2169:
-.LBE2168:
-	.loc 1 2332 0
-	stp	x21, x22, [sp, 32]
-.LBB2181:
-.LBB2177:
-.LBB2173:
-	.loc 1 2785 0
-	add	x20, x20, :lo12:.LANCHOR1
-.LBE2173:
-.LBE2177:
-.LBE2181:
+	.loc 1 2341 0
+	mov	w19, 0
+.LVL1317:
 	.loc 1 2333 0
-	ldr	x19, [x1, #:lo12:.LANCHOR0]
-.LVL1325:
-.LBB2182:
-.LBB2178:
-.LBB2174:
-	.loc 1 2785 0
-	add	x20, x20, 304
-.LBE2174:
-.LBE2178:
-.LBE2182:
-	.loc 1 2332 0
-	stp	x23, x24, [sp, 48]
+	stp	x21, x22, [sp, 32]
 	.cfi_offset 21, -128
 	.cfi_offset 22, -120
+.LBB2218:
+.LBB2219:
+.LBB2220:
+	.loc 1 2788 0
+	adrp	x21, .LANCHOR1
+.LBE2220:
+.LBE2219:
+.LBE2218:
+	.loc 1 2334 0
+	ldr	x20, [x1, #:lo12:.LANCHOR0]
+.LVL1318:
+.LBB2229:
+.LBB2226:
+.LBB2223:
+	.loc 1 2788 0
+	add	x21, x21, :lo12:.LANCHOR1
+.LBE2223:
+.LBE2226:
+.LBE2229:
+	.loc 1 2333 0
+	stp	x23, x24, [sp, 48]
+.LBB2230:
+.LBB2227:
+.LBB2224:
+	.loc 1 2788 0
+	add	x21, x21, 304
+.LBE2224:
+.LBE2227:
+.LBE2230:
+	.loc 1 2333 0
+	stp	x25, x26, [sp, 64]
 	.cfi_offset 23, -112
 	.cfi_offset 24, -104
-.LBB2183:
-.LBB2179:
-.LBB2175:
-	.loc 1 2785 0
-	mov	w22, 1
-.LBE2175:
-.LBE2179:
-.LBE2183:
-	.loc 1 2332 0
-	stp	x25, x26, [sp, 64]
-	.loc 1 2334 0
-	add	x23, x19, 192
-	.loc 1 2332 0
-	stp	x27, x28, [sp, 80]
 	.cfi_offset 25, -96
 	.cfi_offset 26, -88
+	.loc 1 2335 0
+	add	x23, x20, 192
+	.loc 1 2333 0
+	stp	x27, x28, [sp, 80]
 	.cfi_offset 27, -80
 	.cfi_offset 28, -72
-	add	x21, x19, 24
-	.loc 1 2340 0
-	stp	wzr, wzr, [x29, 104]
-	.loc 1 2332 0
+	add	x22, x20, 24
+	.loc 1 2339 0
+	str	wzr, [x29, 108]
+	.loc 1 2333 0
 	ldr	x1, [x0]
 	str	x1, [x29, 152]
 	mov	x1,0
-.LVL1326:
+.LVL1319:
 	.p2align 2
-.L1250:
-	.loc 1 2344 0
-	ldr	w0, [x23, 608]
-.LVL1327:
-	cbz	w0, .L1251
-	.loc 1 2344 0 is_stmt 0 discriminator 1
-	ldr	w0, [x21, 160]
-	cbz	w0, .L1639
-.L1251:
-	.loc 1 2350 0 is_stmt 1
-	bl	ebc_osd_buf_get
-.LVL1328:
-	mov	x24, x0
-.LVL1329:
-	.loc 1 2351 0
-	cbz	x0, .L1253
-	.loc 1 2352 0
-	ldr	x0, [x23, 600]
-	cbnz	x0, .L1254
-	.loc 1 2352 0 is_stmt 0 discriminator 1
-	ldr	w0, [x23, 608]
-	cbnz	w0, .L1254
-	.loc 1 2358 0 is_stmt 1
-	ldr	w0, [x23, 264]
-	sub	w1, w0, #1
-	cmp	w1, 1
-	bls	.L1640
-	.loc 1 2361 0
-	cmp	w0, 3
-	beq	.L1641
-.L1258:
-	.loc 1 2367 0
-	str	x24, [x23, 248]
-	.loc 1 2368 0
-	mov	w0, 4
-	str	w0, [x23, 264]
-	.loc 1 2371 0
-	ldr	x4, [x23, 232]
-.LBB2184:
-.LBB2185:
-	.loc 1 437 0
-	ldp	w0, w14, [x24, 48]
-	.loc 1 438 0
-	ldp	w2, w18, [x24, 56]
-	.loc 1 435 0
-	cmp	w0, 0
-	.loc 1 440 0
-	ldr	w1, [x19, 288]
-	.loc 1 435 0
-	add	w17, w0, 7
-	csel	w17, w17, w0, lt
-	.loc 1 436 0
-	add	w11, w2, 7
-	cmp	w2, 0
-	.loc 1 440 0
-	add	w0, w1, 7
-	.loc 1 436 0
-	csel	w11, w11, w2, lt
-	.loc 1 440 0
-	cmp	w1, 0
-	csel	w0, w0, w1, lt
-	.loc 1 436 0
-	asr	w11, w11, 3
-	.loc 1 440 0
-	asr	w0, w0, 3
-.LVL1330:
-	ldr	w2, [x19, 284]
-	.loc 1 436 0
-	add	w11, w11, 1
-.LVL1331:
-	.loc 1 443 0
-	sub	w3, w0, #1
-.LBE2185:
-.LBE2184:
-	.loc 1 2373 0
-	ldp	x10, x6, [x23, 176]
-.LVL1332:
-.LBB2234:
-.LBB2228:
-	.loc 1 447 0
-	mul	w1, w14, w0
-	.loc 1 443 0
-	cmp	w11, w0
-.LBE2228:
-.LBE2234:
-	.loc 1 2369 0
-	ldr	x5, [x23, 152]
-.LBB2235:
-.LBB2229:
-	.loc 1 443 0
-	csel	w11, w3, w11, ge
-.LBE2229:
-.LBE2235:
-	.loc 1 2371 0
-	ldr	x9, [x4, 16]
-.LVL1333:
-.LBB2236:
-.LBB2230:
-	.loc 1 445 0
-	cmp	w2, w18
-	.loc 1 447 0
-	sxtw	x1, w1
-	.loc 1 445 0
-	sub	w3, w2, #1
-.LBE2230:
-.LBE2236:
-	.loc 1 2370 0
-	ldr	x8, [x24, 16]
-.LBB2237:
-.LBB2231:
-	.loc 1 447 0
-	lsl	x2, x1, 2
-	.loc 1 445 0
-	csel	w18, w3, w18, le
-	.loc 1 450 0
-	lsl	x1, x1, 3
-	.loc 1 435 0
-	asr	w17, w17, 3
-.LVL1334:
-	.loc 1 447 0
-	add	x5, x5, x2
-.LVL1335:
-	.loc 1 450 0
-	add	x10, x10, x1
-.LVL1336:
-	.loc 1 451 0
-	add	x6, x6, x1
-.LVL1337:
-	.loc 1 453 0
-	cmp	w14, w18
-	.loc 1 449 0
-	add	x9, x9, x2
-.LVL1338:
-	.loc 1 448 0
-	add	x8, x8, x2
-.LVL1339:
-	.loc 1 453 0
-	bgt	.L1265
-	sxtw	x0, w0
-.LBB2186:
-	.loc 1 468 0
-	mov	w13, 251658240
-	lsl	x16, x0, 2
-	lsl	x15, x0, 3
-	mov	w25, 234881024
-.LVL1340:
-.LBE2186:
-.LBB2187:
-	.loc 1 469 0
-	mov	w12, -268435456
-	mov	w24, -536870912
-.LVL1341:
-	.p2align 2
-.L1266:
-.LBE2187:
-	.loc 1 454 0
-	mov	w4, w17
-	cmp	w17, w11
-	bgt	.L1300
-	.p2align 2
-.L1540:
-	.loc 1 455 0
-	sxtw	x1, w4
-.LVL1342:
-	.loc 1 460 0
-	mov	w2, 0
-	.loc 1 455 0
-	add	x26, x5, x1, lsl 2
-.LVL1343:
-	.loc 1 459 0
-	add	x28, x6, x1, lsl 3
-	.loc 1 458 0
-	ldr	x3, [x10, x1, lsl 3]
-.LVL1344:
-	.loc 1 455 0
-	ldr	w7, [x5, x1, lsl 2]
-	.loc 1 456 0
-	ldr	w0, [x8, x1, lsl 2]
-.LVL1345:
-	.loc 1 462 0
-	and	x30, x3, 255
-.LVL1346:
-	.loc 1 457 0
-	ldr	w27, [x9, x1, lsl 2]
-.LVL1347:
-	.loc 1 459 0
-	ldr	x1, [x6, x1, lsl 3]
-.LVL1348:
-	.loc 1 462 0
-	cbnz	x30, .L1267
-.LVL1349:
-.LBB2188:
-	and	w2, w0, 15
-.LBE2188:
-	and	x1, x1, -256
-.LBB2189:
-	cmp	w2, 15
-	bne	.L1642
-.L1267:
-.LBE2189:
-	.loc 1 463 0
-	tst	x3, 65280
-	bne	.L1270
-.LBB2190:
-	and	w30, w0, 240
-.LVL1350:
-.LBE2190:
-	and	x1, x1, -65281
-.LBB2191:
-	cmp	w30, 240
-	bne	.L1271
-	orr	w2, w2, 240
-.L1270:
-.LBE2191:
-	.loc 1 464 0
-	tst	x3, 16711680
-	bne	.L1274
-.LBB2192:
-	and	w30, w0, 3840
-.LVL1351:
-.LBE2192:
-	and	x1, x1, -16711681
-.LBB2193:
-	cmp	w30, 3840
-	bne	.L1275
-	orr	w2, w2, 3840
-.LVL1352:
-.L1274:
-.LBE2193:
-	.loc 1 465 0
-	tst	x3, 4278190080
-	bne	.L1278
-.LBB2194:
-	and	w30, w0, 61440
-.LVL1353:
-.LBE2194:
-	and	x1, x1, -4278190081
-.LBB2195:
-	cmp	w30, 61440
-	bne	.L1279
-	orr	w2, w2, 61440
-.LVL1354:
-.L1278:
-.LBE2195:
-	.loc 1 466 0
-	tst	x3, 1095216660480
-	bne	.L1282
-.LBB2196:
-	and	w30, w0, 983040
-.LVL1355:
-.LBE2196:
-	and	x1, x1, -1095216660481
-.LBB2197:
-	cmp	w30, 983040
-	bne	.L1283
-	orr	w2, w2, 983040
-.LVL1356:
-.L1282:
-.LBE2197:
-	.loc 1 467 0
-	tst	x3, 280375465082880
-	bne	.L1286
-.LBB2198:
-	and	w30, w0, 15728640
-.LVL1357:
-.LBE2198:
-	and	x1, x1, -280375465082881
-.LBB2199:
-	cmp	w30, 15728640
-	bne	.L1287
-	orr	w2, w2, 15728640
-.LVL1358:
-.L1286:
-.LBE2199:
-	.loc 1 468 0
-	tst	x3, 71776119061217280
-	bne	.L1290
-.LBB2200:
-	and	w30, w0, 251658240
-.LVL1359:
-.LBE2200:
-	and	x1, x1, -71776119061217281
-.LBB2201:
-	cmp	w30, w13
-	bne	.L1291
-	orr	w2, w2, 251658240
-.LVL1360:
-.L1290:
-.LBE2201:
-	.loc 1 469 0
-	tst	x3, -72057594037927936
-	bne	.L1294
-.LBB2202:
-	and	w3, w0, -268435456
-.LVL1361:
-.LBE2202:
-	and	x1, x1, 72057594037927935
-.LBB2203:
-	cmp	w3, w12
-	bne	.L1295
-	orr	w2, w2, -268435456
-.LVL1362:
-.L1294:
-.LBE2203:
-	.loc 1 472 0
-	and	w0, w0, w27
-.LVL1363:
-	.loc 1 473 0
-	str	x1, [x28]
-	eor	w0, w0, w7
-.LVL1364:
-	.loc 1 454 0
-	add	w4, w4, 1
-	and	w0, w0, w2
-	cmp	w4, w11
-	.loc 1 472 0
-	eor	w0, w7, w0
-	.loc 1 474 0
-	str	w0, [x26]
-	.loc 1 454 0
-	ble	.L1540
-.LVL1365:
-.L1300:
-	.loc 1 453 0
-	add	w14, w14, 1
-	.loc 1 476 0
-	add	x5, x5, x16
-	.loc 1 477 0
-	add	x8, x8, x16
-	.loc 1 478 0
-	add	x9, x9, x16
-	.loc 1 479 0
-	add	x10, x10, x15
-	.loc 1 480 0
-	add	x6, x6, x15
-	.loc 1 453 0
-	cmp	w14, w18
-	ble	.L1266
-.LVL1366:
-.L1265:
-.LBE2231:
-.LBE2237:
-	.loc 1 2375 0
-	ldr	w0, [x23, 52]
-.LVL1367:
-	cbnz	w0, .L1301
-	.loc 1 2377 0
-	ldr	w0, [x23, 208]
-	.loc 1 2376 0
-	str	w22, [x23, 52]
-	.loc 1 2377 0
-	cbz	w0, .L1643
-.L1302:
-	.loc 1 2379 0
-	mov	w1, 1
-.LVL1368:
-	mov	x0, x19
-	bl	ebc_lut_update
-.LVL1369:
-	.loc 1 2381 0
-	ldr	w3, [x23, 112]
-	.loc 1 2383 0
-	adrp	x1, .LC105
-	ldr	x0, [x23, 104]
-	add	x1, x1, :lo12:.LC105
-	and	w2, w3, 255
-	.loc 1 2381 0
-	strb	w3, [x23, 56]
-	.loc 1 2382 0
-	lsr	w4, w3, 8
-	strb	w4, [x23, 57]
-	.loc 1 2383 0
-	and	w3, w4, 255
-	bl	_dev_info
-.LVL1370:
-	.loc 1 2384 0
-	mov	x0, x19
-	bl	ebc_frame_start
-.LVL1371:
-.L1303:
-	.loc 1 2388 0
-	ldr	x0, [x23, 240]
-	cbz	x0, .L1304
-	.loc 1 2389 0
-	bl	ebc_buf_release
-.LVL1372:
-.L1304:
-	.loc 1 2390 0
-	ldr	x0, [x23, 248]
-	str	x0, [x23, 240]
-	.loc 1 2392 0
-	b	.L1250
-.LVL1373:
-	.p2align 3
-.L1287:
-.LBB2238:
-.LBB2232:
-.LBB2204:
-	.loc 1 467 0
-	cbnz	w30, .L1288
-	orr	w2, w2, 15728640
-	orr	x1, x1, 1099511627776
-	b	.L1286
-.LVL1374:
-	.p2align 3
-.L1291:
-.LBE2204:
-.LBB2205:
-	.loc 1 468 0
-	cbnz	w30, .L1292
-	orr	w2, w2, 251658240
-	orr	x1, x1, 281474976710656
-	b	.L1290
-.LVL1375:
-	.p2align 3
-.L1295:
-.LBE2205:
-.LBB2206:
-	.loc 1 469 0
-	cbnz	w3, .L1296
-	orr	w2, w2, -268435456
-	orr	x1, x1, 72057594037927936
-	b	.L1294
-.LVL1376:
-	.p2align 3
-.L1271:
-.LBE2206:
-.LBB2207:
-	.loc 1 463 0
-	cbnz	w30, .L1272
-	orr	w2, w2, 240
-	orr	x1, x1, 256
-	b	.L1270
-.LVL1377:
-	.p2align 3
-.L1642:
-.LBE2207:
-.LBB2208:
-	.loc 1 462 0
-	cbnz	w2, .L1268
-	orr	x1, x1, 1
-	mov	w2, 15
-	b	.L1267
-.LVL1378:
-	.p2align 3
-.L1279:
-.LBE2208:
-.LBB2209:
-	.loc 1 465 0
-	cbnz	w30, .L1280
-	orr	w2, w2, 61440
-	orr	x1, x1, 16777216
-	b	.L1278
-.LVL1379:
-	.p2align 3
-.L1275:
-.LBE2209:
-.LBB2210:
-	.loc 1 464 0
-	cbnz	w30, .L1276
-	orr	w2, w2, 3840
-	orr	x1, x1, 65536
-	b	.L1274
-.LVL1380:
-	.p2align 3
-.L1283:
-.LBE2210:
-.LBB2211:
-	.loc 1 466 0
-	cbnz	w30, .L1284
-	orr	w2, w2, 983040
-	orr	x1, x1, 4294967296
-	b	.L1282
-.LVL1381:
-	.p2align 3
-.L1288:
-.LBE2211:
-.LBB2212:
-	.loc 1 467 0
-	cmp	w30, 14680064
-	beq	.L1644
-	and	w7, w7, -15728641
-	orr	w7, w30, w7
-	b	.L1286
-.LVL1382:
-	.p2align 3
-.L1292:
-.LBE2212:
-.LBB2213:
-	.loc 1 468 0
-	cmp	w30, w25
-	beq	.L1645
-	and	w7, w7, -251658241
-	orr	w7, w30, w7
-	b	.L1290
-.LVL1383:
-	.p2align 3
-.L1284:
-.LBE2213:
-.LBB2214:
-	.loc 1 466 0
-	cmp	w30, 917504
-	beq	.L1646
-	and	w7, w7, -983041
-	orr	w7, w30, w7
-	b	.L1282
-.LVL1384:
-	.p2align 3
-.L1272:
-.LBE2214:
-.LBB2215:
-	.loc 1 463 0
-	cmp	w30, 224
-	beq	.L1647
-	and	w7, w7, -241
-	orr	w7, w30, w7
-	b	.L1270
-.LVL1385:
-	.p2align 3
-.L1296:
-.LBE2215:
-.LBB2216:
-	.loc 1 469 0
-	cmp	w3, w24
-	beq	.L1648
-	and	w7, w7, 268435455
-	orr	w7, w3, w7
-	b	.L1294
-.LVL1386:
-	.p2align 3
-.L1268:
-.LBE2216:
-.LBB2217:
-	.loc 1 462 0
-	cmp	w2, 14
-	beq	.L1649
-	and	w7, w7, -16
-	orr	w7, w2, w7
-.LBE2217:
-	.loc 1 460 0
-	mov	w2, 0
-	b	.L1267
-.LVL1387:
-	.p2align 3
-.L1280:
-.LBB2218:
-	.loc 1 465 0
-	cmp	w30, 57344
-	beq	.L1650
-	and	w7, w7, -61441
-	orr	w7, w30, w7
-	b	.L1278
-.LVL1388:
-	.p2align 3
-.L1276:
-.LBE2218:
-.LBB2219:
-	.loc 1 464 0
-	cmp	w30, 3584
-	beq	.L1651
-	and	w7, w7, -3841
-	orr	w7, w30, w7
-	b	.L1274
-.LVL1389:
-	.p2align 3
-.L1254:
-.LBE2219:
-.LBE2232:
-.LBE2238:
-	.loc 1 2353 0
-	ldr	x0, [x23, 104]
-	adrp	x1, .LC102
-	add	x1, x1, :lo12:.LC102
-	bl	_dev_info
-.LVL1390:
-	.loc 1 2354 0
-	mov	x0, x24
-	bl	ebc_buf_release
-.LVL1391:
-	.loc 1 2356 0
-	b	.L1250
-.LVL1392:
-.L1644:
-.LBB2239:
-.LBB2233:
-.LBB2220:
-	.loc 1 467 0
-	orr	w7, w7, 15728640
-	orr	x1, x1, 1099511627776
-	b	.L1286
-.LVL1393:
-.L1645:
-.LBE2220:
-.LBB2221:
-	.loc 1 468 0
-	orr	w7, w7, 251658240
-	orr	x1, x1, 281474976710656
-	b	.L1290
-.LVL1394:
-.L1647:
-.LBE2221:
-.LBB2222:
-	.loc 1 463 0
-	orr	w7, w7, 240
-	orr	x1, x1, 256
-	b	.L1270
-.LVL1395:
-.L1649:
-.LBE2222:
-.LBB2223:
-	.loc 1 462 0
-	orr	w7, w7, 15
-	orr	x1, x1, 1
-.LBE2223:
-	.loc 1 460 0
-	mov	w2, 0
-	b	.L1267
-.LVL1396:
-.L1648:
-.LBB2224:
-	.loc 1 469 0
-	orr	w7, w7, -268435456
-	orr	x1, x1, 72057594037927936
-	b	.L1294
-.LVL1397:
-.L1650:
-.LBE2224:
-.LBB2225:
-	.loc 1 465 0
-	orr	w7, w7, 61440
-	orr	x1, x1, 16777216
-	b	.L1278
-.LVL1398:
-.L1646:
-.LBE2225:
-.LBB2226:
-	.loc 1 466 0
-	orr	w7, w7, 983040
-	orr	x1, x1, 4294967296
-	b	.L1282
-.LVL1399:
-.L1651:
-.LBE2226:
-.LBB2227:
-	.loc 1 464 0
-	orr	w7, w7, 3840
-	orr	x1, x1, 65536
-	b	.L1274
-.LVL1400:
-.L1253:
-.LBE2227:
-.LBE2233:
-.LBE2239:
-	.loc 1 2395 0
-	ldr	w0, [x23, 620]
-	cbz	w0, .L1305
-	.loc 1 2395 0 is_stmt 0 discriminator 1
-	ldr	w0, [x23, 616]
-	cbnz	w0, .L1305
-.L1306:
-	.loc 1 2784 0 is_stmt 1
-	ldr	w0, [x23, 100]
-	cbz	w0, .L1652
-.L1442:
-.LVL1401:
-.L1440:
-	.loc 1 2810 0
-	str	wzr, [x23, 100]
-	b	.L1250
-.LVL1402:
-.L1305:
-	.loc 1 2396 0
-	bl	ebc_dsp_buf_get
-.LVL1403:
-	mov	x24, x0
-	.loc 1 2397 0
-	cbz	x0, .L1306
-	.loc 1 2398 0
-	ldr	w1, [x21, 160]
-	cbnz	w1, .L1307
-	.loc 1 2399 0
-	ldr	w1, [x0, 40]
-	sub	w2, w1, #18
-	tst	w2, -3
-	bne	.L1308
-	.loc 1 2400 0
-	adrp	x0, .LANCHOR0
-	add	x0, x0, :lo12:.LANCHOR0
-	str	wzr, [x0, 32]
-.L1309:
-	.loc 1 2477 0
-	ldr	w0, [x29, 108]
-.LVL1404:
-	cbz	w0, .L1321
-	.loc 1 2479 0
-	ldr	w0, [x24, 64]
-.LVL1405:
-	cbnz	w0, .L1322
-	.loc 1 2480 0
-	mov	w0, 21
-	.loc 1 2481 0
-	str	w22, [x24, 64]
-	.loc 1 2480 0
-	str	w0, [x24, 40]
-.L1323:
-	.loc 1 2586 0
-	ldr	w0, [x23, 484]
-	cbz	w0, .L1448
-.L1372:
-	.loc 1 2649 0
-	ldr	w0, [x23, 52]
-	.loc 1 2643 0
-	mov	w25, 1
-.LVL1406:
-	.loc 1 2649 0
-	cbnz	w0, .L1653
-.L1391:
-.LVL1407:
-.L1388:
-	.loc 1 2654 0
-	ldr	w0, [x23, 264]
-.LVL1408:
-	sub	w0, w0, #3
-	cmp	w0, 1
-	bls	.L1654
-.L1393:
-	.loc 1 2658 0
-	ldr	w0, [x24, 40]
-	sub	w1, w0, #7
-	.loc 1 2657 0
-	cmp	w1, 1
-	bls	.L1655
-.L1394:
-	.loc 1 2673 0
-	sub	w0, w0, #2
-	.loc 1 2672 0
-	cmp	w0, 14
-	bhi	.L1396
-	ldr	x0, [x23, 224]
-.LBB2240:
-.LBB2241:
-	.loc 1 2286 0
-	ldr	w1, [x23, 28]
-	ldr	x4, [x24, 16]
-	cmp	w1, 0
-	ldr	x5, [x0, 16]
-	add	w0, w1, 7
-	csel	w0, w0, w1, lt
-	asr	w0, w0, 3
-	cmp	w0, 0
-	ble	.L1398
-	.loc 1 2290 0
-	ldr	x1, [x4]
-	ldr	x2, [x5]
-	cmp	x2, x1
-	bne	.L1396
-	sub	w1, w0, #1
-	mov	x0, 8
-	add	x1, x1, 1
-	lsl	x1, x1, 3
-	b	.L1400
-	.p2align 3
-.L1401:
-	.loc 1 2287 0
-	ldr	x3, [x4, x0]
-	add	x0, x0, 8
-	.loc 1 2288 0
-	add	x2, x5, x0
-	.loc 1 2290 0
-	ldr	x2, [x2, -8]
-	cmp	x3, x2
-	bne	.L1396
-.L1400:
-	.loc 1 2286 0
-	cmp	x1, x0
-	bne	.L1401
-.L1398:
-.LBE2241:
-.LBE2240:
-	.loc 1 2675 0
-	ldr	x0, [x23, 104]
-	adrp	x1, .LC118
-	add	x1, x1, :lo12:.LC118
-	bl	_dev_info
-.LVL1409:
-	.loc 1 2677 0
-	str	x24, [x23, 232]
-	ldr	w0, [x24, 40]
-	.loc 1 2762 0
-	cmp	w0, 20
-	bne	.L1422
-.LVL1410:
-.L1675:
-	.loc 1 2764 0
-	ldr	x0, [x23, 104]
-	adrp	x1, .LC121
-	.loc 1 2763 0
-	str	w22, [x23, 608]
-	.loc 1 2764 0
-	add	x1, x1, :lo12:.LC121
-	bl	_dev_info
-.LVL1411:
-	.loc 1 2774 0
-	ldr	w0, [x23, 484]
-	cbz	w0, .L1425
-.L1677:
-	.loc 1 2775 0
-	ldr	x0, [x23, 224]
-	bl	ebc_buf_release
-.LVL1412:
-	b	.L1426
-.LVL1413:
-.L1301:
-	.loc 1 2386 0
-	adrp	x0, .LANCHOR0
-	add	x0, x0, :lo12:.LANCHOR0
-	ldr	x0, [x0, 8]
-	bl	wake_up_process
-.LVL1414:
-	b	.L1303
-.L1641:
-	.loc 1 2361 0 discriminator 1
-	ldr	w0, [x23, 52]
-	cbz	w0, .L1258
-	.loc 1 2363 0
-	ldr	x0, [x23, 104]
-	adrp	x1, .LC103
-	add	x1, x1, :lo12:.LC103
-	bl	_dev_info
-.LVL1415:
-.LBB2242:
-	.loc 1 2364 0
-	ldr	w0, [x23, 52]
-	cbnz	w0, .L1656
-.L1261:
-.LVL1416:
-.L1259:
-.LBE2242:
-	.loc 1 2365 0 discriminator 11
-	ldr	x0, [x23, 104]
-.LVL1417:
-	adrp	x1, .LC104
-	add	x1, x1, :lo12:.LC104
-	bl	_dev_info
-.LVL1418:
-	b	.L1258
-.LVL1419:
-.L1639:
+.L1257:
 	.loc 1 2345 0
-	ldr	w0, [x23, 208]
+	ldr	w0, [x23, 592]
+.LVL1320:
+	cbz	w0, .L1258
+	.loc 1 2345 0 is_stmt 0 discriminator 1
+	ldr	w0, [x22, 160]
+	cbz	w0, .L1602
+.L1258:
+	.loc 1 2351 0 is_stmt 1
+	cbnz	w19, .L1260
+	.loc 1 2351 0 is_stmt 0 discriminator 1
+	ldr	w0, [x23, 612]
+	cbz	w0, .L1603
+.L1260:
+	.loc 1 2397 0 is_stmt 1
+	ldr	w0, [x23, 604]
+	cbz	w0, .L1312
+	.loc 1 2397 0 is_stmt 0 discriminator 1
+	ldr	w0, [x23, 600]
+	cbnz	w0, .L1312
+	.loc 1 2397 0 discriminator 2
+	ldr	w0, [x23, 612]
+	cbnz	w0, .L1312
+.L1313:
+	.loc 1 2787 0 is_stmt 1
+	ldr	w0, [x23, 100]
+	cbz	w0, .L1604
+.L1433:
+.LVL1321:
+.L1431:
+	.loc 1 2813 0
+	str	wzr, [x23, 100]
+	b	.L1257
+.LVL1322:
+.L1602:
+	.loc 1 2346 0
+	ldr	w0, [x23, 200]
 	cmp	w0, 1
-	beq	.L1657
-.L1252:
-	.loc 1 2815 0
+	beq	.L1605
+.L1259:
+	.loc 1 2818 0
 	adrp	x0, __stack_chk_guard
 	add	x1, x0, :lo12:__stack_chk_guard
 	ldr	x2, [x29, 152]
 	ldr	x1, [x1]
 	eor	x1, x2, x1
-.LVL1420:
 	mov	w0, 0
-	cbnz	x1, .L1658
+	cbnz	x1, .L1606
 	ldp	x19, x20, [sp, 16]
-.LVL1421:
+.LVL1323:
 	ldp	x21, x22, [sp, 32]
 	ldp	x23, x24, [sp, 48]
-.LVL1422:
+.LVL1324:
 	ldp	x25, x26, [sp, 64]
-.LVL1423:
+.LVL1325:
 	ldp	x27, x28, [sp, 80]
-.LVL1424:
+.LVL1326:
 	ldp	x29, x30, [sp], 160
 	.cfi_remember_state
 	.cfi_restore 30
@@ -14273,1730 +13531,2580 @@
 	.cfi_restore 20
 	.cfi_def_cfa 31, 0
 	ret
-.LVL1425:
-.L1307:
+.LVL1327:
+.L1603:
 	.cfi_restore_state
-	.loc 1 2435 0
+	.loc 1 2352 0
+	bl	ebc_osd_buf_get
+.LVL1328:
+	mov	x24, x0
+.LVL1329:
+	.loc 1 2353 0
+	cbz	x0, .L1260
+	.loc 1 2354 0
+	ldr	x0, [x23, 584]
+	cbnz	x0, .L1261
+	.loc 1 2354 0 is_stmt 0 discriminator 1
+	ldr	w19, [x23, 592]
+.LVL1330:
+	cbnz	w19, .L1261
+	.loc 1 2360 0 is_stmt 1
+	ldr	w0, [x23, 252]
+	sub	w1, w0, #1
+	cmp	w1, 1
+	bls	.L1607
+	.loc 1 2363 0
+	cmp	w0, 3
+	beq	.L1608
+.L1265:
+	.loc 1 2369 0
+	str	x24, [x23, 240]
+	.loc 1 2370 0
+	mov	w0, 4
+	str	w0, [x23, 252]
+	.loc 1 2373 0
+	ldr	x4, [x23, 224]
+.LBB2231:
+.LBB2232:
+	.loc 1 436 0
+	ldp	w0, w14, [x24, 48]
+	.loc 1 437 0
+	ldp	w2, w18, [x24, 56]
+	.loc 1 434 0
+	cmp	w0, 0
+	.loc 1 439 0
+	ldr	w1, [x20, 288]
+	.loc 1 434 0
+	add	w17, w0, 7
+	csel	w17, w17, w0, lt
+	.loc 1 435 0
+	add	w11, w2, 7
+	cmp	w2, 0
+	.loc 1 439 0
+	add	w0, w1, 7
+	.loc 1 435 0
+	csel	w11, w11, w2, lt
+	.loc 1 439 0
+	cmp	w1, 0
+	csel	w0, w0, w1, lt
+	.loc 1 435 0
+	asr	w11, w11, 3
+	.loc 1 439 0
+	asr	w0, w0, 3
+.LVL1331:
+	ldr	w2, [x20, 284]
+	.loc 1 435 0
+	add	w11, w11, 1
+.LVL1332:
+	.loc 1 442 0
+	sub	w3, w0, #1
+.LBE2232:
+.LBE2231:
+	.loc 1 2375 0
+	ldp	x8, x5, [x23, 168]
+.LVL1333:
+.LBB2281:
+.LBB2275:
+	.loc 1 446 0
+	mul	w1, w14, w0
+	.loc 1 442 0
+	cmp	w11, w0
+.LBE2275:
+.LBE2281:
+	.loc 1 2371 0
+	ldr	x6, [x23, 152]
+.LBB2282:
+.LBB2276:
+	.loc 1 442 0
+	csel	w11, w3, w11, ge
+.LBE2276:
+.LBE2282:
+	.loc 1 2373 0
+	ldr	x9, [x4, 16]
+.LVL1334:
+.LBB2283:
+.LBB2277:
+	.loc 1 444 0
+	cmp	w2, w18
+	.loc 1 446 0
+	sxtw	x1, w1
+	.loc 1 444 0
+	sub	w3, w2, #1
+.LBE2277:
+.LBE2283:
+	.loc 1 2372 0
+	ldr	x10, [x24, 16]
+.LBB2284:
+.LBB2278:
+	.loc 1 446 0
+	lsl	x2, x1, 2
+	.loc 1 444 0
+	csel	w18, w3, w18, le
+	.loc 1 449 0
+	lsl	x1, x1, 3
+	.loc 1 434 0
+	asr	w17, w17, 3
+.LVL1335:
+	.loc 1 446 0
+	add	x6, x6, x2
+.LVL1336:
+	.loc 1 449 0
+	add	x8, x8, x1
+.LVL1337:
+	.loc 1 450 0
+	add	x5, x5, x1
+.LVL1338:
+	.loc 1 452 0
+	cmp	w14, w18
+	.loc 1 448 0
+	add	x9, x9, x2
+.LVL1339:
+	.loc 1 447 0
+	add	x10, x10, x2
+.LVL1340:
+	.loc 1 452 0
+	bgt	.L1272
+	sxtw	x0, w0
+.LBB2233:
+	.loc 1 467 0
+	mov	w13, 251658240
+	lsl	x16, x0, 2
+	lsl	x15, x0, 3
+	mov	w25, 234881024
+.LVL1341:
+.LBE2233:
+.LBB2234:
+	.loc 1 468 0
+	mov	w12, -268435456
+	mov	w24, -536870912
+.LVL1342:
+	.p2align 2
+.L1273:
+.LBE2234:
+	.loc 1 453 0
+	mov	w4, w17
+	cmp	w17, w11
+	bgt	.L1307
+	.p2align 2
+.L1523:
+	.loc 1 454 0
+	sxtw	x1, w4
+.LVL1343:
+	.loc 1 459 0
+	mov	w2, 0
+	.loc 1 454 0
+	add	x26, x6, x1, lsl 2
+	.loc 1 458 0
+	add	x28, x5, x1, lsl 3
+	.loc 1 457 0
+	ldr	x3, [x8, x1, lsl 3]
+.LVL1344:
+	.loc 1 454 0
+	ldr	w7, [x6, x1, lsl 2]
+	.loc 1 455 0
+	ldr	w0, [x10, x1, lsl 2]
+.LVL1345:
+	.loc 1 461 0
+	and	x30, x3, 255
+.LVL1346:
+	.loc 1 456 0
+	ldr	w27, [x9, x1, lsl 2]
+.LVL1347:
+	.loc 1 458 0
+	ldr	x1, [x5, x1, lsl 3]
+.LVL1348:
+	.loc 1 461 0
+	cbnz	x30, .L1274
+.LVL1349:
+.LBB2235:
+	and	w2, w0, 15
+.LBE2235:
+	and	x1, x1, -256
+.LBB2236:
+	cmp	w2, 15
+	bne	.L1609
+.L1274:
+.LBE2236:
+	.loc 1 462 0
+	tst	x3, 65280
+	bne	.L1277
+.LBB2237:
+	and	w30, w0, 240
+.LVL1350:
+.LBE2237:
+	and	x1, x1, -65281
+.LBB2238:
+	cmp	w30, 240
+	bne	.L1278
+	orr	w2, w2, 240
+.L1277:
+.LBE2238:
+	.loc 1 463 0
+	tst	x3, 16711680
+	bne	.L1281
+.LBB2239:
+	and	w30, w0, 3840
+.LVL1351:
+.LBE2239:
+	and	x1, x1, -16711681
+.LBB2240:
+	cmp	w30, 3840
+	bne	.L1282
+	orr	w2, w2, 3840
+.LVL1352:
+.L1281:
+.LBE2240:
+	.loc 1 464 0
+	tst	x3, 4278190080
+	bne	.L1285
+.LBB2241:
+	and	w30, w0, 61440
+.LVL1353:
+.LBE2241:
+	and	x1, x1, -4278190081
+.LBB2242:
+	cmp	w30, 61440
+	bne	.L1286
+	orr	w2, w2, 61440
+.LVL1354:
+.L1285:
+.LBE2242:
+	.loc 1 465 0
+	tst	x3, 1095216660480
+	bne	.L1289
+.LBB2243:
+	and	w30, w0, 983040
+.LVL1355:
+.LBE2243:
+	and	x1, x1, -1095216660481
+.LBB2244:
+	cmp	w30, 983040
+	bne	.L1290
+	orr	w2, w2, 983040
+.LVL1356:
+.L1289:
+.LBE2244:
+	.loc 1 466 0
+	tst	x3, 280375465082880
+	bne	.L1293
+.LBB2245:
+	and	w30, w0, 15728640
+.LVL1357:
+.LBE2245:
+	and	x1, x1, -280375465082881
+.LBB2246:
+	cmp	w30, 15728640
+	bne	.L1294
+	orr	w2, w2, 15728640
+.LVL1358:
+.L1293:
+.LBE2246:
+	.loc 1 467 0
+	tst	x3, 71776119061217280
+	bne	.L1297
+.LBB2247:
+	and	w30, w0, 251658240
+.LVL1359:
+.LBE2247:
+	and	x1, x1, -71776119061217281
+.LBB2248:
+	cmp	w30, w13
+	bne	.L1298
+	orr	w2, w2, 251658240
+.LVL1360:
+.L1297:
+.LBE2248:
+	.loc 1 468 0
+	tst	x3, -72057594037927936
+	bne	.L1301
+.LBB2249:
+	and	w3, w0, -268435456
+.LVL1361:
+.LBE2249:
+	and	x1, x1, 72057594037927935
+.LBB2250:
+	cmp	w3, w12
+	bne	.L1302
+	orr	w2, w2, -268435456
+.LVL1362:
+.L1301:
+.LBE2250:
+	.loc 1 471 0
+	and	w0, w0, w27
+.LVL1363:
+	.loc 1 472 0
+	str	x1, [x28]
+	eor	w0, w0, w7
+.LVL1364:
+	.loc 1 453 0
+	add	w4, w4, 1
+	and	w0, w0, w2
+	cmp	w4, w11
+	.loc 1 471 0
+	eor	w0, w7, w0
+	.loc 1 473 0
+	str	w0, [x26]
+	.loc 1 453 0
+	ble	.L1523
+.LVL1365:
+.L1307:
+	.loc 1 452 0
+	add	w14, w14, 1
+	.loc 1 475 0
+	add	x6, x6, x16
+	.loc 1 476 0
+	add	x10, x10, x16
+	.loc 1 477 0
+	add	x9, x9, x16
+	.loc 1 478 0
+	add	x8, x8, x15
+	.loc 1 479 0
+	add	x5, x5, x15
+	.loc 1 452 0
+	cmp	w14, w18
+	ble	.L1273
+.LVL1366:
+.L1272:
+.LBE2278:
+.LBE2284:
+	.loc 1 2377 0
+	ldr	w0, [x23, 52]
+.LVL1367:
+	cbnz	w0, .L1308
+	.loc 1 2379 0
+	ldr	w0, [x23, 200]
+	.loc 1 2378 0
+	mov	w1, 1
+.LVL1368:
+	str	w1, [x23, 52]
+	.loc 1 2379 0
+	cbz	w0, .L1610
+.L1309:
+	.loc 1 2381 0
+	mov	w1, 1
+	mov	x0, x20
+	bl	ebc_lut_update
+.LVL1369:
+	.loc 1 2383 0
+	ldr	w3, [x23, 112]
+	.loc 1 2385 0
+	adrp	x1, .LC105
+	ldr	x0, [x23, 104]
+	add	x1, x1, :lo12:.LC105
+	and	w2, w3, 255
+	.loc 1 2383 0
+	strb	w3, [x23, 56]
+	.loc 1 2384 0
+	lsr	w4, w3, 8
+	strb	w4, [x23, 57]
+	.loc 1 2385 0
+	and	w3, w4, 255
+	bl	_dev_info
+.LVL1370:
+	.loc 1 2386 0
+	mov	x0, x20
+	bl	ebc_frame_start
+.LVL1371:
+.L1310:
+	.loc 1 2390 0
+	ldr	x0, [x23, 232]
+	cbz	x0, .L1311
+	.loc 1 2391 0
+	bl	ebc_buf_release
+.LVL1372:
+.L1311:
+	.loc 1 2392 0
+	ldr	x0, [x23, 240]
+	str	x0, [x23, 232]
+	.loc 1 2394 0
+	b	.L1257
+.LVL1373:
+	.p2align 3
+.L1278:
+.LBB2285:
+.LBB2279:
+.LBB2251:
+	.loc 1 462 0
+	cbnz	w30, .L1279
+	orr	w2, w2, 240
+	orr	x1, x1, 256
+	b	.L1277
+.LVL1374:
+	.p2align 3
+.L1298:
+.LBE2251:
+.LBB2252:
+	.loc 1 467 0
+	cbnz	w30, .L1299
+	orr	w2, w2, 251658240
+	orr	x1, x1, 281474976710656
+	b	.L1297
+.LVL1375:
+	.p2align 3
+.L1302:
+.LBE2252:
+.LBB2253:
+	.loc 1 468 0
+	cbnz	w3, .L1303
+	orr	w2, w2, -268435456
+	orr	x1, x1, 72057594037927936
+	b	.L1301
+.LVL1376:
+	.p2align 3
+.L1282:
+.LBE2253:
+.LBB2254:
+	.loc 1 463 0
+	cbnz	w30, .L1283
+	orr	w2, w2, 3840
+	orr	x1, x1, 65536
+	b	.L1281
+.LVL1377:
+	.p2align 3
+.L1609:
+.LBE2254:
+.LBB2255:
+	.loc 1 461 0
+	cbnz	w2, .L1275
+	orr	x1, x1, 1
+	mov	w2, 15
+	b	.L1274
+.LVL1378:
+	.p2align 3
+.L1290:
+.LBE2255:
+.LBB2256:
+	.loc 1 465 0
+	cbnz	w30, .L1291
+	orr	w2, w2, 983040
+	orr	x1, x1, 4294967296
+	b	.L1289
+.LVL1379:
+	.p2align 3
+.L1286:
+.LBE2256:
+.LBB2257:
+	.loc 1 464 0
+	cbnz	w30, .L1287
+	orr	w2, w2, 61440
+	orr	x1, x1, 16777216
+	b	.L1285
+.LVL1380:
+	.p2align 3
+.L1294:
+.LBE2257:
+.LBB2258:
+	.loc 1 466 0
+	cbnz	w30, .L1295
+	orr	w2, w2, 15728640
+	orr	x1, x1, 1099511627776
+	b	.L1293
+.LVL1381:
+	.p2align 3
+.L1279:
+.LBE2258:
+.LBB2259:
+	.loc 1 462 0
+	cmp	w30, 224
+	beq	.L1611
+	and	w7, w7, -241
+	orr	w7, w30, w7
+	b	.L1277
+.LVL1382:
+	.p2align 3
+.L1299:
+.LBE2259:
+.LBB2260:
+	.loc 1 467 0
+	cmp	w30, w25
+	beq	.L1612
+	and	w7, w7, -251658241
+	orr	w7, w30, w7
+	b	.L1297
+.LVL1383:
+	.p2align 3
+.L1295:
+.LBE2260:
+.LBB2261:
+	.loc 1 466 0
+	cmp	w30, 14680064
+	beq	.L1613
+	and	w7, w7, -15728641
+	orr	w7, w30, w7
+	b	.L1293
+.LVL1384:
+	.p2align 3
+.L1283:
+.LBE2261:
+.LBB2262:
+	.loc 1 463 0
+	cmp	w30, 3584
+	beq	.L1614
+	and	w7, w7, -3841
+	orr	w7, w30, w7
+	b	.L1281
+.LVL1385:
+	.p2align 3
+.L1303:
+.LBE2262:
+.LBB2263:
+	.loc 1 468 0
+	cmp	w3, w24
+	beq	.L1615
+	and	w7, w7, 268435455
+	orr	w7, w3, w7
+	b	.L1301
+.LVL1386:
+	.p2align 3
+.L1275:
+.LBE2263:
+.LBB2264:
+	.loc 1 461 0
+	cmp	w2, 14
+	beq	.L1616
+	and	w7, w7, -16
+	orr	w7, w2, w7
+.LBE2264:
+	.loc 1 459 0
+	mov	w2, 0
+	b	.L1274
+.LVL1387:
+	.p2align 3
+.L1291:
+.LBB2265:
+	.loc 1 465 0
+	cmp	w30, 917504
+	beq	.L1617
+	and	w7, w7, -983041
+	orr	w7, w30, w7
+	b	.L1289
+.LVL1388:
+	.p2align 3
+.L1287:
+.LBE2265:
+.LBB2266:
+	.loc 1 464 0
+	cmp	w30, 57344
+	beq	.L1618
+	and	w7, w7, -61441
+	orr	w7, w30, w7
+	b	.L1285
+.LVL1389:
+	.p2align 3
+.L1261:
+.LBE2266:
+.LBE2279:
+.LBE2285:
+	.loc 1 2355 0
+	ldr	x0, [x23, 104]
+	adrp	x1, .LC102
+	add	x1, x1, :lo12:.LC102
+	.loc 1 2358 0
+	mov	w19, 0
+	.loc 1 2355 0
+	bl	_dev_info
+.LVL1390:
+	.loc 1 2356 0
+	mov	x0, x24
+	bl	ebc_buf_release
+.LVL1391:
+	.loc 1 2358 0
+	b	.L1257
+.LVL1392:
+.L1611:
+.LBB2286:
+.LBB2280:
+.LBB2267:
+	.loc 1 462 0
+	orr	w7, w7, 240
+	orr	x1, x1, 256
+	b	.L1277
+.LVL1393:
+.L1612:
+.LBE2267:
+.LBB2268:
+	.loc 1 467 0
+	orr	w7, w7, 251658240
+	orr	x1, x1, 281474976710656
+	b	.L1297
+.LVL1394:
+.L1614:
+.LBE2268:
+.LBB2269:
+	.loc 1 463 0
+	orr	w7, w7, 3840
+	orr	x1, x1, 65536
+	b	.L1281
+.LVL1395:
+.L1616:
+.LBE2269:
+.LBB2270:
+	.loc 1 461 0
+	orr	w7, w7, 15
+	orr	x1, x1, 1
+.LBE2270:
+	.loc 1 459 0
+	mov	w2, 0
+	b	.L1274
+.LVL1396:
+.L1615:
+.LBB2271:
+	.loc 1 468 0
+	orr	w7, w7, -268435456
+	orr	x1, x1, 72057594037927936
+	b	.L1301
+.LVL1397:
+.L1617:
+.LBE2271:
+.LBB2272:
+	.loc 1 465 0
+	orr	w7, w7, 983040
+	orr	x1, x1, 4294967296
+	b	.L1289
+.LVL1398:
+.L1613:
+.LBE2272:
+.LBB2273:
+	.loc 1 466 0
+	orr	w7, w7, 15728640
+	orr	x1, x1, 1099511627776
+	b	.L1293
+.LVL1399:
+.L1618:
+.LBE2273:
+.LBB2274:
+	.loc 1 464 0
+	orr	w7, w7, 61440
+	orr	x1, x1, 16777216
+	b	.L1285
+.LVL1400:
+	.p2align 3
+.L1312:
+.LBE2274:
+.LBE2280:
+.LBE2286:
+	.loc 1 2398 0
+	bl	ebc_dsp_buf_get
+.LVL1401:
+	mov	x24, x0
+.LVL1402:
+	.loc 1 2399 0
+	cbz	x0, .L1313
+	.loc 1 2400 0
+	ldr	w1, [x22, 160]
+	cbnz	w1, .L1314
+	.loc 1 2401 0
+	ldr	w1, [x0, 40]
+	sub	w2, w1, #18
+	tst	w2, -3
+	bne	.L1315
+	.loc 1 2402 0
+	adrp	x0, .LANCHOR0
+	add	x0, x0, :lo12:.LANCHOR0
+	str	wzr, [x0, 32]
+.L1316:
+	.loc 1 2483 0
+	ldr	w0, [x24, 64]
+	.loc 1 2481 0
+	cbz	w19, .L1328
+	.loc 1 2483 0
+	cbnz	w0, .L1329
+	.loc 1 2485 0
+	mov	w0, 1
+	str	w0, [x24, 64]
+	.loc 1 2484 0
+	mov	w0, 21
+	str	w0, [x24, 40]
+.L1330:
+	.loc 1 2590 0
+	ldr	w0, [x23, 468]
+	cbz	w0, .L1435
+.L1370:
+	.loc 1 2653 0
+	ldr	w0, [x23, 52]
+	.loc 1 2647 0
+	mov	w19, 1
+.LVL1403:
+	.loc 1 2653 0
+	cbnz	w0, .L1619
+.L1389:
+.LVL1404:
+.L1386:
+	.loc 1 2658 0
+	ldr	w0, [x23, 252]
+.LVL1405:
+	sub	w0, w0, #3
+	cmp	w0, 1
+	bls	.L1620
+.L1391:
+	.loc 1 2662 0
+	ldr	w0, [x24, 40]
+	sub	w1, w0, #7
+	.loc 1 2661 0
+	cmp	w1, 1
+	bls	.L1621
+.L1392:
+	.loc 1 2676 0
+	sub	w0, w0, #2
+	.loc 1 2675 0
+	cmp	w0, 14
+	bhi	.L1394
+	ldr	x0, [x23, 216]
+.LBB2287:
+.LBB2288:
+	.loc 1 2287 0
+	ldr	w1, [x23, 28]
+	ldr	x4, [x24, 16]
+	cmp	w1, 0
+	ldr	x5, [x0, 16]
+	add	w0, w1, 7
+	csel	w0, w0, w1, lt
+	asr	w0, w0, 3
+	cmp	w0, 0
+	ble	.L1396
+	.loc 1 2291 0
+	ldr	x2, [x4]
+	ldr	x1, [x5]
+	cmp	x2, x1
+	bne	.L1394
+	sub	w1, w0, #1
+	mov	x0, 8
+	add	x1, x1, 1
+	lsl	x1, x1, 3
+	b	.L1398
+.L1399:
+	.loc 1 2288 0
+	ldr	x3, [x4, x0]
+	add	x0, x0, 8
+	.loc 1 2289 0
+	add	x2, x5, x0
+	.loc 1 2291 0
+	ldr	x2, [x2, -8]
+	cmp	x3, x2
+	bne	.L1394
+.L1398:
+	.loc 1 2287 0
+	cmp	x1, x0
+	bne	.L1399
+.L1396:
+.LBE2288:
+.LBE2287:
+	.loc 1 2678 0
+	ldr	x0, [x23, 104]
+	adrp	x1, .LC118
+	add	x1, x1, :lo12:.LC118
+	bl	_dev_info
+.LVL1406:
+	.loc 1 2680 0
+	str	x24, [x23, 224]
+	ldr	w0, [x24, 40]
+.LVL1407:
+.L1365:
+	.loc 1 2764 0
+	cmp	w0, 20
+	beq	.L1622
+.L1413:
+	.loc 1 2768 0
+	cmp	w0, 18
+	beq	.L1623
+.L1414:
+	.loc 1 2777 0
+	ldr	w0, [x23, 468]
+	cbnz	w0, .L1624
+.L1416:
+	.loc 1 2780 0
+	mov	w0, 1
+	str	w0, [x23, 468]
+.L1417:
+	.loc 1 2782 0
+	ldr	x0, [x23, 224]
+	mov	w19, 0
+.LVL1408:
+	str	x0, [x23, 216]
+	b	.L1257
+.L1630:
+	.loc 1 2492 0 discriminator 1
+	ldr	w0, [x23, 252]
+	cmp	w0, 4
+	beq	.L1625
+.L1331:
+	.loc 1 2590 0
+	ldr	w0, [x23, 468]
+	cbnz	w0, .L1436
+.L1435:
+	.loc 1 2591 0
+	str	x24, [x23, 216]
+.L1436:
+	.loc 1 2593 0
+	ldr	w2, [x24, 40]
+	cmp	w2, 11
+	bgt	.L1367
+	cmp	w2, 7
+	bge	.L1441
+	cmp	w2, 0
+	beq	.L1369
+	blt	.L1366
+	cmp	w2, 2
+	bge	.L1370
+.L1366:
+	.loc 1 2755 0
+	ldr	x0, [x23, 104]
+	adrp	x1, .LC120
+	add	x1, x1, :lo12:.LC120
+	.loc 1 2758 0
+	mov	w19, 0
+	.loc 1 2755 0
+	bl	_dev_err
+.LVL1409:
+	.loc 1 2756 0
+	mov	x0, x24
+	bl	ebc_buf_release
+.LVL1410:
+	.loc 1 2758 0
+	b	.L1257
+.LVL1411:
+.L1308:
+	.loc 1 2388 0
+	adrp	x0, .LANCHOR0
+	add	x0, x0, :lo12:.LANCHOR0
+	ldr	x0, [x0, 8]
+	bl	wake_up_process
+.LVL1412:
+	b	.L1310
+.L1608:
+	.loc 1 2363 0 discriminator 1
+	ldr	w0, [x23, 52]
+	cbz	w0, .L1265
+	.loc 1 2365 0
+	ldr	x0, [x23, 104]
+	adrp	x1, .LC103
+	add	x1, x1, :lo12:.LC103
+	bl	_dev_info
+.LVL1413:
+.LBB2289:
+	.loc 1 2366 0
+	ldr	w0, [x23, 52]
+	cbnz	w0, .L1626
+.L1268:
+.LVL1414:
+.L1266:
+.LBE2289:
+	.loc 1 2367 0 discriminator 11
+	ldr	x0, [x23, 104]
+.LVL1415:
+	adrp	x1, .LC104
+	add	x1, x1, :lo12:.LC104
+	bl	_dev_info
+.LVL1416:
+	b	.L1265
+.L1314:
+	.loc 1 2437 0
 	ldr	w0, [x0, 40]
 	cmp	w0, 18
-	beq	.L1659
-	.loc 1 2444 0
+	beq	.L1627
+	.loc 1 2447 0
 	cmp	w0, 19
-	beq	.L1660
-	.loc 1 2459 0
+	beq	.L1628
+	.loc 1 2462 0
 	cmp	w0, 20
-	beq	.L1661
-	.loc 1 2466 0
+	beq	.L1629
+	.loc 1 2470 0
 	adrp	x0, .LANCHOR0
 	add	x0, x0, :lo12:.LANCHOR0
 	ldr	w1, [x0, 32]
-	cbz	w1, .L1309
-	.loc 1 2467 0
+	cbz	w1, .L1316
+	.loc 1 2471 0
 	ldr	w1, [x0, 36]
 	cmp	w1, 5
 	add	w1, w1, 1
 	str	w1, [x0, 36]
-	ble	.L1320
-	.loc 1 2468 0
+	ble	.L1327
+	.loc 1 2472 0
 	str	wzr, [x0, 32]
-.L1320:
-	.loc 1 2469 0
-	ldr	w1, [x19, 220]
+.L1327:
+	.loc 1 2473 0
+	ldr	w1, [x20, 220]
 	ldr	x0, [x24, 16]
 	bl	check_black_percent.isra.11
-.LVL1426:
-	cbz	w0, .L1309
-.L1621:
-	.loc 1 2519 0
+.LVL1417:
+	cbz	w0, .L1316
+.L1587:
+	.loc 1 2533 0
 	mov	x0, x24
-.L1622:
+.L1588:
 	bl	ebc_buf_release
-.LVL1427:
-	.loc 1 2521 0
-	b	.L1250
-.LVL1428:
-.L1643:
-	.loc 1 2378 0
-	mov	x0, x19
+.LVL1418:
+	.loc 1 2535 0
+	b	.L1257
+.LVL1419:
+.L1610:
+	.loc 1 2380 0
+	mov	x0, x20
 	bl	ebc_power_set.constprop.15
-.LVL1429:
-	b	.L1302
-.LVL1430:
-.L1321:
-	.loc 1 2487 0
-	ldr	w0, [x24, 64]
-.LVL1431:
-	str	w0, [x29, 108]
-	cbnz	w0, .L1324
-	.loc 1 2488 0
-	ldr	w0, [x23, 612]
-.LVL1432:
-	cbz	w0, .L1662
-	.loc 1 2489 0
-	ldr	w0, [x23, 264]
-	sub	w1, w0, #1
-	cmp	w1, 1
-	bls	.L1663
-	.loc 1 2492 0
-	cmp	w0, 3
-	beq	.L1664
-.L1326:
-	.loc 1 2499 0
-	ldr	w3, [x23, 88]
-	.loc 1 2500 0
-	sub	w0, w3, #1
-	.loc 1 2499 0
-	cmp	w0, 99
-	bls	.L1665
-.L1332:
-	.loc 1 2517 0
-	ldr	w0, [x23, 256]
-	cbnz	w0, .L1336
-	.loc 1 2517 0 is_stmt 0 discriminator 1
-	bl	ebc_get_dsp_list_enum_num
-.LVL1433:
-	cbnz	w0, .L1336
-	.loc 1 2522 0 is_stmt 1
-	ldr	w2, [x23, 260]
-	cmp	w2, 0
-	ble	.L1337
-	.loc 1 2524 0
-	ldr	x0, [x23, 104]
-	adrp	x1, .LC112
-	.loc 1 2523 0
-	str	wzr, [x23, 100]
-	.loc 1 2524 0
-	add	x1, x1, :lo12:.LC112
-	bl	_dev_info
-.LVL1434:
-.LBB2245:
-.LBB2246:
-.LBB2247:
-	.file 17 "./include/linux/jiffies.h"
-	.loc 17 368 0
-	ldr	w0, [x23, 260]
-	bl	__msecs_to_jiffies
-.LVL1435:
-.LBE2247:
-.LBE2246:
-.LBB2248:
-	.loc 1 2525 0
-	ldr	w1, [x23, 256]
-	cbnz	w1, .L1358
-	.loc 1 2525 0 is_stmt 0 discriminator 2
-	ldr	w1, [x23, 100]
-	cbnz	w1, .L1339
-.LBE2248:
-	.loc 1 2525 0
-	cbz	x0, .L1339
-.LBB2249:
-.LBB2250:
-.LBB2251:
-	.loc 17 368 0 is_stmt 1 discriminator 10
-	ldr	w0, [x23, 260]
-	bl	__msecs_to_jiffies
-.LVL1436:
-	mov	x25, x0
-.LVL1437:
-.LBE2251:
-.LBE2250:
-	.loc 1 2525 0 discriminator 10
-	mov	w1, 0
-	add	x0, x29, 112
-	bl	init_wait_entry
-.LVL1438:
-.L1344:
-.LBB2252:
-	.loc 1 2525 0 is_stmt 0 discriminator 27
-	add	x1, x29, 112
-	mov	w2, 1
-	mov	x0, x20
-	bl	prepare_to_wait_event
-.LVL1439:
-.LBB2253:
-	ldr	w1, [x23, 256]
-	cbz	w1, .L1666
-.L1341:
-.LBE2253:
-.LBE2252:
-	.loc 1 2525 0 discriminator 22
-	mov	x0, x20
-	add	x1, x29, 112
-	bl	finish_wait
-.LVL1440:
-	ldr	w0, [x23, 256]
-.LBE2249:
-.LBE2245:
-	.loc 1 2527 0 is_stmt 1 discriminator 22
-	cbnz	w0, .L1358
-.LVL1441:
-.L1339:
-	.loc 1 2527 0 is_stmt 0
-	bl	ebc_get_dsp_list_enum_num
-.LVL1442:
-	cbnz	w0, .L1358
-.L1337:
-	ldr	w1, [x24, 40]
-	sub	w1, w1, #12
-	cmp	w1, 11
-	bls	.L1345
-	.loc 1 2537 0 is_stmt 1
-	ldr	w0, [x23, 144]
-	cmp	w0, 7
-	beq	.L1346
-	.loc 1 2538 0
-	cmp	w0, 1
-	beq	.L1346
-	mov	w1, 1
-.L1450:
-	.loc 1 2539 0
-	cmp	w0, 2
-	cset	w0, eq
-	tst	w1, w0
-	bne	.L1346
-.LVL1443:
-.L1349:
-	.loc 1 2553 0
-	mov	w0, 4
-	.loc 1 2554 0
-	str	x24, [x23, 232]
-	.loc 1 2553 0
-	str	w0, [x23, 264]
-	.loc 1 2555 0
-	mov	x5, x23
-	ldr	x0, [x23, 152]
-	ldr	x1, [x23, 16]
-.LVL1444:
-	ldp	x3, x4, [x23, 176]
-	ldr	x2, [x24, 16]
-	bl	refresh_new_image
-.LVL1445:
-	.loc 1 2561 0
-	ldr	w0, [x23, 52]
-	cbz	w0, .L1667
-	.loc 1 2571 0
-	ldr	x0, [x23, 232]
-	ldr	w0, [x0, 40]
-	.loc 1 2573 0
-	cmp	w0, 0
-	.loc 1 2572 0
-	sub	w1, w0, #22
-	.loc 1 2573 0
-	ccmp	w1, 1, 0, ne
-	bls	.L1367
-	b	.L1451
-	.p2align 3
-.L1640:
-	.loc 1 2359 0
-	ldr	x0, [x23, 224]
+.LVL1420:
+	b	.L1309
+.L1607:
+	.loc 1 2361 0
+	ldr	x0, [x23, 216]
 	ldrsw	x2, [x23, 28]
 	ldr	x1, [x0, 16]
 	ldr	x0, [x23, 160]
 	bl	memcpy
-.LVL1446:
-	.loc 1 2360 0
-	ldr	x0, [x23, 232]
+.LVL1421:
+	.loc 1 2362 0
+	ldr	x0, [x23, 224]
 	ldrsw	x2, [x23, 28]
 	ldr	x1, [x0, 16]
 	ldr	x0, [x23, 152]
 	bl	memcpy
-.LVL1447:
-	b	.L1258
-.L1662:
-	.loc 1 2488 0 discriminator 1
-	ldr	w0, [x23, 264]
-	cmp	w0, 4
-	beq	.L1668
-.LVL1448:
-.L1324:
-	.loc 1 2586 0
-	ldr	w0, [x23, 484]
-.LVL1449:
-	cbnz	w0, .L1449
-.L1448:
-	.loc 1 2587 0
-	str	x24, [x23, 224]
-.L1449:
-	.loc 1 2589 0
-	ldr	w2, [x24, 40]
-	cmp	w2, 11
-	bgt	.L1369
-	cmp	w2, 7
-	bge	.L1454
-	cmp	w2, 0
-	beq	.L1371
-	blt	.L1368
-	cmp	w2, 2
-	bge	.L1372
-.L1368:
-	.loc 1 2753 0
-	ldr	x0, [x23, 104]
-	adrp	x1, .LC120
-	add	x1, x1, :lo12:.LC120
-	bl	_dev_err
-.LVL1450:
-	.loc 1 2754 0
-	mov	x0, x24
-	bl	ebc_buf_release
-.LVL1451:
-	.loc 1 2756 0
-	str	wzr, [x29, 108]
-	b	.L1250
-.L1322:
-	.loc 1 2482 0
-	ldr	w0, [x24, 40]
-	cmp	w0, 16
-	bne	.L1324
-	.loc 1 2483 0
-	mov	w0, 21
-	str	w0, [x24, 40]
-	b	.L1323
-.L1369:
-	.loc 1 2589 0
-	cmp	w2, 21
-	ble	.L1372
-	cmp	w2, 23
-	bgt	.L1368
-.L1371:
-	.loc 1 2594 0
-	ldr	w0, [x23, 264]
-	.loc 1 2593 0
-	str	x24, [x23, 232]
-	.loc 1 2594 0
+.LVL1422:
+	b	.L1265
+.L1328:
+	.loc 1 2491 0
+	cbnz	w0, .L1331
+	.loc 1 2492 0
+	ldr	w0, [x23, 596]
+	cbz	w0, .L1630
+	.loc 1 2493 0
+	ldr	w0, [x23, 252]
 	sub	w1, w0, #1
 	cmp	w1, 1
-	bls	.L1669
-	.loc 1 2597 0
-	cmp	w0, 4
-	beq	.L1670
-	.loc 1 2603 0
-	ldr	x0, [x23, 224]
+	bls	.L1631
+	.loc 1 2496 0
+	cmp	w0, 3
+	beq	.L1632
+.L1333:
+	.loc 1 2503 0
+	ldr	w3, [x23, 88]
+	.loc 1 2504 0
+	sub	w0, w3, #1
+	.loc 1 2503 0
+	cmp	w0, 99
+	bhi	.L1339
+.LBB2292:
+	.loc 1 2505 0
+	ldr	x0, [x23, 216]
+	ldr	w2, [x20, 220]
+	ldr	x1, [x0, 16]
+	ldr	x0, [x24, 16]
+	bl	check_diff_percent.isra.12
+.LVL1423:
+	.loc 1 2506 0
+	cmp	w0, 2
+	beq	.L1633
+.L1339:
+.LBE2292:
+	.loc 1 2521 0
+	bl	ebc_get_dsp_list_enum_num
+.LVL1424:
+	mov	w19, w0
+	cbnz	w0, .L1634
+	.loc 1 2526 0
+	ldr	w2, [x23, 248]
+	cmp	w2, 0
+	ble	.L1341
+	.loc 1 2528 0
+	ldr	x0, [x23, 104]
+	adrp	x1, .LC112
+	.loc 1 2527 0
+	str	wzr, [x23, 100]
+	.loc 1 2528 0
+	add	x1, x1, :lo12:.LC112
+	bl	_dev_info
+.LVL1425:
+.LBB2293:
+.LBB2294:
+.LBB2295:
+	.file 17 "./include/linux/jiffies.h"
+	.loc 17 368 0
+	ldr	w0, [x23, 248]
+	bl	__msecs_to_jiffies
+.LVL1426:
+.LBE2295:
+.LBE2294:
+.LBB2296:
+	.loc 1 2529 0
+	ldr	w1, [x23, 100]
+	cmp	w1, 0
+	cset	w1, ne
+.LVL1427:
+	cmp	x0, 0
+	cset	w0, eq
+	tst	w1, w0
+	beq	.L1635
+.L1344:
+.LVL1428:
+.L1342:
+.LBE2296:
+.LBE2293:
+	.loc 1 2531 0 discriminator 17
+	bl	ebc_get_dsp_list_enum_num
+.LVL1429:
+	cbnz	w0, .L1589
+.L1341:
 	ldr	w1, [x24, 40]
-	ldr	w0, [x0, 40]
-	cmp	w1, w0
-	beq	.L1376
-	.loc 1 2603 0 is_stmt 0 discriminator 1
-	ldr	w0, [x23, 52]
-	cbnz	w0, .L1671
-.L1383:
-.L1376:
-	.loc 1 2610 0 is_stmt 1
+	sub	w1, w1, #12
+	cmp	w1, 11
+	bls	.L1346
+	.loc 1 2541 0
+	ldr	w0, [x23, 144]
+	cmp	w0, 7
+	beq	.L1347
+	.loc 1 2542 0
+	mov	w2, 1
+	cmp	w0, 1
+	beq	.L1347
+.LVL1430:
+.L1437:
+	.loc 1 2543 0
+	cmp	w0, 2
+	cset	w0, eq
+	tst	w2, w0
+	bne	.L1347
+.L1350:
+	.loc 1 2557 0
+	mov	w0, 4
+	.loc 1 2558 0
+	str	x24, [x23, 224]
+	.loc 1 2557 0
+	str	w0, [x23, 252]
+	.loc 1 2559 0
+	mov	x5, x23
 	ldr	x0, [x23, 152]
-	mov	x3, x23
-	ldr	x2, [x23, 176]
-	ldr	x1, [x24, 16]
-	bl	refresh_new_image_auto
-.LVL1452:
-.L1374:
-	.loc 1 2616 0
+	ldr	x1, [x23, 16]
+.LVL1431:
+	ldp	x3, x4, [x23, 168]
+	ldr	x2, [x24, 16]
+	bl	refresh_new_image
+.LVL1432:
+	.loc 1 2565 0
 	ldr	w0, [x23, 52]
-	.loc 1 2615 0
-	mov	w1, 3
-	str	w1, [x23, 264]
-	.loc 1 2616 0
-	cbnz	w0, .L1628
-	.loc 1 2618 0
-	ldr	w0, [x23, 208]
-	.loc 1 2617 0
-	str	w22, [x23, 52]
-	.loc 1 2618 0
-	cbnz	w0, .L1386
-	.loc 1 2619 0
-	mov	x0, x19
-	bl	ebc_power_set.constprop.15
-.LVL1453:
-.L1386:
-	.loc 1 2620 0
-	ldr	w1, [x24, 40]
-	mov	x0, x19
-	bl	ebc_lut_update
-.LVL1454:
-	.loc 1 2622 0
-	ldr	w1, [x23, 112]
-	.loc 1 2624 0
-	ldr	x0, [x23, 104]
-	.loc 1 2622 0
-	strb	w1, [x23, 56]
-	.loc 1 2624 0
-	and	w2, w1, 255
-	.loc 1 2623 0
-	lsr	w1, w1, 8
-	strb	w1, [x23, 57]
-	.loc 1 2624 0
-	adrp	x1, .LC116
-	add	x1, x1, :lo12:.LC116
-	bl	_dev_info
-.LVL1455:
-	.loc 1 2625 0
-	mov	x0, x19
-	bl	ebc_frame_start
-.LVL1456:
-.L1628:
-	ldr	x0, [x23, 232]
+	cbz	w0, .L1636
+	.loc 1 2575 0
+	ldr	x0, [x23, 224]
 	ldr	w0, [x0, 40]
-	b	.L1367
-.LVL1457:
-.L1336:
-	.loc 1 2518 0
+	.loc 1 2577 0
+	cmp	w0, 0
+	.loc 1 2576 0
+	sub	w1, w0, #22
+	.loc 1 2577 0
+	ccmp	w1, 1, 0, ne
+	bls	.L1365
+.L1438:
+	.loc 1 2581 0
 	ldr	x0, [x23, 104]
-.LVL1458:
-	adrp	x1, .LC111
-	add	x1, x1, :lo12:.LC111
+	adrp	x1, .LC115
+	.loc 1 2580 0
+	str	wzr, [x23, 600]
+	.loc 1 2581 0
+	add	x1, x1, :lo12:.LC115
 	bl	_dev_info
-.LVL1459:
-	.loc 1 2519 0
-	mov	x0, x24
-	b	.L1622
-.L1308:
-	.loc 1 2401 0
+.LVL1433:
+	.loc 1 2582 0
+	ldrb	w1, [x23, 56]
+	lsl	w0, w1, 3
+	sub	w0, w0, w1
+.LBB2303:
+.LBB2304:
+	.loc 17 368 0
+	lsl	w0, w0, 1
+	bl	__msecs_to_jiffies
+.LVL1434:
+.LBE2304:
+.LBE2303:
+	.loc 1 2582 0
+	adrp	x1, jiffies
+	ldr	x1, [x1, #:lo12:jiffies]
+	add	x1, x1, x0
+	add	x0, x20, 664
+	bl	mod_timer
+.LVL1435:
+	ldr	x0, [x23, 224]
+	ldr	w0, [x0, 40]
+	b	.L1365
+	.p2align 3
+.L1315:
+	.loc 1 2403 0
 	adrp	x2, .LANCHOR0
 	add	x25, x2, :lo12:.LANCHOR0
-.LVL1460:
+.LVL1436:
 	ldr	w2, [x25, 32]
-	cbz	w2, .L1310
-	.loc 1 2402 0
+	cbz	w2, .L1317
+	.loc 1 2404 0
 	ldr	w0, [x25, 36]
 	cmp	w0, 5
 	add	w0, w0, 1
 	str	w0, [x25, 36]
-	ble	.L1320
-	.loc 1 2469 0
-	ldr	w1, [x19, 220]
-	ldr	x0, [x24, 16]
-	.loc 1 2403 0
+	ble	.L1327
+	.loc 1 2405 0
 	str	wzr, [x25, 32]
-	.loc 1 2469 0
-	bl	check_black_percent.isra.11
-.LVL1461:
-	cbz	w0, .L1309
-	b	.L1621
-.LVL1462:
-.L1655:
-	.loc 1 2659 0
-	ldr	w3, [x23, 88]
-	.loc 1 2660 0
-	sub	w1, w3, #1
-	cmp	w1, 99
-	bhi	.L1394
-.LBB2257:
-	.loc 1 2661 0
-	ldr	x0, [x23, 224]
-	ldr	w2, [x19, 220]
-	ldr	x1, [x0, 16]
-	ldr	x0, [x24, 16]
-	bl	check_diff_percent.isra.12
-.LVL1463:
-	mov	w26, w0
-	.loc 1 2662 0
-	cbz	w0, .L1398
-	.loc 1 2667 0
-	cmp	w0, 2
-	beq	.L1627
-.L1396:
-.LBE2257:
-	.loc 1 2683 0
-	cbnz	w25, .L1455
-	.loc 1 2688 0
-	ldr	w0, [x23, 84]
-	.loc 1 2682 0
-	mov	w26, 1
-	.loc 1 2688 0
-	cmp	w0, 0
-	ble	.L1397
-	.loc 1 2689 0
-	ldr	w1, [x29, 104]
-.LVL1464:
-	add	w1, w1, w26
-.LVL1465:
-	str	w1, [x29, 104]
-	.loc 1 2690 0
-	cmp	w0, w1
-	bgt	.L1397
-	.loc 1 2691 0
-	mov	w26, 2
-.LVL1466:
-.L1627:
-	str	w26, [x24, 40]
-	.loc 1 2692 0
-	str	wzr, [x29, 104]
-.LVL1467:
-.L1397:
-	.loc 1 2697 0
-	ldr	w0, [x23, 208]
-	cbz	w0, .L1672
-.L1402:
-	.loc 1 2700 0
-	ldr	w1, [x24, 40]
-.LVL1468:
-	mov	x0, x19
-	bl	ebc_lut_update
-.LVL1469:
-	.loc 1 2703 0
-	ldr	w0, [x23, 256]
-	cbz	w0, .L1673
-.LVL1470:
-.L1409:
-	.loc 1 2725 0
+	b	.L1327
+.LVL1437:
+.L1329:
+	.loc 1 2486 0
 	ldr	w0, [x24, 40]
-	sub	w0, w0, #19
-	tst	w0, -3
-	beq	.L1334
-	.loc 1 2731 0
-	ldr	w0, [x24, 64]
-.LVL1471:
-	str	w0, [x29, 108]
-	cbz	w0, .L1336
-.L1408:
-	.loc 1 2743 0
-	ldr	w3, [x23, 112]
-	.loc 1 2744 0
-	adrp	x1, .LC119
-	.loc 1 2743 0
-	strb	w3, [x23, 56]
-	.loc 1 2744 0
-	add	x1, x1, :lo12:.LC119
-	.loc 1 2742 0
-	str	x24, [x23, 232]
-	.loc 1 2744 0
-	and	w3, w3, 255
-	ldr	x0, [x23, 104]
-.LVL1472:
-	.loc 1 2748 0
-	adrp	x25, jiffies
-.LVL1473:
-	.loc 1 2744 0
-	ldr	w2, [x24, 40]
-	.loc 1 2748 0
-	add	x24, x19, 736
-	.loc 1 2744 0
-	bl	_dev_info
-.LVL1474:
-	.loc 1 2745 0
-	str	w22, [x23, 52]
-	.loc 1 2746 0
-	str	w26, [x23, 264]
-	.loc 1 2747 0
-	mov	x0, x19
-	bl	ebc_frame_start
-.LVL1475:
-	.loc 1 2748 0
-	ldr	x1, [x25, #:lo12:jiffies]
-	mov	x0, x24
-	add	x1, x1, 900
-	bl	mod_timer
-.LVL1476:
-.LBB2258:
-	.loc 1 2749 0
-	ldr	w0, [x23, 52]
-	cbnz	w0, .L1674
-.L1420:
-.LVL1477:
-.L1418:
-.LBE2258:
-	.loc 1 2750 0 discriminator 11
-	ldr	x2, [x25, #:lo12:jiffies]
-	mov	x0, x24
-.LVL1478:
-	mov	x1, 402653184
-	add	x1, x2, x1
-	bl	mod_timer
-.LVL1479:
-	ldr	x0, [x23, 232]
-	ldr	w0, [x0, 40]
-.LVL1480:
-.L1367:
-	.loc 1 2762 0
-	cmp	w0, 20
-	beq	.L1675
-.L1422:
-	.loc 1 2766 0
-	cmp	w0, 18
-	beq	.L1676
-.L1423:
-	.loc 1 2774 0
-	ldr	w0, [x23, 484]
-	cbnz	w0, .L1677
-.L1425:
-	.loc 1 2777 0
-	str	w22, [x23, 484]
-.L1426:
-	.loc 1 2779 0
-	ldr	x0, [x23, 232]
-	str	x0, [x23, 224]
-	str	wzr, [x29, 108]
-	b	.L1250
-.LVL1481:
-.L1310:
-	.loc 1 2409 0
-	ldr	x2, [x23, 600]
-	cbz	x2, .L1309
-	.loc 1 2410 0
-	cmp	w1, 19
-	bne	.L1622
+	cmp	w0, 16
+	bne	.L1331
+	.loc 1 2487 0
+	mov	w0, 21
+	str	w0, [x24, 40]
+	b	.L1330
+.LVL1438:
+.L1317:
 	.loc 1 2411 0
-	str	wzr, [x23, 600]
+	ldr	x2, [x23, 584]
+	cbz	x2, .L1316
 	.loc 1 2412 0
+	cmp	w1, 19
+	bne	.L1588
+	.loc 1 2413 0
+	str	wzr, [x23, 584]
+	.loc 1 2414 0
 	mov	x0, 3
 	bl	ebc_notify
-.LVL1482:
-	.loc 1 2413 0
+.LVL1439:
+	.loc 1 2415 0
 	ldr	x0, [x23, 104]
 	adrp	x1, .LC106
 	add	x1, x1, :lo12:.LC106
 	bl	_dev_info
-.LVL1483:
-	.loc 1 2414 0
-	ldr	w0, [x23, 624]
-	cbz	w0, .L1309
-	.loc 1 2417 0
-	ldr	w1, [x19, 220]
-	ldr	x0, [x24, 16]
+.LVL1440:
 	.loc 1 2416 0
-	stp	w22, wzr, [x25, 32]
+	ldr	w0, [x23, 608]
+	cbz	w0, .L1316
 	.loc 1 2417 0
+	mov	w0, 1
+	.loc 1 2419 0
+	ldr	w1, [x20, 220]
+	.loc 1 2418 0
+	stp	w0, wzr, [x25, 32]
+	.loc 1 2419 0
+	ldr	x0, [x24, 16]
 	bl	check_black_percent.isra.11
-.LVL1484:
-	cbz	w0, .L1309
-	b	.L1617
-.LVL1485:
+.LVL1441:
+	cbz	w0, .L1316
+	b	.L1583
+.LVL1442:
 	.p2align 3
-.L1454:
-	.loc 1 2649 0
+.L1441:
+	.loc 1 2653 0
 	ldr	w0, [x23, 52]
-	.loc 1 2589 0
-	mov	w25, 0
-.LVL1486:
-	.loc 1 2649 0
-	cbz	w0, .L1388
-.L1653:
-	.loc 1 2650 0
+	.loc 1 2593 0
+	mov	w19, 0
+.LVL1443:
+	.loc 1 2653 0
+	cbz	w0, .L1386
+.L1619:
+	.loc 1 2654 0
 	ldr	x0, [x23, 104]
 	adrp	x1, .LC117
 	add	x1, x1, :lo12:.LC117
 	bl	_dev_info
-.LVL1487:
-.LBB2261:
-	.loc 1 2651 0
+.LVL1444:
+.LBB2305:
+	.loc 1 2655 0
 	ldr	w0, [x23, 52]
-	cbz	w0, .L1388
-.LBB2262:
-	.loc 1 2651 0 is_stmt 0 discriminator 1
+	cbz	w0, .L1386
+.LBB2306:
+	.loc 1 2655 0 is_stmt 0 discriminator 1
 	mov	w1, 0
 	add	x0, x29, 112
 	bl	init_wait_entry
-.LVL1488:
-	b	.L1392
-.L1678:
-.LVL1489:
-.LBB2263:
-	.loc 1 2651 0 discriminator 5
-	cbnz	x0, .L1388
-	.loc 1 2651 0 discriminator 7
+.LVL1445:
+	b	.L1390
+.L1637:
+.LVL1446:
+.LBB2307:
+	.loc 1 2655 0 discriminator 5
+	cbnz	x0, .L1386
+	.loc 1 2655 0 discriminator 7
 	bl	schedule
-.LVL1490:
-.L1392:
-	.loc 1 2651 0 discriminator 9
+.LVL1447:
+.L1390:
+	.loc 1 2655 0 discriminator 9
 	add	x1, x29, 112
 	mov	w2, 1
-	mov	x0, x20
+	mov	x0, x21
 	bl	prepare_to_wait_event
-.LVL1491:
+.LVL1448:
 	ldr	w1, [x23, 52]
-	cbnz	w1, .L1678
-.LBE2263:
-	.loc 1 2651 0 discriminator 4
+	cbnz	w1, .L1637
+.LBE2307:
+	.loc 1 2655 0 discriminator 4
 	add	x1, x29, 112
-	mov	x0, x20
+	mov	x0, x21
 	bl	finish_wait
-.LVL1492:
-	b	.L1388
+.LVL1449:
+	b	.L1386
+.LVL1450:
 	.p2align 3
-.L1455:
-.LBE2262:
-.LBE2261:
-	.loc 1 2697 0 is_stmt 1
-	ldr	w0, [x23, 208]
-	.loc 1 2686 0
-	mov	w26, 2
-	.loc 1 2684 0
-	str	wzr, [x29, 104]
-	.loc 1 2697 0
-	cbnz	w0, .L1402
-.LVL1493:
-.L1672:
-	.loc 1 2698 0
-	mov	x0, x19
-	bl	ebc_power_set.constprop.15
-.LVL1494:
-	.loc 1 2700 0
-	ldr	w1, [x24, 40]
-	mov	x0, x19
-	bl	ebc_lut_update
-.LVL1495:
-	.loc 1 2703 0
-	ldr	w0, [x23, 256]
-	cbnz	w0, .L1409
-.L1673:
-	.loc 1 2703 0 is_stmt 0 discriminator 1
-	bl	ebc_get_dsp_list_enum_num
-.LVL1496:
-	cbnz	w0, .L1409
-	.loc 1 2717 0 is_stmt 1
-	ldr	w0, [x24, 40]
-	.loc 1 2719 0
-	and	w1, w0, -3
-	cmp	w1, 16
-	ccmp	w0, 20, 4, ne
-	beq	.L1408
-	.loc 1 2720 0
-	ldr	w2, [x23, 260]
-	cmp	w2, 0
-	ble	.L1408
-	.loc 1 2721 0
-	ldr	x0, [x23, 104]
-	adrp	x1, .LC112
-	add	x1, x1, :lo12:.LC112
-	bl	_dev_info
-.LVL1497:
-.LBB2264:
-.LBB2265:
-.LBB2266:
-	.loc 17 368 0
-	ldr	w0, [x23, 260]
-	bl	__msecs_to_jiffies
-.LVL1498:
-.LBE2266:
-.LBE2265:
-.LBB2267:
-	.loc 1 2722 0
-	ldr	w1, [x23, 256]
-	cbnz	w1, .L1409
-	.loc 1 2722 0 is_stmt 0 discriminator 2
-	ldr	w1, [x23, 612]
-	cbz	w1, .L1679
-.LVL1499:
-.L1410:
-.LBE2267:
-.LBE2264:
-	.loc 1 2724 0 is_stmt 1
-	bl	ebc_get_dsp_list_enum_num
-.LVL1500:
-	cbnz	w0, .L1409
-	b	.L1408
-.LVL1501:
-	.p2align 3
-.L1652:
-.LBB2276:
-.LBB2180:
-	.loc 1 2785 0
+.L1604:
+.LBE2306:
+.LBE2305:
+.LBB2308:
+.LBB2228:
+	.loc 1 2788 0 is_stmt 1
 	mov	w1, 0
 	add	x0, x29, 112
 	bl	init_wait_entry
-.LVL1502:
+.LVL1451:
 	mov	x24, 60
-.LVL1503:
-.LBB2176:
+.LBB2225:
 	mov	w2, 1
 	add	x1, x29, 112
-	mov	x0, x20
+	mov	x0, x21
 	bl	prepare_to_wait_event
-.LVL1504:
-.LBB2171:
+.LVL1452:
+.LBB2221:
 	ldr	w1, [x23, 100]
+	mov	w2, 0
 	cmp	w1, 0
-	mov	w1, 0
-	cset	w2, ne
-.LVL1505:
-.L1431:
-.LBE2171:
-	.loc 1 2785 0 is_stmt 0 discriminator 9
+	cset	w1, ne
+.LVL1453:
+.L1422:
+.LBE2221:
+	.loc 1 2788 0 is_stmt 0 discriminator 9
 	orr	w1, w1, w2
-	cbnz	w1, .L1430
-.LVL1506:
-	.loc 1 2785 0 discriminator 11
-	cbnz	x0, .L1429
-	.loc 1 2785 0 discriminator 13
+.LVL1454:
+	cbnz	w1, .L1421
+.LVL1455:
+	.loc 1 2788 0 discriminator 11
+	cbnz	x0, .L1420
+	.loc 1 2788 0 discriminator 13
 	mov	x0, x24
-.LVL1507:
+.LVL1456:
 	bl	schedule_timeout
-.LVL1508:
+.LVL1457:
 	mov	w2, 1
 	mov	x24, x0
 	add	x1, x29, 112
-	mov	x0, x20
+	mov	x0, x21
 	bl	prepare_to_wait_event
-.LVL1509:
-.LBB2172:
+.LVL1458:
+.LBB2222:
 	ldr	w1, [x23, 100]
 	cmp	w1, 0
-	cset	w2, ne
-.LVL1510:
+	cset	w1, ne
+.LVL1459:
 	cmp	x24, 0
-	cset	w1, eq
-	tst	w2, w1
-	beq	.L1431
-.L1430:
-.LBE2172:
-.LBE2176:
-	.loc 1 2785 0
+	cset	w2, eq
+	tst	w1, w2
+	beq	.L1422
+.L1421:
+.LBE2222:
+.LBE2225:
+	.loc 1 2788 0
 	add	x1, x29, 112
-	mov	x0, x20
+.LVL1460:
+	mov	x0, x21
 	bl	finish_wait
-.LVL1511:
-.L1429:
-.LBE2180:
-.LBE2276:
-	.loc 1 2786 0 is_stmt 1 discriminator 16
+.LVL1461:
+.L1420:
+.LBE2228:
+.LBE2308:
+	.loc 1 2789 0 is_stmt 1 discriminator 16
 	ldr	w0, [x23, 100]
-.LVL1512:
-	cbnz	w0, .L1250
-	.loc 1 2793 0
+.LVL1462:
+	cbnz	w0, .L1257
+	.loc 1 2796 0
 	ldr	w0, [x23, 52]
 	cmp	w0, 1
-	beq	.L1680
-	.loc 1 2803 0
+	bne	.L1424
+.LBB2309:
+.LBB2310:
+	.loc 1 2797 0 discriminator 3
+	mov	w1, 0
+	add	x0, x29, 112
+	bl	init_wait_entry
+.LVL1463:
+.LBB2311:
+	add	x1, x29, 112
+	mov	w2, 1
+	mov	x0, x21
+	bl	prepare_to_wait_event
+.LVL1464:
+	ldr	w1, [x23, 52]
+	cbz	w1, .L1425
+.L1638:
+	.loc 1 2797 0 is_stmt 0 discriminator 7
+	ldr	w1, [x23, 100]
+	cbnz	w1, .L1425
+.LVL1465:
+	.loc 1 2797 0 discriminator 9
+	cbnz	x0, .L1426
+	.loc 1 2797 0 discriminator 11
+	bl	schedule
+.LVL1466:
+	add	x1, x29, 112
+	mov	w2, 1
+	mov	x0, x21
+	bl	prepare_to_wait_event
+.LVL1467:
+	ldr	w1, [x23, 52]
+	cbnz	w1, .L1638
+.L1425:
+.LBE2311:
+	.loc 1 2797 0 discriminator 8
+	add	x1, x29, 112
+	mov	x0, x21
+	bl	finish_wait
+.LVL1468:
+.L1426:
+.LBE2310:
+.LBE2309:
+	.loc 1 2799 0 is_stmt 1 discriminator 14
 	bl	ebc_get_dsp_list_enum_num
-.LVL1513:
-	cbnz	w0, .L1250
-	.loc 1 2803 0 is_stmt 0 discriminator 1
+.LVL1469:
+	cbnz	w0, .L1257
+	.loc 1 2799 0 is_stmt 0 discriminator 1
 	bl	ebc_get_osd_list_enum_num
-.LVL1514:
-	cbnz	w0, .L1250
-	b	.L1632
-.LVL1515:
-	.p2align 3
-.L1668:
-	.loc 1 2488 0 is_stmt 1 discriminator 2
+.LVL1470:
+	cbnz	w0, .L1257
+	.loc 1 2801 0 is_stmt 1
 	ldr	w0, [x23, 52]
-	cbnz	w0, .L1326
-	b	.L1324
-.L1670:
-	.loc 1 2597 0 discriminator 1
-	ldr	w0, [x23, 52]
-	cbz	w0, .L1376
-	.loc 1 2599 0
-	ldr	x0, [x23, 104]
-	adrp	x1, .LC103
-	add	x1, x1, :lo12:.LC103
-	bl	_dev_info
-.LVL1516:
-.LBB2277:
-	.loc 1 2600 0
-	ldr	w0, [x23, 52]
-	cbz	w0, .L1377
-.LBB2278:
-	.loc 1 2600 0 is_stmt 0 discriminator 1
-	mov	w1, 0
-	add	x0, x29, 112
-	bl	init_wait_entry
-.LVL1517:
-	b	.L1380
-	.p2align 3
-.L1681:
-.LVL1518:
-.LBB2279:
-	.loc 1 2600 0 discriminator 5
-	cbnz	x0, .L1377
-	.loc 1 2600 0 discriminator 7
-	bl	schedule
-.LVL1519:
-.L1380:
-	.loc 1 2600 0 discriminator 9
-	add	x1, x29, 112
-	mov	w2, 1
-	mov	x0, x20
-	bl	prepare_to_wait_event
-.LVL1520:
-	ldr	w1, [x23, 52]
-	cbnz	w1, .L1681
-.L1378:
-.LBE2279:
-	.loc 1 2600 0 discriminator 4
-	add	x1, x29, 112
-	mov	x0, x20
-	bl	finish_wait
-.LVL1521:
-	b	.L1377
-	.p2align 3
-.L1665:
-.LBE2278:
-.LBE2277:
-.LBB2280:
-	.loc 1 2501 0 is_stmt 1
-	ldr	x0, [x23, 224]
-	ldr	w2, [x19, 220]
-	ldr	x1, [x0, 16]
-	ldr	x0, [x24, 16]
-	bl	check_diff_percent.isra.12
-.LVL1522:
-	.loc 1 2502 0
-	cmp	w0, 2
-	bne	.L1332
-	.loc 1 2503 0
-	mov	w0, 21
-	.loc 1 2504 0
-	str	w22, [x24, 64]
-	.loc 1 2503 0
-	str	w0, [x24, 40]
-	.loc 1 2505 0
-	ldr	w0, [x23, 256]
-	cbnz	w0, .L1334
-	.loc 1 2505 0 is_stmt 0 discriminator 1
-	bl	ebc_get_dsp_list_enum_num
-.LVL1523:
-	cbz	w0, .L1324
-.L1334:
-	.loc 1 2507 0 is_stmt 1
-	ldr	x0, [x23, 104]
-	adrp	x1, .LC110
-	add	x1, x1, :lo12:.LC110
-	bl	_dev_info
-.LVL1524:
-.L1617:
-	.loc 1 2508 0
-	mov	x0, x24
-	bl	ebc_buf_release
-.LVL1525:
-	.loc 1 2506 0
-	mov	w0, 1
-.LVL1526:
-	str	w0, [x29, 108]
-	.loc 1 2510 0
-	b	.L1250
-.LVL1527:
-.L1657:
-.LBE2280:
-.LBB2281:
-.LBB2282:
-	mov	w1, 0
-	mov	x0, x19
-	bl	ebc_power_set.part.7
-.LVL1528:
-	b	.L1252
-.LVL1529:
-.L1659:
-.LBE2282:
-.LBE2281:
-	.loc 1 2436 0
-	ldr	x0, [x23, 104]
-	adrp	x1, .LC107
-	add	x1, x1, :lo12:.LC107
-	bl	_dev_info
-.LVL1530:
-	.loc 1 2437 0
-	ldr	w0, [x23, 600]
-	cbz	w0, .L1682
-.L1315:
-	.loc 1 2440 0
-	str	w22, [x23, 600]
-.L1620:
-	.loc 1 2439 0
-	adrp	x1, .LANCHOR0
-	add	x1, x1, :lo12:.LANCHOR0
-	.loc 1 2441 0
-	mov	x0, x24
-	.loc 1 2439 0
-	str	wzr, [x1, 32]
-	.loc 1 2519 0
-	bl	ebc_buf_release
-.LVL1531:
-	b	.L1250
-.L1682:
-	.loc 1 2438 0
-	mov	x0, 2
-	bl	ebc_notify
-.LVL1532:
-	b	.L1315
-.L1661:
-	.loc 1 2460 0
-	ldr	x0, [x23, 104]
-	adrp	x1, .LC109
-	add	x1, x1, :lo12:.LC109
-	bl	_dev_info
-.LVL1533:
-	.loc 1 2462 0
-	str	w22, [x23, 608]
-	b	.L1620
-.L1664:
-	.loc 1 2492 0 discriminator 1
-	ldr	w0, [x23, 52]
-	cbz	w0, .L1326
-	.loc 1 2494 0
-	ldr	x0, [x23, 104]
-	adrp	x1, .LC103
-	add	x1, x1, :lo12:.LC103
-	bl	_dev_info
-.LVL1534:
-.LBB2283:
-	.loc 1 2495 0
-	ldr	w0, [x23, 52]
-	cbnz	w0, .L1683
-.L1330:
-.LVL1535:
-.L1328:
-.LBE2283:
-	.loc 1 2496 0 discriminator 11
-	ldr	x0, [x23, 104]
-.LVL1536:
-	adrp	x1, .LC104
-	add	x1, x1, :lo12:.LC104
-	bl	_dev_info
-.LVL1537:
-	b	.L1326
-.L1656:
-.LBB2286:
-.LBB2243:
-	.loc 1 2364 0 discriminator 1
-	mov	w1, 0
-	add	x0, x29, 112
-	bl	init_wait_entry
-.LVL1538:
-	b	.L1262
-.L1684:
-.LVL1539:
-.LBB2244:
-	.loc 1 2364 0 is_stmt 0 discriminator 5
-	cbnz	x0, .L1259
-	.loc 1 2364 0 discriminator 7
-	bl	schedule
-.LVL1540:
-.L1262:
-	.loc 1 2364 0 discriminator 9
-	add	x1, x29, 112
-	mov	w2, 1
-	mov	x0, x20
-	bl	prepare_to_wait_event
-.LVL1541:
-	ldr	w1, [x23, 52]
-	cbnz	w1, .L1684
-.LBE2244:
-	.loc 1 2364 0 discriminator 4
-	add	x1, x29, 112
-	mov	x0, x20
-	bl	finish_wait
-.LVL1542:
-	b	.L1259
-.L1660:
-.LBE2243:
-.LBE2286:
-	.loc 1 2445 0 is_stmt 1
-	ldr	x0, [x23, 104]
-	adrp	x1, .LC108
-	add	x1, x1, :lo12:.LC108
-	bl	_dev_info
-.LVL1543:
-	.loc 1 2446 0
-	ldr	w0, [x23, 600]
+	cbnz	w0, .L1429
+.L1600:
+	.loc 1 2808 0
+	ldr	w0, [x23, 200]
 	cmp	w0, 1
-	beq	.L1685
-.L1317:
-	.loc 1 2449 0
-	ldr	w0, [x23, 624]
-	.loc 1 2448 0
-	str	wzr, [x23, 600]
-	.loc 1 2449 0
-	cbz	w0, .L1621
-	.loc 1 2450 0
-	adrp	x0, .LANCHOR0
-	add	x0, x0, :lo12:.LANCHOR0
-	.loc 1 2451 0
-	stp	w22, w22, [x0, 32]
-	.loc 1 2519 0
-	mov	x0, x24
-	b	.L1622
-.L1669:
-	.loc 1 2595 0
-	ldr	x0, [x23, 224]
-	ldrsw	x2, [x23, 28]
-	ldr	x1, [x0, 16]
-	ldr	x0, [x23, 160]
-	bl	memcpy
-.LVL1544:
-.L1626:
-	.loc 1 2602 0 discriminator 11
-	ldr	x0, [x23, 232]
-	ldrsw	x2, [x23, 28]
-	ldr	x1, [x0, 16]
-	ldr	x0, [x23, 152]
-	bl	memcpy
-.LVL1545:
-	b	.L1374
-.L1354:
-.LBB2287:
-.LBB2288:
-	.loc 1 2542 0 discriminator 8
-	add	x1, x29, 112
+	bne	.L1429
+.LBB2312:
+.LBB2313:
+	mov	w1, 0
 	mov	x0, x20
-	bl	finish_wait
-.LVL1546:
+	bl	ebc_power_set.part.7
+.LVL1471:
+.L1429:
+.LBE2313:
+.LBE2312:
+	.loc 1 2811 0
+	ldr	w0, [x23, 100]
+	cbnz	w0, .L1431
+.LBB2314:
+.LBB2315:
+	.loc 1 2812 0 discriminator 1
+	mov	w1, 0
+	add	x0, x29, 112
+	bl	init_wait_entry
+.LVL1472:
+.L1434:
+.LBB2316:
+	.loc 1 2812 0 is_stmt 0 discriminator 9
+	add	x1, x29, 112
+	mov	w2, 1
+	mov	x0, x21
+	bl	prepare_to_wait_event
+.LVL1473:
+	ldr	w1, [x23, 100]
+	cbnz	w1, .L1432
+.LVL1474:
+	.loc 1 2812 0 discriminator 5
+	cbnz	x0, .L1431
+	.loc 1 2812 0 discriminator 7
+	bl	schedule
+.LVL1475:
+.LBE2316:
+	b	.L1434
+.LVL1476:
+	.p2align 3
 .L1625:
-	ldr	w0, [x23, 256]
-.LBE2288:
-.LBE2287:
-	.loc 1 2543 0 discriminator 8
-	cbz	w0, .L1356
-.L1358:
-	.loc 1 2544 0
-	ldr	x0, [x23, 104]
-	adrp	x1, .LC111
-	add	x1, x1, :lo12:.LC111
-	bl	_dev_info
-.LVL1547:
-	.loc 1 2545 0
-	mov	x0, x24
-	bl	ebc_buf_release
-.LVL1548:
-	.loc 1 2547 0
-	str	wzr, [x29, 108]
-	b	.L1250
-.L1671:
-	.loc 1 2605 0
-	ldr	x0, [x23, 104]
-	adrp	x1, .LC103
-	add	x1, x1, :lo12:.LC103
-	bl	_dev_info
-.LVL1549:
-.LBB2291:
-	.loc 1 2606 0
+.LBE2315:
+.LBE2314:
+	.loc 1 2492 0 is_stmt 1 discriminator 2
 	ldr	w0, [x23, 52]
-	cbnz	w0, .L1686
-.L1379:
-.LVL1550:
-.L1377:
-.LBE2291:
-	.loc 1 2601 0 discriminator 11
-	ldr	x0, [x23, 104]
-.LVL1551:
-	adrp	x1, .LC104
-	add	x1, x1, :lo12:.LC104
-	bl	_dev_info
-.LVL1552:
-	b	.L1626
-.L1663:
-	.loc 1 2490 0
-	ldr	x0, [x23, 224]
-	ldrsw	x2, [x23, 28]
-	ldr	x1, [x0, 16]
-	ldr	x0, [x23, 160]
-	bl	memcpy
-.LVL1553:
-	.loc 1 2491 0
-	ldr	x0, [x23, 232]
-	ldrsw	x2, [x23, 28]
-	ldr	x1, [x0, 16]
-	ldr	x0, [x23, 152]
-	bl	memcpy
-.LVL1554:
-	b	.L1326
-.L1345:
+	cbnz	w0, .L1333
+	.loc 1 2590 0
+	ldr	w0, [x23, 468]
+	cbz	w0, .L1435
+	b	.L1436
+.L1346:
 	adrp	x0, .LANCHOR3
 	add	x0, x0, :lo12:.LANCHOR3
 	add	x0, x0, 56
 	ldr	w1, [x0, w1, uxtw 2]
-	.loc 1 2537 0
+	.loc 1 2541 0
 	ldr	w0, [x23, 144]
 	cmp	w0, 7
-	beq	.L1687
-	.loc 1 2538 0
-	cmp	w0, 1
-	bne	.L1350
-.LVL1555:
-	.loc 1 2538 0 is_stmt 0 discriminator 1
+	bne	.L1349
+.LVL1477:
+	.loc 1 2541 0 is_stmt 0 discriminator 1
 	cmp	w1, 7
-	ccmp	w1, 1, 4, ne
-	beq	.L1349
-.L1346:
-	.loc 1 2540 0 is_stmt 1
+	beq	.L1350
+.L1347:
+	.loc 1 2544 0 is_stmt 1
 	ldr	w0, [x23, 52]
-	cbz	w0, .L1349
-	.loc 1 2541 0
+	cbz	w0, .L1350
+	.loc 1 2545 0
 	ldr	x0, [x23, 104]
 	adrp	x1, .LC103
-.LVL1556:
+.LVL1478:
 	add	x1, x1, :lo12:.LC103
 	bl	_dev_info
-.LVL1557:
-.LBB2294:
-	.loc 1 2542 0
+.LVL1479:
+.LBB2318:
+	.loc 1 2546 0
 	ldr	w0, [x23, 52]
-	cbz	w0, .L1625
-	.loc 1 2542 0 is_stmt 0 discriminator 1
-	ldr	w0, [x23, 256]
-	cbnz	w0, .L1358
-.LBB2290:
-	.loc 1 2542 0 discriminator 3
-	mov	w1, 0
-	add	x0, x29, 112
-	bl	init_wait_entry
-.LVL1558:
-.L1357:
-.LBB2289:
-	.loc 1 2542 0 discriminator 13
-	add	x1, x29, 112
-	mov	w2, 1
-	mov	x0, x20
-	bl	prepare_to_wait_event
-.LVL1559:
-	ldr	w1, [x23, 52]
-	cbz	w1, .L1354
-	.loc 1 2542 0 discriminator 7
-	ldr	w1, [x23, 256]
-	cbnz	w1, .L1354
-.LVL1560:
-	.loc 1 2542 0 discriminator 9
-	cbnz	x0, .L1356
-	.loc 1 2542 0 discriminator 11
-	bl	schedule
-.LVL1561:
-.LBE2289:
-	b	.L1357
-.LVL1562:
-	.p2align 3
-.L1654:
-.LBE2290:
-.LBE2294:
-	.loc 1 2655 0 is_stmt 1
-	ldr	x0, [x23, 224]
-	ldrsw	x2, [x23, 28]
-	ldr	x1, [x23, 160]
-	ldr	x0, [x0, 16]
-	bl	memcpy
-.LVL1563:
-	b	.L1393
-.LVL1564:
-.L1674:
-.LBB2295:
-.LBB2259:
-	.loc 1 2749 0 discriminator 1
-	mov	w1, 0
-	add	x0, x29, 112
-	bl	init_wait_entry
-.LVL1565:
-	b	.L1421
-	.p2align 3
-.L1688:
-.LVL1566:
-.LBB2260:
-	.loc 1 2749 0 is_stmt 0 discriminator 5
-	cbnz	x0, .L1418
-	.loc 1 2749 0 discriminator 7
-	bl	schedule
-.LVL1567:
-.L1421:
-	.loc 1 2749 0 discriminator 9
-	add	x1, x29, 112
-	mov	w2, 1
-	mov	x0, x20
-	bl	prepare_to_wait_event
-.LVL1568:
-	ldr	w1, [x23, 52]
-	cbnz	w1, .L1688
-.LBE2260:
-	.loc 1 2749 0 discriminator 4
-	add	x1, x29, 112
-	mov	x0, x20
-	bl	finish_wait
-.LVL1569:
-	b	.L1418
-.LVL1570:
-.L1676:
-.LBE2259:
-.LBE2295:
-	.loc 1 2767 0 is_stmt 1
-	ldr	x0, [x23, 104]
-	adrp	x1, .LC122
-	add	x1, x1, :lo12:.LC122
-	bl	_dev_info
-.LVL1571:
-	.loc 1 2768 0
-	ldr	w0, [x23, 600]
-	cbz	w0, .L1689
-.L1424:
-	.loc 1 2771 0
-	adrp	x0, .LANCHOR0
-	add	x0, x0, :lo12:.LANCHOR0
-	.loc 1 2770 0
-	str	w22, [x23, 600]
-	.loc 1 2771 0
-	str	wzr, [x0, 32]
-	b	.L1423
-.LVL1572:
-.L1680:
-.LBB2296:
-.LBB2297:
-	.loc 1 2794 0 discriminator 3
-	mov	w1, 0
-	add	x0, x29, 112
-	bl	init_wait_entry
-.LVL1573:
-.LBB2298:
-	add	x1, x29, 112
-	mov	w2, 1
-	mov	x0, x20
-	bl	prepare_to_wait_event
-.LVL1574:
-	ldr	w1, [x23, 52]
-	cbz	w1, .L1434
-.L1690:
-	.loc 1 2794 0 is_stmt 0 discriminator 7
-	ldr	w1, [x23, 100]
-	cbnz	w1, .L1434
-.LVL1575:
-	.loc 1 2794 0 discriminator 9
-	cbnz	x0, .L1435
-	.loc 1 2794 0 discriminator 11
-	bl	schedule
-.LVL1576:
-	add	x1, x29, 112
-	mov	w2, 1
-	mov	x0, x20
-	bl	prepare_to_wait_event
-.LVL1577:
-	ldr	w1, [x23, 52]
-	cbnz	w1, .L1690
-.L1434:
-.LBE2298:
-	.loc 1 2794 0 discriminator 8
-	add	x1, x29, 112
-	mov	x0, x20
-	bl	finish_wait
-.LVL1578:
-.L1435:
-.LBE2297:
-.LBE2296:
-	.loc 1 2796 0 is_stmt 1 discriminator 14
+	cbnz	w0, .L1639
+.L1354:
+.LVL1480:
+.L1352:
+.LBE2318:
+	.loc 1 2547 0 discriminator 11
 	bl	ebc_get_dsp_list_enum_num
-.LVL1579:
-	cbnz	w0, .L1250
-	.loc 1 2796 0 is_stmt 0 discriminator 1
-	bl	ebc_get_osd_list_enum_num
-.LVL1580:
-	cbnz	w0, .L1250
-	.loc 1 2798 0 is_stmt 1
-	ldr	w0, [x23, 52]
-	cbnz	w0, .L1438
-.L1632:
-	.loc 1 2805 0
-	ldr	w0, [x23, 208]
-	cmp	w0, 1
-	bne	.L1438
-.LBB2299:
-.LBB2300:
-	mov	w1, 0
-	mov	x0, x19
-	bl	ebc_power_set.part.7
-.LVL1581:
-.L1438:
-.LBE2300:
-.LBE2299:
-	.loc 1 2808 0
-	ldr	w0, [x23, 100]
-	cbnz	w0, .L1440
-.LBB2301:
-.LBB2302:
-	.loc 1 2809 0 discriminator 1
-	mov	w1, 0
-	add	x0, x29, 112
-	bl	init_wait_entry
-.LVL1582:
-.L1443:
-.LBB2303:
-	.loc 1 2809 0 is_stmt 0 discriminator 9
-	add	x1, x29, 112
-	mov	w2, 1
-	mov	x0, x20
-	bl	prepare_to_wait_event
-.LVL1583:
-	ldr	w1, [x23, 100]
-	cbnz	w1, .L1441
-.LVL1584:
-	.loc 1 2809 0 discriminator 5
-	cbnz	x0, .L1440
-	.loc 1 2809 0 discriminator 7
-	bl	schedule
-.LVL1585:
-.LBE2303:
-	b	.L1443
-.L1658:
-.LBE2302:
-.LBE2301:
-	.loc 1 2815 0 is_stmt 1
-	bl	__stack_chk_fail
-.LVL1586:
-.L1441:
-.LBB2305:
-.LBB2304:
-	.loc 1 2809 0 discriminator 4
-	add	x1, x29, 112
-	mov	x0, x20
-	bl	finish_wait
-.LVL1587:
-.LBE2304:
-.LBE2305:
-	.loc 1 2810 0 discriminator 4
-	str	wzr, [x23, 100]
-	b	.L1250
-.LVL1588:
-.L1689:
-	.loc 1 2769 0
-	mov	x0, 2
-	bl	ebc_notify
-.LVL1589:
-	b	.L1424
-.L1350:
-.LVL1590:
-	cmp	w1, 12
-	cset	w1, eq
-.LVL1591:
-	b	.L1450
-.L1687:
-.LVL1592:
-	.loc 1 2537 0 discriminator 1
-	cmp	w1, 7
-	bne	.L1346
-	b	.L1349
-.LVL1593:
-.L1356:
-	.loc 1 2543 0 discriminator 1
-	bl	ebc_get_dsp_list_enum_num
-.LVL1594:
-	cbnz	w0, .L1358
-	.loc 1 2549 0
+.LVL1481:
+	cbnz	w0, .L1589
+	.loc 1 2553 0
 	ldr	x0, [x23, 104]
 	adrp	x1, .LC104
 	add	x1, x1, :lo12:.LC104
 	bl	_dev_info
-.LVL1595:
-	b	.L1349
-.L1686:
-.LBB2306:
-.LBB2292:
-	.loc 1 2606 0 discriminator 1
+.LVL1482:
+	b	.L1350
+.LVL1483:
+	.p2align 3
+.L1394:
+	.loc 1 2686 0
+	cbnz	w19, .L1442
+	.loc 1 2690 0
+	ldr	w0, [x23, 84]
+	.loc 1 2685 0
+	mov	w25, 1
+.LVL1484:
+	.loc 1 2690 0
+	cmp	w0, 0
+	ble	.L1395
+	.loc 1 2691 0
+	ldr	w1, [x29, 108]
+.LVL1485:
+	add	w1, w1, w25
+.LVL1486:
+	str	w1, [x29, 108]
+	.loc 1 2692 0
+	cmp	w0, w1
+	bgt	.L1395
+	.loc 1 2693 0
+	mov	w25, 2
+	.loc 1 2694 0
+	str	wzr, [x29, 108]
+	.loc 1 2693 0
+	str	w25, [x24, 40]
+.LVL1487:
+.L1395:
+	.loc 1 2699 0
+	ldr	w0, [x23, 200]
+	cbz	w0, .L1640
+.L1400:
+	.loc 1 2702 0
+	ldr	w1, [x24, 40]
+.LVL1488:
+	mov	x0, x20
+	bl	ebc_lut_update
+.LVL1489:
+	.loc 1 2705 0
+	bl	ebc_get_dsp_list_enum_num
+.LVL1490:
+	cbnz	w0, .L1598
+	.loc 1 2719 0
+	ldr	w0, [x24, 40]
+	.loc 1 2721 0
+	and	w1, w0, -3
+	cmp	w1, 16
+	ccmp	w0, 20, 4, ne
+	beq	.L1403
+	.loc 1 2722 0
+	ldr	w2, [x23, 248]
+	cmp	w2, 0
+	ble	.L1403
+	.loc 1 2723 0
+	ldr	x0, [x23, 104]
+	adrp	x1, .LC112
+	add	x1, x1, :lo12:.LC112
+	bl	_dev_info
+.LVL1491:
+.LBB2321:
+.LBB2322:
+.LBB2323:
+	.loc 17 368 0
+	ldr	w0, [x23, 248]
+	bl	__msecs_to_jiffies
+.LVL1492:
+.LBE2323:
+.LBE2322:
+.LBB2324:
+	.loc 1 2724 0
+	ldr	w1, [x23, 596]
+	cmp	w1, 0
+	cset	w1, ne
+.LVL1493:
+	cmp	x0, 0
+	cset	w0, eq
+	tst	w1, w0
+	beq	.L1641
+.L1406:
+.LVL1494:
+.L1404:
+.LBE2324:
+.LBE2321:
+	.loc 1 2726 0 discriminator 17
+	bl	ebc_get_dsp_list_enum_num
+.LVL1495:
+	cbz	w0, .L1403
+.L1598:
+	.loc 1 2727 0
+	ldr	w0, [x24, 40]
+	sub	w0, w0, #19
+	tst	w0, -3
+	beq	.L1590
+	.loc 1 2733 0
+	ldr	w19, [x24, 64]
+.LVL1496:
+	cbz	w19, .L1589
+.LVL1497:
+.L1403:
+	.loc 1 2745 0
+	ldr	w3, [x23, 112]
+	.loc 1 2746 0
+	adrp	x1, .LC119
+	.loc 1 2745 0
+	strb	w3, [x23, 56]
+	.loc 1 2746 0
+	add	x1, x1, :lo12:.LC119
+	.loc 1 2744 0
+	str	x24, [x23, 224]
+	.loc 1 2746 0
+	and	w3, w3, 255
+	ldr	x0, [x23, 104]
+	.loc 1 2750 0
+	add	x19, x20, 720
+.LVL1498:
+	.loc 1 2746 0
+	ldr	w2, [x24, 40]
+	.loc 1 2750 0
+	adrp	x24, jiffies
+	.loc 1 2746 0
+	bl	_dev_info
+.LVL1499:
+	.loc 1 2748 0
+	str	w25, [x23, 252]
+	.loc 1 2747 0
+	mov	w0, 1
+	str	w0, [x23, 52]
+	.loc 1 2749 0
+	mov	x0, x20
+	bl	ebc_frame_start
+.LVL1500:
+	.loc 1 2750 0
+	ldr	x1, [x24, #:lo12:jiffies]
+	mov	x0, x19
+	add	x1, x1, 900
+	bl	mod_timer
+.LVL1501:
+.LBB2331:
+	.loc 1 2751 0
+	ldr	w0, [x23, 52]
+	cbnz	w0, .L1642
+.L1411:
+.LVL1502:
+.L1409:
+.LBE2331:
+	.loc 1 2752 0 discriminator 11
+	ldr	x2, [x24, #:lo12:jiffies]
+	mov	x0, x19
+.LVL1503:
+	mov	x1, 402653184
+	add	x1, x2, x1
+	bl	mod_timer
+.LVL1504:
+	ldr	x0, [x23, 224]
+	ldr	w0, [x0, 40]
+	.loc 1 2764 0 discriminator 11
+	cmp	w0, 20
+	bne	.L1413
+.LVL1505:
+.L1622:
+	.loc 1 2765 0
+	mov	w0, 1
+	str	w0, [x23, 592]
+	.loc 1 2767 0
+	ldr	x0, [x23, 104]
+	adrp	x1, .LC121
+	.loc 1 2766 0
+	str	wzr, [x23, 612]
+	.loc 1 2767 0
+	add	x1, x1, :lo12:.LC121
+	bl	_dev_info
+.LVL1506:
+	.loc 1 2777 0
+	ldr	w0, [x23, 468]
+	cbz	w0, .L1416
+.L1624:
+	.loc 1 2778 0
+	ldr	x0, [x23, 216]
+	bl	ebc_buf_release
+.LVL1507:
+	b	.L1417
+.LVL1508:
+.L1367:
+	.loc 1 2593 0
+	cmp	w2, 21
+	ble	.L1370
+	cmp	w2, 23
+	bgt	.L1366
+.L1369:
+	.loc 1 2598 0
+	ldr	w0, [x23, 252]
+	.loc 1 2597 0
+	str	x24, [x23, 224]
+	.loc 1 2598 0
+	sub	w1, w0, #1
+	cmp	w1, 1
+	bls	.L1643
+	.loc 1 2601 0
+	cmp	w0, 4
+	beq	.L1644
+	.loc 1 2607 0
+	ldr	x0, [x23, 216]
+	ldr	w1, [x24, 40]
+	ldr	w0, [x0, 40]
+	cmp	w1, w0
+	beq	.L1374
+	.loc 1 2607 0 is_stmt 0 discriminator 1
+	ldr	w0, [x23, 52]
+	cbnz	w0, .L1645
+.L1381:
+.L1374:
+	.loc 1 2614 0 is_stmt 1
+	ldr	x0, [x23, 152]
+	mov	x3, x23
+	ldr	x2, [x23, 168]
+	ldr	x1, [x24, 16]
+	bl	refresh_new_image_auto
+.LVL1509:
+.L1372:
+	.loc 1 2620 0
+	ldr	w0, [x23, 52]
+	.loc 1 2619 0
+	mov	w1, 3
+	str	w1, [x23, 252]
+	.loc 1 2620 0
+	cbnz	w0, .L1595
+	.loc 1 2621 0
+	mov	w0, 1
+	str	w0, [x23, 52]
+	.loc 1 2622 0
+	ldr	w0, [x23, 200]
+	cbz	w0, .L1646
+.L1384:
+	.loc 1 2624 0
+	ldr	w1, [x24, 40]
+	mov	x0, x20
+	bl	ebc_lut_update
+.LVL1510:
+	.loc 1 2626 0
+	ldr	w1, [x23, 112]
+	.loc 1 2628 0
+	ldr	x0, [x23, 104]
+	.loc 1 2626 0
+	strb	w1, [x23, 56]
+	.loc 1 2628 0
+	and	w2, w1, 255
+	.loc 1 2627 0
+	lsr	w1, w1, 8
+	strb	w1, [x23, 57]
+	.loc 1 2628 0
+	adrp	x1, .LC116
+	add	x1, x1, :lo12:.LC116
+	bl	_dev_info
+.LVL1511:
+	.loc 1 2629 0
+	mov	x0, x20
+	bl	ebc_frame_start
+.LVL1512:
+.L1595:
+	ldr	x0, [x23, 224]
+	ldr	w0, [x0, 40]
+	b	.L1365
+.L1589:
+	.loc 1 2532 0
+	ldr	x0, [x23, 104]
+	adrp	x1, .LC111
+	add	x1, x1, :lo12:.LC111
+	bl	_dev_info
+.LVL1513:
+	.loc 1 2533 0
+	mov	x0, x24
+	b	.L1588
+.LVL1514:
+.L1442:
+	.loc 1 2699 0
+	ldr	w0, [x23, 200]
+	.loc 1 2689 0
+	mov	w25, 2
+.LVL1515:
+	.loc 1 2687 0
+	str	wzr, [x29, 108]
+	.loc 1 2699 0
+	cbnz	w0, .L1400
+.LVL1516:
+.L1640:
+	.loc 1 2700 0
+	mov	x0, x20
+	bl	ebc_power_set.constprop.15
+.LVL1517:
+	b	.L1400
+.LVL1518:
+.L1627:
+	.loc 1 2438 0
+	ldr	x0, [x23, 104]
+	adrp	x1, .LC107
+	add	x1, x1, :lo12:.LC107
+	bl	_dev_info
+.LVL1519:
+	.loc 1 2439 0
+	ldr	w0, [x23, 584]
+	cbnz	w0, .L1322
+	.loc 1 2440 0
+	mov	x0, 2
+	bl	ebc_notify
+.LVL1520:
+.L1322:
+	.loc 1 2442 0
+	mov	w0, 1
+	str	w0, [x23, 584]
+.L1586:
+	.loc 1 2441 0
+	adrp	x1, .LANCHOR0
+	add	x1, x1, :lo12:.LANCHOR0
+	.loc 1 2443 0
+	str	wzr, [x23, 612]
+	.loc 1 2444 0
+	mov	x0, x24
+	.loc 1 2441 0
+	str	wzr, [x1, 32]
+	.loc 1 2533 0
+	bl	ebc_buf_release
+.LVL1521:
+	b	.L1257
+.LVL1522:
+.L1621:
+	.loc 1 2663 0
+	ldr	w3, [x23, 88]
+	.loc 1 2664 0
+	sub	w1, w3, #1
+	cmp	w1, 99
+	bhi	.L1392
+.LBB2334:
+	.loc 1 2665 0
+	ldr	x0, [x23, 216]
+	ldr	w2, [x20, 220]
+	ldr	x1, [x0, 16]
+	ldr	x0, [x24, 16]
+	bl	check_diff_percent.isra.12
+.LVL1523:
+	mov	w25, w0
+.LVL1524:
+	.loc 1 2666 0
+	cbz	w0, .L1396
+	.loc 1 2671 0
+	cmp	w0, 2
+	bne	.L1394
+.LBE2334:
+	.loc 1 2693 0
+	str	w25, [x24, 40]
+	.loc 1 2694 0
+	str	wzr, [x29, 108]
+	b	.L1395
+.LVL1525:
+	.p2align 3
+.L1626:
+.LBB2335:
+.LBB2290:
+	.loc 1 2366 0 discriminator 1
 	mov	w1, 0
 	add	x0, x29, 112
 	bl	init_wait_entry
-.LVL1596:
-	b	.L1384
-	.p2align 3
-.L1691:
-.LVL1597:
-.LBB2293:
-	.loc 1 2606 0 is_stmt 0 discriminator 5
-	cbnz	x0, .L1377
-	.loc 1 2606 0 discriminator 7
+.LVL1526:
+	b	.L1269
+.L1647:
+.LVL1527:
+.LBB2291:
+	.loc 1 2366 0 is_stmt 0 discriminator 5
+	cbnz	x0, .L1266
+	.loc 1 2366 0 discriminator 7
 	bl	schedule
-.LVL1598:
-.L1384:
-	.loc 1 2606 0 discriminator 9
+.LVL1528:
+.L1269:
+	.loc 1 2366 0 discriminator 9
 	add	x1, x29, 112
 	mov	w2, 1
-	mov	x0, x20
+	mov	x0, x21
 	bl	prepare_to_wait_event
-.LVL1599:
+.LVL1529:
 	ldr	w1, [x23, 52]
-	cbnz	w1, .L1691
-.LBE2293:
+	cbnz	w1, .L1647
+.LBE2291:
+	.loc 1 2366 0 discriminator 4
+	add	x1, x29, 112
+	mov	x0, x21
+	bl	finish_wait
+.LVL1530:
+	b	.L1266
+.LVL1531:
+.L1623:
+.LBE2290:
+.LBE2335:
+	.loc 1 2769 0 is_stmt 1
+	ldr	x0, [x23, 104]
+	adrp	x1, .LC122
+	add	x1, x1, :lo12:.LC122
+	bl	_dev_info
+.LVL1532:
+	.loc 1 2770 0
+	ldr	w0, [x23, 584]
+	cbz	w0, .L1648
+	.loc 1 2773 0
+	adrp	x0, .LANCHOR0
+	add	x0, x0, :lo12:.LANCHOR0
+	.loc 1 2772 0
+	mov	w1, 1
+	.loc 1 2774 0
+	str	wzr, [x23, 612]
+	.loc 1 2772 0
+	str	w1, [x23, 584]
+	.loc 1 2773 0
+	str	wzr, [x0, 32]
+	b	.L1414
+.LVL1533:
+.L1635:
+.LBB2336:
+	.loc 1 2529 0 discriminator 3
+	orr	w1, w1, w0
+.LVL1534:
+	cbnz	w1, .L1342
+.LBB2297:
+.LBB2298:
+.LBB2299:
+	.loc 17 368 0 discriminator 4
+	ldr	w0, [x23, 248]
+	bl	__msecs_to_jiffies
+.LVL1535:
+	mov	x25, x0
+.LVL1536:
+.LBE2299:
+.LBE2298:
+	.loc 1 2529 0 discriminator 4
+	mov	w1, 0
+	add	x0, x29, 112
+	bl	init_wait_entry
+.LVL1537:
+.L1345:
+.LBB2300:
+	.loc 1 2529 0 is_stmt 0 discriminator 15
+	mov	w2, 1
+	add	x1, x29, 112
+	mov	x0, x21
+	bl	prepare_to_wait_event
+.LVL1538:
+.LBB2301:
+	ldr	w1, [x23, 100]
+	cmp	w1, 0
+	cset	w1, ne
+.LVL1539:
+	cmp	x25, 0
+	cset	w2, eq
+	tst	w1, w2
+	beq	.L1649
+.L1343:
+.LBE2301:
+.LBE2300:
+	.loc 1 2529 0 discriminator 10
+	add	x1, x29, 112
+.LVL1540:
+	mov	x0, x21
+	bl	finish_wait
+.LVL1541:
+	b	.L1342
+.LVL1542:
+.L1649:
+.LBB2302:
+	.loc 1 2529 0 discriminator 9
+	orr	w1, w1, w2
+.LVL1543:
+	cbnz	w1, .L1343
+.LVL1544:
+	.loc 1 2529 0 discriminator 11
+	cbnz	x0, .L1342
+	.loc 1 2529 0 discriminator 13
+	mov	x0, x25
+.LVL1545:
+	bl	schedule_timeout
+.LVL1546:
+	mov	x25, x0
+.LBE2302:
+	b	.L1345
+.LVL1547:
+.L1605:
+.LBE2297:
+.LBE2336:
+.LBB2337:
+.LBB2338:
+	mov	w1, 0
+	mov	x0, x20
+	bl	ebc_power_set.part.7
+.LVL1548:
+	b	.L1259
+.LVL1549:
+.L1629:
+.LBE2338:
+.LBE2337:
+	.loc 1 2463 0 is_stmt 1
+	ldr	x0, [x23, 104]
+	adrp	x1, .LC109
+	add	x1, x1, :lo12:.LC109
+	bl	_dev_info
+.LVL1550:
+	.loc 1 2465 0
+	mov	w0, 1
+	str	w0, [x23, 592]
+	b	.L1586
+.L1628:
+	.loc 1 2448 0
+	ldr	x0, [x23, 104]
+	adrp	x1, .LC108
+	add	x1, x1, :lo12:.LC108
+	bl	_dev_info
+.LVL1551:
+	.loc 1 2449 0
+	ldr	w0, [x23, 584]
+	cmp	w0, 1
+	beq	.L1650
+.L1324:
+	.loc 1 2452 0
+	ldr	w0, [x23, 608]
+	.loc 1 2451 0
+	str	wzr, [x23, 584]
+	.loc 1 2452 0
+	cbz	w0, .L1587
+	.loc 1 2453 0
+	adrp	x0, .LANCHOR0
+	add	x0, x0, :lo12:.LANCHOR0
+	mov	w1, 1
+	.loc 1 2454 0
+	stp	w1, w1, [x0, 32]
+	.loc 1 2533 0
+	mov	x0, x24
+	b	.L1588
+.L1632:
+	.loc 1 2496 0 discriminator 1
+	ldr	w0, [x23, 52]
+	cbz	w0, .L1333
+	.loc 1 2498 0
+	ldr	x0, [x23, 104]
+	adrp	x1, .LC103
+	add	x1, x1, :lo12:.LC103
+	bl	_dev_info
+.LVL1552:
+.LBB2339:
+	.loc 1 2499 0
+	ldr	w0, [x23, 52]
+	cbnz	w0, .L1651
+.L1337:
+.LVL1553:
+.L1335:
+.LBE2339:
+	.loc 1 2500 0 discriminator 11
+	ldr	x0, [x23, 104]
+.LVL1554:
+	adrp	x1, .LC104
+	add	x1, x1, :lo12:.LC104
+	bl	_dev_info
+.LVL1555:
+	b	.L1333
+.L1349:
+.LVL1556:
+	cmp	w1, 12
+	cset	w2, eq
+	.loc 1 2542 0
+	cmp	w0, 1
+	bne	.L1437
+	.loc 1 2542 0 is_stmt 0 discriminator 1
+	cmp	w1, 7
+	ccmp	w1, 1, 4, ne
+	beq	.L1350
+	b	.L1347
+.LVL1557:
+	.p2align 3
+.L1634:
+	.loc 1 2522 0 is_stmt 1
+	ldr	x0, [x23, 104]
+.LVL1558:
+	adrp	x1, .LC111
+	add	x1, x1, :lo12:.LC111
+	.loc 1 2525 0
+	mov	w19, 0
+	.loc 1 2522 0
+	bl	_dev_info
+.LVL1559:
+	.loc 1 2523 0
+	mov	x0, x24
+	bl	ebc_buf_release
+.LVL1560:
+	.loc 1 2525 0
+	b	.L1257
+.LVL1561:
+.L1642:
+.LBB2342:
+.LBB2332:
+	.loc 1 2751 0 discriminator 1
+	mov	w1, 0
+	add	x0, x29, 112
+	bl	init_wait_entry
+.LVL1562:
+	b	.L1412
+.L1652:
+.LVL1563:
+.LBB2333:
+	.loc 1 2751 0 is_stmt 0 discriminator 5
+	cbnz	x0, .L1409
+	.loc 1 2751 0 discriminator 7
+	bl	schedule
+.LVL1564:
+.L1412:
+	.loc 1 2751 0 discriminator 9
+	add	x1, x29, 112
+	mov	w2, 1
+	mov	x0, x21
+	bl	prepare_to_wait_event
+.LVL1565:
+	ldr	w1, [x23, 52]
+	cbnz	w1, .L1652
+.LBE2333:
+	.loc 1 2751 0 discriminator 4
+	add	x1, x29, 112
+	mov	x0, x21
+	bl	finish_wait
+.LVL1566:
+	b	.L1409
+.LVL1567:
+.L1648:
+.LBE2332:
+.LBE2342:
+	.loc 1 2771 0 is_stmt 1
+	mov	x0, 2
+	bl	ebc_notify
+.LVL1568:
+	.loc 1 2773 0
+	adrp	x0, .LANCHOR0
+	add	x0, x0, :lo12:.LANCHOR0
+	.loc 1 2772 0
+	mov	w1, 1
+	.loc 1 2774 0
+	str	wzr, [x23, 612]
+	.loc 1 2772 0
+	str	w1, [x23, 584]
+	.loc 1 2773 0
+	str	wzr, [x0, 32]
+	b	.L1414
+.LVL1569:
+.L1631:
+	.loc 1 2494 0
+	ldr	x0, [x23, 216]
+	ldrsw	x2, [x23, 28]
+	ldr	x1, [x0, 16]
+	ldr	x0, [x23, 160]
+	bl	memcpy
+.LVL1570:
+	.loc 1 2495 0
+	ldr	x0, [x23, 224]
+	ldrsw	x2, [x23, 28]
+	ldr	x1, [x0, 16]
+	ldr	x0, [x23, 152]
+	bl	memcpy
+.LVL1571:
+	b	.L1333
+.L1646:
+	.loc 1 2623 0
+	mov	x0, x20
+	bl	ebc_power_set.constprop.15
+.LVL1572:
+	b	.L1384
+.L1645:
+	.loc 1 2609 0
+	ldr	x0, [x23, 104]
+	adrp	x1, .LC103
+	add	x1, x1, :lo12:.LC103
+	bl	_dev_info
+.LVL1573:
+.LBB2343:
+	.loc 1 2610 0
+	ldr	w0, [x23, 52]
+	cbnz	w0, .L1653
+.L1377:
+.LVL1574:
+.L1375:
+.LBE2343:
+	.loc 1 2605 0 discriminator 11
+	ldr	x0, [x23, 104]
+.LVL1575:
+	adrp	x1, .LC104
+	add	x1, x1, :lo12:.LC104
+	bl	_dev_info
+.LVL1576:
+.L1593:
+	.loc 1 2606 0 discriminator 11
+	ldr	x0, [x23, 224]
+	ldrsw	x2, [x23, 28]
+	ldr	x1, [x0, 16]
+	ldr	x0, [x23, 152]
+	bl	memcpy
+.LVL1577:
+	b	.L1372
+.LVL1578:
+.L1620:
+	.loc 1 2659 0
+	ldr	x0, [x23, 216]
+	ldrsw	x2, [x23, 28]
+	ldr	x1, [x23, 160]
+	ldr	x0, [x0, 16]
+	bl	memcpy
+.LVL1579:
+	b	.L1391
+.LVL1580:
+.L1633:
+.LBB2346:
+	.loc 1 2508 0
+	mov	w0, 1
+	str	w0, [x24, 64]
+	.loc 1 2507 0
+	mov	w0, 21
+	str	w0, [x24, 40]
+	.loc 1 2509 0
+	bl	ebc_get_dsp_list_enum_num
+.LVL1581:
+	cbz	w0, .L1331
+.LVL1582:
+.L1590:
+	.loc 1 2511 0
+	ldr	x0, [x23, 104]
+	adrp	x1, .LC110
+	add	x1, x1, :lo12:.LC110
+	bl	_dev_info
+.LVL1583:
+.L1583:
+	.loc 1 2512 0
+	mov	x0, x24
+	.loc 1 2510 0
+	mov	w19, 1
+.LVL1584:
+	.loc 1 2512 0
+	bl	ebc_buf_release
+.LVL1585:
+	.loc 1 2514 0
+	b	.L1257
+.L1643:
+.LBE2346:
+	.loc 1 2599 0
+	ldr	x0, [x23, 216]
+	ldrsw	x2, [x23, 28]
+	ldr	x1, [x0, 16]
+	ldr	x0, [x23, 160]
+	bl	memcpy
+.LVL1586:
+	b	.L1593
+.L1644:
+	.loc 1 2601 0 discriminator 1
+	ldr	w0, [x23, 52]
+	cbz	w0, .L1374
+	.loc 1 2603 0
+	ldr	x0, [x23, 104]
+	adrp	x1, .LC103
+	add	x1, x1, :lo12:.LC103
+	bl	_dev_info
+.LVL1587:
+.LBB2347:
+	.loc 1 2604 0
+	ldr	w0, [x23, 52]
+	cbz	w0, .L1375
+.LBB2348:
+	.loc 1 2604 0 is_stmt 0 discriminator 1
+	mov	w1, 0
+	add	x0, x29, 112
+	bl	init_wait_entry
+.LVL1588:
 	b	.L1378
-.L1667:
-.LBE2292:
-.LBE2306:
-	.loc 1 2562 0 is_stmt 1
-	str	w22, [x23, 52]
-	.loc 1 2565 0
+	.p2align 3
+.L1654:
+.LVL1589:
+.LBB2349:
+	.loc 1 2604 0 discriminator 5
+	cbnz	x0, .L1375
+	.loc 1 2604 0 discriminator 7
+	bl	schedule
+.LVL1590:
+.L1378:
+	.loc 1 2604 0 discriminator 9
+	add	x1, x29, 112
+	mov	w2, 1
+	mov	x0, x21
+	bl	prepare_to_wait_event
+.LVL1591:
+	ldr	w1, [x23, 52]
+	cbnz	w1, .L1654
+.L1376:
+.LBE2349:
+	.loc 1 2604 0 discriminator 4
+	add	x1, x29, 112
+	mov	x0, x21
+	bl	finish_wait
+.LVL1592:
+	b	.L1375
+.LVL1593:
+	.p2align 3
+.L1641:
+.LBE2348:
+.LBE2347:
+.LBB2350:
+	.loc 1 2724 0 is_stmt 1 discriminator 3
+	orr	w1, w1, w0
+.LVL1594:
+	cbnz	w1, .L1404
+.LBB2325:
+.LBB2326:
+.LBB2327:
+	.loc 17 368 0 discriminator 4
+	ldr	w0, [x23, 248]
+	bl	__msecs_to_jiffies
+.LVL1595:
+	mov	x19, x0
+.LVL1596:
+.LBE2327:
+.LBE2326:
+	.loc 1 2724 0 discriminator 4
+	mov	w1, 0
+	add	x0, x29, 112
+	bl	init_wait_entry
+.LVL1597:
+.L1407:
+.LBB2328:
+	.loc 1 2724 0 is_stmt 0 discriminator 15
+	mov	w2, 1
+	add	x1, x29, 112
+	mov	x0, x21
+	bl	prepare_to_wait_event
+.LVL1598:
+.LBB2329:
+	ldr	w1, [x23, 596]
+	cmp	w1, 0
+	cset	w1, ne
+.LVL1599:
+	cmp	x19, 0
+	cset	w2, eq
+	tst	w1, w2
+	beq	.L1655
+.L1405:
+.LBE2329:
+.LBE2328:
+	.loc 1 2724 0 discriminator 10
+	add	x1, x29, 112
+.LVL1600:
+	mov	x0, x21
+	bl	finish_wait
+.LVL1601:
+	b	.L1404
+.LVL1602:
+	.p2align 3
+.L1655:
+.LBB2330:
+	.loc 1 2724 0 discriminator 9
+	orr	w1, w1, w2
+.LVL1603:
+	cbnz	w1, .L1405
+.LVL1604:
+	.loc 1 2724 0 discriminator 11
+	cbnz	x0, .L1404
+	.loc 1 2724 0 discriminator 13
 	mov	x0, x19
+.LVL1605:
+	bl	schedule_timeout
+.LVL1606:
+	mov	x19, x0
+.LBE2330:
+	b	.L1407
+.LVL1607:
+.L1636:
+.LBE2325:
+.LBE2350:
+	.loc 1 2566 0 is_stmt 1
+	mov	w0, 1
+	str	w0, [x23, 52]
+	.loc 1 2569 0
+	mov	x0, x20
 	ldr	w1, [x24, 40]
 	bl	ebc_lut_update
-.LVL1600:
-	.loc 1 2566 0
+.LVL1608:
+	.loc 1 2570 0
 	ldr	w3, [x23, 112]
-	.loc 1 2568 0
+	.loc 1 2572 0
 	adrp	x1, .LC113
-	ldr	x2, [x23, 232]
+	ldr	x2, [x23, 224]
 	add	x1, x1, :lo12:.LC113
-	.loc 1 2566 0
+	.loc 1 2570 0
 	strb	w3, [x23, 56]
-	.loc 1 2567 0
+	.loc 1 2571 0
 	lsr	w4, w3, 8
 	strb	w4, [x23, 57]
-	.loc 1 2568 0
+	.loc 1 2572 0
 	ldr	x0, [x23, 104]
 	and	w3, w3, 255
 	ldr	w2, [x2, 40]
 	bl	_dev_info
-.LVL1601:
-.LBB2307:
-.LBB2308:
+.LVL1609:
+.LBB2351:
+.LBB2352:
+	.loc 1 1594 0
+	ldr	w0, [x22, 164]
 	.loc 1 1595 0
-	ldr	w0, [x21, 164]
-	.loc 1 1596 0
 	mov	w6, 1
 	ldp	x1, x2, [x23, 152]
-	ldp	x3, x4, [x23, 176]
+	ldp	x3, x4, [x23, 168]
+	.loc 1 1594 0
+	cbz	w0, .L1358
 	.loc 1 1595 0
+	ldr	x0, [x23, 184]
+	mov	x5, x23
+	bl	get_overlay_image2
+.LVL1610:
+.L1359:
+	.loc 1 1610 0
+	ldr	w0, [x23, 60]
 	cbz	w0, .L1360
-	.loc 1 1596 0
+	.loc 1 1611 0
+	ldr	w0, [x23, 200]
+	cbz	w0, .L1656
+.L1361:
+	.loc 1 1613 0
+	ldr	w0, [x22, 164]
+	.loc 1 1614 0
+	mov	w6, 1
+	ldp	x1, x2, [x23, 152]
+	ldp	x3, x4, [x23, 168]
+	.loc 1 1613 0
+	cbz	w0, .L1362
+	.loc 1 1614 0
 	ldr	x0, [x23, 192]
 	mov	x5, x23
 	bl	get_overlay_image2
-.LVL1602:
-.L1361:
-	.loc 1 1611 0
-	ldr	w0, [x23, 60]
-	cbz	w0, .L1362
-	.loc 1 1612 0
-	ldr	w0, [x23, 208]
-	cbnz	w0, .L1363
-	.loc 1 1613 0
-	mov	x0, x19
-	bl	ebc_power_set.constprop.15
-.LVL1603:
+.LVL1611:
 .L1363:
-	.loc 1 1614 0
-	ldr	w0, [x21, 164]
-	.loc 1 1615 0
-	mov	w6, 1
-	ldp	x1, x2, [x23, 152]
-	ldp	x3, x4, [x23, 176]
-	.loc 1 1614 0
-	cbz	w0, .L1364
-	.loc 1 1615 0
-	ldr	x0, [x23, 200]
-	mov	x5, x23
-	bl	get_overlay_image2
-.LVL1604:
-.L1365:
-.LBB2309:
-.LBB2310:
+.LBB2353:
+.LBB2354:
+	.loc 1 1585 0
+	str	wzr, [x22, 72]
 	.loc 1 1586 0
-	str	wzr, [x21, 72]
-	.loc 1 1587 0
-	mov	x0, x21
-	ldr	w1, [x19, 224]
+	mov	x0, x22
+	ldr	w1, [x20, 224]
 	bl	flip.isra.4
-.LVL1605:
-.L1366:
-.LBE2310:
-.LBE2309:
-.LBE2308:
-.LBE2307:
-	.loc 1 2571 0
-	ldr	x0, [x23, 232]
-	ldr	w0, [x0, 40]
-	.loc 1 2573 0
-	cmp	w0, 0
-	.loc 1 2572 0
-	sub	w1, w0, #22
-	.loc 1 2573 0
-	ccmp	w1, 1, 0, ne
-	bls	.L1367
-	.loc 1 2574 0
-	ldr	w1, [x23, 52]
-	cbz	w1, .L1367
-.L1451:
-	.loc 1 2577 0
-	ldr	x0, [x23, 104]
-	adrp	x1, .LC115
-	.loc 1 2576 0
-	str	wzr, [x23, 616]
-	.loc 1 2577 0
-	add	x1, x1, :lo12:.LC115
-	bl	_dev_info
-.LVL1606:
-	.loc 1 2578 0
-	ldrb	w1, [x23, 56]
-	lsl	w0, w1, 3
-	sub	w0, w0, w1
-.LBB2312:
-.LBB2313:
-	.loc 17 368 0
-	lsl	w0, w0, 1
-	bl	__msecs_to_jiffies
-.LVL1607:
-.LBE2313:
-.LBE2312:
-	.loc 1 2578 0
-	adrp	x1, jiffies
-	ldr	x1, [x1, #:lo12:jiffies]
-	add	x1, x1, x0
-	add	x0, x19, 680
-	bl	mod_timer
-.LVL1608:
-	ldr	x0, [x23, 232]
-	ldr	w0, [x0, 40]
-	b	.L1367
+.LVL1612:
 .L1364:
-.LBB2314:
-.LBB2311:
-	.loc 1 1623 0
-	ldr	x0, [x23, 200]
+.LBE2354:
+.LBE2353:
+.LBE2352:
+.LBE2351:
+	.loc 1 2575 0
+	ldr	x0, [x23, 224]
+	ldr	w0, [x0, 40]
+	.loc 1 2577 0
+	cmp	w0, 0
+	.loc 1 2576 0
+	sub	w1, w0, #22
+	.loc 1 2577 0
+	ccmp	w1, 1, 0, ne
+	bls	.L1365
+	.loc 1 2578 0
+	ldr	w1, [x23, 52]
+	cbz	w1, .L1365
+	b	.L1438
+	.p2align 3
+.L1358:
+.LBB2356:
+.LBB2355:
+	.loc 1 1603 0
+	ldr	x0, [x23, 184]
 	mov	x5, x23
 	bl	get_overlay_image
-.LVL1609:
-	b	.L1365
+.LVL1613:
+	b	.L1359
 .L1362:
-	.loc 1 1634 0
+	.loc 1 1622 0
+	ldr	x0, [x23, 192]
+	mov	x5, x23
+	bl	get_overlay_image
+.LVL1614:
+	b	.L1363
+.L1656:
+	.loc 1 1612 0
+	mov	x0, x20
+	bl	ebc_power_set.constprop.15
+.LVL1615:
+	b	.L1361
+.L1360:
+	.loc 1 1632 0
+	mov	w0, 1
+	str	w0, [x23, 600]
+	.loc 1 1633 0
 	ldr	x0, [x23, 104]
 	adrp	x2, .LANCHOR3
-	.loc 1 1632 0
+	.loc 1 1631 0
 	str	wzr, [x23, 52]
-	.loc 1 1634 0
-	add	x2, x2, :lo12:.LANCHOR3
 	.loc 1 1633 0
-	str	w22, [x23, 616]
-	.loc 1 1634 0
+	add	x2, x2, :lo12:.LANCHOR3
 	add	x2, x2, 104
 	adrp	x1, .LC114
 	add	x1, x1, :lo12:.LC114
 	bl	_dev_info
-.LVL1610:
-	b	.L1366
-.L1360:
-	.loc 1 1604 0
-	ldr	x0, [x23, 192]
-	mov	x5, x23
-	bl	get_overlay_image
-.LVL1611:
-	b	.L1361
-.L1685:
-.LBE2311:
-.LBE2314:
-	.loc 1 2447 0
+.LVL1616:
+	b	.L1364
+.L1651:
+.LBE2355:
+.LBE2356:
+.LBB2357:
+.LBB2340:
+	.loc 1 2499 0 discriminator 1
+	mov	w1, 0
+	add	x0, x29, 112
+	bl	init_wait_entry
+.LVL1617:
+	b	.L1338
+	.p2align 3
+.L1657:
+.LVL1618:
+.LBB2341:
+	.loc 1 2499 0 is_stmt 0 discriminator 5
+	cbnz	x0, .L1335
+	.loc 1 2499 0 discriminator 7
+	bl	schedule
+.LVL1619:
+.L1338:
+	.loc 1 2499 0 discriminator 9
+	add	x1, x29, 112
+	mov	w2, 1
+	mov	x0, x21
+	bl	prepare_to_wait_event
+.LVL1620:
+	ldr	w1, [x23, 52]
+	cbnz	w1, .L1657
+.LBE2341:
+	.loc 1 2499 0 discriminator 4
+	add	x1, x29, 112
+	mov	x0, x21
+	bl	finish_wait
+.LVL1621:
+	b	.L1335
+.L1650:
+.LBE2340:
+.LBE2357:
+	.loc 1 2450 0 is_stmt 1
 	mov	x0, 3
 	bl	ebc_notify
-.LVL1612:
-	b	.L1317
-.L1683:
-.LBB2315:
-.LBB2284:
-	.loc 1 2495 0 discriminator 1
-	mov	w1, 0
-	add	x0, x29, 112
-	bl	init_wait_entry
-.LVL1613:
-	b	.L1331
-	.p2align 3
-.L1692:
-.LVL1614:
-.LBB2285:
-	.loc 1 2495 0 is_stmt 0 discriminator 5
-	cbnz	x0, .L1328
-	.loc 1 2495 0 discriminator 7
-	bl	schedule
-.LVL1615:
-.L1331:
-	.loc 1 2495 0 discriminator 9
-	add	x1, x29, 112
-	mov	w2, 1
-	mov	x0, x20
-	bl	prepare_to_wait_event
-.LVL1616:
-	ldr	w1, [x23, 52]
-	cbnz	w1, .L1692
-.LBE2285:
-	.loc 1 2495 0 discriminator 4
-	add	x1, x29, 112
-	mov	x0, x20
-	bl	finish_wait
-.LVL1617:
-	b	.L1328
-.LVL1618:
-.L1679:
-.LBE2284:
-.LBE2315:
-.LBB2316:
-	.loc 1 2722 0 is_stmt 1
-	cbz	x0, .L1410
-.LBB2268:
-.LBB2269:
-.LBB2270:
-	.loc 17 368 0 discriminator 10
-	ldr	w0, [x23, 260]
-	bl	__msecs_to_jiffies
-.LVL1619:
-	mov	x25, x0
-.LVL1620:
-.LBE2270:
-.LBE2269:
-	.loc 1 2722 0 discriminator 10
-	mov	w1, 0
-	add	x0, x29, 112
-	bl	init_wait_entry
-.LVL1621:
-.L1415:
-.LBB2271:
-	.loc 1 2722 0 is_stmt 0 discriminator 27
-	add	x1, x29, 112
-	mov	w2, 1
-	mov	x0, x20
-	bl	prepare_to_wait_event
 .LVL1622:
-.LBB2272:
-	ldr	w1, [x23, 256]
-	cbz	w1, .L1693
-.L1412:
-.LBE2272:
-.LBE2271:
-	.loc 1 2722 0 discriminator 22
-	mov	x0, x20
-	add	x1, x29, 112
-	bl	finish_wait
+	b	.L1324
 .LVL1623:
-	ldr	w0, [x23, 256]
-.LBE2268:
-.LBE2316:
-	.loc 1 2724 0 is_stmt 1 discriminator 22
-	cbnz	w0, .L1409
-	b	.L1410
-	.p2align 3
-.L1693:
-.LBB2317:
-.LBB2275:
-.LBB2274:
-.LBB2273:
-	.loc 1 2722 0 discriminator 14
-	ldr	w1, [x23, 612]
-	cbnz	w1, .L1412
-.LBE2273:
-	.loc 1 2722 0 is_stmt 0
-	cbz	x25, .L1412
+.L1606:
+	.loc 1 2818 0
+	bl	__stack_chk_fail
 .LVL1624:
-	.loc 1 2722 0 discriminator 23
-	cbnz	x0, .L1410
-	.loc 1 2722 0 discriminator 25
-	mov	x0, x25
+.L1432:
+.LBB2358:
+.LBB2317:
+	.loc 1 2812 0 discriminator 4
+	add	x1, x29, 112
+	mov	x0, x21
+	bl	finish_wait
 .LVL1625:
-	bl	schedule_timeout
-.LVL1626:
-	mov	x25, x0
-.LBE2274:
-	b	.L1415
-.LVL1627:
-.L1666:
-.LBE2275:
 .LBE2317:
-.LBB2318:
-.LBB2256:
-.LBB2255:
-.LBB2254:
-	.loc 1 2525 0 is_stmt 1 discriminator 14
-	ldr	w1, [x23, 100]
-	cbnz	w1, .L1341
-.LBE2254:
-	.loc 1 2525 0 is_stmt 0
-	cbz	x25, .L1341
+.LBE2358:
+	.loc 1 2813 0 discriminator 4
+	str	wzr, [x23, 100]
+	b	.L1257
+.LVL1626:
+.L1639:
+.LBB2359:
+.LBB2319:
+	.loc 1 2546 0 discriminator 1
+	mov	w1, 0
+	add	x0, x29, 112
+	bl	init_wait_entry
+.LVL1627:
+	b	.L1355
+	.p2align 3
+.L1658:
 .LVL1628:
-	.loc 1 2525 0 discriminator 23
-	cbnz	x0, .L1339
-	.loc 1 2525 0 discriminator 25
-	mov	x0, x25
+.LBB2320:
+	.loc 1 2546 0 is_stmt 0 discriminator 5
+	cbnz	x0, .L1352
+	.loc 1 2546 0 discriminator 7
+	bl	schedule
 .LVL1629:
-	bl	schedule_timeout
+.L1355:
+	.loc 1 2546 0 discriminator 9
+	add	x1, x29, 112
+	mov	w2, 1
+	mov	x0, x21
+	bl	prepare_to_wait_event
 .LVL1630:
-	mov	x25, x0
-.LBE2255:
-	b	.L1344
-.LBE2256:
-.LBE2318:
+	ldr	w1, [x23, 52]
+	cbnz	w1, .L1658
+.LBE2320:
+	.loc 1 2546 0 discriminator 4
+	add	x1, x29, 112
+	mov	x0, x21
+	bl	finish_wait
+.LVL1631:
+	b	.L1352
+.L1653:
+.LBE2319:
+.LBE2359:
+.LBB2360:
+.LBB2344:
+	.loc 1 2610 0 is_stmt 1 discriminator 1
+	mov	w1, 0
+	add	x0, x29, 112
+	bl	init_wait_entry
+.LVL1632:
+	b	.L1382
+	.p2align 3
+.L1659:
+.LVL1633:
+.LBB2345:
+	.loc 1 2610 0 is_stmt 0 discriminator 5
+	cbnz	x0, .L1375
+	.loc 1 2610 0 discriminator 7
+	bl	schedule
+.LVL1634:
+.L1382:
+	.loc 1 2610 0 discriminator 9
+	add	x1, x29, 112
+	mov	w2, 1
+	mov	x0, x21
+	bl	prepare_to_wait_event
+.LVL1635:
+	ldr	w1, [x23, 52]
+	cbnz	w1, .L1659
+.LBE2345:
+	b	.L1376
+.LVL1636:
+.L1424:
+.LBE2344:
+.LBE2360:
+	.loc 1 2806 0 is_stmt 1
+	bl	ebc_get_dsp_list_enum_num
+.LVL1637:
+	cbnz	w0, .L1257
+	.loc 1 2806 0 is_stmt 0 discriminator 1
+	bl	ebc_get_osd_list_enum_num
+.LVL1638:
+	cbnz	w0, .L1257
+	b	.L1600
 	.cfi_endproc
 .LFE2844:
 	.size	ebc_thread, .-ebc_thread
@@ -16005,34 +16113,34 @@
 	.type	ebc_auto_tast_function, %function
 ebc_auto_tast_function:
 .LFB2837:
-	.loc 1 1875 0 is_stmt 1
+	.loc 1 1874 0 is_stmt 1
 	.cfi_startproc
-.LVL1631:
+.LVL1639:
 	stp	x29, x30, [sp, -112]!
 	.cfi_def_cfa_offset 112
 	.cfi_offset 29, -112
 	.cfi_offset 30, -104
 	adrp	x0, __stack_chk_guard
-.LVL1632:
+.LVL1640:
 	add	x0, x0, :lo12:__stack_chk_guard
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
 	stp	x25, x26, [sp, 64]
 	.cfi_offset 25, -48
 	.cfi_offset 26, -40
-	.loc 1 1876 0
-	adrp	x26, .LANCHOR0
 	.loc 1 1875 0
+	adrp	x26, .LANCHOR0
+	.loc 1 1874 0
 	stp	x19, x20, [sp, 16]
-.LBB2319:
-.LBB2320:
-.LBB2321:
+.LBB2361:
+.LBB2362:
+.LBB2363:
 	.loc 12 290 0
 	mov	x25, 2
-.LBE2321:
-.LBE2320:
-.LBE2319:
-	.loc 1 1875 0
+.LBE2363:
+.LBE2362:
+.LBE2361:
+	.loc 1 1874 0
 	stp	x21, x22, [sp, 32]
 	stp	x23, x24, [sp, 48]
 	.cfi_offset 19, -96
@@ -16045,420 +16153,434 @@
 	stp	x27, x28, [sp, 80]
 	.cfi_offset 27, -32
 	.cfi_offset 28, -24
-	.loc 1 1886 0
+	.loc 1 1885 0
 	add	x23, x23, :lo12:.LANCHOR1
-	.loc 1 1876 0
-	ldr	x22, [x26, #:lo12:.LANCHOR0]
-.LVL1633:
-	.loc 1 1886 0
-	add	x21, x23, 712
 	.loc 1 1875 0
+	ldr	x22, [x26, #:lo12:.LANCHOR0]
+.LVL1641:
+	.loc 1 1885 0
+	add	x21, x23, 712
+	.loc 1 1874 0
 	ldr	x1, [x0]
 	str	x1, [x29, 104]
 	mov	x1,0
-	.loc 1 1888 0
+	.loc 1 1887 0
 	add	x23, x23, 352
-	.loc 1 1877 0
+	.loc 1 1876 0
 	add	x20, x22, 24
-	.loc 1 1878 0
+	.loc 1 1877 0
 	add	x19, x22, 192
-	add	x28, x22, 736
+	add	x28, x22, 720
 	adrp	x27, jiffies
-.LBB2326:
-.LBB2323:
-.LBB2324:
+.LBB2368:
+.LBB2365:
+.LBB2366:
 	.loc 4 19 0
 #APP
 // 19 "./arch/arm64/include/asm/current.h" 1
 	mrs x24, sp_el0
 // 0 "" 2
-.LVL1634:
+.LVL1642:
 #NO_APP
-	b	.L1716
+	b	.L1684
 	.p2align 3
-.L1725:
-.LBE2324:
-.LBE2323:
-.LBE2326:
-	.loc 1 1894 0
+.L1693:
+.LBE2366:
+.LBE2365:
+.LBE2368:
+	.loc 1 1893 0
 	cmp	w0, 4
-	beq	.L1697
+	beq	.L1663
 	cmp	w0, 1
-	beq	.L1724
-	.loc 1 2038 0
-	ldr	w1, [x19, 72]
+	beq	.L1692
 	.loc 1 2039 0
+	ldr	w1, [x19, 72]
+	.loc 1 2040 0
 	mov	x0, x20
-	.loc 1 2038 0
+	.loc 1 2039 0
 	sub	w1, w1, #1
 	str	w1, [x19, 72]
-	.loc 1 2039 0
+	.loc 1 2040 0
 	ldr	w1, [x22, 224]
 	bl	flip.isra.4
-.LVL1635:
-	.loc 1 2041 0
+.LVL1643:
+	.loc 1 2042 0
 	add	x0, x26, :lo12:.LANCHOR0
 	ldr	x0, [x0, 16]
 	bl	wake_up_process
-.LVL1636:
-	.loc 1 2043 0
+.LVL1644:
+	.loc 1 2044 0
 	ldr	w4, [x19, 72]
-	cbz	w4, .L1703
-	.loc 1 2045 0
-	ldr	w0, [x20, 164]
-	cbz	w0, .L1715
+	cbz	w4, .L1669
 	.loc 1 2046 0
+	ldr	w0, [x20, 164]
+	cbz	w0, .L1683
+	.loc 1 2047 0
 	ldrsw	x0, [x20, 72]
 	mov	w6, 2
+	.loc 1 2048 0
+	ldp	x2, x1, [x19, 216]
 	.loc 1 2047 0
-	ldp	x2, x1, [x19, 224]
-	.loc 1 2046 0
-	add	x0, x0, 24
+	add	x0, x19, x0, lsl 3
 	ldrb	w3, [x22, 248]
 	ldr	x5, [x22, 320]
-	ldr	x0, [x19, x0, lsl 3]
 	ldr	x1, [x1, 16]
+	ldr	x0, [x0, 184]
 	ldr	x2, [x2, 16]
 	bl	direct_mode_data_change2.isra.3
-.LVL1637:
+.LVL1645:
 	.p2align 2
-.L1703:
-	.loc 1 2059 0
+.L1669:
+	.loc 1 2060 0
 	mov	x0, x21
 	bl	up
-.LVL1638:
-	.loc 1 2060 0
+.LVL1646:
+	.loc 1 2061 0
 	bl	schedule
-.LVL1639:
-.L1716:
-	.loc 1 1886 0
+.LVL1647:
+.L1684:
+	.loc 1 1885 0
 	mov	x0, x21
 	bl	down
-.LVL1640:
-	.loc 1 1888 0
+.LVL1648:
+	.loc 1 1887 0
 	mov	x0, x23
 	bl	down
-.LVL1641:
-.LBB2327:
-.LBB2325:
-.LBB2322:
+.LVL1649:
+.LBB2369:
+.LBB2367:
+.LBB2364:
 	.loc 12 290 0
 	str	x25, [x24, 32]
-.LBE2322:
-.LBE2325:
-.LBE2327:
-	.loc 1 1893 0
+.LBE2364:
+.LBE2367:
+.LBE2369:
+	.loc 1 1892 0
 #APP
-// 1893 "drivers/gpu/drm/rockchip/ebc-dev/ebc_dev.c" 1
+// 1892 "drivers/gpu/drm/rockchip/ebc-dev/ebc_dev.c" 1
 	dmb ish
 // 0 "" 2
-	.loc 1 1894 0
+	.loc 1 1893 0
 #NO_APP
-	ldr	w0, [x19, 264]
+	ldr	w0, [x19, 252]
 	cmp	w0, 3
-	bne	.L1725
+	bne	.L1693
 	.loc 1 1971 0
 	ldr	w0, [x19, 60]
 	.loc 1 1970 0
 	str	wzr, [x19, 68]
 	.loc 1 1971 0
-	cbnz	w0, .L1707
+	cbnz	w0, .L1674
 	.loc 1 1971 0 is_stmt 0 discriminator 1
 	ldr	w0, [x19, 64]
-	cbz	w0, .L1708
-.L1707:
+	cbz	w0, .L1675
+.L1674:
 	.loc 1 1972 0 is_stmt 1
 	ldr	w1, [x22, 224]
 	mov	x0, x20
 	bl	flip.isra.4
-.LVL1642:
+.LVL1650:
 	.loc 1 1974 0
 	add	x0, x26, :lo12:.LANCHOR0
 	ldr	x0, [x0, 16]
 	bl	wake_up_process
-.LVL1643:
+.LVL1651:
 	.loc 1 1976 0
 	ldr	w0, [x20, 164]
-	cbz	w0, .L1709
+	cbz	w0, .L1676
 	.loc 1 1977 0
 	ldrsw	x0, [x20, 72]
 	mov	w5, 2
 	ldp	x1, x2, [x19, 152]
-	add	x0, x0, 24
-	ldr	x3, [x19, 176]
 	mov	x4, x19
-	ldr	x0, [x19, x0, lsl 3]
+	add	x0, x19, x0, lsl 3
+	ldr	x3, [x19, 168]
+	ldr	x0, [x0, 184]
 	bl	get_auto_image2
-.LVL1644:
-	b	.L1703
+.LVL1652:
+	b	.L1669
 	.p2align 3
-.L1724:
-	.loc 1 2017 0
-	ldr	w1, [x19, 72]
+.L1692:
 	.loc 1 2018 0
+	ldr	w1, [x19, 72]
+	.loc 1 2019 0
 	mov	x0, x20
-	.loc 1 2017 0
+	.loc 1 2018 0
 	sub	w1, w1, #1
 	str	w1, [x19, 72]
-	.loc 1 2018 0
+	.loc 1 2019 0
 	ldr	w1, [x22, 224]
 	bl	flip.isra.4
-.LVL1645:
-	.loc 1 2020 0
+.LVL1653:
+	.loc 1 2021 0
 	add	x0, x26, :lo12:.LANCHOR0
 	ldr	x0, [x0, 16]
 	bl	wake_up_process
-.LVL1646:
-	.loc 1 2022 0
+.LVL1654:
+	.loc 1 2023 0
 	ldr	w4, [x19, 72]
-	cbz	w4, .L1703
-	.loc 1 2024 0
-	ldr	w0, [x20, 164]
-	cbz	w0, .L1713
+	cbz	w4, .L1669
 	.loc 1 2025 0
+	ldr	w0, [x20, 164]
+	cbz	w0, .L1681
+	.loc 1 2026 0
 	ldrsw	x0, [x20, 72]
 	mov	w6, 2
+	.loc 1 2027 0
+	ldp	x2, x1, [x19, 216]
 	.loc 1 2026 0
-	ldp	x2, x1, [x19, 224]
-	.loc 1 2025 0
-	add	x0, x0, 24
+	add	x0, x19, x0, lsl 3
 	ldrb	w3, [x22, 248]
 	ldr	x5, [x22, 320]
-	ldr	x0, [x19, x0, lsl 3]
 	ldr	x1, [x1, 16]
+	ldr	x0, [x0, 184]
 	ldr	x2, [x2, 16]
 	bl	direct_mode_data_change_part2.isra.8
-.LVL1647:
-	b	.L1703
+.LVL1655:
+	b	.L1669
 	.p2align 3
-.L1697:
-	.loc 1 1896 0
+.L1663:
+	.loc 1 1895 0
 	ldr	w0, [x19, 76]
-	cbz	w0, .L1699
-	.loc 1 1899 0
-	ldr	w0, [x19, 60]
+	cbz	w0, .L1665
 	.loc 1 1898 0
-	str	wzr, [x19, 68]
+	ldr	w0, [x19, 60]
 	.loc 1 1897 0
+	str	wzr, [x19, 68]
+	.loc 1 1896 0
 	str	wzr, [x19, 76]
-	.loc 1 1899 0
-	cbnz	w0, .L1700
-	.loc 1 1899 0 is_stmt 0 discriminator 1
+	.loc 1 1898 0
+	cbnz	w0, .L1666
+	.loc 1 1898 0 is_stmt 0 discriminator 1
 	ldr	w0, [x19, 64]
-	cbz	w0, .L1701
-.L1700:
-	.loc 1 1900 0 is_stmt 1
+	cbz	w0, .L1667
+.L1666:
+	.loc 1 1899 0 is_stmt 1
 	ldr	w1, [x22, 224]
 	mov	x0, x20
 	bl	flip.isra.4
-.LVL1648:
-	.loc 1 1902 0
+.LVL1656:
+	.loc 1 1901 0
 	add	x0, x26, :lo12:.LANCHOR0
 	ldr	x0, [x0, 16]
 	bl	wake_up_process
-.LVL1649:
-	.loc 1 1904 0
+.LVL1657:
+	.loc 1 1903 0
 	ldr	w0, [x20, 164]
-	cbz	w0, .L1702
-	.loc 1 1905 0
+	cbz	w0, .L1668
+	.loc 1 1904 0
 	ldrsw	x0, [x20, 72]
 	mov	w6, 2
 	ldp	x1, x2, [x19, 152]
-	add	x0, x0, 24
-	ldp	x3, x4, [x19, 176]
 	mov	x5, x19
-	ldr	x0, [x19, x0, lsl 3]
+	add	x0, x19, x0, lsl 3
+	ldp	x3, x4, [x19, 168]
+	ldr	x0, [x0, 184]
 	bl	get_overlay_image2
-.LVL1650:
-	b	.L1703
+.LVL1658:
+	b	.L1669
 	.p2align 3
-.L1709:
+.L1676:
 	.loc 1 1984 0
 	ldrsw	x0, [x20, 72]
 	mov	w5, 2
 	ldp	x1, x2, [x19, 152]
-	add	x0, x0, 24
-	ldr	x3, [x19, 176]
 	mov	x4, x19
-	ldr	x0, [x19, x0, lsl 3]
+	add	x0, x19, x0, lsl 3
+	ldr	x3, [x19, 168]
+	ldr	x0, [x0, 184]
 	bl	get_auto_image
-.LVL1651:
-	b	.L1703
+.LVL1659:
+	b	.L1669
 	.p2align 3
-.L1699:
+.L1665:
 	.loc 1 1951 0
 	mov	x0, x23
 	bl	up
-.LVL1652:
+.LVL1660:
 	.loc 1 1953 0
 	ldr	w0, [x20, 164]
-	cbz	w0, .L1706
+	cbz	w0, .L1673
 	.loc 1 1954 0
 	ldrsw	x0, [x20, 72]
 	mov	x4, x19
 	ldp	x1, x2, [x19, 152]
-	add	x0, x0, 24
-	ldr	x3, [x19, 176]
-	ldr	x0, [x19, x0, lsl 3]
+	add	x0, x19, x0, lsl 3
+	ldr	x3, [x19, 168]
+	ldr	x0, [x0, 184]
 	bl	get_overlay_image_area2.isra.0
-.LVL1653:
-	b	.L1703
+.LVL1661:
+	b	.L1669
 	.p2align 3
-.L1702:
-	.loc 1 1913 0
+.L1668:
+	.loc 1 1912 0
 	ldrsw	x0, [x20, 72]
 	mov	w6, 2
 	ldp	x1, x2, [x19, 152]
-	add	x0, x0, 24
-	ldp	x3, x4, [x19, 176]
 	mov	x5, x19
-	ldr	x0, [x19, x0, lsl 3]
+	add	x0, x19, x0, lsl 3
+	ldp	x3, x4, [x19, 168]
+	ldr	x0, [x0, 184]
 	bl	get_overlay_image
-.LVL1654:
-	b	.L1703
+.LVL1662:
+	b	.L1669
 	.p2align 3
-.L1715:
-	.loc 1 2052 0
+.L1683:
+	.loc 1 2053 0
 	ldrsw	x0, [x20, 72]
 	mov	w6, 2
+	.loc 1 2054 0
+	ldp	x2, x1, [x19, 216]
 	.loc 1 2053 0
-	ldp	x2, x1, [x19, 224]
-	.loc 1 2052 0
-	add	x0, x0, 24
+	add	x0, x19, x0, lsl 3
 	ldrb	w3, [x22, 248]
 	ldr	x5, [x22, 320]
-	ldr	x0, [x19, x0, lsl 3]
 	ldr	x1, [x1, 16]
+	ldr	x0, [x0, 184]
 	ldr	x2, [x2, 16]
 	bl	direct_mode_data_change.isra.2
-.LVL1655:
-	b	.L1703
+.LVL1663:
+	b	.L1669
 	.p2align 3
-.L1713:
-	.loc 1 2031 0
+.L1681:
+	.loc 1 2032 0
 	ldrsw	x0, [x20, 72]
 	mov	w6, 2
+	.loc 1 2033 0
+	ldp	x2, x1, [x19, 216]
 	.loc 1 2032 0
-	ldp	x2, x1, [x19, 224]
-	.loc 1 2031 0
-	add	x0, x0, 24
+	add	x0, x19, x0, lsl 3
 	ldrb	w3, [x22, 248]
 	ldr	x5, [x22, 320]
-	ldr	x0, [x19, x0, lsl 3]
 	ldr	x1, [x1, 16]
+	ldr	x0, [x0, 184]
 	ldr	x2, [x2, 16]
 	bl	direct_mode_data_change_part.isra.9
-.LVL1656:
-	b	.L1703
+.LVL1664:
+	b	.L1669
 	.p2align 3
-.L1708:
+.L1675:
 	.loc 1 1992 0
 	mov	x0, x23
 	bl	up
-.LVL1657:
-	.loc 1 1995 0
-	ldr	x1, [x19, 232]
+.LVL1665:
 	.loc 1 1994 0
-	mov	x3, x19
-	ldr	x0, [x19, 152]
-	ldr	x2, [x19, 176]
-	ldr	x1, [x1, 16]
-	bl	refresh_new_image_auto
-.LVL1658:
-	.loc 1 1998 0
-	ldr	w0, [x20, 164]
-	cbz	w0, .L1710
+	ldr	w0, [x19, 612]
+	cbz	w0, .L1694
+.L1677:
 	.loc 1 1999 0
+	ldr	w0, [x20, 164]
+	cbz	w0, .L1678
+	.loc 1 2000 0
 	ldrsw	x0, [x20, 72]
 	mov	w5, 1
 	ldp	x1, x2, [x19, 152]
-	add	x0, x0, 24
-	ldr	x3, [x19, 176]
 	mov	x4, x19
-	ldr	x0, [x19, x0, lsl 3]
+	add	x0, x19, x0, lsl 3
+	ldr	x3, [x19, 168]
+	ldr	x0, [x0, 184]
 	bl	get_auto_image2
-.LVL1659:
-.L1711:
-	.loc 1 2012 0
+.LVL1666:
+.L1679:
+	.loc 1 2013 0
 	mov	w0, 1
-	.loc 1 2013 0
+	.loc 1 2014 0
 	ldr	x1, [x27, #:lo12:jiffies]
-	.loc 1 2012 0
-	str	w0, [x19, 68]
 	.loc 1 2013 0
+	str	w0, [x19, 68]
+	.loc 1 2014 0
 	mov	x0, x28
 	add	x1, x1, 1
 	bl	mod_timer
-.LVL1660:
-	b	.L1703
+.LVL1667:
+	b	.L1669
 	.p2align 3
-.L1701:
-	.loc 1 1922 0
+.L1667:
+	.loc 1 1921 0
 	mov	x0, x23
 	bl	up
-.LVL1661:
-	.loc 1 1926 0
-	ldr	x2, [x19, 232]
-	.loc 1 1924 0
-	mov	x5, x19
-	ldr	x0, [x19, 152]
-	ldr	x1, [x19, 16]
-	ldp	x3, x4, [x19, 176]
-	ldr	x2, [x2, 16]
-	bl	refresh_new_image
-.LVL1662:
+.LVL1668:
+	.loc 1 1923 0
+	ldr	w0, [x19, 612]
+	cbz	w0, .L1695
+.L1670:
 	.loc 1 1930 0
 	ldr	w0, [x20, 164]
-	cbz	w0, .L1704
+	cbz	w0, .L1671
 	.loc 1 1931 0
 	ldrsw	x0, [x20, 72]
 	mov	w6, 1
 	ldp	x1, x2, [x19, 152]
-	add	x0, x0, 24
-	ldp	x3, x4, [x19, 176]
 	mov	x5, x19
-	ldr	x0, [x19, x0, lsl 3]
+	add	x0, x19, x0, lsl 3
+	ldp	x3, x4, [x19, 168]
+	ldr	x0, [x0, 184]
 	bl	get_overlay_image2
-.LVL1663:
-	b	.L1711
+.LVL1669:
+	b	.L1679
 	.p2align 3
-.L1706:
+.L1673:
 	.loc 1 1961 0
 	ldrsw	x0, [x20, 72]
 	mov	x5, x19
 	ldp	x1, x2, [x19, 152]
-	add	x0, x0, 24
-	ldp	x3, x4, [x19, 176]
-	ldr	x0, [x19, x0, lsl 3]
+	add	x0, x19, x0, lsl 3
+	ldp	x3, x4, [x19, 168]
+	ldr	x0, [x0, 184]
 	bl	get_overlay_image_area
-.LVL1664:
-	b	.L1703
+.LVL1670:
+	b	.L1669
 	.p2align 3
-.L1710:
-	.loc 1 2006 0
+.L1678:
+	.loc 1 2007 0
 	ldrsw	x0, [x20, 72]
 	mov	w5, 1
 	ldp	x1, x2, [x19, 152]
-	add	x0, x0, 24
-	ldr	x3, [x19, 176]
 	mov	x4, x19
-	ldr	x0, [x19, x0, lsl 3]
+	add	x0, x19, x0, lsl 3
+	ldr	x3, [x19, 168]
+	ldr	x0, [x0, 184]
 	bl	get_auto_image
-.LVL1665:
-	b	.L1711
+.LVL1671:
+	b	.L1679
 	.p2align 3
-.L1704:
+.L1671:
 	.loc 1 1939 0
 	ldrsw	x0, [x20, 72]
 	mov	w6, 1
 	ldp	x1, x2, [x19, 152]
-	add	x0, x0, 24
-	ldp	x3, x4, [x19, 176]
 	mov	x5, x19
-	ldr	x0, [x19, x0, lsl 3]
+	add	x0, x19, x0, lsl 3
+	ldp	x3, x4, [x19, 168]
+	ldr	x0, [x0, 184]
 	bl	get_overlay_image
-.LVL1666:
-	b	.L1711
+.LVL1672:
+	b	.L1679
+	.p2align 3
+.L1694:
+	.loc 1 1996 0
+	ldr	x1, [x19, 224]
+	.loc 1 1995 0
+	mov	x3, x19
+	ldr	x0, [x19, 152]
+	ldr	x2, [x19, 168]
+	ldr	x1, [x1, 16]
+	bl	refresh_new_image_auto
+.LVL1673:
+	b	.L1677
+	.p2align 3
+.L1695:
+	.loc 1 1926 0
+	ldr	x2, [x19, 224]
+	.loc 1 1924 0
+	mov	x5, x19
+	ldr	x1, [x19, 16]
+	ldr	x0, [x19, 152]
+	ldp	x3, x4, [x19, 168]
+	ldr	x2, [x2, 16]
+	bl	refresh_new_image
+.LVL1674:
+	b	.L1670
 	.cfi_endproc
 .LFE2837:
 	.size	ebc_auto_tast_function, .-ebc_auto_tast_function
@@ -16616,29 +16738,29 @@
 	.section	.rodata
 	.align	3
 	.set	.LANCHOR2,. + 0
-	.type	__func__.35503, %object
-	.size	__func__.35503, 11
-__func__.35503:
+	.type	__func__.35512, %object
+	.size	__func__.35512, 11
+__func__.35512:
 	.string	"ebc_io_ctl"
 	.align	3
 	.set	.LANCHOR3,. + 0
-	.type	__func__.35838, %object
-	.size	__func__.35838, 12
-__func__.35838:
+	.type	__func__.35849, %object
+	.size	__func__.35849, 12
+__func__.35849:
 	.string	"ebc_suspend"
 	.zero	4
-	.type	__func__.35144, %object
-	.size	__func__.35144, 16
-__func__.35144:
+	.type	__func__.35152, %object
+	.size	__func__.35152, 16
+__func__.35152:
 	.string	"ebc_frame_start"
-	.type	__func__.35772, %object
-	.size	__func__.35772, 19
-__func__.35772:
+	.type	__func__.35783, %object
+	.size	__func__.35783, 19
+__func__.35783:
 	.string	"ebc_lut_table_init"
 	.zero	5
-	.type	CSWTCH.300, %object
-	.size	CSWTCH.300, 48
-CSWTCH.300:
+	.type	CSWTCH.296, %object
+	.size	CSWTCH.296, 48
+CSWTCH.296:
 	.word	7
 	.word	7
 	.word	1
@@ -16651,9 +16773,9 @@
 	.word	12
 	.word	1
 	.word	2
-	.type	__func__.35137, %object
-	.size	__func__.35137, 27
-__func__.35137:
+	.type	__func__.35145, %object
+	.size	__func__.35145, 27
+__func__.35145:
 	.string	"ebc_overlay_bg_frame_start"
 	.zero	5
 	.type	ebc_match, %object
@@ -16693,9 +16815,9 @@
 	.zero	176
 	.section	.discard.addressable,"aw",@progbits
 	.align	3
-	.type	__addressable_ebc_init3783, %object
-	.size	__addressable_ebc_init3783, 8
-__addressable_ebc_init3783:
+	.type	__addressable_ebc_init3795, %object
+	.size	__addressable_ebc_init3795, 8
+__addressable_ebc_init3795:
 	.xword	ebc_init
 	.section	.exitcall.exit,"aw",@progbits
 	.align	3
@@ -16741,124 +16863,124 @@
 	.string	"EBC_SET_DIFF_PERCENT failed\n"
 	.zero	3
 .LC12:
-	.string	"new_buf_is_comming......\n"
-	.zero	6
-.LC13:
 	.string	"EBC_WAIT_NEW_BUF_TIME failed\n"
 	.zero	2
-.LC14:
+.LC13:
 	.string	"%s: unknow cmd\n"
-.LC15:
+.LC14:
 	.string	"full_mode_num = %d\n"
 	.zero	4
-.LC16:
+.LC15:
 	.string	"diff_percent = %d\n"
 	.zero	5
-.LC17:
+.LC16:
 	.string	"waiting_new_buf_time = %d\n"
 	.zero	5
-.LC18:
+.LC17:
 	.string	"overlay frame done\n"
 	.zero	4
-.LC19:
+.LC18:
 	.string	"auto frame done\n"
 	.zero	7
-.LC20:
+.LC19:
 	.string	"frame done\n"
 	.zero	4
-.LC21:
+.LC20:
 	.string	"temperature = %d, out of range0~50 ,use 0 \n"
 	.zero	4
-.LC22:
+.LC21:
 	.string	"temperature = %d, out of range0~50 ,use 50 \n"
 	.zero	3
-.LC23:
+.LC22:
 	.string	"ebc_pmic_read_temp failed, ret = %d\n"
 	.zero	3
-.LC24:
+.LC23:
 	.string	"lut update use temperature = %d\n"
 	.zero	7
-.LC25:
+.LC24:
 	.string	"get lut data failed\n"
 	.zero	3
-.LC26:
+.LC25:
 	.string	"%d\n"
 	.zero	4
-.LC27:
-	.string	"4.17"
+.LC26:
+	.string	"5.02"
 	.zero	3
-.LC28:
+.LC27:
 	.string	"%s\n"
 	.zero	4
-.LC29:
+.LC28:
 	.string	"invalid value = %s\n"
 	.zero	4
-.LC30:
+.LC29:
 	.string	"set vcom value failed\n"
 	.zero	1
-.LC31:
+.LC30:
 	.string	"ebc hw power off\n"
 	.zero	6
-.LC32:
+.LC31:
 	.string	"%s: device is busy now...\n"
 	.zero	5
-.LC33:
+.LC32:
 	.string	"device suspend\n"
-.LC34:
+.LC33:
 	.string	"%s: overlay no need to update\n"
 	.zero	1
-.LC35:
+.LC34:
 	.string	"%s: auto no need to update\n"
 	.zero	4
-.LC36:
+.LC35:
 	.string	"black point > 90percent, skip this frame\n"
 	.zero	6
-.LC37:
+.LC36:
 	.string	"diff point > %d percent, force full\n"
 	.zero	3
-.LC38:
+.LC37:
 	.string	"ebc_tcon"
 	.zero	7
-.LC39:
+.LC38:
 	.string	"not find ebc tcon\n"
 	.zero	5
-.LC40:
+.LC39:
 	.string	"pmic"
 	.zero	3
-.LC41:
+.LC40:
 	.string	"wrong pmics number\n"
 	.zero	4
-.LC42:
+.LC41:
 	.string	"not find pmic node\n"
 	.zero	4
-.LC43:
+.LC42:
 	.string	"not find pmic i2c client\n"
 	.zero	6
-.LC44:
+.LC43:
 	.string	"use pmic%d\n"
 	.zero	4
-.LC45:
+.LC44:
 	.string	"get drvdata from pmic client failed\n"
 	.zero	3
-.LC46:
+.LC45:
 	.string	"panel,width"
 	.zero	4
-.LC47:
+.LC46:
 	.string	"panel,panel_color"
 	.zero	6
-.LC48:
+.LC47:
 	.string	"panel,mirror"
 	.zero	3
-.LC49:
+.LC48:
 	.string	"panel,width-mm"
 	.zero	1
-.LC50:
+.LC49:
 	.string	"panel,height-mm"
-.LC51:
+.LC50:
 	.string	"panel,disable_logo"
 	.zero	5
-.LC52:
+.LC51:
 	.string	"panel,rearrange"
+.LC52:
+	.string	"too large resolution, not support\n"
+	.zero	5
 .LC53:
 	.string	"memory-region"
 	.zero	2
@@ -17291,7 +17413,7 @@
 	.file 213 "./include/linux/string.h"
 	.section	.debug_info,"",@progbits
 .Ldebug_info0:
-	.4byte	0x16c94
+	.4byte	0x16e85
 	.2byte	0x4
 	.4byte	.Ldebug_abbrev0
 	.byte	0x8
@@ -17300,7 +17422,7 @@
 	.byte	0x1
 	.4byte	.LASF3319
 	.4byte	.LASF3320
-	.4byte	.Ldebug_ranges0+0x24a0
+	.4byte	.Ldebug_ranges0+0x2440
 	.8byte	0
 	.4byte	.Ldebug_line0
 	.uleb128 0x2
@@ -34747,7 +34869,7 @@
 	.uleb128 0x3
 	.4byte	0x914a
 	.uleb128 0x43
-	.4byte	.LASF3023
+	.4byte	.LASF3022
 	.byte	0x1e
 	.2byte	0xba4
 	.4byte	0x915a
@@ -43064,54 +43186,54 @@
 	.4byte	.LASF2791
 	.byte	0xe0
 	.byte	0xbd
-	.byte	0xb7
+	.byte	0xba
 	.4byte	0xd631
 	.uleb128 0xe
 	.4byte	.LASF2300
 	.byte	0xbd
-	.byte	0xb8
+	.byte	0xbb
 	.4byte	0xd646
 	.byte	0
 	.uleb128 0xe
 	.4byte	.LASF2302
 	.byte	0xbd
-	.byte	0xb9
+	.byte	0xbc
 	.4byte	0xd646
 	.byte	0x8
 	.uleb128 0xe
 	.4byte	.LASF2303
 	.byte	0xbd
-	.byte	0xba
+	.byte	0xbd
 	.4byte	0xd657
 	.byte	0x10
 	.uleb128 0xe
 	.4byte	.LASF2147
 	.byte	0xbd
-	.byte	0xbb
+	.byte	0xbe
 	.4byte	0xd671
 	.byte	0x18
 	.uleb128 0xe
 	.4byte	.LASF2148
 	.byte	0xbd
-	.byte	0xbc
+	.byte	0xbf
 	.4byte	0xd646
 	.byte	0x20
 	.uleb128 0xe
 	.4byte	.LASF2170
 	.byte	0xbd
-	.byte	0xbd
+	.byte	0xc0
 	.4byte	0xae77
 	.byte	0x28
 	.uleb128 0xe
 	.4byte	.LASF2792
 	.byte	0xbd
-	.byte	0xbe
+	.byte	0xc1
 	.4byte	0xd59d
 	.byte	0xd0
 	.uleb128 0xe
 	.4byte	.LASF2793
 	.byte	0xbd
-	.byte	0xbf
+	.byte	0xc2
 	.4byte	0x2b0
 	.byte	0xd8
 	.byte	0
@@ -43259,7 +43381,7 @@
 	.byte	0x4
 	.4byte	0x6d
 	.byte	0xc1
-	.byte	0xc
+	.byte	0xf
 	.4byte	0xd7b8
 	.uleb128 0xc
 	.4byte	.LASF2811
@@ -43305,24 +43427,24 @@
 	.4byte	.LASF2824
 	.byte	0x20
 	.byte	0xc1
-	.byte	0x1d
+	.byte	0x20
 	.4byte	0xd7e9
 	.uleb128 0xe
 	.4byte	.LASF2825
 	.byte	0xc1
-	.byte	0x1e
+	.byte	0x21
 	.4byte	0x6d
 	.byte	0
 	.uleb128 0xe
 	.4byte	.LASF793
 	.byte	0xc1
-	.byte	0x1f
+	.byte	0x22
 	.4byte	0x34a7
 	.byte	0x8
 	.uleb128 0xe
 	.4byte	.LASF2826
 	.byte	0xc1
-	.byte	0x20
+	.byte	0x23
 	.4byte	0xd7e9
 	.byte	0x10
 	.byte	0
@@ -43434,7 +43556,7 @@
 	.byte	0x4
 	.4byte	0x6d
 	.byte	0xc3
-	.byte	0x42
+	.byte	0x4a
 	.4byte	0xd95a
 	.uleb128 0xc
 	.4byte	.LASF2844
@@ -43513,84 +43635,84 @@
 	.4byte	.LASF2868
 	.byte	0x40
 	.byte	0xc3
-	.byte	0x60
+	.byte	0x68
 	.4byte	0xda03
 	.uleb128 0xe
 	.4byte	.LASF854
 	.byte	0xc3
-	.byte	0x61
+	.byte	0x69
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0xe
 	.4byte	.LASF2869
 	.byte	0xc3
-	.byte	0x62
+	.byte	0x6a
 	.4byte	0xc6
 	.byte	0x4
 	.uleb128 0xe
 	.4byte	.LASF2870
 	.byte	0xc3
-	.byte	0x63
+	.byte	0x6b
 	.4byte	0xc6
 	.byte	0x8
 	.uleb128 0xe
 	.4byte	.LASF262
 	.byte	0xc3
-	.byte	0x64
+	.byte	0x6c
 	.4byte	0xc6
 	.byte	0xc
 	.uleb128 0xe
 	.4byte	.LASF2871
 	.byte	0xc3
-	.byte	0x65
+	.byte	0x6d
 	.4byte	0xc6
 	.byte	0x10
 	.uleb128 0xe
 	.4byte	.LASF2838
 	.byte	0xc3
-	.byte	0x66
+	.byte	0x6e
 	.4byte	0xc6
 	.byte	0x14
 	.uleb128 0xe
 	.4byte	.LASF2839
 	.byte	0xc3
-	.byte	0x67
+	.byte	0x6f
 	.4byte	0xc6
 	.byte	0x18
 	.uleb128 0xe
 	.4byte	.LASF2840
 	.byte	0xc3
-	.byte	0x68
+	.byte	0x70
 	.4byte	0xc6
 	.byte	0x1c
 	.uleb128 0xe
 	.4byte	.LASF2841
 	.byte	0xc3
-	.byte	0x69
+	.byte	0x71
 	.4byte	0xc6
 	.byte	0x20
 	.uleb128 0xe
 	.4byte	.LASF2872
 	.byte	0xc3
-	.byte	0x6a
+	.byte	0x72
 	.4byte	0xc6
 	.byte	0x24
 	.uleb128 0xe
 	.4byte	.LASF2873
 	.byte	0xc3
-	.byte	0x6b
+	.byte	0x73
 	.4byte	0xc6
 	.byte	0x28
 	.uleb128 0xe
 	.4byte	.LASF2842
 	.byte	0xc3
-	.byte	0x6c
+	.byte	0x74
 	.4byte	0xc6
 	.byte	0x2c
 	.uleb128 0xe
 	.4byte	.LASF2836
 	.byte	0xc3
-	.byte	0x6d
+	.byte	0x75
 	.4byte	0x46fe
 	.byte	0x30
 	.byte	0
@@ -44536,10 +44658,10 @@
 	.byte	0
 	.uleb128 0x26
 	.4byte	.LASF2943
-	.2byte	0x278
+	.2byte	0x268
 	.byte	0x1
 	.byte	0x42
-	.4byte	0xe470
+	.4byte	0xe462
 	.uleb128 0xe
 	.4byte	.LASF2944
 	.byte	0x1
@@ -44718,144 +44840,138 @@
 	.4byte	.LASF2970
 	.byte	0x1
 	.byte	0x60
-	.4byte	0xbfee
+	.4byte	0xe462
 	.byte	0xb8
 	.uleb128 0xe
 	.4byte	.LASF2971
 	.byte	0x1
 	.byte	0x61
-	.4byte	0xe470
-	.byte	0xc0
+	.4byte	0xc6
+	.byte	0xc8
 	.uleb128 0xe
 	.4byte	.LASF2972
 	.byte	0x1
 	.byte	0x62
-	.4byte	0xc6
+	.4byte	0x21e
 	.byte	0xd0
 	.uleb128 0xe
 	.4byte	.LASF2973
 	.byte	0x1
 	.byte	0x63
-	.4byte	0x21e
+	.4byte	0xe472
 	.byte	0xd8
 	.uleb128 0xe
 	.4byte	.LASF2974
 	.byte	0x1
 	.byte	0x64
-	.4byte	0xe480
+	.4byte	0xe472
 	.byte	0xe0
 	.uleb128 0xe
 	.4byte	.LASF2975
 	.byte	0x1
 	.byte	0x65
-	.4byte	0xe480
+	.4byte	0xe472
 	.byte	0xe8
 	.uleb128 0xe
 	.4byte	.LASF2976
 	.byte	0x1
 	.byte	0x66
-	.4byte	0xe480
+	.4byte	0xe472
 	.byte	0xf0
 	.uleb128 0xe
 	.4byte	.LASF2977
 	.byte	0x1
 	.byte	0x67
-	.4byte	0xe480
+	.4byte	0xc6
 	.byte	0xf8
-	.uleb128 0x27
+	.uleb128 0xe
 	.4byte	.LASF2978
 	.byte	0x1
 	.byte	0x68
 	.4byte	0xc6
-	.2byte	0x100
+	.byte	0xfc
 	.uleb128 0x27
 	.4byte	.LASF2979
 	.byte	0x1
 	.byte	0x69
-	.4byte	0xc6
-	.2byte	0x104
+	.4byte	0xd728
+	.2byte	0x100
 	.uleb128 0x27
 	.4byte	.LASF2980
 	.byte	0x1
 	.byte	0x6a
 	.4byte	0xc6
-	.2byte	0x108
+	.2byte	0x1d0
 	.uleb128 0x27
 	.4byte	.LASF2981
 	.byte	0x1
-	.byte	0x6b
-	.4byte	0xd728
-	.2byte	0x110
+	.byte	0x6c
+	.4byte	0xc6
+	.2byte	0x1d4
 	.uleb128 0x27
 	.4byte	.LASF2982
 	.byte	0x1
-	.byte	0x6c
-	.4byte	0xc6
-	.2byte	0x1e0
+	.byte	0x6e
+	.4byte	0x316c
+	.2byte	0x1d8
 	.uleb128 0x27
 	.4byte	.LASF2983
 	.byte	0x1
-	.byte	0x6e
-	.4byte	0xc6
-	.2byte	0x1e4
+	.byte	0x71
+	.4byte	0x316c
+	.2byte	0x210
 	.uleb128 0x27
 	.4byte	.LASF2984
 	.byte	0x1
-	.byte	0x70
-	.4byte	0x316c
-	.2byte	0x1e8
+	.byte	0x74
+	.4byte	0xc6
+	.2byte	0x248
 	.uleb128 0x27
 	.4byte	.LASF2985
 	.byte	0x1
-	.byte	0x73
-	.4byte	0x316c
-	.2byte	0x220
+	.byte	0x76
+	.4byte	0xc6
+	.2byte	0x24c
 	.uleb128 0x27
 	.4byte	.LASF2986
 	.byte	0x1
-	.byte	0x76
+	.byte	0x78
 	.4byte	0xc6
-	.2byte	0x258
+	.2byte	0x250
 	.uleb128 0x27
 	.4byte	.LASF2987
 	.byte	0x1
-	.byte	0x78
+	.byte	0x7a
 	.4byte	0xc6
-	.2byte	0x25c
+	.2byte	0x254
 	.uleb128 0x27
 	.4byte	.LASF2988
 	.byte	0x1
-	.byte	0x7a
+	.byte	0x7b
 	.4byte	0xc6
-	.2byte	0x260
+	.2byte	0x258
 	.uleb128 0x27
 	.4byte	.LASF2989
 	.byte	0x1
 	.byte	0x7c
 	.4byte	0xc6
-	.2byte	0x264
+	.2byte	0x25c
 	.uleb128 0x27
 	.4byte	.LASF2990
 	.byte	0x1
 	.byte	0x7d
 	.4byte	0xc6
-	.2byte	0x268
+	.2byte	0x260
 	.uleb128 0x27
 	.4byte	.LASF2991
 	.byte	0x1
 	.byte	0x7e
 	.4byte	0xc6
-	.2byte	0x26c
-	.uleb128 0x27
-	.4byte	.LASF2992
-	.byte	0x1
-	.byte	0x7f
-	.4byte	0xc6
-	.2byte	0x270
+	.2byte	0x264
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x458
-	.4byte	0xe480
+	.4byte	0xe472
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x1
@@ -44865,52 +44981,60 @@
 	.4byte	0xd828
 	.uleb128 0x47
 	.string	"ebc"
-	.2byte	0x338
+	.2byte	0x328
 	.byte	0x1
-	.byte	0x82
-	.4byte	0xe4d0
+	.byte	0x81
+	.4byte	0xe4c2
 	.uleb128 0x20
 	.string	"dev"
 	.byte	0x1
-	.byte	0x83
+	.byte	0x82
 	.4byte	0xa496
 	.byte	0
 	.uleb128 0xe
 	.4byte	.LASF2906
 	.byte	0x1
-	.byte	0x84
+	.byte	0x83
 	.4byte	0xe0a4
 	.byte	0x8
 	.uleb128 0xe
 	.4byte	.LASF2907
 	.byte	0x1
-	.byte	0x85
+	.byte	0x84
 	.4byte	0xda8c
 	.byte	0x10
 	.uleb128 0xe
-	.4byte	.LASF2993
+	.4byte	.LASF2992
 	.byte	0x1
-	.byte	0x86
+	.byte	0x85
 	.4byte	0xde87
 	.byte	0x18
 	.uleb128 0xe
 	.4byte	.LASF1742
 	.byte	0x1
-	.byte	0x87
+	.byte	0x86
 	.4byte	0xe1e3
 	.byte	0xc0
 	.byte	0
 	.uleb128 0x48
-	.4byte	.LASF2994
+	.4byte	.LASF2993
 	.byte	0x1
-	.byte	0x8c
-	.4byte	0xe4e5
+	.byte	0x8b
+	.4byte	0xe4d7
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	global_ebc
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0xe486
+	.4byte	0xe478
+	.uleb128 0x48
+	.4byte	.LASF2994
+	.byte	0x1
+	.byte	0x8c
+	.4byte	0x2eff
+	.uleb128 0x9
+	.byte	0x3
+	.8byte	ebc_task
 	.uleb128 0x48
 	.4byte	.LASF2995
 	.byte	0x1
@@ -44918,39 +45042,39 @@
 	.4byte	0x2eff
 	.uleb128 0x9
 	.byte	0x3
-	.8byte	ebc_task
+	.8byte	ebc_auto_task
 	.uleb128 0x48
 	.4byte	.LASF2996
 	.byte	0x1
 	.byte	0x8e
-	.4byte	0x2eff
-	.uleb128 0x9
-	.byte	0x3
-	.8byte	ebc_auto_task
-	.uleb128 0x48
-	.4byte	.LASF2997
-	.byte	0x1
-	.byte	0x8f
 	.4byte	0x159a
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	ebc_thread_wq
 	.uleb128 0x48
-	.4byte	.LASF2998
+	.4byte	.LASF2997
 	.byte	0x1
-	.byte	0x90
+	.byte	0x8f
 	.4byte	0x5a97
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	ebc_auto_thread_sem
 	.uleb128 0x48
-	.4byte	.LASF2999
+	.4byte	.LASF2998
 	.byte	0x1
-	.byte	0x92
+	.byte	0x91
 	.4byte	0x2eff
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	ebc_auto_assist_task
+	.uleb128 0x48
+	.4byte	.LASF2999
+	.byte	0x1
+	.byte	0x92
+	.4byte	0x5a97
+	.uleb128 0x9
+	.byte	0x3
+	.8byte	ebc_auto_assist_thread_sem
 	.uleb128 0x48
 	.4byte	.LASF3000
 	.byte	0x1
@@ -44958,172 +45082,164 @@
 	.4byte	0x5a97
 	.uleb128 0x9
 	.byte	0x3
-	.8byte	ebc_auto_assist_thread_sem
-	.uleb128 0x48
-	.4byte	.LASF3001
-	.byte	0x1
-	.byte	0x94
-	.4byte	0x5a97
-	.uleb128 0x9
-	.byte	0x3
 	.8byte	ebc_assist_finished_flag_sem
 	.uleb128 0x49
-	.4byte	.LASF3002
-	.byte	0x1
-	.2byte	0x919
-	.4byte	0xc6
-	.uleb128 0x9
-	.byte	0x3
-	.8byte	resume_frame_count
-	.uleb128 0x49
-	.4byte	.LASF3003
+	.4byte	.LASF3001
 	.byte	0x1
 	.2byte	0x91a
 	.4byte	0xc6
 	.uleb128 0x9
 	.byte	0x3
+	.8byte	resume_frame_count
+	.uleb128 0x49
+	.4byte	.LASF3002
+	.byte	0x1
+	.2byte	0x91b
+	.4byte	0xc6
+	.uleb128 0x9
+	.byte	0x3
 	.8byte	resume_count_start
 	.uleb128 0x49
-	.4byte	.LASF3004
+	.4byte	.LASF3003
 	.byte	0x1
-	.2byte	0xc3b
+	.2byte	0xc43
 	.4byte	0x7c9
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	ebc_ops
 	.uleb128 0x49
-	.4byte	.LASF3005
+	.4byte	.LASF3004
 	.byte	0x1
-	.2byte	0xc45
+	.2byte	0xc4d
 	.4byte	0xc536
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	ebc_misc
 	.uleb128 0x49
-	.4byte	.LASF3006
+	.4byte	.LASF3005
 	.byte	0x1
-	.2byte	0xc62
+	.2byte	0xc6a
 	.4byte	0x7c9
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	waveform_ops
 	.uleb128 0x49
-	.4byte	.LASF3007
+	.4byte	.LASF3006
 	.byte	0x1
-	.2byte	0xc68
+	.2byte	0xc70
 	.4byte	0xc536
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	waveform_misc
 	.uleb128 0x49
-	.4byte	.LASF3008
+	.4byte	.LASF3007
 	.byte	0x1
-	.2byte	0xc77
+	.2byte	0xc7f
 	.4byte	0xb2c3
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	dev_attr_waveform_version
 	.uleb128 0x49
-	.4byte	.LASF3009
+	.4byte	.LASF3008
 	.byte	0x1
-	.2byte	0xc82
+	.2byte	0xc8a
 	.4byte	0xb2c3
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	dev_attr_pmic_name
 	.uleb128 0x49
-	.4byte	.LASF3010
+	.4byte	.LASF3009
 	.byte	0x1
-	.2byte	0xc90
+	.2byte	0xc98
 	.4byte	0xb2c3
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	dev_attr_pmic_temp
 	.uleb128 0x49
-	.4byte	.LASF3011
+	.4byte	.LASF3010
 	.byte	0x1
-	.2byte	0xcb3
+	.2byte	0xcbb
 	.4byte	0xb2c3
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	dev_attr_pmic_vcom
 	.uleb128 0x49
-	.4byte	.LASF3012
+	.4byte	.LASF3011
 	.byte	0x1
-	.2byte	0xcbd
+	.2byte	0xcc5
 	.4byte	0xb2c3
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	dev_attr_ebc_version
 	.uleb128 0x49
-	.4byte	.LASF3013
+	.4byte	.LASF3012
 	.byte	0x1
-	.2byte	0xcc6
+	.2byte	0xcce
 	.4byte	0xb2c3
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	dev_attr_ebc_state
 	.uleb128 0x49
-	.4byte	.LASF3014
+	.4byte	.LASF3013
 	.byte	0x1
-	.2byte	0xccf
+	.2byte	0xcd7
 	.4byte	0xb2c3
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	dev_attr_ebc_buf_state
 	.uleb128 0x49
-	.4byte	.LASF3015
+	.4byte	.LASF3014
 	.byte	0x1
-	.2byte	0xce2
+	.2byte	0xcea
 	.4byte	0xb2c3
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	dev_attr_auto_frame_state
 	.uleb128 0x49
-	.4byte	.LASF3016
+	.4byte	.LASF3015
 	.byte	0x1
-	.2byte	0xea8
+	.2byte	0xeb4
 	.4byte	0xa482
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	ebc_pm
 	.uleb128 0x5
 	.4byte	0xb0c1
-	.4byte	0xe6d8
+	.4byte	0xe6ca
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x1
 	.byte	0
 	.uleb128 0x3
-	.4byte	0xe6c8
+	.4byte	0xe6ba
 	.uleb128 0x49
-	.4byte	.LASF3017
+	.4byte	.LASF3016
 	.byte	0x1
-	.2byte	0xead
-	.4byte	0xe6d8
+	.2byte	0xeb9
+	.4byte	0xe6ca
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	ebc_match
 	.uleb128 0x49
-	.4byte	.LASF3018
+	.4byte	.LASF3017
 	.byte	0x1
-	.2byte	0xeb3
+	.2byte	0xebf
 	.4byte	0xd5c4
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	ebc_driver
 	.uleb128 0x49
-	.4byte	.LASF3019
+	.4byte	.LASF3018
 	.byte	0x1
-	.2byte	0xec7
+	.2byte	0xed3
 	.4byte	0x458
 	.uleb128 0x9
 	.byte	0x3
-	.8byte	__addressable_ebc_init3783
+	.8byte	__addressable_ebc_init3795
 	.uleb128 0x49
-	.4byte	.LASF3020
+	.4byte	.LASF3019
 	.byte	0x1
-	.2byte	0xec8
+	.2byte	0xed4
 	.4byte	0x4ac
 	.uleb128 0x9
 	.byte	0x3
@@ -45131,2569 +45247,2569 @@
 	.uleb128 0x4a
 	.4byte	.LASF3070
 	.byte	0x1
-	.2byte	0xec2
+	.2byte	0xece
 	.8byte	.LFB2874
 	.8byte	.LFE2874-.LFB2874
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0xe761
+	.4byte	0xe753
 	.uleb128 0x4b
 	.8byte	.LVL79
-	.4byte	0x16999
+	.4byte	0x16b8a
 	.byte	0
 	.uleb128 0x4c
-	.4byte	.LASF3021
+	.4byte	.LASF3020
 	.byte	0x1
-	.2byte	0xebd
+	.2byte	0xec9
 	.4byte	0xc6
 	.8byte	.LFB2873
 	.8byte	.LFE2873-.LFB2873
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0xe791
+	.4byte	0xe783
 	.uleb128 0x4b
-	.8byte	.LVL729
-	.4byte	0x169a4
+	.8byte	.LVL726
+	.4byte	0x16b95
 	.byte	0
 	.uleb128 0x4d
-	.4byte	.LASF3022
+	.4byte	.LASF3021
 	.byte	0x1
-	.2byte	0xe9c
+	.2byte	0xea8
 	.4byte	0xc6
 	.8byte	.LFB2872
 	.8byte	.LFE2872-.LFB2872
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0xe82d
+	.4byte	0xe81f
 	.uleb128 0x4e
 	.string	"dev"
 	.byte	0x1
-	.2byte	0xe9c
+	.2byte	0xea8
 	.4byte	0xa496
 	.4byte	.LLST23
 	.uleb128 0x4f
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0xe9e
-	.4byte	0xe4e5
+	.2byte	0xeaa
+	.4byte	0xe4d7
 	.uleb128 0x43
 	.4byte	.LASF2943
 	.byte	0x1
-	.2byte	0xe9f
-	.4byte	0xe82d
+	.2byte	0xeab
+	.4byte	0xe81f
 	.uleb128 0x50
-	.4byte	0x15c3b
-	.8byte	.LBB1056
-	.8byte	.LBE1056-.LBB1056
+	.4byte	0x15e2c
+	.8byte	.LBB1088
+	.8byte	.LBE1088-.LBB1088
 	.byte	0x1
-	.2byte	0xe9e
-	.4byte	0xe7fd
+	.2byte	0xeaa
+	.4byte	0xe7ef
 	.uleb128 0x51
-	.4byte	0x15c4c
+	.4byte	0x15e3d
 	.byte	0
 	.uleb128 0x50
-	.4byte	0x1582c
-	.8byte	.LBB1058
-	.8byte	.LBE1058-.LBB1058
+	.4byte	0x15a1d
+	.8byte	.LBB1090
+	.8byte	.LBE1090-.LBB1090
 	.byte	0x1
-	.2byte	0xea1
-	.4byte	0xe81f
+	.2byte	0xead
+	.4byte	0xe811
 	.uleb128 0x51
-	.4byte	0x15838
+	.4byte	0x15a29
 	.byte	0
 	.uleb128 0x4b
 	.8byte	.LVL83
-	.4byte	0x169af
+	.4byte	0x16ba0
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0xe1e3
 	.uleb128 0x4d
-	.4byte	.LASF3024
+	.4byte	.LASF3023
 	.byte	0x1
-	.2byte	0xe8b
+	.2byte	0xe97
 	.4byte	0xc6
 	.8byte	.LFB2871
 	.8byte	.LFE2871-.LFB2871
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0xe93a
+	.4byte	0xe92c
 	.uleb128 0x4e
 	.string	"dev"
 	.byte	0x1
-	.2byte	0xe8b
+	.2byte	0xe97
 	.4byte	0xa496
-	.4byte	.LLST261
+	.4byte	.LLST269
 	.uleb128 0x4f
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0xe8d
-	.4byte	0xe4e5
+	.2byte	0xe99
+	.4byte	0xe4d7
 	.uleb128 0x43
 	.4byte	.LASF2943
 	.byte	0x1
-	.2byte	0xe8e
-	.4byte	0xe82d
+	.2byte	0xe9a
+	.4byte	0xe81f
 	.uleb128 0x52
-	.4byte	.LASF3025
-	.4byte	0xe94a
+	.4byte	.LASF3024
+	.4byte	0xe93c
 	.uleb128 0x9
 	.byte	0x3
-	.8byte	__func__.35838
+	.8byte	__func__.35849
 	.uleb128 0x50
-	.4byte	0x15c3b
-	.8byte	.LBB1528
-	.8byte	.LBE1528-.LBB1528
+	.4byte	0x15e2c
+	.8byte	.LBB1590
+	.8byte	.LBE1590-.LBB1590
 	.byte	0x1
-	.2byte	0xe8d
-	.4byte	0xe8b2
+	.2byte	0xe99
+	.4byte	0xe8a4
 	.uleb128 0x51
-	.4byte	0x15c4c
+	.4byte	0x15e3d
 	.byte	0
 	.uleb128 0x50
-	.4byte	0x15844
-	.8byte	.LBB1530
-	.8byte	.LBE1530-.LBB1530
+	.4byte	0x15a35
+	.8byte	.LBB1592
+	.8byte	.LBE1592-.LBB1592
 	.byte	0x1
-	.2byte	0xe96
-	.4byte	0xe8d4
+	.2byte	0xea2
+	.4byte	0xe8c6
 	.uleb128 0x51
-	.4byte	0x15850
+	.4byte	0x15a41
 	.byte	0
 	.uleb128 0x50
-	.4byte	0x1547c
-	.8byte	.LBB1532
-	.8byte	.LBE1532-.LBB1532
+	.4byte	0x1566d
+	.8byte	.LBB1594
+	.8byte	.LBE1594-.LBB1594
 	.byte	0x1
-	.2byte	0xe92
-	.4byte	0xe91f
+	.2byte	0xe9e
+	.4byte	0xe911
 	.uleb128 0x51
-	.4byte	0x15499
+	.4byte	0x1568a
 	.uleb128 0x51
-	.4byte	0x1548d
+	.4byte	0x1567e
 	.uleb128 0x53
-	.8byte	.LBB1533
-	.8byte	.LBE1533-.LBB1533
+	.8byte	.LBB1595
+	.8byte	.LBE1595-.LBB1595
 	.uleb128 0x54
-	.4byte	0x154a5
+	.4byte	0x15696
 	.uleb128 0x4b
-	.8byte	.LVL898
-	.4byte	0x1643d
+	.8byte	.LVL895
+	.4byte	0x1662e
 	.byte	0
 	.byte	0
 	.uleb128 0x4b
-	.8byte	.LVL896
-	.4byte	0x169af
+	.8byte	.LVL893
+	.4byte	0x16ba0
 	.uleb128 0x4b
-	.8byte	.LVL897
-	.4byte	0x169af
+	.8byte	.LVL894
+	.4byte	0x16ba0
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x68
-	.4byte	0xe94a
+	.4byte	0xe93c
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0xb
 	.byte	0
 	.uleb128 0x3
-	.4byte	0xe93a
+	.4byte	0xe92c
 	.uleb128 0x4c
-	.4byte	.LASF3026
+	.4byte	.LASF3025
 	.byte	0x1
-	.2byte	0xe84
+	.2byte	0xe90
 	.4byte	0xc6
 	.8byte	.LFB2870
 	.8byte	.LFE2870-.LFB2870
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0xe98f
+	.4byte	0xe981
 	.uleb128 0x55
-	.4byte	.LASF3027
+	.4byte	.LASF3026
 	.byte	0x1
-	.2byte	0xe84
+	.2byte	0xe90
 	.4byte	0xd640
 	.4byte	.LLST25
 	.uleb128 0x4b
 	.8byte	.LVL89
-	.4byte	0x169bb
+	.4byte	0x16bac
 	.byte	0
 	.uleb128 0x4c
-	.4byte	.LASF3028
+	.4byte	.LASF3027
 	.byte	0x1
-	.2byte	0xe04
+	.2byte	0xe10
 	.4byte	0xc6
 	.8byte	.LFB2869
 	.8byte	.LFE2869-.LFB2869
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0xfe8c
+	.4byte	0xfe7e
 	.uleb128 0x55
-	.4byte	.LASF3027
+	.4byte	.LASF3026
 	.byte	0x1
-	.2byte	0xe04
+	.2byte	0xe10
 	.4byte	0xd640
-	.4byte	.LLST291
+	.4byte	.LLST299
 	.uleb128 0x4f
 	.string	"dev"
 	.byte	0x1
-	.2byte	0xe06
+	.2byte	0xe12
 	.4byte	0xa496
 	.uleb128 0x43
+	.4byte	.LASF3028
+	.byte	0x1
+	.2byte	0xe13
+	.4byte	0xb7ba
+	.uleb128 0x56
 	.4byte	.LASF3029
 	.byte	0x1
-	.2byte	0xe07
-	.4byte	0xb7ba
-	.uleb128 0x56
+	.2byte	0xe14
+	.4byte	0xd640
+	.4byte	.LLST300
+	.uleb128 0x43
 	.4byte	.LASF3030
 	.byte	0x1
-	.2byte	0xe08
-	.4byte	0xd640
-	.4byte	.LLST292
-	.uleb128 0x43
-	.4byte	.LASF3031
-	.byte	0x1
-	.2byte	0xe09
+	.2byte	0xe15
 	.4byte	0xb7ba
 	.uleb128 0x56
-	.4byte	.LASF3032
+	.4byte	.LASF3031
 	.byte	0x1
-	.2byte	0xe0a
+	.2byte	0xe16
 	.4byte	0xbf69
-	.4byte	.LLST293
+	.4byte	.LLST301
 	.uleb128 0x4f
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0xe0b
-	.4byte	0xe4e5
+	.2byte	0xe17
+	.4byte	0xe4d7
 	.uleb128 0x56
 	.4byte	.LASF2943
 	.byte	0x1
-	.2byte	0xe0c
-	.4byte	0xe82d
-	.4byte	.LLST294
+	.2byte	0xe18
+	.4byte	0xe81f
+	.4byte	.LLST302
 	.uleb128 0x43
-	.4byte	.LASF2993
+	.4byte	.LASF2992
 	.byte	0x1
-	.2byte	0xe0d
+	.2byte	0xe19
 	.4byte	0xe0e4
 	.uleb128 0x56
 	.4byte	.LASF932
 	.byte	0x1
-	.2byte	0xe0e
+	.2byte	0xe1a
 	.4byte	0xbbe6
-	.4byte	.LLST295
+	.4byte	.LLST303
 	.uleb128 0x43
 	.4byte	.LASF2389
 	.byte	0x1
-	.2byte	0xe0f
+	.2byte	0xe1b
 	.4byte	0xbb86
 	.uleb128 0x4f
 	.string	"ret"
 	.byte	0x1
-	.2byte	0xe10
+	.2byte	0xe1c
 	.4byte	0xc6
 	.uleb128 0x56
 	.4byte	.LASF957
 	.byte	0x1
-	.2byte	0xe11
+	.2byte	0xe1d
 	.4byte	0xc6
-	.4byte	.LLST296
+	.4byte	.LLST304
 	.uleb128 0x57
 	.string	"i"
 	.byte	0x1
-	.2byte	0xe12
+	.2byte	0xe1e
 	.4byte	0xc6
-	.4byte	.LLST297
+	.4byte	.LLST305
 	.uleb128 0x58
-	.4byte	0x15c59
-	.8byte	.LBB1816
-	.4byte	.Ldebug_ranges0+0x1370
+	.4byte	0x15e4a
+	.8byte	.LBB1874
+	.4byte	.Ldebug_ranges0+0x1440
 	.byte	0x1
-	.2byte	0xe14
-	.4byte	0xeaa8
+	.2byte	0xe20
+	.4byte	0xea9a
 	.uleb128 0x51
-	.4byte	0x15c82
+	.4byte	0x15e73
 	.uleb128 0x51
-	.4byte	0x15c76
+	.4byte	0x15e67
 	.uleb128 0x51
-	.4byte	0x15c6a
+	.4byte	0x15e5b
 	.uleb128 0x4b
-	.8byte	.LVL1018
-	.4byte	0x169c6
+	.8byte	.LVL1008
+	.4byte	0x16bb7
 	.byte	0
 	.uleb128 0x50
-	.4byte	0x15b36
-	.8byte	.LBB1820
-	.8byte	.LBE1820-.LBB1820
+	.4byte	0x15d27
+	.8byte	.LBB1878
+	.8byte	.LBE1878-.LBB1878
 	.byte	0x1
-	.2byte	0xe26
-	.4byte	0xeae7
+	.2byte	0xe32
+	.4byte	0xead9
 	.uleb128 0x51
-	.4byte	0x15b46
+	.4byte	0x15d37
 	.uleb128 0x59
-	.4byte	0x15c3b
-	.8byte	.LBB1821
-	.8byte	.LBE1821-.LBB1821
+	.4byte	0x15e2c
+	.8byte	.LBB1879
+	.8byte	.LBE1879-.LBB1879
 	.byte	0xbd
-	.byte	0xd8
+	.byte	0xdb
 	.uleb128 0x51
-	.4byte	0x15c4c
+	.4byte	0x15e3d
 	.byte	0
 	.byte	0
 	.uleb128 0x50
-	.4byte	0x15b58
-	.8byte	.LBB1823
-	.8byte	.LBE1823-.LBB1823
+	.4byte	0x15d49
+	.8byte	.LBB1881
+	.8byte	.LBE1881-.LBB1881
 	.byte	0x1
-	.2byte	0xe41
-	.4byte	0xeb27
+	.2byte	0xe4d
+	.4byte	0xeb19
 	.uleb128 0x51
-	.4byte	0x15b69
+	.4byte	0x15d5a
 	.uleb128 0x5a
-	.4byte	0x15c3b
-	.8byte	.LBB1824
-	.8byte	.LBE1824-.LBB1824
+	.4byte	0x15e2c
+	.8byte	.LBB1882
+	.8byte	.LBE1882-.LBB1882
 	.byte	0xa1
 	.2byte	0x166
 	.uleb128 0x51
-	.4byte	0x15c4c
+	.4byte	0x15e3d
 	.byte	0
 	.byte	0
 	.uleb128 0x58
-	.4byte	0x11df6
-	.8byte	.LBB1826
-	.4byte	.Ldebug_ranges0+0x13a0
+	.4byte	0x12011
+	.8byte	.LBB1884
+	.4byte	.Ldebug_ranges0+0x1470
 	.byte	0x1
-	.2byte	0xe55
-	.4byte	0xf5f6
+	.2byte	0xe61
+	.4byte	0xf5e8
 	.uleb128 0x51
-	.4byte	0x11e07
+	.4byte	0x12022
 	.uleb128 0x5b
-	.4byte	.Ldebug_ranges0+0x13a0
+	.4byte	.Ldebug_ranges0+0x1470
 	.uleb128 0x54
-	.4byte	0x11e13
+	.4byte	0x1202e
 	.uleb128 0x58
-	.4byte	0x15b7c
-	.8byte	.LBB1828
-	.4byte	.Ldebug_ranges0+0x13f0
-	.byte	0x1
-	.2byte	0xb26
-	.4byte	0xebb7
-	.uleb128 0x51
-	.4byte	0x15ba4
-	.uleb128 0x51
-	.4byte	0x15b98
-	.uleb128 0x51
-	.4byte	0x15b8d
-	.uleb128 0x5c
-	.4byte	0x15bb1
-	.8byte	.LBB1829
-	.4byte	.Ldebug_ranges0+0x13f0
-	.byte	0xd
-	.2byte	0x49c
-	.uleb128 0x51
-	.4byte	0x15be5
-	.uleb128 0x51
-	.4byte	0x15bd9
-	.uleb128 0x51
-	.4byte	0x15bcd
-	.uleb128 0x51
-	.4byte	0x15bc2
-	.uleb128 0x5b
-	.4byte	.Ldebug_ranges0+0x13f0
-	.uleb128 0x54
-	.4byte	0x15bf0
-	.uleb128 0x4b
-	.8byte	.LVL1043
-	.4byte	0x169d2
-	.byte	0
-	.byte	0
-	.byte	0
-	.uleb128 0x50
-	.4byte	0x15b7c
-	.8byte	.LBB1840
-	.8byte	.LBE1840-.LBB1840
+	.4byte	0x15d6d
+	.8byte	.LBB1886
+	.4byte	.Ldebug_ranges0+0x14c0
 	.byte	0x1
 	.2byte	0xb29
-	.4byte	0xec34
+	.4byte	0xeba9
 	.uleb128 0x51
-	.4byte	0x15ba4
+	.4byte	0x15d95
 	.uleb128 0x51
-	.4byte	0x15b98
+	.4byte	0x15d89
 	.uleb128 0x51
-	.4byte	0x15b8d
-	.uleb128 0x5a
-	.4byte	0x15bb1
-	.8byte	.LBB1841
-	.8byte	.LBE1841-.LBB1841
-	.byte	0xd
-	.2byte	0x49c
-	.uleb128 0x51
-	.4byte	0x15be5
-	.uleb128 0x51
-	.4byte	0x15bd9
-	.uleb128 0x51
-	.4byte	0x15bcd
-	.uleb128 0x51
-	.4byte	0x15bc2
-	.uleb128 0x53
-	.8byte	.LBB1842
-	.8byte	.LBE1842-.LBB1842
-	.uleb128 0x54
-	.4byte	0x15bf0
-	.uleb128 0x4b
-	.8byte	.LVL1044
-	.4byte	0x169d2
-	.byte	0
-	.byte	0
-	.byte	0
-	.uleb128 0x50
-	.4byte	0x15b7c
-	.8byte	.LBB1843
-	.8byte	.LBE1843-.LBB1843
-	.byte	0x1
-	.2byte	0xb2c
-	.4byte	0xecb1
-	.uleb128 0x51
-	.4byte	0x15ba4
-	.uleb128 0x51
-	.4byte	0x15b98
-	.uleb128 0x51
-	.4byte	0x15b8d
-	.uleb128 0x5a
-	.4byte	0x15bb1
-	.8byte	.LBB1844
-	.8byte	.LBE1844-.LBB1844
-	.byte	0xd
-	.2byte	0x49c
-	.uleb128 0x51
-	.4byte	0x15be5
-	.uleb128 0x51
-	.4byte	0x15bd9
-	.uleb128 0x51
-	.4byte	0x15bcd
-	.uleb128 0x51
-	.4byte	0x15bc2
-	.uleb128 0x53
-	.8byte	.LBB1845
-	.8byte	.LBE1845-.LBB1845
-	.uleb128 0x54
-	.4byte	0x15bf0
-	.uleb128 0x4b
-	.8byte	.LVL1045
-	.4byte	0x169d2
-	.byte	0
-	.byte	0
-	.byte	0
-	.uleb128 0x50
-	.4byte	0x15b7c
-	.8byte	.LBB1846
-	.8byte	.LBE1846-.LBB1846
-	.byte	0x1
-	.2byte	0xb2f
-	.4byte	0xed2e
-	.uleb128 0x51
-	.4byte	0x15ba4
-	.uleb128 0x51
-	.4byte	0x15b98
-	.uleb128 0x51
-	.4byte	0x15b8d
-	.uleb128 0x5a
-	.4byte	0x15bb1
-	.8byte	.LBB1847
-	.8byte	.LBE1847-.LBB1847
-	.byte	0xd
-	.2byte	0x49c
-	.uleb128 0x51
-	.4byte	0x15be5
-	.uleb128 0x51
-	.4byte	0x15bd9
-	.uleb128 0x51
-	.4byte	0x15bcd
-	.uleb128 0x51
-	.4byte	0x15bc2
-	.uleb128 0x53
-	.8byte	.LBB1848
-	.8byte	.LBE1848-.LBB1848
-	.uleb128 0x54
-	.4byte	0x15bf0
-	.uleb128 0x4b
-	.8byte	.LVL1046
-	.4byte	0x169d2
-	.byte	0
-	.byte	0
-	.byte	0
-	.uleb128 0x50
-	.4byte	0x15b7c
-	.8byte	.LBB1849
-	.8byte	.LBE1849-.LBB1849
-	.byte	0x1
-	.2byte	0xb32
-	.4byte	0xedab
-	.uleb128 0x51
-	.4byte	0x15ba4
-	.uleb128 0x51
-	.4byte	0x15b98
-	.uleb128 0x51
-	.4byte	0x15b8d
-	.uleb128 0x5a
-	.4byte	0x15bb1
-	.8byte	.LBB1850
-	.8byte	.LBE1850-.LBB1850
-	.byte	0xd
-	.2byte	0x49c
-	.uleb128 0x51
-	.4byte	0x15be5
-	.uleb128 0x51
-	.4byte	0x15bd9
-	.uleb128 0x51
-	.4byte	0x15bcd
-	.uleb128 0x51
-	.4byte	0x15bc2
-	.uleb128 0x53
-	.8byte	.LBB1851
-	.8byte	.LBE1851-.LBB1851
-	.uleb128 0x54
-	.4byte	0x15bf0
-	.uleb128 0x4b
-	.8byte	.LVL1047
-	.4byte	0x169d2
-	.byte	0
-	.byte	0
-	.byte	0
-	.uleb128 0x50
-	.4byte	0x15b7c
-	.8byte	.LBB1852
-	.8byte	.LBE1852-.LBB1852
-	.byte	0x1
-	.2byte	0xb35
-	.4byte	0xee28
-	.uleb128 0x51
-	.4byte	0x15ba4
-	.uleb128 0x51
-	.4byte	0x15b98
-	.uleb128 0x51
-	.4byte	0x15b8d
-	.uleb128 0x5a
-	.4byte	0x15bb1
-	.8byte	.LBB1853
-	.8byte	.LBE1853-.LBB1853
-	.byte	0xd
-	.2byte	0x49c
-	.uleb128 0x51
-	.4byte	0x15be5
-	.uleb128 0x51
-	.4byte	0x15bd9
-	.uleb128 0x51
-	.4byte	0x15bcd
-	.uleb128 0x51
-	.4byte	0x15bc2
-	.uleb128 0x53
-	.8byte	.LBB1854
-	.8byte	.LBE1854-.LBB1854
-	.uleb128 0x54
-	.4byte	0x15bf0
-	.uleb128 0x4b
-	.8byte	.LVL1048
-	.4byte	0x169d2
-	.byte	0
-	.byte	0
-	.byte	0
-	.uleb128 0x50
-	.4byte	0x15b7c
-	.8byte	.LBB1855
-	.8byte	.LBE1855-.LBB1855
-	.byte	0x1
-	.2byte	0xb38
-	.4byte	0xeea5
-	.uleb128 0x51
-	.4byte	0x15ba4
-	.uleb128 0x51
-	.4byte	0x15b98
-	.uleb128 0x51
-	.4byte	0x15b8d
-	.uleb128 0x5a
-	.4byte	0x15bb1
-	.8byte	.LBB1856
-	.8byte	.LBE1856-.LBB1856
-	.byte	0xd
-	.2byte	0x49c
-	.uleb128 0x51
-	.4byte	0x15be5
-	.uleb128 0x51
-	.4byte	0x15bd9
-	.uleb128 0x51
-	.4byte	0x15bcd
-	.uleb128 0x51
-	.4byte	0x15bc2
-	.uleb128 0x53
-	.8byte	.LBB1857
-	.8byte	.LBE1857-.LBB1857
-	.uleb128 0x54
-	.4byte	0x15bf0
-	.uleb128 0x4b
-	.8byte	.LVL1049
-	.4byte	0x169d2
-	.byte	0
-	.byte	0
-	.byte	0
-	.uleb128 0x50
-	.4byte	0x15b7c
-	.8byte	.LBB1858
-	.8byte	.LBE1858-.LBB1858
-	.byte	0x1
-	.2byte	0xb3b
-	.4byte	0xef22
-	.uleb128 0x51
-	.4byte	0x15ba4
-	.uleb128 0x51
-	.4byte	0x15b98
-	.uleb128 0x51
-	.4byte	0x15b8d
-	.uleb128 0x5a
-	.4byte	0x15bb1
-	.8byte	.LBB1859
-	.8byte	.LBE1859-.LBB1859
-	.byte	0xd
-	.2byte	0x49c
-	.uleb128 0x51
-	.4byte	0x15be5
-	.uleb128 0x51
-	.4byte	0x15bd9
-	.uleb128 0x51
-	.4byte	0x15bcd
-	.uleb128 0x51
-	.4byte	0x15bc2
-	.uleb128 0x53
-	.8byte	.LBB1860
-	.8byte	.LBE1860-.LBB1860
-	.uleb128 0x54
-	.4byte	0x15bf0
-	.uleb128 0x4b
-	.8byte	.LVL1050
-	.4byte	0x169d2
-	.byte	0
-	.byte	0
-	.byte	0
-	.uleb128 0x50
-	.4byte	0x15b7c
-	.8byte	.LBB1861
-	.8byte	.LBE1861-.LBB1861
-	.byte	0x1
-	.2byte	0xb3e
-	.4byte	0xef9f
-	.uleb128 0x51
-	.4byte	0x15ba4
-	.uleb128 0x51
-	.4byte	0x15b98
-	.uleb128 0x51
-	.4byte	0x15b8d
-	.uleb128 0x5a
-	.4byte	0x15bb1
-	.8byte	.LBB1862
-	.8byte	.LBE1862-.LBB1862
-	.byte	0xd
-	.2byte	0x49c
-	.uleb128 0x51
-	.4byte	0x15be5
-	.uleb128 0x51
-	.4byte	0x15bd9
-	.uleb128 0x51
-	.4byte	0x15bcd
-	.uleb128 0x51
-	.4byte	0x15bc2
-	.uleb128 0x53
-	.8byte	.LBB1863
-	.8byte	.LBE1863-.LBB1863
-	.uleb128 0x54
-	.4byte	0x15bf0
-	.uleb128 0x4b
-	.8byte	.LVL1051
-	.4byte	0x169d2
-	.byte	0
-	.byte	0
-	.byte	0
-	.uleb128 0x50
-	.4byte	0x15b7c
-	.8byte	.LBB1864
-	.8byte	.LBE1864-.LBB1864
-	.byte	0x1
-	.2byte	0xb41
-	.4byte	0xf01c
-	.uleb128 0x51
-	.4byte	0x15ba4
-	.uleb128 0x51
-	.4byte	0x15b98
-	.uleb128 0x51
-	.4byte	0x15b8d
-	.uleb128 0x5a
-	.4byte	0x15bb1
-	.8byte	.LBB1865
-	.8byte	.LBE1865-.LBB1865
-	.byte	0xd
-	.2byte	0x49c
-	.uleb128 0x51
-	.4byte	0x15be5
-	.uleb128 0x51
-	.4byte	0x15bd9
-	.uleb128 0x51
-	.4byte	0x15bcd
-	.uleb128 0x51
-	.4byte	0x15bc2
-	.uleb128 0x53
-	.8byte	.LBB1866
-	.8byte	.LBE1866-.LBB1866
-	.uleb128 0x54
-	.4byte	0x15bf0
-	.uleb128 0x4b
-	.8byte	.LVL1052
-	.4byte	0x169d2
-	.byte	0
-	.byte	0
-	.byte	0
-	.uleb128 0x50
-	.4byte	0x15b7c
-	.8byte	.LBB1867
-	.8byte	.LBE1867-.LBB1867
-	.byte	0x1
-	.2byte	0xb44
-	.4byte	0xf099
-	.uleb128 0x51
-	.4byte	0x15ba4
-	.uleb128 0x51
-	.4byte	0x15b98
-	.uleb128 0x51
-	.4byte	0x15b8d
-	.uleb128 0x5a
-	.4byte	0x15bb1
-	.8byte	.LBB1868
-	.8byte	.LBE1868-.LBB1868
-	.byte	0xd
-	.2byte	0x49c
-	.uleb128 0x51
-	.4byte	0x15be5
-	.uleb128 0x51
-	.4byte	0x15bd9
-	.uleb128 0x51
-	.4byte	0x15bcd
-	.uleb128 0x51
-	.4byte	0x15bc2
-	.uleb128 0x53
-	.8byte	.LBB1869
-	.8byte	.LBE1869-.LBB1869
-	.uleb128 0x54
-	.4byte	0x15bf0
-	.uleb128 0x4b
-	.8byte	.LVL1053
-	.4byte	0x169d2
-	.byte	0
-	.byte	0
-	.byte	0
-	.uleb128 0x50
-	.4byte	0x15b7c
-	.8byte	.LBB1870
-	.8byte	.LBE1870-.LBB1870
-	.byte	0x1
-	.2byte	0xb47
-	.4byte	0xf116
-	.uleb128 0x51
-	.4byte	0x15ba4
-	.uleb128 0x51
-	.4byte	0x15b98
-	.uleb128 0x51
-	.4byte	0x15b8d
-	.uleb128 0x5a
-	.4byte	0x15bb1
-	.8byte	.LBB1871
-	.8byte	.LBE1871-.LBB1871
-	.byte	0xd
-	.2byte	0x49c
-	.uleb128 0x51
-	.4byte	0x15be5
-	.uleb128 0x51
-	.4byte	0x15bd9
-	.uleb128 0x51
-	.4byte	0x15bcd
-	.uleb128 0x51
-	.4byte	0x15bc2
-	.uleb128 0x53
-	.8byte	.LBB1872
-	.8byte	.LBE1872-.LBB1872
-	.uleb128 0x54
-	.4byte	0x15bf0
-	.uleb128 0x4b
-	.8byte	.LVL1054
-	.4byte	0x169d2
-	.byte	0
-	.byte	0
-	.byte	0
-	.uleb128 0x50
-	.4byte	0x15b7c
-	.8byte	.LBB1873
-	.8byte	.LBE1873-.LBB1873
-	.byte	0x1
-	.2byte	0xb4a
-	.4byte	0xf193
-	.uleb128 0x51
-	.4byte	0x15ba4
-	.uleb128 0x51
-	.4byte	0x15b98
-	.uleb128 0x51
-	.4byte	0x15b8d
-	.uleb128 0x5a
-	.4byte	0x15bb1
-	.8byte	.LBB1874
-	.8byte	.LBE1874-.LBB1874
-	.byte	0xd
-	.2byte	0x49c
-	.uleb128 0x51
-	.4byte	0x15be5
-	.uleb128 0x51
-	.4byte	0x15bd9
-	.uleb128 0x51
-	.4byte	0x15bcd
-	.uleb128 0x51
-	.4byte	0x15bc2
-	.uleb128 0x53
-	.8byte	.LBB1875
-	.8byte	.LBE1875-.LBB1875
-	.uleb128 0x54
-	.4byte	0x15bf0
-	.uleb128 0x4b
-	.8byte	.LVL1055
-	.4byte	0x169d2
-	.byte	0
-	.byte	0
-	.byte	0
-	.uleb128 0x50
-	.4byte	0x15b7c
-	.8byte	.LBB1876
-	.8byte	.LBE1876-.LBB1876
-	.byte	0x1
-	.2byte	0xb4d
-	.4byte	0xf210
-	.uleb128 0x51
-	.4byte	0x15ba4
-	.uleb128 0x51
-	.4byte	0x15b98
-	.uleb128 0x51
-	.4byte	0x15b8d
-	.uleb128 0x5a
-	.4byte	0x15bb1
-	.8byte	.LBB1877
-	.8byte	.LBE1877-.LBB1877
-	.byte	0xd
-	.2byte	0x49c
-	.uleb128 0x51
-	.4byte	0x15be5
-	.uleb128 0x51
-	.4byte	0x15bd9
-	.uleb128 0x51
-	.4byte	0x15bcd
-	.uleb128 0x51
-	.4byte	0x15bc2
-	.uleb128 0x53
-	.8byte	.LBB1878
-	.8byte	.LBE1878-.LBB1878
-	.uleb128 0x54
-	.4byte	0x15bf0
-	.uleb128 0x4b
-	.8byte	.LVL1056
-	.4byte	0x169d2
-	.byte	0
-	.byte	0
-	.byte	0
-	.uleb128 0x50
-	.4byte	0x15b7c
-	.8byte	.LBB1879
-	.8byte	.LBE1879-.LBB1879
-	.byte	0x1
-	.2byte	0xb50
-	.4byte	0xf28d
-	.uleb128 0x51
-	.4byte	0x15ba4
-	.uleb128 0x51
-	.4byte	0x15b98
-	.uleb128 0x51
-	.4byte	0x15b8d
-	.uleb128 0x5a
-	.4byte	0x15bb1
-	.8byte	.LBB1880
-	.8byte	.LBE1880-.LBB1880
-	.byte	0xd
-	.2byte	0x49c
-	.uleb128 0x51
-	.4byte	0x15be5
-	.uleb128 0x51
-	.4byte	0x15bd9
-	.uleb128 0x51
-	.4byte	0x15bcd
-	.uleb128 0x51
-	.4byte	0x15bc2
-	.uleb128 0x53
-	.8byte	.LBB1881
-	.8byte	.LBE1881-.LBB1881
-	.uleb128 0x54
-	.4byte	0x15bf0
-	.uleb128 0x4b
-	.8byte	.LVL1057
-	.4byte	0x169d2
-	.byte	0
-	.byte	0
-	.byte	0
-	.uleb128 0x50
-	.4byte	0x15b7c
-	.8byte	.LBB1882
-	.8byte	.LBE1882-.LBB1882
-	.byte	0x1
-	.2byte	0xb53
-	.4byte	0xf30a
-	.uleb128 0x51
-	.4byte	0x15ba4
-	.uleb128 0x51
-	.4byte	0x15b98
-	.uleb128 0x51
-	.4byte	0x15b8d
-	.uleb128 0x5a
-	.4byte	0x15bb1
-	.8byte	.LBB1883
-	.8byte	.LBE1883-.LBB1883
-	.byte	0xd
-	.2byte	0x49c
-	.uleb128 0x51
-	.4byte	0x15be5
-	.uleb128 0x51
-	.4byte	0x15bd9
-	.uleb128 0x51
-	.4byte	0x15bcd
-	.uleb128 0x51
-	.4byte	0x15bc2
-	.uleb128 0x53
-	.8byte	.LBB1884
-	.8byte	.LBE1884-.LBB1884
-	.uleb128 0x54
-	.4byte	0x15bf0
-	.uleb128 0x4b
-	.8byte	.LVL1058
-	.4byte	0x169d2
-	.byte	0
-	.byte	0
-	.byte	0
-	.uleb128 0x50
-	.4byte	0x15b7c
-	.8byte	.LBB1885
-	.8byte	.LBE1885-.LBB1885
-	.byte	0x1
-	.2byte	0xb56
-	.4byte	0xf387
-	.uleb128 0x51
-	.4byte	0x15ba4
-	.uleb128 0x51
-	.4byte	0x15b98
-	.uleb128 0x51
-	.4byte	0x15b8d
-	.uleb128 0x5a
-	.4byte	0x15bb1
-	.8byte	.LBB1886
-	.8byte	.LBE1886-.LBB1886
-	.byte	0xd
-	.2byte	0x49c
-	.uleb128 0x51
-	.4byte	0x15be5
-	.uleb128 0x51
-	.4byte	0x15bd9
-	.uleb128 0x51
-	.4byte	0x15bcd
-	.uleb128 0x51
-	.4byte	0x15bc2
-	.uleb128 0x53
+	.4byte	0x15d7e
+	.uleb128 0x5c
+	.4byte	0x15da2
 	.8byte	.LBB1887
-	.8byte	.LBE1887-.LBB1887
-	.uleb128 0x54
-	.4byte	0x15bf0
-	.uleb128 0x4b
-	.8byte	.LVL1059
-	.4byte	0x169d2
-	.byte	0
-	.byte	0
-	.byte	0
-	.uleb128 0x50
-	.4byte	0x15b7c
-	.8byte	.LBB1888
-	.8byte	.LBE1888-.LBB1888
-	.byte	0x1
-	.2byte	0xb59
-	.4byte	0xf404
-	.uleb128 0x51
-	.4byte	0x15ba4
-	.uleb128 0x51
-	.4byte	0x15b98
-	.uleb128 0x51
-	.4byte	0x15b8d
-	.uleb128 0x5a
-	.4byte	0x15bb1
-	.8byte	.LBB1889
-	.8byte	.LBE1889-.LBB1889
+	.4byte	.Ldebug_ranges0+0x14c0
 	.byte	0xd
 	.2byte	0x49c
 	.uleb128 0x51
-	.4byte	0x15be5
+	.4byte	0x15dd6
 	.uleb128 0x51
-	.4byte	0x15bd9
+	.4byte	0x15dca
 	.uleb128 0x51
-	.4byte	0x15bcd
+	.4byte	0x15dbe
 	.uleb128 0x51
-	.4byte	0x15bc2
-	.uleb128 0x53
-	.8byte	.LBB1890
-	.8byte	.LBE1890-.LBB1890
+	.4byte	0x15db3
+	.uleb128 0x5b
+	.4byte	.Ldebug_ranges0+0x14c0
 	.uleb128 0x54
-	.4byte	0x15bf0
+	.4byte	0x15de1
 	.uleb128 0x4b
-	.8byte	.LVL1060
-	.4byte	0x169d2
+	.8byte	.LVL1033
+	.4byte	0x16bc3
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x50
-	.4byte	0x15b7c
-	.8byte	.LBB1891
-	.8byte	.LBE1891-.LBB1891
-	.byte	0x1
-	.2byte	0xb5c
-	.4byte	0xf481
-	.uleb128 0x51
-	.4byte	0x15ba4
-	.uleb128 0x51
-	.4byte	0x15b98
-	.uleb128 0x51
-	.4byte	0x15b8d
-	.uleb128 0x5a
-	.4byte	0x15bb1
-	.8byte	.LBB1892
-	.8byte	.LBE1892-.LBB1892
-	.byte	0xd
-	.2byte	0x49c
-	.uleb128 0x51
-	.4byte	0x15be5
-	.uleb128 0x51
-	.4byte	0x15bd9
-	.uleb128 0x51
-	.4byte	0x15bcd
-	.uleb128 0x51
-	.4byte	0x15bc2
-	.uleb128 0x53
-	.8byte	.LBB1893
-	.8byte	.LBE1893-.LBB1893
-	.uleb128 0x54
-	.4byte	0x15bf0
-	.uleb128 0x4b
-	.8byte	.LVL1061
-	.4byte	0x169d2
-	.byte	0
-	.byte	0
-	.byte	0
-	.uleb128 0x50
-	.4byte	0x15b7c
-	.8byte	.LBB1894
-	.8byte	.LBE1894-.LBB1894
-	.byte	0x1
-	.2byte	0xb5f
-	.4byte	0xf4fe
-	.uleb128 0x51
-	.4byte	0x15ba4
-	.uleb128 0x51
-	.4byte	0x15b98
-	.uleb128 0x51
-	.4byte	0x15b8d
-	.uleb128 0x5a
-	.4byte	0x15bb1
-	.8byte	.LBB1895
-	.8byte	.LBE1895-.LBB1895
-	.byte	0xd
-	.2byte	0x49c
-	.uleb128 0x51
-	.4byte	0x15be5
-	.uleb128 0x51
-	.4byte	0x15bd9
-	.uleb128 0x51
-	.4byte	0x15bcd
-	.uleb128 0x51
-	.4byte	0x15bc2
-	.uleb128 0x53
-	.8byte	.LBB1896
-	.8byte	.LBE1896-.LBB1896
-	.uleb128 0x54
-	.4byte	0x15bf0
-	.uleb128 0x4b
-	.8byte	.LVL1062
-	.4byte	0x169d2
-	.byte	0
-	.byte	0
-	.byte	0
-	.uleb128 0x50
-	.4byte	0x15b7c
-	.8byte	.LBB1897
-	.8byte	.LBE1897-.LBB1897
-	.byte	0x1
-	.2byte	0xb62
-	.4byte	0xf57b
-	.uleb128 0x51
-	.4byte	0x15ba4
-	.uleb128 0x51
-	.4byte	0x15b98
-	.uleb128 0x51
-	.4byte	0x15b8d
-	.uleb128 0x5a
-	.4byte	0x15bb1
+	.4byte	0x15d6d
 	.8byte	.LBB1898
 	.8byte	.LBE1898-.LBB1898
-	.byte	0xd
-	.2byte	0x49c
+	.byte	0x1
+	.2byte	0xb2c
+	.4byte	0xec26
 	.uleb128 0x51
-	.4byte	0x15be5
+	.4byte	0x15d95
 	.uleb128 0x51
-	.4byte	0x15bd9
+	.4byte	0x15d89
 	.uleb128 0x51
-	.4byte	0x15bcd
-	.uleb128 0x51
-	.4byte	0x15bc2
-	.uleb128 0x53
+	.4byte	0x15d7e
+	.uleb128 0x5a
+	.4byte	0x15da2
 	.8byte	.LBB1899
 	.8byte	.LBE1899-.LBB1899
-	.uleb128 0x54
-	.4byte	0x15bf0
-	.uleb128 0x4b
-	.8byte	.LVL1063
-	.4byte	0x169d2
-	.byte	0
-	.byte	0
-	.byte	0
-	.uleb128 0x5a
-	.4byte	0x15b7c
-	.8byte	.LBB1900
-	.8byte	.LBE1900-.LBB1900
-	.byte	0x1
-	.2byte	0xb65
-	.uleb128 0x51
-	.4byte	0x15ba4
-	.uleb128 0x51
-	.4byte	0x15b98
-	.uleb128 0x51
-	.4byte	0x15b8d
-	.uleb128 0x5a
-	.4byte	0x15bb1
-	.8byte	.LBB1901
-	.8byte	.LBE1901-.LBB1901
 	.byte	0xd
 	.2byte	0x49c
 	.uleb128 0x51
-	.4byte	0x15be5
+	.4byte	0x15dd6
 	.uleb128 0x51
-	.4byte	0x15bd9
+	.4byte	0x15dca
 	.uleb128 0x51
-	.4byte	0x15bcd
+	.4byte	0x15dbe
 	.uleb128 0x51
-	.4byte	0x15bc2
+	.4byte	0x15db3
 	.uleb128 0x53
+	.8byte	.LBB1900
+	.8byte	.LBE1900-.LBB1900
+	.uleb128 0x54
+	.4byte	0x15de1
+	.uleb128 0x4b
+	.8byte	.LVL1034
+	.4byte	0x16bc3
+	.byte	0
+	.byte	0
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x15d6d
+	.8byte	.LBB1901
+	.8byte	.LBE1901-.LBB1901
+	.byte	0x1
+	.2byte	0xb2f
+	.4byte	0xeca3
+	.uleb128 0x51
+	.4byte	0x15d95
+	.uleb128 0x51
+	.4byte	0x15d89
+	.uleb128 0x51
+	.4byte	0x15d7e
+	.uleb128 0x5a
+	.4byte	0x15da2
 	.8byte	.LBB1902
 	.8byte	.LBE1902-.LBB1902
-	.uleb128 0x54
-	.4byte	0x15bf0
-	.uleb128 0x4b
-	.8byte	.LVL1064
-	.4byte	0x169d2
-	.byte	0
-	.byte	0
-	.byte	0
-	.byte	0
-	.byte	0
-	.uleb128 0x58
-	.4byte	0xff80
-	.8byte	.LBB1909
-	.4byte	.Ldebug_ranges0+0x1440
-	.byte	0x1
-	.2byte	0xe60
-	.4byte	0xf6ef
+	.byte	0xd
+	.2byte	0x49c
 	.uleb128 0x51
-	.4byte	0xff91
-	.uleb128 0x5b
-	.4byte	.Ldebug_ranges0+0x1440
-	.uleb128 0x5d
-	.4byte	0xff9d
-	.4byte	.LLST298
-	.uleb128 0x54
-	.4byte	0xffa9
-	.uleb128 0x54
-	.4byte	0xffb5
-	.uleb128 0x54
-	.4byte	0xffc1
-	.uleb128 0x5e
-	.4byte	0xffcd
-	.uleb128 0x3
-	.byte	0x91
-	.sleb128 -104
-	.uleb128 0x54
-	.4byte	0xffd7
-	.uleb128 0x54
-	.4byte	0xffe3
-	.uleb128 0x54
-	.4byte	0xffef
-	.uleb128 0x54
-	.4byte	0xfff9
-	.uleb128 0x58
-	.4byte	0x15c8f
-	.8byte	.LBB1911
-	.4byte	.Ldebug_ranges0+0x14d0
-	.byte	0x1
-	.2byte	0xd39
-	.4byte	0xf66b
+	.4byte	0x15dd6
 	.uleb128 0x51
-	.4byte	0x15c9f
-	.byte	0
-	.uleb128 0x4b
-	.8byte	.LVL1066
-	.4byte	0x169de
-	.uleb128 0x4b
-	.8byte	.LVL1067
-	.4byte	0x169ea
-	.uleb128 0x4b
-	.8byte	.LVL1068
-	.4byte	0x169f5
-	.uleb128 0x4b
-	.8byte	.LVL1069
-	.4byte	0x16a00
-	.uleb128 0x4b
-	.8byte	.LVL1070
-	.4byte	0x16a0b
-	.uleb128 0x4b
-	.8byte	.LVL1071
-	.4byte	0x16a0b
-	.uleb128 0x4b
-	.8byte	.LVL1072
-	.4byte	0x16a15
-	.uleb128 0x4b
-	.8byte	.LVL1147
-	.4byte	0x16a20
-	.uleb128 0x4b
-	.8byte	.LVL1188
-	.4byte	0x16a20
-	.uleb128 0x4b
-	.8byte	.LVL1198
-	.4byte	0x16a20
-	.byte	0
-	.byte	0
-	.uleb128 0x58
-	.4byte	0x10006
-	.8byte	.LBB1924
-	.4byte	.Ldebug_ranges0+0x1500
-	.byte	0x1
-	.2byte	0xe67
-	.4byte	0xf7c8
+	.4byte	0x15dca
 	.uleb128 0x51
-	.4byte	0x10017
-	.uleb128 0x5b
-	.4byte	.Ldebug_ranges0+0x1500
-	.uleb128 0x54
-	.4byte	0x10023
-	.uleb128 0x5d
-	.4byte	0x1002f
-	.4byte	.LLST299
-	.uleb128 0x54
-	.4byte	0x1003b
-	.uleb128 0x5e
-	.4byte	0x10047
-	.uleb128 0x3
-	.byte	0x91
-	.sleb128 -104
-	.uleb128 0x5d
-	.4byte	0x10051
-	.4byte	.LLST300
-	.uleb128 0x54
-	.4byte	0x1005d
-	.uleb128 0x54
-	.4byte	0x10069
-	.uleb128 0x58
-	.4byte	0x15c8f
-	.8byte	.LBB1926
-	.4byte	.Ldebug_ranges0+0x1560
-	.byte	0x1
-	.2byte	0xd08
-	.4byte	0xf75e
+	.4byte	0x15dbe
 	.uleb128 0x51
-	.4byte	0x15c9f
-	.byte	0
+	.4byte	0x15db3
+	.uleb128 0x53
+	.8byte	.LBB1903
+	.8byte	.LBE1903-.LBB1903
+	.uleb128 0x54
+	.4byte	0x15de1
 	.uleb128 0x4b
-	.8byte	.LVL1074
-	.4byte	0x169de
-	.uleb128 0x4b
-	.8byte	.LVL1075
-	.4byte	0x169ea
-	.uleb128 0x4b
-	.8byte	.LVL1086
-	.4byte	0x169f5
-	.uleb128 0x4b
-	.8byte	.LVL1087
-	.4byte	0x16a2c
-	.uleb128 0x4b
-	.8byte	.LVL1180
-	.4byte	0x16a20
-	.uleb128 0x4b
-	.8byte	.LVL1181
-	.4byte	0x16a37
-	.uleb128 0x4b
-	.8byte	.LVL1182
-	.4byte	0x16a20
-	.uleb128 0x4b
-	.8byte	.LVL1204
-	.4byte	0x16a20
+	.8byte	.LVL1035
+	.4byte	0x16bc3
 	.byte	0
 	.byte	0
-	.uleb128 0x58
-	.4byte	0xff48
-	.8byte	.LBB1935
-	.4byte	.Ldebug_ranges0+0x1590
-	.byte	0x1
-	.2byte	0xe6e
-	.4byte	0xf984
-	.uleb128 0x51
-	.4byte	0xff59
-	.uleb128 0x5b
-	.4byte	.Ldebug_ranges0+0x1590
-	.uleb128 0x5e
-	.4byte	0xff65
-	.uleb128 0x3
-	.byte	0x91
-	.sleb128 -104
+	.byte	0
 	.uleb128 0x50
-	.4byte	0x15ed2
+	.4byte	0x15d6d
+	.8byte	.LBB1904
+	.8byte	.LBE1904-.LBB1904
+	.byte	0x1
+	.2byte	0xb32
+	.4byte	0xed20
+	.uleb128 0x51
+	.4byte	0x15d95
+	.uleb128 0x51
+	.4byte	0x15d89
+	.uleb128 0x51
+	.4byte	0x15d7e
+	.uleb128 0x5a
+	.4byte	0x15da2
+	.8byte	.LBB1905
+	.8byte	.LBE1905-.LBB1905
+	.byte	0xd
+	.2byte	0x49c
+	.uleb128 0x51
+	.4byte	0x15dd6
+	.uleb128 0x51
+	.4byte	0x15dca
+	.uleb128 0x51
+	.4byte	0x15dbe
+	.uleb128 0x51
+	.4byte	0x15db3
+	.uleb128 0x53
+	.8byte	.LBB1906
+	.8byte	.LBE1906-.LBB1906
+	.uleb128 0x54
+	.4byte	0x15de1
+	.uleb128 0x4b
+	.8byte	.LVL1036
+	.4byte	0x16bc3
+	.byte	0
+	.byte	0
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x15d6d
+	.8byte	.LBB1907
+	.8byte	.LBE1907-.LBB1907
+	.byte	0x1
+	.2byte	0xb35
+	.4byte	0xed9d
+	.uleb128 0x51
+	.4byte	0x15d95
+	.uleb128 0x51
+	.4byte	0x15d89
+	.uleb128 0x51
+	.4byte	0x15d7e
+	.uleb128 0x5a
+	.4byte	0x15da2
+	.8byte	.LBB1908
+	.8byte	.LBE1908-.LBB1908
+	.byte	0xd
+	.2byte	0x49c
+	.uleb128 0x51
+	.4byte	0x15dd6
+	.uleb128 0x51
+	.4byte	0x15dca
+	.uleb128 0x51
+	.4byte	0x15dbe
+	.uleb128 0x51
+	.4byte	0x15db3
+	.uleb128 0x53
+	.8byte	.LBB1909
+	.8byte	.LBE1909-.LBB1909
+	.uleb128 0x54
+	.4byte	0x15de1
+	.uleb128 0x4b
+	.8byte	.LVL1037
+	.4byte	0x16bc3
+	.byte	0
+	.byte	0
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x15d6d
+	.8byte	.LBB1910
+	.8byte	.LBE1910-.LBB1910
+	.byte	0x1
+	.2byte	0xb38
+	.4byte	0xee1a
+	.uleb128 0x51
+	.4byte	0x15d95
+	.uleb128 0x51
+	.4byte	0x15d89
+	.uleb128 0x51
+	.4byte	0x15d7e
+	.uleb128 0x5a
+	.4byte	0x15da2
+	.8byte	.LBB1911
+	.8byte	.LBE1911-.LBB1911
+	.byte	0xd
+	.2byte	0x49c
+	.uleb128 0x51
+	.4byte	0x15dd6
+	.uleb128 0x51
+	.4byte	0x15dca
+	.uleb128 0x51
+	.4byte	0x15dbe
+	.uleb128 0x51
+	.4byte	0x15db3
+	.uleb128 0x53
+	.8byte	.LBB1912
+	.8byte	.LBE1912-.LBB1912
+	.uleb128 0x54
+	.4byte	0x15de1
+	.uleb128 0x4b
+	.8byte	.LVL1038
+	.4byte	0x16bc3
+	.byte	0
+	.byte	0
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x15d6d
+	.8byte	.LBB1913
+	.8byte	.LBE1913-.LBB1913
+	.byte	0x1
+	.2byte	0xb3b
+	.4byte	0xee97
+	.uleb128 0x51
+	.4byte	0x15d95
+	.uleb128 0x51
+	.4byte	0x15d89
+	.uleb128 0x51
+	.4byte	0x15d7e
+	.uleb128 0x5a
+	.4byte	0x15da2
+	.8byte	.LBB1914
+	.8byte	.LBE1914-.LBB1914
+	.byte	0xd
+	.2byte	0x49c
+	.uleb128 0x51
+	.4byte	0x15dd6
+	.uleb128 0x51
+	.4byte	0x15dca
+	.uleb128 0x51
+	.4byte	0x15dbe
+	.uleb128 0x51
+	.4byte	0x15db3
+	.uleb128 0x53
+	.8byte	.LBB1915
+	.8byte	.LBE1915-.LBB1915
+	.uleb128 0x54
+	.4byte	0x15de1
+	.uleb128 0x4b
+	.8byte	.LVL1039
+	.4byte	0x16bc3
+	.byte	0
+	.byte	0
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x15d6d
+	.8byte	.LBB1916
+	.8byte	.LBE1916-.LBB1916
+	.byte	0x1
+	.2byte	0xb3e
+	.4byte	0xef14
+	.uleb128 0x51
+	.4byte	0x15d95
+	.uleb128 0x51
+	.4byte	0x15d89
+	.uleb128 0x51
+	.4byte	0x15d7e
+	.uleb128 0x5a
+	.4byte	0x15da2
+	.8byte	.LBB1917
+	.8byte	.LBE1917-.LBB1917
+	.byte	0xd
+	.2byte	0x49c
+	.uleb128 0x51
+	.4byte	0x15dd6
+	.uleb128 0x51
+	.4byte	0x15dca
+	.uleb128 0x51
+	.4byte	0x15dbe
+	.uleb128 0x51
+	.4byte	0x15db3
+	.uleb128 0x53
+	.8byte	.LBB1918
+	.8byte	.LBE1918-.LBB1918
+	.uleb128 0x54
+	.4byte	0x15de1
+	.uleb128 0x4b
+	.8byte	.LVL1040
+	.4byte	0x16bc3
+	.byte	0
+	.byte	0
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x15d6d
+	.8byte	.LBB1919
+	.8byte	.LBE1919-.LBB1919
+	.byte	0x1
+	.2byte	0xb41
+	.4byte	0xef91
+	.uleb128 0x51
+	.4byte	0x15d95
+	.uleb128 0x51
+	.4byte	0x15d89
+	.uleb128 0x51
+	.4byte	0x15d7e
+	.uleb128 0x5a
+	.4byte	0x15da2
+	.8byte	.LBB1920
+	.8byte	.LBE1920-.LBB1920
+	.byte	0xd
+	.2byte	0x49c
+	.uleb128 0x51
+	.4byte	0x15dd6
+	.uleb128 0x51
+	.4byte	0x15dca
+	.uleb128 0x51
+	.4byte	0x15dbe
+	.uleb128 0x51
+	.4byte	0x15db3
+	.uleb128 0x53
+	.8byte	.LBB1921
+	.8byte	.LBE1921-.LBB1921
+	.uleb128 0x54
+	.4byte	0x15de1
+	.uleb128 0x4b
+	.8byte	.LVL1041
+	.4byte	0x16bc3
+	.byte	0
+	.byte	0
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x15d6d
+	.8byte	.LBB1922
+	.8byte	.LBE1922-.LBB1922
+	.byte	0x1
+	.2byte	0xb44
+	.4byte	0xf00e
+	.uleb128 0x51
+	.4byte	0x15d95
+	.uleb128 0x51
+	.4byte	0x15d89
+	.uleb128 0x51
+	.4byte	0x15d7e
+	.uleb128 0x5a
+	.4byte	0x15da2
+	.8byte	.LBB1923
+	.8byte	.LBE1923-.LBB1923
+	.byte	0xd
+	.2byte	0x49c
+	.uleb128 0x51
+	.4byte	0x15dd6
+	.uleb128 0x51
+	.4byte	0x15dca
+	.uleb128 0x51
+	.4byte	0x15dbe
+	.uleb128 0x51
+	.4byte	0x15db3
+	.uleb128 0x53
+	.8byte	.LBB1924
+	.8byte	.LBE1924-.LBB1924
+	.uleb128 0x54
+	.4byte	0x15de1
+	.uleb128 0x4b
+	.8byte	.LVL1042
+	.4byte	0x16bc3
+	.byte	0
+	.byte	0
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x15d6d
+	.8byte	.LBB1925
+	.8byte	.LBE1925-.LBB1925
+	.byte	0x1
+	.2byte	0xb47
+	.4byte	0xf08b
+	.uleb128 0x51
+	.4byte	0x15d95
+	.uleb128 0x51
+	.4byte	0x15d89
+	.uleb128 0x51
+	.4byte	0x15d7e
+	.uleb128 0x5a
+	.4byte	0x15da2
+	.8byte	.LBB1926
+	.8byte	.LBE1926-.LBB1926
+	.byte	0xd
+	.2byte	0x49c
+	.uleb128 0x51
+	.4byte	0x15dd6
+	.uleb128 0x51
+	.4byte	0x15dca
+	.uleb128 0x51
+	.4byte	0x15dbe
+	.uleb128 0x51
+	.4byte	0x15db3
+	.uleb128 0x53
+	.8byte	.LBB1927
+	.8byte	.LBE1927-.LBB1927
+	.uleb128 0x54
+	.4byte	0x15de1
+	.uleb128 0x4b
+	.8byte	.LVL1043
+	.4byte	0x16bc3
+	.byte	0
+	.byte	0
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x15d6d
+	.8byte	.LBB1928
+	.8byte	.LBE1928-.LBB1928
+	.byte	0x1
+	.2byte	0xb4a
+	.4byte	0xf108
+	.uleb128 0x51
+	.4byte	0x15d95
+	.uleb128 0x51
+	.4byte	0x15d89
+	.uleb128 0x51
+	.4byte	0x15d7e
+	.uleb128 0x5a
+	.4byte	0x15da2
+	.8byte	.LBB1929
+	.8byte	.LBE1929-.LBB1929
+	.byte	0xd
+	.2byte	0x49c
+	.uleb128 0x51
+	.4byte	0x15dd6
+	.uleb128 0x51
+	.4byte	0x15dca
+	.uleb128 0x51
+	.4byte	0x15dbe
+	.uleb128 0x51
+	.4byte	0x15db3
+	.uleb128 0x53
+	.8byte	.LBB1930
+	.8byte	.LBE1930-.LBB1930
+	.uleb128 0x54
+	.4byte	0x15de1
+	.uleb128 0x4b
+	.8byte	.LVL1044
+	.4byte	0x16bc3
+	.byte	0
+	.byte	0
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x15d6d
+	.8byte	.LBB1931
+	.8byte	.LBE1931-.LBB1931
+	.byte	0x1
+	.2byte	0xb4d
+	.4byte	0xf185
+	.uleb128 0x51
+	.4byte	0x15d95
+	.uleb128 0x51
+	.4byte	0x15d89
+	.uleb128 0x51
+	.4byte	0x15d7e
+	.uleb128 0x5a
+	.4byte	0x15da2
+	.8byte	.LBB1932
+	.8byte	.LBE1932-.LBB1932
+	.byte	0xd
+	.2byte	0x49c
+	.uleb128 0x51
+	.4byte	0x15dd6
+	.uleb128 0x51
+	.4byte	0x15dca
+	.uleb128 0x51
+	.4byte	0x15dbe
+	.uleb128 0x51
+	.4byte	0x15db3
+	.uleb128 0x53
+	.8byte	.LBB1933
+	.8byte	.LBE1933-.LBB1933
+	.uleb128 0x54
+	.4byte	0x15de1
+	.uleb128 0x4b
+	.8byte	.LVL1045
+	.4byte	0x16bc3
+	.byte	0
+	.byte	0
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x15d6d
+	.8byte	.LBB1934
+	.8byte	.LBE1934-.LBB1934
+	.byte	0x1
+	.2byte	0xb50
+	.4byte	0xf202
+	.uleb128 0x51
+	.4byte	0x15d95
+	.uleb128 0x51
+	.4byte	0x15d89
+	.uleb128 0x51
+	.4byte	0x15d7e
+	.uleb128 0x5a
+	.4byte	0x15da2
+	.8byte	.LBB1935
+	.8byte	.LBE1935-.LBB1935
+	.byte	0xd
+	.2byte	0x49c
+	.uleb128 0x51
+	.4byte	0x15dd6
+	.uleb128 0x51
+	.4byte	0x15dca
+	.uleb128 0x51
+	.4byte	0x15dbe
+	.uleb128 0x51
+	.4byte	0x15db3
+	.uleb128 0x53
+	.8byte	.LBB1936
+	.8byte	.LBE1936-.LBB1936
+	.uleb128 0x54
+	.4byte	0x15de1
+	.uleb128 0x4b
+	.8byte	.LVL1046
+	.4byte	0x16bc3
+	.byte	0
+	.byte	0
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x15d6d
 	.8byte	.LBB1937
 	.8byte	.LBE1937-.LBB1937
 	.byte	0x1
-	.2byte	0xd75
-	.4byte	0xf83e
+	.2byte	0xb53
+	.4byte	0xf27f
 	.uleb128 0x51
-	.4byte	0x15ee7
+	.4byte	0x15d95
 	.uleb128 0x51
-	.4byte	0x15ede
-	.uleb128 0x53
+	.4byte	0x15d89
+	.uleb128 0x51
+	.4byte	0x15d7e
+	.uleb128 0x5a
+	.4byte	0x15da2
 	.8byte	.LBB1938
 	.8byte	.LBE1938-.LBB1938
-	.uleb128 0x5d
-	.4byte	0x15ef0
-	.4byte	.LLST301
-	.uleb128 0x5d
-	.4byte	0x15efa
-	.4byte	.LLST302
-	.byte	0
-	.byte	0
-	.uleb128 0x50
-	.4byte	0x15ed2
+	.byte	0xd
+	.2byte	0x49c
+	.uleb128 0x51
+	.4byte	0x15dd6
+	.uleb128 0x51
+	.4byte	0x15dca
+	.uleb128 0x51
+	.4byte	0x15dbe
+	.uleb128 0x51
+	.4byte	0x15db3
+	.uleb128 0x53
 	.8byte	.LBB1939
 	.8byte	.LBE1939-.LBB1939
-	.byte	0x1
-	.2byte	0xd7e
-	.4byte	0xf889
-	.uleb128 0x51
-	.4byte	0x15ee7
-	.uleb128 0x51
-	.4byte	0x15ede
-	.uleb128 0x53
+	.uleb128 0x54
+	.4byte	0x15de1
+	.uleb128 0x4b
+	.8byte	.LVL1047
+	.4byte	0x16bc3
+	.byte	0
+	.byte	0
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x15d6d
 	.8byte	.LBB1940
 	.8byte	.LBE1940-.LBB1940
-	.uleb128 0x5d
-	.4byte	0x15ef0
-	.4byte	.LLST303
-	.uleb128 0x5d
-	.4byte	0x15efa
-	.4byte	.LLST304
-	.byte	0
-	.byte	0
-	.uleb128 0x5f
+	.byte	0x1
+	.2byte	0xb56
+	.4byte	0xf2fc
+	.uleb128 0x51
+	.4byte	0x15d95
+	.uleb128 0x51
+	.4byte	0x15d89
+	.uleb128 0x51
+	.4byte	0x15d7e
+	.uleb128 0x5a
+	.4byte	0x15da2
 	.8byte	.LBB1941
 	.8byte	.LBE1941-.LBB1941
-	.4byte	0xf8c2
-	.uleb128 0x5d
-	.4byte	0xff72
-	.4byte	.LLST305
-	.uleb128 0x4b
-	.8byte	.LVL1101
-	.4byte	0x16a42
-	.uleb128 0x4b
-	.8byte	.LVL1103
-	.4byte	0x16a4d
-	.byte	0
-	.uleb128 0x50
-	.4byte	0x15ed2
+	.byte	0xd
+	.2byte	0x49c
+	.uleb128 0x51
+	.4byte	0x15dd6
+	.uleb128 0x51
+	.4byte	0x15dca
+	.uleb128 0x51
+	.4byte	0x15dbe
+	.uleb128 0x51
+	.4byte	0x15db3
+	.uleb128 0x53
 	.8byte	.LBB1942
 	.8byte	.LBE1942-.LBB1942
-	.byte	0x1
-	.2byte	0xd89
-	.4byte	0xf90d
-	.uleb128 0x51
-	.4byte	0x15ee7
-	.uleb128 0x51
-	.4byte	0x15ede
-	.uleb128 0x53
+	.uleb128 0x54
+	.4byte	0x15de1
+	.uleb128 0x4b
+	.8byte	.LVL1048
+	.4byte	0x16bc3
+	.byte	0
+	.byte	0
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x15d6d
 	.8byte	.LBB1943
 	.8byte	.LBE1943-.LBB1943
-	.uleb128 0x5d
-	.4byte	0x15ef0
-	.4byte	.LLST306
-	.uleb128 0x5d
-	.4byte	0x15efa
-	.4byte	.LLST307
+	.byte	0x1
+	.2byte	0xb59
+	.4byte	0xf379
+	.uleb128 0x51
+	.4byte	0x15d95
+	.uleb128 0x51
+	.4byte	0x15d89
+	.uleb128 0x51
+	.4byte	0x15d7e
+	.uleb128 0x5a
+	.4byte	0x15da2
+	.8byte	.LBB1944
+	.8byte	.LBE1944-.LBB1944
+	.byte	0xd
+	.2byte	0x49c
+	.uleb128 0x51
+	.4byte	0x15dd6
+	.uleb128 0x51
+	.4byte	0x15dca
+	.uleb128 0x51
+	.4byte	0x15dbe
+	.uleb128 0x51
+	.4byte	0x15db3
+	.uleb128 0x53
+	.8byte	.LBB1945
+	.8byte	.LBE1945-.LBB1945
+	.uleb128 0x54
+	.4byte	0x15de1
+	.uleb128 0x4b
+	.8byte	.LVL1049
+	.4byte	0x16bc3
 	.byte	0
-	.byte	0
-	.uleb128 0x4b
-	.8byte	.LVL1088
-	.4byte	0x16a42
-	.uleb128 0x4b
-	.8byte	.LVL1089
-	.4byte	0x16a59
-	.uleb128 0x4b
-	.8byte	.LVL1094
-	.4byte	0x16a42
-	.uleb128 0x4b
-	.8byte	.LVL1095
-	.4byte	0x16a59
-	.uleb128 0x4b
-	.8byte	.LVL1100
-	.4byte	0x169af
-	.uleb128 0x4b
-	.8byte	.LVL1104
-	.4byte	0x16a59
-	.uleb128 0x4b
-	.8byte	.LVL1183
-	.4byte	0x16a20
-	.uleb128 0x4b
-	.8byte	.LVL1186
-	.4byte	0x16a20
-	.uleb128 0x4b
-	.8byte	.LVL1191
-	.4byte	0x16a20
 	.byte	0
 	.byte	0
 	.uleb128 0x50
-	.4byte	0xff2e
+	.4byte	0x15d6d
+	.8byte	.LBB1946
+	.8byte	.LBE1946-.LBB1946
+	.byte	0x1
+	.2byte	0xb5c
+	.4byte	0xf3f6
+	.uleb128 0x51
+	.4byte	0x15d95
+	.uleb128 0x51
+	.4byte	0x15d89
+	.uleb128 0x51
+	.4byte	0x15d7e
+	.uleb128 0x5a
+	.4byte	0x15da2
 	.8byte	.LBB1947
 	.8byte	.LBE1947-.LBB1947
-	.byte	0x1
-	.2byte	0xe75
-	.4byte	0xfa1e
+	.byte	0xd
+	.2byte	0x49c
 	.uleb128 0x51
-	.4byte	0xff3b
-	.uleb128 0x58
-	.4byte	0x158c2
-	.8byte	.LBB1949
-	.4byte	.Ldebug_ranges0+0x15e0
-	.byte	0x1
-	.2byte	0xda0
-	.4byte	0xf9e9
+	.4byte	0x15dd6
 	.uleb128 0x51
-	.4byte	0x158e4
+	.4byte	0x15dca
 	.uleb128 0x51
-	.4byte	0x158d9
+	.4byte	0x15dbe
 	.uleb128 0x51
-	.4byte	0x158ce
-	.uleb128 0x5b
-	.4byte	.Ldebug_ranges0+0x15e0
-	.uleb128 0x5d
-	.4byte	0x158ef
-	.4byte	.LLST308
-	.uleb128 0x4b
-	.8byte	.LVL1110
-	.4byte	0x16a65
-	.byte	0
-	.byte	0
-	.uleb128 0x4b
-	.8byte	.LVL1111
-	.4byte	0x16a70
-	.uleb128 0x4b
-	.8byte	.LVL1112
-	.4byte	0x16a7b
-	.uleb128 0x4b
-	.8byte	.LVL1113
-	.4byte	0x16a70
-	.uleb128 0x4b
-	.8byte	.LVL1114
-	.4byte	0x16a7b
-	.byte	0
-	.uleb128 0x58
-	.4byte	0xfe8c
-	.8byte	.LBB1957
-	.4byte	.Ldebug_ranges0+0x1630
-	.byte	0x1
-	.2byte	0xe78
-	.4byte	0xfcc1
-	.uleb128 0x51
-	.4byte	0xfea9
-	.uleb128 0x51
-	.4byte	0xfe9d
-	.uleb128 0x5b
-	.4byte	.Ldebug_ranges0+0x1630
+	.4byte	0x15db3
+	.uleb128 0x53
+	.8byte	.LBB1948
+	.8byte	.LBE1948-.LBB1948
 	.uleb128 0x54
-	.4byte	0xfeb5
-	.uleb128 0x5d
-	.4byte	0xfec1
-	.4byte	.LLST309
-	.uleb128 0x5d
-	.4byte	0xfecd
-	.4byte	.LLST310
-	.uleb128 0x5d
-	.4byte	0xfed9
-	.4byte	.LLST311
-	.uleb128 0x5d
-	.4byte	0xfee5
-	.4byte	.LLST312
-	.uleb128 0x5d
-	.4byte	0xfef1
-	.4byte	.LLST313
-	.uleb128 0x5d
-	.4byte	0xfefd
-	.4byte	.LLST314
-	.uleb128 0x54
-	.4byte	0xff09
-	.uleb128 0x5d
-	.4byte	0xff15
-	.4byte	.LLST315
-	.uleb128 0x5d
-	.4byte	0xff21
-	.4byte	.LLST316
+	.4byte	0x15de1
+	.uleb128 0x4b
+	.8byte	.LVL1050
+	.4byte	0x16bc3
+	.byte	0
+	.byte	0
+	.byte	0
 	.uleb128 0x50
-	.4byte	0x11ea0
+	.4byte	0x15d6d
+	.8byte	.LBB1949
+	.8byte	.LBE1949-.LBB1949
+	.byte	0x1
+	.2byte	0xb5f
+	.4byte	0xf473
+	.uleb128 0x51
+	.4byte	0x15d95
+	.uleb128 0x51
+	.4byte	0x15d89
+	.uleb128 0x51
+	.4byte	0x15d7e
+	.uleb128 0x5a
+	.4byte	0x15da2
+	.8byte	.LBB1950
+	.8byte	.LBE1950-.LBB1950
+	.byte	0xd
+	.2byte	0x49c
+	.uleb128 0x51
+	.4byte	0x15dd6
+	.uleb128 0x51
+	.4byte	0x15dca
+	.uleb128 0x51
+	.4byte	0x15dbe
+	.uleb128 0x51
+	.4byte	0x15db3
+	.uleb128 0x53
+	.8byte	.LBB1951
+	.8byte	.LBE1951-.LBB1951
+	.uleb128 0x54
+	.4byte	0x15de1
+	.uleb128 0x4b
+	.8byte	.LVL1051
+	.4byte	0x16bc3
+	.byte	0
+	.byte	0
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x15d6d
+	.8byte	.LBB1952
+	.8byte	.LBE1952-.LBB1952
+	.byte	0x1
+	.2byte	0xb62
+	.4byte	0xf4f0
+	.uleb128 0x51
+	.4byte	0x15d95
+	.uleb128 0x51
+	.4byte	0x15d89
+	.uleb128 0x51
+	.4byte	0x15d7e
+	.uleb128 0x5a
+	.4byte	0x15da2
+	.8byte	.LBB1953
+	.8byte	.LBE1953-.LBB1953
+	.byte	0xd
+	.2byte	0x49c
+	.uleb128 0x51
+	.4byte	0x15dd6
+	.uleb128 0x51
+	.4byte	0x15dca
+	.uleb128 0x51
+	.4byte	0x15dbe
+	.uleb128 0x51
+	.4byte	0x15db3
+	.uleb128 0x53
+	.8byte	.LBB1954
+	.8byte	.LBE1954-.LBB1954
+	.uleb128 0x54
+	.4byte	0x15de1
+	.uleb128 0x4b
+	.8byte	.LVL1052
+	.4byte	0x16bc3
+	.byte	0
+	.byte	0
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x15d6d
+	.8byte	.LBB1955
+	.8byte	.LBE1955-.LBB1955
+	.byte	0x1
+	.2byte	0xb65
+	.4byte	0xf56d
+	.uleb128 0x51
+	.4byte	0x15d95
+	.uleb128 0x51
+	.4byte	0x15d89
+	.uleb128 0x51
+	.4byte	0x15d7e
+	.uleb128 0x5a
+	.4byte	0x15da2
+	.8byte	.LBB1956
+	.8byte	.LBE1956-.LBB1956
+	.byte	0xd
+	.2byte	0x49c
+	.uleb128 0x51
+	.4byte	0x15dd6
+	.uleb128 0x51
+	.4byte	0x15dca
+	.uleb128 0x51
+	.4byte	0x15dbe
+	.uleb128 0x51
+	.4byte	0x15db3
+	.uleb128 0x53
+	.8byte	.LBB1957
+	.8byte	.LBE1957-.LBB1957
+	.uleb128 0x54
+	.4byte	0x15de1
+	.uleb128 0x4b
+	.8byte	.LVL1053
+	.4byte	0x16bc3
+	.byte	0
+	.byte	0
+	.byte	0
+	.uleb128 0x5a
+	.4byte	0x15d6d
+	.8byte	.LBB1958
+	.8byte	.LBE1958-.LBB1958
+	.byte	0x1
+	.2byte	0xb68
+	.uleb128 0x51
+	.4byte	0x15d95
+	.uleb128 0x51
+	.4byte	0x15d89
+	.uleb128 0x51
+	.4byte	0x15d7e
+	.uleb128 0x5a
+	.4byte	0x15da2
 	.8byte	.LBB1959
 	.8byte	.LBE1959-.LBB1959
-	.byte	0x1
-	.2byte	0xdd8
-	.4byte	0xfb00
+	.byte	0xd
+	.2byte	0x49c
 	.uleb128 0x51
-	.4byte	0x11eb1
+	.4byte	0x15dd6
 	.uleb128 0x51
-	.4byte	0x11eb1
+	.4byte	0x15dca
+	.uleb128 0x51
+	.4byte	0x15dbe
+	.uleb128 0x51
+	.4byte	0x15db3
 	.uleb128 0x53
 	.8byte	.LBB1960
 	.8byte	.LBE1960-.LBB1960
+	.uleb128 0x54
+	.4byte	0x15de1
+	.uleb128 0x4b
+	.8byte	.LVL1054
+	.4byte	0x16bc3
+	.byte	0
+	.byte	0
+	.byte	0
+	.byte	0
+	.byte	0
+	.uleb128 0x58
+	.4byte	0xff72
+	.8byte	.LBB1967
+	.4byte	.Ldebug_ranges0+0x1510
+	.byte	0x1
+	.2byte	0xe6c
+	.4byte	0xf6e1
+	.uleb128 0x51
+	.4byte	0xff83
+	.uleb128 0x5b
+	.4byte	.Ldebug_ranges0+0x1510
 	.uleb128 0x5d
-	.4byte	0x11ebd
-	.4byte	.LLST317
-	.uleb128 0x4b
-	.8byte	.LVL1129
-	.4byte	0x16a86
-	.uleb128 0x4b
-	.8byte	.LVL1131
-	.4byte	0x16a15
-	.uleb128 0x4b
-	.8byte	.LVL1132
-	.4byte	0x16a91
-	.byte	0
-	.byte	0
-	.uleb128 0x50
-	.4byte	0x15a3f
-	.8byte	.LBB1961
-	.8byte	.LBE1961-.LBB1961
+	.4byte	0xff8f
+	.4byte	.LLST306
+	.uleb128 0x54
+	.4byte	0xff9b
+	.uleb128 0x54
+	.4byte	0xffa7
+	.uleb128 0x54
+	.4byte	0xffb3
+	.uleb128 0x5e
+	.4byte	0xffbf
+	.uleb128 0x3
+	.byte	0x91
+	.sleb128 -104
+	.uleb128 0x54
+	.4byte	0xffc9
+	.uleb128 0x54
+	.4byte	0xffd5
+	.uleb128 0x54
+	.4byte	0xffe1
+	.uleb128 0x54
+	.4byte	0xffeb
+	.uleb128 0x58
+	.4byte	0x15e80
+	.8byte	.LBB1969
+	.4byte	.Ldebug_ranges0+0x1590
 	.byte	0x1
-	.2byte	0xdcc
-	.4byte	0xfb57
+	.2byte	0xd46
+	.4byte	0xf65d
 	.uleb128 0x51
-	.4byte	0x15a5c
-	.uleb128 0x51
-	.4byte	0x15a50
-	.uleb128 0x5a
-	.4byte	0x15a69
-	.8byte	.LBB1962
-	.8byte	.LBE1962-.LBB1962
-	.byte	0x10
-	.2byte	0x2e7
-	.uleb128 0x51
-	.4byte	0x15a86
-	.uleb128 0x51
-	.4byte	0x15a7a
-	.uleb128 0x4b
-	.8byte	.LVL1153
-	.4byte	0x16a9c
-	.byte	0
-	.byte	0
-	.uleb128 0x50
-	.4byte	0x15a3f
-	.8byte	.LBB1964
-	.8byte	.LBE1964-.LBB1964
-	.byte	0x1
-	.2byte	0xdbe
-	.4byte	0xfbae
-	.uleb128 0x51
-	.4byte	0x15a5c
-	.uleb128 0x51
-	.4byte	0x15a50
-	.uleb128 0x5a
-	.4byte	0x15a69
-	.8byte	.LBB1965
-	.8byte	.LBE1965-.LBB1965
-	.byte	0x10
-	.2byte	0x2e7
-	.uleb128 0x51
-	.4byte	0x15a86
-	.uleb128 0x51
-	.4byte	0x15a7a
-	.uleb128 0x4b
-	.8byte	.LVL1159
-	.4byte	0x16a9c
-	.byte	0
+	.4byte	0x15e90
 	.byte	0
 	.uleb128 0x4b
-	.8byte	.LVL1116
-	.4byte	0x16aa8
+	.8byte	.LVL1056
+	.4byte	0x16bcf
 	.uleb128 0x4b
-	.8byte	.LVL1118
-	.4byte	0x16aa8
+	.8byte	.LVL1057
+	.4byte	0x16bdb
 	.uleb128 0x4b
-	.8byte	.LVL1120
-	.4byte	0x16ab3
+	.8byte	.LVL1058
+	.4byte	0x16be6
 	.uleb128 0x4b
-	.8byte	.LVL1124
-	.4byte	0x16ab3
+	.8byte	.LVL1059
+	.4byte	0x16bf1
 	.uleb128 0x4b
-	.8byte	.LVL1127
-	.4byte	0x169af
+	.8byte	.LVL1060
+	.4byte	0x16bfc
 	.uleb128 0x4b
-	.8byte	.LVL1128
-	.4byte	0x16abf
-	.uleb128 0x4b
-	.8byte	.LVL1133
-	.4byte	0x16aca
-	.uleb128 0x4b
-	.8byte	.LVL1134
-	.4byte	0x16aca
-	.uleb128 0x4b
-	.8byte	.LVL1150
-	.4byte	0x16ad5
-	.uleb128 0x4b
-	.8byte	.LVL1152
-	.4byte	0x169af
-	.uleb128 0x4b
-	.8byte	.LVL1156
-	.4byte	0x16ae0
-	.uleb128 0x4b
-	.8byte	.LVL1158
-	.4byte	0x169af
-	.uleb128 0x4b
-	.8byte	.LVL1163
-	.4byte	0x16ae0
-	.uleb128 0x4b
-	.8byte	.LVL1166
-	.4byte	0x16a86
-	.uleb128 0x4b
-	.8byte	.LVL1168
-	.4byte	0x16ae0
-	.uleb128 0x4b
-	.8byte	.LVL1169
-	.4byte	0x16a91
-	.uleb128 0x4b
-	.8byte	.LVL1172
-	.4byte	0x16a86
-	.uleb128 0x4b
-	.8byte	.LVL1174
-	.4byte	0x16ae0
-	.uleb128 0x4b
-	.8byte	.LVL1175
-	.4byte	0x16a91
-	.uleb128 0x4b
-	.8byte	.LVL1201
-	.4byte	0x16a20
-	.uleb128 0x4b
-	.8byte	.LVL1209
-	.4byte	0x16a20
-	.byte	0
-	.byte	0
-	.uleb128 0x50
-	.4byte	0x15b13
-	.8byte	.LBB1971
-	.8byte	.LBE1971-.LBB1971
-	.byte	0x1
-	.2byte	0xe7a
-	.4byte	0xfd0a
-	.uleb128 0x51
-	.4byte	0x15b2a
-	.uleb128 0x51
-	.4byte	0x15b1f
-	.uleb128 0x59
-	.4byte	0x15c15
-	.8byte	.LBB1972
-	.8byte	.LBE1972-.LBB1972
-	.byte	0xbd
-	.byte	0xde
-	.uleb128 0x51
-	.4byte	0x15c2e
-	.uleb128 0x51
-	.4byte	0x15c22
-	.byte	0
-	.byte	0
-	.uleb128 0x50
-	.4byte	0x1008c
-	.8byte	.LBB1974
-	.8byte	.LBE1974-.LBB1974
-	.byte	0x1
-	.2byte	0xe7d
-	.4byte	0xfdae
-	.uleb128 0x51
-	.4byte	0x1009d
-	.uleb128 0x4b
-	.8byte	.LVL1135
-	.4byte	0x16aea
+	.8byte	.LVL1061
+	.4byte	0x16bfc
 	.uleb128 0x4b
 	.8byte	.LVL1136
-	.4byte	0x16aea
+	.4byte	0x16c06
 	.uleb128 0x4b
-	.8byte	.LVL1137
-	.4byte	0x16af5
-	.uleb128 0x4b
-	.8byte	.LVL1138
-	.4byte	0x16af5
-	.uleb128 0x4b
-	.8byte	.LVL1139
-	.4byte	0x16af5
-	.uleb128 0x4b
-	.8byte	.LVL1140
-	.4byte	0x16af5
-	.uleb128 0x4b
-	.8byte	.LVL1141
-	.4byte	0x16af5
-	.uleb128 0x4b
-	.8byte	.LVL1142
-	.4byte	0x16af5
-	.uleb128 0x4b
-	.8byte	.LVL1143
-	.4byte	0x16af5
-	.uleb128 0x4b
-	.8byte	.LVL1144
-	.4byte	0x16af5
-	.byte	0
-	.uleb128 0x4b
-	.8byte	.LVL1019
-	.4byte	0x169de
-	.uleb128 0x4b
-	.8byte	.LVL1020
-	.4byte	0x16b01
-	.uleb128 0x4b
-	.8byte	.LVL1022
-	.4byte	0x16b0c
-	.uleb128 0x4b
-	.8byte	.LVL1028
-	.4byte	0x16b18
-	.uleb128 0x4b
-	.8byte	.LVL1031
-	.4byte	0x16b24
-	.uleb128 0x4b
-	.8byte	.LVL1032
-	.4byte	0x16a20
-	.uleb128 0x4b
-	.8byte	.LVL1040
-	.4byte	0x169af
-	.uleb128 0x4b
-	.8byte	.LVL1076
-	.4byte	0x16a20
-	.uleb128 0x4b
-	.8byte	.LVL1078
-	.4byte	0x16a20
-	.uleb128 0x4b
-	.8byte	.LVL1081
-	.4byte	0x16a20
-	.uleb128 0x4b
-	.8byte	.LVL1083
-	.4byte	0x16a20
-	.uleb128 0x4b
-	.8byte	.LVL1145
-	.4byte	0x169af
-	.uleb128 0x4b
-	.8byte	.LVL1148
-	.4byte	0x16a20
-	.uleb128 0x4b
-	.8byte	.LVL1178
-	.4byte	0x16a20
+	.8byte	.LVL1173
+	.4byte	0x16c06
 	.uleb128 0x4b
 	.8byte	.LVL1184
-	.4byte	0x16a20
+	.4byte	0x16c06
 	.uleb128 0x4b
-	.8byte	.LVL1194
-	.4byte	0x16a20
-	.uleb128 0x4b
-	.8byte	.LVL1203
-	.4byte	0x16b30
+	.8byte	.LVL1190
+	.4byte	0x16c06
 	.byte	0
-	.uleb128 0x60
-	.4byte	.LASF3041
+	.byte	0
+	.uleb128 0x58
+	.4byte	0xfff8
+	.8byte	.LBB1979
+	.4byte	.Ldebug_ranges0+0x15c0
+	.byte	0x1
+	.2byte	0xe73
+	.4byte	0xf7ba
+	.uleb128 0x51
+	.4byte	0x10009
+	.uleb128 0x5b
+	.4byte	.Ldebug_ranges0+0x15c0
+	.uleb128 0x54
+	.4byte	0x10015
+	.uleb128 0x5d
+	.4byte	0x10021
+	.4byte	.LLST307
+	.uleb128 0x54
+	.4byte	0x1002d
+	.uleb128 0x5e
+	.4byte	0x10039
+	.uleb128 0x3
+	.byte	0x91
+	.sleb128 -104
+	.uleb128 0x5d
+	.4byte	0x10043
+	.4byte	.LLST308
+	.uleb128 0x54
+	.4byte	0x1004f
+	.uleb128 0x54
+	.4byte	0x1005b
+	.uleb128 0x58
+	.4byte	0x15e80
+	.8byte	.LBB1981
+	.4byte	.Ldebug_ranges0+0x1620
+	.byte	0x1
+	.2byte	0xd10
+	.4byte	0xf750
+	.uleb128 0x51
+	.4byte	0x15e90
+	.byte	0
+	.uleb128 0x4b
+	.8byte	.LVL1063
+	.4byte	0x16bcf
+	.uleb128 0x4b
+	.8byte	.LVL1064
+	.4byte	0x16bdb
+	.uleb128 0x4b
+	.8byte	.LVL1075
+	.4byte	0x16be6
+	.uleb128 0x4b
+	.8byte	.LVL1076
+	.4byte	0x16c12
+	.uleb128 0x4b
+	.8byte	.LVL1169
+	.4byte	0x16c06
+	.uleb128 0x4b
+	.8byte	.LVL1170
+	.4byte	0x16c1d
+	.uleb128 0x4b
+	.8byte	.LVL1171
+	.4byte	0x16c06
+	.uleb128 0x4b
+	.8byte	.LVL1201
+	.4byte	0x16c06
+	.byte	0
+	.byte	0
+	.uleb128 0x58
+	.4byte	0xff3a
+	.8byte	.LBB1990
+	.4byte	.Ldebug_ranges0+0x1650
+	.byte	0x1
+	.2byte	0xe7a
+	.4byte	0xf976
+	.uleb128 0x51
+	.4byte	0xff4b
+	.uleb128 0x5b
+	.4byte	.Ldebug_ranges0+0x1650
+	.uleb128 0x5e
+	.4byte	0xff57
+	.uleb128 0x3
+	.byte	0x91
+	.sleb128 -104
+	.uleb128 0x50
+	.4byte	0x160c3
+	.8byte	.LBB1992
+	.8byte	.LBE1992-.LBB1992
+	.byte	0x1
+	.2byte	0xd80
+	.4byte	0xf830
+	.uleb128 0x51
+	.4byte	0x160d8
+	.uleb128 0x51
+	.4byte	0x160cf
+	.uleb128 0x53
+	.8byte	.LBB1993
+	.8byte	.LBE1993-.LBB1993
+	.uleb128 0x5d
+	.4byte	0x160e1
+	.4byte	.LLST309
+	.uleb128 0x5d
+	.4byte	0x160eb
+	.4byte	.LLST310
+	.byte	0
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x160c3
+	.8byte	.LBB1994
+	.8byte	.LBE1994-.LBB1994
+	.byte	0x1
+	.2byte	0xd89
+	.4byte	0xf87b
+	.uleb128 0x51
+	.4byte	0x160d8
+	.uleb128 0x51
+	.4byte	0x160cf
+	.uleb128 0x53
+	.8byte	.LBB1995
+	.8byte	.LBE1995-.LBB1995
+	.uleb128 0x5d
+	.4byte	0x160e1
+	.4byte	.LLST311
+	.uleb128 0x5d
+	.4byte	0x160eb
+	.4byte	.LLST312
+	.byte	0
+	.byte	0
+	.uleb128 0x5f
+	.8byte	.LBB1996
+	.8byte	.LBE1996-.LBB1996
+	.4byte	0xf8b4
+	.uleb128 0x5d
+	.4byte	0xff64
+	.4byte	.LLST313
+	.uleb128 0x4b
+	.8byte	.LVL1090
+	.4byte	0x16c28
+	.uleb128 0x4b
+	.8byte	.LVL1092
+	.4byte	0x16c33
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x160c3
+	.8byte	.LBB1997
+	.8byte	.LBE1997-.LBB1997
+	.byte	0x1
+	.2byte	0xd94
+	.4byte	0xf8ff
+	.uleb128 0x51
+	.4byte	0x160d8
+	.uleb128 0x51
+	.4byte	0x160cf
+	.uleb128 0x53
+	.8byte	.LBB1998
+	.8byte	.LBE1998-.LBB1998
+	.uleb128 0x5d
+	.4byte	0x160e1
+	.4byte	.LLST314
+	.uleb128 0x5d
+	.4byte	0x160eb
+	.4byte	.LLST315
+	.byte	0
+	.byte	0
+	.uleb128 0x4b
+	.8byte	.LVL1077
+	.4byte	0x16c28
+	.uleb128 0x4b
+	.8byte	.LVL1078
+	.4byte	0x16c3f
+	.uleb128 0x4b
+	.8byte	.LVL1083
+	.4byte	0x16c28
+	.uleb128 0x4b
+	.8byte	.LVL1084
+	.4byte	0x16c3f
+	.uleb128 0x4b
+	.8byte	.LVL1089
+	.4byte	0x16ba0
+	.uleb128 0x4b
+	.8byte	.LVL1093
+	.4byte	0x16c3f
+	.uleb128 0x4b
+	.8byte	.LVL1175
+	.4byte	0x16c06
+	.uleb128 0x4b
+	.8byte	.LVL1178
+	.4byte	0x16c06
+	.uleb128 0x4b
+	.8byte	.LVL1182
+	.4byte	0x16c06
+	.byte	0
+	.byte	0
+	.uleb128 0x50
+	.4byte	0xff20
+	.8byte	.LBB2002
+	.8byte	.LBE2002-.LBB2002
+	.byte	0x1
+	.2byte	0xe81
+	.4byte	0xfa10
+	.uleb128 0x51
+	.4byte	0xff2d
+	.uleb128 0x58
+	.4byte	0x15ab3
+	.8byte	.LBB2004
+	.4byte	.Ldebug_ranges0+0x16a0
 	.byte	0x1
 	.2byte	0xdac
+	.4byte	0xf9db
+	.uleb128 0x51
+	.4byte	0x15ad5
+	.uleb128 0x51
+	.4byte	0x15aca
+	.uleb128 0x51
+	.4byte	0x15abf
+	.uleb128 0x5b
+	.4byte	.Ldebug_ranges0+0x16a0
+	.uleb128 0x5d
+	.4byte	0x15ae0
+	.4byte	.LLST316
+	.uleb128 0x4b
+	.8byte	.LVL1099
+	.4byte	0x16c4b
+	.byte	0
+	.byte	0
+	.uleb128 0x4b
+	.8byte	.LVL1100
+	.4byte	0x16c56
+	.uleb128 0x4b
+	.8byte	.LVL1101
+	.4byte	0x16c61
+	.uleb128 0x4b
+	.8byte	.LVL1102
+	.4byte	0x16c56
+	.uleb128 0x4b
+	.8byte	.LVL1103
+	.4byte	0x16c61
+	.byte	0
+	.uleb128 0x58
+	.4byte	0xfe7e
+	.8byte	.LBB2008
+	.4byte	.Ldebug_ranges0+0x16d0
+	.byte	0x1
+	.2byte	0xe84
+	.4byte	0xfcb3
+	.uleb128 0x51
+	.4byte	0xfe9b
+	.uleb128 0x51
+	.4byte	0xfe8f
+	.uleb128 0x5b
+	.4byte	.Ldebug_ranges0+0x16d0
+	.uleb128 0x54
+	.4byte	0xfea7
+	.uleb128 0x5d
+	.4byte	0xfeb3
+	.4byte	.LLST317
+	.uleb128 0x5d
+	.4byte	0xfebf
+	.4byte	.LLST318
+	.uleb128 0x5d
+	.4byte	0xfecb
+	.4byte	.LLST319
+	.uleb128 0x5d
+	.4byte	0xfed7
+	.4byte	.LLST320
+	.uleb128 0x5d
+	.4byte	0xfee3
+	.4byte	.LLST321
+	.uleb128 0x5d
+	.4byte	0xfeef
+	.4byte	.LLST322
+	.uleb128 0x54
+	.4byte	0xfefb
+	.uleb128 0x5d
+	.4byte	0xff07
+	.4byte	.LLST323
+	.uleb128 0x5d
+	.4byte	0xff13
+	.4byte	.LLST324
+	.uleb128 0x50
+	.4byte	0x120bb
+	.8byte	.LBB2010
+	.8byte	.LBE2010-.LBB2010
+	.byte	0x1
+	.2byte	0xde4
+	.4byte	0xfaf2
+	.uleb128 0x51
+	.4byte	0x120cc
+	.uleb128 0x51
+	.4byte	0x120cc
+	.uleb128 0x53
+	.8byte	.LBB2011
+	.8byte	.LBE2011-.LBB2011
+	.uleb128 0x5d
+	.4byte	0x120d8
+	.4byte	.LLST325
+	.uleb128 0x4b
+	.8byte	.LVL1118
+	.4byte	0x16c6c
+	.uleb128 0x4b
+	.8byte	.LVL1120
+	.4byte	0x16c77
+	.uleb128 0x4b
+	.8byte	.LVL1121
+	.4byte	0x16c82
+	.byte	0
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x15c30
+	.8byte	.LBB2012
+	.8byte	.LBE2012-.LBB2012
+	.byte	0x1
+	.2byte	0xdca
+	.4byte	0xfb49
+	.uleb128 0x51
+	.4byte	0x15c4d
+	.uleb128 0x51
+	.4byte	0x15c41
+	.uleb128 0x5a
+	.4byte	0x15c5a
+	.8byte	.LBB2013
+	.8byte	.LBE2013-.LBB2013
+	.byte	0x10
+	.2byte	0x2e7
+	.uleb128 0x51
+	.4byte	0x15c77
+	.uleb128 0x51
+	.4byte	0x15c6b
+	.uleb128 0x4b
+	.8byte	.LVL1142
+	.4byte	0x16c8d
+	.byte	0
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x15c30
+	.8byte	.LBB2015
+	.8byte	.LBE2015-.LBB2015
+	.byte	0x1
+	.2byte	0xdd8
+	.4byte	0xfba0
+	.uleb128 0x51
+	.4byte	0x15c4d
+	.uleb128 0x51
+	.4byte	0x15c41
+	.uleb128 0x5a
+	.4byte	0x15c5a
+	.8byte	.LBB2016
+	.8byte	.LBE2016-.LBB2016
+	.byte	0x10
+	.2byte	0x2e7
+	.uleb128 0x51
+	.4byte	0x15c77
+	.uleb128 0x51
+	.4byte	0x15c6b
+	.uleb128 0x4b
+	.8byte	.LVL1155
+	.4byte	0x16c8d
+	.byte	0
+	.byte	0
+	.uleb128 0x4b
+	.8byte	.LVL1105
+	.4byte	0x16c99
+	.uleb128 0x4b
+	.8byte	.LVL1107
+	.4byte	0x16c99
+	.uleb128 0x4b
+	.8byte	.LVL1109
+	.4byte	0x16ca4
+	.uleb128 0x4b
+	.8byte	.LVL1113
+	.4byte	0x16ca4
+	.uleb128 0x4b
+	.8byte	.LVL1116
+	.4byte	0x16ba0
+	.uleb128 0x4b
+	.8byte	.LVL1117
+	.4byte	0x16cb0
+	.uleb128 0x4b
+	.8byte	.LVL1122
+	.4byte	0x16cbb
+	.uleb128 0x4b
+	.8byte	.LVL1123
+	.4byte	0x16cbb
+	.uleb128 0x4b
+	.8byte	.LVL1139
+	.4byte	0x16cc6
+	.uleb128 0x4b
+	.8byte	.LVL1141
+	.4byte	0x16ba0
+	.uleb128 0x4b
+	.8byte	.LVL1146
+	.4byte	0x16cd1
+	.uleb128 0x4b
+	.8byte	.LVL1149
+	.4byte	0x16c6c
+	.uleb128 0x4b
+	.8byte	.LVL1151
+	.4byte	0x16cd1
+	.uleb128 0x4b
+	.8byte	.LVL1152
+	.4byte	0x16c82
+	.uleb128 0x4b
+	.8byte	.LVL1154
+	.4byte	0x16ba0
+	.uleb128 0x4b
+	.8byte	.LVL1158
+	.4byte	0x16cd1
+	.uleb128 0x4b
+	.8byte	.LVL1161
+	.4byte	0x16c6c
+	.uleb128 0x4b
+	.8byte	.LVL1163
+	.4byte	0x16cd1
+	.uleb128 0x4b
+	.8byte	.LVL1164
+	.4byte	0x16c82
+	.uleb128 0x4b
+	.8byte	.LVL1196
+	.4byte	0x16c06
+	.uleb128 0x4b
+	.8byte	.LVL1199
+	.4byte	0x16c06
+	.byte	0
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x15d04
+	.8byte	.LBB2021
+	.8byte	.LBE2021-.LBB2021
+	.byte	0x1
+	.2byte	0xe86
+	.4byte	0xfcfc
+	.uleb128 0x51
+	.4byte	0x15d1b
+	.uleb128 0x51
+	.4byte	0x15d10
+	.uleb128 0x59
+	.4byte	0x15e06
+	.8byte	.LBB2022
+	.8byte	.LBE2022-.LBB2022
+	.byte	0xbd
+	.byte	0xe1
+	.uleb128 0x51
+	.4byte	0x15e1f
+	.uleb128 0x51
+	.4byte	0x15e13
+	.byte	0
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x1007e
+	.8byte	.LBB2024
+	.8byte	.LBE2024-.LBB2024
+	.byte	0x1
+	.2byte	0xe89
+	.4byte	0xfda0
+	.uleb128 0x51
+	.4byte	0x1008f
+	.uleb128 0x4b
+	.8byte	.LVL1124
+	.4byte	0x16cdb
+	.uleb128 0x4b
+	.8byte	.LVL1125
+	.4byte	0x16cdb
+	.uleb128 0x4b
+	.8byte	.LVL1126
+	.4byte	0x16ce6
+	.uleb128 0x4b
+	.8byte	.LVL1127
+	.4byte	0x16ce6
+	.uleb128 0x4b
+	.8byte	.LVL1128
+	.4byte	0x16ce6
+	.uleb128 0x4b
+	.8byte	.LVL1129
+	.4byte	0x16ce6
+	.uleb128 0x4b
+	.8byte	.LVL1130
+	.4byte	0x16ce6
+	.uleb128 0x4b
+	.8byte	.LVL1131
+	.4byte	0x16ce6
+	.uleb128 0x4b
+	.8byte	.LVL1132
+	.4byte	0x16ce6
+	.uleb128 0x4b
+	.8byte	.LVL1133
+	.4byte	0x16ce6
+	.byte	0
+	.uleb128 0x4b
+	.8byte	.LVL1009
+	.4byte	0x16bcf
+	.uleb128 0x4b
+	.8byte	.LVL1010
+	.4byte	0x16cf2
+	.uleb128 0x4b
+	.8byte	.LVL1012
+	.4byte	0x16cfd
+	.uleb128 0x4b
+	.8byte	.LVL1018
+	.4byte	0x16d09
+	.uleb128 0x4b
+	.8byte	.LVL1021
+	.4byte	0x16d15
+	.uleb128 0x4b
+	.8byte	.LVL1022
+	.4byte	0x16c06
+	.uleb128 0x4b
+	.8byte	.LVL1030
+	.4byte	0x16ba0
+	.uleb128 0x4b
+	.8byte	.LVL1065
+	.4byte	0x16c06
+	.uleb128 0x4b
+	.8byte	.LVL1067
+	.4byte	0x16c06
+	.uleb128 0x4b
+	.8byte	.LVL1070
+	.4byte	0x16c06
+	.uleb128 0x4b
+	.8byte	.LVL1072
+	.4byte	0x16c06
+	.uleb128 0x4b
+	.8byte	.LVL1134
+	.4byte	0x16ba0
+	.uleb128 0x4b
+	.8byte	.LVL1137
+	.4byte	0x16c06
+	.uleb128 0x4b
+	.8byte	.LVL1167
+	.4byte	0x16c06
+	.uleb128 0x4b
+	.8byte	.LVL1176
+	.4byte	0x16c06
+	.uleb128 0x4b
+	.8byte	.LVL1186
+	.4byte	0x16c06
+	.uleb128 0x4b
+	.8byte	.LVL1192
+	.4byte	0x16d21
+	.byte	0
+	.uleb128 0x60
+	.4byte	.LASF3040
+	.byte	0x1
+	.2byte	0xdb8
 	.4byte	0xc6
 	.byte	0x1
-	.4byte	0xff2e
+	.4byte	0xff20
 	.uleb128 0x61
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0xdac
-	.4byte	0xe4e5
+	.2byte	0xdb8
+	.4byte	0xe4d7
 	.uleb128 0x62
-	.4byte	.LASF2993
+	.4byte	.LASF2992
 	.byte	0x1
-	.2byte	0xdac
+	.2byte	0xdb8
 	.4byte	0xe0e4
 	.uleb128 0x43
 	.4byte	.LASF2943
 	.byte	0x1
-	.2byte	0xdae
-	.4byte	0xe82d
+	.2byte	0xdba
+	.4byte	0xe81f
+	.uleb128 0x43
+	.4byte	.LASF3032
+	.byte	0x1
+	.2byte	0xdbb
+	.4byte	0x6d
 	.uleb128 0x43
 	.4byte	.LASF3033
 	.byte	0x1
-	.2byte	0xdaf
+	.2byte	0xdbc
 	.4byte	0x6d
 	.uleb128 0x43
 	.4byte	.LASF3034
 	.byte	0x1
-	.2byte	0xdb0
-	.4byte	0x6d
+	.2byte	0xdbd
+	.4byte	0xc6
 	.uleb128 0x43
 	.4byte	.LASF3035
 	.byte	0x1
-	.2byte	0xdb1
+	.2byte	0xdbe
 	.4byte	0xc6
 	.uleb128 0x43
 	.4byte	.LASF3036
 	.byte	0x1
-	.2byte	0xdb2
-	.4byte	0xc6
+	.2byte	0xdbf
+	.4byte	0x21e
 	.uleb128 0x43
 	.4byte	.LASF3037
 	.byte	0x1
-	.2byte	0xdb3
-	.4byte	0x21e
-	.uleb128 0x43
-	.4byte	.LASF3038
-	.byte	0x1
-	.2byte	0xdb4
+	.2byte	0xdc0
 	.4byte	0x21e
 	.uleb128 0x4f
 	.string	"buf"
 	.byte	0x1
-	.2byte	0xdb5
-	.4byte	0xe480
+	.2byte	0xdc1
+	.4byte	0xe472
+	.uleb128 0x43
+	.4byte	.LASF3038
+	.byte	0x1
+	.2byte	0xdc2
+	.4byte	0x458
 	.uleb128 0x43
 	.4byte	.LASF3039
 	.byte	0x1
-	.2byte	0xdb6
-	.4byte	0x458
-	.uleb128 0x43
-	.4byte	.LASF3040
-	.byte	0x1
-	.2byte	0xdb7
+	.2byte	0xdc3
 	.4byte	0x458
 	.byte	0
 	.uleb128 0x63
-	.4byte	.LASF3061
+	.4byte	.LASF3060
 	.byte	0x1
-	.2byte	0xd8e
+	.2byte	0xd99
 	.byte	0x1
-	.4byte	0xff48
+	.4byte	0xff3a
 	.uleb128 0x62
 	.4byte	.LASF2943
 	.byte	0x1
-	.2byte	0xd8e
-	.4byte	0xe82d
+	.2byte	0xd99
+	.4byte	0xe81f
 	.byte	0
 	.uleb128 0x60
-	.4byte	.LASF3042
+	.4byte	.LASF3041
 	.byte	0x1
-	.2byte	0xd6b
+	.2byte	0xd76
 	.4byte	0xc6
 	.byte	0x1
-	.4byte	0xff80
+	.4byte	0xff72
 	.uleb128 0x62
 	.4byte	.LASF2943
 	.byte	0x1
-	.2byte	0xd6b
-	.4byte	0xe82d
+	.2byte	0xd76
+	.4byte	0xe81f
 	.uleb128 0x43
 	.4byte	.LASF2434
 	.byte	0x1
-	.2byte	0xd6d
+	.2byte	0xd78
 	.4byte	0xd740
 	.uleb128 0x64
 	.uleb128 0x4f
 	.string	"__k"
 	.byte	0x1
-	.2byte	0xd83
+	.2byte	0xd8e
 	.4byte	0x2eff
 	.byte	0
 	.byte	0
 	.uleb128 0x60
-	.4byte	.LASF3043
+	.4byte	.LASF3042
 	.byte	0x1
-	.2byte	0xd21
+	.2byte	0xd29
 	.4byte	0xc6
 	.byte	0x1
-	.4byte	0x10006
+	.4byte	0xfff8
 	.uleb128 0x61
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0xd21
-	.4byte	0xe4e5
+	.2byte	0xd29
+	.4byte	0xe4d7
 	.uleb128 0x4f
 	.string	"dev"
 	.byte	0x1
-	.2byte	0xd23
+	.2byte	0xd2b
 	.4byte	0xa496
 	.uleb128 0x43
-	.4byte	.LASF2993
+	.4byte	.LASF2992
 	.byte	0x1
-	.2byte	0xd24
+	.2byte	0xd2c
 	.4byte	0xe0e4
 	.uleb128 0x43
 	.4byte	.LASF2943
 	.byte	0x1
-	.2byte	0xd25
-	.4byte	0xe82d
+	.2byte	0xd2d
+	.4byte	0xe81f
 	.uleb128 0x43
-	.4byte	.LASF3044
+	.4byte	.LASF3043
 	.byte	0x1
-	.2byte	0xd26
+	.2byte	0xd2e
 	.4byte	0xb7ba
 	.uleb128 0x4f
 	.string	"r"
 	.byte	0x1
-	.2byte	0xd27
+	.2byte	0xd2f
 	.4byte	0x9672
 	.uleb128 0x43
-	.4byte	.LASF3045
+	.4byte	.LASF3044
 	.byte	0x1
-	.2byte	0xd28
+	.2byte	0xd30
 	.4byte	0xc6
 	.uleb128 0x4f
 	.string	"ret"
 	.byte	0x1
-	.2byte	0xd29
+	.2byte	0xd31
 	.4byte	0xc6
 	.uleb128 0x4f
 	.string	"i"
 	.byte	0x1
-	.2byte	0xd29
+	.2byte	0xd31
 	.4byte	0xc6
 	.uleb128 0x43
-	.4byte	.LASF3046
+	.4byte	.LASF3045
 	.byte	0x1
-	.2byte	0xd2a
+	.2byte	0xd32
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x60
-	.4byte	.LASF3047
+	.4byte	.LASF3046
 	.byte	0x1
-	.2byte	0xcf5
+	.2byte	0xcfd
 	.4byte	0xc6
 	.byte	0x1
-	.4byte	0x10077
+	.4byte	0x10069
 	.uleb128 0x62
 	.4byte	.LASF2943
 	.byte	0x1
-	.2byte	0xcf5
-	.4byte	0xe82d
+	.2byte	0xcfd
+	.4byte	0xe81f
 	.uleb128 0x4f
 	.string	"ret"
 	.byte	0x1
-	.2byte	0xcf7
+	.2byte	0xcff
 	.4byte	0xc6
 	.uleb128 0x4f
 	.string	"dev"
 	.byte	0x1
-	.2byte	0xcf8
+	.2byte	0xd00
 	.4byte	0xa496
 	.uleb128 0x43
-	.4byte	.LASF3044
+	.4byte	.LASF3043
 	.byte	0x1
-	.2byte	0xcf9
+	.2byte	0xd01
 	.4byte	0xb7ba
 	.uleb128 0x4f
 	.string	"r"
 	.byte	0x1
-	.2byte	0xcfa
+	.2byte	0xd02
 	.4byte	0x9672
 	.uleb128 0x43
 	.4byte	.LASF2950
 	.byte	0x1
-	.2byte	0xcfb
+	.2byte	0xd03
 	.4byte	0x29
 	.uleb128 0x43
 	.4byte	.LASF2951
 	.byte	0x1
-	.2byte	0xcfc
+	.2byte	0xd04
 	.4byte	0xc6
 	.uleb128 0x65
-	.4byte	.LASF3025
-	.4byte	0x10087
-	.4byte	.LASF3047
+	.4byte	.LASF3024
+	.4byte	0x10079
+	.4byte	.LASF3046
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x68
-	.4byte	0x10087
+	.4byte	0x10079
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x12
 	.byte	0
 	.uleb128 0x3
-	.4byte	0x10077
+	.4byte	0x10069
 	.uleb128 0x60
-	.4byte	.LASF3048
+	.4byte	.LASF3047
 	.byte	0x1
-	.2byte	0xce4
+	.2byte	0xcec
 	.4byte	0xc6
 	.byte	0x1
-	.4byte	0x100aa
+	.4byte	0x1009c
 	.uleb128 0x62
 	.4byte	.LASF2943
 	.byte	0x1
-	.2byte	0xce4
-	.4byte	0xe82d
+	.2byte	0xcec
+	.4byte	0xe81f
 	.byte	0
 	.uleb128 0x60
-	.4byte	.LASF3049
+	.4byte	.LASF3048
 	.byte	0x1
-	.2byte	0xcd1
+	.2byte	0xcd9
 	.4byte	0x2ee
 	.byte	0x1
-	.4byte	0x10102
+	.4byte	0x100f4
 	.uleb128 0x62
 	.4byte	.LASF2168
 	.byte	0x1
-	.2byte	0xcd1
+	.2byte	0xcd9
 	.4byte	0xa496
 	.uleb128 0x62
 	.4byte	.LASF2083
 	.byte	0x1
-	.2byte	0xcd2
+	.2byte	0xcda
 	.4byte	0xb311
 	.uleb128 0x61
 	.string	"buf"
 	.byte	0x1
-	.2byte	0xcd3
+	.2byte	0xcdb
 	.4byte	0x21e
 	.uleb128 0x43
-	.4byte	.LASF2993
+	.4byte	.LASF2992
 	.byte	0x1
-	.2byte	0xcd5
+	.2byte	0xcdd
 	.4byte	0xe0e4
 	.uleb128 0x43
 	.4byte	.LASF2943
 	.byte	0x1
-	.2byte	0xcd6
-	.4byte	0xe82d
+	.2byte	0xcde
+	.4byte	0xe81f
 	.uleb128 0x4f
 	.string	"i"
 	.byte	0x1
-	.2byte	0xcd7
+	.2byte	0xcdf
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x4c
-	.4byte	.LASF3050
+	.4byte	.LASF3049
 	.byte	0x1
-	.2byte	0xcc8
+	.2byte	0xcd0
 	.4byte	0x2ee
 	.8byte	.LFB2861
 	.8byte	.LFE2861-.LFB2861
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x10162
+	.4byte	0x10154
 	.uleb128 0x55
 	.4byte	.LASF2168
 	.byte	0x1
-	.2byte	0xcc8
+	.2byte	0xcd0
 	.4byte	0xa496
-	.4byte	.LLST204
+	.4byte	.LLST212
 	.uleb128 0x55
 	.4byte	.LASF2083
 	.byte	0x1
-	.2byte	0xcc9
+	.2byte	0xcd1
 	.4byte	0xb311
-	.4byte	.LLST205
+	.4byte	.LLST213
 	.uleb128 0x4e
 	.string	"buf"
 	.byte	0x1
-	.2byte	0xcca
+	.2byte	0xcd2
 	.4byte	0x21e
-	.4byte	.LLST206
+	.4byte	.LLST214
 	.uleb128 0x4b
-	.8byte	.LVL707
-	.4byte	0x16b3a
+	.8byte	.LVL704
+	.4byte	0x16d2b
 	.byte	0
 	.uleb128 0x4c
-	.4byte	.LASF3051
+	.4byte	.LASF3050
 	.byte	0x1
-	.2byte	0xcbf
+	.2byte	0xcc7
 	.4byte	0x2ee
 	.8byte	.LFB2860
 	.8byte	.LFE2860-.LFB2860
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x101c2
+	.4byte	0x101b4
 	.uleb128 0x55
 	.4byte	.LASF2168
 	.byte	0x1
-	.2byte	0xcbf
+	.2byte	0xcc7
 	.4byte	0xa496
-	.4byte	.LLST189
+	.4byte	.LLST197
 	.uleb128 0x55
 	.4byte	.LASF2083
 	.byte	0x1
-	.2byte	0xcc0
+	.2byte	0xcc8
 	.4byte	0xb311
-	.4byte	.LLST190
+	.4byte	.LLST198
 	.uleb128 0x4e
 	.string	"buf"
 	.byte	0x1
-	.2byte	0xcc1
+	.2byte	0xcc9
 	.4byte	0x21e
-	.4byte	.LLST191
+	.4byte	.LLST199
 	.uleb128 0x4b
-	.8byte	.LVL679
-	.4byte	0x16b45
+	.8byte	.LVL676
+	.4byte	0x16d36
 	.byte	0
 	.uleb128 0x4c
-	.4byte	.LASF3052
+	.4byte	.LASF3051
 	.byte	0x1
-	.2byte	0xcb6
+	.2byte	0xcbe
 	.4byte	0x2ee
 	.8byte	.LFB2859
 	.8byte	.LFE2859-.LFB2859
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x10222
+	.4byte	0x10214
 	.uleb128 0x55
 	.4byte	.LASF2168
 	.byte	0x1
-	.2byte	0xcb6
+	.2byte	0xcbe
 	.4byte	0xa496
-	.4byte	.LLST192
+	.4byte	.LLST200
 	.uleb128 0x55
 	.4byte	.LASF2083
 	.byte	0x1
-	.2byte	0xcb7
+	.2byte	0xcbf
 	.4byte	0xb311
-	.4byte	.LLST193
+	.4byte	.LLST201
 	.uleb128 0x4e
 	.string	"buf"
 	.byte	0x1
-	.2byte	0xcb8
+	.2byte	0xcc0
 	.4byte	0x21e
-	.4byte	.LLST194
+	.4byte	.LLST202
 	.uleb128 0x4b
-	.8byte	.LVL684
-	.4byte	0x16b45
+	.8byte	.LVL681
+	.4byte	0x16d36
 	.byte	0
 	.uleb128 0x4c
-	.4byte	.LASF3053
+	.4byte	.LASF3052
 	.byte	0x1
-	.2byte	0xc9e
+	.2byte	0xca6
 	.4byte	0x2ee
 	.8byte	.LFB2858
 	.8byte	.LFE2858-.LFB2858
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x102f2
+	.4byte	0x102e4
 	.uleb128 0x55
 	.4byte	.LASF2168
 	.byte	0x1
-	.2byte	0xc9e
+	.2byte	0xca6
 	.4byte	0xa496
-	.4byte	.LLST207
+	.4byte	.LLST215
 	.uleb128 0x55
 	.4byte	.LASF2083
 	.byte	0x1
-	.2byte	0xc9f
+	.2byte	0xca7
 	.4byte	0xb311
-	.4byte	.LLST208
+	.4byte	.LLST216
 	.uleb128 0x4e
 	.string	"buf"
 	.byte	0x1
-	.2byte	0xca0
+	.2byte	0xca8
 	.4byte	0x56
-	.4byte	.LLST209
+	.4byte	.LLST217
 	.uleb128 0x55
 	.4byte	.LASF383
 	.byte	0x1
-	.2byte	0xca0
+	.2byte	0xca8
 	.4byte	0x2e3
-	.4byte	.LLST210
+	.4byte	.LLST218
 	.uleb128 0x57
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0xca2
-	.4byte	0xe4e5
-	.4byte	.LLST211
+	.2byte	0xcaa
+	.4byte	0xe4d7
+	.4byte	.LLST219
 	.uleb128 0x56
 	.4byte	.LASF2424
 	.byte	0x1
-	.2byte	0xca3
+	.2byte	0xcab
 	.4byte	0xc6
-	.4byte	.LLST212
+	.4byte	.LLST220
 	.uleb128 0x4f
 	.string	"ret"
 	.byte	0x1
-	.2byte	0xca3
+	.2byte	0xcab
 	.4byte	0xc6
 	.uleb128 0x4b
-	.8byte	.LVL713
-	.4byte	0x16b51
+	.8byte	.LVL710
+	.4byte	0x16d42
 	.uleb128 0x4b
-	.8byte	.LVL715
-	.4byte	0x16b5d
+	.8byte	.LVL712
+	.4byte	0x16d4e
+	.uleb128 0x4b
+	.8byte	.LVL717
+	.4byte	0x16c06
 	.uleb128 0x4b
 	.8byte	.LVL720
-	.4byte	0x16a20
+	.4byte	0x16c06
 	.uleb128 0x4b
-	.8byte	.LVL723
-	.4byte	0x16a20
-	.uleb128 0x4b
-	.8byte	.LVL724
-	.4byte	0x16b30
+	.8byte	.LVL721
+	.4byte	0x16d21
 	.byte	0
 	.uleb128 0x4d
-	.4byte	.LASF3054
+	.4byte	.LASF3053
 	.byte	0x1
-	.2byte	0xc92
+	.2byte	0xc9a
 	.4byte	0x2ee
 	.8byte	.LFB2857
 	.8byte	.LFE2857-.LFB2857
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x1038c
+	.4byte	0x1037e
 	.uleb128 0x55
 	.4byte	.LASF2168
 	.byte	0x1
-	.2byte	0xc92
+	.2byte	0xc9a
 	.4byte	0xa496
-	.4byte	.LLST195
+	.4byte	.LLST203
 	.uleb128 0x55
 	.4byte	.LASF2083
 	.byte	0x1
-	.2byte	0xc93
+	.2byte	0xc9b
 	.4byte	0xb311
-	.4byte	.LLST196
+	.4byte	.LLST204
 	.uleb128 0x4e
 	.string	"buf"
 	.byte	0x1
-	.2byte	0xc94
+	.2byte	0xc9c
 	.4byte	0x21e
-	.4byte	.LLST197
+	.4byte	.LLST205
 	.uleb128 0x4f
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0xc96
-	.4byte	0xe4e5
+	.2byte	0xc9e
+	.4byte	0xe4d7
 	.uleb128 0x43
 	.4byte	.LASF2424
 	.byte	0x1
-	.2byte	0xc97
+	.2byte	0xc9f
 	.4byte	0xc6
 	.uleb128 0x50
-	.4byte	0x157eb
-	.8byte	.LBB1478
-	.8byte	.LBE1478-.LBB1478
+	.4byte	0x159dc
+	.8byte	.LBB1540
+	.8byte	.LBE1540-.LBB1540
 	.byte	0x1
-	.2byte	0xc99
-	.4byte	0x1037e
+	.2byte	0xca1
+	.4byte	0x10370
 	.uleb128 0x51
-	.4byte	0x157fb
+	.4byte	0x159ec
 	.byte	0
 	.uleb128 0x4b
-	.8byte	.LVL689
-	.4byte	0x16b45
+	.8byte	.LVL686
+	.4byte	0x16d36
 	.byte	0
 	.uleb128 0x4d
-	.4byte	.LASF3055
+	.4byte	.LASF3054
 	.byte	0x1
-	.2byte	0xc84
+	.2byte	0xc8c
 	.4byte	0x2ee
 	.8byte	.LFB2856
 	.8byte	.LFE2856-.LFB2856
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x10435
+	.4byte	0x10427
 	.uleb128 0x55
 	.4byte	.LASF2168
 	.byte	0x1
-	.2byte	0xc84
+	.2byte	0xc8c
 	.4byte	0xa496
-	.4byte	.LLST198
+	.4byte	.LLST206
 	.uleb128 0x55
 	.4byte	.LASF2083
 	.byte	0x1
-	.2byte	0xc85
+	.2byte	0xc8d
 	.4byte	0xb311
-	.4byte	.LLST199
+	.4byte	.LLST207
 	.uleb128 0x4e
 	.string	"buf"
 	.byte	0x1
-	.2byte	0xc86
+	.2byte	0xc8e
 	.4byte	0x21e
-	.4byte	.LLST200
+	.4byte	.LLST208
 	.uleb128 0x4f
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0xc88
-	.4byte	0xe4e5
+	.2byte	0xc90
+	.4byte	0xe4d7
 	.uleb128 0x66
 	.string	"t"
 	.byte	0x1
-	.2byte	0xc89
+	.2byte	0xc91
 	.4byte	0xc6
 	.uleb128 0x2
 	.byte	0x91
 	.sleb128 4
 	.uleb128 0x58
-	.4byte	0x15807
-	.8byte	.LBB1480
-	.4byte	.Ldebug_ranges0+0xdb0
+	.4byte	0x159f8
+	.8byte	.LBB1542
+	.4byte	.Ldebug_ranges0+0xe80
 	.byte	0x1
-	.2byte	0xc8b
-	.4byte	0x1041a
+	.2byte	0xc93
+	.4byte	0x1040c
 	.uleb128 0x51
-	.4byte	0x15822
+	.4byte	0x15a13
 	.uleb128 0x51
-	.4byte	0x15817
+	.4byte	0x15a08
 	.byte	0
+	.uleb128 0x4b
+	.8byte	.LVL693
+	.4byte	0x16d36
 	.uleb128 0x4b
 	.8byte	.LVL696
-	.4byte	0x16b45
-	.uleb128 0x4b
-	.8byte	.LVL699
-	.4byte	0x16b30
+	.4byte	0x16d21
 	.byte	0
 	.uleb128 0x4c
-	.4byte	.LASF3056
+	.4byte	.LASF3055
 	.byte	0x1
-	.2byte	0xc79
+	.2byte	0xc81
 	.4byte	0x2ee
 	.8byte	.LFB2855
 	.8byte	.LFE2855-.LFB2855
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x104a1
+	.4byte	0x10493
 	.uleb128 0x55
 	.4byte	.LASF2168
 	.byte	0x1
-	.2byte	0xc79
+	.2byte	0xc81
 	.4byte	0xa496
-	.4byte	.LLST201
+	.4byte	.LLST209
 	.uleb128 0x55
 	.4byte	.LASF2083
 	.byte	0x1
-	.2byte	0xc7a
+	.2byte	0xc82
 	.4byte	0xb311
-	.4byte	.LLST202
+	.4byte	.LLST210
 	.uleb128 0x4e
 	.string	"buf"
 	.byte	0x1
-	.2byte	0xc7b
+	.2byte	0xc83
 	.4byte	0x21e
-	.4byte	.LLST203
+	.4byte	.LLST211
 	.uleb128 0x4f
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0xc7d
-	.4byte	0xe4e5
+	.2byte	0xc85
+	.4byte	0xe4d7
 	.uleb128 0x4b
-	.8byte	.LVL704
-	.4byte	0x16b45
+	.8byte	.LVL701
+	.4byte	0x16d36
 	.byte	0
 	.uleb128 0x4c
-	.4byte	.LASF3057
+	.4byte	.LASF3056
 	.byte	0x1
-	.2byte	0xc6e
+	.2byte	0xc76
 	.4byte	0x2ee
 	.8byte	.LFB2854
 	.8byte	.LFE2854-.LFB2854
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x1051a
+	.4byte	0x1050c
 	.uleb128 0x55
 	.4byte	.LASF2168
 	.byte	0x1
-	.2byte	0xc6e
+	.2byte	0xc76
 	.4byte	0xa496
-	.4byte	.LLST213
+	.4byte	.LLST221
 	.uleb128 0x55
 	.4byte	.LASF2083
 	.byte	0x1
-	.2byte	0xc6f
+	.2byte	0xc77
 	.4byte	0xb311
-	.4byte	.LLST214
+	.4byte	.LLST222
 	.uleb128 0x4e
 	.string	"buf"
 	.byte	0x1
-	.2byte	0xc70
+	.2byte	0xc78
 	.4byte	0x21e
-	.4byte	.LLST215
+	.4byte	.LLST223
 	.uleb128 0x43
-	.4byte	.LASF3058
+	.4byte	.LASF3057
 	.byte	0x1
-	.2byte	0xc72
+	.2byte	0xc7a
 	.4byte	0x56
 	.uleb128 0x4b
-	.8byte	.LVL726
-	.4byte	0x16b68
+	.8byte	.LVL723
+	.4byte	0x16d59
 	.uleb128 0x4b
-	.8byte	.LVL727
-	.4byte	0x16b45
+	.8byte	.LVL724
+	.4byte	0x16d36
 	.byte	0
 	.uleb128 0x60
-	.4byte	.LASF3059
+	.4byte	.LASF3058
 	.byte	0x1
-	.2byte	0xc5b
+	.2byte	0xc63
 	.4byte	0xc6
 	.byte	0x1
-	.4byte	0x10544
+	.4byte	0x10536
 	.uleb128 0x62
 	.4byte	.LASF418
 	.byte	0x1
-	.2byte	0xc5b
+	.2byte	0xc63
 	.4byte	0x1c7f
 	.uleb128 0x62
 	.4byte	.LASF1241
 	.byte	0x1
-	.2byte	0xc5b
+	.2byte	0xc63
 	.4byte	0x5482
 	.byte	0
 	.uleb128 0x4c
-	.4byte	.LASF3060
+	.4byte	.LASF3059
 	.byte	0x1
-	.2byte	0xc4b
+	.2byte	0xc53
 	.4byte	0xc6
 	.8byte	.LFB2852
 	.8byte	.LFE2852-.LFB2852
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x105ac
+	.4byte	0x1059e
 	.uleb128 0x55
 	.4byte	.LASF1241
 	.byte	0x1
-	.2byte	0xc4b
+	.2byte	0xc53
 	.4byte	0x5482
 	.4byte	.LLST28
 	.uleb128 0x4e
 	.string	"vma"
 	.byte	0x1
-	.2byte	0xc4b
+	.2byte	0xc53
 	.4byte	0x3be9
 	.4byte	.LLST29
 	.uleb128 0x43
 	.4byte	.LASF2943
 	.byte	0x1
-	.2byte	0xc4d
-	.4byte	0xe82d
+	.2byte	0xc55
+	.4byte	0xe81f
 	.uleb128 0x43
 	.4byte	.LASF854
 	.byte	0x1
-	.2byte	0xc4e
+	.2byte	0xc56
 	.4byte	0x29
 	.uleb128 0x4b
 	.8byte	.LVL97
-	.4byte	0x16b73
+	.4byte	0x16d64
 	.byte	0
 	.uleb128 0x67
-	.4byte	.LASF3062
+	.4byte	.LASF3061
 	.byte	0x1
-	.2byte	0xc34
+	.2byte	0xc3c
 	.4byte	0xc6
-	.4byte	0x105d5
+	.4byte	0x105c7
 	.uleb128 0x62
 	.4byte	.LASF418
 	.byte	0x1
-	.2byte	0xc34
+	.2byte	0xc3c
 	.4byte	0x1c7f
 	.uleb128 0x62
 	.4byte	.LASF1241
 	.byte	0x1
-	.2byte	0xc34
+	.2byte	0xc3c
 	.4byte	0x5482
 	.byte	0
 	.uleb128 0x4c
-	.4byte	.LASF3063
+	.4byte	.LASF3062
 	.byte	0x1
-	.2byte	0xc25
+	.2byte	0xc2d
 	.4byte	0xc6
 	.8byte	.LFB2850
 	.8byte	.LFE2850-.LFB2850
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x1063e
+	.4byte	0x10630
 	.uleb128 0x55
 	.4byte	.LASF1241
 	.byte	0x1
-	.2byte	0xc25
+	.2byte	0xc2d
 	.4byte	0x5482
 	.4byte	.LLST26
 	.uleb128 0x4e
 	.string	"vma"
 	.byte	0x1
-	.2byte	0xc25
+	.2byte	0xc2d
 	.4byte	0x3be9
 	.4byte	.LLST27
 	.uleb128 0x43
 	.4byte	.LASF854
 	.byte	0x1
-	.2byte	0xc27
+	.2byte	0xc2f
 	.4byte	0x29
 	.uleb128 0x4b
 	.8byte	.LVL91
-	.4byte	0x16b7f
+	.4byte	0x16d70
 	.uleb128 0x4b
 	.8byte	.LVL92
-	.4byte	0x16b73
+	.4byte	0x16d64
 	.byte	0
 	.uleb128 0x4c
-	.4byte	.LASF3064
+	.4byte	.LASF3063
 	.byte	0x1
-	.2byte	0xb6b
+	.2byte	0xb6e
 	.4byte	0x199
 	.8byte	.LFB2849
 	.8byte	.LFE2849-.LFB2849
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x11de1
+	.4byte	0x11ffc
 	.uleb128 0x55
 	.4byte	.LASF1241
 	.byte	0x1
-	.2byte	0xb6b
+	.2byte	0xb6e
 	.4byte	0x5482
 	.4byte	.LLST30
 	.uleb128 0x4e
 	.string	"cmd"
 	.byte	0x1
-	.2byte	0xb6b
+	.2byte	0xb6e
 	.4byte	0x6d
 	.4byte	.LLST31
 	.uleb128 0x4e
 	.string	"arg"
 	.byte	0x1
-	.2byte	0xb6b
+	.2byte	0xb6e
 	.4byte	0x29
 	.4byte	.LLST32
 	.uleb128 0x43
-	.4byte	.LASF3065
+	.4byte	.LASF3064
 	.byte	0x1
-	.2byte	0xb6d
+	.2byte	0xb70
 	.4byte	0x458
 	.uleb128 0x43
-	.4byte	.LASF2993
+	.4byte	.LASF2992
 	.byte	0x1
-	.2byte	0xb6e
+	.2byte	0xb71
 	.4byte	0xe0e4
 	.uleb128 0x43
 	.4byte	.LASF2943
 	.byte	0x1
-	.2byte	0xb6f
-	.4byte	0xe82d
+	.2byte	0xb72
+	.4byte	0xe81f
 	.uleb128 0x49
-	.4byte	.LASF3066
+	.4byte	.LASF3065
 	.byte	0x1
-	.2byte	0xb70
+	.2byte	0xb73
 	.4byte	0xd95a
 	.uleb128 0x3
 	.byte	0x91
@@ -47701,1185 +47817,1223 @@
 	.uleb128 0x4f
 	.string	"buf"
 	.byte	0x1
-	.2byte	0xb71
-	.4byte	0xe480
+	.2byte	0xb74
+	.4byte	0xe472
+	.uleb128 0x43
+	.4byte	.LASF3066
+	.byte	0x1
+	.2byte	0xb75
+	.4byte	0xc6
 	.uleb128 0x43
 	.4byte	.LASF3067
 	.byte	0x1
-	.2byte	0xb72
-	.4byte	0xc6
-	.uleb128 0x43
-	.4byte	.LASF3068
-	.byte	0x1
-	.2byte	0xb73
+	.2byte	0xb76
 	.4byte	0x29
 	.uleb128 0x4f
 	.string	"ret"
 	.byte	0x1
-	.2byte	0xb74
+	.2byte	0xb77
 	.4byte	0xc6
 	.uleb128 0x52
-	.4byte	.LASF3025
-	.4byte	0x11df1
+	.4byte	.LASF3024
+	.4byte	0x1200c
 	.uleb128 0x9
 	.byte	0x3
-	.8byte	__func__.35503
+	.8byte	__func__.35512
+	.uleb128 0x68
+	.4byte	.Ldebug_ranges0+0x7b0
+	.4byte	0x1092f
+	.uleb128 0x56
+	.4byte	.LASF3068
+	.byte	0x1
+	.2byte	0xbfd
+	.4byte	0xc6
+	.4byte	.LLST107
+	.uleb128 0x5c
+	.4byte	0x15aeb
+	.8byte	.LBB1418
+	.4byte	.Ldebug_ranges0+0x7e0
+	.byte	0x1
+	.2byte	0xbfe
+	.uleb128 0x51
+	.4byte	0x15b10
+	.uleb128 0x51
+	.4byte	0x15b05
+	.uleb128 0x51
+	.4byte	0x15afb
+	.uleb128 0x69
+	.4byte	0x15b49
+	.8byte	.LBB1419
+	.4byte	.Ldebug_ranges0+0x7e0
+	.byte	0x8
+	.byte	0x9b
+	.uleb128 0x51
+	.4byte	0x15b6e
+	.uleb128 0x51
+	.4byte	0x15b63
+	.uleb128 0x51
+	.4byte	0x15b59
+	.uleb128 0x6a
+	.4byte	0x15be6
+	.8byte	.LBB1421
+	.4byte	.Ldebug_ranges0+0x820
+	.byte	0x8
+	.byte	0x84
+	.4byte	0x10864
+	.uleb128 0x51
+	.4byte	0x15c01
+	.uleb128 0x6b
+	.4byte	0x15bf6
+	.4byte	.LLST108
+	.uleb128 0x5b
+	.4byte	.Ldebug_ranges0+0x820
+	.uleb128 0x5d
+	.4byte	0x15c0c
+	.4byte	.LLST109
+	.uleb128 0x5d
+	.4byte	0x15c17
+	.4byte	.LLST110
+	.uleb128 0x6c
+	.4byte	0x15fd0
+	.8byte	.LBB1423
+	.8byte	.LBE1423-.LBB1423
+	.byte	0x5
+	.byte	0x4d
+	.4byte	0x107ca
+	.uleb128 0x53
+	.8byte	.LBB1424
+	.8byte	.LBE1424-.LBB1424
+	.uleb128 0x5d
+	.4byte	0x15fe0
+	.4byte	.LLST111
+	.byte	0
+	.byte	0
+	.uleb128 0x5f
+	.8byte	.LBB1425
+	.8byte	.LBE1425-.LBB1425
+	.4byte	0x1081e
+	.uleb128 0x54
+	.4byte	0x15c23
+	.uleb128 0x59
+	.4byte	0x1600f
+	.8byte	.LBB1426
+	.8byte	.LBE1426-.LBB1426
+	.byte	0x5
+	.byte	0x56
+	.uleb128 0x51
+	.4byte	0x1602a
+	.uleb128 0x51
+	.4byte	0x1601f
+	.uleb128 0x53
+	.8byte	.LBB1427
+	.8byte	.LBE1427-.LBB1427
+	.uleb128 0x54
+	.4byte	0x16035
+	.byte	0
+	.byte	0
+	.byte	0
+	.uleb128 0x59
+	.4byte	0x15fa4
+	.8byte	.LBB1428
+	.8byte	.LBE1428-.LBB1428
+	.byte	0x5
+	.byte	0x55
+	.uleb128 0x51
+	.4byte	0x15fbe
+	.uleb128 0x51
+	.4byte	0x15fb4
+	.uleb128 0x59
+	.4byte	0x16097
+	.8byte	.LBB1429
+	.8byte	.LBE1429-.LBB1429
+	.byte	0xc9
+	.byte	0x61
+	.uleb128 0x51
+	.4byte	0x160b1
+	.uleb128 0x51
+	.4byte	0x160a7
+	.byte	0
+	.byte	0
+	.byte	0
+	.byte	0
+	.uleb128 0x6c
+	.4byte	0x15bb2
+	.8byte	.LBB1435
+	.8byte	.LBE1435-.LBB1435
+	.byte	0x8
+	.byte	0x86
+	.4byte	0x1091f
+	.uleb128 0x51
+	.4byte	0x15bc2
+	.uleb128 0x53
+	.8byte	.LBB1436
+	.8byte	.LBE1436-.LBB1436
+	.uleb128 0x5d
+	.4byte	0x15bcd
+	.4byte	.LLST112
+	.uleb128 0x68
+	.4byte	.Ldebug_ranges0+0x870
+	.4byte	0x108ea
+	.uleb128 0x5d
+	.4byte	0x15bd9
+	.4byte	.LLST113
+	.uleb128 0x59
+	.4byte	0x1600f
+	.8byte	.LBB1438
+	.8byte	.LBE1438-.LBB1438
+	.byte	0x5
+	.byte	0xfe
+	.uleb128 0x51
+	.4byte	0x1602a
+	.uleb128 0x51
+	.4byte	0x1601f
+	.uleb128 0x53
+	.8byte	.LBB1439
+	.8byte	.LBE1439-.LBB1439
+	.uleb128 0x54
+	.4byte	0x16035
+	.byte	0
+	.byte	0
+	.byte	0
+	.uleb128 0x59
+	.4byte	0x15fd0
+	.8byte	.LBB1440
+	.8byte	.LBE1440-.LBB1440
+	.byte	0x5
+	.byte	0xfd
+	.uleb128 0x53
+	.8byte	.LBB1441
+	.8byte	.LBE1441-.LBB1441
+	.uleb128 0x5d
+	.4byte	0x15fe0
+	.4byte	.LLST114
+	.byte	0
+	.byte	0
+	.byte	0
+	.byte	0
+	.uleb128 0x4b
+	.8byte	.LVL266
+	.4byte	0x16d7b
+	.byte	0
+	.byte	0
+	.byte	0
 	.uleb128 0x58
-	.4byte	0x15929
-	.8byte	.LBB1060
+	.4byte	0x15b1a
+	.8byte	.LBB1092
 	.4byte	.Ldebug_ranges0+0
 	.byte	0x1
-	.2byte	0xb9a
-	.4byte	0x10943
+	.2byte	0xc1f
+	.4byte	0x10b6b
 	.uleb128 0x51
-	.4byte	0x1594e
+	.4byte	0x15b3f
 	.uleb128 0x51
-	.4byte	0x15943
+	.4byte	0x15b34
 	.uleb128 0x51
-	.4byte	0x15939
-	.uleb128 0x68
-	.4byte	0x15987
-	.8byte	.LBB1061
+	.4byte	0x15b2a
+	.uleb128 0x69
+	.4byte	0x15b78
+	.8byte	.LBB1093
 	.4byte	.Ldebug_ranges0+0
-	.byte	0x7
+	.byte	0x8
 	.byte	0x93
 	.uleb128 0x51
-	.4byte	0x159ac
+	.4byte	0x15b9d
 	.uleb128 0x51
-	.4byte	0x159a1
+	.4byte	0x15b92
 	.uleb128 0x51
-	.4byte	0x15997
+	.4byte	0x15b88
 	.uleb128 0x5b
 	.4byte	.Ldebug_ranges0+0
 	.uleb128 0x5d
-	.4byte	0x159b5
+	.4byte	0x15ba6
 	.4byte	.LLST33
-	.uleb128 0x69
-	.4byte	0x159f5
-	.8byte	.LBB1063
-	.4byte	.Ldebug_ranges0+0x50
-	.byte	0x7
-	.byte	0x72
-	.4byte	0x1086b
-	.uleb128 0x51
-	.4byte	0x15a10
 	.uleb128 0x6a
-	.4byte	0x15a05
+	.4byte	0x15be6
+	.8byte	.LBB1095
+	.4byte	.Ldebug_ranges0+0x50
+	.byte	0x8
+	.byte	0x72
+	.4byte	0x10a93
+	.uleb128 0x51
+	.4byte	0x15c01
+	.uleb128 0x6b
+	.4byte	0x15bf6
 	.4byte	.LLST34
 	.uleb128 0x5b
 	.4byte	.Ldebug_ranges0+0x50
 	.uleb128 0x5d
-	.4byte	0x15a1b
+	.4byte	0x15c0c
 	.4byte	.LLST35
 	.uleb128 0x5d
-	.4byte	0x15a26
+	.4byte	0x15c17
 	.4byte	.LLST36
-	.uleb128 0x6b
-	.4byte	0x15ddf
-	.8byte	.LBB1065
-	.8byte	.LBE1065-.LBB1065
+	.uleb128 0x6c
+	.4byte	0x15fd0
+	.8byte	.LBB1097
+	.8byte	.LBE1097-.LBB1097
 	.byte	0x5
 	.byte	0x4d
-	.4byte	0x107d1
+	.4byte	0x109f9
 	.uleb128 0x53
-	.8byte	.LBB1066
-	.8byte	.LBE1066-.LBB1066
+	.8byte	.LBB1098
+	.8byte	.LBE1098-.LBB1098
 	.uleb128 0x5d
-	.4byte	0x15def
+	.4byte	0x15fe0
 	.4byte	.LLST37
 	.byte	0
 	.byte	0
-	.uleb128 0x5f
-	.8byte	.LBB1067
-	.8byte	.LBE1067-.LBB1067
-	.4byte	0x10825
-	.uleb128 0x54
-	.4byte	0x15a32
-	.uleb128 0x59
-	.4byte	0x15e1e
-	.8byte	.LBB1068
-	.8byte	.LBE1068-.LBB1068
-	.byte	0x5
-	.byte	0x56
-	.uleb128 0x51
-	.4byte	0x15e39
-	.uleb128 0x51
-	.4byte	0x15e2e
-	.uleb128 0x53
-	.8byte	.LBB1069
-	.8byte	.LBE1069-.LBB1069
-	.uleb128 0x54
-	.4byte	0x15e44
-	.byte	0
-	.byte	0
-	.byte	0
-	.uleb128 0x59
-	.4byte	0x15db3
-	.8byte	.LBB1070
-	.8byte	.LBE1070-.LBB1070
+	.uleb128 0x6c
+	.4byte	0x15fa4
+	.8byte	.LBB1099
+	.8byte	.LBE1099-.LBB1099
 	.byte	0x5
 	.byte	0x55
+	.4byte	0x10a41
 	.uleb128 0x51
-	.4byte	0x15dcd
+	.4byte	0x15fbe
 	.uleb128 0x51
-	.4byte	0x15dc3
+	.4byte	0x15fb4
 	.uleb128 0x59
-	.4byte	0x15ea6
-	.8byte	.LBB1071
-	.8byte	.LBE1071-.LBB1071
+	.4byte	0x16097
+	.8byte	.LBB1100
+	.8byte	.LBE1100-.LBB1100
 	.byte	0xc9
 	.byte	0x61
 	.uleb128 0x51
-	.4byte	0x15ec0
+	.4byte	0x160b1
 	.uleb128 0x51
-	.4byte	0x15eb6
+	.4byte	0x160a7
 	.byte	0
 	.byte	0
-	.byte	0
-	.byte	0
-	.uleb128 0x6b
-	.4byte	0x159c1
-	.8byte	.LBB1075
-	.8byte	.LBE1075-.LBB1075
-	.byte	0x7
-	.byte	0x74
-	.4byte	0x10926
-	.uleb128 0x51
-	.4byte	0x159d1
 	.uleb128 0x53
-	.8byte	.LBB1076
-	.8byte	.LBE1076-.LBB1076
-	.uleb128 0x5d
-	.4byte	0x159dc
-	.4byte	.LLST38
+	.8byte	.LBB1102
+	.8byte	.LBE1102-.LBB1102
+	.uleb128 0x54
+	.4byte	0x15c23
+	.uleb128 0x59
+	.4byte	0x1600f
+	.8byte	.LBB1103
+	.8byte	.LBE1103-.LBB1103
+	.byte	0x5
+	.byte	0x56
+	.uleb128 0x51
+	.4byte	0x1602a
+	.uleb128 0x51
+	.4byte	0x1601f
+	.uleb128 0x53
+	.8byte	.LBB1104
+	.8byte	.LBE1104-.LBB1104
+	.uleb128 0x54
+	.4byte	0x16035
+	.byte	0
+	.byte	0
+	.byte	0
+	.byte	0
+	.byte	0
 	.uleb128 0x6c
-	.4byte	.Ldebug_ranges0+0x90
-	.4byte	0x108f1
+	.4byte	0x15bb2
+	.8byte	.LBB1109
+	.8byte	.LBE1109-.LBB1109
+	.byte	0x8
+	.byte	0x74
+	.4byte	0x10b4e
+	.uleb128 0x51
+	.4byte	0x15bc2
+	.uleb128 0x53
+	.8byte	.LBB1110
+	.8byte	.LBE1110-.LBB1110
 	.uleb128 0x5d
-	.4byte	0x159e8
+	.4byte	0x15bcd
+	.4byte	.LLST38
+	.uleb128 0x68
+	.4byte	.Ldebug_ranges0+0x90
+	.4byte	0x10b19
+	.uleb128 0x5d
+	.4byte	0x15bd9
 	.4byte	.LLST39
 	.uleb128 0x59
-	.4byte	0x15e1e
-	.8byte	.LBB1078
-	.8byte	.LBE1078-.LBB1078
+	.4byte	0x1600f
+	.8byte	.LBB1112
+	.8byte	.LBE1112-.LBB1112
 	.byte	0x5
 	.byte	0xfe
 	.uleb128 0x51
-	.4byte	0x15e39
+	.4byte	0x1602a
 	.uleb128 0x51
-	.4byte	0x15e2e
+	.4byte	0x1601f
 	.uleb128 0x53
-	.8byte	.LBB1079
-	.8byte	.LBE1079-.LBB1079
+	.8byte	.LBB1113
+	.8byte	.LBE1113-.LBB1113
 	.uleb128 0x54
-	.4byte	0x15e44
+	.4byte	0x16035
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x59
-	.4byte	0x15ddf
-	.8byte	.LBB1080
-	.8byte	.LBE1080-.LBB1080
+	.4byte	0x15fd0
+	.8byte	.LBB1114
+	.8byte	.LBE1114-.LBB1114
 	.byte	0x5
 	.byte	0xfd
 	.uleb128 0x53
-	.8byte	.LBB1081
-	.8byte	.LBE1081-.LBB1081
+	.8byte	.LBB1115
+	.8byte	.LBE1115-.LBB1115
 	.uleb128 0x5d
-	.4byte	0x15def
+	.4byte	0x15fe0
 	.4byte	.LLST40
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x4b
-	.8byte	.LVL124
-	.4byte	0x16b8a
+	.8byte	.LVL115
+	.4byte	0x16d87
 	.uleb128 0x4b
-	.8byte	.LVL337
-	.4byte	0x16a0b
+	.8byte	.LVL324
+	.4byte	0x16bfc
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x58
-	.4byte	0x158fa
-	.8byte	.LBB1091
+	.4byte	0x15aeb
+	.8byte	.LBB1125
 	.4byte	.Ldebug_ranges0+0xc0
 	.byte	0x1
-	.2byte	0xbaa
-	.4byte	0x10afd
+	.2byte	0xbf9
+	.4byte	0x10d8b
 	.uleb128 0x51
-	.4byte	0x1591f
+	.4byte	0x15b10
 	.uleb128 0x51
-	.4byte	0x15914
+	.4byte	0x15b05
 	.uleb128 0x51
-	.4byte	0x1590a
-	.uleb128 0x68
-	.4byte	0x15958
-	.8byte	.LBB1092
+	.4byte	0x15afb
+	.uleb128 0x69
+	.4byte	0x15b49
+	.8byte	.LBB1126
 	.4byte	.Ldebug_ranges0+0xc0
-	.byte	0x7
+	.byte	0x8
 	.byte	0x9b
 	.uleb128 0x51
-	.4byte	0x1597d
+	.4byte	0x15b6e
 	.uleb128 0x51
-	.4byte	0x15972
+	.4byte	0x15b63
 	.uleb128 0x51
-	.4byte	0x15968
-	.uleb128 0x69
-	.4byte	0x159f5
-	.8byte	.LBB1094
-	.4byte	.Ldebug_ranges0+0x120
-	.byte	0x7
-	.byte	0x84
-	.4byte	0x10a60
-	.uleb128 0x51
-	.4byte	0x15a10
+	.4byte	0x15b59
 	.uleb128 0x6a
-	.4byte	0x15a05
+	.4byte	0x15be6
+	.8byte	.LBB1128
+	.4byte	.Ldebug_ranges0+0x100
+	.byte	0x8
+	.byte	0x84
+	.4byte	0x10cc1
+	.uleb128 0x51
+	.4byte	0x15c01
+	.uleb128 0x6b
+	.4byte	0x15bf6
 	.4byte	.LLST41
 	.uleb128 0x5b
-	.4byte	.Ldebug_ranges0+0x120
+	.4byte	.Ldebug_ranges0+0x100
 	.uleb128 0x5d
-	.4byte	0x15a1b
+	.4byte	0x15c0c
 	.4byte	.LLST42
 	.uleb128 0x5d
-	.4byte	0x15a26
+	.4byte	0x15c17
 	.4byte	.LLST43
-	.uleb128 0x6b
-	.4byte	0x15ddf
-	.8byte	.LBB1096
-	.8byte	.LBE1096-.LBB1096
+	.uleb128 0x6c
+	.4byte	0x15fd0
+	.8byte	.LBB1130
+	.8byte	.LBE1130-.LBB1130
 	.byte	0x5
 	.byte	0x4d
-	.4byte	0x109ff
+	.4byte	0x10c27
 	.uleb128 0x53
-	.8byte	.LBB1097
-	.8byte	.LBE1097-.LBB1097
+	.8byte	.LBB1131
+	.8byte	.LBE1131-.LBB1131
 	.uleb128 0x5d
-	.4byte	0x15def
+	.4byte	0x15fe0
 	.4byte	.LLST44
 	.byte	0
 	.byte	0
-	.uleb128 0x6b
-	.4byte	0x15db3
-	.8byte	.LBB1098
-	.8byte	.LBE1098-.LBB1098
+	.uleb128 0x5f
+	.8byte	.LBB1132
+	.8byte	.LBE1132-.LBB1132
+	.4byte	0x10c7b
+	.uleb128 0x54
+	.4byte	0x15c23
+	.uleb128 0x59
+	.4byte	0x1600f
+	.8byte	.LBB1133
+	.8byte	.LBE1133-.LBB1133
+	.byte	0x5
+	.byte	0x56
+	.uleb128 0x51
+	.4byte	0x1602a
+	.uleb128 0x51
+	.4byte	0x1601f
+	.uleb128 0x53
+	.8byte	.LBB1134
+	.8byte	.LBE1134-.LBB1134
+	.uleb128 0x54
+	.4byte	0x16035
+	.byte	0
+	.byte	0
+	.byte	0
+	.uleb128 0x59
+	.4byte	0x15fa4
+	.8byte	.LBB1135
+	.8byte	.LBE1135-.LBB1135
 	.byte	0x5
 	.byte	0x55
-	.4byte	0x10a47
 	.uleb128 0x51
-	.4byte	0x15dcd
+	.4byte	0x15fbe
 	.uleb128 0x51
-	.4byte	0x15dc3
+	.4byte	0x15fb4
 	.uleb128 0x59
-	.4byte	0x15ea6
-	.8byte	.LBB1099
-	.8byte	.LBE1099-.LBB1099
+	.4byte	0x16097
+	.8byte	.LBB1136
+	.8byte	.LBE1136-.LBB1136
 	.byte	0xc9
 	.byte	0x61
 	.uleb128 0x51
-	.4byte	0x15ec0
+	.4byte	0x160b1
 	.uleb128 0x51
-	.4byte	0x15eb6
-	.byte	0
-	.byte	0
-	.uleb128 0x53
-	.8byte	.LBB1101
-	.8byte	.LBE1101-.LBB1101
-	.uleb128 0x54
-	.4byte	0x15a32
+	.4byte	0x160a7
 	.byte	0
 	.byte	0
 	.byte	0
-	.uleb128 0x6b
-	.4byte	0x159c1
-	.8byte	.LBB1108
-	.8byte	.LBE1108-.LBB1108
-	.byte	0x7
+	.byte	0
+	.uleb128 0x6c
+	.4byte	0x15bb2
+	.8byte	.LBB1140
+	.8byte	.LBE1140-.LBB1140
+	.byte	0x8
 	.byte	0x86
-	.4byte	0x10aee
+	.4byte	0x10d7c
 	.uleb128 0x51
-	.4byte	0x159d1
+	.4byte	0x15bc2
 	.uleb128 0x53
-	.8byte	.LBB1109
-	.8byte	.LBE1109-.LBB1109
+	.8byte	.LBB1141
+	.8byte	.LBE1141-.LBB1141
 	.uleb128 0x5d
-	.4byte	0x159dc
+	.4byte	0x15bcd
 	.4byte	.LLST45
-	.uleb128 0x6b
-	.4byte	0x15ddf
-	.8byte	.LBB1110
-	.8byte	.LBE1110-.LBB1110
+	.uleb128 0x68
+	.4byte	.Ldebug_ranges0+0x140
+	.4byte	0x10d47
+	.uleb128 0x5d
+	.4byte	0x15bd9
+	.4byte	.LLST46
+	.uleb128 0x59
+	.4byte	0x1600f
+	.8byte	.LBB1143
+	.8byte	.LBE1143-.LBB1143
+	.byte	0x5
+	.byte	0xfe
+	.uleb128 0x51
+	.4byte	0x1602a
+	.uleb128 0x51
+	.4byte	0x1601f
+	.uleb128 0x53
+	.8byte	.LBB1144
+	.8byte	.LBE1144-.LBB1144
+	.uleb128 0x54
+	.4byte	0x16035
+	.byte	0
+	.byte	0
+	.byte	0
+	.uleb128 0x59
+	.4byte	0x15fd0
+	.8byte	.LBB1145
+	.8byte	.LBE1145-.LBB1145
 	.byte	0x5
 	.byte	0xfd
-	.4byte	0x10ad1
 	.uleb128 0x53
-	.8byte	.LBB1111
-	.8byte	.LBE1111-.LBB1111
+	.8byte	.LBB1146
+	.8byte	.LBE1146-.LBB1146
 	.uleb128 0x5d
-	.4byte	0x15def
-	.4byte	.LLST46
-	.byte	0
-	.byte	0
-	.uleb128 0x53
-	.8byte	.LBB1112
-	.8byte	.LBE1112-.LBB1112
-	.uleb128 0x5d
-	.4byte	0x159e8
+	.4byte	0x15fe0
 	.4byte	.LLST47
 	.byte	0
 	.byte	0
 	.byte	0
+	.byte	0
 	.uleb128 0x4b
-	.8byte	.LVL316
-	.4byte	0x16b96
+	.8byte	.LVL140
+	.4byte	0x16d7b
 	.byte	0
 	.byte	0
 	.uleb128 0x58
-	.4byte	0x15929
-	.8byte	.LBB1123
+	.4byte	0x15b1a
+	.8byte	.LBB1154
 	.4byte	.Ldebug_ranges0+0x170
 	.byte	0x1
-	.2byte	0xbc9
-	.4byte	0x10d28
+	.2byte	0xc16
+	.4byte	0x10fc7
 	.uleb128 0x51
-	.4byte	0x1594e
+	.4byte	0x15b3f
 	.uleb128 0x51
-	.4byte	0x15943
+	.4byte	0x15b34
 	.uleb128 0x51
-	.4byte	0x15939
-	.uleb128 0x68
-	.4byte	0x15987
-	.8byte	.LBB1124
+	.4byte	0x15b2a
+	.uleb128 0x69
+	.4byte	0x15b78
+	.8byte	.LBB1155
 	.4byte	.Ldebug_ranges0+0x170
-	.byte	0x7
+	.byte	0x8
 	.byte	0x93
 	.uleb128 0x51
-	.4byte	0x159ac
+	.4byte	0x15b9d
 	.uleb128 0x51
-	.4byte	0x159a1
+	.4byte	0x15b92
 	.uleb128 0x51
-	.4byte	0x15997
+	.4byte	0x15b88
 	.uleb128 0x5b
 	.4byte	.Ldebug_ranges0+0x170
-	.uleb128 0x54
-	.4byte	0x159b5
-	.uleb128 0x69
-	.4byte	0x159f5
-	.8byte	.LBB1126
-	.4byte	.Ldebug_ranges0+0x1b0
-	.byte	0x7
-	.byte	0x72
-	.4byte	0x10c5d
-	.uleb128 0x51
-	.4byte	0x15a10
-	.uleb128 0x6a
-	.4byte	0x15a05
+	.uleb128 0x5d
+	.4byte	0x15ba6
 	.4byte	.LLST48
-	.uleb128 0x5b
-	.4byte	.Ldebug_ranges0+0x1b0
-	.uleb128 0x5d
-	.4byte	0x15a1b
-	.4byte	.LLST49
-	.uleb128 0x5d
-	.4byte	0x15a26
-	.4byte	.LLST50
-	.uleb128 0x6b
-	.4byte	0x15ddf
-	.8byte	.LBB1128
-	.8byte	.LBE1128-.LBB1128
-	.byte	0x5
-	.byte	0x4d
-	.4byte	0x10bc3
-	.uleb128 0x53
-	.8byte	.LBB1129
-	.8byte	.LBE1129-.LBB1129
-	.uleb128 0x5d
-	.4byte	0x15def
-	.4byte	.LLST51
-	.byte	0
-	.byte	0
-	.uleb128 0x5f
-	.8byte	.LBB1130
-	.8byte	.LBE1130-.LBB1130
-	.4byte	0x10c17
-	.uleb128 0x54
-	.4byte	0x15a32
-	.uleb128 0x59
-	.4byte	0x15e1e
-	.8byte	.LBB1131
-	.8byte	.LBE1131-.LBB1131
-	.byte	0x5
-	.byte	0x56
-	.uleb128 0x51
-	.4byte	0x15e39
-	.uleb128 0x51
-	.4byte	0x15e2e
-	.uleb128 0x53
-	.8byte	.LBB1132
-	.8byte	.LBE1132-.LBB1132
-	.uleb128 0x54
-	.4byte	0x15e44
-	.byte	0
-	.byte	0
-	.byte	0
-	.uleb128 0x59
-	.4byte	0x15db3
-	.8byte	.LBB1133
-	.8byte	.LBE1133-.LBB1133
-	.byte	0x5
-	.byte	0x55
-	.uleb128 0x51
-	.4byte	0x15dcd
-	.uleb128 0x51
-	.4byte	0x15dc3
-	.uleb128 0x59
-	.4byte	0x15ea6
-	.8byte	.LBB1134
-	.8byte	.LBE1134-.LBB1134
-	.byte	0xc9
-	.byte	0x61
-	.uleb128 0x51
-	.4byte	0x15ec0
-	.uleb128 0x51
-	.4byte	0x15eb6
-	.byte	0
-	.byte	0
-	.byte	0
-	.byte	0
-	.uleb128 0x6b
-	.4byte	0x159c1
-	.8byte	.LBB1138
-	.8byte	.LBE1138-.LBB1138
-	.byte	0x7
-	.byte	0x74
-	.4byte	0x10d18
-	.uleb128 0x51
-	.4byte	0x159d1
-	.uleb128 0x53
-	.8byte	.LBB1139
-	.8byte	.LBE1139-.LBB1139
-	.uleb128 0x5d
-	.4byte	0x159dc
-	.4byte	.LLST52
-	.uleb128 0x6c
-	.4byte	.Ldebug_ranges0+0x1f0
-	.4byte	0x10ce3
-	.uleb128 0x5d
-	.4byte	0x159e8
-	.4byte	.LLST53
-	.uleb128 0x59
-	.4byte	0x15e1e
-	.8byte	.LBB1141
-	.8byte	.LBE1141-.LBB1141
-	.byte	0x5
-	.byte	0xfe
-	.uleb128 0x51
-	.4byte	0x15e39
-	.uleb128 0x51
-	.4byte	0x15e2e
-	.uleb128 0x53
-	.8byte	.LBB1142
-	.8byte	.LBE1142-.LBB1142
-	.uleb128 0x54
-	.4byte	0x15e44
-	.byte	0
-	.byte	0
-	.byte	0
-	.uleb128 0x59
-	.4byte	0x15ddf
-	.8byte	.LBB1143
-	.8byte	.LBE1143-.LBB1143
-	.byte	0x5
-	.byte	0xfd
-	.uleb128 0x53
-	.8byte	.LBB1144
-	.8byte	.LBE1144-.LBB1144
-	.uleb128 0x5d
-	.4byte	0x15def
-	.4byte	.LLST54
-	.byte	0
-	.byte	0
-	.byte	0
-	.byte	0
-	.uleb128 0x4b
-	.8byte	.LVL158
-	.4byte	0x16b8a
-	.byte	0
-	.byte	0
-	.byte	0
-	.uleb128 0x58
-	.4byte	0x158fa
-	.8byte	.LBB1152
-	.4byte	.Ldebug_ranges0+0x220
-	.byte	0x1
-	.2byte	0xbf4
-	.4byte	0x10f48
-	.uleb128 0x51
-	.4byte	0x1591f
-	.uleb128 0x51
-	.4byte	0x15914
-	.uleb128 0x51
-	.4byte	0x1590a
-	.uleb128 0x68
-	.4byte	0x15958
-	.8byte	.LBB1153
-	.4byte	.Ldebug_ranges0+0x220
-	.byte	0x7
-	.byte	0x9b
-	.uleb128 0x51
-	.4byte	0x1597d
-	.uleb128 0x51
-	.4byte	0x15972
-	.uleb128 0x51
-	.4byte	0x15968
-	.uleb128 0x69
-	.4byte	0x159f5
-	.8byte	.LBB1155
-	.4byte	.Ldebug_ranges0+0x260
-	.byte	0x7
-	.byte	0x84
-	.4byte	0x10e7e
-	.uleb128 0x51
-	.4byte	0x15a10
 	.uleb128 0x6a
-	.4byte	0x15a05
-	.4byte	.LLST55
-	.uleb128 0x5b
-	.4byte	.Ldebug_ranges0+0x260
-	.uleb128 0x5d
-	.4byte	0x15a1b
-	.4byte	.LLST56
-	.uleb128 0x5d
-	.4byte	0x15a26
-	.4byte	.LLST57
-	.uleb128 0x6b
-	.4byte	0x15ddf
+	.4byte	0x15be6
 	.8byte	.LBB1157
-	.8byte	.LBE1157-.LBB1157
-	.byte	0x5
-	.byte	0x4d
-	.4byte	0x10de4
-	.uleb128 0x53
-	.8byte	.LBB1158
-	.8byte	.LBE1158-.LBB1158
+	.4byte	.Ldebug_ranges0+0x1d0
+	.byte	0x8
+	.byte	0x72
+	.4byte	0x10eef
+	.uleb128 0x51
+	.4byte	0x15c01
+	.uleb128 0x6b
+	.4byte	0x15bf6
+	.4byte	.LLST49
+	.uleb128 0x5b
+	.4byte	.Ldebug_ranges0+0x1d0
 	.uleb128 0x5d
-	.4byte	0x15def
-	.4byte	.LLST58
-	.byte	0
-	.byte	0
-	.uleb128 0x5f
+	.4byte	0x15c0c
+	.4byte	.LLST50
+	.uleb128 0x5d
+	.4byte	0x15c17
+	.4byte	.LLST51
+	.uleb128 0x6c
+	.4byte	0x15fd0
 	.8byte	.LBB1159
 	.8byte	.LBE1159-.LBB1159
-	.4byte	0x10e38
-	.uleb128 0x54
-	.4byte	0x15a32
-	.uleb128 0x59
-	.4byte	0x15e1e
+	.byte	0x5
+	.byte	0x4d
+	.4byte	0x10e55
+	.uleb128 0x53
 	.8byte	.LBB1160
 	.8byte	.LBE1160-.LBB1160
-	.byte	0x5
-	.byte	0x56
-	.uleb128 0x51
-	.4byte	0x15e39
-	.uleb128 0x51
-	.4byte	0x15e2e
-	.uleb128 0x53
+	.uleb128 0x5d
+	.4byte	0x15fe0
+	.4byte	.LLST52
+	.byte	0
+	.byte	0
+	.uleb128 0x5f
 	.8byte	.LBB1161
 	.8byte	.LBE1161-.LBB1161
+	.4byte	0x10ea9
 	.uleb128 0x54
-	.4byte	0x15e44
-	.byte	0
-	.byte	0
-	.byte	0
+	.4byte	0x15c23
 	.uleb128 0x59
-	.4byte	0x15db3
+	.4byte	0x1600f
 	.8byte	.LBB1162
 	.8byte	.LBE1162-.LBB1162
 	.byte	0x5
-	.byte	0x55
+	.byte	0x56
 	.uleb128 0x51
-	.4byte	0x15dcd
+	.4byte	0x1602a
 	.uleb128 0x51
-	.4byte	0x15dc3
-	.uleb128 0x59
-	.4byte	0x15ea6
+	.4byte	0x1601f
+	.uleb128 0x53
 	.8byte	.LBB1163
 	.8byte	.LBE1163-.LBB1163
+	.uleb128 0x54
+	.4byte	0x16035
+	.byte	0
+	.byte	0
+	.byte	0
+	.uleb128 0x59
+	.4byte	0x15fa4
+	.8byte	.LBB1164
+	.8byte	.LBE1164-.LBB1164
+	.byte	0x5
+	.byte	0x55
+	.uleb128 0x51
+	.4byte	0x15fbe
+	.uleb128 0x51
+	.4byte	0x15fb4
+	.uleb128 0x59
+	.4byte	0x16097
+	.8byte	.LBB1165
+	.8byte	.LBE1165-.LBB1165
 	.byte	0xc9
 	.byte	0x61
 	.uleb128 0x51
-	.4byte	0x15ec0
+	.4byte	0x160b1
 	.uleb128 0x51
-	.4byte	0x15eb6
+	.4byte	0x160a7
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
-	.uleb128 0x6b
-	.4byte	0x159c1
-	.8byte	.LBB1167
-	.8byte	.LBE1167-.LBB1167
-	.byte	0x7
-	.byte	0x86
-	.4byte	0x10f39
-	.uleb128 0x51
-	.4byte	0x159d1
-	.uleb128 0x53
-	.8byte	.LBB1168
-	.8byte	.LBE1168-.LBB1168
-	.uleb128 0x5d
-	.4byte	0x159dc
-	.4byte	.LLST59
 	.uleb128 0x6c
-	.4byte	.Ldebug_ranges0+0x2a0
-	.4byte	0x10f04
+	.4byte	0x15bb2
+	.8byte	.LBB1171
+	.8byte	.LBE1171-.LBB1171
+	.byte	0x8
+	.byte	0x74
+	.4byte	0x10faa
+	.uleb128 0x51
+	.4byte	0x15bc2
+	.uleb128 0x53
+	.8byte	.LBB1172
+	.8byte	.LBE1172-.LBB1172
 	.uleb128 0x5d
-	.4byte	0x159e8
-	.4byte	.LLST60
+	.4byte	0x15bcd
+	.4byte	.LLST53
+	.uleb128 0x68
+	.4byte	.Ldebug_ranges0+0x220
+	.4byte	0x10f75
+	.uleb128 0x5d
+	.4byte	0x15bd9
+	.4byte	.LLST54
 	.uleb128 0x59
-	.4byte	0x15e1e
-	.8byte	.LBB1170
-	.8byte	.LBE1170-.LBB1170
+	.4byte	0x1600f
+	.8byte	.LBB1174
+	.8byte	.LBE1174-.LBB1174
 	.byte	0x5
 	.byte	0xfe
 	.uleb128 0x51
-	.4byte	0x15e39
+	.4byte	0x1602a
 	.uleb128 0x51
-	.4byte	0x15e2e
+	.4byte	0x1601f
 	.uleb128 0x53
-	.8byte	.LBB1171
-	.8byte	.LBE1171-.LBB1171
+	.8byte	.LBB1175
+	.8byte	.LBE1175-.LBB1175
 	.uleb128 0x54
-	.4byte	0x15e44
+	.4byte	0x16035
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x59
-	.4byte	0x15ddf
-	.8byte	.LBB1172
-	.8byte	.LBE1172-.LBB1172
+	.4byte	0x15fd0
+	.8byte	.LBB1176
+	.8byte	.LBE1176-.LBB1176
 	.byte	0x5
 	.byte	0xfd
 	.uleb128 0x53
-	.8byte	.LBB1173
-	.8byte	.LBE1173-.LBB1173
+	.8byte	.LBB1177
+	.8byte	.LBE1177-.LBB1177
 	.uleb128 0x5d
-	.4byte	0x15def
-	.4byte	.LLST61
+	.4byte	0x15fe0
+	.4byte	.LLST55
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x4b
-	.8byte	.LVL175
-	.4byte	0x16b96
+	.8byte	.LVL151
+	.4byte	0x16d87
+	.uleb128 0x4b
+	.8byte	.LVL318
+	.4byte	0x16bfc
+	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x58
-	.4byte	0x15929
-	.8byte	.LBB1181
-	.4byte	.Ldebug_ranges0+0x2d0
+	.4byte	0x15b1a
+	.8byte	.LBB1190
+	.4byte	.Ldebug_ranges0+0x250
 	.byte	0x1
-	.2byte	0xc17
-	.4byte	0x11184
+	.2byte	0xbce
+	.4byte	0x111f2
 	.uleb128 0x51
-	.4byte	0x1594e
+	.4byte	0x15b3f
 	.uleb128 0x51
-	.4byte	0x15943
+	.4byte	0x15b34
 	.uleb128 0x51
-	.4byte	0x15939
-	.uleb128 0x68
-	.4byte	0x15987
-	.8byte	.LBB1182
-	.4byte	.Ldebug_ranges0+0x2d0
-	.byte	0x7
+	.4byte	0x15b2a
+	.uleb128 0x69
+	.4byte	0x15b78
+	.8byte	.LBB1191
+	.4byte	.Ldebug_ranges0+0x250
+	.byte	0x8
 	.byte	0x93
 	.uleb128 0x51
-	.4byte	0x159ac
+	.4byte	0x15b9d
 	.uleb128 0x51
-	.4byte	0x159a1
+	.4byte	0x15b92
 	.uleb128 0x51
-	.4byte	0x15997
+	.4byte	0x15b88
 	.uleb128 0x5b
-	.4byte	.Ldebug_ranges0+0x2d0
-	.uleb128 0x5d
-	.4byte	0x159b5
-	.4byte	.LLST62
-	.uleb128 0x69
-	.4byte	0x159f5
-	.8byte	.LBB1184
-	.4byte	.Ldebug_ranges0+0x330
-	.byte	0x7
-	.byte	0x72
-	.4byte	0x110ac
-	.uleb128 0x51
-	.4byte	0x15a10
+	.4byte	.Ldebug_ranges0+0x250
+	.uleb128 0x54
+	.4byte	0x15ba6
 	.uleb128 0x6a
-	.4byte	0x15a05
-	.4byte	.LLST63
-	.uleb128 0x5b
-	.4byte	.Ldebug_ranges0+0x330
-	.uleb128 0x5d
-	.4byte	0x15a1b
-	.4byte	.LLST64
-	.uleb128 0x5d
-	.4byte	0x15a26
-	.4byte	.LLST65
+	.4byte	0x15be6
+	.8byte	.LBB1193
+	.4byte	.Ldebug_ranges0+0x290
+	.byte	0x8
+	.byte	0x72
+	.4byte	0x11127
+	.uleb128 0x51
+	.4byte	0x15c01
 	.uleb128 0x6b
-	.4byte	0x15ddf
-	.8byte	.LBB1186
-	.8byte	.LBE1186-.LBB1186
+	.4byte	0x15bf6
+	.4byte	.LLST56
+	.uleb128 0x5b
+	.4byte	.Ldebug_ranges0+0x290
+	.uleb128 0x5d
+	.4byte	0x15c0c
+	.4byte	.LLST57
+	.uleb128 0x5d
+	.4byte	0x15c17
+	.4byte	.LLST58
+	.uleb128 0x6c
+	.4byte	0x15fd0
+	.8byte	.LBB1195
+	.8byte	.LBE1195-.LBB1195
 	.byte	0x5
 	.byte	0x4d
-	.4byte	0x11012
+	.4byte	0x1108d
 	.uleb128 0x53
-	.8byte	.LBB1187
-	.8byte	.LBE1187-.LBB1187
+	.8byte	.LBB1196
+	.8byte	.LBE1196-.LBB1196
 	.uleb128 0x5d
-	.4byte	0x15def
+	.4byte	0x15fe0
+	.4byte	.LLST59
+	.byte	0
+	.byte	0
+	.uleb128 0x5f
+	.8byte	.LBB1197
+	.8byte	.LBE1197-.LBB1197
+	.4byte	0x110e1
+	.uleb128 0x54
+	.4byte	0x15c23
+	.uleb128 0x59
+	.4byte	0x1600f
+	.8byte	.LBB1198
+	.8byte	.LBE1198-.LBB1198
+	.byte	0x5
+	.byte	0x56
+	.uleb128 0x51
+	.4byte	0x1602a
+	.uleb128 0x51
+	.4byte	0x1601f
+	.uleb128 0x53
+	.8byte	.LBB1199
+	.8byte	.LBE1199-.LBB1199
+	.uleb128 0x54
+	.4byte	0x16035
+	.byte	0
+	.byte	0
+	.byte	0
+	.uleb128 0x59
+	.4byte	0x15fa4
+	.8byte	.LBB1200
+	.8byte	.LBE1200-.LBB1200
+	.byte	0x5
+	.byte	0x55
+	.uleb128 0x51
+	.4byte	0x15fbe
+	.uleb128 0x51
+	.4byte	0x15fb4
+	.uleb128 0x59
+	.4byte	0x16097
+	.8byte	.LBB1201
+	.8byte	.LBE1201-.LBB1201
+	.byte	0xc9
+	.byte	0x61
+	.uleb128 0x51
+	.4byte	0x160b1
+	.uleb128 0x51
+	.4byte	0x160a7
+	.byte	0
+	.byte	0
+	.byte	0
+	.byte	0
+	.uleb128 0x6c
+	.4byte	0x15bb2
+	.8byte	.LBB1205
+	.8byte	.LBE1205-.LBB1205
+	.byte	0x8
+	.byte	0x74
+	.4byte	0x111e2
+	.uleb128 0x51
+	.4byte	0x15bc2
+	.uleb128 0x53
+	.8byte	.LBB1206
+	.8byte	.LBE1206-.LBB1206
+	.uleb128 0x5d
+	.4byte	0x15bcd
+	.4byte	.LLST60
+	.uleb128 0x68
+	.4byte	.Ldebug_ranges0+0x2d0
+	.4byte	0x111ad
+	.uleb128 0x5d
+	.4byte	0x15bd9
+	.4byte	.LLST61
+	.uleb128 0x59
+	.4byte	0x1600f
+	.8byte	.LBB1208
+	.8byte	.LBE1208-.LBB1208
+	.byte	0x5
+	.byte	0xfe
+	.uleb128 0x51
+	.4byte	0x1602a
+	.uleb128 0x51
+	.4byte	0x1601f
+	.uleb128 0x53
+	.8byte	.LBB1209
+	.8byte	.LBE1209-.LBB1209
+	.uleb128 0x54
+	.4byte	0x16035
+	.byte	0
+	.byte	0
+	.byte	0
+	.uleb128 0x59
+	.4byte	0x15fd0
+	.8byte	.LBB1210
+	.8byte	.LBE1210-.LBB1210
+	.byte	0x5
+	.byte	0xfd
+	.uleb128 0x53
+	.8byte	.LBB1211
+	.8byte	.LBE1211-.LBB1211
+	.uleb128 0x5d
+	.4byte	0x15fe0
+	.4byte	.LLST62
+	.byte	0
+	.byte	0
+	.byte	0
+	.byte	0
+	.uleb128 0x4b
+	.8byte	.LVL165
+	.4byte	0x16d87
+	.byte	0
+	.byte	0
+	.byte	0
+	.uleb128 0x58
+	.4byte	0x15aeb
+	.8byte	.LBB1219
+	.4byte	.Ldebug_ranges0+0x300
+	.byte	0x1
+	.2byte	0xb9b
+	.4byte	0x11412
+	.uleb128 0x51
+	.4byte	0x15b10
+	.uleb128 0x51
+	.4byte	0x15b05
+	.uleb128 0x51
+	.4byte	0x15afb
+	.uleb128 0x69
+	.4byte	0x15b49
+	.8byte	.LBB1220
+	.4byte	.Ldebug_ranges0+0x300
+	.byte	0x8
+	.byte	0x9b
+	.uleb128 0x51
+	.4byte	0x15b6e
+	.uleb128 0x51
+	.4byte	0x15b63
+	.uleb128 0x51
+	.4byte	0x15b59
+	.uleb128 0x6a
+	.4byte	0x15be6
+	.8byte	.LBB1222
+	.4byte	.Ldebug_ranges0+0x350
+	.byte	0x8
+	.byte	0x84
+	.4byte	0x11348
+	.uleb128 0x51
+	.4byte	0x15c01
+	.uleb128 0x6b
+	.4byte	0x15bf6
+	.4byte	.LLST63
+	.uleb128 0x5b
+	.4byte	.Ldebug_ranges0+0x350
+	.uleb128 0x5d
+	.4byte	0x15c0c
+	.4byte	.LLST64
+	.uleb128 0x5d
+	.4byte	0x15c17
+	.4byte	.LLST65
+	.uleb128 0x6c
+	.4byte	0x15fd0
+	.8byte	.LBB1224
+	.8byte	.LBE1224-.LBB1224
+	.byte	0x5
+	.byte	0x4d
+	.4byte	0x112ae
+	.uleb128 0x53
+	.8byte	.LBB1225
+	.8byte	.LBE1225-.LBB1225
+	.uleb128 0x5d
+	.4byte	0x15fe0
 	.4byte	.LLST66
 	.byte	0
 	.byte	0
 	.uleb128 0x5f
-	.8byte	.LBB1188
-	.8byte	.LBE1188-.LBB1188
-	.4byte	0x11066
+	.8byte	.LBB1226
+	.8byte	.LBE1226-.LBB1226
+	.4byte	0x11302
 	.uleb128 0x54
-	.4byte	0x15a32
+	.4byte	0x15c23
 	.uleb128 0x59
-	.4byte	0x15e1e
-	.8byte	.LBB1189
-	.8byte	.LBE1189-.LBB1189
+	.4byte	0x1600f
+	.8byte	.LBB1227
+	.8byte	.LBE1227-.LBB1227
 	.byte	0x5
 	.byte	0x56
 	.uleb128 0x51
-	.4byte	0x15e39
+	.4byte	0x1602a
 	.uleb128 0x51
-	.4byte	0x15e2e
+	.4byte	0x1601f
 	.uleb128 0x53
-	.8byte	.LBB1190
-	.8byte	.LBE1190-.LBB1190
+	.8byte	.LBB1228
+	.8byte	.LBE1228-.LBB1228
 	.uleb128 0x54
-	.4byte	0x15e44
+	.4byte	0x16035
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x59
-	.4byte	0x15db3
-	.8byte	.LBB1191
-	.8byte	.LBE1191-.LBB1191
+	.4byte	0x15fa4
+	.8byte	.LBB1229
+	.8byte	.LBE1229-.LBB1229
 	.byte	0x5
 	.byte	0x55
 	.uleb128 0x51
-	.4byte	0x15dcd
+	.4byte	0x15fbe
 	.uleb128 0x51
-	.4byte	0x15dc3
+	.4byte	0x15fb4
 	.uleb128 0x59
-	.4byte	0x15ea6
-	.8byte	.LBB1192
-	.8byte	.LBE1192-.LBB1192
+	.4byte	0x16097
+	.8byte	.LBB1230
+	.8byte	.LBE1230-.LBB1230
 	.byte	0xc9
 	.byte	0x61
 	.uleb128 0x51
-	.4byte	0x15ec0
+	.4byte	0x160b1
 	.uleb128 0x51
-	.4byte	0x15eb6
+	.4byte	0x160a7
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
-	.uleb128 0x6b
-	.4byte	0x159c1
-	.8byte	.LBB1198
-	.8byte	.LBE1198-.LBB1198
-	.byte	0x7
-	.byte	0x74
-	.4byte	0x11167
-	.uleb128 0x51
-	.4byte	0x159d1
-	.uleb128 0x53
-	.8byte	.LBB1199
-	.8byte	.LBE1199-.LBB1199
-	.uleb128 0x5d
-	.4byte	0x159dc
-	.4byte	.LLST67
 	.uleb128 0x6c
-	.4byte	.Ldebug_ranges0+0x380
-	.4byte	0x11132
+	.4byte	0x15bb2
+	.8byte	.LBB1236
+	.8byte	.LBE1236-.LBB1236
+	.byte	0x8
+	.byte	0x86
+	.4byte	0x11403
+	.uleb128 0x51
+	.4byte	0x15bc2
+	.uleb128 0x53
+	.8byte	.LBB1237
+	.8byte	.LBE1237-.LBB1237
 	.uleb128 0x5d
-	.4byte	0x159e8
+	.4byte	0x15bcd
+	.4byte	.LLST67
+	.uleb128 0x68
+	.4byte	.Ldebug_ranges0+0x3a0
+	.4byte	0x113ce
+	.uleb128 0x5d
+	.4byte	0x15bd9
 	.4byte	.LLST68
 	.uleb128 0x59
-	.4byte	0x15e1e
-	.8byte	.LBB1201
-	.8byte	.LBE1201-.LBB1201
+	.4byte	0x1600f
+	.8byte	.LBB1239
+	.8byte	.LBE1239-.LBB1239
 	.byte	0x5
 	.byte	0xfe
 	.uleb128 0x51
-	.4byte	0x15e39
+	.4byte	0x1602a
 	.uleb128 0x51
-	.4byte	0x15e2e
+	.4byte	0x1601f
 	.uleb128 0x53
-	.8byte	.LBB1202
-	.8byte	.LBE1202-.LBB1202
+	.8byte	.LBB1240
+	.8byte	.LBE1240-.LBB1240
 	.uleb128 0x54
-	.4byte	0x15e44
+	.4byte	0x16035
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x59
-	.4byte	0x15ddf
-	.8byte	.LBB1203
-	.8byte	.LBE1203-.LBB1203
+	.4byte	0x15fd0
+	.8byte	.LBB1241
+	.8byte	.LBE1241-.LBB1241
 	.byte	0x5
 	.byte	0xfd
 	.uleb128 0x53
-	.8byte	.LBB1204
-	.8byte	.LBE1204-.LBB1204
+	.8byte	.LBB1242
+	.8byte	.LBE1242-.LBB1242
 	.uleb128 0x5d
-	.4byte	0x15def
+	.4byte	0x15fe0
 	.4byte	.LLST69
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x4b
-	.8byte	.LVL187
-	.4byte	0x16b8a
-	.uleb128 0x4b
-	.8byte	.LVL299
-	.4byte	0x16a0b
-	.byte	0
+	.8byte	.LVL184
+	.4byte	0x16d7b
 	.byte	0
 	.byte	0
 	.uleb128 0x58
-	.4byte	0x15929
-	.8byte	.LBB1217
-	.4byte	.Ldebug_ranges0+0x3b0
+	.4byte	0x15b1a
+	.8byte	.LBB1253
+	.4byte	.Ldebug_ranges0+0x3d0
 	.byte	0x1
-	.2byte	0xc0b
-	.4byte	0x113c0
+	.2byte	0xc02
+	.4byte	0x1164e
 	.uleb128 0x51
-	.4byte	0x1594e
+	.4byte	0x15b3f
 	.uleb128 0x51
-	.4byte	0x15943
+	.4byte	0x15b34
 	.uleb128 0x51
-	.4byte	0x15939
-	.uleb128 0x68
-	.4byte	0x15987
-	.8byte	.LBB1218
-	.4byte	.Ldebug_ranges0+0x3b0
-	.byte	0x7
+	.4byte	0x15b2a
+	.uleb128 0x69
+	.4byte	0x15b78
+	.8byte	.LBB1254
+	.4byte	.Ldebug_ranges0+0x3d0
+	.byte	0x8
 	.byte	0x93
 	.uleb128 0x51
-	.4byte	0x159ac
+	.4byte	0x15b9d
 	.uleb128 0x51
-	.4byte	0x159a1
+	.4byte	0x15b92
 	.uleb128 0x51
-	.4byte	0x15997
+	.4byte	0x15b88
 	.uleb128 0x5b
-	.4byte	.Ldebug_ranges0+0x3b0
+	.4byte	.Ldebug_ranges0+0x3d0
 	.uleb128 0x5d
-	.4byte	0x159b5
+	.4byte	0x15ba6
 	.4byte	.LLST70
-	.uleb128 0x69
-	.4byte	0x159f5
-	.8byte	.LBB1220
-	.4byte	.Ldebug_ranges0+0x410
-	.byte	0x7
-	.byte	0x72
-	.4byte	0x112e8
-	.uleb128 0x51
-	.4byte	0x15a10
 	.uleb128 0x6a
-	.4byte	0x15a05
+	.4byte	0x15be6
+	.8byte	.LBB1256
+	.4byte	.Ldebug_ranges0+0x430
+	.byte	0x8
+	.byte	0x72
+	.4byte	0x11576
+	.uleb128 0x51
+	.4byte	0x15c01
+	.uleb128 0x6b
+	.4byte	0x15bf6
 	.4byte	.LLST71
 	.uleb128 0x5b
-	.4byte	.Ldebug_ranges0+0x410
+	.4byte	.Ldebug_ranges0+0x430
 	.uleb128 0x5d
-	.4byte	0x15a1b
+	.4byte	0x15c0c
 	.4byte	.LLST72
 	.uleb128 0x5d
-	.4byte	0x15a26
+	.4byte	0x15c17
 	.4byte	.LLST73
-	.uleb128 0x6b
-	.4byte	0x15ddf
-	.8byte	.LBB1222
-	.8byte	.LBE1222-.LBB1222
-	.byte	0x5
-	.byte	0x4d
-	.4byte	0x1124e
-	.uleb128 0x53
-	.8byte	.LBB1223
-	.8byte	.LBE1223-.LBB1223
-	.uleb128 0x5d
-	.4byte	0x15def
-	.4byte	.LLST74
-	.byte	0
-	.byte	0
-	.uleb128 0x5f
-	.8byte	.LBB1224
-	.8byte	.LBE1224-.LBB1224
-	.4byte	0x112a2
-	.uleb128 0x54
-	.4byte	0x15a32
-	.uleb128 0x59
-	.4byte	0x15e1e
-	.8byte	.LBB1225
-	.8byte	.LBE1225-.LBB1225
-	.byte	0x5
-	.byte	0x56
-	.uleb128 0x51
-	.4byte	0x15e39
-	.uleb128 0x51
-	.4byte	0x15e2e
-	.uleb128 0x53
-	.8byte	.LBB1226
-	.8byte	.LBE1226-.LBB1226
-	.uleb128 0x54
-	.4byte	0x15e44
-	.byte	0
-	.byte	0
-	.byte	0
-	.uleb128 0x59
-	.4byte	0x15db3
-	.8byte	.LBB1227
-	.8byte	.LBE1227-.LBB1227
-	.byte	0x5
-	.byte	0x55
-	.uleb128 0x51
-	.4byte	0x15dcd
-	.uleb128 0x51
-	.4byte	0x15dc3
-	.uleb128 0x59
-	.4byte	0x15ea6
-	.8byte	.LBB1228
-	.8byte	.LBE1228-.LBB1228
-	.byte	0xc9
-	.byte	0x61
-	.uleb128 0x51
-	.4byte	0x15ec0
-	.uleb128 0x51
-	.4byte	0x15eb6
-	.byte	0
-	.byte	0
-	.byte	0
-	.byte	0
-	.uleb128 0x6b
-	.4byte	0x159c1
-	.8byte	.LBB1234
-	.8byte	.LBE1234-.LBB1234
-	.byte	0x7
-	.byte	0x74
-	.4byte	0x113a3
-	.uleb128 0x51
-	.4byte	0x159d1
-	.uleb128 0x53
-	.8byte	.LBB1235
-	.8byte	.LBE1235-.LBB1235
-	.uleb128 0x5d
-	.4byte	0x159dc
-	.4byte	.LLST75
 	.uleb128 0x6c
-	.4byte	.Ldebug_ranges0+0x460
-	.4byte	0x1136e
-	.uleb128 0x5d
-	.4byte	0x159e8
-	.4byte	.LLST76
-	.uleb128 0x59
-	.4byte	0x15e1e
-	.8byte	.LBB1237
-	.8byte	.LBE1237-.LBB1237
-	.byte	0x5
-	.byte	0xfe
-	.uleb128 0x51
-	.4byte	0x15e39
-	.uleb128 0x51
-	.4byte	0x15e2e
-	.uleb128 0x53
-	.8byte	.LBB1238
-	.8byte	.LBE1238-.LBB1238
-	.uleb128 0x54
-	.4byte	0x15e44
-	.byte	0
-	.byte	0
-	.byte	0
-	.uleb128 0x59
-	.4byte	0x15ddf
-	.8byte	.LBB1239
-	.8byte	.LBE1239-.LBB1239
-	.byte	0x5
-	.byte	0xfd
-	.uleb128 0x53
-	.8byte	.LBB1240
-	.8byte	.LBE1240-.LBB1240
-	.uleb128 0x5d
-	.4byte	0x15def
-	.4byte	.LLST77
-	.byte	0
-	.byte	0
-	.byte	0
-	.byte	0
-	.uleb128 0x4b
-	.8byte	.LVL201
-	.4byte	0x16b8a
-	.uleb128 0x4b
-	.8byte	.LVL327
-	.4byte	0x16a0b
-	.byte	0
-	.byte	0
-	.byte	0
-	.uleb128 0x58
-	.4byte	0x158fa
-	.8byte	.LBB1253
-	.4byte	.Ldebug_ranges0+0x490
-	.byte	0x1
-	.2byte	0xb97
-	.4byte	0x115e0
-	.uleb128 0x51
-	.4byte	0x1591f
-	.uleb128 0x51
-	.4byte	0x15914
-	.uleb128 0x51
-	.4byte	0x1590a
-	.uleb128 0x68
-	.4byte	0x15958
-	.8byte	.LBB1254
-	.4byte	.Ldebug_ranges0+0x490
-	.byte	0x7
-	.byte	0x9b
-	.uleb128 0x51
-	.4byte	0x1597d
-	.uleb128 0x51
-	.4byte	0x15972
-	.uleb128 0x51
-	.4byte	0x15968
-	.uleb128 0x69
-	.4byte	0x159f5
-	.8byte	.LBB1256
-	.4byte	.Ldebug_ranges0+0x4e0
-	.byte	0x7
-	.byte	0x84
-	.4byte	0x11516
-	.uleb128 0x51
-	.4byte	0x15a10
-	.uleb128 0x6a
-	.4byte	0x15a05
-	.4byte	.LLST78
-	.uleb128 0x5b
-	.4byte	.Ldebug_ranges0+0x4e0
-	.uleb128 0x5d
-	.4byte	0x15a1b
-	.4byte	.LLST79
-	.uleb128 0x5d
-	.4byte	0x15a26
-	.4byte	.LLST80
-	.uleb128 0x6b
-	.4byte	0x15ddf
+	.4byte	0x15fd0
 	.8byte	.LBB1258
 	.8byte	.LBE1258-.LBB1258
 	.byte	0x5
 	.byte	0x4d
-	.4byte	0x1147c
+	.4byte	0x114dc
 	.uleb128 0x53
 	.8byte	.LBB1259
 	.8byte	.LBE1259-.LBB1259
 	.uleb128 0x5d
-	.4byte	0x15def
-	.4byte	.LLST81
+	.4byte	0x15fe0
+	.4byte	.LLST74
 	.byte	0
 	.byte	0
 	.uleb128 0x5f
 	.8byte	.LBB1260
 	.8byte	.LBE1260-.LBB1260
-	.4byte	0x114d0
+	.4byte	0x11530
 	.uleb128 0x54
-	.4byte	0x15a32
+	.4byte	0x15c23
 	.uleb128 0x59
-	.4byte	0x15e1e
+	.4byte	0x1600f
 	.8byte	.LBB1261
 	.8byte	.LBE1261-.LBB1261
 	.byte	0x5
 	.byte	0x56
 	.uleb128 0x51
-	.4byte	0x15e39
+	.4byte	0x1602a
 	.uleb128 0x51
-	.4byte	0x15e2e
+	.4byte	0x1601f
 	.uleb128 0x53
 	.8byte	.LBB1262
 	.8byte	.LBE1262-.LBB1262
 	.uleb128 0x54
-	.4byte	0x15e44
+	.4byte	0x16035
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x59
-	.4byte	0x15db3
+	.4byte	0x15fa4
 	.8byte	.LBB1263
 	.8byte	.LBE1263-.LBB1263
 	.byte	0x5
 	.byte	0x55
 	.uleb128 0x51
-	.4byte	0x15dcd
+	.4byte	0x15fbe
 	.uleb128 0x51
-	.4byte	0x15dc3
+	.4byte	0x15fb4
 	.uleb128 0x59
-	.4byte	0x15ea6
+	.4byte	0x16097
 	.8byte	.LBB1264
 	.8byte	.LBE1264-.LBB1264
 	.byte	0xc9
 	.byte	0x61
 	.uleb128 0x51
-	.4byte	0x15ec0
+	.4byte	0x160b1
 	.uleb128 0x51
-	.4byte	0x15eb6
+	.4byte	0x160a7
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
-	.uleb128 0x6b
-	.4byte	0x159c1
+	.uleb128 0x6c
+	.4byte	0x15bb2
 	.8byte	.LBB1270
 	.8byte	.LBE1270-.LBB1270
-	.byte	0x7
-	.byte	0x86
-	.4byte	0x115d1
+	.byte	0x8
+	.byte	0x74
+	.4byte	0x11631
 	.uleb128 0x51
-	.4byte	0x159d1
+	.4byte	0x15bc2
 	.uleb128 0x53
 	.8byte	.LBB1271
 	.8byte	.LBE1271-.LBB1271
 	.uleb128 0x5d
-	.4byte	0x159dc
-	.4byte	.LLST82
-	.uleb128 0x6c
-	.4byte	.Ldebug_ranges0+0x530
-	.4byte	0x1159c
+	.4byte	0x15bcd
+	.4byte	.LLST75
+	.uleb128 0x68
+	.4byte	.Ldebug_ranges0+0x480
+	.4byte	0x115fc
 	.uleb128 0x5d
-	.4byte	0x159e8
-	.4byte	.LLST83
+	.4byte	0x15bd9
+	.4byte	.LLST76
 	.uleb128 0x59
-	.4byte	0x15e1e
+	.4byte	0x1600f
 	.8byte	.LBB1273
 	.8byte	.LBE1273-.LBB1273
 	.byte	0x5
 	.byte	0xfe
 	.uleb128 0x51
-	.4byte	0x15e39
+	.4byte	0x1602a
 	.uleb128 0x51
-	.4byte	0x15e2e
+	.4byte	0x1601f
 	.uleb128 0x53
 	.8byte	.LBB1274
 	.8byte	.LBE1274-.LBB1274
 	.uleb128 0x54
-	.4byte	0x15e44
+	.4byte	0x16035
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x59
-	.4byte	0x15ddf
+	.4byte	0x15fd0
 	.8byte	.LBB1275
 	.8byte	.LBE1275-.LBB1275
 	.byte	0x5
@@ -48888,807 +49042,943 @@
 	.8byte	.LBB1276
 	.8byte	.LBE1276-.LBB1276
 	.uleb128 0x5d
-	.4byte	0x15def
+	.4byte	0x15fe0
+	.4byte	.LLST77
+	.byte	0
+	.byte	0
+	.byte	0
+	.byte	0
+	.uleb128 0x4b
+	.8byte	.LVL197
+	.4byte	0x16d87
+	.uleb128 0x4b
+	.8byte	.LVL294
+	.4byte	0x16bfc
+	.byte	0
+	.byte	0
+	.byte	0
+	.uleb128 0x58
+	.4byte	0x15aeb
+	.8byte	.LBB1289
+	.4byte	.Ldebug_ranges0+0x4b0
+	.byte	0x1
+	.2byte	0xc10
+	.4byte	0x1186e
+	.uleb128 0x51
+	.4byte	0x15b10
+	.uleb128 0x51
+	.4byte	0x15b05
+	.uleb128 0x51
+	.4byte	0x15afb
+	.uleb128 0x69
+	.4byte	0x15b49
+	.8byte	.LBB1290
+	.4byte	.Ldebug_ranges0+0x4b0
+	.byte	0x8
+	.byte	0x9b
+	.uleb128 0x51
+	.4byte	0x15b6e
+	.uleb128 0x51
+	.4byte	0x15b63
+	.uleb128 0x51
+	.4byte	0x15b59
+	.uleb128 0x6a
+	.4byte	0x15be6
+	.8byte	.LBB1292
+	.4byte	.Ldebug_ranges0+0x510
+	.byte	0x8
+	.byte	0x84
+	.4byte	0x117a4
+	.uleb128 0x51
+	.4byte	0x15c01
+	.uleb128 0x6b
+	.4byte	0x15bf6
+	.4byte	.LLST78
+	.uleb128 0x5b
+	.4byte	.Ldebug_ranges0+0x510
+	.uleb128 0x5d
+	.4byte	0x15c0c
+	.4byte	.LLST79
+	.uleb128 0x5d
+	.4byte	0x15c17
+	.4byte	.LLST80
+	.uleb128 0x6c
+	.4byte	0x15fd0
+	.8byte	.LBB1294
+	.8byte	.LBE1294-.LBB1294
+	.byte	0x5
+	.byte	0x4d
+	.4byte	0x1170a
+	.uleb128 0x53
+	.8byte	.LBB1295
+	.8byte	.LBE1295-.LBB1295
+	.uleb128 0x5d
+	.4byte	0x15fe0
+	.4byte	.LLST81
+	.byte	0
+	.byte	0
+	.uleb128 0x5f
+	.8byte	.LBB1296
+	.8byte	.LBE1296-.LBB1296
+	.4byte	0x1175e
+	.uleb128 0x54
+	.4byte	0x15c23
+	.uleb128 0x59
+	.4byte	0x1600f
+	.8byte	.LBB1297
+	.8byte	.LBE1297-.LBB1297
+	.byte	0x5
+	.byte	0x56
+	.uleb128 0x51
+	.4byte	0x1602a
+	.uleb128 0x51
+	.4byte	0x1601f
+	.uleb128 0x53
+	.8byte	.LBB1298
+	.8byte	.LBE1298-.LBB1298
+	.uleb128 0x54
+	.4byte	0x16035
+	.byte	0
+	.byte	0
+	.byte	0
+	.uleb128 0x59
+	.4byte	0x15fa4
+	.8byte	.LBB1299
+	.8byte	.LBE1299-.LBB1299
+	.byte	0x5
+	.byte	0x55
+	.uleb128 0x51
+	.4byte	0x15fbe
+	.uleb128 0x51
+	.4byte	0x15fb4
+	.uleb128 0x59
+	.4byte	0x16097
+	.8byte	.LBB1300
+	.8byte	.LBE1300-.LBB1300
+	.byte	0xc9
+	.byte	0x61
+	.uleb128 0x51
+	.4byte	0x160b1
+	.uleb128 0x51
+	.4byte	0x160a7
+	.byte	0
+	.byte	0
+	.byte	0
+	.byte	0
+	.uleb128 0x6c
+	.4byte	0x15bb2
+	.8byte	.LBB1308
+	.8byte	.LBE1308-.LBB1308
+	.byte	0x8
+	.byte	0x86
+	.4byte	0x1185f
+	.uleb128 0x51
+	.4byte	0x15bc2
+	.uleb128 0x53
+	.8byte	.LBB1309
+	.8byte	.LBE1309-.LBB1309
+	.uleb128 0x5d
+	.4byte	0x15bcd
+	.4byte	.LLST82
+	.uleb128 0x68
+	.4byte	.Ldebug_ranges0+0x560
+	.4byte	0x1182a
+	.uleb128 0x5d
+	.4byte	0x15bd9
+	.4byte	.LLST83
+	.uleb128 0x59
+	.4byte	0x1600f
+	.8byte	.LBB1311
+	.8byte	.LBE1311-.LBB1311
+	.byte	0x5
+	.byte	0xfe
+	.uleb128 0x51
+	.4byte	0x1602a
+	.uleb128 0x51
+	.4byte	0x1601f
+	.uleb128 0x53
+	.8byte	.LBB1312
+	.8byte	.LBE1312-.LBB1312
+	.uleb128 0x54
+	.4byte	0x16035
+	.byte	0
+	.byte	0
+	.byte	0
+	.uleb128 0x59
+	.4byte	0x15fd0
+	.8byte	.LBB1313
+	.8byte	.LBE1313-.LBB1313
+	.byte	0x5
+	.byte	0xfd
+	.uleb128 0x53
+	.8byte	.LBB1314
+	.8byte	.LBE1314-.LBB1314
+	.uleb128 0x5d
+	.4byte	0x15fe0
 	.4byte	.LLST84
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x4b
-	.8byte	.LVL226
-	.4byte	0x16b96
+	.8byte	.LVL304
+	.4byte	0x16d7b
 	.byte	0
 	.byte	0
 	.uleb128 0x58
-	.4byte	0x15929
-	.8byte	.LBB1287
-	.4byte	.Ldebug_ranges0+0x560
+	.4byte	0x15b1a
+	.8byte	.LBB1325
+	.4byte	.Ldebug_ranges0+0x590
 	.byte	0x1
-	.2byte	0xbf7
-	.4byte	0x1181c
+	.2byte	0xbb6
+	.4byte	0x11a99
 	.uleb128 0x51
-	.4byte	0x1594e
+	.4byte	0x15b3f
 	.uleb128 0x51
-	.4byte	0x15943
+	.4byte	0x15b34
 	.uleb128 0x51
-	.4byte	0x15939
-	.uleb128 0x68
-	.4byte	0x15987
-	.8byte	.LBB1288
-	.4byte	.Ldebug_ranges0+0x560
-	.byte	0x7
+	.4byte	0x15b2a
+	.uleb128 0x69
+	.4byte	0x15b78
+	.8byte	.LBB1326
+	.4byte	.Ldebug_ranges0+0x590
+	.byte	0x8
 	.byte	0x93
 	.uleb128 0x51
-	.4byte	0x159ac
+	.4byte	0x15b9d
 	.uleb128 0x51
-	.4byte	0x159a1
+	.4byte	0x15b92
 	.uleb128 0x51
-	.4byte	0x15997
+	.4byte	0x15b88
 	.uleb128 0x5b
-	.4byte	.Ldebug_ranges0+0x560
-	.uleb128 0x5d
-	.4byte	0x159b5
-	.4byte	.LLST85
-	.uleb128 0x69
-	.4byte	0x159f5
-	.8byte	.LBB1290
-	.4byte	.Ldebug_ranges0+0x5c0
-	.byte	0x7
-	.byte	0x72
-	.4byte	0x11744
-	.uleb128 0x51
-	.4byte	0x15a10
+	.4byte	.Ldebug_ranges0+0x590
+	.uleb128 0x54
+	.4byte	0x15ba6
 	.uleb128 0x6a
-	.4byte	0x15a05
-	.4byte	.LLST86
-	.uleb128 0x5b
-	.4byte	.Ldebug_ranges0+0x5c0
-	.uleb128 0x5d
-	.4byte	0x15a1b
-	.4byte	.LLST87
-	.uleb128 0x5d
-	.4byte	0x15a26
-	.4byte	.LLST88
+	.4byte	0x15be6
+	.8byte	.LBB1328
+	.4byte	.Ldebug_ranges0+0x5d0
+	.byte	0x8
+	.byte	0x72
+	.4byte	0x119ce
+	.uleb128 0x51
+	.4byte	0x15c01
 	.uleb128 0x6b
-	.4byte	0x15ddf
-	.8byte	.LBB1292
-	.8byte	.LBE1292-.LBB1292
+	.4byte	0x15bf6
+	.4byte	.LLST85
+	.uleb128 0x5b
+	.4byte	.Ldebug_ranges0+0x5d0
+	.uleb128 0x5d
+	.4byte	0x15c0c
+	.4byte	.LLST86
+	.uleb128 0x5d
+	.4byte	0x15c17
+	.4byte	.LLST87
+	.uleb128 0x6c
+	.4byte	0x15fd0
+	.8byte	.LBB1330
+	.8byte	.LBE1330-.LBB1330
 	.byte	0x5
 	.byte	0x4d
-	.4byte	0x116aa
+	.4byte	0x11934
 	.uleb128 0x53
-	.8byte	.LBB1293
-	.8byte	.LBE1293-.LBB1293
+	.8byte	.LBB1331
+	.8byte	.LBE1331-.LBB1331
 	.uleb128 0x5d
-	.4byte	0x15def
-	.4byte	.LLST89
+	.4byte	0x15fe0
+	.4byte	.LLST88
 	.byte	0
 	.byte	0
 	.uleb128 0x5f
-	.8byte	.LBB1294
-	.8byte	.LBE1294-.LBB1294
-	.4byte	0x116fe
+	.8byte	.LBB1332
+	.8byte	.LBE1332-.LBB1332
+	.4byte	0x11988
 	.uleb128 0x54
-	.4byte	0x15a32
+	.4byte	0x15c23
 	.uleb128 0x59
-	.4byte	0x15e1e
-	.8byte	.LBB1295
-	.8byte	.LBE1295-.LBB1295
+	.4byte	0x1600f
+	.8byte	.LBB1333
+	.8byte	.LBE1333-.LBB1333
 	.byte	0x5
 	.byte	0x56
 	.uleb128 0x51
-	.4byte	0x15e39
+	.4byte	0x1602a
 	.uleb128 0x51
-	.4byte	0x15e2e
+	.4byte	0x1601f
 	.uleb128 0x53
-	.8byte	.LBB1296
-	.8byte	.LBE1296-.LBB1296
+	.8byte	.LBB1334
+	.8byte	.LBE1334-.LBB1334
 	.uleb128 0x54
-	.4byte	0x15e44
+	.4byte	0x16035
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x59
-	.4byte	0x15db3
-	.8byte	.LBB1297
-	.8byte	.LBE1297-.LBB1297
+	.4byte	0x15fa4
+	.8byte	.LBB1335
+	.8byte	.LBE1335-.LBB1335
 	.byte	0x5
 	.byte	0x55
 	.uleb128 0x51
-	.4byte	0x15dcd
+	.4byte	0x15fbe
 	.uleb128 0x51
-	.4byte	0x15dc3
+	.4byte	0x15fb4
 	.uleb128 0x59
-	.4byte	0x15ea6
-	.8byte	.LBB1298
-	.8byte	.LBE1298-.LBB1298
+	.4byte	0x16097
+	.8byte	.LBB1336
+	.8byte	.LBE1336-.LBB1336
 	.byte	0xc9
 	.byte	0x61
 	.uleb128 0x51
-	.4byte	0x15ec0
+	.4byte	0x160b1
 	.uleb128 0x51
-	.4byte	0x15eb6
+	.4byte	0x160a7
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
-	.uleb128 0x6b
-	.4byte	0x159c1
-	.8byte	.LBB1304
-	.8byte	.LBE1304-.LBB1304
-	.byte	0x7
-	.byte	0x74
-	.4byte	0x117ff
-	.uleb128 0x51
-	.4byte	0x159d1
-	.uleb128 0x53
-	.8byte	.LBB1305
-	.8byte	.LBE1305-.LBB1305
-	.uleb128 0x5d
-	.4byte	0x159dc
-	.4byte	.LLST90
 	.uleb128 0x6c
-	.4byte	.Ldebug_ranges0+0x610
-	.4byte	0x117ca
+	.4byte	0x15bb2
+	.8byte	.LBB1340
+	.8byte	.LBE1340-.LBB1340
+	.byte	0x8
+	.byte	0x74
+	.4byte	0x11a89
+	.uleb128 0x51
+	.4byte	0x15bc2
+	.uleb128 0x53
+	.8byte	.LBB1341
+	.8byte	.LBE1341-.LBB1341
 	.uleb128 0x5d
-	.4byte	0x159e8
-	.4byte	.LLST91
+	.4byte	0x15bcd
+	.4byte	.LLST89
+	.uleb128 0x68
+	.4byte	.Ldebug_ranges0+0x610
+	.4byte	0x11a54
+	.uleb128 0x5d
+	.4byte	0x15bd9
+	.4byte	.LLST90
 	.uleb128 0x59
-	.4byte	0x15e1e
-	.8byte	.LBB1307
-	.8byte	.LBE1307-.LBB1307
+	.4byte	0x1600f
+	.8byte	.LBB1343
+	.8byte	.LBE1343-.LBB1343
 	.byte	0x5
 	.byte	0xfe
 	.uleb128 0x51
-	.4byte	0x15e39
+	.4byte	0x1602a
 	.uleb128 0x51
-	.4byte	0x15e2e
+	.4byte	0x1601f
 	.uleb128 0x53
-	.8byte	.LBB1308
-	.8byte	.LBE1308-.LBB1308
+	.8byte	.LBB1344
+	.8byte	.LBE1344-.LBB1344
 	.uleb128 0x54
-	.4byte	0x15e44
+	.4byte	0x16035
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x59
-	.4byte	0x15ddf
-	.8byte	.LBB1309
-	.8byte	.LBE1309-.LBB1309
+	.4byte	0x15fd0
+	.8byte	.LBB1345
+	.8byte	.LBE1345-.LBB1345
 	.byte	0x5
 	.byte	0xfd
 	.uleb128 0x53
-	.8byte	.LBB1310
-	.8byte	.LBE1310-.LBB1310
+	.8byte	.LBB1346
+	.8byte	.LBE1346-.LBB1346
 	.uleb128 0x5d
-	.4byte	0x15def
-	.4byte	.LLST92
+	.4byte	0x15fe0
+	.4byte	.LLST91
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x4b
-	.8byte	.LVL241
-	.4byte	0x16b8a
-	.uleb128 0x4b
-	.8byte	.LVL321
-	.4byte	0x16a0b
+	.8byte	.LVL220
+	.4byte	0x16d87
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x58
-	.4byte	0x158fa
-	.8byte	.LBB1323
+	.4byte	0x15b1a
+	.8byte	.LBB1354
 	.4byte	.Ldebug_ranges0+0x640
 	.byte	0x1
-	.2byte	0xc05
-	.4byte	0x11a3c
+	.2byte	0xb9e
+	.4byte	0x11cd5
 	.uleb128 0x51
-	.4byte	0x1591f
+	.4byte	0x15b3f
 	.uleb128 0x51
-	.4byte	0x15914
+	.4byte	0x15b34
 	.uleb128 0x51
-	.4byte	0x1590a
-	.uleb128 0x68
-	.4byte	0x15958
-	.8byte	.LBB1324
-	.4byte	.Ldebug_ranges0+0x640
-	.byte	0x7
-	.byte	0x9b
-	.uleb128 0x51
-	.4byte	0x1597d
-	.uleb128 0x51
-	.4byte	0x15972
-	.uleb128 0x51
-	.4byte	0x15968
+	.4byte	0x15b2a
 	.uleb128 0x69
-	.4byte	0x159f5
-	.8byte	.LBB1326
-	.4byte	.Ldebug_ranges0+0x6a0
-	.byte	0x7
-	.byte	0x84
-	.4byte	0x11972
+	.4byte	0x15b78
+	.8byte	.LBB1355
+	.4byte	.Ldebug_ranges0+0x640
+	.byte	0x8
+	.byte	0x93
 	.uleb128 0x51
-	.4byte	0x15a10
+	.4byte	0x15b9d
+	.uleb128 0x51
+	.4byte	0x15b92
+	.uleb128 0x51
+	.4byte	0x15b88
+	.uleb128 0x5b
+	.4byte	.Ldebug_ranges0+0x640
+	.uleb128 0x5d
+	.4byte	0x15ba6
+	.4byte	.LLST92
 	.uleb128 0x6a
-	.4byte	0x15a05
+	.4byte	0x15be6
+	.8byte	.LBB1357
+	.4byte	.Ldebug_ranges0+0x690
+	.byte	0x8
+	.byte	0x72
+	.4byte	0x11bfd
+	.uleb128 0x51
+	.4byte	0x15c01
+	.uleb128 0x6b
+	.4byte	0x15bf6
 	.4byte	.LLST93
 	.uleb128 0x5b
-	.4byte	.Ldebug_ranges0+0x6a0
+	.4byte	.Ldebug_ranges0+0x690
 	.uleb128 0x5d
-	.4byte	0x15a1b
+	.4byte	0x15c0c
 	.4byte	.LLST94
 	.uleb128 0x5d
-	.4byte	0x15a26
+	.4byte	0x15c17
 	.4byte	.LLST95
-	.uleb128 0x6b
-	.4byte	0x15ddf
-	.8byte	.LBB1328
-	.8byte	.LBE1328-.LBB1328
+	.uleb128 0x6c
+	.4byte	0x15fd0
+	.8byte	.LBB1359
+	.8byte	.LBE1359-.LBB1359
 	.byte	0x5
 	.byte	0x4d
-	.4byte	0x118d8
+	.4byte	0x11b63
 	.uleb128 0x53
-	.8byte	.LBB1329
-	.8byte	.LBE1329-.LBB1329
+	.8byte	.LBB1360
+	.8byte	.LBE1360-.LBB1360
 	.uleb128 0x5d
-	.4byte	0x15def
+	.4byte	0x15fe0
 	.4byte	.LLST96
 	.byte	0
 	.byte	0
 	.uleb128 0x5f
-	.8byte	.LBB1330
-	.8byte	.LBE1330-.LBB1330
-	.4byte	0x1192c
+	.8byte	.LBB1361
+	.8byte	.LBE1361-.LBB1361
+	.4byte	0x11bb7
 	.uleb128 0x54
-	.4byte	0x15a32
+	.4byte	0x15c23
 	.uleb128 0x59
-	.4byte	0x15e1e
-	.8byte	.LBB1331
-	.8byte	.LBE1331-.LBB1331
+	.4byte	0x1600f
+	.8byte	.LBB1362
+	.8byte	.LBE1362-.LBB1362
 	.byte	0x5
 	.byte	0x56
 	.uleb128 0x51
-	.4byte	0x15e39
+	.4byte	0x1602a
 	.uleb128 0x51
-	.4byte	0x15e2e
+	.4byte	0x1601f
 	.uleb128 0x53
-	.8byte	.LBB1332
-	.8byte	.LBE1332-.LBB1332
+	.8byte	.LBB1363
+	.8byte	.LBE1363-.LBB1363
 	.uleb128 0x54
-	.4byte	0x15e44
+	.4byte	0x16035
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x59
-	.4byte	0x15db3
-	.8byte	.LBB1333
-	.8byte	.LBE1333-.LBB1333
+	.4byte	0x15fa4
+	.8byte	.LBB1364
+	.8byte	.LBE1364-.LBB1364
 	.byte	0x5
 	.byte	0x55
 	.uleb128 0x51
-	.4byte	0x15dcd
+	.4byte	0x15fbe
 	.uleb128 0x51
-	.4byte	0x15dc3
+	.4byte	0x15fb4
 	.uleb128 0x59
-	.4byte	0x15ea6
-	.8byte	.LBB1334
-	.8byte	.LBE1334-.LBB1334
+	.4byte	0x16097
+	.8byte	.LBB1365
+	.8byte	.LBE1365-.LBB1365
 	.byte	0xc9
 	.byte	0x61
 	.uleb128 0x51
-	.4byte	0x15ec0
+	.4byte	0x160b1
 	.uleb128 0x51
-	.4byte	0x15eb6
+	.4byte	0x160a7
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
-	.uleb128 0x6b
-	.4byte	0x159c1
-	.8byte	.LBB1342
-	.8byte	.LBE1342-.LBB1342
-	.byte	0x7
-	.byte	0x86
-	.4byte	0x11a2d
-	.uleb128 0x51
-	.4byte	0x159d1
-	.uleb128 0x53
-	.8byte	.LBB1343
-	.8byte	.LBE1343-.LBB1343
-	.uleb128 0x5d
-	.4byte	0x159dc
-	.4byte	.LLST97
 	.uleb128 0x6c
-	.4byte	.Ldebug_ranges0+0x6f0
-	.4byte	0x119f8
+	.4byte	0x15bb2
+	.8byte	.LBB1369
+	.8byte	.LBE1369-.LBB1369
+	.byte	0x8
+	.byte	0x74
+	.4byte	0x11cb8
+	.uleb128 0x51
+	.4byte	0x15bc2
+	.uleb128 0x53
+	.8byte	.LBB1370
+	.8byte	.LBE1370-.LBB1370
 	.uleb128 0x5d
-	.4byte	0x159e8
+	.4byte	0x15bcd
+	.4byte	.LLST97
+	.uleb128 0x68
+	.4byte	.Ldebug_ranges0+0x6d0
+	.4byte	0x11c83
+	.uleb128 0x5d
+	.4byte	0x15bd9
 	.4byte	.LLST98
 	.uleb128 0x59
-	.4byte	0x15e1e
-	.8byte	.LBB1345
-	.8byte	.LBE1345-.LBB1345
+	.4byte	0x1600f
+	.8byte	.LBB1372
+	.8byte	.LBE1372-.LBB1372
 	.byte	0x5
 	.byte	0xfe
 	.uleb128 0x51
-	.4byte	0x15e39
+	.4byte	0x1602a
 	.uleb128 0x51
-	.4byte	0x15e2e
+	.4byte	0x1601f
 	.uleb128 0x53
-	.8byte	.LBB1346
-	.8byte	.LBE1346-.LBB1346
+	.8byte	.LBB1373
+	.8byte	.LBE1373-.LBB1373
 	.uleb128 0x54
-	.4byte	0x15e44
+	.4byte	0x16035
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x59
-	.4byte	0x15ddf
-	.8byte	.LBB1347
-	.8byte	.LBE1347-.LBB1347
+	.4byte	0x15fd0
+	.8byte	.LBB1374
+	.8byte	.LBE1374-.LBB1374
 	.byte	0x5
 	.byte	0xfd
 	.uleb128 0x53
-	.8byte	.LBB1348
-	.8byte	.LBE1348-.LBB1348
+	.8byte	.LBB1375
+	.8byte	.LBE1375-.LBB1375
 	.uleb128 0x5d
-	.4byte	0x15def
+	.4byte	0x15fe0
 	.4byte	.LLST99
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x4b
-	.8byte	.LVL309
-	.4byte	0x16b96
+	.8byte	.LVL237
+	.4byte	0x16d87
+	.uleb128 0x4b
+	.8byte	.LVL330
+	.4byte	0x16bfc
+	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x58
-	.4byte	0x15929
-	.8byte	.LBB1359
-	.4byte	.Ldebug_ranges0+0x720
+	.4byte	0x15aeb
+	.8byte	.LBB1385
+	.4byte	.Ldebug_ranges0+0x700
 	.byte	0x1
-	.2byte	0xbb2
-	.4byte	0x11c67
+	.2byte	0xbae
+	.4byte	0x11e8f
 	.uleb128 0x51
-	.4byte	0x1594e
+	.4byte	0x15b10
 	.uleb128 0x51
-	.4byte	0x15943
+	.4byte	0x15b05
 	.uleb128 0x51
-	.4byte	0x15939
-	.uleb128 0x68
-	.4byte	0x15987
-	.8byte	.LBB1360
-	.4byte	.Ldebug_ranges0+0x720
-	.byte	0x7
-	.byte	0x93
-	.uleb128 0x51
-	.4byte	0x159ac
-	.uleb128 0x51
-	.4byte	0x159a1
-	.uleb128 0x51
-	.4byte	0x15997
-	.uleb128 0x5b
-	.4byte	.Ldebug_ranges0+0x720
-	.uleb128 0x54
-	.4byte	0x159b5
+	.4byte	0x15afb
 	.uleb128 0x69
-	.4byte	0x159f5
-	.8byte	.LBB1362
-	.4byte	.Ldebug_ranges0+0x760
-	.byte	0x7
-	.byte	0x72
-	.4byte	0x11b9c
+	.4byte	0x15b49
+	.8byte	.LBB1386
+	.4byte	.Ldebug_ranges0+0x700
+	.byte	0x8
+	.byte	0x9b
 	.uleb128 0x51
-	.4byte	0x15a10
+	.4byte	0x15b6e
+	.uleb128 0x51
+	.4byte	0x15b63
+	.uleb128 0x51
+	.4byte	0x15b59
 	.uleb128 0x6a
-	.4byte	0x15a05
+	.4byte	0x15be6
+	.8byte	.LBB1388
+	.4byte	.Ldebug_ranges0+0x760
+	.byte	0x8
+	.byte	0x84
+	.4byte	0x11df2
+	.uleb128 0x51
+	.4byte	0x15c01
+	.uleb128 0x6b
+	.4byte	0x15bf6
 	.4byte	.LLST100
 	.uleb128 0x5b
 	.4byte	.Ldebug_ranges0+0x760
 	.uleb128 0x5d
-	.4byte	0x15a1b
+	.4byte	0x15c0c
 	.4byte	.LLST101
 	.uleb128 0x5d
-	.4byte	0x15a26
+	.4byte	0x15c17
 	.4byte	.LLST102
-	.uleb128 0x6b
-	.4byte	0x15ddf
-	.8byte	.LBB1364
-	.8byte	.LBE1364-.LBB1364
+	.uleb128 0x6c
+	.4byte	0x15fd0
+	.8byte	.LBB1390
+	.8byte	.LBE1390-.LBB1390
 	.byte	0x5
 	.byte	0x4d
-	.4byte	0x11b02
+	.4byte	0x11d91
 	.uleb128 0x53
-	.8byte	.LBB1365
-	.8byte	.LBE1365-.LBB1365
+	.8byte	.LBB1391
+	.8byte	.LBE1391-.LBB1391
 	.uleb128 0x5d
-	.4byte	0x15def
+	.4byte	0x15fe0
 	.4byte	.LLST103
 	.byte	0
 	.byte	0
-	.uleb128 0x5f
-	.8byte	.LBB1366
-	.8byte	.LBE1366-.LBB1366
-	.4byte	0x11b56
-	.uleb128 0x54
-	.4byte	0x15a32
-	.uleb128 0x59
-	.4byte	0x15e1e
-	.8byte	.LBB1367
-	.8byte	.LBE1367-.LBB1367
-	.byte	0x5
-	.byte	0x56
-	.uleb128 0x51
-	.4byte	0x15e39
-	.uleb128 0x51
-	.4byte	0x15e2e
-	.uleb128 0x53
-	.8byte	.LBB1368
-	.8byte	.LBE1368-.LBB1368
-	.uleb128 0x54
-	.4byte	0x15e44
-	.byte	0
-	.byte	0
-	.byte	0
-	.uleb128 0x59
-	.4byte	0x15db3
-	.8byte	.LBB1369
-	.8byte	.LBE1369-.LBB1369
+	.uleb128 0x6c
+	.4byte	0x15fa4
+	.8byte	.LBB1392
+	.8byte	.LBE1392-.LBB1392
 	.byte	0x5
 	.byte	0x55
+	.4byte	0x11dd9
 	.uleb128 0x51
-	.4byte	0x15dcd
+	.4byte	0x15fbe
 	.uleb128 0x51
-	.4byte	0x15dc3
+	.4byte	0x15fb4
 	.uleb128 0x59
-	.4byte	0x15ea6
-	.8byte	.LBB1370
-	.8byte	.LBE1370-.LBB1370
+	.4byte	0x16097
+	.8byte	.LBB1393
+	.8byte	.LBE1393-.LBB1393
 	.byte	0xc9
 	.byte	0x61
 	.uleb128 0x51
-	.4byte	0x15ec0
+	.4byte	0x160b1
 	.uleb128 0x51
-	.4byte	0x15eb6
+	.4byte	0x160a7
 	.byte	0
 	.byte	0
-	.byte	0
-	.byte	0
-	.uleb128 0x6b
-	.4byte	0x159c1
-	.8byte	.LBB1374
-	.8byte	.LBE1374-.LBB1374
-	.byte	0x7
-	.byte	0x74
-	.4byte	0x11c57
-	.uleb128 0x51
-	.4byte	0x159d1
 	.uleb128 0x53
-	.8byte	.LBB1375
-	.8byte	.LBE1375-.LBB1375
+	.8byte	.LBB1395
+	.8byte	.LBE1395-.LBB1395
+	.uleb128 0x54
+	.4byte	0x15c23
+	.byte	0
+	.byte	0
+	.byte	0
+	.uleb128 0x6c
+	.4byte	0x15bb2
+	.8byte	.LBB1402
+	.8byte	.LBE1402-.LBB1402
+	.byte	0x8
+	.byte	0x86
+	.4byte	0x11e80
+	.uleb128 0x51
+	.4byte	0x15bc2
+	.uleb128 0x53
+	.8byte	.LBB1403
+	.8byte	.LBE1403-.LBB1403
 	.uleb128 0x5d
-	.4byte	0x159dc
+	.4byte	0x15bcd
 	.4byte	.LLST104
 	.uleb128 0x6c
-	.4byte	.Ldebug_ranges0+0x7a0
-	.4byte	0x11c22
-	.uleb128 0x5d
-	.4byte	0x159e8
-	.4byte	.LLST105
-	.uleb128 0x59
-	.4byte	0x15e1e
-	.8byte	.LBB1377
-	.8byte	.LBE1377-.LBB1377
-	.byte	0x5
-	.byte	0xfe
-	.uleb128 0x51
-	.4byte	0x15e39
-	.uleb128 0x51
-	.4byte	0x15e2e
-	.uleb128 0x53
-	.8byte	.LBB1378
-	.8byte	.LBE1378-.LBB1378
-	.uleb128 0x54
-	.4byte	0x15e44
-	.byte	0
-	.byte	0
-	.byte	0
-	.uleb128 0x59
-	.4byte	0x15ddf
-	.8byte	.LBB1379
-	.8byte	.LBE1379-.LBB1379
+	.4byte	0x15fd0
+	.8byte	.LBB1404
+	.8byte	.LBE1404-.LBB1404
 	.byte	0x5
 	.byte	0xfd
+	.4byte	0x11e63
 	.uleb128 0x53
-	.8byte	.LBB1380
-	.8byte	.LBE1380-.LBB1380
+	.8byte	.LBB1405
+	.8byte	.LBE1405-.LBB1405
 	.uleb128 0x5d
-	.4byte	0x15def
+	.4byte	0x15fe0
+	.4byte	.LLST105
+	.byte	0
+	.byte	0
+	.uleb128 0x53
+	.8byte	.LBB1406
+	.8byte	.LBE1406-.LBB1406
+	.uleb128 0x5d
+	.4byte	0x15bd9
 	.4byte	.LLST106
 	.byte	0
 	.byte	0
 	.byte	0
-	.byte	0
 	.uleb128 0x4b
-	.8byte	.LVL270
-	.4byte	0x16b8a
-	.byte	0
+	.8byte	.LVL311
+	.4byte	0x16d7b
 	.byte	0
 	.byte	0
 	.uleb128 0x4b
 	.8byte	.LVL101
-	.4byte	0x169af
+	.4byte	0x16c06
 	.uleb128 0x4b
-	.8byte	.LVL104
-	.4byte	0x16a20
+	.8byte	.LVL117
+	.4byte	0x16ba0
 	.uleb128 0x4b
-	.8byte	.LVL107
-	.4byte	0x169af
+	.8byte	.LVL123
+	.4byte	0x16ba0
+	.uleb128 0x4b
+	.8byte	.LVL124
+	.4byte	0x16ba0
+	.uleb128 0x4b
+	.8byte	.LVL125
+	.4byte	0x16ba0
 	.uleb128 0x4b
 	.8byte	.LVL126
-	.4byte	0x16a86
+	.4byte	0x16ba0
 	.uleb128 0x4b
-	.8byte	.LVL128
-	.4byte	0x16b7f
+	.8byte	.LVL153
+	.4byte	0x16ba0
 	.uleb128 0x4b
-	.8byte	.LVL137
-	.4byte	0x16ba2
+	.8byte	.LVL166
+	.4byte	0x16d93
 	.uleb128 0x4b
-	.8byte	.LVL140
-	.4byte	0x169af
+	.8byte	.LVL167
+	.4byte	0x16d9e
 	.uleb128 0x4b
-	.8byte	.LVL144
-	.4byte	0x169af
+	.8byte	.LVL168
+	.4byte	0x16cc6
 	.uleb128 0x4b
-	.8byte	.LVL145
-	.4byte	0x16ad5
+	.8byte	.LVL169
+	.4byte	0x16da9
 	.uleb128 0x4b
-	.8byte	.LVL159
-	.4byte	0x16bad
+	.8byte	.LVL170
+	.4byte	0x16d70
 	.uleb128 0x4b
-	.8byte	.LVL160
-	.4byte	0x16bb8
+	.8byte	.LVL185
+	.4byte	0x16ba0
 	.uleb128 0x4b
-	.8byte	.LVL189
-	.4byte	0x169af
+	.8byte	.LVL186
+	.4byte	0x16ba0
 	.uleb128 0x4b
-	.8byte	.LVL203
-	.4byte	0x169af
+	.8byte	.LVL199
+	.4byte	0x16ba0
 	.uleb128 0x4b
-	.8byte	.LVL206
-	.4byte	0x169af
+	.8byte	.LVL208
+	.4byte	0x16c06
 	.uleb128 0x4b
-	.8byte	.LVL209
-	.4byte	0x169af
+	.8byte	.LVL221
+	.4byte	0x16d70
 	.uleb128 0x4b
-	.8byte	.LVL211
-	.4byte	0x16bc3
+	.8byte	.LVL222
+	.4byte	0x16db4
 	.uleb128 0x4b
-	.8byte	.LVL212
-	.4byte	0x16b7f
+	.8byte	.LVL224
+	.4byte	0x16c82
 	.uleb128 0x4b
-	.8byte	.LVL229
-	.4byte	0x169af
+	.8byte	.LVL239
+	.4byte	0x16c6c
 	.uleb128 0x4b
-	.8byte	.LVL243
-	.4byte	0x169af
+	.8byte	.LVL241
+	.4byte	0x16d70
 	.uleb128 0x4b
-	.8byte	.LVL246
-	.4byte	0x16a20
+	.8byte	.LVL250
+	.4byte	0x16dbf
 	.uleb128 0x4b
-	.8byte	.LVL257
-	.4byte	0x16a20
+	.8byte	.LVL289
+	.4byte	0x16c06
 	.uleb128 0x4b
-	.8byte	.LVL271
-	.4byte	0x16b7f
+	.8byte	.LVL295
+	.4byte	0x16c06
 	.uleb128 0x4b
-	.8byte	.LVL272
-	.4byte	0x16bce
+	.8byte	.LVL313
+	.4byte	0x16cc6
 	.uleb128 0x4b
-	.8byte	.LVL273
-	.4byte	0x16a91
+	.8byte	.LVL319
+	.4byte	0x16c06
 	.uleb128 0x4b
-	.8byte	.LVL274
-	.4byte	0x16ad5
-	.uleb128 0x4b
-	.8byte	.LVL300
-	.4byte	0x16a20
-	.uleb128 0x4b
-	.8byte	.LVL322
-	.4byte	0x16a20
+	.8byte	.LVL325
+	.4byte	0x16c06
 	.uleb128 0x4b
 	.8byte	.LVL328
-	.4byte	0x16a20
-	.uleb128 0x4b
-	.8byte	.LVL331
-	.4byte	0x16b30
+	.4byte	0x16d21
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x68
-	.4byte	0x11df1
+	.4byte	0x1200c
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0xa
 	.byte	0
 	.uleb128 0x3
-	.4byte	0x11de1
+	.4byte	0x11ffc
 	.uleb128 0x60
 	.4byte	.LASF3069
 	.byte	0x1
-	.2byte	0xb22
+	.2byte	0xb25
 	.4byte	0xc6
 	.byte	0x1
-	.4byte	0x11e20
+	.4byte	0x1203b
 	.uleb128 0x62
-	.4byte	.LASF2993
+	.4byte	.LASF2992
 	.byte	0x1
-	.2byte	0xb22
+	.2byte	0xb25
 	.4byte	0xe0e4
 	.uleb128 0x4f
 	.string	"dev"
 	.byte	0x1
-	.2byte	0xb24
+	.2byte	0xb27
 	.4byte	0xa496
 	.byte	0
 	.uleb128 0x4a
 	.4byte	.LASF3071
 	.byte	0x1
-	.2byte	0xb1c
+	.2byte	0xb1f
 	.8byte	.LFB2847
 	.8byte	.LFE2847-.LFB2847
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x11e5a
+	.4byte	0x12075
 	.uleb128 0x4e
 	.string	"t"
 	.byte	0x1
-	.2byte	0xb1c
+	.2byte	0xb1f
 	.4byte	0x31cc
-	.4byte	.LLST185
+	.4byte	.LLST193
 	.uleb128 0x4b
-	.8byte	.LVL655
-	.4byte	0x13351
+	.8byte	.LVL652
+	.4byte	0x135aa
 	.byte	0
 	.uleb128 0x4a
 	.4byte	.LASF3072
 	.byte	0x1
-	.2byte	0xb12
+	.2byte	0xb15
 	.8byte	.LFB2846
 	.8byte	.LFE2846-.LFB2846
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x11ea0
+	.4byte	0x120bb
 	.uleb128 0x4e
 	.string	"t"
 	.byte	0x1
-	.2byte	0xb12
+	.2byte	0xb15
 	.4byte	0x31cc
 	.4byte	.LLST24
 	.uleb128 0x43
 	.4byte	.LASF2943
 	.byte	0x1
-	.2byte	0xb14
-	.4byte	0xe82d
+	.2byte	0xb17
+	.4byte	0xe81f
 	.uleb128 0x4b
 	.8byte	.LVL86
-	.4byte	0x169af
+	.4byte	0x16ba0
 	.byte	0
 	.uleb128 0x60
 	.4byte	.LASF3073
 	.byte	0x1
-	.2byte	0xb01
+	.2byte	0xb04
 	.4byte	0xc6
 	.byte	0x1
-	.4byte	0x11eca
+	.4byte	0x120e5
 	.uleb128 0x62
-	.4byte	.LASF2993
+	.4byte	.LASF2992
 	.byte	0x1
-	.2byte	0xb01
+	.2byte	0xb04
 	.4byte	0xe0e4
 	.uleb128 0x4f
 	.string	"buf"
 	.byte	0x1
-	.2byte	0xb03
-	.4byte	0xe480
+	.2byte	0xb06
+	.4byte	0xe472
 	.byte	0
 	.uleb128 0x4c
 	.4byte	.LASF3074
 	.byte	0x1
-	.2byte	0x91b
+	.2byte	0x91c
 	.4byte	0xc6
 	.8byte	.LFB2844
 	.8byte	.LFE2844-.LFB2844
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x1308c
+	.4byte	0x132e5
 	.uleb128 0x4e
 	.string	"ptr"
 	.byte	0x1
-	.2byte	0x91b
+	.2byte	0x91c
 	.4byte	0x458
-	.4byte	.LLST348
+	.4byte	.LLST356
 	.uleb128 0x57
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x91d
-	.4byte	0xe4e5
-	.4byte	.LLST349
+	.2byte	0x91e
+	.4byte	0xe4d7
+	.4byte	.LLST357
 	.uleb128 0x43
 	.4byte	.LASF2943
 	.byte	0x1
-	.2byte	0x91e
-	.4byte	0xe82d
-	.uleb128 0x43
-	.4byte	.LASF2993
-	.byte	0x1
 	.2byte	0x91f
+	.4byte	0xe81f
+	.uleb128 0x43
+	.4byte	.LASF2992
+	.byte	0x1
+	.2byte	0x920
 	.4byte	0xe0e4
 	.uleb128 0x4f
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x920
-	.4byte	0xe480
+	.2byte	0x921
+	.4byte	0xe472
 	.uleb128 0x56
 	.4byte	.LASF3075
 	.byte	0x1
-	.2byte	0x921
+	.2byte	0x922
 	.4byte	0xc6
-	.4byte	.LLST350
+	.4byte	.LLST358
 	.uleb128 0x56
 	.4byte	.LASF2960
 	.byte	0x1
-	.2byte	0x922
+	.2byte	0x923
 	.4byte	0xc6
-	.4byte	.LLST351
+	.4byte	.LLST359
 	.uleb128 0x49
 	.4byte	.LASF874
 	.byte	0x1
-	.2byte	0x923
+	.2byte	0x924
 	.4byte	0xc6
 	.uleb128 0x1
-	.byte	0x6a
+	.byte	0x69
 	.uleb128 0x56
 	.4byte	.LASF3076
 	.byte	0x1
-	.2byte	0x924
+	.2byte	0x925
 	.4byte	0xc6
-	.4byte	.LLST352
+	.4byte	.LLST360
 	.uleb128 0x43
 	.4byte	.LASF3077
 	.byte	0x1
-	.2byte	0x925
+	.2byte	0x926
 	.4byte	0xc6
 	.uleb128 0x6d
-	.4byte	.LASF3084
+	.4byte	.LASF3097
 	.byte	0x1
-	.2byte	0xa19
+	.2byte	0xa1d
 	.uleb128 0x6e
 	.4byte	.LASF3079
 	.byte	0x1
-	.2byte	0xac9
-	.8byte	.L1367
-	.uleb128 0x6c
-	.4byte	.Ldebug_ranges0+0x2120
-	.4byte	0x1203f
+	.2byte	0xacb
+	.8byte	.L1365
+	.uleb128 0x68
+	.4byte	.Ldebug_ranges0+0x2190
+	.4byte	0x1225a
 	.uleb128 0x43
 	.4byte	.LASF3078
 	.byte	0x1
-	.2byte	0x93c
+	.2byte	0x93e
 	.4byte	0xc6
 	.uleb128 0x53
-	.8byte	.LBB2243
-	.8byte	.LBE2243-.LBB2243
+	.8byte	.LBB2290
+	.8byte	.LBE2290-.LBB2290
 	.uleb128 0x6e
 	.4byte	.LASF3080
 	.byte	0x1
-	.2byte	0x93c
-	.8byte	.L1261
+	.2byte	0x93e
+	.8byte	.L1268
 	.uleb128 0x49
 	.4byte	.LASF3081
 	.byte	0x1
-	.2byte	0x93c
+	.2byte	0x93e
 	.4byte	0x1528
 	.uleb128 0x2
 	.byte	0x91
@@ -49696,333 +49986,53 @@
 	.uleb128 0x43
 	.4byte	.LASF3078
 	.byte	0x1
-	.2byte	0x93c
+	.2byte	0x93e
 	.4byte	0x199
 	.uleb128 0x5f
-	.8byte	.LBB2244
-	.8byte	.LBE2244-.LBB2244
-	.4byte	0x12023
+	.8byte	.LBB2291
+	.8byte	.LBE2291-.LBB2291
+	.4byte	0x1223e
 	.uleb128 0x56
 	.4byte	.LASF3082
 	.byte	0x1
-	.2byte	0x93c
-	.4byte	0x199
-	.4byte	.LLST379
-	.uleb128 0x4b
-	.8byte	.LVL1540
-	.4byte	0x16bd9
-	.uleb128 0x4b
-	.8byte	.LVL1541
-	.4byte	0x16be4
-	.byte	0
-	.uleb128 0x4b
-	.8byte	.LVL1538
-	.4byte	0x16bf0
-	.uleb128 0x4b
-	.8byte	.LVL1542
-	.4byte	0x16bfc
-	.byte	0
-	.byte	0
-	.uleb128 0x6c
-	.4byte	.Ldebug_ranges0+0x2310
-	.4byte	0x120ec
-	.uleb128 0x43
-	.4byte	.LASF3078
-	.byte	0x1
-	.2byte	0x9bf
-	.4byte	0xc6
-	.uleb128 0x53
-	.8byte	.LBB2284
-	.8byte	.LBE2284-.LBB2284
-	.uleb128 0x6e
-	.4byte	.LASF3080
-	.byte	0x1
-	.2byte	0x9bf
-	.8byte	.L1330
-	.uleb128 0x49
-	.4byte	.LASF3081
-	.byte	0x1
-	.2byte	0x9bf
-	.4byte	0x1528
-	.uleb128 0x2
-	.byte	0x91
-	.sleb128 -48
-	.uleb128 0x43
-	.4byte	.LASF3078
-	.byte	0x1
-	.2byte	0x9bf
-	.4byte	0x199
-	.uleb128 0x5f
-	.8byte	.LBB2285
-	.8byte	.LBE2285-.LBB2285
-	.4byte	0x120d0
-	.uleb128 0x56
-	.4byte	.LASF3082
-	.byte	0x1
-	.2byte	0x9bf
-	.4byte	0x199
-	.4byte	.LLST388
-	.uleb128 0x4b
-	.8byte	.LVL1615
-	.4byte	0x16bd9
-	.uleb128 0x4b
-	.8byte	.LVL1616
-	.4byte	0x16be4
-	.byte	0
-	.uleb128 0x4b
-	.8byte	.LVL1613
-	.4byte	0x16bf0
-	.uleb128 0x4b
-	.8byte	.LVL1617
-	.4byte	0x16bfc
-	.byte	0
-	.byte	0
-	.uleb128 0x5f
-	.8byte	.LBB2280
-	.8byte	.LBE2280-.LBB2280
-	.4byte	0x12142
-	.uleb128 0x4f
-	.string	"ret"
-	.byte	0x1
-	.2byte	0x9c5
-	.4byte	0xc6
-	.uleb128 0x4b
-	.8byte	.LVL1522
-	.4byte	0x167d4
-	.uleb128 0x4b
-	.8byte	.LVL1523
-	.4byte	0x16c08
-	.uleb128 0x4b
-	.8byte	.LVL1524
-	.4byte	0x169af
-	.uleb128 0x4b
-	.8byte	.LVL1525
-	.4byte	0x16ba2
-	.byte	0
-	.uleb128 0x6c
-	.4byte	.Ldebug_ranges0+0x2150
-	.4byte	0x12269
-	.uleb128 0x43
-	.4byte	.LASF3078
-	.byte	0x1
-	.2byte	0x9dd
-	.4byte	0x199
-	.uleb128 0x5f
-	.8byte	.LBB2248
-	.8byte	.LBE2248-.LBB2248
-	.4byte	0x12179
-	.uleb128 0x43
-	.4byte	.LASF3083
-	.byte	0x1
-	.2byte	0x9dd
-	.4byte	0x2b0
-	.byte	0
-	.uleb128 0x6c
-	.4byte	.Ldebug_ranges0+0x2180
-	.4byte	0x1223d
-	.uleb128 0x6d
-	.4byte	.LASF3080
-	.byte	0x1
-	.2byte	0x9dd
-	.uleb128 0x49
-	.4byte	.LASF3081
-	.byte	0x1
-	.2byte	0x9dd
-	.4byte	0x1528
-	.uleb128 0x2
-	.byte	0x91
-	.sleb128 -48
-	.uleb128 0x56
-	.4byte	.LASF3078
-	.byte	0x1
-	.2byte	0x9dd
-	.4byte	0x199
-	.4byte	.LLST380
-	.uleb128 0x6c
-	.4byte	.Ldebug_ranges0+0x21b0
-	.4byte	0x121f3
-	.uleb128 0x56
-	.4byte	.LASF3082
-	.byte	0x1
-	.2byte	0x9dd
-	.4byte	0x199
-	.4byte	.LLST381
-	.uleb128 0x6c
-	.4byte	.Ldebug_ranges0+0x21e0
-	.4byte	0x121d8
-	.uleb128 0x43
-	.4byte	.LASF3083
-	.byte	0x1
-	.2byte	0x9dd
-	.4byte	0x2b0
-	.byte	0
-	.uleb128 0x4b
-	.8byte	.LVL1439
-	.4byte	0x16be4
-	.uleb128 0x4b
-	.8byte	.LVL1630
-	.4byte	0x16c13
-	.byte	0
-	.uleb128 0x50
-	.4byte	0x15ce3
-	.8byte	.LBB2250
-	.8byte	.LBE2250-.LBB2250
-	.byte	0x1
-	.2byte	0x9dd
-	.4byte	0x12222
-	.uleb128 0x51
-	.4byte	0x15cf4
-	.uleb128 0x4b
-	.8byte	.LVL1436
-	.4byte	0x16c1e
-	.byte	0
-	.uleb128 0x4b
-	.8byte	.LVL1438
-	.4byte	0x16bf0
-	.uleb128 0x4b
-	.8byte	.LVL1440
-	.4byte	0x16bfc
-	.byte	0
-	.uleb128 0x5a
-	.4byte	0x15ce3
-	.8byte	.LBB2246
-	.8byte	.LBE2246-.LBB2246
-	.byte	0x1
-	.2byte	0x9dd
-	.uleb128 0x51
-	.4byte	0x15cf4
-	.uleb128 0x4b
-	.8byte	.LVL1435
-	.4byte	0x16c1e
-	.byte	0
-	.byte	0
-	.uleb128 0x6c
-	.4byte	.Ldebug_ranges0+0x2340
-	.4byte	0x12302
-	.uleb128 0x43
-	.4byte	.LASF3078
-	.byte	0x1
-	.2byte	0x9ee
-	.4byte	0xc6
-	.uleb128 0x5b
-	.4byte	.Ldebug_ranges0+0x2370
-	.uleb128 0x6d
-	.4byte	.LASF3080
-	.byte	0x1
-	.2byte	0x9ee
-	.uleb128 0x49
-	.4byte	.LASF3081
-	.byte	0x1
-	.2byte	0x9ee
-	.4byte	0x1528
-	.uleb128 0x2
-	.byte	0x91
-	.sleb128 -48
-	.uleb128 0x43
-	.4byte	.LASF3078
-	.byte	0x1
-	.2byte	0x9ee
-	.4byte	0x199
-	.uleb128 0x5f
-	.8byte	.LBB2289
-	.8byte	.LBE2289-.LBB2289
-	.4byte	0x122e6
-	.uleb128 0x56
-	.4byte	.LASF3082
-	.byte	0x1
-	.2byte	0x9ee
-	.4byte	0x199
-	.4byte	.LLST389
-	.uleb128 0x4b
-	.8byte	.LVL1559
-	.4byte	0x16be4
-	.uleb128 0x4b
-	.8byte	.LVL1561
-	.4byte	0x16bd9
-	.byte	0
-	.uleb128 0x4b
-	.8byte	.LVL1546
-	.4byte	0x16bfc
-	.uleb128 0x4b
-	.8byte	.LVL1558
-	.4byte	0x16bf0
-	.byte	0
-	.byte	0
-	.uleb128 0x5f
-	.8byte	.LBB2277
-	.8byte	.LBE2277-.LBB2277
-	.4byte	0x123bb
-	.uleb128 0x43
-	.4byte	.LASF3078
-	.byte	0x1
-	.2byte	0xa28
-	.4byte	0xc6
-	.uleb128 0x53
-	.8byte	.LBB2278
-	.8byte	.LBE2278-.LBB2278
-	.uleb128 0x6e
-	.4byte	.LASF3080
-	.byte	0x1
-	.2byte	0xa28
-	.8byte	.L1379
-	.uleb128 0x49
-	.4byte	.LASF3081
-	.byte	0x1
-	.2byte	0xa28
-	.4byte	0x1528
-	.uleb128 0x2
-	.byte	0x91
-	.sleb128 -48
-	.uleb128 0x43
-	.4byte	.LASF3078
-	.byte	0x1
-	.2byte	0xa28
-	.4byte	0x199
-	.uleb128 0x5f
-	.8byte	.LBB2279
-	.8byte	.LBE2279-.LBB2279
-	.4byte	0x1239f
-	.uleb128 0x56
-	.4byte	.LASF3082
-	.byte	0x1
-	.2byte	0xa28
+	.2byte	0x93e
 	.4byte	0x199
 	.4byte	.LLST387
 	.uleb128 0x4b
-	.8byte	.LVL1519
-	.4byte	0x16bd9
+	.8byte	.LVL1528
+	.4byte	0x16dca
 	.uleb128 0x4b
-	.8byte	.LVL1520
-	.4byte	0x16be4
+	.8byte	.LVL1529
+	.4byte	0x16dd5
 	.byte	0
 	.uleb128 0x4b
-	.8byte	.LVL1517
-	.4byte	0x16bf0
+	.8byte	.LVL1526
+	.4byte	0x16de1
 	.uleb128 0x4b
-	.8byte	.LVL1521
-	.4byte	0x16bfc
+	.8byte	.LVL1530
+	.4byte	0x16ded
 	.byte	0
 	.byte	0
-	.uleb128 0x6c
-	.4byte	.Ldebug_ranges0+0x23a0
-	.4byte	0x1245b
+	.uleb128 0x68
+	.4byte	.Ldebug_ranges0+0x2340
+	.4byte	0x12307
 	.uleb128 0x43
 	.4byte	.LASF3078
 	.byte	0x1
-	.2byte	0xa2e
+	.2byte	0x9c3
 	.4byte	0xc6
 	.uleb128 0x53
-	.8byte	.LBB2292
-	.8byte	.LBE2292-.LBB2292
+	.8byte	.LBB2340
+	.8byte	.LBE2340-.LBB2340
 	.uleb128 0x6e
 	.4byte	.LASF3080
 	.byte	0x1
-	.2byte	0xa2e
-	.8byte	.L1383
+	.2byte	0x9c3
+	.8byte	.L1337
 	.uleb128 0x49
 	.4byte	.LASF3081
 	.byte	0x1
-	.2byte	0xa2e
+	.2byte	0x9c3
 	.4byte	0x1528
 	.uleb128 0x2
 	.byte	0x91
@@ -50030,51 +50040,176 @@
 	.uleb128 0x43
 	.4byte	.LASF3078
 	.byte	0x1
-	.2byte	0xa2e
+	.2byte	0x9c3
 	.4byte	0x199
 	.uleb128 0x5f
-	.8byte	.LBB2293
-	.8byte	.LBE2293-.LBB2293
-	.4byte	0x1244c
+	.8byte	.LBB2341
+	.8byte	.LBE2341-.LBB2341
+	.4byte	0x122eb
 	.uleb128 0x56
 	.4byte	.LASF3082
 	.byte	0x1
-	.2byte	0xa2e
+	.2byte	0x9c3
+	.4byte	0x199
+	.4byte	.LLST402
+	.uleb128 0x4b
+	.8byte	.LVL1619
+	.4byte	0x16dca
+	.uleb128 0x4b
+	.8byte	.LVL1620
+	.4byte	0x16dd5
+	.byte	0
+	.uleb128 0x4b
+	.8byte	.LVL1617
+	.4byte	0x16de1
+	.uleb128 0x4b
+	.8byte	.LVL1621
+	.4byte	0x16ded
+	.byte	0
+	.byte	0
+	.uleb128 0x68
+	.4byte	.Ldebug_ranges0+0x21c0
+	.4byte	0x12351
+	.uleb128 0x4f
+	.string	"ret"
+	.byte	0x1
+	.2byte	0x9c9
+	.4byte	0xc6
+	.uleb128 0x4b
+	.8byte	.LVL1423
+	.4byte	0x169c5
+	.uleb128 0x4b
+	.8byte	.LVL1581
+	.4byte	0x16df9
+	.uleb128 0x4b
+	.8byte	.LVL1583
+	.4byte	0x16ba0
+	.uleb128 0x4b
+	.8byte	.LVL1585
+	.4byte	0x16dbf
+	.byte	0
+	.uleb128 0x68
+	.4byte	.Ldebug_ranges0+0x21f0
+	.4byte	0x124a0
+	.uleb128 0x43
+	.4byte	.LASF3078
+	.byte	0x1
+	.2byte	0x9e1
+	.4byte	0x199
+	.uleb128 0x5f
+	.8byte	.LBB2296
+	.8byte	.LBE2296-.LBB2296
+	.4byte	0x1238c
+	.uleb128 0x56
+	.4byte	.LASF3083
+	.byte	0x1
+	.2byte	0x9e1
+	.4byte	0x2b0
+	.4byte	.LLST388
+	.byte	0
+	.uleb128 0x5f
+	.8byte	.LBB2297
+	.8byte	.LBE2297-.LBB2297
+	.4byte	0x12474
+	.uleb128 0x6e
+	.4byte	.LASF3080
+	.byte	0x1
+	.2byte	0x9e1
+	.8byte	.L1344
+	.uleb128 0x49
+	.4byte	.LASF3081
+	.byte	0x1
+	.2byte	0x9e1
+	.4byte	0x1528
+	.uleb128 0x2
+	.byte	0x91
+	.sleb128 -48
+	.uleb128 0x56
+	.4byte	.LASF3078
+	.byte	0x1
+	.2byte	0x9e1
+	.4byte	0x199
+	.4byte	.LLST389
+	.uleb128 0x68
+	.4byte	.Ldebug_ranges0+0x2220
+	.4byte	0x1242a
+	.uleb128 0x56
+	.4byte	.LASF3082
+	.byte	0x1
+	.2byte	0x9e1
 	.4byte	0x199
 	.4byte	.LLST390
-	.uleb128 0x4b
-	.8byte	.LVL1598
-	.4byte	0x16bd9
-	.uleb128 0x4b
-	.8byte	.LVL1599
-	.4byte	0x16be4
-	.byte	0
-	.uleb128 0x4b
-	.8byte	.LVL1596
-	.4byte	0x16bf0
-	.byte	0
-	.byte	0
 	.uleb128 0x5f
-	.8byte	.LBB2261
-	.8byte	.LBE2261-.LBB2261
-	.4byte	0x12514
+	.8byte	.LBB2301
+	.8byte	.LBE2301-.LBB2301
+	.4byte	0x1240f
+	.uleb128 0x56
+	.4byte	.LASF3083
+	.byte	0x1
+	.2byte	0x9e1
+	.4byte	0x2b0
+	.4byte	.LLST391
+	.byte	0
+	.uleb128 0x4b
+	.8byte	.LVL1538
+	.4byte	0x16dd5
+	.uleb128 0x4b
+	.8byte	.LVL1546
+	.4byte	0x16e04
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x15ed4
+	.8byte	.LBB2298
+	.8byte	.LBE2298-.LBB2298
+	.byte	0x1
+	.2byte	0x9e1
+	.4byte	0x12459
+	.uleb128 0x51
+	.4byte	0x15ee5
+	.uleb128 0x4b
+	.8byte	.LVL1535
+	.4byte	0x16e0f
+	.byte	0
+	.uleb128 0x4b
+	.8byte	.LVL1537
+	.4byte	0x16de1
+	.uleb128 0x4b
+	.8byte	.LVL1541
+	.4byte	0x16ded
+	.byte	0
+	.uleb128 0x5a
+	.4byte	0x15ed4
+	.8byte	.LBB2294
+	.8byte	.LBE2294-.LBB2294
+	.byte	0x1
+	.2byte	0x9e1
+	.uleb128 0x51
+	.4byte	0x15ee5
+	.uleb128 0x4b
+	.8byte	.LVL1426
+	.4byte	0x16e0f
+	.byte	0
+	.byte	0
+	.uleb128 0x68
+	.4byte	.Ldebug_ranges0+0x2280
+	.4byte	0x1254d
 	.uleb128 0x43
 	.4byte	.LASF3078
 	.byte	0x1
-	.2byte	0xa5b
+	.2byte	0x9f2
 	.4byte	0xc6
 	.uleb128 0x53
-	.8byte	.LBB2262
-	.8byte	.LBE2262-.LBB2262
+	.8byte	.LBB2319
+	.8byte	.LBE2319-.LBB2319
 	.uleb128 0x6e
 	.4byte	.LASF3080
 	.byte	0x1
-	.2byte	0xa5b
-	.8byte	.L1391
+	.2byte	0x9f2
+	.8byte	.L1354
 	.uleb128 0x49
 	.4byte	.LASF3081
 	.byte	0x1
-	.2byte	0xa5b
+	.2byte	0x9f2
 	.4byte	0x1528
 	.uleb128 0x2
 	.byte	0x91
@@ -50082,76 +50217,240 @@
 	.uleb128 0x43
 	.4byte	.LASF3078
 	.byte	0x1
-	.2byte	0xa5b
+	.2byte	0x9f2
 	.4byte	0x199
 	.uleb128 0x5f
-	.8byte	.LBB2263
-	.8byte	.LBE2263-.LBB2263
-	.4byte	0x124f8
+	.8byte	.LBB2320
+	.8byte	.LBE2320-.LBB2320
+	.4byte	0x12531
 	.uleb128 0x56
 	.4byte	.LASF3082
 	.byte	0x1
-	.2byte	0xa5b
+	.2byte	0x9f2
 	.4byte	0x199
-	.4byte	.LLST384
+	.4byte	.LLST395
 	.uleb128 0x4b
-	.8byte	.LVL1490
-	.4byte	0x16bd9
+	.8byte	.LVL1629
+	.4byte	0x16dca
 	.uleb128 0x4b
-	.8byte	.LVL1491
-	.4byte	0x16be4
+	.8byte	.LVL1630
+	.4byte	0x16dd5
 	.byte	0
 	.uleb128 0x4b
-	.8byte	.LVL1488
-	.4byte	0x16bf0
+	.8byte	.LVL1627
+	.4byte	0x16de1
 	.uleb128 0x4b
-	.8byte	.LVL1492
-	.4byte	0x16bfc
+	.8byte	.LVL1631
+	.4byte	0x16ded
 	.byte	0
 	.byte	0
 	.uleb128 0x5f
-	.8byte	.LBB2257
-	.8byte	.LBE2257-.LBB2257
-	.4byte	0x12547
+	.8byte	.LBB2347
+	.8byte	.LBE2347-.LBB2347
+	.4byte	0x12606
+	.uleb128 0x43
+	.4byte	.LASF3078
+	.byte	0x1
+	.2byte	0xa2c
+	.4byte	0xc6
+	.uleb128 0x53
+	.8byte	.LBB2348
+	.8byte	.LBE2348-.LBB2348
+	.uleb128 0x6e
+	.4byte	.LASF3080
+	.byte	0x1
+	.2byte	0xa2c
+	.8byte	.L1377
+	.uleb128 0x49
+	.4byte	.LASF3081
+	.byte	0x1
+	.2byte	0xa2c
+	.4byte	0x1528
+	.uleb128 0x2
+	.byte	0x91
+	.sleb128 -48
+	.uleb128 0x43
+	.4byte	.LASF3078
+	.byte	0x1
+	.2byte	0xa2c
+	.4byte	0x199
+	.uleb128 0x5f
+	.8byte	.LBB2349
+	.8byte	.LBE2349-.LBB2349
+	.4byte	0x125ea
+	.uleb128 0x56
+	.4byte	.LASF3082
+	.byte	0x1
+	.2byte	0xa2c
+	.4byte	0x199
+	.4byte	.LLST404
+	.uleb128 0x4b
+	.8byte	.LVL1590
+	.4byte	0x16dca
+	.uleb128 0x4b
+	.8byte	.LVL1591
+	.4byte	0x16dd5
+	.byte	0
+	.uleb128 0x4b
+	.8byte	.LVL1588
+	.4byte	0x16de1
+	.uleb128 0x4b
+	.8byte	.LVL1592
+	.4byte	0x16ded
+	.byte	0
+	.byte	0
+	.uleb128 0x68
+	.4byte	.Ldebug_ranges0+0x2370
+	.4byte	0x126a6
+	.uleb128 0x43
+	.4byte	.LASF3078
+	.byte	0x1
+	.2byte	0xa32
+	.4byte	0xc6
+	.uleb128 0x53
+	.8byte	.LBB2344
+	.8byte	.LBE2344-.LBB2344
+	.uleb128 0x6e
+	.4byte	.LASF3080
+	.byte	0x1
+	.2byte	0xa32
+	.8byte	.L1381
+	.uleb128 0x49
+	.4byte	.LASF3081
+	.byte	0x1
+	.2byte	0xa32
+	.4byte	0x1528
+	.uleb128 0x2
+	.byte	0x91
+	.sleb128 -48
+	.uleb128 0x43
+	.4byte	.LASF3078
+	.byte	0x1
+	.2byte	0xa32
+	.4byte	0x199
+	.uleb128 0x5f
+	.8byte	.LBB2345
+	.8byte	.LBE2345-.LBB2345
+	.4byte	0x12697
+	.uleb128 0x56
+	.4byte	.LASF3082
+	.byte	0x1
+	.2byte	0xa32
+	.4byte	0x199
+	.4byte	.LLST403
+	.uleb128 0x4b
+	.8byte	.LVL1634
+	.4byte	0x16dca
+	.uleb128 0x4b
+	.8byte	.LVL1635
+	.4byte	0x16dd5
+	.byte	0
+	.uleb128 0x4b
+	.8byte	.LVL1632
+	.4byte	0x16de1
+	.byte	0
+	.byte	0
+	.uleb128 0x5f
+	.8byte	.LBB2305
+	.8byte	.LBE2305-.LBB2305
+	.4byte	0x1275f
+	.uleb128 0x43
+	.4byte	.LASF3078
+	.byte	0x1
+	.2byte	0xa5f
+	.4byte	0xc6
+	.uleb128 0x53
+	.8byte	.LBB2306
+	.8byte	.LBE2306-.LBB2306
+	.uleb128 0x6e
+	.4byte	.LASF3080
+	.byte	0x1
+	.2byte	0xa5f
+	.8byte	.L1389
+	.uleb128 0x49
+	.4byte	.LASF3081
+	.byte	0x1
+	.2byte	0xa5f
+	.4byte	0x1528
+	.uleb128 0x2
+	.byte	0x91
+	.sleb128 -48
+	.uleb128 0x43
+	.4byte	.LASF3078
+	.byte	0x1
+	.2byte	0xa5f
+	.4byte	0x199
+	.uleb128 0x5f
+	.8byte	.LBB2307
+	.8byte	.LBE2307-.LBB2307
+	.4byte	0x12743
+	.uleb128 0x56
+	.4byte	.LASF3082
+	.byte	0x1
+	.2byte	0xa5f
+	.4byte	0x199
+	.4byte	.LLST392
+	.uleb128 0x4b
+	.8byte	.LVL1447
+	.4byte	0x16dca
+	.uleb128 0x4b
+	.8byte	.LVL1448
+	.4byte	0x16dd5
+	.byte	0
+	.uleb128 0x4b
+	.8byte	.LVL1445
+	.4byte	0x16de1
+	.uleb128 0x4b
+	.8byte	.LVL1449
+	.4byte	0x16ded
+	.byte	0
+	.byte	0
+	.uleb128 0x5f
+	.8byte	.LBB2334
+	.8byte	.LBE2334-.LBB2334
+	.4byte	0x12792
 	.uleb128 0x57
 	.string	"ret"
 	.byte	0x1
-	.2byte	0xa65
+	.2byte	0xa69
 	.4byte	0xc6
-	.4byte	.LLST382
+	.4byte	.LLST401
 	.uleb128 0x4b
-	.8byte	.LVL1463
-	.4byte	0x167d4
+	.8byte	.LVL1523
+	.4byte	0x169c5
 	.byte	0
-	.uleb128 0x6c
-	.4byte	.Ldebug_ranges0+0x2240
-	.4byte	0x1266e
+	.uleb128 0x68
+	.4byte	.Ldebug_ranges0+0x22b0
+	.4byte	0x128e1
 	.uleb128 0x43
 	.4byte	.LASF3078
 	.byte	0x1
-	.2byte	0xaa2
+	.2byte	0xaa4
 	.4byte	0x199
 	.uleb128 0x5f
-	.8byte	.LBB2267
-	.8byte	.LBE2267-.LBB2267
-	.4byte	0x1257e
-	.uleb128 0x43
+	.8byte	.LBB2324
+	.8byte	.LBE2324-.LBB2324
+	.4byte	0x127cd
+	.uleb128 0x56
 	.4byte	.LASF3083
 	.byte	0x1
-	.2byte	0xaa2
+	.2byte	0xaa4
 	.4byte	0x2b0
+	.4byte	.LLST396
 	.byte	0
-	.uleb128 0x6c
-	.4byte	.Ldebug_ranges0+0x2280
-	.4byte	0x12642
-	.uleb128 0x6d
+	.uleb128 0x5f
+	.8byte	.LBB2325
+	.8byte	.LBE2325-.LBB2325
+	.4byte	0x128b5
+	.uleb128 0x6e
 	.4byte	.LASF3080
 	.byte	0x1
-	.2byte	0xaa2
+	.2byte	0xaa4
+	.8byte	.L1406
 	.uleb128 0x49
 	.4byte	.LASF3081
 	.byte	0x1
-	.2byte	0xaa2
+	.2byte	0xaa4
 	.4byte	0x1528
 	.uleb128 0x2
 	.byte	0x91
@@ -50159,148 +50458,150 @@
 	.uleb128 0x56
 	.4byte	.LASF3078
 	.byte	0x1
-	.2byte	0xaa2
+	.2byte	0xaa4
 	.4byte	0x199
-	.4byte	.LLST385
-	.uleb128 0x6c
-	.4byte	.Ldebug_ranges0+0x22b0
-	.4byte	0x125f8
+	.4byte	.LLST397
+	.uleb128 0x68
+	.4byte	.Ldebug_ranges0+0x22e0
+	.4byte	0x1286b
 	.uleb128 0x56
 	.4byte	.LASF3082
 	.byte	0x1
-	.2byte	0xaa2
+	.2byte	0xaa4
 	.4byte	0x199
-	.4byte	.LLST386
-	.uleb128 0x6c
-	.4byte	.Ldebug_ranges0+0x22e0
-	.4byte	0x125dd
-	.uleb128 0x43
+	.4byte	.LLST398
+	.uleb128 0x5f
+	.8byte	.LBB2329
+	.8byte	.LBE2329-.LBB2329
+	.4byte	0x12850
+	.uleb128 0x56
 	.4byte	.LASF3083
 	.byte	0x1
-	.2byte	0xaa2
+	.2byte	0xaa4
 	.4byte	0x2b0
+	.4byte	.LLST399
 	.byte	0
 	.uleb128 0x4b
-	.8byte	.LVL1622
-	.4byte	0x16be4
+	.8byte	.LVL1598
+	.4byte	0x16dd5
 	.uleb128 0x4b
-	.8byte	.LVL1626
-	.4byte	0x16c13
+	.8byte	.LVL1606
+	.4byte	0x16e04
 	.byte	0
 	.uleb128 0x50
-	.4byte	0x15ce3
-	.8byte	.LBB2269
-	.8byte	.LBE2269-.LBB2269
+	.4byte	0x15ed4
+	.8byte	.LBB2326
+	.8byte	.LBE2326-.LBB2326
 	.byte	0x1
-	.2byte	0xaa2
-	.4byte	0x12627
+	.2byte	0xaa4
+	.4byte	0x1289a
 	.uleb128 0x51
-	.4byte	0x15cf4
+	.4byte	0x15ee5
 	.uleb128 0x4b
-	.8byte	.LVL1619
-	.4byte	0x16c1e
+	.8byte	.LVL1595
+	.4byte	0x16e0f
 	.byte	0
 	.uleb128 0x4b
-	.8byte	.LVL1621
-	.4byte	0x16bf0
+	.8byte	.LVL1597
+	.4byte	0x16de1
 	.uleb128 0x4b
-	.8byte	.LVL1623
-	.4byte	0x16bfc
+	.8byte	.LVL1601
+	.4byte	0x16ded
 	.byte	0
 	.uleb128 0x5a
-	.4byte	0x15ce3
-	.8byte	.LBB2265
-	.8byte	.LBE2265-.LBB2265
+	.4byte	0x15ed4
+	.8byte	.LBB2322
+	.8byte	.LBE2322-.LBB2322
 	.byte	0x1
-	.2byte	0xaa2
+	.2byte	0xaa4
 	.uleb128 0x51
-	.4byte	0x15cf4
+	.4byte	0x15ee5
 	.uleb128 0x4b
-	.8byte	.LVL1498
-	.4byte	0x16c1e
+	.8byte	.LVL1492
+	.4byte	0x16e0f
 	.byte	0
 	.byte	0
-	.uleb128 0x6c
-	.4byte	.Ldebug_ranges0+0x2210
-	.4byte	0x1271b
+	.uleb128 0x68
+	.4byte	.Ldebug_ranges0+0x2310
+	.4byte	0x1298e
 	.uleb128 0x43
 	.4byte	.LASF3078
 	.byte	0x1
-	.2byte	0xabd
+	.2byte	0xabf
 	.4byte	0xc6
 	.uleb128 0x53
-	.8byte	.LBB2259
-	.8byte	.LBE2259-.LBB2259
+	.8byte	.LBB2332
+	.8byte	.LBE2332-.LBB2332
 	.uleb128 0x6e
 	.4byte	.LASF3080
 	.byte	0x1
-	.2byte	0xabd
+	.2byte	0xabf
+	.8byte	.L1411
+	.uleb128 0x49
+	.4byte	.LASF3081
+	.byte	0x1
+	.2byte	0xabf
+	.4byte	0x1528
+	.uleb128 0x2
+	.byte	0x91
+	.sleb128 -48
+	.uleb128 0x43
+	.4byte	.LASF3078
+	.byte	0x1
+	.2byte	0xabf
+	.4byte	0x199
+	.uleb128 0x5f
+	.8byte	.LBB2333
+	.8byte	.LBE2333-.LBB2333
+	.4byte	0x12972
+	.uleb128 0x56
+	.4byte	.LASF3082
+	.byte	0x1
+	.2byte	0xabf
+	.4byte	0x199
+	.4byte	.LLST400
+	.uleb128 0x4b
+	.8byte	.LVL1564
+	.4byte	0x16dca
+	.uleb128 0x4b
+	.8byte	.LVL1565
+	.4byte	0x16dd5
+	.byte	0
+	.uleb128 0x4b
+	.8byte	.LVL1562
+	.4byte	0x16de1
+	.uleb128 0x4b
+	.8byte	.LVL1566
+	.4byte	0x16ded
+	.byte	0
+	.byte	0
+	.uleb128 0x68
+	.4byte	.Ldebug_ranges0+0x1d20
+	.4byte	0x12a60
+	.uleb128 0x43
+	.4byte	.LASF3078
+	.byte	0x1
+	.2byte	0xae4
+	.4byte	0x199
+	.uleb128 0x6f
+	.4byte	0x129b5
+	.uleb128 0x43
+	.4byte	.LASF3083
+	.byte	0x1
+	.2byte	0xae4
+	.4byte	0x2b0
+	.byte	0
+	.uleb128 0x5b
+	.4byte	.Ldebug_ranges0+0x1d20
+	.uleb128 0x6e
+	.4byte	.LASF3080
+	.byte	0x1
+	.2byte	0xae4
 	.8byte	.L1420
 	.uleb128 0x49
 	.4byte	.LASF3081
 	.byte	0x1
-	.2byte	0xabd
-	.4byte	0x1528
-	.uleb128 0x2
-	.byte	0x91
-	.sleb128 -48
-	.uleb128 0x43
-	.4byte	.LASF3078
-	.byte	0x1
-	.2byte	0xabd
-	.4byte	0x199
-	.uleb128 0x5f
-	.8byte	.LBB2260
-	.8byte	.LBE2260-.LBB2260
-	.4byte	0x126ff
-	.uleb128 0x56
-	.4byte	.LASF3082
-	.byte	0x1
-	.2byte	0xabd
-	.4byte	0x199
-	.4byte	.LLST383
-	.uleb128 0x4b
-	.8byte	.LVL1567
-	.4byte	0x16bd9
-	.uleb128 0x4b
-	.8byte	.LVL1568
-	.4byte	0x16be4
-	.byte	0
-	.uleb128 0x4b
-	.8byte	.LVL1565
-	.4byte	0x16bf0
-	.uleb128 0x4b
-	.8byte	.LVL1569
-	.4byte	0x16bfc
-	.byte	0
-	.byte	0
-	.uleb128 0x6c
-	.4byte	.Ldebug_ranges0+0x1c90
-	.4byte	0x127ed
-	.uleb128 0x43
-	.4byte	.LASF3078
-	.byte	0x1
-	.2byte	0xae1
-	.4byte	0x199
-	.uleb128 0x6f
-	.4byte	0x12742
-	.uleb128 0x43
-	.4byte	.LASF3083
-	.byte	0x1
-	.2byte	0xae1
-	.4byte	0x2b0
-	.byte	0
-	.uleb128 0x5b
-	.4byte	.Ldebug_ranges0+0x1c90
-	.uleb128 0x6e
-	.4byte	.LASF3080
-	.byte	0x1
-	.2byte	0xae1
-	.8byte	.L1429
-	.uleb128 0x49
-	.4byte	.LASF3081
-	.byte	0x1
-	.2byte	0xae1
+	.2byte	0xae4
 	.4byte	0x1528
 	.uleb128 0x2
 	.byte	0x91
@@ -50308,67 +50609,67 @@
 	.uleb128 0x56
 	.4byte	.LASF3078
 	.byte	0x1
-	.2byte	0xae1
+	.2byte	0xae4
 	.4byte	0x199
-	.4byte	.LLST353
-	.uleb128 0x6c
-	.4byte	.Ldebug_ranges0+0x1cf0
-	.4byte	0x127d1
+	.4byte	.LLST361
+	.uleb128 0x68
+	.4byte	.Ldebug_ranges0+0x1d70
+	.4byte	0x12a44
 	.uleb128 0x56
 	.4byte	.LASF3082
 	.byte	0x1
-	.2byte	0xae1
+	.2byte	0xae4
 	.4byte	0x199
-	.4byte	.LLST354
-	.uleb128 0x6c
-	.4byte	.Ldebug_ranges0+0x1d50
-	.4byte	0x127a9
+	.4byte	.LLST362
+	.uleb128 0x68
+	.4byte	.Ldebug_ranges0+0x1dc0
+	.4byte	0x12a1c
 	.uleb128 0x56
 	.4byte	.LASF3083
 	.byte	0x1
-	.2byte	0xae1
+	.2byte	0xae4
 	.4byte	0x2b0
-	.4byte	.LLST355
+	.4byte	.LLST363
 	.byte	0
 	.uleb128 0x4b
-	.8byte	.LVL1504
-	.4byte	0x16be4
+	.8byte	.LVL1452
+	.4byte	0x16dd5
 	.uleb128 0x4b
-	.8byte	.LVL1508
-	.4byte	0x16c13
+	.8byte	.LVL1457
+	.4byte	0x16e04
 	.uleb128 0x4b
-	.8byte	.LVL1509
-	.4byte	0x16be4
+	.8byte	.LVL1458
+	.4byte	0x16dd5
 	.byte	0
 	.uleb128 0x4b
-	.8byte	.LVL1502
-	.4byte	0x16bf0
+	.8byte	.LVL1451
+	.4byte	0x16de1
 	.uleb128 0x4b
-	.8byte	.LVL1511
-	.4byte	0x16bfc
+	.8byte	.LVL1461
+	.4byte	0x16ded
 	.byte	0
 	.byte	0
 	.uleb128 0x5f
-	.8byte	.LBB2296
-	.8byte	.LBE2296-.LBB2296
-	.4byte	0x128b3
+	.8byte	.LBB2309
+	.8byte	.LBE2309-.LBB2309
+	.4byte	0x12b26
 	.uleb128 0x43
 	.4byte	.LASF3078
 	.byte	0x1
-	.2byte	0xaea
+	.2byte	0xaed
 	.4byte	0xc6
 	.uleb128 0x53
-	.8byte	.LBB2297
-	.8byte	.LBE2297-.LBB2297
+	.8byte	.LBB2310
+	.8byte	.LBE2310-.LBB2310
 	.uleb128 0x6e
 	.4byte	.LASF3080
 	.byte	0x1
-	.2byte	0xaea
-	.8byte	.L1435
+	.2byte	0xaed
+	.8byte	.L1426
 	.uleb128 0x49
 	.4byte	.LASF3081
 	.byte	0x1
-	.2byte	0xaea
+	.2byte	0xaed
 	.4byte	0x1528
 	.uleb128 0x2
 	.byte	0x91
@@ -50376,55 +50677,55 @@
 	.uleb128 0x43
 	.4byte	.LASF3078
 	.byte	0x1
-	.2byte	0xaea
+	.2byte	0xaed
 	.4byte	0x199
 	.uleb128 0x5f
-	.8byte	.LBB2298
-	.8byte	.LBE2298-.LBB2298
-	.4byte	0x12897
+	.8byte	.LBB2311
+	.8byte	.LBE2311-.LBB2311
+	.4byte	0x12b0a
 	.uleb128 0x56
 	.4byte	.LASF3082
 	.byte	0x1
-	.2byte	0xaea
+	.2byte	0xaed
 	.4byte	0x199
-	.4byte	.LLST391
+	.4byte	.LLST393
 	.uleb128 0x4b
-	.8byte	.LVL1574
-	.4byte	0x16be4
+	.8byte	.LVL1464
+	.4byte	0x16dd5
 	.uleb128 0x4b
-	.8byte	.LVL1576
-	.4byte	0x16bd9
+	.8byte	.LVL1466
+	.4byte	0x16dca
 	.uleb128 0x4b
-	.8byte	.LVL1577
-	.4byte	0x16be4
+	.8byte	.LVL1467
+	.4byte	0x16dd5
 	.byte	0
 	.uleb128 0x4b
-	.8byte	.LVL1573
-	.4byte	0x16bf0
+	.8byte	.LVL1463
+	.4byte	0x16de1
 	.uleb128 0x4b
-	.8byte	.LVL1578
-	.4byte	0x16bfc
+	.8byte	.LVL1468
+	.4byte	0x16ded
 	.byte	0
 	.byte	0
-	.uleb128 0x6c
-	.4byte	.Ldebug_ranges0+0x23d0
-	.4byte	0x12954
+	.uleb128 0x68
+	.4byte	.Ldebug_ranges0+0x2250
+	.4byte	0x12bc7
 	.uleb128 0x43
 	.4byte	.LASF3078
 	.byte	0x1
-	.2byte	0xaf9
+	.2byte	0xafc
 	.4byte	0xc6
 	.uleb128 0x5b
-	.4byte	.Ldebug_ranges0+0x23d0
+	.4byte	.Ldebug_ranges0+0x2250
 	.uleb128 0x6e
 	.4byte	.LASF3080
 	.byte	0x1
-	.2byte	0xaf9
-	.8byte	.L1442
+	.2byte	0xafc
+	.8byte	.L1433
 	.uleb128 0x49
 	.4byte	.LASF3081
 	.byte	0x1
-	.2byte	0xaf9
+	.2byte	0xafc
 	.4byte	0x1528
 	.uleb128 0x2
 	.byte	0x91
@@ -50432,1053 +50733,1047 @@
 	.uleb128 0x43
 	.4byte	.LASF3078
 	.byte	0x1
-	.2byte	0xaf9
+	.2byte	0xafc
 	.4byte	0x199
 	.uleb128 0x5f
-	.8byte	.LBB2303
-	.8byte	.LBE2303-.LBB2303
-	.4byte	0x12938
+	.8byte	.LBB2316
+	.8byte	.LBE2316-.LBB2316
+	.4byte	0x12bab
 	.uleb128 0x56
 	.4byte	.LASF3082
 	.byte	0x1
-	.2byte	0xaf9
+	.2byte	0xafc
 	.4byte	0x199
-	.4byte	.LLST392
+	.4byte	.LLST394
 	.uleb128 0x4b
-	.8byte	.LVL1583
-	.4byte	0x16be4
+	.8byte	.LVL1473
+	.4byte	0x16dd5
 	.uleb128 0x4b
-	.8byte	.LVL1585
-	.4byte	0x16bd9
+	.8byte	.LVL1475
+	.4byte	0x16dca
 	.byte	0
 	.uleb128 0x4b
-	.8byte	.LVL1582
-	.4byte	0x16bf0
+	.8byte	.LVL1472
+	.4byte	0x16de1
 	.uleb128 0x4b
-	.8byte	.LVL1587
-	.4byte	0x16bfc
+	.8byte	.LVL1625
+	.4byte	0x16ded
 	.byte	0
 	.byte	0
 	.uleb128 0x58
-	.4byte	0x152f6
-	.8byte	.LBB2184
-	.4byte	.Ldebug_ranges0+0x1d80
+	.4byte	0x154e7
+	.8byte	.LBB2231
+	.4byte	.Ldebug_ranges0+0x1df0
 	.byte	0x1
-	.2byte	0x941
-	.4byte	0x12ab5
+	.2byte	0x943
+	.4byte	0x12d28
 	.uleb128 0x51
-	.4byte	0x1533f
+	.4byte	0x15530
 	.uleb128 0x51
-	.4byte	0x1533f
+	.4byte	0x15530
 	.uleb128 0x51
-	.4byte	0x1533f
-	.uleb128 0x6a
-	.4byte	0x15333
-	.4byte	.LLST356
-	.uleb128 0x6a
-	.4byte	0x15327
-	.4byte	.LLST357
-	.uleb128 0x6a
-	.4byte	0x1531b
-	.4byte	.LLST358
-	.uleb128 0x6a
-	.4byte	0x1530f
-	.4byte	.LLST359
-	.uleb128 0x6a
-	.4byte	0x15303
-	.4byte	.LLST360
-	.uleb128 0x5b
-	.4byte	.Ldebug_ranges0+0x1d80
-	.uleb128 0x54
-	.4byte	0x1534b
-	.uleb128 0x5d
-	.4byte	0x15357
-	.4byte	.LLST361
-	.uleb128 0x54
-	.4byte	0x15363
-	.uleb128 0x5d
-	.4byte	0x1536f
-	.4byte	.LLST362
-	.uleb128 0x5d
-	.4byte	0x1537b
-	.4byte	.LLST363
-	.uleb128 0x5d
-	.4byte	0x15387
+	.4byte	0x15530
+	.uleb128 0x6b
+	.4byte	0x15524
 	.4byte	.LLST364
-	.uleb128 0x5d
-	.4byte	0x15393
+	.uleb128 0x6b
+	.4byte	0x15518
 	.4byte	.LLST365
+	.uleb128 0x6b
+	.4byte	0x1550c
+	.4byte	.LLST366
+	.uleb128 0x6b
+	.4byte	0x15500
+	.4byte	.LLST367
+	.uleb128 0x6b
+	.4byte	0x154f4
+	.4byte	.LLST368
+	.uleb128 0x5b
+	.4byte	.Ldebug_ranges0+0x1df0
+	.uleb128 0x54
+	.4byte	0x1553c
+	.uleb128 0x5d
+	.4byte	0x15548
+	.4byte	.LLST369
+	.uleb128 0x54
+	.4byte	0x15554
+	.uleb128 0x5d
+	.4byte	0x15560
+	.4byte	.LLST370
+	.uleb128 0x5d
+	.4byte	0x1556c
+	.4byte	.LLST371
+	.uleb128 0x5d
+	.4byte	0x15578
+	.4byte	.LLST372
+	.uleb128 0x5d
+	.4byte	0x15584
+	.4byte	.LLST373
 	.uleb128 0x5e
-	.4byte	0x1539f
+	.4byte	0x15590
 	.uleb128 0x1
 	.byte	0x52
 	.uleb128 0x5e
-	.4byte	0x153ab
+	.4byte	0x1559c
 	.uleb128 0x1
 	.byte	0x5e
 	.uleb128 0x5d
-	.4byte	0x153b5
-	.4byte	.LLST366
-	.uleb128 0x5d
-	.4byte	0x153bf
-	.4byte	.LLST367
-	.uleb128 0x5d
-	.4byte	0x153cb
-	.4byte	.LLST368
-	.uleb128 0x5d
-	.4byte	0x153d7
-	.4byte	.LLST369
-	.uleb128 0x5d
-	.4byte	0x153e3
-	.4byte	.LLST370
-	.uleb128 0x6c
-	.4byte	.Ldebug_ranges0+0x1e00
-	.4byte	0x12a32
-	.uleb128 0x5d
-	.4byte	0x15460
-	.4byte	.LLST371
-	.byte	0
-	.uleb128 0x6c
-	.4byte	.Ldebug_ranges0+0x1e70
-	.4byte	0x12a45
-	.uleb128 0x5d
-	.4byte	0x1546e
-	.4byte	.LLST372
-	.byte	0
-	.uleb128 0x6c
-	.4byte	.Ldebug_ranges0+0x1ee0
-	.4byte	0x12a58
-	.uleb128 0x5d
-	.4byte	0x153f4
-	.4byte	.LLST373
-	.byte	0
-	.uleb128 0x6c
-	.4byte	.Ldebug_ranges0+0x1f40
-	.4byte	0x12a6b
-	.uleb128 0x5d
-	.4byte	0x15406
+	.4byte	0x155a6
 	.4byte	.LLST374
-	.byte	0
-	.uleb128 0x6c
-	.4byte	.Ldebug_ranges0+0x1fa0
-	.4byte	0x12a7e
 	.uleb128 0x5d
-	.4byte	0x15418
+	.4byte	0x155b0
 	.4byte	.LLST375
-	.byte	0
-	.uleb128 0x6c
-	.4byte	.Ldebug_ranges0+0x2000
-	.4byte	0x12a91
 	.uleb128 0x5d
-	.4byte	0x1542a
+	.4byte	0x155bc
 	.4byte	.LLST376
-	.byte	0
-	.uleb128 0x6c
-	.4byte	.Ldebug_ranges0+0x2060
-	.4byte	0x12aa4
 	.uleb128 0x5d
-	.4byte	0x1543c
+	.4byte	0x155c8
 	.4byte	.LLST377
-	.byte	0
-	.uleb128 0x5b
-	.4byte	.Ldebug_ranges0+0x20c0
 	.uleb128 0x5d
-	.4byte	0x1544e
+	.4byte	0x155d4
 	.4byte	.LLST378
+	.uleb128 0x68
+	.4byte	.Ldebug_ranges0+0x1e70
+	.4byte	0x12ca5
+	.uleb128 0x5d
+	.4byte	0x15651
+	.4byte	.LLST379
 	.byte	0
+	.uleb128 0x68
+	.4byte	.Ldebug_ranges0+0x1ee0
+	.4byte	0x12cb8
+	.uleb128 0x5d
+	.4byte	0x1565f
+	.4byte	.LLST380
 	.byte	0
+	.uleb128 0x68
+	.4byte	.Ldebug_ranges0+0x1f50
+	.4byte	0x12ccb
+	.uleb128 0x5d
+	.4byte	0x155e5
+	.4byte	.LLST381
 	.byte	0
-	.uleb128 0x50
-	.4byte	0x1312c
-	.8byte	.LBB2240
-	.8byte	.LBE2240-.LBB2240
-	.byte	0x1
-	.2byte	0xa72
-	.4byte	0x12b1b
-	.uleb128 0x51
-	.4byte	0x1313d
-	.uleb128 0x51
-	.4byte	0x13149
-	.uleb128 0x51
-	.4byte	0x13155
-	.uleb128 0x53
-	.8byte	.LBB2241
-	.8byte	.LBE2241-.LBB2241
-	.uleb128 0x54
-	.4byte	0x13161
-	.uleb128 0x54
-	.4byte	0x1316b
-	.uleb128 0x54
-	.4byte	0x13177
-	.uleb128 0x54
-	.4byte	0x13183
-	.uleb128 0x54
-	.4byte	0x1318f
-	.uleb128 0x54
-	.4byte	0x1319b
-	.uleb128 0x54
-	.4byte	0x131a7
-	.uleb128 0x70
-	.4byte	0x131b3
+	.uleb128 0x68
+	.4byte	.Ldebug_ranges0+0x1fb0
+	.4byte	0x12cde
+	.uleb128 0x5d
+	.4byte	0x155f7
+	.4byte	.LLST382
 	.byte	0
+	.uleb128 0x68
+	.4byte	.Ldebug_ranges0+0x2010
+	.4byte	0x12cf1
+	.uleb128 0x5d
+	.4byte	0x15609
+	.4byte	.LLST383
 	.byte	0
-	.uleb128 0x50
-	.4byte	0x1547c
-	.8byte	.LBB2281
-	.8byte	.LBE2281-.LBB2281
-	.byte	0x1
-	.2byte	0x92a
-	.4byte	0x12b66
-	.uleb128 0x51
-	.4byte	0x15499
-	.uleb128 0x51
-	.4byte	0x1548d
-	.uleb128 0x53
-	.8byte	.LBB2282
-	.8byte	.LBE2282-.LBB2282
-	.uleb128 0x54
-	.4byte	0x154a5
-	.uleb128 0x4b
-	.8byte	.LVL1528
-	.4byte	0x1643d
+	.uleb128 0x68
+	.4byte	.Ldebug_ranges0+0x2070
+	.4byte	0x12d04
+	.uleb128 0x5d
+	.4byte	0x1561b
+	.4byte	.LLST384
 	.byte	0
+	.uleb128 0x68
+	.4byte	.Ldebug_ranges0+0x20d0
+	.4byte	0x12d17
+	.uleb128 0x5d
+	.4byte	0x1562d
+	.4byte	.LLST385
 	.byte	0
-	.uleb128 0x50
-	.4byte	0x1547c
-	.8byte	.LBB2299
-	.8byte	.LBE2299-.LBB2299
-	.byte	0x1
-	.2byte	0xaf6
-	.4byte	0x12bb1
-	.uleb128 0x51
-	.4byte	0x15499
-	.uleb128 0x51
-	.4byte	0x1548d
-	.uleb128 0x53
-	.8byte	.LBB2300
-	.8byte	.LBE2300-.LBB2300
-	.uleb128 0x54
-	.4byte	0x154a5
-	.uleb128 0x4b
-	.8byte	.LVL1581
-	.4byte	0x1643d
-	.byte	0
-	.byte	0
-	.uleb128 0x58
-	.4byte	0x13a67
-	.8byte	.LBB2307
-	.4byte	.Ldebug_ranges0+0x2400
-	.byte	0x1
-	.2byte	0xa09
-	.4byte	0x12c66
-	.uleb128 0x51
-	.4byte	0x13a74
 	.uleb128 0x5b
-	.4byte	.Ldebug_ranges0+0x2400
-	.uleb128 0x54
-	.4byte	0x13a80
-	.uleb128 0x54
-	.4byte	0x13a8c
-	.uleb128 0x54
-	.4byte	0x13a98
+	.4byte	.Ldebug_ranges0+0x2130
+	.uleb128 0x5d
+	.4byte	0x1563f
+	.4byte	.LLST386
+	.byte	0
+	.byte	0
+	.byte	0
 	.uleb128 0x50
-	.4byte	0x13abb
-	.8byte	.LBB2309
-	.8byte	.LBE2309-.LBB2309
+	.4byte	0x13385
+	.8byte	.LBB2287
+	.8byte	.LBE2287-.LBB2287
 	.byte	0x1
-	.2byte	0x65e
-	.4byte	0x12c16
+	.2byte	0xa75
+	.4byte	0x12d8e
 	.uleb128 0x51
-	.4byte	0x13ad4
+	.4byte	0x13396
 	.uleb128 0x51
-	.4byte	0x13ac8
-	.uleb128 0x4b
-	.8byte	.LVL1605
-	.4byte	0x1633b
-	.byte	0
-	.uleb128 0x4b
-	.8byte	.LVL1602
-	.4byte	0x1450f
-	.uleb128 0x4b
-	.8byte	.LVL1603
-	.4byte	0x168e5
-	.uleb128 0x4b
-	.8byte	.LVL1604
-	.4byte	0x1450f
-	.uleb128 0x4b
-	.8byte	.LVL1609
-	.4byte	0x14bc3
-	.uleb128 0x4b
-	.8byte	.LVL1610
-	.4byte	0x169af
-	.uleb128 0x4b
-	.8byte	.LVL1611
-	.4byte	0x14bc3
+	.4byte	0x133a2
+	.uleb128 0x51
+	.4byte	0x133ae
+	.uleb128 0x53
+	.8byte	.LBB2288
+	.8byte	.LBE2288-.LBB2288
+	.uleb128 0x54
+	.4byte	0x133ba
+	.uleb128 0x54
+	.4byte	0x133c4
+	.uleb128 0x54
+	.4byte	0x133d0
+	.uleb128 0x54
+	.4byte	0x133dc
+	.uleb128 0x54
+	.4byte	0x133e8
+	.uleb128 0x54
+	.4byte	0x133f4
+	.uleb128 0x54
+	.4byte	0x13400
+	.uleb128 0x70
+	.4byte	0x1340c
 	.byte	0
 	.byte	0
 	.uleb128 0x50
-	.4byte	0x15ce3
+	.4byte	0x15ed4
+	.8byte	.LBB2303
+	.8byte	.LBE2303-.LBB2303
+	.byte	0x1
+	.2byte	0xa16
+	.4byte	0x12dbd
+	.uleb128 0x51
+	.4byte	0x15ee5
+	.uleb128 0x4b
+	.8byte	.LVL1434
+	.4byte	0x16e0f
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x1566d
 	.8byte	.LBB2312
 	.8byte	.LBE2312-.LBB2312
 	.byte	0x1
-	.2byte	0xa12
-	.4byte	0x12c95
+	.2byte	0xaf9
+	.4byte	0x12e08
 	.uleb128 0x51
-	.4byte	0x15cf4
+	.4byte	0x1568a
+	.uleb128 0x51
+	.4byte	0x1567e
+	.uleb128 0x53
+	.8byte	.LBB2313
+	.8byte	.LBE2313-.LBB2313
+	.uleb128 0x54
+	.4byte	0x15696
 	.uleb128 0x4b
-	.8byte	.LVL1607
-	.4byte	0x16c1e
+	.8byte	.LVL1471
+	.4byte	0x1662e
+	.byte	0
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x1566d
+	.8byte	.LBB2337
+	.8byte	.LBE2337-.LBB2337
+	.byte	0x1
+	.2byte	0x92b
+	.4byte	0x12e53
+	.uleb128 0x51
+	.4byte	0x1568a
+	.uleb128 0x51
+	.4byte	0x1567e
+	.uleb128 0x53
+	.8byte	.LBB2338
+	.8byte	.LBE2338-.LBB2338
+	.uleb128 0x54
+	.4byte	0x15696
+	.uleb128 0x4b
+	.8byte	.LVL1548
+	.4byte	0x1662e
+	.byte	0
+	.byte	0
+	.uleb128 0x58
+	.4byte	0x13c58
+	.8byte	.LBB2351
+	.4byte	.Ldebug_ranges0+0x23a0
+	.byte	0x1
+	.2byte	0xa0d
+	.4byte	0x12f08
+	.uleb128 0x51
+	.4byte	0x13c65
+	.uleb128 0x5b
+	.4byte	.Ldebug_ranges0+0x23a0
+	.uleb128 0x54
+	.4byte	0x13c71
+	.uleb128 0x54
+	.4byte	0x13c7d
+	.uleb128 0x54
+	.4byte	0x13c89
+	.uleb128 0x50
+	.4byte	0x13cac
+	.8byte	.LBB2353
+	.8byte	.LBE2353-.LBB2353
+	.byte	0x1
+	.2byte	0x65d
+	.4byte	0x12eb8
+	.uleb128 0x51
+	.4byte	0x13cc5
+	.uleb128 0x51
+	.4byte	0x13cb9
+	.uleb128 0x4b
+	.8byte	.LVL1612
+	.4byte	0x1652c
+	.byte	0
+	.uleb128 0x4b
+	.8byte	.LVL1610
+	.4byte	0x14700
+	.uleb128 0x4b
+	.8byte	.LVL1611
+	.4byte	0x14700
+	.uleb128 0x4b
+	.8byte	.LVL1613
+	.4byte	0x14db4
+	.uleb128 0x4b
+	.8byte	.LVL1614
+	.4byte	0x14db4
+	.uleb128 0x4b
+	.8byte	.LVL1615
+	.4byte	0x16ad6
+	.uleb128 0x4b
+	.8byte	.LVL1616
+	.4byte	0x16ba0
+	.byte	0
 	.byte	0
 	.uleb128 0x4b
 	.8byte	.LVL1328
-	.4byte	0x16c2a
+	.4byte	0x16e1b
 	.uleb128 0x4b
 	.8byte	.LVL1369
-	.4byte	0x1322c
+	.4byte	0x13485
 	.uleb128 0x4b
 	.8byte	.LVL1370
-	.4byte	0x169af
+	.4byte	0x16ba0
 	.uleb128 0x4b
 	.8byte	.LVL1371
-	.4byte	0x13839
+	.4byte	0x13a92
 	.uleb128 0x4b
 	.8byte	.LVL1372
-	.4byte	0x16ba2
+	.4byte	0x16dbf
 	.uleb128 0x4b
 	.8byte	.LVL1390
-	.4byte	0x169af
+	.4byte	0x16ba0
 	.uleb128 0x4b
 	.8byte	.LVL1391
-	.4byte	0x16ba2
+	.4byte	0x16dbf
 	.uleb128 0x4b
-	.8byte	.LVL1403
-	.4byte	0x16c35
+	.8byte	.LVL1401
+	.4byte	0x16e26
+	.uleb128 0x4b
+	.8byte	.LVL1406
+	.4byte	0x16ba0
 	.uleb128 0x4b
 	.8byte	.LVL1409
-	.4byte	0x169af
+	.4byte	0x16c06
 	.uleb128 0x4b
-	.8byte	.LVL1411
-	.4byte	0x169af
+	.8byte	.LVL1410
+	.4byte	0x16dbf
 	.uleb128 0x4b
 	.8byte	.LVL1412
-	.4byte	0x16ba2
+	.4byte	0x16c33
 	.uleb128 0x4b
-	.8byte	.LVL1414
-	.4byte	0x16a4d
+	.8byte	.LVL1413
+	.4byte	0x16ba0
 	.uleb128 0x4b
-	.8byte	.LVL1415
-	.4byte	0x169af
+	.8byte	.LVL1416
+	.4byte	0x16ba0
+	.uleb128 0x4b
+	.8byte	.LVL1417
+	.4byte	0x1696c
 	.uleb128 0x4b
 	.8byte	.LVL1418
-	.4byte	0x169af
+	.4byte	0x16dbf
 	.uleb128 0x4b
-	.8byte	.LVL1426
-	.4byte	0x1677b
+	.8byte	.LVL1420
+	.4byte	0x16ad6
 	.uleb128 0x4b
-	.8byte	.LVL1427
-	.4byte	0x16ba2
+	.8byte	.LVL1421
+	.4byte	0x16cd1
+	.uleb128 0x4b
+	.8byte	.LVL1422
+	.4byte	0x16cd1
+	.uleb128 0x4b
+	.8byte	.LVL1424
+	.4byte	0x16df9
+	.uleb128 0x4b
+	.8byte	.LVL1425
+	.4byte	0x16ba0
 	.uleb128 0x4b
 	.8byte	.LVL1429
-	.4byte	0x168e5
+	.4byte	0x16df9
+	.uleb128 0x4b
+	.8byte	.LVL1432
+	.4byte	0x1524c
 	.uleb128 0x4b
 	.8byte	.LVL1433
-	.4byte	0x16c08
+	.4byte	0x16ba0
 	.uleb128 0x4b
-	.8byte	.LVL1434
-	.4byte	0x169af
+	.8byte	.LVL1435
+	.4byte	0x16c61
 	.uleb128 0x4b
-	.8byte	.LVL1442
-	.4byte	0x16c08
+	.8byte	.LVL1439
+	.4byte	0x16e31
 	.uleb128 0x4b
-	.8byte	.LVL1445
-	.4byte	0x1505b
+	.8byte	.LVL1440
+	.4byte	0x16ba0
 	.uleb128 0x4b
-	.8byte	.LVL1446
-	.4byte	0x16ae0
+	.8byte	.LVL1441
+	.4byte	0x1696c
 	.uleb128 0x4b
-	.8byte	.LVL1447
-	.4byte	0x16ae0
-	.uleb128 0x4b
-	.8byte	.LVL1450
-	.4byte	0x16a20
-	.uleb128 0x4b
-	.8byte	.LVL1451
-	.4byte	0x16ba2
-	.uleb128 0x4b
-	.8byte	.LVL1452
-	.4byte	0x14f94
-	.uleb128 0x4b
-	.8byte	.LVL1453
-	.4byte	0x168e5
-	.uleb128 0x4b
-	.8byte	.LVL1454
-	.4byte	0x1322c
-	.uleb128 0x4b
-	.8byte	.LVL1455
-	.4byte	0x169af
-	.uleb128 0x4b
-	.8byte	.LVL1456
-	.4byte	0x13839
-	.uleb128 0x4b
-	.8byte	.LVL1459
-	.4byte	0x169af
-	.uleb128 0x4b
-	.8byte	.LVL1461
-	.4byte	0x1677b
+	.8byte	.LVL1444
+	.4byte	0x16ba0
 	.uleb128 0x4b
 	.8byte	.LVL1469
-	.4byte	0x1322c
+	.4byte	0x16df9
 	.uleb128 0x4b
-	.8byte	.LVL1474
-	.4byte	0x169af
-	.uleb128 0x4b
-	.8byte	.LVL1475
-	.4byte	0x13839
-	.uleb128 0x4b
-	.8byte	.LVL1476
-	.4byte	0x16a7b
+	.8byte	.LVL1470
+	.4byte	0x16e3c
 	.uleb128 0x4b
 	.8byte	.LVL1479
-	.4byte	0x16a7b
+	.4byte	0x16ba0
+	.uleb128 0x4b
+	.8byte	.LVL1481
+	.4byte	0x16df9
 	.uleb128 0x4b
 	.8byte	.LVL1482
-	.4byte	0x16c40
+	.4byte	0x16ba0
 	.uleb128 0x4b
-	.8byte	.LVL1483
-	.4byte	0x169af
+	.8byte	.LVL1489
+	.4byte	0x13485
 	.uleb128 0x4b
-	.8byte	.LVL1484
-	.4byte	0x1677b
+	.8byte	.LVL1490
+	.4byte	0x16df9
 	.uleb128 0x4b
-	.8byte	.LVL1487
-	.4byte	0x169af
-	.uleb128 0x4b
-	.8byte	.LVL1494
-	.4byte	0x168e5
+	.8byte	.LVL1491
+	.4byte	0x16ba0
 	.uleb128 0x4b
 	.8byte	.LVL1495
-	.4byte	0x1322c
+	.4byte	0x16df9
 	.uleb128 0x4b
-	.8byte	.LVL1496
-	.4byte	0x16c08
-	.uleb128 0x4b
-	.8byte	.LVL1497
-	.4byte	0x169af
+	.8byte	.LVL1499
+	.4byte	0x16ba0
 	.uleb128 0x4b
 	.8byte	.LVL1500
-	.4byte	0x16c08
+	.4byte	0x13a92
+	.uleb128 0x4b
+	.8byte	.LVL1501
+	.4byte	0x16c61
+	.uleb128 0x4b
+	.8byte	.LVL1504
+	.4byte	0x16c61
+	.uleb128 0x4b
+	.8byte	.LVL1506
+	.4byte	0x16ba0
+	.uleb128 0x4b
+	.8byte	.LVL1507
+	.4byte	0x16dbf
+	.uleb128 0x4b
+	.8byte	.LVL1509
+	.4byte	0x15185
+	.uleb128 0x4b
+	.8byte	.LVL1510
+	.4byte	0x13485
+	.uleb128 0x4b
+	.8byte	.LVL1511
+	.4byte	0x16ba0
+	.uleb128 0x4b
+	.8byte	.LVL1512
+	.4byte	0x13a92
 	.uleb128 0x4b
 	.8byte	.LVL1513
-	.4byte	0x16c08
+	.4byte	0x16ba0
 	.uleb128 0x4b
-	.8byte	.LVL1514
-	.4byte	0x16c4b
+	.8byte	.LVL1517
+	.4byte	0x16ad6
 	.uleb128 0x4b
-	.8byte	.LVL1516
-	.4byte	0x169af
+	.8byte	.LVL1519
+	.4byte	0x16ba0
 	.uleb128 0x4b
-	.8byte	.LVL1530
-	.4byte	0x169af
+	.8byte	.LVL1520
+	.4byte	0x16e31
 	.uleb128 0x4b
-	.8byte	.LVL1531
-	.4byte	0x16ba2
+	.8byte	.LVL1521
+	.4byte	0x16dbf
 	.uleb128 0x4b
 	.8byte	.LVL1532
-	.4byte	0x16c40
+	.4byte	0x16ba0
 	.uleb128 0x4b
-	.8byte	.LVL1533
-	.4byte	0x169af
+	.8byte	.LVL1550
+	.4byte	0x16ba0
 	.uleb128 0x4b
-	.8byte	.LVL1534
-	.4byte	0x169af
-	.uleb128 0x4b
-	.8byte	.LVL1537
-	.4byte	0x169af
-	.uleb128 0x4b
-	.8byte	.LVL1543
-	.4byte	0x169af
-	.uleb128 0x4b
-	.8byte	.LVL1544
-	.4byte	0x16ae0
-	.uleb128 0x4b
-	.8byte	.LVL1545
-	.4byte	0x16ae0
-	.uleb128 0x4b
-	.8byte	.LVL1547
-	.4byte	0x169af
-	.uleb128 0x4b
-	.8byte	.LVL1548
-	.4byte	0x16ba2
-	.uleb128 0x4b
-	.8byte	.LVL1549
-	.4byte	0x169af
+	.8byte	.LVL1551
+	.4byte	0x16ba0
 	.uleb128 0x4b
 	.8byte	.LVL1552
-	.4byte	0x169af
+	.4byte	0x16ba0
 	.uleb128 0x4b
-	.8byte	.LVL1553
-	.4byte	0x16ae0
+	.8byte	.LVL1555
+	.4byte	0x16ba0
 	.uleb128 0x4b
-	.8byte	.LVL1554
-	.4byte	0x16ae0
+	.8byte	.LVL1559
+	.4byte	0x16ba0
 	.uleb128 0x4b
-	.8byte	.LVL1557
-	.4byte	0x169af
+	.8byte	.LVL1560
+	.4byte	0x16dbf
 	.uleb128 0x4b
-	.8byte	.LVL1563
-	.4byte	0x16ae0
+	.8byte	.LVL1568
+	.4byte	0x16e31
+	.uleb128 0x4b
+	.8byte	.LVL1570
+	.4byte	0x16cd1
 	.uleb128 0x4b
 	.8byte	.LVL1571
-	.4byte	0x169af
+	.4byte	0x16cd1
+	.uleb128 0x4b
+	.8byte	.LVL1572
+	.4byte	0x16ad6
+	.uleb128 0x4b
+	.8byte	.LVL1573
+	.4byte	0x16ba0
+	.uleb128 0x4b
+	.8byte	.LVL1576
+	.4byte	0x16ba0
+	.uleb128 0x4b
+	.8byte	.LVL1577
+	.4byte	0x16cd1
 	.uleb128 0x4b
 	.8byte	.LVL1579
-	.4byte	0x16c08
-	.uleb128 0x4b
-	.8byte	.LVL1580
-	.4byte	0x16c4b
+	.4byte	0x16cd1
 	.uleb128 0x4b
 	.8byte	.LVL1586
-	.4byte	0x16b30
+	.4byte	0x16cd1
 	.uleb128 0x4b
-	.8byte	.LVL1589
-	.4byte	0x16c40
-	.uleb128 0x4b
-	.8byte	.LVL1594
-	.4byte	0x16c08
-	.uleb128 0x4b
-	.8byte	.LVL1595
-	.4byte	0x169af
-	.uleb128 0x4b
-	.8byte	.LVL1600
-	.4byte	0x1322c
-	.uleb128 0x4b
-	.8byte	.LVL1601
-	.4byte	0x169af
-	.uleb128 0x4b
-	.8byte	.LVL1606
-	.4byte	0x169af
+	.8byte	.LVL1587
+	.4byte	0x16ba0
 	.uleb128 0x4b
 	.8byte	.LVL1608
-	.4byte	0x16a7b
+	.4byte	0x13485
 	.uleb128 0x4b
-	.8byte	.LVL1612
-	.4byte	0x16c40
+	.8byte	.LVL1609
+	.4byte	0x16ba0
+	.uleb128 0x4b
+	.8byte	.LVL1622
+	.4byte	0x16e31
+	.uleb128 0x4b
+	.8byte	.LVL1624
+	.4byte	0x16d21
+	.uleb128 0x4b
+	.8byte	.LVL1637
+	.4byte	0x16df9
+	.uleb128 0x4b
+	.8byte	.LVL1638
+	.4byte	0x16e3c
 	.byte	0
 	.uleb128 0x60
-	.4byte	.LASF3085
+	.4byte	.LASF3084
 	.byte	0x1
-	.2byte	0x8fc
+	.2byte	0x8fd
 	.4byte	0xc6
 	.byte	0x1
-	.4byte	0x1312c
+	.4byte	0x13385
+	.uleb128 0x62
+	.4byte	.LASF3085
+	.byte	0x1
+	.2byte	0x8fd
+	.4byte	0xe472
 	.uleb128 0x62
 	.4byte	.LASF3086
 	.byte	0x1
-	.2byte	0x8fc
-	.4byte	0xe480
-	.uleb128 0x62
-	.4byte	.LASF3087
-	.byte	0x1
-	.2byte	0x8fc
-	.4byte	0xe480
+	.2byte	0x8fd
+	.4byte	0xe472
 	.uleb128 0x62
 	.4byte	.LASF2943
 	.byte	0x1
-	.2byte	0x8fc
-	.4byte	0xe82d
+	.2byte	0x8fd
+	.4byte	0xe81f
 	.uleb128 0x4f
 	.string	"i"
 	.byte	0x1
-	.2byte	0x8fe
+	.2byte	0x8ff
 	.4byte	0xc6
+	.uleb128 0x43
+	.4byte	.LASF3087
+	.byte	0x1
+	.2byte	0x900
+	.4byte	0x15a
 	.uleb128 0x43
 	.4byte	.LASF3088
 	.byte	0x1
-	.2byte	0x8ff
+	.2byte	0x900
 	.4byte	0x15a
 	.uleb128 0x43
 	.4byte	.LASF3089
-	.byte	0x1
-	.2byte	0x8ff
-	.4byte	0x15a
-	.uleb128 0x43
-	.4byte	.LASF3090
-	.byte	0x1
-	.2byte	0x900
-	.4byte	0xc6
-	.uleb128 0x43
-	.4byte	.LASF3091
 	.byte	0x1
 	.2byte	0x901
 	.4byte	0xc6
 	.uleb128 0x43
-	.4byte	.LASF3092
-	.byte	0x1
-	.2byte	0x902
-	.4byte	0x45aa
-	.uleb128 0x43
-	.4byte	.LASF3093
-	.byte	0x1
-	.2byte	0x903
-	.4byte	0x45aa
-	.uleb128 0x43
-	.4byte	.LASF3094
-	.byte	0x1
-	.2byte	0x904
-	.4byte	0xc6
-	.uleb128 0x43
-	.4byte	.LASF3095
-	.byte	0x1
-	.2byte	0x905
-	.4byte	0xc6
-	.byte	0
-	.uleb128 0x60
-	.4byte	.LASF3096
-	.byte	0x1
-	.2byte	0x8e5
-	.4byte	0xc6
-	.byte	0x1
-	.4byte	0x131bc
-	.uleb128 0x62
-	.4byte	.LASF3086
-	.byte	0x1
-	.2byte	0x8e5
-	.4byte	0xe480
-	.uleb128 0x62
-	.4byte	.LASF3087
-	.byte	0x1
-	.2byte	0x8e5
-	.4byte	0xe480
-	.uleb128 0x62
-	.4byte	.LASF3097
-	.byte	0x1
-	.2byte	0x8e5
-	.4byte	0xc6
-	.uleb128 0x4f
-	.string	"i"
-	.byte	0x1
-	.2byte	0x8e7
-	.4byte	0xc6
-	.uleb128 0x43
-	.4byte	.LASF3088
-	.byte	0x1
-	.2byte	0x8e8
-	.4byte	0x15a
-	.uleb128 0x43
-	.4byte	.LASF3089
-	.byte	0x1
-	.2byte	0x8e8
-	.4byte	0x15a
-	.uleb128 0x43
 	.4byte	.LASF3090
 	.byte	0x1
-	.2byte	0x8e9
+	.2byte	0x902
 	.4byte	0xc6
 	.uleb128 0x43
 	.4byte	.LASF3091
 	.byte	0x1
-	.2byte	0x8ea
-	.4byte	0xc6
+	.2byte	0x903
+	.4byte	0x45aa
 	.uleb128 0x43
 	.4byte	.LASF3092
 	.byte	0x1
-	.2byte	0x8eb
+	.2byte	0x904
 	.4byte	0x45aa
 	.uleb128 0x43
 	.4byte	.LASF3093
 	.byte	0x1
+	.2byte	0x905
+	.4byte	0xc6
+	.uleb128 0x43
+	.4byte	.LASF3094
+	.byte	0x1
+	.2byte	0x906
+	.4byte	0xc6
+	.byte	0
+	.uleb128 0x60
+	.4byte	.LASF3095
+	.byte	0x1
+	.2byte	0x8e6
+	.4byte	0xc6
+	.byte	0x1
+	.4byte	0x13415
+	.uleb128 0x62
+	.4byte	.LASF3085
+	.byte	0x1
+	.2byte	0x8e6
+	.4byte	0xe472
+	.uleb128 0x62
+	.4byte	.LASF3086
+	.byte	0x1
+	.2byte	0x8e6
+	.4byte	0xe472
+	.uleb128 0x62
+	.4byte	.LASF3096
+	.byte	0x1
+	.2byte	0x8e6
+	.4byte	0xc6
+	.uleb128 0x4f
+	.string	"i"
+	.byte	0x1
+	.2byte	0x8e8
+	.4byte	0xc6
+	.uleb128 0x43
+	.4byte	.LASF3087
+	.byte	0x1
+	.2byte	0x8e9
+	.4byte	0x15a
+	.uleb128 0x43
+	.4byte	.LASF3088
+	.byte	0x1
+	.2byte	0x8e9
+	.4byte	0x15a
+	.uleb128 0x43
+	.4byte	.LASF3089
+	.byte	0x1
+	.2byte	0x8ea
+	.4byte	0xc6
+	.uleb128 0x43
+	.4byte	.LASF3090
+	.byte	0x1
+	.2byte	0x8eb
+	.4byte	0xc6
+	.uleb128 0x43
+	.4byte	.LASF3091
+	.byte	0x1
 	.2byte	0x8ec
+	.4byte	0x45aa
+	.uleb128 0x43
+	.4byte	.LASF3092
+	.byte	0x1
+	.2byte	0x8ed
 	.4byte	0x45aa
 	.uleb128 0x6d
 	.4byte	.LASF3098
 	.byte	0x1
-	.2byte	0x8f8
+	.2byte	0x8f9
 	.byte	0
 	.uleb128 0x60
 	.4byte	.LASF3099
 	.byte	0x1
-	.2byte	0x8cc
+	.2byte	0x8cd
 	.4byte	0xc6
 	.byte	0x1
-	.4byte	0x1322c
+	.4byte	0x13485
 	.uleb128 0x61
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x8cc
-	.4byte	0xe480
+	.2byte	0x8cd
+	.4byte	0xe472
 	.uleb128 0x62
 	.4byte	.LASF2943
 	.byte	0x1
-	.2byte	0x8cc
-	.4byte	0xe82d
+	.2byte	0x8cd
+	.4byte	0xe81f
 	.uleb128 0x4f
 	.string	"i"
 	.byte	0x1
-	.2byte	0x8ce
+	.2byte	0x8cf
 	.4byte	0xc6
 	.uleb128 0x43
-	.4byte	.LASF3088
-	.byte	0x1
-	.2byte	0x8cf
-	.4byte	0x15a
-	.uleb128 0x43
-	.4byte	.LASF3092
+	.4byte	.LASF3087
 	.byte	0x1
 	.2byte	0x8d0
+	.4byte	0x15a
+	.uleb128 0x43
+	.4byte	.LASF3091
+	.byte	0x1
+	.2byte	0x8d1
 	.4byte	0x45aa
 	.uleb128 0x43
 	.4byte	.LASF3100
 	.byte	0x1
-	.2byte	0x8d1
-	.4byte	0xc6
-	.uleb128 0x43
-	.4byte	.LASF3097
-	.byte	0x1
 	.2byte	0x8d2
 	.4byte	0xc6
 	.uleb128 0x43
-	.4byte	.LASF3095
+	.4byte	.LASF3096
 	.byte	0x1
 	.2byte	0x8d3
+	.4byte	0xc6
+	.uleb128 0x43
+	.4byte	.LASF3094
+	.byte	0x1
+	.2byte	0x8d4
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x4d
 	.4byte	.LASF3101
 	.byte	0x1
-	.2byte	0x86e
+	.2byte	0x86f
 	.4byte	0xc6
 	.8byte	.LFB2840
 	.8byte	.LFE2840-.LFB2840
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x13327
+	.4byte	0x13580
 	.uleb128 0x4e
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x86e
-	.4byte	0xe4e5
-	.4byte	.LLST186
+	.2byte	0x86f
+	.4byte	0xe4d7
+	.4byte	.LLST194
 	.uleb128 0x55
 	.4byte	.LASF2837
 	.byte	0x1
-	.2byte	0x86e
+	.2byte	0x86f
 	.4byte	0xc6
-	.4byte	.LLST187
+	.4byte	.LLST195
 	.uleb128 0x43
 	.4byte	.LASF2943
 	.byte	0x1
-	.2byte	0x870
-	.4byte	0xe82d
+	.2byte	0x871
+	.4byte	0xe81f
 	.uleb128 0x56
 	.4byte	.LASF3102
 	.byte	0x1
-	.2byte	0x871
+	.2byte	0x872
 	.4byte	0xc6
-	.4byte	.LLST188
+	.4byte	.LLST196
 	.uleb128 0x66
 	.string	"ret"
 	.byte	0x1
-	.2byte	0x872
+	.2byte	0x873
 	.4byte	0xc6
 	.uleb128 0x1
 	.byte	0x64
 	.uleb128 0x43
 	.4byte	.LASF3103
 	.byte	0x1
-	.2byte	0x873
+	.2byte	0x874
 	.4byte	0xc6
 	.uleb128 0x50
-	.4byte	0x15807
-	.8byte	.LBB1476
-	.8byte	.LBE1476-.LBB1476
+	.4byte	0x159f8
+	.8byte	.LBB1538
+	.8byte	.LBE1538-.LBB1538
 	.byte	0x1
-	.2byte	0x876
-	.4byte	0x132cb
+	.2byte	0x877
+	.4byte	0x13524
 	.uleb128 0x51
-	.4byte	0x15822
+	.4byte	0x15a13
 	.uleb128 0x51
-	.4byte	0x15817
+	.4byte	0x15a08
 	.byte	0
 	.uleb128 0x4b
+	.8byte	.LVL659
+	.4byte	0x16ba0
+	.uleb128 0x4b
+	.8byte	.LVL660
+	.4byte	0x16e47
+	.uleb128 0x4b
 	.8byte	.LVL662
-	.4byte	0x169af
+	.4byte	0x16c06
 	.uleb128 0x4b
-	.8byte	.LVL663
-	.4byte	0x16c56
+	.8byte	.LVL666
+	.4byte	0x16c06
 	.uleb128 0x4b
-	.8byte	.LVL665
-	.4byte	0x16a20
+	.8byte	.LVL667
+	.4byte	0x16ba0
 	.uleb128 0x4b
 	.8byte	.LVL669
-	.4byte	0x16a20
+	.4byte	0x16ba0
 	.uleb128 0x4b
-	.8byte	.LVL670
-	.4byte	0x169af
-	.uleb128 0x4b
-	.8byte	.LVL672
-	.4byte	0x169af
-	.uleb128 0x4b
-	.8byte	.LVL674
-	.4byte	0x16b30
+	.8byte	.LVL671
+	.4byte	0x16d21
 	.byte	0
 	.uleb128 0x60
 	.4byte	.LASF3104
 	.byte	0x1
-	.2byte	0x843
+	.2byte	0x844
 	.4byte	0xc6
 	.byte	0x1
-	.4byte	0x13351
+	.4byte	0x135aa
 	.uleb128 0x62
 	.4byte	.LASF874
 	.byte	0x1
-	.2byte	0x843
+	.2byte	0x844
 	.4byte	0xc6
 	.uleb128 0x43
 	.4byte	.LASF3103
 	.byte	0x1
-	.2byte	0x845
+	.2byte	0x846
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x4a
 	.4byte	.LASF3105
 	.byte	0x1
-	.2byte	0x812
+	.2byte	0x813
 	.8byte	.LFB2838
 	.8byte	.LFE2838-.LFB2838
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x1340b
+	.4byte	0x13664
 	.uleb128 0x43
 	.4byte	.LASF2943
 	.byte	0x1
-	.2byte	0x814
-	.4byte	0xe82d
+	.2byte	0x815
+	.4byte	0xe81f
+	.uleb128 0x4b
+	.8byte	.LVL640
+	.4byte	0x16ba0
+	.uleb128 0x4b
+	.8byte	.LVL641
+	.4byte	0x16cc6
+	.uleb128 0x4b
+	.8byte	.LVL642
+	.4byte	0x16ba0
 	.uleb128 0x4b
 	.8byte	.LVL643
-	.4byte	0x169af
+	.4byte	0x16bfc
 	.uleb128 0x4b
 	.8byte	.LVL644
-	.4byte	0x16ad5
+	.4byte	0x16c61
 	.uleb128 0x4b
 	.8byte	.LVL645
-	.4byte	0x169af
+	.4byte	0x16cc6
 	.uleb128 0x4b
 	.8byte	.LVL646
-	.4byte	0x16a0b
+	.4byte	0x16c33
 	.uleb128 0x4b
 	.8byte	.LVL647
-	.4byte	0x16a7b
+	.4byte	0x16ba0
 	.uleb128 0x4b
 	.8byte	.LVL648
-	.4byte	0x16ad5
+	.4byte	0x16bfc
 	.uleb128 0x4b
 	.8byte	.LVL649
-	.4byte	0x16a4d
+	.4byte	0x16c61
 	.uleb128 0x4b
 	.8byte	.LVL650
-	.4byte	0x169af
-	.uleb128 0x4b
-	.8byte	.LVL651
-	.4byte	0x16a0b
-	.uleb128 0x4b
-	.8byte	.LVL652
-	.4byte	0x16a7b
-	.uleb128 0x4b
-	.8byte	.LVL653
-	.4byte	0x16a4d
+	.4byte	0x16c33
 	.byte	0
 	.uleb128 0x4c
 	.4byte	.LASF3106
 	.byte	0x1
-	.2byte	0x752
+	.2byte	0x751
 	.4byte	0xc6
 	.8byte	.LFB2837
 	.8byte	.LFE2837-.LFB2837
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x136a2
+	.4byte	0x138fb
 	.uleb128 0x55
 	.4byte	.LASF793
 	.byte	0x1
-	.2byte	0x752
+	.2byte	0x751
 	.4byte	0x458
-	.4byte	.LLST393
+	.4byte	.LLST405
 	.uleb128 0x66
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x754
-	.4byte	0xe4e5
+	.2byte	0x753
+	.4byte	0xe4d7
 	.uleb128 0x1
 	.byte	0x66
 	.uleb128 0x43
-	.4byte	.LASF2993
+	.4byte	.LASF2992
 	.byte	0x1
-	.2byte	0x755
+	.2byte	0x754
 	.4byte	0xe0e4
 	.uleb128 0x43
 	.4byte	.LASF2943
 	.byte	0x1
-	.2byte	0x756
-	.4byte	0xe82d
+	.2byte	0x755
+	.4byte	0xe81f
 	.uleb128 0x43
 	.4byte	.LASF3107
 	.byte	0x1
-	.2byte	0x757
+	.2byte	0x756
 	.4byte	0xe1ba
-	.uleb128 0x6c
-	.4byte	.Ldebug_ranges0+0x2430
-	.4byte	0x13501
+	.uleb128 0x68
+	.4byte	.Ldebug_ranges0+0x23d0
+	.4byte	0x1375a
 	.uleb128 0x3c
 	.byte	0x8
 	.byte	0x1
-	.2byte	0x765
-	.4byte	0x1349a
+	.2byte	0x764
+	.4byte	0x136f3
 	.uleb128 0x3e
 	.4byte	.LASF3108
 	.byte	0x1
-	.2byte	0x765
+	.2byte	0x764
 	.4byte	0x1a0
 	.uleb128 0x3a
 	.string	"__c"
 	.byte	0x1
-	.2byte	0x765
-	.4byte	0x136a2
+	.2byte	0x764
+	.4byte	0x138fb
 	.byte	0
 	.uleb128 0x4f
 	.string	"__u"
 	.byte	0x1
-	.2byte	0x765
-	.4byte	0x13478
+	.2byte	0x764
+	.4byte	0x136d1
 	.uleb128 0x58
-	.4byte	0x15f8f
-	.8byte	.LBB2320
-	.4byte	.Ldebug_ranges0+0x2470
+	.4byte	0x16180
+	.8byte	.LBB2362
+	.4byte	.Ldebug_ranges0+0x2410
 	.byte	0x1
-	.2byte	0x765
-	.4byte	0x134ce
+	.2byte	0x764
+	.4byte	0x13727
 	.uleb128 0x51
-	.4byte	0x15fb2
+	.4byte	0x161a3
 	.uleb128 0x51
-	.4byte	0x15fa6
+	.4byte	0x16197
 	.uleb128 0x51
-	.4byte	0x15f9c
+	.4byte	0x1618d
 	.byte	0
 	.uleb128 0x5a
-	.4byte	0x15ddf
-	.8byte	.LBB2323
-	.8byte	.LBE2323-.LBB2323
+	.4byte	0x15fd0
+	.8byte	.LBB2365
+	.8byte	.LBE2365-.LBB2365
 	.byte	0x1
-	.2byte	0x765
+	.2byte	0x764
 	.uleb128 0x53
-	.8byte	.LBB2324
-	.8byte	.LBE2324-.LBB2324
+	.8byte	.LBB2366
+	.8byte	.LBE2366-.LBB2366
 	.uleb128 0x5e
-	.4byte	0x15def
+	.4byte	0x15fe0
 	.uleb128 0x1
 	.byte	0x68
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x4b
-	.8byte	.LVL1635
-	.4byte	0x1633b
-	.uleb128 0x4b
-	.8byte	.LVL1636
-	.4byte	0x16a4d
-	.uleb128 0x4b
-	.8byte	.LVL1637
-	.4byte	0x16251
-	.uleb128 0x4b
-	.8byte	.LVL1638
-	.4byte	0x16c61
-	.uleb128 0x4b
-	.8byte	.LVL1639
-	.4byte	0x16bd9
-	.uleb128 0x4b
-	.8byte	.LVL1640
-	.4byte	0x16c6b
-	.uleb128 0x4b
-	.8byte	.LVL1641
-	.4byte	0x16c6b
-	.uleb128 0x4b
-	.8byte	.LVL1642
-	.4byte	0x1633b
-	.uleb128 0x4b
 	.8byte	.LVL1643
-	.4byte	0x16a4d
+	.4byte	0x1652c
 	.uleb128 0x4b
 	.8byte	.LVL1644
-	.4byte	0x13e29
+	.4byte	0x16c33
 	.uleb128 0x4b
 	.8byte	.LVL1645
-	.4byte	0x1633b
+	.4byte	0x16442
 	.uleb128 0x4b
 	.8byte	.LVL1646
-	.4byte	0x16a4d
+	.4byte	0x16e52
 	.uleb128 0x4b
 	.8byte	.LVL1647
-	.4byte	0x164fd
+	.4byte	0x16dca
 	.uleb128 0x4b
 	.8byte	.LVL1648
-	.4byte	0x1633b
+	.4byte	0x16e5c
 	.uleb128 0x4b
 	.8byte	.LVL1649
-	.4byte	0x16a4d
+	.4byte	0x16e5c
 	.uleb128 0x4b
 	.8byte	.LVL1650
-	.4byte	0x1450f
+	.4byte	0x1652c
 	.uleb128 0x4b
 	.8byte	.LVL1651
-	.4byte	0x14005
+	.4byte	0x16c33
 	.uleb128 0x4b
 	.8byte	.LVL1652
-	.4byte	0x16c61
+	.4byte	0x1401a
 	.uleb128 0x4b
 	.8byte	.LVL1653
-	.4byte	0x15ff1
+	.4byte	0x1652c
 	.uleb128 0x4b
 	.8byte	.LVL1654
-	.4byte	0x14bc3
+	.4byte	0x16c33
 	.uleb128 0x4b
 	.8byte	.LVL1655
-	.4byte	0x16192
+	.4byte	0x166ee
 	.uleb128 0x4b
 	.8byte	.LVL1656
-	.4byte	0x16664
+	.4byte	0x1652c
 	.uleb128 0x4b
 	.8byte	.LVL1657
-	.4byte	0x16c61
+	.4byte	0x16c33
 	.uleb128 0x4b
 	.8byte	.LVL1658
-	.4byte	0x14f94
+	.4byte	0x14700
 	.uleb128 0x4b
 	.8byte	.LVL1659
-	.4byte	0x13e29
+	.4byte	0x141f6
 	.uleb128 0x4b
 	.8byte	.LVL1660
-	.4byte	0x16a7b
+	.4byte	0x16e52
 	.uleb128 0x4b
 	.8byte	.LVL1661
-	.4byte	0x16c61
+	.4byte	0x161e2
 	.uleb128 0x4b
 	.8byte	.LVL1662
-	.4byte	0x1505b
+	.4byte	0x14db4
 	.uleb128 0x4b
 	.8byte	.LVL1663
-	.4byte	0x1450f
+	.4byte	0x16383
 	.uleb128 0x4b
 	.8byte	.LVL1664
-	.4byte	0x14330
+	.4byte	0x16855
 	.uleb128 0x4b
 	.8byte	.LVL1665
-	.4byte	0x14005
+	.4byte	0x16e52
 	.uleb128 0x4b
 	.8byte	.LVL1666
-	.4byte	0x14bc3
+	.4byte	0x1401a
+	.uleb128 0x4b
+	.8byte	.LVL1667
+	.4byte	0x16c61
+	.uleb128 0x4b
+	.8byte	.LVL1668
+	.4byte	0x16e52
+	.uleb128 0x4b
+	.8byte	.LVL1669
+	.4byte	0x14700
+	.uleb128 0x4b
+	.8byte	.LVL1670
+	.4byte	0x14521
+	.uleb128 0x4b
+	.8byte	.LVL1671
+	.4byte	0x141f6
+	.uleb128 0x4b
+	.8byte	.LVL1672
+	.4byte	0x14db4
+	.uleb128 0x4b
+	.8byte	.LVL1673
+	.4byte	0x15185
+	.uleb128 0x4b
+	.8byte	.LVL1674
+	.4byte	0x1524c
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x61
-	.4byte	0x136b2
+	.4byte	0x1390b
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0
@@ -51486,352 +51781,322 @@
 	.uleb128 0x4c
 	.4byte	.LASF3109
 	.byte	0x1
-	.2byte	0x6f9
+	.2byte	0x6f8
 	.4byte	0xc6
 	.8byte	.LFB2836
 	.8byte	.LFE2836-.LFB2836
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x13839
+	.4byte	0x13a92
 	.uleb128 0x55
 	.4byte	.LASF793
 	.byte	0x1
-	.2byte	0x6f9
+	.2byte	0x6f8
 	.4byte	0x458
-	.4byte	.LLST286
+	.4byte	.LLST294
 	.uleb128 0x66
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x6fb
-	.4byte	0xe4e5
+	.2byte	0x6fa
+	.4byte	0xe4d7
 	.uleb128 0x1
 	.byte	0x69
 	.uleb128 0x43
-	.4byte	.LASF2993
+	.4byte	.LASF2992
 	.byte	0x1
-	.2byte	0x6fc
+	.2byte	0x6fb
 	.4byte	0xe0e4
 	.uleb128 0x43
 	.4byte	.LASF2943
 	.byte	0x1
-	.2byte	0x6fd
-	.4byte	0xe82d
-	.uleb128 0x6c
-	.4byte	.Ldebug_ranges0+0x1300
-	.4byte	0x1379c
+	.2byte	0x6fc
+	.4byte	0xe81f
+	.uleb128 0x68
+	.4byte	.Ldebug_ranges0+0x13d0
+	.4byte	0x139f5
 	.uleb128 0x3c
 	.byte	0x8
 	.byte	0x1
-	.2byte	0x704
-	.4byte	0x13735
+	.2byte	0x703
+	.4byte	0x1398e
 	.uleb128 0x3e
 	.4byte	.LASF3108
 	.byte	0x1
-	.2byte	0x704
+	.2byte	0x703
 	.4byte	0x1a0
 	.uleb128 0x3a
 	.string	"__c"
 	.byte	0x1
-	.2byte	0x704
-	.4byte	0x136a2
+	.2byte	0x703
+	.4byte	0x138fb
 	.byte	0
 	.uleb128 0x4f
 	.string	"__u"
 	.byte	0x1
-	.2byte	0x704
-	.4byte	0x13713
+	.2byte	0x703
+	.4byte	0x1396c
 	.uleb128 0x58
-	.4byte	0x15f8f
-	.8byte	.LBB1661
-	.4byte	.Ldebug_ranges0+0x1340
+	.4byte	0x16180
+	.8byte	.LBB1719
+	.4byte	.Ldebug_ranges0+0x1410
 	.byte	0x1
-	.2byte	0x704
-	.4byte	0x13769
+	.2byte	0x703
+	.4byte	0x139c2
 	.uleb128 0x51
-	.4byte	0x15fb2
+	.4byte	0x161a3
 	.uleb128 0x51
-	.4byte	0x15fa6
+	.4byte	0x16197
 	.uleb128 0x51
-	.4byte	0x15f9c
+	.4byte	0x1618d
 	.byte	0
 	.uleb128 0x5a
-	.4byte	0x15ddf
-	.8byte	.LBB1664
-	.8byte	.LBE1664-.LBB1664
+	.4byte	0x15fd0
+	.8byte	.LBB1722
+	.8byte	.LBE1722-.LBB1722
 	.byte	0x1
-	.2byte	0x704
+	.2byte	0x703
 	.uleb128 0x53
-	.8byte	.LBB1665
-	.8byte	.LBE1665-.LBB1665
+	.8byte	.LBB1723
+	.8byte	.LBE1723-.LBB1723
 	.uleb128 0x5e
-	.4byte	0x15def
+	.4byte	0x15fe0
 	.uleb128 0x1
 	.byte	0x67
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x4b
+	.8byte	.LVL986
+	.4byte	0x16442
+	.uleb128 0x4b
+	.8byte	.LVL987
+	.4byte	0x16e52
+	.uleb128 0x4b
+	.8byte	.LVL988
+	.4byte	0x16e52
+	.uleb128 0x4b
+	.8byte	.LVL989
+	.4byte	0x16dca
+	.uleb128 0x4b
+	.8byte	.LVL990
+	.4byte	0x16e5c
+	.uleb128 0x4b
+	.8byte	.LVL991
+	.4byte	0x1401a
+	.uleb128 0x4b
+	.8byte	.LVL992
+	.4byte	0x166ee
+	.uleb128 0x4b
+	.8byte	.LVL993
+	.4byte	0x14700
+	.uleb128 0x4b
+	.8byte	.LVL994
+	.4byte	0x141f6
+	.uleb128 0x4b
+	.8byte	.LVL995
+	.4byte	0x14db4
+	.uleb128 0x4b
 	.8byte	.LVL996
-	.4byte	0x16251
+	.4byte	0x16383
 	.uleb128 0x4b
 	.8byte	.LVL997
-	.4byte	0x16c61
-	.uleb128 0x4b
-	.8byte	.LVL998
-	.4byte	0x16c61
-	.uleb128 0x4b
-	.8byte	.LVL999
-	.4byte	0x16bd9
-	.uleb128 0x4b
-	.8byte	.LVL1000
-	.4byte	0x16c6b
-	.uleb128 0x4b
-	.8byte	.LVL1001
-	.4byte	0x13e29
-	.uleb128 0x4b
-	.8byte	.LVL1002
-	.4byte	0x164fd
-	.uleb128 0x4b
-	.8byte	.LVL1003
-	.4byte	0x1450f
-	.uleb128 0x4b
-	.8byte	.LVL1004
-	.4byte	0x14005
-	.uleb128 0x4b
-	.8byte	.LVL1005
-	.4byte	0x14bc3
-	.uleb128 0x4b
-	.8byte	.LVL1006
-	.4byte	0x16192
-	.uleb128 0x4b
-	.8byte	.LVL1007
-	.4byte	0x16664
+	.4byte	0x16855
 	.byte	0
 	.uleb128 0x4a
 	.4byte	.LASF3110
 	.byte	0x1
-	.2byte	0x668
+	.2byte	0x667
 	.8byte	.LFB2835
 	.8byte	.LFE2835-.LFB2835
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x13a67
+	.4byte	0x13c58
 	.uleb128 0x4e
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x668
-	.4byte	0xe4e5
-	.4byte	.LLST285
+	.2byte	0x667
+	.4byte	0xe4d7
+	.4byte	.LLST293
 	.uleb128 0x43
-	.4byte	.LASF2993
+	.4byte	.LASF2992
 	.byte	0x1
-	.2byte	0x66a
+	.2byte	0x669
 	.4byte	0xe0e4
 	.uleb128 0x43
 	.4byte	.LASF2943
 	.byte	0x1
-	.2byte	0x66b
-	.4byte	0xe82d
+	.2byte	0x66a
+	.4byte	0xe81f
 	.uleb128 0x52
-	.4byte	.LASF3025
+	.4byte	.LASF3024
 	.4byte	0xb866
 	.uleb128 0x9
 	.byte	0x3
-	.8byte	__func__.35144
+	.8byte	__func__.35152
 	.uleb128 0x50
-	.4byte	0x13abb
-	.8byte	.LBB1652
-	.8byte	.LBE1652-.LBB1652
+	.4byte	0x13cac
+	.8byte	.LBB1714
+	.8byte	.LBE1714-.LBB1714
 	.byte	0x1
-	.2byte	0x6e4
-	.4byte	0x138c6
+	.2byte	0x67e
+	.4byte	0x13b1f
 	.uleb128 0x51
-	.4byte	0x13ad4
+	.4byte	0x13cc5
 	.uleb128 0x51
-	.4byte	0x13ac8
-	.uleb128 0x4b
-	.8byte	.LVL957
-	.4byte	0x1633b
-	.byte	0
-	.uleb128 0x50
-	.4byte	0x13abb
-	.8byte	.LBB1654
-	.8byte	.LBE1654-.LBB1654
-	.byte	0x1
-	.2byte	0x6c7
-	.4byte	0x138fa
-	.uleb128 0x51
-	.4byte	0x13ad4
-	.uleb128 0x51
-	.4byte	0x13ac8
-	.uleb128 0x4b
-	.8byte	.LVL963
-	.4byte	0x1633b
-	.byte	0
-	.uleb128 0x50
-	.4byte	0x13abb
-	.8byte	.LBB1656
-	.8byte	.LBE1656-.LBB1656
-	.byte	0x1
-	.2byte	0x67f
-	.4byte	0x1392e
-	.uleb128 0x51
-	.4byte	0x13ad4
-	.uleb128 0x51
-	.4byte	0x13ac8
-	.uleb128 0x4b
-	.8byte	.LVL970
-	.4byte	0x1633b
-	.byte	0
-	.uleb128 0x50
-	.4byte	0x13abb
-	.8byte	.LBB1658
-	.8byte	.LBE1658-.LBB1658
-	.byte	0x1
-	.2byte	0x6b2
-	.4byte	0x13962
-	.uleb128 0x51
-	.4byte	0x13ad4
-	.uleb128 0x51
-	.4byte	0x13ac8
-	.uleb128 0x4b
-	.8byte	.LVL977
-	.4byte	0x1633b
-	.byte	0
-	.uleb128 0x4b
-	.8byte	.LVL956
-	.4byte	0x16192
-	.uleb128 0x4b
-	.8byte	.LVL958
-	.4byte	0x16192
+	.4byte	0x13cb9
 	.uleb128 0x4b
 	.8byte	.LVL962
-	.4byte	0x16664
-	.uleb128 0x4b
-	.8byte	.LVL964
-	.4byte	0x164fd
-	.uleb128 0x4b
-	.8byte	.LVL968
-	.4byte	0x16a0b
+	.4byte	0x1652c
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x13cac
+	.8byte	.LBB1716
+	.8byte	.LBE1716-.LBB1716
+	.byte	0x1
+	.2byte	0x6f0
+	.4byte	0x13b53
+	.uleb128 0x51
+	.4byte	0x13cc5
+	.uleb128 0x51
+	.4byte	0x13cb9
 	.uleb128 0x4b
 	.8byte	.LVL969
-	.4byte	0x14330
+	.4byte	0x1652c
+	.byte	0
 	.uleb128 0x4b
-	.8byte	.LVL971
-	.4byte	0x16a0b
+	.8byte	.LVL953
+	.4byte	0x16383
+	.uleb128 0x4b
+	.8byte	.LVL954
+	.4byte	0x16442
+	.uleb128 0x4b
+	.8byte	.LVL956
+	.4byte	0x16855
+	.uleb128 0x4b
+	.8byte	.LVL957
+	.4byte	0x166ee
+	.uleb128 0x4b
+	.8byte	.LVL960
+	.4byte	0x16bfc
+	.uleb128 0x4b
+	.8byte	.LVL961
+	.4byte	0x14521
+	.uleb128 0x4b
+	.8byte	.LVL963
+	.4byte	0x16bfc
+	.uleb128 0x4b
+	.8byte	.LVL964
+	.4byte	0x161e2
+	.uleb128 0x4b
+	.8byte	.LVL967
+	.4byte	0x141f6
+	.uleb128 0x4b
+	.8byte	.LVL968
+	.4byte	0x1401a
 	.uleb128 0x4b
 	.8byte	.LVL972
-	.4byte	0x15ff1
+	.4byte	0x1401a
+	.uleb128 0x4b
+	.8byte	.LVL973
+	.4byte	0x161e2
+	.uleb128 0x4b
+	.8byte	.LVL974
+	.4byte	0x166ee
 	.uleb128 0x4b
 	.8byte	.LVL975
-	.4byte	0x14005
+	.4byte	0x16855
 	.uleb128 0x4b
 	.8byte	.LVL976
-	.4byte	0x13e29
+	.4byte	0x16442
+	.uleb128 0x4b
+	.8byte	.LVL977
+	.4byte	0x16383
+	.uleb128 0x4b
+	.8byte	.LVL978
+	.4byte	0x141f6
+	.uleb128 0x4b
+	.8byte	.LVL979
+	.4byte	0x16ba0
 	.uleb128 0x4b
 	.8byte	.LVL980
-	.4byte	0x13e29
+	.4byte	0x14521
 	.uleb128 0x4b
 	.8byte	.LVL981
-	.4byte	0x15ff1
-	.uleb128 0x4b
-	.8byte	.LVL982
-	.4byte	0x164fd
-	.uleb128 0x4b
-	.8byte	.LVL983
-	.4byte	0x16251
-	.uleb128 0x4b
-	.8byte	.LVL984
-	.4byte	0x16664
-	.uleb128 0x4b
-	.8byte	.LVL987
-	.4byte	0x14005
-	.uleb128 0x4b
-	.8byte	.LVL988
-	.4byte	0x16251
-	.uleb128 0x4b
-	.8byte	.LVL989
-	.4byte	0x169af
-	.uleb128 0x4b
-	.8byte	.LVL990
-	.4byte	0x14330
-	.uleb128 0x4b
-	.8byte	.LVL991
-	.4byte	0x169af
+	.4byte	0x16ba0
 	.byte	0
 	.uleb128 0x63
 	.4byte	.LASF3111
 	.byte	0x1
-	.2byte	0x636
+	.2byte	0x635
 	.byte	0x1
-	.4byte	0x13aa6
+	.4byte	0x13c97
 	.uleb128 0x61
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x636
-	.4byte	0xe4e5
+	.2byte	0x635
+	.4byte	0xe4d7
 	.uleb128 0x43
-	.4byte	.LASF2993
+	.4byte	.LASF2992
 	.byte	0x1
-	.2byte	0x638
+	.2byte	0x637
 	.4byte	0xe0e4
 	.uleb128 0x43
 	.4byte	.LASF2943
 	.byte	0x1
-	.2byte	0x639
-	.4byte	0xe82d
+	.2byte	0x638
+	.4byte	0xe81f
 	.uleb128 0x65
-	.4byte	.LASF3025
-	.4byte	0x13ab6
+	.4byte	.LASF3024
+	.4byte	0x13ca7
 	.4byte	.LASF3111
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x68
-	.4byte	0x13ab6
+	.4byte	0x13ca7
 	.uleb128 0x6
 	.4byte	0x4f
 	.byte	0x1a
 	.byte	0
 	.uleb128 0x3
-	.4byte	0x13aa6
+	.4byte	0x13c97
 	.uleb128 0x63
 	.4byte	.LASF3112
 	.byte	0x1
-	.2byte	0x630
+	.2byte	0x62f
 	.byte	0x1
-	.4byte	0x13ae1
+	.4byte	0x13cd2
 	.uleb128 0x62
-	.4byte	.LASF2993
+	.4byte	.LASF2992
 	.byte	0x1
-	.2byte	0x630
+	.2byte	0x62f
 	.4byte	0xe0e4
 	.uleb128 0x62
 	.4byte	.LASF2943
 	.byte	0x1
-	.2byte	0x630
-	.4byte	0xe82d
+	.2byte	0x62f
+	.4byte	0xe81f
 	.byte	0
 	.uleb128 0x63
 	.4byte	.LASF3113
 	.byte	0x1
-	.2byte	0x625
+	.2byte	0x624
 	.byte	0x1
-	.4byte	0x13b13
+	.4byte	0x13d04
 	.uleb128 0x62
-	.4byte	.LASF2993
+	.4byte	.LASF2992
 	.byte	0x1
-	.2byte	0x625
+	.2byte	0x624
 	.4byte	0xe0e4
 	.uleb128 0x62
 	.4byte	.LASF2943
 	.byte	0x1
-	.2byte	0x625
-	.4byte	0xe82d
+	.2byte	0x624
+	.4byte	0xe81f
 	.uleb128 0x4f
 	.string	"buf"
 	.byte	0x1
-	.2byte	0x627
-	.4byte	0x13b13
+	.2byte	0x626
+	.4byte	0x13d04
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
@@ -51839,2000 +52104,2030 @@
 	.uleb128 0x63
 	.4byte	.LASF3114
 	.byte	0x1
-	.2byte	0x5f7
+	.2byte	0x5f6
 	.byte	0x1
-	.4byte	0x13be3
+	.4byte	0x13dd4
 	.uleb128 0x62
 	.4byte	.LASF3115
 	.byte	0x1
-	.2byte	0x5f7
+	.2byte	0x5f6
 	.4byte	0xbfee
 	.uleb128 0x62
 	.4byte	.LASF3116
 	.byte	0x1
-	.2byte	0x5f7
+	.2byte	0x5f6
 	.4byte	0xac0
 	.uleb128 0x62
 	.4byte	.LASF3117
 	.byte	0x1
-	.2byte	0x5f7
+	.2byte	0x5f6
 	.4byte	0xac0
 	.uleb128 0x62
 	.4byte	.LASF2943
 	.byte	0x1
-	.2byte	0x5f7
-	.4byte	0xe82d
+	.2byte	0x5f6
+	.4byte	0xe81f
 	.uleb128 0x62
 	.4byte	.LASF874
 	.byte	0x1
-	.2byte	0x5f7
+	.2byte	0x5f6
 	.4byte	0xe1ba
 	.uleb128 0x43
-	.4byte	.LASF2993
+	.4byte	.LASF2992
 	.byte	0x1
-	.2byte	0x5f9
+	.2byte	0x5f8
 	.4byte	0xe0e4
 	.uleb128 0x43
 	.4byte	.LASF3118
 	.byte	0x1
-	.2byte	0x5fa
+	.2byte	0x5f9
 	.4byte	0x13f
 	.uleb128 0x43
 	.4byte	.LASF3119
 	.byte	0x1
-	.2byte	0x5fa
+	.2byte	0x5f9
 	.4byte	0x13f
 	.uleb128 0x43
 	.4byte	.LASF2870
 	.byte	0x1
-	.2byte	0x5fb
+	.2byte	0x5fa
 	.4byte	0xc6
 	.uleb128 0x43
 	.4byte	.LASF262
 	.byte	0x1
-	.2byte	0x5fb
+	.2byte	0x5fa
 	.4byte	0xc6
 	.uleb128 0x4f
 	.string	"i"
 	.byte	0x1
-	.2byte	0x5fc
+	.2byte	0x5fb
 	.4byte	0xc6
 	.uleb128 0x4f
 	.string	"j"
 	.byte	0x1
-	.2byte	0x5fc
+	.2byte	0x5fb
 	.4byte	0xc6
 	.uleb128 0x43
 	.4byte	.LASF3120
 	.byte	0x1
-	.2byte	0x5fd
+	.2byte	0x5fc
 	.4byte	0xc6
 	.uleb128 0x43
 	.4byte	.LASF2826
 	.byte	0x1
-	.2byte	0x5fe
+	.2byte	0x5fd
 	.4byte	0xbfee
 	.uleb128 0x43
 	.4byte	.LASF3121
 	.byte	0x1
-	.2byte	0x5ff
+	.2byte	0x5fe
 	.4byte	0xc6
 	.uleb128 0x43
 	.4byte	.LASF3122
 	.byte	0x1
-	.2byte	0x600
+	.2byte	0x5ff
 	.4byte	0xbfee
 	.byte	0
 	.uleb128 0x63
 	.4byte	.LASF3123
 	.byte	0x1
-	.2byte	0x5cc
+	.2byte	0x5cb
 	.byte	0x1
-	.4byte	0x13cad
+	.4byte	0x13e9e
 	.uleb128 0x62
 	.4byte	.LASF3115
 	.byte	0x1
-	.2byte	0x5cc
+	.2byte	0x5cb
 	.4byte	0xbfee
 	.uleb128 0x62
 	.4byte	.LASF3116
 	.byte	0x1
-	.2byte	0x5cc
+	.2byte	0x5cb
 	.4byte	0xac0
 	.uleb128 0x62
 	.4byte	.LASF3117
 	.byte	0x1
-	.2byte	0x5cc
+	.2byte	0x5cb
 	.4byte	0xac0
 	.uleb128 0x62
 	.4byte	.LASF2943
 	.byte	0x1
-	.2byte	0x5cc
-	.4byte	0xe82d
+	.2byte	0x5cb
+	.4byte	0xe81f
 	.uleb128 0x62
 	.4byte	.LASF874
 	.byte	0x1
-	.2byte	0x5cc
+	.2byte	0x5cb
 	.4byte	0xe1ba
 	.uleb128 0x43
-	.4byte	.LASF2993
+	.4byte	.LASF2992
 	.byte	0x1
-	.2byte	0x5ce
+	.2byte	0x5cd
 	.4byte	0xe0e4
 	.uleb128 0x4f
 	.string	"i"
 	.byte	0x1
-	.2byte	0x5cf
+	.2byte	0x5ce
 	.4byte	0xc6
 	.uleb128 0x4f
 	.string	"j"
 	.byte	0x1
-	.2byte	0x5cf
+	.2byte	0x5ce
 	.4byte	0xc6
 	.uleb128 0x43
 	.4byte	.LASF2870
 	.byte	0x1
-	.2byte	0x5d0
+	.2byte	0x5cf
 	.4byte	0xc6
 	.uleb128 0x43
 	.4byte	.LASF262
 	.byte	0x1
-	.2byte	0x5d1
+	.2byte	0x5d0
 	.4byte	0xc6
 	.uleb128 0x43
 	.4byte	.LASF3118
 	.byte	0x1
-	.2byte	0x5d2
+	.2byte	0x5d1
 	.4byte	0x13f
 	.uleb128 0x43
 	.4byte	.LASF3119
 	.byte	0x1
-	.2byte	0x5d2
+	.2byte	0x5d1
 	.4byte	0x13f
 	.uleb128 0x43
 	.4byte	.LASF3120
 	.byte	0x1
-	.2byte	0x5d3
+	.2byte	0x5d2
 	.4byte	0xc6
 	.uleb128 0x43
 	.4byte	.LASF2826
 	.byte	0x1
-	.2byte	0x5d4
+	.2byte	0x5d3
 	.4byte	0xbfee
 	.uleb128 0x43
 	.4byte	.LASF3121
 	.byte	0x1
-	.2byte	0x5d5
+	.2byte	0x5d4
 	.4byte	0xc6
 	.uleb128 0x43
 	.4byte	.LASF3122
 	.byte	0x1
-	.2byte	0x5d6
+	.2byte	0x5d5
 	.4byte	0xbfee
 	.byte	0
 	.uleb128 0x63
 	.4byte	.LASF3124
 	.byte	0x1
-	.2byte	0x59f
+	.2byte	0x59e
 	.byte	0x1
-	.4byte	0x13d6b
+	.4byte	0x13f5c
 	.uleb128 0x62
 	.4byte	.LASF3115
 	.byte	0x1
-	.2byte	0x59f
+	.2byte	0x59e
 	.4byte	0xbfee
 	.uleb128 0x62
 	.4byte	.LASF3116
 	.byte	0x1
-	.2byte	0x59f
+	.2byte	0x59e
 	.4byte	0xac0
 	.uleb128 0x62
 	.4byte	.LASF3117
 	.byte	0x1
-	.2byte	0x59f
+	.2byte	0x59e
 	.4byte	0xac0
 	.uleb128 0x62
 	.4byte	.LASF2943
 	.byte	0x1
-	.2byte	0x59f
-	.4byte	0xe82d
+	.2byte	0x59e
+	.4byte	0xe81f
 	.uleb128 0x62
 	.4byte	.LASF874
 	.byte	0x1
-	.2byte	0x59f
+	.2byte	0x59e
 	.4byte	0xe1ba
 	.uleb128 0x43
-	.4byte	.LASF2993
+	.4byte	.LASF2992
 	.byte	0x1
-	.2byte	0x5a1
+	.2byte	0x5a0
 	.4byte	0xe0e4
 	.uleb128 0x43
 	.4byte	.LASF3118
 	.byte	0x1
-	.2byte	0x5a2
+	.2byte	0x5a1
 	.4byte	0x13f
 	.uleb128 0x43
 	.4byte	.LASF3119
 	.byte	0x1
-	.2byte	0x5a2
+	.2byte	0x5a1
 	.4byte	0x13f
 	.uleb128 0x43
 	.4byte	.LASF2870
 	.byte	0x1
-	.2byte	0x5a3
+	.2byte	0x5a2
 	.4byte	0xc6
 	.uleb128 0x43
 	.4byte	.LASF262
 	.byte	0x1
-	.2byte	0x5a3
+	.2byte	0x5a2
 	.4byte	0xc6
 	.uleb128 0x4f
 	.string	"i"
 	.byte	0x1
-	.2byte	0x5a4
+	.2byte	0x5a3
 	.4byte	0xc6
 	.uleb128 0x4f
 	.string	"j"
 	.byte	0x1
-	.2byte	0x5a4
+	.2byte	0x5a3
 	.4byte	0xc6
 	.uleb128 0x43
 	.4byte	.LASF3120
 	.byte	0x1
-	.2byte	0x5a5
+	.2byte	0x5a4
 	.4byte	0xc6
 	.uleb128 0x43
 	.4byte	.LASF2826
 	.byte	0x1
-	.2byte	0x5a6
+	.2byte	0x5a5
 	.4byte	0xbfee
 	.uleb128 0x43
 	.4byte	.LASF3121
 	.byte	0x1
-	.2byte	0x5a7
+	.2byte	0x5a6
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x63
 	.4byte	.LASF3125
 	.byte	0x1
-	.2byte	0x575
+	.2byte	0x574
 	.byte	0x1
-	.4byte	0x13e29
+	.4byte	0x1401a
 	.uleb128 0x62
 	.4byte	.LASF3115
 	.byte	0x1
-	.2byte	0x575
+	.2byte	0x574
 	.4byte	0xbfee
 	.uleb128 0x62
 	.4byte	.LASF3116
 	.byte	0x1
-	.2byte	0x575
+	.2byte	0x574
 	.4byte	0xac0
 	.uleb128 0x62
 	.4byte	.LASF3117
 	.byte	0x1
-	.2byte	0x575
+	.2byte	0x574
 	.4byte	0xac0
 	.uleb128 0x62
 	.4byte	.LASF2943
 	.byte	0x1
-	.2byte	0x575
-	.4byte	0xe82d
+	.2byte	0x574
+	.4byte	0xe81f
 	.uleb128 0x62
 	.4byte	.LASF874
 	.byte	0x1
-	.2byte	0x575
+	.2byte	0x574
 	.4byte	0xe1ba
 	.uleb128 0x43
-	.4byte	.LASF2993
+	.4byte	.LASF2992
 	.byte	0x1
-	.2byte	0x577
+	.2byte	0x576
 	.4byte	0xe0e4
 	.uleb128 0x4f
 	.string	"i"
 	.byte	0x1
-	.2byte	0x578
+	.2byte	0x577
 	.4byte	0xc6
 	.uleb128 0x4f
 	.string	"j"
 	.byte	0x1
-	.2byte	0x578
+	.2byte	0x577
 	.4byte	0xc6
 	.uleb128 0x43
 	.4byte	.LASF2870
 	.byte	0x1
-	.2byte	0x579
+	.2byte	0x578
 	.4byte	0xc6
 	.uleb128 0x43
 	.4byte	.LASF262
 	.byte	0x1
-	.2byte	0x57a
+	.2byte	0x579
 	.4byte	0xc6
 	.uleb128 0x43
 	.4byte	.LASF3118
 	.byte	0x1
-	.2byte	0x57b
+	.2byte	0x57a
 	.4byte	0x13f
 	.uleb128 0x43
 	.4byte	.LASF3119
 	.byte	0x1
-	.2byte	0x57b
+	.2byte	0x57a
 	.4byte	0x13f
 	.uleb128 0x43
 	.4byte	.LASF3120
 	.byte	0x1
-	.2byte	0x57c
+	.2byte	0x57b
 	.4byte	0xc6
 	.uleb128 0x43
 	.4byte	.LASF2826
 	.byte	0x1
-	.2byte	0x57d
+	.2byte	0x57c
 	.4byte	0xbfee
 	.uleb128 0x43
 	.4byte	.LASF3121
 	.byte	0x1
-	.2byte	0x57e
+	.2byte	0x57d
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x4a
 	.4byte	.LASF3126
 	.byte	0x1
-	.2byte	0x53c
+	.2byte	0x53b
 	.8byte	.LFB2827
 	.8byte	.LFE2827-.LFB2827
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x13f57
+	.4byte	0x14148
 	.uleb128 0x55
 	.4byte	.LASF3115
 	.byte	0x1
-	.2byte	0x53c
+	.2byte	0x53b
 	.4byte	0xbfee
-	.4byte	.LLST233
+	.4byte	.LLST241
 	.uleb128 0x55
 	.4byte	.LASF3116
 	.byte	0x1
-	.2byte	0x53c
+	.2byte	0x53b
 	.4byte	0xac0
-	.4byte	.LLST234
+	.4byte	.LLST242
 	.uleb128 0x55
 	.4byte	.LASF3117
 	.byte	0x1
-	.2byte	0x53c
+	.2byte	0x53b
 	.4byte	0xac0
-	.4byte	.LLST235
+	.4byte	.LLST243
 	.uleb128 0x55
 	.4byte	.LASF3127
 	.byte	0x1
-	.2byte	0x53c
+	.2byte	0x53b
 	.4byte	0xbfee
-	.4byte	.LLST236
+	.4byte	.LLST244
 	.uleb128 0x55
 	.4byte	.LASF2943
 	.byte	0x1
-	.2byte	0x53c
-	.4byte	0xe82d
-	.4byte	.LLST237
+	.2byte	0x53b
+	.4byte	0xe81f
+	.4byte	.LLST245
 	.uleb128 0x55
 	.4byte	.LASF874
 	.byte	0x1
-	.2byte	0x53c
+	.2byte	0x53b
 	.4byte	0xe1ba
-	.4byte	.LLST238
+	.4byte	.LLST246
 	.uleb128 0x43
-	.4byte	.LASF2993
+	.4byte	.LASF2992
 	.byte	0x1
-	.2byte	0x53e
+	.2byte	0x53d
 	.4byte	0xe0e4
 	.uleb128 0x57
 	.string	"i"
 	.byte	0x1
-	.2byte	0x53f
+	.2byte	0x53e
 	.4byte	0xc6
-	.4byte	.LLST239
+	.4byte	.LLST247
 	.uleb128 0x4f
 	.string	"j"
 	.byte	0x1
-	.2byte	0x540
+	.2byte	0x53f
 	.4byte	0xc6
 	.uleb128 0x56
 	.4byte	.LASF2870
 	.byte	0x1
-	.2byte	0x541
+	.2byte	0x540
 	.4byte	0xc6
-	.4byte	.LLST240
+	.4byte	.LLST248
 	.uleb128 0x43
 	.4byte	.LASF262
 	.byte	0x1
-	.2byte	0x542
+	.2byte	0x541
 	.4byte	0xc6
 	.uleb128 0x43
 	.4byte	.LASF3118
 	.byte	0x1
-	.2byte	0x543
+	.2byte	0x542
 	.4byte	0x13f
 	.uleb128 0x43
 	.4byte	.LASF3119
 	.byte	0x1
-	.2byte	0x543
+	.2byte	0x542
 	.4byte	0x13f
 	.uleb128 0x56
 	.4byte	.LASF3122
 	.byte	0x1
-	.2byte	0x544
+	.2byte	0x543
 	.4byte	0xbfee
-	.4byte	.LLST241
+	.4byte	.LLST249
 	.uleb128 0x56
-	.4byte	.LASF3090
+	.4byte	.LASF3089
 	.byte	0x1
-	.2byte	0x545
+	.2byte	0x544
 	.4byte	0xc6
-	.4byte	.LLST242
+	.4byte	.LLST250
 	.uleb128 0x56
 	.4byte	.LASF3128
 	.byte	0x1
-	.2byte	0x546
+	.2byte	0x545
 	.4byte	0x45a4
-	.4byte	.LLST243
+	.4byte	.LLST251
 	.uleb128 0x4b
-	.8byte	.LVL800
-	.4byte	0x16a0b
+	.8byte	.LVL797
+	.4byte	0x16bfc
 	.uleb128 0x4b
-	.8byte	.LVL806
-	.4byte	0x1611e
+	.8byte	.LVL803
+	.4byte	0x1630f
 	.uleb128 0x4b
-	.8byte	.LVL810
-	.4byte	0x1611e
+	.8byte	.LVL807
+	.4byte	0x1630f
 	.byte	0
 	.uleb128 0x60
 	.4byte	.LASF3129
 	.byte	0x1
-	.2byte	0x4c3
+	.2byte	0x4c2
 	.4byte	0x13f
 	.byte	0x1
-	.4byte	0x14005
+	.4byte	0x141f6
 	.uleb128 0x62
 	.4byte	.LASF3116
 	.byte	0x1
-	.2byte	0x4c3
+	.2byte	0x4c2
 	.4byte	0xac0
 	.uleb128 0x62
 	.4byte	.LASF3117
 	.byte	0x1
-	.2byte	0x4c3
+	.2byte	0x4c2
 	.4byte	0xac0
 	.uleb128 0x62
 	.4byte	.LASF3127
 	.byte	0x1
-	.2byte	0x4c3
+	.2byte	0x4c2
 	.4byte	0xbfee
 	.uleb128 0x62
 	.4byte	.LASF2943
 	.byte	0x1
-	.2byte	0x4c3
-	.4byte	0xe82d
+	.2byte	0x4c2
+	.4byte	0xe81f
 	.uleb128 0x62
 	.4byte	.LASF845
 	.byte	0x1
-	.2byte	0x4c3
+	.2byte	0x4c2
 	.4byte	0xc6
 	.uleb128 0x43
 	.4byte	.LASF2953
 	.byte	0x1
-	.2byte	0x4c5
+	.2byte	0x4c4
 	.4byte	0x110
 	.uleb128 0x43
 	.4byte	.LASF3130
 	.byte	0x1
-	.2byte	0x4c6
+	.2byte	0x4c5
 	.4byte	0x110
 	.uleb128 0x43
 	.4byte	.LASF2826
 	.byte	0x1
-	.2byte	0x4c7
+	.2byte	0x4c6
 	.4byte	0xbfee
 	.uleb128 0x43
 	.4byte	.LASF3131
 	.byte	0x1
-	.2byte	0x4c8
+	.2byte	0x4c7
 	.4byte	0x13f
 	.uleb128 0x43
 	.4byte	.LASF3132
 	.byte	0x1
-	.2byte	0x4c8
+	.2byte	0x4c7
 	.4byte	0x13f
 	.uleb128 0x43
 	.4byte	.LASF3133
 	.byte	0x1
-	.2byte	0x4c9
+	.2byte	0x4c8
 	.4byte	0x13f
 	.uleb128 0x43
 	.4byte	.LASF3119
 	.byte	0x1
-	.2byte	0x4ca
+	.2byte	0x4c9
 	.4byte	0x13f
 	.uleb128 0x43
 	.4byte	.LASF3118
 	.byte	0x1
-	.2byte	0x4cb
+	.2byte	0x4ca
 	.4byte	0x13f
 	.byte	0
 	.uleb128 0x4a
 	.4byte	.LASF3134
 	.byte	0x1
-	.2byte	0x419
+	.2byte	0x418
 	.8byte	.LFB2825
 	.8byte	.LFE2825-.LFB2825
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x14164
+	.4byte	0x14355
 	.uleb128 0x71
 	.4byte	.LASF3115
 	.byte	0x1
-	.2byte	0x419
+	.2byte	0x418
 	.4byte	0xbfee
 	.uleb128 0x1
 	.byte	0x50
 	.uleb128 0x71
 	.4byte	.LASF3116
 	.byte	0x1
-	.2byte	0x419
+	.2byte	0x418
 	.4byte	0xac0
 	.uleb128 0x1
 	.byte	0x51
 	.uleb128 0x71
 	.4byte	.LASF3117
 	.byte	0x1
-	.2byte	0x419
+	.2byte	0x418
 	.4byte	0xac0
 	.uleb128 0x1
 	.byte	0x52
 	.uleb128 0x71
 	.4byte	.LASF3127
 	.byte	0x1
-	.2byte	0x419
+	.2byte	0x418
 	.4byte	0xbfee
 	.uleb128 0x1
 	.byte	0x53
 	.uleb128 0x71
 	.4byte	.LASF2943
 	.byte	0x1
-	.2byte	0x419
-	.4byte	0xe82d
+	.2byte	0x418
+	.4byte	0xe81f
 	.uleb128 0x1
 	.byte	0x54
 	.uleb128 0x55
 	.4byte	.LASF874
 	.byte	0x1
-	.2byte	0x419
+	.2byte	0x418
 	.4byte	0xe1ba
 	.4byte	.LLST13
 	.uleb128 0x43
-	.4byte	.LASF2993
+	.4byte	.LASF2992
 	.byte	0x1
-	.2byte	0x41b
+	.2byte	0x41a
 	.4byte	0xe0e4
 	.uleb128 0x57
 	.string	"i"
 	.byte	0x1
-	.2byte	0x41c
+	.2byte	0x41b
 	.4byte	0xc6
 	.4byte	.LLST14
 	.uleb128 0x4f
 	.string	"j"
 	.byte	0x1
-	.2byte	0x41d
+	.2byte	0x41c
 	.4byte	0xc6
 	.uleb128 0x56
 	.4byte	.LASF2870
 	.byte	0x1
-	.2byte	0x41e
+	.2byte	0x41d
 	.4byte	0xc6
 	.4byte	.LLST15
 	.uleb128 0x43
 	.4byte	.LASF262
 	.byte	0x1
-	.2byte	0x41f
+	.2byte	0x41e
 	.4byte	0xc6
 	.uleb128 0x56
 	.4byte	.LASF3118
 	.byte	0x1
-	.2byte	0x420
+	.2byte	0x41f
 	.4byte	0x13f
 	.4byte	.LLST16
 	.uleb128 0x56
 	.4byte	.LASF3119
 	.byte	0x1
-	.2byte	0x420
+	.2byte	0x41f
 	.4byte	0x13f
 	.4byte	.LLST17
 	.uleb128 0x56
 	.4byte	.LASF3122
 	.byte	0x1
-	.2byte	0x421
+	.2byte	0x420
 	.4byte	0xbfee
 	.4byte	.LLST18
 	.uleb128 0x49
 	.4byte	.LASF2953
 	.byte	0x1
-	.2byte	0x422
+	.2byte	0x421
 	.4byte	0x110
 	.uleb128 0x1
 	.byte	0x5d
 	.uleb128 0x43
 	.4byte	.LASF3130
 	.byte	0x1
-	.2byte	0x423
+	.2byte	0x422
 	.4byte	0x110
 	.uleb128 0x43
 	.4byte	.LASF2826
 	.byte	0x1
-	.2byte	0x424
+	.2byte	0x423
 	.4byte	0xbfee
 	.uleb128 0x43
 	.4byte	.LASF2916
 	.byte	0x1
-	.2byte	0x425
+	.2byte	0x424
 	.4byte	0xc6
 	.uleb128 0x43
 	.4byte	.LASF3131
 	.byte	0x1
-	.2byte	0x426
+	.2byte	0x425
 	.4byte	0x110
 	.uleb128 0x43
 	.4byte	.LASF3132
 	.byte	0x1
-	.2byte	0x426
+	.2byte	0x425
 	.4byte	0x110
 	.uleb128 0x56
 	.4byte	.LASF3133
 	.byte	0x1
-	.2byte	0x427
+	.2byte	0x426
 	.4byte	0x13f
 	.4byte	.LLST19
 	.uleb128 0x56
-	.4byte	.LASF3090
+	.4byte	.LASF3089
 	.byte	0x1
-	.2byte	0x428
+	.2byte	0x427
 	.4byte	0xc6
 	.4byte	.LLST20
 	.uleb128 0x56
 	.4byte	.LASF3128
 	.byte	0x1
-	.2byte	0x429
+	.2byte	0x428
 	.4byte	0x45a4
 	.4byte	.LLST21
 	.byte	0
 	.uleb128 0x63
 	.4byte	.LASF3135
 	.byte	0x1
-	.2byte	0x3e5
+	.2byte	0x3e4
 	.byte	0x1
-	.4byte	0x1428e
+	.4byte	0x1447f
 	.uleb128 0x62
 	.4byte	.LASF3115
 	.byte	0x1
-	.2byte	0x3e5
+	.2byte	0x3e4
 	.4byte	0xbfee
 	.uleb128 0x62
 	.4byte	.LASF3116
 	.byte	0x1
-	.2byte	0x3e5
+	.2byte	0x3e4
 	.4byte	0xac0
 	.uleb128 0x62
 	.4byte	.LASF3117
 	.byte	0x1
-	.2byte	0x3e5
+	.2byte	0x3e4
 	.4byte	0xac0
 	.uleb128 0x62
 	.4byte	.LASF3127
 	.byte	0x1
-	.2byte	0x3e5
+	.2byte	0x3e4
 	.4byte	0xbfee
 	.uleb128 0x62
 	.4byte	.LASF3136
 	.byte	0x1
-	.2byte	0x3e5
+	.2byte	0x3e4
 	.4byte	0xbfee
 	.uleb128 0x62
 	.4byte	.LASF2943
 	.byte	0x1
-	.2byte	0x3e5
-	.4byte	0xe82d
+	.2byte	0x3e4
+	.4byte	0xe81f
 	.uleb128 0x43
-	.4byte	.LASF2993
+	.4byte	.LASF2992
 	.byte	0x1
-	.2byte	0x3e7
+	.2byte	0x3e6
 	.4byte	0xe0e4
 	.uleb128 0x4f
 	.string	"i"
 	.byte	0x1
-	.2byte	0x3e8
+	.2byte	0x3e7
 	.4byte	0xc6
 	.uleb128 0x4f
 	.string	"j"
 	.byte	0x1
-	.2byte	0x3e9
+	.2byte	0x3e8
 	.4byte	0xc6
 	.uleb128 0x43
 	.4byte	.LASF2870
 	.byte	0x1
-	.2byte	0x3ea
+	.2byte	0x3e9
 	.4byte	0xc6
 	.uleb128 0x43
 	.4byte	.LASF262
 	.byte	0x1
-	.2byte	0x3eb
+	.2byte	0x3ea
 	.4byte	0xc6
 	.uleb128 0x43
 	.4byte	.LASF3118
 	.byte	0x1
-	.2byte	0x3ec
+	.2byte	0x3eb
 	.4byte	0x13f
 	.uleb128 0x43
 	.4byte	.LASF3119
 	.byte	0x1
-	.2byte	0x3ec
+	.2byte	0x3eb
 	.4byte	0x13f
 	.uleb128 0x43
 	.4byte	.LASF3137
 	.byte	0x1
-	.2byte	0x3ed
+	.2byte	0x3ec
 	.4byte	0xac0
 	.uleb128 0x43
 	.4byte	.LASF3138
 	.byte	0x1
-	.2byte	0x3ed
+	.2byte	0x3ec
 	.4byte	0xac0
 	.uleb128 0x43
 	.4byte	.LASF3122
 	.byte	0x1
-	.2byte	0x3ee
+	.2byte	0x3ed
 	.4byte	0xbfee
 	.uleb128 0x43
 	.4byte	.LASF3139
 	.byte	0x1
-	.2byte	0x3ef
+	.2byte	0x3ee
 	.4byte	0xbfee
 	.uleb128 0x43
 	.4byte	.LASF3140
 	.byte	0x1
-	.2byte	0x3f0
+	.2byte	0x3ef
 	.4byte	0xbfee
 	.uleb128 0x43
 	.4byte	.LASF3141
 	.byte	0x1
-	.2byte	0x3f1
+	.2byte	0x3f0
 	.4byte	0xbfee
 	.uleb128 0x43
 	.4byte	.LASF3142
 	.byte	0x1
-	.2byte	0x3f1
+	.2byte	0x3f0
 	.4byte	0xbfee
 	.uleb128 0x43
 	.4byte	.LASF2838
 	.byte	0x1
-	.2byte	0x3f2
+	.2byte	0x3f1
 	.4byte	0xc6
 	.uleb128 0x43
 	.4byte	.LASF2840
 	.byte	0x1
-	.2byte	0x3f3
+	.2byte	0x3f2
 	.4byte	0xc6
 	.uleb128 0x43
 	.4byte	.LASF2839
 	.byte	0x1
-	.2byte	0x3f4
+	.2byte	0x3f3
 	.4byte	0xc6
 	.uleb128 0x43
 	.4byte	.LASF2841
 	.byte	0x1
-	.2byte	0x3f5
+	.2byte	0x3f4
 	.4byte	0xc6
 	.byte	0
 	.uleb128 0x60
 	.4byte	.LASF3143
 	.byte	0x1
-	.2byte	0x388
+	.2byte	0x387
 	.4byte	0x13f
 	.byte	0x1
-	.4byte	0x14330
+	.4byte	0x14521
 	.uleb128 0x62
 	.4byte	.LASF3119
 	.byte	0x1
-	.2byte	0x388
+	.2byte	0x387
 	.4byte	0x13f
 	.uleb128 0x62
 	.4byte	.LASF3118
 	.byte	0x1
-	.2byte	0x388
+	.2byte	0x387
 	.4byte	0x13f
 	.uleb128 0x62
 	.4byte	.LASF3127
 	.byte	0x1
-	.2byte	0x388
+	.2byte	0x387
 	.4byte	0xbfee
 	.uleb128 0x62
 	.4byte	.LASF3136
 	.byte	0x1
-	.2byte	0x388
+	.2byte	0x387
 	.4byte	0xbfee
 	.uleb128 0x62
 	.4byte	.LASF2943
 	.byte	0x1
-	.2byte	0x388
-	.4byte	0xe82d
+	.2byte	0x387
+	.4byte	0xe81f
 	.uleb128 0x62
 	.4byte	.LASF845
 	.byte	0x1
-	.2byte	0x388
+	.2byte	0x387
 	.4byte	0xc6
 	.uleb128 0x43
 	.4byte	.LASF3130
 	.byte	0x1
-	.2byte	0x38a
+	.2byte	0x389
 	.4byte	0x110
 	.uleb128 0x43
 	.4byte	.LASF2826
 	.byte	0x1
-	.2byte	0x38b
+	.2byte	0x38a
 	.4byte	0xbfee
 	.uleb128 0x43
 	.4byte	.LASF3131
 	.byte	0x1
-	.2byte	0x38c
+	.2byte	0x38b
 	.4byte	0x13f
 	.uleb128 0x43
 	.4byte	.LASF3132
 	.byte	0x1
-	.2byte	0x38c
+	.2byte	0x38b
 	.4byte	0x13f
 	.uleb128 0x43
 	.4byte	.LASF3133
 	.byte	0x1
-	.2byte	0x38d
+	.2byte	0x38c
 	.4byte	0x13f
 	.uleb128 0x43
 	.4byte	.LASF3144
 	.byte	0x1
-	.2byte	0x38e
+	.2byte	0x38d
 	.4byte	0x110
 	.byte	0
 	.uleb128 0x4a
 	.4byte	.LASF3145
 	.byte	0x1
-	.2byte	0x2f7
+	.2byte	0x2f6
 	.8byte	.LFB2822
 	.8byte	.LFE2822-.LFB2822
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x1450f
+	.4byte	0x14700
 	.uleb128 0x55
 	.4byte	.LASF3115
 	.byte	0x1
-	.2byte	0x2f7
+	.2byte	0x2f6
 	.4byte	0xbfee
 	.4byte	.LLST0
 	.uleb128 0x71
 	.4byte	.LASF3116
 	.byte	0x1
-	.2byte	0x2f7
+	.2byte	0x2f6
 	.4byte	0xac0
 	.uleb128 0x1
 	.byte	0x51
 	.uleb128 0x71
 	.4byte	.LASF3117
 	.byte	0x1
-	.2byte	0x2f7
+	.2byte	0x2f6
 	.4byte	0xac0
 	.uleb128 0x1
 	.byte	0x52
 	.uleb128 0x71
 	.4byte	.LASF3127
 	.byte	0x1
-	.2byte	0x2f7
+	.2byte	0x2f6
 	.4byte	0xbfee
 	.uleb128 0x1
 	.byte	0x53
 	.uleb128 0x71
 	.4byte	.LASF3136
 	.byte	0x1
-	.2byte	0x2f7
+	.2byte	0x2f6
 	.4byte	0xbfee
 	.uleb128 0x1
 	.byte	0x54
 	.uleb128 0x71
 	.4byte	.LASF2943
 	.byte	0x1
-	.2byte	0x2f7
-	.4byte	0xe82d
+	.2byte	0x2f6
+	.4byte	0xe81f
 	.uleb128 0x1
 	.byte	0x55
 	.uleb128 0x43
-	.4byte	.LASF2993
+	.4byte	.LASF2992
 	.byte	0x1
-	.2byte	0x2f9
+	.2byte	0x2f8
 	.4byte	0xe0e4
 	.uleb128 0x66
 	.string	"i"
 	.byte	0x1
-	.2byte	0x2fa
+	.2byte	0x2f9
 	.4byte	0xc6
 	.uleb128 0x1
 	.byte	0x67
 	.uleb128 0x66
 	.string	"j"
 	.byte	0x1
-	.2byte	0x2fb
+	.2byte	0x2fa
 	.4byte	0xc6
 	.uleb128 0x1
 	.byte	0x5a
 	.uleb128 0x56
 	.4byte	.LASF2870
 	.byte	0x1
-	.2byte	0x2fc
+	.2byte	0x2fb
 	.4byte	0xc6
 	.4byte	.LLST1
 	.uleb128 0x56
 	.4byte	.LASF262
 	.byte	0x1
-	.2byte	0x2fd
+	.2byte	0x2fc
 	.4byte	0xc6
 	.4byte	.LLST2
 	.uleb128 0x56
 	.4byte	.LASF3118
 	.byte	0x1
-	.2byte	0x2fe
+	.2byte	0x2fd
 	.4byte	0x13f
 	.4byte	.LLST3
 	.uleb128 0x56
 	.4byte	.LASF3119
 	.byte	0x1
-	.2byte	0x2fe
+	.2byte	0x2fd
 	.4byte	0x13f
 	.4byte	.LLST4
 	.uleb128 0x43
 	.4byte	.LASF3137
 	.byte	0x1
-	.2byte	0x2ff
+	.2byte	0x2fe
 	.4byte	0xac0
 	.uleb128 0x43
 	.4byte	.LASF3138
 	.byte	0x1
-	.2byte	0x2ff
+	.2byte	0x2fe
 	.4byte	0xac0
 	.uleb128 0x56
 	.4byte	.LASF3122
 	.byte	0x1
-	.2byte	0x300
+	.2byte	0x2ff
 	.4byte	0xbfee
 	.4byte	.LLST5
 	.uleb128 0x49
 	.4byte	.LASF3146
 	.byte	0x1
-	.2byte	0x301
+	.2byte	0x300
 	.4byte	0xbfee
 	.uleb128 0x1
 	.byte	0x5c
 	.uleb128 0x43
 	.4byte	.LASF3139
 	.byte	0x1
-	.2byte	0x302
+	.2byte	0x301
 	.4byte	0xbfee
 	.uleb128 0x56
 	.4byte	.LASF3140
 	.byte	0x1
-	.2byte	0x303
+	.2byte	0x302
 	.4byte	0xbfee
 	.4byte	.LLST6
 	.uleb128 0x43
 	.4byte	.LASF3130
 	.byte	0x1
-	.2byte	0x304
+	.2byte	0x303
 	.4byte	0x110
 	.uleb128 0x43
 	.4byte	.LASF2826
 	.byte	0x1
-	.2byte	0x305
+	.2byte	0x304
 	.4byte	0xbfee
 	.uleb128 0x43
 	.4byte	.LASF3144
 	.byte	0x1
-	.2byte	0x306
+	.2byte	0x305
 	.4byte	0x110
 	.uleb128 0x43
 	.4byte	.LASF3141
 	.byte	0x1
-	.2byte	0x307
+	.2byte	0x306
 	.4byte	0xbfee
 	.uleb128 0x56
 	.4byte	.LASF3142
 	.byte	0x1
-	.2byte	0x307
+	.2byte	0x306
 	.4byte	0xbfee
 	.4byte	.LLST7
 	.uleb128 0x43
 	.4byte	.LASF2916
 	.byte	0x1
-	.2byte	0x308
+	.2byte	0x307
 	.4byte	0xc6
 	.uleb128 0x43
 	.4byte	.LASF3131
 	.byte	0x1
-	.2byte	0x309
+	.2byte	0x308
 	.4byte	0x110
 	.uleb128 0x43
 	.4byte	.LASF3132
 	.byte	0x1
-	.2byte	0x309
+	.2byte	0x308
 	.4byte	0x110
 	.uleb128 0x56
 	.4byte	.LASF3133
 	.byte	0x1
-	.2byte	0x30a
+	.2byte	0x309
 	.4byte	0x13f
 	.4byte	.LLST8
 	.uleb128 0x56
 	.4byte	.LASF2838
 	.byte	0x1
-	.2byte	0x30b
+	.2byte	0x30a
 	.4byte	0xc6
 	.4byte	.LLST9
 	.uleb128 0x56
 	.4byte	.LASF2840
 	.byte	0x1
-	.2byte	0x30c
+	.2byte	0x30b
 	.4byte	0xc6
 	.4byte	.LLST10
 	.uleb128 0x56
 	.4byte	.LASF2839
 	.byte	0x1
-	.2byte	0x30d
+	.2byte	0x30c
 	.4byte	0xc6
 	.4byte	.LLST11
 	.uleb128 0x56
 	.4byte	.LASF2841
 	.byte	0x1
-	.2byte	0x30e
+	.2byte	0x30d
 	.4byte	0xc6
 	.4byte	.LLST12
 	.byte	0
 	.uleb128 0x4a
 	.4byte	.LASF3147
 	.byte	0x1
-	.2byte	0x29a
+	.2byte	0x299
 	.8byte	.LFB2821
 	.8byte	.LFE2821-.LFB2821
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x14bc3
+	.4byte	0x14db4
 	.uleb128 0x55
 	.4byte	.LASF3115
 	.byte	0x1
-	.2byte	0x29a
+	.2byte	0x299
 	.4byte	0xbfee
-	.4byte	.LLST107
+	.4byte	.LLST115
 	.uleb128 0x55
 	.4byte	.LASF3116
 	.byte	0x1
-	.2byte	0x29a
+	.2byte	0x299
 	.4byte	0xac0
-	.4byte	.LLST108
+	.4byte	.LLST116
 	.uleb128 0x55
 	.4byte	.LASF3117
 	.byte	0x1
-	.2byte	0x29a
+	.2byte	0x299
 	.4byte	0xac0
-	.4byte	.LLST109
+	.4byte	.LLST117
 	.uleb128 0x55
 	.4byte	.LASF3127
 	.byte	0x1
-	.2byte	0x29a
+	.2byte	0x299
 	.4byte	0xbfee
-	.4byte	.LLST110
+	.4byte	.LLST118
 	.uleb128 0x55
 	.4byte	.LASF3136
 	.byte	0x1
-	.2byte	0x29a
+	.2byte	0x299
 	.4byte	0xbfee
-	.4byte	.LLST111
+	.4byte	.LLST119
 	.uleb128 0x55
 	.4byte	.LASF2943
 	.byte	0x1
-	.2byte	0x29a
-	.4byte	0xe82d
-	.4byte	.LLST112
+	.2byte	0x299
+	.4byte	0xe81f
+	.4byte	.LLST120
 	.uleb128 0x55
 	.4byte	.LASF874
 	.byte	0x1
-	.2byte	0x29a
+	.2byte	0x299
 	.4byte	0xe1ba
-	.4byte	.LLST113
+	.4byte	.LLST121
 	.uleb128 0x43
-	.4byte	.LASF2993
+	.4byte	.LASF2992
 	.byte	0x1
-	.2byte	0x29c
+	.2byte	0x29b
 	.4byte	0xe0e4
 	.uleb128 0x57
 	.string	"i"
 	.byte	0x1
-	.2byte	0x29d
+	.2byte	0x29c
 	.4byte	0xc6
-	.4byte	.LLST114
+	.4byte	.LLST122
 	.uleb128 0x4f
 	.string	"j"
 	.byte	0x1
-	.2byte	0x29d
+	.2byte	0x29c
 	.4byte	0xc6
 	.uleb128 0x43
 	.4byte	.LASF262
 	.byte	0x1
-	.2byte	0x29d
+	.2byte	0x29c
 	.4byte	0xc6
 	.uleb128 0x56
 	.4byte	.LASF2870
 	.byte	0x1
+	.2byte	0x29c
+	.4byte	0xc6
+	.4byte	.LLST123
+	.uleb128 0x56
+	.4byte	.LASF3089
+	.byte	0x1
 	.2byte	0x29d
 	.4byte	0xc6
-	.4byte	.LLST115
-	.uleb128 0x56
-	.4byte	.LASF3090
-	.byte	0x1
-	.2byte	0x29e
-	.4byte	0xc6
-	.4byte	.LLST116
+	.4byte	.LLST124
 	.uleb128 0x56
 	.4byte	.LASF3128
 	.byte	0x1
-	.2byte	0x29f
+	.2byte	0x29e
 	.4byte	0x45a4
-	.4byte	.LLST117
+	.4byte	.LLST125
 	.uleb128 0x43
 	.4byte	.LASF3121
 	.byte	0x1
-	.2byte	0x2a0
+	.2byte	0x29f
 	.4byte	0xc6
-	.uleb128 0x6c
-	.4byte	.Ldebug_ranges0+0x7d0
-	.4byte	0x14bb5
+	.uleb128 0x68
+	.4byte	.Ldebug_ranges0+0x8a0
+	.4byte	0x14da6
 	.uleb128 0x56
 	.4byte	.LASF3122
 	.byte	0x1
-	.2byte	0x2b7
+	.2byte	0x2b6
 	.4byte	0xbfee
-	.4byte	.LLST118
-	.uleb128 0x6c
-	.4byte	.Ldebug_ranges0+0x800
-	.4byte	0x148ec
+	.4byte	.LLST126
+	.uleb128 0x68
+	.4byte	.Ldebug_ranges0+0x8d0
+	.4byte	0x14add
 	.uleb128 0x56
 	.4byte	.LASF3119
 	.byte	0x1
-	.2byte	0x2b9
+	.2byte	0x2b8
 	.4byte	0x13f
-	.4byte	.LLST119
+	.4byte	.LLST127
 	.uleb128 0x56
 	.4byte	.LASF3118
 	.byte	0x1
-	.2byte	0x2ba
+	.2byte	0x2b9
 	.4byte	0x13f
-	.4byte	.LLST120
+	.4byte	.LLST128
 	.uleb128 0x5b
-	.4byte	.Ldebug_ranges0+0x830
+	.4byte	.Ldebug_ranges0+0x900
 	.uleb128 0x56
 	.4byte	.LASF3148
 	.byte	0x1
-	.2byte	0x2bd
+	.2byte	0x2bc
 	.4byte	0x2b0
-	.4byte	.LLST121
+	.4byte	.LLST129
 	.uleb128 0x49
 	.4byte	.LASF3132
 	.byte	0x1
-	.2byte	0x2be
+	.2byte	0x2bd
 	.4byte	0x13f
 	.uleb128 0x1
 	.byte	0x55
 	.uleb128 0x56
 	.4byte	.LASF3133
 	.byte	0x1
-	.2byte	0x2bf
-	.4byte	0x13f
-	.4byte	.LLST122
-	.uleb128 0x6c
-	.4byte	.Ldebug_ranges0+0x860
-	.4byte	0x146cc
-	.uleb128 0x43
-	.4byte	.LASF3130
-	.byte	0x1
-	.2byte	0x2c2
-	.4byte	0x110
-	.uleb128 0x56
-	.4byte	.LASF3144
-	.byte	0x1
-	.2byte	0x2c2
-	.4byte	0x110
-	.4byte	.LLST123
-	.uleb128 0x43
-	.4byte	.LASF2953
-	.byte	0x1
-	.2byte	0x2c2
-	.4byte	0x110
-	.uleb128 0x56
-	.4byte	.LASF3131
-	.byte	0x1
-	.2byte	0x2c2
-	.4byte	0x13f
-	.4byte	.LLST124
-	.uleb128 0x43
-	.4byte	.LASF2826
-	.byte	0x1
-	.2byte	0x2c2
-	.4byte	0xbfee
-	.byte	0
-	.uleb128 0x6c
-	.4byte	.Ldebug_ranges0+0x890
-	.4byte	0x1471a
-	.uleb128 0x43
-	.4byte	.LASF3130
-	.byte	0x1
-	.2byte	0x2c3
-	.4byte	0x110
-	.uleb128 0x56
-	.4byte	.LASF3144
-	.byte	0x1
-	.2byte	0x2c3
-	.4byte	0x110
-	.4byte	.LLST125
-	.uleb128 0x43
-	.4byte	.LASF2953
-	.byte	0x1
-	.2byte	0x2c3
-	.4byte	0x110
-	.uleb128 0x56
-	.4byte	.LASF3131
-	.byte	0x1
-	.2byte	0x2c3
-	.4byte	0x13f
-	.4byte	.LLST126
-	.uleb128 0x43
-	.4byte	.LASF2826
-	.byte	0x1
-	.2byte	0x2c3
-	.4byte	0xbfee
-	.byte	0
-	.uleb128 0x6c
-	.4byte	.Ldebug_ranges0+0x8c0
-	.4byte	0x14768
-	.uleb128 0x43
-	.4byte	.LASF3130
-	.byte	0x1
-	.2byte	0x2c4
-	.4byte	0x110
-	.uleb128 0x56
-	.4byte	.LASF3144
-	.byte	0x1
-	.2byte	0x2c4
-	.4byte	0x110
-	.4byte	.LLST127
-	.uleb128 0x43
-	.4byte	.LASF2953
-	.byte	0x1
-	.2byte	0x2c4
-	.4byte	0x110
-	.uleb128 0x56
-	.4byte	.LASF3131
-	.byte	0x1
-	.2byte	0x2c4
-	.4byte	0x13f
-	.4byte	.LLST128
-	.uleb128 0x43
-	.4byte	.LASF2826
-	.byte	0x1
-	.2byte	0x2c4
-	.4byte	0xbfee
-	.byte	0
-	.uleb128 0x6c
-	.4byte	.Ldebug_ranges0+0x8f0
-	.4byte	0x147b6
-	.uleb128 0x43
-	.4byte	.LASF3130
-	.byte	0x1
-	.2byte	0x2c5
-	.4byte	0x110
-	.uleb128 0x56
-	.4byte	.LASF3144
-	.byte	0x1
-	.2byte	0x2c5
-	.4byte	0x110
-	.4byte	.LLST129
-	.uleb128 0x43
-	.4byte	.LASF2953
-	.byte	0x1
-	.2byte	0x2c5
-	.4byte	0x110
-	.uleb128 0x56
-	.4byte	.LASF3131
-	.byte	0x1
-	.2byte	0x2c5
+	.2byte	0x2be
 	.4byte	0x13f
 	.4byte	.LLST130
-	.uleb128 0x43
-	.4byte	.LASF2826
-	.byte	0x1
-	.2byte	0x2c5
-	.4byte	0xbfee
-	.byte	0
-	.uleb128 0x6c
-	.4byte	.Ldebug_ranges0+0x920
-	.4byte	0x14804
+	.uleb128 0x68
+	.4byte	.Ldebug_ranges0+0x930
+	.4byte	0x148bd
 	.uleb128 0x43
 	.4byte	.LASF3130
 	.byte	0x1
-	.2byte	0x2c6
+	.2byte	0x2c1
 	.4byte	0x110
 	.uleb128 0x56
 	.4byte	.LASF3144
 	.byte	0x1
-	.2byte	0x2c6
+	.2byte	0x2c1
 	.4byte	0x110
 	.4byte	.LLST131
 	.uleb128 0x43
 	.4byte	.LASF2953
 	.byte	0x1
-	.2byte	0x2c6
+	.2byte	0x2c1
 	.4byte	0x110
 	.uleb128 0x56
 	.4byte	.LASF3131
 	.byte	0x1
-	.2byte	0x2c6
+	.2byte	0x2c1
 	.4byte	0x13f
 	.4byte	.LLST132
 	.uleb128 0x43
 	.4byte	.LASF2826
 	.byte	0x1
-	.2byte	0x2c6
+	.2byte	0x2c1
 	.4byte	0xbfee
 	.byte	0
-	.uleb128 0x6c
-	.4byte	.Ldebug_ranges0+0x950
-	.4byte	0x14852
+	.uleb128 0x68
+	.4byte	.Ldebug_ranges0+0x960
+	.4byte	0x1490b
 	.uleb128 0x43
 	.4byte	.LASF3130
 	.byte	0x1
-	.2byte	0x2c7
+	.2byte	0x2c2
 	.4byte	0x110
 	.uleb128 0x56
 	.4byte	.LASF3144
 	.byte	0x1
-	.2byte	0x2c7
+	.2byte	0x2c2
 	.4byte	0x110
 	.4byte	.LLST133
 	.uleb128 0x43
 	.4byte	.LASF2953
 	.byte	0x1
-	.2byte	0x2c7
+	.2byte	0x2c2
 	.4byte	0x110
 	.uleb128 0x56
 	.4byte	.LASF3131
 	.byte	0x1
-	.2byte	0x2c7
+	.2byte	0x2c2
 	.4byte	0x13f
 	.4byte	.LLST134
 	.uleb128 0x43
 	.4byte	.LASF2826
 	.byte	0x1
-	.2byte	0x2c7
+	.2byte	0x2c2
 	.4byte	0xbfee
 	.byte	0
-	.uleb128 0x6c
-	.4byte	.Ldebug_ranges0+0x980
-	.4byte	0x148a0
+	.uleb128 0x68
+	.4byte	.Ldebug_ranges0+0x990
+	.4byte	0x14959
 	.uleb128 0x43
 	.4byte	.LASF3130
 	.byte	0x1
-	.2byte	0x2c8
+	.2byte	0x2c3
 	.4byte	0x110
 	.uleb128 0x56
 	.4byte	.LASF3144
 	.byte	0x1
-	.2byte	0x2c8
+	.2byte	0x2c3
 	.4byte	0x110
 	.4byte	.LLST135
 	.uleb128 0x43
 	.4byte	.LASF2953
 	.byte	0x1
-	.2byte	0x2c8
+	.2byte	0x2c3
 	.4byte	0x110
 	.uleb128 0x56
 	.4byte	.LASF3131
 	.byte	0x1
-	.2byte	0x2c8
+	.2byte	0x2c3
 	.4byte	0x13f
 	.4byte	.LLST136
 	.uleb128 0x43
 	.4byte	.LASF2826
 	.byte	0x1
-	.2byte	0x2c8
+	.2byte	0x2c3
 	.4byte	0xbfee
 	.byte	0
-	.uleb128 0x5b
-	.4byte	.Ldebug_ranges0+0x9b0
+	.uleb128 0x68
+	.4byte	.Ldebug_ranges0+0x9c0
+	.4byte	0x149a7
 	.uleb128 0x43
 	.4byte	.LASF3130
 	.byte	0x1
-	.2byte	0x2c9
+	.2byte	0x2c4
 	.4byte	0x110
 	.uleb128 0x56
 	.4byte	.LASF3144
 	.byte	0x1
-	.2byte	0x2c9
+	.2byte	0x2c4
 	.4byte	0x110
 	.4byte	.LLST137
 	.uleb128 0x43
 	.4byte	.LASF2953
 	.byte	0x1
-	.2byte	0x2c9
+	.2byte	0x2c4
 	.4byte	0x110
 	.uleb128 0x56
 	.4byte	.LASF3131
 	.byte	0x1
-	.2byte	0x2c9
+	.2byte	0x2c4
 	.4byte	0x13f
 	.4byte	.LLST138
 	.uleb128 0x43
 	.4byte	.LASF2826
 	.byte	0x1
-	.2byte	0x2c9
+	.2byte	0x2c4
+	.4byte	0xbfee
+	.byte	0
+	.uleb128 0x68
+	.4byte	.Ldebug_ranges0+0x9f0
+	.4byte	0x149f5
+	.uleb128 0x43
+	.4byte	.LASF3130
+	.byte	0x1
+	.2byte	0x2c5
+	.4byte	0x110
+	.uleb128 0x56
+	.4byte	.LASF3144
+	.byte	0x1
+	.2byte	0x2c5
+	.4byte	0x110
+	.4byte	.LLST139
+	.uleb128 0x43
+	.4byte	.LASF2953
+	.byte	0x1
+	.2byte	0x2c5
+	.4byte	0x110
+	.uleb128 0x56
+	.4byte	.LASF3131
+	.byte	0x1
+	.2byte	0x2c5
+	.4byte	0x13f
+	.4byte	.LLST140
+	.uleb128 0x43
+	.4byte	.LASF2826
+	.byte	0x1
+	.2byte	0x2c5
+	.4byte	0xbfee
+	.byte	0
+	.uleb128 0x68
+	.4byte	.Ldebug_ranges0+0xa20
+	.4byte	0x14a43
+	.uleb128 0x43
+	.4byte	.LASF3130
+	.byte	0x1
+	.2byte	0x2c6
+	.4byte	0x110
+	.uleb128 0x56
+	.4byte	.LASF3144
+	.byte	0x1
+	.2byte	0x2c6
+	.4byte	0x110
+	.4byte	.LLST141
+	.uleb128 0x43
+	.4byte	.LASF2953
+	.byte	0x1
+	.2byte	0x2c6
+	.4byte	0x110
+	.uleb128 0x56
+	.4byte	.LASF3131
+	.byte	0x1
+	.2byte	0x2c6
+	.4byte	0x13f
+	.4byte	.LLST142
+	.uleb128 0x43
+	.4byte	.LASF2826
+	.byte	0x1
+	.2byte	0x2c6
+	.4byte	0xbfee
+	.byte	0
+	.uleb128 0x68
+	.4byte	.Ldebug_ranges0+0xa50
+	.4byte	0x14a91
+	.uleb128 0x43
+	.4byte	.LASF3130
+	.byte	0x1
+	.2byte	0x2c7
+	.4byte	0x110
+	.uleb128 0x56
+	.4byte	.LASF3144
+	.byte	0x1
+	.2byte	0x2c7
+	.4byte	0x110
+	.4byte	.LLST143
+	.uleb128 0x43
+	.4byte	.LASF2953
+	.byte	0x1
+	.2byte	0x2c7
+	.4byte	0x110
+	.uleb128 0x56
+	.4byte	.LASF3131
+	.byte	0x1
+	.2byte	0x2c7
+	.4byte	0x13f
+	.4byte	.LLST144
+	.uleb128 0x43
+	.4byte	.LASF2826
+	.byte	0x1
+	.2byte	0x2c7
+	.4byte	0xbfee
+	.byte	0
+	.uleb128 0x5b
+	.4byte	.Ldebug_ranges0+0xa80
+	.uleb128 0x43
+	.4byte	.LASF3130
+	.byte	0x1
+	.2byte	0x2c8
+	.4byte	0x110
+	.uleb128 0x56
+	.4byte	.LASF3144
+	.byte	0x1
+	.2byte	0x2c8
+	.4byte	0x110
+	.4byte	.LLST145
+	.uleb128 0x43
+	.4byte	.LASF2953
+	.byte	0x1
+	.2byte	0x2c8
+	.4byte	0x110
+	.uleb128 0x56
+	.4byte	.LASF3131
+	.byte	0x1
+	.2byte	0x2c8
+	.4byte	0x13f
+	.4byte	.LLST146
+	.uleb128 0x43
+	.4byte	.LASF2826
+	.byte	0x1
+	.2byte	0x2c8
 	.4byte	0xbfee
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x5b
-	.4byte	.Ldebug_ranges0+0x9e0
+	.4byte	.Ldebug_ranges0+0xab0
 	.uleb128 0x56
 	.4byte	.LASF3119
 	.byte	0x1
-	.2byte	0x2d7
+	.2byte	0x2d6
 	.4byte	0x13f
-	.4byte	.LLST139
+	.4byte	.LLST147
 	.uleb128 0x56
 	.4byte	.LASF3118
 	.byte	0x1
-	.2byte	0x2d8
+	.2byte	0x2d7
 	.4byte	0x13f
-	.4byte	.LLST140
+	.4byte	.LLST148
 	.uleb128 0x5b
-	.4byte	.Ldebug_ranges0+0xa10
+	.4byte	.Ldebug_ranges0+0xae0
 	.uleb128 0x56
 	.4byte	.LASF3148
 	.byte	0x1
-	.2byte	0x2db
+	.2byte	0x2da
 	.4byte	0x2b0
-	.4byte	.LLST141
+	.4byte	.LLST149
 	.uleb128 0x56
 	.4byte	.LASF3132
 	.byte	0x1
-	.2byte	0x2dc
+	.2byte	0x2db
 	.4byte	0x13f
-	.4byte	.LLST142
+	.4byte	.LLST150
 	.uleb128 0x56
 	.4byte	.LASF3133
 	.byte	0x1
-	.2byte	0x2dd
-	.4byte	0x13f
-	.4byte	.LLST143
-	.uleb128 0x6c
-	.4byte	.Ldebug_ranges0+0xa40
-	.4byte	0x14994
-	.uleb128 0x43
-	.4byte	.LASF3130
-	.byte	0x1
-	.2byte	0x2e0
-	.4byte	0x110
-	.uleb128 0x56
-	.4byte	.LASF3144
-	.byte	0x1
-	.2byte	0x2e0
-	.4byte	0x110
-	.4byte	.LLST144
-	.uleb128 0x43
-	.4byte	.LASF2953
-	.byte	0x1
-	.2byte	0x2e0
-	.4byte	0x110
-	.uleb128 0x56
-	.4byte	.LASF3131
-	.byte	0x1
-	.2byte	0x2e0
-	.4byte	0x13f
-	.4byte	.LLST145
-	.uleb128 0x43
-	.4byte	.LASF2826
-	.byte	0x1
-	.2byte	0x2e0
-	.4byte	0xbfee
-	.byte	0
-	.uleb128 0x6c
-	.4byte	.Ldebug_ranges0+0xa70
-	.4byte	0x149e2
-	.uleb128 0x43
-	.4byte	.LASF3130
-	.byte	0x1
-	.2byte	0x2e1
-	.4byte	0x110
-	.uleb128 0x56
-	.4byte	.LASF3144
-	.byte	0x1
-	.2byte	0x2e1
-	.4byte	0x110
-	.4byte	.LLST146
-	.uleb128 0x43
-	.4byte	.LASF2953
-	.byte	0x1
-	.2byte	0x2e1
-	.4byte	0x110
-	.uleb128 0x56
-	.4byte	.LASF3131
-	.byte	0x1
-	.2byte	0x2e1
-	.4byte	0x13f
-	.4byte	.LLST147
-	.uleb128 0x43
-	.4byte	.LASF2826
-	.byte	0x1
-	.2byte	0x2e1
-	.4byte	0xbfee
-	.byte	0
-	.uleb128 0x6c
-	.4byte	.Ldebug_ranges0+0xaa0
-	.4byte	0x14a30
-	.uleb128 0x43
-	.4byte	.LASF3130
-	.byte	0x1
-	.2byte	0x2e2
-	.4byte	0x110
-	.uleb128 0x56
-	.4byte	.LASF3144
-	.byte	0x1
-	.2byte	0x2e2
-	.4byte	0x110
-	.4byte	.LLST148
-	.uleb128 0x43
-	.4byte	.LASF2953
-	.byte	0x1
-	.2byte	0x2e2
-	.4byte	0x110
-	.uleb128 0x56
-	.4byte	.LASF3131
-	.byte	0x1
-	.2byte	0x2e2
-	.4byte	0x13f
-	.4byte	.LLST149
-	.uleb128 0x43
-	.4byte	.LASF2826
-	.byte	0x1
-	.2byte	0x2e2
-	.4byte	0xbfee
-	.byte	0
-	.uleb128 0x6c
-	.4byte	.Ldebug_ranges0+0xad0
-	.4byte	0x14a7e
-	.uleb128 0x43
-	.4byte	.LASF3130
-	.byte	0x1
-	.2byte	0x2e3
-	.4byte	0x110
-	.uleb128 0x56
-	.4byte	.LASF3144
-	.byte	0x1
-	.2byte	0x2e3
-	.4byte	0x110
-	.4byte	.LLST150
-	.uleb128 0x43
-	.4byte	.LASF2953
-	.byte	0x1
-	.2byte	0x2e3
-	.4byte	0x110
-	.uleb128 0x56
-	.4byte	.LASF3131
-	.byte	0x1
-	.2byte	0x2e3
+	.2byte	0x2dc
 	.4byte	0x13f
 	.4byte	.LLST151
-	.uleb128 0x43
-	.4byte	.LASF2826
-	.byte	0x1
-	.2byte	0x2e3
-	.4byte	0xbfee
-	.byte	0
-	.uleb128 0x6c
-	.4byte	.Ldebug_ranges0+0xb00
-	.4byte	0x14acc
+	.uleb128 0x68
+	.4byte	.Ldebug_ranges0+0xb10
+	.4byte	0x14b85
 	.uleb128 0x43
 	.4byte	.LASF3130
 	.byte	0x1
-	.2byte	0x2e4
+	.2byte	0x2df
 	.4byte	0x110
 	.uleb128 0x56
 	.4byte	.LASF3144
 	.byte	0x1
-	.2byte	0x2e4
+	.2byte	0x2df
 	.4byte	0x110
 	.4byte	.LLST152
 	.uleb128 0x43
 	.4byte	.LASF2953
 	.byte	0x1
-	.2byte	0x2e4
+	.2byte	0x2df
 	.4byte	0x110
 	.uleb128 0x56
 	.4byte	.LASF3131
 	.byte	0x1
-	.2byte	0x2e4
+	.2byte	0x2df
 	.4byte	0x13f
 	.4byte	.LLST153
 	.uleb128 0x43
 	.4byte	.LASF2826
 	.byte	0x1
-	.2byte	0x2e4
+	.2byte	0x2df
 	.4byte	0xbfee
 	.byte	0
-	.uleb128 0x6c
-	.4byte	.Ldebug_ranges0+0xb30
-	.4byte	0x14b1a
+	.uleb128 0x68
+	.4byte	.Ldebug_ranges0+0xb40
+	.4byte	0x14bd3
 	.uleb128 0x43
 	.4byte	.LASF3130
 	.byte	0x1
-	.2byte	0x2e5
+	.2byte	0x2e0
 	.4byte	0x110
 	.uleb128 0x56
 	.4byte	.LASF3144
 	.byte	0x1
-	.2byte	0x2e5
+	.2byte	0x2e0
 	.4byte	0x110
 	.4byte	.LLST154
 	.uleb128 0x43
 	.4byte	.LASF2953
 	.byte	0x1
-	.2byte	0x2e5
+	.2byte	0x2e0
 	.4byte	0x110
 	.uleb128 0x56
 	.4byte	.LASF3131
 	.byte	0x1
-	.2byte	0x2e5
+	.2byte	0x2e0
 	.4byte	0x13f
 	.4byte	.LLST155
 	.uleb128 0x43
 	.4byte	.LASF2826
 	.byte	0x1
-	.2byte	0x2e5
+	.2byte	0x2e0
 	.4byte	0xbfee
 	.byte	0
-	.uleb128 0x6c
-	.4byte	.Ldebug_ranges0+0xb60
-	.4byte	0x14b68
+	.uleb128 0x68
+	.4byte	.Ldebug_ranges0+0xb70
+	.4byte	0x14c21
 	.uleb128 0x43
 	.4byte	.LASF3130
 	.byte	0x1
-	.2byte	0x2e6
+	.2byte	0x2e1
 	.4byte	0x110
 	.uleb128 0x56
 	.4byte	.LASF3144
 	.byte	0x1
-	.2byte	0x2e6
+	.2byte	0x2e1
 	.4byte	0x110
 	.4byte	.LLST156
 	.uleb128 0x43
 	.4byte	.LASF2953
 	.byte	0x1
-	.2byte	0x2e6
+	.2byte	0x2e1
 	.4byte	0x110
 	.uleb128 0x56
 	.4byte	.LASF3131
 	.byte	0x1
-	.2byte	0x2e6
+	.2byte	0x2e1
 	.4byte	0x13f
 	.4byte	.LLST157
 	.uleb128 0x43
 	.4byte	.LASF2826
 	.byte	0x1
-	.2byte	0x2e6
+	.2byte	0x2e1
 	.4byte	0xbfee
 	.byte	0
-	.uleb128 0x5b
-	.4byte	.Ldebug_ranges0+0xb90
+	.uleb128 0x68
+	.4byte	.Ldebug_ranges0+0xba0
+	.4byte	0x14c6f
 	.uleb128 0x43
 	.4byte	.LASF3130
 	.byte	0x1
-	.2byte	0x2e7
+	.2byte	0x2e2
 	.4byte	0x110
 	.uleb128 0x56
 	.4byte	.LASF3144
 	.byte	0x1
-	.2byte	0x2e7
+	.2byte	0x2e2
 	.4byte	0x110
 	.4byte	.LLST158
 	.uleb128 0x43
 	.4byte	.LASF2953
 	.byte	0x1
-	.2byte	0x2e7
+	.2byte	0x2e2
 	.4byte	0x110
 	.uleb128 0x56
 	.4byte	.LASF3131
 	.byte	0x1
-	.2byte	0x2e7
+	.2byte	0x2e2
 	.4byte	0x13f
 	.4byte	.LLST159
 	.uleb128 0x43
 	.4byte	.LASF2826
 	.byte	0x1
-	.2byte	0x2e7
+	.2byte	0x2e2
+	.4byte	0xbfee
+	.byte	0
+	.uleb128 0x68
+	.4byte	.Ldebug_ranges0+0xbd0
+	.4byte	0x14cbd
+	.uleb128 0x43
+	.4byte	.LASF3130
+	.byte	0x1
+	.2byte	0x2e3
+	.4byte	0x110
+	.uleb128 0x56
+	.4byte	.LASF3144
+	.byte	0x1
+	.2byte	0x2e3
+	.4byte	0x110
+	.4byte	.LLST160
+	.uleb128 0x43
+	.4byte	.LASF2953
+	.byte	0x1
+	.2byte	0x2e3
+	.4byte	0x110
+	.uleb128 0x56
+	.4byte	.LASF3131
+	.byte	0x1
+	.2byte	0x2e3
+	.4byte	0x13f
+	.4byte	.LLST161
+	.uleb128 0x43
+	.4byte	.LASF2826
+	.byte	0x1
+	.2byte	0x2e3
+	.4byte	0xbfee
+	.byte	0
+	.uleb128 0x68
+	.4byte	.Ldebug_ranges0+0xc00
+	.4byte	0x14d0b
+	.uleb128 0x43
+	.4byte	.LASF3130
+	.byte	0x1
+	.2byte	0x2e4
+	.4byte	0x110
+	.uleb128 0x56
+	.4byte	.LASF3144
+	.byte	0x1
+	.2byte	0x2e4
+	.4byte	0x110
+	.4byte	.LLST162
+	.uleb128 0x43
+	.4byte	.LASF2953
+	.byte	0x1
+	.2byte	0x2e4
+	.4byte	0x110
+	.uleb128 0x56
+	.4byte	.LASF3131
+	.byte	0x1
+	.2byte	0x2e4
+	.4byte	0x13f
+	.4byte	.LLST163
+	.uleb128 0x43
+	.4byte	.LASF2826
+	.byte	0x1
+	.2byte	0x2e4
+	.4byte	0xbfee
+	.byte	0
+	.uleb128 0x68
+	.4byte	.Ldebug_ranges0+0xc30
+	.4byte	0x14d59
+	.uleb128 0x43
+	.4byte	.LASF3130
+	.byte	0x1
+	.2byte	0x2e5
+	.4byte	0x110
+	.uleb128 0x56
+	.4byte	.LASF3144
+	.byte	0x1
+	.2byte	0x2e5
+	.4byte	0x110
+	.4byte	.LLST164
+	.uleb128 0x43
+	.4byte	.LASF2953
+	.byte	0x1
+	.2byte	0x2e5
+	.4byte	0x110
+	.uleb128 0x56
+	.4byte	.LASF3131
+	.byte	0x1
+	.2byte	0x2e5
+	.4byte	0x13f
+	.4byte	.LLST165
+	.uleb128 0x43
+	.4byte	.LASF2826
+	.byte	0x1
+	.2byte	0x2e5
+	.4byte	0xbfee
+	.byte	0
+	.uleb128 0x5b
+	.4byte	.Ldebug_ranges0+0xc60
+	.uleb128 0x43
+	.4byte	.LASF3130
+	.byte	0x1
+	.2byte	0x2e6
+	.4byte	0x110
+	.uleb128 0x56
+	.4byte	.LASF3144
+	.byte	0x1
+	.2byte	0x2e6
+	.4byte	0x110
+	.4byte	.LLST166
+	.uleb128 0x43
+	.4byte	.LASF2953
+	.byte	0x1
+	.2byte	0x2e6
+	.4byte	0x110
+	.uleb128 0x56
+	.4byte	.LASF3131
+	.byte	0x1
+	.2byte	0x2e6
+	.4byte	0x13f
+	.4byte	.LLST167
+	.uleb128 0x43
+	.4byte	.LASF2826
+	.byte	0x1
+	.2byte	0x2e6
 	.4byte	0xbfee
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x4b
-	.8byte	.LVL345
-	.4byte	0x16a0b
+	.8byte	.LVL342
+	.4byte	0x16bfc
 	.byte	0
 	.uleb128 0x4a
 	.4byte	.LASF3149
 	.byte	0x1
-	.2byte	0x252
+	.2byte	0x251
 	.8byte	.LFB2820
 	.8byte	.LFE2820-.LFB2820
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x14f94
+	.4byte	0x15185
 	.uleb128 0x55
 	.4byte	.LASF3115
 	.byte	0x1
-	.2byte	0x252
+	.2byte	0x251
 	.4byte	0xbfee
-	.4byte	.LLST160
+	.4byte	.LLST168
 	.uleb128 0x55
 	.4byte	.LASF3116
 	.byte	0x1
-	.2byte	0x252
+	.2byte	0x251
 	.4byte	0xac0
-	.4byte	.LLST161
+	.4byte	.LLST169
 	.uleb128 0x55
 	.4byte	.LASF3117
 	.byte	0x1
-	.2byte	0x252
+	.2byte	0x251
 	.4byte	0xac0
-	.4byte	.LLST162
+	.4byte	.LLST170
 	.uleb128 0x55
 	.4byte	.LASF3127
 	.byte	0x1
-	.2byte	0x252
+	.2byte	0x251
 	.4byte	0xbfee
-	.4byte	.LLST163
+	.4byte	.LLST171
 	.uleb128 0x55
 	.4byte	.LASF3136
 	.byte	0x1
-	.2byte	0x252
+	.2byte	0x251
 	.4byte	0xbfee
-	.4byte	.LLST164
+	.4byte	.LLST172
 	.uleb128 0x55
 	.4byte	.LASF2943
 	.byte	0x1
-	.2byte	0x252
-	.4byte	0xe82d
-	.4byte	.LLST165
+	.2byte	0x251
+	.4byte	0xe81f
+	.4byte	.LLST173
 	.uleb128 0x55
 	.4byte	.LASF874
 	.byte	0x1
-	.2byte	0x252
+	.2byte	0x251
 	.4byte	0xe1ba
-	.4byte	.LLST166
+	.4byte	.LLST174
 	.uleb128 0x43
-	.4byte	.LASF2993
+	.4byte	.LASF2992
 	.byte	0x1
-	.2byte	0x254
+	.2byte	0x253
 	.4byte	0xe0e4
 	.uleb128 0x57
 	.string	"i"
 	.byte	0x1
-	.2byte	0x255
+	.2byte	0x254
 	.4byte	0xc6
-	.4byte	.LLST167
+	.4byte	.LLST175
 	.uleb128 0x4f
 	.string	"j"
 	.byte	0x1
-	.2byte	0x255
+	.2byte	0x254
 	.4byte	0xc6
 	.uleb128 0x43
 	.4byte	.LASF262
 	.byte	0x1
-	.2byte	0x255
+	.2byte	0x254
 	.4byte	0xc6
 	.uleb128 0x56
 	.4byte	.LASF2870
 	.byte	0x1
+	.2byte	0x254
+	.4byte	0xc6
+	.4byte	.LLST176
+	.uleb128 0x56
+	.4byte	.LASF3089
+	.byte	0x1
 	.2byte	0x255
 	.4byte	0xc6
-	.4byte	.LLST168
-	.uleb128 0x56
-	.4byte	.LASF3090
-	.byte	0x1
-	.2byte	0x256
-	.4byte	0xc6
-	.4byte	.LLST169
+	.4byte	.LLST177
 	.uleb128 0x56
 	.4byte	.LASF3128
 	.byte	0x1
-	.2byte	0x257
+	.2byte	0x256
 	.4byte	0x45a4
-	.4byte	.LLST170
+	.4byte	.LLST178
 	.uleb128 0x56
 	.4byte	.LASF3121
 	.byte	0x1
-	.2byte	0x258
+	.2byte	0x257
 	.4byte	0xc6
-	.4byte	.LLST171
-	.uleb128 0x6c
-	.4byte	.Ldebug_ranges0+0xbc0
-	.4byte	0x14f79
+	.4byte	.LLST179
+	.uleb128 0x68
+	.4byte	.Ldebug_ranges0+0xc90
+	.4byte	0x1516a
 	.uleb128 0x56
 	.4byte	.LASF3119
 	.byte	0x1
-	.2byte	0x277
+	.2byte	0x276
 	.4byte	0x13f
-	.4byte	.LLST172
+	.4byte	.LLST180
 	.uleb128 0x56
 	.4byte	.LASF3118
 	.byte	0x1
-	.2byte	0x278
+	.2byte	0x277
 	.4byte	0x13f
-	.4byte	.LLST173
+	.4byte	.LLST181
 	.uleb128 0x5b
-	.4byte	.Ldebug_ranges0+0xbf0
+	.4byte	.Ldebug_ranges0+0xcc0
 	.uleb128 0x56
 	.4byte	.LASF3148
 	.byte	0x1
-	.2byte	0x27b
+	.2byte	0x27a
 	.4byte	0x2b0
-	.4byte	.LLST174
+	.4byte	.LLST182
 	.uleb128 0x56
 	.4byte	.LASF3122
 	.byte	0x1
-	.2byte	0x27c
+	.2byte	0x27b
 	.4byte	0xbfee
-	.4byte	.LLST175
+	.4byte	.LLST183
 	.uleb128 0x43
 	.4byte	.LASF3132
 	.byte	0x1
-	.2byte	0x27d
+	.2byte	0x27c
 	.4byte	0x110
 	.uleb128 0x56
 	.4byte	.LASF3133
 	.byte	0x1
-	.2byte	0x27e
+	.2byte	0x27d
 	.4byte	0x13f
-	.4byte	.LLST176
-	.uleb128 0x6c
-	.4byte	.Ldebug_ranges0+0xc20
-	.4byte	0x14d75
-	.uleb128 0x43
-	.4byte	.LASF3130
-	.byte	0x1
-	.2byte	0x281
-	.4byte	0x110
-	.uleb128 0x56
-	.4byte	.LASF3144
-	.byte	0x1
-	.2byte	0x281
-	.4byte	0x110
-	.4byte	.LLST177
-	.uleb128 0x43
-	.4byte	.LASF2953
-	.byte	0x1
-	.2byte	0x281
-	.4byte	0x110
-	.uleb128 0x43
-	.4byte	.LASF3131
-	.byte	0x1
-	.2byte	0x281
-	.4byte	0x13f
-	.uleb128 0x43
-	.4byte	.LASF2826
-	.byte	0x1
-	.2byte	0x281
-	.4byte	0xbfee
-	.byte	0
-	.uleb128 0x6c
-	.4byte	.Ldebug_ranges0+0xc60
-	.4byte	0x14dbf
-	.uleb128 0x43
-	.4byte	.LASF3130
-	.byte	0x1
-	.2byte	0x282
-	.4byte	0x110
-	.uleb128 0x56
-	.4byte	.LASF3144
-	.byte	0x1
-	.2byte	0x282
-	.4byte	0x110
-	.4byte	.LLST178
-	.uleb128 0x43
-	.4byte	.LASF2953
-	.byte	0x1
-	.2byte	0x282
-	.4byte	0x110
-	.uleb128 0x43
-	.4byte	.LASF3131
-	.byte	0x1
-	.2byte	0x282
-	.4byte	0x13f
-	.uleb128 0x43
-	.4byte	.LASF2826
-	.byte	0x1
-	.2byte	0x282
-	.4byte	0xbfee
-	.byte	0
-	.uleb128 0x6c
-	.4byte	.Ldebug_ranges0+0xc90
-	.4byte	0x14e09
-	.uleb128 0x43
-	.4byte	.LASF3130
-	.byte	0x1
-	.2byte	0x283
-	.4byte	0x110
-	.uleb128 0x56
-	.4byte	.LASF3144
-	.byte	0x1
-	.2byte	0x283
-	.4byte	0x110
-	.4byte	.LLST179
-	.uleb128 0x43
-	.4byte	.LASF2953
-	.byte	0x1
-	.2byte	0x283
-	.4byte	0x110
-	.uleb128 0x43
-	.4byte	.LASF3131
-	.byte	0x1
-	.2byte	0x283
-	.4byte	0x13f
-	.uleb128 0x43
-	.4byte	.LASF2826
-	.byte	0x1
-	.2byte	0x283
-	.4byte	0xbfee
-	.byte	0
-	.uleb128 0x6c
-	.4byte	.Ldebug_ranges0+0xcc0
-	.4byte	0x14e53
-	.uleb128 0x43
-	.4byte	.LASF3130
-	.byte	0x1
-	.2byte	0x284
-	.4byte	0x110
-	.uleb128 0x56
-	.4byte	.LASF3144
-	.byte	0x1
-	.2byte	0x284
-	.4byte	0x110
-	.4byte	.LLST180
-	.uleb128 0x43
-	.4byte	.LASF2953
-	.byte	0x1
-	.2byte	0x284
-	.4byte	0x110
-	.uleb128 0x43
-	.4byte	.LASF3131
-	.byte	0x1
-	.2byte	0x284
-	.4byte	0x13f
-	.uleb128 0x43
-	.4byte	.LASF2826
-	.byte	0x1
-	.2byte	0x284
-	.4byte	0xbfee
-	.byte	0
-	.uleb128 0x6c
+	.4byte	.LLST184
+	.uleb128 0x68
 	.4byte	.Ldebug_ranges0+0xcf0
-	.4byte	0x14e9d
+	.4byte	0x14f66
+	.uleb128 0x43
+	.4byte	.LASF3130
+	.byte	0x1
+	.2byte	0x280
+	.4byte	0x110
+	.uleb128 0x56
+	.4byte	.LASF3144
+	.byte	0x1
+	.2byte	0x280
+	.4byte	0x110
+	.4byte	.LLST185
+	.uleb128 0x43
+	.4byte	.LASF2953
+	.byte	0x1
+	.2byte	0x280
+	.4byte	0x110
+	.uleb128 0x43
+	.4byte	.LASF3131
+	.byte	0x1
+	.2byte	0x280
+	.4byte	0x13f
+	.uleb128 0x43
+	.4byte	.LASF2826
+	.byte	0x1
+	.2byte	0x280
+	.4byte	0xbfee
+	.byte	0
+	.uleb128 0x68
+	.4byte	.Ldebug_ranges0+0xd30
+	.4byte	0x14fb0
+	.uleb128 0x43
+	.4byte	.LASF3130
+	.byte	0x1
+	.2byte	0x281
+	.4byte	0x110
+	.uleb128 0x56
+	.4byte	.LASF3144
+	.byte	0x1
+	.2byte	0x281
+	.4byte	0x110
+	.4byte	.LLST186
+	.uleb128 0x43
+	.4byte	.LASF2953
+	.byte	0x1
+	.2byte	0x281
+	.4byte	0x110
+	.uleb128 0x43
+	.4byte	.LASF3131
+	.byte	0x1
+	.2byte	0x281
+	.4byte	0x13f
+	.uleb128 0x43
+	.4byte	.LASF2826
+	.byte	0x1
+	.2byte	0x281
+	.4byte	0xbfee
+	.byte	0
+	.uleb128 0x68
+	.4byte	.Ldebug_ranges0+0xd60
+	.4byte	0x14ffa
+	.uleb128 0x43
+	.4byte	.LASF3130
+	.byte	0x1
+	.2byte	0x282
+	.4byte	0x110
+	.uleb128 0x56
+	.4byte	.LASF3144
+	.byte	0x1
+	.2byte	0x282
+	.4byte	0x110
+	.4byte	.LLST187
+	.uleb128 0x43
+	.4byte	.LASF2953
+	.byte	0x1
+	.2byte	0x282
+	.4byte	0x110
+	.uleb128 0x43
+	.4byte	.LASF3131
+	.byte	0x1
+	.2byte	0x282
+	.4byte	0x13f
+	.uleb128 0x43
+	.4byte	.LASF2826
+	.byte	0x1
+	.2byte	0x282
+	.4byte	0xbfee
+	.byte	0
+	.uleb128 0x68
+	.4byte	.Ldebug_ranges0+0xd90
+	.4byte	0x15044
+	.uleb128 0x43
+	.4byte	.LASF3130
+	.byte	0x1
+	.2byte	0x283
+	.4byte	0x110
+	.uleb128 0x56
+	.4byte	.LASF3144
+	.byte	0x1
+	.2byte	0x283
+	.4byte	0x110
+	.4byte	.LLST188
+	.uleb128 0x43
+	.4byte	.LASF2953
+	.byte	0x1
+	.2byte	0x283
+	.4byte	0x110
+	.uleb128 0x43
+	.4byte	.LASF3131
+	.byte	0x1
+	.2byte	0x283
+	.4byte	0x13f
+	.uleb128 0x43
+	.4byte	.LASF2826
+	.byte	0x1
+	.2byte	0x283
+	.4byte	0xbfee
+	.byte	0
+	.uleb128 0x68
+	.4byte	.Ldebug_ranges0+0xdc0
+	.4byte	0x1508e
+	.uleb128 0x43
+	.4byte	.LASF3130
+	.byte	0x1
+	.2byte	0x286
+	.4byte	0x110
+	.uleb128 0x56
+	.4byte	.LASF3144
+	.byte	0x1
+	.2byte	0x286
+	.4byte	0x110
+	.4byte	.LLST189
+	.uleb128 0x43
+	.4byte	.LASF2953
+	.byte	0x1
+	.2byte	0x286
+	.4byte	0x110
+	.uleb128 0x43
+	.4byte	.LASF3131
+	.byte	0x1
+	.2byte	0x286
+	.4byte	0x13f
+	.uleb128 0x43
+	.4byte	.LASF2826
+	.byte	0x1
+	.2byte	0x286
+	.4byte	0xbfee
+	.byte	0
+	.uleb128 0x68
+	.4byte	.Ldebug_ranges0+0xdf0
+	.4byte	0x150d8
 	.uleb128 0x43
 	.4byte	.LASF3130
 	.byte	0x1
@@ -53843,7 +54138,7 @@
 	.byte	0x1
 	.2byte	0x287
 	.4byte	0x110
-	.4byte	.LLST181
+	.4byte	.LLST190
 	.uleb128 0x43
 	.4byte	.LASF2953
 	.byte	0x1
@@ -53860,9 +54155,9 @@
 	.2byte	0x287
 	.4byte	0xbfee
 	.byte	0
-	.uleb128 0x6c
-	.4byte	.Ldebug_ranges0+0xd20
-	.4byte	0x14ee7
+	.uleb128 0x68
+	.4byte	.Ldebug_ranges0+0xe20
+	.4byte	0x15122
 	.uleb128 0x43
 	.4byte	.LASF3130
 	.byte	0x1
@@ -53873,7 +54168,7 @@
 	.byte	0x1
 	.2byte	0x288
 	.4byte	0x110
-	.4byte	.LLST182
+	.4byte	.LLST191
 	.uleb128 0x43
 	.4byte	.LASF2953
 	.byte	0x1
@@ -53888,540 +54183,518 @@
 	.4byte	.LASF2826
 	.byte	0x1
 	.2byte	0x288
-	.4byte	0xbfee
-	.byte	0
-	.uleb128 0x6c
-	.4byte	.Ldebug_ranges0+0xd50
-	.4byte	0x14f31
-	.uleb128 0x43
-	.4byte	.LASF3130
-	.byte	0x1
-	.2byte	0x289
-	.4byte	0x110
-	.uleb128 0x56
-	.4byte	.LASF3144
-	.byte	0x1
-	.2byte	0x289
-	.4byte	0x110
-	.4byte	.LLST183
-	.uleb128 0x43
-	.4byte	.LASF2953
-	.byte	0x1
-	.2byte	0x289
-	.4byte	0x110
-	.uleb128 0x43
-	.4byte	.LASF3131
-	.byte	0x1
-	.2byte	0x289
-	.4byte	0x13f
-	.uleb128 0x43
-	.4byte	.LASF2826
-	.byte	0x1
-	.2byte	0x289
 	.4byte	0xbfee
 	.byte	0
 	.uleb128 0x5b
-	.4byte	.Ldebug_ranges0+0xd80
+	.4byte	.Ldebug_ranges0+0xe50
 	.uleb128 0x43
 	.4byte	.LASF3130
 	.byte	0x1
-	.2byte	0x28a
+	.2byte	0x289
 	.4byte	0x110
 	.uleb128 0x56
 	.4byte	.LASF3144
 	.byte	0x1
-	.2byte	0x28a
+	.2byte	0x289
 	.4byte	0x110
-	.4byte	.LLST184
+	.4byte	.LLST192
 	.uleb128 0x43
 	.4byte	.LASF2953
 	.byte	0x1
-	.2byte	0x28a
+	.2byte	0x289
 	.4byte	0x110
 	.uleb128 0x43
 	.4byte	.LASF3131
 	.byte	0x1
-	.2byte	0x28a
+	.2byte	0x289
 	.4byte	0x13f
 	.uleb128 0x43
 	.4byte	.LASF2826
 	.byte	0x1
-	.2byte	0x28a
+	.2byte	0x289
 	.4byte	0xbfee
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x4b
-	.8byte	.LVL560
-	.4byte	0x16a0b
+	.8byte	.LVL557
+	.4byte	0x16bfc
 	.uleb128 0x4b
-	.8byte	.LVL630
-	.4byte	0x16a0b
+	.8byte	.LVL627
+	.4byte	0x16bfc
 	.byte	0
 	.uleb128 0x72
 	.4byte	.LASF3155
 	.byte	0x1
-	.2byte	0x216
+	.2byte	0x215
 	.8byte	.LFB2819
 	.8byte	.LFE2819-.LFB2819
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x1505b
+	.4byte	0x1524c
 	.uleb128 0x71
 	.4byte	.LASF3150
 	.byte	0x1
-	.2byte	0x216
+	.2byte	0x215
 	.4byte	0xac0
 	.uleb128 0x1
 	.byte	0x50
 	.uleb128 0x71
 	.4byte	.LASF3151
 	.byte	0x1
-	.2byte	0x216
+	.2byte	0x215
 	.4byte	0xac0
 	.uleb128 0x1
 	.byte	0x51
 	.uleb128 0x71
 	.4byte	.LASF3127
 	.byte	0x1
-	.2byte	0x216
+	.2byte	0x215
 	.4byte	0x45aa
 	.uleb128 0x1
 	.byte	0x52
 	.uleb128 0x55
 	.4byte	.LASF2943
 	.byte	0x1
-	.2byte	0x216
-	.4byte	0xe82d
-	.4byte	.LLST344
+	.2byte	0x215
+	.4byte	0xe81f
+	.4byte	.LLST352
 	.uleb128 0x49
 	.4byte	.LASF2870
 	.byte	0x1
-	.2byte	0x218
+	.2byte	0x217
 	.4byte	0xc6
 	.uleb128 0x1
 	.byte	0x5f
 	.uleb128 0x49
 	.4byte	.LASF262
 	.byte	0x1
-	.2byte	0x218
+	.2byte	0x217
 	.4byte	0xc6
 	.uleb128 0x1
 	.byte	0x5a
 	.uleb128 0x43
 	.4byte	.LASF3152
 	.byte	0x1
-	.2byte	0x219
+	.2byte	0x218
 	.4byte	0x13f
 	.uleb128 0x56
 	.4byte	.LASF3153
 	.byte	0x1
-	.2byte	0x219
+	.2byte	0x218
 	.4byte	0x13f
-	.4byte	.LLST345
+	.4byte	.LLST353
 	.uleb128 0x56
 	.4byte	.LASF3130
 	.byte	0x1
-	.2byte	0x21a
+	.2byte	0x219
 	.4byte	0x15a
-	.4byte	.LLST346
+	.4byte	.LLST354
 	.uleb128 0x66
 	.string	"i"
 	.byte	0x1
-	.2byte	0x21b
+	.2byte	0x21a
 	.4byte	0xc6
 	.uleb128 0x1
 	.byte	0x5c
 	.uleb128 0x4f
 	.string	"j"
 	.byte	0x1
-	.2byte	0x21b
+	.2byte	0x21a
 	.4byte	0xc6
 	.uleb128 0x56
 	.4byte	.LASF3154
 	.byte	0x1
-	.2byte	0x21c
+	.2byte	0x21b
 	.4byte	0x13f
-	.4byte	.LLST347
+	.4byte	.LLST355
 	.byte	0
 	.uleb128 0x72
 	.4byte	.LASF3156
 	.byte	0x1
-	.2byte	0x1e5
+	.2byte	0x1e4
 	.8byte	.LFB2818
 	.8byte	.LFE2818-.LFB2818
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x152f6
+	.4byte	0x154e7
 	.uleb128 0x71
 	.4byte	.LASF3150
 	.byte	0x1
-	.2byte	0x1e5
+	.2byte	0x1e4
 	.4byte	0xac0
 	.uleb128 0x1
 	.byte	0x50
 	.uleb128 0x71
 	.4byte	.LASF3157
 	.byte	0x1
-	.2byte	0x1e5
+	.2byte	0x1e4
 	.4byte	0xac0
 	.uleb128 0x1
 	.byte	0x51
 	.uleb128 0x71
 	.4byte	.LASF3151
 	.byte	0x1
-	.2byte	0x1e5
+	.2byte	0x1e4
 	.4byte	0xac0
 	.uleb128 0x1
 	.byte	0x52
 	.uleb128 0x71
 	.4byte	.LASF3127
 	.byte	0x1
-	.2byte	0x1e5
+	.2byte	0x1e4
 	.4byte	0x45aa
 	.uleb128 0x1
 	.byte	0x53
 	.uleb128 0x71
 	.4byte	.LASF3136
 	.byte	0x1
-	.2byte	0x1e5
+	.2byte	0x1e4
 	.4byte	0x45aa
 	.uleb128 0x1
 	.byte	0x54
 	.uleb128 0x55
 	.4byte	.LASF2943
 	.byte	0x1
-	.2byte	0x1e5
-	.4byte	0xe82d
-	.4byte	.LLST323
+	.2byte	0x1e4
+	.4byte	0xe81f
+	.4byte	.LLST331
 	.uleb128 0x49
 	.4byte	.LASF2870
 	.byte	0x1
-	.2byte	0x1e7
+	.2byte	0x1e6
 	.4byte	0xc6
 	.uleb128 0x1
 	.byte	0x62
 	.uleb128 0x56
 	.4byte	.LASF262
 	.byte	0x1
-	.2byte	0x1e7
+	.2byte	0x1e6
 	.4byte	0xc6
-	.4byte	.LLST324
+	.4byte	.LLST332
 	.uleb128 0x43
 	.4byte	.LASF3152
 	.byte	0x1
-	.2byte	0x1e8
+	.2byte	0x1e7
 	.4byte	0x13f
 	.uleb128 0x56
 	.4byte	.LASF3158
 	.byte	0x1
-	.2byte	0x1e8
+	.2byte	0x1e7
 	.4byte	0x13f
-	.4byte	.LLST325
+	.4byte	.LLST333
 	.uleb128 0x56
 	.4byte	.LASF3153
 	.byte	0x1
-	.2byte	0x1e8
+	.2byte	0x1e7
 	.4byte	0x13f
-	.4byte	.LLST326
+	.4byte	.LLST334
 	.uleb128 0x56
 	.4byte	.LASF3130
 	.byte	0x1
-	.2byte	0x1e9
+	.2byte	0x1e8
 	.4byte	0x15a
-	.4byte	.LLST327
+	.4byte	.LLST335
 	.uleb128 0x43
 	.4byte	.LASF3144
 	.byte	0x1
-	.2byte	0x1ea
+	.2byte	0x1e9
 	.4byte	0x15a
 	.uleb128 0x57
 	.string	"i"
 	.byte	0x1
-	.2byte	0x1eb
+	.2byte	0x1ea
 	.4byte	0xc6
-	.4byte	.LLST328
+	.4byte	.LLST336
 	.uleb128 0x4f
 	.string	"j"
 	.byte	0x1
-	.2byte	0x1eb
+	.2byte	0x1ea
 	.4byte	0xc6
 	.uleb128 0x49
 	.4byte	.LASF3154
 	.byte	0x1
-	.2byte	0x1ec
+	.2byte	0x1eb
 	.4byte	0x13f
 	.uleb128 0x1
 	.byte	0x55
-	.uleb128 0x6c
-	.4byte	.Ldebug_ranges0+0x1730
-	.4byte	0x15173
+	.uleb128 0x68
+	.4byte	.Ldebug_ranges0+0x17c0
+	.4byte	0x15364
 	.uleb128 0x49
 	.4byte	.LASF3159
 	.byte	0x1
-	.2byte	0x1fb
+	.2byte	0x1fa
 	.4byte	0x13f
 	.uleb128 0x1
 	.byte	0x55
 	.byte	0
-	.uleb128 0x6c
-	.4byte	.Ldebug_ranges0+0x17a0
-	.4byte	0x1518d
+	.uleb128 0x68
+	.4byte	.Ldebug_ranges0+0x1830
+	.4byte	0x1537e
+	.uleb128 0x56
+	.4byte	.LASF3159
+	.byte	0x1
+	.2byte	0x1fb
+	.4byte	0x13f
+	.4byte	.LLST339
+	.byte	0
+	.uleb128 0x68
+	.4byte	.Ldebug_ranges0+0x18b0
+	.4byte	0x15398
 	.uleb128 0x56
 	.4byte	.LASF3159
 	.byte	0x1
 	.2byte	0x1fc
 	.4byte	0x13f
-	.4byte	.LLST331
+	.4byte	.LLST340
 	.byte	0
-	.uleb128 0x6c
-	.4byte	.Ldebug_ranges0+0x1820
-	.4byte	0x151a7
+	.uleb128 0x68
+	.4byte	.Ldebug_ranges0+0x1920
+	.4byte	0x153b2
 	.uleb128 0x56
 	.4byte	.LASF3159
 	.byte	0x1
 	.2byte	0x1fd
 	.4byte	0x13f
-	.4byte	.LLST332
+	.4byte	.LLST341
 	.byte	0
-	.uleb128 0x6c
-	.4byte	.Ldebug_ranges0+0x1890
-	.4byte	0x151c1
+	.uleb128 0x68
+	.4byte	.Ldebug_ranges0+0x1980
+	.4byte	0x153cc
 	.uleb128 0x56
 	.4byte	.LASF3159
 	.byte	0x1
 	.2byte	0x1fe
 	.4byte	0x13f
-	.4byte	.LLST333
+	.4byte	.LLST342
 	.byte	0
-	.uleb128 0x6c
-	.4byte	.Ldebug_ranges0+0x18f0
-	.4byte	0x151db
+	.uleb128 0x68
+	.4byte	.Ldebug_ranges0+0x19d0
+	.4byte	0x153e6
 	.uleb128 0x56
 	.4byte	.LASF3159
 	.byte	0x1
 	.2byte	0x1ff
 	.4byte	0x13f
-	.4byte	.LLST334
+	.4byte	.LLST343
 	.byte	0
-	.uleb128 0x6c
-	.4byte	.Ldebug_ranges0+0x1940
-	.4byte	0x151f5
+	.uleb128 0x68
+	.4byte	.Ldebug_ranges0+0x1720
+	.4byte	0x15400
 	.uleb128 0x56
 	.4byte	.LASF3159
 	.byte	0x1
 	.2byte	0x200
 	.4byte	0x13f
-	.4byte	.LLST335
+	.4byte	.LLST337
 	.byte	0
-	.uleb128 0x6c
-	.4byte	.Ldebug_ranges0+0x1690
-	.4byte	0x1520f
+	.uleb128 0x68
+	.4byte	.Ldebug_ranges0+0x1790
+	.4byte	0x1541a
 	.uleb128 0x56
 	.4byte	.LASF3159
 	.byte	0x1
 	.2byte	0x201
 	.4byte	0x13f
-	.4byte	.LLST329
+	.4byte	.LLST338
 	.byte	0
-	.uleb128 0x6c
-	.4byte	.Ldebug_ranges0+0x1700
-	.4byte	0x15229
+	.uleb128 0x68
+	.4byte	.Ldebug_ranges0+0x1a90
+	.4byte	0x15434
 	.uleb128 0x56
 	.4byte	.LASF3159
 	.byte	0x1
-	.2byte	0x202
+	.2byte	0x203
 	.4byte	0x13f
-	.4byte	.LLST330
+	.4byte	.LLST345
 	.byte	0
-	.uleb128 0x6c
-	.4byte	.Ldebug_ranges0+0x1a00
-	.4byte	0x15243
+	.uleb128 0x68
+	.4byte	.Ldebug_ranges0+0x1b00
+	.4byte	0x1544e
 	.uleb128 0x56
 	.4byte	.LASF3159
 	.byte	0x1
 	.2byte	0x204
 	.4byte	0x13f
-	.4byte	.LLST337
+	.4byte	.LLST346
 	.byte	0
-	.uleb128 0x6c
-	.4byte	.Ldebug_ranges0+0x1a70
-	.4byte	0x1525d
+	.uleb128 0x68
+	.4byte	.Ldebug_ranges0+0x1b60
+	.4byte	0x15468
 	.uleb128 0x56
 	.4byte	.LASF3159
 	.byte	0x1
 	.2byte	0x205
 	.4byte	0x13f
-	.4byte	.LLST338
+	.4byte	.LLST347
 	.byte	0
-	.uleb128 0x6c
-	.4byte	.Ldebug_ranges0+0x1ad0
-	.4byte	0x15277
+	.uleb128 0x68
+	.4byte	.Ldebug_ranges0+0x1bc0
+	.4byte	0x15482
 	.uleb128 0x56
 	.4byte	.LASF3159
 	.byte	0x1
 	.2byte	0x206
 	.4byte	0x13f
-	.4byte	.LLST339
+	.4byte	.LLST348
 	.byte	0
-	.uleb128 0x6c
-	.4byte	.Ldebug_ranges0+0x1b30
-	.4byte	0x15291
+	.uleb128 0x68
+	.4byte	.Ldebug_ranges0+0x1c10
+	.4byte	0x1549c
 	.uleb128 0x56
 	.4byte	.LASF3159
 	.byte	0x1
 	.2byte	0x207
 	.4byte	0x13f
-	.4byte	.LLST340
+	.4byte	.LLST349
 	.byte	0
-	.uleb128 0x6c
-	.4byte	.Ldebug_ranges0+0x1b80
-	.4byte	0x152ab
+	.uleb128 0x68
+	.4byte	.Ldebug_ranges0+0x1c70
+	.4byte	0x154b6
 	.uleb128 0x56
 	.4byte	.LASF3159
 	.byte	0x1
 	.2byte	0x208
 	.4byte	0x13f
-	.4byte	.LLST341
+	.4byte	.LLST350
 	.byte	0
-	.uleb128 0x6c
-	.4byte	.Ldebug_ranges0+0x1be0
-	.4byte	0x152c5
+	.uleb128 0x68
+	.4byte	.Ldebug_ranges0+0x1cd0
+	.4byte	0x154d0
 	.uleb128 0x56
 	.4byte	.LASF3159
 	.byte	0x1
 	.2byte	0x209
 	.4byte	0x13f
-	.4byte	.LLST342
+	.4byte	.LLST351
 	.byte	0
-	.uleb128 0x6c
-	.4byte	.Ldebug_ranges0+0x1c40
-	.4byte	0x152df
+	.uleb128 0x5b
+	.4byte	.Ldebug_ranges0+0x1a20
 	.uleb128 0x56
 	.4byte	.LASF3159
 	.byte	0x1
 	.2byte	0x20a
 	.4byte	0x13f
-	.4byte	.LLST343
-	.byte	0
-	.uleb128 0x5b
-	.4byte	.Ldebug_ranges0+0x1990
-	.uleb128 0x56
-	.4byte	.LASF3159
-	.byte	0x1
-	.2byte	0x20b
-	.4byte	0x13f
-	.4byte	.LLST336
+	.4byte	.LLST344
 	.byte	0
 	.byte	0
 	.uleb128 0x63
 	.4byte	.LASF3160
 	.byte	0x1
-	.2byte	0x1a5
+	.2byte	0x1a4
 	.byte	0x1
-	.4byte	0x1547c
+	.4byte	0x1566d
 	.uleb128 0x62
 	.4byte	.LASF3150
 	.byte	0x1
-	.2byte	0x1a5
+	.2byte	0x1a4
 	.4byte	0xac0
 	.uleb128 0x62
 	.4byte	.LASF3157
 	.byte	0x1
-	.2byte	0x1a5
+	.2byte	0x1a4
 	.4byte	0xac0
 	.uleb128 0x62
 	.4byte	.LASF3151
 	.byte	0x1
-	.2byte	0x1a5
+	.2byte	0x1a4
 	.4byte	0xac0
 	.uleb128 0x62
 	.4byte	.LASF3127
 	.byte	0x1
-	.2byte	0x1a5
+	.2byte	0x1a4
 	.4byte	0x45aa
 	.uleb128 0x62
 	.4byte	.LASF3136
 	.byte	0x1
-	.2byte	0x1a5
+	.2byte	0x1a4
 	.4byte	0x45aa
 	.uleb128 0x62
 	.4byte	.LASF2943
 	.byte	0x1
-	.2byte	0x1a5
-	.4byte	0xe82d
+	.2byte	0x1a4
+	.4byte	0xe81f
 	.uleb128 0x43
 	.4byte	.LASF2870
 	.byte	0x1
-	.2byte	0x1a7
+	.2byte	0x1a6
 	.4byte	0xc6
 	.uleb128 0x43
 	.4byte	.LASF262
 	.byte	0x1
-	.2byte	0x1a7
+	.2byte	0x1a6
 	.4byte	0xc6
 	.uleb128 0x43
 	.4byte	.LASF3152
 	.byte	0x1
-	.2byte	0x1a8
+	.2byte	0x1a7
 	.4byte	0x13f
 	.uleb128 0x43
 	.4byte	.LASF3158
 	.byte	0x1
-	.2byte	0x1a8
+	.2byte	0x1a7
 	.4byte	0x13f
 	.uleb128 0x43
 	.4byte	.LASF3153
 	.byte	0x1
-	.2byte	0x1a8
+	.2byte	0x1a7
 	.4byte	0x13f
 	.uleb128 0x43
 	.4byte	.LASF3130
 	.byte	0x1
-	.2byte	0x1a9
+	.2byte	0x1a8
 	.4byte	0x15a
 	.uleb128 0x43
 	.4byte	.LASF3144
 	.byte	0x1
-	.2byte	0x1aa
+	.2byte	0x1a9
 	.4byte	0x15a
 	.uleb128 0x43
 	.4byte	.LASF3154
 	.byte	0x1
-	.2byte	0x1ab
+	.2byte	0x1aa
 	.4byte	0x13f
 	.uleb128 0x4f
 	.string	"i"
 	.byte	0x1
-	.2byte	0x1ac
+	.2byte	0x1ab
 	.4byte	0xc6
 	.uleb128 0x4f
 	.string	"j"
 	.byte	0x1
-	.2byte	0x1ad
+	.2byte	0x1ac
 	.4byte	0xc6
 	.uleb128 0x43
 	.4byte	.LASF2838
 	.byte	0x1
-	.2byte	0x1ae
+	.2byte	0x1ad
 	.4byte	0xc6
 	.uleb128 0x43
 	.4byte	.LASF2840
 	.byte	0x1
-	.2byte	0x1af
+	.2byte	0x1ae
 	.4byte	0xc6
 	.uleb128 0x43
 	.4byte	.LASF2839
 	.byte	0x1
-	.2byte	0x1b0
+	.2byte	0x1af
 	.4byte	0xc6
 	.uleb128 0x43
 	.4byte	.LASF2841
 	.byte	0x1
-	.2byte	0x1b1
+	.2byte	0x1b0
 	.4byte	0xc6
 	.uleb128 0x6f
-	.4byte	0x15401
+	.4byte	0x155f2
+	.uleb128 0x43
+	.4byte	.LASF3159
+	.byte	0x1
+	.2byte	0x1cd
+	.4byte	0x13f
+	.byte	0
+	.uleb128 0x6f
+	.4byte	0x15604
 	.uleb128 0x43
 	.4byte	.LASF3159
 	.byte	0x1
@@ -54429,7 +54702,7 @@
 	.4byte	0x13f
 	.byte	0
 	.uleb128 0x6f
-	.4byte	0x15413
+	.4byte	0x15616
 	.uleb128 0x43
 	.4byte	.LASF3159
 	.byte	0x1
@@ -54437,7 +54710,7 @@
 	.4byte	0x13f
 	.byte	0
 	.uleb128 0x6f
-	.4byte	0x15425
+	.4byte	0x15628
 	.uleb128 0x43
 	.4byte	.LASF3159
 	.byte	0x1
@@ -54445,7 +54718,7 @@
 	.4byte	0x13f
 	.byte	0
 	.uleb128 0x6f
-	.4byte	0x15437
+	.4byte	0x1563a
 	.uleb128 0x43
 	.4byte	.LASF3159
 	.byte	0x1
@@ -54453,7 +54726,7 @@
 	.4byte	0x13f
 	.byte	0
 	.uleb128 0x6f
-	.4byte	0x15449
+	.4byte	0x1564c
 	.uleb128 0x43
 	.4byte	.LASF3159
 	.byte	0x1
@@ -54461,218 +54734,210 @@
 	.4byte	0x13f
 	.byte	0
 	.uleb128 0x6f
-	.4byte	0x1545b
+	.4byte	0x1565e
 	.uleb128 0x43
 	.4byte	.LASF3159
 	.byte	0x1
 	.2byte	0x1d3
 	.4byte	0x13f
 	.byte	0
-	.uleb128 0x6f
-	.4byte	0x1546d
+	.uleb128 0x64
 	.uleb128 0x43
 	.4byte	.LASF3159
 	.byte	0x1
 	.2byte	0x1d4
 	.4byte	0x13f
 	.byte	0
-	.uleb128 0x64
-	.uleb128 0x43
-	.4byte	.LASF3159
-	.byte	0x1
-	.2byte	0x1d5
-	.4byte	0x13f
-	.byte	0
 	.byte	0
 	.uleb128 0x60
 	.4byte	.LASF3161
 	.byte	0x1
-	.2byte	0x186
+	.2byte	0x185
 	.4byte	0xc6
 	.byte	0x1
-	.4byte	0x154b2
+	.4byte	0x156a3
 	.uleb128 0x61
 	.string	"ebc"
 	.byte	0x1
-	.2byte	0x186
-	.4byte	0xe4e5
+	.2byte	0x185
+	.4byte	0xe4d7
 	.uleb128 0x62
 	.4byte	.LASF3162
 	.byte	0x1
-	.2byte	0x186
+	.2byte	0x185
 	.4byte	0xc6
 	.uleb128 0x43
 	.4byte	.LASF2943
 	.byte	0x1
-	.2byte	0x188
-	.4byte	0xe82d
+	.2byte	0x187
+	.4byte	0xe81f
 	.byte	0
 	.uleb128 0x60
 	.4byte	.LASF3163
 	.byte	0x1
-	.2byte	0x168
+	.2byte	0x167
 	.4byte	0x13f
 	.byte	0x3
-	.4byte	0x15500
+	.4byte	0x156f1
 	.uleb128 0x62
 	.4byte	.LASF2826
 	.byte	0x1
-	.2byte	0x168
+	.2byte	0x167
 	.4byte	0xbfee
 	.uleb128 0x62
 	.4byte	.LASF3118
 	.byte	0x1
-	.2byte	0x168
+	.2byte	0x167
 	.4byte	0x13f
 	.uleb128 0x62
 	.4byte	.LASF3119
 	.byte	0x1
-	.2byte	0x168
+	.2byte	0x167
 	.4byte	0x13f
 	.uleb128 0x43
 	.4byte	.LASF3164
 	.byte	0x1
-	.2byte	0x16a
+	.2byte	0x169
 	.4byte	0x13f
 	.uleb128 0x43
 	.4byte	.LASF3133
 	.byte	0x1
-	.2byte	0x16b
+	.2byte	0x16a
 	.4byte	0x13f
 	.byte	0
 	.uleb128 0x60
 	.4byte	.LASF3165
 	.byte	0x1
-	.2byte	0x14a
+	.2byte	0x149
 	.4byte	0x13f
 	.byte	0x3
-	.4byte	0x1554e
+	.4byte	0x1573f
 	.uleb128 0x62
 	.4byte	.LASF2826
 	.byte	0x1
-	.2byte	0x14a
+	.2byte	0x149
 	.4byte	0xbfee
 	.uleb128 0x62
 	.4byte	.LASF3118
 	.byte	0x1
-	.2byte	0x14a
+	.2byte	0x149
 	.4byte	0x13f
 	.uleb128 0x62
 	.4byte	.LASF3119
 	.byte	0x1
-	.2byte	0x14a
+	.2byte	0x149
 	.4byte	0x13f
 	.uleb128 0x43
 	.4byte	.LASF3164
 	.byte	0x1
-	.2byte	0x14c
+	.2byte	0x14b
 	.4byte	0x13f
 	.uleb128 0x43
 	.4byte	.LASF3133
 	.byte	0x1
-	.2byte	0x14d
+	.2byte	0x14c
 	.4byte	0x13f
 	.byte	0
 	.uleb128 0x60
 	.4byte	.LASF3166
 	.byte	0x1
-	.2byte	0x12c
+	.2byte	0x12b
 	.4byte	0x11f
 	.byte	0x3
-	.4byte	0x1559c
+	.4byte	0x1578d
 	.uleb128 0x62
 	.4byte	.LASF2826
 	.byte	0x1
-	.2byte	0x12c
+	.2byte	0x12b
 	.4byte	0xbfee
 	.uleb128 0x62
 	.4byte	.LASF3118
 	.byte	0x1
-	.2byte	0x12c
+	.2byte	0x12b
 	.4byte	0x13f
 	.uleb128 0x62
 	.4byte	.LASF3119
 	.byte	0x1
-	.2byte	0x12c
+	.2byte	0x12b
 	.4byte	0x13f
 	.uleb128 0x43
 	.4byte	.LASF3164
 	.byte	0x1
-	.2byte	0x12e
+	.2byte	0x12d
 	.4byte	0x11f
 	.uleb128 0x43
 	.4byte	.LASF3133
 	.byte	0x1
-	.2byte	0x12f
+	.2byte	0x12e
 	.4byte	0x13f
 	.byte	0
 	.uleb128 0x60
 	.4byte	.LASF3167
 	.byte	0x1
-	.2byte	0x120
+	.2byte	0x11f
 	.4byte	0x13f
 	.byte	0x3
-	.4byte	0x155d2
+	.4byte	0x157c3
 	.uleb128 0x62
 	.4byte	.LASF2826
 	.byte	0x1
-	.2byte	0x120
+	.2byte	0x11f
 	.4byte	0xbfee
 	.uleb128 0x62
 	.4byte	.LASF3118
 	.byte	0x1
-	.2byte	0x120
+	.2byte	0x11f
 	.4byte	0x13f
 	.uleb128 0x62
 	.4byte	.LASF3119
 	.byte	0x1
-	.2byte	0x120
+	.2byte	0x11f
 	.4byte	0x13f
 	.byte	0
 	.uleb128 0x60
 	.4byte	.LASF3168
 	.byte	0x1
-	.2byte	0x114
+	.2byte	0x113
 	.4byte	0x13f
 	.byte	0x3
-	.4byte	0x15608
+	.4byte	0x157f9
 	.uleb128 0x62
 	.4byte	.LASF2826
 	.byte	0x1
-	.2byte	0x114
+	.2byte	0x113
 	.4byte	0xbfee
 	.uleb128 0x62
 	.4byte	.LASF3118
 	.byte	0x1
-	.2byte	0x114
+	.2byte	0x113
 	.4byte	0x13f
 	.uleb128 0x62
 	.4byte	.LASF3119
 	.byte	0x1
-	.2byte	0x114
+	.2byte	0x113
 	.4byte	0x13f
 	.byte	0
 	.uleb128 0x60
 	.4byte	.LASF3169
 	.byte	0x1
-	.2byte	0x108
+	.2byte	0x107
 	.4byte	0x11f
 	.byte	0x3
-	.4byte	0x1563e
+	.4byte	0x1582f
 	.uleb128 0x62
 	.4byte	.LASF2826
 	.byte	0x1
-	.2byte	0x108
+	.2byte	0x107
 	.4byte	0xbfee
 	.uleb128 0x62
 	.4byte	.LASF3118
 	.byte	0x1
-	.2byte	0x108
+	.2byte	0x107
 	.4byte	0x13f
 	.uleb128 0x62
 	.4byte	.LASF3119
 	.byte	0x1
-	.2byte	0x108
+	.2byte	0x107
 	.4byte	0x13f
 	.byte	0
 	.uleb128 0x73
@@ -54680,7 +54945,7 @@
 	.byte	0xa
 	.byte	0x4a
 	.byte	0x3
-	.4byte	0x15661
+	.4byte	0x15852
 	.uleb128 0x74
 	.4byte	.LASF2906
 	.byte	0xa
@@ -54697,7 +54962,7 @@
 	.byte	0xa
 	.byte	0x3b
 	.byte	0x3
-	.4byte	0x1568f
+	.4byte	0x15880
 	.uleb128 0x74
 	.4byte	.LASF2906
 	.byte	0xa
@@ -54719,7 +54984,7 @@
 	.byte	0xa
 	.byte	0x35
 	.byte	0x3
-	.4byte	0x156d3
+	.4byte	0x158c4
 	.uleb128 0x74
 	.4byte	.LASF2906
 	.byte	0xa
@@ -54751,7 +55016,7 @@
 	.byte	0xa
 	.byte	0x30
 	.byte	0x3
-	.4byte	0x156eb
+	.4byte	0x158dc
 	.uleb128 0x74
 	.4byte	.LASF2906
 	.byte	0xa
@@ -54764,14 +55029,14 @@
 	.byte	0x2b
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x15712
+	.4byte	0x15903
 	.uleb128 0x74
 	.4byte	.LASF2906
 	.byte	0xa
 	.byte	0x2b
 	.4byte	0xe0a4
 	.uleb128 0x74
-	.4byte	.LASF2993
+	.4byte	.LASF2992
 	.byte	0xa
 	.byte	0x2b
 	.4byte	0xe0e4
@@ -54781,7 +55046,7 @@
 	.byte	0x9
 	.2byte	0x1ab
 	.byte	0x3
-	.4byte	0x1575c
+	.4byte	0x1594d
 	.uleb128 0x61
 	.string	"dev"
 	.byte	0x9
@@ -54814,7 +55079,7 @@
 	.2byte	0x108
 	.4byte	0xb6df
 	.byte	0x3
-	.4byte	0x1577a
+	.4byte	0x1596b
 	.uleb128 0x61
 	.string	"dev"
 	.byte	0x9
@@ -54827,7 +55092,7 @@
 	.byte	0x1d
 	.4byte	0xb6df
 	.byte	0x3
-	.4byte	0x15796
+	.4byte	0x15987
 	.uleb128 0x76
 	.string	"bus"
 	.byte	0xc7
@@ -54840,7 +55105,7 @@
 	.byte	0xd1
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x157b2
+	.4byte	0x159a3
 	.uleb128 0x74
 	.4byte	.LASF3185
 	.byte	0x9
@@ -54852,7 +55117,7 @@
 	.byte	0xca
 	.byte	0xa3
 	.byte	0x3
-	.4byte	0x157eb
+	.4byte	0x159dc
 	.uleb128 0x76
 	.string	"dev"
 	.byte	0xca
@@ -54880,7 +55145,7 @@
 	.byte	0x35
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x15807
+	.4byte	0x159f8
 	.uleb128 0x74
 	.4byte	.LASF2907
 	.byte	0x3
@@ -54893,7 +55158,7 @@
 	.byte	0x30
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x1582c
+	.4byte	0x15a1d
 	.uleb128 0x74
 	.4byte	.LASF2907
 	.byte	0x3
@@ -54910,7 +55175,7 @@
 	.byte	0x3
 	.byte	0x2b
 	.byte	0x3
-	.4byte	0x15844
+	.4byte	0x15a35
 	.uleb128 0x74
 	.4byte	.LASF2907
 	.byte	0x3
@@ -54922,7 +55187,7 @@
 	.byte	0x3
 	.byte	0x26
 	.byte	0x3
-	.4byte	0x1585c
+	.4byte	0x15a4d
 	.uleb128 0x74
 	.4byte	.LASF2907
 	.byte	0x3
@@ -54934,7 +55199,7 @@
 	.byte	0x3
 	.byte	0x21
 	.byte	0x3
-	.4byte	0x15874
+	.4byte	0x15a65
 	.uleb128 0x74
 	.4byte	.LASF2907
 	.byte	0x3
@@ -54946,7 +55211,7 @@
 	.byte	0x3
 	.byte	0x1c
 	.byte	0x3
-	.4byte	0x1588c
+	.4byte	0x15a7d
 	.uleb128 0x74
 	.4byte	.LASF2907
 	.byte	0x3
@@ -54958,12 +55223,12 @@
 	.byte	0xb
 	.byte	0x42
 	.byte	0x3
-	.4byte	0x158a4
+	.4byte	0x15a95
 	.uleb128 0x74
 	.4byte	.LASF116
 	.byte	0xb
 	.byte	0x42
-	.4byte	0x158a4
+	.4byte	0x15a95
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
@@ -54973,24 +55238,24 @@
 	.byte	0xb
 	.byte	0x38
 	.byte	0x3
-	.4byte	0x158c2
+	.4byte	0x15ab3
 	.uleb128 0x74
 	.4byte	.LASF116
 	.byte	0xb
 	.byte	0x38
-	.4byte	0x158a4
+	.4byte	0x15a95
 	.byte	0
 	.uleb128 0x73
 	.4byte	.LASF3196
 	.byte	0xb
 	.byte	0x24
 	.byte	0x3
-	.4byte	0x158fa
+	.4byte	0x15aeb
 	.uleb128 0x74
 	.4byte	.LASF116
 	.byte	0xb
 	.byte	0x24
-	.4byte	0x158a4
+	.4byte	0x15a95
 	.uleb128 0x74
 	.4byte	.LASF193
 	.byte	0xb
@@ -55009,98 +55274,98 @@
 	.byte	0
 	.uleb128 0x75
 	.4byte	.LASF3197
-	.byte	0x7
+	.byte	0x8
 	.byte	0x98
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x15929
+	.4byte	0x15b1a
 	.uleb128 0x76
 	.string	"to"
-	.byte	0x7
+	.byte	0x8
 	.byte	0x98
 	.4byte	0x458
 	.uleb128 0x74
 	.4byte	.LASF1973
-	.byte	0x7
+	.byte	0x8
 	.byte	0x98
 	.4byte	0x30b6
 	.uleb128 0x76
 	.string	"n"
-	.byte	0x7
+	.byte	0x8
 	.byte	0x98
 	.4byte	0x29
 	.byte	0
 	.uleb128 0x75
 	.4byte	.LASF3198
-	.byte	0x7
+	.byte	0x8
 	.byte	0x90
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x15958
+	.4byte	0x15b49
 	.uleb128 0x76
 	.string	"to"
-	.byte	0x7
+	.byte	0x8
 	.byte	0x90
 	.4byte	0x458
 	.uleb128 0x74
 	.4byte	.LASF1973
-	.byte	0x7
+	.byte	0x8
 	.byte	0x90
 	.4byte	0x30b6
 	.uleb128 0x76
 	.string	"n"
-	.byte	0x7
+	.byte	0x8
 	.byte	0x90
 	.4byte	0x29
 	.byte	0
 	.uleb128 0x75
 	.4byte	.LASF3199
-	.byte	0x7
+	.byte	0x8
 	.byte	0x81
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x15987
+	.4byte	0x15b78
 	.uleb128 0x76
 	.string	"to"
-	.byte	0x7
+	.byte	0x8
 	.byte	0x81
 	.4byte	0x458
 	.uleb128 0x74
 	.4byte	.LASF1973
-	.byte	0x7
+	.byte	0x8
 	.byte	0x81
 	.4byte	0x30b6
 	.uleb128 0x76
 	.string	"n"
-	.byte	0x7
+	.byte	0x8
 	.byte	0x81
 	.4byte	0x29
 	.byte	0
 	.uleb128 0x75
 	.4byte	.LASF3200
-	.byte	0x7
+	.byte	0x8
 	.byte	0x6e
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x159c1
+	.4byte	0x15bb2
 	.uleb128 0x76
 	.string	"to"
-	.byte	0x7
+	.byte	0x8
 	.byte	0x6e
 	.4byte	0x458
 	.uleb128 0x74
 	.4byte	.LASF1973
-	.byte	0x7
+	.byte	0x8
 	.byte	0x6e
 	.4byte	0x30b6
 	.uleb128 0x76
 	.string	"n"
-	.byte	0x7
+	.byte	0x8
 	.byte	0x6e
 	.4byte	0x29
 	.uleb128 0x77
 	.string	"res"
-	.byte	0x7
+	.byte	0x8
 	.byte	0x70
 	.4byte	0x29
 	.byte	0
@@ -55110,7 +55375,7 @@
 	.byte	0xf5
 	.4byte	0x458
 	.byte	0x3
-	.4byte	0x159f5
+	.4byte	0x15be6
 	.uleb128 0x76
 	.string	"ptr"
 	.byte	0x5
@@ -55135,7 +55400,7 @@
 	.byte	0x4b
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x15a3f
+	.4byte	0x15c30
 	.uleb128 0x74
 	.4byte	.LASF1118
 	.byte	0x5
@@ -55170,7 +55435,7 @@
 	.2byte	0x2e5
 	.4byte	0x458
 	.byte	0x3
-	.4byte	0x15a69
+	.4byte	0x15c5a
 	.uleb128 0x62
 	.4byte	.LASF957
 	.byte	0x10
@@ -55188,7 +55453,7 @@
 	.2byte	0x216
 	.4byte	0x458
 	.byte	0x3
-	.4byte	0x15aa1
+	.4byte	0x15c92
 	.uleb128 0x62
 	.4byte	.LASF957
 	.byte	0x10
@@ -55213,7 +55478,7 @@
 	.2byte	0x1dd
 	.4byte	0x458
 	.byte	0x3
-	.4byte	0x15ad7
+	.4byte	0x15cc8
 	.uleb128 0x62
 	.4byte	.LASF957
 	.byte	0x10
@@ -55236,7 +55501,7 @@
 	.2byte	0x159
 	.4byte	0x6d
 	.byte	0x3
-	.4byte	0x15af5
+	.4byte	0x15ce6
 	.uleb128 0x62
 	.4byte	.LASF957
 	.byte	0x10
@@ -55249,7 +55514,7 @@
 	.2byte	0x13d
 	.4byte	0xd6c9
 	.byte	0x3
-	.4byte	0x15b13
+	.4byte	0x15d04
 	.uleb128 0x62
 	.4byte	.LASF171
 	.byte	0x10
@@ -55259,32 +55524,32 @@
 	.uleb128 0x73
 	.4byte	.LASF3212
 	.byte	0xbd
-	.byte	0xdb
+	.byte	0xde
 	.byte	0x3
-	.4byte	0x15b36
+	.4byte	0x15d27
 	.uleb128 0x74
-	.4byte	.LASF3027
+	.4byte	.LASF3026
 	.byte	0xbd
-	.byte	0xdb
+	.byte	0xde
 	.4byte	0xd640
 	.uleb128 0x74
 	.4byte	.LASF793
 	.byte	0xbd
-	.byte	0xdc
+	.byte	0xdf
 	.4byte	0x458
 	.byte	0
 	.uleb128 0x75
 	.4byte	.LASF3213
 	.byte	0xbd
-	.byte	0xd6
+	.byte	0xd9
 	.4byte	0x458
 	.byte	0x3
-	.4byte	0x15b52
+	.4byte	0x15d43
 	.uleb128 0x74
-	.4byte	.LASF3027
+	.4byte	.LASF3026
 	.byte	0xbd
-	.byte	0xd6
-	.4byte	0x15b52
+	.byte	0xd9
+	.4byte	0x15d43
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
@@ -55295,12 +55560,12 @@
 	.2byte	0x164
 	.4byte	0x458
 	.byte	0x3
-	.4byte	0x15b76
+	.4byte	0x15d67
 	.uleb128 0x61
 	.string	"dev"
 	.byte	0xa1
 	.2byte	0x164
-	.4byte	0x15b76
+	.4byte	0x15d67
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
@@ -55311,7 +55576,7 @@
 	.2byte	0x498
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x15bb1
+	.4byte	0x15da2
 	.uleb128 0x61
 	.string	"np"
 	.byte	0xd
@@ -55334,7 +55599,7 @@
 	.2byte	0x1ef
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x15bfd
+	.4byte	0x15dee
 	.uleb128 0x61
 	.string	"np"
 	.byte	0xd
@@ -55366,7 +55631,7 @@
 	.byte	0xd
 	.byte	0x83
 	.byte	0x3
-	.4byte	0x15c15
+	.4byte	0x15e06
 	.uleb128 0x74
 	.4byte	.LASF838
 	.byte	0xd
@@ -55378,7 +55643,7 @@
 	.byte	0x2
 	.2byte	0x4a0
 	.byte	0x3
-	.4byte	0x15c3b
+	.4byte	0x15e2c
 	.uleb128 0x61
 	.string	"dev"
 	.byte	0x2
@@ -55396,7 +55661,7 @@
 	.2byte	0x49b
 	.4byte	0x458
 	.byte	0x3
-	.4byte	0x15c59
+	.4byte	0x15e4a
 	.uleb128 0x61
 	.string	"dev"
 	.byte	0x2
@@ -55409,7 +55674,7 @@
 	.2byte	0x2c5
 	.4byte	0x458
 	.byte	0x3
-	.4byte	0x15c8f
+	.4byte	0x15e80
 	.uleb128 0x61
 	.string	"dev"
 	.byte	0x2
@@ -55432,7 +55697,7 @@
 	.byte	0xca
 	.4byte	0x351
 	.byte	0x3
-	.4byte	0x15cab
+	.4byte	0x15e9c
 	.uleb128 0x76
 	.string	"res"
 	.byte	0xe
@@ -55445,7 +55710,7 @@
 	.byte	0x22
 	.4byte	0x2b0
 	.byte	0x3
-	.4byte	0x15cc7
+	.4byte	0x15eb8
 	.uleb128 0x76
 	.string	"ptr"
 	.byte	0xcb
@@ -55458,7 +55723,7 @@
 	.byte	0x1d
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x15ce3
+	.4byte	0x15ed4
 	.uleb128 0x74
 	.4byte	.LASF957
 	.byte	0xcc
@@ -55471,7 +55736,7 @@
 	.2byte	0x169
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x15cff
+	.4byte	0x15ef0
 	.uleb128 0x61
 	.string	"m"
 	.byte	0x11
@@ -55484,7 +55749,7 @@
 	.2byte	0x148
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x15d1b
+	.4byte	0x15f0c
 	.uleb128 0x61
 	.string	"m"
 	.byte	0x11
@@ -55497,7 +55762,7 @@
 	.byte	0x97
 	.4byte	0x2b0
 	.byte	0x3
-	.4byte	0x15d57
+	.4byte	0x15f48
 	.uleb128 0x74
 	.4byte	.LASF1118
 	.byte	0xc9
@@ -55524,7 +55789,7 @@
 	.byte	0xc9
 	.byte	0x91
 	.byte	0x3
-	.4byte	0x15d87
+	.4byte	0x15f78
 	.uleb128 0x74
 	.4byte	.LASF957
 	.byte	0xc9
@@ -55548,7 +55813,7 @@
 	.byte	0xc9
 	.byte	0x80
 	.byte	0x3
-	.4byte	0x15db3
+	.4byte	0x15fa4
 	.uleb128 0x76
 	.string	"ptr"
 	.byte	0xc9
@@ -55571,12 +55836,12 @@
 	.byte	0x5f
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x15dd9
+	.4byte	0x15fca
 	.uleb128 0x76
 	.string	"ti"
 	.byte	0xc9
 	.byte	0x5f
-	.4byte	0x15dd9
+	.4byte	0x15fca
 	.uleb128 0x74
 	.4byte	.LASF3237
 	.byte	0xc9
@@ -55592,7 +55857,7 @@
 	.byte	0xf
 	.4byte	0x2eff
 	.byte	0x3
-	.4byte	0x15dfb
+	.4byte	0x15fec
 	.uleb128 0x78
 	.4byte	.LASF3239
 	.byte	0x4
@@ -55610,7 +55875,7 @@
 	.byte	0x22
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x15e1e
+	.4byte	0x1600f
 	.uleb128 0x76
 	.string	"n"
 	.byte	0xcd
@@ -55619,24 +55884,24 @@
 	.byte	0
 	.uleb128 0x75
 	.4byte	.LASF3241
-	.byte	0x6
+	.byte	0x7
 	.byte	0x9a
 	.4byte	0xe2
 	.byte	0x3
-	.4byte	0x15e50
+	.4byte	0x16041
 	.uleb128 0x74
 	.4byte	.LASF2424
-	.byte	0x6
+	.byte	0x7
 	.byte	0x9a
 	.4byte	0xf4
 	.uleb128 0x74
 	.4byte	.LASF850
-	.byte	0x6
+	.byte	0x7
 	.byte	0x9a
 	.4byte	0xc6
 	.uleb128 0x78
 	.4byte	.LASF261
-	.byte	0x6
+	.byte	0x7
 	.byte	0x9c
 	.4byte	0x8b
 	.byte	0
@@ -55646,7 +55911,7 @@
 	.byte	0x50
 	.4byte	0xd2
 	.byte	0x3
-	.4byte	0x15e6a
+	.4byte	0x1605b
 	.uleb128 0x76
 	.string	"p"
 	.byte	0xce
@@ -55659,12 +55924,12 @@
 	.byte	0xb8
 	.4byte	0xd2
 	.byte	0x3
-	.4byte	0x15e84
+	.4byte	0x16075
 	.uleb128 0x76
 	.string	"p"
 	.byte	0xcf
 	.byte	0xb8
-	.4byte	0x15e84
+	.4byte	0x16075
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
@@ -55675,7 +55940,7 @@
 	.byte	0x39
 	.4byte	0xd2
 	.byte	0x3
-	.4byte	0x15ea6
+	.4byte	0x16097
 	.uleb128 0x76
 	.string	"val"
 	.byte	0xcf
@@ -55684,21 +55949,21 @@
 	.byte	0
 	.uleb128 0x75
 	.4byte	.LASF3245
-	.byte	0x8
+	.byte	0x6
 	.byte	0x68
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x15ecc
+	.4byte	0x160bd
 	.uleb128 0x76
 	.string	"nr"
-	.byte	0x8
+	.byte	0x6
 	.byte	0x68
 	.4byte	0xc6
 	.uleb128 0x74
 	.4byte	.LASF1118
-	.byte	0x8
+	.byte	0x6
 	.byte	0x68
-	.4byte	0x15ecc
+	.4byte	0x160bd
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
@@ -55708,7 +55973,7 @@
 	.byte	0xf
 	.byte	0x2f
 	.byte	0x3
-	.4byte	0x15f05
+	.4byte	0x160f6
 	.uleb128 0x76
 	.string	"i"
 	.byte	0xf
@@ -55718,7 +55983,7 @@
 	.string	"v"
 	.byte	0xf
 	.byte	0x2f
-	.4byte	0x15f05
+	.4byte	0x160f6
 	.uleb128 0x77
 	.string	"w0"
 	.byte	0xf
@@ -55728,7 +55993,7 @@
 	.string	"x1"
 	.byte	0xf
 	.byte	0x2f
-	.4byte	0x15f05
+	.4byte	0x160f6
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
@@ -55739,7 +56004,7 @@
 	.byte	0x1b
 	.4byte	0xc6
 	.byte	0x3
-	.4byte	0x15f25
+	.4byte	0x16116
 	.uleb128 0x76
 	.string	"x"
 	.byte	0xd0
@@ -55752,7 +56017,7 @@
 	.byte	0xb
 	.4byte	0x29
 	.byte	0x3
-	.4byte	0x15f41
+	.4byte	0x16132
 	.uleb128 0x74
 	.4byte	.LASF2457
 	.byte	0xd1
@@ -55764,12 +56029,12 @@
 	.byte	0xd2
 	.byte	0xb
 	.byte	0x3
-	.4byte	0x15f62
+	.4byte	0x16153
 	.uleb128 0x76
 	.string	"p"
 	.byte	0xd2
 	.byte	0xb
-	.4byte	0x15f62
+	.4byte	0x16153
 	.uleb128 0x74
 	.4byte	.LASF957
 	.byte	0xd2
@@ -55778,21 +56043,21 @@
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x15f69
+	.4byte	0x1615a
 	.uleb128 0x7a
 	.uleb128 0x3
-	.4byte	0x15f68
+	.4byte	0x16159
 	.uleb128 0x73
 	.4byte	.LASF3250
 	.byte	0xd2
 	.byte	0x9
 	.byte	0x3
-	.4byte	0x15f8f
+	.4byte	0x16180
 	.uleb128 0x76
 	.string	"p"
 	.byte	0xd2
 	.byte	0x9
-	.4byte	0x15f62
+	.4byte	0x16153
 	.uleb128 0x74
 	.4byte	.LASF957
 	.byte	0xd2
@@ -55804,12 +56069,12 @@
 	.byte	0xc
 	.2byte	0x11c
 	.byte	0x3
-	.4byte	0x15fbf
+	.4byte	0x161b0
 	.uleb128 0x61
 	.string	"p"
 	.byte	0xc
 	.2byte	0x11c
-	.4byte	0x15fbf
+	.4byte	0x161b0
 	.uleb128 0x61
 	.string	"res"
 	.byte	0xc
@@ -55823,879 +56088,879 @@
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
-	.4byte	0x15f68
+	.4byte	0x16159
 	.uleb128 0x7b
-	.4byte	0x1051a
+	.4byte	0x1050c
 	.8byte	.LFB2853
 	.8byte	.LFE2853-.LFB2853
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x15ff1
-	.uleb128 0x6a
-	.4byte	0x1052b
+	.4byte	0x161e2
+	.uleb128 0x6b
+	.4byte	0x1051d
 	.4byte	.LLST22
 	.uleb128 0x7c
-	.4byte	0x10537
+	.4byte	0x10529
 	.uleb128 0x1
 	.byte	0x51
 	.byte	0
 	.uleb128 0x7b
-	.4byte	0x14164
+	.4byte	0x14355
 	.8byte	.LFB2875
 	.8byte	.LFE2875-.LFB2875
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x1611e
-	.uleb128 0x6a
-	.4byte	0x14171
-	.4byte	.LLST216
+	.4byte	0x1630f
+	.uleb128 0x6b
+	.4byte	0x14362
+	.4byte	.LLST224
 	.uleb128 0x7c
-	.4byte	0x1417d
+	.4byte	0x1436e
 	.uleb128 0x1
 	.byte	0x51
 	.uleb128 0x7c
-	.4byte	0x14189
+	.4byte	0x1437a
 	.uleb128 0x1
 	.byte	0x52
 	.uleb128 0x7c
-	.4byte	0x14195
+	.4byte	0x14386
 	.uleb128 0x1
 	.byte	0x53
 	.uleb128 0x7c
-	.4byte	0x141ad
+	.4byte	0x1439e
 	.uleb128 0x1
 	.byte	0x54
 	.uleb128 0x51
+	.4byte	0x14392
+	.uleb128 0x54
+	.4byte	0x143aa
+	.uleb128 0x5e
+	.4byte	0x143b6
+	.uleb128 0x1
+	.byte	0x65
+	.uleb128 0x5d
+	.4byte	0x143c0
+	.4byte	.LLST225
+	.uleb128 0x5d
+	.4byte	0x143ca
+	.4byte	.LLST226
+	.uleb128 0x5d
+	.4byte	0x143d6
+	.4byte	.LLST227
+	.uleb128 0x5d
+	.4byte	0x143e2
+	.4byte	.LLST228
+	.uleb128 0x5d
+	.4byte	0x143ee
+	.4byte	.LLST229
+	.uleb128 0x54
+	.4byte	0x143fa
+	.uleb128 0x54
+	.4byte	0x14406
+	.uleb128 0x5d
+	.4byte	0x14412
+	.4byte	.LLST230
+	.uleb128 0x54
+	.4byte	0x1441e
+	.uleb128 0x5d
+	.4byte	0x1442a
+	.4byte	.LLST231
+	.uleb128 0x54
+	.4byte	0x14436
+	.uleb128 0x54
+	.4byte	0x14442
+	.uleb128 0x5d
+	.4byte	0x1444e
+	.4byte	.LLST232
+	.uleb128 0x5d
+	.4byte	0x1445a
+	.4byte	.LLST233
+	.uleb128 0x5d
+	.4byte	0x14466
+	.4byte	.LLST234
+	.uleb128 0x5d
+	.4byte	0x14472
+	.4byte	.LLST235
+	.uleb128 0x5c
+	.4byte	0x1447f
+	.8byte	.LBB1548
+	.4byte	.Ldebug_ranges0+0xeb0
+	.byte	0x1
+	.2byte	0x412
+	.uleb128 0x51
+	.4byte	0x144cc
+	.uleb128 0x51
+	.4byte	0x144c0
+	.uleb128 0x51
+	.4byte	0x144b4
+	.uleb128 0x51
+	.4byte	0x144a8
+	.uleb128 0x51
+	.4byte	0x1449c
+	.uleb128 0x51
+	.4byte	0x14490
+	.uleb128 0x5b
+	.4byte	.Ldebug_ranges0+0xeb0
+	.uleb128 0x54
+	.4byte	0x144d8
+	.uleb128 0x54
+	.4byte	0x144e4
+	.uleb128 0x54
+	.4byte	0x144f0
+	.uleb128 0x5d
+	.4byte	0x144fc
+	.4byte	.LLST236
+	.uleb128 0x5d
+	.4byte	0x14508
+	.4byte	.LLST237
+	.uleb128 0x54
+	.4byte	0x14514
+	.byte	0
+	.byte	0
+	.byte	0
+	.uleb128 0x7b
+	.4byte	0x14148
+	.8byte	.LFB2876
+	.8byte	.LFE2876-.LFB2876
+	.uleb128 0x1
+	.byte	0x9c
+	.4byte	0x16383
+	.uleb128 0x7c
+	.4byte	0x14165
+	.uleb128 0x1
+	.byte	0x51
+	.uleb128 0x7c
+	.4byte	0x14171
+	.uleb128 0x1
+	.byte	0x52
+	.uleb128 0x6b
+	.4byte	0x14189
+	.4byte	.LLST238
+	.uleb128 0x51
+	.4byte	0x1417d
+	.uleb128 0x51
+	.4byte	0x1417d
+	.uleb128 0x51
+	.4byte	0x14159
+	.uleb128 0x54
+	.4byte	0x14195
+	.uleb128 0x54
 	.4byte	0x141a1
+	.uleb128 0x54
+	.4byte	0x141ad
 	.uleb128 0x54
 	.4byte	0x141b9
 	.uleb128 0x5e
 	.4byte	0x141c5
 	.uleb128 0x1
-	.byte	0x65
-	.uleb128 0x5d
-	.4byte	0x141cf
-	.4byte	.LLST217
-	.uleb128 0x5d
-	.4byte	0x141d9
-	.4byte	.LLST218
-	.uleb128 0x5d
-	.4byte	0x141e5
-	.4byte	.LLST219
-	.uleb128 0x5d
-	.4byte	0x141f1
-	.4byte	.LLST220
-	.uleb128 0x5d
-	.4byte	0x141fd
-	.4byte	.LLST221
-	.uleb128 0x54
-	.4byte	0x14209
-	.uleb128 0x54
-	.4byte	0x14215
-	.uleb128 0x5d
-	.4byte	0x14221
-	.4byte	.LLST222
-	.uleb128 0x54
-	.4byte	0x1422d
-	.uleb128 0x5d
-	.4byte	0x14239
-	.4byte	.LLST223
-	.uleb128 0x54
-	.4byte	0x14245
-	.uleb128 0x54
-	.4byte	0x14251
-	.uleb128 0x5d
-	.4byte	0x1425d
-	.4byte	.LLST224
-	.uleb128 0x5d
-	.4byte	0x14269
-	.4byte	.LLST225
-	.uleb128 0x5d
-	.4byte	0x14275
-	.4byte	.LLST226
-	.uleb128 0x5d
-	.4byte	0x14281
-	.4byte	.LLST227
-	.uleb128 0x5c
-	.4byte	0x1428e
-	.8byte	.LBB1486
-	.4byte	.Ldebug_ranges0+0xde0
-	.byte	0x1
-	.2byte	0x413
-	.uleb128 0x51
-	.4byte	0x142db
-	.uleb128 0x51
-	.4byte	0x142cf
-	.uleb128 0x51
-	.4byte	0x142c3
-	.uleb128 0x51
-	.4byte	0x142b7
-	.uleb128 0x51
-	.4byte	0x142ab
-	.uleb128 0x51
-	.4byte	0x1429f
-	.uleb128 0x5b
-	.4byte	.Ldebug_ranges0+0xde0
-	.uleb128 0x54
-	.4byte	0x142e7
-	.uleb128 0x54
-	.4byte	0x142f3
-	.uleb128 0x54
-	.4byte	0x142ff
-	.uleb128 0x5d
-	.4byte	0x1430b
-	.4byte	.LLST228
-	.uleb128 0x5d
-	.4byte	0x14317
-	.4byte	.LLST229
-	.uleb128 0x54
-	.4byte	0x14323
-	.byte	0
-	.byte	0
-	.byte	0
-	.uleb128 0x7b
-	.4byte	0x13f57
-	.8byte	.LFB2876
-	.8byte	.LFE2876-.LFB2876
-	.uleb128 0x1
-	.byte	0x9c
-	.4byte	0x16192
-	.uleb128 0x7c
-	.4byte	0x13f74
-	.uleb128 0x1
-	.byte	0x51
-	.uleb128 0x7c
-	.4byte	0x13f80
-	.uleb128 0x1
-	.byte	0x52
-	.uleb128 0x6a
-	.4byte	0x13f98
-	.4byte	.LLST230
-	.uleb128 0x51
-	.4byte	0x13f8c
-	.uleb128 0x51
-	.4byte	0x13f8c
-	.uleb128 0x51
-	.4byte	0x13f68
-	.uleb128 0x54
-	.4byte	0x13fa4
-	.uleb128 0x54
-	.4byte	0x13fb0
-	.uleb128 0x54
-	.4byte	0x13fbc
-	.uleb128 0x54
-	.4byte	0x13fc8
-	.uleb128 0x5e
-	.4byte	0x13fd4
-	.uleb128 0x1
 	.byte	0x57
 	.uleb128 0x5d
-	.4byte	0x13fe0
-	.4byte	.LLST231
+	.4byte	0x141d1
+	.4byte	.LLST239
 	.uleb128 0x54
-	.4byte	0x13fec
+	.4byte	0x141dd
 	.uleb128 0x5d
-	.4byte	0x13ff8
-	.4byte	.LLST232
+	.4byte	0x141e9
+	.4byte	.LLST240
 	.byte	0
 	.uleb128 0x7b
-	.4byte	0x13d6b
+	.4byte	0x13f5c
 	.8byte	.LFB2877
 	.8byte	.LFE2877-.LFB2877
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x16251
-	.uleb128 0x6a
-	.4byte	0x13d78
-	.4byte	.LLST244
+	.4byte	0x16442
+	.uleb128 0x6b
+	.4byte	0x13f69
+	.4byte	.LLST252
 	.uleb128 0x7c
-	.4byte	0x13d84
+	.4byte	0x13f75
 	.uleb128 0x1
 	.byte	0x51
 	.uleb128 0x7c
-	.4byte	0x13d90
+	.4byte	0x13f81
 	.uleb128 0x1
 	.byte	0x52
-	.uleb128 0x6a
-	.4byte	0x13da8
-	.4byte	.LLST245
+	.uleb128 0x6b
+	.4byte	0x13f99
+	.4byte	.LLST253
 	.uleb128 0x51
-	.4byte	0x13d9c
+	.4byte	0x13f8d
 	.uleb128 0x51
-	.4byte	0x13d9c
+	.4byte	0x13f8d
 	.uleb128 0x51
-	.4byte	0x13d9c
+	.4byte	0x13f8d
 	.uleb128 0x54
-	.4byte	0x13db4
+	.4byte	0x13fa5
 	.uleb128 0x5d
-	.4byte	0x13dc0
-	.4byte	.LLST246
+	.4byte	0x13fb1
+	.4byte	.LLST254
 	.uleb128 0x54
-	.4byte	0x13dca
+	.4byte	0x13fbb
 	.uleb128 0x5d
-	.4byte	0x13dd4
-	.4byte	.LLST247
+	.4byte	0x13fc5
+	.4byte	.LLST255
 	.uleb128 0x54
-	.4byte	0x13de0
+	.4byte	0x13fd1
 	.uleb128 0x5d
-	.4byte	0x13dec
-	.4byte	.LLST248
+	.4byte	0x13fdd
+	.4byte	.LLST256
 	.uleb128 0x5d
-	.4byte	0x13df8
-	.4byte	.LLST249
+	.4byte	0x13fe9
+	.4byte	.LLST257
 	.uleb128 0x5d
-	.4byte	0x13e04
-	.4byte	.LLST250
+	.4byte	0x13ff5
+	.4byte	.LLST258
 	.uleb128 0x5e
-	.4byte	0x13e10
+	.4byte	0x14001
 	.uleb128 0x1
 	.byte	0x55
 	.uleb128 0x5d
-	.4byte	0x13e1c
-	.4byte	.LLST251
+	.4byte	0x1400d
+	.4byte	.LLST259
 	.uleb128 0x5a
-	.4byte	0x15608
-	.8byte	.LBB1494
-	.8byte	.LBE1494-.LBB1494
+	.4byte	0x157f9
+	.8byte	.LBB1556
+	.8byte	.LBE1556-.LBB1556
 	.byte	0x1
-	.2byte	0x59a
+	.2byte	0x599
 	.uleb128 0x51
-	.4byte	0x15631
+	.4byte	0x15822
 	.uleb128 0x51
-	.4byte	0x15625
+	.4byte	0x15816
 	.uleb128 0x51
-	.4byte	0x15619
+	.4byte	0x1580a
 	.byte	0
 	.byte	0
 	.uleb128 0x7b
-	.4byte	0x13be3
+	.4byte	0x13dd4
 	.8byte	.LFB2878
 	.8byte	.LFE2878-.LFB2878
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x1633b
+	.4byte	0x1652c
 	.uleb128 0x7c
-	.4byte	0x13bf0
+	.4byte	0x13de1
 	.uleb128 0x1
 	.byte	0x50
 	.uleb128 0x7c
-	.4byte	0x13bfc
+	.4byte	0x13ded
 	.uleb128 0x1
 	.byte	0x51
 	.uleb128 0x7c
-	.4byte	0x13c08
+	.4byte	0x13df9
 	.uleb128 0x1
 	.byte	0x52
-	.uleb128 0x6a
-	.4byte	0x13c20
-	.4byte	.LLST252
+	.uleb128 0x6b
+	.4byte	0x13e11
+	.4byte	.LLST260
 	.uleb128 0x51
-	.4byte	0x13c14
+	.4byte	0x13e05
 	.uleb128 0x51
-	.4byte	0x13c14
+	.4byte	0x13e05
 	.uleb128 0x51
-	.4byte	0x13c14
+	.4byte	0x13e05
 	.uleb128 0x54
-	.4byte	0x13c2c
+	.4byte	0x13e1d
 	.uleb128 0x5d
-	.4byte	0x13c38
-	.4byte	.LLST253
+	.4byte	0x13e29
+	.4byte	.LLST261
 	.uleb128 0x54
-	.4byte	0x13c42
+	.4byte	0x13e33
 	.uleb128 0x5d
-	.4byte	0x13c4c
-	.4byte	.LLST254
+	.4byte	0x13e3d
+	.4byte	.LLST262
 	.uleb128 0x54
-	.4byte	0x13c58
+	.4byte	0x13e49
 	.uleb128 0x54
-	.4byte	0x13c64
+	.4byte	0x13e55
 	.uleb128 0x54
-	.4byte	0x13c70
+	.4byte	0x13e61
 	.uleb128 0x5d
-	.4byte	0x13c7c
-	.4byte	.LLST255
+	.4byte	0x13e6d
+	.4byte	.LLST263
 	.uleb128 0x5e
-	.4byte	0x13c88
+	.4byte	0x13e79
 	.uleb128 0x1
 	.byte	0x55
 	.uleb128 0x5d
-	.4byte	0x13c94
-	.4byte	.LLST256
+	.4byte	0x13e85
+	.4byte	.LLST264
 	.uleb128 0x5d
-	.4byte	0x13ca0
-	.4byte	.LLST257
+	.4byte	0x13e91
+	.4byte	.LLST265
 	.uleb128 0x50
-	.4byte	0x155d2
-	.8byte	.LBB1496
-	.8byte	.LBE1496-.LBB1496
+	.4byte	0x157c3
+	.8byte	.LBB1558
+	.8byte	.LBE1558-.LBB1558
 	.byte	0x1
-	.2byte	0x5ec
-	.4byte	0x16312
+	.2byte	0x5eb
+	.4byte	0x16503
 	.uleb128 0x51
-	.4byte	0x155fb
+	.4byte	0x157ec
 	.uleb128 0x51
-	.4byte	0x155ef
+	.4byte	0x157e0
 	.uleb128 0x51
-	.4byte	0x155e3
+	.4byte	0x157d4
 	.byte	0
 	.uleb128 0x5a
-	.4byte	0x1559c
-	.8byte	.LBB1498
-	.8byte	.LBE1498-.LBB1498
+	.4byte	0x1578d
+	.8byte	.LBB1560
+	.8byte	.LBE1560-.LBB1560
 	.byte	0x1
-	.2byte	0x5f1
+	.2byte	0x5f0
 	.uleb128 0x51
-	.4byte	0x155c5
+	.4byte	0x157b6
 	.uleb128 0x51
-	.4byte	0x155b9
+	.4byte	0x157aa
 	.uleb128 0x51
-	.4byte	0x155ad
+	.4byte	0x1579e
 	.byte	0
 	.byte	0
 	.uleb128 0x7d
-	.4byte	0x13ae1
+	.4byte	0x13cd2
 	.8byte	.LFB2879
 	.8byte	.LFE2879-.LFB2879
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x1643d
-	.uleb128 0x6a
-	.4byte	0x13aee
-	.4byte	.LLST258
+	.4byte	0x1662e
+	.uleb128 0x6b
+	.4byte	0x13cdf
+	.4byte	.LLST266
 	.uleb128 0x51
-	.4byte	0x13afa
+	.4byte	0x13ceb
 	.uleb128 0x54
-	.4byte	0x13b06
+	.4byte	0x13cf7
 	.uleb128 0x58
-	.4byte	0x15712
-	.8byte	.LBB1500
-	.4byte	.Ldebug_ranges0+0xe30
+	.4byte	0x15903
+	.8byte	.LBB1562
+	.4byte	.Ldebug_ranges0+0xf00
 	.byte	0x1
-	.2byte	0x629
-	.4byte	0x163bb
+	.2byte	0x628
+	.4byte	0x165ac
 	.uleb128 0x51
-	.4byte	0x15743
+	.4byte	0x15934
 	.uleb128 0x51
-	.4byte	0x15737
+	.4byte	0x15928
 	.uleb128 0x51
-	.4byte	0x1572b
+	.4byte	0x1591c
 	.uleb128 0x51
-	.4byte	0x1571f
+	.4byte	0x15910
 	.uleb128 0x5b
-	.4byte	.Ldebug_ranges0+0xe30
+	.4byte	.Ldebug_ranges0+0xf00
 	.uleb128 0x54
-	.4byte	0x1574f
+	.4byte	0x15940
 	.uleb128 0x5c
-	.4byte	0x1575c
-	.8byte	.LBB1502
-	.4byte	.Ldebug_ranges0+0xe80
+	.4byte	0x1594d
+	.8byte	.LBB1564
+	.4byte	.Ldebug_ranges0+0xf50
 	.byte	0x9
 	.2byte	0x1af
 	.uleb128 0x51
-	.4byte	0x1576d
+	.4byte	0x1595e
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x58
-	.4byte	0x1568f
-	.8byte	.LBB1511
-	.4byte	.Ldebug_ranges0+0xeb0
+	.4byte	0x15880
+	.8byte	.LBB1573
+	.4byte	.Ldebug_ranges0+0xf80
 	.byte	0x1
-	.2byte	0x62a
-	.4byte	0x163ed
+	.2byte	0x629
+	.4byte	0x165de
 	.uleb128 0x51
-	.4byte	0x156c7
+	.4byte	0x158b8
 	.uleb128 0x51
-	.4byte	0x156bc
+	.4byte	0x158ad
 	.uleb128 0x51
-	.4byte	0x156b1
+	.4byte	0x158a2
 	.uleb128 0x51
-	.4byte	0x156a6
+	.4byte	0x15897
 	.uleb128 0x51
-	.4byte	0x1569b
+	.4byte	0x1588c
 	.byte	0
 	.uleb128 0x50
-	.4byte	0x15661
-	.8byte	.LBB1517
-	.8byte	.LBE1517-.LBB1517
+	.4byte	0x15852
+	.8byte	.LBB1579
+	.8byte	.LBE1579-.LBB1579
 	.byte	0x1
-	.2byte	0x62b
-	.4byte	0x16419
+	.2byte	0x62a
+	.4byte	0x1660a
 	.uleb128 0x51
-	.4byte	0x15683
+	.4byte	0x15874
 	.uleb128 0x51
-	.4byte	0x15678
+	.4byte	0x15869
 	.uleb128 0x51
-	.4byte	0x1566d
+	.4byte	0x1585e
 	.byte	0
 	.uleb128 0x5a
-	.4byte	0x1563e
-	.8byte	.LBB1519
-	.8byte	.LBE1519-.LBB1519
+	.4byte	0x1582f
+	.8byte	.LBB1581
+	.8byte	.LBE1581-.LBB1581
 	.byte	0x1
-	.2byte	0x62c
+	.2byte	0x62b
 	.uleb128 0x51
-	.4byte	0x15655
+	.4byte	0x15846
 	.uleb128 0x51
-	.4byte	0x1564a
+	.4byte	0x1583b
 	.byte	0
 	.byte	0
 	.uleb128 0x7d
-	.4byte	0x1547c
+	.4byte	0x1566d
 	.8byte	.LFB2882
 	.8byte	.LFE2882-.LFB2882
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x164fd
-	.uleb128 0x6a
-	.4byte	0x1548d
-	.4byte	.LLST259
-	.uleb128 0x6a
-	.4byte	0x15499
-	.4byte	.LLST260
+	.4byte	0x166ee
+	.uleb128 0x6b
+	.4byte	0x1567e
+	.4byte	.LLST267
+	.uleb128 0x6b
+	.4byte	0x1568a
+	.4byte	.LLST268
 	.uleb128 0x54
-	.4byte	0x154a5
+	.4byte	0x15696
 	.uleb128 0x50
-	.4byte	0x156d3
-	.8byte	.LBB1522
-	.8byte	.LBE1522-.LBB1522
+	.4byte	0x158c4
+	.8byte	.LBB1584
+	.8byte	.LBE1584-.LBB1584
+	.byte	0x1
+	.2byte	0x197
+	.4byte	0x16682
+	.uleb128 0x51
+	.4byte	0x158d0
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x15a4d
+	.8byte	.LBB1586
+	.8byte	.LBE1586-.LBB1586
 	.byte	0x1
 	.2byte	0x198
-	.4byte	0x16491
+	.4byte	0x166a4
 	.uleb128 0x51
-	.4byte	0x156df
+	.4byte	0x15a59
 	.byte	0
 	.uleb128 0x50
-	.4byte	0x1585c
-	.8byte	.LBB1524
-	.8byte	.LBE1524-.LBB1524
+	.4byte	0x15a7d
+	.8byte	.LBB1588
+	.8byte	.LBE1588-.LBB1588
 	.byte	0x1
-	.2byte	0x199
-	.4byte	0x164b3
+	.2byte	0x19b
+	.4byte	0x166d3
 	.uleb128 0x51
-	.4byte	0x15868
-	.byte	0
-	.uleb128 0x50
-	.4byte	0x1588c
-	.8byte	.LBB1526
-	.8byte	.LBE1526-.LBB1526
-	.byte	0x1
-	.2byte	0x19c
-	.4byte	0x164e2
-	.uleb128 0x51
-	.4byte	0x15898
-	.uleb128 0x4b
-	.8byte	.LVL890
-	.4byte	0x16c76
-	.byte	0
+	.4byte	0x15a89
 	.uleb128 0x4b
 	.8byte	.LVL887
-	.4byte	0x169af
+	.4byte	0x16e67
+	.byte	0
 	.uleb128 0x4b
-	.8byte	.LVL891
-	.4byte	0x169af
+	.8byte	.LVL884
+	.4byte	0x16ba0
+	.uleb128 0x4b
+	.8byte	.LVL888
+	.4byte	0x16ba0
 	.byte	0
 	.uleb128 0x7b
-	.4byte	0x13b19
+	.4byte	0x13d0a
 	.8byte	.LFB2883
 	.8byte	.LFE2883-.LFB2883
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x16664
-	.uleb128 0x6a
-	.4byte	0x13b26
-	.4byte	.LLST262
-	.uleb128 0x6a
-	.4byte	0x13b32
-	.4byte	.LLST263
-	.uleb128 0x6a
-	.4byte	0x13b3e
-	.4byte	.LLST264
-	.uleb128 0x6a
-	.4byte	0x13b56
-	.4byte	.LLST265
-	.uleb128 0x51
-	.4byte	0x13b4a
-	.uleb128 0x51
-	.4byte	0x13b4a
-	.uleb128 0x51
-	.4byte	0x13b4a
-	.uleb128 0x54
-	.4byte	0x13b62
-	.uleb128 0x54
-	.4byte	0x13b6e
-	.uleb128 0x54
-	.4byte	0x13b7a
-	.uleb128 0x5d
-	.4byte	0x13b86
-	.4byte	.LLST266
-	.uleb128 0x54
-	.4byte	0x13b92
-	.uleb128 0x5d
-	.4byte	0x13b9e
-	.4byte	.LLST267
-	.uleb128 0x54
-	.4byte	0x13ba8
-	.uleb128 0x5d
-	.4byte	0x13bb2
-	.4byte	.LLST268
-	.uleb128 0x5d
-	.4byte	0x13bbe
-	.4byte	.LLST269
-	.uleb128 0x54
-	.4byte	0x13bca
-	.uleb128 0x5d
-	.4byte	0x13bd6
+	.4byte	0x16855
+	.uleb128 0x6b
+	.4byte	0x13d17
 	.4byte	.LLST270
-	.uleb128 0x58
-	.4byte	0x15500
-	.8byte	.LBB1534
-	.4byte	.Ldebug_ranges0+0xef0
-	.byte	0x1
-	.2byte	0x618
-	.4byte	0x165f6
-	.uleb128 0x51
-	.4byte	0x15529
-	.uleb128 0x51
-	.4byte	0x1551d
-	.uleb128 0x51
-	.4byte	0x15511
-	.uleb128 0x5b
-	.4byte	.Ldebug_ranges0+0xef0
-	.uleb128 0x54
-	.4byte	0x15535
-	.uleb128 0x5d
-	.4byte	0x15541
+	.uleb128 0x6b
+	.4byte	0x13d23
 	.4byte	.LLST271
-	.uleb128 0x5c
-	.4byte	0x155d2
-	.8byte	.LBB1536
-	.4byte	.Ldebug_ranges0+0xf30
+	.uleb128 0x6b
+	.4byte	0x13d2f
+	.4byte	.LLST272
+	.uleb128 0x6b
+	.4byte	0x13d47
+	.4byte	.LLST273
+	.uleb128 0x51
+	.4byte	0x13d3b
+	.uleb128 0x51
+	.4byte	0x13d3b
+	.uleb128 0x51
+	.4byte	0x13d3b
+	.uleb128 0x54
+	.4byte	0x13d53
+	.uleb128 0x54
+	.4byte	0x13d5f
+	.uleb128 0x54
+	.4byte	0x13d6b
+	.uleb128 0x5d
+	.4byte	0x13d77
+	.4byte	.LLST274
+	.uleb128 0x54
+	.4byte	0x13d83
+	.uleb128 0x5d
+	.4byte	0x13d8f
+	.4byte	.LLST275
+	.uleb128 0x54
+	.4byte	0x13d99
+	.uleb128 0x5d
+	.4byte	0x13da3
+	.4byte	.LLST276
+	.uleb128 0x5d
+	.4byte	0x13daf
+	.4byte	.LLST277
+	.uleb128 0x54
+	.4byte	0x13dbb
+	.uleb128 0x5d
+	.4byte	0x13dc7
+	.4byte	.LLST278
+	.uleb128 0x58
+	.4byte	0x156f1
+	.8byte	.LBB1596
+	.4byte	.Ldebug_ranges0+0xfc0
 	.byte	0x1
-	.2byte	0x163
+	.2byte	0x617
+	.4byte	0x167e7
 	.uleb128 0x51
-	.4byte	0x155fb
+	.4byte	0x1571a
 	.uleb128 0x51
-	.4byte	0x155ef
+	.4byte	0x1570e
 	.uleb128 0x51
-	.4byte	0x155e3
+	.4byte	0x15702
+	.uleb128 0x5b
+	.4byte	.Ldebug_ranges0+0xfc0
+	.uleb128 0x54
+	.4byte	0x15726
+	.uleb128 0x5d
+	.4byte	0x15732
+	.4byte	.LLST279
+	.uleb128 0x5c
+	.4byte	0x157c3
+	.8byte	.LBB1598
+	.4byte	.Ldebug_ranges0+0x1000
+	.byte	0x1
+	.2byte	0x162
+	.uleb128 0x51
+	.4byte	0x157ec
+	.uleb128 0x51
+	.4byte	0x157e0
+	.uleb128 0x51
+	.4byte	0x157d4
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x58
-	.4byte	0x154b2
-	.8byte	.LBB1568
-	.4byte	.Ldebug_ranges0+0x1030
+	.4byte	0x156a3
+	.8byte	.LBB1630
+	.4byte	.Ldebug_ranges0+0x1100
 	.byte	0x1
-	.2byte	0x61f
-	.4byte	0x16656
+	.2byte	0x61e
+	.4byte	0x16847
 	.uleb128 0x51
-	.4byte	0x154db
+	.4byte	0x156cc
 	.uleb128 0x51
-	.4byte	0x154cf
+	.4byte	0x156c0
 	.uleb128 0x51
-	.4byte	0x154c3
+	.4byte	0x156b4
 	.uleb128 0x5b
-	.4byte	.Ldebug_ranges0+0x1030
+	.4byte	.Ldebug_ranges0+0x1100
 	.uleb128 0x54
-	.4byte	0x154e7
+	.4byte	0x156d8
 	.uleb128 0x5d
-	.4byte	0x154f3
-	.4byte	.LLST272
+	.4byte	0x156e4
+	.4byte	.LLST280
 	.uleb128 0x5c
-	.4byte	0x1559c
-	.8byte	.LBB1570
-	.4byte	.Ldebug_ranges0+0x1080
+	.4byte	0x1578d
+	.8byte	.LBB1632
+	.4byte	.Ldebug_ranges0+0x1150
 	.byte	0x1
-	.2byte	0x181
+	.2byte	0x180
 	.uleb128 0x51
-	.4byte	0x155c5
+	.4byte	0x157b6
 	.uleb128 0x51
-	.4byte	0x155b9
+	.4byte	0x157aa
 	.uleb128 0x51
-	.4byte	0x155ad
+	.4byte	0x1579e
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x4b
-	.8byte	.LVL904
-	.4byte	0x16a0b
+	.8byte	.LVL901
+	.4byte	0x16bfc
 	.byte	0
 	.uleb128 0x7b
-	.4byte	0x13cad
+	.4byte	0x13e9e
 	.8byte	.LFB2884
 	.8byte	.LFE2884-.LFB2884
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x1677b
-	.uleb128 0x6a
-	.4byte	0x13cba
-	.4byte	.LLST273
-	.uleb128 0x6a
-	.4byte	0x13cc6
-	.4byte	.LLST274
-	.uleb128 0x6a
-	.4byte	0x13cd2
-	.4byte	.LLST275
-	.uleb128 0x6a
-	.4byte	0x13cea
-	.4byte	.LLST276
-	.uleb128 0x51
-	.4byte	0x13cde
-	.uleb128 0x51
-	.4byte	0x13cde
-	.uleb128 0x51
-	.4byte	0x13cde
-	.uleb128 0x54
-	.4byte	0x13cf6
-	.uleb128 0x5d
-	.4byte	0x13d02
-	.4byte	.LLST277
-	.uleb128 0x5d
-	.4byte	0x13d0e
-	.4byte	.LLST278
-	.uleb128 0x5d
-	.4byte	0x13d1a
-	.4byte	.LLST279
-	.uleb128 0x54
-	.4byte	0x13d26
-	.uleb128 0x5d
-	.4byte	0x13d32
-	.4byte	.LLST280
-	.uleb128 0x54
-	.4byte	0x13d3c
-	.uleb128 0x5d
-	.4byte	0x13d46
+	.4byte	0x1696c
+	.uleb128 0x6b
+	.4byte	0x13eab
 	.4byte	.LLST281
-	.uleb128 0x5d
-	.4byte	0x13d52
+	.uleb128 0x6b
+	.4byte	0x13eb7
 	.4byte	.LLST282
-	.uleb128 0x5d
-	.4byte	0x13d5e
+	.uleb128 0x6b
+	.4byte	0x13ec3
 	.4byte	.LLST283
-	.uleb128 0x58
-	.4byte	0x1554e
-	.8byte	.LBB1610
-	.4byte	.Ldebug_ranges0+0x1190
-	.byte	0x1
-	.2byte	0x5c6
-	.4byte	0x16760
-	.uleb128 0x51
-	.4byte	0x15577
-	.uleb128 0x51
-	.4byte	0x1556b
-	.uleb128 0x51
-	.4byte	0x1555f
-	.uleb128 0x5b
-	.4byte	.Ldebug_ranges0+0x1190
-	.uleb128 0x54
-	.4byte	0x15583
-	.uleb128 0x5d
-	.4byte	0x1558f
+	.uleb128 0x6b
+	.4byte	0x13edb
 	.4byte	.LLST284
-	.uleb128 0x5c
-	.4byte	0x15608
-	.8byte	.LBB1612
-	.4byte	.Ldebug_ranges0+0x11d0
+	.uleb128 0x51
+	.4byte	0x13ecf
+	.uleb128 0x51
+	.4byte	0x13ecf
+	.uleb128 0x51
+	.4byte	0x13ecf
+	.uleb128 0x54
+	.4byte	0x13ee7
+	.uleb128 0x5d
+	.4byte	0x13ef3
+	.4byte	.LLST285
+	.uleb128 0x5d
+	.4byte	0x13eff
+	.4byte	.LLST286
+	.uleb128 0x5d
+	.4byte	0x13f0b
+	.4byte	.LLST287
+	.uleb128 0x54
+	.4byte	0x13f17
+	.uleb128 0x5d
+	.4byte	0x13f23
+	.4byte	.LLST288
+	.uleb128 0x54
+	.4byte	0x13f2d
+	.uleb128 0x5d
+	.4byte	0x13f37
+	.4byte	.LLST289
+	.uleb128 0x5d
+	.4byte	0x13f43
+	.4byte	.LLST290
+	.uleb128 0x5d
+	.4byte	0x13f4f
+	.4byte	.LLST291
+	.uleb128 0x58
+	.4byte	0x1573f
+	.8byte	.LBB1672
+	.4byte	.Ldebug_ranges0+0x1260
 	.byte	0x1
-	.2byte	0x145
+	.2byte	0x5c5
+	.4byte	0x16951
 	.uleb128 0x51
-	.4byte	0x15631
+	.4byte	0x15768
 	.uleb128 0x51
-	.4byte	0x15625
+	.4byte	0x1575c
 	.uleb128 0x51
-	.4byte	0x15619
+	.4byte	0x15750
+	.uleb128 0x5b
+	.4byte	.Ldebug_ranges0+0x1260
+	.uleb128 0x54
+	.4byte	0x15774
+	.uleb128 0x5d
+	.4byte	0x15780
+	.4byte	.LLST292
+	.uleb128 0x5c
+	.4byte	0x157f9
+	.8byte	.LBB1674
+	.4byte	.Ldebug_ranges0+0x12a0
+	.byte	0x1
+	.2byte	0x144
+	.uleb128 0x51
+	.4byte	0x15822
+	.uleb128 0x51
+	.4byte	0x15816
+	.uleb128 0x51
+	.4byte	0x1580a
 	.byte	0
 	.byte	0
 	.byte	0
 	.uleb128 0x4b
-	.8byte	.LVL934
-	.4byte	0x16a0b
+	.8byte	.LVL931
+	.4byte	0x16bfc
 	.uleb128 0x4b
-	.8byte	.LVL949
-	.4byte	0x16a0b
+	.8byte	.LVL946
+	.4byte	0x16bfc
 	.byte	0
 	.uleb128 0x7b
-	.4byte	0x131bc
+	.4byte	0x13415
 	.8byte	.LFB2886
 	.8byte	.LFE2886-.LFB2886
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x167d4
+	.4byte	0x169c5
 	.uleb128 0x51
-	.4byte	0x131d9
+	.4byte	0x13432
 	.uleb128 0x51
-	.4byte	0x131cd
+	.4byte	0x13426
 	.uleb128 0x54
-	.4byte	0x131e5
+	.4byte	0x1343e
 	.uleb128 0x54
-	.4byte	0x131ef
+	.4byte	0x13448
 	.uleb128 0x54
-	.4byte	0x131fb
+	.4byte	0x13454
 	.uleb128 0x5d
-	.4byte	0x13207
-	.4byte	.LLST287
+	.4byte	0x13460
+	.4byte	.LLST295
 	.uleb128 0x54
-	.4byte	0x13213
+	.4byte	0x1346c
 	.uleb128 0x5d
-	.4byte	0x1321f
-	.4byte	.LLST288
+	.4byte	0x13478
+	.4byte	.LLST296
 	.uleb128 0x4b
-	.8byte	.LVL1010
-	.4byte	0x16c81
+	.8byte	.LVL1000
+	.4byte	0x16e72
 	.byte	0
 	.uleb128 0x7b
-	.4byte	0x1308c
+	.4byte	0x132e5
 	.8byte	.LFB2887
 	.8byte	.LFE2887-.LFB2887
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x16848
+	.4byte	0x16a39
 	.uleb128 0x51
-	.4byte	0x130b5
+	.4byte	0x1330e
 	.uleb128 0x51
-	.4byte	0x130b5
+	.4byte	0x1330e
 	.uleb128 0x51
-	.4byte	0x130a9
+	.4byte	0x13302
 	.uleb128 0x51
-	.4byte	0x1309d
+	.4byte	0x132f6
 	.uleb128 0x54
-	.4byte	0x130c1
+	.4byte	0x1331a
 	.uleb128 0x54
-	.4byte	0x130cb
+	.4byte	0x13324
 	.uleb128 0x54
-	.4byte	0x130d7
+	.4byte	0x13330
 	.uleb128 0x5e
-	.4byte	0x130e3
+	.4byte	0x1333c
 	.uleb128 0x1
 	.byte	0x59
 	.uleb128 0x54
-	.4byte	0x130ef
+	.4byte	0x13348
 	.uleb128 0x54
-	.4byte	0x130fb
+	.4byte	0x13354
 	.uleb128 0x54
-	.4byte	0x13107
+	.4byte	0x13360
 	.uleb128 0x5d
-	.4byte	0x13113
-	.4byte	.LLST289
+	.4byte	0x1336c
+	.4byte	.LLST297
 	.uleb128 0x5d
-	.4byte	0x1311f
-	.4byte	.LLST290
+	.4byte	0x13378
+	.4byte	.LLST298
 	.uleb128 0x4b
-	.8byte	.LVL1015
-	.4byte	0x16c81
+	.8byte	.LVL1005
+	.4byte	0x16e72
 	.byte	0
 	.uleb128 0x7b
-	.4byte	0x100aa
+	.4byte	0x1009c
 	.8byte	.LFB2862
 	.8byte	.LFE2862-.LFB2862
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x168e5
-	.uleb128 0x6a
-	.4byte	0x100bb
-	.4byte	.LLST318
-	.uleb128 0x6a
-	.4byte	0x100c7
-	.4byte	.LLST319
-	.uleb128 0x6a
-	.4byte	0x100d3
-	.4byte	.LLST320
+	.4byte	0x16ad6
+	.uleb128 0x6b
+	.4byte	0x100ad
+	.4byte	.LLST326
+	.uleb128 0x6b
+	.4byte	0x100b9
+	.4byte	.LLST327
+	.uleb128 0x6b
+	.4byte	0x100c5
+	.4byte	.LLST328
 	.uleb128 0x54
-	.4byte	0x100df
+	.4byte	0x100d1
 	.uleb128 0x54
-	.4byte	0x100eb
+	.4byte	0x100dd
 	.uleb128 0x5d
-	.4byte	0x100f7
-	.4byte	.LLST321
+	.4byte	0x100e9
+	.4byte	.LLST329
 	.uleb128 0x5f
-	.8byte	.LBB1993
-	.8byte	.LBE1993-.LBB1993
-	.4byte	0x168d7
+	.8byte	.LBB2043
+	.8byte	.LBE2043-.LBB2043
+	.4byte	0x16ac8
 	.uleb128 0x51
-	.4byte	0x100bb
+	.4byte	0x100ad
 	.uleb128 0x51
-	.4byte	0x100c7
+	.4byte	0x100b9
 	.uleb128 0x51
-	.4byte	0x100d3
+	.4byte	0x100c5
 	.uleb128 0x53
-	.8byte	.LBB1994
-	.8byte	.LBE1994-.LBB1994
+	.8byte	.LBB2044
+	.8byte	.LBE2044-.LBB2044
 	.uleb128 0x54
-	.4byte	0x1687e
+	.4byte	0x16a6f
 	.uleb128 0x54
-	.4byte	0x16883
+	.4byte	0x16a74
 	.uleb128 0x54
-	.4byte	0x16888
+	.4byte	0x16a79
 	.byte	0
 	.byte	0
 	.uleb128 0x4b
-	.8byte	.LVL1218
-	.4byte	0x16b45
+	.8byte	.LVL1210
+	.4byte	0x16d36
 	.byte	0
 	.uleb128 0x7d
-	.4byte	0x1547c
+	.4byte	0x1566d
 	.8byte	.LFB2892
 	.8byte	.LFE2892-.LFB2892
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x16999
-	.uleb128 0x6a
-	.4byte	0x1548d
-	.4byte	.LLST322
+	.4byte	0x16b8a
+	.uleb128 0x6b
+	.4byte	0x1567e
+	.4byte	.LLST330
 	.uleb128 0x54
-	.4byte	0x154a5
+	.4byte	0x15696
 	.uleb128 0x51
-	.4byte	0x15499
+	.4byte	0x1568a
 	.uleb128 0x50
-	.4byte	0x15874
-	.8byte	.LBB1995
-	.8byte	.LBE1995-.LBB1995
+	.4byte	0x15a65
+	.8byte	.LBB2045
+	.8byte	.LBE2045-.LBB2045
+	.byte	0x1
+	.2byte	0x190
+	.4byte	0x16b26
+	.uleb128 0x51
+	.4byte	0x15a71
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x158dc
+	.8byte	.LBB2047
+	.8byte	.LBE2047-.LBB2047
 	.byte	0x1
 	.2byte	0x191
-	.4byte	0x16935
+	.4byte	0x16b4d
 	.uleb128 0x51
-	.4byte	0x15880
+	.4byte	0x158f7
+	.uleb128 0x51
+	.4byte	0x158ec
 	.byte	0
 	.uleb128 0x50
-	.4byte	0x156eb
-	.8byte	.LBB1997
-	.8byte	.LBE1997-.LBB1997
+	.4byte	0x15a9b
+	.8byte	.LBB2049
+	.8byte	.LBE2049-.LBB2049
 	.byte	0x1
-	.2byte	0x192
-	.4byte	0x1695c
+	.2byte	0x18d
+	.4byte	0x16b7c
 	.uleb128 0x51
-	.4byte	0x15706
-	.uleb128 0x51
-	.4byte	0x156fb
-	.byte	0
-	.uleb128 0x50
-	.4byte	0x158aa
-	.8byte	.LBB1999
-	.8byte	.LBE1999-.LBB1999
-	.byte	0x1
-	.2byte	0x18e
-	.4byte	0x1698b
-	.uleb128 0x51
-	.4byte	0x158b6
+	.4byte	0x15aa7
 	.uleb128 0x4b
-	.8byte	.LVL1226
-	.4byte	0x16c8c
+	.8byte	.LVL1218
+	.4byte	0x16e7d
 	.byte	0
 	.uleb128 0x4b
-	.8byte	.LVL1223
-	.4byte	0x169af
+	.8byte	.LVL1215
+	.4byte	0x16ba0
 	.byte	0
 	.uleb128 0x7e
 	.4byte	.LASF3252
 	.4byte	.LASF3252
 	.byte	0xbd
-	.byte	0xcc
+	.byte	0xcf
 	.uleb128 0x7e
 	.4byte	.LASF3253
 	.4byte	.LASF3253
 	.byte	0xbd
-	.byte	0xca
+	.byte	0xcd
 	.uleb128 0x7f
 	.4byte	.LASF3254
 	.4byte	.LASF3254
@@ -56735,70 +57000,70 @@
 	.4byte	.LASF3261
 	.4byte	.LASF3261
 	.byte	0xc2
-	.byte	0x33
+	.byte	0x34
 	.uleb128 0x80
-	.4byte	.LASF3262
-	.4byte	.LASF3262
-	.uleb128 0x7e
-	.4byte	.LASF3262
-	.4byte	.LASF3262
-	.byte	0xd4
-	.byte	0x36
+	.4byte	.LASF3272
+	.4byte	.LASF3272
 	.uleb128 0x7f
-	.4byte	.LASF3263
-	.4byte	.LASF3263
+	.4byte	.LASF3262
+	.4byte	.LASF3262
 	.byte	0x2
 	.2byte	0x5cb
 	.uleb128 0x7e
+	.4byte	.LASF3263
+	.4byte	.LASF3263
+	.byte	0xc1
+	.byte	0x29
+	.uleb128 0x7e
 	.4byte	.LASF3264
 	.4byte	.LASF3264
 	.byte	0xc1
-	.byte	0x26
+	.byte	0x2a
 	.uleb128 0x7e
 	.4byte	.LASF3265
 	.4byte	.LASF3265
-	.byte	0xc1
-	.byte	0x27
-	.uleb128 0x7e
-	.4byte	.LASF3266
-	.4byte	.LASF3266
 	.byte	0xaa
 	.byte	0x9
 	.uleb128 0x7f
-	.4byte	.LASF3267
-	.4byte	.LASF3267
+	.4byte	.LASF3266
+	.4byte	.LASF3266
 	.byte	0x47
 	.2byte	0x6b7
 	.uleb128 0x7f
-	.4byte	.LASF3268
-	.4byte	.LASF3268
+	.4byte	.LASF3267
+	.4byte	.LASF3267
 	.byte	0x47
 	.2byte	0x675
 	.uleb128 0x7e
-	.4byte	.LASF3269
-	.4byte	.LASF3269
+	.4byte	.LASF3268
+	.4byte	.LASF3268
 	.byte	0x9a
 	.byte	0x67
 	.uleb128 0x7e
-	.4byte	.LASF3270
-	.4byte	.LASF3270
+	.4byte	.LASF3269
+	.4byte	.LASF3269
 	.byte	0x52
 	.byte	0x53
 	.uleb128 0x7e
-	.4byte	.LASF3271
-	.4byte	.LASF3271
+	.4byte	.LASF3270
+	.4byte	.LASF3270
 	.byte	0x52
 	.byte	0xa5
 	.uleb128 0x7e
-	.4byte	.LASF3272
-	.4byte	.LASF3272
+	.4byte	.LASF3271
+	.4byte	.LASF3271
 	.byte	0xc2
-	.byte	0x2e
+	.byte	0x2f
+	.uleb128 0x7e
+	.4byte	.LASF3272
+	.4byte	.LASF3272
+	.byte	0xd4
+	.byte	0x36
 	.uleb128 0x7e
 	.4byte	.LASF3273
 	.4byte	.LASF3273
 	.byte	0xc2
-	.byte	0x27
+	.byte	0x28
 	.uleb128 0x7f
 	.4byte	.LASF3274
 	.4byte	.LASF3274
@@ -56869,7 +57134,7 @@
 	.4byte	.LASF3288
 	.4byte	.LASF3288
 	.byte	0xc2
-	.byte	0x31
+	.byte	0x32
 	.uleb128 0x7f
 	.4byte	.LASF3289
 	.4byte	.LASF3289
@@ -56889,7 +57154,7 @@
 	.4byte	.LASF3292
 	.4byte	.LASF3292
 	.byte	0xc1
-	.byte	0x28
+	.byte	0x2b
 	.uleb128 0x7f
 	.4byte	.LASF3293
 	.4byte	.LASF3293
@@ -56899,17 +57164,17 @@
 	.4byte	.LASF3294
 	.4byte	.LASF3294
 	.byte	0xc2
-	.byte	0x2f
+	.byte	0x30
 	.uleb128 0x7f
 	.4byte	.LASF3295
 	.4byte	.LASF3295
-	.byte	0x5
-	.2byte	0x199
-	.uleb128 0x7f
-	.4byte	.LASF3296
-	.4byte	.LASF3296
 	.byte	0x5
 	.2byte	0x19f
+	.uleb128 0x7f
+	.4byte	.LASF3296
+	.4byte	.LASF3296
+	.byte	0x5
+	.2byte	0x199
 	.uleb128 0x7e
 	.4byte	.LASF3297
 	.4byte	.LASF3297
@@ -56919,22 +57184,22 @@
 	.4byte	.LASF3298
 	.4byte	.LASF3298
 	.byte	0xc2
+	.byte	0x29
+	.uleb128 0x7e
+	.4byte	.LASF3299
+	.4byte	.LASF3299
+	.byte	0xc2
 	.byte	0x25
 	.uleb128 0x7e
-	.4byte	.LASF3299
-	.4byte	.LASF3299
-	.byte	0xc2
-	.byte	0x28
-	.uleb128 0x7e
 	.4byte	.LASF3300
 	.4byte	.LASF3300
 	.byte	0xc2
-	.byte	0x24
+	.byte	0x2e
 	.uleb128 0x7e
 	.4byte	.LASF3301
 	.4byte	.LASF3301
 	.byte	0xc2
-	.byte	0x2d
+	.byte	0x27
 	.uleb128 0x7e
 	.4byte	.LASF3302
 	.4byte	.LASF3302
@@ -56959,7 +57224,7 @@
 	.4byte	.LASF3306
 	.4byte	.LASF3306
 	.byte	0xc2
-	.byte	0x29
+	.byte	0x2a
 	.uleb128 0x7e
 	.4byte	.LASF3307
 	.4byte	.LASF3307
@@ -56974,27 +57239,27 @@
 	.4byte	.LASF3309
 	.4byte	.LASF3309
 	.byte	0xc2
-	.byte	0x2c
+	.byte	0x2d
 	.uleb128 0x7e
 	.4byte	.LASF3310
 	.4byte	.LASF3310
 	.byte	0xc2
-	.byte	0x2b
+	.byte	0x2c
 	.uleb128 0x7e
 	.4byte	.LASF3311
 	.4byte	.LASF3311
 	.byte	0xc3
-	.byte	0x73
+	.byte	0x7b
 	.uleb128 0x7e
 	.4byte	.LASF3312
 	.4byte	.LASF3312
 	.byte	0xc2
-	.byte	0x2a
+	.byte	0x2b
 	.uleb128 0x7e
 	.4byte	.LASF3313
 	.4byte	.LASF3313
 	.byte	0xc1
-	.byte	0x29
+	.byte	0x2c
 	.uleb128 0x81
 	.string	"up"
 	.string	"up"
@@ -58377,18 +58642,12 @@
 	.byte	0
 	.byte	0
 	.uleb128 0x68
-	.uleb128 0x1d
+	.uleb128 0xb
 	.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 0x69
@@ -58404,11 +58663,26 @@
 	.uleb128 0xb
 	.uleb128 0x59
 	.uleb128 0xb
+	.byte	0
+	.byte	0
+	.uleb128 0x6a
+	.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 0x6a
+	.uleb128 0x6b
 	.uleb128 0x5
 	.byte	0
 	.uleb128 0x31
@@ -58417,7 +58691,7 @@
 	.uleb128 0x17
 	.byte	0
 	.byte	0
-	.uleb128 0x6b
+	.uleb128 0x6c
 	.uleb128 0x1d
 	.byte	0x1
 	.uleb128 0x31
@@ -58430,15 +58704,6 @@
 	.uleb128 0xb
 	.uleb128 0x59
 	.uleb128 0xb
-	.uleb128 0x1
-	.uleb128 0x13
-	.byte	0
-	.byte	0
-	.uleb128 0x6c
-	.uleb128 0xb
-	.byte	0x1
-	.uleb128 0x55
-	.uleb128 0x17
 	.uleb128 0x1
 	.uleb128 0x13
 	.byte	0
@@ -58746,9 +59011,9 @@
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST261:
-	.8byte	.LVL893
-	.8byte	.LVL894
+.LLST269:
+	.8byte	.LVL890
+	.8byte	.LVL891
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
@@ -58760,677 +59025,671 @@
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST291:
-	.8byte	.LVL1016
-	.8byte	.LVL1017
-	.2byte	0x1
-	.byte	0x50
-	.8byte	0
-	.8byte	0
-.LLST292:
-	.8byte	.LVL1020
-	.8byte	.LVL1021
-	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL1032
-	.8byte	.LVL1033
-	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL1170
-	.8byte	.LVL1171
-	.2byte	0x1
-	.byte	0x50
-	.8byte	0
-	.8byte	0
-.LLST293:
-	.8byte	.LVL1028
-	.8byte	.LVL1029
-	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL1079
-	.8byte	.LVL1080
-	.2byte	0x1
-	.byte	0x50
-	.8byte	0
-	.8byte	0
-.LLST294:
-	.8byte	.LVL1032
-	.8byte	.LVL1034
-	.2byte	0x1
-	.byte	0x63
-	.8byte	.LVL1041
-	.8byte	.LVL1079
-	.2byte	0x1
-	.byte	0x63
-	.8byte	.LVL1084
-	.8byte	.LVL1170
-	.2byte	0x1
-	.byte	0x63
-	.8byte	.LVL1171
-	.8byte	.LVL1176
-	.2byte	0x1
-	.byte	0x63
-	.8byte	.LVL1179
-	.8byte	.LVL1193
-	.2byte	0x1
-	.byte	0x63
-	.8byte	.LVL1195
-	.8byte	.LFE2869
-	.2byte	0x1
-	.byte	0x63
-	.8byte	0
-	.8byte	0
-.LLST295:
-	.8byte	.LVL1023
-	.8byte	.LVL1035
-	.2byte	0x1
-	.byte	0x65
-	.8byte	.LVL1039
-	.8byte	.LVL1042
-	.2byte	0x1
-	.byte	0x65
-	.8byte	.LVL1079
-	.8byte	.LVL1084
-	.2byte	0x1
-	.byte	0x65
-	.8byte	.LVL1177
-	.8byte	.LVL1179
-	.2byte	0x1
-	.byte	0x65
-	.8byte	.LVL1202
-	.8byte	.LVL1203
-	.2byte	0x1
-	.byte	0x65
-	.8byte	0
-	.8byte	0
-.LLST296:
-	.8byte	.LVL1023
-	.8byte	.LVL1024
-	.2byte	0x2
-	.byte	0x91
-	.sleb128 -32
-	.8byte	.LVL1024
-	.8byte	.LVL1025
-	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL1026
-	.8byte	.LVL1030
-	.2byte	0x2
-	.byte	0x91
-	.sleb128 -32
-	.8byte	.LVL1030
-	.8byte	.LVL1082
-	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL1082
-	.8byte	.LVL1170
-	.2byte	0x2
-	.byte	0x91
-	.sleb128 -32
-	.8byte	.LVL1171
-	.8byte	.LVL1176
-	.2byte	0x2
-	.byte	0x91
-	.sleb128 -32
-	.8byte	.LVL1177
-	.8byte	.LVL1193
-	.2byte	0x2
-	.byte	0x91
-	.sleb128 -32
-	.8byte	.LVL1195
-	.8byte	.LFE2869
-	.2byte	0x2
-	.byte	0x91
-	.sleb128 -32
-	.8byte	0
-	.8byte	0
-.LLST297:
-	.8byte	.LVL1027
-	.8byte	.LVL1034
-	.2byte	0x1
-	.byte	0x63
-	.8byte	.LVL1039
-	.8byte	.LVL1041
-	.2byte	0x1
-	.byte	0x63
-	.8byte	.LVL1079
-	.8byte	.LVL1084
-	.2byte	0x1
-	.byte	0x63
-	.8byte	.LVL1202
-	.8byte	.LVL1203
-	.2byte	0x1
-	.byte	0x63
-	.8byte	0
-	.8byte	0
-.LLST298:
-	.8byte	.LVL1032
-	.8byte	.LVL1037
-	.2byte	0x1
-	.byte	0x6a
-	.8byte	.LVL1065
-	.8byte	.LVL1073
-	.2byte	0x1
-	.byte	0x6a
-	.8byte	.LVL1146
-	.8byte	.LVL1149
-	.2byte	0x1
-	.byte	0x6a
-	.8byte	.LVL1187
-	.8byte	.LVL1189
-	.2byte	0x1
-	.byte	0x6a
-	.8byte	.LVL1192
-	.8byte	.LVL1193
-	.2byte	0x1
-	.byte	0x6a
-	.8byte	.LVL1195
-	.8byte	.LVL1196
-	.2byte	0x1
-	.byte	0x6a
-	.8byte	.LVL1197
-	.8byte	.LVL1199
-	.2byte	0x1
-	.byte	0x6a
-	.8byte	.LVL1202
-	.8byte	.LVL1203
-	.2byte	0x1
-	.byte	0x6a
-	.8byte	0
-	.8byte	0
 .LLST299:
-	.8byte	.LVL1032
-	.8byte	.LVL1037
+	.8byte	.LVL1006
+	.8byte	.LVL1007
 	.2byte	0x1
-	.byte	0x6a
-	.8byte	.LVL1073
-	.8byte	.LVL1077
-	.2byte	0x1
-	.byte	0x6a
-	.8byte	.LVL1084
-	.8byte	.LVL1085
-	.2byte	0x1
-	.byte	0x6a
-	.8byte	.LVL1196
-	.8byte	.LVL1197
-	.2byte	0x1
-	.byte	0x6a
-	.8byte	.LVL1202
-	.8byte	.LVL1203
-	.2byte	0x1
-	.byte	0x6a
+	.byte	0x50
 	.8byte	0
 	.8byte	0
 .LLST300:
-	.8byte	.LVL1085
-	.8byte	.LVL1086-1
+	.8byte	.LVL1010
+	.8byte	.LVL1011
 	.2byte	0x1
-	.byte	0x51
+	.byte	0x50
+	.8byte	.LVL1022
+	.8byte	.LVL1023
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL1159
+	.8byte	.LVL1160
+	.2byte	0x1
+	.byte	0x50
 	.8byte	0
 	.8byte	0
 .LLST301:
-	.8byte	.LVL1090
-	.8byte	.LVL1093
+	.8byte	.LVL1018
+	.8byte	.LVL1019
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL1068
+	.8byte	.LVL1069
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
 .LLST302:
-	.8byte	.LVL1091
-	.8byte	.LVL1092
+	.8byte	.LVL1022
+	.8byte	.LVL1024
 	.2byte	0x1
-	.byte	0x51
+	.byte	0x63
+	.8byte	.LVL1031
+	.8byte	.LVL1068
+	.2byte	0x1
+	.byte	0x63
+	.8byte	.LVL1073
+	.8byte	.LVL1159
+	.2byte	0x1
+	.byte	0x63
+	.8byte	.LVL1160
+	.8byte	.LVL1165
+	.2byte	0x1
+	.byte	0x63
+	.8byte	.LVL1168
+	.8byte	.LVL1185
+	.2byte	0x1
+	.byte	0x63
+	.8byte	.LVL1187
+	.8byte	.LFE2869
+	.2byte	0x1
+	.byte	0x63
 	.8byte	0
 	.8byte	0
 .LLST303:
-	.8byte	.LVL1096
-	.8byte	.LVL1099
+	.8byte	.LVL1013
+	.8byte	.LVL1025
 	.2byte	0x1
-	.byte	0x50
+	.byte	0x65
+	.8byte	.LVL1029
+	.8byte	.LVL1032
+	.2byte	0x1
+	.byte	0x65
+	.8byte	.LVL1068
+	.8byte	.LVL1073
+	.2byte	0x1
+	.byte	0x65
+	.8byte	.LVL1166
+	.8byte	.LVL1168
+	.2byte	0x1
+	.byte	0x65
+	.8byte	.LVL1191
+	.8byte	.LVL1192
+	.2byte	0x1
+	.byte	0x65
 	.8byte	0
 	.8byte	0
 .LLST304:
-	.8byte	.LVL1097
-	.8byte	.LVL1098
+	.8byte	.LVL1013
+	.8byte	.LVL1014
+	.2byte	0x2
+	.byte	0x91
+	.sleb128 -32
+	.8byte	.LVL1014
+	.8byte	.LVL1015
 	.2byte	0x1
-	.byte	0x51
+	.byte	0x50
+	.8byte	.LVL1016
+	.8byte	.LVL1020
+	.2byte	0x2
+	.byte	0x91
+	.sleb128 -32
+	.8byte	.LVL1020
+	.8byte	.LVL1071
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL1071
+	.8byte	.LVL1159
+	.2byte	0x2
+	.byte	0x91
+	.sleb128 -32
+	.8byte	.LVL1160
+	.8byte	.LVL1165
+	.2byte	0x2
+	.byte	0x91
+	.sleb128 -32
+	.8byte	.LVL1166
+	.8byte	.LVL1185
+	.2byte	0x2
+	.byte	0x91
+	.sleb128 -32
+	.8byte	.LVL1187
+	.8byte	.LFE2869
+	.2byte	0x2
+	.byte	0x91
+	.sleb128 -32
 	.8byte	0
 	.8byte	0
 .LLST305:
-	.8byte	.LVL1032
-	.8byte	.LVL1037
+	.8byte	.LVL1017
+	.8byte	.LVL1024
+	.2byte	0x1
+	.byte	0x63
+	.8byte	.LVL1029
+	.8byte	.LVL1031
+	.2byte	0x1
+	.byte	0x63
+	.8byte	.LVL1068
+	.8byte	.LVL1073
+	.2byte	0x1
+	.byte	0x63
+	.8byte	.LVL1191
+	.8byte	.LVL1192
+	.2byte	0x1
+	.byte	0x63
+	.8byte	0
+	.8byte	0
+.LLST306:
+	.8byte	.LVL1022
+	.8byte	.LVL1027
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL1102
-	.8byte	.LVL1109
+	.8byte	.LVL1055
+	.8byte	.LVL1062
+	.2byte	0x1
+	.byte	0x6a
+	.8byte	.LVL1135
+	.8byte	.LVL1138
+	.2byte	0x1
+	.byte	0x6a
+	.8byte	.LVL1172
+	.8byte	.LVL1174
+	.2byte	0x1
+	.byte	0x6a
+	.8byte	.LVL1179
+	.8byte	.LVL1180
 	.2byte	0x1
 	.byte	0x6a
 	.8byte	.LVL1183
 	.8byte	.LVL1185
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL1189
-	.8byte	.LVL1190
+	.8byte	.LVL1187
+	.8byte	.LVL1188
 	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL1190
+	.byte	0x6a
+	.8byte	.LVL1189
 	.8byte	.LVL1192
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL1202
-	.8byte	.LVL1203
-	.2byte	0x1
-	.byte	0x6a
-	.8byte	0
-	.8byte	0
-.LLST306:
-	.8byte	.LVL1105
-	.8byte	.LVL1108
-	.2byte	0x1
-	.byte	0x50
 	.8byte	0
 	.8byte	0
 .LLST307:
-	.8byte	.LVL1106
-	.8byte	.LVL1107
+	.8byte	.LVL1022
+	.8byte	.LVL1027
+	.2byte	0x1
+	.byte	0x6a
+	.8byte	.LVL1062
+	.8byte	.LVL1066
+	.2byte	0x1
+	.byte	0x6a
+	.8byte	.LVL1073
+	.8byte	.LVL1074
+	.2byte	0x1
+	.byte	0x6a
+	.8byte	.LVL1188
+	.8byte	.LVL1189
+	.2byte	0x1
+	.byte	0x6a
+	.8byte	.LVL1191
+	.8byte	.LVL1192
+	.2byte	0x1
+	.byte	0x6a
+	.8byte	0
+	.8byte	0
+.LLST308:
+	.8byte	.LVL1074
+	.8byte	.LVL1075-1
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST308:
-	.8byte	.LVL1108
-	.8byte	.LVL1110-1
+.LLST309:
+	.8byte	.LVL1079
+	.8byte	.LVL1082
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST309:
-	.8byte	.LVL1032
-	.8byte	.LVL1039
-	.2byte	0x2
-	.byte	0x91
-	.sleb128 -28
-	.8byte	.LVL1115
-	.8byte	.LVL1146
-	.2byte	0x2
-	.byte	0x91
-	.sleb128 -28
-	.8byte	.LVL1149
-	.8byte	.LVL1161
-	.2byte	0x2
-	.byte	0x91
-	.sleb128 -28
-	.8byte	.LVL1161
-	.8byte	.LVL1162
-	.2byte	0x1
-	.byte	0x51
-	.8byte	.LVL1165
-	.8byte	.LVL1170
-	.2byte	0x2
-	.byte	0x91
-	.sleb128 -28
-	.8byte	.LVL1171
-	.8byte	.LVL1176
-	.2byte	0x2
-	.byte	0x91
-	.sleb128 -28
-	.8byte	.LVL1199
-	.8byte	.LVL1203
-	.2byte	0x2
-	.byte	0x91
-	.sleb128 -28
-	.8byte	.LVL1207
-	.8byte	.LFE2869
-	.2byte	0x2
-	.byte	0x91
-	.sleb128 -28
-	.8byte	0
-	.8byte	0
 .LLST310:
-	.8byte	.LVL1032
-	.8byte	.LVL1039
-	.2byte	0x2
-	.byte	0x91
-	.sleb128 -24
-	.8byte	.LVL1115
-	.8byte	.LVL1146
-	.2byte	0x2
-	.byte	0x91
-	.sleb128 -24
-	.8byte	.LVL1149
-	.8byte	.LVL1154
-	.2byte	0x2
-	.byte	0x91
-	.sleb128 -24
-	.8byte	.LVL1154
-	.8byte	.LVL1155
+	.8byte	.LVL1080
+	.8byte	.LVL1081
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL1157
-	.8byte	.LVL1170
-	.2byte	0x2
-	.byte	0x91
-	.sleb128 -24
-	.8byte	.LVL1171
-	.8byte	.LVL1176
-	.2byte	0x2
-	.byte	0x91
-	.sleb128 -24
-	.8byte	.LVL1199
-	.8byte	.LVL1203
-	.2byte	0x2
-	.byte	0x91
-	.sleb128 -24
-	.8byte	.LVL1205
-	.8byte	.LFE2869
-	.2byte	0x2
-	.byte	0x91
-	.sleb128 -24
 	.8byte	0
 	.8byte	0
 .LLST311:
-	.8byte	.LVL1032
-	.8byte	.LVL1036
+	.8byte	.LVL1085
+	.8byte	.LVL1088
 	.2byte	0x1
-	.byte	0x68
-	.8byte	.LVL1121
-	.8byte	.LVL1130
-	.2byte	0x1
-	.byte	0x68
-	.8byte	.LVL1134
-	.8byte	.LVL1146
-	.2byte	0x1
-	.byte	0x68
-	.8byte	.LVL1151
-	.8byte	.LVL1157
-	.2byte	0x1
-	.byte	0x68
-	.8byte	.LVL1165
-	.8byte	.LVL1167
-	.2byte	0x1
-	.byte	0x68
-	.8byte	.LVL1199
-	.8byte	.LVL1203
-	.2byte	0x1
-	.byte	0x68
-	.8byte	.LVL1206
-	.8byte	.LVL1207
-	.2byte	0x1
-	.byte	0x68
+	.byte	0x50
 	.8byte	0
 	.8byte	0
 .LLST312:
-	.8byte	.LVL1032
-	.8byte	.LVL1038
+	.8byte	.LVL1086
+	.8byte	.LVL1087
 	.2byte	0x1
-	.byte	0x6c
-	.8byte	.LVL1125
-	.8byte	.LVL1146
-	.2byte	0x1
-	.byte	0x6c
-	.8byte	.LVL1149
-	.8byte	.LVL1157
-	.2byte	0x1
-	.byte	0x6c
-	.8byte	.LVL1164
-	.8byte	.LVL1170
-	.2byte	0x1
-	.byte	0x6c
-	.8byte	.LVL1171
-	.8byte	.LVL1176
-	.2byte	0x1
-	.byte	0x6c
-	.8byte	.LVL1199
-	.8byte	.LVL1203
-	.2byte	0x1
-	.byte	0x6c
+	.byte	0x51
 	.8byte	0
 	.8byte	0
 .LLST313:
-	.8byte	.LVL1117
-	.8byte	.LVL1122
+	.8byte	.LVL1022
+	.8byte	.LVL1027
 	.2byte	0x1
 	.byte	0x6a
-	.8byte	.LVL1157
-	.8byte	.LVL1160
+	.8byte	.LVL1091
+	.8byte	.LVL1098
+	.2byte	0x1
+	.byte	0x6a
+	.8byte	.LVL1175
+	.8byte	.LVL1177
+	.2byte	0x1
+	.byte	0x6a
+	.8byte	.LVL1180
+	.8byte	.LVL1181
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL1181
+	.8byte	.LVL1183
+	.2byte	0x1
+	.byte	0x6a
+	.8byte	.LVL1191
+	.8byte	.LVL1192
 	.2byte	0x1
 	.byte	0x6a
 	.8byte	0
 	.8byte	0
 .LLST314:
-	.8byte	.LVL1032
-	.8byte	.LVL1038
+	.8byte	.LVL1094
+	.8byte	.LVL1097
 	.2byte	0x1
-	.byte	0x6c
-	.8byte	.LVL1119
-	.8byte	.LVL1125
-	.2byte	0x1
-	.byte	0x6c
-	.8byte	.LVL1126
-	.8byte	.LVL1146
-	.2byte	0x1
-	.byte	0x6c
-	.8byte	.LVL1149
-	.8byte	.LVL1151
-	.2byte	0x1
-	.byte	0x6c
-	.8byte	.LVL1157
-	.8byte	.LVL1164
-	.2byte	0x1
-	.byte	0x6c
-	.8byte	.LVL1171
-	.8byte	.LVL1176
-	.2byte	0x1
-	.byte	0x6c
-	.8byte	.LVL1202
-	.8byte	.LVL1203
-	.2byte	0x1
-	.byte	0x6c
-	.8byte	.LVL1205
-	.8byte	.LFE2869
-	.2byte	0x1
-	.byte	0x6c
+	.byte	0x50
 	.8byte	0
 	.8byte	0
 .LLST315:
-	.8byte	.LVL1032
-	.8byte	.LVL1037
+	.8byte	.LVL1095
+	.8byte	.LVL1096
 	.2byte	0x1
-	.byte	0x6a
-	.8byte	.LVL1122
-	.8byte	.LVL1146
-	.2byte	0x1
-	.byte	0x6a
-	.8byte	.LVL1149
-	.8byte	.LVL1157
-	.2byte	0x1
-	.byte	0x6a
-	.8byte	.LVL1160
-	.8byte	.LVL1170
-	.2byte	0x1
-	.byte	0x6a
-	.8byte	.LVL1171
-	.8byte	.LVL1176
-	.2byte	0x1
-	.byte	0x6a
-	.8byte	.LVL1199
-	.8byte	.LVL1203
-	.2byte	0x1
-	.byte	0x6a
-	.8byte	.LVL1205
-	.8byte	.LVL1207
-	.2byte	0x1
-	.byte	0x6a
-	.8byte	.LVL1207
-	.8byte	.LVL1208
-	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL1208
-	.8byte	.LFE2869
-	.2byte	0x1
-	.byte	0x6a
+	.byte	0x51
 	.8byte	0
 	.8byte	0
 .LLST316:
-	.8byte	.LVL1032
-	.8byte	.LVL1038
-	.2byte	0x1
-	.byte	0x6b
-	.8byte	.LVL1123
-	.8byte	.LVL1146
-	.2byte	0x1
-	.byte	0x6b
-	.8byte	.LVL1149
-	.8byte	.LVL1157
-	.2byte	0x1
-	.byte	0x6b
-	.8byte	.LVL1165
-	.8byte	.LVL1170
-	.2byte	0x1
-	.byte	0x6b
-	.8byte	.LVL1171
-	.8byte	.LVL1176
-	.2byte	0x1
-	.byte	0x6b
-	.8byte	.LVL1199
-	.8byte	.LVL1200
+	.8byte	.LVL1097
+	.8byte	.LVL1099-1
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL1200
-	.8byte	.LVL1203
-	.2byte	0x1
-	.byte	0x6b
 	.8byte	0
 	.8byte	0
 .LLST317:
-	.8byte	.LVL1032
-	.8byte	.LVL1036
+	.8byte	.LVL1022
+	.8byte	.LVL1029
+	.2byte	0x2
+	.byte	0x91
+	.sleb128 -28
+	.8byte	.LVL1104
+	.8byte	.LVL1135
+	.2byte	0x2
+	.byte	0x91
+	.sleb128 -28
+	.8byte	.LVL1138
+	.8byte	.LVL1144
+	.2byte	0x2
+	.byte	0x91
+	.sleb128 -28
+	.8byte	.LVL1144
+	.8byte	.LVL1145
+	.2byte	0x1
+	.byte	0x51
+	.8byte	.LVL1148
+	.8byte	.LVL1159
+	.2byte	0x2
+	.byte	0x91
+	.sleb128 -28
+	.8byte	.LVL1160
+	.8byte	.LVL1165
+	.2byte	0x2
+	.byte	0x91
+	.sleb128 -28
+	.8byte	.LVL1191
+	.8byte	.LVL1192
+	.2byte	0x2
+	.byte	0x91
+	.sleb128 -28
+	.8byte	.LVL1194
+	.8byte	.LVL1200
+	.2byte	0x2
+	.byte	0x91
+	.sleb128 -28
+	.8byte	0
+	.8byte	0
+.LLST318:
+	.8byte	.LVL1022
+	.8byte	.LVL1029
+	.2byte	0x2
+	.byte	0x91
+	.sleb128 -24
+	.8byte	.LVL1104
+	.8byte	.LVL1135
+	.2byte	0x2
+	.byte	0x91
+	.sleb128 -24
+	.8byte	.LVL1138
+	.8byte	.LVL1156
+	.2byte	0x2
+	.byte	0x91
+	.sleb128 -24
+	.8byte	.LVL1156
+	.8byte	.LVL1157
+	.2byte	0x1
+	.byte	0x51
+	.8byte	.LVL1160
+	.8byte	.LVL1165
+	.2byte	0x2
+	.byte	0x91
+	.sleb128 -24
+	.8byte	.LVL1191
+	.8byte	.LVL1200
+	.2byte	0x2
+	.byte	0x91
+	.sleb128 -24
+	.8byte	0
+	.8byte	0
+.LLST319:
+	.8byte	.LVL1022
+	.8byte	.LVL1026
 	.2byte	0x1
 	.byte	0x68
-	.8byte	.LVL1130
-	.8byte	.LVL1146
+	.8byte	.LVL1110
+	.8byte	.LVL1119
 	.2byte	0x1
 	.byte	0x68
-	.8byte	.LVL1149
-	.8byte	.LVL1151
+	.8byte	.LVL1123
+	.8byte	.LVL1135
 	.2byte	0x1
 	.byte	0x68
-	.8byte	.LVL1171
-	.8byte	.LVL1173
+	.8byte	.LVL1148
+	.8byte	.LVL1150
 	.2byte	0x1
 	.byte	0x68
-	.8byte	.LVL1202
-	.8byte	.LVL1203
+	.8byte	.LVL1153
+	.8byte	.LVL1159
+	.2byte	0x1
+	.byte	0x68
+	.8byte	.LVL1191
+	.8byte	.LVL1192
+	.2byte	0x1
+	.byte	0x68
+	.8byte	.LVL1193
+	.8byte	.LVL1194
+	.2byte	0x1
+	.byte	0x68
+	.8byte	.LVL1197
+	.8byte	.LVL1200
 	.2byte	0x1
 	.byte	0x68
 	.8byte	0
 	.8byte	0
-.LLST204:
+.LLST320:
+	.8byte	.LVL1022
+	.8byte	.LVL1028
+	.2byte	0x1
+	.byte	0x6c
+	.8byte	.LVL1114
+	.8byte	.LVL1135
+	.2byte	0x1
+	.byte	0x6c
+	.8byte	.LVL1138
+	.8byte	.LVL1140
+	.2byte	0x1
+	.byte	0x6c
+	.8byte	.LVL1147
+	.8byte	.LVL1159
+	.2byte	0x1
+	.byte	0x6c
+	.8byte	.LVL1160
+	.8byte	.LVL1165
+	.2byte	0x1
+	.byte	0x6c
+	.8byte	.LVL1191
+	.8byte	.LVL1192
+	.2byte	0x1
+	.byte	0x6c
+	.8byte	.LVL1197
+	.8byte	.LVL1200
+	.2byte	0x1
+	.byte	0x6c
+	.8byte	0
+	.8byte	0
+.LLST321:
+	.8byte	.LVL1106
+	.8byte	.LVL1111
+	.2byte	0x1
+	.byte	0x6a
+	.8byte	.LVL1140
+	.8byte	.LVL1143
+	.2byte	0x1
+	.byte	0x6a
+	.8byte	0
+	.8byte	0
+.LLST322:
+	.8byte	.LVL1022
+	.8byte	.LVL1028
+	.2byte	0x1
+	.byte	0x6c
+	.8byte	.LVL1108
+	.8byte	.LVL1114
+	.2byte	0x1
+	.byte	0x6c
+	.8byte	.LVL1115
+	.8byte	.LVL1135
+	.2byte	0x1
+	.byte	0x6c
+	.8byte	.LVL1138
+	.8byte	.LVL1147
+	.2byte	0x1
+	.byte	0x6c
+	.8byte	.LVL1160
+	.8byte	.LVL1165
+	.2byte	0x1
+	.byte	0x6c
+	.8byte	.LVL1191
+	.8byte	.LVL1197
+	.2byte	0x1
+	.byte	0x6c
+	.8byte	0
+	.8byte	0
+.LLST323:
+	.8byte	.LVL1022
+	.8byte	.LVL1027
+	.2byte	0x1
+	.byte	0x6a
+	.8byte	.LVL1111
+	.8byte	.LVL1135
+	.2byte	0x1
+	.byte	0x6a
+	.8byte	.LVL1138
+	.8byte	.LVL1140
+	.2byte	0x1
+	.byte	0x6a
+	.8byte	.LVL1143
+	.8byte	.LVL1159
+	.2byte	0x1
+	.byte	0x6a
+	.8byte	.LVL1160
+	.8byte	.LVL1165
+	.2byte	0x1
+	.byte	0x6a
+	.8byte	.LVL1191
+	.8byte	.LVL1194
+	.2byte	0x1
+	.byte	0x6a
+	.8byte	.LVL1194
+	.8byte	.LVL1195
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL1195
+	.8byte	.LVL1200
+	.2byte	0x1
+	.byte	0x6a
+	.8byte	0
+	.8byte	0
+.LLST324:
+	.8byte	.LVL1022
+	.8byte	.LVL1028
+	.2byte	0x1
+	.byte	0x6b
+	.8byte	.LVL1112
+	.8byte	.LVL1135
+	.2byte	0x1
+	.byte	0x6b
+	.8byte	.LVL1138
+	.8byte	.LVL1140
+	.2byte	0x1
+	.byte	0x6b
+	.8byte	.LVL1148
+	.8byte	.LVL1159
+	.2byte	0x1
+	.byte	0x6b
+	.8byte	.LVL1160
+	.8byte	.LVL1165
+	.2byte	0x1
+	.byte	0x6b
+	.8byte	.LVL1191
+	.8byte	.LVL1192
+	.2byte	0x1
+	.byte	0x6b
+	.8byte	.LVL1197
+	.8byte	.LVL1198
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL1198
+	.8byte	.LVL1200
+	.2byte	0x1
+	.byte	0x6b
+	.8byte	0
+	.8byte	0
+.LLST325:
+	.8byte	.LVL1022
+	.8byte	.LVL1026
+	.2byte	0x1
+	.byte	0x68
+	.8byte	.LVL1119
+	.8byte	.LVL1135
+	.2byte	0x1
+	.byte	0x68
+	.8byte	.LVL1138
+	.8byte	.LVL1140
+	.2byte	0x1
+	.byte	0x68
+	.8byte	.LVL1160
+	.8byte	.LVL1162
+	.2byte	0x1
+	.byte	0x68
+	.8byte	.LVL1191
+	.8byte	.LVL1192
+	.2byte	0x1
+	.byte	0x68
+	.8byte	0
+	.8byte	0
+.LLST212:
+	.8byte	.LVL702
+	.8byte	.LVL703
+	.2byte	0x1
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST213:
+	.8byte	.LVL702
+	.8byte	.LVL704-1
+	.2byte	0x1
+	.byte	0x51
+	.8byte	0
+	.8byte	0
+.LLST214:
+	.8byte	.LVL702
+	.8byte	.LVL704-1
+	.2byte	0x1
+	.byte	0x52
+	.8byte	0
+	.8byte	0
+.LLST197:
+	.8byte	.LVL672
+	.8byte	.LVL673
+	.2byte	0x1
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST198:
+	.8byte	.LVL672
+	.8byte	.LVL674
+	.2byte	0x1
+	.byte	0x51
+	.8byte	0
+	.8byte	0
+.LLST199:
+	.8byte	.LVL672
+	.8byte	.LVL675
+	.2byte	0x1
+	.byte	0x52
+	.8byte	.LVL675
+	.8byte	.LVL676-1
+	.2byte	0x1
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST200:
+	.8byte	.LVL677
+	.8byte	.LVL678
+	.2byte	0x1
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST201:
+	.8byte	.LVL677
+	.8byte	.LVL679
+	.2byte	0x1
+	.byte	0x51
+	.8byte	0
+	.8byte	0
+.LLST202:
+	.8byte	.LVL677
+	.8byte	.LVL680
+	.2byte	0x1
+	.byte	0x52
+	.8byte	.LVL680
+	.8byte	.LVL681-1
+	.2byte	0x1
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST215:
 	.8byte	.LVL705
 	.8byte	.LVL706
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST205:
+.LLST216:
 	.8byte	.LVL705
-	.8byte	.LVL707-1
+	.8byte	.LVL707
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST206:
+.LLST217:
 	.8byte	.LVL705
-	.8byte	.LVL707-1
-	.2byte	0x1
-	.byte	0x52
-	.8byte	0
-	.8byte	0
-.LLST189:
-	.8byte	.LVL675
-	.8byte	.LVL676
-	.2byte	0x1
-	.byte	0x50
-	.8byte	0
-	.8byte	0
-.LLST190:
-	.8byte	.LVL675
-	.8byte	.LVL677
-	.2byte	0x1
-	.byte	0x51
-	.8byte	0
-	.8byte	0
-.LLST191:
-	.8byte	.LVL675
-	.8byte	.LVL678
-	.2byte	0x1
-	.byte	0x52
-	.8byte	.LVL678
-	.8byte	.LVL679-1
-	.2byte	0x1
-	.byte	0x50
-	.8byte	0
-	.8byte	0
-.LLST192:
-	.8byte	.LVL680
-	.8byte	.LVL681
-	.2byte	0x1
-	.byte	0x50
-	.8byte	0
-	.8byte	0
-.LLST193:
-	.8byte	.LVL680
-	.8byte	.LVL682
-	.2byte	0x1
-	.byte	0x51
-	.8byte	0
-	.8byte	0
-.LLST194:
-	.8byte	.LVL680
-	.8byte	.LVL683
-	.2byte	0x1
-	.byte	0x52
-	.8byte	.LVL683
-	.8byte	.LVL684-1
-	.2byte	0x1
-	.byte	0x50
-	.8byte	0
-	.8byte	0
-.LLST207:
-	.8byte	.LVL708
 	.8byte	.LVL709
 	.2byte	0x1
-	.byte	0x50
-	.8byte	0
-	.8byte	0
-.LLST208:
-	.8byte	.LVL708
-	.8byte	.LVL710
-	.2byte	0x1
-	.byte	0x51
-	.8byte	0
-	.8byte	0
-.LLST209:
-	.8byte	.LVL708
-	.8byte	.LVL712
-	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL712
-	.8byte	.LVL717
+	.8byte	.LVL709
+	.8byte	.LVL714
 	.2byte	0x1
 	.byte	0x65
-	.8byte	.LVL718
+	.8byte	.LVL715
 	.8byte	.LFE2858
 	.2byte	0x1
 	.byte	0x65
 	.8byte	0
 	.8byte	0
-.LLST210:
-	.8byte	.LVL708
-	.8byte	.LVL713-1
+.LLST218:
+	.8byte	.LVL705
+	.8byte	.LVL710-1
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL713-1
+	.8byte	.LVL710-1
+	.8byte	.LVL713
+	.2byte	0x1
+	.byte	0x64
+	.8byte	.LVL715
 	.8byte	.LVL716
 	.2byte	0x1
 	.byte	0x64
@@ -59438,136 +59697,132 @@
 	.8byte	.LVL719
 	.2byte	0x1
 	.byte	0x64
-	.8byte	.LVL721
-	.8byte	.LVL722
-	.2byte	0x1
-	.byte	0x64
 	.8byte	0
 	.8byte	0
-.LLST211:
-	.8byte	.LVL711
-	.8byte	.LVL717
-	.2byte	0x1
-	.byte	0x66
-	.8byte	.LVL718
-	.8byte	.LFE2858
-	.2byte	0x1
-	.byte	0x66
-	.8byte	0
-	.8byte	0
-.LLST212:
+.LLST219:
+	.8byte	.LVL708
 	.8byte	.LVL714
-	.8byte	.LVL718
+	.2byte	0x1
+	.byte	0x66
+	.8byte	.LVL715
+	.8byte	.LFE2858
+	.2byte	0x1
+	.byte	0x66
+	.8byte	0
+	.8byte	0
+.LLST220:
+	.8byte	.LVL711
+	.8byte	.LVL715
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 20
-	.8byte	.LVL721
+	.8byte	.LVL718
 	.8byte	.LFE2858
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 20
 	.8byte	0
 	.8byte	0
-.LLST195:
-	.8byte	.LVL685
-	.8byte	.LVL686
+.LLST203:
+	.8byte	.LVL682
+	.8byte	.LVL683
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST196:
-	.8byte	.LVL685
-	.8byte	.LVL687
+.LLST204:
+	.8byte	.LVL682
+	.8byte	.LVL684
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST197:
-	.8byte	.LVL685
-	.8byte	.LVL688-1
+.LLST205:
+	.8byte	.LVL682
+	.8byte	.LVL685-1
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL688-1
-	.8byte	.LVL690
+	.8byte	.LVL685-1
+	.8byte	.LVL687
 	.2byte	0x1
 	.byte	0x63
 	.8byte	0
 	.8byte	0
-.LLST198:
-	.8byte	.LVL691
-	.8byte	.LVL692
+.LLST206:
+	.8byte	.LVL688
+	.8byte	.LVL689
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST199:
-	.8byte	.LVL691
-	.8byte	.LVL693
+.LLST207:
+	.8byte	.LVL688
+	.8byte	.LVL690
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST200:
+.LLST208:
+	.8byte	.LVL688
+	.8byte	.LVL691
+	.2byte	0x1
+	.byte	0x52
 	.8byte	.LVL691
 	.8byte	.LVL694
 	.2byte	0x1
-	.byte	0x52
-	.8byte	.LVL694
-	.8byte	.LVL697
-	.2byte	0x1
 	.byte	0x64
-	.8byte	.LVL698
+	.8byte	.LVL695
 	.8byte	.LFE2856
 	.2byte	0x1
 	.byte	0x64
 	.8byte	0
 	.8byte	0
-.LLST201:
-	.8byte	.LVL700
-	.8byte	.LVL701
+.LLST209:
+	.8byte	.LVL697
+	.8byte	.LVL698
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST202:
-	.8byte	.LVL700
-	.8byte	.LVL702
+.LLST210:
+	.8byte	.LVL697
+	.8byte	.LVL699
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST203:
+.LLST211:
+	.8byte	.LVL697
 	.8byte	.LVL700
-	.8byte	.LVL703
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL703
-	.8byte	.LVL704-1
+	.8byte	.LVL700
+	.8byte	.LVL701-1
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST213:
-	.8byte	.LVL725
-	.8byte	.LVL726-1
+.LLST221:
+	.8byte	.LVL722
+	.8byte	.LVL723-1
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST214:
-	.8byte	.LVL725
-	.8byte	.LVL726-1
+.LLST222:
+	.8byte	.LVL722
+	.8byte	.LVL723-1
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST215:
-	.8byte	.LVL725
-	.8byte	.LVL726-1
+.LLST223:
+	.8byte	.LVL722
+	.8byte	.LVL723-1
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL726-1
-	.8byte	.LVL728
+	.8byte	.LVL723-1
+	.8byte	.LVL725
 	.2byte	0x1
 	.byte	0x63
 	.8byte	0
@@ -59620,68 +59875,8 @@
 	.8byte	.LVL103
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL105
-	.8byte	.LVL106
-	.2byte	0x1
-	.byte	0x51
-	.8byte	.LVL112
-	.8byte	.LVL114
-	.2byte	0x1
-	.byte	0x51
-	.8byte	.LVL138
-	.8byte	.LVL139
-	.2byte	0x1
-	.byte	0x51
-	.8byte	.LVL141
-	.8byte	.LVL143
-	.2byte	0x1
-	.byte	0x51
-	.8byte	.LVL146
-	.8byte	.LVL148
-	.2byte	0x1
-	.byte	0x51
-	.8byte	.LVL161
-	.8byte	.LVL162
-	.2byte	0x1
-	.byte	0x51
-	.8byte	.LVL176
-	.8byte	.LVL178
-	.2byte	0x1
-	.byte	0x51
-	.8byte	.LVL190
-	.8byte	.LVL192
-	.2byte	0x1
-	.byte	0x51
-	.8byte	.LVL204
-	.8byte	.LVL205
-	.2byte	0x1
-	.byte	0x51
-	.8byte	.LVL207
-	.8byte	.LVL208
-	.2byte	0x1
-	.byte	0x51
-	.8byte	.LVL210
-	.8byte	.LVL211-1
-	.2byte	0x1
-	.byte	0x51
-	.8byte	.LVL227
-	.8byte	.LVL228
-	.2byte	0x1
-	.byte	0x51
-	.8byte	.LVL230
-	.8byte	.LVL232
-	.2byte	0x1
-	.byte	0x51
-	.8byte	.LVL244
-	.8byte	.LVL245
-	.2byte	0x1
-	.byte	0x51
-	.8byte	.LVL247
-	.8byte	.LVL249
-	.2byte	0x1
-	.byte	0x51
-	.8byte	.LVL258
-	.8byte	.LVL260
+	.8byte	.LVL287
+	.8byte	.LVL288
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
@@ -59692,495 +59887,147 @@
 	.2byte	0x1
 	.byte	0x52
 	.8byte	.LVL102
-	.8byte	.LVL110
+	.8byte	.LVL120
 	.2byte	0x1
 	.byte	0x65
-	.8byte	.LVL112
-	.8byte	.LVL142
+	.8byte	.LVL122
+	.8byte	.LVL223
 	.2byte	0x1
 	.byte	0x65
-	.8byte	.LVL142
-	.8byte	.LVL144-1
+	.8byte	.LVL225
+	.8byte	.LVL312
 	.2byte	0x1
-	.byte	0x52
-	.8byte	.LVL146
+	.byte	0x65
+	.8byte	.LVL314
 	.8byte	.LFE2849
 	.2byte	0x1
 	.byte	0x65
 	.8byte	0
 	.8byte	0
-.LLST33:
-	.8byte	.LVL108
-	.8byte	.LVL110
+.LLST107:
+	.8byte	.LVL118
+	.8byte	.LVL122
+	.2byte	0x2
+	.byte	0x91
+	.sleb128 -12
+	.8byte	.LVL253
+	.8byte	.LVL269
+	.2byte	0x2
+	.byte	0x91
+	.sleb128 -12
+	.8byte	.LVL327
+	.8byte	.LVL328
+	.2byte	0x2
+	.byte	0x91
+	.sleb128 -12
+	.8byte	0
+	.8byte	0
+.LLST108:
+	.8byte	.LVL255
+	.8byte	.LVL256
 	.2byte	0x1
-	.byte	0x66
-	.8byte	.LVL125
-	.8byte	.LVL127
+	.byte	0x51
+	.8byte	.LVL257
+	.8byte	.LVL258
 	.2byte	0x1
-	.byte	0x66
-	.8byte	.LVL329
-	.8byte	.LVL331
+	.byte	0x51
+	.8byte	.LVL268
+	.8byte	.LVL269
 	.2byte	0x1
-	.byte	0x66
-	.8byte	.LVL335
-	.8byte	.LVL336
+	.byte	0x51
+	.8byte	0
+	.8byte	0
+.LLST109:
+	.8byte	.LVL118
+	.8byte	.LVL119
+	.2byte	0x1
+	.byte	0x51
+	.8byte	.LVL257
+	.8byte	.LVL260
+	.2byte	0x1
+	.byte	0x51
+	.8byte	0
+	.8byte	0
+.LLST110:
+	.8byte	.LVL254
+	.8byte	.LVL259
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL336
-	.8byte	.LVL338
+	.8byte	.LVL267
+	.8byte	.LVL269
 	.2byte	0x1
-	.byte	0x66
+	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST34:
+.LLST111:
+	.8byte	.LVL252
+	.8byte	.LVL256
+	.2byte	0x1
+	.byte	0x51
+	.8byte	.LVL267
+	.8byte	.LVL268
+	.2byte	0x1
+	.byte	0x51
+	.8byte	0
+	.8byte	0
+.LLST112:
+	.8byte	.LVL264
+	.8byte	.LVL266-1
+	.2byte	0x1
+	.byte	0x53
+	.8byte	0
+	.8byte	0
+.LLST113:
+	.8byte	.LVL262
+	.8byte	.LVL265
+	.2byte	0x1
+	.byte	0x51
+	.8byte	0
+	.8byte	0
+.LLST114:
+	.8byte	.LVL261
+	.8byte	.LVL263
+	.2byte	0x1
+	.byte	0x52
+	.8byte	0
+	.8byte	0
+.LLST33:
 	.8byte	.LVL115
 	.8byte	.LVL116
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL117
-	.8byte	.LVL118
+	.8byte	.LVL321
+	.8byte	.LVL323
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL279
-	.8byte	.LVL280
+	.8byte	.LVL333
+	.8byte	.LVL335
+	.2byte	0x1
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST34:
+	.8byte	.LVL106
+	.8byte	.LVL108
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL109
+	.8byte	.LVL110
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
 .LLST35:
-	.8byte	.LVL117
-	.8byte	.LVL119
-	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL300
-	.8byte	.LVL301
-	.2byte	0x1
-	.byte	0x50
-	.8byte	0
-	.8byte	0
-.LLST36:
-	.8byte	.LVL108
 	.8byte	.LVL109
-	.2byte	0x1
-	.byte	0x51
-	.8byte	.LVL114
-	.8byte	.LVL122
-	.2byte	0x1
-	.byte	0x51
-	.8byte	.LVL278
-	.8byte	.LVL280
-	.2byte	0x1
-	.byte	0x51
-	.8byte	.LVL300
-	.8byte	.LVL302
-	.2byte	0x1
-	.byte	0x51
-	.8byte	0
-	.8byte	0
-.LLST37:
-	.8byte	.LVL113
-	.8byte	.LVL116
+	.8byte	.LVL115-1
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL278
-	.8byte	.LVL279
+	.8byte	.LVL320
+	.8byte	.LVL321
 	.2byte	0x1
 	.byte	0x50
-	.8byte	0
-	.8byte	0
-.LLST38:
-	.8byte	.LVL122
-	.8byte	.LVL124-1
-	.2byte	0x1
-	.byte	0x51
-	.8byte	0
-	.8byte	0
-.LLST39:
-	.8byte	.LVL120
-	.8byte	.LVL123
-	.2byte	0x1
-	.byte	0x52
-	.8byte	0
-	.8byte	0
-.LLST40:
-	.8byte	.LVL119
-	.8byte	.LVL121
-	.2byte	0x1
-	.byte	0x50
-	.8byte	0
-	.8byte	0
-.LLST41:
-	.8byte	.LVL132
-	.8byte	.LVL134
-	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL294
-	.8byte	.LVL295
-	.2byte	0x1
-	.byte	0x50
-	.8byte	0
-	.8byte	0
-.LLST42:
-	.8byte	.LVL133
-	.8byte	.LVL136
-	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL310
-	.8byte	.LVL311
-	.2byte	0x1
-	.byte	0x50
-	.8byte	0
-	.8byte	0
-.LLST43:
-	.8byte	.LVL130
-	.8byte	.LVL137-1
-	.2byte	0x1
-	.byte	0x51
-	.8byte	.LVL294
-	.8byte	.LVL295
-	.2byte	0x1
-	.byte	0x51
-	.8byte	.LVL310
-	.8byte	.LVL313
-	.2byte	0x1
-	.byte	0x51
-	.8byte	0
-	.8byte	0
-.LLST44:
-	.8byte	.LVL129
-	.8byte	.LVL131
-	.2byte	0x1
-	.byte	0x52
-	.8byte	.LVL133
-	.8byte	.LVL137-1
-	.2byte	0x1
-	.byte	0x52
-	.8byte	.LVL294
-	.8byte	.LVL295
-	.2byte	0x1
-	.byte	0x52
-	.8byte	.LVL310
-	.8byte	.LVL315
-	.2byte	0x1
-	.byte	0x52
-	.8byte	0
-	.8byte	0
-.LLST45:
-	.8byte	.LVL314
-	.8byte	.LVL316-1
-	.2byte	0x1
-	.byte	0x50
-	.8byte	0
-	.8byte	0
-.LLST46:
-	.8byte	.LVL311
-	.8byte	.LVL314
-	.2byte	0x1
-	.byte	0x50
-	.8byte	0
-	.8byte	0
-.LLST47:
-	.8byte	.LVL108
-	.8byte	.LVL111
-	.2byte	0x1
-	.byte	0x67
-	.8byte	.LVL135
-	.8byte	.LVL138
-	.2byte	0x1
-	.byte	0x67
-	.8byte	.LVL312
-	.8byte	.LVL317
-	.2byte	0x1
-	.byte	0x67
-	.8byte	.LVL330
-	.8byte	.LVL331
-	.2byte	0x1
-	.byte	0x67
-	.8byte	0
-	.8byte	0
-.LLST48:
-	.8byte	.LVL149
-	.8byte	.LVL150
-	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL151
-	.8byte	.LVL152
-	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL283
-	.8byte	.LVL284
-	.2byte	0x1
-	.byte	0x50
-	.8byte	0
-	.8byte	0
-.LLST49:
-	.8byte	.LVL151
-	.8byte	.LVL153
-	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL300
-	.8byte	.LVL301
-	.2byte	0x1
-	.byte	0x50
-	.8byte	0
-	.8byte	0
-.LLST50:
-	.8byte	.LVL108
-	.8byte	.LVL109
-	.2byte	0x1
-	.byte	0x51
-	.8byte	.LVL148
-	.8byte	.LVL154
-	.2byte	0x1
-	.byte	0x51
-	.8byte	.LVL282
-	.8byte	.LVL284
-	.2byte	0x1
-	.byte	0x51
-	.8byte	.LVL300
-	.8byte	.LVL302
-	.2byte	0x1
-	.byte	0x51
-	.8byte	0
-	.8byte	0
-.LLST51:
-	.8byte	.LVL147
-	.8byte	.LVL150
-	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL282
-	.8byte	.LVL283
-	.2byte	0x1
-	.byte	0x50
-	.8byte	0
-	.8byte	0
-.LLST52:
-	.8byte	.LVL156
-	.8byte	.LVL158-1
-	.2byte	0x1
-	.byte	0x51
-	.8byte	0
-	.8byte	0
-.LLST53:
-	.8byte	.LVL155
-	.8byte	.LVL157
-	.2byte	0x1
-	.byte	0x50
-	.8byte	0
-	.8byte	0
-.LLST54:
-	.8byte	.LVL154
-	.8byte	.LVL156
-	.2byte	0x1
-	.byte	0x51
-	.8byte	0
-	.8byte	0
-.LLST55:
-	.8byte	.LVL164
-	.8byte	.LVL165
-	.2byte	0x1
-	.byte	0x51
-	.8byte	.LVL166
-	.8byte	.LVL167
-	.2byte	0x1
-	.byte	0x51
-	.8byte	.LVL285
-	.8byte	.LVL286
-	.2byte	0x1
-	.byte	0x51
-	.8byte	0
-	.8byte	0
-.LLST56:
-	.8byte	.LVL108
-	.8byte	.LVL109
-	.2byte	0x1
-	.byte	0x51
-	.8byte	.LVL166
-	.8byte	.LVL169
-	.2byte	0x1
-	.byte	0x51
-	.8byte	0
-	.8byte	0
-.LLST57:
-	.8byte	.LVL163
-	.8byte	.LVL168
-	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL284
-	.8byte	.LVL286
-	.2byte	0x1
-	.byte	0x50
-	.8byte	0
-	.8byte	0
-.LLST58:
-	.8byte	.LVL162
-	.8byte	.LVL165
-	.2byte	0x1
-	.byte	0x51
-	.8byte	.LVL284
-	.8byte	.LVL285
-	.2byte	0x1
-	.byte	0x51
-	.8byte	0
-	.8byte	0
-.LLST59:
-	.8byte	.LVL173
-	.8byte	.LVL175-1
-	.2byte	0x1
-	.byte	0x53
-	.8byte	0
-	.8byte	0
-.LLST60:
-	.8byte	.LVL171
-	.8byte	.LVL174
-	.2byte	0x1
-	.byte	0x51
-	.8byte	0
-	.8byte	0
-.LLST61:
-	.8byte	.LVL170
-	.8byte	.LVL172
-	.2byte	0x1
-	.byte	0x52
-	.8byte	0
-	.8byte	0
-.LLST62:
-	.8byte	.LVL187
-	.8byte	.LVL188
-	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL296
-	.8byte	.LVL298
-	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL331
-	.8byte	.LVL333
-	.2byte	0x1
-	.byte	0x50
-	.8byte	0
-	.8byte	0
-.LLST63:
-	.8byte	.LVL179
-	.8byte	.LVL180
-	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL181
-	.8byte	.LVL182
-	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL287
-	.8byte	.LVL288
-	.2byte	0x1
-	.byte	0x50
-	.8byte	0
-	.8byte	0
-.LLST64:
-	.8byte	.LVL181
-	.8byte	.LVL187-1
-	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL295
-	.8byte	.LVL296
-	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL296
-	.8byte	.LVL299-1
-	.2byte	0x1
-	.byte	0x53
-	.8byte	.LVL332
-	.8byte	.LVL333
-	.2byte	0x1
-	.byte	0x53
-	.8byte	0
-	.8byte	0
-.LLST65:
-	.8byte	.LVL178
-	.8byte	.LVL183
-	.2byte	0x1
-	.byte	0x51
-	.8byte	.LVL286
-	.8byte	.LVL288
-	.2byte	0x1
-	.byte	0x51
-	.8byte	.LVL295
-	.8byte	.LVL297
-	.2byte	0x1
-	.byte	0x51
-	.8byte	0
-	.8byte	0
-.LLST66:
-	.8byte	.LVL177
-	.8byte	.LVL180
-	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL286
-	.8byte	.LVL287
-	.2byte	0x1
-	.byte	0x50
-	.8byte	0
-	.8byte	0
-.LLST67:
-	.8byte	.LVL185
-	.8byte	.LVL187-1
-	.2byte	0x1
-	.byte	0x51
-	.8byte	0
-	.8byte	0
-.LLST68:
-	.8byte	.LVL184
-	.8byte	.LVL186
-	.2byte	0x1
-	.byte	0x50
-	.8byte	0
-	.8byte	0
-.LLST69:
-	.8byte	.LVL183
-	.8byte	.LVL185
-	.2byte	0x1
-	.byte	0x51
-	.8byte	0
-	.8byte	0
-.LLST70:
-	.8byte	.LVL201
-	.8byte	.LVL202
-	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL324
-	.8byte	.LVL326
-	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL333
-	.8byte	.LVL335
-	.2byte	0x1
-	.byte	0x50
-	.8byte	0
-	.8byte	0
-.LLST71:
-	.8byte	.LVL193
-	.8byte	.LVL194
-	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL195
-	.8byte	.LVL196
-	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL289
-	.8byte	.LVL290
-	.2byte	0x1
-	.byte	0x50
-	.8byte	0
-	.8byte	0
-.LLST72:
-	.8byte	.LVL195
-	.8byte	.LVL201-1
-	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL323
-	.8byte	.LVL324
-	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL324
-	.8byte	.LVL327-1
+	.8byte	.LVL321
+	.8byte	.LVL324-1
 	.2byte	0x1
 	.byte	0x53
 	.8byte	.LVL334
@@ -60189,225 +60036,463 @@
 	.byte	0x53
 	.8byte	0
 	.8byte	0
-.LLST73:
-	.8byte	.LVL192
+.LLST36:
+	.8byte	.LVL105
+	.8byte	.LVL111
+	.2byte	0x1
+	.byte	0x51
+	.8byte	.LVL320
+	.8byte	.LVL322
+	.2byte	0x1
+	.byte	0x51
+	.8byte	0
+	.8byte	0
+.LLST37:
+	.8byte	.LVL104
+	.8byte	.LVL106
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL107
+	.8byte	.LVL108
+	.2byte	0x1
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST38:
+	.8byte	.LVL113
+	.8byte	.LVL115-1
+	.2byte	0x1
+	.byte	0x51
+	.8byte	0
+	.8byte	0
+.LLST39:
+	.8byte	.LVL112
+	.8byte	.LVL114
+	.2byte	0x1
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST40:
+	.8byte	.LVL111
+	.8byte	.LVL113
+	.2byte	0x1
+	.byte	0x51
+	.8byte	0
+	.8byte	0
+.LLST41:
+	.8byte	.LVL129
+	.8byte	.LVL130
+	.2byte	0x1
+	.byte	0x51
+	.8byte	.LVL131
+	.8byte	.LVL132
+	.2byte	0x1
+	.byte	0x51
+	.8byte	.LVL279
+	.8byte	.LVL280
+	.2byte	0x1
+	.byte	0x51
+	.8byte	0
+	.8byte	0
+.LLST42:
+	.8byte	.LVL118
+	.8byte	.LVL119
+	.2byte	0x1
+	.byte	0x51
+	.8byte	.LVL131
+	.8byte	.LVL134
+	.2byte	0x1
+	.byte	0x51
+	.8byte	0
+	.8byte	0
+.LLST43:
+	.8byte	.LVL128
+	.8byte	.LVL133
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL278
+	.8byte	.LVL280
+	.2byte	0x1
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST44:
+	.8byte	.LVL127
+	.8byte	.LVL130
+	.2byte	0x1
+	.byte	0x51
+	.8byte	.LVL278
+	.8byte	.LVL279
+	.2byte	0x1
+	.byte	0x51
+	.8byte	0
+	.8byte	0
+.LLST45:
+	.8byte	.LVL138
+	.8byte	.LVL140-1
+	.2byte	0x1
+	.byte	0x53
+	.8byte	0
+	.8byte	0
+.LLST46:
+	.8byte	.LVL136
+	.8byte	.LVL139
+	.2byte	0x1
+	.byte	0x51
+	.8byte	0
+	.8byte	0
+.LLST47:
+	.8byte	.LVL135
+	.8byte	.LVL137
+	.2byte	0x1
+	.byte	0x52
+	.8byte	0
+	.8byte	0
+.LLST48:
+	.8byte	.LVL151
+	.8byte	.LVL152
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL315
+	.8byte	.LVL317
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL331
+	.8byte	.LVL333
+	.2byte	0x1
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST49:
+	.8byte	.LVL143
+	.8byte	.LVL144
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL145
+	.8byte	.LVL146
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL281
+	.8byte	.LVL282
+	.2byte	0x1
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST50:
+	.8byte	.LVL145
+	.8byte	.LVL151-1
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL314
+	.8byte	.LVL315
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL315
+	.8byte	.LVL318-1
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL332
+	.8byte	.LVL333
+	.2byte	0x1
+	.byte	0x53
+	.8byte	0
+	.8byte	0
+.LLST51:
+	.8byte	.LVL142
+	.8byte	.LVL147
+	.2byte	0x1
+	.byte	0x51
+	.8byte	.LVL280
+	.8byte	.LVL282
+	.2byte	0x1
+	.byte	0x51
+	.8byte	.LVL314
+	.8byte	.LVL316
+	.2byte	0x1
+	.byte	0x51
+	.8byte	0
+	.8byte	0
+.LLST52:
+	.8byte	.LVL141
+	.8byte	.LVL144
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL280
+	.8byte	.LVL281
+	.2byte	0x1
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST53:
+	.8byte	.LVL149
+	.8byte	.LVL151-1
+	.2byte	0x1
+	.byte	0x51
+	.8byte	0
+	.8byte	0
+.LLST54:
+	.8byte	.LVL148
+	.8byte	.LVL150
+	.2byte	0x1
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST55:
+	.8byte	.LVL147
+	.8byte	.LVL149
+	.2byte	0x1
+	.byte	0x51
+	.8byte	0
+	.8byte	0
+.LLST56:
+	.8byte	.LVL156
+	.8byte	.LVL157
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL158
+	.8byte	.LVL159
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL270
+	.8byte	.LVL271
+	.2byte	0x1
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST57:
+	.8byte	.LVL158
+	.8byte	.LVL160
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL295
+	.8byte	.LVL296
+	.2byte	0x1
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST58:
+	.8byte	.LVL118
+	.8byte	.LVL119
+	.2byte	0x1
+	.byte	0x51
+	.8byte	.LVL155
+	.8byte	.LVL161
+	.2byte	0x1
+	.byte	0x51
+	.8byte	.LVL269
+	.8byte	.LVL271
+	.2byte	0x1
+	.byte	0x51
+	.8byte	.LVL295
+	.8byte	.LVL297
+	.2byte	0x1
+	.byte	0x51
+	.8byte	0
+	.8byte	0
+.LLST59:
+	.8byte	.LVL154
+	.8byte	.LVL157
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL269
+	.8byte	.LVL270
+	.2byte	0x1
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST60:
+	.8byte	.LVL163
+	.8byte	.LVL165-1
+	.2byte	0x1
+	.byte	0x51
+	.8byte	0
+	.8byte	0
+.LLST61:
+	.8byte	.LVL162
+	.8byte	.LVL164
+	.2byte	0x1
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST62:
+	.8byte	.LVL161
+	.8byte	.LVL163
+	.2byte	0x1
+	.byte	0x51
+	.8byte	0
+	.8byte	0
+.LLST63:
+	.8byte	.LVL173
+	.8byte	.LVL174
+	.2byte	0x1
+	.byte	0x51
+	.8byte	.LVL175
+	.8byte	.LVL176
+	.2byte	0x1
+	.byte	0x51
+	.8byte	.LVL285
+	.8byte	.LVL286
+	.2byte	0x1
+	.byte	0x51
+	.8byte	0
+	.8byte	0
+.LLST64:
+	.8byte	.LVL118
+	.8byte	.LVL119
+	.2byte	0x1
+	.byte	0x51
+	.8byte	.LVL175
+	.8byte	.LVL178
+	.2byte	0x1
+	.byte	0x51
+	.8byte	0
+	.8byte	0
+.LLST65:
+	.8byte	.LVL172
+	.8byte	.LVL177
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL284
+	.8byte	.LVL286
+	.2byte	0x1
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST66:
+	.8byte	.LVL171
+	.8byte	.LVL174
+	.2byte	0x1
+	.byte	0x51
+	.8byte	.LVL284
+	.8byte	.LVL285
+	.2byte	0x1
+	.byte	0x51
+	.8byte	0
+	.8byte	0
+.LLST67:
+	.8byte	.LVL182
+	.8byte	.LVL184-1
+	.2byte	0x1
+	.byte	0x53
+	.8byte	0
+	.8byte	0
+.LLST68:
+	.8byte	.LVL180
+	.8byte	.LVL183
+	.2byte	0x1
+	.byte	0x51
+	.8byte	0
+	.8byte	0
+.LLST69:
+	.8byte	.LVL179
+	.8byte	.LVL181
+	.2byte	0x1
+	.byte	0x52
+	.8byte	0
+	.8byte	0
+.LLST70:
 	.8byte	.LVL197
+	.8byte	.LVL198
 	.2byte	0x1
-	.byte	0x51
-	.8byte	.LVL288
+	.byte	0x50
+	.8byte	.LVL291
+	.8byte	.LVL293
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL335
+	.8byte	.LFE2849
+	.2byte	0x1
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST71:
+	.8byte	.LVL189
+	.8byte	.LVL190
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL191
+	.8byte	.LVL192
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL283
+	.8byte	.LVL284
+	.2byte	0x1
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST72:
+	.8byte	.LVL191
+	.8byte	.LVL197-1
+	.2byte	0x1
+	.byte	0x50
 	.8byte	.LVL290
+	.8byte	.LVL291
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL291
+	.8byte	.LVL294-1
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL336
+	.8byte	.LFE2849
+	.2byte	0x1
+	.byte	0x53
+	.8byte	0
+	.8byte	0
+.LLST73:
+	.8byte	.LVL188
+	.8byte	.LVL193
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL323
-	.8byte	.LVL325
+	.8byte	.LVL282
+	.8byte	.LVL284
+	.2byte	0x1
+	.byte	0x51
+	.8byte	.LVL290
+	.8byte	.LVL292
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
 .LLST74:
-	.8byte	.LVL191
-	.8byte	.LVL194
+	.8byte	.LVL187
+	.8byte	.LVL190
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL288
-	.8byte	.LVL289
+	.8byte	.LVL282
+	.8byte	.LVL283
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
 .LLST75:
-	.8byte	.LVL199
-	.8byte	.LVL201-1
+	.8byte	.LVL195
+	.8byte	.LVL197-1
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
 .LLST76:
-	.8byte	.LVL198
-	.8byte	.LVL200
+	.8byte	.LVL194
+	.8byte	.LVL196
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
 .LLST77:
-	.8byte	.LVL197
-	.8byte	.LVL199
+	.8byte	.LVL193
+	.8byte	.LVL195
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
 .LLST78:
-	.8byte	.LVL215
-	.8byte	.LVL216
-	.2byte	0x1
-	.byte	0x51
-	.8byte	.LVL217
-	.8byte	.LVL218
-	.2byte	0x1
-	.byte	0x51
-	.8byte	.LVL293
-	.8byte	.LVL294
-	.2byte	0x1
-	.byte	0x51
-	.8byte	0
-	.8byte	0
-.LLST79:
-	.8byte	.LVL108
-	.8byte	.LVL109
-	.2byte	0x1
-	.byte	0x51
-	.8byte	.LVL217
-	.8byte	.LVL220
-	.2byte	0x1
-	.byte	0x51
-	.8byte	0
-	.8byte	0
-.LLST80:
-	.8byte	.LVL214
-	.8byte	.LVL219
+	.8byte	.LVL202
+	.8byte	.LVL203
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL292
-	.8byte	.LVL294
-	.2byte	0x1
-	.byte	0x50
-	.8byte	0
-	.8byte	0
-.LLST81:
-	.8byte	.LVL213
-	.8byte	.LVL216
-	.2byte	0x1
-	.byte	0x51
-	.8byte	.LVL292
-	.8byte	.LVL293
-	.2byte	0x1
-	.byte	0x51
-	.8byte	0
-	.8byte	0
-.LLST82:
-	.8byte	.LVL224
-	.8byte	.LVL226-1
-	.2byte	0x1
-	.byte	0x53
-	.8byte	0
-	.8byte	0
-.LLST83:
-	.8byte	.LVL222
-	.8byte	.LVL225
-	.2byte	0x1
-	.byte	0x51
-	.8byte	0
-	.8byte	0
-.LLST84:
-	.8byte	.LVL221
-	.8byte	.LVL223
-	.2byte	0x1
-	.byte	0x52
-	.8byte	0
-	.8byte	0
-.LLST85:
-	.8byte	.LVL241
-	.8byte	.LVL242
-	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL318
-	.8byte	.LVL320
-	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL338
-	.8byte	.LFE2849
-	.2byte	0x1
-	.byte	0x50
-	.8byte	0
-	.8byte	0
-.LLST86:
-	.8byte	.LVL233
-	.8byte	.LVL234
-	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL235
-	.8byte	.LVL236
-	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL291
-	.8byte	.LVL292
-	.2byte	0x1
-	.byte	0x50
-	.8byte	0
-	.8byte	0
-.LLST87:
-	.8byte	.LVL235
-	.8byte	.LVL241-1
-	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL317
-	.8byte	.LVL318
-	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL318
-	.8byte	.LVL321-1
-	.2byte	0x1
-	.byte	0x53
-	.8byte	.LVL339
-	.8byte	.LFE2849
-	.2byte	0x1
-	.byte	0x53
-	.8byte	0
-	.8byte	0
-.LLST88:
-	.8byte	.LVL232
-	.8byte	.LVL237
-	.2byte	0x1
-	.byte	0x51
-	.8byte	.LVL290
-	.8byte	.LVL292
-	.2byte	0x1
-	.byte	0x51
-	.8byte	.LVL317
-	.8byte	.LVL319
-	.2byte	0x1
-	.byte	0x51
-	.8byte	0
-	.8byte	0
-.LLST89:
-	.8byte	.LVL231
-	.8byte	.LVL234
-	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL290
-	.8byte	.LVL291
-	.2byte	0x1
-	.byte	0x50
-	.8byte	0
-	.8byte	0
-.LLST90:
-	.8byte	.LVL239
-	.8byte	.LVL241-1
-	.2byte	0x1
-	.byte	0x51
-	.8byte	0
-	.8byte	0
-.LLST91:
-	.8byte	.LVL238
-	.8byte	.LVL240
-	.2byte	0x1
-	.byte	0x50
-	.8byte	0
-	.8byte	0
-.LLST92:
-	.8byte	.LVL237
-	.8byte	.LVL239
-	.2byte	0x1
-	.byte	0x51
-	.8byte	0
-	.8byte	0
-.LLST93:
-	.8byte	.LVL251
-	.8byte	.LVL252
-	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL253
-	.8byte	.LVL254
+	.8byte	.LVL204
+	.8byte	.LVL205
 	.2byte	0x1
 	.byte	0x50
 	.8byte	.LVL277
@@ -60416,148 +60501,337 @@
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST94:
-	.8byte	.LVL253
-	.8byte	.LVL255
+.LLST79:
+	.8byte	.LVL204
+	.8byte	.LVL206
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL302
-	.8byte	.LVL304
+	.8byte	.LVL297
+	.8byte	.LVL299
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST95:
-	.8byte	.LVL250
-	.8byte	.LVL256
+.LLST80:
+	.8byte	.LVL201
+	.8byte	.LVL207
 	.2byte	0x1
 	.byte	0x51
 	.8byte	.LVL275
 	.8byte	.LVL278
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL302
-	.8byte	.LVL303
+	.8byte	.LVL297
+	.8byte	.LVL298
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST96:
-	.8byte	.LVL248
-	.8byte	.LVL257-1
+.LLST81:
+	.8byte	.LVL200
+	.8byte	.LVL208-1
 	.2byte	0x1
 	.byte	0x52
 	.8byte	.LVL275
 	.8byte	.LVL276
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL302
-	.8byte	.LVL306
+	.8byte	.LVL297
+	.8byte	.LVL301
 	.2byte	0x1
 	.byte	0x52
 	.8byte	0
 	.8byte	0
-.LLST97:
-	.8byte	.LVL307
-	.8byte	.LVL309-1
+.LLST82:
+	.8byte	.LVL302
+	.8byte	.LVL304-1
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
+.LLST83:
+	.8byte	.LVL300
+	.8byte	.LVL303
+	.2byte	0x1
+	.byte	0x51
+	.8byte	0
+	.8byte	0
+.LLST84:
+	.8byte	.LVL299
+	.8byte	.LVL302
+	.2byte	0x1
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST85:
+	.8byte	.LVL211
+	.8byte	.LVL212
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL213
+	.8byte	.LVL214
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL274
+	.8byte	.LVL275
+	.2byte	0x1
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST86:
+	.8byte	.LVL213
+	.8byte	.LVL215
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL295
+	.8byte	.LVL296
+	.2byte	0x1
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST87:
+	.8byte	.LVL118
+	.8byte	.LVL119
+	.2byte	0x1
+	.byte	0x51
+	.8byte	.LVL210
+	.8byte	.LVL216
+	.2byte	0x1
+	.byte	0x51
+	.8byte	.LVL273
+	.8byte	.LVL275
+	.2byte	0x1
+	.byte	0x51
+	.8byte	.LVL295
+	.8byte	.LVL297
+	.2byte	0x1
+	.byte	0x51
+	.8byte	0
+	.8byte	0
+.LLST88:
+	.8byte	.LVL209
+	.8byte	.LVL212
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL273
+	.8byte	.LVL274
+	.2byte	0x1
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST89:
+	.8byte	.LVL218
+	.8byte	.LVL220-1
+	.2byte	0x1
+	.byte	0x51
+	.8byte	0
+	.8byte	0
+.LLST90:
+	.8byte	.LVL217
+	.8byte	.LVL219
+	.2byte	0x1
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST91:
+	.8byte	.LVL216
+	.8byte	.LVL218
+	.2byte	0x1
+	.byte	0x51
+	.8byte	0
+	.8byte	0
+.LLST92:
+	.8byte	.LVL118
+	.8byte	.LVL120
+	.2byte	0x1
+	.byte	0x66
+	.8byte	.LVL238
+	.8byte	.LVL240
+	.2byte	0x1
+	.byte	0x66
+	.8byte	.LVL326
+	.8byte	.LVL328
+	.2byte	0x1
+	.byte	0x66
+	.8byte	.LVL328
+	.8byte	.LVL329
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL329
+	.8byte	.LVL331
+	.2byte	0x1
+	.byte	0x66
+	.8byte	0
+	.8byte	0
+.LLST93:
+	.8byte	.LVL228
+	.8byte	.LVL229
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL230
+	.8byte	.LVL231
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL272
+	.8byte	.LVL273
+	.2byte	0x1
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST94:
+	.8byte	.LVL230
+	.8byte	.LVL232
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL295
+	.8byte	.LVL296
+	.2byte	0x1
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST95:
+	.8byte	.LVL118
+	.8byte	.LVL119
+	.2byte	0x1
+	.byte	0x51
+	.8byte	.LVL227
+	.8byte	.LVL235
+	.2byte	0x1
+	.byte	0x51
+	.8byte	.LVL271
+	.8byte	.LVL273
+	.2byte	0x1
+	.byte	0x51
+	.8byte	.LVL295
+	.8byte	.LVL297
+	.2byte	0x1
+	.byte	0x51
+	.8byte	0
+	.8byte	0
+.LLST96:
+	.8byte	.LVL226
+	.8byte	.LVL229
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL271
+	.8byte	.LVL272
+	.2byte	0x1
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST97:
+	.8byte	.LVL235
+	.8byte	.LVL237-1
+	.2byte	0x1
+	.byte	0x51
+	.8byte	0
+	.8byte	0
 .LLST98:
+	.8byte	.LVL233
+	.8byte	.LVL236
+	.2byte	0x1
+	.byte	0x52
+	.8byte	0
+	.8byte	0
+.LLST99:
+	.8byte	.LVL232
+	.8byte	.LVL234
+	.2byte	0x1
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST100:
+	.8byte	.LVL245
+	.8byte	.LVL247
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL286
+	.8byte	.LVL287
+	.2byte	0x1
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST101:
+	.8byte	.LVL246
+	.8byte	.LVL249
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL305
+	.8byte	.LVL306
+	.2byte	0x1
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST102:
+	.8byte	.LVL243
+	.8byte	.LVL250-1
+	.2byte	0x1
+	.byte	0x51
+	.8byte	.LVL286
+	.8byte	.LVL287
+	.2byte	0x1
+	.byte	0x51
 	.8byte	.LVL305
 	.8byte	.LVL308
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST99:
-	.8byte	.LVL304
-	.8byte	.LVL307
-	.2byte	0x1
-	.byte	0x50
-	.8byte	0
-	.8byte	0
-.LLST100:
-	.8byte	.LVL261
-	.8byte	.LVL262
-	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL263
-	.8byte	.LVL264
-	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL281
-	.8byte	.LVL282
-	.2byte	0x1
-	.byte	0x50
-	.8byte	0
-	.8byte	0
-.LLST101:
-	.8byte	.LVL263
-	.8byte	.LVL265
-	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL300
-	.8byte	.LVL301
-	.2byte	0x1
-	.byte	0x50
-	.8byte	0
-	.8byte	0
-.LLST102:
-	.8byte	.LVL108
-	.8byte	.LVL109
-	.2byte	0x1
-	.byte	0x51
-	.8byte	.LVL260
-	.8byte	.LVL266
-	.2byte	0x1
-	.byte	0x51
-	.8byte	.LVL280
-	.8byte	.LVL282
-	.2byte	0x1
-	.byte	0x51
-	.8byte	.LVL300
-	.8byte	.LVL302
-	.2byte	0x1
-	.byte	0x51
-	.8byte	0
-	.8byte	0
 .LLST103:
-	.8byte	.LVL259
-	.8byte	.LVL262
+	.8byte	.LVL242
+	.8byte	.LVL244
 	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL280
-	.8byte	.LVL281
+	.byte	0x52
+	.8byte	.LVL246
+	.8byte	.LVL250-1
 	.2byte	0x1
-	.byte	0x50
+	.byte	0x52
+	.8byte	.LVL286
+	.8byte	.LVL287
+	.2byte	0x1
+	.byte	0x52
+	.8byte	.LVL305
+	.8byte	.LVL310
+	.2byte	0x1
+	.byte	0x52
 	.8byte	0
 	.8byte	0
 .LLST104:
-	.8byte	.LVL268
-	.8byte	.LVL270-1
+	.8byte	.LVL309
+	.8byte	.LVL311-1
 	.2byte	0x1
-	.byte	0x51
+	.byte	0x50
 	.8byte	0
 	.8byte	0
 .LLST105:
-	.8byte	.LVL267
-	.8byte	.LVL269
+	.8byte	.LVL306
+	.8byte	.LVL309
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
 .LLST106:
-	.8byte	.LVL266
-	.8byte	.LVL268
+	.8byte	.LVL117
+	.8byte	.LVL121
 	.2byte	0x1
-	.byte	0x51
+	.byte	0x67
+	.8byte	.LVL248
+	.8byte	.LVL251
+	.2byte	0x1
+	.byte	0x67
+	.8byte	.LVL307
+	.8byte	.LVL312
+	.2byte	0x1
+	.byte	0x67
+	.8byte	.LVL327
+	.8byte	.LVL328
+	.2byte	0x1
+	.byte	0x67
 	.8byte	0
 	.8byte	0
-.LLST185:
-	.8byte	.LVL654
-	.8byte	.LVL655-1
+.LLST193:
+	.8byte	.LVL651
+	.8byte	.LVL652-1
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
@@ -60569,267 +60843,181 @@
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST348:
-	.8byte	.LVL1323
-	.8byte	.LVL1324
+.LLST356:
+	.8byte	.LVL1315
+	.8byte	.LVL1316
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST349:
-	.8byte	.LVL1325
-	.8byte	.LVL1421
+.LLST357:
+	.8byte	.LVL1318
+	.8byte	.LVL1323
+	.2byte	0x1
+	.byte	0x64
+	.8byte	.LVL1327
+	.8byte	.LFE2844
+	.2byte	0x1
+	.byte	0x64
+	.8byte	0
+	.8byte	0
+.LLST358:
+	.8byte	.LVL1403
+	.8byte	.LVL1408
 	.2byte	0x1
 	.byte	0x63
-	.8byte	.LVL1425
+	.8byte	.LVL1443
+	.8byte	.LVL1450
+	.2byte	0x1
+	.byte	0x63
+	.8byte	.LVL1483
+	.8byte	.LVL1496
+	.2byte	0x1
+	.byte	0x63
+	.8byte	.LVL1497
+	.8byte	.LVL1498
+	.2byte	0x1
+	.byte	0x63
+	.8byte	.LVL1505
+	.8byte	.LVL1508
+	.2byte	0x1
+	.byte	0x63
+	.8byte	.LVL1514
+	.8byte	.LVL1518
+	.2byte	0x1
+	.byte	0x63
+	.8byte	.LVL1522
+	.8byte	.LVL1525
+	.2byte	0x1
+	.byte	0x63
+	.8byte	.LVL1531
+	.8byte	.LVL1533
+	.2byte	0x1
+	.byte	0x63
+	.8byte	.LVL1567
+	.8byte	.LVL1569
+	.2byte	0x1
+	.byte	0x63
+	.8byte	.LVL1578
+	.8byte	.LVL1580
+	.2byte	0x1
+	.byte	0x63
+	.8byte	.LVL1582
+	.8byte	.LVL1584
+	.2byte	0x1
+	.byte	0x63
+	.8byte	.LVL1593
+	.8byte	.LVL1596
+	.2byte	0x1
+	.byte	0x63
+	.8byte	0
+	.8byte	0
+.LLST359:
+	.8byte	.LVL1485
+	.8byte	.LVL1488
+	.2byte	0x1
+	.byte	0x51
+	.8byte	.LVL1516
+	.8byte	.LVL1517-1
+	.2byte	0x1
+	.byte	0x51
+	.8byte	0
+	.8byte	0
+.LLST360:
+	.8byte	.LVL1317
+	.8byte	.LVL1323
+	.2byte	0x1
+	.byte	0x63
+	.8byte	.LVL1327
+	.8byte	.LVL1403
+	.2byte	0x1
+	.byte	0x63
+	.8byte	.LVL1407
+	.8byte	.LVL1443
+	.2byte	0x1
+	.byte	0x63
+	.8byte	.LVL1450
+	.8byte	.LVL1483
+	.2byte	0x1
+	.byte	0x63
+	.8byte	.LVL1496
+	.8byte	.LVL1498
+	.2byte	0x1
+	.byte	0x63
+	.8byte	.LVL1505
+	.8byte	.LVL1514
+	.2byte	0x1
+	.byte	0x63
+	.8byte	.LVL1518
+	.8byte	.LVL1522
+	.2byte	0x1
+	.byte	0x63
+	.8byte	.LVL1525
+	.8byte	.LVL1557
+	.2byte	0x1
+	.byte	0x63
+	.8byte	.LVL1557
+	.8byte	.LVL1558
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL1558
+	.8byte	.LVL1561
+	.2byte	0x1
+	.byte	0x63
+	.8byte	.LVL1567
+	.8byte	.LVL1578
+	.2byte	0x1
+	.byte	0x63
+	.8byte	.LVL1580
+	.8byte	.LVL1593
+	.2byte	0x1
+	.byte	0x63
+	.8byte	.LVL1607
 	.8byte	.LFE2844
 	.2byte	0x1
 	.byte	0x63
 	.8byte	0
 	.8byte	0
-.LLST350:
-	.8byte	.LVL1326
-	.8byte	.LVL1340
-	.2byte	0x1
-	.byte	0x69
-	.8byte	.LVL1366
-	.8byte	.LVL1373
-	.2byte	0x1
-	.byte	0x69
-	.8byte	.LVL1389
-	.8byte	.LVL1392
-	.2byte	0x1
-	.byte	0x69
-	.8byte	.LVL1400
-	.8byte	.LVL1423
-	.2byte	0x1
-	.byte	0x69
-	.8byte	.LVL1425
-	.8byte	.LVL1437
-	.2byte	0x1
-	.byte	0x69
-	.8byte	.LVL1441
-	.8byte	.LVL1460
-	.2byte	0x1
-	.byte	0x69
-	.8byte	.LVL1462
-	.8byte	.LVL1473
-	.2byte	0x1
-	.byte	0x69
-	.8byte	.LVL1480
-	.8byte	.LVL1481
-	.2byte	0x1
-	.byte	0x69
-	.8byte	.LVL1485
-	.8byte	.LVL1564
-	.2byte	0x1
-	.byte	0x69
-	.8byte	.LVL1570
-	.8byte	.LVL1620
-	.2byte	0x1
-	.byte	0x69
-	.8byte	0
-	.8byte	0
-.LLST351:
-	.8byte	.LVL1464
-	.8byte	.LVL1468
-	.2byte	0x1
-	.byte	0x51
-	.8byte	.LVL1493
-	.8byte	.LVL1494-1
-	.2byte	0x1
-	.byte	0x51
-	.8byte	0
-	.8byte	0
-.LLST352:
-	.8byte	.LVL1326
-	.8byte	.LVL1327
+.LLST387:
+	.8byte	.LVL1414
+	.8byte	.LVL1415
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL1404
-	.8byte	.LVL1405
-	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL1430
-	.8byte	.LVL1432
-	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL1448
-	.8byte	.LVL1449
-	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL1457
-	.8byte	.LVL1458
-	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL1471
-	.8byte	.LVL1472
-	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL1526
 	.8byte	.LVL1527
+	.8byte	.LVL1528-1
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST379:
-	.8byte	.LVL1416
-	.8byte	.LVL1417
+.LLST402:
+	.8byte	.LVL1553
+	.8byte	.LVL1554
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL1539
-	.8byte	.LVL1540-1
+	.8byte	.LVL1618
+	.8byte	.LVL1619-1
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
 .LLST388:
-	.8byte	.LVL1535
-	.8byte	.LVL1536
+	.8byte	.LVL1427
+	.8byte	.LVL1429-1
 	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL1614
-	.8byte	.LVL1615-1
+	.byte	0x51
+	.8byte	.LVL1533
+	.8byte	.LVL1534
 	.2byte	0x1
-	.byte	0x50
-	.8byte	0
-	.8byte	0
-.LLST380:
-	.8byte	.LVL1326
-	.8byte	.LVL1340
-	.2byte	0x1
-	.byte	0x69
-	.8byte	.LVL1366
-	.8byte	.LVL1373
-	.2byte	0x1
-	.byte	0x69
-	.8byte	.LVL1389
-	.8byte	.LVL1392
-	.2byte	0x1
-	.byte	0x69
-	.8byte	.LVL1400
-	.8byte	.LVL1406
-	.2byte	0x1
-	.byte	0x69
-	.8byte	.LVL1410
-	.8byte	.LVL1423
-	.2byte	0x1
-	.byte	0x69
-	.8byte	.LVL1425
-	.8byte	.LVL1460
-	.2byte	0x1
-	.byte	0x69
-	.8byte	.LVL1480
-	.8byte	.LVL1481
-	.2byte	0x1
-	.byte	0x69
-	.8byte	.LVL1485
-	.8byte	.LVL1486
-	.2byte	0x1
-	.byte	0x69
-	.8byte	.LVL1501
-	.8byte	.LVL1562
-	.2byte	0x1
-	.byte	0x69
-	.8byte	.LVL1570
-	.8byte	.LVL1618
-	.2byte	0x1
-	.byte	0x69
-	.8byte	.LVL1627
-	.8byte	.LFE2844
-	.2byte	0x1
-	.byte	0x69
-	.8byte	0
-	.8byte	0
-.LLST381:
-	.8byte	.LVL1441
-	.8byte	.LVL1442-1
-	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL1628
-	.8byte	.LVL1629
-	.2byte	0x1
-	.byte	0x50
+	.byte	0x51
 	.8byte	0
 	.8byte	0
 .LLST389:
-	.8byte	.LVL1560
-	.8byte	.LVL1561-1
+	.8byte	.LVL1319
+	.8byte	.LVL1325
 	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL1593
-	.8byte	.LVL1594-1
-	.2byte	0x1
-	.byte	0x50
-	.8byte	0
-	.8byte	0
-.LLST387:
-	.8byte	.LVL1518
-	.8byte	.LVL1519-1
-	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL1550
-	.8byte	.LVL1551
-	.2byte	0x1
-	.byte	0x50
-	.8byte	0
-	.8byte	0
-.LLST390:
-	.8byte	.LVL1550
-	.8byte	.LVL1551
-	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL1597
-	.8byte	.LVL1598-1
-	.2byte	0x1
-	.byte	0x50
-	.8byte	0
-	.8byte	0
-.LLST384:
-	.8byte	.LVL1407
-	.8byte	.LVL1408
-	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL1489
-	.8byte	.LVL1490-1
-	.2byte	0x1
-	.byte	0x50
-	.8byte	0
-	.8byte	0
-.LLST382:
-	.8byte	.LVL1326
-	.8byte	.LVL1343
-	.2byte	0x1
-	.byte	0x6a
-	.8byte	.LVL1365
-	.8byte	.LVL1373
-	.2byte	0x1
-	.byte	0x6a
-	.8byte	.LVL1389
-	.8byte	.LVL1392
-	.2byte	0x1
-	.byte	0x6a
-	.8byte	.LVL1400
-	.8byte	.LVL1423
-	.2byte	0x1
-	.byte	0x6a
-	.8byte	.LVL1425
-	.8byte	.LVL1465
-	.2byte	0x1
-	.byte	0x6a
-	.8byte	.LVL1466
-	.8byte	.LVL1467
-	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL1467
-	.8byte	.LFE2844
-	.2byte	0x1
-	.byte	0x6a
-	.8byte	0
-	.8byte	0
-.LLST385:
-	.8byte	.LVL1326
-	.8byte	.LVL1340
+	.byte	0x69
+	.8byte	.LVL1327
+	.8byte	.LVL1341
 	.2byte	0x1
 	.byte	0x69
 	.8byte	.LVL1366
@@ -60841,281 +61029,403 @@
 	.2byte	0x1
 	.byte	0x69
 	.8byte	.LVL1400
-	.8byte	.LVL1406
+	.8byte	.LVL1436
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL1410
-	.8byte	.LVL1423
-	.2byte	0x1
-	.byte	0x69
-	.8byte	.LVL1425
 	.8byte	.LVL1437
+	.8byte	.LVL1438
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL1441
-	.8byte	.LVL1460
+	.8byte	.LVL1442
+	.8byte	.LVL1484
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL1470
-	.8byte	.LVL1473
-	.2byte	0x1
-	.byte	0x69
-	.8byte	.LVL1480
-	.8byte	.LVL1481
-	.2byte	0x1
-	.byte	0x69
-	.8byte	.LVL1485
-	.8byte	.LVL1486
-	.2byte	0x1
-	.byte	0x69
-	.8byte	.LVL1499
-	.8byte	.LVL1562
-	.2byte	0x1
-	.byte	0x69
-	.8byte	.LVL1570
-	.8byte	.LVL1618
-	.2byte	0x1
-	.byte	0x69
-	.8byte	.LVL1620
-	.8byte	.LVL1627
-	.2byte	0x1
-	.byte	0x69
-	.8byte	0
-	.8byte	0
-.LLST386:
-	.8byte	.LVL1499
-	.8byte	.LVL1500-1
-	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL1624
-	.8byte	.LVL1625
-	.2byte	0x1
-	.byte	0x50
-	.8byte	0
-	.8byte	0
-.LLST383:
-	.8byte	.LVL1477
-	.8byte	.LVL1478
-	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL1566
-	.8byte	.LVL1567-1
-	.2byte	0x1
-	.byte	0x50
-	.8byte	0
-	.8byte	0
-.LLST353:
-	.8byte	.LVL1326
-	.8byte	.LVL1329
-	.2byte	0x1
-	.byte	0x68
-	.8byte	.LVL1401
-	.8byte	.LVL1402
-	.2byte	0x1
-	.byte	0x68
-	.8byte	.LVL1419
-	.8byte	.LVL1422
-	.2byte	0x1
-	.byte	0x68
-	.8byte	.LVL1503
+	.8byte	.LVL1505
 	.8byte	.LVL1515
 	.2byte	0x1
-	.byte	0x68
-	.8byte	.LVL1527
-	.8byte	.LVL1529
+	.byte	0x69
+	.8byte	.LVL1518
+	.8byte	.LVL1524
 	.2byte	0x1
-	.byte	0x68
-	.8byte	.LVL1572
-	.8byte	.LVL1588
+	.byte	0x69
+	.8byte	.LVL1525
+	.8byte	.LVL1561
 	.2byte	0x1
-	.byte	0x68
+	.byte	0x69
+	.8byte	.LVL1567
+	.8byte	.LVL1593
+	.2byte	0x1
+	.byte	0x69
+	.8byte	.LVL1607
+	.8byte	.LFE2844
+	.2byte	0x1
+	.byte	0x69
 	.8byte	0
 	.8byte	0
-.LLST354:
-	.8byte	.LVL1506
-	.8byte	.LVL1507
+.LLST390:
+	.8byte	.LVL1428
+	.8byte	.LVL1429-1
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL1511
-	.8byte	.LVL1512
+	.8byte	.LVL1544
+	.8byte	.LVL1545
 	.2byte	0x1
 	.byte	0x50
-	.8byte	0
-	.8byte	0
-.LLST355:
-	.8byte	.LVL1326
-	.8byte	.LVL1328-1
-	.2byte	0x1
-	.byte	0x52
-	.8byte	.LVL1419
-	.8byte	.LVL1420
-	.2byte	0x1
-	.byte	0x52
-	.8byte	.LVL1505
-	.8byte	.LVL1508-1
-	.2byte	0x1
-	.byte	0x52
-	.8byte	.LVL1510
-	.8byte	.LVL1511-1
-	.2byte	0x1
-	.byte	0x52
-	.8byte	.LVL1511
-	.8byte	.LVL1513-1
-	.2byte	0x1
-	.byte	0x52
-	.8byte	.LVL1527
-	.8byte	.LVL1528-1
-	.2byte	0x1
-	.byte	0x52
-	.8byte	.LVL1572
-	.8byte	.LVL1573-1
-	.2byte	0x1
-	.byte	0x52
 	.8byte	0
 	.8byte	0
 .LLST391:
-	.8byte	.LVL1575
-	.8byte	.LVL1576-1
+	.8byte	.LVL1539
+	.8byte	.LVL1540
+	.2byte	0x1
+	.byte	0x51
+	.8byte	.LVL1542
+	.8byte	.LVL1543
+	.2byte	0x1
+	.byte	0x51
+	.8byte	0
+	.8byte	0
+.LLST395:
+	.8byte	.LVL1480
+	.8byte	.LVL1481-1
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL1578
-	.8byte	.LVL1579-1
+	.8byte	.LVL1628
+	.8byte	.LVL1629-1
+	.2byte	0x1
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST404:
+	.8byte	.LVL1574
+	.8byte	.LVL1575
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL1589
+	.8byte	.LVL1590-1
+	.2byte	0x1
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST403:
+	.8byte	.LVL1574
+	.8byte	.LVL1575
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL1633
+	.8byte	.LVL1634-1
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
 .LLST392:
-	.8byte	.LVL1326
+	.8byte	.LVL1404
+	.8byte	.LVL1405
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL1446
+	.8byte	.LVL1447-1
+	.2byte	0x1
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST401:
+	.8byte	.LVL1319
+	.8byte	.LVL1325
+	.2byte	0x1
+	.byte	0x69
 	.8byte	.LVL1327
+	.8byte	.LVL1341
 	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL1401
-	.8byte	.LVL1402
+	.byte	0x69
+	.8byte	.LVL1366
+	.8byte	.LVL1373
 	.2byte	0x1
-	.byte	0x50
+	.byte	0x69
+	.8byte	.LVL1389
+	.8byte	.LVL1392
+	.2byte	0x1
+	.byte	0x69
+	.8byte	.LVL1400
+	.8byte	.LVL1436
+	.2byte	0x1
+	.byte	0x69
+	.8byte	.LVL1437
+	.8byte	.LVL1438
+	.2byte	0x1
+	.byte	0x69
+	.8byte	.LVL1442
+	.8byte	.LVL1486
+	.2byte	0x1
+	.byte	0x69
+	.8byte	.LVL1487
+	.8byte	.LVL1536
+	.2byte	0x1
+	.byte	0x69
+	.8byte	.LVL1547
+	.8byte	.LFE2844
+	.2byte	0x1
+	.byte	0x69
+	.8byte	0
+	.8byte	0
+.LLST396:
+	.8byte	.LVL1493
+	.8byte	.LVL1495-1
+	.2byte	0x1
+	.byte	0x51
+	.8byte	.LVL1593
+	.8byte	.LVL1594
+	.2byte	0x1
+	.byte	0x51
+	.8byte	0
+	.8byte	0
+.LLST397:
+	.8byte	.LVL1494
+	.8byte	.LVL1496
+	.2byte	0x1
+	.byte	0x63
+	.8byte	.LVL1497
+	.8byte	.LVL1498
+	.2byte	0x1
+	.byte	0x63
+	.8byte	.LVL1582
 	.8byte	.LVL1584
-	.8byte	.LVL1585-1
+	.2byte	0x1
+	.byte	0x63
+	.8byte	.LVL1596
+	.8byte	.LVL1607
+	.2byte	0x1
+	.byte	0x63
+	.8byte	0
+	.8byte	0
+.LLST398:
+	.8byte	.LVL1494
+	.8byte	.LVL1495-1
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL1604
+	.8byte	.LVL1605
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST356:
-	.8byte	.LVL1337
-	.8byte	.LVL1369-1
+.LLST399:
+	.8byte	.LVL1599
+	.8byte	.LVL1600
 	.2byte	0x1
-	.byte	0x56
-	.8byte	.LVL1373
-	.8byte	.LVL1389
+	.byte	0x51
+	.8byte	.LVL1602
+	.8byte	.LVL1603
 	.2byte	0x1
-	.byte	0x56
-	.8byte	.LVL1392
-	.8byte	.LVL1400
-	.2byte	0x1
-	.byte	0x56
-	.8byte	.LVL1413
-	.8byte	.LVL1414-1
-	.2byte	0x1
-	.byte	0x56
-	.8byte	.LVL1428
-	.8byte	.LVL1429-1
-	.2byte	0x1
-	.byte	0x56
+	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST357:
-	.8byte	.LVL1336
-	.8byte	.LVL1369-1
+.LLST400:
+	.8byte	.LVL1502
+	.8byte	.LVL1503
 	.2byte	0x1
-	.byte	0x5a
-	.8byte	.LVL1373
-	.8byte	.LVL1389
+	.byte	0x50
+	.8byte	.LVL1563
+	.8byte	.LVL1564-1
 	.2byte	0x1
-	.byte	0x5a
-	.8byte	.LVL1392
-	.8byte	.LVL1400
-	.2byte	0x1
-	.byte	0x5a
-	.8byte	.LVL1413
-	.8byte	.LVL1414-1
-	.2byte	0x1
-	.byte	0x5a
-	.8byte	.LVL1428
-	.8byte	.LVL1429-1
-	.2byte	0x1
-	.byte	0x5a
-	.8byte	0
-	.8byte	0
-.LLST358:
-	.8byte	.LVL1338
-	.8byte	.LVL1369-1
-	.2byte	0x1
-	.byte	0x59
-	.8byte	.LVL1373
-	.8byte	.LVL1389
-	.2byte	0x1
-	.byte	0x59
-	.8byte	.LVL1392
-	.8byte	.LVL1400
-	.2byte	0x1
-	.byte	0x59
-	.8byte	.LVL1413
-	.8byte	.LVL1414-1
-	.2byte	0x1
-	.byte	0x59
-	.8byte	.LVL1428
-	.8byte	.LVL1429-1
-	.2byte	0x1
-	.byte	0x59
-	.8byte	0
-	.8byte	0
-.LLST359:
-	.8byte	.LVL1339
-	.8byte	.LVL1369-1
-	.2byte	0x1
-	.byte	0x58
-	.8byte	.LVL1373
-	.8byte	.LVL1389
-	.2byte	0x1
-	.byte	0x58
-	.8byte	.LVL1392
-	.8byte	.LVL1400
-	.2byte	0x1
-	.byte	0x58
-	.8byte	.LVL1413
-	.8byte	.LVL1414-1
-	.2byte	0x1
-	.byte	0x58
-	.8byte	.LVL1428
-	.8byte	.LVL1429-1
-	.2byte	0x1
-	.byte	0x58
-	.8byte	0
-	.8byte	0
-.LLST360:
-	.8byte	.LVL1335
-	.8byte	.LVL1369-1
-	.2byte	0x1
-	.byte	0x55
-	.8byte	.LVL1373
-	.8byte	.LVL1389
-	.2byte	0x1
-	.byte	0x55
-	.8byte	.LVL1392
-	.8byte	.LVL1400
-	.2byte	0x1
-	.byte	0x55
-	.8byte	.LVL1413
-	.8byte	.LVL1414-1
-	.2byte	0x1
-	.byte	0x55
-	.8byte	.LVL1428
-	.8byte	.LVL1429-1
-	.2byte	0x1
-	.byte	0x55
+	.byte	0x50
 	.8byte	0
 	.8byte	0
 .LLST361:
-	.8byte	.LVL1330
+	.8byte	.LVL1319
+	.8byte	.LVL1324
+	.2byte	0x1
+	.byte	0x68
+	.8byte	.LVL1327
+	.8byte	.LVL1329
+	.2byte	0x1
+	.byte	0x68
+	.8byte	.LVL1400
+	.8byte	.LVL1402
+	.2byte	0x1
+	.byte	0x68
+	.8byte	.LVL1450
+	.8byte	.LVL1476
+	.2byte	0x1
+	.byte	0x68
+	.8byte	.LVL1547
+	.8byte	.LVL1549
+	.2byte	0x1
+	.byte	0x68
+	.8byte	.LVL1623
+	.8byte	.LVL1626
+	.2byte	0x1
+	.byte	0x68
+	.8byte	.LVL1636
+	.8byte	.LFE2844
+	.2byte	0x1
+	.byte	0x68
+	.8byte	0
+	.8byte	0
+.LLST362:
+	.8byte	.LVL1455
+	.8byte	.LVL1456
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL1461
+	.8byte	.LVL1462
+	.2byte	0x1
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST363:
+	.8byte	.LVL1453
+	.8byte	.LVL1454
+	.2byte	0x1
+	.byte	0x51
+	.8byte	.LVL1459
+	.8byte	.LVL1460
+	.2byte	0x1
+	.byte	0x51
+	.8byte	0
+	.8byte	0
+.LLST393:
+	.8byte	.LVL1465
+	.8byte	.LVL1466-1
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL1468
+	.8byte	.LVL1469-1
+	.2byte	0x1
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST394:
+	.8byte	.LVL1319
+	.8byte	.LVL1320
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL1321
+	.8byte	.LVL1322
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL1474
+	.8byte	.LVL1475-1
+	.2byte	0x1
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST364:
+	.8byte	.LVL1338
+	.8byte	.LVL1369-1
+	.2byte	0x1
+	.byte	0x55
+	.8byte	.LVL1373
+	.8byte	.LVL1389
+	.2byte	0x1
+	.byte	0x55
+	.8byte	.LVL1392
+	.8byte	.LVL1400
+	.2byte	0x1
+	.byte	0x55
+	.8byte	.LVL1411
+	.8byte	.LVL1412-1
+	.2byte	0x1
+	.byte	0x55
+	.8byte	.LVL1419
+	.8byte	.LVL1420-1
+	.2byte	0x1
+	.byte	0x55
+	.8byte	0
+	.8byte	0
+.LLST365:
+	.8byte	.LVL1337
+	.8byte	.LVL1369-1
+	.2byte	0x1
+	.byte	0x58
+	.8byte	.LVL1373
+	.8byte	.LVL1389
+	.2byte	0x1
+	.byte	0x58
+	.8byte	.LVL1392
+	.8byte	.LVL1400
+	.2byte	0x1
+	.byte	0x58
+	.8byte	.LVL1411
+	.8byte	.LVL1412-1
+	.2byte	0x1
+	.byte	0x58
+	.8byte	.LVL1419
+	.8byte	.LVL1420-1
+	.2byte	0x1
+	.byte	0x58
+	.8byte	0
+	.8byte	0
+.LLST366:
+	.8byte	.LVL1339
+	.8byte	.LVL1369-1
+	.2byte	0x1
+	.byte	0x59
+	.8byte	.LVL1373
+	.8byte	.LVL1389
+	.2byte	0x1
+	.byte	0x59
+	.8byte	.LVL1392
+	.8byte	.LVL1400
+	.2byte	0x1
+	.byte	0x59
+	.8byte	.LVL1411
+	.8byte	.LVL1412-1
+	.2byte	0x1
+	.byte	0x59
+	.8byte	.LVL1419
+	.8byte	.LVL1420-1
+	.2byte	0x1
+	.byte	0x59
+	.8byte	0
+	.8byte	0
+.LLST367:
+	.8byte	.LVL1340
+	.8byte	.LVL1369-1
+	.2byte	0x1
+	.byte	0x5a
+	.8byte	.LVL1373
+	.8byte	.LVL1389
+	.2byte	0x1
+	.byte	0x5a
+	.8byte	.LVL1392
+	.8byte	.LVL1400
+	.2byte	0x1
+	.byte	0x5a
+	.8byte	.LVL1411
+	.8byte	.LVL1412-1
+	.2byte	0x1
+	.byte	0x5a
+	.8byte	.LVL1419
+	.8byte	.LVL1420-1
+	.2byte	0x1
+	.byte	0x5a
+	.8byte	0
+	.8byte	0
+.LLST368:
+	.8byte	.LVL1336
+	.8byte	.LVL1369-1
+	.2byte	0x1
+	.byte	0x56
+	.8byte	.LVL1373
+	.8byte	.LVL1389
+	.2byte	0x1
+	.byte	0x56
+	.8byte	.LVL1392
+	.8byte	.LVL1400
+	.2byte	0x1
+	.byte	0x56
+	.8byte	.LVL1411
+	.8byte	.LVL1412-1
+	.2byte	0x1
+	.byte	0x56
+	.8byte	.LVL1419
+	.8byte	.LVL1420-1
+	.2byte	0x1
+	.byte	0x56
+	.8byte	0
+	.8byte	0
+.LLST369:
+	.8byte	.LVL1331
 	.8byte	.LVL1345
 	.2byte	0x1
 	.byte	0x50
@@ -61125,7 +61435,7 @@
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST362:
+.LLST370:
 	.8byte	.LVL1349
 	.8byte	.LVL1363
 	.2byte	0x1
@@ -61140,8 +61450,12 @@
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST363:
+.LLST371:
+	.8byte	.LVL1319
 	.8byte	.LVL1326
+	.2byte	0x1
+	.byte	0x6b
+	.8byte	.LVL1327
 	.8byte	.LVL1347
 	.2byte	0x1
 	.byte	0x6b
@@ -61154,17 +61468,13 @@
 	.2byte	0x1
 	.byte	0x6b
 	.8byte	.LVL1400
-	.8byte	.LVL1424
-	.2byte	0x1
-	.byte	0x6b
-	.8byte	.LVL1425
 	.8byte	.LFE2844
 	.2byte	0x1
 	.byte	0x6b
 	.8byte	0
 	.8byte	0
-.LLST364:
-	.8byte	.LVL1341
+.LLST372:
+	.8byte	.LVL1342
 	.8byte	.LVL1361
 	.2byte	0x1
 	.byte	0x53
@@ -61192,19 +61502,19 @@
 	.8byte	.LVL1400
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL1413
-	.8byte	.LVL1414-1
+	.8byte	.LVL1411
+	.8byte	.LVL1412-1
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL1428
-	.8byte	.LVL1429-1
+	.8byte	.LVL1419
+	.8byte	.LVL1420-1
 	.2byte	0x1
 	.byte	0x53
 	.8byte	0
 	.8byte	0
-.LLST365:
-	.8byte	.LVL1341
+.LLST373:
 	.8byte	.LVL1342
+	.8byte	.LVL1343
 	.2byte	0x1
 	.byte	0x51
 	.8byte	.LVL1348
@@ -61219,22 +61529,18 @@
 	.8byte	.LVL1400
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL1413
-	.8byte	.LVL1414-1
-	.2byte	0x1
-	.byte	0x51
-	.8byte	.LVL1428
-	.8byte	.LVL1429-1
+	.8byte	.LVL1411
+	.8byte	.LVL1412-1
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST366:
-	.8byte	.LVL1341
+.LLST374:
 	.8byte	.LVL1342
+	.8byte	.LVL1343
 	.2byte	0x1
 	.byte	0x54
-	.8byte	.LVL1342
+	.8byte	.LVL1343
 	.8byte	.LVL1348
 	.2byte	0x1
 	.byte	0x51
@@ -61242,18 +61548,18 @@
 	.8byte	.LVL1369-1
 	.2byte	0x1
 	.byte	0x54
-	.8byte	.LVL1413
-	.8byte	.LVL1414-1
+	.8byte	.LVL1411
+	.8byte	.LVL1412-1
 	.2byte	0x1
 	.byte	0x54
-	.8byte	.LVL1428
-	.8byte	.LVL1429-1
+	.8byte	.LVL1419
+	.8byte	.LVL1420-1
 	.2byte	0x1
 	.byte	0x54
 	.8byte	0
 	.8byte	0
-.LLST367:
-	.8byte	.LVL1334
+.LLST375:
+	.8byte	.LVL1335
 	.8byte	.LVL1369-1
 	.2byte	0x1
 	.byte	0x61
@@ -61265,43 +61571,43 @@
 	.8byte	.LVL1400
 	.2byte	0x1
 	.byte	0x61
-	.8byte	.LVL1413
-	.8byte	.LVL1414-1
+	.8byte	.LVL1411
+	.8byte	.LVL1412-1
 	.2byte	0x1
 	.byte	0x61
-	.8byte	.LVL1428
-	.8byte	.LVL1429-1
+	.8byte	.LVL1419
+	.8byte	.LVL1420-1
 	.2byte	0x1
 	.byte	0x61
 	.8byte	0
 	.8byte	0
-.LLST368:
-	.8byte	.LVL1331
-	.8byte	.LVL1369-1
-	.2byte	0x1
-	.byte	0x5b
-	.8byte	.LVL1373
-	.8byte	.LVL1389
-	.2byte	0x1
-	.byte	0x5b
-	.8byte	.LVL1392
-	.8byte	.LVL1400
-	.2byte	0x1
-	.byte	0x5b
-	.8byte	.LVL1413
-	.8byte	.LVL1414-1
-	.2byte	0x1
-	.byte	0x5b
-	.8byte	.LVL1428
-	.8byte	.LVL1429-1
-	.2byte	0x1
-	.byte	0x5b
-	.8byte	0
-	.8byte	0
-.LLST369:
+.LLST376:
 	.8byte	.LVL1332
 	.8byte	.LVL1369-1
 	.2byte	0x1
+	.byte	0x5b
+	.8byte	.LVL1373
+	.8byte	.LVL1389
+	.2byte	0x1
+	.byte	0x5b
+	.8byte	.LVL1392
+	.8byte	.LVL1400
+	.2byte	0x1
+	.byte	0x5b
+	.8byte	.LVL1411
+	.8byte	.LVL1412-1
+	.2byte	0x1
+	.byte	0x5b
+	.8byte	.LVL1419
+	.8byte	.LVL1420-1
+	.2byte	0x1
+	.byte	0x5b
+	.8byte	0
+	.8byte	0
+.LLST377:
+	.8byte	.LVL1333
+	.8byte	.LVL1369-1
+	.2byte	0x1
 	.byte	0x5e
 	.8byte	.LVL1373
 	.8byte	.LVL1389
@@ -61311,18 +61617,18 @@
 	.8byte	.LVL1400
 	.2byte	0x1
 	.byte	0x5e
-	.8byte	.LVL1413
-	.8byte	.LVL1414-1
+	.8byte	.LVL1411
+	.8byte	.LVL1412-1
 	.2byte	0x1
 	.byte	0x5e
-	.8byte	.LVL1428
-	.8byte	.LVL1429-1
+	.8byte	.LVL1419
+	.8byte	.LVL1420-1
 	.2byte	0x1
 	.byte	0x5e
 	.8byte	0
 	.8byte	0
-.LLST370:
-	.8byte	.LVL1333
+.LLST378:
+	.8byte	.LVL1334
 	.8byte	.LVL1369-1
 	.2byte	0x1
 	.byte	0x62
@@ -61334,18 +61640,18 @@
 	.8byte	.LVL1400
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL1413
-	.8byte	.LVL1414-1
+	.8byte	.LVL1411
+	.8byte	.LVL1412-1
 	.2byte	0x1
 	.byte	0x62
-	.8byte	.LVL1428
-	.8byte	.LVL1429-1
+	.8byte	.LVL1419
+	.8byte	.LVL1420-1
 	.2byte	0x1
 	.byte	0x62
 	.8byte	0
 	.8byte	0
-.LLST371:
-	.8byte	.LVL1341
+.LLST379:
+	.8byte	.LVL1342
 	.8byte	.LVL1346
 	.2byte	0x1
 	.byte	0x6e
@@ -61373,18 +61679,18 @@
 	.8byte	.LVL1397
 	.2byte	0x1
 	.byte	0x6e
-	.8byte	.LVL1413
-	.8byte	.LVL1414-1
+	.8byte	.LVL1411
+	.8byte	.LVL1412-1
 	.2byte	0x1
 	.byte	0x6e
-	.8byte	.LVL1428
-	.8byte	.LVL1429-1
+	.8byte	.LVL1419
+	.8byte	.LVL1420-1
 	.2byte	0x1
 	.byte	0x6e
 	.8byte	0
 	.8byte	0
-.LLST372:
-	.8byte	.LVL1341
+.LLST380:
+	.8byte	.LVL1342
 	.8byte	.LVL1344
 	.2byte	0x1
 	.byte	0x53
@@ -61404,18 +61710,18 @@
 	.8byte	.LVL1397
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL1413
-	.8byte	.LVL1414-1
+	.8byte	.LVL1411
+	.8byte	.LVL1412-1
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL1428
-	.8byte	.LVL1429-1
+	.8byte	.LVL1419
+	.8byte	.LVL1420-1
 	.2byte	0x1
 	.byte	0x53
 	.8byte	0
 	.8byte	0
-.LLST373:
-	.8byte	.LVL1341
+.LLST381:
+	.8byte	.LVL1342
 	.8byte	.LVL1369-1
 	.2byte	0x1
 	.byte	0x52
@@ -61427,18 +61733,18 @@
 	.8byte	.LVL1400
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL1413
-	.8byte	.LVL1414-1
+	.8byte	.LVL1411
+	.8byte	.LVL1412-1
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL1428
-	.8byte	.LVL1429-1
+	.8byte	.LVL1419
+	.8byte	.LVL1420-1
 	.2byte	0x1
 	.byte	0x52
 	.8byte	0
 	.8byte	0
-.LLST374:
-	.8byte	.LVL1341
+.LLST382:
+	.8byte	.LVL1342
 	.8byte	.LVL1346
 	.2byte	0x1
 	.byte	0x6e
@@ -61447,6 +61753,65 @@
 	.2byte	0x1
 	.byte	0x6e
 	.8byte	.LVL1352
+	.8byte	.LVL1353
+	.2byte	0x1
+	.byte	0x6e
+	.8byte	.LVL1354
+	.8byte	.LVL1355
+	.2byte	0x1
+	.byte	0x6e
+	.8byte	.LVL1356
+	.8byte	.LVL1357
+	.2byte	0x1
+	.byte	0x6e
+	.8byte	.LVL1358
+	.8byte	.LVL1359
+	.2byte	0x1
+	.byte	0x6e
+	.8byte	.LVL1360
+	.8byte	.LVL1369-1
+	.2byte	0x1
+	.byte	0x6e
+	.8byte	.LVL1373
+	.8byte	.LVL1374
+	.2byte	0x1
+	.byte	0x6e
+	.8byte	.LVL1375
+	.8byte	.LVL1376
+	.2byte	0x1
+	.byte	0x6e
+	.8byte	.LVL1381
+	.8byte	.LVL1382
+	.2byte	0x1
+	.byte	0x6e
+	.8byte	.LVL1385
+	.8byte	.LVL1386
+	.2byte	0x1
+	.byte	0x6e
+	.8byte	.LVL1392
+	.8byte	.LVL1393
+	.2byte	0x1
+	.byte	0x6e
+	.8byte	.LVL1396
+	.8byte	.LVL1397
+	.2byte	0x1
+	.byte	0x6e
+	.8byte	.LVL1411
+	.8byte	.LVL1412-1
+	.2byte	0x1
+	.byte	0x6e
+	.8byte	.LVL1419
+	.8byte	.LVL1420-1
+	.2byte	0x1
+	.byte	0x6e
+	.8byte	0
+	.8byte	0
+.LLST383:
+	.8byte	.LVL1342
+	.8byte	.LVL1346
+	.2byte	0x1
+	.byte	0x6e
+	.8byte	.LVL1351
 	.8byte	.LVL1353
 	.2byte	0x1
 	.byte	0x6e
@@ -61482,26 +61847,22 @@
 	.8byte	.LVL1397
 	.2byte	0x1
 	.byte	0x6e
-	.8byte	.LVL1413
-	.8byte	.LVL1414-1
+	.8byte	.LVL1411
+	.8byte	.LVL1412-1
 	.2byte	0x1
 	.byte	0x6e
-	.8byte	.LVL1428
-	.8byte	.LVL1429-1
+	.8byte	.LVL1419
+	.8byte	.LVL1420-1
 	.2byte	0x1
 	.byte	0x6e
 	.8byte	0
 	.8byte	0
-.LLST375:
-	.8byte	.LVL1341
+.LLST384:
+	.8byte	.LVL1342
 	.8byte	.LVL1346
 	.2byte	0x1
 	.byte	0x6e
-	.8byte	.LVL1351
 	.8byte	.LVL1353
-	.2byte	0x1
-	.byte	0x6e
-	.8byte	.LVL1354
 	.8byte	.LVL1355
 	.2byte	0x1
 	.byte	0x6e
@@ -61541,26 +61902,22 @@
 	.8byte	.LVL1400
 	.2byte	0x1
 	.byte	0x6e
-	.8byte	.LVL1413
-	.8byte	.LVL1414-1
+	.8byte	.LVL1411
+	.8byte	.LVL1412-1
 	.2byte	0x1
 	.byte	0x6e
-	.8byte	.LVL1428
-	.8byte	.LVL1429-1
+	.8byte	.LVL1419
+	.8byte	.LVL1420-1
 	.2byte	0x1
 	.byte	0x6e
 	.8byte	0
 	.8byte	0
-.LLST376:
-	.8byte	.LVL1341
+.LLST385:
+	.8byte	.LVL1342
 	.8byte	.LVL1346
 	.2byte	0x1
 	.byte	0x6e
-	.8byte	.LVL1353
 	.8byte	.LVL1355
-	.2byte	0x1
-	.byte	0x6e
-	.8byte	.LVL1356
 	.8byte	.LVL1357
 	.2byte	0x1
 	.byte	0x6e
@@ -61592,26 +61949,22 @@
 	.8byte	.LVL1398
 	.2byte	0x1
 	.byte	0x6e
-	.8byte	.LVL1413
-	.8byte	.LVL1414-1
+	.8byte	.LVL1411
+	.8byte	.LVL1412-1
 	.2byte	0x1
 	.byte	0x6e
-	.8byte	.LVL1428
-	.8byte	.LVL1429-1
+	.8byte	.LVL1419
+	.8byte	.LVL1420-1
 	.2byte	0x1
 	.byte	0x6e
 	.8byte	0
 	.8byte	0
-.LLST377:
-	.8byte	.LVL1341
+.LLST386:
+	.8byte	.LVL1342
 	.8byte	.LVL1346
 	.2byte	0x1
 	.byte	0x6e
-	.8byte	.LVL1355
 	.8byte	.LVL1357
-	.2byte	0x1
-	.byte	0x6e
-	.8byte	.LVL1358
 	.8byte	.LVL1359
 	.2byte	0x1
 	.byte	0x6e
@@ -61643,334 +61996,279 @@
 	.8byte	.LVL1399
 	.2byte	0x1
 	.byte	0x6e
-	.8byte	.LVL1413
-	.8byte	.LVL1414-1
+	.8byte	.LVL1411
+	.8byte	.LVL1412-1
 	.2byte	0x1
 	.byte	0x6e
-	.8byte	.LVL1428
-	.8byte	.LVL1429-1
+	.8byte	.LVL1419
+	.8byte	.LVL1420-1
 	.2byte	0x1
 	.byte	0x6e
 	.8byte	0
 	.8byte	0
-.LLST378:
-	.8byte	.LVL1341
-	.8byte	.LVL1346
-	.2byte	0x1
-	.byte	0x6e
-	.8byte	.LVL1357
-	.8byte	.LVL1359
-	.2byte	0x1
-	.byte	0x6e
-	.8byte	.LVL1360
-	.8byte	.LVL1369-1
-	.2byte	0x1
-	.byte	0x6e
-	.8byte	.LVL1373
-	.8byte	.LVL1374
-	.2byte	0x1
-	.byte	0x6e
-	.8byte	.LVL1375
-	.8byte	.LVL1376
-	.2byte	0x1
-	.byte	0x6e
-	.8byte	.LVL1381
-	.8byte	.LVL1382
-	.2byte	0x1
-	.byte	0x6e
-	.8byte	.LVL1385
-	.8byte	.LVL1386
-	.2byte	0x1
-	.byte	0x6e
-	.8byte	.LVL1392
-	.8byte	.LVL1393
-	.2byte	0x1
-	.byte	0x6e
-	.8byte	.LVL1396
-	.8byte	.LVL1397
-	.2byte	0x1
-	.byte	0x6e
-	.8byte	.LVL1413
-	.8byte	.LVL1414-1
-	.2byte	0x1
-	.byte	0x6e
-	.8byte	.LVL1428
-	.8byte	.LVL1429-1
-	.2byte	0x1
-	.byte	0x6e
-	.8byte	0
-	.8byte	0
-.LLST186:
-	.8byte	.LVL656
-	.8byte	.LVL657
+.LLST194:
+	.8byte	.LVL653
+	.8byte	.LVL654
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL657
+	.8byte	.LVL654
+	.8byte	.LVL661
+	.2byte	0x1
+	.byte	0x64
 	.8byte	.LVL664
-	.2byte	0x1
-	.byte	0x64
-	.8byte	.LVL667
-	.8byte	.LVL673
+	.8byte	.LVL670
 	.2byte	0x1
 	.byte	0x64
 	.8byte	0
 	.8byte	0
-.LLST187:
+.LLST195:
+	.8byte	.LVL653
 	.8byte	.LVL656
-	.8byte	.LVL659
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL659
-	.8byte	.LVL666
+	.8byte	.LVL656
+	.8byte	.LVL663
 	.2byte	0x1
 	.byte	0x66
-	.8byte	.LVL667
+	.8byte	.LVL664
 	.8byte	.LFE2840
 	.2byte	0x1
 	.byte	0x66
 	.8byte	0
 	.8byte	0
-.LLST188:
+.LLST196:
+	.8byte	.LVL655
 	.8byte	.LVL658
-	.8byte	.LVL661
 	.2byte	0x2
 	.byte	0x70
 	.sleb128 -12
-	.8byte	.LVL661
-	.8byte	.LVL668
+	.8byte	.LVL658
+	.8byte	.LVL665
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 20
+	.8byte	.LVL665
 	.8byte	.LVL668
-	.8byte	.LVL671
 	.2byte	0x2
 	.byte	0x70
 	.sleb128 -12
-	.8byte	.LVL671
+	.8byte	.LVL668
 	.8byte	.LFE2840
 	.2byte	0x2
 	.byte	0x91
 	.sleb128 20
 	.8byte	0
 	.8byte	0
-.LLST393:
-	.8byte	.LVL1631
-	.8byte	.LVL1632
+.LLST405:
+	.8byte	.LVL1639
+	.8byte	.LVL1640
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST286:
-	.8byte	.LVL992
-	.8byte	.LVL993
+.LLST294:
+	.8byte	.LVL982
+	.8byte	.LVL983
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST285:
+.LLST293:
+	.8byte	.LVL952
 	.8byte	.LVL955
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL955
+	.8byte	.LVL958
+	.2byte	0x1
+	.byte	0x64
+	.8byte	.LVL958
 	.8byte	.LVL959
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL960
-	.8byte	.LVL961
-	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL961
+	.8byte	.LVL959
 	.8byte	.LVL965
 	.2byte	0x1
 	.byte	0x64
+	.8byte	.LVL965
 	.8byte	.LVL966
-	.8byte	.LVL967
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL967
-	.8byte	.LVL973
+	.8byte	.LVL966
+	.8byte	.LVL970
 	.2byte	0x1
 	.byte	0x64
-	.8byte	.LVL973
-	.8byte	.LVL974
-	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL974
-	.8byte	.LVL978
-	.2byte	0x1
-	.byte	0x64
-	.8byte	.LVL979
-	.8byte	.LVL985
-	.2byte	0x1
-	.byte	0x64
-	.8byte	.LVL986
+	.8byte	.LVL971
 	.8byte	.LFE2835
 	.2byte	0x1
 	.byte	0x64
 	.8byte	0
 	.8byte	0
-.LLST233:
-	.8byte	.LVL792
-	.8byte	.LVL793
+.LLST241:
+	.8byte	.LVL789
+	.8byte	.LVL790
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL798
-	.8byte	.LVL799
+	.8byte	.LVL795
+	.8byte	.LVL796
 	.2byte	0x1
 	.byte	0x52
+	.8byte	.LVL799
 	.8byte	.LVL802
-	.8byte	.LVL805
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL812
-	.8byte	.LVL813
+	.8byte	.LVL809
+	.8byte	.LVL810
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST234:
-	.8byte	.LVL792
-	.8byte	.LVL794
+.LLST242:
+	.8byte	.LVL789
+	.8byte	.LVL791
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL794
-	.8byte	.LVL817
-	.2byte	0x1
-	.byte	0x69
-	.8byte	.LVL819
-	.8byte	.LFE2827
-	.2byte	0x1
-	.byte	0x69
-	.8byte	0
-	.8byte	0
-.LLST235:
-	.8byte	.LVL792
-	.8byte	.LVL804
-	.2byte	0x1
-	.byte	0x52
-	.8byte	.LVL804
-	.8byte	.LVL808
-	.2byte	0x1
-	.byte	0x5d
-	.8byte	.LVL808
-	.8byte	.LVL817
-	.2byte	0x1
-	.byte	0x6a
-	.8byte	.LVL819
-	.8byte	.LFE2827
-	.2byte	0x1
-	.byte	0x6a
-	.8byte	0
-	.8byte	0
-.LLST236:
-	.8byte	.LVL792
-	.8byte	.LVL803
-	.2byte	0x1
-	.byte	0x53
-	.8byte	.LVL803
-	.8byte	.LVL809
-	.2byte	0x1
-	.byte	0x62
-	.8byte	.LVL809
-	.8byte	.LVL818
-	.2byte	0x1
-	.byte	0x6b
-	.8byte	.LVL819
-	.8byte	.LFE2827
-	.2byte	0x1
-	.byte	0x6b
-	.8byte	0
-	.8byte	0
-.LLST237:
-	.8byte	.LVL792
+	.8byte	.LVL791
 	.8byte	.LVL814
 	.2byte	0x1
-	.byte	0x54
-	.8byte	.LVL819
-	.8byte	.LVL829
+	.byte	0x69
+	.8byte	.LVL816
+	.8byte	.LFE2827
+	.2byte	0x1
+	.byte	0x69
+	.8byte	0
+	.8byte	0
+.LLST243:
+	.8byte	.LVL789
+	.8byte	.LVL801
+	.2byte	0x1
+	.byte	0x52
+	.8byte	.LVL801
+	.8byte	.LVL805
+	.2byte	0x1
+	.byte	0x5d
+	.8byte	.LVL805
+	.8byte	.LVL814
+	.2byte	0x1
+	.byte	0x6a
+	.8byte	.LVL816
+	.8byte	.LFE2827
+	.2byte	0x1
+	.byte	0x6a
+	.8byte	0
+	.8byte	0
+.LLST244:
+	.8byte	.LVL789
+	.8byte	.LVL800
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL800
+	.8byte	.LVL806
+	.2byte	0x1
+	.byte	0x62
+	.8byte	.LVL806
+	.8byte	.LVL815
+	.2byte	0x1
+	.byte	0x6b
+	.8byte	.LVL816
+	.8byte	.LFE2827
+	.2byte	0x1
+	.byte	0x6b
+	.8byte	0
+	.8byte	0
+.LLST245:
+	.8byte	.LVL789
+	.8byte	.LVL811
 	.2byte	0x1
 	.byte	0x54
-	.8byte	.LVL829
+	.8byte	.LVL816
+	.8byte	.LVL826
+	.2byte	0x1
+	.byte	0x54
+	.8byte	.LVL826
 	.8byte	.LFE2827
 	.2byte	0x1
 	.byte	0x63
 	.8byte	0
 	.8byte	0
-.LLST238:
-	.8byte	.LVL792
-	.8byte	.LVL800-1
+.LLST246:
+	.8byte	.LVL789
+	.8byte	.LVL797-1
 	.2byte	0x1
 	.byte	0x55
-	.8byte	.LVL819
-	.8byte	.LVL829
-	.2byte	0x1
-	.byte	0x55
-	.8byte	0
-	.8byte	0
-.LLST239:
-	.8byte	.LVL796
-	.8byte	.LVL814
-	.2byte	0x1
-	.byte	0x64
-	.8byte	.LVL823
-	.8byte	.LVL825
-	.2byte	0x1
-	.byte	0x64
-	.8byte	.LVL827
-	.8byte	.LFE2827
-	.2byte	0x1
-	.byte	0x64
-	.8byte	0
-	.8byte	0
-.LLST240:
-	.8byte	.LVL797
-	.8byte	.LVL815
-	.2byte	0x1
-	.byte	0x66
-	.8byte	.LVL819
-	.8byte	.LVL820
-	.2byte	0x1
-	.byte	0x66
-	.8byte	.LVL822
-	.8byte	.LFE2827
-	.2byte	0x1
-	.byte	0x66
-	.8byte	0
-	.8byte	0
-.LLST241:
-	.8byte	.LVL802
 	.8byte	.LVL816
+	.8byte	.LVL826
+	.2byte	0x1
+	.byte	0x55
+	.8byte	0
+	.8byte	0
+.LLST247:
+	.8byte	.LVL793
+	.8byte	.LVL811
+	.2byte	0x1
+	.byte	0x64
+	.8byte	.LVL820
+	.8byte	.LVL822
+	.2byte	0x1
+	.byte	0x64
+	.8byte	.LVL824
+	.8byte	.LFE2827
+	.2byte	0x1
+	.byte	0x64
+	.8byte	0
+	.8byte	0
+.LLST248:
+	.8byte	.LVL794
+	.8byte	.LVL812
+	.2byte	0x1
+	.byte	0x66
+	.8byte	.LVL816
+	.8byte	.LVL817
+	.2byte	0x1
+	.byte	0x66
+	.8byte	.LVL819
+	.8byte	.LFE2827
+	.2byte	0x1
+	.byte	0x66
+	.8byte	0
+	.8byte	0
+.LLST249:
+	.8byte	.LVL799
+	.8byte	.LVL813
 	.2byte	0x1
 	.byte	0x68
 	.8byte	0
 	.8byte	0
-.LLST242:
-	.8byte	.LVL801
-	.8byte	.LVL806-1
+.LLST250:
+	.8byte	.LVL798
+	.8byte	.LVL803-1
 	.2byte	0x1
 	.byte	0x58
-	.8byte	.LVL807
-	.8byte	.LVL810-1
+	.8byte	.LVL804
+	.8byte	.LVL807-1
 	.2byte	0x1
 	.byte	0x58
-	.8byte	.LVL811
-	.8byte	.LVL819
+	.8byte	.LVL808
+	.8byte	.LVL816
 	.2byte	0x1
 	.byte	0x58
-	.8byte	.LVL830
+	.8byte	.LVL827
 	.8byte	.LFE2827
 	.2byte	0x1
 	.byte	0x58
 	.8byte	0
 	.8byte	0
-.LLST243:
-	.8byte	.LVL793
-	.8byte	.LVL795
+.LLST251:
+	.8byte	.LVL790
+	.8byte	.LVL792
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL813
-	.8byte	.LVL821
+	.8byte	.LVL810
+	.8byte	.LVL818
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL826
-	.8byte	.LVL828
+	.8byte	.LVL823
+	.8byte	.LVL825
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
@@ -62261,1043 +62559,1047 @@
 	.byte	0x6c
 	.8byte	0
 	.8byte	0
-.LLST107:
-	.8byte	.LVL340
-	.8byte	.LVL341
+.LLST115:
+	.8byte	.LVL337
+	.8byte	.LVL338
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL341
-	.8byte	.LVL478
+	.8byte	.LVL338
+	.8byte	.LVL475
 	.2byte	0x1
 	.byte	0x66
-	.8byte	.LVL483
-	.8byte	.LVL549
+	.8byte	.LVL480
+	.8byte	.LVL546
 	.2byte	0x1
 	.byte	0x66
-	.8byte	0
-	.8byte	0
-.LLST108:
-	.8byte	.LVL340
-	.8byte	.LVL343
-	.2byte	0x1
-	.byte	0x51
-	.8byte	.LVL343
-	.8byte	.LVL480
-	.2byte	0x1
-	.byte	0x6a
-	.8byte	.LVL483
-	.8byte	.LVL551
-	.2byte	0x1
-	.byte	0x6a
-	.8byte	0
-	.8byte	0
-.LLST109:
-	.8byte	.LVL340
-	.8byte	.LVL411
-	.2byte	0x1
-	.byte	0x52
-	.8byte	.LVL411
-	.8byte	.LVL480
-	.2byte	0x1
-	.byte	0x69
-	.8byte	.LVL483
-	.8byte	.LVL551
-	.2byte	0x1
-	.byte	0x69
-	.8byte	0
-	.8byte	0
-.LLST110:
-	.8byte	.LVL340
-	.8byte	.LVL409
-	.2byte	0x1
-	.byte	0x53
-	.8byte	.LVL409
-	.8byte	.LVL481
-	.2byte	0x1
-	.byte	0x6b
-	.8byte	.LVL483
-	.8byte	.LVL552
-	.2byte	0x1
-	.byte	0x6b
-	.8byte	0
-	.8byte	0
-.LLST111:
-	.8byte	.LVL340
-	.8byte	.LVL410
-	.2byte	0x1
-	.byte	0x54
-	.8byte	.LVL410
-	.8byte	.LVL481
-	.2byte	0x1
-	.byte	0x6c
-	.8byte	.LVL483
-	.8byte	.LVL552
-	.2byte	0x1
-	.byte	0x6c
-	.8byte	0
-	.8byte	0
-.LLST112:
-	.8byte	.LVL340
-	.8byte	.LVL477
-	.2byte	0x1
-	.byte	0x55
-	.8byte	.LVL483
-	.8byte	.LVL540
-	.2byte	0x1
-	.byte	0x63
-	.8byte	.LVL540
-	.8byte	.LVL546
-	.2byte	0x1
-	.byte	0x55
-	.8byte	.LVL546
-	.8byte	.LVL548
-	.2byte	0x1
-	.byte	0x63
-	.8byte	0
-	.8byte	0
-.LLST113:
-	.8byte	.LVL340
-	.8byte	.LVL345-1
-	.2byte	0x1
-	.byte	0x56
-	.8byte	.LVL540
-	.8byte	.LVL546
-	.2byte	0x1
-	.byte	0x56
-	.8byte	0
-	.8byte	0
-.LLST114:
-	.8byte	.LVL344
-	.8byte	.LVL478
-	.2byte	0x1
-	.byte	0x65
-	.8byte	.LVL483
-	.8byte	.LVL540
-	.2byte	0x1
-	.byte	0x65
-	.8byte	.LVL543
-	.8byte	.LVL544
-	.2byte	0x1
-	.byte	0x65
-	.8byte	.LVL545
-	.8byte	.LVL549
-	.2byte	0x1
-	.byte	0x65
-	.8byte	0
-	.8byte	0
-.LLST115:
-	.8byte	.LVL344
-	.8byte	.LVL479
-	.2byte	0x1
-	.byte	0x67
-	.8byte	.LVL483
-	.8byte	.LVL541
-	.2byte	0x1
-	.byte	0x67
-	.8byte	.LVL542
-	.8byte	.LVL550
-	.2byte	0x1
-	.byte	0x67
 	.8byte	0
 	.8byte	0
 .LLST116:
-	.8byte	.LVL346
-	.8byte	.LVL352
+	.8byte	.LVL337
+	.8byte	.LVL340
 	.2byte	0x1
-	.byte	0x55
+	.byte	0x51
+	.8byte	.LVL340
+	.8byte	.LVL477
+	.2byte	0x1
+	.byte	0x6a
+	.8byte	.LVL480
+	.8byte	.LVL548
+	.2byte	0x1
+	.byte	0x6a
+	.8byte	0
+	.8byte	0
+.LLST117:
+	.8byte	.LVL337
 	.8byte	.LVL408
-	.8byte	.LVL415
 	.2byte	0x1
-	.byte	0x55
+	.byte	0x52
+	.8byte	.LVL408
+	.8byte	.LVL477
+	.2byte	0x1
+	.byte	0x69
+	.8byte	.LVL480
+	.8byte	.LVL548
+	.2byte	0x1
+	.byte	0x69
+	.8byte	0
+	.8byte	0
+.LLST118:
+	.8byte	.LVL337
+	.8byte	.LVL406
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL406
+	.8byte	.LVL478
+	.2byte	0x1
+	.byte	0x6b
+	.8byte	.LVL480
+	.8byte	.LVL549
+	.2byte	0x1
+	.byte	0x6b
+	.8byte	0
+	.8byte	0
+.LLST119:
+	.8byte	.LVL337
+	.8byte	.LVL407
+	.2byte	0x1
+	.byte	0x54
+	.8byte	.LVL407
+	.8byte	.LVL478
+	.2byte	0x1
+	.byte	0x6c
+	.8byte	.LVL480
+	.8byte	.LVL549
+	.2byte	0x1
+	.byte	0x6c
+	.8byte	0
+	.8byte	0
+.LLST120:
+	.8byte	.LVL337
 	.8byte	.LVL474
-	.8byte	.LVL483
 	.2byte	0x1
 	.byte	0x55
+	.8byte	.LVL480
+	.8byte	.LVL537
+	.2byte	0x1
+	.byte	0x63
+	.8byte	.LVL537
+	.8byte	.LVL543
+	.2byte	0x1
+	.byte	0x55
+	.8byte	.LVL543
+	.8byte	.LVL545
+	.2byte	0x1
+	.byte	0x63
+	.8byte	0
+	.8byte	0
+.LLST121:
+	.8byte	.LVL337
+	.8byte	.LVL342-1
+	.2byte	0x1
+	.byte	0x56
+	.8byte	.LVL537
+	.8byte	.LVL543
+	.2byte	0x1
+	.byte	0x56
+	.8byte	0
+	.8byte	0
+.LLST122:
+	.8byte	.LVL341
+	.8byte	.LVL475
+	.2byte	0x1
+	.byte	0x65
+	.8byte	.LVL480
+	.8byte	.LVL537
+	.2byte	0x1
+	.byte	0x65
+	.8byte	.LVL540
+	.8byte	.LVL541
+	.2byte	0x1
+	.byte	0x65
+	.8byte	.LVL542
+	.8byte	.LVL546
+	.2byte	0x1
+	.byte	0x65
+	.8byte	0
+	.8byte	0
+.LLST123:
+	.8byte	.LVL341
+	.8byte	.LVL476
+	.2byte	0x1
+	.byte	0x67
+	.8byte	.LVL480
+	.8byte	.LVL538
+	.2byte	0x1
+	.byte	0x67
+	.8byte	.LVL539
 	.8byte	.LVL547
+	.2byte	0x1
+	.byte	0x67
+	.8byte	0
+	.8byte	0
+.LLST124:
+	.8byte	.LVL343
+	.8byte	.LVL349
+	.2byte	0x1
+	.byte	0x55
+	.8byte	.LVL405
+	.8byte	.LVL412
+	.2byte	0x1
+	.byte	0x55
+	.8byte	.LVL471
+	.8byte	.LVL480
+	.2byte	0x1
+	.byte	0x55
+	.8byte	.LVL544
 	.8byte	.LFE2821
 	.2byte	0x1
 	.byte	0x55
 	.8byte	0
 	.8byte	0
-.LLST117:
-	.8byte	.LVL342
-	.8byte	.LVL479
+.LLST125:
+	.8byte	.LVL339
+	.8byte	.LVL476
 	.2byte	0x1
 	.byte	0x68
-	.8byte	.LVL483
-	.8byte	.LVL550
+	.8byte	.LVL480
+	.8byte	.LVL547
 	.2byte	0x1
 	.byte	0x68
 	.8byte	0
 	.8byte	0
-.LLST118:
-	.8byte	.LVL347
-	.8byte	.LVL540
+.LLST126:
+	.8byte	.LVL344
+	.8byte	.LVL537
 	.2byte	0x1
 	.byte	0x5a
 	.8byte	0
 	.8byte	0
-.LLST119:
-	.8byte	.LVL348
-	.8byte	.LVL349
+.LLST127:
+	.8byte	.LVL345
+	.8byte	.LVL346
 	.2byte	0x1
 	.byte	0x56
-	.8byte	.LVL350
-	.8byte	.LVL412
-	.2byte	0x1
-	.byte	0x56
-	.8byte	.LVL483
-	.8byte	.LVL485
-	.2byte	0x1
-	.byte	0x56
-	.8byte	.LVL487
-	.8byte	.LVL513
-	.2byte	0x1
-	.byte	0x56
-	.8byte	0
-	.8byte	0
-.LLST120:
-	.8byte	.LVL348
-	.8byte	.LVL414
-	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL483
-	.8byte	.LVL484
-	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL486
-	.8byte	.LVL489
-	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL491
-	.8byte	.LVL493
-	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL495
-	.8byte	.LVL497
-	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL499
-	.8byte	.LVL501
-	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL503
-	.8byte	.LVL505
-	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL507
-	.8byte	.LVL509
-	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL511
-	.8byte	.LVL513
-	.2byte	0x1
-	.byte	0x50
-	.8byte	0
-	.8byte	0
-.LLST121:
 	.8byte	.LVL347
-	.8byte	.LVL420
+	.8byte	.LVL409
 	.2byte	0x1
-	.byte	0x59
-	.8byte	.LVL423
-	.8byte	.LVL426
-	.2byte	0x1
-	.byte	0x59
-	.8byte	.LVL430
-	.8byte	.LVL433
-	.2byte	0x1
-	.byte	0x59
-	.8byte	.LVL437
-	.8byte	.LVL440
-	.2byte	0x1
-	.byte	0x59
-	.8byte	.LVL444
-	.8byte	.LVL446
-	.2byte	0x1
-	.byte	0x59
-	.8byte	.LVL451
-	.8byte	.LVL453
-	.2byte	0x1
-	.byte	0x59
-	.8byte	.LVL458
-	.8byte	.LVL460
-	.2byte	0x1
-	.byte	0x59
-	.8byte	.LVL465
-	.8byte	.LVL467
-	.2byte	0x1
-	.byte	0x59
-	.8byte	.LVL472
-	.8byte	.LVL513
-	.2byte	0x1
-	.byte	0x59
-	.8byte	.LVL517
-	.8byte	.LVL518
-	.2byte	0x1
-	.byte	0x59
-	.8byte	0
-	.8byte	0
-.LLST122:
-	.8byte	.LVL347
-	.8byte	.LVL403
-	.2byte	0x1
-	.byte	0x52
-	.8byte	.LVL407
-	.8byte	.LVL416
-	.2byte	0x1
-	.byte	0x52
-	.8byte	.LVL476
-	.8byte	.LVL483
-	.2byte	0x1
-	.byte	0x52
-	.8byte	.LVL487
-	.8byte	.LVL513
-	.2byte	0x1
-	.byte	0x52
-	.8byte	0
-	.8byte	0
-.LLST123:
-	.8byte	.LVL347
-	.8byte	.LVL362
-	.2byte	0x1
-	.byte	0x6e
-	.8byte	.LVL365
-	.8byte	.LVL369
-	.2byte	0x1
-	.byte	0x6e
-	.8byte	.LVL372
-	.8byte	.LVL376
-	.2byte	0x1
-	.byte	0x6e
-	.8byte	.LVL379
-	.8byte	.LVL383
-	.2byte	0x1
-	.byte	0x6e
-	.8byte	.LVL386
-	.8byte	.LVL390
-	.2byte	0x1
-	.byte	0x6e
-	.8byte	.LVL393
-	.8byte	.LVL397
-	.2byte	0x1
-	.byte	0x6e
-	.8byte	.LVL400
-	.8byte	.LVL417
-	.2byte	0x1
-	.byte	0x6e
-	.8byte	.LVL423
-	.8byte	.LVL427
-	.2byte	0x1
-	.byte	0x6e
-	.8byte	.LVL430
-	.8byte	.LVL434
-	.2byte	0x1
-	.byte	0x6e
-	.8byte	.LVL437
-	.8byte	.LVL441
-	.2byte	0x1
-	.byte	0x6e
-	.8byte	.LVL444
-	.8byte	.LVL448
-	.2byte	0x1
-	.byte	0x6e
-	.8byte	.LVL451
-	.8byte	.LVL455
-	.2byte	0x1
-	.byte	0x6e
-	.8byte	.LVL458
-	.8byte	.LVL462
-	.2byte	0x1
-	.byte	0x6e
-	.8byte	.LVL465
+	.byte	0x56
+	.8byte	.LVL480
 	.8byte	.LVL482
 	.2byte	0x1
-	.byte	0x6e
-	.8byte	.LVL483
-	.8byte	.LVL488
-	.2byte	0x1
-	.byte	0x6e
-	.8byte	.LVL512
-	.8byte	.LVL518
-	.2byte	0x1
-	.byte	0x6e
-	.8byte	0
-	.8byte	0
-.LLST124:
-	.8byte	.LVL352
-	.8byte	.LVL356
-	.2byte	0x1
-	.byte	0x55
-	.8byte	.LVL357
-	.8byte	.LVL408
-	.2byte	0x1
-	.byte	0x55
-	.8byte	.LVL483
-	.8byte	.LVL513
-	.2byte	0x1
-	.byte	0x55
-	.8byte	0
-	.8byte	0
-.LLST125:
-	.8byte	.LVL359
-	.8byte	.LVL363
-	.2byte	0x1
-	.byte	0x60
-	.8byte	0
-	.8byte	0
-.LLST126:
-	.8byte	.LVL347
-	.8byte	.LVL354
-	.2byte	0x1
-	.byte	0x53
-	.8byte	.LVL358
-	.8byte	.LVL360
-	.2byte	0x1
-	.byte	0x53
-	.8byte	.LVL364
-	.8byte	.LVL367
-	.2byte	0x1
-	.byte	0x53
-	.8byte	.LVL372
-	.8byte	.LVL374
-	.2byte	0x1
-	.byte	0x53
-	.8byte	.LVL379
-	.8byte	.LVL381
-	.2byte	0x1
-	.byte	0x53
-	.8byte	.LVL386
-	.8byte	.LVL388
-	.2byte	0x1
-	.byte	0x53
-	.8byte	.LVL393
-	.8byte	.LVL395
-	.2byte	0x1
-	.byte	0x53
-	.8byte	.LVL400
-	.8byte	.LVL404
-	.2byte	0x1
-	.byte	0x53
-	.8byte	.LVL407
-	.8byte	.LVL418
-	.2byte	0x1
-	.byte	0x53
-	.8byte	.LVL423
-	.8byte	.LVL425
-	.2byte	0x1
-	.byte	0x53
-	.8byte	.LVL430
-	.8byte	.LVL432
-	.2byte	0x1
-	.byte	0x53
-	.8byte	.LVL437
-	.8byte	.LVL439
-	.2byte	0x1
-	.byte	0x53
-	.8byte	.LVL444
-	.8byte	.LVL447
-	.2byte	0x1
-	.byte	0x53
-	.8byte	.LVL451
-	.8byte	.LVL454
-	.2byte	0x1
-	.byte	0x53
-	.8byte	.LVL458
-	.8byte	.LVL461
-	.2byte	0x1
-	.byte	0x53
-	.8byte	.LVL465
-	.8byte	.LVL468
-	.2byte	0x1
-	.byte	0x53
-	.8byte	.LVL472
-	.8byte	.LVL483
-	.2byte	0x1
-	.byte	0x53
-	.8byte	.LVL487
-	.8byte	.LVL488
-	.2byte	0x1
-	.byte	0x53
-	.8byte	.LVL508
+	.byte	0x56
+	.8byte	.LVL484
 	.8byte	.LVL510
 	.2byte	0x1
-	.byte	0x53
-	.8byte	.LVL517
-	.8byte	.LVL518
-	.2byte	0x1
-	.byte	0x53
-	.8byte	0
-	.8byte	0
-.LLST127:
-	.8byte	.LVL366
-	.8byte	.LVL370
-	.2byte	0x1
-	.byte	0x60
+	.byte	0x56
 	.8byte	0
 	.8byte	0
 .LLST128:
-	.8byte	.LVL347
-	.8byte	.LVL354
+	.8byte	.LVL345
+	.8byte	.LVL411
 	.2byte	0x1
-	.byte	0x53
-	.8byte	.LVL358
-	.8byte	.LVL360
+	.byte	0x50
+	.8byte	.LVL480
+	.8byte	.LVL481
 	.2byte	0x1
-	.byte	0x53
-	.8byte	.LVL365
-	.8byte	.LVL367
-	.2byte	0x1
-	.byte	0x53
-	.8byte	.LVL371
-	.8byte	.LVL374
-	.2byte	0x1
-	.byte	0x53
-	.8byte	.LVL379
-	.8byte	.LVL381
-	.2byte	0x1
-	.byte	0x53
-	.8byte	.LVL386
-	.8byte	.LVL388
-	.2byte	0x1
-	.byte	0x53
-	.8byte	.LVL393
-	.8byte	.LVL395
-	.2byte	0x1
-	.byte	0x53
-	.8byte	.LVL400
-	.8byte	.LVL404
-	.2byte	0x1
-	.byte	0x53
-	.8byte	.LVL407
-	.8byte	.LVL418
-	.2byte	0x1
-	.byte	0x53
-	.8byte	.LVL423
-	.8byte	.LVL425
-	.2byte	0x1
-	.byte	0x53
-	.8byte	.LVL430
-	.8byte	.LVL432
-	.2byte	0x1
-	.byte	0x53
-	.8byte	.LVL437
-	.8byte	.LVL439
-	.2byte	0x1
-	.byte	0x53
-	.8byte	.LVL444
-	.8byte	.LVL447
-	.2byte	0x1
-	.byte	0x53
-	.8byte	.LVL451
-	.8byte	.LVL454
-	.2byte	0x1
-	.byte	0x53
-	.8byte	.LVL458
-	.8byte	.LVL461
-	.2byte	0x1
-	.byte	0x53
-	.8byte	.LVL465
-	.8byte	.LVL468
-	.2byte	0x1
-	.byte	0x53
-	.8byte	.LVL472
+	.byte	0x50
 	.8byte	.LVL483
+	.8byte	.LVL486
 	.2byte	0x1
-	.byte	0x53
-	.8byte	.LVL487
+	.byte	0x50
 	.8byte	.LVL488
+	.8byte	.LVL490
 	.2byte	0x1
-	.byte	0x53
-	.8byte	.LVL504
-	.8byte	.LVL506
+	.byte	0x50
+	.8byte	.LVL492
+	.8byte	.LVL494
 	.2byte	0x1
-	.byte	0x53
-	.8byte	.LVL517
-	.8byte	.LVL518
-	.2byte	0x1
-	.byte	0x53
-	.8byte	0
-	.8byte	0
-.LLST129:
-	.8byte	.LVL373
-	.8byte	.LVL377
-	.2byte	0x1
-	.byte	0x60
-	.8byte	0
-	.8byte	0
-.LLST130:
-	.8byte	.LVL347
-	.8byte	.LVL354
-	.2byte	0x1
-	.byte	0x53
-	.8byte	.LVL358
-	.8byte	.LVL360
-	.2byte	0x1
-	.byte	0x53
-	.8byte	.LVL365
-	.8byte	.LVL367
-	.2byte	0x1
-	.byte	0x53
-	.8byte	.LVL372
-	.8byte	.LVL374
-	.2byte	0x1
-	.byte	0x53
-	.8byte	.LVL378
-	.8byte	.LVL381
-	.2byte	0x1
-	.byte	0x53
-	.8byte	.LVL386
-	.8byte	.LVL388
-	.2byte	0x1
-	.byte	0x53
-	.8byte	.LVL393
-	.8byte	.LVL395
-	.2byte	0x1
-	.byte	0x53
-	.8byte	.LVL400
-	.8byte	.LVL404
-	.2byte	0x1
-	.byte	0x53
-	.8byte	.LVL407
-	.8byte	.LVL418
-	.2byte	0x1
-	.byte	0x53
-	.8byte	.LVL423
-	.8byte	.LVL425
-	.2byte	0x1
-	.byte	0x53
-	.8byte	.LVL430
-	.8byte	.LVL432
-	.2byte	0x1
-	.byte	0x53
-	.8byte	.LVL437
-	.8byte	.LVL439
-	.2byte	0x1
-	.byte	0x53
-	.8byte	.LVL444
-	.8byte	.LVL447
-	.2byte	0x1
-	.byte	0x53
-	.8byte	.LVL451
-	.8byte	.LVL454
-	.2byte	0x1
-	.byte	0x53
-	.8byte	.LVL458
-	.8byte	.LVL461
-	.2byte	0x1
-	.byte	0x53
-	.8byte	.LVL465
-	.8byte	.LVL468
-	.2byte	0x1
-	.byte	0x53
-	.8byte	.LVL472
-	.8byte	.LVL483
-	.2byte	0x1
-	.byte	0x53
-	.8byte	.LVL487
-	.8byte	.LVL488
-	.2byte	0x1
-	.byte	0x53
-	.8byte	.LVL500
-	.8byte	.LVL502
-	.2byte	0x1
-	.byte	0x53
-	.8byte	.LVL517
-	.8byte	.LVL518
-	.2byte	0x1
-	.byte	0x53
-	.8byte	0
-	.8byte	0
-.LLST131:
-	.8byte	.LVL380
-	.8byte	.LVL384
-	.2byte	0x1
-	.byte	0x60
-	.8byte	0
-	.8byte	0
-.LLST132:
-	.8byte	.LVL347
-	.8byte	.LVL354
-	.2byte	0x1
-	.byte	0x53
-	.8byte	.LVL358
-	.8byte	.LVL360
-	.2byte	0x1
-	.byte	0x53
-	.8byte	.LVL365
-	.8byte	.LVL367
-	.2byte	0x1
-	.byte	0x53
-	.8byte	.LVL372
-	.8byte	.LVL374
-	.2byte	0x1
-	.byte	0x53
-	.8byte	.LVL379
-	.8byte	.LVL381
-	.2byte	0x1
-	.byte	0x53
-	.8byte	.LVL385
-	.8byte	.LVL388
-	.2byte	0x1
-	.byte	0x53
-	.8byte	.LVL393
-	.8byte	.LVL395
-	.2byte	0x1
-	.byte	0x53
-	.8byte	.LVL400
-	.8byte	.LVL404
-	.2byte	0x1
-	.byte	0x53
-	.8byte	.LVL407
-	.8byte	.LVL418
-	.2byte	0x1
-	.byte	0x53
-	.8byte	.LVL423
-	.8byte	.LVL425
-	.2byte	0x1
-	.byte	0x53
-	.8byte	.LVL430
-	.8byte	.LVL432
-	.2byte	0x1
-	.byte	0x53
-	.8byte	.LVL437
-	.8byte	.LVL439
-	.2byte	0x1
-	.byte	0x53
-	.8byte	.LVL444
-	.8byte	.LVL447
-	.2byte	0x1
-	.byte	0x53
-	.8byte	.LVL451
-	.8byte	.LVL454
-	.2byte	0x1
-	.byte	0x53
-	.8byte	.LVL458
-	.8byte	.LVL461
-	.2byte	0x1
-	.byte	0x53
-	.8byte	.LVL465
-	.8byte	.LVL468
-	.2byte	0x1
-	.byte	0x53
-	.8byte	.LVL472
-	.8byte	.LVL483
-	.2byte	0x1
-	.byte	0x53
-	.8byte	.LVL487
-	.8byte	.LVL488
-	.2byte	0x1
-	.byte	0x53
+	.byte	0x50
 	.8byte	.LVL496
 	.8byte	.LVL498
 	.2byte	0x1
-	.byte	0x53
-	.8byte	.LVL517
-	.8byte	.LVL518
+	.byte	0x50
+	.8byte	.LVL500
+	.8byte	.LVL502
 	.2byte	0x1
-	.byte	0x53
+	.byte	0x50
+	.8byte	.LVL504
+	.8byte	.LVL506
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL508
+	.8byte	.LVL510
+	.2byte	0x1
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST129:
+	.8byte	.LVL344
+	.8byte	.LVL417
+	.2byte	0x1
+	.byte	0x59
+	.8byte	.LVL420
+	.8byte	.LVL423
+	.2byte	0x1
+	.byte	0x59
+	.8byte	.LVL427
+	.8byte	.LVL430
+	.2byte	0x1
+	.byte	0x59
+	.8byte	.LVL434
+	.8byte	.LVL437
+	.2byte	0x1
+	.byte	0x59
+	.8byte	.LVL441
+	.8byte	.LVL443
+	.2byte	0x1
+	.byte	0x59
+	.8byte	.LVL448
+	.8byte	.LVL450
+	.2byte	0x1
+	.byte	0x59
+	.8byte	.LVL455
+	.8byte	.LVL457
+	.2byte	0x1
+	.byte	0x59
+	.8byte	.LVL462
+	.8byte	.LVL464
+	.2byte	0x1
+	.byte	0x59
+	.8byte	.LVL469
+	.8byte	.LVL510
+	.2byte	0x1
+	.byte	0x59
+	.8byte	.LVL514
+	.8byte	.LVL515
+	.2byte	0x1
+	.byte	0x59
+	.8byte	0
+	.8byte	0
+.LLST130:
+	.8byte	.LVL344
+	.8byte	.LVL400
+	.2byte	0x1
+	.byte	0x52
+	.8byte	.LVL404
+	.8byte	.LVL413
+	.2byte	0x1
+	.byte	0x52
+	.8byte	.LVL473
+	.8byte	.LVL480
+	.2byte	0x1
+	.byte	0x52
+	.8byte	.LVL484
+	.8byte	.LVL510
+	.2byte	0x1
+	.byte	0x52
+	.8byte	0
+	.8byte	0
+.LLST131:
+	.8byte	.LVL344
+	.8byte	.LVL359
+	.2byte	0x1
+	.byte	0x6e
+	.8byte	.LVL362
+	.8byte	.LVL366
+	.2byte	0x1
+	.byte	0x6e
+	.8byte	.LVL369
+	.8byte	.LVL373
+	.2byte	0x1
+	.byte	0x6e
+	.8byte	.LVL376
+	.8byte	.LVL380
+	.2byte	0x1
+	.byte	0x6e
+	.8byte	.LVL383
+	.8byte	.LVL387
+	.2byte	0x1
+	.byte	0x6e
+	.8byte	.LVL390
+	.8byte	.LVL394
+	.2byte	0x1
+	.byte	0x6e
+	.8byte	.LVL397
+	.8byte	.LVL414
+	.2byte	0x1
+	.byte	0x6e
+	.8byte	.LVL420
+	.8byte	.LVL424
+	.2byte	0x1
+	.byte	0x6e
+	.8byte	.LVL427
+	.8byte	.LVL431
+	.2byte	0x1
+	.byte	0x6e
+	.8byte	.LVL434
+	.8byte	.LVL438
+	.2byte	0x1
+	.byte	0x6e
+	.8byte	.LVL441
+	.8byte	.LVL445
+	.2byte	0x1
+	.byte	0x6e
+	.8byte	.LVL448
+	.8byte	.LVL452
+	.2byte	0x1
+	.byte	0x6e
+	.8byte	.LVL455
+	.8byte	.LVL459
+	.2byte	0x1
+	.byte	0x6e
+	.8byte	.LVL462
+	.8byte	.LVL479
+	.2byte	0x1
+	.byte	0x6e
+	.8byte	.LVL480
+	.8byte	.LVL485
+	.2byte	0x1
+	.byte	0x6e
+	.8byte	.LVL509
+	.8byte	.LVL515
+	.2byte	0x1
+	.byte	0x6e
+	.8byte	0
+	.8byte	0
+.LLST132:
+	.8byte	.LVL349
+	.8byte	.LVL353
+	.2byte	0x1
+	.byte	0x55
+	.8byte	.LVL354
+	.8byte	.LVL405
+	.2byte	0x1
+	.byte	0x55
+	.8byte	.LVL480
+	.8byte	.LVL510
+	.2byte	0x1
+	.byte	0x55
 	.8byte	0
 	.8byte	0
 .LLST133:
-	.8byte	.LVL387
-	.8byte	.LVL391
+	.8byte	.LVL356
+	.8byte	.LVL360
 	.2byte	0x1
 	.byte	0x60
 	.8byte	0
 	.8byte	0
 .LLST134:
-	.8byte	.LVL347
-	.8byte	.LVL354
+	.8byte	.LVL344
+	.8byte	.LVL351
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL358
-	.8byte	.LVL360
+	.8byte	.LVL355
+	.8byte	.LVL357
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL365
-	.8byte	.LVL367
+	.8byte	.LVL361
+	.8byte	.LVL364
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL372
-	.8byte	.LVL374
+	.8byte	.LVL369
+	.8byte	.LVL371
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL379
-	.8byte	.LVL381
+	.8byte	.LVL376
+	.8byte	.LVL378
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL386
-	.8byte	.LVL388
+	.8byte	.LVL383
+	.8byte	.LVL385
 	.2byte	0x1
 	.byte	0x53
+	.8byte	.LVL390
 	.8byte	.LVL392
-	.8byte	.LVL395
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL400
+	.8byte	.LVL397
+	.8byte	.LVL401
+	.2byte	0x1
+	.byte	0x53
 	.8byte	.LVL404
+	.8byte	.LVL415
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL407
-	.8byte	.LVL418
+	.8byte	.LVL420
+	.8byte	.LVL422
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL423
-	.8byte	.LVL425
+	.8byte	.LVL427
+	.8byte	.LVL429
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL430
-	.8byte	.LVL432
+	.8byte	.LVL434
+	.8byte	.LVL436
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL437
-	.8byte	.LVL439
-	.2byte	0x1
-	.byte	0x53
+	.8byte	.LVL441
 	.8byte	.LVL444
-	.8byte	.LVL447
 	.2byte	0x1
 	.byte	0x53
+	.8byte	.LVL448
 	.8byte	.LVL451
-	.8byte	.LVL454
 	.2byte	0x1
 	.byte	0x53
+	.8byte	.LVL455
 	.8byte	.LVL458
-	.8byte	.LVL461
 	.2byte	0x1
 	.byte	0x53
+	.8byte	.LVL462
 	.8byte	.LVL465
-	.8byte	.LVL468
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL472
-	.8byte	.LVL483
+	.8byte	.LVL469
+	.8byte	.LVL480
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL487
-	.8byte	.LVL488
+	.8byte	.LVL484
+	.8byte	.LVL485
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL492
-	.8byte	.LVL494
+	.8byte	.LVL505
+	.8byte	.LVL507
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL517
-	.8byte	.LVL518
+	.8byte	.LVL514
+	.8byte	.LVL515
 	.2byte	0x1
 	.byte	0x53
 	.8byte	0
 	.8byte	0
 .LLST135:
-	.8byte	.LVL394
-	.8byte	.LVL398
+	.8byte	.LVL363
+	.8byte	.LVL367
 	.2byte	0x1
 	.byte	0x60
 	.8byte	0
 	.8byte	0
 .LLST136:
-	.8byte	.LVL347
-	.8byte	.LVL354
+	.8byte	.LVL344
+	.8byte	.LVL351
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL358
-	.8byte	.LVL360
+	.8byte	.LVL355
+	.8byte	.LVL357
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL365
-	.8byte	.LVL367
+	.8byte	.LVL362
+	.8byte	.LVL364
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL372
-	.8byte	.LVL374
+	.8byte	.LVL368
+	.8byte	.LVL371
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL379
-	.8byte	.LVL381
+	.8byte	.LVL376
+	.8byte	.LVL378
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL386
-	.8byte	.LVL388
+	.8byte	.LVL383
+	.8byte	.LVL385
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL393
-	.8byte	.LVL395
+	.8byte	.LVL390
+	.8byte	.LVL392
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL399
+	.8byte	.LVL397
+	.8byte	.LVL401
+	.2byte	0x1
+	.byte	0x53
 	.8byte	.LVL404
+	.8byte	.LVL415
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL407
-	.8byte	.LVL418
+	.8byte	.LVL420
+	.8byte	.LVL422
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL423
-	.8byte	.LVL425
+	.8byte	.LVL427
+	.8byte	.LVL429
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL430
-	.8byte	.LVL432
+	.8byte	.LVL434
+	.8byte	.LVL436
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL437
-	.8byte	.LVL439
-	.2byte	0x1
-	.byte	0x53
+	.8byte	.LVL441
 	.8byte	.LVL444
-	.8byte	.LVL447
 	.2byte	0x1
 	.byte	0x53
+	.8byte	.LVL448
 	.8byte	.LVL451
-	.8byte	.LVL454
 	.2byte	0x1
 	.byte	0x53
+	.8byte	.LVL455
 	.8byte	.LVL458
-	.8byte	.LVL461
 	.2byte	0x1
 	.byte	0x53
+	.8byte	.LVL462
 	.8byte	.LVL465
-	.8byte	.LVL468
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL472
-	.8byte	.LVL483
+	.8byte	.LVL469
+	.8byte	.LVL480
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL487
-	.8byte	.LVL490
+	.8byte	.LVL484
+	.8byte	.LVL485
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL517
-	.8byte	.LVL518
+	.8byte	.LVL501
+	.8byte	.LVL503
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL514
+	.8byte	.LVL515
 	.2byte	0x1
 	.byte	0x53
 	.8byte	0
 	.8byte	0
 .LLST137:
-	.8byte	.LVL401
-	.8byte	.LVL405
+	.8byte	.LVL370
+	.8byte	.LVL374
 	.2byte	0x1
-	.byte	0x5f
+	.byte	0x60
 	.8byte	0
 	.8byte	0
 .LLST138:
-	.8byte	.LVL347
-	.8byte	.LVL354
+	.8byte	.LVL344
+	.8byte	.LVL351
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL358
-	.8byte	.LVL360
+	.8byte	.LVL355
+	.8byte	.LVL357
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL365
-	.8byte	.LVL367
+	.8byte	.LVL362
+	.8byte	.LVL364
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL372
-	.8byte	.LVL374
+	.8byte	.LVL369
+	.8byte	.LVL371
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL379
-	.8byte	.LVL381
+	.8byte	.LVL375
+	.8byte	.LVL378
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL386
-	.8byte	.LVL388
+	.8byte	.LVL383
+	.8byte	.LVL385
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL393
-	.8byte	.LVL395
+	.8byte	.LVL390
+	.8byte	.LVL392
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL400
+	.8byte	.LVL397
+	.8byte	.LVL401
+	.2byte	0x1
+	.byte	0x53
 	.8byte	.LVL404
+	.8byte	.LVL415
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL406
-	.8byte	.LVL418
+	.8byte	.LVL420
+	.8byte	.LVL422
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL423
-	.8byte	.LVL425
+	.8byte	.LVL427
+	.8byte	.LVL429
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL430
-	.8byte	.LVL432
+	.8byte	.LVL434
+	.8byte	.LVL436
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL437
-	.8byte	.LVL439
-	.2byte	0x1
-	.byte	0x53
+	.8byte	.LVL441
 	.8byte	.LVL444
-	.8byte	.LVL447
 	.2byte	0x1
 	.byte	0x53
+	.8byte	.LVL448
 	.8byte	.LVL451
-	.8byte	.LVL454
 	.2byte	0x1
 	.byte	0x53
+	.8byte	.LVL455
 	.8byte	.LVL458
-	.8byte	.LVL461
 	.2byte	0x1
 	.byte	0x53
+	.8byte	.LVL462
 	.8byte	.LVL465
-	.8byte	.LVL468
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL472
-	.8byte	.LVL488
+	.8byte	.LVL469
+	.8byte	.LVL480
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL517
-	.8byte	.LVL518
+	.8byte	.LVL484
+	.8byte	.LVL485
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL497
+	.8byte	.LVL499
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL514
+	.8byte	.LVL515
 	.2byte	0x1
 	.byte	0x53
 	.8byte	0
 	.8byte	0
 .LLST139:
-	.8byte	.LVL347
-	.8byte	.LVL348
+	.8byte	.LVL377
+	.8byte	.LVL381
 	.2byte	0x1
-	.byte	0x57
-	.8byte	.LVL412
-	.8byte	.LVL413
-	.2byte	0x1
-	.byte	0x57
-	.8byte	.LVL414
-	.8byte	.LVL483
-	.2byte	0x1
-	.byte	0x57
-	.8byte	.LVL513
-	.8byte	.LVL515
-	.2byte	0x1
-	.byte	0x57
-	.8byte	.LVL517
-	.8byte	.LVL540
-	.2byte	0x1
-	.byte	0x57
+	.byte	0x60
 	.8byte	0
 	.8byte	0
 .LLST140:
+	.8byte	.LVL344
+	.8byte	.LVL351
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL355
+	.8byte	.LVL357
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL362
+	.8byte	.LVL364
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL369
+	.8byte	.LVL371
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL376
+	.8byte	.LVL378
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL382
+	.8byte	.LVL385
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL390
+	.8byte	.LVL392
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL397
+	.8byte	.LVL401
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL404
+	.8byte	.LVL415
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL420
+	.8byte	.LVL422
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL427
+	.8byte	.LVL429
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL434
+	.8byte	.LVL436
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL441
+	.8byte	.LVL444
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL448
+	.8byte	.LVL451
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL455
+	.8byte	.LVL458
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL462
+	.8byte	.LVL465
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL469
+	.8byte	.LVL480
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL484
+	.8byte	.LVL485
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL493
+	.8byte	.LVL495
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL514
+	.8byte	.LVL515
+	.2byte	0x1
+	.byte	0x53
+	.8byte	0
+	.8byte	0
+.LLST141:
+	.8byte	.LVL384
+	.8byte	.LVL388
+	.2byte	0x1
+	.byte	0x60
+	.8byte	0
+	.8byte	0
+.LLST142:
+	.8byte	.LVL344
+	.8byte	.LVL351
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL355
+	.8byte	.LVL357
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL362
+	.8byte	.LVL364
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL369
+	.8byte	.LVL371
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL376
+	.8byte	.LVL378
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL383
+	.8byte	.LVL385
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL389
+	.8byte	.LVL392
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL397
+	.8byte	.LVL401
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL404
+	.8byte	.LVL415
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL420
+	.8byte	.LVL422
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL427
+	.8byte	.LVL429
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL434
+	.8byte	.LVL436
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL441
+	.8byte	.LVL444
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL448
+	.8byte	.LVL451
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL455
+	.8byte	.LVL458
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL462
+	.8byte	.LVL465
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL469
+	.8byte	.LVL480
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL484
+	.8byte	.LVL485
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL489
+	.8byte	.LVL491
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL514
+	.8byte	.LVL515
+	.2byte	0x1
+	.byte	0x53
+	.8byte	0
+	.8byte	0
+.LLST143:
+	.8byte	.LVL391
+	.8byte	.LVL395
+	.2byte	0x1
+	.byte	0x60
+	.8byte	0
+	.8byte	0
+.LLST144:
+	.8byte	.LVL344
+	.8byte	.LVL351
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL355
+	.8byte	.LVL357
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL362
+	.8byte	.LVL364
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL369
+	.8byte	.LVL371
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL376
+	.8byte	.LVL378
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL383
+	.8byte	.LVL385
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL390
+	.8byte	.LVL392
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL396
+	.8byte	.LVL401
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL404
+	.8byte	.LVL415
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL420
+	.8byte	.LVL422
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL427
+	.8byte	.LVL429
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL434
+	.8byte	.LVL436
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL441
+	.8byte	.LVL444
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL448
+	.8byte	.LVL451
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL455
+	.8byte	.LVL458
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL462
+	.8byte	.LVL465
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL469
+	.8byte	.LVL480
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL484
+	.8byte	.LVL487
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL514
+	.8byte	.LVL515
+	.2byte	0x1
+	.byte	0x53
+	.8byte	0
+	.8byte	0
+.LLST145:
+	.8byte	.LVL398
+	.8byte	.LVL402
+	.2byte	0x1
+	.byte	0x5f
+	.8byte	0
+	.8byte	0
+.LLST146:
+	.8byte	.LVL344
+	.8byte	.LVL351
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL355
+	.8byte	.LVL357
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL362
+	.8byte	.LVL364
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL369
+	.8byte	.LVL371
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL376
+	.8byte	.LVL378
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL383
+	.8byte	.LVL385
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL390
+	.8byte	.LVL392
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL397
+	.8byte	.LVL401
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL403
+	.8byte	.LVL415
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL420
+	.8byte	.LVL422
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL427
+	.8byte	.LVL429
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL434
+	.8byte	.LVL436
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL441
+	.8byte	.LVL444
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL448
+	.8byte	.LVL451
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL455
+	.8byte	.LVL458
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL462
+	.8byte	.LVL465
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL469
+	.8byte	.LVL485
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL514
+	.8byte	.LVL515
+	.2byte	0x1
+	.byte	0x53
+	.8byte	0
+	.8byte	0
+.LLST147:
+	.8byte	.LVL344
+	.8byte	.LVL345
+	.2byte	0x1
+	.byte	0x57
+	.8byte	.LVL409
+	.8byte	.LVL410
+	.2byte	0x1
+	.byte	0x57
+	.8byte	.LVL411
+	.8byte	.LVL480
+	.2byte	0x1
+	.byte	0x57
+	.8byte	.LVL510
+	.8byte	.LVL512
+	.2byte	0x1
+	.byte	0x57
+	.8byte	.LVL514
+	.8byte	.LVL537
+	.2byte	0x1
+	.byte	0x57
+	.8byte	0
+	.8byte	0
+.LLST148:
+	.8byte	.LVL344
 	.8byte	.LVL347
-	.8byte	.LVL350
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL412
+	.8byte	.LVL409
+	.8byte	.LVL470
+	.2byte	0x1
+	.byte	0x50
 	.8byte	.LVL473
+	.8byte	.LVL480
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL476
-	.8byte	.LVL483
+	.8byte	.LVL510
+	.8byte	.LVL511
 	.2byte	0x1
 	.byte	0x50
 	.8byte	.LVL513
-	.8byte	.LVL514
+	.8byte	.LVL516
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL516
+	.8byte	.LVL517
 	.8byte	.LVL519
 	.2byte	0x1
 	.byte	0x50
@@ -63309,611 +63611,495 @@
 	.8byte	.LVL525
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL526
-	.8byte	.LVL528
-	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL530
-	.8byte	.LVL532
-	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL534
-	.8byte	.LVL536
-	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL538
-	.8byte	.LVL540
-	.2byte	0x1
-	.byte	0x50
-	.8byte	0
-	.8byte	0
-.LLST141:
-	.8byte	.LVL347
-	.8byte	.LVL355
-	.2byte	0x1
-	.byte	0x54
-	.8byte	.LVL358
-	.8byte	.LVL361
-	.2byte	0x1
-	.byte	0x54
-	.8byte	.LVL365
-	.8byte	.LVL368
-	.2byte	0x1
-	.byte	0x54
-	.8byte	.LVL372
-	.8byte	.LVL375
-	.2byte	0x1
-	.byte	0x54
-	.8byte	.LVL379
-	.8byte	.LVL382
-	.2byte	0x1
-	.byte	0x54
-	.8byte	.LVL386
-	.8byte	.LVL389
-	.2byte	0x1
-	.byte	0x54
-	.8byte	.LVL393
-	.8byte	.LVL396
-	.2byte	0x1
-	.byte	0x54
-	.8byte	.LVL400
-	.8byte	.LVL402
-	.2byte	0x1
-	.byte	0x54
-	.8byte	.LVL407
-	.8byte	.LVL483
-	.2byte	0x1
-	.byte	0x54
-	.8byte	.LVL487
-	.8byte	.LVL488
-	.2byte	0x1
-	.byte	0x54
-	.8byte	.LVL513
-	.8byte	.LVL540
-	.2byte	0x1
-	.byte	0x54
-	.8byte	0
-	.8byte	0
-.LLST142:
-	.8byte	.LVL416
-	.8byte	.LVL419
-	.2byte	0x1
-	.byte	0x52
-	.8byte	.LVL422
-	.8byte	.LVL475
-	.2byte	0x1
-	.byte	0x52
-	.8byte	.LVL513
-	.8byte	.LVL540
-	.2byte	0x1
-	.byte	0x52
-	.8byte	0
-	.8byte	0
-.LLST143:
-	.8byte	.LVL415
-	.8byte	.LVL469
-	.2byte	0x1
-	.byte	0x55
-	.8byte	.LVL472
-	.8byte	.LVL474
-	.2byte	0x1
-	.byte	0x55
-	.8byte	.LVL517
-	.8byte	.LVL540
-	.2byte	0x1
-	.byte	0x55
-	.8byte	0
-	.8byte	0
-.LLST144:
-	.8byte	.LVL347
-	.8byte	.LVL353
-	.2byte	0x1
-	.byte	0x6e
-	.8byte	.LVL358
-	.8byte	.LVL362
-	.2byte	0x1
-	.byte	0x6e
-	.8byte	.LVL365
-	.8byte	.LVL369
-	.2byte	0x1
-	.byte	0x6e
-	.8byte	.LVL372
-	.8byte	.LVL376
-	.2byte	0x1
-	.byte	0x6e
-	.8byte	.LVL379
-	.8byte	.LVL383
-	.2byte	0x1
-	.byte	0x6e
-	.8byte	.LVL386
-	.8byte	.LVL390
-	.2byte	0x1
-	.byte	0x6e
-	.8byte	.LVL393
-	.8byte	.LVL397
-	.2byte	0x1
-	.byte	0x6e
-	.8byte	.LVL400
-	.8byte	.LVL427
-	.2byte	0x1
-	.byte	0x6e
-	.8byte	.LVL430
-	.8byte	.LVL434
-	.2byte	0x1
-	.byte	0x6e
-	.8byte	.LVL437
-	.8byte	.LVL441
-	.2byte	0x1
-	.byte	0x6e
-	.8byte	.LVL444
-	.8byte	.LVL448
-	.2byte	0x1
-	.byte	0x6e
-	.8byte	.LVL451
-	.8byte	.LVL455
-	.2byte	0x1
-	.byte	0x6e
-	.8byte	.LVL458
-	.8byte	.LVL462
-	.2byte	0x1
-	.byte	0x6e
-	.8byte	.LVL465
-	.8byte	.LVL482
-	.2byte	0x1
-	.byte	0x6e
-	.8byte	.LVL483
-	.8byte	.LVL488
-	.2byte	0x1
-	.byte	0x6e
-	.8byte	.LVL513
-	.8byte	.LVL518
-	.2byte	0x1
-	.byte	0x6e
-	.8byte	.LVL539
-	.8byte	.LVL540
-	.2byte	0x1
-	.byte	0x6e
-	.8byte	0
-	.8byte	0
-.LLST145:
-	.8byte	.LVL421
-	.8byte	.LVL422
-	.2byte	0x1
-	.byte	0x52
-	.8byte	0
-	.8byte	0
-.LLST146:
-	.8byte	.LVL424
-	.8byte	.LVL428
-	.2byte	0x1
-	.byte	0x60
-	.8byte	0
-	.8byte	0
-.LLST147:
-	.8byte	.LVL347
-	.8byte	.LVL354
-	.2byte	0x1
-	.byte	0x53
-	.8byte	.LVL358
-	.8byte	.LVL360
-	.2byte	0x1
-	.byte	0x53
-	.8byte	.LVL365
-	.8byte	.LVL367
-	.2byte	0x1
-	.byte	0x53
-	.8byte	.LVL372
-	.8byte	.LVL374
-	.2byte	0x1
-	.byte	0x53
-	.8byte	.LVL379
-	.8byte	.LVL381
-	.2byte	0x1
-	.byte	0x53
-	.8byte	.LVL386
-	.8byte	.LVL388
-	.2byte	0x1
-	.byte	0x53
-	.8byte	.LVL393
-	.8byte	.LVL395
-	.2byte	0x1
-	.byte	0x53
-	.8byte	.LVL400
-	.8byte	.LVL404
-	.2byte	0x1
-	.byte	0x53
-	.8byte	.LVL407
-	.8byte	.LVL418
-	.2byte	0x1
-	.byte	0x53
-	.8byte	.LVL423
-	.8byte	.LVL425
-	.2byte	0x1
-	.byte	0x53
-	.8byte	.LVL429
-	.8byte	.LVL432
-	.2byte	0x1
-	.byte	0x53
-	.8byte	.LVL437
-	.8byte	.LVL439
-	.2byte	0x1
-	.byte	0x53
-	.8byte	.LVL444
-	.8byte	.LVL447
-	.2byte	0x1
-	.byte	0x53
-	.8byte	.LVL451
-	.8byte	.LVL454
-	.2byte	0x1
-	.byte	0x53
-	.8byte	.LVL458
-	.8byte	.LVL461
-	.2byte	0x1
-	.byte	0x53
-	.8byte	.LVL465
-	.8byte	.LVL468
-	.2byte	0x1
-	.byte	0x53
-	.8byte	.LVL472
-	.8byte	.LVL483
-	.2byte	0x1
-	.byte	0x53
-	.8byte	.LVL487
-	.8byte	.LVL488
-	.2byte	0x1
-	.byte	0x53
-	.8byte	.LVL517
-	.8byte	.LVL518
-	.2byte	0x1
-	.byte	0x53
-	.8byte	.LVL535
-	.8byte	.LVL537
-	.2byte	0x1
-	.byte	0x53
-	.8byte	0
-	.8byte	0
-.LLST148:
-	.8byte	.LVL431
-	.8byte	.LVL435
-	.2byte	0x1
-	.byte	0x60
-	.8byte	0
-	.8byte	0
-.LLST149:
-	.8byte	.LVL347
-	.8byte	.LVL354
-	.2byte	0x1
-	.byte	0x53
-	.8byte	.LVL358
-	.8byte	.LVL360
-	.2byte	0x1
-	.byte	0x53
-	.8byte	.LVL365
-	.8byte	.LVL367
-	.2byte	0x1
-	.byte	0x53
-	.8byte	.LVL372
-	.8byte	.LVL374
-	.2byte	0x1
-	.byte	0x53
-	.8byte	.LVL379
-	.8byte	.LVL381
-	.2byte	0x1
-	.byte	0x53
-	.8byte	.LVL386
-	.8byte	.LVL388
-	.2byte	0x1
-	.byte	0x53
-	.8byte	.LVL393
-	.8byte	.LVL395
-	.2byte	0x1
-	.byte	0x53
-	.8byte	.LVL400
-	.8byte	.LVL404
-	.2byte	0x1
-	.byte	0x53
-	.8byte	.LVL407
-	.8byte	.LVL418
-	.2byte	0x1
-	.byte	0x53
-	.8byte	.LVL423
-	.8byte	.LVL425
-	.2byte	0x1
-	.byte	0x53
-	.8byte	.LVL430
-	.8byte	.LVL432
-	.2byte	0x1
-	.byte	0x53
-	.8byte	.LVL436
-	.8byte	.LVL439
-	.2byte	0x1
-	.byte	0x53
-	.8byte	.LVL444
-	.8byte	.LVL447
-	.2byte	0x1
-	.byte	0x53
-	.8byte	.LVL451
-	.8byte	.LVL454
-	.2byte	0x1
-	.byte	0x53
-	.8byte	.LVL458
-	.8byte	.LVL461
-	.2byte	0x1
-	.byte	0x53
-	.8byte	.LVL465
-	.8byte	.LVL468
-	.2byte	0x1
-	.byte	0x53
-	.8byte	.LVL472
-	.8byte	.LVL483
-	.2byte	0x1
-	.byte	0x53
-	.8byte	.LVL487
-	.8byte	.LVL488
-	.2byte	0x1
-	.byte	0x53
-	.8byte	.LVL517
-	.8byte	.LVL518
-	.2byte	0x1
-	.byte	0x53
-	.8byte	.LVL531
-	.8byte	.LVL533
-	.2byte	0x1
-	.byte	0x53
-	.8byte	0
-	.8byte	0
-.LLST150:
-	.8byte	.LVL438
-	.8byte	.LVL442
-	.2byte	0x1
-	.byte	0x60
-	.8byte	0
-	.8byte	0
-.LLST151:
-	.8byte	.LVL347
-	.8byte	.LVL354
-	.2byte	0x1
-	.byte	0x53
-	.8byte	.LVL358
-	.8byte	.LVL360
-	.2byte	0x1
-	.byte	0x53
-	.8byte	.LVL365
-	.8byte	.LVL367
-	.2byte	0x1
-	.byte	0x53
-	.8byte	.LVL372
-	.8byte	.LVL374
-	.2byte	0x1
-	.byte	0x53
-	.8byte	.LVL379
-	.8byte	.LVL381
-	.2byte	0x1
-	.byte	0x53
-	.8byte	.LVL386
-	.8byte	.LVL388
-	.2byte	0x1
-	.byte	0x53
-	.8byte	.LVL393
-	.8byte	.LVL395
-	.2byte	0x1
-	.byte	0x53
-	.8byte	.LVL400
-	.8byte	.LVL404
-	.2byte	0x1
-	.byte	0x53
-	.8byte	.LVL407
-	.8byte	.LVL418
-	.2byte	0x1
-	.byte	0x53
-	.8byte	.LVL423
-	.8byte	.LVL425
-	.2byte	0x1
-	.byte	0x53
-	.8byte	.LVL430
-	.8byte	.LVL432
-	.2byte	0x1
-	.byte	0x53
-	.8byte	.LVL437
-	.8byte	.LVL439
-	.2byte	0x1
-	.byte	0x53
-	.8byte	.LVL443
-	.8byte	.LVL447
-	.2byte	0x1
-	.byte	0x53
-	.8byte	.LVL451
-	.8byte	.LVL454
-	.2byte	0x1
-	.byte	0x53
-	.8byte	.LVL458
-	.8byte	.LVL461
-	.2byte	0x1
-	.byte	0x53
-	.8byte	.LVL465
-	.8byte	.LVL468
-	.2byte	0x1
-	.byte	0x53
-	.8byte	.LVL472
-	.8byte	.LVL483
-	.2byte	0x1
-	.byte	0x53
-	.8byte	.LVL487
-	.8byte	.LVL488
-	.2byte	0x1
-	.byte	0x53
-	.8byte	.LVL517
-	.8byte	.LVL518
-	.2byte	0x1
-	.byte	0x53
 	.8byte	.LVL527
 	.8byte	.LVL529
 	.2byte	0x1
-	.byte	0x53
+	.byte	0x50
+	.8byte	.LVL531
+	.8byte	.LVL533
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL535
+	.8byte	.LVL537
+	.2byte	0x1
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST149:
+	.8byte	.LVL344
+	.8byte	.LVL352
+	.2byte	0x1
+	.byte	0x54
+	.8byte	.LVL355
+	.8byte	.LVL358
+	.2byte	0x1
+	.byte	0x54
+	.8byte	.LVL362
+	.8byte	.LVL365
+	.2byte	0x1
+	.byte	0x54
+	.8byte	.LVL369
+	.8byte	.LVL372
+	.2byte	0x1
+	.byte	0x54
+	.8byte	.LVL376
+	.8byte	.LVL379
+	.2byte	0x1
+	.byte	0x54
+	.8byte	.LVL383
+	.8byte	.LVL386
+	.2byte	0x1
+	.byte	0x54
+	.8byte	.LVL390
+	.8byte	.LVL393
+	.2byte	0x1
+	.byte	0x54
+	.8byte	.LVL397
+	.8byte	.LVL399
+	.2byte	0x1
+	.byte	0x54
+	.8byte	.LVL404
+	.8byte	.LVL480
+	.2byte	0x1
+	.byte	0x54
+	.8byte	.LVL484
+	.8byte	.LVL485
+	.2byte	0x1
+	.byte	0x54
+	.8byte	.LVL510
+	.8byte	.LVL537
+	.2byte	0x1
+	.byte	0x54
+	.8byte	0
+	.8byte	0
+.LLST150:
+	.8byte	.LVL413
+	.8byte	.LVL416
+	.2byte	0x1
+	.byte	0x52
+	.8byte	.LVL419
+	.8byte	.LVL472
+	.2byte	0x1
+	.byte	0x52
+	.8byte	.LVL510
+	.8byte	.LVL537
+	.2byte	0x1
+	.byte	0x52
+	.8byte	0
+	.8byte	0
+.LLST151:
+	.8byte	.LVL412
+	.8byte	.LVL466
+	.2byte	0x1
+	.byte	0x55
+	.8byte	.LVL469
+	.8byte	.LVL471
+	.2byte	0x1
+	.byte	0x55
+	.8byte	.LVL514
+	.8byte	.LVL537
+	.2byte	0x1
+	.byte	0x55
 	.8byte	0
 	.8byte	0
 .LLST152:
-	.8byte	.LVL445
-	.8byte	.LVL449
+	.8byte	.LVL344
+	.8byte	.LVL350
 	.2byte	0x1
-	.byte	0x60
+	.byte	0x6e
+	.8byte	.LVL355
+	.8byte	.LVL359
+	.2byte	0x1
+	.byte	0x6e
+	.8byte	.LVL362
+	.8byte	.LVL366
+	.2byte	0x1
+	.byte	0x6e
+	.8byte	.LVL369
+	.8byte	.LVL373
+	.2byte	0x1
+	.byte	0x6e
+	.8byte	.LVL376
+	.8byte	.LVL380
+	.2byte	0x1
+	.byte	0x6e
+	.8byte	.LVL383
+	.8byte	.LVL387
+	.2byte	0x1
+	.byte	0x6e
+	.8byte	.LVL390
+	.8byte	.LVL394
+	.2byte	0x1
+	.byte	0x6e
+	.8byte	.LVL397
+	.8byte	.LVL424
+	.2byte	0x1
+	.byte	0x6e
+	.8byte	.LVL427
+	.8byte	.LVL431
+	.2byte	0x1
+	.byte	0x6e
+	.8byte	.LVL434
+	.8byte	.LVL438
+	.2byte	0x1
+	.byte	0x6e
+	.8byte	.LVL441
+	.8byte	.LVL445
+	.2byte	0x1
+	.byte	0x6e
+	.8byte	.LVL448
+	.8byte	.LVL452
+	.2byte	0x1
+	.byte	0x6e
+	.8byte	.LVL455
+	.8byte	.LVL459
+	.2byte	0x1
+	.byte	0x6e
+	.8byte	.LVL462
+	.8byte	.LVL479
+	.2byte	0x1
+	.byte	0x6e
+	.8byte	.LVL480
+	.8byte	.LVL485
+	.2byte	0x1
+	.byte	0x6e
+	.8byte	.LVL510
+	.8byte	.LVL515
+	.2byte	0x1
+	.byte	0x6e
+	.8byte	.LVL536
+	.8byte	.LVL537
+	.2byte	0x1
+	.byte	0x6e
 	.8byte	0
 	.8byte	0
 .LLST153:
-	.8byte	.LVL347
-	.8byte	.LVL351
+	.8byte	.LVL418
+	.8byte	.LVL419
 	.2byte	0x1
-	.byte	0x59
-	.8byte	.LVL408
-	.8byte	.LVL420
-	.2byte	0x1
-	.byte	0x59
-	.8byte	.LVL423
-	.8byte	.LVL426
-	.2byte	0x1
-	.byte	0x59
-	.8byte	.LVL430
-	.8byte	.LVL433
-	.2byte	0x1
-	.byte	0x59
-	.8byte	.LVL437
-	.8byte	.LVL440
-	.2byte	0x1
-	.byte	0x59
-	.8byte	.LVL444
-	.8byte	.LVL446
-	.2byte	0x1
-	.byte	0x59
-	.8byte	.LVL450
-	.8byte	.LVL453
-	.2byte	0x1
-	.byte	0x59
-	.8byte	.LVL458
-	.8byte	.LVL460
-	.2byte	0x1
-	.byte	0x59
-	.8byte	.LVL465
-	.8byte	.LVL467
-	.2byte	0x1
-	.byte	0x59
-	.8byte	.LVL472
-	.8byte	.LVL483
-	.2byte	0x1
-	.byte	0x59
-	.8byte	.LVL517
-	.8byte	.LVL518
-	.2byte	0x1
-	.byte	0x59
-	.8byte	.LVL524
-	.8byte	.LVL527
-	.2byte	0x1
-	.byte	0x59
+	.byte	0x52
 	.8byte	0
 	.8byte	0
 .LLST154:
-	.8byte	.LVL452
-	.8byte	.LVL456
+	.8byte	.LVL421
+	.8byte	.LVL425
 	.2byte	0x1
 	.byte	0x60
 	.8byte	0
 	.8byte	0
 .LLST155:
-	.8byte	.LVL347
+	.8byte	.LVL344
 	.8byte	.LVL351
 	.2byte	0x1
-	.byte	0x59
-	.8byte	.LVL408
+	.byte	0x53
+	.8byte	.LVL355
+	.8byte	.LVL357
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL362
+	.8byte	.LVL364
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL369
+	.8byte	.LVL371
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL376
+	.8byte	.LVL378
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL383
+	.8byte	.LVL385
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL390
+	.8byte	.LVL392
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL397
+	.8byte	.LVL401
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL404
+	.8byte	.LVL415
+	.2byte	0x1
+	.byte	0x53
 	.8byte	.LVL420
+	.8byte	.LVL422
 	.2byte	0x1
-	.byte	0x59
-	.8byte	.LVL423
+	.byte	0x53
 	.8byte	.LVL426
+	.8byte	.LVL429
 	.2byte	0x1
-	.byte	0x59
-	.8byte	.LVL430
-	.8byte	.LVL433
+	.byte	0x53
+	.8byte	.LVL434
+	.8byte	.LVL436
 	.2byte	0x1
-	.byte	0x59
-	.8byte	.LVL437
-	.8byte	.LVL440
-	.2byte	0x1
-	.byte	0x59
+	.byte	0x53
+	.8byte	.LVL441
 	.8byte	.LVL444
-	.8byte	.LVL446
 	.2byte	0x1
-	.byte	0x59
+	.byte	0x53
+	.8byte	.LVL448
 	.8byte	.LVL451
-	.8byte	.LVL453
 	.2byte	0x1
-	.byte	0x59
-	.8byte	.LVL457
-	.8byte	.LVL460
+	.byte	0x53
+	.8byte	.LVL455
+	.8byte	.LVL458
 	.2byte	0x1
-	.byte	0x59
+	.byte	0x53
+	.8byte	.LVL462
 	.8byte	.LVL465
-	.8byte	.LVL467
 	.2byte	0x1
-	.byte	0x59
-	.8byte	.LVL472
-	.8byte	.LVL483
+	.byte	0x53
+	.8byte	.LVL469
+	.8byte	.LVL480
 	.2byte	0x1
-	.byte	0x59
-	.8byte	.LVL517
-	.8byte	.LVL521
+	.byte	0x53
+	.8byte	.LVL484
+	.8byte	.LVL485
 	.2byte	0x1
-	.byte	0x59
+	.byte	0x53
+	.8byte	.LVL514
+	.8byte	.LVL515
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL532
+	.8byte	.LVL534
+	.2byte	0x1
+	.byte	0x53
 	.8byte	0
 	.8byte	0
 .LLST156:
-	.8byte	.LVL459
-	.8byte	.LVL463
+	.8byte	.LVL428
+	.8byte	.LVL432
 	.2byte	0x1
 	.byte	0x60
 	.8byte	0
 	.8byte	0
 .LLST157:
-	.8byte	.LVL347
+	.8byte	.LVL344
 	.8byte	.LVL351
 	.2byte	0x1
-	.byte	0x59
-	.8byte	.LVL408
+	.byte	0x53
+	.8byte	.LVL355
+	.8byte	.LVL357
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL362
+	.8byte	.LVL364
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL369
+	.8byte	.LVL371
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL376
+	.8byte	.LVL378
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL383
+	.8byte	.LVL385
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL390
+	.8byte	.LVL392
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL397
+	.8byte	.LVL401
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL404
+	.8byte	.LVL415
+	.2byte	0x1
+	.byte	0x53
 	.8byte	.LVL420
+	.8byte	.LVL422
 	.2byte	0x1
-	.byte	0x59
-	.8byte	.LVL423
-	.8byte	.LVL426
+	.byte	0x53
+	.8byte	.LVL427
+	.8byte	.LVL429
 	.2byte	0x1
-	.byte	0x59
-	.8byte	.LVL430
+	.byte	0x53
 	.8byte	.LVL433
+	.8byte	.LVL436
 	.2byte	0x1
-	.byte	0x59
-	.8byte	.LVL437
-	.8byte	.LVL440
-	.2byte	0x1
-	.byte	0x59
+	.byte	0x53
+	.8byte	.LVL441
 	.8byte	.LVL444
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL448
+	.8byte	.LVL451
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL455
+	.8byte	.LVL458
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL462
+	.8byte	.LVL465
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL469
+	.8byte	.LVL480
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL484
+	.8byte	.LVL485
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL514
+	.8byte	.LVL515
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL528
+	.8byte	.LVL530
+	.2byte	0x1
+	.byte	0x53
+	.8byte	0
+	.8byte	0
+.LLST158:
+	.8byte	.LVL435
+	.8byte	.LVL439
+	.2byte	0x1
+	.byte	0x60
+	.8byte	0
+	.8byte	0
+.LLST159:
+	.8byte	.LVL344
+	.8byte	.LVL351
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL355
+	.8byte	.LVL357
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL362
+	.8byte	.LVL364
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL369
+	.8byte	.LVL371
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL376
+	.8byte	.LVL378
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL383
+	.8byte	.LVL385
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL390
+	.8byte	.LVL392
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL397
+	.8byte	.LVL401
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL404
+	.8byte	.LVL415
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL420
+	.8byte	.LVL422
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL427
+	.8byte	.LVL429
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL434
+	.8byte	.LVL436
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL440
+	.8byte	.LVL444
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL448
+	.8byte	.LVL451
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL455
+	.8byte	.LVL458
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL462
+	.8byte	.LVL465
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL469
+	.8byte	.LVL480
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL484
+	.8byte	.LVL485
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL514
+	.8byte	.LVL515
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL524
+	.8byte	.LVL526
+	.2byte	0x1
+	.byte	0x53
+	.8byte	0
+	.8byte	0
+.LLST160:
+	.8byte	.LVL442
 	.8byte	.LVL446
 	.2byte	0x1
-	.byte	0x59
-	.8byte	.LVL451
-	.8byte	.LVL453
+	.byte	0x60
+	.8byte	0
+	.8byte	0
+.LLST161:
+	.8byte	.LVL344
+	.8byte	.LVL348
 	.2byte	0x1
 	.byte	0x59
-	.8byte	.LVL458
-	.8byte	.LVL460
+	.8byte	.LVL405
+	.8byte	.LVL417
 	.2byte	0x1
 	.byte	0x59
+	.8byte	.LVL420
+	.8byte	.LVL423
+	.2byte	0x1
+	.byte	0x59
+	.8byte	.LVL427
+	.8byte	.LVL430
+	.2byte	0x1
+	.byte	0x59
+	.8byte	.LVL434
+	.8byte	.LVL437
+	.2byte	0x1
+	.byte	0x59
+	.8byte	.LVL441
+	.8byte	.LVL443
+	.2byte	0x1
+	.byte	0x59
+	.8byte	.LVL447
+	.8byte	.LVL450
+	.2byte	0x1
+	.byte	0x59
+	.8byte	.LVL455
+	.8byte	.LVL457
+	.2byte	0x1
+	.byte	0x59
+	.8byte	.LVL462
 	.8byte	.LVL464
-	.8byte	.LVL467
 	.2byte	0x1
 	.byte	0x59
-	.8byte	.LVL472
-	.8byte	.LVL483
+	.8byte	.LVL469
+	.8byte	.LVL480
 	.2byte	0x1
 	.byte	0x59
-	.8byte	.LVL517
-	.8byte	.LVL518
+	.8byte	.LVL514
+	.8byte	.LVL515
 	.2byte	0x1
 	.byte	0x59
 	.8byte	.LVL521
@@ -63922,570 +64108,686 @@
 	.byte	0x59
 	.8byte	0
 	.8byte	0
-.LLST158:
-	.8byte	.LVL466
-	.8byte	.LVL470
-	.2byte	0x1
-	.byte	0x5f
-	.8byte	0
-	.8byte	0
-.LLST159:
-	.8byte	.LVL471
-	.8byte	.LVL474
-	.2byte	0x1
-	.byte	0x55
-	.8byte	.LVL513
-	.8byte	.LVL518
-	.2byte	0x1
-	.byte	0x55
-	.8byte	0
-	.8byte	0
-.LLST160:
-	.8byte	.LVL553
-	.8byte	.LVL555
-	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL555
-	.8byte	.LVL560-1
-	.2byte	0x1
-	.byte	0x55
-	.8byte	.LVL561
-	.8byte	.LVL563
-	.2byte	0x1
-	.byte	0x55
-	.8byte	.LVL563
-	.8byte	.LVL606
-	.2byte	0x1
-	.byte	0x67
-	.8byte	.LVL609
-	.8byte	.LVL628
-	.2byte	0x1
-	.byte	0x67
-	.8byte	.LVL628
-	.8byte	.LVL629
-	.2byte	0x1
-	.byte	0x55
-	.8byte	.LVL629
-	.8byte	.LVL635
-	.2byte	0x1
-	.byte	0x67
-	.8byte	.LVL638
-	.8byte	.LFE2820
-	.2byte	0x1
-	.byte	0x55
-	.8byte	0
-	.8byte	0
-.LLST161:
-	.8byte	.LVL553
-	.8byte	.LVL605
-	.2byte	0x1
-	.byte	0x51
-	.8byte	.LVL609
-	.8byte	.LVL634
-	.2byte	0x1
-	.byte	0x65
-	.8byte	.LVL638
-	.8byte	.LFE2820
-	.2byte	0x1
-	.byte	0x65
-	.8byte	0
-	.8byte	0
 .LLST162:
-	.8byte	.LVL553
-	.8byte	.LVL604
+	.8byte	.LVL449
+	.8byte	.LVL453
 	.2byte	0x1
-	.byte	0x52
-	.8byte	.LVL609
-	.8byte	.LVL633
-	.2byte	0x1
-	.byte	0x64
-	.8byte	.LVL638
-	.8byte	.LFE2820
-	.2byte	0x1
-	.byte	0x64
+	.byte	0x60
 	.8byte	0
 	.8byte	0
 .LLST163:
-	.8byte	.LVL553
-	.8byte	.LVL607
+	.8byte	.LVL344
+	.8byte	.LVL348
 	.2byte	0x1
-	.byte	0x53
-	.8byte	.LVL609
-	.8byte	.LVL636
+	.byte	0x59
+	.8byte	.LVL405
+	.8byte	.LVL417
 	.2byte	0x1
-	.byte	0x69
-	.8byte	.LVL638
-	.8byte	.LFE2820
+	.byte	0x59
+	.8byte	.LVL420
+	.8byte	.LVL423
 	.2byte	0x1
-	.byte	0x69
+	.byte	0x59
+	.8byte	.LVL427
+	.8byte	.LVL430
+	.2byte	0x1
+	.byte	0x59
+	.8byte	.LVL434
+	.8byte	.LVL437
+	.2byte	0x1
+	.byte	0x59
+	.8byte	.LVL441
+	.8byte	.LVL443
+	.2byte	0x1
+	.byte	0x59
+	.8byte	.LVL448
+	.8byte	.LVL450
+	.2byte	0x1
+	.byte	0x59
+	.8byte	.LVL454
+	.8byte	.LVL457
+	.2byte	0x1
+	.byte	0x59
+	.8byte	.LVL462
+	.8byte	.LVL464
+	.2byte	0x1
+	.byte	0x59
+	.8byte	.LVL469
+	.8byte	.LVL480
+	.2byte	0x1
+	.byte	0x59
+	.8byte	.LVL514
+	.8byte	.LVL518
+	.2byte	0x1
+	.byte	0x59
 	.8byte	0
 	.8byte	0
 .LLST164:
-	.8byte	.LVL553
-	.8byte	.LVL607
+	.8byte	.LVL456
+	.8byte	.LVL460
 	.2byte	0x1
-	.byte	0x54
-	.8byte	.LVL609
-	.8byte	.LVL636
-	.2byte	0x1
-	.byte	0x6a
-	.8byte	.LVL638
-	.8byte	.LFE2820
-	.2byte	0x1
-	.byte	0x6a
+	.byte	0x60
 	.8byte	0
 	.8byte	0
 .LLST165:
-	.8byte	.LVL553
-	.8byte	.LVL554
+	.8byte	.LVL344
+	.8byte	.LVL348
 	.2byte	0x1
-	.byte	0x55
-	.8byte	.LVL554
-	.8byte	.LVL604
+	.byte	0x59
+	.8byte	.LVL405
+	.8byte	.LVL417
 	.2byte	0x1
-	.byte	0x63
-	.8byte	.LVL609
-	.8byte	.LVL633
+	.byte	0x59
+	.8byte	.LVL420
+	.8byte	.LVL423
 	.2byte	0x1
-	.byte	0x63
-	.8byte	.LVL638
-	.8byte	.LFE2820
+	.byte	0x59
+	.8byte	.LVL427
+	.8byte	.LVL430
 	.2byte	0x1
-	.byte	0x63
+	.byte	0x59
+	.8byte	.LVL434
+	.8byte	.LVL437
+	.2byte	0x1
+	.byte	0x59
+	.8byte	.LVL441
+	.8byte	.LVL443
+	.2byte	0x1
+	.byte	0x59
+	.8byte	.LVL448
+	.8byte	.LVL450
+	.2byte	0x1
+	.byte	0x59
+	.8byte	.LVL455
+	.8byte	.LVL457
+	.2byte	0x1
+	.byte	0x59
+	.8byte	.LVL461
+	.8byte	.LVL464
+	.2byte	0x1
+	.byte	0x59
+	.8byte	.LVL469
+	.8byte	.LVL480
+	.2byte	0x1
+	.byte	0x59
+	.8byte	.LVL514
+	.8byte	.LVL515
+	.2byte	0x1
+	.byte	0x59
+	.8byte	.LVL518
+	.8byte	.LVL521
+	.2byte	0x1
+	.byte	0x59
 	.8byte	0
 	.8byte	0
 .LLST166:
-	.8byte	.LVL553
-	.8byte	.LVL560-1
+	.8byte	.LVL463
+	.8byte	.LVL467
 	.2byte	0x1
-	.byte	0x56
-	.8byte	.LVL628
-	.8byte	.LVL630-1
-	.2byte	0x1
-	.byte	0x56
-	.8byte	.LVL638
-	.8byte	.LFE2820
-	.2byte	0x1
-	.byte	0x56
+	.byte	0x5f
 	.8byte	0
 	.8byte	0
 .LLST167:
-	.8byte	.LVL558
-	.8byte	.LVL606
+	.8byte	.LVL468
+	.8byte	.LVL471
 	.2byte	0x1
-	.byte	0x68
-	.8byte	.LVL609
-	.8byte	.LVL635
+	.byte	0x55
+	.8byte	.LVL510
+	.8byte	.LVL515
 	.2byte	0x1
-	.byte	0x68
-	.8byte	.LVL639
-	.8byte	.LVL641
-	.2byte	0x1
-	.byte	0x68
-	.8byte	.LVL642
-	.8byte	.LFE2820
-	.2byte	0x1
-	.byte	0x68
+	.byte	0x55
 	.8byte	0
 	.8byte	0
 .LLST168:
-	.8byte	.LVL557
-	.8byte	.LVL608
+	.8byte	.LVL550
+	.8byte	.LVL552
 	.2byte	0x1
-	.byte	0x6b
-	.8byte	.LVL609
-	.8byte	.LVL637
+	.byte	0x50
+	.8byte	.LVL552
+	.8byte	.LVL557-1
 	.2byte	0x1
-	.byte	0x6b
-	.8byte	.LVL640
+	.byte	0x55
+	.8byte	.LVL558
+	.8byte	.LVL560
+	.2byte	0x1
+	.byte	0x55
+	.8byte	.LVL560
+	.8byte	.LVL603
+	.2byte	0x1
+	.byte	0x67
+	.8byte	.LVL606
+	.8byte	.LVL625
+	.2byte	0x1
+	.byte	0x67
+	.8byte	.LVL625
+	.8byte	.LVL626
+	.2byte	0x1
+	.byte	0x55
+	.8byte	.LVL626
+	.8byte	.LVL632
+	.2byte	0x1
+	.byte	0x67
+	.8byte	.LVL635
 	.8byte	.LFE2820
 	.2byte	0x1
-	.byte	0x6b
+	.byte	0x55
 	.8byte	0
 	.8byte	0
 .LLST169:
-	.8byte	.LVL565
-	.8byte	.LVL572
+	.8byte	.LVL550
+	.8byte	.LVL602
 	.2byte	0x1
-	.byte	0x53
-	.8byte	.LVL574
-	.8byte	.LVL576
+	.byte	0x51
+	.8byte	.LVL606
+	.8byte	.LVL631
 	.2byte	0x1
-	.byte	0x53
-	.8byte	.LVL578
-	.8byte	.LVL580
+	.byte	0x65
+	.8byte	.LVL635
+	.8byte	.LFE2820
 	.2byte	0x1
-	.byte	0x53
-	.8byte	.LVL582
-	.8byte	.LVL584
-	.2byte	0x1
-	.byte	0x53
-	.8byte	.LVL586
-	.8byte	.LVL588
-	.2byte	0x1
-	.byte	0x53
-	.8byte	.LVL590
-	.8byte	.LVL592
-	.2byte	0x1
-	.byte	0x53
-	.8byte	.LVL594
-	.8byte	.LVL596
-	.2byte	0x1
-	.byte	0x53
-	.8byte	.LVL598
-	.8byte	.LVL600
-	.2byte	0x1
-	.byte	0x53
-	.8byte	.LVL603
-	.8byte	.LVL609
-	.2byte	0x1
-	.byte	0x53
-	.8byte	.LVL613
-	.8byte	.LVL614
-	.2byte	0x1
-	.byte	0x53
-	.8byte	.LVL627
-	.8byte	.LVL628
-	.2byte	0x1
-	.byte	0x53
-	.8byte	.LVL632
-	.8byte	.LVL638
-	.2byte	0x1
-	.byte	0x53
+	.byte	0x65
 	.8byte	0
 	.8byte	0
 .LLST170:
-	.8byte	.LVL556
-	.8byte	.LVL608
+	.8byte	.LVL550
+	.8byte	.LVL601
 	.2byte	0x1
-	.byte	0x6c
-	.8byte	.LVL609
-	.8byte	.LVL637
+	.byte	0x52
+	.8byte	.LVL606
+	.8byte	.LVL630
 	.2byte	0x1
-	.byte	0x6c
+	.byte	0x64
+	.8byte	.LVL635
+	.8byte	.LFE2820
+	.2byte	0x1
+	.byte	0x64
+	.8byte	0
+	.8byte	0
+.LLST171:
+	.8byte	.LVL550
+	.8byte	.LVL604
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL606
+	.8byte	.LVL633
+	.2byte	0x1
+	.byte	0x69
+	.8byte	.LVL635
+	.8byte	.LFE2820
+	.2byte	0x1
+	.byte	0x69
+	.8byte	0
+	.8byte	0
+.LLST172:
+	.8byte	.LVL550
+	.8byte	.LVL604
+	.2byte	0x1
+	.byte	0x54
+	.8byte	.LVL606
+	.8byte	.LVL633
+	.2byte	0x1
+	.byte	0x6a
+	.8byte	.LVL635
+	.8byte	.LFE2820
+	.2byte	0x1
+	.byte	0x6a
+	.8byte	0
+	.8byte	0
+.LLST173:
+	.8byte	.LVL550
+	.8byte	.LVL551
+	.2byte	0x1
+	.byte	0x55
+	.8byte	.LVL551
+	.8byte	.LVL601
+	.2byte	0x1
+	.byte	0x63
+	.8byte	.LVL606
+	.8byte	.LVL630
+	.2byte	0x1
+	.byte	0x63
+	.8byte	.LVL635
+	.8byte	.LFE2820
+	.2byte	0x1
+	.byte	0x63
+	.8byte	0
+	.8byte	0
+.LLST174:
+	.8byte	.LVL550
+	.8byte	.LVL557-1
+	.2byte	0x1
+	.byte	0x56
+	.8byte	.LVL625
+	.8byte	.LVL627-1
+	.2byte	0x1
+	.byte	0x56
+	.8byte	.LVL635
+	.8byte	.LFE2820
+	.2byte	0x1
+	.byte	0x56
+	.8byte	0
+	.8byte	0
+.LLST175:
+	.8byte	.LVL555
+	.8byte	.LVL603
+	.2byte	0x1
+	.byte	0x68
+	.8byte	.LVL606
+	.8byte	.LVL632
+	.2byte	0x1
+	.byte	0x68
+	.8byte	.LVL636
 	.8byte	.LVL638
+	.2byte	0x1
+	.byte	0x68
+	.8byte	.LVL639
+	.8byte	.LFE2820
+	.2byte	0x1
+	.byte	0x68
+	.8byte	0
+	.8byte	0
+.LLST176:
+	.8byte	.LVL554
+	.8byte	.LVL605
+	.2byte	0x1
+	.byte	0x6b
+	.8byte	.LVL606
+	.8byte	.LVL634
+	.2byte	0x1
+	.byte	0x6b
+	.8byte	.LVL637
+	.8byte	.LFE2820
+	.2byte	0x1
+	.byte	0x6b
+	.8byte	0
+	.8byte	0
+.LLST177:
+	.8byte	.LVL562
+	.8byte	.LVL569
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL571
+	.8byte	.LVL573
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL575
+	.8byte	.LVL577
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL579
+	.8byte	.LVL581
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL583
+	.8byte	.LVL585
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL587
+	.8byte	.LVL589
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL591
+	.8byte	.LVL593
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL595
+	.8byte	.LVL597
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL600
+	.8byte	.LVL606
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL610
+	.8byte	.LVL611
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL624
+	.8byte	.LVL625
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL629
+	.8byte	.LVL635
+	.2byte	0x1
+	.byte	0x53
+	.8byte	0
+	.8byte	0
+.LLST178:
+	.8byte	.LVL553
+	.8byte	.LVL605
+	.2byte	0x1
+	.byte	0x6c
+	.8byte	.LVL606
+	.8byte	.LVL634
+	.2byte	0x1
+	.byte	0x6c
+	.8byte	.LVL635
 	.8byte	.LFE2820
 	.2byte	0x1
 	.byte	0x6c
 	.8byte	0
 	.8byte	0
-.LLST171:
-	.8byte	.LVL559
-	.8byte	.LVL560-1
-	.2byte	0x1
-	.byte	0x5c
-	.8byte	.LVL562
-	.8byte	.LVL564
-	.2byte	0x1
-	.byte	0x5c
-	.8byte	.LVL628
-	.8byte	.LVL630-1
-	.2byte	0x1
-	.byte	0x5c
-	.8byte	.LVL631
-	.8byte	.LVL638
-	.2byte	0x1
-	.byte	0x5c
-	.8byte	0
-	.8byte	0
-.LLST172:
-	.8byte	.LVL566
-	.8byte	.LVL567
-	.2byte	0x1
-	.byte	0x52
-	.8byte	.LVL568
-	.8byte	.LVL611
-	.2byte	0x1
-	.byte	0x52
-	.8byte	.LVL613
-	.8byte	.LVL628
-	.2byte	0x1
-	.byte	0x52
-	.8byte	0
-	.8byte	0
-.LLST173:
-	.8byte	.LVL566
-	.8byte	.LVL610
-	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL612
-	.8byte	.LVL615
-	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL616
-	.8byte	.LVL617
-	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL618
-	.8byte	.LVL619
-	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL620
-	.8byte	.LVL621
-	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL622
-	.8byte	.LVL623
-	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL624
-	.8byte	.LVL625
-	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL626
-	.8byte	.LVL628
-	.2byte	0x1
-	.byte	0x50
-	.8byte	0
-	.8byte	0
-.LLST174:
-	.8byte	.LVL566
-	.8byte	.LVL571
-	.2byte	0x1
-	.byte	0x5d
-	.8byte	.LVL573
-	.8byte	.LVL628
-	.2byte	0x1
-	.byte	0x5d
-	.8byte	0
-	.8byte	0
-.LLST175:
-	.8byte	.LVL566
-	.8byte	.LVL569
-	.2byte	0x1
-	.byte	0x59
-	.8byte	.LVL570
-	.8byte	.LVL628
-	.2byte	0x1
-	.byte	0x59
-	.8byte	0
-	.8byte	0
-.LLST176:
-	.8byte	.LVL566
-	.8byte	.LVL601
-	.2byte	0x1
-	.byte	0x55
-	.8byte	.LVL603
-	.8byte	.LVL609
-	.2byte	0x1
-	.byte	0x55
-	.8byte	.LVL613
-	.8byte	.LVL628
-	.2byte	0x1
-	.byte	0x55
-	.8byte	0
-	.8byte	0
-.LLST177:
-	.8byte	.LVL571
-	.8byte	.LVL573
-	.2byte	0x1
-	.byte	0x5d
-	.8byte	0
-	.8byte	0
-.LLST178:
-	.8byte	.LVL575
-	.8byte	.LVL577
-	.2byte	0x1
-	.byte	0x5f
-	.8byte	0
-	.8byte	0
 .LLST179:
-	.8byte	.LVL579
-	.8byte	.LVL581
+	.8byte	.LVL556
+	.8byte	.LVL557-1
 	.2byte	0x1
-	.byte	0x5f
+	.byte	0x5c
+	.8byte	.LVL559
+	.8byte	.LVL561
+	.2byte	0x1
+	.byte	0x5c
+	.8byte	.LVL625
+	.8byte	.LVL627-1
+	.2byte	0x1
+	.byte	0x5c
+	.8byte	.LVL628
+	.8byte	.LVL635
+	.2byte	0x1
+	.byte	0x5c
 	.8byte	0
 	.8byte	0
 .LLST180:
-	.8byte	.LVL583
-	.8byte	.LVL585
+	.8byte	.LVL563
+	.8byte	.LVL564
 	.2byte	0x1
-	.byte	0x5f
+	.byte	0x52
+	.8byte	.LVL565
+	.8byte	.LVL608
+	.2byte	0x1
+	.byte	0x52
+	.8byte	.LVL610
+	.8byte	.LVL625
+	.2byte	0x1
+	.byte	0x52
 	.8byte	0
 	.8byte	0
 .LLST181:
-	.8byte	.LVL587
-	.8byte	.LVL589
+	.8byte	.LVL563
+	.8byte	.LVL607
 	.2byte	0x1
-	.byte	0x5e
+	.byte	0x50
+	.8byte	.LVL609
+	.8byte	.LVL612
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL613
+	.8byte	.LVL614
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL615
+	.8byte	.LVL616
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL617
+	.8byte	.LVL618
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL619
+	.8byte	.LVL620
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL621
+	.8byte	.LVL622
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL623
+	.8byte	.LVL625
+	.2byte	0x1
+	.byte	0x50
 	.8byte	0
 	.8byte	0
 .LLST182:
-	.8byte	.LVL591
-	.8byte	.LVL593
+	.8byte	.LVL563
+	.8byte	.LVL568
 	.2byte	0x1
-	.byte	0x5f
+	.byte	0x5d
+	.8byte	.LVL570
+	.8byte	.LVL625
+	.2byte	0x1
+	.byte	0x5d
 	.8byte	0
 	.8byte	0
 .LLST183:
-	.8byte	.LVL595
-	.8byte	.LVL597
+	.8byte	.LVL563
+	.8byte	.LVL566
+	.2byte	0x1
+	.byte	0x59
+	.8byte	.LVL567
+	.8byte	.LVL625
+	.2byte	0x1
+	.byte	0x59
+	.8byte	0
+	.8byte	0
+.LLST184:
+	.8byte	.LVL563
+	.8byte	.LVL598
+	.2byte	0x1
+	.byte	0x55
+	.8byte	.LVL600
+	.8byte	.LVL606
+	.2byte	0x1
+	.byte	0x55
+	.8byte	.LVL610
+	.8byte	.LVL625
+	.2byte	0x1
+	.byte	0x55
+	.8byte	0
+	.8byte	0
+.LLST185:
+	.8byte	.LVL568
+	.8byte	.LVL570
+	.2byte	0x1
+	.byte	0x5d
+	.8byte	0
+	.8byte	0
+.LLST186:
+	.8byte	.LVL572
+	.8byte	.LVL574
 	.2byte	0x1
 	.byte	0x5f
 	.8byte	0
 	.8byte	0
-.LLST184:
-	.8byte	.LVL599
-	.8byte	.LVL602
+.LLST187:
+	.8byte	.LVL576
+	.8byte	.LVL578
+	.2byte	0x1
+	.byte	0x5f
+	.8byte	0
+	.8byte	0
+.LLST188:
+	.8byte	.LVL580
+	.8byte	.LVL582
+	.2byte	0x1
+	.byte	0x5f
+	.8byte	0
+	.8byte	0
+.LLST189:
+	.8byte	.LVL584
+	.8byte	.LVL586
 	.2byte	0x1
 	.byte	0x5e
 	.8byte	0
 	.8byte	0
-.LLST344:
+.LLST190:
+	.8byte	.LVL588
+	.8byte	.LVL590
+	.2byte	0x1
+	.byte	0x5f
+	.8byte	0
+	.8byte	0
+.LLST191:
+	.8byte	.LVL592
+	.8byte	.LVL594
+	.2byte	0x1
+	.byte	0x5f
+	.8byte	0
+	.8byte	0
+.LLST192:
+	.8byte	.LVL596
+	.8byte	.LVL599
+	.2byte	0x1
+	.byte	0x5e
+	.8byte	0
+	.8byte	0
+.LLST352:
+	.8byte	.LVL1301
+	.8byte	.LVL1306
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL1314
+	.8byte	.LFE2819
+	.2byte	0x1
+	.byte	0x53
+	.8byte	0
+	.8byte	0
+.LLST353:
+	.8byte	.LVL1305
+	.8byte	.LVL1306
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL1307
 	.8byte	.LVL1309
-	.8byte	.LVL1314
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL1322
-	.8byte	.LFE2819
-	.2byte	0x1
-	.byte	0x53
-	.8byte	0
-	.8byte	0
-.LLST345:
 	.8byte	.LVL1313
-	.8byte	.LVL1314
-	.2byte	0x1
-	.byte	0x53
-	.8byte	.LVL1315
-	.8byte	.LVL1317
-	.2byte	0x1
-	.byte	0x53
-	.8byte	.LVL1321
 	.8byte	.LFE2819
 	.2byte	0x1
 	.byte	0x53
 	.8byte	0
 	.8byte	0
-.LLST346:
-	.8byte	.LVL1316
-	.8byte	.LVL1319
+.LLST354:
+	.8byte	.LVL1308
+	.8byte	.LVL1311
 	.2byte	0x1
 	.byte	0x54
 	.8byte	0
 	.8byte	0
-.LLST347:
-	.8byte	.LVL1318
-	.8byte	.LVL1320
+.LLST355:
+	.8byte	.LVL1310
+	.8byte	.LVL1312
 	.2byte	0x1
 	.byte	0x53
 	.8byte	0
 	.8byte	0
-.LLST323:
-	.8byte	.LVL1227
-	.8byte	.LVL1235
-	.2byte	0x1
-	.byte	0x55
-	.8byte	.LVL1247
-	.8byte	.LVL1249
-	.2byte	0x1
-	.byte	0x55
-	.8byte	.LVL1301
-	.8byte	.LVL1302
-	.2byte	0x1
-	.byte	0x55
-	.8byte	0
-	.8byte	0
-.LLST324:
-	.8byte	.LVL1229
-	.8byte	.LVL1301
-	.2byte	0x1
-	.byte	0x5c
-	.8byte	.LVL1302
-	.8byte	.LFE2818
-	.2byte	0x1
-	.byte	0x5c
-	.8byte	0
-	.8byte	0
-.LLST325:
-	.8byte	.LVL1234
-	.8byte	.LVL1245
-	.2byte	0x1
-	.byte	0x56
-	.8byte	.LVL1250
-	.8byte	.LVL1301
-	.2byte	0x1
-	.byte	0x56
-	.8byte	.LVL1302
-	.8byte	.LFE2818
-	.2byte	0x1
-	.byte	0x56
-	.8byte	0
-	.8byte	0
-.LLST326:
-	.8byte	.LVL1231
-	.8byte	.LVL1233
-	.2byte	0x1
-	.byte	0x5a
-	.8byte	.LVL1244
-	.8byte	.LVL1248
-	.2byte	0x1
-	.byte	0x5a
-	.8byte	0
-	.8byte	0
-.LLST327:
-	.8byte	.LVL1231
-	.8byte	.LVL1301
-	.2byte	0x1
-	.byte	0x59
-	.8byte	.LVL1302
-	.8byte	.LFE2818
-	.2byte	0x1
-	.byte	0x59
-	.8byte	0
-	.8byte	0
-.LLST328:
-	.8byte	.LVL1230
-	.8byte	.LVL1301
-	.2byte	0x1
-	.byte	0x60
-	.8byte	.LVL1302
-	.8byte	.LFE2818
-	.2byte	0x1
-	.byte	0x60
-	.8byte	0
-	.8byte	0
 .LLST331:
-	.8byte	.LVL1236
-	.8byte	.LVL1237
+	.8byte	.LVL1219
+	.8byte	.LVL1227
 	.2byte	0x1
-	.byte	0x5b
-	.8byte	.LVL1269
-	.8byte	.LVL1270
+	.byte	0x55
+	.8byte	.LVL1239
+	.8byte	.LVL1241
 	.2byte	0x1
-	.byte	0x5b
-	.8byte	.LVL1278
-	.8byte	.LVL1279
+	.byte	0x55
+	.8byte	.LVL1293
+	.8byte	.LVL1294
 	.2byte	0x1
-	.byte	0x5b
-	.8byte	.LVL1283
-	.8byte	.LVL1284
-	.2byte	0x1
-	.byte	0x5b
+	.byte	0x55
 	.8byte	0
 	.8byte	0
 .LLST332:
+	.8byte	.LVL1221
+	.8byte	.LVL1293
+	.2byte	0x1
+	.byte	0x5c
+	.8byte	.LVL1294
+	.8byte	.LFE2818
+	.2byte	0x1
+	.byte	0x5c
+	.8byte	0
+	.8byte	0
+.LLST333:
+	.8byte	.LVL1226
 	.8byte	.LVL1237
-	.8byte	.LVL1238
+	.2byte	0x1
+	.byte	0x56
+	.8byte	.LVL1242
+	.8byte	.LVL1293
+	.2byte	0x1
+	.byte	0x56
+	.8byte	.LVL1294
+	.8byte	.LFE2818
+	.2byte	0x1
+	.byte	0x56
+	.8byte	0
+	.8byte	0
+.LLST334:
+	.8byte	.LVL1223
+	.8byte	.LVL1225
+	.2byte	0x1
+	.byte	0x5a
+	.8byte	.LVL1236
+	.8byte	.LVL1240
+	.2byte	0x1
+	.byte	0x5a
+	.8byte	0
+	.8byte	0
+.LLST335:
+	.8byte	.LVL1223
+	.8byte	.LVL1293
+	.2byte	0x1
+	.byte	0x59
+	.8byte	.LVL1294
+	.8byte	.LFE2818
+	.2byte	0x1
+	.byte	0x59
+	.8byte	0
+	.8byte	0
+.LLST336:
+	.8byte	.LVL1222
+	.8byte	.LVL1293
+	.2byte	0x1
+	.byte	0x60
+	.8byte	.LVL1294
+	.8byte	.LFE2818
+	.2byte	0x1
+	.byte	0x60
+	.8byte	0
+	.8byte	0
+.LLST339:
+	.8byte	.LVL1228
+	.8byte	.LVL1229
+	.2byte	0x1
+	.byte	0x5b
+	.8byte	.LVL1261
+	.8byte	.LVL1262
 	.2byte	0x1
 	.byte	0x5b
 	.8byte	.LVL1270
 	.8byte	.LVL1271
 	.2byte	0x1
 	.byte	0x5b
-	.8byte	.LVL1274
 	.8byte	.LVL1275
-	.2byte	0x1
-	.byte	0x5b
-	.8byte	.LVL1281
-	.8byte	.LVL1282
+	.8byte	.LVL1276
 	.2byte	0x1
 	.byte	0x5b
 	.8byte	0
 	.8byte	0
-.LLST333:
-	.8byte	.LVL1238
-	.8byte	.LVL1239
+.LLST340:
+	.8byte	.LVL1229
+	.8byte	.LVL1230
+	.2byte	0x1
+	.byte	0x5b
+	.8byte	.LVL1262
+	.8byte	.LVL1263
+	.2byte	0x1
+	.byte	0x5b
+	.8byte	.LVL1266
+	.8byte	.LVL1267
+	.2byte	0x1
+	.byte	0x5b
+	.8byte	.LVL1273
+	.8byte	.LVL1274
+	.2byte	0x1
+	.byte	0x5b
+	.8byte	0
+	.8byte	0
+.LLST341:
+	.8byte	.LVL1230
+	.8byte	.LVL1231
+	.2byte	0x1
+	.byte	0x5b
+	.8byte	.LVL1263
+	.8byte	.LVL1264
 	.2byte	0x1
 	.byte	0x5b
 	.8byte	.LVL1271
@@ -64496,76 +64798,76 @@
 	.8byte	.LVL1280
 	.2byte	0x1
 	.byte	0x5b
-	.8byte	.LVL1287
-	.8byte	.LVL1288
-	.2byte	0x1
-	.byte	0x5b
 	.8byte	0
 	.8byte	0
-.LLST334:
-	.8byte	.LVL1239
-	.8byte	.LVL1240
+.LLST342:
+	.8byte	.LVL1231
+	.8byte	.LVL1232
 	.2byte	0x1
 	.byte	0x5b
-	.8byte	.LVL1267
-	.8byte	.LVL1268
+	.8byte	.LVL1259
+	.8byte	.LVL1260
+	.2byte	0x1
+	.byte	0x5b
+	.8byte	.LVL1269
+	.8byte	.LVL1270
 	.2byte	0x1
 	.byte	0x5b
 	.8byte	.LVL1277
 	.8byte	.LVL1278
 	.2byte	0x1
 	.byte	0x5b
-	.8byte	.LVL1285
-	.8byte	.LVL1286
+	.8byte	0
+	.8byte	0
+.LLST343:
+	.8byte	.LVL1232
+	.8byte	.LVL1233
+	.2byte	0x1
+	.byte	0x5b
+	.8byte	.LVL1258
+	.8byte	.LVL1259
+	.2byte	0x1
+	.byte	0x5b
+	.8byte	.LVL1268
+	.8byte	.LVL1269
+	.2byte	0x1
+	.byte	0x5b
+	.8byte	.LVL1274
+	.8byte	.LVL1275
 	.2byte	0x1
 	.byte	0x5b
 	.8byte	0
 	.8byte	0
-.LLST335:
-	.8byte	.LVL1240
-	.8byte	.LVL1241
+.LLST337:
+	.8byte	.LVL1233
+	.8byte	.LVL1234
 	.2byte	0x1
 	.byte	0x5b
-	.8byte	.LVL1266
+	.8byte	.LVL1257
+	.8byte	.LVL1258
+	.2byte	0x1
+	.byte	0x5b
 	.8byte	.LVL1267
+	.8byte	.LVL1268
 	.2byte	0x1
 	.byte	0x5b
 	.8byte	.LVL1276
 	.8byte	.LVL1277
 	.2byte	0x1
 	.byte	0x5b
-	.8byte	.LVL1282
-	.8byte	.LVL1283
-	.2byte	0x1
-	.byte	0x5b
 	.8byte	0
 	.8byte	0
-.LLST329:
-	.8byte	.LVL1241
-	.8byte	.LVL1242
+.LLST338:
+	.8byte	.LVL1223
+	.8byte	.LVL1224
 	.2byte	0x1
 	.byte	0x5b
-	.8byte	.LVL1265
-	.8byte	.LVL1266
+	.8byte	.LVL1234
+	.8byte	.LVL1240
 	.2byte	0x1
 	.byte	0x5b
-	.8byte	.LVL1275
-	.8byte	.LVL1276
-	.2byte	0x1
-	.byte	0x5b
-	.8byte	.LVL1284
-	.8byte	.LVL1285
-	.2byte	0x1
-	.byte	0x5b
-	.8byte	0
-	.8byte	0
-.LLST330:
-	.8byte	.LVL1231
-	.8byte	.LVL1232
-	.2byte	0x1
-	.byte	0x5b
-	.8byte	.LVL1242
-	.8byte	.LVL1248
+	.8byte	.LVL1256
+	.8byte	.LVL1257
 	.2byte	0x1
 	.byte	0x5b
 	.8byte	.LVL1264
@@ -64576,28 +64878,40 @@
 	.8byte	.LVL1273
 	.2byte	0x1
 	.byte	0x5b
-	.8byte	.LVL1280
-	.8byte	.LVL1281
-	.2byte	0x1
-	.byte	0x5b
 	.8byte	0
 	.8byte	0
-.LLST337:
-	.8byte	.LVL1235
-	.8byte	.LVL1246
+.LLST345:
+	.8byte	.LVL1227
+	.8byte	.LVL1238
 	.2byte	0x1
 	.byte	0x55
-	.8byte	.LVL1249
-	.8byte	.LVL1301
+	.8byte	.LVL1241
+	.8byte	.LVL1293
 	.2byte	0x1
 	.byte	0x55
-	.8byte	.LVL1302
+	.8byte	.LVL1294
 	.8byte	.LFE2818
 	.2byte	0x1
 	.byte	0x55
 	.8byte	0
 	.8byte	0
-.LLST338:
+.LLST346:
+	.8byte	.LVL1243
+	.8byte	.LVL1244
+	.2byte	0x1
+	.byte	0x64
+	.8byte	.LVL1245
+	.8byte	.LVL1246
+	.2byte	0x1
+	.byte	0x64
+	.8byte	.LVL1247
+	.8byte	.LVL1248
+	.2byte	0x1
+	.byte	0x64
+	.8byte	.LVL1249
+	.8byte	.LVL1250
+	.2byte	0x1
+	.byte	0x64
 	.8byte	.LVL1251
 	.8byte	.LVL1252
 	.2byte	0x1
@@ -64606,186 +64920,170 @@
 	.8byte	.LVL1254
 	.2byte	0x1
 	.byte	0x64
-	.8byte	.LVL1255
-	.8byte	.LVL1256
-	.2byte	0x1
-	.byte	0x64
-	.8byte	.LVL1257
-	.8byte	.LVL1258
-	.2byte	0x1
-	.byte	0x64
-	.8byte	.LVL1259
-	.8byte	.LVL1260
-	.2byte	0x1
-	.byte	0x64
-	.8byte	.LVL1261
-	.8byte	.LVL1262
-	.2byte	0x1
-	.byte	0x64
-	.8byte	.LVL1292
-	.8byte	.LVL1293
-	.2byte	0x1
-	.byte	0x64
-	.8byte	.LVL1296
-	.8byte	.LVL1297
-	.2byte	0x1
-	.byte	0x64
-	.8byte	.LVL1306
-	.8byte	.LVL1307
-	.2byte	0x1
-	.byte	0x64
-	.8byte	0
-	.8byte	0
-.LLST339:
-	.8byte	.LVL1252
-	.8byte	.LVL1254
-	.2byte	0x1
-	.byte	0x64
-	.8byte	.LVL1255
-	.8byte	.LVL1256
-	.2byte	0x1
-	.byte	0x64
-	.8byte	.LVL1257
-	.8byte	.LVL1258
-	.2byte	0x1
-	.byte	0x64
-	.8byte	.LVL1259
-	.8byte	.LVL1260
-	.2byte	0x1
-	.byte	0x64
-	.8byte	.LVL1261
-	.8byte	.LVL1262
-	.2byte	0x1
-	.byte	0x64
-	.8byte	.LVL1293
-	.8byte	.LVL1294
-	.2byte	0x1
-	.byte	0x64
-	.8byte	.LVL1295
-	.8byte	.LVL1296
-	.2byte	0x1
-	.byte	0x64
-	.8byte	.LVL1307
-	.8byte	.LVL1308
-	.2byte	0x1
-	.byte	0x64
-	.8byte	0
-	.8byte	0
-.LLST340:
-	.8byte	.LVL1254
-	.8byte	.LVL1256
-	.2byte	0x1
-	.byte	0x64
-	.8byte	.LVL1257
-	.8byte	.LVL1258
-	.2byte	0x1
-	.byte	0x64
-	.8byte	.LVL1259
-	.8byte	.LVL1260
-	.2byte	0x1
-	.byte	0x64
-	.8byte	.LVL1261
-	.8byte	.LVL1262
-	.2byte	0x1
-	.byte	0x64
-	.8byte	.LVL1294
-	.8byte	.LVL1295
-	.2byte	0x1
-	.byte	0x64
-	.8byte	.LVL1308
-	.8byte	.LFE2818
-	.2byte	0x1
-	.byte	0x64
-	.8byte	0
-	.8byte	0
-.LLST341:
-	.8byte	.LVL1256
-	.8byte	.LVL1258
-	.2byte	0x1
-	.byte	0x64
-	.8byte	.LVL1259
-	.8byte	.LVL1260
-	.2byte	0x1
-	.byte	0x64
-	.8byte	.LVL1261
-	.8byte	.LVL1262
-	.2byte	0x1
-	.byte	0x64
-	.8byte	.LVL1289
-	.8byte	.LVL1290
-	.2byte	0x1
-	.byte	0x64
-	.8byte	.LVL1299
-	.8byte	.LVL1300
-	.2byte	0x1
-	.byte	0x64
-	.8byte	.LVL1303
-	.8byte	.LVL1304
-	.2byte	0x1
-	.byte	0x64
-	.8byte	0
-	.8byte	0
-.LLST342:
-	.8byte	.LVL1258
-	.8byte	.LVL1260
-	.2byte	0x1
-	.byte	0x64
-	.8byte	.LVL1261
-	.8byte	.LVL1262
-	.2byte	0x1
-	.byte	0x64
-	.8byte	.LVL1290
-	.8byte	.LVL1291
-	.2byte	0x1
-	.byte	0x64
-	.8byte	.LVL1298
-	.8byte	.LVL1299
-	.2byte	0x1
-	.byte	0x64
-	.8byte	.LVL1304
-	.8byte	.LVL1305
-	.2byte	0x1
-	.byte	0x64
-	.8byte	0
-	.8byte	0
-.LLST343:
-	.8byte	.LVL1260
-	.8byte	.LVL1262
+	.8byte	.LVL1284
+	.8byte	.LVL1285
 	.2byte	0x1
 	.byte	0x64
 	.8byte	.LVL1288
 	.8byte	.LVL1289
 	.2byte	0x1
 	.byte	0x64
-	.8byte	.LVL1300
-	.8byte	.LVL1301
-	.2byte	0x1
-	.byte	0x64
-	.8byte	.LVL1302
-	.8byte	.LVL1303
+	.8byte	.LVL1298
+	.8byte	.LVL1299
 	.2byte	0x1
 	.byte	0x64
 	.8byte	0
 	.8byte	0
-.LLST336:
-	.8byte	.LVL1231
-	.8byte	.LVL1232
+.LLST347:
+	.8byte	.LVL1244
+	.8byte	.LVL1246
 	.2byte	0x1
-	.byte	0x5b
-	.8byte	.LVL1243
+	.byte	0x64
+	.8byte	.LVL1247
 	.8byte	.LVL1248
 	.2byte	0x1
+	.byte	0x64
+	.8byte	.LVL1249
+	.8byte	.LVL1250
+	.2byte	0x1
+	.byte	0x64
+	.8byte	.LVL1251
+	.8byte	.LVL1252
+	.2byte	0x1
+	.byte	0x64
+	.8byte	.LVL1253
+	.8byte	.LVL1254
+	.2byte	0x1
+	.byte	0x64
+	.8byte	.LVL1285
+	.8byte	.LVL1286
+	.2byte	0x1
+	.byte	0x64
+	.8byte	.LVL1287
+	.8byte	.LVL1288
+	.2byte	0x1
+	.byte	0x64
+	.8byte	.LVL1299
+	.8byte	.LVL1300
+	.2byte	0x1
+	.byte	0x64
+	.8byte	0
+	.8byte	0
+.LLST348:
+	.8byte	.LVL1246
+	.8byte	.LVL1248
+	.2byte	0x1
+	.byte	0x64
+	.8byte	.LVL1249
+	.8byte	.LVL1250
+	.2byte	0x1
+	.byte	0x64
+	.8byte	.LVL1251
+	.8byte	.LVL1252
+	.2byte	0x1
+	.byte	0x64
+	.8byte	.LVL1253
+	.8byte	.LVL1254
+	.2byte	0x1
+	.byte	0x64
+	.8byte	.LVL1286
+	.8byte	.LVL1287
+	.2byte	0x1
+	.byte	0x64
+	.8byte	.LVL1300
+	.8byte	.LFE2818
+	.2byte	0x1
+	.byte	0x64
+	.8byte	0
+	.8byte	0
+.LLST349:
+	.8byte	.LVL1248
+	.8byte	.LVL1250
+	.2byte	0x1
+	.byte	0x64
+	.8byte	.LVL1251
+	.8byte	.LVL1252
+	.2byte	0x1
+	.byte	0x64
+	.8byte	.LVL1253
+	.8byte	.LVL1254
+	.2byte	0x1
+	.byte	0x64
+	.8byte	.LVL1281
+	.8byte	.LVL1282
+	.2byte	0x1
+	.byte	0x64
+	.8byte	.LVL1291
+	.8byte	.LVL1292
+	.2byte	0x1
+	.byte	0x64
+	.8byte	.LVL1295
+	.8byte	.LVL1296
+	.2byte	0x1
+	.byte	0x64
+	.8byte	0
+	.8byte	0
+.LLST350:
+	.8byte	.LVL1250
+	.8byte	.LVL1252
+	.2byte	0x1
+	.byte	0x64
+	.8byte	.LVL1253
+	.8byte	.LVL1254
+	.2byte	0x1
+	.byte	0x64
+	.8byte	.LVL1282
+	.8byte	.LVL1283
+	.2byte	0x1
+	.byte	0x64
+	.8byte	.LVL1290
+	.8byte	.LVL1291
+	.2byte	0x1
+	.byte	0x64
+	.8byte	.LVL1296
+	.8byte	.LVL1297
+	.2byte	0x1
+	.byte	0x64
+	.8byte	0
+	.8byte	0
+.LLST351:
+	.8byte	.LVL1252
+	.8byte	.LVL1254
+	.2byte	0x1
+	.byte	0x64
+	.8byte	.LVL1280
+	.8byte	.LVL1281
+	.2byte	0x1
+	.byte	0x64
+	.8byte	.LVL1292
+	.8byte	.LVL1293
+	.2byte	0x1
+	.byte	0x64
+	.8byte	.LVL1294
+	.8byte	.LVL1295
+	.2byte	0x1
+	.byte	0x64
+	.8byte	0
+	.8byte	0
+.LLST344:
+	.8byte	.LVL1223
+	.8byte	.LVL1224
+	.2byte	0x1
 	.byte	0x5b
-	.8byte	.LVL1263
+	.8byte	.LVL1235
+	.8byte	.LVL1240
+	.2byte	0x1
+	.byte	0x5b
+	.8byte	.LVL1255
+	.8byte	.LVL1257
+	.2byte	0x1
+	.byte	0x5b
+	.8byte	.LVL1264
 	.8byte	.LVL1265
 	.2byte	0x1
 	.byte	0x5b
 	.8byte	.LVL1272
 	.8byte	.LVL1273
-	.2byte	0x1
-	.byte	0x5b
-	.8byte	.LVL1280
-	.8byte	.LVL1281
 	.2byte	0x1
 	.byte	0x5b
 	.8byte	0
@@ -64797,677 +65095,681 @@
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST216:
-	.8byte	.LVL730
-	.8byte	.LVL731
-	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL731
-	.8byte	.LVL746
-	.2byte	0x1
-	.byte	0x5a
-	.8byte	.LVL746
-	.8byte	.LVL747
-	.2byte	0x1
-	.byte	0x55
-	.8byte	.LVL747
-	.8byte	.LVL755
-	.2byte	0x1
-	.byte	0x5a
-	.8byte	.LVL765
-	.8byte	.LFE2875
-	.2byte	0x1
-	.byte	0x5a
-	.8byte	0
-	.8byte	0
-.LLST217:
-	.8byte	.LVL743
-	.8byte	.LVL748
-	.2byte	0x1
-	.byte	0x59
-	.8byte	.LVL749
-	.8byte	.LVL750
-	.2byte	0x1
-	.byte	0x59
-	.8byte	.LVL750
-	.8byte	.LVL765
-	.2byte	0x1
-	.byte	0x58
-	.8byte	.LVL765
-	.8byte	.LFE2875
-	.2byte	0x1
-	.byte	0x59
-	.8byte	0
-	.8byte	0
-.LLST218:
-	.8byte	.LVL738
-	.8byte	.LVL739
-	.2byte	0x1
-	.byte	0x50
-	.8byte	0
-	.8byte	0
-.LLST219:
-	.8byte	.LVL735
-	.8byte	.LVL737
-	.2byte	0x1
-	.byte	0x55
-	.8byte	.LVL737
-	.8byte	.LVL752
-	.2byte	0x1
-	.byte	0x56
-	.8byte	.LVL766
-	.8byte	.LFE2875
-	.2byte	0x1
-	.byte	0x56
-	.8byte	0
-	.8byte	0
-.LLST220:
-	.8byte	.LVL743
-	.8byte	.LVL759
-	.2byte	0x1
-	.byte	0x56
-	.8byte	.LVL762
-	.8byte	.LFE2875
-	.2byte	0x1
-	.byte	0x56
-	.8byte	0
-	.8byte	0
-.LLST221:
-	.8byte	.LVL743
-	.8byte	.LVL751
-	.2byte	0x1
-	.byte	0x57
-	.8byte	.LVL752
-	.8byte	.LVL760
-	.2byte	0x1
-	.byte	0x57
-	.8byte	.LVL762
-	.8byte	.LFE2875
-	.2byte	0x1
-	.byte	0x57
-	.8byte	0
-	.8byte	0
-.LLST222:
-	.8byte	.LVL741
-	.8byte	.LVL745
-	.2byte	0x1
-	.byte	0x5d
-	.8byte	.LVL747
-	.8byte	.LFE2875
-	.2byte	0x1
-	.byte	0x5d
-	.8byte	0
-	.8byte	0
-.LLST223:
-	.8byte	.LVL754
-	.8byte	.LVL761
-	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL762
-	.8byte	.LVL763
-	.2byte	0x1
-	.byte	0x50
-	.8byte	0
-	.8byte	0
 .LLST224:
-	.8byte	.LVL732
-	.8byte	.LVL753
+	.8byte	.LVL727
+	.8byte	.LVL728
 	.2byte	0x1
-	.byte	0x57
-	.8byte	.LVL765
-	.8byte	.LFE2875
+	.byte	0x50
+	.8byte	.LVL728
+	.8byte	.LVL743
+	.2byte	0x1
+	.byte	0x5a
+	.8byte	.LVL743
+	.8byte	.LVL744
 	.2byte	0x1
 	.byte	0x55
+	.8byte	.LVL744
+	.8byte	.LVL752
+	.2byte	0x1
+	.byte	0x5a
+	.8byte	.LVL762
+	.8byte	.LFE2875
+	.2byte	0x1
+	.byte	0x5a
 	.8byte	0
 	.8byte	0
 .LLST225:
+	.8byte	.LVL740
+	.8byte	.LVL745
+	.2byte	0x1
+	.byte	0x59
+	.8byte	.LVL746
+	.8byte	.LVL747
+	.2byte	0x1
+	.byte	0x59
+	.8byte	.LVL747
+	.8byte	.LVL762
+	.2byte	0x1
+	.byte	0x58
+	.8byte	.LVL762
+	.8byte	.LFE2875
+	.2byte	0x1
+	.byte	0x59
+	.8byte	0
+	.8byte	0
+.LLST226:
+	.8byte	.LVL735
+	.8byte	.LVL736
+	.2byte	0x1
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST227:
+	.8byte	.LVL732
 	.8byte	.LVL734
-	.8byte	.LVL769
+	.2byte	0x1
+	.byte	0x55
+	.8byte	.LVL734
+	.8byte	.LVL749
+	.2byte	0x1
+	.byte	0x56
+	.8byte	.LVL763
+	.8byte	.LFE2875
+	.2byte	0x1
+	.byte	0x56
+	.8byte	0
+	.8byte	0
+.LLST228:
+	.8byte	.LVL740
+	.8byte	.LVL756
+	.2byte	0x1
+	.byte	0x56
+	.8byte	.LVL759
+	.8byte	.LFE2875
+	.2byte	0x1
+	.byte	0x56
+	.8byte	0
+	.8byte	0
+.LLST229:
+	.8byte	.LVL740
+	.8byte	.LVL748
+	.2byte	0x1
+	.byte	0x57
+	.8byte	.LVL749
+	.8byte	.LVL757
+	.2byte	0x1
+	.byte	0x57
+	.8byte	.LVL759
+	.8byte	.LFE2875
+	.2byte	0x1
+	.byte	0x57
+	.8byte	0
+	.8byte	0
+.LLST230:
+	.8byte	.LVL738
+	.8byte	.LVL742
+	.2byte	0x1
+	.byte	0x5d
+	.8byte	.LVL744
+	.8byte	.LFE2875
+	.2byte	0x1
+	.byte	0x5d
+	.8byte	0
+	.8byte	0
+.LLST231:
+	.8byte	.LVL751
+	.8byte	.LVL758
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL759
+	.8byte	.LVL760
+	.2byte	0x1
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST232:
+	.8byte	.LVL729
+	.8byte	.LVL750
+	.2byte	0x1
+	.byte	0x57
+	.8byte	.LVL762
+	.8byte	.LFE2875
+	.2byte	0x1
+	.byte	0x55
+	.8byte	0
+	.8byte	0
+.LLST233:
+	.8byte	.LVL731
+	.8byte	.LVL766
 	.2byte	0x1
 	.byte	0x6e
 	.8byte	0
 	.8byte	0
-.LLST226:
-	.8byte	.LVL736
-	.8byte	.LVL768
+.LLST234:
+	.8byte	.LVL733
+	.8byte	.LVL765
 	.2byte	0x1
 	.byte	0x65
 	.8byte	0
 	.8byte	0
-.LLST227:
-	.8byte	.LVL733
-	.8byte	.LVL735
+.LLST235:
+	.8byte	.LVL730
+	.8byte	.LVL732
 	.2byte	0x1
 	.byte	0x55
-	.8byte	.LVL735
-	.8byte	.LVL740
+	.8byte	.LVL732
+	.8byte	.LVL737
 	.2byte	0x1
 	.byte	0x59
+	.8byte	.LVL737
+	.8byte	.LVL739
+	.2byte	0x1
+	.byte	0x50
 	.8byte	.LVL740
-	.8byte	.LVL742
+	.8byte	.LVL741
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL743
-	.8byte	.LVL744
-	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL767
+	.8byte	.LVL764
 	.8byte	.LFE2875
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST228:
-	.8byte	.LVL755
-	.8byte	.LVL756
-	.2byte	0x1
-	.byte	0x5a
-	.8byte	.LVL757
-	.8byte	.LVL764
-	.2byte	0x1
-	.byte	0x5a
-	.8byte	0
-	.8byte	0
-.LLST229:
+.LLST236:
+	.8byte	.LVL752
 	.8byte	.LVL753
-	.8byte	.LVL758
+	.2byte	0x1
+	.byte	0x5a
+	.8byte	.LVL754
+	.8byte	.LVL761
+	.2byte	0x1
+	.byte	0x5a
+	.8byte	0
+	.8byte	0
+.LLST237:
+	.8byte	.LVL750
+	.8byte	.LVL755
 	.2byte	0x1
 	.byte	0x55
 	.8byte	0
 	.8byte	0
-.LLST230:
-	.8byte	.LVL770
-	.8byte	.LVL774
+.LLST238:
+	.8byte	.LVL767
+	.8byte	.LVL771
 	.2byte	0x1
 	.byte	0x55
-	.8byte	.LVL775
+	.8byte	.LVL772
+	.8byte	.LVL773
+	.2byte	0x1
+	.byte	0x55
 	.8byte	.LVL776
-	.2byte	0x1
-	.byte	0x55
-	.8byte	.LVL779
 	.8byte	.LFE2876
 	.2byte	0x1
 	.byte	0x55
 	.8byte	0
 	.8byte	0
-.LLST231:
+.LLST239:
+	.8byte	.LVL769
+	.8byte	.LVL770
+	.2byte	0x1
+	.byte	0x58
 	.8byte	.LVL772
 	.8byte	.LVL773
 	.2byte	0x1
 	.byte	0x58
-	.8byte	.LVL775
 	.8byte	.LVL776
-	.2byte	0x1
-	.byte	0x58
-	.8byte	.LVL779
 	.8byte	.LFE2876
 	.2byte	0x1
 	.byte	0x58
 	.8byte	0
 	.8byte	0
-.LLST232:
-	.8byte	.LVL771
+.LLST240:
+	.8byte	.LVL768
+	.8byte	.LVL774
+	.2byte	0x1
+	.byte	0x56
+	.8byte	.LVL775
 	.8byte	.LVL777
 	.2byte	0x1
 	.byte	0x56
 	.8byte	.LVL778
+	.8byte	.LVL779
+	.2byte	0x1
+	.byte	0x56
 	.8byte	.LVL780
-	.2byte	0x1
-	.byte	0x56
 	.8byte	.LVL781
+	.2byte	0x1
+	.byte	0x56
 	.8byte	.LVL782
-	.2byte	0x1
-	.byte	0x56
 	.8byte	.LVL783
+	.2byte	0x1
+	.byte	0x56
 	.8byte	.LVL784
-	.2byte	0x1
-	.byte	0x56
 	.8byte	.LVL785
+	.2byte	0x1
+	.byte	0x56
 	.8byte	.LVL786
-	.2byte	0x1
-	.byte	0x56
 	.8byte	.LVL787
+	.2byte	0x1
+	.byte	0x56
 	.8byte	.LVL788
-	.2byte	0x1
-	.byte	0x56
-	.8byte	.LVL789
-	.8byte	.LVL790
-	.2byte	0x1
-	.byte	0x56
-	.8byte	.LVL791
 	.8byte	.LFE2876
 	.2byte	0x1
 	.byte	0x56
 	.8byte	0
 	.8byte	0
-.LLST244:
-	.8byte	.LVL831
-	.8byte	.LVL839
+.LLST252:
+	.8byte	.LVL828
+	.8byte	.LVL836
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL839
+	.8byte	.LVL836
+	.8byte	.LVL843
+	.2byte	0x1
+	.byte	0x5a
+	.8byte	.LVL843
+	.8byte	.LVL845
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL845
 	.8byte	.LVL846
 	.2byte	0x1
 	.byte	0x5a
 	.8byte	.LVL846
-	.8byte	.LVL848
-	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL848
-	.8byte	.LVL849
-	.2byte	0x1
-	.byte	0x5a
-	.8byte	.LVL849
 	.8byte	.LFE2877
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST245:
-	.8byte	.LVL831
-	.8byte	.LVL836
+.LLST253:
+	.8byte	.LVL828
+	.8byte	.LVL833
 	.2byte	0x1
 	.byte	0x56
+	.8byte	.LVL846
+	.8byte	.LVL847
+	.2byte	0x1
+	.byte	0x56
+	.8byte	0
+	.8byte	0
+.LLST254:
+	.8byte	.LVL834
+	.8byte	.LVL846
+	.2byte	0x1
+	.byte	0x5c
 	.8byte	.LVL849
 	.8byte	.LVL850
 	.2byte	0x1
-	.byte	0x56
-	.8byte	0
-	.8byte	0
-.LLST246:
-	.8byte	.LVL837
-	.8byte	.LVL849
-	.2byte	0x1
 	.byte	0x5c
-	.8byte	.LVL852
-	.8byte	.LVL853
-	.2byte	0x1
-	.byte	0x5c
-	.8byte	.LVL854
-	.8byte	.LFE2877
-	.2byte	0x1
-	.byte	0x5c
-	.8byte	0
-	.8byte	0
-.LLST247:
-	.8byte	.LVL835
-	.8byte	.LVL849
-	.2byte	0x1
-	.byte	0x5e
 	.8byte	.LVL851
 	.8byte	.LFE2877
 	.2byte	0x1
+	.byte	0x5c
+	.8byte	0
+	.8byte	0
+.LLST255:
+	.8byte	.LVL832
+	.8byte	.LVL846
+	.2byte	0x1
+	.byte	0x5e
+	.8byte	.LVL848
+	.8byte	.LFE2877
+	.2byte	0x1
 	.byte	0x5e
 	.8byte	0
 	.8byte	0
-.LLST248:
-	.8byte	.LVL841
-	.8byte	.LVL843
+.LLST256:
+	.8byte	.LVL838
+	.8byte	.LVL840
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST249:
-	.8byte	.LVL842
-	.8byte	.LVL844
+.LLST257:
+	.8byte	.LVL839
+	.8byte	.LVL841
 	.2byte	0x1
 	.byte	0x53
 	.8byte	0
 	.8byte	0
-.LLST250:
-	.8byte	.LVL832
-	.8byte	.LVL834
+.LLST258:
+	.8byte	.LVL829
+	.8byte	.LVL831
 	.2byte	0x1
 	.byte	0x54
 	.8byte	0
 	.8byte	0
-.LLST251:
-	.8byte	.LVL838
-	.8byte	.LVL840
+.LLST259:
+	.8byte	.LVL835
+	.8byte	.LVL837
 	.2byte	0x1
 	.byte	0x5f
-	.8byte	.LVL845
+	.8byte	.LVL842
+	.8byte	.LVL843
+	.2byte	0x1
+	.byte	0x5f
+	.8byte	.LVL844
 	.8byte	.LVL846
 	.2byte	0x1
 	.byte	0x5f
-	.8byte	.LVL847
-	.8byte	.LVL849
+	.8byte	0
+	.8byte	0
+.LLST260:
+	.8byte	.LVL852
+	.8byte	.LVL861
 	.2byte	0x1
-	.byte	0x5f
+	.byte	0x56
+	.8byte	.LVL862
+	.8byte	.LFE2878
+	.2byte	0x1
+	.byte	0x56
 	.8byte	0
 	.8byte	0
-.LLST252:
-	.8byte	.LVL855
+.LLST261:
+	.8byte	.LVL856
+	.8byte	.LVL863
+	.2byte	0x1
+	.byte	0x5a
+	.8byte	.LVL865
+	.8byte	.LVL869
+	.2byte	0x1
+	.byte	0x5a
+	.8byte	.LVL870
+	.8byte	.LFE2878
+	.2byte	0x1
+	.byte	0x5a
+	.8byte	0
+	.8byte	0
+.LLST262:
+	.8byte	.LVL857
 	.8byte	.LVL864
 	.2byte	0x1
-	.byte	0x56
-	.8byte	.LVL865
-	.8byte	.LFE2878
-	.2byte	0x1
-	.byte	0x56
-	.8byte	0
-	.8byte	0
-.LLST253:
-	.8byte	.LVL859
+	.byte	0x5d
 	.8byte	.LVL866
-	.2byte	0x1
-	.byte	0x5a
-	.8byte	.LVL868
-	.8byte	.LVL872
-	.2byte	0x1
-	.byte	0x5a
-	.8byte	.LVL873
-	.8byte	.LFE2878
-	.2byte	0x1
-	.byte	0x5a
-	.8byte	0
-	.8byte	0
-.LLST254:
-	.8byte	.LVL860
-	.8byte	.LVL867
-	.2byte	0x1
-	.byte	0x5d
-	.8byte	.LVL869
 	.8byte	.LFE2878
 	.2byte	0x1
 	.byte	0x5d
 	.8byte	0
 	.8byte	0
-.LLST255:
-	.8byte	.LVL856
-	.8byte	.LVL857
+.LLST263:
+	.8byte	.LVL853
+	.8byte	.LVL854
 	.2byte	0x1
 	.byte	0x53
 	.8byte	0
 	.8byte	0
-.LLST256:
-	.8byte	.LVL861
-	.8byte	.LVL862
+.LLST264:
+	.8byte	.LVL858
+	.8byte	.LVL859
 	.2byte	0x1
 	.byte	0x5c
-	.8byte	.LVL870
-	.8byte	.LVL871
+	.8byte	.LVL867
+	.8byte	.LVL868
 	.2byte	0x1
 	.byte	0x5c
 	.8byte	0
 	.8byte	0
-.LLST257:
+.LLST265:
+	.8byte	.LVL860
 	.8byte	.LVL863
-	.8byte	.LVL866
 	.2byte	0x1
 	.byte	0x57
 	.8byte	0
 	.8byte	0
-.LLST258:
-	.8byte	.LVL874
-	.8byte	.LVL875
+.LLST266:
+	.8byte	.LVL871
+	.8byte	.LVL872
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL875
-	.8byte	.LVL880
+	.8byte	.LVL872
+	.8byte	.LVL877
 	.2byte	0x1
 	.byte	0x64
-	.8byte	.LVL881
+	.8byte	.LVL878
 	.8byte	.LFE2879
 	.2byte	0x1
 	.byte	0x64
 	.8byte	0
 	.8byte	0
-.LLST259:
-	.8byte	.LVL882
-	.8byte	.LVL884
+.LLST267:
+	.8byte	.LVL879
+	.8byte	.LVL881
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL884
-	.8byte	.LVL888
+	.8byte	.LVL881
+	.8byte	.LVL885
 	.2byte	0x1
 	.byte	0x63
+	.8byte	.LVL886
 	.8byte	.LVL889
-	.8byte	.LVL892
 	.2byte	0x1
 	.byte	0x63
 	.8byte	0
 	.8byte	0
-.LLST260:
-	.8byte	.LVL882
-	.8byte	.LVL883
+.LLST268:
+	.8byte	.LVL879
+	.8byte	.LVL880
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST262:
-	.8byte	.LVL899
-	.8byte	.LVL917
+.LLST270:
+	.8byte	.LVL896
+	.8byte	.LVL914
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL920
+	.8byte	.LVL917
 	.8byte	.LFE2883
 	.2byte	0x1
 	.byte	0x66
 	.8byte	0
 	.8byte	0
-.LLST263:
-	.8byte	.LVL899
-	.8byte	.LVL910
+.LLST271:
+	.8byte	.LVL896
+	.8byte	.LVL907
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL910
-	.8byte	.LVL918
+	.8byte	.LVL907
+	.8byte	.LVL915
 	.2byte	0x1
 	.byte	0x68
-	.8byte	.LVL920
-	.8byte	.LFE2883
-	.2byte	0x1
-	.byte	0x68
-	.8byte	0
-	.8byte	0
-.LLST264:
-	.8byte	.LVL899
-	.8byte	.LVL911
-	.2byte	0x1
-	.byte	0x52
-	.8byte	.LVL911
-	.8byte	.LVL919
-	.2byte	0x1
-	.byte	0x69
-	.8byte	.LVL920
-	.8byte	.LFE2883
-	.2byte	0x1
-	.byte	0x69
-	.8byte	0
-	.8byte	0
-.LLST265:
-	.8byte	.LVL899
-	.8byte	.LVL904-1
-	.2byte	0x1
-	.byte	0x56
-	.8byte	.LVL920
-	.8byte	.LFE2883
-	.2byte	0x1
-	.byte	0x56
-	.8byte	0
-	.8byte	0
-.LLST266:
-	.8byte	.LVL903
-	.8byte	.LVL918
-	.2byte	0x1
-	.byte	0x67
-	.8byte	.LVL920
-	.8byte	.LVL921
-	.2byte	0x1
-	.byte	0x67
-	.8byte	.LVL922
-	.8byte	.LFE2883
-	.2byte	0x1
-	.byte	0x67
-	.8byte	0
-	.8byte	0
-.LLST267:
-	.8byte	.LVL903
 	.8byte	.LVL917
-	.2byte	0x1
-	.byte	0x65
-	.8byte	.LVL923
-	.8byte	.LVL924
-	.2byte	0x1
-	.byte	0x65
-	.8byte	.LVL925
 	.8byte	.LFE2883
 	.2byte	0x1
-	.byte	0x65
-	.8byte	0
-	.8byte	0
-.LLST268:
-	.8byte	.LVL900
-	.8byte	.LVL901
-	.2byte	0x1
-	.byte	0x53
-	.8byte	0
-	.8byte	0
-.LLST269:
-	.8byte	.LVL902
-	.8byte	.LVL916
-	.2byte	0x1
-	.byte	0x63
-	.8byte	.LVL920
-	.8byte	.LFE2883
-	.2byte	0x1
-	.byte	0x63
-	.8byte	0
-	.8byte	0
-.LLST270:
-	.8byte	.LVL905
-	.8byte	.LVL920
-	.2byte	0x1
-	.byte	0x54
-	.8byte	0
-	.8byte	0
-.LLST271:
-	.8byte	.LVL906
-	.8byte	.LVL908
-	.2byte	0x1
-	.byte	0x53
-	.8byte	.LVL909
-	.8byte	.LVL913
-	.2byte	0x1
-	.byte	0x53
+	.byte	0x68
 	.8byte	0
 	.8byte	0
 .LLST272:
-	.8byte	.LVL905
-	.8byte	.LVL907
+	.8byte	.LVL896
+	.8byte	.LVL908
 	.2byte	0x1
-	.byte	0x53
-	.8byte	.LVL912
-	.8byte	.LVL914
+	.byte	0x52
+	.8byte	.LVL908
+	.8byte	.LVL916
 	.2byte	0x1
-	.byte	0x53
-	.8byte	.LVL915
-	.8byte	.LVL920
+	.byte	0x69
+	.8byte	.LVL917
+	.8byte	.LFE2883
 	.2byte	0x1
-	.byte	0x53
+	.byte	0x69
 	.8byte	0
 	.8byte	0
 .LLST273:
-	.8byte	.LVL926
-	.8byte	.LVL930
+	.8byte	.LVL896
+	.8byte	.LVL901-1
 	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL930
-	.8byte	.LVL947
+	.byte	0x56
+	.8byte	.LVL917
+	.8byte	.LFE2883
 	.2byte	0x1
-	.byte	0x6b
-	.8byte	.LVL948
-	.8byte	.LFE2884
-	.2byte	0x1
-	.byte	0x6b
+	.byte	0x56
 	.8byte	0
 	.8byte	0
 .LLST274:
-	.8byte	.LVL926
-	.8byte	.LVL943
+	.8byte	.LVL900
+	.8byte	.LVL915
 	.2byte	0x1
-	.byte	0x51
-	.8byte	.LVL948
-	.8byte	.LFE2884
+	.byte	0x67
+	.8byte	.LVL917
+	.8byte	.LVL918
 	.2byte	0x1
-	.byte	0x64
+	.byte	0x67
+	.8byte	.LVL919
+	.8byte	.LFE2883
+	.2byte	0x1
+	.byte	0x67
 	.8byte	0
 	.8byte	0
 .LLST275:
-	.8byte	.LVL926
-	.8byte	.LVL944
+	.8byte	.LVL900
+	.8byte	.LVL914
 	.2byte	0x1
-	.byte	0x52
-	.8byte	.LVL948
-	.8byte	.LFE2884
+	.byte	0x65
+	.8byte	.LVL920
+	.8byte	.LVL921
+	.2byte	0x1
+	.byte	0x65
+	.8byte	.LVL922
+	.8byte	.LFE2883
 	.2byte	0x1
 	.byte	0x65
 	.8byte	0
 	.8byte	0
 .LLST276:
-	.8byte	.LVL926
-	.8byte	.LVL934-1
+	.8byte	.LVL897
+	.8byte	.LVL898
 	.2byte	0x1
-	.byte	0x56
-	.8byte	.LVL948
-	.8byte	.LVL949-1
-	.2byte	0x1
-	.byte	0x56
-	.8byte	.LVL950
-	.8byte	.LFE2884
-	.2byte	0x1
-	.byte	0x56
+	.byte	0x53
 	.8byte	0
 	.8byte	0
 .LLST277:
-	.8byte	.LVL935
-	.8byte	.LVL936
+	.8byte	.LVL899
+	.8byte	.LVL913
 	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL937
-	.8byte	.LVL940
+	.byte	0x63
+	.8byte	.LVL917
+	.8byte	.LFE2883
 	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL942
-	.8byte	.LVL948
-	.2byte	0x1
-	.byte	0x50
+	.byte	0x63
 	.8byte	0
 	.8byte	0
 .LLST278:
-	.8byte	.LVL935
-	.8byte	.LVL937
+	.8byte	.LVL902
+	.8byte	.LVL917
 	.2byte	0x1
-	.byte	0x51
-	.8byte	.LVL938
-	.8byte	.LVL939
-	.2byte	0x1
-	.byte	0x51
-	.8byte	.LVL942
-	.8byte	.LVL948
-	.2byte	0x1
-	.byte	0x51
+	.byte	0x54
 	.8byte	0
 	.8byte	0
 .LLST279:
-	.8byte	.LVL931
-	.8byte	.LVL946
+	.8byte	.LVL903
+	.8byte	.LVL905
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL906
+	.8byte	.LVL910
+	.2byte	0x1
+	.byte	0x53
+	.8byte	0
+	.8byte	0
+.LLST280:
+	.8byte	.LVL902
+	.8byte	.LVL904
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL909
+	.8byte	.LVL911
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL912
+	.8byte	.LVL917
+	.2byte	0x1
+	.byte	0x53
+	.8byte	0
+	.8byte	0
+.LLST281:
+	.8byte	.LVL923
+	.8byte	.LVL927
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL927
+	.8byte	.LVL944
+	.2byte	0x1
+	.byte	0x6b
+	.8byte	.LVL945
+	.8byte	.LFE2884
+	.2byte	0x1
+	.byte	0x6b
+	.8byte	0
+	.8byte	0
+.LLST282:
+	.8byte	.LVL923
+	.8byte	.LVL940
+	.2byte	0x1
+	.byte	0x51
+	.8byte	.LVL945
+	.8byte	.LFE2884
+	.2byte	0x1
+	.byte	0x64
+	.8byte	0
+	.8byte	0
+.LLST283:
+	.8byte	.LVL923
+	.8byte	.LVL941
+	.2byte	0x1
+	.byte	0x52
+	.8byte	.LVL945
+	.8byte	.LFE2884
+	.2byte	0x1
+	.byte	0x65
+	.8byte	0
+	.8byte	0
+.LLST284:
+	.8byte	.LVL923
+	.8byte	.LVL931-1
+	.2byte	0x1
+	.byte	0x56
+	.8byte	.LVL945
+	.8byte	.LVL946-1
+	.2byte	0x1
+	.byte	0x56
+	.8byte	.LVL947
+	.8byte	.LFE2884
+	.2byte	0x1
+	.byte	0x56
+	.8byte	0
+	.8byte	0
+.LLST285:
+	.8byte	.LVL932
+	.8byte	.LVL933
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL934
+	.8byte	.LVL937
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL939
+	.8byte	.LVL945
+	.2byte	0x1
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST286:
+	.8byte	.LVL932
+	.8byte	.LVL934
+	.2byte	0x1
+	.byte	0x51
+	.8byte	.LVL935
+	.8byte	.LVL936
+	.2byte	0x1
+	.byte	0x51
+	.8byte	.LVL939
+	.8byte	.LVL945
+	.2byte	0x1
+	.byte	0x51
+	.8byte	0
+	.8byte	0
+.LLST287:
+	.8byte	.LVL928
+	.8byte	.LVL943
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL948
-	.8byte	.LVL950
+	.8byte	.LVL945
+	.8byte	.LVL947
 	.2byte	0x1
 	.byte	0x69
-	.8byte	.LVL952
+	.8byte	.LVL949
 	.8byte	.LFE2884
 	.2byte	0x1
 	.byte	0x69
 	.8byte	0
 	.8byte	0
-.LLST280:
-	.8byte	.LVL932
+.LLST288:
+	.8byte	.LVL929
+	.8byte	.LVL942
+	.2byte	0x1
+	.byte	0x68
 	.8byte	.LVL945
+	.8byte	.LVL947
 	.2byte	0x1
 	.byte	0x68
 	.8byte	.LVL948
@@ -65475,133 +65777,129 @@
 	.2byte	0x1
 	.byte	0x68
 	.8byte	.LVL951
-	.8byte	.LVL953
-	.2byte	0x1
-	.byte	0x68
-	.8byte	.LVL954
 	.8byte	.LFE2884
 	.2byte	0x1
 	.byte	0x68
-	.8byte	0
-	.8byte	0
-.LLST281:
-	.8byte	.LVL927
-	.8byte	.LVL928
-	.2byte	0x1
-	.byte	0x54
-	.8byte	0
-	.8byte	0
-.LLST282:
-	.8byte	.LVL929
-	.8byte	.LVL943
-	.2byte	0x1
-	.byte	0x63
-	.8byte	.LVL948
-	.8byte	.LFE2884
-	.2byte	0x1
-	.byte	0x63
-	.8byte	0
-	.8byte	0
-.LLST283:
-	.8byte	.LVL933
-	.8byte	.LVL946
-	.2byte	0x1
-	.byte	0x6a
-	.8byte	.LVL948
-	.8byte	.LVL950
-	.2byte	0x1
-	.byte	0x6a
-	.8byte	0
-	.8byte	0
-.LLST284:
-	.8byte	.LVL935
-	.8byte	.LVL941
-	.2byte	0x1
-	.byte	0x53
-	.8byte	.LVL942
-	.8byte	.LVL948
-	.2byte	0x1
-	.byte	0x53
-	.8byte	0
-	.8byte	0
-.LLST287:
-	.8byte	.LVL1009
-	.8byte	.LVL1010-1
-	.2byte	0x1
-	.byte	0x52
-	.8byte	0
-	.8byte	0
-.LLST288:
-	.8byte	.LVL1008
-	.8byte	.LVL1010-1
-	.2byte	0x1
-	.byte	0x54
 	.8byte	0
 	.8byte	0
 .LLST289:
-	.8byte	.LVL1012
-	.8byte	.LVL1013
-	.2byte	0x1
-	.byte	0x54
-	.8byte	.LVL1014
-	.8byte	.LVL1015-1
+	.8byte	.LVL924
+	.8byte	.LVL925
 	.2byte	0x1
 	.byte	0x54
 	.8byte	0
 	.8byte	0
 .LLST290:
-	.8byte	.LVL1011
-	.8byte	.LVL1015-1
+	.8byte	.LVL926
+	.8byte	.LVL940
+	.2byte	0x1
+	.byte	0x63
+	.8byte	.LVL945
+	.8byte	.LFE2884
+	.2byte	0x1
+	.byte	0x63
+	.8byte	0
+	.8byte	0
+.LLST291:
+	.8byte	.LVL930
+	.8byte	.LVL943
+	.2byte	0x1
+	.byte	0x6a
+	.8byte	.LVL945
+	.8byte	.LVL947
+	.2byte	0x1
+	.byte	0x6a
+	.8byte	0
+	.8byte	0
+.LLST292:
+	.8byte	.LVL932
+	.8byte	.LVL938
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL939
+	.8byte	.LVL945
+	.2byte	0x1
+	.byte	0x53
+	.8byte	0
+	.8byte	0
+.LLST295:
+	.8byte	.LVL999
+	.8byte	.LVL1000-1
+	.2byte	0x1
+	.byte	0x52
+	.8byte	0
+	.8byte	0
+.LLST296:
+	.8byte	.LVL998
+	.8byte	.LVL1000-1
+	.2byte	0x1
+	.byte	0x54
+	.8byte	0
+	.8byte	0
+.LLST297:
+	.8byte	.LVL1002
+	.8byte	.LVL1003
+	.2byte	0x1
+	.byte	0x54
+	.8byte	.LVL1004
+	.8byte	.LVL1005-1
+	.2byte	0x1
+	.byte	0x54
+	.8byte	0
+	.8byte	0
+.LLST298:
+	.8byte	.LVL1001
+	.8byte	.LVL1005-1
 	.2byte	0x1
 	.byte	0x58
 	.8byte	0
 	.8byte	0
-.LLST318:
-	.8byte	.LVL1210
-	.8byte	.LVL1211
+.LLST326:
+	.8byte	.LVL1202
+	.8byte	.LVL1203
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST319:
-	.8byte	.LVL1210
-	.8byte	.LVL1212
+.LLST327:
+	.8byte	.LVL1202
+	.8byte	.LVL1204
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST320:
-	.8byte	.LVL1210
-	.8byte	.LVL1217
+.LLST328:
+	.8byte	.LVL1202
+	.8byte	.LVL1209
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL1217
-	.8byte	.LVL1218-1
+	.8byte	.LVL1209
+	.8byte	.LVL1210-1
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
-.LLST321:
-	.8byte	.LVL1213
-	.8byte	.LVL1214
+.LLST329:
+	.8byte	.LVL1205
+	.8byte	.LVL1206
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL1215
+	.8byte	.LVL1207
+	.8byte	.LVL1208
+	.2byte	0x1
+	.byte	0x51
+	.8byte	0
+	.8byte	0
+.LLST330:
+	.8byte	.LVL1211
+	.8byte	.LVL1212
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL1212
 	.8byte	.LVL1216
 	.2byte	0x1
-	.byte	0x51
-	.8byte	0
-	.8byte	0
-.LLST322:
-	.8byte	.LVL1219
-	.8byte	.LVL1220
-	.2byte	0x1
-	.byte	0x50
-	.8byte	.LVL1220
-	.8byte	.LVL1224
-	.2byte	0x1
 	.byte	0x63
-	.8byte	.LVL1225
+	.8byte	.LVL1217
 	.8byte	.LFE2892
 	.2byte	0x1
 	.byte	0x63
@@ -65625,160 +65923,138 @@
 	.8byte	0
 	.section	.debug_ranges,"",@progbits
 .Ldebug_ranges0:
-	.8byte	.LBB1060
-	.8byte	.LBE1060
-	.8byte	.LBB1390
-	.8byte	.LBE1390
-	.8byte	.LBB1391
-	.8byte	.LBE1391
-	.8byte	.LBB1412
-	.8byte	.LBE1412
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB1063
-	.8byte	.LBE1063
-	.8byte	.LBB1083
-	.8byte	.LBE1083
-	.8byte	.LBB1084
-	.8byte	.LBE1084
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB1077
-	.8byte	.LBE1077
-	.8byte	.LBB1082
-	.8byte	.LBE1082
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB1091
-	.8byte	.LBE1091
-	.8byte	.LBB1121
-	.8byte	.LBE1121
-	.8byte	.LBB1122
-	.8byte	.LBE1122
-	.8byte	.LBB1406
-	.8byte	.LBE1406
-	.8byte	.LBB1409
-	.8byte	.LBE1409
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB1094
-	.8byte	.LBE1094
-	.8byte	.LBB1105
-	.8byte	.LBE1105
-	.8byte	.LBB1106
-	.8byte	.LBE1106
-	.8byte	.LBB1107
-	.8byte	.LBE1107
-	.8byte	0
-	.8byte	0
+	.8byte	.LBB1092
+	.8byte	.LBE1092
 	.8byte	.LBB1123
 	.8byte	.LBE1123
-	.8byte	.LBB1394
-	.8byte	.LBE1394
-	.8byte	.LBB1395
-	.8byte	.LBE1395
+	.8byte	.LBB1124
+	.8byte	.LBE1124
+	.8byte	.LBB1473
+	.8byte	.LBE1473
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1126
-	.8byte	.LBE1126
-	.8byte	.LBB1146
-	.8byte	.LBE1146
+	.8byte	.LBB1095
+	.8byte	.LBE1095
+	.8byte	.LBB1107
+	.8byte	.LBE1107
+	.8byte	.LBB1108
+	.8byte	.LBE1108
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1111
+	.8byte	.LBE1111
+	.8byte	.LBB1116
+	.8byte	.LBE1116
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1125
+	.8byte	.LBE1125
+	.8byte	.LBB1460
+	.8byte	.LBE1460
+	.8byte	.LBB1461
+	.8byte	.LBE1461
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1128
+	.8byte	.LBE1128
+	.8byte	.LBB1148
+	.8byte	.LBE1148
+	.8byte	.LBB1149
+	.8byte	.LBE1149
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1142
+	.8byte	.LBE1142
 	.8byte	.LBB1147
 	.8byte	.LBE1147
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1140
-	.8byte	.LBE1140
-	.8byte	.LBB1145
-	.8byte	.LBE1145
+	.8byte	.LBB1154
+	.8byte	.LBE1154
+	.8byte	.LBB1189
+	.8byte	.LBE1189
+	.8byte	.LBB1462
+	.8byte	.LBE1462
+	.8byte	.LBB1463
+	.8byte	.LBE1463
+	.8byte	.LBB1472
+	.8byte	.LBE1472
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1152
-	.8byte	.LBE1152
-	.8byte	.LBB1396
-	.8byte	.LBE1396
-	.8byte	.LBB1397
-	.8byte	.LBE1397
+	.8byte	.LBB1157
+	.8byte	.LBE1157
+	.8byte	.LBB1170
+	.8byte	.LBE1170
+	.8byte	.LBB1179
+	.8byte	.LBE1179
+	.8byte	.LBB1180
+	.8byte	.LBE1180
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1155
-	.8byte	.LBE1155
-	.8byte	.LBB1175
-	.8byte	.LBE1175
-	.8byte	.LBB1176
-	.8byte	.LBE1176
+	.8byte	.LBB1173
+	.8byte	.LBE1173
+	.8byte	.LBB1178
+	.8byte	.LBE1178
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1169
-	.8byte	.LBE1169
-	.8byte	.LBB1174
-	.8byte	.LBE1174
+	.8byte	.LBB1190
+	.8byte	.LBE1190
+	.8byte	.LBB1452
+	.8byte	.LBE1452
+	.8byte	.LBB1453
+	.8byte	.LBE1453
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1181
-	.8byte	.LBE1181
-	.8byte	.LBB1216
-	.8byte	.LBE1216
-	.8byte	.LBB1398
-	.8byte	.LBE1398
-	.8byte	.LBB1399
-	.8byte	.LBE1399
-	.8byte	.LBB1407
-	.8byte	.LBE1407
+	.8byte	.LBB1193
+	.8byte	.LBE1193
+	.8byte	.LBB1213
+	.8byte	.LBE1213
+	.8byte	.LBB1214
+	.8byte	.LBE1214
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1184
-	.8byte	.LBE1184
-	.8byte	.LBB1197
-	.8byte	.LBE1197
-	.8byte	.LBB1206
-	.8byte	.LBE1206
 	.8byte	.LBB1207
 	.8byte	.LBE1207
+	.8byte	.LBB1212
+	.8byte	.LBE1212
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1200
-	.8byte	.LBE1200
-	.8byte	.LBB1205
-	.8byte	.LBE1205
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB1217
-	.8byte	.LBE1217
+	.8byte	.LBB1219
+	.8byte	.LBE1219
 	.8byte	.LBB1252
 	.8byte	.LBE1252
-	.8byte	.LBB1400
-	.8byte	.LBE1400
-	.8byte	.LBB1401
-	.8byte	.LBE1401
-	.8byte	.LBB1411
-	.8byte	.LBE1411
+	.8byte	.LBB1466
+	.8byte	.LBE1466
+	.8byte	.LBB1467
+	.8byte	.LBE1467
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1220
-	.8byte	.LBE1220
-	.8byte	.LBB1233
-	.8byte	.LBE1233
-	.8byte	.LBB1242
-	.8byte	.LBE1242
+	.8byte	.LBB1222
+	.8byte	.LBE1222
+	.8byte	.LBB1235
+	.8byte	.LBE1235
+	.8byte	.LBB1244
+	.8byte	.LBE1244
+	.8byte	.LBB1245
+	.8byte	.LBE1245
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1238
+	.8byte	.LBE1238
 	.8byte	.LBB1243
 	.8byte	.LBE1243
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1236
-	.8byte	.LBE1236
-	.8byte	.LBB1241
-	.8byte	.LBE1241
-	.8byte	0
-	.8byte	0
 	.8byte	.LBB1253
 	.8byte	.LBE1253
-	.8byte	.LBB1286
-	.8byte	.LBE1286
-	.8byte	.LBB1404
-	.8byte	.LBE1404
-	.8byte	.LBB1405
-	.8byte	.LBE1405
+	.8byte	.LBB1288
+	.8byte	.LBE1288
+	.8byte	.LBB1464
+	.8byte	.LBE1464
+	.8byte	.LBB1465
+	.8byte	.LBE1465
+	.8byte	.LBB1469
+	.8byte	.LBE1469
 	.8byte	0
 	.8byte	0
 	.8byte	.LBB1256
@@ -65797,1004 +66073,1014 @@
 	.8byte	.LBE1277
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1287
-	.8byte	.LBE1287
-	.8byte	.LBB1322
-	.8byte	.LBE1322
-	.8byte	.LBB1402
-	.8byte	.LBE1402
-	.8byte	.LBB1403
-	.8byte	.LBE1403
-	.8byte	.LBB1410
-	.8byte	.LBE1410
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB1290
-	.8byte	.LBE1290
-	.8byte	.LBB1303
-	.8byte	.LBE1303
-	.8byte	.LBB1312
-	.8byte	.LBE1312
-	.8byte	.LBB1313
-	.8byte	.LBE1313
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB1306
-	.8byte	.LBE1306
-	.8byte	.LBB1311
-	.8byte	.LBE1311
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB1323
-	.8byte	.LBE1323
-	.8byte	.LBB1358
-	.8byte	.LBE1358
-	.8byte	.LBB1388
-	.8byte	.LBE1388
-	.8byte	.LBB1389
-	.8byte	.LBE1389
-	.8byte	.LBB1408
-	.8byte	.LBE1408
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB1326
-	.8byte	.LBE1326
-	.8byte	.LBB1339
-	.8byte	.LBE1339
-	.8byte	.LBB1340
-	.8byte	.LBE1340
-	.8byte	.LBB1341
-	.8byte	.LBE1341
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB1344
-	.8byte	.LBE1344
-	.8byte	.LBB1349
-	.8byte	.LBE1349
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB1359
-	.8byte	.LBE1359
-	.8byte	.LBB1392
-	.8byte	.LBE1392
-	.8byte	.LBB1393
-	.8byte	.LBE1393
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB1362
-	.8byte	.LBE1362
-	.8byte	.LBB1382
-	.8byte	.LBE1382
-	.8byte	.LBB1383
-	.8byte	.LBE1383
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB1376
-	.8byte	.LBE1376
-	.8byte	.LBB1381
-	.8byte	.LBE1381
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB1413
-	.8byte	.LBE1413
-	.8byte	.LBB1454
-	.8byte	.LBE1454
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB1414
-	.8byte	.LBE1414
-	.8byte	.LBB1452
-	.8byte	.LBE1452
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB1415
-	.8byte	.LBE1415
-	.8byte	.LBB1432
-	.8byte	.LBE1432
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB1416
-	.8byte	.LBE1416
-	.8byte	.LBB1431
-	.8byte	.LBE1431
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB1417
-	.8byte	.LBE1417
-	.8byte	.LBB1430
-	.8byte	.LBE1430
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB1418
-	.8byte	.LBE1418
-	.8byte	.LBB1429
-	.8byte	.LBE1429
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB1419
-	.8byte	.LBE1419
-	.8byte	.LBB1428
-	.8byte	.LBE1428
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB1420
-	.8byte	.LBE1420
-	.8byte	.LBB1427
-	.8byte	.LBE1427
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB1421
-	.8byte	.LBE1421
-	.8byte	.LBB1426
-	.8byte	.LBE1426
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB1422
-	.8byte	.LBE1422
-	.8byte	.LBB1425
-	.8byte	.LBE1425
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB1423
-	.8byte	.LBE1423
-	.8byte	.LBB1424
-	.8byte	.LBE1424
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB1433
-	.8byte	.LBE1433
-	.8byte	.LBB1453
-	.8byte	.LBE1453
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB1434
-	.8byte	.LBE1434
-	.8byte	.LBB1451
-	.8byte	.LBE1451
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB1435
-	.8byte	.LBE1435
-	.8byte	.LBB1450
-	.8byte	.LBE1450
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB1436
-	.8byte	.LBE1436
-	.8byte	.LBB1449
-	.8byte	.LBE1449
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB1437
-	.8byte	.LBE1437
-	.8byte	.LBB1448
-	.8byte	.LBE1448
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB1438
-	.8byte	.LBE1438
-	.8byte	.LBB1447
-	.8byte	.LBE1447
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB1439
-	.8byte	.LBE1439
-	.8byte	.LBB1446
-	.8byte	.LBE1446
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB1440
-	.8byte	.LBE1440
-	.8byte	.LBB1444
-	.8byte	.LBE1444
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB1441
-	.8byte	.LBE1441
-	.8byte	.LBB1445
-	.8byte	.LBE1445
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB1442
-	.8byte	.LBE1442
-	.8byte	.LBB1443
-	.8byte	.LBE1443
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB1455
-	.8byte	.LBE1455
-	.8byte	.LBB1475
-	.8byte	.LBE1475
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB1456
-	.8byte	.LBE1456
-	.8byte	.LBB1474
-	.8byte	.LBE1474
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB1457
-	.8byte	.LBE1457
+	.8byte	.LBB1289
+	.8byte	.LBE1289
+	.8byte	.LBB1324
+	.8byte	.LBE1324
 	.8byte	.LBB1458
 	.8byte	.LBE1458
-	.8byte	.LBB1472
-	.8byte	.LBE1472
-	.8byte	0
-	.8byte	0
 	.8byte	.LBB1459
 	.8byte	.LBE1459
-	.8byte	.LBB1473
-	.8byte	.LBE1473
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB1460
-	.8byte	.LBE1460
-	.8byte	.LBB1471
-	.8byte	.LBE1471
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB1461
-	.8byte	.LBE1461
-	.8byte	.LBB1469
-	.8byte	.LBE1469
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB1462
-	.8byte	.LBE1462
 	.8byte	.LBB1470
 	.8byte	.LBE1470
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1463
-	.8byte	.LBE1463
+	.8byte	.LBB1292
+	.8byte	.LBE1292
+	.8byte	.LBB1305
+	.8byte	.LBE1305
+	.8byte	.LBB1306
+	.8byte	.LBE1306
+	.8byte	.LBB1307
+	.8byte	.LBE1307
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1310
+	.8byte	.LBE1310
+	.8byte	.LBB1315
+	.8byte	.LBE1315
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1325
+	.8byte	.LBE1325
+	.8byte	.LBB1456
+	.8byte	.LBE1456
+	.8byte	.LBB1457
+	.8byte	.LBE1457
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1328
+	.8byte	.LBE1328
+	.8byte	.LBB1348
+	.8byte	.LBE1348
+	.8byte	.LBB1349
+	.8byte	.LBE1349
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1342
+	.8byte	.LBE1342
+	.8byte	.LBB1347
+	.8byte	.LBE1347
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1354
+	.8byte	.LBE1354
+	.8byte	.LBB1454
+	.8byte	.LBE1454
+	.8byte	.LBB1455
+	.8byte	.LBE1455
+	.8byte	.LBB1474
+	.8byte	.LBE1474
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1357
+	.8byte	.LBE1357
+	.8byte	.LBB1377
+	.8byte	.LBE1377
+	.8byte	.LBB1378
+	.8byte	.LBE1378
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1371
+	.8byte	.LBE1371
+	.8byte	.LBB1376
+	.8byte	.LBE1376
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1385
+	.8byte	.LBE1385
+	.8byte	.LBB1415
+	.8byte	.LBE1415
+	.8byte	.LBB1416
+	.8byte	.LBE1416
 	.8byte	.LBB1468
 	.8byte	.LBE1468
+	.8byte	.LBB1471
+	.8byte	.LBE1471
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1464
-	.8byte	.LBE1464
-	.8byte	.LBB1467
-	.8byte	.LBE1467
+	.8byte	.LBB1388
+	.8byte	.LBE1388
+	.8byte	.LBB1399
+	.8byte	.LBE1399
+	.8byte	.LBB1400
+	.8byte	.LBE1400
+	.8byte	.LBB1401
+	.8byte	.LBE1401
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1465
-	.8byte	.LBE1465
-	.8byte	.LBB1466
-	.8byte	.LBE1466
+	.8byte	.LBB1417
+	.8byte	.LBE1417
+	.8byte	.LBB1451
+	.8byte	.LBE1451
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1418
+	.8byte	.LBE1418
+	.8byte	.LBB1449
+	.8byte	.LBE1449
+	.8byte	.LBB1450
+	.8byte	.LBE1450
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1421
+	.8byte	.LBE1421
+	.8byte	.LBB1434
+	.8byte	.LBE1434
+	.8byte	.LBB1443
+	.8byte	.LBE1443
+	.8byte	.LBB1444
+	.8byte	.LBE1444
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1437
+	.8byte	.LBE1437
+	.8byte	.LBB1442
+	.8byte	.LBE1442
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1475
+	.8byte	.LBE1475
+	.8byte	.LBB1516
+	.8byte	.LBE1516
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1476
+	.8byte	.LBE1476
+	.8byte	.LBB1514
+	.8byte	.LBE1514
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1477
+	.8byte	.LBE1477
+	.8byte	.LBB1494
+	.8byte	.LBE1494
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1478
+	.8byte	.LBE1478
+	.8byte	.LBB1493
+	.8byte	.LBE1493
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1479
+	.8byte	.LBE1479
+	.8byte	.LBB1492
+	.8byte	.LBE1492
 	.8byte	0
 	.8byte	0
 	.8byte	.LBB1480
 	.8byte	.LBE1480
-	.8byte	.LBB1483
-	.8byte	.LBE1483
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB1486
-	.8byte	.LBE1486
 	.8byte	.LBB1491
 	.8byte	.LBE1491
-	.8byte	.LBB1492
-	.8byte	.LBE1492
-	.8byte	.LBB1493
-	.8byte	.LBE1493
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1481
+	.8byte	.LBE1481
+	.8byte	.LBB1490
+	.8byte	.LBE1490
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1482
+	.8byte	.LBE1482
+	.8byte	.LBB1489
+	.8byte	.LBE1489
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1483
+	.8byte	.LBE1483
+	.8byte	.LBB1488
+	.8byte	.LBE1488
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1484
+	.8byte	.LBE1484
+	.8byte	.LBB1487
+	.8byte	.LBE1487
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1485
+	.8byte	.LBE1485
+	.8byte	.LBB1486
+	.8byte	.LBE1486
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1495
+	.8byte	.LBE1495
+	.8byte	.LBB1515
+	.8byte	.LBE1515
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1496
+	.8byte	.LBE1496
+	.8byte	.LBB1513
+	.8byte	.LBE1513
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1497
+	.8byte	.LBE1497
+	.8byte	.LBB1512
+	.8byte	.LBE1512
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1498
+	.8byte	.LBE1498
+	.8byte	.LBB1511
+	.8byte	.LBE1511
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1499
+	.8byte	.LBE1499
+	.8byte	.LBB1510
+	.8byte	.LBE1510
 	.8byte	0
 	.8byte	0
 	.8byte	.LBB1500
 	.8byte	.LBE1500
 	.8byte	.LBB1509
 	.8byte	.LBE1509
-	.8byte	.LBB1510
-	.8byte	.LBE1510
-	.8byte	.LBB1521
-	.8byte	.LBE1521
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1501
+	.8byte	.LBE1501
+	.8byte	.LBB1508
+	.8byte	.LBE1508
 	.8byte	0
 	.8byte	0
 	.8byte	.LBB1502
 	.8byte	.LBE1502
+	.8byte	.LBB1506
+	.8byte	.LBE1506
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1503
+	.8byte	.LBE1503
+	.8byte	.LBB1507
+	.8byte	.LBE1507
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1504
+	.8byte	.LBE1504
 	.8byte	.LBB1505
 	.8byte	.LBE1505
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1511
-	.8byte	.LBE1511
-	.8byte	.LBB1515
-	.8byte	.LBE1515
-	.8byte	.LBB1516
-	.8byte	.LBE1516
+	.8byte	.LBB1517
+	.8byte	.LBE1517
+	.8byte	.LBB1537
+	.8byte	.LBE1537
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1534
-	.8byte	.LBE1534
-	.8byte	.LBB1605
-	.8byte	.LBE1605
-	.8byte	.LBB1606
-	.8byte	.LBE1606
-	.8byte	0
-	.8byte	0
+	.8byte	.LBB1518
+	.8byte	.LBE1518
 	.8byte	.LBB1536
 	.8byte	.LBE1536
-	.8byte	.LBB1552
-	.8byte	.LBE1552
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1519
+	.8byte	.LBE1519
+	.8byte	.LBB1520
+	.8byte	.LBE1520
+	.8byte	.LBB1534
+	.8byte	.LBE1534
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1521
+	.8byte	.LBE1521
+	.8byte	.LBB1535
+	.8byte	.LBE1535
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1522
+	.8byte	.LBE1522
+	.8byte	.LBB1533
+	.8byte	.LBE1533
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1523
+	.8byte	.LBE1523
+	.8byte	.LBB1531
+	.8byte	.LBE1531
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1524
+	.8byte	.LBE1524
+	.8byte	.LBB1532
+	.8byte	.LBE1532
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1525
+	.8byte	.LBE1525
+	.8byte	.LBB1530
+	.8byte	.LBE1530
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1526
+	.8byte	.LBE1526
+	.8byte	.LBB1529
+	.8byte	.LBE1529
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1527
+	.8byte	.LBE1527
+	.8byte	.LBB1528
+	.8byte	.LBE1528
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1542
+	.8byte	.LBE1542
+	.8byte	.LBB1545
+	.8byte	.LBE1545
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1548
+	.8byte	.LBE1548
 	.8byte	.LBB1553
 	.8byte	.LBE1553
 	.8byte	.LBB1554
 	.8byte	.LBE1554
 	.8byte	.LBB1555
 	.8byte	.LBE1555
-	.8byte	.LBB1556
-	.8byte	.LBE1556
-	.8byte	.LBB1557
-	.8byte	.LBE1557
-	.8byte	.LBB1558
-	.8byte	.LBE1558
-	.8byte	.LBB1559
-	.8byte	.LBE1559
-	.8byte	.LBB1560
-	.8byte	.LBE1560
-	.8byte	.LBB1561
-	.8byte	.LBE1561
+	.8byte	0
+	.8byte	0
 	.8byte	.LBB1562
 	.8byte	.LBE1562
-	.8byte	.LBB1563
-	.8byte	.LBE1563
+	.8byte	.LBB1571
+	.8byte	.LBE1571
+	.8byte	.LBB1572
+	.8byte	.LBE1572
+	.8byte	.LBB1583
+	.8byte	.LBE1583
+	.8byte	0
+	.8byte	0
 	.8byte	.LBB1564
 	.8byte	.LBE1564
-	.8byte	.LBB1565
-	.8byte	.LBE1565
+	.8byte	.LBB1567
+	.8byte	.LBE1567
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1568
-	.8byte	.LBE1568
-	.8byte	.LBB1607
-	.8byte	.LBE1607
-	.8byte	.LBB1608
-	.8byte	.LBE1608
-	.8byte	.LBB1609
-	.8byte	.LBE1609
+	.8byte	.LBB1573
+	.8byte	.LBE1573
+	.8byte	.LBB1577
+	.8byte	.LBE1577
+	.8byte	.LBB1578
+	.8byte	.LBE1578
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1570
-	.8byte	.LBE1570
-	.8byte	.LBB1587
-	.8byte	.LBE1587
-	.8byte	.LBB1588
-	.8byte	.LBE1588
-	.8byte	.LBB1589
-	.8byte	.LBE1589
-	.8byte	.LBB1590
-	.8byte	.LBE1590
-	.8byte	.LBB1591
-	.8byte	.LBE1591
-	.8byte	.LBB1592
-	.8byte	.LBE1592
-	.8byte	.LBB1593
-	.8byte	.LBE1593
-	.8byte	.LBB1594
-	.8byte	.LBE1594
-	.8byte	.LBB1595
-	.8byte	.LBE1595
 	.8byte	.LBB1596
 	.8byte	.LBE1596
-	.8byte	.LBB1597
-	.8byte	.LBE1597
-	.8byte	.LBB1598
-	.8byte	.LBE1598
-	.8byte	.LBB1599
-	.8byte	.LBE1599
-	.8byte	.LBB1600
-	.8byte	.LBE1600
-	.8byte	.LBB1601
-	.8byte	.LBE1601
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB1610
-	.8byte	.LBE1610
-	.8byte	.LBB1650
-	.8byte	.LBE1650
-	.8byte	.LBB1651
-	.8byte	.LBE1651
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB1612
-	.8byte	.LBE1612
-	.8byte	.LBB1631
-	.8byte	.LBE1631
-	.8byte	.LBB1632
-	.8byte	.LBE1632
-	.8byte	.LBB1633
-	.8byte	.LBE1633
-	.8byte	.LBB1634
-	.8byte	.LBE1634
-	.8byte	.LBB1635
-	.8byte	.LBE1635
-	.8byte	.LBB1636
-	.8byte	.LBE1636
-	.8byte	.LBB1637
-	.8byte	.LBE1637
-	.8byte	.LBB1638
-	.8byte	.LBE1638
-	.8byte	.LBB1639
-	.8byte	.LBE1639
-	.8byte	.LBB1640
-	.8byte	.LBE1640
-	.8byte	.LBB1641
-	.8byte	.LBE1641
-	.8byte	.LBB1642
-	.8byte	.LBE1642
-	.8byte	.LBB1643
-	.8byte	.LBE1643
-	.8byte	.LBB1644
-	.8byte	.LBE1644
-	.8byte	.LBB1645
-	.8byte	.LBE1645
-	.8byte	.LBB1646
-	.8byte	.LBE1646
-	.8byte	.LBB1647
-	.8byte	.LBE1647
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB1660
-	.8byte	.LBE1660
 	.8byte	.LBB1667
 	.8byte	.LBE1667
 	.8byte	.LBB1668
 	.8byte	.LBE1668
 	.8byte	0
 	.8byte	0
+	.8byte	.LBB1598
+	.8byte	.LBE1598
+	.8byte	.LBB1614
+	.8byte	.LBE1614
+	.8byte	.LBB1615
+	.8byte	.LBE1615
+	.8byte	.LBB1616
+	.8byte	.LBE1616
+	.8byte	.LBB1617
+	.8byte	.LBE1617
+	.8byte	.LBB1618
+	.8byte	.LBE1618
+	.8byte	.LBB1619
+	.8byte	.LBE1619
+	.8byte	.LBB1620
+	.8byte	.LBE1620
+	.8byte	.LBB1621
+	.8byte	.LBE1621
+	.8byte	.LBB1622
+	.8byte	.LBE1622
+	.8byte	.LBB1623
+	.8byte	.LBE1623
+	.8byte	.LBB1624
+	.8byte	.LBE1624
+	.8byte	.LBB1625
+	.8byte	.LBE1625
+	.8byte	.LBB1626
+	.8byte	.LBE1626
+	.8byte	.LBB1627
+	.8byte	.LBE1627
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1630
+	.8byte	.LBE1630
+	.8byte	.LBB1669
+	.8byte	.LBE1669
+	.8byte	.LBB1670
+	.8byte	.LBE1670
+	.8byte	.LBB1671
+	.8byte	.LBE1671
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1632
+	.8byte	.LBE1632
+	.8byte	.LBB1649
+	.8byte	.LBE1649
+	.8byte	.LBB1650
+	.8byte	.LBE1650
+	.8byte	.LBB1651
+	.8byte	.LBE1651
+	.8byte	.LBB1652
+	.8byte	.LBE1652
+	.8byte	.LBB1653
+	.8byte	.LBE1653
+	.8byte	.LBB1654
+	.8byte	.LBE1654
+	.8byte	.LBB1655
+	.8byte	.LBE1655
+	.8byte	.LBB1656
+	.8byte	.LBE1656
+	.8byte	.LBB1657
+	.8byte	.LBE1657
+	.8byte	.LBB1658
+	.8byte	.LBE1658
+	.8byte	.LBB1659
+	.8byte	.LBE1659
+	.8byte	.LBB1660
+	.8byte	.LBE1660
 	.8byte	.LBB1661
 	.8byte	.LBE1661
-	.8byte	.LBB1666
-	.8byte	.LBE1666
+	.8byte	.LBB1662
+	.8byte	.LBE1662
+	.8byte	.LBB1663
+	.8byte	.LBE1663
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1816
-	.8byte	.LBE1816
-	.8byte	.LBB1819
-	.8byte	.LBE1819
+	.8byte	.LBB1672
+	.8byte	.LBE1672
+	.8byte	.LBB1712
+	.8byte	.LBE1712
+	.8byte	.LBB1713
+	.8byte	.LBE1713
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1826
-	.8byte	.LBE1826
-	.8byte	.LBB1906
-	.8byte	.LBE1906
-	.8byte	.LBB1907
-	.8byte	.LBE1907
-	.8byte	.LBB1908
-	.8byte	.LBE1908
+	.8byte	.LBB1674
+	.8byte	.LBE1674
+	.8byte	.LBB1693
+	.8byte	.LBE1693
+	.8byte	.LBB1694
+	.8byte	.LBE1694
+	.8byte	.LBB1695
+	.8byte	.LBE1695
+	.8byte	.LBB1696
+	.8byte	.LBE1696
+	.8byte	.LBB1697
+	.8byte	.LBE1697
+	.8byte	.LBB1698
+	.8byte	.LBE1698
+	.8byte	.LBB1699
+	.8byte	.LBE1699
+	.8byte	.LBB1700
+	.8byte	.LBE1700
+	.8byte	.LBB1701
+	.8byte	.LBE1701
+	.8byte	.LBB1702
+	.8byte	.LBE1702
+	.8byte	.LBB1703
+	.8byte	.LBE1703
+	.8byte	.LBB1704
+	.8byte	.LBE1704
+	.8byte	.LBB1705
+	.8byte	.LBE1705
+	.8byte	.LBB1706
+	.8byte	.LBE1706
+	.8byte	.LBB1707
+	.8byte	.LBE1707
+	.8byte	.LBB1708
+	.8byte	.LBE1708
+	.8byte	.LBB1709
+	.8byte	.LBE1709
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1828
-	.8byte	.LBE1828
-	.8byte	.LBB1837
-	.8byte	.LBE1837
-	.8byte	.LBB1838
-	.8byte	.LBE1838
-	.8byte	.LBB1839
-	.8byte	.LBE1839
+	.8byte	.LBB1718
+	.8byte	.LBE1718
+	.8byte	.LBB1725
+	.8byte	.LBE1725
+	.8byte	.LBB1726
+	.8byte	.LBE1726
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1909
-	.8byte	.LBE1909
-	.8byte	.LBB1922
-	.8byte	.LBE1922
-	.8byte	.LBB1923
-	.8byte	.LBE1923
-	.8byte	.LBB1976
-	.8byte	.LBE1976
-	.8byte	.LBB1982
-	.8byte	.LBE1982
-	.8byte	.LBB1984
-	.8byte	.LBE1984
-	.8byte	.LBB1985
-	.8byte	.LBE1985
-	.8byte	.LBB1987
-	.8byte	.LBE1987
+	.8byte	.LBB1719
+	.8byte	.LBE1719
+	.8byte	.LBB1724
+	.8byte	.LBE1724
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1911
-	.8byte	.LBE1911
-	.8byte	.LBB1914
-	.8byte	.LBE1914
+	.8byte	.LBB1874
+	.8byte	.LBE1874
+	.8byte	.LBB1877
+	.8byte	.LBE1877
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1924
-	.8byte	.LBE1924
-	.8byte	.LBB1934
-	.8byte	.LBE1934
-	.8byte	.LBB1979
-	.8byte	.LBE1979
-	.8byte	.LBB1986
-	.8byte	.LBE1986
-	.8byte	.LBB1989
-	.8byte	.LBE1989
+	.8byte	.LBB1884
+	.8byte	.LBE1884
+	.8byte	.LBB1964
+	.8byte	.LBE1964
+	.8byte	.LBB1965
+	.8byte	.LBE1965
+	.8byte	.LBB1966
+	.8byte	.LBE1966
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1926
-	.8byte	.LBE1926
-	.8byte	.LBB1929
-	.8byte	.LBE1929
+	.8byte	.LBB1886
+	.8byte	.LBE1886
+	.8byte	.LBB1895
+	.8byte	.LBE1895
+	.8byte	.LBB1896
+	.8byte	.LBE1896
+	.8byte	.LBB1897
+	.8byte	.LBE1897
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB1935
-	.8byte	.LBE1935
-	.8byte	.LBB1980
-	.8byte	.LBE1980
-	.8byte	.LBB1981
-	.8byte	.LBE1981
-	.8byte	.LBB1983
-	.8byte	.LBE1983
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB1949
-	.8byte	.LBE1949
-	.8byte	.LBB1954
-	.8byte	.LBE1954
-	.8byte	.LBB1955
-	.8byte	.LBE1955
-	.8byte	.LBB1956
-	.8byte	.LBE1956
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB1957
-	.8byte	.LBE1957
-	.8byte	.LBB1977
-	.8byte	.LBE1977
-	.8byte	.LBB1978
-	.8byte	.LBE1978
-	.8byte	.LBB1988
-	.8byte	.LBE1988
-	.8byte	.LBB1990
-	.8byte	.LBE1990
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB2001
-	.8byte	.LBE2001
-	.8byte	.LBB2003
-	.8byte	.LBE2003
-	.8byte	.LBB2010
-	.8byte	.LBE2010
+	.8byte	.LBB1967
+	.8byte	.LBE1967
+	.8byte	.LBB2026
+	.8byte	.LBE2026
 	.8byte	.LBB2030
 	.8byte	.LBE2030
-	.8byte	.LBB2047
-	.8byte	.LBE2047
-	.8byte	.LBB2056
-	.8byte	.LBE2056
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB2002
-	.8byte	.LBE2002
-	.8byte	.LBB2011
-	.8byte	.LBE2011
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB2004
-	.8byte	.LBE2004
 	.8byte	.LBB2033
 	.8byte	.LBE2033
 	.8byte	.LBB2035
 	.8byte	.LBE2035
-	.8byte	.LBB2045
-	.8byte	.LBE2045
-	.8byte	.LBB2058
-	.8byte	.LBE2058
-	.8byte	.LBB2059
-	.8byte	.LBE2059
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB2005
-	.8byte	.LBE2005
-	.8byte	.LBB2034
-	.8byte	.LBE2034
 	.8byte	.LBB2036
 	.8byte	.LBE2036
-	.8byte	.LBB2037
-	.8byte	.LBE2037
-	.8byte	.LBB2039
-	.8byte	.LBE2039
-	.8byte	.LBB2050
-	.8byte	.LBE2050
-	.8byte	.LBB2055
-	.8byte	.LBE2055
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB2006
-	.8byte	.LBE2006
 	.8byte	.LBB2038
 	.8byte	.LBE2038
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1969
+	.8byte	.LBE1969
+	.8byte	.LBB1972
+	.8byte	.LBE1972
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1979
+	.8byte	.LBE1979
+	.8byte	.LBB1989
+	.8byte	.LBE1989
+	.8byte	.LBB2029
+	.8byte	.LBE2029
+	.8byte	.LBB2037
+	.8byte	.LBE2037
 	.8byte	.LBB2040
 	.8byte	.LBE2040
-	.8byte	.LBB2042
-	.8byte	.LBE2042
-	.8byte	.LBB2046
-	.8byte	.LBE2046
-	.8byte	.LBB2053
-	.8byte	.LBE2053
 	.8byte	0
 	.8byte	0
+	.8byte	.LBB1981
+	.8byte	.LBE1981
+	.8byte	.LBB1984
+	.8byte	.LBE1984
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1990
+	.8byte	.LBE1990
+	.8byte	.LBB2031
+	.8byte	.LBE2031
+	.8byte	.LBB2032
+	.8byte	.LBE2032
+	.8byte	.LBB2034
+	.8byte	.LBE2034
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB2004
+	.8byte	.LBE2004
 	.8byte	.LBB2007
 	.8byte	.LBE2007
-	.8byte	.LBB2041
-	.8byte	.LBE2041
-	.8byte	.LBB2043
-	.8byte	.LBE2043
-	.8byte	.LBB2051
-	.8byte	.LBE2051
-	.8byte	.LBB2060
-	.8byte	.LBE2060
 	.8byte	0
 	.8byte	0
 	.8byte	.LBB2008
 	.8byte	.LBE2008
-	.8byte	.LBB2032
-	.8byte	.LBE2032
-	.8byte	.LBB2049
-	.8byte	.LBE2049
-	.8byte	.LBB2057
-	.8byte	.LBE2057
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB2009
-	.8byte	.LBE2009
-	.8byte	.LBB2031
-	.8byte	.LBE2031
-	.8byte	.LBB2048
-	.8byte	.LBE2048
-	.8byte	.LBB2054
-	.8byte	.LBE2054
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB2012
-	.8byte	.LBE2012
 	.8byte	.LBB2027
 	.8byte	.LBE2027
 	.8byte	.LBB2028
 	.8byte	.LBE2028
-	.8byte	.LBB2029
-	.8byte	.LBE2029
-	.8byte	.LBB2044
-	.8byte	.LBE2044
-	.8byte	.LBB2052
-	.8byte	.LBE2052
+	.8byte	.LBB2039
+	.8byte	.LBE2039
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB2013
-	.8byte	.LBE2013
-	.8byte	.LBB2014
-	.8byte	.LBE2014
-	.8byte	.LBB2064
-	.8byte	.LBE2064
-	.8byte	.LBB2070
-	.8byte	.LBE2070
-	.8byte	.LBB2076
-	.8byte	.LBE2076
-	.8byte	.LBB2077
-	.8byte	.LBE2077
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB2015
-	.8byte	.LBE2015
-	.8byte	.LBB2016
-	.8byte	.LBE2016
-	.8byte	.LBB2065
-	.8byte	.LBE2065
-	.8byte	.LBB2069
-	.8byte	.LBE2069
-	.8byte	.LBB2078
-	.8byte	.LBE2078
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB2017
-	.8byte	.LBE2017
-	.8byte	.LBB2018
-	.8byte	.LBE2018
-	.8byte	.LBB2066
-	.8byte	.LBE2066
-	.8byte	.LBB2068
-	.8byte	.LBE2068
-	.8byte	.LBB2079
-	.8byte	.LBE2079
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB2019
-	.8byte	.LBE2019
-	.8byte	.LBB2020
-	.8byte	.LBE2020
-	.8byte	.LBB2067
-	.8byte	.LBE2067
+	.8byte	.LBB2051
+	.8byte	.LBE2051
+	.8byte	.LBB2053
+	.8byte	.LBE2053
+	.8byte	.LBB2060
+	.8byte	.LBE2060
 	.8byte	.LBB2080
 	.8byte	.LBE2080
+	.8byte	.LBB2097
+	.8byte	.LBE2097
+	.8byte	.LBB2106
+	.8byte	.LBE2106
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB2021
-	.8byte	.LBE2021
-	.8byte	.LBB2022
-	.8byte	.LBE2022
-	.8byte	.LBB2062
-	.8byte	.LBE2062
-	.8byte	.LBB2072
-	.8byte	.LBE2072
-	.8byte	.LBB2074
-	.8byte	.LBE2074
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB2023
-	.8byte	.LBE2023
-	.8byte	.LBB2024
-	.8byte	.LBE2024
-	.8byte	.LBB2063
-	.8byte	.LBE2063
-	.8byte	.LBB2071
-	.8byte	.LBE2071
-	.8byte	.LBB2075
-	.8byte	.LBE2075
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB2025
-	.8byte	.LBE2025
-	.8byte	.LBB2026
-	.8byte	.LBE2026
+	.8byte	.LBB2052
+	.8byte	.LBE2052
 	.8byte	.LBB2061
 	.8byte	.LBE2061
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB2054
+	.8byte	.LBE2054
+	.8byte	.LBB2083
+	.8byte	.LBE2083
+	.8byte	.LBB2085
+	.8byte	.LBE2085
+	.8byte	.LBB2095
+	.8byte	.LBE2095
+	.8byte	.LBB2108
+	.8byte	.LBE2108
+	.8byte	.LBB2109
+	.8byte	.LBE2109
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB2055
+	.8byte	.LBE2055
+	.8byte	.LBB2084
+	.8byte	.LBE2084
+	.8byte	.LBB2086
+	.8byte	.LBE2086
+	.8byte	.LBB2087
+	.8byte	.LBE2087
+	.8byte	.LBB2089
+	.8byte	.LBE2089
+	.8byte	.LBB2100
+	.8byte	.LBE2100
+	.8byte	.LBB2105
+	.8byte	.LBE2105
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB2056
+	.8byte	.LBE2056
+	.8byte	.LBB2088
+	.8byte	.LBE2088
+	.8byte	.LBB2090
+	.8byte	.LBE2090
+	.8byte	.LBB2092
+	.8byte	.LBE2092
+	.8byte	.LBB2096
+	.8byte	.LBE2096
+	.8byte	.LBB2103
+	.8byte	.LBE2103
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB2057
+	.8byte	.LBE2057
+	.8byte	.LBB2091
+	.8byte	.LBE2091
+	.8byte	.LBB2093
+	.8byte	.LBE2093
+	.8byte	.LBB2101
+	.8byte	.LBE2101
+	.8byte	.LBB2110
+	.8byte	.LBE2110
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB2058
+	.8byte	.LBE2058
+	.8byte	.LBB2082
+	.8byte	.LBE2082
+	.8byte	.LBB2099
+	.8byte	.LBE2099
+	.8byte	.LBB2107
+	.8byte	.LBE2107
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB2059
+	.8byte	.LBE2059
+	.8byte	.LBB2081
+	.8byte	.LBE2081
+	.8byte	.LBB2098
+	.8byte	.LBE2098
+	.8byte	.LBB2104
+	.8byte	.LBE2104
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB2062
+	.8byte	.LBE2062
+	.8byte	.LBB2077
+	.8byte	.LBE2077
+	.8byte	.LBB2078
+	.8byte	.LBE2078
+	.8byte	.LBB2079
+	.8byte	.LBE2079
+	.8byte	.LBB2094
+	.8byte	.LBE2094
+	.8byte	.LBB2102
+	.8byte	.LBE2102
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB2063
+	.8byte	.LBE2063
+	.8byte	.LBB2064
+	.8byte	.LBE2064
+	.8byte	.LBB2114
+	.8byte	.LBE2114
+	.8byte	.LBB2120
+	.8byte	.LBE2120
+	.8byte	.LBB2126
+	.8byte	.LBE2126
+	.8byte	.LBB2127
+	.8byte	.LBE2127
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB2065
+	.8byte	.LBE2065
+	.8byte	.LBB2066
+	.8byte	.LBE2066
+	.8byte	.LBB2115
+	.8byte	.LBE2115
+	.8byte	.LBB2119
+	.8byte	.LBE2119
+	.8byte	.LBB2128
+	.8byte	.LBE2128
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB2067
+	.8byte	.LBE2067
+	.8byte	.LBB2068
+	.8byte	.LBE2068
+	.8byte	.LBB2116
+	.8byte	.LBE2116
+	.8byte	.LBB2118
+	.8byte	.LBE2118
+	.8byte	.LBB2129
+	.8byte	.LBE2129
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB2069
+	.8byte	.LBE2069
+	.8byte	.LBB2070
+	.8byte	.LBE2070
+	.8byte	.LBB2117
+	.8byte	.LBE2117
+	.8byte	.LBB2130
+	.8byte	.LBE2130
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB2071
+	.8byte	.LBE2071
+	.8byte	.LBB2072
+	.8byte	.LBE2072
+	.8byte	.LBB2112
+	.8byte	.LBE2112
+	.8byte	.LBB2122
+	.8byte	.LBE2122
+	.8byte	.LBB2124
+	.8byte	.LBE2124
+	.8byte	0
+	.8byte	0
 	.8byte	.LBB2073
 	.8byte	.LBE2073
+	.8byte	.LBB2074
+	.8byte	.LBE2074
+	.8byte	.LBB2113
+	.8byte	.LBE2113
+	.8byte	.LBB2121
+	.8byte	.LBE2121
+	.8byte	.LBB2125
+	.8byte	.LBE2125
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB2168
-	.8byte	.LBE2168
-	.8byte	.LBB2181
-	.8byte	.LBE2181
-	.8byte	.LBB2182
-	.8byte	.LBE2182
-	.8byte	.LBB2183
-	.8byte	.LBE2183
-	.8byte	.LBB2276
-	.8byte	.LBE2276
+	.8byte	.LBB2075
+	.8byte	.LBE2075
+	.8byte	.LBB2076
+	.8byte	.LBE2076
+	.8byte	.LBB2111
+	.8byte	.LBE2111
+	.8byte	.LBB2123
+	.8byte	.LBE2123
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB2170
-	.8byte	.LBE2170
-	.8byte	.LBB2173
-	.8byte	.LBE2173
-	.8byte	.LBB2174
-	.8byte	.LBE2174
-	.8byte	.LBB2175
-	.8byte	.LBE2175
-	.8byte	.LBB2176
-	.8byte	.LBE2176
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB2171
-	.8byte	.LBE2171
-	.8byte	.LBB2172
-	.8byte	.LBE2172
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB2184
-	.8byte	.LBE2184
-	.8byte	.LBB2234
-	.8byte	.LBE2234
-	.8byte	.LBB2235
-	.8byte	.LBE2235
-	.8byte	.LBB2236
-	.8byte	.LBE2236
-	.8byte	.LBB2237
-	.8byte	.LBE2237
-	.8byte	.LBB2238
-	.8byte	.LBE2238
-	.8byte	.LBB2239
-	.8byte	.LBE2239
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB2186
-	.8byte	.LBE2186
-	.8byte	.LBB2200
-	.8byte	.LBE2200
-	.8byte	.LBB2201
-	.8byte	.LBE2201
-	.8byte	.LBB2205
-	.8byte	.LBE2205
-	.8byte	.LBB2213
-	.8byte	.LBE2213
-	.8byte	.LBB2221
-	.8byte	.LBE2221
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB2187
-	.8byte	.LBE2187
-	.8byte	.LBB2202
-	.8byte	.LBE2202
-	.8byte	.LBB2203
-	.8byte	.LBE2203
-	.8byte	.LBB2206
-	.8byte	.LBE2206
-	.8byte	.LBB2216
-	.8byte	.LBE2216
-	.8byte	.LBB2224
-	.8byte	.LBE2224
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB2188
-	.8byte	.LBE2188
-	.8byte	.LBB2189
-	.8byte	.LBE2189
-	.8byte	.LBB2208
-	.8byte	.LBE2208
-	.8byte	.LBB2217
-	.8byte	.LBE2217
-	.8byte	.LBB2223
-	.8byte	.LBE2223
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB2190
-	.8byte	.LBE2190
-	.8byte	.LBB2191
-	.8byte	.LBE2191
-	.8byte	.LBB2207
-	.8byte	.LBE2207
-	.8byte	.LBB2215
-	.8byte	.LBE2215
-	.8byte	.LBB2222
-	.8byte	.LBE2222
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB2192
-	.8byte	.LBE2192
-	.8byte	.LBB2193
-	.8byte	.LBE2193
-	.8byte	.LBB2210
-	.8byte	.LBE2210
-	.8byte	.LBB2219
-	.8byte	.LBE2219
-	.8byte	.LBB2227
-	.8byte	.LBE2227
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB2194
-	.8byte	.LBE2194
-	.8byte	.LBB2195
-	.8byte	.LBE2195
-	.8byte	.LBB2209
-	.8byte	.LBE2209
 	.8byte	.LBB2218
 	.8byte	.LBE2218
+	.8byte	.LBB2229
+	.8byte	.LBE2229
+	.8byte	.LBB2230
+	.8byte	.LBE2230
+	.8byte	.LBB2308
+	.8byte	.LBE2308
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB2220
+	.8byte	.LBE2220
+	.8byte	.LBB2223
+	.8byte	.LBE2223
+	.8byte	.LBB2224
+	.8byte	.LBE2224
 	.8byte	.LBB2225
 	.8byte	.LBE2225
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB2196
-	.8byte	.LBE2196
-	.8byte	.LBB2197
-	.8byte	.LBE2197
-	.8byte	.LBB2211
-	.8byte	.LBE2211
-	.8byte	.LBB2214
-	.8byte	.LBE2214
-	.8byte	.LBB2226
-	.8byte	.LBE2226
+	.8byte	.LBB2221
+	.8byte	.LBE2221
+	.8byte	.LBB2222
+	.8byte	.LBE2222
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB2198
-	.8byte	.LBE2198
-	.8byte	.LBB2199
-	.8byte	.LBE2199
-	.8byte	.LBB2204
-	.8byte	.LBE2204
-	.8byte	.LBB2212
-	.8byte	.LBE2212
-	.8byte	.LBB2220
-	.8byte	.LBE2220
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB2242
-	.8byte	.LBE2242
+	.8byte	.LBB2231
+	.8byte	.LBE2231
+	.8byte	.LBB2281
+	.8byte	.LBE2281
+	.8byte	.LBB2282
+	.8byte	.LBE2282
+	.8byte	.LBB2283
+	.8byte	.LBE2283
+	.8byte	.LBB2284
+	.8byte	.LBE2284
+	.8byte	.LBB2285
+	.8byte	.LBE2285
 	.8byte	.LBB2286
 	.8byte	.LBE2286
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB2245
-	.8byte	.LBE2245
-	.8byte	.LBB2318
-	.8byte	.LBE2318
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB2249
-	.8byte	.LBE2249
-	.8byte	.LBB2256
-	.8byte	.LBE2256
-	.8byte	0
-	.8byte	0
+	.8byte	.LBB2233
+	.8byte	.LBE2233
+	.8byte	.LBB2247
+	.8byte	.LBE2247
+	.8byte	.LBB2248
+	.8byte	.LBE2248
 	.8byte	.LBB2252
 	.8byte	.LBE2252
-	.8byte	.LBB2255
-	.8byte	.LBE2255
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB2253
-	.8byte	.LBE2253
-	.8byte	.LBB2254
-	.8byte	.LBE2254
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB2258
-	.8byte	.LBE2258
-	.8byte	.LBB2295
-	.8byte	.LBE2295
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB2264
-	.8byte	.LBE2264
-	.8byte	.LBB2316
-	.8byte	.LBE2316
-	.8byte	.LBB2317
-	.8byte	.LBE2317
-	.8byte	0
-	.8byte	0
+	.8byte	.LBB2260
+	.8byte	.LBE2260
 	.8byte	.LBB2268
 	.8byte	.LBE2268
-	.8byte	.LBB2275
-	.8byte	.LBE2275
 	.8byte	0
 	.8byte	0
+	.8byte	.LBB2234
+	.8byte	.LBE2234
+	.8byte	.LBB2249
+	.8byte	.LBE2249
+	.8byte	.LBB2250
+	.8byte	.LBE2250
+	.8byte	.LBB2253
+	.8byte	.LBE2253
+	.8byte	.LBB2263
+	.8byte	.LBE2263
 	.8byte	.LBB2271
 	.8byte	.LBE2271
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB2235
+	.8byte	.LBE2235
+	.8byte	.LBB2236
+	.8byte	.LBE2236
+	.8byte	.LBB2255
+	.8byte	.LBE2255
+	.8byte	.LBB2264
+	.8byte	.LBE2264
+	.8byte	.LBB2270
+	.8byte	.LBE2270
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB2237
+	.8byte	.LBE2237
+	.8byte	.LBB2238
+	.8byte	.LBE2238
+	.8byte	.LBB2251
+	.8byte	.LBE2251
+	.8byte	.LBB2259
+	.8byte	.LBE2259
+	.8byte	.LBB2267
+	.8byte	.LBE2267
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB2239
+	.8byte	.LBE2239
+	.8byte	.LBB2240
+	.8byte	.LBE2240
+	.8byte	.LBB2254
+	.8byte	.LBE2254
+	.8byte	.LBB2262
+	.8byte	.LBE2262
+	.8byte	.LBB2269
+	.8byte	.LBE2269
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB2241
+	.8byte	.LBE2241
+	.8byte	.LBB2242
+	.8byte	.LBE2242
+	.8byte	.LBB2257
+	.8byte	.LBE2257
+	.8byte	.LBB2266
+	.8byte	.LBE2266
 	.8byte	.LBB2274
 	.8byte	.LBE2274
 	.8byte	0
 	.8byte	0
+	.8byte	.LBB2243
+	.8byte	.LBE2243
+	.8byte	.LBB2244
+	.8byte	.LBE2244
+	.8byte	.LBB2256
+	.8byte	.LBE2256
+	.8byte	.LBB2265
+	.8byte	.LBE2265
 	.8byte	.LBB2272
 	.8byte	.LBE2272
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB2245
+	.8byte	.LBE2245
+	.8byte	.LBB2246
+	.8byte	.LBE2246
+	.8byte	.LBB2258
+	.8byte	.LBE2258
+	.8byte	.LBB2261
+	.8byte	.LBE2261
 	.8byte	.LBB2273
 	.8byte	.LBE2273
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB2283
-	.8byte	.LBE2283
-	.8byte	.LBB2315
-	.8byte	.LBE2315
+	.8byte	.LBB2289
+	.8byte	.LBE2289
+	.8byte	.LBB2335
+	.8byte	.LBE2335
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB2287
-	.8byte	.LBE2287
-	.8byte	.LBB2294
-	.8byte	.LBE2294
+	.8byte	.LBB2292
+	.8byte	.LBE2292
+	.8byte	.LBB2346
+	.8byte	.LBE2346
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB2288
-	.8byte	.LBE2288
-	.8byte	.LBB2290
-	.8byte	.LBE2290
+	.8byte	.LBB2293
+	.8byte	.LBE2293
+	.8byte	.LBB2336
+	.8byte	.LBE2336
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB2291
-	.8byte	.LBE2291
-	.8byte	.LBB2306
-	.8byte	.LBE2306
+	.8byte	.LBB2300
+	.8byte	.LBE2300
+	.8byte	.LBB2302
+	.8byte	.LBE2302
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB2301
-	.8byte	.LBE2301
-	.8byte	.LBB2305
-	.8byte	.LBE2305
-	.8byte	0
-	.8byte	0
-	.8byte	.LBB2307
-	.8byte	.LBE2307
 	.8byte	.LBB2314
 	.8byte	.LBE2314
+	.8byte	.LBB2358
+	.8byte	.LBE2358
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB2319
-	.8byte	.LBE2319
-	.8byte	.LBB2326
-	.8byte	.LBE2326
-	.8byte	.LBB2327
-	.8byte	.LBE2327
+	.8byte	.LBB2318
+	.8byte	.LBE2318
+	.8byte	.LBB2359
+	.8byte	.LBE2359
 	.8byte	0
 	.8byte	0
-	.8byte	.LBB2320
-	.8byte	.LBE2320
-	.8byte	.LBB2325
-	.8byte	.LBE2325
+	.8byte	.LBB2321
+	.8byte	.LBE2321
+	.8byte	.LBB2350
+	.8byte	.LBE2350
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB2328
+	.8byte	.LBE2328
+	.8byte	.LBB2330
+	.8byte	.LBE2330
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB2331
+	.8byte	.LBE2331
+	.8byte	.LBB2342
+	.8byte	.LBE2342
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB2339
+	.8byte	.LBE2339
+	.8byte	.LBB2357
+	.8byte	.LBE2357
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB2343
+	.8byte	.LBE2343
+	.8byte	.LBB2360
+	.8byte	.LBE2360
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB2351
+	.8byte	.LBE2351
+	.8byte	.LBB2356
+	.8byte	.LBE2356
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB2361
+	.8byte	.LBE2361
+	.8byte	.LBB2368
+	.8byte	.LBE2368
+	.8byte	.LBB2369
+	.8byte	.LBE2369
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB2362
+	.8byte	.LBE2362
+	.8byte	.LBB2367
+	.8byte	.LBE2367
 	.8byte	0
 	.8byte	0
 	.8byte	.Ltext0
@@ -66826,7 +67112,7 @@
 	.string	"RPM_REQ_IDLE"
 .LASF2349:
 	.string	"suppliers"
-.LASF3043:
+.LASF3042:
 	.string	"ebc_buffer_manage_init"
 .LASF2850:
 	.string	"EPD_FULL_GCC16"
@@ -66904,7 +67190,7 @@
 	.string	"FTR_HIGHER_OR_ZERO_SAFE"
 .LASF1057:
 	.string	"need_qs"
-.LASF2984:
+.LASF2982:
 	.string	"frame_control_timer"
 .LASF137:
 	.string	"panic_notifier_list"
@@ -66954,7 +67240,7 @@
 	.string	"system_wq"
 .LASF603:
 	.string	"rcu_read_lock_nesting"
-.LASF2981:
+.LASF2979:
 	.string	"suspend_lock"
 .LASF2498:
 	.string	"gpio_desc"
@@ -66996,7 +67282,7 @@
 	.string	"mm_rb"
 .LASF2155:
 	.string	"freeze_late"
-.LASF3066:
+.LASF3065:
 	.string	"buf_info"
 .LASF409:
 	.string	"d_inode"
@@ -67058,7 +67344,7 @@
 	.string	"param_ops_uint"
 .LASF861:
 	.string	"softirq_activated"
-.LASF3027:
+.LASF3026:
 	.string	"pdev"
 .LASF797:
 	.string	"system_long_wq"
@@ -67200,7 +67486,7 @@
 	.string	"bin_attribute"
 .LASF1571:
 	.string	"percpu_counter"
-.LASF2983:
+.LASF2981:
 	.string	"first_in"
 .LASF2297:
 	.string	"dev_groups"
@@ -67248,7 +67534,7 @@
 	.string	"NR_ION_HEAP_POOL"
 .LASF1392:
 	.string	"sysctl_protected_hardlinks"
-.LASF3295:
+.LASF3296:
 	.string	"__arch_copy_from_user"
 .LASF1145:
 	.string	"scan_objects"
@@ -67406,8 +67692,6 @@
 	.string	"__tracepoint_page_ref_freeze"
 .LASF2904:
 	.string	"panel_buffer"
-.LASF2978:
-	.string	"new_buf_is_comming"
 .LASF317:
 	.string	"__exception_text_end"
 .LASF2702:
@@ -67640,7 +67924,7 @@
 	.string	"func"
 .LASF1109:
 	.string	"perf_event_context"
-.LASF2996:
+.LASF2995:
 	.string	"ebc_auto_task"
 .LASF94:
 	.string	"printk_delay_msec"
@@ -67670,7 +67954,7 @@
 	.string	"wake_q_node"
 .LASF1085:
 	.string	"request_key_auth"
-.LASF3007:
+.LASF3006:
 	.string	"waveform_misc"
 .LASF1922:
 	.string	"destroy_inode"
@@ -67702,7 +67986,7 @@
 	.string	"show_options"
 .LASF2111:
 	.string	"uevent_helper"
-.LASF3001:
+.LASF3000:
 	.string	"ebc_assist_finished_flag_sem"
 .LASF2950:
 	.string	"lut_buffer_phy"
@@ -67722,7 +68006,7 @@
 	.string	"_utime"
 .LASF2217:
 	.string	"pm_subsys_data"
-.LASF3300:
+.LASF3299:
 	.string	"ebc_empty_osd_buf_get"
 .LASF2318:
 	.string	"device_type"
@@ -67752,7 +68036,7 @@
 	.string	"fsverity_info"
 .LASF2009:
 	.string	"nr_leaves_on_tree"
-.LASF2976:
+.LASF2975:
 	.string	"prev_osd_buf"
 .LASF1680:
 	.string	"quota_on"
@@ -67818,7 +68102,7 @@
 	.string	"_refcount"
 .LASF466:
 	.string	"i_crypt_info"
-.LASF3060:
+.LASF3059:
 	.string	"waveform_mmap"
 .LASF1840:
 	.string	"flc_flock"
@@ -67904,13 +68188,13 @@
 	.string	"ebc_pmic_read_temp"
 .LASF2846:
 	.string	"EPD_FULL_GC16"
-.LASF3013:
+.LASF3012:
 	.string	"dev_attr_ebc_state"
 .LASF2130:
 	.string	"kernel_kobj"
 .LASF2556:
 	.string	"funcs"
-.LASF2989:
+.LASF2987:
 	.string	"overlay_enable"
 .LASF1076:
 	.string	"securebits"
@@ -67990,7 +68274,7 @@
 	.string	"f_mode"
 .LASF1398:
 	.string	"ki_complete"
-.LASF3030:
+.LASF3029:
 	.string	"ebc_tcon_pdev"
 .LASF1724:
 	.string	"percpu"
@@ -68018,7 +68302,7 @@
 	.string	"i_op"
 .LASF1655:
 	.string	"d_rt_spc_hardlimit"
-.LASF2995:
+.LASF2994:
 	.string	"ebc_task"
 .LASF2095:
 	.string	"kobj_ns_type_operations"
@@ -68084,7 +68368,7 @@
 	.string	"i_dentry"
 .LASF2097:
 	.string	"grab_current_ns"
-.LASF3045:
+.LASF3044:
 	.string	"fb_size"
 .LASF854:
 	.string	"offset"
@@ -68206,8 +68490,6 @@
 	.string	"sysctl_nr_open"
 .LASF82:
 	.string	"reset_devices"
-.LASF2968:
-	.string	"auto_image_bg"
 .LASF447:
 	.string	"i_wb"
 .LASF2055:
@@ -68358,11 +68640,11 @@
 	.string	"EPD_RESUME"
 .LASF3276:
 	.string	"sscanf"
-.LASF3272:
+.LASF3271:
 	.string	"ebc_empty_buf_get"
 .LASF1443:
 	.string	"NR_ISOLATED_ANON"
-.LASF3047:
+.LASF3046:
 	.string	"ebc_lut_table_init"
 .LASF1182:
 	.string	"uprobes_state"
@@ -68400,15 +68682,15 @@
 	.string	"last_update_time"
 .LASF1106:
 	.string	"robust_list_head"
-.LASF3270:
+.LASF3269:
 	.string	"init_timer_key"
 .LASF1449:
 	.string	"NR_ANON_MAPPED"
 .LASF383:
 	.string	"count"
-.LASF3003:
+.LASF3002:
 	.string	"resume_count_start"
-.LASF2999:
+.LASF2998:
 	.string	"ebc_auto_assist_task"
 .LASF556:
 	.string	"level"
@@ -68444,7 +68726,7 @@
 	.string	"usage_count"
 .LASF2046:
 	.string	"show"
-.LASF3010:
+.LASF3009:
 	.string	"dev_attr_pmic_temp"
 .LASF7:
 	.string	"unsigned char"
@@ -68460,7 +68742,7 @@
 	.string	"task_rss_stat"
 .LASF1110:
 	.string	"pipe_inode_info"
-.LASF2972:
+.LASF2971:
 	.string	"ebc_power_status"
 .LASF931:
 	.string	"ratelimit"
@@ -68572,13 +68854,13 @@
 	.string	"sigval_t"
 .LASF1902:
 	.string	"fa_file"
-.LASF2993:
+.LASF2992:
 	.string	"panel"
 .LASF2956:
 	.string	"auto_need_refresh1"
 .LASF2401:
 	.string	"irq_data"
-.LASF3089:
+.LASF3088:
 	.string	"old_buffer_temp"
 .LASF2674:
 	.string	"sysctl_memory_failure_recovery"
@@ -68594,13 +68876,13 @@
 	.string	"get_overlay_image_area"
 .LASF1945:
 	.string	"quota_read"
-.LASF3085:
+.LASF3084:
 	.string	"check_diff_percent"
 .LASF2694:
 	.string	"st_shndx"
 .LASF2368:
 	.string	"free"
-.LASF3053:
+.LASF3052:
 	.string	"pmic_vcom_write"
 .LASF2102:
 	.string	"attribute"
@@ -68670,7 +68952,7 @@
 	.string	"path"
 .LASF2696:
 	.string	"st_size"
-.LASF3014:
+.LASF3013:
 	.string	"dev_attr_ebc_buf_state"
 .LASF189:
 	.string	"rmtp"
@@ -68710,7 +68992,7 @@
 	.string	"unlink"
 .LASF2686:
 	.string	"d_ptr"
-.LASF3055:
+.LASF3054:
 	.string	"pmic_temp_read"
 .LASF1621:
 	.string	"dqstats"
@@ -68854,7 +69136,7 @@
 	.string	"algo_data"
 .LASF1480:
 	.string	"node_zones"
-.LASF3011:
+.LASF3010:
 	.string	"dev_attr_pmic_vcom"
 .LASF1528:
 	.string	"initialized"
@@ -68978,7 +69260,7 @@
 	.string	"totalram_pages"
 .LASF2455:
 	.string	"i2c_smbus_data"
-.LASF2975:
+.LASF2974:
 	.string	"curr_dsp_buf"
 .LASF1039:
 	.string	"time_slice"
@@ -69016,7 +69298,7 @@
 	.string	"wake_lock"
 .LASF2239:
 	.string	"may_skip_resume"
-.LASF2987:
+.LASF2985:
 	.string	"is_deep_sleep"
 .LASF1143:
 	.string	"shrinker"
@@ -69044,13 +69326,13 @@
 	.string	"in_hrtirq"
 .LASF503:
 	.string	"s_master_keys"
-.LASF2977:
+.LASF2976:
 	.string	"curr_osd_buf"
 .LASF767:
 	.string	"ate_match_local_cap_id"
 .LASF2422:
 	.string	"property"
-.LASF3048:
+.LASF3047:
 	.string	"ebc_sysfs_init"
 .LASF962:
 	.string	"wchar"
@@ -69116,7 +69398,7 @@
 	.string	"hrtimer_clock_base"
 .LASF1028:
 	.string	"vruntime"
-.LASF3094:
+.LASF3093:
 	.string	"diff_count"
 .LASF2247:
 	.string	"disable_depth"
@@ -69130,7 +69412,7 @@
 	.string	"min_free_kbytes"
 .LASF1240:
 	.string	"units"
-.LASF3264:
+.LASF3263:
 	.string	"epd_lut_from_mem_init"
 .LASF312:
 	.string	"__nosave_begin"
@@ -69196,17 +69478,17 @@
 	.string	"WORKINGSET_REFAULT"
 .LASF1609:
 	.string	"dqi_dirty_list"
-.LASF3050:
+.LASF3049:
 	.string	"ebc_buf_state_read"
 .LASF230:
 	.string	"prove_locking"
 .LASF2760:
 	.string	"mod_tree_node"
-.LASF3049:
+.LASF3048:
 	.string	"auto_frame_state_read"
 .LASF2554:
 	.string	"regfunc"
-.LASF2970:
+.LASF2969:
 	.string	"auto_wf_index"
 .LASF242:
 	.string	"code"
@@ -69258,7 +69540,7 @@
 	.string	"boost_expires"
 .LASF2884:
 	.string	"DMA_BIDIRECTIONAL"
-.LASF3296:
+.LASF3295:
 	.string	"__arch_copy_to_user"
 .LASF236:
 	.string	"spinlock"
@@ -69276,13 +69558,13 @@
 	.string	"d_compare"
 .LASF942:
 	.string	"vm_mm"
-.LASF3090:
+.LASF3089:
 	.string	"need_refresh"
 .LASF2789:
 	.string	"platform_bus_type"
 .LASF3115:
 	.string	"data_buf"
-.LASF3039:
+.LASF3038:
 	.string	"ulogo_buf"
 .LASF3308:
 	.string	"__msecs_to_jiffies"
@@ -69374,7 +69656,7 @@
 	.string	"page_ext_operations"
 .LASF2632:
 	.string	"KSWAPD_HIGH_WMARK_HIT_QUICKLY"
-.LASF3051:
+.LASF3050:
 	.string	"ebc_state_read"
 .LASF3287:
 	.string	"__stack_chk_fail"
@@ -69414,7 +69696,7 @@
 	.string	"thaw_noirq"
 .LASF940:
 	.string	"vm_rb"
-.LASF3023:
+.LASF3022:
 	.string	"kernel_read_file_str"
 .LASF568:
 	.string	"init_user_ns"
@@ -69458,7 +69740,7 @@
 	.string	"cb_state"
 .LASF2894:
 	.string	"orig_nents"
-.LASF3068:
+.LASF3067:
 	.string	"buf_addr"
 .LASF413:
 	.string	"d_sb"
@@ -69526,6 +69808,8 @@
 	.string	"async_put_work"
 .LASF2085:
 	.string	"kernfs_syscall_ops"
+.LASF2991:
+	.string	"ebc_last_display"
 .LASF1826:
 	.string	"mknod"
 .LASF152:
@@ -69568,7 +69852,7 @@
 	.string	"writeback_control"
 .LASF1873:
 	.string	"fl_end"
-.LASF3301:
+.LASF3300:
 	.string	"ebc_find_buf_by_phy_addr"
 .LASF1920:
 	.string	"super_operations"
@@ -69658,7 +69942,7 @@
 	.string	"fl_owner"
 .LASF2817:
 	.string	"WF_TYPE_GLD16"
-.LASF2988:
+.LASF2986:
 	.string	"is_power_off"
 .LASF950:
 	.string	"vm_private_data"
@@ -69688,7 +69972,7 @@
 	.string	"ino_warnlimit"
 .LASF1488:
 	.string	"pfmemalloc_wait"
-.LASF2979:
+.LASF2977:
 	.string	"waiting_new_buf_time"
 .LASF115:
 	.string	"fasync"
@@ -69712,7 +69996,7 @@
 	.string	"holders_dir"
 .LASF3081:
 	.string	"__wq_entry"
-.LASF3086:
+.LASF3085:
 	.string	"new_buffer"
 .LASF464:
 	.string	"i_fsnotify_mask"
@@ -69732,7 +70016,7 @@
 	.string	"__ilog2_u64"
 .LASF547:
 	.string	"compat_time_t"
-.LASF2980:
+.LASF2978:
 	.string	"ebc_mode"
 .LASF400:
 	.string	"d_alias"
@@ -69848,7 +70132,7 @@
 	.string	"clone_mnt_data"
 .LASF2746:
 	.string	"module_kobject"
-.LASF3044:
+.LASF3043:
 	.string	"memory"
 .LASF3209:
 	.string	"order"
@@ -69856,7 +70140,7 @@
 	.string	"active_memcg"
 .LASF1301:
 	.string	"def_flags"
-.LASF2994:
+.LASF2993:
 	.string	"global_ebc"
 .LASF1442:
 	.string	"NR_SLAB_UNRECLAIMABLE"
@@ -69886,7 +70170,7 @@
 	.string	"EPD_A2"
 .LASF2071:
 	.string	"kernfs_elem_attr"
-.LASF3088:
+.LASF3087:
 	.string	"new_buffer_temp"
 .LASF2268:
 	.string	"set_latency_tolerance"
@@ -69922,7 +70206,7 @@
 	.string	"policy"
 .LASF1262:
 	.string	"shared"
-.LASF3017:
+.LASF3016:
 	.string	"ebc_match"
 .LASF2922:
 	.string	"dclk"
@@ -69952,7 +70236,7 @@
 	.string	"__con_initcall_start"
 .LASF1686:
 	.string	"get_dqblk"
-.LASF3029:
+.LASF3028:
 	.string	"ebc_tcon_node"
 .LASF2786:
 	.string	"id_entry"
@@ -69980,7 +70264,7 @@
 	.string	"quota_format_ops"
 .LASF3309:
 	.string	"ebc_osd_buf_get"
-.LASF3065:
+.LASF3064:
 	.string	"argp"
 .LASF1723:
 	.string	"args"
@@ -70006,7 +70290,7 @@
 	.string	"width"
 .LASF900:
 	.string	"_addr_pkey"
-.LASF3058:
+.LASF3057:
 	.string	"waveform_buffer"
 .LASF297:
 	.string	"__start_rodata"
@@ -70024,7 +70308,7 @@
 	.string	"utime"
 .LASF1303:
 	.string	"start_code"
-.LASF3018:
+.LASF3017:
 	.string	"ebc_driver"
 .LASF2574:
 	.string	"dev_page_free_t"
@@ -70060,7 +70344,7 @@
 	.string	"cpumask_t"
 .LASF134:
 	.string	"kmsg_fops"
-.LASF3297:
+.LASF3301:
 	.string	"ebc_buf_release"
 .LASF1994:
 	.string	"simple_symlink_inode_operations"
@@ -70124,7 +70408,7 @@
 	.string	"fops"
 .LASF1242:
 	.string	"f_path"
-.LASF3266:
+.LASF3265:
 	.string	"kthread_create_on_node"
 .LASF711:
 	.string	"cgroups"
@@ -70148,7 +70432,7 @@
 	.string	"userspace_clients"
 .LASF2112:
 	.string	"uevent_seqnum"
-.LASF3262:
+.LASF3272:
 	.string	"memset"
 .LASF3173:
 	.string	"cur_image_addr"
@@ -70184,7 +70468,7 @@
 	.string	"file_lock_operations"
 .LASF344:
 	.string	"tp_value"
-.LASF3026:
+.LASF3025:
 	.string	"ebc_remove"
 .LASF1862:
 	.string	"fl_list"
@@ -70216,7 +70500,7 @@
 	.string	"panel_16bit"
 .LASF1291:
 	.string	"page_table_lock"
-.LASF3016:
+.LASF3015:
 	.string	"ebc_pm"
 .LASF2809:
 	.string	"sched_priority"
@@ -70336,13 +70620,13 @@
 	.string	"d_rt_space"
 .LASF265:
 	.string	"name"
-.LASF3271:
+.LASF3270:
 	.string	"mod_timer"
 .LASF151:
 	.string	"early_boot_irqs_disabled"
 .LASF658:
 	.string	"nvcsw"
-.LASF3042:
+.LASF3041:
 	.string	"ebc_task_init"
 .LASF2801:
 	.string	"KMALLOC_NORMAL"
@@ -70378,7 +70662,7 @@
 	.string	"self_exec_id"
 .LASF1876:
 	.string	"fl_downgrade_time"
-.LASF2969:
+.LASF2968:
 	.string	"auto_frame_count"
 .LASF2073:
 	.string	"kernfs_ops"
@@ -70408,7 +70692,7 @@
 	.string	"close"
 .LASF3153:
 	.string	"image_fb_data"
-.LASF3040:
+.LASF3039:
 	.string	"klogo_buf"
 .LASF2864:
 	.string	"EPD_POWER_OFF"
@@ -70444,7 +70728,7 @@
 	.string	"split"
 .LASF709:
 	.string	"cpuset_mem_spread_rotor"
-.LASF2990:
+.LASF2988:
 	.string	"overlay_bg_update"
 .LASF2008:
 	.string	"assoc_array"
@@ -70472,7 +70756,7 @@
 	.string	"map_sg"
 .LASF1128:
 	.string	"nlink"
-.LASF3035:
+.LASF3034:
 	.string	"ulogo_addr_valid"
 .LASF2546:
 	.string	"percpu_ref"
@@ -70500,7 +70784,7 @@
 	.string	"mems_allowed_seq"
 .LASF1739:
 	.string	"refcnt"
-.LASF3092:
+.LASF3091:
 	.string	"pbuf_new"
 .LASF2150:
 	.string	"thaw"
@@ -70516,7 +70800,7 @@
 	.string	"futex"
 .LASF996:
 	.string	"wait_max"
-.LASF3269:
+.LASF3268:
 	.string	"wakeup_source_add"
 .LASF3192:
 	.string	"ebc_pmic_suspend"
@@ -70532,7 +70816,7 @@
 	.string	"mapping"
 .LASF3224:
 	.string	"resource_size"
-.LASF3267:
+.LASF3266:
 	.string	"wake_up_process"
 .LASF1323:
 	.string	"kioctx_table"
@@ -70632,7 +70916,7 @@
 	.string	"core_state"
 .LASF839:
 	.string	"timerqueue_head"
-.LASF3268:
+.LASF3267:
 	.string	"sched_setscheduler_nocheck"
 .LASF1260:
 	.string	"f_wb_err"
@@ -70670,7 +70954,7 @@
 	.string	"device_driver"
 .LASF667:
 	.string	"real_cred"
-.LASF3084:
+.LASF3097:
 	.string	"one_buffer_start"
 .LASF2417:
 	.string	"fwnode_endpoint"
@@ -70718,7 +71002,7 @@
 	.string	"hbp_break"
 .LASF3159:
 	.string	"osd_data"
-.LASF3031:
+.LASF3030:
 	.string	"pmic_node"
 .LASF139:
 	.string	"panic_blink"
@@ -70782,7 +71066,7 @@
 	.string	"__s8"
 .LASF353:
 	.string	"fault_code"
-.LASF3008:
+.LASF3007:
 	.string	"dev_attr_waveform_version"
 .LASF2180:
 	.string	"dma_mask"
@@ -70982,7 +71266,7 @@
 	.string	"sigpending"
 .LASF2183:
 	.string	"dma_pfn_offset"
-.LASF3002:
+.LASF3001:
 	.string	"resume_frame_count"
 .LASF1158:
 	.string	"radix_tree_node"
@@ -70990,7 +71274,7 @@
 	.string	"sign_extend64"
 .LASF2282:
 	.string	"wake_irq"
-.LASF3033:
+.LASF3032:
 	.string	"ulogo_addr"
 .LASF830:
 	.string	"pcpu_fc"
@@ -71020,7 +71304,7 @@
 	.string	"pgdat"
 .LASF2578:
 	.string	"page_cluster"
-.LASF3015:
+.LASF3014:
 	.string	"dev_attr_auto_frame_state"
 .LASF1601:
 	.string	"dqb_ihardlimit"
@@ -71028,7 +71312,7 @@
 	.string	"d_lockref"
 .LASF2211:
 	.string	"rpm_request"
-.LASF3064:
+.LASF3063:
 	.string	"ebc_io_ctl"
 .LASF1118:
 	.string	"addr"
@@ -71060,7 +71344,7 @@
 	.string	"begin"
 .LASF2705:
 	.string	"sh_link"
-.LASF3024:
+.LASF3023:
 	.string	"ebc_suspend"
 .LASF2326:
 	.string	"cls_msk"
@@ -71082,13 +71366,13 @@
 	.string	"num_resources"
 .LASF1544:
 	.string	"notifier_fn_t"
-.LASF3032:
+.LASF3031:
 	.string	"pmic_client"
 .LASF2540:
 	.string	"miscdevice"
 .LASF655:
 	.string	"time_in_state"
-.LASF3041:
+.LASF3040:
 	.string	"ebc_logo_init"
 .LASF1237:
 	.string	"kill"
@@ -71120,13 +71404,13 @@
 	.string	"i_blkbits"
 .LASF2424:
 	.string	"value"
-.LASF2985:
+.LASF2983:
 	.string	"frame_timer"
 .LASF2842:
 	.string	"needpic"
 .LASF1003:
 	.string	"sum_sleep_runtime"
-.LASF3037:
+.LASF3036:
 	.string	"ulogo_addr_str"
 .LASF3113:
 	.string	"flip"
@@ -71210,7 +71494,7 @@
 	.string	"__pm_stay_awake"
 .LASF2533:
 	.string	"vmap_area_list"
-.LASF2998:
+.LASF2997:
 	.string	"ebc_auto_thread_sem"
 .LASF629:
 	.string	"in_execve"
@@ -71348,7 +71632,7 @@
 	.string	"RPM_RESUMING"
 .LASF471:
 	.string	"d_weak_revalidate"
-.LASF2974:
+.LASF2973:
 	.string	"prev_dsp_buf"
 .LASF1461:
 	.string	"NR_VMSCAN_IMMEDIATE"
@@ -71370,15 +71654,15 @@
 	.string	"write_begin"
 .LASF2197:
 	.string	"groups"
-.LASF3046:
+.LASF3045:
 	.string	"need_res_size"
 .LASF693:
 	.string	"pi_blocked_on"
-.LASF3028:
+.LASF3027:
 	.string	"ebc_probe"
 .LASF501:
 	.string	"s_xattr"
-.LASF3038:
+.LASF3037:
 	.string	"klogo_addr_str"
 .LASF963:
 	.string	"syscr"
@@ -71436,7 +71720,7 @@
 	.string	"maj_flt"
 .LASF229:
 	.string	"arch_rwlock_t"
-.LASF3298:
+.LASF3297:
 	.string	"ebc_osd_buf_clone"
 .LASF162:
 	.string	"c_false"
@@ -71478,7 +71762,7 @@
 	.string	"high_memory"
 .LASF49:
 	.string	"int32_t"
-.LASF3020:
+.LASF3019:
 	.string	"__exitcall_ebc_exit"
 .LASF1010:
 	.string	"nr_failed_migrations_running"
@@ -71520,7 +71804,7 @@
 	.string	"lock_key"
 .LASF2531:
 	.string	"tramp_pg_dir"
-.LASF3012:
+.LASF3011:
 	.string	"dev_attr_ebc_version"
 .LASF834:
 	.string	"PCPU_FC_NR"
@@ -71646,7 +71930,7 @@
 	.string	"robust_list"
 .LASF1683:
 	.string	"quota_disable"
-.LASF3059:
+.LASF3058:
 	.string	"waveform_open"
 .LASF2024:
 	.string	"serial_node"
@@ -71764,7 +72048,7 @@
 	.string	"__MAX_NR_ZONES"
 .LASF2432:
 	.string	"irq_fwspec"
-.LASF3006:
+.LASF3005:
 	.string	"waveform_ops"
 .LASF1773:
 	.string	"iov_iter"
@@ -71832,7 +72116,7 @@
 	.string	"Elf64_Half"
 .LASF2255:
 	.string	"use_autosuspend"
-.LASF3021:
+.LASF3020:
 	.string	"ebc_init"
 .LASF674:
 	.string	"nsproxy"
@@ -71874,7 +72158,7 @@
 	.string	"__fls"
 .LASF1098:
 	.string	"ioprio"
-.LASF2986:
+.LASF2984:
 	.string	"is_early_suspend"
 .LASF1132:
 	.string	"rdev"
@@ -71946,7 +72230,7 @@
 	.string	"symlink"
 .LASF1543:
 	.string	"mem_map"
-.LASF3087:
+.LASF3086:
 	.string	"old_buffer"
 .LASF2929:
 	.string	"lut_data_set"
@@ -72050,7 +72334,7 @@
 	.string	"flc_lease"
 .LASF2375:
 	.string	"unmap_resource"
-.LASF2982:
+.LASF2980:
 	.string	"wake_lock_is_set"
 .LASF2327:
 	.string	"driver_private"
@@ -72096,7 +72380,7 @@
 	.string	"pstate_check_t"
 .LASF801:
 	.string	"system_freezable_power_efficient_wq"
-.LASF3025:
+.LASF3024:
 	.string	"__func__"
 .LASF57:
 	.string	"resource_size_t"
@@ -72108,7 +72392,7 @@
 	.string	"suid"
 .LASF2444:
 	.string	"irq_domain_ops"
-.LASF2991:
+.LASF2989:
 	.string	"overlay_bg_control"
 .LASF930:
 	.string	"locked_vm"
@@ -72134,12 +72418,12 @@
 	.string	"mmap_rnd_compat_bits_max"
 .LASF41:
 	.string	"clockid_t"
-.LASF3019:
-	.string	"__addressable_ebc_init3783"
 .LASF1576:
 	.string	"dq_free"
 .LASF1550:
 	.string	"reboot_notifier_list"
+.LASF3018:
+	.string	"__addressable_ebc_init3795"
 .LASF686:
 	.string	"parent_exec_id"
 .LASF2472:
@@ -72152,7 +72436,7 @@
 	.string	"page_entry_size"
 .LASF2964:
 	.string	"lut_data"
-.LASF3061:
+.LASF3060:
 	.string	"ebc_other_init"
 .LASF1415:
 	.string	"free_list"
@@ -72336,7 +72620,7 @@
 	.string	"shift"
 .LASF1406:
 	.string	"ia_gid"
-.LASF3095:
+.LASF3094:
 	.string	"vaild_size"
 .LASF36:
 	.string	"name_offset"
@@ -72358,7 +72642,7 @@
 	.string	"thread_id"
 .LASF732:
 	.string	"default_timer_slack_ns"
-.LASF3057:
+.LASF3056:
 	.string	"waveform_version_read"
 .LASF1736:
 	.string	"source_list"
@@ -72394,7 +72678,7 @@
 	.string	"loops_per_jiffy"
 .LASF2479:
 	.string	"i2c_algorithm"
-.LASF3091:
+.LASF3090:
 	.string	"check_size"
 .LASF3167:
 	.string	"ebc_get_8pix_wf3"
@@ -72454,13 +72738,13 @@
 	.string	"statfs"
 .LASF3274:
 	.string	"__kmalloc"
-.LASF3263:
+.LASF3262:
 	.string	"_dev_err"
 .LASF3253:
 	.string	"__platform_driver_register"
 .LASF2948:
 	.string	"ebc_buf_real_size"
-.LASF2997:
+.LASF2996:
 	.string	"ebc_thread_wq"
 .LASF1763:
 	.string	"migratepage"
@@ -72486,6 +72770,8 @@
 	.string	"drop_ns"
 .LASF1391:
 	.string	"sysctl_protected_symlinks"
+.LASF3068:
+	.string	"buf_format"
 .LASF2592:
 	.string	"protection_map"
 .LASF2733:
@@ -72510,7 +72796,7 @@
 	.string	"max_comb_1st_msg_len"
 .LASF1514:
 	.string	"ZONE_MOVABLE"
-.LASF3005:
+.LASF3004:
 	.string	"ebc_misc"
 .LASF2361:
 	.string	"revmap_size"
@@ -72564,7 +72850,7 @@
 	.string	"d_real"
 .LASF2529:
 	.string	"swapper_pg_end"
-.LASF3009:
+.LASF3008:
 	.string	"dev_attr_pmic_name"
 .LASF631:
 	.string	"in_user_fault"
@@ -72644,13 +72930,13 @@
 	.string	"__idmap_text_start"
 .LASF1685:
 	.string	"set_info"
-.LASF3063:
+.LASF3062:
 	.string	"ebc_mmap"
 .LASF2588:
 	.string	"sysctl_admin_reserve_kbytes"
 .LASF788:
 	.string	"timer_list"
-.LASF2992:
+.LASF2990:
 	.string	"resume_count_enable"
 .LASF1653:
 	.string	"d_ino_warns"
@@ -72658,7 +72944,7 @@
 	.string	"lock_ops"
 .LASF1295:
 	.string	"hiwater_vm"
-.LASF3054:
+.LASF3053:
 	.string	"pmic_vcom_read"
 .LASF3255:
 	.string	"misc_deregister"
@@ -72702,9 +72988,9 @@
 	.string	"i_rt_spc_timelimit"
 .LASF140:
 	.string	"oops_in_progress"
-.LASF3004:
+.LASF3003:
 	.string	"ebc_ops"
-.LASF3034:
+.LASF3033:
 	.string	"klogo_addr"
 .LASF1620:
 	.string	"qf_next"
@@ -72728,7 +73014,7 @@
 	.string	"personality"
 .LASF1794:
 	.string	"bd_queue"
-.LASF3022:
+.LASF3021:
 	.string	"ebc_resume"
 .LASF2798:
 	.string	"init_task"
@@ -72830,7 +73116,7 @@
 	.string	"sve_vl"
 .LASF2623:
 	.string	"PGSTEAL_KSWAPD"
-.LASF3036:
+.LASF3035:
 	.string	"klogo_addr_valid"
 .LASF2571:
 	.string	"MEMORY_DEVICE_PUBLIC"
@@ -72928,9 +73214,9 @@
 	.string	"procname"
 .LASF3131:
 	.string	"point_data"
-.LASF3265:
+.LASF3264:
 	.string	"epd_lut_from_file_init"
-.LASF3000:
+.LASF2999:
 	.string	"ebc_auto_assist_thread_sem"
 .LASF1638:
 	.string	"mark_dirty"
@@ -72960,7 +73246,7 @@
 	.string	"qc_info"
 .LASF3074:
 	.string	"ebc_thread"
-.LASF3093:
+.LASF3092:
 	.string	"pbuf_old"
 .LASF2860:
 	.string	"EPD_A2_ENTER"
@@ -72980,7 +73266,7 @@
 	.string	"win_y1"
 .LASF2841:
 	.string	"win_y2"
-.LASF3097:
+.LASF3096:
 	.string	"buf_size"
 .LASF2057:
 	.string	"bitmap"
@@ -73018,7 +73304,7 @@
 	.string	"MIGRATE_SYNC_LIGHT"
 .LASF1008:
 	.string	"nr_migrations_cold"
-.LASF3052:
+.LASF3051:
 	.string	"ebc_version_read"
 .LASF304:
 	.string	"__end_once"
@@ -73170,7 +73456,7 @@
 	.string	"lock_stat"
 .LASF2363:
 	.string	"revmap_tree_mutex"
-.LASF3056:
+.LASF3055:
 	.string	"pmic_name_read"
 .LASF1050:
 	.string	"dl_throttled"
@@ -73196,7 +73482,7 @@
 	.string	"dma_configure"
 .LASF2261:
 	.string	"runtime_error"
-.LASF3067:
+.LASF3066:
 	.string	"temp_offset"
 .LASF920:
 	.string	"__count"
@@ -73224,7 +73510,7 @@
 	.string	"text_size"
 .LASF1622:
 	.string	"stat"
-.LASF2973:
+.LASF2972:
 	.string	"lut_ddr_vir"
 .LASF1290:
 	.string	"map_count"
@@ -73232,7 +73518,7 @@
 	.string	"pdeath_signal"
 .LASF620:
 	.string	"exit_signal"
-.LASF3299:
+.LASF3298:
 	.string	"ebc_add_to_osd_buf_list"
 .LASF2825:
 	.string	"frame_num"
@@ -73324,7 +73610,7 @@
 	.string	"gp_count"
 .LASF2020:
 	.string	"key_restriction"
-.LASF3096:
+.LASF3095:
 	.string	"check_part_mode"
 .LASF618:
 	.string	"exit_state"
@@ -73356,7 +73642,7 @@
 	.string	"fs_supers"
 .LASF1100:
 	.string	"last_waited"
-.LASF3062:
+.LASF3061:
 	.string	"ebc_open"
 .LASF3177:
 	.string	"three_win_mode"
@@ -73366,7 +73652,7 @@
 	.string	"dqb_bsoftlimit"
 .LASF219:
 	.string	"pending"
-.LASF2971:
+.LASF2970:
 	.string	"direct_buffer"
 .LASF2461:
 	.string	"i2c_client_type"
diff --git a/kernel/drivers/gpu/drm/rockchip/ebc-dev/ebc_dev_y8_v8.S b/kernel/drivers/gpu/drm/rockchip/ebc-dev/ebc_dev_y8_v8.S
new file mode 100644
index 0000000..c63eee0
--- /dev/null
+++ b/kernel/drivers/gpu/drm/rockchip/ebc-dev/ebc_dev_y8_v8.S
@@ -0,0 +1,74565 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright (c) 2020 Rockchip Electronics Co. Ltd.
+ *
+ * Author: Zorro Liu <zorro.liu@rock-chips.com>
+ */
+
+	.arch armv8-a
+	.file	"ebc_dev.c"
+	.text
+.Ltext0:
+	.cfi_sections	.debug_frame
+#APP
+	.section	".initcall6s.init", "a"	
+__initcall_ebc_init6s:			
+.long	ebc_init - .			
+.previous					
+
+#NO_APP
+	.align	2
+	.p2align 3,,7
+	.type	get_overlay_image_area, %function
+get_overlay_image_area:
+.LFB2822:
+	.file 1 "drivers/gpu/drm/rockchip/ebc-dev/ebc_dev.c"
+	.loc 1 760 0
+	.cfi_startproc
+.LVL0:
+	stp	x29, x30, [sp, -128]!
+	.cfi_def_cfa_offset 128
+	.cfi_offset 29, -128
+	.cfi_offset 30, -120
+	.loc 1 761 0
+	adrp	x6, .LANCHOR0
+	.loc 1 760 0
+	add	x29, sp, 0
+	.cfi_def_cfa_register 29
+	stp	x25, x26, [sp, 64]
+	.cfi_offset 25, -64
+	.cfi_offset 26, -56
+	.loc 1 761 0
+	ldr	x26, [x6, #:lo12:.LANCHOR0]
+	.loc 1 760 0
+	str	x0, [x29, 104]
+	.loc 1 784 0
+	ldr	x0, [x5, 240]
+.LVL1:
+	.loc 1 776 0
+	add	x26, x26, 24
+	.loc 1 760 0
+	stp	x19, x20, [sp, 16]
+	stp	x21, x22, [sp, 32]
+	stp	x27, x28, [sp, 80]
+	stp	x23, x24, [sp, 48]
+	.cfi_offset 19, -112
+	.cfi_offset 20, -104
+	.cfi_offset 21, -96
+	.cfi_offset 22, -88
+	.cfi_offset 27, -48
+	.cfi_offset 28, -40
+	.cfi_offset 23, -80
+	.cfi_offset 24, -72
+	.loc 1 789 0
+	ldr	w19, [x5, 96]
+	.loc 1 786 0
+	ldp	w7, w23, [x0, 48]
+	.loc 1 789 0
+	add	w27, w19, 7
+	.loc 1 776 0
+	ldr	w6, [x26, 156]
+	str	w6, [x29, 124]
+	.loc 1 784 0
+	cmp	w7, 0
+	.loc 1 787 0
+	ldp	w6, w28, [x0, 56]
+	.loc 1 784 0
+	add	w25, w7, 7
+	csel	w25, w25, w7, lt
+	.loc 1 790 0
+	ldr	w0, [x5, 92]
+	.loc 1 785 0
+	cmp	w6, 0
+	add	w21, w6, 7
+	csel	w21, w21, w6, lt
+	.loc 1 789 0
+	cmp	w19, 0
+	csel	w27, w27, w19, lt
+	.loc 1 785 0
+	asr	w21, w21, 3
+	add	w21, w21, 1
+.LVL2:
+	.loc 1 789 0
+	asr	w27, w27, 3
+.LVL3:
+	.loc 1 792 0
+	cmp	w21, w27
+	sub	w6, w27, #1
+	csel	w21, w6, w21, ge
+.LVL4:
+	.loc 1 794 0
+	cmp	w28, w0
+	sub	w0, w0, #1
+.LVL5:
+	csel	w28, w0, w28, ge
+.LVL6:
+	.loc 1 796 0
+	cmp	w28, w23
+	blt	.L1
+	asr	w25, w25, 3
+.LVL7:
+	.loc 1 815 0
+	mov	w22, 1
+	lsl	w0, w25, 1
+	str	w0, [x29, 120]
+	lsl	w0, w25, 3
+	str	w0, [x29, 116]
+	.loc 1 797 0
+	ldr	w0, [x29, 124]
+	mul	w20, w23, w27
+	.loc 1 896 0
+	mov	w30, w22
+	.loc 1 797 0
+	cbz	w0, .L6
+.LVL8:
+	.p2align 2
+.L50:
+	.loc 1 798 0
+	ldp	w0, w15, [x26, 84]
+.LVL9:
+	sub	w15, w15, #1
+	sub	w15, w15, w23
+	mul	w15, w15, w0
+	ldr	x0, [x29, 104]
+.LVL10:
+	lsr	w15, w15, 2
+	add	x15, x0, x15
+.LVL11:
+.L7:
+	.loc 1 803 0
+	mul	w19, w23, w19
+	.loc 1 806 0
+	mov	w10, w25
+	cmp	w21, w25
+	ldp	w14, w11, [x29, 116]
+	.loc 1 803 0
+	sxtw	x19, w19
+	.loc 1 806 0
+	blt	.L20
+.LVL12:
+	.p2align 2
+.L37:
+	.loc 1 810 0
+	sbfiz	x0, x10, 3, 32
+.LVL13:
+	add	x0, x0, x20, sxtw 3
+	ldr	x8, [x1, x0]
+	.loc 1 811 0
+	ldr	x7, [x2, x0]
+	.loc 1 814 0
+	cmp	x8, x7
+	beq	.L10
+	add	x9, x19, x14, sxtw
+	.loc 1 809 0
+	ldrb	w13, [x15, w11, sxtw]
+	.loc 1 816 0
+	eor	x6, x8, x7
+.LVL14:
+	.loc 1 815 0
+	str	w22, [x5, 60]
+	.loc 1 818 0
+	and	x0, x6, 255
+	.loc 1 807 0
+	add	x12, x15, x11, sxtw
+	.loc 1 818 0
+	cmp	x0, 0
+	ldrb	w0, [x3, x9]
+	.loc 1 813 0
+	add	x16, x4, x9
+	.loc 1 818 0
+	ccmp	w0, 0, 0, ne
+	.loc 1 812 0
+	add	x0, x3, x9
+.LVL15:
+	.loc 1 818 0
+	bne	.L11
+	.loc 1 820 0
+	ldrb	w17, [x4, x9]
+	.loc 1 821 0
+	ubfx	x24, x8, 3, 5
+	.loc 1 820 0
+	add	x17, x17, 16
+	.loc 1 821 0
+	ldr	x18, [x5, x17, lsl 3]
+	lsl	x17, x7, 2
+	and	x17, x17, 992
+	orr	x17, x17, x24
+	.loc 1 822 0
+	ldrb	w17, [x18, x17]
+	.loc 1 823 0
+	strb	w22, [x3, x9]
+	.loc 1 822 0
+	orr	w13, w17, w13
+.L11:
+	.loc 1 828 0
+	ldrb	w9, [x0, 1]
+	tst	x6, 65280
+	ccmp	w9, 0, 0, ne
+	bne	.L12
+	.loc 1 830 0
+	ldrb	w9, [x16, 1]
+	.loc 1 831 0
+	ubfx	x18, x8, 11, 5
+	.loc 1 830 0
+	add	x9, x9, 16
+	.loc 1 831 0
+	ldr	x17, [x5, x9, lsl 3]
+	lsr	x9, x7, 6
+	and	x9, x9, 992
+	orr	x9, x9, x18
+	.loc 1 832 0
+	ldrb	w9, [x17, x9]
+	.loc 1 833 0
+	strb	w30, [x0, 1]
+	.loc 1 832 0
+	orr	w13, w13, w9, lsl 2
+	and	w13, w13, 255
+.L12:
+	.loc 1 838 0
+	ldrb	w9, [x0, 2]
+	tst	x6, 16711680
+	ccmp	w9, 0, 0, ne
+	bne	.L13
+	.loc 1 840 0
+	ldrb	w9, [x16, 2]
+	.loc 1 841 0
+	ubfx	x18, x8, 19, 5
+	.loc 1 840 0
+	add	x9, x9, 16
+	.loc 1 841 0
+	ldr	x17, [x5, x9, lsl 3]
+	lsr	x9, x7, 14
+	and	x9, x9, 992
+	orr	x9, x9, x18
+	.loc 1 842 0
+	ldrb	w9, [x17, x9]
+	.loc 1 843 0
+	strb	w30, [x0, 2]
+	.loc 1 842 0
+	orr	w13, w13, w9, lsl 4
+	and	w13, w13, 255
+.L13:
+	.loc 1 848 0
+	ldrb	w9, [x0, 3]
+	tst	x6, 4278190080
+	ccmp	w9, 0, 0, ne
+	bne	.L14
+	.loc 1 850 0
+	ldrb	w9, [x16, 3]
+	.loc 1 851 0
+	lsr	w18, w8, 27
+	.loc 1 850 0
+	add	x9, x9, 16
+	.loc 1 851 0
+	ldr	x17, [x5, x9, lsl 3]
+	lsr	x9, x7, 22
+	and	x9, x9, 992
+	orr	x9, x9, x18
+	.loc 1 852 0
+	ldrb	w9, [x17, x9]
+	.loc 1 853 0
+	strb	w30, [x0, 3]
+	.loc 1 852 0
+	orr	w13, w13, w9, lsl 6
+	and	w13, w13, 255
+.L14:
+	.loc 1 855 0
+	strb	w13, [x12]
+	.loc 1 861 0
+	tst	x6, 1095216660480
+	.loc 1 857 0
+	ldrb	w9, [x12, 1]
+	.loc 1 861 0
+	ldrb	w13, [x0, 4]
+	ccmp	w13, 0, 0, ne
+	bne	.L15
+	.loc 1 863 0
+	ldrb	w13, [x16, 4]
+	.loc 1 864 0
+	ubfx	x18, x8, 35, 5
+	.loc 1 863 0
+	add	x13, x13, 16
+	.loc 1 864 0
+	ldr	x17, [x5, x13, lsl 3]
+	lsr	x13, x7, 30
+	and	x13, x13, 992
+	orr	x13, x13, x18
+	.loc 1 865 0
+	ldrb	w13, [x17, x13]
+	.loc 1 866 0
+	strb	w30, [x0, 4]
+	.loc 1 865 0
+	orr	w9, w13, w9
+.L15:
+	.loc 1 871 0
+	ldrb	w13, [x0, 5]
+	tst	x6, 280375465082880
+	ccmp	w13, 0, 0, ne
+	bne	.L16
+	.loc 1 873 0
+	ldrb	w13, [x16, 5]
+	.loc 1 874 0
+	ubfx	x18, x8, 43, 5
+	.loc 1 873 0
+	add	x13, x13, 16
+	.loc 1 874 0
+	ldr	x17, [x5, x13, lsl 3]
+	lsr	x13, x7, 38
+	and	x13, x13, 992
+	orr	x13, x13, x18
+	.loc 1 875 0
+	ldrb	w13, [x17, x13]
+	.loc 1 876 0
+	strb	w30, [x0, 5]
+	.loc 1 875 0
+	orr	w9, w9, w13, lsl 2
+	and	w9, w9, 255
+.L16:
+	.loc 1 881 0
+	ldrb	w13, [x0, 6]
+	tst	x6, 71776119061217280
+	ccmp	w13, 0, 0, ne
+	bne	.L17
+	.loc 1 883 0
+	ldrb	w13, [x16, 6]
+	.loc 1 884 0
+	ubfx	x18, x8, 51, 5
+	.loc 1 883 0
+	add	x13, x13, 16
+	.loc 1 884 0
+	ldr	x17, [x5, x13, lsl 3]
+	lsr	x13, x7, 46
+	and	x13, x13, 992
+	orr	x13, x13, x18
+	.loc 1 885 0
+	ldrb	w13, [x17, x13]
+	.loc 1 886 0
+	strb	w30, [x0, 6]
+	.loc 1 885 0
+	orr	w9, w9, w13, lsl 4
+	and	w9, w9, 255
+.L17:
+	.loc 1 891 0
+	tst	x6, -72057594037927936
+	ldrb	w6, [x0, 7]
+.LVL16:
+	ccmp	w6, 0, 0, ne
+	bne	.L18
+	.loc 1 893 0
+	ldrb	w6, [x16, 7]
+	.loc 1 894 0
+	lsr	x7, x7, 54
+.LVL17:
+	and	x7, x7, 992
+	.loc 1 893 0
+	add	x6, x6, 16
+	.loc 1 894 0
+	ldr	x6, [x5, x6, lsl 3]
+	add	x8, x6, x8, lsr 59
+.LVL18:
+	.loc 1 895 0
+	ldrb	w6, [x8, x7]
+	.loc 1 896 0
+	strb	w30, [x0, 7]
+	.loc 1 895 0
+	orr	w9, w9, w6, lsl 6
+	and	w9, w9, 255
+.LVL19:
+.L18:
+	.loc 1 898 0
+	strb	w9, [x12, 1]
+.L10:
+	.loc 1 806 0 discriminator 2
+	add	w10, w10, 1
+	add	w11, w11, 2
+	add	w14, w14, 8
+	cmp	w21, w10
+	bge	.L37
+.LVL20:
+.L20:
+	.loc 1 796 0
+	add	w23, w23, 1
+	add	w20, w20, w27
+	cmp	w28, w23
+	blt	.L1
+	.loc 1 797 0
+	ldr	w0, [x29, 124]
+.LVL21:
+	ldr	w19, [x5, 96]
+	cbnz	w0, .L50
+.L6:
+	.loc 1 800 0
+	ldr	w15, [x26, 84]
+.LVL22:
+	ldr	x0, [x29, 104]
+.LVL23:
+	mul	w15, w23, w15
+	lsr	w15, w15, 2
+	add	x15, x0, x15
+.LVL24:
+	b	.L7
+.LVL25:
+.L1:
+	.loc 1 902 0
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+.LVL26:
+	ldp	x23, x24, [sp, 48]
+.LVL27:
+	ldp	x25, x26, [sp, 64]
+.LVL28:
+	ldp	x27, x28, [sp, 80]
+.LVL29:
+	ldp	x29, x30, [sp], 128
+	.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
+.LFE2822:
+	.size	get_overlay_image_area, .-get_overlay_image_area
+	.align	2
+	.p2align 3,,7
+	.type	get_auto_image, %function
+get_auto_image:
+.LFB2825:
+	.loc 1 1050 0
+	.cfi_startproc
+.LVL30:
+	stp	x29, x30, [sp, -48]!
+	.cfi_def_cfa_offset 48
+	.cfi_offset 29, -48
+	.cfi_offset 30, -40
+	.loc 1 1051 0
+	adrp	x6, .LANCHOR0
+	.loc 1 1070 0
+	cmp	w5, 2
+	.loc 1 1050 0
+	add	x29, sp, 0
+	.cfi_def_cfa_register 29
+	.loc 1 1051 0
+	ldr	x17, [x6, #:lo12:.LANCHOR0]
+	.loc 1 1050 0
+	stp	x19, x20, [sp, 16]
+	.cfi_offset 19, -32
+	.cfi_offset 20, -24
+	.loc 1 1065 0
+	add	x19, x4, 60
+.LVL31:
+	.loc 1 1061 0
+	add	x17, x17, 24
+	.loc 1 1050 0
+	stp	x21, x22, [sp, 32]
+	.cfi_offset 21, -16
+	.cfi_offset 22, -8
+	.loc 1 1058 0
+	ldrb	w13, [x4, 56]
+.LVL32:
+	.loc 1 1068 0
+	ldp	w6, w22, [x17, 84]
+	.loc 1 1061 0
+	ldr	w30, [x17, 156]
+	.loc 1 1067 0
+	lsr	w14, w6, 3
+	.loc 1 1070 0
+	beq	.L106
+	.loc 1 1073 0
+	cmp	w5, 3
+	.loc 1 1080 0
+	mov	w18, 0
+.LVL33:
+	.loc 1 1073 0
+	beq	.L107
+.LVL34:
+.L55:
+	.loc 1 1083 0 discriminator 1
+	cmp	w18, w22
+	bge	.L79
+	sub	w16, w14, #1
+	.loc 1 1083 0 is_stmt 0
+	mov	w8, 0
+.LVL35:
+	add	x16, x16, 1
+	lsl	x16, x16, 3
+	.loc 1 1084 0 is_stmt 1
+	cbz	w30, .L56
+.LVL36:
+	.p2align 2
+.L116:
+	.loc 1 1085 0
+	ldr	w10, [x17, 88]
+	sub	w10, w10, #1
+	sub	w10, w10, w18
+	mul	w10, w10, w6
+	lsr	w10, w10, 2
+	add	x10, x0, x10
+.LVL37:
+.L59:
+	add	x6, x3, 8
+	add	x10, x10, 2
+.LVL38:
+	.loc 1 1089 0 discriminator 1
+	mov	x9, 0
+	cbz	w14, .L58
+	.p2align 2
+.L95:
+	.loc 1 1092 0
+	ldr	x7, [x1, x9, lsl 3]
+	.loc 1 1093 0
+	ldr	x5, [x2, x9, lsl 3]
+.LVL39:
+	.loc 1 1094 0
+	cmp	x7, x5
+	beq	.L60
+	.loc 1 1096 0
+	eor	x8, x7, x5
+.LVL40:
+	.loc 1 1091 0
+	mov	w11, 0
+	.loc 1 1097 0
+	and	x12, x8, 255
+	cbz	x12, .L61
+	.loc 1 1098 0
+	ldrb	w12, [x6, -8]
+	.loc 1 1100 0
+	lsl	x11, x5, 2
+	and	x20, x11, 992
+	ldr	x21, [x4, 128]
+	ubfx	x11, x7, 3, 5
+	orr	x11, x20, x11
+	.loc 1 1099 0
+	lsl	w20, w12, 10
+	.loc 1 1100 0
+	add	x11, x21, x11
+	.loc 1 1102 0
+	add	w12, w12, 1
+	and	w12, w12, 255
+	.loc 1 1103 0
+	cmp	w13, w12
+	.loc 1 1100 0
+	ldrb	w11, [x11, w20, sxtw]
+	.loc 1 1103 0
+	beq	.L108
+.L62:
+	.loc 1 1107 0
+	strb	w12, [x6, -8]
+.L61:
+	.loc 1 1110 0
+	tst	x8, 65280
+	beq	.L63
+	.loc 1 1111 0
+	ldrb	w12, [x6, -7]
+	.loc 1 1113 0
+	lsr	x20, x5, 6
+	and	x21, x20, 992
+	ldr	x15, [x4, 128]
+	ubfx	x20, x7, 11, 5
+	orr	x20, x21, x20
+	.loc 1 1112 0
+	lsl	w21, w12, 10
+	.loc 1 1113 0
+	add	x20, x15, x20
+	.loc 1 1115 0
+	add	w12, w12, 1
+	and	w12, w12, 255
+	.loc 1 1116 0
+	cmp	w13, w12
+	.loc 1 1114 0
+	ldrb	w20, [x20, w21, sxtw]
+	orr	w11, w11, w20, lsl 2
+	and	w11, w11, 255
+	.loc 1 1116 0
+	beq	.L109
+.L64:
+	.loc 1 1120 0
+	strb	w12, [x6, -7]
+.L63:
+	.loc 1 1123 0
+	tst	x8, 16711680
+	beq	.L65
+	.loc 1 1124 0
+	ldrb	w12, [x6, -6]
+	.loc 1 1126 0
+	lsr	x20, x5, 14
+	and	x21, x20, 992
+	ldr	x15, [x4, 128]
+	ubfx	x20, x7, 19, 5
+	orr	x20, x21, x20
+	.loc 1 1125 0
+	lsl	w21, w12, 10
+	.loc 1 1126 0
+	add	x20, x15, x20
+	.loc 1 1128 0
+	add	w12, w12, 1
+	and	w12, w12, 255
+	.loc 1 1129 0
+	cmp	w13, w12
+	.loc 1 1127 0
+	ldrb	w20, [x20, w21, sxtw]
+	orr	w11, w11, w20, lsl 4
+	and	w11, w11, 255
+	.loc 1 1129 0
+	beq	.L110
+.L66:
+	.loc 1 1133 0
+	strb	w12, [x6, -6]
+.L65:
+	.loc 1 1136 0
+	tst	x8, 4278190080
+	beq	.L67
+	.loc 1 1137 0
+	ldrb	w12, [x6, -5]
+	.loc 1 1139 0
+	lsr	x20, x5, 22
+	and	x21, x20, 992
+	ldr	x15, [x4, 128]
+	lsr	w20, w7, 27
+	orr	x20, x21, x20
+	.loc 1 1138 0
+	lsl	w21, w12, 10
+	.loc 1 1139 0
+	add	x20, x15, x20
+	.loc 1 1141 0
+	add	w12, w12, 1
+	and	w12, w12, 255
+	.loc 1 1142 0
+	cmp	w13, w12
+	.loc 1 1140 0
+	ldrb	w20, [x20, w21, sxtw]
+	orr	w11, w11, w20, lsl 6
+	and	w11, w11, 255
+	.loc 1 1142 0
+	beq	.L111
+.L68:
+	.loc 1 1146 0
+	strb	w12, [x6, -5]
+.L67:
+	.loc 1 1149 0
+	strb	w11, [x10, -2]
+	.loc 1 1152 0
+	tst	x8, 1095216660480
+	.loc 1 1151 0
+	mov	w11, 0
+	.loc 1 1152 0
+	beq	.L69
+	.loc 1 1153 0
+	ldrb	w12, [x6, -4]
+	.loc 1 1155 0
+	lsr	x11, x5, 30
+	and	x20, x11, 992
+	ldr	x21, [x4, 128]
+	ubfx	x11, x7, 35, 5
+	orr	x11, x20, x11
+	.loc 1 1154 0
+	lsl	w20, w12, 10
+	.loc 1 1155 0
+	add	x11, x21, x11
+	.loc 1 1157 0
+	add	w12, w12, 1
+	and	w12, w12, 255
+	.loc 1 1158 0
+	cmp	w13, w12
+	.loc 1 1155 0
+	ldrb	w11, [x11, w20, sxtw]
+	.loc 1 1158 0
+	beq	.L112
+.L70:
+	.loc 1 1162 0
+	strb	w12, [x6, -4]
+.L69:
+	.loc 1 1165 0
+	tst	x8, 280375465082880
+	beq	.L71
+	.loc 1 1166 0
+	ldrb	w12, [x6, -3]
+	.loc 1 1168 0
+	lsr	x20, x5, 38
+	and	x21, x20, 992
+	ldr	x15, [x4, 128]
+	ubfx	x20, x7, 43, 5
+	orr	x20, x21, x20
+	.loc 1 1167 0
+	lsl	w21, w12, 10
+	.loc 1 1168 0
+	add	x20, x15, x20
+	.loc 1 1170 0
+	add	w12, w12, 1
+	and	w12, w12, 255
+	.loc 1 1171 0
+	cmp	w13, w12
+	.loc 1 1169 0
+	ldrb	w20, [x20, w21, sxtw]
+	orr	w11, w11, w20, lsl 2
+	and	w11, w11, 255
+	.loc 1 1171 0
+	beq	.L113
+.L72:
+	.loc 1 1175 0
+	strb	w12, [x6, -3]
+.L71:
+	.loc 1 1178 0
+	tst	x8, 71776119061217280
+	beq	.L73
+	.loc 1 1179 0
+	ldrb	w12, [x6, -2]
+	.loc 1 1181 0
+	lsr	x20, x5, 46
+	and	x21, x20, 992
+	ldr	x15, [x4, 128]
+	ubfx	x20, x7, 51, 5
+	orr	x20, x21, x20
+	.loc 1 1180 0
+	lsl	w21, w12, 10
+	.loc 1 1181 0
+	add	x20, x15, x20
+	.loc 1 1183 0
+	add	w12, w12, 1
+	and	w12, w12, 255
+	.loc 1 1184 0
+	cmp	w13, w12
+	.loc 1 1182 0
+	ldrb	w20, [x20, w21, sxtw]
+	orr	w11, w11, w20, lsl 4
+	and	w11, w11, 255
+	.loc 1 1184 0
+	beq	.L114
+.L74:
+	.loc 1 1188 0
+	strb	w12, [x6, -2]
+.L73:
+	.loc 1 1191 0
+	tst	x8, -72057594037927936
+	beq	.L75
+	.loc 1 1192 0
+	ldrb	w20, [x6, -1]
+	.loc 1 1194 0
+	lsr	x21, x5, 54
+	ldr	x8, [x4, 128]
+.LVL41:
+	and	x21, x21, 992
+	.loc 1 1196 0
+	add	w12, w20, 1
+	.loc 1 1193 0
+	ubfiz	x20, x20, 10, 8
+	.loc 1 1196 0
+	and	w12, w12, 255
+	.loc 1 1194 0
+	add	x8, x8, x20
+	.loc 1 1197 0
+	cmp	w13, w12
+	.loc 1 1194 0
+	add	x8, x8, x7, lsr 59
+	.loc 1 1195 0
+	ldrb	w8, [x8, x21]
+	orr	w11, w11, w8, lsl 6
+	and	w11, w11, 255
+	.loc 1 1197 0
+	beq	.L115
+.L76:
+	.loc 1 1201 0
+	strb	w12, [x6, -1]
+.LVL42:
+.L75:
+	.loc 1 1204 0
+	str	x5, [x2, x9, lsl 3]
+	.loc 1 1095 0
+	mov	w8, 1
+.LVL43:
+	.loc 1 1205 0
+	strb	w11, [x10, -1]
+.L77:
+	add	x9, x9, 1
+	add	x6, x6, 8
+	add	x10, x10, 2
+	.loc 1 1089 0 discriminator 2
+	cmp	w14, w9
+	bgt	.L95
+	add	x3, x3, x16
+	add	x2, x2, x16
+	add	x1, x1, x16
+.LVL44:
+.L58:
+	.loc 1 1083 0
+	add	w18, w18, 1
+	cmp	w22, w18
+	beq	.L53
+	ldr	w6, [x17, 84]
+	.loc 1 1084 0
+	cbnz	w30, .L116
+.L56:
+	.loc 1 1087 0
+	mul	w10, w18, w6
+	lsr	w10, w10, 2
+	add	x10, x0, x10
+.LVL45:
+	b	.L59
+.LVL46:
+	.p2align 3
+.L115:
+	.loc 1 1199 0
+	and	x5, x5, 72057594037927935
+.LVL47:
+	and	x7, x7, -72057594037927936
+.LVL48:
+	orr	x5, x7, x5
+.LVL49:
+	.loc 1 1198 0
+	mov	w12, 0
+	b	.L76
+.LVL50:
+	.p2align 3
+.L114:
+	.loc 1 1186 0
+	and	x12, x7, 71776119061217280
+	and	x5, x5, -71776119061217281
+.LVL51:
+	orr	x5, x12, x5
+.LVL52:
+	.loc 1 1185 0
+	mov	w12, 0
+	b	.L74
+	.p2align 3
+.L112:
+	.loc 1 1160 0
+	and	x12, x7, 1095216660480
+	and	x5, x5, -1095216660481
+.LVL53:
+	orr	x5, x12, x5
+.LVL54:
+	.loc 1 1159 0
+	mov	w12, 0
+	b	.L70
+	.p2align 3
+.L113:
+	.loc 1 1173 0
+	and	x12, x7, 280375465082880
+	and	x5, x5, -280375465082881
+.LVL55:
+	orr	x5, x12, x5
+.LVL56:
+	.loc 1 1172 0
+	mov	w12, 0
+	b	.L72
+	.p2align 3
+.L111:
+	.loc 1 1144 0
+	and	x12, x7, 4278190080
+	and	x5, x5, -4278190081
+.LVL57:
+	orr	x5, x12, x5
+.LVL58:
+	.loc 1 1143 0
+	mov	w12, 0
+	b	.L68
+	.p2align 3
+.L109:
+	.loc 1 1118 0
+	and	x12, x7, 65280
+	and	x5, x5, -65281
+.LVL59:
+	orr	x5, x12, x5
+.LVL60:
+	.loc 1 1117 0
+	mov	w12, 0
+	b	.L64
+	.p2align 3
+.L110:
+	.loc 1 1131 0
+	and	x12, x7, 16711680
+	and	x5, x5, -16711681
+.LVL61:
+	orr	x5, x12, x5
+.LVL62:
+	.loc 1 1130 0
+	mov	w12, 0
+	b	.L66
+	.p2align 3
+.L108:
+	.loc 1 1105 0
+	bfi	x5, x7, 0, 8
+	.loc 1 1104 0
+	mov	w12, 0
+	b	.L62
+.LVL63:
+	.p2align 3
+.L60:
+	.loc 1 1208 0
+	strb	wzr, [x10, -2]
+	.loc 1 1209 0
+	strb	wzr, [x10, -1]
+	b	.L77
+.LVL64:
+.L79:
+	.loc 1 1083 0
+	mov	w8, 0
+.LVL65:
+.L53:
+	.loc 1 1216 0
+	str	w8, [x19]
+	.loc 1 1217 0
+	ldp	x19, x20, [sp, 16]
+.LVL66:
+	ldp	x21, x22, [sp, 32]
+.LVL67:
+	ldp	x29, x30, [sp], 48
+	.cfi_remember_state
+	.cfi_restore 30
+	.cfi_restore 29
+	.cfi_restore 21
+	.cfi_restore 22
+	.cfi_restore 19
+	.cfi_restore 20
+	.cfi_def_cfa 31, 0
+	ret
+.LVL68:
+.L106:
+	.cfi_restore_state
+	.loc 1 1072 0
+	add	w18, w22, w22, lsr 31
+	asr	w22, w18, 1
+	.loc 1 1071 0
+	mov	w18, 0
+.LVL69:
+	b	.L55
+.LVL70:
+.L107:
+	.loc 1 1074 0
+	add	w15, w22, w22, lsr 31
+	.loc 1 1078 0
+	add	x19, x4, 64
+	.loc 1 1074 0
+	asr	w18, w15, 1
+	.loc 1 1075 0
+	mul	w5, w14, w18
+.LVL71:
+	sbfiz	x5, x5, 3, 32
+	add	x1, x1, x5
+	.loc 1 1076 0
+	add	x2, x2, x5
+	.loc 1 1077 0
+	mul	w5, w18, w6
+	add	x3, x3, x5
+	b	.L55
+	.cfi_endproc
+.LFE2825:
+	.size	get_auto_image, .-get_auto_image
+	.align	2
+	.p2align 3,,7
+	.type	waveform_open, %function
+waveform_open:
+.LFB2853:
+	.loc 1 3196 0
+	.cfi_startproc
+.LVL72:
+	.loc 1 3200 0
+	mov	w0, 0
+.LVL73:
+	.loc 1 3197 0
+	str	xzr, [x1, 104]
+	.loc 1 3200 0
+	ret
+	.cfi_endproc
+.LFE2853:
+	.size	waveform_open, .-waveform_open
+	.section	.exit.text,"ax",@progbits
+	.align	2
+	.type	ebc_exit, %function
+ebc_exit:
+.LFB2875:
+	.loc 1 3827 0
+	.cfi_startproc
+	stp	x29, x30, [sp, -16]!
+	.cfi_def_cfa_offset 16
+	.cfi_offset 29, -16
+	.cfi_offset 30, -8
+	.loc 1 3828 0
+	adrp	x0, .LANCHOR1
+	add	x0, x0, :lo12:.LANCHOR1
+	.loc 1 3827 0
+	add	x29, sp, 0
+	.cfi_def_cfa_register 29
+	.loc 1 3828 0
+	bl	platform_driver_unregister
+.LVL74:
+	.loc 1 3829 0
+	ldp	x29, x30, [sp], 16
+	.cfi_restore 30
+	.cfi_restore 29
+	.cfi_def_cfa 31, 0
+	ret
+	.cfi_endproc
+.LFE2875:
+	.size	ebc_exit, .-ebc_exit
+	.text
+	.align	2
+	.p2align 3,,7
+	.type	ebc_resume, %function
+ebc_resume:
+.LFB2873:
+	.loc 1 3789 0
+	.cfi_startproc
+.LVL75:
+	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
+.LBB1128:
+.LBB1129:
+	.file 2 "./include/linux/device.h"
+	.loc 2 1181 0
+	ldr	x19, [x0, 184]
+.LBE1129:
+.LBE1128:
+	.loc 1 3793 0
+	ldr	x1, [x19, 16]
+.LBB1130:
+.LBB1131:
+	.file 3 "drivers/gpu/drm/rockchip/ebc-dev/pmic/ebc_pmic.h"
+	.loc 3 45 0
+	mov	x0, x1
+.LVL76:
+	ldr	x1, [x1, 48]
+	blr	x1
+.LVL77:
+.LBE1131:
+.LBE1130:
+	.loc 1 3794 0
+	str	wzr, [x19, 780]
+	.loc 1 3795 0
+	ldr	x0, [x19, 296]
+	adrp	x1, .LC0
+	add	x1, x1, :lo12:.LC0
+	bl	_dev_info
+.LVL78:
+	.loc 1 3798 0
+	ldr	x19, [sp, 16]
+	mov	w0, 0
+	ldp	x29, x30, [sp], 32
+	.cfi_restore 30
+	.cfi_restore 29
+	.cfi_restore 19
+	.cfi_def_cfa 31, 0
+	ret
+	.cfi_endproc
+.LFE2873:
+	.size	ebc_resume, .-ebc_resume
+	.align	2
+	.p2align 3,,7
+	.type	ebc_frame_control_timeout, %function
+ebc_frame_control_timeout:
+.LFB2846:
+	.loc 1 2858 0
+	.cfi_startproc
+.LVL79:
+	stp	x29, x30, [sp, -16]!
+	.cfi_def_cfa_offset 16
+	.cfi_offset 29, -16
+	.cfi_offset 30, -8
+	.loc 1 2859 0
+	adrp	x0, .LANCHOR0
+.LVL80:
+	.loc 1 2861 0
+	mov	w3, 1
+	.loc 1 2862 0
+	adrp	x1, .LC1
+	.loc 1 2858 0
+	add	x29, sp, 0
+	.cfi_def_cfa_register 29
+	.loc 1 2859 0
+	ldr	x2, [x0, #:lo12:.LANCHOR0]
+	.loc 1 2862 0
+	add	x1, x1, :lo12:.LC1
+	ldr	x0, [x2, 296]
+	.loc 1 2861 0
+	str	w3, [x2, 792]
+	.loc 1 2862 0
+	bl	_dev_info
+.LVL81:
+	.loc 1 2865 0
+	ldp	x29, x30, [sp], 16
+	.cfi_restore 30
+	.cfi_restore 29
+	.cfi_def_cfa 31, 0
+	ret
+	.cfi_endproc
+.LFE2846:
+	.size	ebc_frame_control_timeout, .-ebc_frame_control_timeout
+	.align	2
+	.p2align 3,,7
+	.type	ebc_remove, %function
+ebc_remove:
+.LFB2871:
+	.loc 1 3765 0
+	.cfi_startproc
+.LVL82:
+	stp	x29, x30, [sp, -16]!
+	.cfi_def_cfa_offset 16
+	.cfi_offset 29, -16
+	.cfi_offset 30, -8
+	.loc 1 3766 0
+	adrp	x0, .LANCHOR1
+.LVL83:
+	add	x0, x0, :lo12:.LANCHOR1
+	.loc 1 3765 0
+	add	x29, sp, 0
+	.cfi_def_cfa_register 29
+	.loc 1 3766 0
+	add	x0, x0, 224
+	.loc 1 3765 0
+	.loc 1 3766 0
+	bl	misc_deregister
+.LVL84:
+	.loc 1 3769 0
+	mov	w0, 0
+	ldp	x29, x30, [sp], 16
+	.cfi_restore 30
+	.cfi_restore 29
+	.cfi_def_cfa 31, 0
+	ret
+	.cfi_endproc
+.LFE2871:
+	.size	ebc_remove, .-ebc_remove
+	.align	2
+	.p2align 3,,7
+	.type	ebc_mmap, %function
+ebc_mmap:
+.LFB2850:
+	.loc 1 3142 0
+	.cfi_startproc
+.LVL85:
+	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 3142 0
+	mov	x19, x1
+	.loc 1 3145 0
+	bl	ebc_phy_buf_base_get
+.LVL86:
+	.loc 1 3148 0
+	lsr	x2, x0, 12
+	.loc 1 3146 0
+	mov	x6, 16384
+	.loc 1 3148 0
+	mov	x0, x19
+	.loc 1 3146 0
+	ldp	x4, x5, [x19, 72]
+	movk	x6, 0x404, lsl 16
+	.loc 1 3148 0
+	ldp	x1, x3, [x19]
+	.loc 1 3146 0
+	orr	x5, x5, x6
+	str	x5, [x19, 80]
+	.loc 1 3148 0
+	sub	x3, x3, x1
+	bl	remap_pfn_range
+.LVL87:
+	.loc 1 3151 0
+	cmp	w0, 0
+	mov	w1, -11
+	.loc 1 3154 0
+	ldr	x19, [sp, 16]
+.LVL88:
+	csel	w0, w0, w1, eq
+	ldp	x29, x30, [sp], 32
+	.cfi_restore 30
+	.cfi_restore 29
+	.cfi_restore 19
+	.cfi_def_cfa 31, 0
+	ret
+	.cfi_endproc
+.LFE2850:
+	.size	ebc_mmap, .-ebc_mmap
+	.align	2
+	.p2align 3,,7
+	.type	waveform_mmap, %function
+waveform_mmap:
+.LFB2852:
+	.loc 1 3180 0
+	.cfi_startproc
+.LVL89:
+	stp	x29, x30, [sp, -16]!
+	.cfi_def_cfa_offset 16
+	.cfi_offset 29, -16
+	.cfi_offset 30, -8
+	.loc 1 3181 0
+	adrp	x2, .LANCHOR0
+	.loc 1 3185 0
+	mov	x7, 16384
+	.loc 1 3187 0
+	mov	x0, x1
+.LVL90:
+	.loc 1 3180 0
+	add	x29, sp, 0
+	.cfi_def_cfa_register 29
+	.loc 1 3184 0
+	ldr	x2, [x2, #:lo12:.LANCHOR0]
+	.loc 1 3185 0
+	movk	x7, 0x404, lsl 16
+	ldp	x4, x5, [x1, 72]
+	.loc 1 3187 0
+	ldp	x6, x3, [x1]
+	.loc 1 3185 0
+	orr	x5, x5, x7
+	.loc 1 3184 0
+	ldr	x2, [x2, 232]
+	.loc 1 3185 0
+	str	x5, [x1, 80]
+	.loc 1 3187 0
+	sub	x3, x3, x6
+	mov	x1, x6
+.LVL91:
+	lsr	x2, x2, 12
+	bl	remap_pfn_range
+.LVL92:
+	.loc 1 3190 0
+	cmp	w0, 0
+	mov	w1, -11
+	.loc 1 3193 0
+	ldp	x29, x30, [sp], 16
+	.cfi_restore 30
+	.cfi_restore 29
+	.cfi_def_cfa 31, 0
+	csel	w0, w0, w1, eq
+	ret
+	.cfi_endproc
+.LFE2852:
+	.size	waveform_mmap, .-waveform_mmap
+	.align	2
+	.p2align 3,,7
+	.type	ebc_io_ctl, %function
+ebc_io_ctl:
+.LFB2849:
+	.loc 1 2947 0
+	.cfi_startproc
+.LVL93:
+	stp	x29, x30, [sp, -160]!
+	.cfi_def_cfa_offset 160
+	.cfi_offset 29, -160
+	.cfi_offset 30, -152
+	add	x29, sp, 0
+	.cfi_def_cfa_register 29
+	stp	x19, x20, [sp, 16]
+	.cfi_offset 19, -144
+	.cfi_offset 20, -136
+	adrp	x19, __stack_chk_guard
+	stp	x21, x22, [sp, 32]
+	add	x0, x19, :lo12:__stack_chk_guard
+.LVL94:
+	stp	x23, x24, [sp, 48]
+	.cfi_offset 21, -128
+	.cfi_offset 22, -120
+	.cfi_offset 23, -112
+	.cfi_offset 24, -104
+	mov	x21, x2
+	str	x25, [sp, 64]
+	.cfi_offset 25, -96
+	.loc 1 2947 0
+	ldr	x3, [x0]
+	str	x3, [x29, 152]
+	mov	x3,0
+	.loc 1 2957 0
+	mov	w0, 28679
+	.loc 1 2949 0
+	adrp	x3, .LANCHOR0
+	.loc 1 2957 0
+	cmp	w1, w0
+	.loc 1 2949 0
+	ldr	x20, [x3, #:lo12:.LANCHOR0]
+	.loc 1 2957 0
+	bhi	.L136
+	mov	w0, 28678
+	cmp	w1, w0
+	bcs	.L137
+	sub	w0, w1, #28672
+	cmp	w0, 3
+	bhi	.L135
+.L137:
+	.loc 1 2968 0
+	cbz	x21, .L253
+.L258:
+	sub	w0, w1, #28672
+.L135:
+	.loc 1 2977 0
+	cmp	w0, 17
+	bls	.L261
+	.loc 1 3134 0
+	ldr	x0, [x20, 296]
+	adrp	x2, .LANCHOR2
+	adrp	x1, .LC13
+.LVL95:
+	add	x2, x2, :lo12:.LANCHOR2
+	add	x1, x1, :lo12:.LC13
+	bl	_dev_err
+.LVL96:
+	.loc 1 3135 0
+	mov	x0, 0
+	b	.L134
+.LVL97:
+	.p2align 3
+.L136:
+	.loc 1 2957 0
+	mov	w0, 28681
+	cmp	w1, w0
+	bcc	.L258
+	mov	w0, 28683
+	cmp	w1, w0
+	bls	.L137
+	mov	w0, 28688
+	cmp	w1, w0
+	bne	.L258
+	.loc 1 2968 0
+	cbnz	x21, .L258
+	b	.L253
+	.p2align 3
+.L261:
+	.loc 1 2977 0
+	adrp	x1, .L141
+.LVL98:
+	add	x1, x1, :lo12:.L141
+	ldrh	w0, [x1,w0,uxtw #1]
+	adr	x1, .Lrtx141
+	add	x0, x1, w0, sxth #2
+	br	x0
+.Lrtx141:
+	.section	.rodata
+	.align	0
+	.align	2
+.L141:
+	.2byte	(.L140 - .Lrtx141) / 4
+	.2byte	(.L142 - .Lrtx141) / 4
+	.2byte	(.L143 - .Lrtx141) / 4
+	.2byte	(.L144 - .Lrtx141) / 4
+	.2byte	(.L145 - .Lrtx141) / 4
+	.2byte	(.L146 - .Lrtx141) / 4
+	.2byte	(.L147 - .Lrtx141) / 4
+	.2byte	(.L148 - .Lrtx141) / 4
+	.2byte	(.L259 - .Lrtx141) / 4
+	.2byte	(.L150 - .Lrtx141) / 4
+	.2byte	(.L151 - .Lrtx141) / 4
+	.2byte	(.L152 - .Lrtx141) / 4
+	.2byte	(.L153 - .Lrtx141) / 4
+	.2byte	(.L154 - .Lrtx141) / 4
+	.2byte	(.L155 - .Lrtx141) / 4
+	.2byte	(.L156 - .Lrtx141) / 4
+	.2byte	(.L157 - .Lrtx141) / 4
+	.2byte	(.L158 - .Lrtx141) / 4
+	.text
+	.p2align 3
+.L151:
+.LBB1132:
+.LBB1133:
+.LBB1134:
+.LBB1135:
+.LBB1136:
+.LBB1137:
+.LBB1138:
+	.file 4 "./arch/arm64/include/asm/current.h"
+	.loc 4 19 0
+#APP
+// 19 "./arch/arm64/include/asm/current.h" 1
+	mrs x0, sp_el0
+// 0 "" 2
+.LVL99:
+#NO_APP
+.LBE1138:
+.LBE1137:
+	.file 5 "./arch/arm64/include/asm/uaccess.h"
+	.loc 5 85 0
+	ldr	w2, [x0, 52]
+.LBE1136:
+.LBE1135:
+.LBE1134:
+.LBE1133:
+.LBE1132:
+	.loc 1 3127 0
+	add	x22, x20, 440
+.LBB1163:
+.LBB1160:
+.LBB1157:
+.LBB1147:
+.LBB1145:
+	.loc 5 77 0
+	ldr	x1, [x0, 8]
+.LVL100:
+	.loc 5 84 0
+	tbnz	x2, 21, .L202
+.LBB1139:
+.LBB1140:
+.LBB1141:
+	.file 6 "./include/asm-generic/bitops/non-atomic.h"
+	.loc 6 106 0
+	ldr	x2, [x0]
+.LBE1141:
+.LBE1140:
+.LBE1139:
+.LBE1145:
+.LBE1147:
+.LBE1157:
+.LBE1160:
+.LBE1163:
+	.loc 1 2948 0
+	mov	x0, x21
+.LVL101:
+.LBB1164:
+.LBB1161:
+.LBB1158:
+.LBB1148:
+.LBB1146:
+	.loc 5 84 0
+	tbz	x2, 26, .L203
+.LVL102:
+.L202:
+.LBB1142:
+.LBB1143:
+.LBB1144:
+	.file 7 "./include/linux/bitops.h"
+	.loc 7 157 0
+	sbfx	x0, x21, 0, 56
+.LVL103:
+.LBE1144:
+.LBE1143:
+	.loc 5 86 0
+	and	x0, x0, x21
+.LVL104:
+.L203:
+.LBE1142:
+	.loc 5 89 0
+#APP
+// 89 "./arch/arm64/include/asm/uaccess.h" 1
+		adds	x0, x0, 4
+	csel	x1, xzr, x1, hi
+	csinv	x0, x0, xzr, cc
+	sbcs	xzr, x0, x1
+	cset	x0, ls
+
+// 0 "" 2
+.LVL105:
+#NO_APP
+	mov	x3, x0
+.LBE1146:
+.LBE1148:
+	.file 8 "./include/linux/uaccess.h"
+	.loc 8 114 0
+	cbz	x0, .L226
+.LBB1149:
+.LBB1150:
+.LBB1151:
+.LBB1152:
+.LBB1153:
+	.loc 7 157 0
+	sbfx	x0, x21, 0, 56
+.LBE1153:
+.LBE1152:
+.LBE1151:
+.LBB1154:
+.LBB1155:
+	.loc 4 19 0
+#APP
+// 19 "./arch/arm64/include/asm/current.h" 1
+	mrs x1, sp_el0
+// 0 "" 2
+.LVL106:
+#NO_APP
+.LBE1155:
+.LBE1154:
+.LBB1156:
+	.loc 5 254 0
+	and	x0, x0, x21
+.LVL107:
+.LBE1156:
+	.loc 5 249 0
+	ldr	x2, [x1, 8]
+#APP
+// 249 "./arch/arm64/include/asm/uaccess.h" 1
+		bics	xzr, x0, x2
+	csel	x1, x21, xzr, eq
+
+// 0 "" 2
+.LVL108:
+	.loc 5 257 0
+// 257 "./arch/arm64/include/asm/uaccess.h" 1
+	hint #20
+// 0 "" 2
+#NO_APP
+.LBE1150:
+.LBE1149:
+	.loc 8 116 0
+	mov	x2, 4
+	mov	x0, x22
+.LVL109:
+	bl	__arch_copy_from_user
+.LVL110:
+	.loc 8 118 0
+	cbnz	x0, .L262
+.LBE1158:
+.LBE1161:
+.LBE1164:
+	.loc 1 3131 0
+	add	x20, x20, 192
+	ldr	w2, [x20, 248]
+	ldr	x0, [x20, 104]
+.LVL111:
+	adrp	x1, .LC16
+	add	x1, x1, :lo12:.LC16
+	bl	_dev_info
+.LVL112:
+.L259:
+	.loc 1 3132 0
+	mov	x0, 0
+.LVL113:
+.L134:
+	.loc 1 3139 0
+	add	x19, x19, :lo12:__stack_chk_guard
+	ldr	x2, [x29, 152]
+	ldr	x1, [x19]
+	eor	x1, x2, x1
+.LVL114:
+	cbnz	x1, .L263
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+.LVL115:
+	ldp	x23, x24, [sp, 48]
+.LVL116:
+	ldr	x25, [sp, 64]
+	ldp	x29, x30, [sp], 160
+	.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
+.LVL117:
+	.p2align 3
+.L157:
+	.cfi_restore_state
+.LBB1165:
+.LBB1166:
+.LBB1167:
+.LBB1168:
+.LBB1169:
+.LBB1170:
+.LBB1171:
+.LBB1172:
+	.loc 4 19 0
+#APP
+// 19 "./arch/arm64/include/asm/current.h" 1
+	mrs x1, sp_el0
+// 0 "" 2
+.LVL118:
+#NO_APP
+.LBE1172:
+.LBE1171:
+	.loc 5 85 0
+	ldr	w2, [x1, 52]
+.LBE1170:
+.LBE1169:
+.LBE1168:
+.LBE1167:
+.LBE1166:
+	.loc 1 3093 0
+	mov	w0, 1
+	str	w0, [x29, 84]
+.LVL119:
+.LBB1199:
+.LBB1196:
+.LBB1193:
+.LBB1182:
+.LBB1179:
+	.loc 5 77 0
+	ldr	x0, [x1, 8]
+.LVL120:
+	.loc 5 84 0
+	tbz	x2, 21, .L264
+.LVL121:
+.L187:
+.LBB1173:
+.LBB1174:
+.LBB1175:
+	.loc 7 157 0
+	sbfx	x1, x21, 0, 56
+.LVL122:
+.LBE1175:
+.LBE1174:
+	.loc 5 86 0
+	and	x1, x1, x21
+.LVL123:
+.L188:
+.LBE1173:
+	.loc 5 89 0
+#APP
+// 89 "./arch/arm64/include/asm/uaccess.h" 1
+		adds	x1, x1, 4
+	csel	x0, xzr, x0, hi
+	csinv	x1, x1, xzr, cc
+	sbcs	xzr, x1, x0
+	cset	x1, ls
+
+// 0 "" 2
+.LVL124:
+#NO_APP
+.LBE1179:
+.LBE1182:
+	.loc 8 132 0
+	mov	x0, 4
+.LVL125:
+	cbz	x1, .L134
+.LBB1183:
+.LBB1184:
+.LBB1185:
+.LBB1186:
+.LBB1187:
+	.loc 7 157 0
+	sbfx	x1, x21, 0, 56
+.LVL126:
+.LBE1187:
+.LBE1186:
+.LBE1185:
+.LBB1188:
+.LBB1189:
+	.loc 4 19 0
+#APP
+// 19 "./arch/arm64/include/asm/current.h" 1
+	mrs x2, sp_el0
+// 0 "" 2
+.LVL127:
+#NO_APP
+.LBE1189:
+.LBE1188:
+.LBB1190:
+	.loc 5 254 0
+	and	x1, x1, x21
+.LVL128:
+.LBE1190:
+	.loc 5 249 0
+	ldr	x2, [x2, 8]
+.LVL129:
+#APP
+// 249 "./arch/arm64/include/asm/uaccess.h" 1
+		bics	xzr, x1, x2
+	csel	x3, x21, xzr, eq
+
+// 0 "" 2
+.LVL130:
+	.loc 5 257 0
+// 257 "./arch/arm64/include/asm/uaccess.h" 1
+	hint #20
+// 0 "" 2
+#NO_APP
+.LBE1184:
+.LBE1183:
+	.loc 8 134 0
+	mov	x2, x0
+	add	x1, x29, 84
+.LVL131:
+	mov	x0, x3
+	bl	__arch_copy_to_user
+.LVL132:
+	sxtw	x0, w0
+	b	.L134
+.LVL133:
+	.p2align 3
+.L156:
+.LBE1193:
+.LBE1196:
+.LBE1199:
+.LBE1165:
+	.loc 1 3078 0
+	ldr	x0, [x20, 296]
+	adrp	x1, .LC6
+	.loc 1 3077 0
+	str	wzr, [x20, 800]
+	.loc 1 3078 0
+	add	x1, x1, :lo12:.LC6
+	bl	_dev_info
+.LVL134:
+	.loc 1 3079 0
+	mov	x0, 0
+	b	.L134
+	.p2align 3
+.L155:
+	.loc 1 3074 0
+	ldr	x0, [x20, 296]
+	.loc 1 3073 0
+	mov	w2, 1
+	str	w2, [x20, 800]
+	.loc 1 3074 0
+	adrp	x1, .LC5
+	add	x1, x1, :lo12:.LC5
+	bl	_dev_info
+.LVL135:
+	.loc 1 3075 0
+	mov	x0, 0
+	b	.L134
+	.p2align 3
+.L154:
+	.loc 1 3070 0
+	ldr	x0, [x20, 296]
+	adrp	x1, .LC4
+	.loc 1 3069 0
+	str	wzr, [x20, 796]
+	.loc 1 3070 0
+	add	x1, x1, :lo12:.LC4
+	bl	_dev_info
+.LVL136:
+	.loc 1 3071 0
+	mov	x0, 0
+	b	.L134
+	.p2align 3
+.L153:
+	.loc 1 3066 0
+	ldr	x0, [x20, 296]
+	.loc 1 3065 0
+	mov	w2, 1
+	str	w2, [x20, 796]
+	.loc 1 3066 0
+	adrp	x1, .LC3
+	add	x1, x1, :lo12:.LC3
+	bl	_dev_info
+.LVL137:
+	.loc 1 3067 0
+	mov	x0, 0
+	b	.L134
+	.p2align 3
+.L152:
+.LBB1202:
+.LBB1203:
+.LBB1204:
+.LBB1205:
+.LBB1206:
+.LBB1207:
+.LBB1208:
+	.loc 4 19 0
+#APP
+// 19 "./arch/arm64/include/asm/current.h" 1
+	mrs x1, sp_el0
+// 0 "" 2
+.LVL138:
+#NO_APP
+.LBE1208:
+.LBE1207:
+	.loc 5 85 0
+	ldr	w2, [x1, 52]
+	.loc 5 77 0
+	ldr	x0, [x1, 8]
+.LVL139:
+	.loc 5 84 0
+	tbz	x2, 21, .L265
+.LVL140:
+.L184:
+.LBB1209:
+.LBB1210:
+.LBB1211:
+	.loc 7 157 0
+	sbfx	x1, x21, 0, 56
+.LVL141:
+.LBE1211:
+.LBE1210:
+	.loc 5 86 0
+	and	x1, x1, x21
+.LVL142:
+.L185:
+.LBE1209:
+	.loc 5 89 0
+#APP
+// 89 "./arch/arm64/include/asm/uaccess.h" 1
+		adds	x1, x1, 4
+	csel	x0, xzr, x0, hi
+	csinv	x1, x1, xzr, cc
+	sbcs	xzr, x1, x0
+	cset	x1, ls
+
+// 0 "" 2
+.LVL143:
+#NO_APP
+.LBE1206:
+.LBE1205:
+	.loc 8 132 0
+	mov	x0, 4
+.LVL144:
+	cbz	x1, .L134
+.LBB1217:
+.LBB1218:
+.LBB1219:
+.LBB1220:
+.LBB1221:
+	.loc 7 157 0
+	sbfx	x1, x21, 0, 56
+.LVL145:
+.LBE1221:
+.LBE1220:
+.LBE1219:
+.LBB1222:
+.LBB1223:
+	.loc 4 19 0
+#APP
+// 19 "./arch/arm64/include/asm/current.h" 1
+	mrs x2, sp_el0
+// 0 "" 2
+.LVL146:
+#NO_APP
+.LBE1223:
+.LBE1222:
+.LBB1224:
+	.loc 5 254 0
+	and	x1, x1, x21
+.LVL147:
+.LBE1224:
+	.loc 5 249 0
+	ldr	x2, [x2, 8]
+.LVL148:
+#APP
+// 249 "./arch/arm64/include/asm/uaccess.h" 1
+		bics	xzr, x1, x2
+	csel	x3, x21, xzr, eq
+
+// 0 "" 2
+.LVL149:
+	.loc 5 257 0
+// 257 "./arch/arm64/include/asm/uaccess.h" 1
+	hint #20
+// 0 "" 2
+#NO_APP
+.LBE1218:
+.LBE1217:
+	.loc 8 134 0
+	mov	x2, x0
+	add	x1, x20, 788
+.LVL150:
+	mov	x0, x3
+	bl	__arch_copy_to_user
+.LVL151:
+	sxtw	x0, w0
+	b	.L134
+	.p2align 3
+.L150:
+.LBE1204:
+.LBE1203:
+.LBE1202:
+.LBB1231:
+.LBB1232:
+.LBB1233:
+.LBB1234:
+.LBB1235:
+.LBB1236:
+.LBB1237:
+	.loc 4 19 0
+#APP
+// 19 "./arch/arm64/include/asm/current.h" 1
+	mrs x0, sp_el0
+// 0 "" 2
+.LVL152:
+#NO_APP
+.LBE1237:
+.LBE1236:
+	.loc 5 85 0
+	ldr	w2, [x0, 52]
+.LBE1235:
+.LBE1234:
+.LBE1233:
+.LBE1232:
+.LBE1231:
+	.loc 1 3118 0
+	add	x22, x20, 280
+.LBB1266:
+.LBB1262:
+.LBB1258:
+.LBB1247:
+.LBB1244:
+	.loc 5 77 0
+	ldr	x1, [x0, 8]
+.LVL153:
+	.loc 5 84 0
+	tbz	x2, 21, .L266
+.LVL154:
+.L198:
+.LBB1238:
+.LBB1239:
+.LBB1240:
+	.loc 7 157 0
+	sbfx	x0, x21, 0, 56
+.LVL155:
+.LBE1240:
+.LBE1239:
+	.loc 5 86 0
+	and	x0, x0, x21
+.LVL156:
+.L199:
+.LBE1238:
+	.loc 5 89 0
+#APP
+// 89 "./arch/arm64/include/asm/uaccess.h" 1
+		adds	x0, x0, 4
+	csel	x1, xzr, x1, hi
+	csinv	x0, x0, xzr, cc
+	sbcs	xzr, x0, x1
+	cset	x0, ls
+
+// 0 "" 2
+.LVL157:
+#NO_APP
+	mov	x3, x0
+.LBE1244:
+.LBE1247:
+	.loc 8 114 0
+	cbz	x0, .L224
+.LBB1248:
+.LBB1249:
+.LBB1250:
+.LBB1251:
+.LBB1252:
+	.loc 7 157 0
+	sbfx	x0, x21, 0, 56
+.LBE1252:
+.LBE1251:
+.LBE1250:
+.LBB1253:
+.LBB1254:
+	.loc 4 19 0
+#APP
+// 19 "./arch/arm64/include/asm/current.h" 1
+	mrs x1, sp_el0
+// 0 "" 2
+.LVL158:
+#NO_APP
+.LBE1254:
+.LBE1253:
+.LBB1255:
+	.loc 5 254 0
+	and	x0, x0, x21
+.LVL159:
+.LBE1255:
+	.loc 5 249 0
+	ldr	x2, [x1, 8]
+#APP
+// 249 "./arch/arm64/include/asm/uaccess.h" 1
+		bics	xzr, x0, x2
+	csel	x1, x21, xzr, eq
+
+// 0 "" 2
+.LVL160:
+	.loc 5 257 0
+// 257 "./arch/arm64/include/asm/uaccess.h" 1
+	hint #20
+// 0 "" 2
+#NO_APP
+.LBE1249:
+.LBE1248:
+	.loc 8 116 0
+	mov	x2, 4
+	mov	x0, x22
+.LVL161:
+	bl	__arch_copy_from_user
+.LVL162:
+	.loc 8 118 0
+	cbnz	x0, .L267
+.LBE1258:
+.LBE1262:
+.LBE1266:
+	.loc 1 3122 0
+	ldr	x0, [x20, 296]
+.LVL163:
+	adrp	x1, .LC15
+	ldr	w2, [x20, 280]
+	add	x1, x1, :lo12:.LC15
+	bl	_dev_info
+.LVL164:
+	.loc 1 3123 0
+	mov	x0, 0
+	b	.L134
+	.p2align 3
+.L148:
+.LBB1267:
+.LBB1268:
+.LBB1269:
+.LBB1270:
+.LBB1271:
+.LBB1272:
+.LBB1273:
+	.loc 4 19 0
+#APP
+// 19 "./arch/arm64/include/asm/current.h" 1
+	mrs x0, sp_el0
+// 0 "" 2
+.LVL165:
+#NO_APP
+.LBE1273:
+.LBE1272:
+	.loc 5 85 0
+	ldr	w2, [x0, 52]
+	.loc 5 77 0
+	ldr	x1, [x0, 8]
+.LVL166:
+	.loc 5 84 0
+	tbz	x2, 21, .L268
+.LVL167:
+.L181:
+.LBB1274:
+.LBB1275:
+.LBB1276:
+	.loc 7 157 0
+	sbfx	x0, x21, 0, 56
+.LVL168:
+.LBE1276:
+.LBE1275:
+	.loc 5 86 0
+	and	x0, x0, x21
+.LVL169:
+.L182:
+.LBE1274:
+	.loc 5 89 0
+#APP
+// 89 "./arch/arm64/include/asm/uaccess.h" 1
+		adds	x0, x0, 64
+	csel	x1, xzr, x1, hi
+	csinv	x0, x0, xzr, cc
+	sbcs	xzr, x0, x1
+	cset	x0, ls
+
+// 0 "" 2
+.LVL170:
+#NO_APP
+.LBE1271:
+.LBE1270:
+	.loc 8 114 0
+	cbz	x0, .L260
+.LBB1282:
+.LBB1283:
+.LBB1284:
+.LBB1285:
+.LBB1286:
+	.loc 7 157 0
+	sbfx	x0, x21, 0, 56
+.LVL171:
+.LBE1286:
+.LBE1285:
+.LBE1284:
+.LBB1287:
+.LBB1288:
+	.loc 4 19 0
+#APP
+// 19 "./arch/arm64/include/asm/current.h" 1
+	mrs x1, sp_el0
+// 0 "" 2
+.LVL172:
+#NO_APP
+.LBE1288:
+.LBE1287:
+.LBB1289:
+	.loc 5 254 0
+	and	x0, x0, x21
+.LVL173:
+.LBE1289:
+	.loc 5 249 0
+	ldr	x2, [x1, 8]
+#APP
+// 249 "./arch/arm64/include/asm/uaccess.h" 1
+		bics	xzr, x0, x2
+	csel	x1, x21, xzr, eq
+
+// 0 "" 2
+.LVL174:
+	.loc 5 257 0
+// 257 "./arch/arm64/include/asm/uaccess.h" 1
+	hint #20
+// 0 "" 2
+#NO_APP
+.LBE1283:
+.LBE1282:
+	.loc 8 116 0
+	mov	x2, 64
+	add	x0, x29, 88
+.LVL175:
+	bl	__arch_copy_from_user
+.LVL176:
+	.loc 8 118 0
+	cbnz	x0, .L260
+.LBE1269:
+.LBE1268:
+.LBE1267:
+	.loc 1 3044 0
+	bl	ebc_osd_buf_clone
+.LVL177:
+	mov	x1, x0
+	.loc 1 3045 0
+	cbz	x0, .L259
+	.loc 1 3046 0
+	ldr	w6, [x29, 92]
+	.loc 1 3054 0
+	add	x20, x20, 192
+	.loc 1 3050 0
+	ldp	w5, w3, [x29, 108]
+	.loc 1 3046 0
+	str	w6, [x1, 40]
+	.loc 1 3051 0
+	ldp	w4, w2, [x29, 116]
+	.loc 1 3050 0
+	stp	w5, w3, [x1, 48]
+	.loc 1 3051 0
+	stp	w4, w2, [x1, 56]
+	.loc 1 3053 0
+	bl	ebc_add_to_osd_buf_list
+.LVL178:
+	.loc 1 3054 0
+	ldr	w0, [x20, 100]
+	cbnz	w0, .L259
+	.loc 1 3055 0
+	mov	w2, 1
+	str	w2, [x20, 100]
+	.loc 1 3056 0
+	adrp	x0, .LANCHOR1
+	add	x0, x0, :lo12:.LANCHOR1
+	add	x0, x0, 304
+	mov	w1, w2
+	bl	__wake_up_sync
+.LVL179:
+	mov	x0, 0
+	b	.L134
+	.p2align 3
+.L147:
+	.loc 1 2979 0
+	bl	ebc_empty_osd_buf_get
+.LVL180:
+	.loc 1 2980 0
+	cbz	x0, .L167
+	.loc 1 2983 0
+	ldr	x22, [x0, 8]
+	bl	ebc_phy_buf_base_get
+.LVL181:
+.LBB1296:
+.LBB1297:
+.LBB1298:
+.LBB1299:
+.LBB1300:
+.LBB1301:
+.LBB1302:
+	.loc 4 19 0
+#APP
+// 19 "./arch/arm64/include/asm/current.h" 1
+	mrs x1, sp_el0
+// 0 "" 2
+.LVL182:
+#NO_APP
+.LBE1302:
+.LBE1301:
+	.loc 5 85 0
+	ldr	w2, [x1, 52]
+.LBE1300:
+.LBE1299:
+.LBE1298:
+.LBE1297:
+.LBE1296:
+	.loc 1 2983 0
+	sub	w0, w22, w0
+	.loc 1 2987 0
+	ldp	w5, w4, [x20, 108]
+	.loc 1 2985 0
+	str	w0, [x29, 88]
+	.loc 1 2988 0
+	ldr	w3, [x20, 176]
+	.loc 1 2986 0
+	stp	w4, w5, [x29, 96]
+	.loc 1 2988 0
+	str	w3, [x29, 104]
+	.loc 1 2989 0
+	str	wzr, [x29, 132]
+.LBB1329:
+.LBB1326:
+.LBB1323:
+.LBB1312:
+.LBB1309:
+	.loc 5 77 0
+	ldr	x0, [x1, 8]
+.LVL183:
+	.loc 5 84 0
+	tbz	x2, 21, .L269
+.LVL184:
+.L160:
+.LBB1303:
+.LBB1304:
+.LBB1305:
+	.loc 7 157 0
+	sbfx	x1, x21, 0, 56
+.LVL185:
+.LBE1305:
+.LBE1304:
+	.loc 5 86 0
+	and	x1, x1, x21
+.LVL186:
+.L161:
+.LBE1303:
+	.loc 5 89 0
+#APP
+// 89 "./arch/arm64/include/asm/uaccess.h" 1
+		adds	x1, x1, 64
+	csel	x0, xzr, x0, hi
+	csinv	x1, x1, xzr, cc
+	sbcs	xzr, x1, x0
+	cset	x1, ls
+
+// 0 "" 2
+.LVL187:
+#NO_APP
+.LBE1309:
+.LBE1312:
+	.loc 8 132 0
+	mov	x0, 64
+.LVL188:
+	cbz	x1, .L134
+.LBB1313:
+.LBB1314:
+.LBB1315:
+.LBB1316:
+.LBB1317:
+	.loc 7 157 0
+	sbfx	x1, x21, 0, 56
+.LVL189:
+.LBE1317:
+.LBE1316:
+.LBE1315:
+.LBB1318:
+.LBB1319:
+	.loc 4 19 0
+#APP
+// 19 "./arch/arm64/include/asm/current.h" 1
+	mrs x2, sp_el0
+// 0 "" 2
+.LVL190:
+#NO_APP
+.LBE1319:
+.LBE1318:
+.LBB1320:
+	.loc 5 254 0
+	and	x1, x1, x21
+.LVL191:
+.LBE1320:
+	.loc 5 249 0
+	ldr	x2, [x2, 8]
+.LVL192:
+#APP
+// 249 "./arch/arm64/include/asm/uaccess.h" 1
+		bics	xzr, x1, x2
+	csel	x3, x21, xzr, eq
+
+// 0 "" 2
+.LVL193:
+	.loc 5 257 0
+// 257 "./arch/arm64/include/asm/uaccess.h" 1
+	hint #20
+// 0 "" 2
+#NO_APP
+.LBE1314:
+.LBE1313:
+	.loc 8 134 0
+	mov	x2, x0
+	add	x1, x29, 88
+.LVL194:
+	mov	x0, x3
+	bl	__arch_copy_to_user
+.LVL195:
+	sxtw	x0, w0
+	b	.L134
+	.p2align 3
+.L146:
+.LBE1323:
+.LBE1326:
+.LBE1329:
+	.loc 1 3086 0
+	ldr	x0, [x20, 296]
+	adrp	x1, .LC8
+	.loc 1 3085 0
+	str	wzr, [x20, 788]
+	.loc 1 3086 0
+	add	x1, x1, :lo12:.LC8
+	bl	_dev_info
+.LVL196:
+	.loc 1 3087 0
+	mov	x0, 0
+	b	.L134
+	.p2align 3
+.L145:
+	.loc 1 3082 0
+	ldr	x0, [x20, 296]
+	.loc 1 3081 0
+	mov	w2, 1
+	str	w2, [x20, 788]
+	.loc 1 3082 0
+	adrp	x1, .LC7
+	add	x1, x1, :lo12:.LC7
+	bl	_dev_info
+.LVL197:
+	.loc 1 3083 0
+	mov	x0, 0
+	b	.L134
+	.p2align 3
+.L144:
+.LBB1330:
+.LBB1331:
+.LBB1332:
+.LBB1333:
+.LBB1334:
+.LBB1335:
+.LBB1336:
+	.loc 4 19 0
+#APP
+// 19 "./arch/arm64/include/asm/current.h" 1
+	mrs x0, sp_el0
+// 0 "" 2
+.LVL198:
+#NO_APP
+.LBE1336:
+.LBE1335:
+	.loc 5 85 0
+	ldr	w2, [x0, 52]
+.LBE1334:
+.LBE1333:
+.LBE1332:
+.LBE1331:
+.LBE1330:
+	.loc 1 3098 0
+	add	x22, x20, 276
+.LBB1365:
+.LBB1361:
+.LBB1357:
+.LBB1346:
+.LBB1343:
+	.loc 5 77 0
+	ldr	x1, [x0, 8]
+.LVL199:
+	.loc 5 84 0
+	tbz	x2, 21, .L270
+.LVL200:
+.L190:
+.LBB1337:
+.LBB1338:
+.LBB1339:
+	.loc 7 157 0
+	sbfx	x0, x21, 0, 56
+.LVL201:
+.LBE1339:
+.LBE1338:
+	.loc 5 86 0
+	and	x0, x0, x21
+.LVL202:
+.L191:
+.LBE1337:
+	.loc 5 89 0
+#APP
+// 89 "./arch/arm64/include/asm/uaccess.h" 1
+		adds	x0, x0, 4
+	csel	x1, xzr, x1, hi
+	csinv	x0, x0, xzr, cc
+	sbcs	xzr, x0, x1
+	cset	x0, ls
+
+// 0 "" 2
+.LVL203:
+#NO_APP
+	mov	x3, x0
+.LBE1343:
+.LBE1346:
+	.loc 8 114 0
+	cbz	x0, .L221
+.LBB1347:
+.LBB1348:
+.LBB1349:
+.LBB1350:
+.LBB1351:
+	.loc 7 157 0
+	sbfx	x0, x21, 0, 56
+.LBE1351:
+.LBE1350:
+.LBE1349:
+.LBB1352:
+.LBB1353:
+	.loc 4 19 0
+#APP
+// 19 "./arch/arm64/include/asm/current.h" 1
+	mrs x1, sp_el0
+// 0 "" 2
+.LVL204:
+#NO_APP
+.LBE1353:
+.LBE1352:
+.LBB1354:
+	.loc 5 254 0
+	and	x0, x0, x21
+.LVL205:
+.LBE1354:
+	.loc 5 249 0
+	ldr	x2, [x1, 8]
+#APP
+// 249 "./arch/arm64/include/asm/uaccess.h" 1
+		bics	xzr, x0, x2
+	csel	x1, x21, xzr, eq
+
+// 0 "" 2
+.LVL206:
+	.loc 5 257 0
+// 257 "./arch/arm64/include/asm/uaccess.h" 1
+	hint #20
+// 0 "" 2
+#NO_APP
+.LBE1348:
+.LBE1347:
+	.loc 8 116 0
+	mov	x2, 4
+	mov	x0, x22
+.LVL207:
+	bl	__arch_copy_from_user
+.LVL208:
+	.loc 8 118 0
+	cbnz	x0, .L271
+.LBE1357:
+.LBE1361:
+.LBE1365:
+	.loc 1 3102 0
+	ldr	x0, [x20, 296]
+.LVL209:
+	adrp	x1, .LC14
+	ldr	w2, [x20, 276]
+	add	x1, x1, :lo12:.LC14
+	bl	_dev_info
+.LVL210:
+	.loc 1 3103 0
+	mov	x0, 0
+	b	.L134
+	.p2align 3
+.L143:
+.LBB1366:
+.LBB1367:
+.LBB1368:
+.LBB1369:
+.LBB1370:
+.LBB1371:
+.LBB1372:
+	.loc 4 19 0
+#APP
+// 19 "./arch/arm64/include/asm/current.h" 1
+	mrs x2, sp_el0
+// 0 "" 2
+.LVL211:
+#NO_APP
+.LBE1372:
+.LBE1371:
+	.loc 5 85 0
+	ldr	w3, [x2, 52]
+.LBE1370:
+.LBE1369:
+.LBE1368:
+.LBE1367:
+.LBE1366:
+	.loc 1 3109 0
+	ldp	w1, w0, [x20, 116]
+	stp	w1, w0, [x29, 124]
+	.loc 1 3106 0
+	ldp	w6, w5, [x20, 108]
+	.loc 1 3105 0
+	stp	w5, w6, [x29, 96]
+	.loc 1 3107 0
+	ldr	w4, [x20, 176]
+	str	w4, [x29, 104]
+	.loc 1 3110 0
+	str	wzr, [x29, 132]
+.LBB1401:
+.LBB1397:
+.LBB1393:
+.LBB1382:
+.LBB1379:
+	.loc 5 77 0
+	ldr	x1, [x2, 8]
+.LVL212:
+	.loc 5 84 0
+	tbz	x3, 21, .L272
+.LVL213:
+.L194:
+.LBB1373:
+.LBB1374:
+.LBB1375:
+	.loc 7 157 0
+	sbfx	x0, x21, 0, 56
+.LVL214:
+.LBE1375:
+.LBE1374:
+	.loc 5 86 0
+	and	x0, x0, x21
+.LVL215:
+.L195:
+.LBE1373:
+	.loc 5 89 0
+#APP
+// 89 "./arch/arm64/include/asm/uaccess.h" 1
+		adds	x0, x0, 64
+	csel	x1, xzr, x1, hi
+	csinv	x0, x0, xzr, cc
+	sbcs	xzr, x0, x1
+	cset	x0, ls
+
+// 0 "" 2
+.LVL216:
+#NO_APP
+.LBE1379:
+.LBE1382:
+	.loc 8 132 0
+	cbnz	x0, .L196
+.L197:
+.LBE1393:
+.LBE1397:
+.LBE1401:
+	.loc 1 3113 0
+	ldr	x0, [x20, 296]
+.LVL217:
+	adrp	x1, .LC10
+.LVL218:
+	add	x1, x1, :lo12:.LC10
+	bl	_dev_err
+.LVL219:
+	.loc 1 3114 0
+	mov	x0, -14
+	b	.L134
+	.p2align 3
+.L142:
+.LBB1402:
+.LBB1403:
+.LBB1404:
+.LBB1405:
+.LBB1406:
+.LBB1407:
+.LBB1408:
+	.loc 4 19 0
+#APP
+// 19 "./arch/arm64/include/asm/current.h" 1
+	mrs x0, sp_el0
+// 0 "" 2
+.LVL220:
+#NO_APP
+.LBE1408:
+.LBE1407:
+	.loc 5 85 0
+	ldr	w2, [x0, 52]
+	.loc 5 77 0
+	ldr	x1, [x0, 8]
+.LVL221:
+	.loc 5 84 0
+	tbz	x2, 21, .L273
+.LVL222:
+.L174:
+.LBB1409:
+.LBB1410:
+.LBB1411:
+	.loc 7 157 0
+	sbfx	x0, x21, 0, 56
+.LVL223:
+.LBE1411:
+.LBE1410:
+	.loc 5 86 0
+	and	x0, x0, x21
+.LVL224:
+.L175:
+.LBE1409:
+	.loc 5 89 0
+#APP
+// 89 "./arch/arm64/include/asm/uaccess.h" 1
+		adds	x0, x0, 64
+	csel	x1, xzr, x1, hi
+	csinv	x0, x0, xzr, cc
+	sbcs	xzr, x0, x1
+	cset	x0, ls
+
+// 0 "" 2
+.LVL225:
+#NO_APP
+.LBE1406:
+.LBE1405:
+	.loc 8 114 0
+	cbz	x0, .L260
+.LBB1417:
+.LBB1418:
+.LBB1419:
+.LBB1420:
+.LBB1421:
+	.loc 7 157 0
+	sbfx	x0, x21, 0, 56
+.LVL226:
+.LBE1421:
+.LBE1420:
+.LBE1419:
+.LBB1422:
+.LBB1423:
+	.loc 4 19 0
+#APP
+// 19 "./arch/arm64/include/asm/current.h" 1
+	mrs x1, sp_el0
+// 0 "" 2
+.LVL227:
+#NO_APP
+.LBE1423:
+.LBE1422:
+.LBB1424:
+	.loc 5 254 0
+	and	x0, x0, x21
+.LVL228:
+.LBE1424:
+	.loc 5 249 0
+	ldr	x2, [x1, 8]
+#APP
+// 249 "./arch/arm64/include/asm/uaccess.h" 1
+		bics	xzr, x0, x2
+	csel	x1, x21, xzr, eq
+
+// 0 "" 2
+.LVL229:
+	.loc 5 257 0
+// 257 "./arch/arm64/include/asm/uaccess.h" 1
+	hint #20
+// 0 "" 2
+#NO_APP
+.LBE1418:
+.LBE1417:
+	.loc 8 116 0
+	mov	x2, 64
+	add	x0, x29, 88
+.LVL230:
+	bl	__arch_copy_from_user
+.LVL231:
+	.loc 8 118 0
+	cbnz	x0, .L260
+.LBE1404:
+.LBE1403:
+.LBE1402:
+	.loc 1 3021 0
+	bl	ebc_phy_buf_base_get
+.LVL232:
+	ldrsw	x1, [x29, 88]
+	.loc 1 3022 0
+	add	x0, x1, x0
+	bl	ebc_find_buf_by_phy_addr
+.LVL233:
+	mov	x21, x0
+.LVL234:
+	.loc 1 3023 0
+	cbz	x0, .L259
+	.loc 1 3024 0
+	ldr	w1, [x29, 92]
+	.loc 1 3032 0
+	add	x20, x20, 192
+	.loc 1 3024 0
+	str	w1, [x21, 40]
+	.loc 1 3028 0
+	ldp	w4, w2, [x29, 108]
+	stp	w4, w2, [x21, 48]
+	.loc 1 3027 0
+	ldr	w3, [x29, 116]
+	.loc 1 3029 0
+	ldr	w1, [x29, 120]
+	.loc 1 3025 0
+	ldr	w5, [x29, 132]
+	.loc 1 3027 0
+	str	w3, [x21, 56]
+	.loc 1 3025 0
+	stp	w1, w5, [x21, 60]
+	.loc 1 3031 0
+	bl	ebc_add_to_dsp_buf_list
+.LVL235:
+	.loc 1 3032 0
+	ldr	w0, [x20, 100]
+	cbz	w0, .L274
+.L179:
+	.loc 1 3036 0
+	ldr	w0, [x21, 40]
+	sub	w0, w0, #18
+	tst	w0, -3
+	bne	.L259
+	.loc 1 3037 0
+	mov	w1, 1
+	mov	x0, 0
+	str	w1, [x20, 612]
+	b	.L134
+.LVL236:
+	.p2align 3
+.L140:
+.LBB1431:
+.LBB1432:
+.LBB1433:
+.LBB1434:
+.LBB1435:
+.LBB1436:
+.LBB1437:
+	.loc 4 19 0
+#APP
+// 19 "./arch/arm64/include/asm/current.h" 1
+	mrs x0, sp_el0
+// 0 "" 2
+.LVL237:
+#NO_APP
+.LBE1437:
+.LBE1436:
+	.loc 5 85 0
+	ldr	w2, [x0, 52]
+	.loc 5 77 0
+	ldr	x1, [x0, 8]
+.LVL238:
+	.loc 5 84 0
+	tbz	x2, 21, .L275
+.LVL239:
+.L163:
+.LBB1438:
+.LBB1439:
+.LBB1440:
+	.loc 7 157 0
+	sbfx	x0, x21, 0, 56
+.LVL240:
+.LBE1440:
+.LBE1439:
+	.loc 5 86 0
+	and	x0, x0, x21
+.LVL241:
+.L164:
+.LBE1438:
+	.loc 5 89 0
+#APP
+// 89 "./arch/arm64/include/asm/uaccess.h" 1
+		adds	x0, x0, 64
+	csel	x1, xzr, x1, hi
+	csinv	x0, x0, xzr, cc
+	sbcs	xzr, x0, x1
+	cset	x0, ls
+
+// 0 "" 2
+.LVL242:
+#NO_APP
+.LBE1435:
+.LBE1434:
+	.loc 8 114 0
+	cbz	x0, .L260
+.LBB1446:
+.LBB1447:
+.LBB1448:
+.LBB1449:
+.LBB1450:
+	.loc 7 157 0
+	lsl	x22, x21, 8
+.LBE1450:
+.LBE1449:
+.LBE1448:
+.LBB1451:
+.LBB1452:
+	.loc 4 19 0
+#APP
+// 19 "./arch/arm64/include/asm/current.h" 1
+	mrs x0, sp_el0
+// 0 "" 2
+.LVL243:
+#NO_APP
+.LBE1452:
+.LBE1451:
+.LBB1453:
+	.loc 5 254 0
+	and	x2, x21, x22, asr 8
+.LVL244:
+.LBE1453:
+	.loc 5 249 0
+	ldr	x0, [x0, 8]
+.LVL245:
+#APP
+// 249 "./arch/arm64/include/asm/uaccess.h" 1
+		bics	xzr, x2, x0
+	csel	x1, x21, xzr, eq
+
+// 0 "" 2
+.LVL246:
+	.loc 5 257 0
+// 257 "./arch/arm64/include/asm/uaccess.h" 1
+	hint #20
+// 0 "" 2
+#NO_APP
+.LBE1447:
+.LBE1446:
+	.loc 8 116 0
+	add	x24, x29, 88
+	mov	x2, 64
+.LVL247:
+	mov	x0, x24
+	bl	__arch_copy_from_user
+.LVL248:
+	mov	x23, x0
+.LVL249:
+	.loc 8 118 0
+	cbnz	x0, .L166
+.L169:
+.LBE1433:
+.LBE1432:
+.LBE1431:
+	.loc 1 2998 0
+	add	x0, x24, 48
+	bl	ebc_empty_buf_get
+.LVL250:
+	mov	x25, x0
+	.loc 1 2999 0
+	cbz	x0, .L167
+	.loc 1 3002 0
+	ldr	x23, [x0, 8]
+.LVL251:
+	bl	ebc_phy_buf_base_get
+.LVL252:
+	.loc 1 3006 0
+	ldp	w3, w1, [x20, 108]
+	.loc 1 3005 0
+	stp	w1, w3, [x29, 96]
+.LBB1462:
+.LBB1463:
+.LBB1464:
+.LBB1465:
+.LBB1466:
+.LBB1467:
+.LBB1468:
+	.loc 4 19 0
+#APP
+// 19 "./arch/arm64/include/asm/current.h" 1
+	mrs x2, sp_el0
+// 0 "" 2
+.LVL253:
+#NO_APP
+.LBE1468:
+.LBE1467:
+	.loc 5 85 0
+	ldr	w3, [x2, 52]
+.LBE1466:
+.LBE1465:
+.LBE1464:
+.LBE1463:
+.LBE1462:
+	.loc 1 3002 0
+	sub	w0, w23, w0
+	.loc 1 3007 0
+	ldr	w1, [x20, 176]
+	.loc 1 3008 0
+	str	wzr, [x29, 132]
+	.loc 1 3007 0
+	str	w1, [x29, 104]
+	.loc 1 3004 0
+	str	w0, [x29, 88]
+.LBB1492:
+.LBB1488:
+.LBB1484:
+.LBB1476:
+.LBB1473:
+	.loc 5 77 0
+	ldr	x1, [x2, 8]
+.LVL254:
+	.loc 5 84 0
+	tbnz	x3, 21, .L170
+.LBB1469:
+.LBB1470:
+.LBB1471:
+	.loc 6 106 0
+	ldr	x2, [x2]
+.LVL255:
+.LBE1471:
+.LBE1470:
+.LBE1469:
+.LBE1473:
+.LBE1476:
+.LBE1484:
+.LBE1488:
+.LBE1492:
+	.loc 1 2948 0
+	mov	x0, x21
+.LVL256:
+.LBB1493:
+.LBB1489:
+.LBB1485:
+.LBB1477:
+.LBB1474:
+	.loc 5 84 0
+	tbnz	x2, 26, .L170
+.LVL257:
+.L171:
+	.loc 5 89 0
+#APP
+// 89 "./arch/arm64/include/asm/uaccess.h" 1
+		adds	x0, x0, 64
+	csel	x1, xzr, x1, hi
+	csinv	x0, x0, xzr, cc
+	sbcs	xzr, x0, x1
+	cset	x0, ls
+
+// 0 "" 2
+.LVL258:
+#NO_APP
+.LBE1474:
+.LBE1477:
+	.loc 8 132 0
+	cbnz	x0, .L172
+.LVL259:
+.L173:
+.LBE1485:
+.LBE1489:
+.LBE1493:
+	.loc 1 3012 0
+	mov	x0, x25
+.LVL260:
+	bl	ebc_buf_release
+.LVL261:
+	.loc 1 3013 0
+	mov	x0, -14
+	b	.L134
+.LVL262:
+	.p2align 3
+.L158:
+	.loc 1 3061 0
+	bl	ebc_drop_one_dsp_buf
+.LVL263:
+	cbz	w0, .L259
+.LVL264:
+	.p2align 2
+.L260:
+	.loc 1 3100 0
+	mov	x0, -14
+.LVL265:
+	b	.L134
+.LVL266:
+	.p2align 3
+.L268:
+.LBB1494:
+.LBB1294:
+.LBB1292:
+.LBB1290:
+.LBB1280:
+.LBB1277:
+.LBB1278:
+.LBB1279:
+	.loc 6 106 0
+	ldr	x2, [x0]
+.LBE1279:
+.LBE1278:
+.LBE1277:
+.LBE1280:
+.LBE1290:
+.LBE1292:
+.LBE1294:
+.LBE1494:
+	.loc 1 2948 0
+	mov	x0, x21
+.LVL267:
+.LBB1495:
+.LBB1295:
+.LBB1293:
+.LBB1291:
+.LBB1281:
+	.loc 5 84 0
+	tbz	x2, 26, .L182
+	b	.L181
+.LVL268:
+	.p2align 3
+.L272:
+.LBE1281:
+.LBE1291:
+.LBE1293:
+.LBE1295:
+.LBE1495:
+.LBB1496:
+.LBB1398:
+.LBB1394:
+.LBB1383:
+.LBB1380:
+.LBB1376:
+.LBB1377:
+.LBB1378:
+	.loc 6 106 0
+	ldr	x2, [x2]
+.LVL269:
+.LBE1378:
+.LBE1377:
+.LBE1376:
+.LBE1380:
+.LBE1383:
+.LBE1394:
+.LBE1398:
+.LBE1496:
+	.loc 1 2948 0
+	mov	x0, x21
+.LVL270:
+.LBB1497:
+.LBB1399:
+.LBB1395:
+.LBB1384:
+.LBB1381:
+	.loc 5 84 0
+	tbz	x2, 26, .L195
+	b	.L194
+.LVL271:
+	.p2align 3
+.L275:
+.LBE1381:
+.LBE1384:
+.LBE1395:
+.LBE1399:
+.LBE1497:
+.LBB1498:
+.LBB1459:
+.LBB1456:
+.LBB1454:
+.LBB1444:
+.LBB1441:
+.LBB1442:
+.LBB1443:
+	.loc 6 106 0
+	ldr	x2, [x0]
+.LBE1443:
+.LBE1442:
+.LBE1441:
+.LBE1444:
+.LBE1454:
+.LBE1456:
+.LBE1459:
+.LBE1498:
+	.loc 1 2948 0
+	mov	x0, x21
+.LVL272:
+.LBB1499:
+.LBB1460:
+.LBB1457:
+.LBB1455:
+.LBB1445:
+	.loc 5 84 0
+	tbz	x2, 26, .L164
+	b	.L163
+.LVL273:
+	.p2align 3
+.L273:
+.LBE1445:
+.LBE1455:
+.LBE1457:
+.LBE1460:
+.LBE1499:
+.LBB1500:
+.LBB1429:
+.LBB1427:
+.LBB1425:
+.LBB1415:
+.LBB1412:
+.LBB1413:
+.LBB1414:
+	.loc 6 106 0
+	ldr	x2, [x0]
+.LBE1414:
+.LBE1413:
+.LBE1412:
+.LBE1415:
+.LBE1425:
+.LBE1427:
+.LBE1429:
+.LBE1500:
+	.loc 1 2948 0
+	mov	x0, x21
+.LVL274:
+.LBB1501:
+.LBB1430:
+.LBB1428:
+.LBB1426:
+.LBB1416:
+	.loc 5 84 0
+	tbz	x2, 26, .L175
+	b	.L174
+.LVL275:
+	.p2align 3
+.L264:
+.LBE1416:
+.LBE1426:
+.LBE1428:
+.LBE1430:
+.LBE1501:
+.LBB1502:
+.LBB1200:
+.LBB1197:
+.LBB1194:
+.LBB1191:
+.LBB1180:
+.LBB1176:
+.LBB1177:
+.LBB1178:
+	.loc 6 106 0
+	ldr	x2, [x1]
+.LBE1178:
+.LBE1177:
+.LBE1176:
+.LBE1180:
+.LBE1191:
+.LBE1194:
+.LBE1197:
+.LBE1200:
+.LBE1502:
+	.loc 1 2948 0
+	mov	x1, x21
+.LVL276:
+.LBB1503:
+.LBB1201:
+.LBB1198:
+.LBB1195:
+.LBB1192:
+.LBB1181:
+	.loc 5 84 0
+	tbz	x2, 26, .L188
+	b	.L187
+.LVL277:
+	.p2align 3
+.L266:
+.LBE1181:
+.LBE1192:
+.LBE1195:
+.LBE1198:
+.LBE1201:
+.LBE1503:
+.LBB1504:
+.LBB1263:
+.LBB1259:
+.LBB1256:
+.LBB1245:
+.LBB1241:
+.LBB1242:
+.LBB1243:
+	.loc 6 106 0
+	ldr	x2, [x0]
+.LBE1243:
+.LBE1242:
+.LBE1241:
+.LBE1245:
+.LBE1256:
+.LBE1259:
+.LBE1263:
+.LBE1504:
+	.loc 1 2948 0
+	mov	x0, x21
+.LVL278:
+.LBB1505:
+.LBB1264:
+.LBB1260:
+.LBB1257:
+.LBB1246:
+	.loc 5 84 0
+	tbz	x2, 26, .L199
+	b	.L198
+.LVL279:
+	.p2align 3
+.L270:
+.LBE1246:
+.LBE1257:
+.LBE1260:
+.LBE1264:
+.LBE1505:
+.LBB1506:
+.LBB1362:
+.LBB1358:
+.LBB1355:
+.LBB1344:
+.LBB1340:
+.LBB1341:
+.LBB1342:
+	.loc 6 106 0
+	ldr	x2, [x0]
+.LBE1342:
+.LBE1341:
+.LBE1340:
+.LBE1344:
+.LBE1355:
+.LBE1358:
+.LBE1362:
+.LBE1506:
+	.loc 1 2948 0
+	mov	x0, x21
+.LVL280:
+.LBB1507:
+.LBB1363:
+.LBB1359:
+.LBB1356:
+.LBB1345:
+	.loc 5 84 0
+	tbz	x2, 26, .L191
+	b	.L190
+.LVL281:
+	.p2align 3
+.L265:
+.LBE1345:
+.LBE1356:
+.LBE1359:
+.LBE1363:
+.LBE1507:
+.LBB1508:
+.LBB1229:
+.LBB1227:
+.LBB1225:
+.LBB1215:
+.LBB1212:
+.LBB1213:
+.LBB1214:
+	.loc 6 106 0
+	ldr	x2, [x1]
+.LBE1214:
+.LBE1213:
+.LBE1212:
+.LBE1215:
+.LBE1225:
+.LBE1227:
+.LBE1229:
+.LBE1508:
+	.loc 1 2948 0
+	mov	x1, x21
+.LVL282:
+.LBB1509:
+.LBB1230:
+.LBB1228:
+.LBB1226:
+.LBB1216:
+	.loc 5 84 0
+	tbz	x2, 26, .L185
+	b	.L184
+.LVL283:
+	.p2align 3
+.L269:
+.LBE1216:
+.LBE1226:
+.LBE1228:
+.LBE1230:
+.LBE1509:
+.LBB1510:
+.LBB1327:
+.LBB1324:
+.LBB1321:
+.LBB1310:
+.LBB1306:
+.LBB1307:
+.LBB1308:
+	.loc 6 106 0
+	ldr	x2, [x1]
+.LBE1308:
+.LBE1307:
+.LBE1306:
+.LBE1310:
+.LBE1321:
+.LBE1324:
+.LBE1327:
+.LBE1510:
+	.loc 1 2948 0
+	mov	x1, x21
+.LVL284:
+.LBB1511:
+.LBB1328:
+.LBB1325:
+.LBB1322:
+.LBB1311:
+	.loc 5 84 0
+	tbz	x2, 26, .L161
+	b	.L160
+.LVL285:
+	.p2align 3
+.L170:
+.LBE1311:
+.LBE1322:
+.LBE1325:
+.LBE1328:
+.LBE1511:
+.LBB1512:
+.LBB1490:
+.LBB1486:
+.LBB1478:
+.LBB1475:
+.LBB1472:
+	.loc 5 86 0
+	and	x0, x21, x22, asr 8
+	b	.L171
+.LVL286:
+.L253:
+.LBE1472:
+.LBE1475:
+.LBE1478:
+.LBE1486:
+.LBE1490:
+.LBE1512:
+	.loc 1 2969 0
+	ldr	x0, [x20, 296]
+	adrp	x2, .LANCHOR2
+	adrp	x1, .LC2
+.LVL287:
+	add	x2, x2, :lo12:.LANCHOR2
+	add	x1, x1, :lo12:.LC2
+	bl	_dev_err
+.LVL288:
+	.loc 1 2970 0
+	mov	x0, -14
+	b	.L134
+.LVL289:
+	.p2align 3
+.L196:
+.LBB1513:
+.LBB1400:
+.LBB1396:
+.LBB1385:
+.LBB1386:
+.LBB1387:
+.LBB1388:
+.LBB1389:
+	.loc 7 157 0
+	sbfx	x1, x21, 0, 56
+.LVL290:
+.LBE1389:
+.LBE1388:
+.LBE1387:
+.LBB1390:
+.LBB1391:
+	.loc 4 19 0
+#APP
+// 19 "./arch/arm64/include/asm/current.h" 1
+	mrs x0, sp_el0
+// 0 "" 2
+.LVL291:
+#NO_APP
+.LBE1391:
+.LBE1390:
+.LBB1392:
+	.loc 5 254 0
+	and	x1, x1, x21
+.LVL292:
+.LBE1392:
+	.loc 5 249 0
+	ldr	x2, [x0, 8]
+.LVL293:
+#APP
+// 249 "./arch/arm64/include/asm/uaccess.h" 1
+		bics	xzr, x1, x2
+	csel	x0, x21, xzr, eq
+
+// 0 "" 2
+.LVL294:
+	.loc 5 257 0
+// 257 "./arch/arm64/include/asm/uaccess.h" 1
+	hint #20
+// 0 "" 2
+#NO_APP
+.LBE1386:
+.LBE1385:
+	.loc 8 134 0
+	mov	x2, 64
+	add	x1, x29, 88
+.LVL295:
+	bl	__arch_copy_to_user
+.LVL296:
+.LBE1396:
+.LBE1400:
+.LBE1513:
+	.loc 1 3112 0
+	cbz	x0, .L259
+	b	.L197
+.LVL297:
+	.p2align 3
+.L172:
+.LBB1514:
+.LBB1491:
+.LBB1487:
+.LBB1479:
+.LBB1480:
+.LBB1481:
+.LBB1482:
+	.loc 4 19 0
+#APP
+// 19 "./arch/arm64/include/asm/current.h" 1
+	mrs x0, sp_el0
+// 0 "" 2
+.LVL298:
+#NO_APP
+.LBE1482:
+.LBE1481:
+.LBB1483:
+	.loc 5 254 0
+	and	x22, x21, x22, asr 8
+.LVL299:
+.LBE1483:
+	.loc 5 249 0
+	ldr	x1, [x0, 8]
+.LVL300:
+#APP
+// 249 "./arch/arm64/include/asm/uaccess.h" 1
+		bics	xzr, x22, x1
+	csel	x0, x21, xzr, eq
+
+// 0 "" 2
+.LVL301:
+	.loc 5 257 0
+// 257 "./arch/arm64/include/asm/uaccess.h" 1
+	hint #20
+// 0 "" 2
+#NO_APP
+.LBE1480:
+.LBE1479:
+	.loc 8 134 0
+	mov	x2, 64
+.LVL302:
+	mov	x1, x24
+	bl	__arch_copy_to_user
+.LVL303:
+.LBE1487:
+.LBE1491:
+.LBE1514:
+	.loc 1 3011 0
+	cbz	w0, .L259
+	b	.L173
+.LVL304:
+	.p2align 3
+.L274:
+	.loc 1 3033 0
+	mov	w2, 1
+	str	w2, [x20, 100]
+	.loc 1 3034 0
+	adrp	x0, .LANCHOR1
+	add	x0, x0, :lo12:.LANCHOR1
+	mov	w1, w2
+	add	x0, x0, 304
+	bl	__wake_up_sync
+.LVL305:
+	b	.L179
+.LVL306:
+.L221:
+.LBB1515:
+.LBB1364:
+.LBB1360:
+	.loc 8 112 0
+	mov	x0, 4
+.LVL307:
+.L192:
+	.loc 8 119 0
+	mov	x2, x0
+	mov	w1, 0
+.LVL308:
+	add	x0, x22, x3
+.LVL309:
+	bl	memset
+.LVL310:
+.LBE1360:
+.LBE1364:
+.LBE1515:
+	.loc 1 3099 0
+	ldr	x0, [x20, 296]
+	adrp	x1, .LC9
+	add	x1, x1, :lo12:.LC9
+	bl	_dev_err
+.LVL311:
+	.loc 1 3100 0
+	mov	x0, -14
+	b	.L134
+.LVL312:
+.L226:
+.LBB1516:
+.LBB1162:
+.LBB1159:
+	.loc 8 112 0
+	mov	x0, 4
+.LVL313:
+.L204:
+	.loc 8 119 0
+	mov	x2, x0
+	mov	w1, 0
+.LVL314:
+	add	x0, x22, x3
+.LVL315:
+	bl	memset
+.LVL316:
+.LBE1159:
+.LBE1162:
+.LBE1516:
+	.loc 1 3128 0
+	ldr	x0, [x20, 296]
+	adrp	x1, .LC12
+	add	x1, x1, :lo12:.LC12
+	bl	_dev_err
+.LVL317:
+	.loc 1 3129 0
+	mov	x0, -14
+	b	.L134
+.LVL318:
+.L224:
+.LBB1517:
+.LBB1265:
+.LBB1261:
+	.loc 8 112 0
+	mov	x0, 4
+.LVL319:
+.L200:
+	.loc 8 119 0
+	mov	x2, x0
+	mov	w1, 0
+.LVL320:
+	add	x0, x22, x3
+.LVL321:
+	bl	memset
+.LVL322:
+.LBE1261:
+.LBE1265:
+.LBE1517:
+	.loc 1 3119 0
+	ldr	x0, [x20, 296]
+	adrp	x1, .LC11
+	add	x1, x1, :lo12:.LC11
+	bl	_dev_err
+.LVL323:
+	.loc 1 3120 0
+	mov	x0, -14
+	b	.L134
+.LVL324:
+.L167:
+	.loc 1 2981 0
+	mov	x0, -1
+	b	.L134
+.LVL325:
+.L263:
+	.loc 1 3139 0
+	bl	__stack_chk_fail
+.LVL326:
+.L166:
+.LBB1518:
+.LBB1461:
+.LBB1458:
+	.loc 8 119 0
+	sub	x0, x24, x0
+.LVL327:
+	mov	x2, x23
+	mov	w1, 0
+	add	x0, x0, 64
+	bl	memset
+.LVL328:
+.LBE1458:
+.LBE1461:
+.LBE1518:
+	.loc 1 2995 0
+	cbz	w23, .L169
+	.loc 1 3100 0
+	mov	x0, -14
+	b	.L134
+.LVL329:
+.L271:
+	mov	x3, 4
+	sub	x3, x3, x0
+.LVL330:
+	b	.L192
+.LVL331:
+.L262:
+	mov	x3, 4
+	sub	x3, x3, x0
+.LVL332:
+	b	.L204
+.LVL333:
+.L267:
+	mov	x3, 4
+	sub	x3, x3, x0
+.LVL334:
+	b	.L200
+	.cfi_endproc
+.LFE2849:
+	.size	ebc_io_ctl, .-ebc_io_ctl
+	.align	2
+	.p2align 3,,7
+	.type	get_overlay_image2, %function
+get_overlay_image2:
+.LFB2821:
+	.loc 1 667 0
+	.cfi_startproc
+.LVL335:
+	stp	x29, x30, [sp, -112]!
+	.cfi_def_cfa_offset 112
+	.cfi_offset 29, -112
+	.cfi_offset 30, -104
+	.loc 1 668 0
+	adrp	x7, .LANCHOR0
+	.loc 1 677 0
+	cmp	w6, 2
+	.loc 1 667 0
+	add	x29, sp, 0
+	.cfi_def_cfa_register 29
+	stp	x23, x24, [sp, 48]
+	.cfi_offset 23, -64
+	.cfi_offset 24, -56
+	mov	x23, x0
+	.loc 1 668 0
+	ldr	x0, [x7, #:lo12:.LANCHOR0]
+.LVL336:
+	.loc 1 667 0
+	stp	x19, x20, [sp, 16]
+	.cfi_offset 19, -96
+	.cfi_offset 20, -88
+	mov	x19, x5
+	stp	x25, x26, [sp, 64]
+	.cfi_offset 25, -48
+	.cfi_offset 26, -40
+	mov	x26, x1
+	stp	x27, x28, [sp, 80]
+	mov	x20, x2
+	stp	x21, x22, [sp, 32]
+	.cfi_offset 27, -32
+	.cfi_offset 28, -24
+	.cfi_offset 21, -80
+	.cfi_offset 22, -72
+	.loc 1 667 0
+	mov	x27, x3
+	mov	x28, x4
+	.loc 1 671 0
+	add	x25, x5, 60
+.LVL337:
+	.loc 1 675 0
+	ldp	w1, w22, [x0, 108]
+.LVL338:
+	.loc 1 674 0
+	lsr	w24, w1, 3
+	.loc 1 677 0
+	beq	.L431
+	.loc 1 680 0
+	cmp	w6, 3
+	beq	.L279
+	lsr	w13, w1, 2
+	mov	x0, 0
+	.loc 1 688 0
+	mov	w21, 0
+.LVL339:
+.L278:
+	.loc 1 692 0
+	sub	w2, w22, w21
+	add	x0, x23, x0
+	mov	w1, 0
+	str	w13, [x29, 108]
+	mul	w2, w2, w13
+	sxtw	x2, w2
+	bl	memset
+.LVL340:
+	.loc 1 694 0
+	cmp	w21, w22
+	bge	.L339
+	ldr	w13, [x29, 108]
+	sub	w11, w24, #1
+	add	x11, x11, 1
+	mov	w3, 0
+.LVL341:
+	lsl	x11, x11, 3
+	mul	w12, w21, w13
+	lsl	w13, w13, 1
+.LVL342:
+	.p2align 2
+.L338:
+.LBB1519:
+	.loc 1 695 0
+	add	x9, x23, x12, sxtw
+	.loc 1 696 0
+	cbz	w24, .L281
+	add	x1, x27, 8
+	add	x8, x28, 8
+	mov	x4, x9
+.LVL343:
+	mov	x7, 0
+.LVL344:
+	.p2align 2
+.L309:
+.LBB1520:
+	.loc 1 697 0
+	ldr	x2, [x26, x7]
+	.loc 1 698 0
+	ldr	x0, [x20, x7]
+.LVL345:
+	.loc 1 700 0
+	cmp	x2, x0
+	beq	.L282
+.LBB1521:
+	.loc 1 703 0
+	eor	x5, x2, x0
+.LVL346:
+	.loc 1 706 0
+	and	x3, x5, 255
+.LVL347:
+	cbz	x3, .L340
+.LBB1522:
+	.loc 1 706 0 is_stmt 0 discriminator 1
+	ldrb	w10, [x8, -8]
+.LVL348:
+	lsr	x6, x0, 3
+.LVL349:
+	ldrb	w3, [x1, -8]
+	ubfx	x16, x2, 3, 5
+	ubfiz	x6, x6, 5, 5
+	ldrb	w15, [x19, 56]
+.LVL350:
+	add	x14, x19, x10, sxtw 3
+.LVL351:
+	orr	x6, x6, x16
+	ldrb	w17, [x19, 57]
+	lsl	w16, w3, 10
+	cmp	w10, 0
+	add	w3, w3, 1
+	ldr	x14, [x14, 128]
+	and	w3, w3, 255
+	csel	w15, w15, w17, eq
+.LBE1522:
+	.loc 1 701 0 is_stmt 1 discriminator 1
+	mov	w10, 0
+.LVL352:
+.LBB1523:
+	.loc 1 706 0 discriminator 1
+	add	x6, x14, x6
+	cmp	w15, w3
+	ldrb	w6, [x6, w16, sxtw]
+.LVL353:
+	beq	.L432
+.L285:
+	.loc 1 706 0 is_stmt 0 discriminator 9
+	strb	w3, [x1, -8]
+.LVL354:
+.L283:
+.LBE1523:
+	.loc 1 707 0 is_stmt 1 discriminator 10
+	tst	x5, 65280
+	beq	.L286
+.LBB1524:
+	.loc 1 707 0 is_stmt 0 discriminator 1
+	ldrb	w16, [x8, -7]
+.LVL355:
+	lsr	x17, x0, 11
+	ldrb	w3, [x1, -7]
+	ubfx	x18, x2, 11, 5
+.LVL356:
+	cmp	w16, 0
+	ubfiz	x17, x17, 5, 5
+	add	x30, x19, x16, sxtw 3
+	orr	x14, x17, x18
+.LVL357:
+	lsl	w17, w3, 10
+	ldrb	w15, [x19, 56]
+.LVL358:
+	ldrb	w18, [x19, 57]
+	add	w3, w3, 1
+	ldr	x16, [x30, 128]
+.LVL359:
+	and	w3, w3, 255
+	csel	w15, w15, w18, eq
+	add	x14, x16, x14
+	cmp	w15, w3
+	ldrb	w14, [x14, w17, sxtw]
+.LVL360:
+	orr	w6, w6, w14, lsl 4
+	beq	.L433
+.L288:
+	.loc 1 707 0 discriminator 9
+	strb	w3, [x1, -7]
+.LVL361:
+.L286:
+.LBE1524:
+	.loc 1 708 0 is_stmt 1 discriminator 10
+	tst	x5, 16711680
+	beq	.L289
+.LBB1525:
+	.loc 1 708 0 is_stmt 0 discriminator 1
+	ldrb	w16, [x8, -6]
+.LVL362:
+	lsr	x17, x0, 19
+	ldrb	w3, [x1, -6]
+	ubfx	x18, x2, 19, 5
+.LVL363:
+	cmp	w16, 0
+	ubfiz	x17, x17, 5, 5
+	add	x30, x19, x16, sxtw 3
+	orr	x14, x17, x18
+.LVL364:
+	lsl	w17, w3, 10
+	ldrb	w15, [x19, 56]
+.LVL365:
+	ldrb	w18, [x19, 57]
+	add	w3, w3, 1
+	ldr	x16, [x30, 128]
+.LVL366:
+	and	w3, w3, 255
+	csel	w15, w15, w18, eq
+	add	x14, x16, x14
+	cmp	w15, w3
+	ldrb	w14, [x14, w17, sxtw]
+.LVL367:
+	orr	w6, w6, w14, lsl 8
+	beq	.L434
+.L291:
+	.loc 1 708 0 discriminator 9
+	strb	w3, [x1, -6]
+.LVL368:
+.L289:
+.LBE1525:
+	.loc 1 709 0 is_stmt 1 discriminator 10
+	tst	x5, 4278190080
+	beq	.L292
+.LBB1526:
+	.loc 1 709 0 is_stmt 0 discriminator 1
+	ldrb	w16, [x8, -5]
+.LVL369:
+	lsr	x17, x0, 27
+	ldrb	w3, [x1, -5]
+	lsr	w18, w2, 27
+.LVL370:
+	cmp	w16, 0
+	ubfiz	x17, x17, 5, 5
+	add	x30, x19, x16, sxtw 3
+	orr	x14, x17, x18
+.LVL371:
+	lsl	w17, w3, 10
+	ldrb	w15, [x19, 56]
+.LVL372:
+	ldrb	w18, [x19, 57]
+	add	w3, w3, 1
+	ldr	x16, [x30, 128]
+.LVL373:
+	and	w3, w3, 255
+	csel	w15, w15, w18, eq
+	add	x14, x16, x14
+	cmp	w15, w3
+	ldrb	w14, [x14, w17, sxtw]
+.LVL374:
+	orr	w6, w6, w14, lsl 12
+	beq	.L435
+.L294:
+	.loc 1 709 0 discriminator 9
+	strb	w3, [x1, -5]
+.LVL375:
+.L292:
+.LBE1526:
+	.loc 1 710 0 is_stmt 1 discriminator 10
+	tst	x5, 1095216660480
+	beq	.L295
+.LBB1527:
+	.loc 1 710 0 is_stmt 0 discriminator 1
+	ldrb	w16, [x8, -4]
+.LVL376:
+	lsr	x17, x0, 35
+	ldrb	w3, [x1, -4]
+	ubfx	x18, x2, 35, 5
+.LVL377:
+	cmp	w16, 0
+	ubfiz	x17, x17, 5, 5
+	add	x30, x19, x16, sxtw 3
+	orr	x14, x17, x18
+.LVL378:
+	lsl	w17, w3, 10
+	ldrb	w15, [x19, 56]
+.LVL379:
+	ldrb	w18, [x19, 57]
+	add	w3, w3, 1
+	ldr	x16, [x30, 128]
+.LVL380:
+	and	w3, w3, 255
+	csel	w15, w15, w18, eq
+	add	x14, x16, x14
+	cmp	w15, w3
+	ldrb	w14, [x14, w17, sxtw]
+.LVL381:
+	orr	w6, w6, w14, lsl 16
+	beq	.L436
+.L297:
+	.loc 1 710 0 discriminator 9
+	strb	w3, [x1, -4]
+.LVL382:
+.L295:
+.LBE1527:
+	.loc 1 711 0 is_stmt 1 discriminator 10
+	tst	x5, 280375465082880
+	beq	.L298
+.LBB1528:
+	.loc 1 711 0 is_stmt 0 discriminator 1
+	ldrb	w16, [x8, -3]
+.LVL383:
+	lsr	x17, x0, 43
+	ldrb	w3, [x1, -3]
+	ubfx	x18, x2, 43, 5
+.LVL384:
+	cmp	w16, 0
+	ubfiz	x17, x17, 5, 5
+	add	x30, x19, x16, sxtw 3
+	orr	x14, x17, x18
+.LVL385:
+	lsl	w17, w3, 10
+	ldrb	w15, [x19, 56]
+.LVL386:
+	ldrb	w18, [x19, 57]
+	add	w3, w3, 1
+	ldr	x16, [x30, 128]
+.LVL387:
+	and	w3, w3, 255
+	csel	w15, w15, w18, eq
+	add	x14, x16, x14
+	cmp	w15, w3
+	ldrb	w14, [x14, w17, sxtw]
+.LVL388:
+	orr	w6, w6, w14, lsl 20
+	beq	.L437
+.L300:
+	.loc 1 711 0 discriminator 9
+	strb	w3, [x1, -3]
+.LVL389:
+.L298:
+.LBE1528:
+	.loc 1 712 0 is_stmt 1 discriminator 10
+	tst	x5, 71776119061217280
+	beq	.L301
+.LBB1529:
+	.loc 1 712 0 is_stmt 0 discriminator 1
+	ldrb	w16, [x8, -2]
+.LVL390:
+	lsr	x17, x0, 51
+	ldrb	w3, [x1, -2]
+	ubfx	x18, x2, 51, 5
+.LVL391:
+	cmp	w16, 0
+	ubfiz	x17, x17, 5, 5
+	add	x30, x19, x16, sxtw 3
+	orr	x14, x17, x18
+.LVL392:
+	lsl	w17, w3, 10
+	ldrb	w15, [x19, 56]
+.LVL393:
+	ldrb	w18, [x19, 57]
+	add	w3, w3, 1
+	ldr	x16, [x30, 128]
+.LVL394:
+	and	w3, w3, 255
+	csel	w15, w15, w18, eq
+	add	x14, x16, x14
+	cmp	w15, w3
+	ldrb	w14, [x14, w17, sxtw]
+.LVL395:
+	orr	w6, w6, w14, lsl 24
+	beq	.L438
+.L303:
+	.loc 1 712 0 discriminator 9
+	strb	w3, [x1, -2]
+.LVL396:
+.L301:
+.LBE1529:
+	.loc 1 713 0 is_stmt 1 discriminator 10
+	tst	x5, -72057594037927936
+	beq	.L304
+.LBB1530:
+	.loc 1 713 0 is_stmt 0 discriminator 1
+	ldrb	w18, [x8, -1]
+.LVL397:
+	lsr	x14, x0, 59
+.LVL398:
+	ldrb	w5, [x1, -1]
+.LVL399:
+	lsl	x14, x14, 5
+	ldrb	w15, [x19, 56]
+.LVL400:
+	cmp	w18, 0
+	add	x3, x19, x18, sxtw 3
+	ldrb	w17, [x19, 57]
+	ubfiz	x16, x5, 10, 8
+	add	w5, w5, 1
+	and	w5, w5, 255
+	csel	w15, w15, w17, eq
+	ldr	x3, [x3, 128]
+	cmp	w15, w5
+	add	x3, x3, x16
+	add	x3, x3, x2, lsr 59
+	ldrb	w3, [x3, x14]
+.LVL401:
+	orr	w6, w6, w3, lsl 28
+	beq	.L439
+	.loc 1 713 0 discriminator 9
+	strb	w5, [x1, -1]
+.LVL402:
+.L304:
+.LBE1530:
+	.loc 1 714 0 is_stmt 1 discriminator 10
+	cbnz	w10, .L307
+.L308:
+	.loc 1 705 0
+	mov	w3, 1
+.LVL403:
+	.loc 1 716 0
+	str	w6, [x4]
+.LVL404:
+.L282:
+	add	x7, x7, 8
+	add	x1, x1, 8
+	add	x8, x8, 8
+	add	x4, x4, 4
+.LBE1521:
+.LBE1520:
+	.loc 1 696 0 discriminator 2
+	cmp	x11, x7
+	bne	.L309
+	add	x27, x27, x11
+.LVL405:
+	add	x28, x28, x11
+.LVL406:
+	add	x20, x20, x11
+.LVL407:
+	add	x26, x26, x11
+	add	x1, x27, 8
+	add	x8, x28, 8
+	.loc 1 696 0 is_stmt 0
+	mov	x7, 0
+.LVL408:
+	.p2align 2
+.L337:
+.LBB1541:
+	.loc 1 727 0 is_stmt 1
+	ldr	x5, [x26, x7]
+.LVL409:
+	.loc 1 728 0
+	ldr	x0, [x20, x7]
+.LVL410:
+	.loc 1 730 0
+	cmp	x5, x0
+	beq	.L310
+.LBB1542:
+	.loc 1 733 0
+	eor	x6, x5, x0
+.LVL411:
+	.loc 1 736 0
+	and	x2, x6, 255
+.LVL412:
+	cbz	x2, .L342
+.LBB1543:
+	.loc 1 736 0 is_stmt 0 discriminator 1
+	ldrb	w10, [x8, -8]
+.LVL413:
+	lsr	x2, x0, 3
+	ldrb	w3, [x1, -8]
+.LVL414:
+	ubfx	x4, x5, 3, 5
+.LVL415:
+	cmp	w10, 0
+	ubfiz	x2, x2, 5, 5
+	add	x16, x19, x10, sxtw 3
+	orr	x2, x2, x4
+	lsl	w15, w3, 10
+.LVL416:
+	ldrb	w4, [x19, 57]
+	ldrb	w14, [x19, 56]
+.LVL417:
+	add	w3, w3, 1
+	ldr	x10, [x16, 128]
+.LVL418:
+	and	w3, w3, 255
+	csel	w14, w14, w4, eq
+.LBE1543:
+	.loc 1 731 0 is_stmt 1 discriminator 1
+	mov	w4, 0
+.LVL419:
+.LBB1544:
+	.loc 1 736 0 discriminator 1
+	add	x2, x10, x2
+	cmp	w14, w3
+	ldrb	w2, [x2, w15, sxtw]
+.LVL420:
+	lsl	w2, w2, 2
+.LVL421:
+	beq	.L440
+.L313:
+	.loc 1 736 0 is_stmt 0 discriminator 9
+	strb	w3, [x1, -8]
+.LVL422:
+.L311:
+.LBE1544:
+	.loc 1 737 0 is_stmt 1 discriminator 10
+	tst	x6, 65280
+	beq	.L314
+.LBB1545:
+	.loc 1 737 0 is_stmt 0 discriminator 1
+	ldrb	w18, [x8, -7]
+.LVL423:
+	lsr	x14, x0, 11
+.LVL424:
+	ldrb	w3, [x1, -7]
+.LVL425:
+	ubfiz	x14, x14, 5, 5
+	ubfx	x10, x5, 11, 5
+.LVL426:
+	ldrb	w15, [x19, 56]
+.LVL427:
+	add	x17, x19, x18, sxtw 3
+	orr	x10, x14, x10
+	lsl	w14, w3, 10
+	ldrb	w16, [x19, 57]
+	cmp	w18, 0
+	add	w3, w3, 1
+	ldr	x17, [x17, 128]
+	and	w3, w3, 255
+	csel	w15, w15, w16, eq
+	add	x10, x17, x10
+	cmp	w15, w3
+	ldrb	w10, [x10, w14, sxtw]
+.LVL428:
+	orr	w2, w2, w10, lsl 6
+	beq	.L441
+.L316:
+	.loc 1 737 0 discriminator 9
+	strb	w3, [x1, -7]
+.LVL429:
+.L314:
+.LBE1545:
+	.loc 1 738 0 is_stmt 1 discriminator 10
+	tst	x6, 16711680
+	beq	.L317
+.LBB1546:
+	.loc 1 738 0 is_stmt 0 discriminator 1
+	ldrb	w18, [x8, -6]
+.LVL430:
+	lsr	x14, x0, 19
+.LVL431:
+	ldrb	w3, [x1, -6]
+.LVL432:
+	ubfiz	x14, x14, 5, 5
+	ubfx	x10, x5, 19, 5
+.LVL433:
+	ldrb	w15, [x19, 56]
+.LVL434:
+	add	x17, x19, x18, sxtw 3
+	orr	x10, x14, x10
+	lsl	w14, w3, 10
+	ldrb	w16, [x19, 57]
+	cmp	w18, 0
+	add	w3, w3, 1
+	ldr	x17, [x17, 128]
+	and	w3, w3, 255
+	csel	w15, w15, w16, eq
+	add	x10, x17, x10
+	cmp	w15, w3
+	ldrb	w10, [x10, w14, sxtw]
+.LVL435:
+	orr	w2, w2, w10, lsl 10
+	beq	.L442
+.L319:
+	.loc 1 738 0 discriminator 9
+	strb	w3, [x1, -6]
+.LVL436:
+.L317:
+.LBE1546:
+	.loc 1 739 0 is_stmt 1 discriminator 10
+	tst	x6, 4278190080
+	beq	.L320
+.LBB1547:
+	.loc 1 739 0 is_stmt 0 discriminator 1
+	ldrb	w18, [x8, -5]
+.LVL437:
+	lsr	x14, x0, 27
+.LVL438:
+	ldrb	w3, [x1, -5]
+.LVL439:
+	ubfiz	x14, x14, 5, 5
+	lsr	w10, w5, 27
+.LVL440:
+	ldrb	w15, [x19, 56]
+.LVL441:
+	add	x17, x19, x18, sxtw 3
+	orr	x10, x14, x10
+	lsl	w14, w3, 10
+	ldrb	w16, [x19, 57]
+	cmp	w18, 0
+	add	w3, w3, 1
+	ldr	x17, [x17, 128]
+	and	w3, w3, 255
+	csel	w15, w15, w16, eq
+	add	x10, x17, x10
+	cmp	w15, w3
+	ldrb	w10, [x10, w14, sxtw]
+.LVL442:
+	orr	w2, w2, w10, lsl 14
+	beq	.L443
+.L322:
+	.loc 1 739 0 discriminator 9
+	strb	w3, [x1, -5]
+.LVL443:
+.L320:
+.LBE1547:
+	.loc 1 740 0 is_stmt 1 discriminator 10
+	tst	x6, 1095216660480
+	beq	.L323
+.LBB1548:
+	.loc 1 740 0 is_stmt 0 discriminator 1
+	ldrb	w18, [x8, -4]
+.LVL444:
+	lsr	x14, x0, 35
+.LVL445:
+	ldrb	w3, [x1, -4]
+.LVL446:
+	ubfiz	x14, x14, 5, 5
+	ubfx	x10, x5, 35, 5
+.LVL447:
+	ldrb	w15, [x19, 56]
+.LVL448:
+	add	x17, x19, x18, sxtw 3
+	orr	x10, x14, x10
+	lsl	w14, w3, 10
+	ldrb	w16, [x19, 57]
+	cmp	w18, 0
+	add	w3, w3, 1
+	ldr	x17, [x17, 128]
+	and	w3, w3, 255
+	csel	w15, w15, w16, eq
+	add	x10, x17, x10
+	cmp	w15, w3
+	ldrb	w10, [x10, w14, sxtw]
+.LVL449:
+	orr	w2, w2, w10, lsl 18
+	beq	.L444
+.L325:
+	.loc 1 740 0 discriminator 9
+	strb	w3, [x1, -4]
+.LVL450:
+.L323:
+.LBE1548:
+	.loc 1 741 0 is_stmt 1 discriminator 10
+	tst	x6, 280375465082880
+	beq	.L326
+.LBB1549:
+	.loc 1 741 0 is_stmt 0 discriminator 1
+	ldrb	w18, [x8, -3]
+.LVL451:
+	lsr	x14, x0, 43
+.LVL452:
+	ldrb	w10, [x1, -3]
+.LVL453:
+	ubfiz	x14, x14, 5, 5
+	ubfx	x3, x5, 43, 5
+.LVL454:
+	ldrb	w15, [x19, 56]
+.LVL455:
+	add	x17, x19, x18, sxtw 3
+	orr	x3, x14, x3
+	lsl	w14, w10, 10
+	ldrb	w16, [x19, 57]
+	cmp	w18, 0
+	add	w10, w10, 1
+	ldr	x17, [x17, 128]
+	and	w10, w10, 255
+	csel	w15, w15, w16, eq
+	add	x3, x17, x3
+	cmp	w15, w10
+	ldrb	w3, [x3, w14, sxtw]
+.LVL456:
+	orr	w2, w2, w3, lsl 22
+	beq	.L445
+.L328:
+	.loc 1 741 0 discriminator 9
+	strb	w10, [x1, -3]
+.LVL457:
+.L326:
+.LBE1549:
+	.loc 1 742 0 is_stmt 1 discriminator 10
+	tst	x6, 71776119061217280
+	beq	.L329
+.LBB1550:
+	.loc 1 742 0 is_stmt 0 discriminator 1
+	ldrb	w18, [x8, -2]
+.LVL458:
+	lsr	x14, x0, 51
+.LVL459:
+	ldrb	w10, [x1, -2]
+.LVL460:
+	ubfiz	x14, x14, 5, 5
+	ubfx	x3, x5, 51, 5
+.LVL461:
+	ldrb	w15, [x19, 56]
+.LVL462:
+	add	x17, x19, x18, sxtw 3
+	orr	x3, x14, x3
+	lsl	w14, w10, 10
+	ldrb	w16, [x19, 57]
+	cmp	w18, 0
+	add	w10, w10, 1
+	ldr	x17, [x17, 128]
+	and	w10, w10, 255
+	csel	w15, w15, w16, eq
+	add	x3, x17, x3
+	cmp	w15, w10
+	ldrb	w3, [x3, w14, sxtw]
+.LVL463:
+	orr	w2, w2, w3, lsl 26
+	beq	.L446
+.L331:
+	.loc 1 742 0 discriminator 9
+	strb	w10, [x1, -2]
+.LVL464:
+.L329:
+.LBE1550:
+	.loc 1 743 0 is_stmt 1 discriminator 10
+	tst	x6, -72057594037927936
+	beq	.L332
+.LBB1551:
+	.loc 1 743 0 is_stmt 0 discriminator 1
+	ldrb	w15, [x8, -1]
+	lsr	x10, x0, 59
+.LVL465:
+	ldrb	w6, [x1, -1]
+.LVL466:
+	lsl	x10, x10, 5
+	ldrb	w14, [x19, 56]
+.LVL467:
+	cmp	w15, 0
+	add	x3, x19, x15, sxtw 3
+.LVL468:
+	ldrb	w17, [x19, 57]
+	ubfiz	x16, x6, 10, 8
+	add	w6, w6, 1
+	and	w6, w6, 255
+	csel	w14, w14, w17, eq
+	ldr	x3, [x3, 128]
+	cmp	w14, w6
+	add	x3, x3, x16
+	add	x3, x3, x5, lsr 59
+	ldrb	w3, [x3, x10]
+.LVL469:
+	orr	w2, w2, w3, lsl 30
+	beq	.L447
+	.loc 1 743 0 discriminator 9
+	strb	w6, [x1, -1]
+.LVL470:
+.L332:
+.LBE1551:
+	.loc 1 744 0 is_stmt 1 discriminator 10
+	cbnz	w4, .L335
+.L336:
+	.loc 1 746 0
+	ldr	w0, [x9]
+.LVL471:
+	.loc 1 735 0
+	mov	w3, 1
+.LVL472:
+	.loc 1 746 0
+	orr	w2, w0, w2
+.LVL473:
+	str	w2, [x9]
+.LVL474:
+.L310:
+	add	x7, x7, 8
+	add	x1, x1, 8
+	add	x8, x8, 8
+	add	x9, x9, 4
+.LBE1542:
+.LBE1541:
+	.loc 1 726 0 discriminator 2
+	cmp	x11, x7
+	bne	.L337
+	add	x27, x27, x11
+	add	x28, x28, x11
+	add	x20, x20, x11
+	add	x26, x26, x11
+.LVL475:
+.L281:
+.LBE1519:
+	.loc 1 694 0
+	add	w21, w21, 2
+	add	w12, w12, w13
+	cmp	w22, w21
+	bgt	.L338
+	.loc 1 756 0
+	str	w3, [x25]
+	.loc 1 757 0
+	ldp	x19, x20, [sp, 16]
+.LVL476:
+	ldp	x21, x22, [sp, 32]
+.LVL477:
+	ldp	x23, x24, [sp, 48]
+.LVL478:
+	ldp	x25, x26, [sp, 64]
+.LVL479:
+	ldp	x27, x28, [sp, 80]
+.LVL480:
+	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
+.LVL481:
+	.p2align 3
+.L439:
+	.cfi_restore_state
+.LBB1564:
+.LBB1561:
+.LBB1539:
+.LBB1531:
+	.loc 1 713 0 discriminator 7
+	and	x0, x0, 72057594037927935
+.LVL482:
+	and	x2, x2, -72057594037927936
+.LVL483:
+	orr	x0, x2, x0
+.LVL484:
+	strb	wzr, [x1, -1]
+.LVL485:
+.L307:
+.LBE1531:
+	.loc 1 715 0
+	str	x0, [x20, x7]
+	b	.L308
+.LVL486:
+	.p2align 3
+.L438:
+.LBB1532:
+	.loc 1 712 0 discriminator 7
+	and	x3, x2, 71776119061217280
+	and	x0, x0, -71776119061217281
+.LVL487:
+	orr	x0, x3, x0
+.LVL488:
+	mov	w10, 1
+	mov	w3, 0
+	b	.L303
+.LVL489:
+	.p2align 3
+.L436:
+.LBE1532:
+.LBB1533:
+	.loc 1 710 0 discriminator 7
+	and	x3, x2, 1095216660480
+	and	x0, x0, -1095216660481
+.LVL490:
+	orr	x0, x3, x0
+.LVL491:
+	mov	w10, 1
+	mov	w3, 0
+	b	.L297
+.LVL492:
+	.p2align 3
+.L437:
+.LBE1533:
+.LBB1534:
+	.loc 1 711 0 discriminator 7
+	and	x3, x2, 280375465082880
+	and	x0, x0, -280375465082881
+.LVL493:
+	orr	x0, x3, x0
+.LVL494:
+	mov	w10, 1
+	mov	w3, 0
+	b	.L300
+.LVL495:
+	.p2align 3
+.L435:
+.LBE1534:
+.LBB1535:
+	.loc 1 709 0 discriminator 7
+	and	x3, x2, 4278190080
+	and	x0, x0, -4278190081
+.LVL496:
+	orr	x0, x3, x0
+.LVL497:
+	mov	w10, 1
+	mov	w3, 0
+	b	.L294
+.LVL498:
+	.p2align 3
+.L433:
+.LBE1535:
+.LBB1536:
+	.loc 1 707 0 discriminator 7
+	and	x3, x2, 65280
+	and	x0, x0, -65281
+.LVL499:
+	orr	x0, x3, x0
+.LVL500:
+	mov	w10, 1
+	mov	w3, 0
+	b	.L288
+.LVL501:
+	.p2align 3
+.L434:
+.LBE1536:
+.LBB1537:
+	.loc 1 708 0 discriminator 7
+	and	x3, x2, 16711680
+	and	x0, x0, -16711681
+.LVL502:
+	orr	x0, x3, x0
+.LVL503:
+	mov	w10, 1
+	mov	w3, 0
+	b	.L291
+.LVL504:
+	.p2align 3
+.L432:
+.LBE1537:
+.LBB1538:
+	.loc 1 706 0 discriminator 7
+	bfi	x0, x2, 0, 8
+	mov	w3, 0
+	mov	w10, 1
+	b	.L285
+.LVL505:
+	.p2align 3
+.L447:
+.LBE1538:
+.LBE1539:
+.LBE1561:
+.LBB1562:
+.LBB1560:
+.LBB1552:
+	.loc 1 743 0 discriminator 7
+	and	x0, x0, 72057594037927935
+.LVL506:
+	and	x5, x5, -72057594037927936
+.LVL507:
+	orr	x0, x5, x0
+.LVL508:
+	strb	wzr, [x1, -1]
+.LVL509:
+.L335:
+.LBE1552:
+	.loc 1 745 0
+	str	x0, [x20, x7]
+	b	.L336
+.LVL510:
+	.p2align 3
+.L444:
+.LBB1553:
+	.loc 1 740 0 discriminator 7
+	and	x3, x5, 1095216660480
+	and	x0, x0, -1095216660481
+.LVL511:
+	orr	x0, x3, x0
+.LVL512:
+	mov	w4, 1
+	mov	w3, 0
+	b	.L325
+.LVL513:
+	.p2align 3
+.L445:
+.LBE1553:
+.LBB1554:
+	.loc 1 741 0 discriminator 7
+	and	x0, x0, -280375465082881
+.LVL514:
+	and	x3, x5, 280375465082880
+.LVL515:
+	orr	x0, x3, x0
+.LVL516:
+	mov	w10, 0
+	mov	w4, 1
+	b	.L328
+.LVL517:
+	.p2align 3
+.L446:
+.LBE1554:
+.LBB1555:
+	.loc 1 742 0 discriminator 7
+	and	x0, x0, -71776119061217281
+.LVL518:
+	and	x3, x5, 71776119061217280
+.LVL519:
+	orr	x0, x3, x0
+.LVL520:
+	mov	w10, 0
+	mov	w4, 1
+	b	.L331
+.LVL521:
+	.p2align 3
+.L442:
+.LBE1555:
+.LBB1556:
+	.loc 1 738 0 discriminator 7
+	and	x3, x5, 16711680
+	and	x0, x0, -16711681
+.LVL522:
+	orr	x0, x3, x0
+.LVL523:
+	mov	w4, 1
+	mov	w3, 0
+	b	.L319
+.LVL524:
+	.p2align 3
+.L443:
+.LBE1556:
+.LBB1557:
+	.loc 1 739 0 discriminator 7
+	and	x3, x5, 4278190080
+	and	x0, x0, -4278190081
+.LVL525:
+	orr	x0, x3, x0
+.LVL526:
+	mov	w4, 1
+	mov	w3, 0
+	b	.L322
+.LVL527:
+	.p2align 3
+.L441:
+.LBE1557:
+.LBB1558:
+	.loc 1 737 0 discriminator 7
+	and	x3, x5, 65280
+	and	x0, x0, -65281
+.LVL528:
+	orr	x0, x3, x0
+.LVL529:
+	mov	w4, 1
+	mov	w3, 0
+	b	.L316
+.LVL530:
+	.p2align 3
+.L440:
+.LBE1558:
+.LBB1559:
+	.loc 1 736 0 discriminator 7
+	bfi	x0, x5, 0, 8
+	mov	w3, 0
+	mov	w4, 1
+	b	.L313
+.LVL531:
+	.p2align 3
+.L342:
+.LBE1559:
+	.loc 1 732 0
+	mov	w2, 0
+.LVL532:
+	.loc 1 731 0
+	mov	w4, 0
+	b	.L311
+.LVL533:
+	.p2align 3
+.L340:
+.LBE1560:
+.LBE1562:
+.LBB1563:
+.LBB1540:
+	.loc 1 702 0
+	mov	w6, 0
+.LVL534:
+	.loc 1 701 0
+	mov	w10, 0
+.LVL535:
+	b	.L283
+.LVL536:
+.L431:
+.LBE1540:
+.LBE1563:
+.LBE1564:
+	.loc 1 679 0
+	add	w22, w22, w22, lsr 31
+.LVL537:
+	lsr	w13, w1, 2
+	asr	w22, w22, 1
+.LVL538:
+	mov	x0, 0
+	.loc 1 678 0
+	mov	w21, 0
+.LVL539:
+	b	.L278
+.LVL540:
+.L279:
+	.loc 1 681 0
+	add	w21, w22, w22, lsr 31
+	lsr	w13, w1, 2
+	asr	w21, w21, 1
+.LVL541:
+	.loc 1 686 0
+	add	x25, x5, 64
+	.loc 1 682 0
+	mul	w0, w24, w21
+	.loc 1 684 0
+	mul	w1, w21, w1
+	.loc 1 682 0
+	sbfiz	x0, x0, 3, 32
+	.loc 1 684 0
+	add	x27, x3, x1
+	.loc 1 682 0
+	add	x26, x26, x0
+	.loc 1 683 0
+	add	x20, x2, x0
+	mul	w0, w21, w13
+	.loc 1 685 0
+	add	x28, x4, x1
+	sxtw	x0, w0
+	b	.L278
+.LVL542:
+.L339:
+	.loc 1 670 0
+	mov	w3, 0
+.LVL543:
+	.loc 1 756 0
+	str	w3, [x25]
+	.loc 1 757 0
+	ldp	x19, x20, [sp, 16]
+.LVL544:
+	ldp	x21, x22, [sp, 32]
+.LVL545:
+	ldp	x23, x24, [sp, 48]
+.LVL546:
+	ldp	x25, x26, [sp, 64]
+.LVL547:
+	ldp	x27, x28, [sp, 80]
+.LVL548:
+	ldp	x29, x30, [sp], 112
+	.cfi_restore 20
+	.cfi_restore 19
+	.cfi_restore 22
+	.cfi_restore 21
+	.cfi_restore 24
+	.cfi_restore 23
+	.cfi_restore 26
+	.cfi_restore 25
+	.cfi_restore 28
+	.cfi_restore 27
+	.cfi_restore 29
+	.cfi_restore 30
+	.cfi_def_cfa 31, 0
+	ret
+	.cfi_endproc
+.LFE2821:
+	.size	get_overlay_image2, .-get_overlay_image2
+	.align	2
+	.p2align 3,,7
+	.type	get_overlay_image, %function
+get_overlay_image:
+.LFB2820:
+	.loc 1 595 0
+	.cfi_startproc
+.LVL549:
+	stp	x29, x30, [sp, -112]!
+	.cfi_def_cfa_offset 112
+	.cfi_offset 29, -112
+	.cfi_offset 30, -104
+	.loc 1 596 0
+	adrp	x7, .LANCHOR0
+	.loc 1 605 0
+	cmp	w6, 2
+	.loc 1 595 0
+	add	x29, sp, 0
+	.cfi_def_cfa_register 29
+	stp	x21, x22, [sp, 32]
+	.cfi_offset 21, -80
+	.cfi_offset 22, -72
+	mov	x21, x1
+	.loc 1 596 0
+	ldr	x22, [x7, #:lo12:.LANCHOR0]
+	.loc 1 595 0
+	stp	x19, x20, [sp, 16]
+	.cfi_offset 19, -96
+	.cfi_offset 20, -88
+	mov	x19, x5
+	.loc 1 602 0
+	add	x22, x22, 24
+	.loc 1 595 0
+	stp	x27, x28, [sp, 80]
+	stp	x23, x24, [sp, 48]
+	mov	x5, x0
+.LVL550:
+	stp	x25, x26, [sp, 64]
+	.cfi_offset 27, -32
+	.cfi_offset 28, -24
+	.cfi_offset 23, -64
+	.cfi_offset 24, -56
+	.cfi_offset 25, -48
+	.cfi_offset 26, -40
+	.loc 1 595 0
+	mov	x20, x2
+	mov	x24, x3
+	mov	x25, x4
+	.loc 1 603 0
+	ldp	w13, w0, [x22, 84]
+.LVL551:
+	.loc 1 599 0
+	add	x28, x19, 60
+.LVL552:
+	.loc 1 602 0
+	lsr	w27, w13, 3
+	.loc 1 605 0
+	beq	.L530
+	mov	w26, w0
+.LVL553:
+	.loc 1 608 0
+	cmp	w6, 3
+	.loc 1 616 0
+	mov	w23, 0
+.LVL554:
+	.loc 1 608 0
+	beq	.L531
+.L450:
+	.loc 1 620 0
+	ldr	w1, [x22, 156]
+	.loc 1 619 0
+	lsr	w13, w13, 2
+.LVL555:
+	.loc 1 620 0
+	cbz	w1, .L451
+	.loc 1 621 0
+	sub	w2, w26, w23
+	sub	w0, w0, w26
+	str	x5, [x29, 96]
+	mov	w1, 0
+	str	w13, [x29, 108]
+	mul	w2, w2, w13
+	mul	w0, w0, w13
+	sxtw	x2, w2
+	add	x0, x5, x0
+	bl	memset
+.LVL556:
+	.loc 1 622 0
+	ldr	w0, [x22, 88]
+	.loc 1 629 0
+	cmp	w23, w26
+	.loc 1 622 0
+	ldr	w13, [x29, 108]
+	sub	w0, w0, #1
+	ldr	x5, [x29, 96]
+.LVL557:
+	sub	w0, w0, w23
+.LVL558:
+	mul	w0, w0, w13
+	.loc 1 623 0
+	neg	w13, w13
+	.loc 1 622 0
+	add	x22, x5, x0
+.LVL559:
+	.loc 1 629 0
+	bge	.L486
+.L540:
+	sub	w12, w27, #1
+	sxtw	x13, w13
+.LVL560:
+	add	x12, x12, 1
+	lsl	w11, w27, 1
+	lsl	x12, x12, 3
+	mov	w3, 0
+.LVL561:
+	.p2align 2
+.L453:
+	.loc 1 630 0 discriminator 1
+	cbz	w27, .L484
+	add	x1, x24, 8
+	add	x6, x25, 8
+	.loc 1 630 0 is_stmt 0
+	mov	w9, 0
+	mov	x7, 0
+	.p2align 2
+.L482:
+.LBB1565:
+	.loc 1 631 0 is_stmt 1
+	ldr	x2, [x21, x7]
+	.loc 1 632 0
+	ldr	x0, [x20, x7]
+	.loc 1 634 0
+	cmp	x2, x0
+	beq	.L455
+.LBB1566:
+	.loc 1 638 0
+	eor	x5, x2, x0
+	.loc 1 636 0
+	add	x4, x22, x9, sxtw
+	.loc 1 641 0
+	and	x3, x5, 255
+.LVL562:
+	cbz	x3, .L487
+.LBB1567:
+	.loc 1 641 0 is_stmt 0 discriminator 1
+	ldrb	w14, [x6, -8]
+.LVL563:
+	lsr	x10, x0, 3
+	ldrb	w3, [x1, -8]
+	ubfiz	x10, x10, 5, 5
+	ubfx	x8, x2, 3, 5
+	ldrb	w15, [x19, 56]
+	add	x18, x19, x14, sxtw 3
+.LVL564:
+	orr	x8, x10, x8
+	lsl	w16, w3, 10
+	ldrb	w17, [x19, 57]
+	cmp	w14, 0
+	add	w3, w3, 1
+	ldr	x10, [x18, 128]
+	and	w3, w3, 255
+	csel	w15, w15, w17, eq
+.LBE1567:
+	.loc 1 635 0 is_stmt 1 discriminator 1
+	mov	w14, 0
+.LVL565:
+.LBB1568:
+	.loc 1 641 0 discriminator 1
+	add	x8, x10, x8
+	cmp	w15, w3
+	ldrb	w8, [x8, w16, sxtw]
+	beq	.L532
+.L458:
+	.loc 1 641 0 is_stmt 0 discriminator 9
+	strb	w3, [x1, -8]
+.LVL566:
+.L456:
+.LBE1568:
+	.loc 1 642 0 is_stmt 1 discriminator 10
+	tst	x5, 65280
+	beq	.L459
+.LBB1569:
+	.loc 1 642 0 is_stmt 0 discriminator 1
+	ldrb	w16, [x6, -7]
+.LVL567:
+	lsr	x17, x0, 11
+	ldrb	w3, [x1, -7]
+	ubfx	x18, x2, 11, 5
+.LVL568:
+	cmp	w16, 0
+	ubfiz	x17, x17, 5, 5
+	add	x30, x19, x16, sxtw 3
+	orr	x10, x17, x18
+	lsl	w17, w3, 10
+	ldrb	w15, [x19, 56]
+	ldrb	w18, [x19, 57]
+	add	w3, w3, 1
+	ldr	x16, [x30, 128]
+.LVL569:
+	and	w3, w3, 255
+	csel	w15, w15, w18, eq
+	add	x10, x16, x10
+	cmp	w15, w3
+	ldrb	w10, [x10, w17, sxtw]
+	ubfiz	w10, w10, 2, 6
+	orr	w8, w10, w8
+	beq	.L533
+.L461:
+	.loc 1 642 0 discriminator 9
+	strb	w3, [x1, -7]
+.LVL570:
+.L459:
+.LBE1569:
+	.loc 1 643 0 is_stmt 1 discriminator 10
+	tst	x5, 16711680
+	beq	.L462
+.LBB1570:
+	.loc 1 643 0 is_stmt 0 discriminator 1
+	ldrb	w16, [x6, -6]
+.LVL571:
+	lsr	x17, x0, 19
+	ldrb	w3, [x1, -6]
+	ubfx	x18, x2, 19, 5
+.LVL572:
+	cmp	w16, 0
+	ubfiz	x17, x17, 5, 5
+	add	x30, x19, x16, sxtw 3
+	orr	x10, x17, x18
+	lsl	w17, w3, 10
+	ldrb	w15, [x19, 56]
+	ldrb	w18, [x19, 57]
+	add	w3, w3, 1
+	ldr	x16, [x30, 128]
+.LVL573:
+	and	w3, w3, 255
+	csel	w15, w15, w18, eq
+	add	x10, x16, x10
+	cmp	w15, w3
+	ldrb	w10, [x10, w17, sxtw]
+	ubfiz	w10, w10, 4, 4
+	orr	w8, w10, w8
+	beq	.L534
+.L464:
+	.loc 1 643 0 discriminator 9
+	strb	w3, [x1, -6]
+.LVL574:
+.L462:
+.LBE1570:
+	.loc 1 644 0 is_stmt 1 discriminator 10
+	tst	x5, 4278190080
+	beq	.L465
+.LBB1571:
+	.loc 1 644 0 is_stmt 0 discriminator 1
+	ldrb	w16, [x6, -5]
+.LVL575:
+	lsr	x17, x0, 27
+	ldrb	w3, [x1, -5]
+	lsr	w18, w2, 27
+.LVL576:
+	cmp	w16, 0
+	ubfiz	x17, x17, 5, 5
+	add	x30, x19, x16, sxtw 3
+	orr	x10, x17, x18
+	lsl	w17, w3, 10
+	ldrb	w15, [x19, 56]
+	ldrb	w18, [x19, 57]
+	add	w3, w3, 1
+	ldr	x16, [x30, 128]
+.LVL577:
+	and	w3, w3, 255
+	csel	w15, w15, w18, eq
+	add	x10, x16, x10
+	cmp	w15, w3
+	ldrb	w10, [x10, w17, sxtw]
+	ubfiz	w10, w10, 6, 2
+	orr	w8, w10, w8
+	beq	.L535
+.L467:
+	.loc 1 644 0 discriminator 9
+	strb	w3, [x1, -5]
+.LVL578:
+.L465:
+.LBE1571:
+	.loc 1 645 0 is_stmt 1 discriminator 10
+	strb	w8, [x4]
+	.loc 1 647 0 discriminator 10
+	tst	x5, 1095216660480
+	.loc 1 646 0 discriminator 10
+	mov	w8, 0
+	.loc 1 647 0 discriminator 10
+	beq	.L468
+.LBB1572:
+	.loc 1 647 0 is_stmt 0 discriminator 1
+	ldrb	w18, [x6, -4]
+.LVL579:
+	lsr	x10, x0, 35
+	ldrb	w3, [x1, -4]
+	ubfiz	x10, x10, 5, 5
+	ubfx	x8, x2, 35, 5
+	ldrb	w15, [x19, 56]
+	add	x17, x19, x18, sxtw 3
+	orr	x8, x10, x8
+	ldrb	w16, [x19, 57]
+	lsl	w10, w3, 10
+	cmp	w18, 0
+	add	w3, w3, 1
+	ldr	x17, [x17, 128]
+	and	w3, w3, 255
+	csel	w15, w15, w16, eq
+	add	x8, x17, x8
+	cmp	w15, w3
+	ldrb	w8, [x8, w10, sxtw]
+	beq	.L536
+.L470:
+	.loc 1 647 0 discriminator 9
+	strb	w3, [x1, -4]
+.LVL580:
+.L468:
+.LBE1572:
+	.loc 1 648 0 is_stmt 1 discriminator 10
+	tst	x5, 280375465082880
+	beq	.L471
+.LBB1573:
+	.loc 1 648 0 is_stmt 0 discriminator 1
+	ldrb	w16, [x6, -3]
+.LVL581:
+	lsr	x17, x0, 43
+	ldrb	w10, [x1, -3]
+	ubfx	x18, x2, 43, 5
+.LVL582:
+	cmp	w16, 0
+	ubfiz	x17, x17, 5, 5
+	add	x30, x19, x16, sxtw 3
+	orr	x3, x17, x18
+	lsl	w17, w10, 10
+	ldrb	w15, [x19, 56]
+	ldrb	w18, [x19, 57]
+	add	w10, w10, 1
+	ldr	x16, [x30, 128]
+.LVL583:
+	and	w10, w10, 255
+	csel	w15, w15, w18, eq
+	add	x3, x16, x3
+	cmp	w15, w10
+	ldrb	w3, [x3, w17, sxtw]
+	ubfiz	w3, w3, 2, 6
+	orr	w8, w3, w8
+	beq	.L537
+.L473:
+	.loc 1 648 0 discriminator 9
+	strb	w10, [x1, -3]
+.LVL584:
+.L471:
+.LBE1573:
+	.loc 1 649 0 is_stmt 1 discriminator 10
+	tst	x5, 71776119061217280
+	beq	.L474
+.LBB1574:
+	.loc 1 649 0 is_stmt 0 discriminator 1
+	ldrb	w16, [x6, -2]
+.LVL585:
+	lsr	x17, x0, 51
+	ldrb	w10, [x1, -2]
+	ubfx	x18, x2, 51, 5
+.LVL586:
+	cmp	w16, 0
+	ubfiz	x17, x17, 5, 5
+	add	x30, x19, x16, sxtw 3
+	orr	x3, x17, x18
+	lsl	w17, w10, 10
+	ldrb	w15, [x19, 56]
+	ldrb	w18, [x19, 57]
+	add	w10, w10, 1
+	ldr	x16, [x30, 128]
+.LVL587:
+	and	w10, w10, 255
+	csel	w15, w15, w18, eq
+	add	x3, x16, x3
+	cmp	w15, w10
+	ldrb	w3, [x3, w17, sxtw]
+	ubfiz	w3, w3, 4, 4
+	orr	w8, w3, w8
+	beq	.L538
+.L476:
+	.loc 1 649 0 discriminator 9
+	strb	w10, [x1, -2]
+.LVL588:
+.L474:
+.LBE1574:
+	.loc 1 650 0 is_stmt 1 discriminator 10
+	tst	x5, -72057594037927936
+	beq	.L477
+.LBB1575:
+	.loc 1 650 0 is_stmt 0 discriminator 1
+	ldrb	w18, [x6, -1]
+.LVL589:
+	lsr	x10, x0, 59
+	ldrb	w5, [x1, -1]
+.LVL590:
+	lsl	x10, x10, 5
+	ldrb	w15, [x19, 56]
+	cmp	w18, 0
+	add	x3, x19, x18, sxtw 3
+	ldrb	w17, [x19, 57]
+	ubfiz	x16, x5, 10, 8
+	add	w5, w5, 1
+	and	w5, w5, 255
+	csel	w15, w15, w17, eq
+	ldr	x3, [x3, 128]
+	cmp	w15, w5
+	add	x3, x3, x16
+	add	x3, x3, x2, lsr 59
+	ldrb	w3, [x3, x10]
+	ubfiz	w3, w3, 6, 2
+	orr	w8, w3, w8
+	beq	.L539
+	.loc 1 650 0 discriminator 9
+	strb	w5, [x1, -1]
+.LVL591:
+.L477:
+.LBE1575:
+	.loc 1 651 0 is_stmt 1 discriminator 10
+	cbnz	w14, .L480
+.L481:
+	.loc 1 653 0
+	strb	w8, [x4, 1]
+	.loc 1 640 0
+	mov	w3, 1
+.LVL592:
+.L455:
+	add	w9, w9, 2
+	add	x7, x7, 8
+	add	x1, x1, 8
+	add	x6, x6, 8
+.LBE1566:
+.LBE1565:
+	.loc 1 630 0 discriminator 2
+	cmp	w9, w11
+	bne	.L482
+	add	x24, x24, x12
+	add	x25, x25, x12
+	add	x20, x20, x12
+	add	x21, x21, x12
+.L484:
+	.loc 1 629 0
+	add	w23, w23, 1
+	add	x22, x22, x13
+	cmp	w26, w23
+	bne	.L453
+	.loc 1 663 0
+	str	w3, [x28]
+	.loc 1 664 0
+	ldp	x19, x20, [sp, 16]
+.LVL593:
+	ldp	x21, x22, [sp, 32]
+.LVL594:
+	ldp	x23, x24, [sp, 48]
+.LVL595:
+	ldp	x25, x26, [sp, 64]
+.LVL596:
+	ldp	x27, x28, [sp, 80]
+.LVL597:
+	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
+.LVL598:
+	.p2align 3
+.L539:
+	.cfi_restore_state
+.LBB1585:
+.LBB1584:
+.LBB1576:
+	.loc 1 650 0 discriminator 7
+	and	x0, x0, 72057594037927935
+.LVL599:
+	and	x2, x2, -72057594037927936
+.LVL600:
+	orr	x0, x2, x0
+.LVL601:
+	strb	wzr, [x1, -1]
+.LVL602:
+.L480:
+.LBE1576:
+	.loc 1 652 0
+	str	x0, [x20, x7]
+	b	.L481
+.LVL603:
+	.p2align 3
+.L538:
+.LBB1577:
+	.loc 1 649 0 discriminator 7
+	and	x0, x0, -71776119061217281
+.LVL604:
+	and	x3, x2, 71776119061217280
+	orr	x0, x3, x0
+.LVL605:
+	mov	w10, 0
+	mov	w14, 1
+	b	.L476
+	.p2align 3
+.L537:
+.LBE1577:
+.LBB1578:
+	.loc 1 648 0 discriminator 7
+	and	x0, x0, -280375465082881
+.LVL606:
+	and	x3, x2, 280375465082880
+	orr	x0, x3, x0
+.LVL607:
+	mov	w10, 0
+	mov	w14, 1
+	b	.L473
+	.p2align 3
+.L535:
+.LBE1578:
+.LBB1579:
+	.loc 1 644 0 discriminator 7
+	and	x3, x2, 4278190080
+	and	x0, x0, -4278190081
+.LVL608:
+	orr	x0, x3, x0
+.LVL609:
+	mov	w14, 1
+	mov	w3, 0
+	b	.L467
+.LVL610:
+	.p2align 3
+.L536:
+.LBE1579:
+.LBB1580:
+	.loc 1 647 0 discriminator 7
+	and	x3, x2, 1095216660480
+	and	x0, x0, -1095216660481
+.LVL611:
+	orr	x0, x3, x0
+.LVL612:
+	mov	w14, 1
+	mov	w3, 0
+	b	.L470
+.LVL613:
+	.p2align 3
+.L534:
+.LBE1580:
+.LBB1581:
+	.loc 1 643 0 discriminator 7
+	and	x3, x2, 16711680
+	and	x0, x0, -16711681
+.LVL614:
+	orr	x0, x3, x0
+.LVL615:
+	mov	w14, 1
+	mov	w3, 0
+	b	.L464
+	.p2align 3
+.L532:
+.LBE1581:
+.LBB1582:
+	.loc 1 641 0 discriminator 7
+	bfi	x0, x2, 0, 8
+	mov	w3, 0
+	mov	w14, 1
+	b	.L458
+	.p2align 3
+.L533:
+.LBE1582:
+.LBB1583:
+	.loc 1 642 0 discriminator 7
+	and	x3, x2, 65280
+	and	x0, x0, -65281
+.LVL616:
+	orr	x0, x3, x0
+.LVL617:
+	mov	w14, 1
+	mov	w3, 0
+	b	.L461
+.LVL618:
+	.p2align 3
+.L487:
+.LBE1583:
+	.loc 1 637 0
+	mov	w8, 0
+	.loc 1 635 0
+	mov	w14, 0
+	b	.L456
+.LVL619:
+.L451:
+.LBE1584:
+.LBE1585:
+	.loc 1 626 0
+	sub	w2, w26, w23
+	.loc 1 625 0
+	mul	w22, w23, w13
+	str	w13, [x29, 108]
+	.loc 1 626 0
+	mov	w1, 0
+	mul	w2, w2, w13
+	.loc 1 625 0
+	add	x22, x5, x22, sxtw
+.LVL620:
+	.loc 1 626 0
+	mov	x0, x22
+	sxtw	x2, w2
+	bl	memset
+.LVL621:
+	ldr	w13, [x29, 108]
+	.loc 1 629 0
+	cmp	w23, w26
+	blt	.L540
+.LVL622:
+.L486:
+	mov	w3, 0
+.LVL623:
+	.loc 1 663 0
+	str	w3, [x28]
+	.loc 1 664 0
+	ldp	x19, x20, [sp, 16]
+.LVL624:
+	ldp	x21, x22, [sp, 32]
+.LVL625:
+	ldp	x23, x24, [sp, 48]
+.LVL626:
+	ldp	x25, x26, [sp, 64]
+.LVL627:
+	ldp	x27, x28, [sp, 80]
+.LVL628:
+	ldp	x29, x30, [sp], 112
+	.cfi_remember_state
+	.cfi_restore 20
+	.cfi_restore 19
+	.cfi_restore 22
+	.cfi_restore 21
+	.cfi_restore 24
+	.cfi_restore 23
+	.cfi_restore 26
+	.cfi_restore 25
+	.cfi_restore 28
+	.cfi_restore 27
+	.cfi_restore 29
+	.cfi_restore 30
+	.cfi_def_cfa 31, 0
+	ret
+.LVL629:
+.L530:
+	.cfi_restore_state
+	.loc 1 607 0
+	add	w26, w0, w0, lsr 31
+	.loc 1 606 0
+	mov	w23, 0
+.LVL630:
+	.loc 1 607 0
+	asr	w26, w26, 1
+.LVL631:
+	b	.L450
+.L531:
+	.loc 1 609 0
+	add	w23, w0, w0, lsr 31
+.LVL632:
+	.loc 1 614 0
+	add	x28, x19, 64
+	.loc 1 609 0
+	asr	w23, w23, 1
+.LVL633:
+	.loc 1 610 0
+	mul	w1, w27, w23
+	sbfiz	x1, x1, 3, 32
+	add	x21, x21, x1
+	.loc 1 611 0
+	add	x20, x2, x1
+	.loc 1 612 0
+	mul	w1, w23, w13
+	add	x24, x3, x1
+	.loc 1 613 0
+	add	x25, x4, x1
+	b	.L450
+	.cfi_endproc
+.LFE2820:
+	.size	get_overlay_image, .-get_overlay_image
+	.align	2
+	.p2align 3,,7
+	.type	frame_done_callback, %function
+frame_done_callback:
+.LFB2838:
+	.loc 1 2069 0
+	.cfi_startproc
+	stp	x29, x30, [sp, -48]!
+	.cfi_def_cfa_offset 48
+	.cfi_offset 29, -48
+	.cfi_offset 30, -40
+	.loc 1 2070 0
+	adrp	x0, .LANCHOR0
+	.loc 1 2069 0
+	add	x29, sp, 0
+	.cfi_def_cfa_register 29
+	stp	x19, x20, [sp, 16]
+	.cfi_offset 19, -32
+	.cfi_offset 20, -24
+	.loc 1 2070 0
+	ldr	x20, [x0, #:lo12:.LANCHOR0]
+	.loc 1 2069 0
+	str	x21, [sp, 32]
+	.cfi_offset 21, -16
+	.loc 1 2072 0
+	add	x19, x20, 192
+	ldr	w1, [x19, 252]
+	cmp	w1, 3
+	beq	.L543
+	cmp	w1, 4
+	beq	.L560
+	add	x2, x0, :lo12:.LANCHOR0
+	.loc 1 2105 0
+	ldr	w0, [x19, 72]
+	cbnz	w0, .L561
+	.loc 1 2110 0
+	ldr	x0, [x19, 104]
+	adrp	x1, .LC19
+	.loc 1 2109 0
+	str	wzr, [x19, 52]
+	.loc 1 2110 0
+	add	x1, x1, :lo12:.LC19
+	bl	_dev_info
+.LVL634:
+.L559:
+	.loc 1 2111 0
+	adrp	x0, .LANCHOR1
+	add	x0, x0, :lo12:.LANCHOR1
+	mov	w2, 1
+	add	x0, x0, 304
+	mov	w1, w2
+	bl	__wake_up_sync
+.LVL635:
+.L541:
+	.loc 1 2115 0
+	ldp	x19, x20, [sp, 16]
+	ldr	x21, [sp, 32]
+	ldp	x29, x30, [sp], 48
+	.cfi_remember_state
+	.cfi_restore 30
+	.cfi_restore 29
+	.cfi_restore 21
+	.cfi_restore 19
+	.cfi_restore 20
+	.cfi_def_cfa 31, 0
+	ret
+	.p2align 3
+.L560:
+	.cfi_restore_state
+	.loc 1 2075 0
+	ldr	w1, [x19, 60]
+	.loc 1 2074 0
+	mov	w21, 1
+	str	w21, [x19, 76]
+	.loc 1 2075 0
+	cbnz	w1, .L548
+	.loc 1 2075 0 is_stmt 0 discriminator 1
+	ldr	w1, [x19, 64]
+	cbnz	w1, .L548
+	.loc 1 2077 0 is_stmt 1
+	ldr	w1, [x19, 68]
+	cbz	w1, .L548
+	.loc 1 2081 0
+	ldr	x0, [x19, 104]
+	adrp	x1, .LC17
+	add	x1, x1, :lo12:.LC17
+	bl	_dev_info
+.LVL636:
+	.loc 1 2083 0
+	ldp	w3, w2, [x19, 92]
+	mov	w1, 0
+	ldr	x0, [x19, 168]
+	mul	w2, w2, w3
+	sxtw	x2, w2
+	bl	memset
+.LVL637:
+	.loc 1 2084 0
+	adrp	x2, jiffies
+	add	x0, x20, 720
+	mov	x1, 402653184
+	ldr	x2, [x2, #:lo12:jiffies]
+	add	x1, x2, x1
+	bl	mod_timer
+.LVL638:
+	.loc 1 2085 0
+	str	wzr, [x19, 52]
+	.loc 1 2086 0
+	adrp	x0, .LANCHOR1
+	add	x0, x0, :lo12:.LANCHOR1
+	mov	w2, w21
+	mov	w1, w21
+	add	x0, x0, 304
+	bl	__wake_up_sync
+.LVL639:
+	b	.L541
+	.p2align 3
+.L543:
+	.loc 1 2090 0
+	ldr	w1, [x19, 60]
+	cbnz	w1, .L548
+	.loc 1 2090 0 is_stmt 0 discriminator 1
+	ldr	w1, [x19, 64]
+	cbz	w1, .L549
+.L548:
+	.loc 1 2091 0 is_stmt 1
+	add	x0, x0, :lo12:.LANCHOR0
+	ldr	x0, [x0, 8]
+	bl	wake_up_process
+.LVL640:
+	.loc 1 2115 0
+	ldr	x21, [sp, 32]
+	ldp	x19, x20, [sp, 16]
+	ldp	x29, x30, [sp], 48
+	.cfi_remember_state
+	.cfi_restore 20
+	.cfi_restore 19
+	.cfi_restore 21
+	.cfi_restore 29
+	.cfi_restore 30
+	.cfi_def_cfa 31, 0
+	ret
+	.p2align 3
+.L549:
+	.cfi_restore_state
+	.loc 1 2092 0
+	ldr	w1, [x19, 68]
+	cbz	w1, .L548
+	.loc 1 2096 0
+	ldr	x0, [x19, 104]
+	adrp	x1, .LC18
+	add	x1, x1, :lo12:.LC18
+	bl	_dev_info
+.LVL641:
+	.loc 1 2098 0
+	ldp	w3, w2, [x19, 92]
+	mov	w1, 0
+	ldr	x0, [x19, 168]
+	mul	w2, w2, w3
+	sxtw	x2, w2
+	bl	memset
+.LVL642:
+	.loc 1 2099 0
+	adrp	x2, jiffies
+	mov	x1, 402653184
+	add	x0, x20, 720
+	ldr	x2, [x2, #:lo12:jiffies]
+	add	x1, x2, x1
+	bl	mod_timer
+.LVL643:
+	.loc 1 2100 0
+	str	wzr, [x19, 52]
+	b	.L559
+	.p2align 3
+.L561:
+	.loc 1 2107 0
+	ldr	x0, [x2, 8]
+	.loc 1 2106 0
+	mov	w1, 1
+	str	w1, [x19, 52]
+	.loc 1 2107 0
+	bl	wake_up_process
+.LVL644:
+	.loc 1 2115 0
+	ldr	x21, [sp, 32]
+	ldp	x19, x20, [sp, 16]
+	ldp	x29, x30, [sp], 48
+	.cfi_restore 20
+	.cfi_restore 19
+	.cfi_restore 21
+	.cfi_restore 29
+	.cfi_restore 30
+	.cfi_def_cfa 31, 0
+	ret
+	.cfi_endproc
+.LFE2838:
+	.size	frame_done_callback, .-frame_done_callback
+	.align	2
+	.p2align 3,,7
+	.type	ebc_frame_timeout, %function
+ebc_frame_timeout:
+.LFB2847:
+	.loc 1 2868 0
+	.cfi_startproc
+.LVL645:
+	stp	x29, x30, [sp, -16]!
+	.cfi_def_cfa_offset 16
+	.cfi_offset 29, -16
+	.cfi_offset 30, -8
+	add	x29, sp, 0
+	.cfi_def_cfa_register 29
+	.loc 1 2869 0
+	bl	frame_done_callback
+.LVL646:
+	.loc 1 2871 0
+	ldp	x29, x30, [sp], 16
+	.cfi_restore 30
+	.cfi_restore 29
+	.cfi_def_cfa 31, 0
+	ret
+	.cfi_endproc
+.LFE2847:
+	.size	ebc_frame_timeout, .-ebc_frame_timeout
+	.align	2
+	.p2align 3,,7
+	.type	ebc_lut_update, %function
+ebc_lut_update:
+.LFB2840:
+	.loc 1 2161 0
+	.cfi_startproc
+.LVL647:
+	stp	x29, x30, [sp, -64]!
+	.cfi_def_cfa_offset 64
+	.cfi_offset 29, -64
+	.cfi_offset 30, -56
+	.loc 1 2163 0
+	mov	w4, 25
+	.loc 1 2161 0
+	add	x29, sp, 0
+	.cfi_def_cfa_register 29
+	stp	x19, x20, [sp, 16]
+	.cfi_offset 19, -48
+	.cfi_offset 20, -40
+	mov	x20, x0
+	stp	x21, x22, [sp, 32]
+	.cfi_offset 21, -32
+	.cfi_offset 22, -24
+	.loc 1 2163 0
+	add	x0, x29, 64
+.LVL648:
+	.loc 1 2161 0
+	adrp	x19, __stack_chk_guard
+	add	x3, x19, :lo12:__stack_chk_guard
+	.loc 1 2168 0
+	ldr	x2, [x20, 16]
+	.loc 1 2161 0
+	mov	w22, w1
+	.loc 1 2163 0
+	str	w4, [x0, -12]!
+.LVL649:
+	.loc 1 2161 0
+	ldr	x1, [x3]
+	str	x1, [x29, 56]
+	mov	x1,0
+.LVL650:
+.LBB1586:
+.LBB1587:
+	.loc 3 50 0
+	mov	x1, x0
+	mov	x0, x2
+	ldr	x2, [x2, 56]
+	blr	x2
+.LVL651:
+.LBE1587:
+.LBE1586:
+	.loc 1 2169 0
+	cbnz	w0, .L565
+.LVL652:
+	.loc 1 2170 0
+	ldr	w2, [x29, 52]
+	.loc 1 2171 0
+	add	x21, x20, 192
+	.loc 1 2170 0
+	tbnz	w2, #31, .L588
+	.loc 1 2174 0
+	cmp	w2, 50
+	bgt	.L589
+.L567:
+	.loc 1 2182 0
+	ldr	x0, [x21, 104]
+	adrp	x1, .LC23
+	add	x1, x1, :lo12:.LC23
+	bl	_dev_info
+.LVL653:
+	.loc 1 2185 0
+	cmp	w22, 23
+	bls	.L590
+.L568:
+	.loc 1 2241 0
+	mov	w0, 12
+	.loc 1 2242 0
+	mov	w1, 3
+	.loc 1 2241 0
+	str	w0, [x21, 144]
+	.p2align 2
+.L571:
+	.loc 1 2245 0
+	ldr	w2, [x29, 52]
+	add	x0, x20, 304
+	mov	w3, 32
+	bl	epd_lut_get
+.LVL654:
+	mov	w20, w0
+.LVL655:
+	.loc 1 2246 0
+	cbz	w0, .L564
+	.loc 1 2247 0
+	ldr	x0, [x21, 104]
+	adrp	x1, .LC24
+	add	x1, x1, :lo12:.LC24
+	bl	_dev_err
+.LVL656:
+.L564:
+	.loc 1 2252 0
+	add	x19, x19, :lo12:__stack_chk_guard
+	mov	w0, w20
+	ldr	x2, [x29, 56]
+	ldr	x1, [x19]
+	eor	x1, x2, x1
+	cbnz	x1, .L591
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+.LVL657:
+	ldp	x29, x30, [sp], 64
+	.cfi_remember_state
+	.cfi_restore 30
+	.cfi_restore 29
+	.cfi_restore 21
+	.cfi_restore 22
+	.cfi_restore 19
+	.cfi_restore 20
+	.cfi_def_cfa 31, 0
+	ret
+.LVL658:
+	.p2align 3
+.L590:
+	.cfi_restore_state
+	.loc 1 2185 0
+	adrp	x0, .L570
+	add	x0, x0, :lo12:.L570
+	ldrb	w0, [x0,w22,uxtw]
+	adr	x1, .Lrtx570
+	add	x0, x1, w0, sxtb #2
+	br	x0
+.Lrtx570:
+	.section	.rodata
+	.align	0
+	.align	2
+.L570:
+	.byte	(.L568 - .Lrtx570) / 4
+	.byte	(.L582 - .Lrtx570) / 4
+	.byte	(.L568 - .Lrtx570) / 4
+	.byte	(.L572 - .Lrtx570) / 4
+	.byte	(.L573 - .Lrtx570) / 4
+	.byte	(.L574 - .Lrtx570) / 4
+	.byte	(.L575 - .Lrtx570) / 4
+	.byte	(.L568 - .Lrtx570) / 4
+	.byte	(.L572 - .Lrtx570) / 4
+	.byte	(.L573 - .Lrtx570) / 4
+	.byte	(.L574 - .Lrtx570) / 4
+	.byte	(.L575 - .Lrtx570) / 4
+	.byte	(.L576 - .Lrtx570) / 4
+	.byte	(.L576 - .Lrtx570) / 4
+	.byte	(.L577 - .Lrtx570) / 4
+	.byte	(.L578 - .Lrtx570) / 4
+	.byte	(.L577 - .Lrtx570) / 4
+	.byte	(.L579 - .Lrtx570) / 4
+	.byte	(.L568 - .Lrtx570) / 4
+	.byte	(.L568 - .Lrtx570) / 4
+	.byte	(.L568 - .Lrtx570) / 4
+	.byte	(.L568 - .Lrtx570) / 4
+	.byte	(.L577 - .Lrtx570) / 4
+	.byte	(.L578 - .Lrtx570) / 4
+	.text
+.LVL659:
+	.p2align 3
+.L565:
+	.loc 1 2180 0
+	add	x21, x20, 192
+	mov	w2, w0
+	adrp	x1, .LC22
+	add	x1, x1, :lo12:.LC22
+	ldr	x0, [x21, 104]
+	bl	_dev_err
+.LVL660:
+	ldr	w2, [x29, 52]
+	b	.L567
+	.p2align 3
+.L589:
+	.loc 1 2175 0
+	ldr	x0, [x21, 104]
+	adrp	x1, .LC21
+	add	x1, x1, :lo12:.LC21
+	bl	_dev_info
+.LVL661:
+	.loc 1 2176 0
+	mov	w2, 50
+	str	w2, [x29, 52]
+.LVL662:
+	b	.L567
+	.p2align 3
+.L582:
+	.loc 1 2185 0
+	mov	w1, 10
+	b	.L571
+	.p2align 3
+.L579:
+	.loc 1 2189 0
+	mov	w1, 0
+	.loc 1 2188 0
+	str	wzr, [x21, 144]
+	.loc 1 2189 0
+	b	.L571
+	.p2align 3
+.L572:
+	.loc 1 2222 0
+	mov	w0, 12
+	.loc 1 2223 0
+	mov	w1, 4
+	.loc 1 2222 0
+	str	w0, [x21, 144]
+	.loc 1 2223 0
+	b	.L571
+	.p2align 3
+.L573:
+	.loc 1 2227 0
+	mov	w0, 12
+	.loc 1 2228 0
+	mov	w1, 5
+	.loc 1 2227 0
+	str	w0, [x21, 144]
+	.loc 1 2228 0
+	b	.L571
+	.p2align 3
+.L574:
+	.loc 1 2232 0
+	mov	w0, 12
+	.loc 1 2233 0
+	mov	w1, 6
+	.loc 1 2232 0
+	str	w0, [x21, 144]
+	.loc 1 2233 0
+	b	.L571
+	.p2align 3
+.L575:
+	.loc 1 2237 0
+	mov	w0, 12
+	.loc 1 2238 0
+	mov	w1, 8
+	.loc 1 2237 0
+	str	w0, [x21, 144]
+	.loc 1 2238 0
+	b	.L571
+	.p2align 3
+.L576:
+	.loc 1 2206 0
+	mov	w1, 7
+	str	w1, [x21, 144]
+	.loc 1 2207 0
+	b	.L571
+	.p2align 3
+.L577:
+	.loc 1 2212 0
+	mov	w1, 1
+	str	w1, [x21, 144]
+	.loc 1 2213 0
+	b	.L571
+	.p2align 3
+.L578:
+	.loc 1 2217 0
+	mov	w1, 2
+	str	w1, [x21, 144]
+	.loc 1 2218 0
+	b	.L571
+	.p2align 3
+.L588:
+	.loc 1 2171 0
+	ldr	x0, [x21, 104]
+	adrp	x1, .LC20
+	add	x1, x1, :lo12:.LC20
+	bl	_dev_info
+.LVL663:
+	.loc 1 2172 0
+	str	wzr, [x29, 52]
+	mov	w2, 0
+	b	.L567
+.LVL664:
+.L591:
+	.loc 1 2252 0
+	bl	__stack_chk_fail
+.LVL665:
+	.cfi_endproc
+.LFE2840:
+	.size	ebc_lut_update, .-ebc_lut_update
+	.align	2
+	.p2align 3,,7
+	.type	ebc_state_read, %function
+ebc_state_read:
+.LFB2860:
+	.loc 1 3298 0
+	.cfi_startproc
+.LVL666:
+	stp	x29, x30, [sp, -16]!
+	.cfi_def_cfa_offset 16
+	.cfi_offset 29, -16
+	.cfi_offset 30, -8
+	.loc 1 3299 0
+	adrp	x3, .LANCHOR0
+	.loc 1 3298 0
+	mov	x0, x2
+.LVL667:
+	.loc 1 3299 0
+	adrp	x1, .LC25
+.LVL668:
+	.loc 1 3298 0
+	add	x29, sp, 0
+	.cfi_def_cfa_register 29
+	.loc 1 3299 0
+	ldr	x2, [x3, #:lo12:.LANCHOR0]
+.LVL669:
+	add	x1, x1, :lo12:.LC25
+	ldr	w2, [x2, 656]
+	bl	sprintf
+.LVL670:
+	.loc 1 3300 0
+	sxtw	x0, w0
+	ldp	x29, x30, [sp], 16
+	.cfi_restore 30
+	.cfi_restore 29
+	.cfi_def_cfa 31, 0
+	ret
+	.cfi_endproc
+.LFE2860:
+	.size	ebc_state_read, .-ebc_state_read
+	.align	2
+	.p2align 3,,7
+	.type	ebc_version_read, %function
+ebc_version_read:
+.LFB2859:
+	.loc 1 3289 0
+	.cfi_startproc
+.LVL671:
+	stp	x29, x30, [sp, -16]!
+	.cfi_def_cfa_offset 16
+	.cfi_offset 29, -16
+	.cfi_offset 30, -8
+	mov	x0, x2
+.LVL672:
+	.loc 1 3290 0
+	adrp	x1, .LC27
+.LVL673:
+	adrp	x2, .LC26
+.LVL674:
+	.loc 1 3289 0
+	add	x29, sp, 0
+	.cfi_def_cfa_register 29
+	.loc 1 3290 0
+	add	x2, x2, :lo12:.LC26
+	.loc 1 3289 0
+	.loc 1 3290 0
+	add	x1, x1, :lo12:.LC27
+	bl	sprintf
+.LVL675:
+	.loc 1 3291 0
+	sxtw	x0, w0
+	ldp	x29, x30, [sp], 16
+	.cfi_restore 30
+	.cfi_restore 29
+	.cfi_def_cfa 31, 0
+	ret
+	.cfi_endproc
+.LFE2859:
+	.size	ebc_version_read, .-ebc_version_read
+	.align	2
+	.p2align 3,,7
+	.type	pmic_vcom_read, %function
+pmic_vcom_read:
+.LFB2857:
+	.loc 1 3253 0
+	.cfi_startproc
+.LVL676:
+	stp	x29, x30, [sp, -32]!
+	.cfi_def_cfa_offset 32
+	.cfi_offset 29, -32
+	.cfi_offset 30, -24
+	.loc 1 3254 0
+	adrp	x0, .LANCHOR0
+.LVL677:
+	.loc 1 3253 0
+	add	x29, sp, 0
+	.cfi_def_cfa_register 29
+	.loc 1 3257 0
+	ldr	x0, [x0, #:lo12:.LANCHOR0]
+	.loc 1 3253 0
+	str	x19, [sp, 16]
+	.cfi_offset 19, -16
+	.loc 1 3253 0
+	mov	x19, x2
+	.loc 1 3257 0
+	ldr	x1, [x0, 16]
+.LVL678:
+.LBB1588:
+.LBB1589:
+	.loc 3 55 0
+	mov	x0, x1
+	ldr	x1, [x1, 64]
+	blr	x1
+.LVL679:
+.LBE1589:
+.LBE1588:
+	.loc 1 3259 0
+	mov	w2, w0
+	adrp	x1, .LC25
+	mov	x0, x19
+	add	x1, x1, :lo12:.LC25
+	bl	sprintf
+.LVL680:
+	.loc 1 3260 0
+	sxtw	x0, w0
+	ldr	x19, [sp, 16]
+.LVL681:
+	ldp	x29, x30, [sp], 32
+	.cfi_restore 30
+	.cfi_restore 29
+	.cfi_restore 19
+	.cfi_def_cfa 31, 0
+	ret
+	.cfi_endproc
+.LFE2857:
+	.size	pmic_vcom_read, .-pmic_vcom_read
+	.align	2
+	.p2align 3,,7
+	.type	pmic_temp_read, %function
+pmic_temp_read:
+.LFB2856:
+	.loc 1 3239 0
+	.cfi_startproc
+.LVL682:
+	stp	x29, x30, [sp, -48]!
+	.cfi_def_cfa_offset 48
+	.cfi_offset 29, -48
+	.cfi_offset 30, -40
+	.loc 1 3240 0
+	adrp	x0, .LANCHOR0
+.LVL683:
+	.loc 1 3239 0
+	add	x29, sp, 0
+	.cfi_def_cfa_register 29
+	.loc 1 3243 0
+	ldr	x0, [x0, #:lo12:.LANCHOR0]
+.LBB1590:
+.LBB1591:
+	.loc 3 50 0
+	add	x1, x29, 36
+.LVL684:
+.LBE1591:
+.LBE1590:
+	.loc 1 3239 0
+	stp	x19, x20, [sp, 16]
+	.cfi_offset 19, -32
+	.cfi_offset 20, -24
+	.loc 1 3239 0
+	adrp	x19, __stack_chk_guard
+	add	x19, x19, :lo12:__stack_chk_guard
+	mov	x20, x2
+	ldr	x2, [x19]
+	str	x2, [x29, 40]
+	mov	x2,0
+.LVL685:
+	.loc 1 3243 0
+	ldr	x2, [x0, 16]
+.LBB1593:
+.LBB1592:
+	.loc 3 50 0
+	mov	x0, x2
+	ldr	x2, [x2, 56]
+	blr	x2
+.LVL686:
+.LBE1592:
+.LBE1593:
+	.loc 1 3245 0
+	ldr	w2, [x29, 36]
+	adrp	x1, .LC25
+	mov	x0, x20
+	add	x1, x1, :lo12:.LC25
+	bl	sprintf
+.LVL687:
+	.loc 1 3246 0
+	ldr	x2, [x29, 40]
+	ldr	x1, [x19]
+	eor	x1, x2, x1
+	cbnz	x1, .L601
+	ldp	x19, x20, [sp, 16]
+.LVL688:
+	sxtw	x0, w0
+	ldp	x29, x30, [sp], 48
+	.cfi_remember_state
+	.cfi_restore 30
+	.cfi_restore 29
+	.cfi_restore 19
+	.cfi_restore 20
+	.cfi_def_cfa 31, 0
+	ret
+.LVL689:
+.L601:
+	.cfi_restore_state
+	bl	__stack_chk_fail
+.LVL690:
+	.cfi_endproc
+.LFE2856:
+	.size	pmic_temp_read, .-pmic_temp_read
+	.align	2
+	.p2align 3,,7
+	.type	pmic_name_read, %function
+pmic_name_read:
+.LFB2855:
+	.loc 1 3228 0
+	.cfi_startproc
+.LVL691:
+	stp	x29, x30, [sp, -16]!
+	.cfi_def_cfa_offset 16
+	.cfi_offset 29, -16
+	.cfi_offset 30, -8
+	.loc 1 3229 0
+	adrp	x3, .LANCHOR0
+	.loc 1 3228 0
+	mov	x0, x2
+.LVL692:
+	.loc 1 3231 0
+	adrp	x1, .LC27
+.LVL693:
+	.loc 1 3228 0
+	add	x29, sp, 0
+	.cfi_def_cfa_register 29
+	.loc 1 3231 0
+	ldr	x2, [x3, #:lo12:.LANCHOR0]
+.LVL694:
+	add	x1, x1, :lo12:.LC27
+	ldr	x2, [x2, 16]
+	add	x2, x2, 8
+	bl	sprintf
+.LVL695:
+	.loc 1 3232 0
+	sxtw	x0, w0
+	ldp	x29, x30, [sp], 16
+	.cfi_restore 30
+	.cfi_restore 29
+	.cfi_def_cfa 31, 0
+	ret
+	.cfi_endproc
+.LFE2855:
+	.size	pmic_name_read, .-pmic_name_read
+	.align	2
+	.p2align 3,,7
+	.type	ebc_buf_state_read, %function
+ebc_buf_state_read:
+.LFB2861:
+	.loc 1 3307 0
+	.cfi_startproc
+.LVL696:
+	stp	x29, x30, [sp, -16]!
+	.cfi_def_cfa_offset 16
+	.cfi_offset 29, -16
+	.cfi_offset 30, -8
+	.loc 1 3308 0
+	mov	x0, x2
+.LVL697:
+	.loc 1 3307 0
+	add	x29, sp, 0
+	.cfi_def_cfa_register 29
+	.loc 1 3308 0
+	bl	ebc_buf_state_show
+.LVL698:
+	.loc 1 3309 0
+	sxtw	x0, w0
+	ldp	x29, x30, [sp], 16
+	.cfi_restore 30
+	.cfi_restore 29
+	.cfi_def_cfa 31, 0
+	ret
+	.cfi_endproc
+.LFE2861:
+	.size	ebc_buf_state_read, .-ebc_buf_state_read
+	.align	2
+	.p2align 3,,7
+	.type	pmic_vcom_write, %function
+pmic_vcom_write:
+.LFB2858:
+	.loc 1 3265 0
+	.cfi_startproc
+.LVL699:
+	stp	x29, x30, [sp, -64]!
+	.cfi_def_cfa_offset 64
+	.cfi_offset 29, -64
+	.cfi_offset 30, -56
+	.loc 1 3266 0
+	adrp	x0, .LANCHOR0
+.LVL700:
+	.loc 1 3265 0
+	add	x29, sp, 0
+	.cfi_def_cfa_register 29
+	stp	x19, x20, [sp, 16]
+	.cfi_offset 19, -48
+	.cfi_offset 20, -40
+	adrp	x19, __stack_chk_guard
+	stp	x21, x22, [sp, 32]
+	.cfi_offset 21, -32
+	.cfi_offset 22, -24
+	.loc 1 3265 0
+	add	x1, x19, :lo12:__stack_chk_guard
+.LVL701:
+	mov	x21, x2
+	.loc 1 3266 0
+	ldr	x22, [x0, #:lo12:.LANCHOR0]
+.LVL702:
+	.loc 1 3265 0
+	ldr	x2, [x1]
+	str	x2, [x29, 56]
+	mov	x2,0
+.LVL703:
+	mov	x20, x3
+	.loc 1 3269 0
+	add	x2, x29, 52
+	mov	w1, 0
+	mov	x0, x21
+	bl	kstrtouint
+.LVL704:
+	.loc 1 3270 0
+	cbnz	w0, .L613
+.LVL705:
+	.loc 1 3274 0
+	ldr	w1, [x29, 52]
+	ldr	x0, [x22, 16]
+	bl	ebc_pmic_set_vcom
+.LVL706:
+	.loc 1 3275 0
+	cbnz	w0, .L614
+.L606:
+	.loc 1 3281 0
+	add	x19, x19, :lo12:__stack_chk_guard
+	mov	x0, x20
+.LVL707:
+	ldr	x2, [x29, 56]
+	ldr	x1, [x19]
+	eor	x1, x2, x1
+	cbnz	x1, .L615
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+.LVL708:
+	ldp	x29, x30, [sp], 64
+	.cfi_remember_state
+	.cfi_restore 30
+	.cfi_restore 29
+	.cfi_restore 21
+	.cfi_restore 22
+	.cfi_restore 19
+	.cfi_restore 20
+	.cfi_def_cfa 31, 0
+	ret
+.LVL709:
+	.p2align 3
+.L613:
+	.cfi_restore_state
+	.loc 1 3271 0
+	ldr	x0, [x22]
+	adrp	x1, .LC28
+	mov	x2, x21
+	add	x1, x1, :lo12:.LC28
+	.loc 1 3272 0
+	mov	x20, -1
+.LVL710:
+	.loc 1 3271 0
+	bl	_dev_err
+.LVL711:
+	.loc 1 3272 0
+	b	.L606
+.LVL712:
+	.p2align 3
+.L614:
+	.loc 1 3276 0
+	ldr	x0, [x22]
+	adrp	x1, .LC29
+	.loc 1 3277 0
+	mov	x20, -1
+.LVL713:
+	.loc 1 3276 0
+	add	x1, x1, :lo12:.LC29
+	bl	_dev_err
+.LVL714:
+	.loc 1 3277 0
+	b	.L606
+.L615:
+	.loc 1 3281 0
+	bl	__stack_chk_fail
+.LVL715:
+	.cfi_endproc
+.LFE2858:
+	.size	pmic_vcom_write, .-pmic_vcom_write
+	.align	2
+	.p2align 3,,7
+	.type	waveform_version_read, %function
+waveform_version_read:
+.LFB2854:
+	.loc 1 3217 0
+	.cfi_startproc
+.LVL716:
+	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 3217 0
+	mov	x19, x2
+	.loc 1 3218 0
+	bl	epd_lut_get_wf_version
+.LVL717:
+	.loc 1 3220 0
+	mov	x2, x0
+	adrp	x1, .LC27
+	mov	x0, x19
+	add	x1, x1, :lo12:.LC27
+	bl	sprintf
+.LVL718:
+	.loc 1 3221 0
+	sxtw	x0, w0
+	ldr	x19, [sp, 16]
+.LVL719:
+	ldp	x29, x30, [sp], 32
+	.cfi_restore 30
+	.cfi_restore 29
+	.cfi_restore 19
+	.cfi_def_cfa 31, 0
+	ret
+	.cfi_endproc
+.LFE2854:
+	.size	waveform_version_read, .-waveform_version_read
+	.section	.init.text,"ax",@progbits
+	.align	2
+	.type	ebc_init, %function
+ebc_init:
+.LFB2874:
+	.loc 1 3822 0
+	.cfi_startproc
+	stp	x29, x30, [sp, -16]!
+	.cfi_def_cfa_offset 16
+	.cfi_offset 29, -16
+	.cfi_offset 30, -8
+	.loc 1 3823 0
+	mov	x1, 0
+	adrp	x0, .LANCHOR1
+	add	x0, x0, :lo12:.LANCHOR1
+	.loc 1 3822 0
+	add	x29, sp, 0
+	.cfi_def_cfa_register 29
+	.loc 1 3823 0
+	bl	__platform_driver_register
+.LVL720:
+	.loc 1 3824 0
+	ldp	x29, x30, [sp], 16
+	.cfi_restore 30
+	.cfi_restore 29
+	.cfi_def_cfa 31, 0
+	ret
+	.cfi_endproc
+.LFE2874:
+	.size	ebc_init, .-ebc_init
+	.text
+	.align	2
+	.p2align 3,,7
+	.type	get_overlay_image_area2.isra.0, %function
+get_overlay_image_area2.isra.0:
+.LFB2876:
+	.loc 1 997 0
+	.cfi_startproc
+.LVL721:
+	stp	x29, x30, [sp, -128]!
+	.cfi_def_cfa_offset 128
+	.cfi_offset 29, -128
+	.cfi_offset 30, -120
+	.loc 1 999 0
+	adrp	x5, .LANCHOR0
+	.loc 1 997 0
+	mov	x10, x0
+	add	x29, sp, 0
+	.cfi_def_cfa_register 29
+	.loc 1 999 0
+	ldr	x5, [x5, #:lo12:.LANCHOR0]
+	.loc 1 997 0
+	stp	x19, x20, [sp, 16]
+	.loc 1 1027 0
+	add	x5, x5, 24
+	.loc 1 997 0
+	stp	x5, x0, [x29, 96]
+	.loc 1 1015 0
+	ldr	x0, [x4, 240]
+.LVL722:
+	.loc 1 997 0
+	stp	x21, x22, [sp, 32]
+	stp	x23, x24, [sp, 48]
+	stp	x25, x26, [sp, 64]
+	stp	x27, x28, [sp, 80]
+	.cfi_offset 19, -112
+	.cfi_offset 20, -104
+	.cfi_offset 21, -96
+	.cfi_offset 22, -88
+	.cfi_offset 23, -80
+	.cfi_offset 24, -72
+	.cfi_offset 25, -64
+	.cfi_offset 26, -56
+	.cfi_offset 27, -48
+	.cfi_offset 28, -40
+	.loc 1 1020 0
+	ldr	w17, [x4, 96]
+	.loc 1 1017 0
+	ldp	w7, w21, [x0, 48]
+	.loc 1 1027 0
+	ldr	w13, [x5, 84]
+	.loc 1 1016 0
+	ldr	w5, [x0, 56]
+	.loc 1 1015 0
+	cmp	w7, 0
+	add	w6, w7, 7
+	csel	w6, w6, w7, lt
+	.loc 1 1016 0
+	add	w30, w5, 7
+	cmp	w5, 0
+	.loc 1 1015 0
+	asr	w7, w6, 3
+.LVL723:
+	.loc 1 1016 0
+	csel	w30, w30, w5, lt
+	.loc 1 1018 0
+	ldr	w5, [x0, 60]
+	.loc 1 1020 0
+	cmp	w17, 0
+	add	w0, w17, 7
+	csel	w0, w0, w17, lt
+	.loc 1 1016 0
+	asr	w30, w30, 3
+.LVL724:
+	.loc 1 1018 0
+	mov	w9, w5
+	.loc 1 1016 0
+	add	w30, w30, 1
+.LVL725:
+	.loc 1 1020 0
+	asr	w5, w0, 3
+.LVL726:
+	.loc 1 1021 0
+	ldr	w0, [x4, 92]
+	.loc 1 1023 0
+	cmp	w30, w5
+.LVL727:
+	.loc 1 1027 0
+	mul	w13, w21, w13
+	.loc 1 1020 0
+	mov	w6, w5
+	str	w5, [x29, 116]
+	.loc 1 1023 0
+	sub	w5, w5, #1
+.LVL728:
+	.loc 1 1015 0
+	str	w7, [x29, 124]
+	.loc 1 1023 0
+	csel	w30, w5, w30, ge
+.LVL729:
+	.loc 1 1025 0
+	cmp	w9, w0
+	sub	w0, w0, #1
+.LVL730:
+	.loc 1 1027 0
+	lsr	w13, w13, 2
+	.loc 1 1025 0
+	csel	w0, w0, w9, ge
+.LVL731:
+	str	w0, [x29, 120]
+	.loc 1 1027 0
+	add	x13, x10, x13
+.LVL732:
+	.loc 1 1028 0
+	cmp	w21, w0
+	bgt	.L620
+	mul	w18, w21, w6
+	.loc 1 1042 0
+	mov	w19, 1
+.LBB1596:
+.LBB1597:
+	.loc 1 991 0
+	mov	w16, w19
+	lsl	w0, w7, 3
+.LVL733:
+	str	w0, [x29, 112]
+.LVL734:
+	.p2align 2
+.L624:
+.LBE1597:
+.LBE1596:
+	.loc 1 1029 0
+	and	w0, w21, 1
+.LVL735:
+	tbnz	x21, 0, .L625
+	.loc 1 1030 0
+	ldr	x5, [x29, 96]
+	ldr	w13, [x5, 84]
+.LVL736:
+	ldr	x5, [x29, 104]
+.LVL737:
+	mul	w13, w21, w13
+	lsr	w13, w13, 2
+	add	x13, x5, x13
+.LVL738:
+.L625:
+	.loc 1 1033 0
+	mul	w17, w21, w17
+	.loc 1 1036 0
+	ldr	w5, [x29, 124]
+	cmp	w5, w30
+	.loc 1 1033 0
+	sxtw	x17, w17
+	.loc 1 1036 0
+	bgt	.L638
+	cmp	w0, 0
+.LBB1601:
+.LBB1598:
+	.loc 1 990 0
+	ldr	w11, [x29, 112]
+	mov	w0, 2
+	ldr	w9, [x29, 124]
+.LVL739:
+	csel	w20, w0, wzr, ne
+	.loc 1 930 0
+	add	w28, w20, 4
+	.loc 1 940 0
+	add	w27, w20, 8
+	.loc 1 950 0
+	add	w26, w20, 12
+	.loc 1 960 0
+	add	w25, w20, 16
+	.loc 1 970 0
+	add	w24, w20, 20
+	.loc 1 980 0
+	add	w23, w20, 24
+	.loc 1 990 0
+	add	w22, w20, 28
+.LVL740:
+	.p2align 2
+.L637:
+.LBE1598:
+.LBE1601:
+	.loc 1 1037 0
+	sxtw	x8, w9
+.LVL741:
+	lsl	x0, x8, 3
+	add	x0, x0, x18, sxtw 3
+	ldr	x7, [x1, x0]
+	.loc 1 1038 0
+	ldr	x6, [x2, x0]
+.LVL742:
+	.loc 1 1041 0
+	cmp	x7, x6
+	beq	.L628
+	.loc 1 1039 0
+	add	x12, x17, x11, sxtw
+	.loc 1 1042 0
+	str	w19, [x4, 60]
+.LBB1602:
+.LBB1599:
+	.loc 1 914 0
+	eor	x5, x7, x6
+.LVL743:
+.LBE1599:
+.LBE1602:
+	.loc 1 1039 0
+	add	x0, x3, x12
+.LVL744:
+.LBB1603:
+.LBB1600:
+	.loc 1 916 0
+	and	x14, x5, 255
+	.loc 1 913 0
+	mov	w10, 0
+.LVL745:
+	.loc 1 916 0
+	ldrb	w15, [x3, x12]
+	cmp	w15, 0
+	ccmp	x14, 0, 4, eq
+	beq	.L629
+	.loc 1 919 0
+	lsl	x10, x6, 2
+.LVL746:
+	ldr	x14, [x4, 128]
+	and	x10, x10, 992
+	ubfx	x15, x7, 3, 5
+	orr	x10, x10, x15
+	ldrb	w10, [x14, x10]
+	.loc 1 921 0
+	strb	w19, [x3, x12]
+	.loc 1 920 0
+	lsl	w10, w10, w20
+.LVL747:
+.L629:
+	.loc 1 926 0
+	ldrb	w12, [x0, 1]
+	cmp	w12, 0
+	and	x12, x5, 65280
+	ccmp	x12, 0, 4, eq
+	beq	.L630
+	.loc 1 929 0
+	lsr	x12, x6, 6
+	ldr	x14, [x4, 128]
+	and	x12, x12, 992
+	ubfx	x15, x7, 11, 5
+	orr	x12, x12, x15
+	ldrb	w12, [x14, x12]
+	.loc 1 931 0
+	strb	w16, [x0, 1]
+	.loc 1 930 0
+	lsl	w12, w12, w28
+	orr	w10, w10, w12
+.L630:
+	.loc 1 936 0
+	ldrb	w12, [x0, 2]
+	cmp	w12, 0
+	and	x12, x5, 16711680
+	ccmp	x12, 0, 4, eq
+	beq	.L631
+	.loc 1 939 0
+	lsr	x12, x6, 14
+	ldr	x14, [x4, 128]
+	and	x12, x12, 992
+	ubfx	x15, x7, 19, 5
+	orr	x12, x12, x15
+	ldrb	w12, [x14, x12]
+	.loc 1 941 0
+	strb	w16, [x0, 2]
+	.loc 1 940 0
+	lsl	w12, w12, w27
+	orr	w10, w10, w12
+.L631:
+	.loc 1 946 0
+	ldrb	w12, [x0, 3]
+	tst	x5, 4278190080
+	ccmp	w12, 0, 0, ne
+	bne	.L632
+	.loc 1 949 0
+	lsr	x12, x6, 22
+	ldr	x14, [x4, 128]
+	and	x12, x12, 992
+	lsr	w15, w7, 27
+	orr	x12, x12, x15
+	ldrb	w12, [x14, x12]
+	.loc 1 951 0
+	strb	w16, [x0, 3]
+	.loc 1 950 0
+	lsl	w12, w12, w26
+	orr	w10, w10, w12
+.L632:
+	.loc 1 956 0
+	ldrb	w12, [x0, 4]
+	cmp	w12, 0
+	and	x12, x5, 1095216660480
+	ccmp	x12, 0, 4, eq
+	beq	.L633
+	.loc 1 959 0
+	lsr	x12, x6, 30
+	ldr	x14, [x4, 128]
+	and	x12, x12, 992
+	ubfx	x15, x7, 35, 5
+	orr	x12, x12, x15
+	ldrb	w12, [x14, x12]
+	.loc 1 961 0
+	strb	w16, [x0, 4]
+	.loc 1 960 0
+	lsl	w12, w12, w25
+	orr	w10, w10, w12
+.L633:
+	.loc 1 966 0
+	ldrb	w12, [x0, 5]
+	cmp	w12, 0
+	and	x12, x5, 280375465082880
+	ccmp	x12, 0, 4, eq
+	beq	.L634
+	.loc 1 969 0
+	lsr	x12, x6, 38
+	ldr	x14, [x4, 128]
+	and	x12, x12, 992
+	ubfx	x15, x7, 43, 5
+	orr	x12, x12, x15
+	ldrb	w12, [x14, x12]
+	.loc 1 971 0
+	strb	w16, [x0, 5]
+	.loc 1 970 0
+	lsl	w12, w12, w24
+	orr	w10, w10, w12
+.L634:
+	.loc 1 976 0
+	ldrb	w12, [x0, 6]
+	tst	x5, 71776119061217280
+	ccmp	w12, 0, 0, ne
+	bne	.L635
+	.loc 1 979 0
+	lsr	x12, x6, 46
+	ldr	x14, [x4, 128]
+	and	x12, x12, 992
+	ubfx	x15, x7, 51, 5
+	orr	x12, x12, x15
+	ldrb	w12, [x14, x12]
+	.loc 1 981 0
+	strb	w16, [x0, 6]
+	.loc 1 980 0
+	lsl	w12, w12, w23
+	orr	w10, w10, w12
+.L635:
+	.loc 1 986 0
+	tst	x5, -72057594037927936
+	ldrb	w5, [x0, 7]
+.LVL748:
+	ccmp	w5, 0, 0, ne
+	bne	.L636
+	.loc 1 989 0
+	ldr	x5, [x4, 128]
+	lsr	x6, x6, 54
+.LVL749:
+	and	x6, x6, 992
+	add	x7, x5, x7, lsr 59
+.LVL750:
+	ldrb	w5, [x7, x6]
+	.loc 1 991 0
+	strb	w16, [x0, 7]
+	.loc 1 990 0
+	lsl	w0, w5, w22
+.LVL751:
+	orr	w10, w10, w0
+.LVL752:
+.L636:
+.LBE1600:
+.LBE1603:
+	.loc 1 1043 0
+	ldr	w0, [x13, x8, lsl 2]
+.LVL753:
+	orr	w10, w0, w10
+.LVL754:
+	str	w10, [x13, x8, lsl 2]
+.LVL755:
+.L628:
+	.loc 1 1036 0
+	add	w9, w9, 1
+	add	w11, w11, 8
+	cmp	w9, w30
+	ble	.L637
+.LVL756:
+.L638:
+	ldr	w0, [x29, 116]
+	.loc 1 1028 0
+	add	w21, w21, 1
+	add	w18, w18, w0
+	ldr	w0, [x29, 120]
+.LVL757:
+	cmp	w21, w0
+	bgt	.L620
+	ldr	w17, [x4, 96]
+	b	.L624
+.L620:
+	.loc 1 1047 0
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+.LVL758:
+	ldp	x23, x24, [sp, 48]
+	ldp	x25, x26, [sp, 64]
+	ldp	x27, x28, [sp, 80]
+	ldp	x29, x30, [sp], 128
+	.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
+.LVL759:
+	ret
+	.cfi_endproc
+.LFE2876:
+	.size	get_overlay_image_area2.isra.0, .-get_overlay_image_area2.isra.0
+	.align	2
+	.p2align 3,,7
+	.type	get_one_auto_image2.isra.1, %function
+get_one_auto_image2.isra.1:
+.LFB2877:
+	.loc 1 1219 0
+	.cfi_startproc
+.LVL760:
+	.loc 1 1227 0
+	ldr	x6, [x1]
+.LVL761:
+	.loc 1 1219 0
+	and	w3, w3, 255
+	.loc 1 1230 0
+	mov	w7, 0
+	.loc 1 1231 0
+	eor	x8, x6, x0
+.LVL762:
+	.loc 1 1232 0
+	and	x9, x8, 255
+	cbz	x9, .L665
+	.loc 1 1235 0
+	lsl	x7, x6, 2
+	.loc 1 1233 0
+	ldrb	w9, [x2]
+	.loc 1 1235 0
+	ubfx	x10, x0, 3, 5
+	and	x7, x7, 992
+	orr	x7, x7, x10
+	ldr	x10, [x4]
+	add	x7, x10, x7
+	.loc 1 1234 0
+	lsl	w10, w9, 10
+	.loc 1 1237 0
+	add	w9, w9, 1
+	and	w9, w9, 255
+	.loc 1 1235 0
+	ldrb	w7, [x7, w10, sxtw]
+	.loc 1 1238 0
+	cmp	w9, w3
+	.loc 1 1236 0
+	lsl	w7, w7, w5
+	.loc 1 1238 0
+	beq	.L704
+.L666:
+	.loc 1 1242 0
+	strb	w9, [x2]
+.L665:
+	.loc 1 1245 0
+	tst	x8, 65280
+	beq	.L667
+	.loc 1 1248 0
+	lsr	x10, x6, 6
+	.loc 1 1246 0
+	ldrb	w9, [x2, 1]
+	.loc 1 1248 0
+	ubfx	x11, x0, 11, 5
+	and	x10, x10, 992
+	orr	x10, x10, x11
+	ldr	x11, [x4]
+	add	x10, x11, x10
+	.loc 1 1247 0
+	lsl	w11, w9, 10
+	.loc 1 1250 0
+	add	w9, w9, 1
+	and	w9, w9, 255
+	.loc 1 1248 0
+	ldrb	w10, [x10, w11, sxtw]
+	.loc 1 1249 0
+	add	w11, w5, 4
+	.loc 1 1251 0
+	cmp	w9, w3
+	.loc 1 1249 0
+	lsl	w10, w10, w11
+	orr	w7, w7, w10
+	.loc 1 1251 0
+	beq	.L705
+.L668:
+	.loc 1 1255 0
+	strb	w9, [x2, 1]
+.L667:
+	.loc 1 1258 0
+	tst	x8, 16711680
+	beq	.L669
+	.loc 1 1261 0
+	lsr	x10, x6, 14
+	.loc 1 1259 0
+	ldrb	w9, [x2, 2]
+	.loc 1 1261 0
+	ubfx	x11, x0, 19, 5
+	and	x10, x10, 992
+	orr	x10, x10, x11
+	ldr	x11, [x4]
+	add	x10, x11, x10
+	.loc 1 1260 0
+	lsl	w11, w9, 10
+	.loc 1 1263 0
+	add	w9, w9, 1
+	and	w9, w9, 255
+	.loc 1 1261 0
+	ldrb	w10, [x10, w11, sxtw]
+	.loc 1 1262 0
+	add	w11, w5, 8
+	.loc 1 1264 0
+	cmp	w9, w3
+	.loc 1 1262 0
+	lsl	w10, w10, w11
+	orr	w7, w7, w10
+	.loc 1 1264 0
+	beq	.L706
+.L670:
+	.loc 1 1268 0
+	strb	w9, [x2, 2]
+.L669:
+	.loc 1 1271 0
+	tst	x8, 4278190080
+	beq	.L671
+	.loc 1 1274 0
+	lsr	x10, x6, 22
+	.loc 1 1272 0
+	ldrb	w9, [x2, 3]
+	.loc 1 1274 0
+	lsr	w11, w0, 27
+	and	x10, x10, 992
+	orr	x10, x10, x11
+	ldr	x11, [x4]
+	add	x10, x11, x10
+	.loc 1 1273 0
+	lsl	w11, w9, 10
+	.loc 1 1276 0
+	add	w9, w9, 1
+	and	w9, w9, 255
+	.loc 1 1274 0
+	ldrb	w10, [x10, w11, sxtw]
+	.loc 1 1275 0
+	add	w11, w5, 12
+	.loc 1 1277 0
+	cmp	w9, w3
+	.loc 1 1275 0
+	lsl	w10, w10, w11
+	orr	w7, w7, w10
+	.loc 1 1277 0
+	beq	.L707
+.L672:
+	.loc 1 1281 0
+	strb	w9, [x2, 3]
+.L671:
+	.loc 1 1284 0
+	tst	x8, 1095216660480
+	beq	.L673
+	.loc 1 1287 0
+	lsr	x10, x6, 30
+	.loc 1 1285 0
+	ldrb	w9, [x2, 4]
+	.loc 1 1287 0
+	ubfx	x11, x0, 35, 5
+	and	x10, x10, 992
+	orr	x10, x10, x11
+	ldr	x11, [x4]
+	add	x10, x11, x10
+	.loc 1 1286 0
+	lsl	w11, w9, 10
+	.loc 1 1289 0
+	add	w9, w9, 1
+	and	w9, w9, 255
+	.loc 1 1287 0
+	ldrb	w10, [x10, w11, sxtw]
+	.loc 1 1288 0
+	add	w11, w5, 16
+	.loc 1 1290 0
+	cmp	w9, w3
+	.loc 1 1288 0
+	lsl	w10, w10, w11
+	orr	w7, w7, w10
+	.loc 1 1290 0
+	beq	.L708
+.L674:
+	.loc 1 1294 0
+	strb	w9, [x2, 4]
+.L673:
+	.loc 1 1297 0
+	tst	x8, 280375465082880
+	beq	.L675
+	.loc 1 1300 0
+	lsr	x10, x6, 38
+	.loc 1 1298 0
+	ldrb	w9, [x2, 5]
+	.loc 1 1300 0
+	ubfx	x11, x0, 43, 5
+	and	x10, x10, 992
+	orr	x10, x10, x11
+	ldr	x11, [x4]
+	add	x10, x11, x10
+	.loc 1 1299 0
+	lsl	w11, w9, 10
+	.loc 1 1302 0
+	add	w9, w9, 1
+	and	w9, w9, 255
+	.loc 1 1300 0
+	ldrb	w10, [x10, w11, sxtw]
+	.loc 1 1301 0
+	add	w11, w5, 20
+	.loc 1 1303 0
+	cmp	w9, w3
+	.loc 1 1301 0
+	lsl	w10, w10, w11
+	orr	w7, w7, w10
+	.loc 1 1303 0
+	beq	.L709
+.L676:
+	.loc 1 1307 0
+	strb	w9, [x2, 5]
+.L675:
+	.loc 1 1310 0
+	tst	x8, 71776119061217280
+	beq	.L677
+	.loc 1 1313 0
+	lsr	x10, x6, 46
+	.loc 1 1311 0
+	ldrb	w9, [x2, 6]
+	.loc 1 1313 0
+	ubfx	x11, x0, 51, 5
+	and	x10, x10, 992
+	orr	x10, x10, x11
+	ldr	x11, [x4]
+	add	x10, x11, x10
+	.loc 1 1312 0
+	lsl	w11, w9, 10
+	.loc 1 1315 0
+	add	w9, w9, 1
+	and	w9, w9, 255
+	.loc 1 1313 0
+	ldrb	w10, [x10, w11, sxtw]
+	.loc 1 1314 0
+	add	w11, w5, 24
+	.loc 1 1316 0
+	cmp	w9, w3
+	.loc 1 1314 0
+	lsl	w10, w10, w11
+	orr	w7, w7, w10
+	.loc 1 1316 0
+	beq	.L710
+.L678:
+	.loc 1 1320 0
+	strb	w9, [x2, 6]
+.L677:
+	.loc 1 1323 0
+	tst	x8, -72057594037927936
+	beq	.L679
+	.loc 1 1324 0
+	ldrb	w8, [x2, 7]
+.LVL763:
+	.loc 1 1327 0
+	add	w5, w5, 28
+.LVL764:
+	.loc 1 1326 0
+	ldr	x9, [x4]
+	.loc 1 1325 0
+	ubfiz	x4, x8, 10, 8
+	.loc 1 1326 0
+	add	x9, x9, x4
+	.loc 1 1328 0
+	add	w4, w8, 1
+	and	w4, w4, 255
+	.loc 1 1326 0
+	add	x8, x9, x0, lsr 59
+	.loc 1 1329 0
+	cmp	w4, w3
+	.loc 1 1326 0
+	lsr	x3, x6, 54
+	and	x3, x3, 992
+	ldrb	w3, [x8, x3]
+	.loc 1 1327 0
+	lsl	w5, w3, w5
+	orr	w7, w7, w5
+	.loc 1 1329 0
+	beq	.L711
+.L680:
+	.loc 1 1333 0
+	strb	w4, [x2, 7]
+.LVL765:
+.L679:
+	.loc 1 1338 0
+	mov	w0, w7
+	.loc 1 1335 0
+	str	x6, [x1]
+	.loc 1 1338 0
+	ret
+.LVL766:
+	.p2align 3
+.L711:
+	.loc 1 1331 0
+	and	x6, x6, 72057594037927935
+.LVL767:
+	and	x0, x0, -72057594037927936
+	orr	x6, x0, x6
+.LVL768:
+	.loc 1 1330 0
+	mov	w4, 0
+	b	.L680
+.LVL769:
+	.p2align 3
+.L704:
+	.loc 1 1240 0
+	bfi	x6, x0, 0, 8
+	.loc 1 1239 0
+	mov	w9, 0
+	b	.L666
+	.p2align 3
+.L705:
+	.loc 1 1253 0
+	and	x9, x0, 65280
+	and	x6, x6, -65281
+.LVL770:
+	orr	x6, x9, x6
+.LVL771:
+	.loc 1 1252 0
+	mov	w9, 0
+	b	.L668
+	.p2align 3
+.L706:
+	.loc 1 1266 0
+	and	x9, x0, 16711680
+	and	x6, x6, -16711681
+.LVL772:
+	orr	x6, x9, x6
+.LVL773:
+	.loc 1 1265 0
+	mov	w9, 0
+	b	.L670
+	.p2align 3
+.L707:
+	.loc 1 1279 0
+	and	x9, x0, 4278190080
+	and	x6, x6, -4278190081
+.LVL774:
+	orr	x6, x9, x6
+.LVL775:
+	.loc 1 1278 0
+	mov	w9, 0
+	b	.L672
+	.p2align 3
+.L708:
+	.loc 1 1292 0
+	and	x9, x0, 1095216660480
+	and	x6, x6, -1095216660481
+.LVL776:
+	orr	x6, x9, x6
+.LVL777:
+	.loc 1 1291 0
+	mov	w9, 0
+	b	.L674
+	.p2align 3
+.L709:
+	.loc 1 1305 0
+	and	x9, x0, 280375465082880
+	and	x6, x6, -280375465082881
+.LVL778:
+	orr	x6, x9, x6
+.LVL779:
+	.loc 1 1304 0
+	mov	w9, 0
+	b	.L676
+	.p2align 3
+.L710:
+	.loc 1 1318 0
+	and	x9, x0, 71776119061217280
+	and	x6, x6, -71776119061217281
+.LVL780:
+	orr	x6, x9, x6
+.LVL781:
+	.loc 1 1317 0
+	mov	w9, 0
+	b	.L678
+	.cfi_endproc
+.LFE2877:
+	.size	get_one_auto_image2.isra.1, .-get_one_auto_image2.isra.1
+	.align	2
+	.p2align 3,,7
+	.type	get_auto_image2, %function
+get_auto_image2:
+.LFB2827:
+	.loc 1 1341 0
+	.cfi_startproc
+.LVL782:
+	stp	x29, x30, [sp, -128]!
+	.cfi_def_cfa_offset 128
+	.cfi_offset 29, -128
+	.cfi_offset 30, -120
+	.loc 1 1342 0
+	adrp	x6, .LANCHOR0
+	.loc 1 1355 0
+	cmp	w5, 2
+	.loc 1 1341 0
+	add	x29, sp, 0
+	.cfi_def_cfa_register 29
+	stp	x23, x24, [sp, 48]
+	.cfi_offset 23, -80
+	.cfi_offset 24, -72
+	.loc 1 1342 0
+	ldr	x24, [x6, #:lo12:.LANCHOR0]
+	.loc 1 1341 0
+	stp	x19, x20, [sp, 16]
+	.cfi_offset 19, -112
+	.cfi_offset 20, -104
+	mov	x20, x1
+	.loc 1 1352 0
+	add	x24, x24, 24
+	.loc 1 1341 0
+	stp	x21, x22, [sp, 32]
+	stp	x25, x26, [sp, 64]
+	mov	x19, x4
+	stp	x27, x28, [sp, 80]
+	.cfi_offset 21, -96
+	.cfi_offset 22, -88
+	.cfi_offset 25, -64
+	.cfi_offset 26, -56
+	.cfi_offset 27, -48
+	.cfi_offset 28, -40
+	.loc 1 1341 0
+	mov	x21, x2
+	str	x0, [x29, 112]
+	.loc 1 1350 0
+	add	x0, x4, 60
+.LVL783:
+	.loc 1 1353 0
+	ldp	w1, w25, [x24, 84]
+.LVL784:
+	.loc 1 1350 0
+	str	x0, [x29, 104]
+	.loc 1 1341 0
+	mov	x22, x3
+	.loc 1 1352 0
+	lsr	w0, w1, 3
+.LVL785:
+	str	w0, [x29, 124]
+	.loc 1 1355 0
+	beq	.L731
+	.loc 1 1358 0
+	cmp	w5, 3
+	mov	x0, 0
+	.loc 1 1365 0
+	mov	w23, 0
+.LVL786:
+	.loc 1 1358 0
+	beq	.L732
+.LVL787:
+.L714:
+	.loc 1 1368 0
+	ldr	x2, [x29, 112]
+.LVL788:
+	add	x0, x2, x0
+	sub	w2, w25, w23
+.LVL789:
+	mul	w2, w2, w1
+	mov	w1, 0
+	lsr	w2, w2, 2
+	bl	memset
+.LVL790:
+	.loc 1 1369 0
+	cmp	w23, w25
+	bge	.L723
+	ldr	w0, [x29, 124]
+	.loc 1 1376 0
+	add	x13, x19, 128
+	.loc 1 1369 0
+	mov	w9, 0
+.LVL791:
+	sub	w14, w0, #1
+	add	x14, x14, 1
+	lsl	x12, x14, 2
+	lsl	x14, x14, 3
+.LVL792:
+	.p2align 2
+.L721:
+	.loc 1 1370 0
+	ldr	w7, [x24, 84]
+	ldr	x0, [x29, 112]
+.LVL793:
+	mul	w7, w23, w7
+	lsr	w7, w7, 2
+	add	x26, x0, x7
+	.loc 1 1371 0
+	ldr	w0, [x29, 124]
+.LVL794:
+	cbz	w0, .L716
+	mov	x28, x22
+.LVL795:
+	mov	x15, x21
+.LVL796:
+	mov	x27, x20
+.LVL797:
+	mov	x18, 0
+	.p2align 2
+.L718:
+	.loc 1 1372 0
+	ldr	x3, [x27]
+	.loc 1 1376 0
+	mov	x2, x28
+	.loc 1 1374 0
+	ldr	x10, [x15]
+	.loc 1 1376 0
+	mov	x1, x15
+	mov	w5, 0
+	mov	x4, x13
+	mov	x0, x3
+	.loc 1 1374 0
+	cmp	x3, x10
+	beq	.L717
+	.loc 1 1376 0
+	ldrb	w3, [x19, 56]
+	bl	get_one_auto_image2.isra.1
+.LVL798:
+	str	w0, [x26, x18]
+	.loc 1 1375 0
+	mov	w9, 1
+.LVL799:
+.L717:
+	add	x18, x18, 4
+	.loc 1 1378 0 discriminator 2
+	add	x15, x15, 8
+	.loc 1 1379 0 discriminator 2
+	add	x27, x27, 8
+	.loc 1 1380 0 discriminator 2
+	add	x28, x28, 8
+	.loc 1 1371 0 discriminator 2
+	cmp	x18, x12
+	bne	.L718
+.LVL800:
+	add	x21, x21, x14
+.LVL801:
+	add	x20, x20, x14
+.LVL802:
+	add	x22, x22, x14
+	.loc 1 1371 0 is_stmt 0
+	mov	x18, x21
+	mov	x27, x22
+	mov	x28, x20
+	mov	x15, 0
+	.p2align 2
+.L720:
+	.loc 1 1383 0 is_stmt 1
+	ldr	x3, [x28]
+	.loc 1 1387 0
+	mov	x1, x18
+	.loc 1 1385 0
+	ldr	x10, [x18]
+	.loc 1 1387 0
+	mov	x2, x27
+	mov	w5, 2
+	mov	x4, x13
+	.loc 1 1389 0
+	add	x18, x18, 8
+	.loc 1 1390 0
+	add	x28, x28, 8
+	.loc 1 1387 0
+	mov	x0, x3
+	.loc 1 1385 0
+	cmp	x3, x10
+	beq	.L719
+	.loc 1 1387 0
+	ldrb	w3, [x19, 56]
+	bl	get_one_auto_image2.isra.1
+.LVL803:
+	ldr	w1, [x26, x15]
+	.loc 1 1386 0
+	mov	w9, 1
+.LVL804:
+	.loc 1 1387 0
+	orr	w0, w1, w0
+	str	w0, [x26, x15]
+.L719:
+	add	x15, x15, 4
+	.loc 1 1391 0 discriminator 2
+	add	x27, x27, 8
+	.loc 1 1382 0 discriminator 2
+	cmp	x15, x12
+	bne	.L720
+	add	x21, x21, x14
+	add	x20, x20, x14
+	add	x22, x22, x14
+.L716:
+	.loc 1 1369 0
+	add	w23, w23, 2
+	cmp	w25, w23
+	bgt	.L721
+.L715:
+	.loc 1 1394 0
+	ldr	x0, [x29, 104]
+.LVL805:
+	str	w9, [x0]
+	.loc 1 1395 0
+	ldp	x19, x20, [sp, 16]
+.LVL806:
+	ldp	x21, x22, [sp, 32]
+.LVL807:
+	ldp	x23, x24, [sp, 48]
+.LVL808:
+	ldp	x25, x26, [sp, 64]
+.LVL809:
+	ldp	x27, x28, [sp, 80]
+	ldp	x29, x30, [sp], 128
+	.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
+.LVL810:
+.L731:
+	.cfi_restore_state
+	.loc 1 1357 0
+	add	w25, w25, w25, lsr 31
+.LVL811:
+	mov	x0, 0
+	asr	w25, w25, 1
+.LVL812:
+	.loc 1 1356 0
+	mov	w23, 0
+.LVL813:
+	b	.L714
+.LVL814:
+.L732:
+	.loc 1 1363 0
+	add	x0, x4, 64
+.LVL815:
+	.loc 1 1359 0
+	add	w23, w25, w25, lsr 31
+.LVL816:
+	asr	w23, w23, 1
+.LVL817:
+	.loc 1 1363 0
+	str	x0, [x29, 104]
+	.loc 1 1360 0
+	lsr	w0, w1, 3
+.LVL818:
+	mul	w0, w0, w23
+	sbfiz	x0, x0, 3, 32
+	add	x20, x20, x0
+	.loc 1 1361 0
+	add	x21, x2, x0
+	.loc 1 1362 0
+	mul	w0, w23, w1
+	add	x22, x3, x0, uxtw
+	lsr	w0, w0, 2
+	b	.L714
+.LVL819:
+.L723:
+	.loc 1 1349 0
+	mov	w9, 0
+.LVL820:
+	b	.L715
+	.cfi_endproc
+.LFE2827:
+	.size	get_auto_image2, .-get_auto_image2
+	.align	2
+	.p2align 3,,7
+	.type	direct_mode_data_change.isra.2, %function
+direct_mode_data_change.isra.2:
+.LFB2878:
+	.loc 1 1397 0
+	.cfi_startproc
+.LVL821:
+	.loc 1 1399 0
+	adrp	x7, .LANCHOR0
+	.loc 1 1397 0
+	and	w3, w3, 255
+	.loc 1 1404 0
+	sub	w4, w3, w4
+.LVL822:
+	.loc 1 1411 0
+	cmp	w6, 2
+	.loc 1 1399 0
+	ldr	x3, [x7, #:lo12:.LANCHOR0]
+	.loc 1 1405 0
+	lsl	w7, w4, 10
+	add	x5, x5, x7, sxtw
+.LVL823:
+	.loc 1 1408 0
+	add	x4, x3, 24
+.LVL824:
+	.loc 1 1409 0
+	ldp	w7, w3, [x4, 84]
+	.loc 1 1408 0
+	lsr	w11, w7, 3
+	.loc 1 1411 0
+	beq	.L753
+	.loc 1 1414 0
+	cmp	w6, 3
+	mov	w14, w3
+.LVL825:
+	mov	w6, 0
+.LVL826:
+	.loc 1 1419 0
+	mov	w12, 0
+.LVL827:
+	.loc 1 1414 0
+	beq	.L754
+.L735:
+	.loc 1 1422 0
+	ldr	w4, [x4, 156]
+	cbz	w4, .L736
+	.loc 1 1423 0
+	sub	w3, w3, #1
+	.loc 1 1424 0
+	neg	w15, w7, lsr 2
+.LVL828:
+	.loc 1 1423 0
+	sub	w3, w3, w6
+	mul	w3, w3, w7
+	lsr	w3, w3, 2
+	add	x10, x0, x3
+.LVL829:
+.L739:
+	.loc 1 1430 0
+	cmp	w12, w14
+	bge	.L747
+	sub	w13, w11, #1
+	sxtw	x15, w15
+.LVL830:
+	add	x13, x13, 1
+	lsl	x13, x13, 3
+.L748:
+	.loc 1 1431 0
+	mov	x6, 0
+	cbz	w11, .L755
+	.loc 1 1397 0
+	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
+	.p2align 2
+.L744:
+	.loc 1 1433 0
+	ldr	x0, [x2, x6, lsl 3]
+.LVL831:
+	.loc 1 1432 0
+	ldr	x3, [x1, x6, lsl 3]
+.LVL832:
+.LBB1604:
+.LBB1605:
+	.loc 1 270 0
+	lsr	x17, x0, 30
+	.loc 1 268 0
+	lsr	x4, x0, 14
+	.loc 1 270 0
+	ubfx	x8, x3, 35, 5
+	.loc 1 268 0
+	ubfx	x7, x3, 19, 5
+	.loc 1 269 0
+	lsr	x30, x0, 22
+	.loc 1 267 0
+	lsr	x16, x0, 6
+	.loc 1 272 0
+	lsr	x9, x0, 46
+	.loc 1 270 0
+	and	x17, x17, 992
+	.loc 1 268 0
+	and	x4, x4, 992
+	.loc 1 269 0
+	lsr	w19, w3, 27
+	.loc 1 270 0
+	orr	x17, x17, x8
+	.loc 1 267 0
+	ubfx	x18, x3, 11, 5
+	.loc 1 268 0
+	orr	x4, x4, x7
+	.loc 1 271 0
+	lsr	x8, x0, 38
+	.loc 1 272 0
+	ubfx	x7, x3, 51, 5
+	.loc 1 269 0
+	and	x30, x30, 992
+	.loc 1 267 0
+	and	x16, x16, 992
+	.loc 1 272 0
+	and	x9, x9, 992
+	.loc 1 269 0
+	orr	x30, x30, x19
+	.loc 1 267 0
+	orr	x16, x16, x18
+	.loc 1 272 0
+	orr	x9, x9, x7
+	.loc 1 271 0
+	ubfx	x18, x3, 43, 5
+	.loc 1 266 0
+	lsl	x7, x0, 2
+	.loc 1 271 0
+	and	x8, x8, 992
+	orr	x8, x8, x18
+	.loc 1 266 0
+	ubfx	x19, x3, 3, 5
+	and	x7, x7, 992
+	.loc 1 273 0
+	lsr	x0, x0, 54
+.LVL833:
+	.loc 1 270 0
+	ldrb	w18, [x5, x17]
+	.loc 1 266 0
+	orr	x7, x7, x19
+	.loc 1 268 0
+	ldrb	w17, [x5, x4]
+	.loc 1 273 0
+	and	x0, x0, 992
+	add	x3, x5, x3, lsr 59
+.LVL834:
+	.loc 1 269 0
+	ldrb	w4, [x5, x30]
+	.loc 1 267 0
+	ldrb	w16, [x5, x16]
+	.loc 1 272 0
+	ldrb	w9, [x5, x9]
+	.loc 1 271 0
+	ldrb	w8, [x5, x8]
+	.loc 1 266 0
+	ldrb	w30, [x5, x7]
+	.loc 1 268 0
+	lsl	w7, w17, 4
+	.loc 1 273 0
+	ldrb	w3, [x3, x0]
+	.loc 1 270 0
+	lsl	w0, w18, 8
+	.loc 1 273 0
+	orr	w0, w0, w4, lsl 6
+	orr	w7, w7, w16, lsl 2
+	.loc 1 272 0
+	lsl	w4, w9, 12
+	.loc 1 273 0
+	orr	w0, w0, w7
+	orr	w4, w4, w8, lsl 10
+	orr	w3, w30, w3, lsl 14
+	orr	w0, w0, w4
+	orr	w0, w0, w3
+.LBE1605:
+.LBE1604:
+	.loc 1 1434 0
+	strh	w0, [x10, x6, lsl 1]
+	add	x6, x6, 1
+	.loc 1 1431 0
+	cmp	w11, w6
+	bgt	.L744
+	.loc 1 1430 0
+	add	w12, w12, 1
+	add	x1, x1, x13
+	add	x2, x2, x13
+	add	x10, x10, x15
+	cmp	w12, w14
+	beq	.L733
+.L756:
+	.loc 1 1431 0
+	mov	x6, 0
+	cbnz	w11, .L744
+	.loc 1 1430 0
+	add	w12, w12, 1
+	add	x10, x10, x15
+	cmp	w12, w14
+	bne	.L756
+.L733:
+	.loc 1 1437 0
+	ldr	x19, [sp, 16]
+	ldp	x29, x30, [sp], 32
+	.cfi_restore 30
+	.cfi_restore 29
+	.cfi_restore 19
+	.cfi_def_cfa 31, 0
+	ret
+.L755:
+	.loc 1 1430 0
+	add	w12, w12, 1
+	add	x10, x10, x15
+	cmp	w12, w14
+	bne	.L748
+.LVL835:
+.L747:
+	ret
+.LVL836:
+.L736:
+	.loc 1 1426 0
+	mul	w3, w7, w6
+	.loc 1 1427 0
+	lsr	w15, w7, 2
+.LVL837:
+	.loc 1 1426 0
+	lsr	w3, w3, 2
+	add	x10, x0, x3
+.LVL838:
+	b	.L739
+.LVL839:
+.L753:
+	.loc 1 1413 0
+	add	w14, w3, w3, lsr 31
+	mov	w6, 0
+.LVL840:
+	asr	w14, w14, 1
+.LVL841:
+	.loc 1 1412 0
+	mov	w12, 0
+.LVL842:
+	b	.L735
+.L754:
+	.loc 1 1415 0
+	add	w12, w3, w3, lsr 31
+.LVL843:
+	asr	w12, w12, 1
+.LVL844:
+	mov	w6, w12
+	.loc 1 1416 0
+	mul	w8, w11, w12
+	sbfiz	x8, x8, 3, 32
+	add	x1, x1, x8
+	.loc 1 1417 0
+	add	x2, x2, x8
+	b	.L735
+	.cfi_endproc
+.LFE2878:
+	.size	direct_mode_data_change.isra.2, .-direct_mode_data_change.isra.2
+	.align	2
+	.p2align 3,,7
+	.type	direct_mode_data_change2.isra.3, %function
+direct_mode_data_change2.isra.3:
+.LFB2879:
+	.loc 1 1484 0
+	.cfi_startproc
+.LVL845:
+	.loc 1 1486 0
+	adrp	x7, .LANCHOR0
+	.loc 1 1484 0
+	and	w3, w3, 255
+	.loc 1 1491 0
+	sub	w3, w3, w4
+.LVL846:
+	.loc 1 1499 0
+	cmp	w6, 2
+	.loc 1 1486 0
+	ldr	x4, [x7, #:lo12:.LANCHOR0]
+	.loc 1 1492 0
+	lsl	w3, w3, 10
+.LVL847:
+	add	x5, x5, x3, sxtw
+.LVL848:
+	.loc 1 1497 0
+	ldp	w13, w14, [x4, 108]
+	.loc 1 1496 0
+	lsr	w9, w13, 3
+	.loc 1 1499 0
+	beq	.L781
+	.loc 1 1507 0
+	mov	w11, 0
+.LVL849:
+	.loc 1 1502 0
+	cmp	w6, 3
+	beq	.L782
+.LVL850:
+.L759:
+	.loc 1 1510 0
+	lsr	w13, w13, 2
+.LVL851:
+	.loc 1 1511 0
+	cmp	w14, w11
+	ble	.L774
+.L785:
+	sub	w10, w9, #1
+	mul	w12, w13, w11
+	add	x10, x10, 1
+	lsl	w13, w13, 1
+.LVL852:
+	lsl	x10, x10, 3
+.LVL853:
+.L775:
+	.loc 1 1512 0
+	add	x8, x0, x12, sxtw
+	.loc 1 1513 0
+	cbz	w9, .L783
+	.loc 1 1484 0
+	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]
+	stp	x21, x22, [sp, 32]
+	.cfi_offset 19, -32
+	.cfi_offset 20, -24
+	.cfi_offset 21, -16
+	.cfi_offset 22, -8
+	.p2align 2
+.L776:
+	.loc 1 1513 0
+	mov	x7, 0
+	.p2align 2
+.L762:
+	.loc 1 1515 0
+	ldr	x3, [x2, x7, lsl 3]
+	.loc 1 1514 0
+	ldr	x4, [x1, x7, lsl 3]
+.LBB1606:
+.LBB1607:
+	.loc 1 282 0
+	lsr	x20, x3, 30
+	.loc 1 280 0
+	lsr	x6, x3, 14
+.LVL854:
+	.loc 1 282 0
+	ubfx	x16, x4, 35, 5
+	.loc 1 280 0
+	ubfx	x15, x4, 19, 5
+	.loc 1 281 0
+	lsr	x19, x3, 22
+	.loc 1 279 0
+	lsr	x18, x3, 6
+	.loc 1 284 0
+	lsr	x17, x3, 46
+	.loc 1 282 0
+	and	x20, x20, 992
+	.loc 1 280 0
+	and	x6, x6, 992
+	.loc 1 281 0
+	lsr	w22, w4, 27
+	.loc 1 282 0
+	orr	x20, x20, x16
+	.loc 1 279 0
+	ubfx	x21, x4, 11, 5
+	.loc 1 280 0
+	orr	x6, x6, x15
+	.loc 1 283 0
+	lsr	x16, x3, 38
+	.loc 1 284 0
+	ubfx	x15, x4, 51, 5
+	.loc 1 281 0
+	and	x19, x19, 992
+	.loc 1 279 0
+	and	x18, x18, 992
+	.loc 1 284 0
+	and	x17, x17, 992
+	.loc 1 281 0
+	orr	x19, x19, x22
+	.loc 1 279 0
+	orr	x18, x18, x21
+	.loc 1 284 0
+	orr	x17, x17, x15
+	.loc 1 283 0
+	ubfx	x21, x4, 43, 5
+	.loc 1 278 0
+	lsl	x15, x3, 2
+	.loc 1 283 0
+	and	x16, x16, 992
+	orr	x16, x16, x21
+	.loc 1 278 0
+	ubfx	x22, x4, 3, 5
+	and	x15, x15, 992
+	.loc 1 285 0
+	lsr	x3, x3, 54
+	.loc 1 282 0
+	ldrb	w21, [x5, x20]
+	.loc 1 278 0
+	orr	x15, x15, x22
+	.loc 1 280 0
+	ldrb	w20, [x5, x6]
+	.loc 1 285 0
+	and	x3, x3, 992
+	add	x4, x5, x4, lsr 59
+	.loc 1 281 0
+	ldrb	w6, [x5, x19]
+	.loc 1 279 0
+	ldrb	w18, [x5, x18]
+	.loc 1 284 0
+	ldrb	w17, [x5, x17]
+	.loc 1 283 0
+	ldrb	w16, [x5, x16]
+	.loc 1 278 0
+	ldrb	w19, [x5, x15]
+	.loc 1 280 0
+	lsl	w15, w20, 8
+	.loc 1 285 0
+	ldrb	w4, [x4, x3]
+	.loc 1 282 0
+	lsl	w3, w21, 16
+	.loc 1 285 0
+	orr	w3, w3, w6, lsl 12
+	orr	w15, w15, w18, lsl 4
+	.loc 1 284 0
+	lsl	w6, w17, 24
+	.loc 1 285 0
+	orr	w3, w3, w15
+	orr	w6, w6, w16, lsl 20
+	orr	w4, w19, w4, lsl 28
+	orr	w3, w3, w6
+	orr	w3, w3, w4
+.LBE1607:
+.LBE1606:
+	.loc 1 1516 0
+	str	w3, [x8, x7, lsl 2]
+	add	x7, x7, 1
+	.loc 1 1513 0
+	cmp	w9, w7
+	bgt	.L762
+	add	x1, x1, x10
+	add	x2, x2, x10
+	mov	x7, 0
+	.p2align 2
+.L763:
+	.loc 1 1520 0
+	ldr	x3, [x2, x7, lsl 3]
+	.loc 1 1519 0
+	ldr	x4, [x1, x7, lsl 3]
+	.loc 1 1521 0
+	ldr	w17, [x8, x7, lsl 2]
+.LBB1608:
+.LBB1609:
+	.loc 1 293 0
+	lsr	x20, x3, 22
+	.loc 1 291 0
+	lsr	x30, x3, 6
+	.loc 1 293 0
+	lsr	w16, w4, 27
+	.loc 1 291 0
+	ubfx	x15, x4, 11, 5
+	.loc 1 292 0
+	lsr	x6, x3, 14
+	.loc 1 290 0
+	lsl	x19, x3, 2
+	.loc 1 295 0
+	lsr	x18, x3, 38
+	.loc 1 293 0
+	and	x20, x20, 992
+	.loc 1 291 0
+	and	x30, x30, 992
+	.loc 1 292 0
+	ubfx	x22, x4, 19, 5
+	.loc 1 293 0
+	orr	x20, x20, x16
+	.loc 1 290 0
+	ubfx	x21, x4, 3, 5
+	.loc 1 291 0
+	orr	x30, x30, x15
+	.loc 1 294 0
+	lsr	x16, x3, 30
+	.loc 1 295 0
+	ubfx	x15, x4, 43, 5
+	.loc 1 292 0
+	and	x6, x6, 992
+	.loc 1 290 0
+	and	x19, x19, 992
+	.loc 1 295 0
+	and	x18, x18, 992
+	orr	x18, x18, x15
+	.loc 1 292 0
+	orr	x6, x6, x22
+	.loc 1 290 0
+	orr	x19, x19, x21
+	.loc 1 296 0
+	lsr	x15, x3, 46
+	.loc 1 294 0
+	ubfx	x21, x4, 35, 5
+	and	x16, x16, 992
+	.loc 1 297 0
+	lsr	x3, x3, 54
+	.loc 1 294 0
+	orr	x16, x16, x21
+	.loc 1 296 0
+	ubfx	x22, x4, 51, 5
+	.loc 1 297 0
+	and	x3, x3, 992
+	add	x4, x5, x4, lsr 59
+	.loc 1 296 0
+	and	x15, x15, 992
+	.loc 1 293 0
+	ldrb	w21, [x5, x20]
+	.loc 1 296 0
+	orr	x15, x15, x22
+	.loc 1 291 0
+	ldrb	w20, [x5, x30]
+	.loc 1 292 0
+	ldrb	w6, [x5, x6]
+	.loc 1 295 0
+	ldrb	w30, [x5, x18]
+	.loc 1 290 0
+	ldrb	w19, [x5, x19]
+	.loc 1 294 0
+	ldrb	w18, [x5, x16]
+	.loc 1 297 0
+	ldrb	w16, [x4, x3]
+	.loc 1 293 0
+	lsl	w4, w21, 14
+	.loc 1 296 0
+	ldrb	w15, [x5, x15]
+	.loc 1 291 0
+	lsl	w3, w20, 6
+	.loc 1 297 0
+	orr	w4, w4, w6, lsl 10
+	orr	w3, w3, w19, lsl 2
+	.loc 1 295 0
+	lsl	w6, w30, 22
+	.loc 1 297 0
+	orr	w3, w4, w3
+	orr	w6, w6, w18, lsl 18
+	lsl	w4, w16, 30
+	orr	w3, w3, w6
+	orr	w4, w4, w15, lsl 26
+	orr	w3, w3, w4
+.LBE1609:
+.LBE1608:
+	.loc 1 1521 0
+	orr	w3, w17, w3
+	str	w3, [x8, x7, lsl 2]
+	add	x7, x7, 1
+	.loc 1 1518 0
+	cmp	w9, w7
+	bgt	.L763
+	.loc 1 1511 0
+	add	w11, w11, 2
+	add	x1, x1, x10
+	add	x2, x2, x10
+	add	w12, w12, w13
+	cmp	w11, w14
+	bge	.L784
+.L764:
+	.loc 1 1512 0
+	add	x8, x0, x12, sxtw
+	.loc 1 1513 0
+	cbnz	w9, .L776
+	.loc 1 1511 0
+	add	w11, w11, 2
+	add	w12, w12, w13
+	cmp	w11, w14
+	blt	.L764
+.L784:
+	.loc 1 1524 0
+	ldp	x19, x20, [sp, 16]
+	ldp	x21, x22, [sp, 32]
+	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
+	ret
+.LVL855:
+.L783:
+	.loc 1 1511 0
+	add	w11, w11, 2
+	add	w12, w12, w13
+	cmp	w11, w14
+	blt	.L775
+	ret
+.LVL856:
+.L781:
+	.loc 1 1501 0
+	add	w14, w14, w14, lsr 31
+.LVL857:
+	.loc 1 1500 0
+	mov	w11, 0
+.LVL858:
+	.loc 1 1501 0
+	asr	w14, w14, 1
+.LVL859:
+	.loc 1 1510 0
+	lsr	w13, w13, 2
+.LVL860:
+	.loc 1 1511 0
+	cmp	w14, w11
+	bgt	.L785
+.L774:
+	ret
+.LVL861:
+.L782:
+	.loc 1 1503 0
+	add	w11, w14, w14, lsr 31
+.LVL862:
+	asr	w11, w11, 1
+.LVL863:
+	.loc 1 1504 0
+	mul	w3, w9, w11
+	sbfiz	x3, x3, 3, 32
+	add	x1, x1, x3
+	.loc 1 1505 0
+	add	x2, x2, x3
+	b	.L759
+	.cfi_endproc
+.LFE2879:
+	.size	direct_mode_data_change2.isra.3, .-direct_mode_data_change2.isra.3
+	.align	2
+	.p2align 3,,7
+	.type	flip.isra.4, %function
+flip.isra.4:
+.LFB2880:
+	.loc 1 1573 0
+	.cfi_startproc
+.LVL864:
+	stp	x29, x30, [sp, -32]!
+	.cfi_def_cfa_offset 32
+	.cfi_offset 29, -32
+	.cfi_offset 30, -24
+	.loc 1 1577 0
+	sxtw	x2, w1
+	.loc 1 1573 0
+	add	x29, sp, 0
+	.cfi_def_cfa_register 29
+	stp	x19, x20, [sp, 16]
+	.cfi_offset 19, -16
+	.cfi_offset 20, -8
+	.loc 1 1573 0
+	mov	x20, x0
+	.loc 1 1575 0
+	ldr	w19, [x0, 72]
+	.loc 1 1577 0
+	ldr	x0, [x0]
+.LVL865:
+.LBB1610:
+.LBB1611:
+.LBB1612:
+.LBB1613:
+	.file 9 "./include/linux/dma-mapping.h"
+	.loc 9 266 0
+	cbz	x0, .L789
+	ldr	x3, [x0, 648]
+	.loc 9 268 0
+	adrp	x4, dummy_dma_ops
+	add	x4, x4, :lo12:dummy_dma_ops
+	cmp	x3, 0
+	csel	x3, x4, x3, eq
+.L787:
+.LBE1613:
+.LBE1612:
+	.loc 9 434 0
+	ldr	x5, [x3, 88]
+	sxtw	x19, w19
+	cbz	x5, .L788
+.LBE1611:
+.LBE1610:
+	.loc 1 1577 0
+	add	x4, x19, x19, lsl 1
+.LBB1619:
+.LBB1616:
+	.loc 9 435 0
+	mov	w3, 1
+.LBE1616:
+.LBE1619:
+	.loc 1 1577 0
+	add	x4, x20, x4, lsl 3
+.LBB1620:
+.LBB1617:
+	.loc 9 435 0
+	ldr	x1, [x4, 32]
+	blr	x5
+.LVL866:
+.L788:
+.LBE1617:
+.LBE1620:
+	.loc 1 1578 0
+	ldr	x5, [x20, 8]
+.LBB1621:
+.LBB1622:
+	.file 10 "drivers/gpu/drm/rockchip/ebc-dev/tcon/ebc_tcon.h"
+	.loc 10 56 0
+	mov	w4, 0
+	mov	w3, 0
+	mov	w2, 0
+	mov	x0, x5
+	mov	w1, 0
+.LBE1622:
+.LBE1621:
+	.loc 1 1579 0
+	add	x19, x19, x19, lsl 1
+.LBB1625:
+.LBB1623:
+	.loc 10 56 0
+	ldr	x5, [x5, 64]
+.LBE1623:
+.LBE1625:
+	.loc 1 1579 0
+	add	x19, x20, x19, lsl 3
+.LBB1626:
+.LBB1624:
+	.loc 10 56 0
+	blr	x5
+.LVL867:
+.LBE1624:
+.LBE1626:
+	.loc 1 1579 0
+	ldr	x1, [x20, 8]
+.LBB1627:
+.LBB1628:
+	.loc 10 61 0
+	mov	w2, 0
+	mov	x0, x1
+	ldr	x3, [x1, 72]
+	ldr	w1, [x19, 32]
+	blr	x3
+.LVL868:
+.LBE1628:
+.LBE1627:
+	.loc 1 1580 0
+	ldr	x2, [x20, 8]
+.LBB1629:
+.LBB1630:
+	.loc 10 76 0
+	mov	w1, 1
+	mov	x0, x2
+	ldr	x2, [x2, 96]
+	blr	x2
+.LVL869:
+.LBE1630:
+.LBE1629:
+	.loc 1 1581 0
+	ldr	w1, [x20, 72]
+	mov	w0, 1
+	sub	w0, w0, w1
+	str	w0, [x20, 72]
+	.loc 1 1582 0
+	ldp	x19, x20, [sp, 16]
+.LVL870:
+	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
+.LVL871:
+	.p2align 3
+.L789:
+	.cfi_restore_state
+.LBB1631:
+.LBB1618:
+.LBB1615:
+.LBB1614:
+	.loc 9 268 0
+	adrp	x3, dummy_dma_ops
+	add	x3, x3, :lo12:dummy_dma_ops
+	b	.L787
+.LBE1614:
+.LBE1615:
+.LBE1618:
+.LBE1631:
+	.cfi_endproc
+.LFE2880:
+	.size	flip.isra.4, .-flip.isra.4
+	.align	2
+	.p2align 3,,7
+	.type	ebc_power_set.part.7, %function
+ebc_power_set.part.7:
+.LFB2883:
+	.loc 1 390 0
+	.cfi_startproc
+.LVL872:
+	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 390 0
+	mov	x19, x0
+	.loc 1 407 0
+	str	w1, [x0, 392]
+	.loc 1 408 0
+	ldr	x1, [x0, 8]
+.LVL873:
+.LBB1632:
+.LBB1633:
+	.loc 10 50 0
+	mov	x0, x1
+.LVL874:
+	ldr	x1, [x1, 56]
+	blr	x1
+.LVL875:
+.LBE1633:
+.LBE1632:
+	.loc 1 409 0
+	ldr	x2, [x19, 16]
+.LBB1634:
+.LBB1635:
+	.loc 3 35 0
+	mov	w1, 0
+	mov	x0, x2
+	ldr	x2, [x2, 32]
+	blr	x2
+.LVL876:
+.LBE1635:
+.LBE1634:
+	.loc 1 410 0
+	ldr	w0, [x19, 656]
+	cbnz	w0, .L800
+	.loc 1 414 0
+	ldr	x0, [x19]
+	adrp	x1, .LC30
+	add	x1, x1, :lo12:.LC30
+	bl	_dev_info
+.LVL877:
+	.loc 1 418 0
+	ldp	x19, x20, [sp, 16]
+.LVL878:
+	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
+.LVL879:
+	.p2align 3
+.L800:
+	.cfi_restore_state
+	.loc 1 411 0
+	str	wzr, [x19, 656]
+.LBB1636:
+.LBB1637:
+	.file 11 "./include/linux/wakelock.h"
+	.loc 11 68 0
+	add	x0, x19, 448
+	bl	__pm_relax
+.LVL880:
+.LBE1637:
+.LBE1636:
+	.loc 1 414 0
+	ldr	x0, [x19]
+	adrp	x1, .LC30
+	add	x1, x1, :lo12:.LC30
+	bl	_dev_info
+.LVL881:
+	.loc 1 418 0
+	ldp	x19, x20, [sp, 16]
+.LVL882:
+	ldp	x29, x30, [sp], 32
+	.cfi_restore 20
+	.cfi_restore 19
+	.cfi_restore 29
+	.cfi_restore 30
+	.cfi_def_cfa 31, 0
+	ret
+	.cfi_endproc
+.LFE2883:
+	.size	ebc_power_set.part.7, .-ebc_power_set.part.7
+	.align	2
+	.p2align 3,,7
+	.type	ebc_suspend, %function
+ebc_suspend:
+.LFB2872:
+	.loc 1 3772 0
+	.cfi_startproc
+.LVL883:
+	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
+.LBB1638:
+.LBB1639:
+	.loc 2 1181 0
+	ldr	x20, [x0, 184]
+.LBE1639:
+.LBE1638:
+	.loc 1 3776 0
+	add	x19, x20, 192
+	ldr	w0, [x19, 200]
+.LVL884:
+	cmp	w0, 1
+	beq	.L804
+.L802:
+	.loc 1 3780 0
+	mov	w0, 1
+	str	w0, [x19, 588]
+	.loc 1 3782 0
+	ldr	x1, [x20, 16]
+.LBB1640:
+.LBB1641:
+	.loc 3 40 0
+	mov	x0, x1
+	ldr	x1, [x1, 40]
+	blr	x1
+.LVL885:
+.LBE1641:
+.LBE1640:
+	.loc 1 3783 0
+	ldr	x0, [x19, 104]
+	adrp	x1, .LC32
+	add	x1, x1, :lo12:.LC32
+	bl	_dev_info
+.LVL886:
+	.loc 1 3786 0
+	mov	w0, 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
+	.p2align 3
+.L804:
+	.cfi_restore_state
+	.loc 1 3777 0
+	ldr	x0, [x19, 104]
+	adrp	x2, .LANCHOR3
+	add	x2, x2, :lo12:.LANCHOR3
+	adrp	x1, .LC31
+	add	x1, x1, :lo12:.LC31
+	bl	_dev_info
+.LVL887:
+.LBB1642:
+.LBB1643:
+	mov	w1, 0
+	mov	x0, x20
+	bl	ebc_power_set.part.7
+.LVL888:
+	b	.L802
+.LBE1643:
+.LBE1642:
+	.cfi_endproc
+.LFE2872:
+	.size	ebc_suspend, .-ebc_suspend
+	.align	2
+	.p2align 3,,7
+	.type	direct_mode_data_change_part2.isra.8, %function
+direct_mode_data_change_part2.isra.8:
+.LFB2884:
+	.loc 1 1527 0
+	.cfi_startproc
+.LVL889:
+	stp	x29, x30, [sp, -80]!
+	.cfi_def_cfa_offset 80
+	.cfi_offset 29, -80
+	.cfi_offset 30, -72
+	.loc 1 1529 0
+	adrp	x7, .LANCHOR0
+	.loc 1 1527 0
+	and	w3, w3, 255
+	.loc 1 1541 0
+	cmp	w6, 2
+	.loc 1 1533 0
+	sub	w3, w3, w4
+.LVL890:
+	.loc 1 1527 0
+	add	x29, sp, 0
+	.cfi_def_cfa_register 29
+	.loc 1 1529 0
+	ldr	x4, [x7, #:lo12:.LANCHOR0]
+	.loc 1 1527 0
+	stp	x19, x20, [sp, 16]
+	.loc 1 1534 0
+	lsl	w3, w3, 10
+.LVL891:
+	.loc 1 1527 0
+	stp	x21, x22, [sp, 32]
+	.cfi_offset 19, -64
+	.cfi_offset 20, -56
+	.cfi_offset 21, -48
+	.cfi_offset 22, -40
+	.loc 1 1534 0
+	add	x19, x5, x3, sxtw
+.LVL892:
+	.loc 1 1527 0
+	stp	x23, x24, [sp, 48]
+	mov	x22, x0
+	stp	x25, x26, [sp, 64]
+	.cfi_offset 23, -32
+	.cfi_offset 24, -24
+	.cfi_offset 25, -16
+	.cfi_offset 26, -8
+	.loc 1 1527 0
+	mov	x24, x1
+	mov	x25, x2
+	.loc 1 1539 0
+	ldp	w9, w23, [x4, 108]
+	.loc 1 1538 0
+	lsr	w20, w9, 3
+	.loc 1 1541 0
+	beq	.L870
+	.loc 1 1544 0
+	cmp	w6, 3
+	beq	.L808
+	lsr	w26, w9, 2
+	mov	x0, 0
+	.loc 1 1549 0
+	mov	w21, 0
+.LVL893:
+.L807:
+	.loc 1 1553 0
+	sub	w2, w23, w21
+	add	x0, x22, x0
+	mov	w1, 0
+	mul	w2, w2, w26
+	sxtw	x2, w2
+	bl	memset
+.LVL894:
+	.loc 1 1554 0
+	cmp	w21, w23
+	bge	.L805
+	sub	w7, w20, #1
+	mul	w8, w21, w26
+	add	x7, x7, 1
+	lsl	w9, w26, 1
+	lsl	x7, x7, 3
+.LBB1644:
+.LBB1645:
+	.loc 1 332 0
+	mov	w6, 3
+.LBE1645:
+.LBE1644:
+.LBB1681:
+.LBB1682:
+	.loc 1 362 0
+	mov	w5, 12
+.LVL895:
+	.p2align 2
+.L831:
+.LBE1682:
+.LBE1681:
+	.loc 1 1555 0
+	add	x4, x22, x8, sxtw
+	.loc 1 1556 0
+	cbz	w20, .L810
+	mov	x11, 0
+.LVL896:
+	.p2align 2
+.L820:
+	.loc 1 1558 0
+	ldr	x0, [x25, x11, lsl 3]
+	.loc 1 1557 0
+	ldr	x2, [x24, x11, lsl 3]
+.LBB1723:
+.LBB1678:
+.LBB1646:
+.LBB1647:
+	.loc 1 280 0
+	lsr	x3, x0, 14
+	.loc 1 282 0
+	lsr	x17, x0, 30
+	.loc 1 280 0
+	ubfx	x12, x2, 19, 5
+	.loc 1 282 0
+	ubfx	x1, x2, 35, 5
+	.loc 1 281 0
+	lsr	x15, x0, 22
+	.loc 1 284 0
+	lsr	x14, x0, 46
+	.loc 1 280 0
+	and	x3, x3, 992
+	.loc 1 282 0
+	and	x17, x17, 992
+	.loc 1 281 0
+	lsr	w13, w2, 27
+	.loc 1 280 0
+	orr	x3, x3, x12
+	.loc 1 281 0
+	and	x15, x15, 992
+	.loc 1 283 0
+	lsr	x12, x0, 38
+	.loc 1 282 0
+	orr	x17, x17, x1
+	.loc 1 284 0
+	and	x14, x14, 992
+	ubfx	x1, x2, 51, 5
+	.loc 1 279 0
+	lsr	x16, x0, 6
+	.loc 1 283 0
+	and	x12, x12, 992
+	.loc 1 281 0
+	orr	x15, x15, x13
+	.loc 1 284 0
+	orr	x14, x14, x1
+	.loc 1 283 0
+	ubfx	x13, x2, 43, 5
+	.loc 1 278 0
+	lsl	x1, x0, 2
+.LBE1647:
+.LBE1646:
+	.loc 1 333 0
+	eor	x10, x2, x0
+.LVL897:
+.LBE1678:
+.LBE1723:
+	.loc 1 1559 0
+	cmp	x2, x0
+.LBB1724:
+.LBB1679:
+.LBB1663:
+.LBB1648:
+	.loc 1 279 0
+	ubfx	x30, x2, 11, 5
+	.loc 1 278 0
+	and	x1, x1, 992
+	.loc 1 279 0
+	and	x16, x16, 992
+	.loc 1 283 0
+	orr	x13, x12, x13
+	.loc 1 285 0
+	lsr	x0, x0, 54
+	.loc 1 278 0
+	ubfx	x12, x2, 3, 5
+.LBE1648:
+.LBE1663:
+	.loc 1 338 0
+	and	x18, x10, 255
+.LBB1664:
+.LBB1649:
+	.loc 1 278 0
+	orr	x12, x1, x12
+	.loc 1 279 0
+	orr	x16, x16, x30
+	.loc 1 285 0
+	and	x1, x0, 992
+	add	x2, x19, x2, lsr 59
+.LBE1649:
+.LBE1664:
+.LBE1679:
+.LBE1724:
+	.loc 1 1559 0
+	beq	.L811
+.LBB1725:
+.LBB1680:
+	.loc 1 332 0
+	cmp	x18, 0
+.LBB1665:
+.LBB1650:
+	.loc 1 280 0
+	ldrb	w18, [x19, x3]
+.LBE1650:
+.LBE1665:
+	.loc 1 332 0
+	csel	w0, w6, wzr, ne
+	.loc 1 341 0
+	tst	x10, 65280
+	orr	w3, w0, 48
+.LBB1666:
+.LBB1651:
+	.loc 1 282 0
+	ldrb	w17, [x19, x17]
+.LBE1651:
+.LBE1666:
+	.loc 1 341 0
+	csel	w0, w3, w0, ne
+	.loc 1 343 0
+	tst	x10, 16711680
+	orr	w30, w0, 768
+.LBB1667:
+.LBB1652:
+	.loc 1 279 0
+	ldrb	w3, [x19, x16]
+.LBE1652:
+.LBE1667:
+	.loc 1 343 0
+	csel	w0, w30, w0, ne
+	.loc 1 345 0
+	tst	x10, 4278190080
+	orr	w30, w0, 12288
+.LBB1668:
+.LBB1653:
+	.loc 1 281 0
+	ldrb	w16, [x19, x15]
+.LBE1653:
+.LBE1668:
+	.loc 1 345 0
+	csel	w0, w30, w0, ne
+	.loc 1 347 0
+	tst	x10, 1095216660480
+	orr	w15, w0, 196608
+.LBB1669:
+.LBB1654:
+	.loc 1 284 0
+	ldrb	w14, [x19, x14]
+.LBE1654:
+.LBE1669:
+	.loc 1 347 0
+	csel	w0, w15, w0, ne
+.LBB1670:
+.LBB1655:
+	.loc 1 283 0
+	ldrb	w13, [x19, x13]
+.LBE1655:
+.LBE1670:
+	.loc 1 349 0
+	tst	x10, 280375465082880
+	orr	w15, w0, 3145728
+	csel	w0, w15, w0, ne
+.LBB1671:
+.LBB1656:
+	.loc 1 285 0
+	ldrb	w2, [x2, x1]
+	.loc 1 278 0
+	ldrb	w15, [x19, x12]
+	.loc 1 280 0
+	lsl	w1, w18, 8
+	.loc 1 282 0
+	lsl	w12, w17, 16
+.LBE1656:
+.LBE1671:
+	.loc 1 351 0
+	tst	x10, 71776119061217280
+.LBB1672:
+.LBB1657:
+	.loc 1 285 0
+	orr	w1, w1, w3, lsl 4
+.LBE1657:
+.LBE1672:
+	.loc 1 351 0
+	orr	w17, w0, 50331648
+.LBB1673:
+.LBB1658:
+	.loc 1 285 0
+	orr	w12, w12, w16, lsl 12
+	.loc 1 284 0
+	lsl	w3, w14, 24
+.LBE1658:
+.LBE1673:
+	.loc 1 351 0
+	csel	w0, w17, w0, ne
+.LBB1674:
+.LBB1659:
+	.loc 1 285 0
+	orr	w1, w1, w12
+	orr	w3, w3, w13, lsl 20
+.LBE1659:
+.LBE1674:
+	.loc 1 353 0
+	tst	x10, -72057594037927936
+.LBB1675:
+.LBB1660:
+	.loc 1 285 0
+	orr	w1, w1, w3
+.LBE1660:
+.LBE1675:
+	.loc 1 353 0
+	orr	w10, w0, 805306368
+.LVL898:
+.LBB1676:
+.LBB1661:
+	.loc 1 285 0
+	orr	w2, w15, w2, lsl 28
+.LBE1661:
+.LBE1676:
+	.loc 1 353 0
+	csel	w0, w10, w0, ne
+.LBB1677:
+.LBB1662:
+	.loc 1 285 0
+	orr	w1, w1, w2
+.LBE1662:
+.LBE1677:
+	.loc 1 355 0
+	and	w0, w1, w0
+.LBE1680:
+.LBE1725:
+	.loc 1 1560 0
+	str	w0, [x4, x11, lsl 2]
+.LVL899:
+.L811:
+	add	x11, x11, 1
+	.loc 1 1556 0
+	cmp	w20, w11
+	bgt	.L820
+	add	x24, x24, x7
+.LVL900:
+	add	x25, x25, x7
+.LVL901:
+	mov	x11, 0
+.LVL902:
+	.p2align 2
+.L830:
+	.loc 1 1565 0
+	ldr	x0, [x25, x11, lsl 3]
+	.loc 1 1564 0
+	ldr	x2, [x24, x11, lsl 3]
+.LBB1726:
+.LBB1719:
+.LBB1683:
+.LBB1684:
+	.loc 1 293 0
+	lsr	x17, x0, 22
+	.loc 1 291 0
+	lsr	x16, x0, 6
+	.loc 1 293 0
+	lsr	w3, w2, 27
+	.loc 1 295 0
+	lsr	x13, x0, 38
+	.loc 1 293 0
+	and	x17, x17, 992
+	.loc 1 291 0
+	ubfx	x1, x2, 11, 5
+	.loc 1 292 0
+	lsr	x15, x0, 14
+	.loc 1 290 0
+	lsl	x14, x0, 2
+	.loc 1 291 0
+	and	x16, x16, 992
+	.loc 1 293 0
+	orr	x17, x17, x3
+	.loc 1 295 0
+	and	x13, x13, 992
+	ubfx	x3, x2, 43, 5
+	.loc 1 292 0
+	ubfx	x30, x2, 19, 5
+	.loc 1 290 0
+	ubfx	x12, x2, 3, 5
+	.loc 1 292 0
+	and	x15, x15, 992
+	.loc 1 290 0
+	and	x14, x14, 992
+	.loc 1 291 0
+	orr	x16, x16, x1
+	.loc 1 295 0
+	orr	x13, x13, x3
+	.loc 1 294 0
+	lsr	x1, x0, 30
+	.loc 1 296 0
+	lsr	x3, x0, 46
+.LBE1684:
+.LBE1683:
+	.loc 1 363 0
+	eor	x10, x2, x0
+.LVL903:
+.LBE1719:
+.LBE1726:
+	.loc 1 1566 0
+	cmp	x2, x0
+.LBB1727:
+.LBB1720:
+.LBB1702:
+.LBB1685:
+	.loc 1 294 0
+	and	x1, x1, 992
+	.loc 1 292 0
+	orr	x15, x15, x30
+	.loc 1 290 0
+	orr	x14, x14, x12
+	.loc 1 294 0
+	ubfx	x30, x2, 35, 5
+	.loc 1 296 0
+	ubfx	x12, x2, 51, 5
+	.loc 1 297 0
+	lsr	x0, x0, 54
+	.loc 1 296 0
+	and	x3, x3, 992
+	.loc 1 294 0
+	orr	x30, x1, x30
+.LBE1685:
+.LBE1702:
+	.loc 1 368 0
+	and	x18, x10, 255
+.LBB1703:
+.LBB1686:
+	.loc 1 297 0
+	and	x1, x0, 992
+	add	x2, x19, x2, lsr 59
+	.loc 1 296 0
+	orr	x12, x3, x12
+.LBE1686:
+.LBE1703:
+.LBE1720:
+.LBE1727:
+	.loc 1 1566 0
+	beq	.L821
+.LBB1728:
+.LBB1721:
+	.loc 1 362 0
+	cmp	x18, 0
+.LBB1704:
+.LBB1687:
+	.loc 1 293 0
+	ldrb	w17, [x19, x17]
+.LBE1687:
+.LBE1704:
+	.loc 1 362 0
+	csel	w0, w5, wzr, ne
+	.loc 1 371 0
+	tst	x10, 65280
+	orr	w3, w0, 192
+.LBB1705:
+.LBB1688:
+	.loc 1 291 0
+	ldrb	w16, [x19, x16]
+.LBE1688:
+.LBE1705:
+	.loc 1 371 0
+	csel	w0, w3, w0, ne
+	.loc 1 373 0
+	tst	x10, 16711680
+	orr	w18, w0, 3072
+.LBB1706:
+.LBB1689:
+	.loc 1 292 0
+	ldrb	w3, [x19, x15]
+.LBE1689:
+.LBE1706:
+	.loc 1 373 0
+	csel	w0, w18, w0, ne
+	.loc 1 375 0
+	tst	x10, 4278190080
+	orr	w15, w0, 49152
+.LBB1707:
+.LBB1690:
+	.loc 1 290 0
+	ldrb	w18, [x19, x14]
+.LBE1690:
+.LBE1707:
+	.loc 1 375 0
+	csel	w0, w15, w0, ne
+	.loc 1 377 0
+	tst	x10, 1095216660480
+	orr	w14, w0, 786432
+.LBB1708:
+.LBB1691:
+	.loc 1 295 0
+	ldrb	w15, [x19, x13]
+.LBE1691:
+.LBE1708:
+	.loc 1 377 0
+	csel	w0, w14, w0, ne
+.LBB1709:
+.LBB1692:
+	.loc 1 297 0
+	ldrb	w13, [x2, x1]
+.LBE1692:
+.LBE1709:
+	.loc 1 379 0
+	tst	x10, 280375465082880
+.LBB1710:
+.LBB1693:
+	.loc 1 294 0
+	ldrb	w14, [x19, x30]
+.LBE1693:
+.LBE1710:
+	.loc 1 379 0
+	orr	w1, w0, 12582912
+.LBB1711:
+.LBB1694:
+	.loc 1 296 0
+	ldrb	w2, [x19, x12]
+.LBE1694:
+.LBE1711:
+	.loc 1 379 0
+	csel	w0, w1, w0, ne
+.LBB1712:
+.LBB1695:
+	.loc 1 291 0
+	lsl	w16, w16, 6
+	.loc 1 293 0
+	lsl	w1, w17, 14
+.LBE1695:
+.LBE1712:
+	.loc 1 381 0
+	tst	x10, 71776119061217280
+.LBB1713:
+.LBB1696:
+	.loc 1 297 0
+	orr	w1, w1, w3, lsl 10
+.LBE1696:
+.LBE1713:
+	.loc 1 381 0
+	orr	w17, w0, 201326592
+.LBB1714:
+.LBB1697:
+	.loc 1 297 0
+	orr	w3, w16, w18, lsl 2
+	.loc 1 295 0
+	lsl	w12, w15, 22
+.LBE1697:
+.LBE1714:
+	.loc 1 381 0
+	csel	w0, w17, w0, ne
+.LBB1715:
+.LBB1698:
+	.loc 1 297 0
+	orr	w1, w1, w3
+	orr	w12, w12, w14, lsl 18
+	lsl	w3, w13, 30
+.LBE1698:
+.LBE1715:
+	.loc 1 383 0
+	tst	x10, -72057594037927936
+.LBB1716:
+.LBB1699:
+	.loc 1 297 0
+	orr	w3, w3, w2, lsl 26
+.LBE1699:
+.LBE1716:
+	.loc 1 383 0
+	orr	w10, w0, -1073741824
+.LVL904:
+.LBB1717:
+.LBB1700:
+	.loc 1 297 0
+	orr	w1, w1, w12
+.LBE1700:
+.LBE1717:
+.LBE1721:
+.LBE1728:
+	.loc 1 1567 0
+	ldr	w2, [x4, x11, lsl 2]
+.LBB1729:
+.LBB1722:
+	.loc 1 383 0
+	csel	w0, w10, w0, ne
+.LBB1718:
+.LBB1701:
+	.loc 1 297 0
+	orr	w1, w1, w3
+.LBE1701:
+.LBE1718:
+	.loc 1 385 0
+	and	w0, w1, w0
+.LBE1722:
+.LBE1729:
+	.loc 1 1567 0
+	orr	w0, w2, w0
+	str	w0, [x4, x11, lsl 2]
+.LVL905:
+.L821:
+	add	x11, x11, 1
+	.loc 1 1563 0
+	cmp	w20, w11
+	bgt	.L830
+	add	x24, x24, x7
+	add	x25, x25, x7
+.L810:
+	.loc 1 1554 0
+	add	w21, w21, 2
+	add	w8, w8, w9
+	cmp	w23, w21
+	bgt	.L831
+.L805:
+	.loc 1 1571 0
+	ldp	x19, x20, [sp, 16]
+.LVL906:
+	ldp	x21, x22, [sp, 32]
+.LVL907:
+	ldp	x23, x24, [sp, 48]
+.LVL908:
+	ldp	x25, x26, [sp, 64]
+.LVL909:
+	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
+.LVL910:
+.L870:
+	.cfi_restore_state
+	.loc 1 1543 0
+	add	w23, w23, w23, lsr 31
+.LVL911:
+	lsr	w26, w9, 2
+	asr	w23, w23, 1
+.LVL912:
+	mov	x0, 0
+	.loc 1 1542 0
+	mov	w21, 0
+.LVL913:
+	b	.L807
+.LVL914:
+.L808:
+	.loc 1 1545 0
+	add	w21, w23, w23, lsr 31
+	lsr	w26, w9, 2
+	asr	w21, w21, 1
+.LVL915:
+	.loc 1 1546 0
+	mul	w1, w20, w21
+	mul	w0, w21, w26
+	sbfiz	x1, x1, 3, 32
+	sxtw	x0, w0
+	add	x24, x24, x1
+	.loc 1 1547 0
+	add	x25, x2, x1
+	b	.L807
+	.cfi_endproc
+.LFE2884:
+	.size	direct_mode_data_change_part2.isra.8, .-direct_mode_data_change_part2.isra.8
+	.align	2
+	.p2align 3,,7
+	.type	direct_mode_data_change_part.isra.9, %function
+direct_mode_data_change_part.isra.9:
+.LFB2885:
+	.loc 1 1439 0
+	.cfi_startproc
+.LVL916:
+	stp	x29, x30, [sp, -96]!
+	.cfi_def_cfa_offset 96
+	.cfi_offset 29, -96
+	.cfi_offset 30, -88
+	.loc 1 1441 0
+	adrp	x7, .LANCHOR0
+	.loc 1 1439 0
+	and	w3, w3, 255
+	.loc 1 1452 0
+	cmp	w6, 2
+	.loc 1 1445 0
+	sub	w4, w3, w4
+.LVL917:
+	.loc 1 1439 0
+	add	x29, sp, 0
+	.cfi_def_cfa_register 29
+	.loc 1 1441 0
+	ldr	x3, [x7, #:lo12:.LANCHOR0]
+	.loc 1 1439 0
+	stp	x23, x24, [sp, 48]
+	.loc 1 1446 0
+	lsl	w4, w4, 10
+.LVL918:
+	.cfi_offset 23, -48
+	.cfi_offset 24, -40
+	.loc 1 1449 0
+	add	x23, x3, 24
+	.loc 1 1439 0
+	stp	x19, x20, [sp, 16]
+	stp	x21, x22, [sp, 32]
+	.cfi_offset 19, -80
+	.cfi_offset 20, -72
+	.cfi_offset 21, -64
+	.cfi_offset 22, -56
+	mov	x20, x1
+	str	x27, [sp, 80]
+	.cfi_offset 27, -16
+	mov	x27, x0
+	stp	x25, x26, [sp, 64]
+	.cfi_offset 25, -32
+	.cfi_offset 26, -24
+	.loc 1 1439 0
+	mov	x21, x2
+	.loc 1 1446 0
+	add	x19, x5, x4, sxtw
+.LVL919:
+	.loc 1 1450 0
+	ldp	w10, w0, [x23, 84]
+.LVL920:
+	.loc 1 1449 0
+	lsr	w22, w10, 3
+	.loc 1 1452 0
+	beq	.L909
+	mov	w25, w0
+.LVL921:
+	.loc 1 1455 0
+	cmp	w6, 3
+	.loc 1 1460 0
+	mov	w24, 0
+.LVL922:
+	.loc 1 1455 0
+	beq	.L910
+.L873:
+	.loc 1 1464 0
+	ldr	w1, [x23, 156]
+	.loc 1 1463 0
+	lsr	w26, w10, 2
+.LVL923:
+	.loc 1 1464 0
+	cbz	w1, .L874
+	.loc 1 1465 0
+	sub	w2, w25, w24
+	sub	w0, w0, w25
+	mov	w1, 0
+	mul	w2, w2, w26
+	mul	w0, w0, w26
+	sxtw	x2, w2
+	add	x0, x27, x0
+	bl	memset
+.LVL924:
+	.loc 1 1466 0
+	ldr	w0, [x23, 88]
+	sub	w0, w0, #1
+	sub	w0, w0, w24
+	mul	w0, w0, w26
+	neg	w26, w26
+	add	x27, x27, x0
+.L877:
+	.loc 1 1473 0
+	cmp	w25, w24
+	ble	.L871
+	sub	w9, w22, #1
+	sxtw	x10, w26
+	add	x9, x9, 1
+.LBB1730:
+.LBB1731:
+	.loc 1 302 0
+	mov	w8, 3
+	lsl	x9, x9, 3
+.LVL925:
+	.p2align 2
+.L876:
+.LBE1731:
+.LBE1730:
+	.loc 1 1474 0
+	mov	x5, 0
+	cbz	w22, .L889
+	.p2align 2
+.L906:
+	.loc 1 1476 0
+	ldr	x0, [x21, x5, lsl 3]
+.LVL926:
+	.loc 1 1475 0
+	ldr	x2, [x20, x5, lsl 3]
+.LVL927:
+.LBB1771:
+.LBB1768:
+.LBB1732:
+.LBB1733:
+	.loc 1 270 0
+	lsr	x15, x0, 30
+	.loc 1 268 0
+	lsr	x14, x0, 14
+	.loc 1 272 0
+	lsr	x1, x0, 46
+	.loc 1 270 0
+	ubfx	x6, x2, 35, 5
+	.loc 1 268 0
+	ubfx	x3, x2, 19, 5
+	.loc 1 269 0
+	lsr	x13, x0, 22
+	.loc 1 267 0
+	lsr	x12, x0, 6
+	.loc 1 272 0
+	and	x1, x1, 992
+	ubfx	x11, x2, 51, 5
+	.loc 1 270 0
+	and	x15, x15, 992
+	.loc 1 268 0
+	and	x14, x14, 992
+	.loc 1 269 0
+	lsr	w7, w2, 27
+	and	x13, x13, 992
+	.loc 1 270 0
+	orr	x15, x15, x6
+	.loc 1 267 0
+	and	x12, x12, 992
+	ubfx	x6, x2, 11, 5
+	.loc 1 268 0
+	orr	x14, x14, x3
+	.loc 1 272 0
+	orr	x11, x1, x11
+	.loc 1 271 0
+	lsr	x3, x0, 38
+	.loc 1 266 0
+	lsl	x1, x0, 2
+.LBE1733:
+.LBE1732:
+	.loc 1 303 0
+	eor	x4, x2, x0
+.LBE1768:
+.LBE1771:
+	.loc 1 1477 0
+	cmp	x2, x0
+.LBB1772:
+.LBB1769:
+.LBB1751:
+.LBB1734:
+	.loc 1 266 0
+	and	x1, x1, 992
+	.loc 1 269 0
+	orr	x13, x13, x7
+	.loc 1 267 0
+	orr	x12, x12, x6
+	.loc 1 271 0
+	ubfx	x7, x2, 43, 5
+	.loc 1 266 0
+	ubfx	x6, x2, 3, 5
+	.loc 1 271 0
+	and	x3, x3, 992
+	.loc 1 273 0
+	lsr	x0, x0, 54
+.LVL928:
+	.loc 1 266 0
+	orr	x6, x1, x6
+.LBE1734:
+.LBE1751:
+	.loc 1 308 0
+	and	x16, x4, 255
+.LBB1752:
+.LBB1735:
+	.loc 1 271 0
+	orr	x7, x3, x7
+	.loc 1 273 0
+	and	x1, x0, 992
+	add	x2, x19, x2, lsr 59
+.LVL929:
+.LBE1735:
+.LBE1752:
+.LBE1769:
+.LBE1772:
+	.loc 1 1477 0
+	beq	.L878
+.LBB1773:
+.LBB1770:
+	.loc 1 302 0
+	cmp	x16, 0
+.LBB1753:
+.LBB1736:
+	.loc 1 268 0
+	ldrb	w14, [x19, x14]
+.LBE1736:
+.LBE1753:
+	.loc 1 302 0
+	csel	w0, w8, wzr, ne
+	.loc 1 311 0
+	tst	x4, 65280
+	orr	w3, w0, 12
+.LBB1754:
+.LBB1737:
+	.loc 1 270 0
+	ldrb	w15, [x19, x15]
+.LBE1737:
+.LBE1754:
+	.loc 1 311 0
+	csel	w0, w3, w0, ne
+	.loc 1 313 0
+	tst	x4, 16711680
+	orr	w16, w0, 48
+.LBB1755:
+.LBB1738:
+	.loc 1 269 0
+	ldrb	w3, [x19, x13]
+.LBE1738:
+.LBE1755:
+	.loc 1 313 0
+	csel	w0, w16, w0, ne
+	.loc 1 315 0
+	tst	x4, 4278190080
+	orr	w13, w0, 192
+.LBB1756:
+.LBB1739:
+	.loc 1 267 0
+	ldrb	w12, [x19, x12]
+.LBE1739:
+.LBE1756:
+	.loc 1 315 0
+	and	w13, w13, 65535
+.LBB1757:
+.LBB1740:
+	.loc 1 272 0
+	ldrb	w11, [x19, x11]
+.LBE1740:
+.LBE1757:
+	.loc 1 315 0
+	csel	w0, w13, w0, ne
+	.loc 1 317 0
+	tst	x4, 1095216660480
+	orr	w16, w0, 768
+.LBB1758:
+.LBB1741:
+	.loc 1 266 0
+	ldrb	w13, [x19, x6]
+.LBE1741:
+.LBE1758:
+	.loc 1 317 0
+	and	w16, w16, 65535
+.LBB1759:
+.LBB1742:
+	.loc 1 271 0
+	ldrb	w7, [x19, x7]
+.LBE1742:
+.LBE1759:
+	.loc 1 317 0
+	csel	w0, w16, w0, ne
+	.loc 1 319 0
+	tst	x4, 280375465082880
+	orr	w6, w0, 3072
+.LBB1760:
+.LBB1743:
+	.loc 1 273 0
+	ldrb	w2, [x2, x1]
+.LBE1743:
+.LBE1760:
+	.loc 1 319 0
+	and	w6, w6, 65535
+.LBB1761:
+.LBB1744:
+	.loc 1 270 0
+	lsl	w1, w15, 8
+.LBE1744:
+.LBE1761:
+	.loc 1 319 0
+	csel	w0, w6, w0, ne
+.LBB1762:
+.LBB1745:
+	.loc 1 268 0
+	lsl	w6, w14, 4
+.LBE1745:
+.LBE1762:
+	.loc 1 321 0
+	orr	w14, w0, 12288
+	tst	x4, 71776119061217280
+	and	w14, w14, 65535
+.LBB1763:
+.LBB1746:
+	.loc 1 273 0
+	orr	w1, w1, w3, lsl 6
+.LBE1746:
+.LBE1763:
+	.loc 1 321 0
+	csel	w0, w14, w0, ne
+.LBB1764:
+.LBB1747:
+	.loc 1 273 0
+	orr	w12, w6, w12, lsl 2
+	.loc 1 272 0
+	lsl	w6, w11, 12
+.LBE1747:
+.LBE1764:
+	.loc 1 323 0
+	orr	w3, w0, -16384
+.LBB1765:
+.LBB1748:
+	.loc 1 273 0
+	orr	w1, w1, w12
+	orr	w6, w6, w7, lsl 10
+.LBE1748:
+.LBE1765:
+	.loc 1 323 0
+	tst	x4, -72057594037927936
+	and	w3, w3, 65535
+.LBB1766:
+.LBB1749:
+	.loc 1 273 0
+	orr	w1, w1, w6
+	orr	w2, w13, w2, lsl 14
+.LBE1749:
+.LBE1766:
+	.loc 1 323 0
+	csel	w0, w3, w0, ne
+.LBB1767:
+.LBB1750:
+	.loc 1 273 0
+	orr	w1, w1, w2
+.LBE1750:
+.LBE1767:
+	.loc 1 325 0
+	and	w0, w0, w1
+.LBE1770:
+.LBE1773:
+	.loc 1 1478 0
+	strh	w0, [x27, x5, lsl 1]
+.L878:
+	add	x5, x5, 1
+	.loc 1 1474 0
+	cmp	w22, w5
+	bgt	.L906
+	add	x20, x20, x9
+	add	x21, x21, x9
+.L889:
+	.loc 1 1473 0
+	add	w24, w24, 1
+	add	x27, x27, x10
+	cmp	w25, w24
+	bne	.L876
+.L871:
+	.loc 1 1482 0
+	ldp	x19, x20, [sp, 16]
+.LVL930:
+	ldp	x21, x22, [sp, 32]
+.LVL931:
+	ldp	x23, x24, [sp, 48]
+.LVL932:
+	ldp	x25, x26, [sp, 64]
+.LVL933:
+	ldr	x27, [sp, 80]
+.LVL934:
+	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
+.LVL935:
+.L874:
+	.cfi_restore_state
+	.loc 1 1470 0
+	sub	w2, w25, w24
+	.loc 1 1469 0
+	mul	w23, w26, w24
+	.loc 1 1470 0
+	mov	w1, 0
+	mul	w2, w2, w26
+	.loc 1 1469 0
+	add	x27, x27, x23, sxtw
+	.loc 1 1470 0
+	mov	x0, x27
+	sxtw	x2, w2
+	bl	memset
+.LVL936:
+	b	.L877
+.LVL937:
+.L909:
+	.loc 1 1454 0
+	add	w25, w0, w0, lsr 31
+	.loc 1 1453 0
+	mov	w24, 0
+.LVL938:
+	.loc 1 1454 0
+	asr	w25, w25, 1
+.LVL939:
+	b	.L873
+.L910:
+	.loc 1 1456 0
+	add	w24, w0, w0, lsr 31
+.LVL940:
+	asr	w24, w24, 1
+.LVL941:
+	.loc 1 1457 0
+	mul	w1, w22, w24
+	sbfiz	x1, x1, 3, 32
+	add	x20, x20, x1
+	.loc 1 1458 0
+	add	x21, x2, x1
+	b	.L873
+	.cfi_endproc
+.LFE2885:
+	.size	direct_mode_data_change_part.isra.9, .-direct_mode_data_change_part.isra.9
+	.align	2
+	.p2align 3,,7
+	.type	ebc_frame_start, %function
+ebc_frame_start:
+.LFB2835:
+	.loc 1 1641 0
+	.cfi_startproc
+.LVL942:
+	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
+	.loc 1 1643 0
+	add	x19, x0, 192
+	.loc 1 1641 0
+	str	x21, [sp, 32]
+	.cfi_offset 21, -16
+	.loc 1 1641 0
+	mov	x20, x0
+	.loc 1 1642 0
+	add	x21, x0, 24
+	.loc 1 1645 0
+	ldr	w6, [x19, 252]
+	cmp	w6, 3
+	beq	.L913
+	cmp	w6, 4
+	beq	.L914
+	cmp	w6, 1
+	beq	.L937
+	.loc 1 1751 0
+	ldrb	w4, [x19, 56]
+	str	w4, [x19, 72]
+	.loc 1 1754 0
+	ldp	x2, x1, [x19, 216]
+	.loc 1 1752 0
+	ldr	w0, [x21, 164]
+	.loc 1 1753 0
+	ldr	x5, [x20, 320]
+	.loc 1 1752 0
+	cbnz	w0, .L938
+	.loc 1 1759 0
+	ldr	x1, [x1, 16]
+	mov	w3, w4
+	ldr	x2, [x2, 16]
+	mov	w6, 1
+	ldr	x0, [x19, 184]
+	bl	direct_mode_data_change.isra.2
+.LVL943:
+	.loc 1 1764 0
+	ldr	w4, [x19, 72]
+	.loc 1 1767 0
+	ldp	x2, x1, [x19, 216]
+	.loc 1 1764 0
+	sub	w4, w4, #1
+	str	w4, [x19, 72]
+	.loc 1 1765 0
+	ldr	w0, [x21, 164]
+	.loc 1 1766 0
+	ldrb	w3, [x20, 248]
+	ldr	x5, [x20, 320]
+	.loc 1 1765 0
+	cbz	w0, .L932
+.L943:
+	.loc 1 1766 0
+	ldr	x1, [x1, 16]
+	mov	w6, 1
+	ldr	x2, [x2, 16]
+	ldr	x0, [x19, 192]
+	bl	direct_mode_data_change2.isra.3
+.LVL944:
+	b	.L933
+	.p2align 3
+.L937:
+	.loc 1 1721 0
+	ldrb	w4, [x19, 56]
+	str	w4, [x19, 72]
+	.loc 1 1725 0
+	ldr	x1, [x19, 216]
+	.loc 1 1722 0
+	ldr	w0, [x21, 164]
+.LVL945:
+	cbnz	w0, .L939
+	.loc 1 1730 0
+	ldr	x0, [x19, 224]
+	.loc 1 1729 0
+	mov	w3, w4
+	ldr	x2, [x1, 16]
+	ldr	x5, [x20, 320]
+	ldr	x1, [x0, 16]
+	ldr	x0, [x19, 184]
+	bl	direct_mode_data_change_part.isra.9
+.LVL946:
+	.loc 1 1735 0
+	ldr	w4, [x19, 72]
+	.loc 1 1738 0
+	ldp	x2, x1, [x19, 216]
+	.loc 1 1735 0
+	sub	w4, w4, #1
+	str	w4, [x19, 72]
+	.loc 1 1736 0
+	ldr	w0, [x21, 164]
+	.loc 1 1737 0
+	ldrb	w3, [x20, 248]
+	ldr	x5, [x20, 320]
+	.loc 1 1736 0
+	cbz	w0, .L928
+.L942:
+	.loc 1 1737 0
+	ldr	x1, [x1, 16]
+	mov	w6, 1
+	ldr	x2, [x2, 16]
+	ldr	x0, [x19, 192]
+	bl	direct_mode_data_change_part2.isra.8
+.LVL947:
+	b	.L933
+.LVL948:
+	.p2align 3
+.L914:
+	.loc 1 1647 0
+	ldrsw	x2, [x19, 32]
+	mov	w1, 0
+	ldr	x0, [x19, 184]
+.LVL949:
+	bl	memset
+.LVL950:
+	.loc 1 1648 0
+	ldr	w0, [x21, 164]
+	cbnz	w0, .L940
+	.loc 1 1656 0
+	ldp	x1, x2, [x19, 152]
+	mov	x5, x19
+	ldp	x3, x4, [x19, 168]
+	ldr	x0, [x19, 184]
+	bl	get_overlay_image_area
+.LVL951:
+.L917:
+	.loc 1 1662 0
+	ldr	w0, [x19, 60]
+	cbz	w0, .L918
+.LBB1774:
+.LBB1775:
+	.loc 1 1586 0
+	str	wzr, [x21, 72]
+	.loc 1 1587 0
+	mov	x0, x21
+	ldr	w1, [x20, 224]
+	bl	flip.isra.4
+.LVL952:
+.LBE1775:
+.LBE1774:
+	.loc 1 1664 0
+	ldrsw	x2, [x19, 32]
+	mov	w1, 0
+	ldr	x0, [x19, 192]
+	bl	memset
+.LVL953:
+	.loc 1 1665 0
+	ldr	w0, [x21, 164]
+	cbz	w0, .L919
+	.loc 1 1666 0
+	ldp	x1, x2, [x19, 152]
+	mov	x4, x19
+	ldr	x3, [x19, 168]
+	ldr	x0, [x19, 192]
+	bl	get_overlay_image_area2.isra.0
+.LVL954:
+	b	.L911
+.LVL955:
+	.p2align 3
+.L913:
+	.loc 1 1685 0
+	ldr	w0, [x21, 164]
+.LVL956:
+	.loc 1 1686 0
+	ldp	x1, x2, [x19, 152]
+	ldr	x3, [x19, 168]
+	.loc 1 1685 0
+	cbnz	w0, .L941
+	.loc 1 1693 0
+	ldr	x0, [x19, 184]
+	mov	w5, 1
+	mov	x4, x19
+	bl	get_auto_image
+.LVL957:
+.L922:
+	.loc 1 1699 0
+	ldr	w0, [x19, 60]
+	cbz	w0, .L923
+	.loc 1 1700 0
+	ldr	w0, [x21, 164]
+	.loc 1 1701 0
+	ldp	x1, x2, [x19, 152]
+	ldr	x3, [x19, 168]
+	.loc 1 1700 0
+	cbz	w0, .L924
+	.loc 1 1701 0
+	ldr	x0, [x19, 192]
+	mov	w5, 1
+	mov	x4, x19
+	bl	get_auto_image2
+.LVL958:
+	.p2align 2
+.L933:
+.LBB1776:
+.LBB1777:
+	.loc 1 1586 0
+	str	wzr, [x21, 72]
+	.loc 1 1587 0
+	mov	x0, x21
+	ldr	w1, [x20, 224]
+	bl	flip.isra.4
+.LVL959:
+.L911:
+.LBE1777:
+.LBE1776:
+	.loc 1 1782 0
+	ldp	x19, x20, [sp, 16]
+.LVL960:
+	ldr	x21, [sp, 32]
+	ldp	x29, x30, [sp], 48
+	.cfi_remember_state
+	.cfi_restore 30
+	.cfi_restore 29
+	.cfi_restore 21
+	.cfi_restore 19
+	.cfi_restore 20
+	.cfi_def_cfa 31, 0
+	ret
+.LVL961:
+	.p2align 3
+.L941:
+	.cfi_restore_state
+	.loc 1 1686 0
+	ldr	x0, [x19, 184]
+	mov	w5, 1
+	mov	x4, x19
+	bl	get_auto_image2
+.LVL962:
+	b	.L922
+	.p2align 3
+.L940:
+	.loc 1 1649 0
+	ldp	x1, x2, [x19, 152]
+	mov	x4, x19
+	ldr	x3, [x19, 168]
+	ldr	x0, [x19, 184]
+	bl	get_overlay_image_area2.isra.0
+.LVL963:
+	b	.L917
+	.p2align 3
+.L939:
+	.loc 1 1724 0
+	ldr	x0, [x19, 224]
+	.loc 1 1723 0
+	mov	w3, w4
+	ldr	x2, [x1, 16]
+	ldr	x5, [x20, 320]
+	ldr	x1, [x0, 16]
+	ldr	x0, [x19, 184]
+	bl	direct_mode_data_change_part2.isra.8
+.LVL964:
+	.loc 1 1735 0
+	ldr	w4, [x19, 72]
+	.loc 1 1738 0
+	ldp	x2, x1, [x19, 216]
+	.loc 1 1735 0
+	sub	w4, w4, #1
+	str	w4, [x19, 72]
+	.loc 1 1736 0
+	ldr	w0, [x21, 164]
+	.loc 1 1737 0
+	ldrb	w3, [x20, 248]
+	ldr	x5, [x20, 320]
+	.loc 1 1736 0
+	cbnz	w0, .L942
+.L928:
+	.loc 1 1743 0
+	ldr	x1, [x1, 16]
+	mov	w6, 1
+	ldr	x2, [x2, 16]
+	ldr	x0, [x19, 192]
+	bl	direct_mode_data_change_part.isra.9
+.LVL965:
+	b	.L933
+	.p2align 3
+.L938:
+	.loc 1 1753 0
+	ldr	x1, [x1, 16]
+	mov	w3, w4
+	ldr	x2, [x2, 16]
+	mov	w6, 1
+	ldr	x0, [x19, 184]
+	bl	direct_mode_data_change2.isra.3
+.LVL966:
+	.loc 1 1764 0
+	ldr	w4, [x19, 72]
+	.loc 1 1767 0
+	ldp	x2, x1, [x19, 216]
+	.loc 1 1764 0
+	sub	w4, w4, #1
+	str	w4, [x19, 72]
+	.loc 1 1765 0
+	ldr	w0, [x21, 164]
+	.loc 1 1766 0
+	ldrb	w3, [x20, 248]
+	ldr	x5, [x20, 320]
+	.loc 1 1765 0
+	cbnz	w0, .L943
+.L932:
+	.loc 1 1772 0
+	ldr	x1, [x1, 16]
+	mov	w6, 1
+	ldr	x2, [x2, 16]
+	ldr	x0, [x19, 192]
+	bl	direct_mode_data_change.isra.2
+.LVL967:
+	b	.L933
+	.p2align 3
+.L924:
+	.loc 1 1708 0
+	ldr	x0, [x19, 192]
+	mov	w5, 1
+	mov	x4, x19
+	bl	get_auto_image
+.LVL968:
+	b	.L933
+	.p2align 3
+.L918:
+	.loc 1 1680 0
+	ldr	x0, [x19, 104]
+	adrp	x2, .LANCHOR3
+	add	x2, x2, :lo12:.LANCHOR3
+	adrp	x1, .LC33
+	add	x2, x2, 16
+	add	x1, x1, :lo12:.LC33
+	bl	_dev_info
+.LVL969:
+	.loc 1 1681 0
+	str	wzr, [x19, 52]
+	b	.L911
+	.p2align 3
+.L919:
+	.loc 1 1673 0
+	ldp	x1, x2, [x19, 152]
+	mov	x5, x19
+	ldp	x3, x4, [x19, 168]
+	ldr	x0, [x19, 192]
+	bl	get_overlay_image_area
+.LVL970:
+	b	.L911
+	.p2align 3
+.L923:
+	.loc 1 1716 0
+	ldr	x0, [x19, 104]
+	adrp	x2, .LANCHOR3
+	add	x2, x2, :lo12:.LANCHOR3
+	adrp	x1, .LC34
+	add	x2, x2, 16
+	add	x1, x1, :lo12:.LC34
+	bl	_dev_info
+.LVL971:
+	.loc 1 1717 0
+	str	wzr, [x19, 52]
+	b	.L911
+	.cfi_endproc
+.LFE2835:
+	.size	ebc_frame_start, .-ebc_frame_start
+	.align	2
+	.p2align 3,,7
+	.type	ebc_auto_assist_tast_function, %function
+ebc_auto_assist_tast_function:
+.LFB2836:
+	.loc 1 1786 0
+	.cfi_startproc
+.LVL972:
+	stp	x29, x30, [sp, -96]!
+	.cfi_def_cfa_offset 96
+	.cfi_offset 29, -96
+	.cfi_offset 30, -88
+	.loc 1 1787 0
+	adrp	x1, .LANCHOR0
+	.loc 1 1786 0
+	adrp	x0, __stack_chk_guard
+.LVL973:
+	add	x0, x0, :lo12:__stack_chk_guard
+	add	x29, sp, 0
+	.cfi_def_cfa_register 29
+	stp	x19, x20, [sp, 16]
+	stp	x21, x22, [sp, 32]
+	.cfi_offset 19, -80
+	.cfi_offset 20, -72
+	.cfi_offset 21, -64
+	.cfi_offset 22, -56
+	adrp	x22, .LANCHOR1
+	stp	x23, x24, [sp, 48]
+	.loc 1 1792 0
+	add	x22, x22, :lo12:.LANCHOR1
+	.loc 1 1786 0
+	str	x25, [sp, 64]
+	.cfi_offset 23, -48
+	.cfi_offset 24, -40
+	.cfi_offset 25, -32
+	.loc 1 1792 0
+	add	x20, x22, 328
+	.loc 1 1787 0
+	ldr	x25, [x1, #:lo12:.LANCHOR0]
+.LVL974:
+	.loc 1 1865 0
+	add	x22, x22, 352
+.LBB1778:
+.LBB1779:
+.LBB1780:
+	.file 12 "./include/linux/compiler.h"
+	.loc 12 290 0
+	mov	x24, 2
+.LBE1780:
+.LBE1779:
+.LBE1778:
+	.loc 1 1786 0
+	ldr	x1, [x0]
+	str	x1, [x29, 88]
+	mov	x1,0
+.LBB1785:
+.LBB1782:
+.LBB1783:
+	.loc 4 19 0
+#APP
+// 19 "./arch/arm64/include/asm/current.h" 1
+	mrs x23, sp_el0
+// 0 "" 2
+.LVL975:
+#NO_APP
+.LBE1783:
+.LBE1782:
+.LBE1785:
+	.loc 1 1789 0
+	add	x19, x25, 192
+	add	x21, x25, 24
+	b	.L954
+	.p2align 3
+.L966:
+	.loc 1 1797 0
+	cmp	w5, 4
+	beq	.L947
+	cmp	w5, 1
+	beq	.L965
+	.loc 1 1849 0
+	ldr	w4, [x19, 72]
+	cbz	w4, .L950
+	.loc 1 1851 0
+	ldr	w0, [x21, 164]
+	cbz	w0, .L953
+	.loc 1 1852 0
+	ldrsw	x0, [x21, 72]
+	mov	w6, 3
+	.loc 1 1853 0
+	ldp	x2, x1, [x19, 216]
+	.loc 1 1852 0
+	add	x0, x19, x0, lsl 3
+	ldrb	w3, [x25, 248]
+	ldr	x5, [x25, 320]
+	ldr	x1, [x1, 16]
+	ldr	x0, [x0, 184]
+	ldr	x2, [x2, 16]
+	bl	direct_mode_data_change2.isra.3
+.LVL976:
+	.p2align 2
+.L950:
+	.loc 1 1865 0
+	mov	x0, x22
+	bl	up
+.LVL977:
+	.loc 1 1866 0
+	mov	x0, x20
+	bl	up
+.LVL978:
+	.loc 1 1867 0
+	bl	schedule
+.LVL979:
+.L954:
+	.loc 1 1792 0
+	mov	x0, x20
+	bl	down
+.LVL980:
+.LBB1786:
+.LBB1784:
+.LBB1781:
+	.loc 12 290 0
+	str	x24, [x23, 32]
+.LBE1781:
+.LBE1784:
+.LBE1786:
+	.loc 1 1796 0
+#APP
+// 1796 "drivers/gpu/drm/rockchip/ebc-dev/ebc_dev.c" 1
+	dmb ish
+// 0 "" 2
+	.loc 1 1797 0
+#NO_APP
+	ldr	w5, [x19, 252]
+	cmp	w5, 3
+	bne	.L966
+	.loc 1 1817 0
+	ldr	w0, [x21, 164]
+	cbz	w0, .L951
+	.loc 1 1818 0
+	ldrsw	x0, [x21, 72]
+	mov	x4, x19
+	ldp	x1, x2, [x19, 152]
+	add	x0, x19, x0, lsl 3
+	ldr	x3, [x19, 168]
+	ldr	x0, [x0, 184]
+	bl	get_auto_image2
+.LVL981:
+	b	.L950
+	.p2align 3
+.L965:
+	.loc 1 1833 0
+	ldr	w4, [x19, 72]
+	cbz	w4, .L950
+	.loc 1 1835 0
+	ldr	w0, [x21, 164]
+	cbz	w0, .L952
+	.loc 1 1836 0
+	ldrsw	x0, [x21, 72]
+	mov	w6, 3
+	.loc 1 1837 0
+	ldp	x2, x1, [x19, 216]
+	.loc 1 1836 0
+	add	x0, x19, x0, lsl 3
+	ldrb	w3, [x25, 248]
+	ldr	x5, [x25, 320]
+	ldr	x1, [x1, 16]
+	ldr	x0, [x0, 184]
+	ldr	x2, [x2, 16]
+	bl	direct_mode_data_change_part2.isra.8
+.LVL982:
+	b	.L950
+	.p2align 3
+.L947:
+	.loc 1 1799 0
+	ldr	w0, [x21, 164]
+	cbz	w0, .L949
+	.loc 1 1800 0
+	ldrsw	x0, [x21, 72]
+	mov	w6, 3
+	ldp	x1, x2, [x19, 152]
+	mov	x5, x19
+	add	x0, x19, x0, lsl 3
+	ldp	x3, x4, [x19, 168]
+	ldr	x0, [x0, 184]
+	bl	get_overlay_image2
+.LVL983:
+	b	.L950
+	.p2align 3
+.L951:
+	.loc 1 1825 0
+	ldrsw	x0, [x21, 72]
+	mov	x4, x19
+	ldp	x1, x2, [x19, 152]
+	add	x0, x19, x0, lsl 3
+	ldr	x3, [x19, 168]
+	ldr	x0, [x0, 184]
+	bl	get_auto_image
+.LVL984:
+	b	.L950
+	.p2align 3
+.L949:
+	.loc 1 1808 0
+	ldrsw	x0, [x21, 72]
+	mov	w6, 3
+	ldp	x1, x2, [x19, 152]
+	mov	x5, x19
+	add	x0, x19, x0, lsl 3
+	ldp	x3, x4, [x19, 168]
+	ldr	x0, [x0, 184]
+	bl	get_overlay_image
+.LVL985:
+	b	.L950
+	.p2align 3
+.L953:
+	.loc 1 1858 0
+	ldrsw	x0, [x21, 72]
+	mov	w6, 3
+	.loc 1 1859 0
+	ldp	x2, x1, [x19, 216]
+	.loc 1 1858 0
+	add	x0, x19, x0, lsl 3
+	ldrb	w3, [x25, 248]
+	ldr	x5, [x25, 320]
+	ldr	x1, [x1, 16]
+	ldr	x0, [x0, 184]
+	ldr	x2, [x2, 16]
+	bl	direct_mode_data_change.isra.2
+.LVL986:
+	b	.L950
+	.p2align 3
+.L952:
+	.loc 1 1842 0
+	ldrsw	x0, [x21, 72]
+	mov	w6, 3
+	.loc 1 1843 0
+	ldp	x2, x1, [x19, 216]
+	.loc 1 1842 0
+	add	x0, x19, x0, lsl 3
+	ldrb	w3, [x25, 248]
+	ldr	x5, [x25, 320]
+	ldr	x1, [x1, 16]
+	ldr	x0, [x0, 184]
+	ldr	x2, [x2, 16]
+	bl	direct_mode_data_change_part.isra.9
+.LVL987:
+	b	.L950
+	.cfi_endproc
+.LFE2836:
+	.size	ebc_auto_assist_tast_function, .-ebc_auto_assist_tast_function
+	.align	2
+	.p2align 3,,7
+	.type	check_black_percent.isra.11, %function
+check_black_percent.isra.11:
+.LFB2887:
+	.loc 1 2254 0
+	.cfi_startproc
+	.loc 1 2265 0
+	mov	w2, 26215
+	.loc 1 2266 0
+	cmp	w1, 0
+	.loc 1 2265 0
+	movk	w2, 0x6666, lsl 16
+	.loc 1 2266 0
+	add	w5, w1, 7
+	csel	w5, w5, w1, lt
+	.loc 1 2265 0
+	smull	x4, w1, w2
+	.loc 1 2266 0
+	asr	w5, w5, 3
+	cmp	w5, 0
+	.loc 1 2265 0
+	asr	x4, x4, 34
+	sub	w4, w4, w1, asr 31
+.LVL988:
+	.loc 1 2266 0
+	ble	.L968
+	mov	x1, 0
+	mov	w2, 0
+.LVL989:
+	b	.L971
+	.p2align 3
+.L979:
+	cmp	w5, w1
+	ble	.L968
+.L971:
+	.loc 1 2268 0
+	ldr	x3, [x0, x1, lsl 3]
+	add	x1, x1, 1
+	.loc 1 2269 0
+	cmp	x3, 0
+	cinc	w2, w2, ne
+	.loc 1 2270 0
+	cmp	w4, w2, lsl 3
+	bge	.L979
+	.loc 1 2271 0
+	mov	w0, 0
+	ret
+.L968:
+	.loc 1 2254 0
+	stp	x29, x30, [sp, -16]!
+	.cfi_def_cfa_offset 16
+	.cfi_offset 29, -16
+	.cfi_offset 30, -8
+	.loc 1 2274 0
+	adrp	x0, .LC35
+	add	x0, x0, :lo12:.LC35
+	.loc 1 2254 0
+	add	x29, sp, 0
+	.cfi_def_cfa_register 29
+	.loc 1 2274 0
+	bl	printk
+.LVL990:
+	.loc 1 2276 0
+	mov	w0, 1
+	.loc 1 2277 0
+	ldp	x29, x30, [sp], 16
+	.cfi_restore 30
+	.cfi_restore 29
+	.cfi_def_cfa 31, 0
+	ret
+	.cfi_endproc
+.LFE2887:
+	.size	check_black_percent.isra.11, .-check_black_percent.isra.11
+	.align	2
+	.p2align 3,,7
+	.type	check_diff_percent.isra.12, %function
+check_diff_percent.isra.12:
+.LFB2888:
+	.loc 1 2302 0
+	.cfi_startproc
+	.loc 1 2313 0
+	mul	w8, w2, w3
+	mov	w4, 34079
+	movk	w4, 0x51eb, lsl 16
+	.loc 1 2314 0
+	cmp	w2, 0
+	add	w7, w2, 7
+	csel	w7, w7, w2, lt
+	.loc 1 2313 0
+	smull	x4, w8, w4
+	.loc 1 2314 0
+	asr	w7, w7, 3
+	cmp	w7, 0
+	.loc 1 2313 0
+	asr	x4, x4, 37
+	sub	w8, w4, w8, asr 31
+.LVL991:
+	.loc 1 2314 0
+	ble	.L985
+	mov	x2, 0
+	mov	w9, 0
+	mov	w4, 0
+.LVL992:
+	.p2align 2
+.L984:
+	.loc 1 2318 0
+	ldr	x6, [x0, x2, lsl 3]
+	ldr	x5, [x1, x2, lsl 3]
+	add	x2, x2, 1
+	cmp	x6, x5
+	beq	.L982
+	.loc 1 2320 0
+	add	w4, w4, 1
+	.loc 1 2319 0
+	mov	w9, 1
+.L982:
+	.loc 1 2322 0
+	cmp	w8, w4, lsl 3
+	blt	.L991
+	.loc 1 2314 0
+	cmp	w7, w2
+	bgt	.L984
+.L988:
+	.loc 1 2329 0
+	mov	w0, w9
+	ret
+.LVL993:
+.L985:
+	.loc 1 2306 0
+	mov	w9, 0
+	b	.L988
+.LVL994:
+.L991:
+	.loc 1 2302 0
+	stp	x29, x30, [sp, -16]!
+	.cfi_def_cfa_offset 16
+	.cfi_offset 29, -16
+	.cfi_offset 30, -8
+	mov	w1, w3
+	.loc 1 2323 0
+	adrp	x0, .LC36
+	add	x0, x0, :lo12:.LC36
+	.loc 1 2302 0
+	add	x29, sp, 0
+	.cfi_def_cfa_register 29
+	.loc 1 2323 0
+	bl	printk
+.LVL995:
+	.loc 1 2324 0
+	mov	w9, 2
+	.loc 1 2329 0
+	mov	w0, w9
+	ldp	x29, x30, [sp], 16
+	.cfi_restore 30
+	.cfi_restore 29
+	.cfi_def_cfa 31, 0
+	ret
+	.cfi_endproc
+.LFE2888:
+	.size	check_diff_percent.isra.12, .-check_diff_percent.isra.12
+	.align	2
+	.p2align 3,,7
+	.type	ebc_probe, %function
+ebc_probe:
+.LFB2870:
+	.loc 1 3637 0
+	.cfi_startproc
+.LVL996:
+	stp	x29, x30, [sp, -208]!
+	.cfi_def_cfa_offset 208
+	.cfi_offset 29, -208
+	.cfi_offset 30, -200
+.LBB1938:
+.LBB1939:
+	.loc 2 711 0
+	mov	w2, 32960
+	movk	w2, 0x60, lsl 16
+.LBE1939:
+.LBE1938:
+	.loc 1 3637 0
+	add	x29, sp, 0
+	.cfi_def_cfa_register 29
+	stp	x21, x22, [sp, 32]
+	.cfi_offset 21, -176
+	.cfi_offset 22, -168
+	.loc 1 3638 0
+	add	x22, x0, 16
+	.loc 1 3637 0
+	stp	x23, x24, [sp, 48]
+	.cfi_offset 23, -160
+	.cfi_offset 24, -152
+	adrp	x23, __stack_chk_guard
+	stp	x19, x20, [sp, 16]
+	add	x0, x23, :lo12:__stack_chk_guard
+.LVL997:
+	stp	x25, x26, [sp, 64]
+	stp	x27, x28, [sp, 80]
+	.cfi_offset 19, -192
+	.cfi_offset 20, -184
+	.cfi_offset 25, -144
+	.cfi_offset 26, -136
+	.cfi_offset 27, -128
+	.cfi_offset 28, -120
+	.loc 1 3637 0
+	ldr	x1, [x0]
+	str	x1, [x29, 200]
+	mov	x1,0
+.LBB1941:
+.LBB1940:
+	.loc 2 711 0
+	mov	x0, x22
+	mov	x1, 808
+	bl	devm_kmalloc
+.LVL998:
+.LBE1940:
+.LBE1941:
+	.loc 1 3653 0
+	cbz	x0, .L1054
+	.loc 1 3657 0
+	adrp	x24, .LANCHOR0
+	mov	x20, x0
+	.loc 1 3659 0
+	adrp	x1, .LC37
+	mov	w2, 0
+	.loc 1 3657 0
+	str	x0, [x24, #:lo12:.LANCHOR0]
+	.loc 1 3659 0
+	add	x1, x1, :lo12:.LC37
+	ldr	x0, [x22, 752]
+	.loc 1 3656 0
+	str	x22, [x20]
+	.loc 1 3659 0
+	bl	of_parse_phandle
+.LVL999:
+	.loc 1 3660 0
+	cbz	x0, .L1092
+	.loc 1 3665 0
+	bl	of_find_device_by_node
+.LVL1000:
+	.loc 1 3667 0
+	cbz	x0, .L996
+.LBB1942:
+.LBB1943:
+.LBB1944:
+	.loc 2 1181 0
+	ldr	x0, [x0, 200]
+.LVL1001:
+.LBE1944:
+.LBE1943:
+.LBE1942:
+	.loc 1 3670 0
+	str	x0, [x20, 8]
+	.loc 1 3671 0
+	cbz	x0, .L996
+	.loc 1 3673 0
+	adrp	x1, frame_done_callback
+	add	x1, x1, :lo12:frame_done_callback
+	str	x1, [x0, 104]
+	.loc 1 3675 0
+	add	x2, x29, 96
+	adrp	x1, .LC39
+	add	x1, x1, :lo12:.LC39
+	ldr	x0, [x22, 752]
+	bl	of_get_property
+.LVL1002:
+	mov	x21, x0
+.LVL1003:
+	.loc 1 3676 0
+	ldrsw	x0, [x29, 96]
+.LVL1004:
+	lsr	x0, x0, 2
+.LVL1005:
+	str	w0, [x29, 96]
+.LVL1006:
+	.loc 1 3677 0
+	cmp	w0, 0
+	beq	.L997
+	.loc 1 3682 0 discriminator 1
+	mov	w19, 0
+.LVL1007:
+	bgt	.L1078
+	b	.L999
+	.p2align 3
+.L1000:
+	.loc 1 3690 0
+	bl	of_find_i2c_device_by_node
+.LVL1008:
+	.loc 1 3692 0
+	cbz	x0, .L1093
+.LBB1945:
+.LBB1946:
+.LBB1947:
+	.loc 2 1181 0
+	ldr	x0, [x0, 216]
+.LVL1009:
+.LBE1947:
+.LBE1946:
+.LBE1945:
+	.loc 1 3697 0
+	str	x0, [x20, 16]
+	.loc 1 3698 0
+	cbnz	x0, .L1094
+	.loc 1 3682 0 discriminator 2
+	ldr	w0, [x29, 96]
+	add	w19, w19, 1
+.LVL1010:
+	cmp	w0, w19
+	ble	.L1004
+.L1078:
+	ldr	w0, [x21], 4
+	.loc 1 3684 0
+	rev	w0, w0
+	bl	of_find_node_by_phandle
+.LVL1011:
+	.loc 1 3685 0
+	cbnz	x0, .L1000
+	.loc 1 3686 0
+	adrp	x1, .LC41
+	mov	x0, x22
+	add	x1, x1, :lo12:.LC41
+	.loc 1 3687 0
+	mov	w25, -19
+	.loc 1 3686 0
+	bl	_dev_err
+.LVL1012:
+	.p2align 2
+.L992:
+	.loc 1 3762 0
+	add	x23, x23, :lo12:__stack_chk_guard
+	mov	w0, w25
+.LVL1013:
+	ldr	x2, [x29, 200]
+	ldr	x1, [x23]
+	eor	x1, x2, x1
+	cbnz	x1, .L1095
+	ldp	x19, x20, [sp, 16]
+.LVL1014:
+	ldp	x21, x22, [sp, 32]
+.LVL1015:
+	ldp	x23, x24, [sp, 48]
+.LVL1016:
+	ldp	x25, x26, [sp, 64]
+.LVL1017:
+	ldp	x27, x28, [sp, 80]
+.LVL1018:
+	ldp	x29, x30, [sp], 208
+	.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
+.LVL1019:
+	.p2align 3
+.L1094:
+	.cfi_restore_state
+	.loc 1 3699 0
+	adrp	x1, .LC43
+	mov	w2, w19
+	add	x1, x1, :lo12:.LC43
+	mov	x0, x22
+	bl	_dev_info
+.LVL1020:
+.L999:
+	.loc 1 3704 0
+	ldr	x0, [x20, 16]
+	cbz	x0, .L1004
+	.loc 1 3710 0
+	add	x19, x20, 192
+.LVL1021:
+	.loc 1 3712 0
+	add	x21, x20, 24
+.LVL1022:
+	.loc 1 3710 0
+	str	x22, [x19, 104]
+.LBB1948:
+.LBB1949:
+.LBB1950:
+.LBB1951:
+.LBB1952:
+	.file 13 "./include/linux/of.h"
+	.loc 13 499 0
+	adrp	x1, .LC45
+.LBE1952:
+.LBE1951:
+.LBE1950:
+.LBE1949:
+.LBE1948:
+	.loc 1 3712 0
+	str	x22, [x20, 24]
+.LBB2028:
+.LBB2025:
+.LBB1959:
+.LBB1956:
+.LBB1953:
+	.loc 13 499 0
+	mov	x4, 0
+.LBE1953:
+.LBE1956:
+.LBE1959:
+.LBE2025:
+.LBE2028:
+	.loc 1 3713 0
+	ldr	x2, [x20, 8]
+.LBB2029:
+.LBB2026:
+.LBB1960:
+.LBB1957:
+.LBB1954:
+	.loc 13 499 0
+	add	x1, x1, :lo12:.LC45
+.LBE1954:
+.LBE1957:
+.LBE1960:
+.LBE2026:
+.LBE2029:
+	.loc 1 3714 0
+	stp	x2, x0, [x21, 8]
+.LBB2030:
+.LBB2027:
+.LBB1961:
+.LBB1958:
+.LBB1955:
+	.loc 13 499 0
+	mov	x3, 1
+	ldr	x0, [x22, 752]
+	add	x2, x20, 100
+	bl	of_property_read_variable_u32_array
+.LVL1023:
+	.loc 13 501 0
+	tbnz	w0, #31, .L1006
+.LBE1955:
+.LBE1958:
+.LBE1961:
+.LBB1962:
+.LBB1963:
+.LBB1964:
+	.loc 13 499 0
+	ldr	x0, [x22, 752]
+	adrp	x1, .LC79
+	mov	x4, 0
+	mov	x3, 1
+	add	x2, x20, 104
+	add	x1, x1, :lo12:.LC79
+	bl	of_property_read_variable_u32_array
+.LVL1024:
+	.loc 13 501 0
+	tbnz	w0, #31, .L1006
+.LBE1964:
+.LBE1963:
+.LBE1962:
+.LBB1965:
+.LBB1966:
+.LBB1967:
+	.loc 13 499 0
+	ldr	x0, [x22, 752]
+	adrp	x1, .LC80
+	mov	x4, 0
+	mov	x3, 1
+	add	x2, x20, 108
+	add	x1, x1, :lo12:.LC80
+	bl	of_property_read_variable_u32_array
+.LVL1025:
+	.loc 13 501 0
+	tbnz	w0, #31, .L1006
+.LBE1967:
+.LBE1966:
+.LBE1965:
+.LBB1968:
+.LBB1969:
+.LBB1970:
+	.loc 13 499 0
+	ldr	x0, [x22, 752]
+	adrp	x1, .LC81
+	mov	x4, 0
+	mov	x3, 1
+	add	x2, x20, 112
+	add	x1, x1, :lo12:.LC81
+	bl	of_property_read_variable_u32_array
+.LVL1026:
+	.loc 13 501 0
+	tbnz	w0, #31, .L1006
+.LBE1970:
+.LBE1969:
+.LBE1968:
+.LBB1971:
+.LBB1972:
+.LBB1973:
+	.loc 13 499 0
+	ldr	x0, [x22, 752]
+	adrp	x1, .LC82
+	mov	x4, 0
+	mov	x3, 1
+	add	x2, x20, 128
+	add	x1, x1, :lo12:.LC82
+	bl	of_property_read_variable_u32_array
+.LVL1027:
+	.loc 13 501 0
+	tbnz	w0, #31, .L1006
+.LBE1973:
+.LBE1972:
+.LBE1971:
+.LBB1974:
+.LBB1975:
+.LBB1976:
+	.loc 13 499 0
+	ldr	x0, [x22, 752]
+	adrp	x1, .LC83
+	mov	x4, 0
+	mov	x3, 1
+	add	x2, x20, 132
+	add	x1, x1, :lo12:.LC83
+	bl	of_property_read_variable_u32_array
+.LVL1028:
+	.loc 13 501 0
+	tbnz	w0, #31, .L1006
+.LBE1976:
+.LBE1975:
+.LBE1974:
+.LBB1977:
+.LBB1978:
+.LBB1979:
+	.loc 13 499 0
+	ldr	x0, [x22, 752]
+	adrp	x1, .LC84
+	mov	x4, 0
+	mov	x3, 1
+	add	x2, x20, 136
+	add	x1, x1, :lo12:.LC84
+	bl	of_property_read_variable_u32_array
+.LVL1029:
+	.loc 13 501 0
+	tbnz	w0, #31, .L1006
+.LBE1979:
+.LBE1978:
+.LBE1977:
+.LBB1980:
+.LBB1981:
+.LBB1982:
+	.loc 13 499 0
+	ldr	x0, [x22, 752]
+	adrp	x1, .LC85
+	mov	x4, 0
+	mov	x3, 1
+	add	x2, x20, 140
+	add	x1, x1, :lo12:.LC85
+	bl	of_property_read_variable_u32_array
+.LVL1030:
+	.loc 13 501 0
+	tbnz	w0, #31, .L1006
+.LBE1982:
+.LBE1981:
+.LBE1980:
+.LBB1983:
+.LBB1984:
+.LBB1985:
+	.loc 13 499 0
+	ldr	x0, [x22, 752]
+	adrp	x1, .LC86
+	mov	x4, 0
+	mov	x3, 1
+	add	x2, x20, 144
+	add	x1, x1, :lo12:.LC86
+	bl	of_property_read_variable_u32_array
+.LVL1031:
+	.loc 13 501 0
+	tbnz	w0, #31, .L1006
+.LBE1985:
+.LBE1984:
+.LBE1983:
+.LBB1986:
+.LBB1987:
+.LBB1988:
+	.loc 13 499 0
+	ldr	x0, [x22, 752]
+	adrp	x1, .LC87
+	mov	x4, 0
+	mov	x3, 1
+	add	x2, x20, 148
+	add	x1, x1, :lo12:.LC87
+	bl	of_property_read_variable_u32_array
+.LVL1032:
+	.loc 13 501 0
+	tbnz	w0, #31, .L1006
+.LBE1988:
+.LBE1987:
+.LBE1986:
+.LBB1989:
+.LBB1990:
+.LBB1991:
+	.loc 13 499 0
+	ldr	x0, [x22, 752]
+	adrp	x1, .LC88
+	mov	x4, 0
+	mov	x3, 1
+	add	x2, x20, 152
+	add	x1, x1, :lo12:.LC88
+	bl	of_property_read_variable_u32_array
+.LVL1033:
+	.loc 13 501 0
+	tbnz	w0, #31, .L1006
+.LBE1991:
+.LBE1990:
+.LBE1989:
+.LBB1992:
+.LBB1993:
+.LBB1994:
+	.loc 13 499 0
+	ldr	x0, [x22, 752]
+	adrp	x1, .LC89
+	mov	x4, 0
+	mov	x3, 1
+	add	x2, x20, 156
+	add	x1, x1, :lo12:.LC89
+	bl	of_property_read_variable_u32_array
+.LVL1034:
+	.loc 13 501 0
+	tbnz	w0, #31, .L1006
+.LBE1994:
+.LBE1993:
+.LBE1992:
+.LBB1995:
+.LBB1996:
+.LBB1997:
+	.loc 13 499 0
+	ldr	x0, [x22, 752]
+	adrp	x1, .LC90
+	mov	x4, 0
+	mov	x3, 1
+	add	x2, x20, 160
+	add	x1, x1, :lo12:.LC90
+	bl	of_property_read_variable_u32_array
+.LVL1035:
+	.loc 13 501 0
+	tbnz	w0, #31, .L1006
+.LBE1997:
+.LBE1996:
+.LBE1995:
+.LBB1998:
+.LBB1999:
+.LBB2000:
+	.loc 13 499 0
+	ldr	x0, [x22, 752]
+	adrp	x1, .LC91
+	mov	x4, 0
+	mov	x3, 1
+	add	x2, x20, 164
+	add	x1, x1, :lo12:.LC91
+	bl	of_property_read_variable_u32_array
+.LVL1036:
+	.loc 13 501 0
+	tbnz	w0, #31, .L1006
+.LBE2000:
+.LBE1999:
+.LBE1998:
+.LBB2001:
+.LBB2002:
+.LBB2003:
+	.loc 13 499 0
+	ldr	x0, [x22, 752]
+	adrp	x1, .LC92
+	mov	x4, 0
+	mov	x3, 1
+	add	x2, x20, 168
+	add	x1, x1, :lo12:.LC92
+	bl	of_property_read_variable_u32_array
+.LVL1037:
+	.loc 13 501 0
+	tbnz	w0, #31, .L1006
+.LBE2003:
+.LBE2002:
+.LBE2001:
+.LBB2004:
+.LBB2005:
+.LBB2006:
+	.loc 13 499 0
+	ldr	x0, [x22, 752]
+	adrp	x1, .LC93
+	mov	x4, 0
+	mov	x3, 1
+	add	x2, x20, 172
+	add	x1, x1, :lo12:.LC93
+	bl	of_property_read_variable_u32_array
+.LVL1038:
+	.loc 13 501 0
+	tbz	w0, #31, .L1042
+.LBE2006:
+.LBE2005:
+.LBE2004:
+	.loc 1 2923 0
+	str	wzr, [x21, 148]
+.L1042:
+.LBB2007:
+.LBB2008:
+.LBB2009:
+	.loc 13 499 0
+	ldr	x0, [x22, 752]
+	adrp	x1, .LC46
+	mov	x4, 0
+	mov	x3, 1
+	add	x2, x20, 176
+	add	x1, x1, :lo12:.LC46
+	bl	of_property_read_variable_u32_array
+.LVL1039:
+	.loc 13 501 0
+	tbz	w0, #31, .L1043
+.LBE2009:
+.LBE2008:
+.LBE2007:
+	.loc 1 2926 0
+	str	wzr, [x21, 152]
+.L1043:
+.LBB2010:
+.LBB2011:
+.LBB2012:
+	.loc 13 499 0
+	ldr	x0, [x22, 752]
+	adrp	x1, .LC47
+	mov	x4, 0
+	mov	x3, 1
+	add	x2, x20, 180
+	add	x1, x1, :lo12:.LC47
+	bl	of_property_read_variable_u32_array
+.LVL1040:
+	.loc 13 501 0
+	tbz	w0, #31, .L1044
+.LBE2012:
+.LBE2011:
+.LBE2010:
+	.loc 1 2929 0
+	str	wzr, [x21, 156]
+.L1044:
+.LBB2013:
+.LBB2014:
+.LBB2015:
+	.loc 13 499 0
+	ldr	x0, [x22, 752]
+	adrp	x1, .LC48
+	mov	x4, 0
+	mov	x3, 1
+	add	x2, x20, 116
+	add	x1, x1, :lo12:.LC48
+	bl	of_property_read_variable_u32_array
+.LVL1041:
+	.loc 13 501 0
+	tbz	w0, #31, .L1045
+.LBE2015:
+.LBE2014:
+.LBE2013:
+	.loc 1 2932 0
+	str	wzr, [x21, 92]
+.L1045:
+.LBB2016:
+.LBB2017:
+.LBB2018:
+	.loc 13 499 0
+	ldr	x0, [x22, 752]
+	adrp	x1, .LC49
+	mov	x4, 0
+	mov	x3, 1
+	add	x2, x20, 120
+	add	x1, x1, :lo12:.LC49
+	bl	of_property_read_variable_u32_array
+.LVL1042:
+	.loc 13 501 0
+	tbz	w0, #31, .L1046
+.LBE2018:
+.LBE2017:
+.LBE2016:
+	.loc 1 2935 0
+	str	wzr, [x21, 96]
+.L1046:
+.LBB2019:
+.LBB2020:
+.LBB2021:
+	.loc 13 499 0
+	ldr	x0, [x22, 752]
+	adrp	x1, .LC50
+	mov	x4, 0
+	mov	x3, 1
+	add	x2, x20, 184
+	add	x1, x1, :lo12:.LC50
+	bl	of_property_read_variable_u32_array
+.LVL1043:
+	.loc 13 501 0
+	tbz	w0, #31, .L1047
+.LBE2021:
+.LBE2020:
+.LBE2019:
+	.loc 1 2938 0
+	str	wzr, [x21, 160]
+.L1047:
+.LBB2022:
+.LBB2023:
+.LBB2024:
+	.loc 13 499 0
+	ldr	x0, [x22, 752]
+	adrp	x1, .LC51
+	mov	x4, 0
+	mov	x3, 1
+	add	x2, x20, 188
+	add	x1, x1, :lo12:.LC51
+	bl	of_property_read_variable_u32_array
+.LVL1044:
+	.loc 13 501 0
+	tbz	w0, #31, .L1048
+.LBE2024:
+.LBE2023:
+.LBE2022:
+	.loc 1 2941 0
+	str	wzr, [x21, 164]
+.L1048:
+.LBE2027:
+.LBE2030:
+	.loc 1 3722 0
+	ldr	w0, [x21, 88]
+	str	w0, [x19, 92]
+	.loc 1 3723 0
+	ldr	w1, [x21, 84]
+	str	w1, [x19, 96]
+	.loc 1 3724 0
+	mul	w0, w0, w1
+	str	w0, [x19, 28]
+.LBB2031:
+.LBB2032:
+	.loc 1 3404 0
+	cmp	w0, 5242880
+.LBE2032:
+.LBE2031:
+	.loc 1 3725 0
+	lsr	w0, w0, 2
+	str	w0, [x19, 32]
+.LBB2044:
+.LBB2037:
+	.loc 1 3395 0
+	ldr	x26, [x20]
+.LVL1045:
+	.loc 1 3404 0
+	bgt	.L1096
+	.loc 1 3410 0
+	ldr	x0, [x26, 752]
+	adrp	x1, .LC53
+	mov	w2, 0
+	add	x1, x1, :lo12:.LC53
+	bl	of_parse_phandle
+.LVL1046:
+	.loc 1 3411 0
+	cbz	x0, .L1055
+	.loc 1 3414 0
+	add	x2, x29, 104
+	mov	w1, 0
+	bl	of_address_to_resource
+.LVL1047:
+	mov	w25, w0
+	.loc 1 3416 0
+	cbnz	w0, .L1097
+.LBB2033:
+.LBB2034:
+	.file 14 "./include/linux/ioport.h"
+	.loc 14 204 0
+	ldp	x1, x2, [x29, 104]
+.LBE2034:
+.LBE2033:
+	.loc 1 3421 0
+	str	x1, [x20, 192]
+	.loc 1 3423 0
+	mov	w0, 53477375
+.LBB2036:
+.LBB2035:
+	.loc 14 204 0
+	add	x2, x2, 1
+	sub	x2, x2, x1
+.LBE2035:
+.LBE2036:
+	.loc 1 3422 0
+	str	w2, [x19, 24]
+	.loc 1 3423 0
+	cmp	w2, w0
+	ble	.L1098
+	.loc 1 3427 0
+	sxtw	x2, w2
+	mov	x3, 1
+	mov	x0, x26
+	bl	devm_memremap
+.LVL1048:
+	str	x0, [x19, 8]
+	.loc 1 3429 0
+	cbz	x0, .L1099
+	.loc 1 3438 0
+	mov	x1, x0
+	ldr	w2, [x19, 24]
+	ldr	x0, [x20, 192]
+	mov	w4, 4
+	mov	w3, 5242880
+	bl	ebc_buf_init
+.LVL1049:
+	.loc 1 3439 0
+	cbnz	w0, .L1056
+	.loc 1 3442 0
+	ldr	x1, [x19, 8]
+	mov	x0, 20971520
+	.loc 1 3447 0
+	mov	x4, 2097152
+	.loc 1 3446 0
+	mov	x2, 26214400
+	.loc 1 3442 0
+	add	x0, x1, x0
+	str	x0, [x19, 16]
+	.loc 1 3447 0
+	str	x4, [x21, 40]
+	.loc 1 3446 0
+	add	x6, x1, x2
+	str	x6, [x21, 24]
+	mov	x5, 28311552
+	add	x3, x1, x5
+	.loc 1 3448 0
+	ldr	x0, [x20, 192]
+	add	x2, x0, x2
+	str	x2, [x21, 32]
+	.loc 1 3449 0
+	str	x6, [x19, 184]
+	.loc 1 3448 0
+	add	x0, x0, x5
+	.loc 1 3447 0
+	str	x4, [x21, 64]
+	.loc 1 3454 0
+	mov	x2, 35651584
+	.loc 1 3448 0
+	stp	x3, x0, [x21, 48]
+	.loc 1 3454 0
+	add	x2, x1, x2
+	.loc 1 3453 0
+	mov	x0, 30408704
+	add	x0, x1, x0
+	.loc 1 3454 0
+	stp	x0, x2, [x19, 152]
+	.loc 1 3457 0
+	mov	x0, 40894464
+	.loc 1 3461 0
+	mov	x2, 51380224
+	.loc 1 3457 0
+	add	x0, x1, x0
+	.loc 1 3461 0
+	add	x2, x1, x2
+	.loc 1 3449 0
+	str	x3, [x19, 192]
+	.loc 1 3461 0
+	str	x2, [x19, 128]
+	.loc 1 3462 0
+	mov	x2, 52428800
+	.loc 1 3457 0
+	str	x0, [x19, 168]
+	.loc 1 3458 0
+	mov	x0, 46137344
+	add	x0, x1, x0
+	.loc 1 3462 0
+	add	x1, x1, x2
+	.loc 1 3458 0
+	str	x0, [x19, 176]
+	.loc 1 3462 0
+	str	x1, [x19, 136]
+	.loc 1 3464 0
+	ldp	w2, w1, [x21, 84]
+	mul	w2, w2, w1
+	mov	w1, 0
+	bl	memset
+.LVL1050:
+	.loc 1 3465 0
+	ldp	w3, w2, [x21, 84]
+	mov	w1, 0
+	ldr	x0, [x19, 168]
+	mul	w2, w3, w2
+	bl	memset
+.LVL1051:
+.LBE2037:
+.LBE2044:
+.LBB2045:
+.LBB2046:
+	.loc 1 3352 0
+	ldr	x26, [x19, 104]
+.LVL1052:
+	.loc 1 3358 0
+	adrp	x1, .LC57
+	mov	w2, 0
+	add	x1, x1, :lo12:.LC57
+	ldr	x0, [x26, 752]
+	bl	of_parse_phandle
+.LVL1053:
+	.loc 1 3359 0
+	cbz	x0, .L1057
+	.loc 1 3362 0
+	add	x2, x29, 104
+	mov	w1, 0
+	bl	of_address_to_resource
+.LVL1054:
+	mov	w25, w0
+	.loc 1 3364 0
+	cbz	w0, .L1100
+.L1018:
+.LBE2046:
+.LBE2045:
+	.loc 1 3737 0
+	adrp	x1, .LC95
+	mov	x0, x22
+	add	x1, x1, :lo12:.LC95
+	bl	_dev_err
+.LVL1055:
+	.loc 1 3738 0
+	b	.L992
+.LVL1056:
+	.p2align 3
+.L1006:
+	.loc 1 3720 0
+	mov	w25, -22
+	.loc 1 3719 0
+	adrp	x1, .LC99
+	mov	w2, w25
+	add	x1, x1, :lo12:.LC99
+	mov	x0, x22
+	bl	_dev_err
+.LVL1057:
+	.loc 1 3720 0
+	b	.L992
+.LVL1058:
+	.p2align 3
+.L1093:
+	.loc 1 3693 0
+	adrp	x1, .LC42
+	mov	x0, x22
+.LVL1059:
+	add	x1, x1, :lo12:.LC42
+	.loc 1 3694 0
+	mov	w25, -19
+	.loc 1 3693 0
+	bl	_dev_err
+.LVL1060:
+	.loc 1 3694 0
+	b	.L992
+.LVL1061:
+	.p2align 3
+.L1004:
+	.loc 1 3705 0
+	adrp	x1, .LC44
+	mov	x0, x22
+	add	x1, x1, :lo12:.LC44
+	.loc 1 3706 0
+	mov	w25, -517
+	.loc 1 3705 0
+	bl	_dev_err
+.LVL1062:
+	.loc 1 3706 0
+	b	.L992
+.LVL1063:
+.L1100:
+.LBB2055:
+.LBB2051:
+	.loc 1 3373 0
+	mov	x0, x26
+	mov	x3, 1
+.LBB2047:
+.LBB2048:
+	.loc 14 204 0
+	ldp	x1, x26, [x29, 104]
+.LVL1064:
+.LBE2048:
+.LBE2047:
+	.loc 1 3370 0
+	str	x1, [x19, 40]
+.LBB2050:
+.LBB2049:
+	.loc 14 204 0
+	add	x26, x26, 1
+	sub	x26, x26, x1
+.LBE2049:
+.LBE2050:
+	.loc 1 3371 0
+	str	w26, [x19, 48]
+	.loc 1 3373 0
+	sxtw	x2, w26
+	bl	devm_memremap
+.LVL1065:
+	str	x0, [x19, 208]
+	.loc 1 3375 0
+	cbz	x0, .L1101
+	.loc 1 3380 0
+	bl	epd_lut_from_mem_init
+.LVL1066:
+	.loc 1 3381 0
+	tbnz	w0, #31, .L1102
+.L1020:
+.LBE2051:
+.LBE2055:
+.LBB2056:
+.LBB2057:
+	.loc 1 3474 0
+	add	x24, x24, :lo12:.LANCHOR0
+	.loc 1 3472 0
+	mov	w26, 99
+	.loc 1 3474 0
+	adrp	x3, .LC96
+	adrp	x0, ebc_auto_tast_function
+	add	x3, x3, :lo12:.LC96
+	add	x0, x0, :lo12:ebc_auto_tast_function
+	mov	w2, -1
+	mov	x1, x19
+	.loc 1 3472 0
+	str	w26, [x29, 104]
+	.loc 1 3474 0
+	bl	kthread_create_on_node
+.LVL1067:
+	str	x0, [x24, 8]
+	.loc 1 3475 0
+	cmn	x0, #4096
+	bhi	.L1103
+	.loc 1 3479 0
+	add	x2, x29, 104
+	mov	w1, 1
+	bl	sched_setscheduler_nocheck
+.LVL1068:
+	.loc 1 3480 0
+	ldr	x2, [x24, 8]
+.LBB2058:
+.LBB2059:
+	.file 15 "./arch/arm64/include/asm/atomic_lse.h"
+	.loc 15 47 0
+	mov	w0, 1
+.LVL1069:
+	add	x1, x2, 48
+.LVL1070:
+#APP
+// 47 "./arch/arm64/include/asm/atomic_lse.h" 1
+	.arch_extension lse
+.if 1 == 1
+661:
+	bl	__ll_sc_atomic_add
+
+662:
+.pushsection .altinstructions,"a"
+ .word 661b - .
+ .word 663f - .
+ .hword 5
+ .byte 662b-661b
+ .byte 664f-663f
+.popsection
+.pushsection .altinstr_replacement, "a"
+663:
+	.arch_extension lse
+	stadd	w0, [x1]
+
+664:
+	.popsection
+	.org	. - (664b-663b) + (662b-661b)
+	.org	. - (662b-661b) + (664b-663b)
+.endif
+
+// 0 "" 2
+.LVL1071:
+#NO_APP
+.LBE2059:
+.LBE2058:
+	.loc 1 3483 0
+	adrp	x3, .LC62
+	adrp	x0, ebc_auto_assist_tast_function
+.LVL1072:
+	add	x3, x3, :lo12:.LC62
+	add	x0, x0, :lo12:ebc_auto_assist_tast_function
+	mov	w2, -1
+	mov	x1, x19
+	bl	kthread_create_on_node
+.LVL1073:
+	str	x0, [x24, 16]
+	.loc 1 3484 0
+	cmn	x0, #4096
+	bhi	.L1104
+	.loc 1 3488 0
+	add	x2, x29, 104
+	mov	w1, 1
+	bl	sched_setscheduler_nocheck
+.LVL1074:
+	.loc 1 3489 0
+	ldr	x2, [x24, 16]
+.LBB2060:
+.LBB2061:
+	.loc 15 47 0
+	mov	w0, 1
+.LVL1075:
+	add	x1, x2, 48
+.LVL1076:
+#APP
+// 47 "./arch/arm64/include/asm/atomic_lse.h" 1
+	.arch_extension lse
+.if 1 == 1
+661:
+	bl	__ll_sc_atomic_add
+
+662:
+.pushsection .altinstructions,"a"
+ .word 661b - .
+ .word 663f - .
+ .hword 5
+ .byte 662b-661b
+ .byte 664f-663f
+.popsection
+.pushsection .altinstr_replacement, "a"
+663:
+	.arch_extension lse
+	stadd	w0, [x1]
+
+664:
+	.popsection
+	.org	. - (664b-663b) + (662b-661b)
+	.org	. - (662b-661b) + (664b-663b)
+.endif
+
+// 0 "" 2
+.LVL1077:
+#NO_APP
+.LBE2061:
+.LBE2060:
+	.loc 1 3490 0
+	ldr	x0, [x19, 104]
+.LVL1078:
+	adrp	x1, .LC64
+	add	x1, x1, :lo12:.LC64
+	bl	_dev_info
+.LVL1079:
+	.loc 1 3493 0
+	str	w26, [x29, 104]
+.LBB2062:
+	.loc 1 3494 0
+	adrp	x3, .LC65
+	adrp	x0, ebc_thread
+	add	x3, x3, :lo12:.LC65
+	add	x0, x0, :lo12:ebc_thread
+	mov	w2, -1
+	mov	x1, x19
+	bl	kthread_create_on_node
+.LVL1080:
+	mov	x26, x0
+.LVL1081:
+	cmn	x0, #4096
+	bhi	.L1023
+	bl	wake_up_process
+.LVL1082:
+.LBE2062:
+	str	x26, [x24, 24]
+	.loc 1 3499 0
+	add	x2, x29, 104
+	mov	x0, x26
+	mov	w1, 1
+	bl	sched_setscheduler_nocheck
+.LVL1083:
+	.loc 1 3500 0
+	ldr	x2, [x24, 24]
+.LBB2063:
+.LBB2064:
+	.loc 15 47 0
+	mov	w0, 1
+.LVL1084:
+	add	x1, x2, 48
+.LVL1085:
+#APP
+// 47 "./arch/arm64/include/asm/atomic_lse.h" 1
+	.arch_extension lse
+.if 1 == 1
+661:
+	bl	__ll_sc_atomic_add
+
+662:
+.pushsection .altinstructions,"a"
+ .word 661b - .
+ .word 663f - .
+ .hword 5
+ .byte 662b-661b
+ .byte 664f-663f
+.popsection
+.pushsection .altinstr_replacement, "a"
+663:
+	.arch_extension lse
+	stadd	w0, [x1]
+
+664:
+	.popsection
+	.org	. - (664b-663b) + (662b-661b)
+	.org	. - (662b-661b) + (664b-663b)
+.endif
+
+// 0 "" 2
+.LVL1086:
+#NO_APP
+.LBE2064:
+.LBE2063:
+.LBE2057:
+.LBE2056:
+.LBB2068:
+.LBB2069:
+	.loc 1 3509 0
+	mov	w1, -1
+	.loc 1 3510 0
+	stp	w1, wzr, [x19, 84]
+	.loc 1 3521 0
+	add	x1, x19, 512
+.LBB2070:
+.LBB2071:
+	.loc 11 39 0
+	add	x0, x20, 448
+.LVL1087:
+.LBE2071:
+.LBE2070:
+	.loc 1 3514 0
+	str	wzr, [x19, 52]
+	.loc 1 3516 0
+	mov	w27, 1
+	.loc 1 3515 0
+	str	wzr, [x19, 68]
+	.loc 1 3528 0
+	add	x24, x20, 664
+	.loc 1 3513 0
+	str	wzr, [x19, 100]
+	.loc 1 3529 0
+	adrp	x26, jiffies
+.LVL1088:
+	.loc 1 3508 0
+	str	wzr, [x19, 200]
+	.loc 1 3529 0
+	mov	x28, 268435455
+	.loc 1 3516 0
+	stp	wzr, w27, [x19, 248]
+	.loc 1 3511 0
+	str	wzr, [x19, 584]
+	.loc 1 3512 0
+	str	wzr, [x19, 588]
+	.loc 1 3521 0
+	stp	w27, w27, [x1, 88]
+	stp	w27, wzr, [x1, 96]
+.LBB2073:
+.LBB2072:
+	.loc 11 43 0
+	adrp	x1, .LC66
+	.loc 11 42 0
+	stp	xzr, xzr, [x0]
+	.loc 11 43 0
+	add	x1, x1, :lo12:.LC66
+	.loc 11 42 0
+	stp	xzr, xzr, [x0, 16]
+	stp	xzr, xzr, [x0, 32]
+	stp	xzr, xzr, [x0, 48]
+	stp	xzr, xzr, [x0, 64]
+	stp	xzr, xzr, [x0, 80]
+	stp	xzr, xzr, [x0, 96]
+	stp	xzr, xzr, [x0, 112]
+	stp	xzr, xzr, [x0, 128]
+	stp	xzr, xzr, [x0, 144]
+	stp	xzr, xzr, [x0, 160]
+	stp	xzr, xzr, [x0, 176]
+	stp	xzr, xzr, [x0, 192]
+	.loc 11 43 0
+	str	x1, [x20, 448]
+	.loc 11 45 0
+	bl	wakeup_source_add
+.LVL1089:
+.LBE2072:
+.LBE2073:
+	.loc 1 3525 0
+	str	wzr, [x19, 464]
+	.loc 1 3528 0
+	mov	x4, 0
+	mov	x3, 0
+	mov	w2, 0
+	mov	x0, x24
+	adrp	x1, ebc_frame_control_timeout
+	add	x1, x1, :lo12:ebc_frame_control_timeout
+	bl	init_timer_key
+.LVL1090:
+	.loc 1 3529 0
+	ldr	x1, [x26, #:lo12:jiffies]
+	mov	x0, x24
+	.loc 1 3532 0
+	add	x24, x20, 720
+	.loc 1 3529 0
+	add	x1, x1, x28
+	bl	mod_timer
+.LVL1091:
+	.loc 1 3532 0
+	mov	x4, 0
+	mov	x3, 0
+	mov	w2, 0
+	mov	x0, x24
+	adrp	x1, ebc_frame_timeout
+	add	x1, x1, :lo12:ebc_frame_timeout
+	bl	init_timer_key
+.LVL1092:
+	.loc 1 3533 0
+	ldr	x1, [x26, #:lo12:jiffies]
+	mov	x0, x24
+	add	x1, x1, x28
+	bl	mod_timer
+.LVL1093:
+.LBE2069:
+.LBE2068:
+.LBB2074:
+.LBB2075:
+	.loc 1 3555 0
+	adrp	x0, saved_command_line
+	adrp	x1, .LC67
+	.loc 1 3552 0
+	stp	wzr, wzr, [x29, 100]
+.LVL1094:
+	.loc 1 3555 0
+	add	x1, x1, :lo12:.LC67
+	ldr	x24, [x0, #:lo12:saved_command_line]
+	mov	x0, x24
+	bl	strstr
+.LVL1095:
+	.loc 1 3556 0
+	adrp	x1, .LC68
+	.loc 1 3555 0
+	mov	x26, x0
+.LVL1096:
+	.loc 1 3556 0
+	add	x1, x1, :lo12:.LC68
+	mov	x0, x24
+	bl	strstr
+.LVL1097:
+	mov	x24, x0
+.LVL1098:
+	.loc 1 3561 0
+	cbz	x26, .L1024
+	.loc 1 3562 0
+	add	x2, x29, 100
+	mov	x0, x26
+	adrp	x1, .LC69
+	add	x1, x1, :lo12:.LC69
+	bl	sscanf
+.LVL1099:
+	.loc 1 3563 0
+	ldr	w2, [x29, 100]
+	ldr	x0, [x20, 192]
+	cmp	x0, x2, uxtw
+	bls	.L1105
+.L1024:
+	.loc 1 3575 0
+	mov	w26, 0
+.LVL1100:
+	mov	x28, 0
+.LVL1101:
+	.loc 1 3559 0
+	mov	x27, 0
+.LVL1102:
+	.loc 1 3575 0
+	cbz	x24, .L1052
+.L1051:
+	.loc 1 3576 0
+	add	x2, x29, 104
+	mov	x0, x24
+	adrp	x1, .LC72
+	add	x1, x1, :lo12:.LC72
+	bl	sscanf
+.LVL1103:
+	.loc 1 3554 0
+	mov	w24, 0
+.LVL1104:
+	.loc 1 3577 0
+	ldr	w2, [x29, 104]
+	.loc 1 3559 0
+	mov	x27, 0
+	.loc 1 3577 0
+	ldr	x0, [x20, 192]
+	cmp	x0, x2, uxtw
+	bls	.L1106
+.L1028:
+	.loc 1 3589 0
+	cbnz	w26, .L1027
+.LVL1105:
+.L1052:
+	.loc 1 3590 0
+	ldr	x0, [x19, 104]
+	adrp	x1, .LC75
+	add	x1, x1, :lo12:.LC75
+	bl	_dev_info
+.LVL1106:
+	.loc 1 3591 0
+	ldr	x0, [x20, 16]
+	bl	ebc_pmic_verity_vcom
+.LVL1107:
+.LBB2076:
+.LBB2077:
+	.loc 1 2844 0
+	adrp	x0, .LC76
+	add	x0, x0, :lo12:.LC76
+	bl	ebc_empty_buf_get
+.LVL1108:
+	mov	x26, x0
+.LVL1109:
+	.loc 1 2845 0
+	ldp	w2, w0, [x20, 108]
+	mov	w1, 240
+	mul	w2, w2, w0
+	ldr	x0, [x26, 16]
+	bl	memset
+.LVL1110:
+	.loc 1 2848 0
+	stp	wzr, wzr, [x26, 48]
+	.loc 1 2846 0
+	mov	w0, 17
+	str	w0, [x26, 40]
+	.loc 1 2851 0
+	mov	w2, 1
+	.loc 1 2852 0
+	mov	x0, x26
+	.loc 1 2849 0
+	ldr	w1, [x20, 108]
+	str	w1, [x26, 56]
+	.loc 1 2850 0
+	ldr	w1, [x20, 112]
+	.loc 1 2851 0
+	stp	w1, w2, [x26, 60]
+	.loc 1 2852 0
+	bl	ebc_add_to_dsp_buf_list
+.LVL1111:
+.L1030:
+.LBE2077:
+.LBE2076:
+	.loc 1 3609 0
+	cbnz	w24, .L1107
+.L1035:
+	.loc 1 3623 0
+	ldr	w0, [x19, 100]
+	adrp	x21, .LANCHOR1
+	cbz	w0, .L1108
+.L1040:
+	.loc 1 3628 0
+	cbz	x28, .L1041
+	.loc 1 3629 0
+	mov	x0, x28
+	bl	kfree
+.LVL1112:
+.L1041:
+	.loc 1 3630 0
+	cbz	x27, .L1026
+	.loc 1 3631 0
+	mov	x0, x27
+	bl	kfree
+.LVL1113:
+.L1026:
+.LBE2075:
+.LBE2074:
+.LBB2095:
+.LBB2096:
+.LBB2097:
+	.loc 2 1186 0
+	str	x20, [x22, 184]
+.LBE2097:
+.LBE2096:
+.LBE2095:
+.LBB2098:
+.LBB2099:
+	.loc 1 3334 0
+	add	x21, x21, :lo12:.LANCHOR1
+	add	x0, x21, 224
+	bl	misc_register
+.LVL1114:
+	.loc 1 3335 0
+	add	x0, x21, 376
+	bl	misc_register
+.LVL1115:
+	.loc 1 3337 0
+	ldr	x0, [x20, 296]
+	add	x1, x21, 456
+	bl	device_create_file
+.LVL1116:
+	.loc 1 3338 0
+	ldr	x0, [x20, 296]
+	add	x1, x21, 488
+	bl	device_create_file
+.LVL1117:
+	.loc 1 3339 0
+	ldr	x0, [x20, 296]
+	add	x1, x21, 520
+	bl	device_create_file
+.LVL1118:
+	.loc 1 3340 0
+	ldr	x0, [x20, 296]
+	add	x1, x21, 552
+	bl	device_create_file
+.LVL1119:
+	.loc 1 3341 0
+	ldr	x0, [x20, 296]
+	add	x1, x21, 584
+	bl	device_create_file
+.LVL1120:
+	.loc 1 3342 0
+	ldr	x0, [x20, 296]
+	add	x1, x21, 616
+	bl	device_create_file
+.LVL1121:
+	.loc 1 3343 0
+	ldr	x0, [x20, 296]
+	add	x1, x21, 648
+	bl	device_create_file
+.LVL1122:
+	.loc 1 3344 0
+	ldr	x0, [x20, 296]
+	add	x1, x21, 680
+	bl	device_create_file
+.LVL1123:
+.LBE2099:
+.LBE2098:
+	.loc 1 3759 0
+	ldr	x0, [x19, 104]
+	adrp	x2, .LC26
+	adrp	x1, .LC78
+	add	x2, x2, :lo12:.LC26
+	add	x1, x1, :lo12:.LC78
+	bl	_dev_info
+.LVL1124:
+	.loc 1 3761 0
+	b	.L992
+.LVL1125:
+.L1097:
+.LBB2100:
+.LBB2038:
+	.loc 1 3417 0
+	adrp	x1, .LC54
+	mov	x0, x26
+	add	x1, x1, :lo12:.LC54
+	bl	_dev_err
+.LVL1126:
+.L1014:
+.LBE2038:
+.LBE2100:
+	.loc 1 3730 0
+	adrp	x1, .LC94
+	mov	x0, x22
+	add	x1, x1, :lo12:.LC94
+	bl	_dev_err
+.LVL1127:
+	.loc 1 3731 0
+	b	.L992
+.LVL1128:
+.L1108:
+.LBB2101:
+.LBB2092:
+	.loc 1 3624 0
+	mov	w2, 1
+	str	w2, [x19, 100]
+	.loc 1 3625 0
+	add	x0, x21, :lo12:.LANCHOR1
+	mov	w1, w2
+	add	x0, x0, 304
+	bl	__wake_up_sync
+.LVL1129:
+	b	.L1040
+.LVL1130:
+.L1105:
+	.loc 1 3565 0
+	ldr	x0, [x19, 104]
+	adrp	x1, .LC70
+	add	x1, x1, :lo12:.LC70
+	bl	_dev_info
+.LVL1131:
+	.loc 1 3566 0
+	ldp	w0, w1, [x21, 84]
+	mul	w0, w0, w1
+.LBB2078:
+.LBB2079:
+.LBB2080:
+	.file 16 "./include/linux/slab.h"
+	.loc 16 553 0
+	mov	w1, 32960
+	movk	w1, 0x60, lsl 16
+	lsr	w0, w0, 1
+	bl	__kmalloc
+.LVL1132:
+	mov	x28, x0
+.LVL1133:
+.LBE2080:
+.LBE2079:
+.LBE2078:
+	.loc 1 3567 0
+	cbz	x0, .L1109
+	.loc 1 3571 0
+	ldp	w2, w1, [x21, 84]
+	ldr	x3, [x20, 192]
+	mul	w2, w2, w1
+	ldr	w1, [x29, 100]
+.LVL1134:
+	sub	x1, x1, x3
+.LVL1135:
+	ldr	x3, [x19, 8]
+	lsr	w2, w2, 1
+	add	x1, x3, x1
+	bl	memcpy
+.LVL1136:
+	.loc 1 3575 0
+	cbnz	x24, .L1110
+	.loc 1 3554 0
+	mov	w24, 0
+.LVL1137:
+	.loc 1 3559 0
+	mov	x27, 0
+.LVL1138:
+.L1027:
+	.loc 1 3596 0
+	adrp	x0, .LC77
+	add	x0, x0, :lo12:.LC77
+	bl	ebc_empty_buf_get
+.LVL1139:
+	mov	x5, x0
+	.loc 1 3597 0
+	cbz	x0, .L1030
+	.loc 1 3598 0
+	ldp	w4, w0, [x21, 84]
+.LBB2081:
+.LBB2082:
+	.loc 1 3541 0
+	mov	x1, 0
+	ldr	x2, [x5, 16]
+.LVL1140:
+.LBE2082:
+.LBE2081:
+	.loc 1 3598 0
+	mul	w4, w4, w0
+	lsr	w4, w4, 1
+.LBB2084:
+.LBB2083:
+	.loc 1 3541 0
+	cbz	w4, .L1033
+	.p2align 2
+.L1077:
+	.loc 1 3542 0
+	ldrb	w0, [x28, x1]
+.LVL1141:
+	add	x1, x1, 1
+	.loc 1 3541 0
+	cmp	w4, w1
+	.loc 1 3544 0
+	and	w3, w0, -16
+	.loc 1 3543 0
+	lsl	w0, w0, 4
+.LVL1142:
+	strb	w0, [x2], 2
+	.loc 1 3544 0
+	strb	w3, [x2, -1]
+	.loc 1 3541 0
+	bgt	.L1077
+.L1033:
+.LBE2083:
+.LBE2084:
+	.loc 1 3601 0
+	stp	wzr, wzr, [x5, 48]
+	.loc 1 3599 0
+	mov	w0, 7
+	str	w0, [x5, 40]
+	.loc 1 3604 0
+	mov	w2, 1
+.LVL1143:
+	.loc 1 3605 0
+	mov	x0, x5
+	.loc 1 3602 0
+	ldr	w1, [x21, 84]
+	str	w1, [x5, 56]
+	.loc 1 3603 0
+	ldr	w1, [x21, 88]
+	.loc 1 3604 0
+	stp	w1, w2, [x5, 60]
+	.loc 1 3605 0
+	bl	ebc_add_to_dsp_buf_list
+.LVL1144:
+	b	.L1030
+.LVL1145:
+.L1106:
+	.loc 1 3579 0
+	ldr	x0, [x19, 104]
+	adrp	x1, .LC73
+	add	x1, x1, :lo12:.LC73
+	bl	_dev_info
+.LVL1146:
+	.loc 1 3580 0
+	ldp	w0, w1, [x21, 84]
+	mul	w0, w0, w1
+.LBB2085:
+.LBB2086:
+.LBB2087:
+	.loc 16 553 0
+	mov	w1, 32960
+	movk	w1, 0x60, lsl 16
+	lsr	w0, w0, 1
+	bl	__kmalloc
+.LVL1147:
+	mov	x27, x0
+.LBE2087:
+.LBE2086:
+.LBE2085:
+	.loc 1 3581 0
+	cbz	x0, .L1111
+	.loc 1 3585 0
+	ldp	w2, w1, [x21, 84]
+	.loc 1 3578 0
+	mov	w24, 1
+	.loc 1 3585 0
+	ldr	x3, [x20, 192]
+	mul	w2, w2, w1
+	ldr	w1, [x29, 104]
+.LVL1148:
+	sub	x1, x1, x3
+.LVL1149:
+	ldr	x3, [x19, 8]
+	lsr	w2, w2, 1
+	add	x1, x3, x1
+	bl	memcpy
+.LVL1150:
+	b	.L1028
+.LVL1151:
+.L996:
+.LBE2092:
+.LBE2101:
+	.loc 1 3668 0
+	mov	w25, -517
+	b	.L992
+.LVL1152:
+.L1107:
+.LBB2102:
+.LBB2093:
+	.loc 1 3610 0
+	adrp	x0, .LC77
+	add	x0, x0, :lo12:.LC77
+	bl	ebc_empty_buf_get
+.LVL1153:
+	.loc 1 3611 0
+	cbz	x0, .L1035
+	.loc 1 3612 0
+	ldp	w5, w1, [x21, 84]
+.LBB2088:
+.LBB2089:
+	.loc 1 3541 0
+	mov	x2, 0
+	ldr	x3, [x0, 16]
+.LVL1154:
+.LBE2089:
+.LBE2088:
+	.loc 1 3612 0
+	mul	w5, w5, w1
+	lsr	w5, w5, 1
+.LBB2091:
+.LBB2090:
+	.loc 1 3541 0
+	cbz	w5, .L1039
+	.p2align 2
+.L1076:
+	.loc 1 3542 0
+	ldrb	w1, [x27, x2]
+.LVL1155:
+	add	x2, x2, 1
+	.loc 1 3541 0
+	cmp	w5, w2
+	.loc 1 3544 0
+	and	w4, w1, -16
+	.loc 1 3543 0
+	lsl	w1, w1, 4
+.LVL1156:
+	strb	w1, [x3], 2
+	.loc 1 3544 0
+	strb	w4, [x3, -1]
+	.loc 1 3541 0
+	bgt	.L1076
+.L1039:
+.LBE2090:
+.LBE2091:
+	.loc 1 3613 0
+	mov	w1, 7
+	.loc 1 3615 0
+	stp	wzr, wzr, [x0, 48]
+	.loc 1 3613 0
+	str	w1, [x0, 40]
+	.loc 1 3618 0
+	mov	w2, 1
+	.loc 1 3616 0
+	ldr	w1, [x21, 84]
+	str	w1, [x0, 56]
+	.loc 1 3617 0
+	ldr	w1, [x21, 88]
+	.loc 1 3618 0
+	stp	w1, w2, [x0, 60]
+	.loc 1 3619 0
+	bl	ebc_add_to_dsp_buf_list
+.LVL1157:
+	b	.L1035
+.LVL1158:
+.L1054:
+.LBE2093:
+.LBE2102:
+	.loc 1 3654 0
+	mov	w25, -12
+	b	.L992
+.LVL1159:
+.L997:
+	.loc 1 3678 0
+	adrp	x1, .LC40
+	mov	x0, x22
+	add	x1, x1, :lo12:.LC40
+	.loc 1 3679 0
+	mov	w25, -22
+	.loc 1 3678 0
+	bl	_dev_err
+.LVL1160:
+	.loc 1 3679 0
+	b	.L992
+.LVL1161:
+.L1102:
+.LBB2103:
+.LBB2052:
+	.loc 1 3382 0
+	ldr	x0, [x19, 104]
+	adrp	x1, .LC59
+	add	x1, x1, :lo12:.LC59
+	bl	_dev_err
+.LVL1162:
+	.loc 1 3383 0
+	ldr	x0, [x19, 104]
+	mov	w2, w26
+	ldr	x1, [x19, 208]
+	bl	epd_lut_from_file_init
+.LVL1163:
+	.loc 1 3384 0
+	tbz	w0, #31, .L1020
+	.loc 1 3385 0
+	ldr	x0, [x19, 104]
+	adrp	x1, .LC60
+	.loc 1 3386 0
+	mov	w25, -1
+	.loc 1 3385 0
+	add	x1, x1, :lo12:.LC60
+	bl	_dev_err
+.LVL1164:
+	b	.L1018
+.LVL1165:
+	.p2align 3
+.L1096:
+.LBE2052:
+.LBE2103:
+.LBB2104:
+.LBB2039:
+	.loc 1 3405 0
+	adrp	x1, .LC52
+	mov	x0, x26
+	add	x1, x1, :lo12:.LC52
+	.loc 1 3406 0
+	mov	w25, -19
+	.loc 1 3405 0
+	bl	_dev_err
+.LVL1166:
+	b	.L1014
+.LVL1167:
+.L1103:
+.LBE2039:
+.LBE2104:
+.LBB2105:
+.LBB2065:
+	.loc 1 3476 0
+	ldr	x0, [x19, 104]
+	adrp	x1, .LC61
+	add	x1, x1, :lo12:.LC61
+	bl	_dev_err
+.LVL1168:
+.L1021:
+.LBE2065:
+.LBE2105:
+	.loc 1 3744 0
+	adrp	x1, .LC98
+	mov	x0, x22
+	add	x1, x1, :lo12:.LC98
+	.loc 1 3745 0
+	mov	w25, -1
+	.loc 1 3744 0
+	bl	_dev_err
+.LVL1169:
+	.loc 1 3745 0
+	b	.L992
+.LVL1170:
+.L1104:
+.LBB2106:
+.LBB2066:
+	.loc 1 3485 0
+	ldr	x0, [x19, 104]
+	adrp	x1, .LC63
+	add	x1, x1, :lo12:.LC63
+	bl	_dev_err
+.LVL1171:
+	b	.L1021
+.LVL1172:
+.L1056:
+.LBE2066:
+.LBE2106:
+.LBB2107:
+.LBB2040:
+	.loc 1 3440 0
+	mov	w25, -12
+	b	.L1014
+.LVL1173:
+.L1023:
+.LBE2040:
+.LBE2107:
+.LBB2108:
+.LBB2067:
+	.loc 1 3496 0
+	ldr	x0, [x19, 104]
+.LVL1174:
+	adrp	x1, .LC97
+	.loc 1 3494 0
+	str	x26, [x24, 24]
+	.loc 1 3496 0
+	add	x1, x1, :lo12:.LC97
+	bl	_dev_err
+.LVL1175:
+	b	.L1021
+.LVL1176:
+.L1098:
+.LBE2067:
+.LBE2108:
+.LBB2109:
+.LBB2041:
+	.loc 1 3424 0
+	adrp	x1, .LC55
+	mov	w2, 53477376
+	add	x1, x1, :lo12:.LC55
+	mov	x0, x26
+	.loc 1 3425 0
+	mov	w25, -19
+	.loc 1 3424 0
+	bl	_dev_err
+.LVL1177:
+	b	.L1014
+.LVL1178:
+.L1092:
+.LBE2041:
+.LBE2109:
+	.loc 1 3661 0
+	adrp	x1, .LC38
+	mov	x0, x22
+	add	x1, x1, :lo12:.LC38
+	.loc 1 3662 0
+	mov	w25, -19
+	.loc 1 3661 0
+	bl	_dev_err
+.LVL1179:
+	.loc 1 3662 0
+	b	.L992
+.LVL1180:
+.L1055:
+.LBB2110:
+.LBB2042:
+	.loc 1 3412 0
+	mov	w25, -19
+	b	.L1014
+.LVL1181:
+.L1057:
+.LBE2042:
+.LBE2110:
+.LBB2111:
+.LBB2053:
+	.loc 1 3360 0
+	mov	w25, -19
+	b	.L1018
+.LVL1182:
+.L1099:
+.LBE2053:
+.LBE2111:
+.LBB2112:
+.LBB2043:
+	.loc 1 3430 0
+	adrp	x1, .LC56
+	mov	x0, x26
+	add	x1, x1, :lo12:.LC56
+	.loc 1 3431 0
+	mov	w25, -12
+	.loc 1 3430 0
+	bl	_dev_err
+.LVL1183:
+	b	.L1014
+.LVL1184:
+.L1095:
+.LBE2043:
+.LBE2112:
+	.loc 1 3762 0
+	bl	__stack_chk_fail
+.LVL1185:
+.L1110:
+.LBB2113:
+.LBB2094:
+	.loc 1 3564 0
+	mov	w26, w27
+.LVL1186:
+	b	.L1051
+.LVL1187:
+.L1109:
+	.loc 1 3568 0
+	ldr	x0, [x19, 104]
+.LVL1188:
+	adrp	x1, .LC71
+	adrp	x21, .LANCHOR1
+	add	x1, x1, :lo12:.LC71
+	bl	_dev_err
+.LVL1189:
+	b	.L1026
+.LVL1190:
+.L1111:
+	.loc 1 3582 0
+	ldr	x0, [x19, 104]
+.LVL1191:
+	adrp	x1, .LC74
+	adrp	x21, .LANCHOR1
+	add	x1, x1, :lo12:.LC74
+	bl	_dev_err
+.LVL1192:
+	b	.L1026
+.LVL1193:
+.L1101:
+.LBE2094:
+.LBE2113:
+.LBB2114:
+.LBB2054:
+	.loc 1 3376 0
+	ldr	x0, [x19, 104]
+	adrp	x2, .LANCHOR3
+	add	x2, x2, :lo12:.LANCHOR3
+	adrp	x1, .LC58
+	mov	w3, 3376
+	add	x2, x2, 32
+	add	x1, x1, :lo12:.LC58
+	.loc 1 3377 0
+	mov	w25, -12
+	.loc 1 3376 0
+	bl	_dev_err
+.LVL1194:
+	b	.L1018
+.LBE2054:
+.LBE2114:
+	.cfi_endproc
+.LFE2870:
+	.size	ebc_probe, .-ebc_probe
+	.align	2
+	.p2align 3,,7
+	.type	auto_frame_state_read, %function
+auto_frame_state_read:
+.LFB2862:
+	.loc 1 3316 0
+	.cfi_startproc
+.LVL1195:
+	.loc 1 3317 0
+	adrp	x0, .LANCHOR0
+.LVL1196:
+	ldr	x1, [x0, #:lo12:.LANCHOR0]
+.LVL1197:
+	.loc 1 3321 0
+	ldp	w0, w4, [x1, 108]
+	mul	w4, w4, w0
+	cbz	w4, .L1113
+	.loc 1 3322 0
+	ldr	x5, [x1, 360]
+	mov	w1, 0
+.LVL1198:
+	ldrb	w3, [x5]
+	cbz	w3, .L1116
+	b	.L1114
+	.p2align 3
+.L1118:
+	ldrb	w3, [x5, w1, sxtw]
+	cbnz	w3, .L1114
+.L1116:
+	.loc 1 3321 0 discriminator 2
+	add	w1, w1, 1
+	cmp	w1, w4
+	bne	.L1118
+.L1113:
+.LBB2117:
+.LBB2118:
+	.loc 1 3327 0
+	adrp	x1, .LC100
+.LVL1199:
+	add	x1, x1, :lo12:.LC100
+	mov	x0, 2
+	ldrh	w3, [x1]
+	ldrb	w1, [x1, 2]
+	strh	w3, [x2]
+	strb	w1, [x2, 2]
+	ret
+.LVL1200:
+	.p2align 3
+.L1114:
+.LBE2118:
+.LBE2117:
+	.loc 1 3316 0
+	stp	x29, x30, [sp, -16]!
+	.cfi_def_cfa_offset 16
+	.cfi_offset 29, -16
+	.cfi_offset 30, -8
+	mov	x0, x2
+	.loc 1 3323 0
+	adrp	x1, .LC25
+.LVL1201:
+	mov	w2, w3
+.LVL1202:
+	.loc 1 3316 0
+	add	x29, sp, 0
+	.cfi_def_cfa_register 29
+	.loc 1 3323 0
+	add	x1, x1, :lo12:.LC25
+	.loc 1 3316 0
+	.loc 1 3323 0
+	bl	sprintf
+.LVL1203:
+	sxtw	x0, w0
+	.loc 1 3328 0
+	ldp	x29, x30, [sp], 16
+	.cfi_restore 30
+	.cfi_restore 29
+	.cfi_def_cfa 31, 0
+	ret
+	.cfi_endproc
+.LFE2862:
+	.size	auto_frame_state_read, .-auto_frame_state_read
+	.align	2
+	.p2align 3,,7
+	.type	ebc_power_set.constprop.15, %function
+ebc_power_set.constprop.15:
+.LFB2893:
+	.loc 1 390 0
+	.cfi_startproc
+.LVL1204:
+	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 396 0
+	add	x20, x0, 192
+	.loc 1 390 0
+	mov	x19, x0
+	.loc 1 396 0
+	ldr	w0, [x20, 464]
+.LVL1205:
+	cbz	w0, .L1131
+.L1129:
+	.loc 1 400 0
+	mov	w1, 1
+	str	w1, [x20, 200]
+	.loc 1 401 0
+	ldr	x2, [x19, 16]
+.LBB2119:
+.LBB2120:
+	.loc 3 30 0
+	mov	x0, x2
+	ldr	x2, [x2, 32]
+	blr	x2
+.LVL1206:
+.LBE2120:
+.LBE2119:
+	.loc 1 402 0
+	ldr	x2, [x19, 8]
+.LBB2121:
+.LBB2122:
+	.loc 10 45 0
+	add	x1, x19, 24
+	mov	x0, x2
+	ldr	x2, [x2, 48]
+	blr	x2
+.LVL1207:
+.LBE2122:
+.LBE2121:
+	.loc 1 403 0
+	ldr	x0, [x19]
+	adrp	x1, .LC101
+	add	x1, x1, :lo12:.LC101
+	bl	_dev_info
+.LVL1208:
+	.loc 1 418 0
+	mov	w0, 0
+	ldp	x19, x20, [sp, 16]
+.LVL1209:
+	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
+.LVL1210:
+	.p2align 3
+.L1131:
+	.cfi_restore_state
+	.loc 1 397 0
+	mov	w0, 1
+	str	w0, [x20, 464]
+.LBB2123:
+.LBB2124:
+	.loc 11 58 0
+	add	x0, x19, 448
+	bl	__pm_stay_awake
+.LVL1211:
+	b	.L1129
+.LBE2124:
+.LBE2123:
+	.cfi_endproc
+.LFE2893:
+	.size	ebc_power_set.constprop.15, .-ebc_power_set.constprop.15
+	.align	2
+	.p2align 3,,7
+	.type	ebc_open, %function
+ebc_open:
+.LFB2892:
+	.cfi_startproc
+	mov	w0, 0
+	str	xzr, [x1, 104]
+	ret
+	.cfi_endproc
+.LFE2892:
+	.size	ebc_open, .-ebc_open
+	.align	2
+	.p2align 3,,7
+	.global	refresh_new_image
+	.type	refresh_new_image, %function
+refresh_new_image:
+.LFB2818:
+	.loc 1 486 0
+	.cfi_startproc
+.LVL1212:
+	.loc 1 486 0
+	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]
+	stp	x21, x22, [sp, 32]
+	stp	x23, x24, [sp, 48]
+	str	x25, [sp, 64]
+	.cfi_offset 19, -64
+	.cfi_offset 20, -56
+	.cfi_offset 21, -48
+	.cfi_offset 22, -40
+	.cfi_offset 23, -32
+	.cfi_offset 24, -24
+	.cfi_offset 25, -16
+	.loc 1 494 0
+	ldp	w19, w6, [x5, 92]
+	cmp	w6, 0
+	add	w12, w6, 7
+	csel	w12, w12, w6, lt
+.LVL1213:
+	.loc 1 496 0
+	cmp	w19, 0
+	ble	.L1133
+	asr	w12, w12, 3
+.LVL1214:
+	mov	w30, 0
+.LVL1215:
+	sub	w18, w12, #1
+.LBB2125:
+	.loc 1 510 0
+	mov	x17, 4026531840
+	add	x18, x18, 1
+.LBE2125:
+.LBB2126:
+	.loc 1 511 0
+	mov	x16, 1030792151040
+	lsl	x18, x18, 3
+.LBE2126:
+.LBB2127:
+	.loc 1 512 0
+	mov	x15, 263882790666240
+.LBE2127:
+.LBB2128:
+	.loc 1 513 0
+	mov	x14, 67553994410557440
+.LBE2128:
+.LBB2129:
+	.loc 1 514 0
+	mov	x13, -1152921504606846976
+	mov	x24, -2305843009213693952
+.LBE2129:
+.LBB2130:
+	.loc 1 513 0
+	mov	x23, 63050394783186944
+.LBE2130:
+.LBB2131:
+	.loc 1 512 0
+	mov	x22, 246290604621824
+.LBE2131:
+.LBB2132:
+	.loc 1 511 0
+	mov	x21, 962072674304
+.LBE2132:
+.LBB2133:
+	.loc 1 510 0
+	mov	x20, 3758096384
+.LVL1216:
+	.p2align 2
+.L1135:
+.LBE2133:
+	.loc 1 497 0 discriminator 1
+	mov	x8, 0
+	cmp	w12, 0
+	ble	.L1200
+	.p2align 2
+.L1205:
+	.loc 1 498 0
+	ldr	x11, [x3, x8, lsl 3]
+	.loc 1 499 0
+	ldr	x7, [x4, x8, lsl 3]
+.LVL1217:
+	.loc 1 500 0
+	ldr	x6, [x1, x8, lsl 3]
+.LVL1218:
+	.loc 1 501 0
+	ldr	x9, [x0, x8, lsl 3]
+	.loc 1 502 0
+	ldr	x10, [x2, x8, lsl 3]
+	.loc 1 505 0
+	cbnz	x11, .L1136
+.LBB2134:
+	.loc 1 507 0
+	and	x5, x6, 240
+.LVL1219:
+	cmp	x5, 240
+	bne	.L1211
+	mov	x5, 255
+.L1137:
+.LBE2134:
+.LBB2135:
+	.loc 1 508 0
+	and	x7, x6, 61440
+.LVL1220:
+	cmp	x7, 61440
+	bne	.L1140
+	.loc 1 508 0 is_stmt 0 discriminator 1
+	orr	x5, x5, 65280
+.L1141:
+.LBE2135:
+.LBB2136:
+	.loc 1 509 0 is_stmt 1
+	and	x7, x6, 15728640
+.LVL1221:
+	cmp	x7, 15728640
+	bne	.L1144
+	.loc 1 509 0 is_stmt 0 discriminator 1
+	orr	x5, x5, 16711680
+.L1145:
+.LBE2136:
+.LBB2137:
+	.loc 1 510 0 is_stmt 1
+	and	x7, x6, 4026531840
+.LVL1222:
+	cmp	x7, x17
+	bne	.L1148
+	.loc 1 510 0 is_stmt 0 discriminator 1
+	orr	x5, x5, 4278190080
+.L1149:
+.LBE2137:
+.LBB2138:
+	.loc 1 511 0 is_stmt 1
+	and	x7, x6, 1030792151040
+.LVL1223:
+	cmp	x7, x16
+	bne	.L1152
+.L1214:
+	.loc 1 511 0 is_stmt 0 discriminator 1
+	orr	x5, x5, 1095216660480
+.L1153:
+.LBE2138:
+.LBB2139:
+	.loc 1 512 0 is_stmt 1
+	and	x7, x6, 263882790666240
+.LVL1224:
+	cmp	x7, x15
+	bne	.L1156
+.L1215:
+	.loc 1 512 0 is_stmt 0 discriminator 1
+	orr	x5, x5, 280375465082880
+.L1157:
+.LBE2139:
+.LBB2140:
+	.loc 1 513 0 is_stmt 1
+	and	x7, x6, 67553994410557440
+.LVL1225:
+	cmp	x7, x14
+	bne	.L1160
+.L1216:
+	.loc 1 513 0 is_stmt 0 discriminator 1
+	orr	x5, x5, 71776119061217280
+.L1161:
+.LBE2140:
+.LBB2141:
+	.loc 1 514 0 is_stmt 1
+	and	x7, x6, -1152921504606846976
+.LVL1226:
+	cmp	x7, x13
+	bne	.L1212
+.LVL1227:
+.L1208:
+.LBE2141:
+.LBB2142:
+	.loc 1 523 0 discriminator 2
+	orr	x5, x5, -72057594037927936
+.L1165:
+	eor	x6, x9, x10
+.LVL1228:
+.LBE2142:
+	.loc 1 528 0 discriminator 2
+	str	x11, [x4, x8, lsl 3]
+	and	x5, x6, x5
+.LVL1229:
+	.loc 1 527 0 discriminator 2
+	eor	x5, x9, x5
+	.loc 1 529 0 discriminator 2
+	str	x5, [x0, x8, lsl 3]
+	add	x8, x8, 1
+	.loc 1 497 0 discriminator 2
+	cmp	w12, w8
+	bgt	.L1205
+	add	x3, x3, x18
+	add	x1, x1, x18
+	add	x2, x2, x18
+	add	x4, x4, x18
+	add	x0, x0, x18
+.LVL1230:
+.L1200:
+	.loc 1 496 0 discriminator 2
+	add	w30, w30, 1
+	cmp	w19, w30
+	bne	.L1135
+.L1133:
+	.loc 1 532 0
+	ldp	x19, x20, [sp, 16]
+.LVL1231:
+	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
+.LVL1232:
+	ret
+.LVL1233:
+	.p2align 3
+.L1212:
+	.cfi_restore_state
+.LBB2143:
+	.loc 1 514 0 discriminator 2
+	cbz	x7, .L1209
+	.loc 1 514 0 is_stmt 0 discriminator 4
+	and	x9, x9, 72057594037927935
+	cmp	x7, x24
+	beq	.L1210
+	.loc 1 514 0 discriminator 6
+	orr	x9, x7, x9
+	b	.L1165
+.LVL1234:
+	.p2align 3
+.L1136:
+.LBE2143:
+	.loc 1 516 0 is_stmt 1
+	and	x25, x11, 255
+	.loc 1 503 0
+	mov	x5, 0
+.LVL1235:
+	.loc 1 516 0
+	cbnz	x25, .L1168
+.LBB2144:
+	.loc 1 516 0 is_stmt 0 discriminator 1
+	and	x5, x6, 240
+.LBE2144:
+	and	x7, x7, -256
+.LBB2145:
+	cmp	x5, 240
+	bne	.L1213
+	.loc 1 516 0
+	mov	x5, 255
+.L1168:
+.LBE2145:
+	.loc 1 517 0 is_stmt 1
+	tst	x11, 65280
+	bne	.L1171
+.LBB2146:
+	.loc 1 517 0 is_stmt 0 discriminator 1
+	and	x25, x6, 61440
+.LVL1236:
+.LBE2146:
+	and	x7, x7, -65281
+.LBB2147:
+	cmp	x25, 61440
+	bne	.L1172
+	.loc 1 517 0 discriminator 2
+	orr	x5, x5, 65280
+.L1171:
+.LBE2147:
+	.loc 1 518 0 is_stmt 1
+	tst	x11, 16711680
+	bne	.L1175
+.LBB2148:
+	.loc 1 518 0 is_stmt 0 discriminator 1
+	and	x25, x6, 15728640
+.LVL1237:
+.LBE2148:
+	and	x7, x7, -16711681
+.LBB2149:
+	cmp	x25, 15728640
+	bne	.L1176
+	.loc 1 518 0 discriminator 2
+	orr	x5, x5, 16711680
+.LVL1238:
+.L1175:
+.LBE2149:
+	.loc 1 519 0 is_stmt 1
+	tst	x11, 4278190080
+	bne	.L1179
+.LBB2150:
+	.loc 1 519 0 is_stmt 0 discriminator 1
+	and	x25, x6, 4026531840
+.LVL1239:
+.LBE2150:
+	and	x7, x7, -4278190081
+.LBB2151:
+	cmp	x25, x17
+	bne	.L1180
+	.loc 1 519 0 discriminator 2
+	orr	x5, x5, 4278190080
+.LVL1240:
+.L1179:
+.LBE2151:
+	.loc 1 520 0 is_stmt 1
+	tst	x11, 1095216660480
+	bne	.L1183
+.LBB2152:
+	.loc 1 520 0 is_stmt 0 discriminator 1
+	and	x25, x6, 1030792151040
+.LVL1241:
+.LBE2152:
+	and	x7, x7, -1095216660481
+.LBB2153:
+	cmp	x25, x16
+	bne	.L1184
+	.loc 1 520 0 discriminator 2
+	orr	x5, x5, 1095216660480
+.LVL1242:
+.L1183:
+.LBE2153:
+	.loc 1 521 0 is_stmt 1
+	tst	x11, 280375465082880
+	bne	.L1187
+.LBB2154:
+	.loc 1 521 0 is_stmt 0 discriminator 1
+	and	x25, x6, 263882790666240
+.LVL1243:
+.LBE2154:
+	and	x7, x7, -280375465082881
+.LBB2155:
+	cmp	x25, x15
+	bne	.L1188
+	.loc 1 521 0 discriminator 2
+	orr	x5, x5, 280375465082880
+.LVL1244:
+.L1187:
+.LBE2155:
+	.loc 1 522 0 is_stmt 1
+	tst	x11, 71776119061217280
+	bne	.L1191
+.LBB2156:
+	.loc 1 522 0 is_stmt 0 discriminator 1
+	and	x25, x6, 67553994410557440
+.LVL1245:
+.LBE2156:
+	and	x7, x7, -71776119061217281
+.LBB2157:
+	cmp	x25, x14
+	bne	.L1192
+	.loc 1 522 0 discriminator 2
+	orr	x5, x5, 71776119061217280
+.LVL1246:
+.L1191:
+.LBE2157:
+	.loc 1 523 0 is_stmt 1
+	and	x25, x11, -72057594037927936
+.LVL1247:
+.LBB2158:
+	mov	x11, x7
+.LBE2158:
+	cbnz	x25, .L1165
+.LBB2159:
+	.loc 1 523 0 is_stmt 0 discriminator 1
+	and	x6, x6, -1152921504606846976
+.LVL1248:
+.LBE2159:
+	and	x11, x7, 72057594037927935
+.LVL1249:
+.LBB2160:
+	cmp	x6, x13
+	beq	.L1208
+	.loc 1 523 0 discriminator 3
+	cbz	x6, .L1209
+	.loc 1 523 0 discriminator 5
+	and	x9, x9, 72057594037927935
+	cmp	x6, x24
+	beq	.L1210
+	.loc 1 523 0 discriminator 7
+	orr	x9, x6, x9
+	b	.L1165
+.LVL1250:
+	.p2align 3
+.L1209:
+	.loc 1 523 0 discriminator 4
+	and	x9, x9, 72057594037927935
+	orr	x11, x11, 72057594037927936
+	b	.L1165
+.LVL1251:
+	.p2align 3
+.L1148:
+.LBE2160:
+.LBB2161:
+	.loc 1 510 0 is_stmt 1 discriminator 2
+	and	x9, x9, -4278190081
+	cbnz	x7, .L1150
+.LBE2161:
+.LBB2162:
+	.loc 1 511 0 discriminator 3
+	and	x7, x6, 1030792151040
+.LVL1252:
+.LBE2162:
+.LBB2163:
+	.loc 1 510 0 discriminator 3
+	orr	x11, x11, 16777216
+.LBE2163:
+.LBB2164:
+	.loc 1 511 0 discriminator 3
+	cmp	x7, x16
+	beq	.L1214
+	.p2align 2
+.L1152:
+	.loc 1 511 0 is_stmt 0 discriminator 2
+	and	x9, x9, -1095216660481
+	cbnz	x7, .L1154
+.LBE2164:
+.LBB2165:
+	.loc 1 512 0 is_stmt 1 discriminator 3
+	and	x7, x6, 263882790666240
+.LVL1253:
+.LBE2165:
+.LBB2166:
+	.loc 1 511 0 discriminator 3
+	orr	x11, x11, 4294967296
+.LBE2166:
+.LBB2167:
+	.loc 1 512 0 discriminator 3
+	cmp	x7, x15
+	beq	.L1215
+	.p2align 2
+.L1156:
+	.loc 1 512 0 is_stmt 0 discriminator 2
+	and	x9, x9, -280375465082881
+	cbnz	x7, .L1158
+.LBE2167:
+.LBB2168:
+	.loc 1 513 0 is_stmt 1 discriminator 3
+	and	x7, x6, 67553994410557440
+.LVL1254:
+.LBE2168:
+.LBB2169:
+	.loc 1 512 0 discriminator 3
+	orr	x11, x11, 1099511627776
+.LBE2169:
+.LBB2170:
+	.loc 1 513 0 discriminator 3
+	cmp	x7, x14
+	beq	.L1216
+	.p2align 2
+.L1160:
+	.loc 1 513 0 is_stmt 0 discriminator 2
+	and	x9, x9, -71776119061217281
+	cbnz	x7, .L1162
+	.loc 1 513 0 discriminator 3
+	orr	x11, x11, 281474976710656
+	b	.L1161
+.LVL1255:
+	.p2align 3
+.L1144:
+.LBE2170:
+.LBB2171:
+	.loc 1 509 0 is_stmt 1 discriminator 2
+	and	x9, x9, -16711681
+	cbnz	x7, .L1146
+	.loc 1 509 0 is_stmt 0 discriminator 3
+	orr	x11, x11, 65536
+	b	.L1145
+.LVL1256:
+	.p2align 3
+.L1140:
+.LBE2171:
+.LBB2172:
+	.loc 1 508 0 is_stmt 1 discriminator 2
+	and	x9, x9, -65281
+	cbnz	x7, .L1142
+	.loc 1 508 0 is_stmt 0 discriminator 3
+	orr	x11, x11, 256
+	b	.L1141
+.LVL1257:
+	.p2align 3
+.L1211:
+.LBE2172:
+.LBB2173:
+	.loc 1 507 0 is_stmt 1 discriminator 2
+	cbnz	x5, .L1138
+	.loc 1 507 0 is_stmt 0 discriminator 3
+	and	x9, x9, -256
+	mov	x11, 1
+	b	.L1137
+.LVL1258:
+	.p2align 3
+.L1150:
+.LBE2173:
+.LBB2174:
+	.loc 1 510 0 is_stmt 1 discriminator 4
+	cmp	x7, x20
+	beq	.L1217
+	.loc 1 510 0 is_stmt 0 discriminator 6
+	orr	x9, x7, x9
+	b	.L1149
+.LVL1259:
+	.p2align 3
+.L1162:
+.LBE2174:
+.LBB2175:
+	.loc 1 513 0 is_stmt 1 discriminator 4
+	cmp	x7, x23
+	beq	.L1218
+	.loc 1 513 0 is_stmt 0 discriminator 6
+	orr	x9, x7, x9
+	b	.L1161
+.LVL1260:
+	.p2align 3
+.L1146:
+.LBE2175:
+.LBB2176:
+	.loc 1 509 0 is_stmt 1 discriminator 4
+	cmp	x7, 14680064
+	beq	.L1219
+	.loc 1 509 0 is_stmt 0 discriminator 6
+	orr	x9, x7, x9
+	b	.L1145
+.LVL1261:
+	.p2align 3
+.L1158:
+.LBE2176:
+.LBB2177:
+	.loc 1 512 0 is_stmt 1 discriminator 4
+	cmp	x7, x22
+	beq	.L1220
+	.loc 1 512 0 is_stmt 0 discriminator 6
+	orr	x9, x7, x9
+	b	.L1157
+.LVL1262:
+	.p2align 3
+.L1142:
+.LBE2177:
+.LBB2178:
+	.loc 1 508 0 is_stmt 1 discriminator 4
+	cmp	x7, 57344
+	beq	.L1221
+	.loc 1 508 0 is_stmt 0 discriminator 6
+	orr	x9, x7, x9
+	b	.L1141
+.LVL1263:
+	.p2align 3
+.L1154:
+.LBE2178:
+.LBB2179:
+	.loc 1 511 0 is_stmt 1 discriminator 4
+	cmp	x7, x21
+	beq	.L1222
+	.loc 1 511 0 is_stmt 0 discriminator 6
+	orr	x9, x7, x9
+	b	.L1153
+.LVL1264:
+	.p2align 3
+.L1138:
+.LBE2179:
+.LBB2180:
+	.loc 1 507 0 is_stmt 1 discriminator 4
+	cmp	x5, 224
+	beq	.L1223
+	.loc 1 507 0 is_stmt 0 discriminator 6
+	and	x9, x9, -256
+	orr	x9, x5, x9
+.LBE2180:
+	.loc 1 503 0 is_stmt 1 discriminator 6
+	mov	x5, 0
+	b	.L1137
+.LVL1265:
+	.p2align 3
+.L1210:
+.LBB2181:
+	.loc 1 523 0 discriminator 6
+	orr	x11, x11, 72057594037927936
+	orr	x9, x9, -1152921504606846976
+	b	.L1165
+.LVL1266:
+	.p2align 3
+.L1217:
+.LBE2181:
+.LBB2182:
+	.loc 1 510 0 discriminator 5
+	orr	x11, x11, 16777216
+	orr	x9, x9, 4026531840
+	b	.L1149
+.LVL1267:
+	.p2align 3
+.L1223:
+.LBE2182:
+.LBB2183:
+	.loc 1 507 0 discriminator 5
+	and	x5, x9, -256
+.LVL1268:
+	mov	x11, 1
+	orr	x9, x5, 240
+.LBE2183:
+	.loc 1 503 0 discriminator 5
+	mov	x5, 0
+.LVL1269:
+.LBB2184:
+	b	.L1137
+.LVL1270:
+	.p2align 3
+.L1218:
+.LBE2184:
+.LBB2185:
+	.loc 1 513 0 discriminator 5
+	orr	x11, x11, 281474976710656
+	orr	x9, x9, 67553994410557440
+	b	.L1161
+.LVL1271:
+	.p2align 3
+.L1220:
+.LBE2185:
+.LBB2186:
+	.loc 1 512 0 discriminator 5
+	orr	x11, x11, 1099511627776
+	orr	x9, x9, 263882790666240
+	b	.L1157
+.LVL1272:
+	.p2align 3
+.L1219:
+.LBE2186:
+.LBB2187:
+	.loc 1 509 0 discriminator 5
+	orr	x11, x11, 65536
+	orr	x9, x9, 15728640
+	b	.L1145
+.LVL1273:
+	.p2align 3
+.L1221:
+.LBE2187:
+.LBB2188:
+	.loc 1 508 0 discriminator 5
+	orr	x11, x11, 256
+	orr	x9, x9, 61440
+	b	.L1141
+.LVL1274:
+	.p2align 3
+.L1222:
+.LBE2188:
+.LBB2189:
+	.loc 1 511 0 discriminator 5
+	orr	x11, x11, 4294967296
+	orr	x9, x9, 1030792151040
+	b	.L1153
+.LVL1275:
+.L1213:
+.LBE2189:
+.LBB2190:
+	.loc 1 516 0 discriminator 3
+	cbz	x5, .L1224
+	.loc 1 516 0 is_stmt 0 discriminator 5
+	cmp	x5, 224
+	beq	.L1225
+	.loc 1 516 0 discriminator 7
+	and	x9, x9, -256
+	orr	x9, x5, x9
+.LBE2190:
+	.loc 1 503 0 is_stmt 1 discriminator 7
+	mov	x5, 0
+	b	.L1168
+.LVL1276:
+.L1172:
+.LBB2191:
+	.loc 1 517 0 discriminator 3
+	and	x9, x9, -65281
+	cbz	x25, .L1226
+	.loc 1 517 0 is_stmt 0 discriminator 5
+	cmp	x25, 57344
+	beq	.L1227
+	.loc 1 517 0 discriminator 7
+	orr	x9, x25, x9
+	b	.L1171
+.LVL1277:
+.L1176:
+.LBE2191:
+.LBB2192:
+	.loc 1 518 0 is_stmt 1 discriminator 3
+	and	x9, x9, -16711681
+	cbz	x25, .L1228
+	.loc 1 518 0 is_stmt 0 discriminator 5
+	cmp	x25, 14680064
+	beq	.L1229
+	.loc 1 518 0 discriminator 7
+	orr	x9, x25, x9
+	b	.L1175
+.LVL1278:
+.L1180:
+.LBE2192:
+.LBB2193:
+	.loc 1 519 0 is_stmt 1 discriminator 3
+	and	x9, x9, -4278190081
+	cbz	x25, .L1230
+	.loc 1 519 0 is_stmt 0 discriminator 5
+	cmp	x25, x20
+	beq	.L1231
+	.loc 1 519 0 discriminator 7
+	orr	x9, x25, x9
+	b	.L1179
+.LVL1279:
+.L1184:
+.LBE2193:
+.LBB2194:
+	.loc 1 520 0 is_stmt 1 discriminator 3
+	and	x9, x9, -1095216660481
+	cbz	x25, .L1232
+	.loc 1 520 0 is_stmt 0 discriminator 5
+	cmp	x25, x21
+	beq	.L1233
+	.loc 1 520 0 discriminator 7
+	orr	x9, x25, x9
+	b	.L1183
+.LVL1280:
+.L1188:
+.LBE2194:
+.LBB2195:
+	.loc 1 521 0 is_stmt 1 discriminator 3
+	and	x9, x9, -280375465082881
+	cbz	x25, .L1234
+	.loc 1 521 0 is_stmt 0 discriminator 5
+	cmp	x25, x22
+	beq	.L1235
+	.loc 1 521 0 discriminator 7
+	orr	x9, x25, x9
+	b	.L1187
+.LVL1281:
+.L1192:
+.LBE2195:
+.LBB2196:
+	.loc 1 522 0 is_stmt 1 discriminator 3
+	and	x9, x9, -71776119061217281
+	cbz	x25, .L1236
+	.loc 1 522 0 is_stmt 0 discriminator 5
+	cmp	x25, x23
+	beq	.L1237
+	.loc 1 522 0 discriminator 7
+	orr	x9, x25, x9
+	b	.L1191
+.L1236:
+	.loc 1 522 0 discriminator 4
+	orr	x7, x7, 281474976710656
+	b	.L1191
+.LVL1282:
+.L1234:
+.LBE2196:
+.LBB2197:
+	.loc 1 521 0 is_stmt 1 discriminator 4
+	orr	x7, x7, 1099511627776
+	b	.L1187
+.LVL1283:
+.L1232:
+.LBE2197:
+.LBB2198:
+	.loc 1 520 0 discriminator 4
+	orr	x7, x7, 4294967296
+	b	.L1183
+.LVL1284:
+.L1230:
+.LBE2198:
+.LBB2199:
+	.loc 1 519 0 discriminator 4
+	orr	x7, x7, 16777216
+	b	.L1179
+.LVL1285:
+.L1228:
+.LBE2199:
+.LBB2200:
+	.loc 1 518 0 discriminator 4
+	orr	x7, x7, 65536
+	b	.L1175
+.LVL1286:
+.L1226:
+.LBE2200:
+.LBB2201:
+	.loc 1 517 0 discriminator 4
+	orr	x7, x7, 256
+	b	.L1171
+.LVL1287:
+.L1224:
+.LBE2201:
+.LBB2202:
+	.loc 1 516 0 discriminator 4
+	and	x9, x9, -256
+	orr	x7, x7, 1
+	b	.L1168
+.LVL1288:
+.L1237:
+.LBE2202:
+.LBB2203:
+	.loc 1 522 0 discriminator 6
+	orr	x7, x7, 281474976710656
+	orr	x9, x9, 67553994410557440
+	b	.L1191
+.LVL1289:
+.L1225:
+.LBE2203:
+.LBB2204:
+	.loc 1 516 0 discriminator 6
+	and	x5, x9, -256
+.LVL1290:
+	orr	x7, x7, 1
+	orr	x9, x5, 240
+.LBE2204:
+	.loc 1 503 0 discriminator 6
+	mov	x5, 0
+.LVL1291:
+.LBB2205:
+	b	.L1168
+.LVL1292:
+.L1227:
+.LBE2205:
+.LBB2206:
+	.loc 1 517 0 discriminator 6
+	orr	x7, x7, 256
+	orr	x9, x9, 61440
+	b	.L1171
+.LVL1293:
+.L1229:
+.LBE2206:
+.LBB2207:
+	.loc 1 518 0 discriminator 6
+	orr	x7, x7, 65536
+	orr	x9, x9, 15728640
+	b	.L1175
+.LVL1294:
+.L1231:
+.LBE2207:
+.LBB2208:
+	.loc 1 519 0 discriminator 6
+	orr	x7, x7, 16777216
+	orr	x9, x9, 4026531840
+	b	.L1179
+.LVL1295:
+.L1233:
+.LBE2208:
+.LBB2209:
+	.loc 1 520 0 discriminator 6
+	orr	x7, x7, 4294967296
+	orr	x9, x9, 1030792151040
+	b	.L1183
+.LVL1296:
+.L1235:
+.LBE2209:
+.LBB2210:
+	.loc 1 521 0 discriminator 6
+	orr	x7, x7, 1099511627776
+	orr	x9, x9, 263882790666240
+	b	.L1187
+.LBE2210:
+	.cfi_endproc
+.LFE2818:
+	.size	refresh_new_image, .-refresh_new_image
+	.align	2
+	.p2align 3,,7
+	.global	refresh_new_image_auto
+	.type	refresh_new_image_auto, %function
+refresh_new_image_auto:
+.LFB2819:
+	.loc 1 535 0
+	.cfi_startproc
+.LVL1297:
+	.loc 1 542 0
+	ldp	w14, w4, [x3, 92]
+	cmp	w4, 0
+	add	w10, w4, 7
+	csel	w10, w10, w4, lt
+.LVL1298:
+	.loc 1 544 0
+	cmp	w14, 0
+	.loc 1 542 0
+	asr	w10, w10, 3
+.LVL1299:
+	.loc 1 544 0
+	ble	.L1238
+	sub	w12, w10, #1
+	mov	w13, 0
+.LVL1300:
+	add	x12, x12, 1
+	.loc 1 557 0
+	mov	x11, 255
+	lsl	x12, x12, 3
+.LVL1301:
+	.p2align 2
+.L1240:
+	.loc 1 545 0 discriminator 1
+	cmp	w10, 0
+	ble	.L1251
+	add	x7, x0, 8
+	.loc 1 545 0 is_stmt 0
+	mov	x5, 0
+	.p2align 2
+.L1250:
+	.loc 1 547 0 is_stmt 1
+	ldr	x3, [x1, x5, lsl 3]
+.LVL1302:
+	.loc 1 548 0
+	ldr	x8, [x7, -8]
+	eor	x6, x3, x8
+	.loc 1 551 0
+	cmp	x3, x8
+	beq	.L1241
+	.loc 1 546 0
+	ldr	x4, [x2, x5, lsl 3]
+.LVL1303:
+	.loc 1 556 0
+	and	x3, x4, 255
+.LVL1304:
+	.loc 1 557 0
+	cmp	x3, 0
+	csel	x3, xzr, x11, ne
+.LVL1305:
+	.loc 1 561 0
+	tst	x4, 65280
+	orr	x9, x3, 65280
+	csel	x3, x9, x3, eq
+	.loc 1 565 0
+	tst	x4, 16711680
+	orr	x9, x3, 16711680
+	csel	x3, x9, x3, eq
+	.loc 1 569 0
+	tst	x4, 4278190080
+	orr	x9, x3, 4278190080
+	csel	x3, x9, x3, eq
+	.loc 1 573 0
+	tst	x4, 1095216660480
+	orr	x9, x3, 1095216660480
+	csel	x3, x9, x3, eq
+	.loc 1 577 0
+	tst	x4, 280375465082880
+	orr	x9, x3, 280375465082880
+	csel	x3, x9, x3, eq
+	.loc 1 581 0
+	tst	x4, 71776119061217280
+	orr	x9, x3, 71776119061217280
+	csel	x3, x9, x3, eq
+	.loc 1 585 0
+	tst	x4, -72057594037927936
+	orr	x4, x3, -72057594037927936
+.LVL1306:
+	csel	x3, x4, x3, eq
+	and	x3, x6, x3
+.LVL1307:
+	.loc 1 588 0
+	eor	x3, x3, x8
+	.loc 1 589 0
+	str	x3, [x7, -8]
+.LVL1308:
+.L1241:
+	add	x5, x5, 1
+	add	x7, x7, 8
+	.loc 1 545 0 discriminator 2
+	cmp	w10, w5
+	bgt	.L1250
+	add	x0, x0, x12
+	add	x2, x2, x12
+	add	x1, x1, x12
+.LVL1309:
+.L1251:
+	.loc 1 544 0 discriminator 2
+	add	w13, w13, 1
+	cmp	w14, w13
+	bne	.L1240
+.L1238:
+	ret
+	.cfi_endproc
+.LFE2819:
+	.size	refresh_new_image_auto, .-refresh_new_image_auto
+	.align	2
+	.p2align 3,,7
+	.type	ebc_thread, %function
+ebc_thread:
+.LFB2844:
+	.loc 1 2348 0
+	.cfi_startproc
+.LVL1310:
+	stp	x29, x30, [sp, -160]!
+	.cfi_def_cfa_offset 160
+	.cfi_offset 29, -160
+	.cfi_offset 30, -152
+	.loc 1 2349 0
+	adrp	x2, .LANCHOR0
+	.loc 1 2348 0
+	adrp	x1, __stack_chk_guard
+	add	x1, x1, :lo12:__stack_chk_guard
+	add	x29, sp, 0
+	.cfi_def_cfa_register 29
+	stp	x25, x26, [sp, 64]
+.LBB2298:
+.LBB2299:
+.LBB2300:
+	.loc 1 2808 0
+	adrp	x0, .LANCHOR1
+.LVL1311:
+.LBE2300:
+.LBE2299:
+.LBE2298:
+	.loc 1 2348 0
+	stp	x23, x24, [sp, 48]
+.LBB2313:
+.LBB2309:
+.LBB2304:
+	.loc 1 2808 0
+	add	x0, x0, :lo12:.LANCHOR1
+	.cfi_offset 25, -96
+	.cfi_offset 26, -88
+	.cfi_offset 23, -112
+	.cfi_offset 24, -104
+.LBE2304:
+.LBE2309:
+.LBE2313:
+	.loc 1 2349 0
+	ldr	x24, [x2, #:lo12:.LANCHOR0]
+.LVL1312:
+.LBB2314:
+.LBB2310:
+.LBB2305:
+	.loc 1 2808 0
+	add	x0, x0, 304
+.LBE2305:
+.LBE2310:
+.LBE2314:
+	.loc 1 2348 0
+	stp	x27, x28, [sp, 80]
+	.loc 1 2356 0
+	mov	w26, 0
+.LVL1313:
+	.loc 1 2348 0
+	stp	x19, x20, [sp, 16]
+	.loc 1 2350 0
+	add	x25, x24, 192
+	.loc 1 2348 0
+	stp	x21, x22, [sp, 32]
+	.cfi_offset 27, -80
+	.cfi_offset 28, -72
+	.cfi_offset 19, -144
+	.cfi_offset 20, -136
+	.cfi_offset 21, -128
+	.cfi_offset 22, -120
+	add	x27, x24, 24
+	.loc 1 2354 0
+	str	wzr, [x29, 100]
+	.loc 1 2348 0
+	ldr	x2, [x1]
+	str	x2, [x29, 152]
+	mov	x2,0
+.LBB2315:
+.LBB2311:
+.LBB2306:
+	.loc 1 2808 0
+	str	x0, [x29, 104]
+.LVL1314:
+	.p2align 2
+.L1255:
+.LBE2306:
+.LBE2311:
+.LBE2315:
+	.loc 1 2360 0
+	ldr	w0, [x25, 592]
+.LVL1315:
+	cbz	w0, .L1256
+	.loc 1 2360 0 is_stmt 0 discriminator 1
+	ldr	w0, [x27, 160]
+	cbz	w0, .L1608
+.L1256:
+	.loc 1 2366 0 is_stmt 1
+	cbnz	w26, .L1258
+	.loc 1 2366 0 is_stmt 0 discriminator 1
+	ldr	w0, [x25, 612]
+	cbz	w0, .L1609
+.L1258:
+	.loc 1 2412 0 is_stmt 1
+	ldr	w0, [x25, 604]
+	cbz	w0, .L1310
+	.loc 1 2412 0 is_stmt 0 discriminator 1
+	ldr	w0, [x25, 600]
+	cbnz	w0, .L1310
+	.loc 1 2412 0 discriminator 2
+	ldr	w0, [x25, 612]
+	cbnz	w0, .L1310
+.L1311:
+	.loc 1 2807 0 is_stmt 1
+	ldr	w0, [x25, 100]
+	cbz	w0, .L1610
+.L1433:
+.LVL1316:
+.L1431:
+	.loc 1 2833 0
+	str	wzr, [x25, 100]
+	b	.L1255
+.LVL1317:
+.L1608:
+	.loc 1 2361 0
+	ldr	w0, [x25, 200]
+	cmp	w0, 1
+	beq	.L1611
+.L1257:
+	.loc 1 2838 0
+	adrp	x0, __stack_chk_guard
+	add	x1, x0, :lo12:__stack_chk_guard
+	ldr	x2, [x29, 152]
+	ldr	x1, [x1]
+	eor	x1, x2, x1
+	mov	w0, 0
+	cbnz	x1, .L1612
+	ldp	x19, x20, [sp, 16]
+.LVL1318:
+	ldp	x21, x22, [sp, 32]
+.LVL1319:
+	ldp	x23, x24, [sp, 48]
+.LVL1320:
+	ldp	x25, x26, [sp, 64]
+.LVL1321:
+	ldp	x27, x28, [sp, 80]
+.LVL1322:
+	ldp	x29, x30, [sp], 160
+	.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
+.LVL1323:
+.L1609:
+	.cfi_restore_state
+	.loc 1 2367 0
+	bl	ebc_osd_buf_get
+.LVL1324:
+	mov	x19, x0
+.LVL1325:
+	.loc 1 2368 0
+	cbz	x0, .L1258
+	.loc 1 2369 0
+	ldr	x0, [x25, 584]
+	cbnz	x0, .L1259
+	.loc 1 2369 0 is_stmt 0 discriminator 1
+	ldr	w26, [x25, 592]
+.LVL1326:
+	cbnz	w26, .L1259
+	.loc 1 2375 0 is_stmt 1
+	ldr	w0, [x25, 252]
+	sub	w1, w0, #1
+	cmp	w1, 1
+	bls	.L1613
+	.loc 1 2378 0
+	cmp	w0, 3
+	beq	.L1614
+.L1263:
+	.loc 1 2384 0
+	str	x19, [x25, 240]
+	.loc 1 2385 0
+	mov	w0, 4
+	str	w0, [x25, 252]
+	.loc 1 2388 0
+	ldr	x3, [x25, 224]
+.LBB2316:
+.LBB2317:
+	.loc 1 437 0
+	ldp	w2, w22, [x19, 48]
+.LVL1327:
+	.loc 1 438 0
+	ldp	w1, w28, [x19, 56]
+.LVL1328:
+	.loc 1 435 0
+	cmp	w2, 0
+	.loc 1 440 0
+	ldr	w0, [x24, 288]
+	.loc 1 435 0
+	add	w23, w2, 7
+.LVL1329:
+	csel	w23, w23, w2, lt
+	.loc 1 436 0
+	add	w14, w1, 7
+	cmp	w1, 0
+	.loc 1 440 0
+	add	w16, w0, 7
+	.loc 1 436 0
+	csel	w14, w14, w1, lt
+	.loc 1 440 0
+	cmp	w0, 0
+	csel	w16, w16, w0, lt
+	.loc 1 436 0
+	asr	w14, w14, 3
+	.loc 1 440 0
+	asr	w16, w16, 3
+.LVL1330:
+	.loc 1 436 0
+	add	w14, w14, 1
+.LVL1331:
+	ldr	w1, [x24, 284]
+	.loc 1 443 0
+	cmp	w14, w16
+.LBE2317:
+.LBE2316:
+	.loc 1 2390 0
+	ldp	x11, x8, [x25, 168]
+.LVL1332:
+.LBB2369:
+.LBB2363:
+	.loc 1 447 0
+	mul	w0, w22, w16
+	.loc 1 443 0
+	sub	w2, w16, #1
+.LBE2363:
+.LBE2369:
+	.loc 1 2386 0
+	ldr	x9, [x25, 152]
+.LBB2370:
+.LBB2364:
+	.loc 1 443 0
+	csel	w14, w2, w14, ge
+.LBE2364:
+.LBE2370:
+	.loc 1 2388 0
+	ldr	x12, [x3, 16]
+.LVL1333:
+.LBB2371:
+.LBB2365:
+	.loc 1 445 0
+	cmp	w1, w28
+	sub	w2, w1, #1
+.LBE2365:
+.LBE2371:
+	.loc 1 2387 0
+	ldr	x13, [x19, 16]
+.LBB2372:
+.LBB2366:
+	.loc 1 447 0
+	sbfiz	x0, x0, 3, 32
+	.loc 1 445 0
+	csel	w28, w2, w28, le
+	.loc 1 435 0
+	asr	w23, w23, 3
+.LVL1334:
+	.loc 1 447 0
+	add	x9, x9, x0
+.LVL1335:
+	.loc 1 450 0
+	add	x11, x11, x0
+.LVL1336:
+	.loc 1 451 0
+	add	x8, x8, x0
+.LVL1337:
+	.loc 1 453 0
+	cmp	w22, w28
+	.loc 1 449 0
+	add	x12, x12, x0
+.LVL1338:
+	.loc 1 448 0
+	add	x13, x13, x0
+.LVL1339:
+	.loc 1 453 0
+	bgt	.L1270
+	sbfiz	x16, x16, 3, 32
+.LVL1340:
+.LBB2318:
+	.loc 1 465 0
+	mov	x21, 4026531840
+.LVL1341:
+.LBE2318:
+.LBB2319:
+	.loc 1 466 0
+	mov	x20, 1030792151040
+.LVL1342:
+.LBE2319:
+.LBB2320:
+	.loc 1 467 0
+	mov	x19, 263882790666240
+.LBE2320:
+.LBB2321:
+	.loc 1 468 0
+	mov	x18, 67553994410557440
+.LBE2321:
+.LBB2322:
+	.loc 1 469 0
+	mov	x17, -1152921504606846976
+.LVL1343:
+	.p2align 2
+.L1271:
+.LBE2322:
+	.loc 1 454 0
+	cmp	w23, w14
+	mov	w5, w23
+	ble	.L1526
+	b	.L1305
+.LVL1344:
+	.p2align 3
+.L1616:
+.LBB2323:
+	.loc 1 462 0
+	and	x15, x4, 240
+.LVL1345:
+.LBE2323:
+	and	x0, x0, -256
+.LBB2324:
+	cmp	x15, 240
+	bne	.L1615
+	mov	x2, 255
+.LVL1346:
+.L1272:
+.LBE2324:
+	.loc 1 463 0
+	tst	x1, 65280
+	bne	.L1275
+.LBB2325:
+	and	x15, x4, 61440
+.LVL1347:
+.LBE2325:
+	and	x0, x0, -65281
+.LBB2326:
+	cmp	x15, 61440
+	bne	.L1276
+	orr	x2, x2, 65280
+.LVL1348:
+.L1275:
+.LBE2326:
+	.loc 1 464 0
+	tst	x1, 16711680
+	bne	.L1279
+.LBB2327:
+	and	x15, x4, 15728640
+.LVL1349:
+.LBE2327:
+	and	x0, x0, -16711681
+.LBB2328:
+	cmp	x15, 15728640
+	bne	.L1280
+	orr	x2, x2, 16711680
+.LVL1350:
+.L1279:
+.LBE2328:
+	.loc 1 465 0
+	tst	x1, 4278190080
+	bne	.L1283
+.LBB2329:
+	and	x15, x4, 4026531840
+.LVL1351:
+.LBE2329:
+	and	x0, x0, -4278190081
+.LBB2330:
+	cmp	x15, x21
+	bne	.L1284
+	orr	x2, x2, 4278190080
+.LVL1352:
+.L1283:
+.LBE2330:
+	.loc 1 466 0
+	tst	x1, 1095216660480
+	bne	.L1287
+.LBB2331:
+	and	x15, x4, 1030792151040
+.LVL1353:
+.LBE2331:
+	and	x0, x0, -1095216660481
+.LBB2332:
+	cmp	x15, x20
+	bne	.L1288
+	orr	x2, x2, 1095216660480
+.LVL1354:
+.L1287:
+.LBE2332:
+	.loc 1 467 0
+	tst	x1, 280375465082880
+	bne	.L1291
+.LBB2333:
+	and	x15, x4, 263882790666240
+.LVL1355:
+.LBE2333:
+	and	x0, x0, -280375465082881
+.LBB2334:
+	cmp	x15, x19
+	bne	.L1292
+	orr	x2, x2, 280375465082880
+.LVL1356:
+.L1291:
+.LBE2334:
+	.loc 1 468 0
+	tst	x1, 71776119061217280
+	bne	.L1295
+.LBB2335:
+	and	x15, x4, 67553994410557440
+.LVL1357:
+.LBE2335:
+	and	x0, x0, -71776119061217281
+.LBB2336:
+	cmp	x15, x18
+	bne	.L1296
+	orr	x2, x2, 71776119061217280
+.LVL1358:
+.L1295:
+.LBE2336:
+	.loc 1 469 0
+	tst	x1, -72057594037927936
+	bne	.L1299
+.LBB2337:
+	and	x4, x4, -1152921504606846976
+.LVL1359:
+.LBE2337:
+	and	x0, x0, 72057594037927935
+.LBB2338:
+	cmp	x4, x17
+	bne	.L1300
+	orr	x2, x2, -72057594037927936
+.LVL1360:
+.L1299:
+	eor	x6, x6, x3
+.LVL1361:
+.LBE2338:
+	.loc 1 473 0
+	str	x0, [x7]
+	and	x2, x6, x2
+.LVL1362:
+	.loc 1 454 0
+	add	w5, w5, 1
+	.loc 1 472 0
+	eor	x2, x3, x2
+	.loc 1 474 0
+	str	x2, [x10]
+	.loc 1 454 0
+	cmp	w5, w14
+	bgt	.L1305
+.L1526:
+	.loc 1 455 0
+	sxtw	x0, w5
+.LVL1363:
+	lsl	x7, x0, 3
+	add	x10, x9, x7
+	.loc 1 459 0
+	add	x7, x8, x7
+	.loc 1 458 0
+	ldr	x1, [x11, x0, lsl 3]
+	.loc 1 455 0
+	ldr	x3, [x9, x0, lsl 3]
+	.loc 1 456 0
+	ldr	x4, [x13, x0, lsl 3]
+.LVL1364:
+	.loc 1 462 0
+	ands	x2, x1, 255
+.LVL1365:
+	.loc 1 457 0
+	ldr	x6, [x12, x0, lsl 3]
+.LVL1366:
+	.loc 1 459 0
+	ldr	x0, [x8, x0, lsl 3]
+.LVL1367:
+	.loc 1 462 0
+	beq	.L1616
+	.loc 1 460 0
+	mov	x2, 0
+	b	.L1272
+.LVL1368:
+	.p2align 3
+.L1305:
+	.loc 1 453 0
+	add	w22, w22, 1
+	.loc 1 476 0
+	add	x9, x9, x16
+	.loc 1 477 0
+	add	x13, x13, x16
+	.loc 1 478 0
+	add	x12, x12, x16
+	.loc 1 479 0
+	add	x11, x11, x16
+	.loc 1 480 0
+	add	x8, x8, x16
+	.loc 1 453 0
+	cmp	w22, w28
+	ble	.L1271
+.LVL1369:
+.L1270:
+.LBE2366:
+.LBE2372:
+	.loc 1 2392 0
+	ldr	w0, [x25, 52]
+.LVL1370:
+	cbnz	w0, .L1306
+	.loc 1 2394 0
+	ldr	w0, [x25, 200]
+	.loc 1 2393 0
+	mov	w1, 1
+.LVL1371:
+	str	w1, [x25, 52]
+	.loc 1 2394 0
+	cbz	w0, .L1617
+.L1307:
+	.loc 1 2396 0
+	mov	w1, 1
+	mov	x0, x24
+	bl	ebc_lut_update
+.LVL1372:
+	.loc 1 2398 0
+	ldr	w3, [x25, 112]
+	.loc 1 2400 0
+	adrp	x1, .LC105
+	ldr	x0, [x25, 104]
+	add	x1, x1, :lo12:.LC105
+	and	w2, w3, 255
+	.loc 1 2398 0
+	strb	w3, [x25, 56]
+	.loc 1 2399 0
+	lsr	w4, w3, 8
+	strb	w4, [x25, 57]
+	.loc 1 2400 0
+	and	w3, w4, 255
+	bl	_dev_info
+.LVL1373:
+	.loc 1 2401 0
+	mov	x0, x24
+	bl	ebc_frame_start
+.LVL1374:
+.L1308:
+	.loc 1 2405 0
+	ldr	x0, [x25, 232]
+	cbz	x0, .L1309
+	.loc 1 2406 0
+	bl	ebc_buf_release
+.LVL1375:
+.L1309:
+	.loc 1 2407 0
+	ldr	x0, [x25, 240]
+	str	x0, [x25, 232]
+	.loc 1 2409 0
+	b	.L1255
+.LVL1376:
+	.p2align 3
+.L1300:
+.LBB2373:
+.LBB2367:
+.LBB2339:
+	.loc 1 469 0
+	cbnz	x4, .L1301
+	and	x3, x3, 72057594037927935
+	orr	x0, x0, 72057594037927936
+	b	.L1299
+.LVL1377:
+	.p2align 3
+.L1292:
+.LBE2339:
+.LBB2340:
+	.loc 1 467 0
+	cbnz	x15, .L1293
+	and	x3, x3, -280375465082881
+	orr	x0, x0, 1099511627776
+	b	.L1291
+.LVL1378:
+	.p2align 3
+.L1296:
+.LBE2340:
+.LBB2341:
+	.loc 1 468 0
+	cbnz	x15, .L1297
+	and	x3, x3, -71776119061217281
+	orr	x0, x0, 281474976710656
+	b	.L1295
+.LVL1379:
+	.p2align 3
+.L1615:
+.LBE2341:
+.LBB2342:
+	.loc 1 462 0
+	cbnz	x15, .L1273
+	and	x3, x3, -256
+	orr	x0, x0, 1
+	b	.L1272
+.LVL1380:
+	.p2align 3
+.L1276:
+.LBE2342:
+.LBB2343:
+	.loc 1 463 0
+	and	x3, x3, -65281
+	cbnz	x15, .L1277
+	orr	x0, x0, 256
+	b	.L1275
+.LVL1381:
+	.p2align 3
+.L1284:
+.LBE2343:
+.LBB2344:
+	.loc 1 465 0
+	cbnz	x15, .L1285
+	and	x3, x3, -4278190081
+	orr	x0, x0, 16777216
+	b	.L1283
+.LVL1382:
+	.p2align 3
+.L1280:
+.LBE2344:
+.LBB2345:
+	.loc 1 464 0
+	and	x3, x3, -16711681
+	cbnz	x15, .L1281
+	orr	x0, x0, 65536
+	b	.L1279
+.LVL1383:
+	.p2align 3
+.L1288:
+.LBE2345:
+.LBB2346:
+	.loc 1 466 0
+	cbnz	x15, .L1289
+	and	x3, x3, -1095216660481
+	orr	x0, x0, 4294967296
+	b	.L1287
+.LVL1384:
+	.p2align 3
+.L1301:
+.LBE2346:
+.LBB2347:
+	.loc 1 469 0
+	mov	x1, -2305843009213693952
+.LVL1385:
+	and	x3, x3, 72057594037927935
+	cmp	x4, x1
+	beq	.L1618
+	orr	x3, x4, x3
+	b	.L1299
+.LVL1386:
+	.p2align 3
+.L1293:
+.LBE2347:
+.LBB2348:
+	.loc 1 467 0
+	mov	x30, 246290604621824
+	and	x3, x3, -280375465082881
+	cmp	x15, x30
+	beq	.L1619
+	orr	x3, x15, x3
+	b	.L1291
+.LVL1387:
+	.p2align 3
+.L1289:
+.LBE2348:
+.LBB2349:
+	.loc 1 466 0
+	mov	x30, 962072674304
+	and	x3, x3, -1095216660481
+	cmp	x15, x30
+	beq	.L1620
+	orr	x3, x15, x3
+	b	.L1287
+.LVL1388:
+	.p2align 3
+.L1273:
+.LBE2349:
+.LBB2350:
+	.loc 1 462 0
+	cmp	x15, 224
+	beq	.L1621
+	bfi	x3, x15, 0, 8
+	b	.L1272
+.LVL1389:
+	.p2align 3
+.L1297:
+.LBE2350:
+.LBB2351:
+	.loc 1 468 0
+	mov	x30, 63050394783186944
+	and	x3, x3, -71776119061217281
+	cmp	x15, x30
+	beq	.L1622
+	orr	x3, x15, x3
+	b	.L1295
+.LVL1390:
+	.p2align 3
+.L1277:
+.LBE2351:
+.LBB2352:
+	.loc 1 463 0
+	cmp	x15, 57344
+	beq	.L1623
+	orr	x3, x15, x3
+	b	.L1275
+.LVL1391:
+	.p2align 3
+.L1285:
+.LBE2352:
+.LBB2353:
+	.loc 1 465 0
+	mov	x30, 3758096384
+	and	x3, x3, -4278190081
+	cmp	x15, x30
+	beq	.L1624
+	orr	x3, x15, x3
+	b	.L1283
+.LVL1392:
+	.p2align 3
+.L1281:
+.LBE2353:
+.LBB2354:
+	.loc 1 464 0
+	cmp	x15, 14680064
+	beq	.L1625
+	orr	x3, x15, x3
+	b	.L1279
+.LVL1393:
+	.p2align 3
+.L1259:
+.LBE2354:
+.LBE2367:
+.LBE2373:
+	.loc 1 2370 0
+	ldr	x0, [x25, 104]
+	adrp	x1, .LC102
+	add	x1, x1, :lo12:.LC102
+	.loc 1 2373 0
+	mov	w26, 0
+	.loc 1 2370 0
+	bl	_dev_info
+.LVL1394:
+	.loc 1 2371 0
+	mov	x0, x19
+	bl	ebc_buf_release
+.LVL1395:
+	.loc 1 2373 0
+	b	.L1255
+.LVL1396:
+.L1618:
+.LBB2374:
+.LBB2368:
+.LBB2355:
+	.loc 1 469 0
+	orr	x0, x0, 72057594037927936
+	orr	x3, x3, -1152921504606846976
+	b	.L1299
+.LVL1397:
+.L1619:
+.LBE2355:
+.LBB2356:
+	.loc 1 467 0
+	orr	x0, x0, 1099511627776
+	orr	x3, x3, 263882790666240
+	b	.L1291
+.LVL1398:
+.L1621:
+.LBE2356:
+.LBB2357:
+	.loc 1 462 0
+	and	x3, x3, -256
+	orr	x0, x0, 1
+	orr	x3, x3, 240
+	b	.L1272
+.LVL1399:
+.L1623:
+.LBE2357:
+.LBB2358:
+	.loc 1 463 0
+	orr	x0, x0, 256
+	orr	x3, x3, 61440
+	b	.L1275
+.LVL1400:
+.L1622:
+.LBE2358:
+.LBB2359:
+	.loc 1 468 0
+	orr	x0, x0, 281474976710656
+	orr	x3, x3, 67553994410557440
+	b	.L1295
+.LVL1401:
+.L1624:
+.LBE2359:
+.LBB2360:
+	.loc 1 465 0
+	orr	x0, x0, 16777216
+	orr	x3, x3, 4026531840
+	b	.L1283
+.LVL1402:
+.L1620:
+.LBE2360:
+.LBB2361:
+	.loc 1 466 0
+	orr	x0, x0, 4294967296
+	orr	x3, x3, 1030792151040
+	b	.L1287
+.LVL1403:
+.L1625:
+.LBE2361:
+.LBB2362:
+	.loc 1 464 0
+	orr	x0, x0, 65536
+	orr	x3, x3, 15728640
+	b	.L1279
+.LVL1404:
+	.p2align 3
+.L1310:
+.LBE2362:
+.LBE2368:
+.LBE2374:
+	.loc 1 2413 0
+	bl	ebc_dsp_buf_get
+.LVL1405:
+	mov	x19, x0
+.LVL1406:
+	.loc 1 2414 0
+	cbz	x0, .L1311
+	.loc 1 2415 0
+	ldr	w1, [x27, 160]
+	cbnz	w1, .L1312
+	.loc 1 2416 0
+	ldr	w1, [x0, 40]
+	sub	w2, w1, #18
+	tst	w2, -3
+	bne	.L1313
+	.loc 1 2417 0
+	adrp	x0, .LANCHOR0
+	add	x0, x0, :lo12:.LANCHOR0
+	str	wzr, [x0, 32]
+.L1314:
+	.loc 1 2498 0
+	ldr	w0, [x19, 64]
+	.loc 1 2496 0
+	cbz	w26, .L1330
+	.loc 1 2498 0
+	cbnz	w0, .L1327
+	.loc 1 2500 0
+	mov	w0, 1
+	str	w0, [x19, 64]
+	.loc 1 2499 0
+	mov	w0, 21
+	str	w0, [x19, 40]
+.L1328:
+	.loc 1 2609 0
+	ldr	w0, [x25, 468]
+	cbz	w0, .L1435
+.L1370:
+	.loc 1 2672 0
+	ldr	w0, [x25, 52]
+	.loc 1 2666 0
+	mov	w20, 1
+.LVL1407:
+	.loc 1 2672 0
+	cbnz	w0, .L1626
+.L1389:
+.LVL1408:
+.L1386:
+	.loc 1 2677 0
+	ldr	w0, [x25, 252]
+.LVL1409:
+	sub	w0, w0, #3
+	cmp	w0, 1
+	bls	.L1627
+.L1391:
+	.loc 1 2681 0
+	ldr	w0, [x19, 40]
+	sub	w1, w0, #7
+	.loc 1 2680 0
+	cmp	w1, 1
+	bls	.L1628
+.L1392:
+	.loc 1 2695 0
+	sub	w0, w0, #2
+	.loc 1 2694 0
+	cmp	w0, 14
+	bhi	.L1394
+	ldr	x0, [x25, 216]
+.LBB2375:
+.LBB2376:
+	.loc 1 2288 0
+	ldr	w1, [x25, 28]
+	ldr	x4, [x19, 16]
+	cmp	w1, 0
+	ldr	x5, [x0, 16]
+	add	w0, w1, 7
+	csel	w0, w0, w1, lt
+	asr	w0, w0, 3
+	cmp	w0, 0
+	ble	.L1396
+	.loc 1 2292 0
+	ldr	x2, [x4]
+	ldr	x1, [x5]
+	cmp	x2, x1
+	bne	.L1394
+	sub	w1, w0, #1
+	mov	x0, 8
+	add	x1, x1, 1
+	lsl	x1, x1, 3
+	b	.L1398
+.L1399:
+	.loc 1 2289 0
+	ldr	x3, [x4, x0]
+	add	x0, x0, 8
+	.loc 1 2290 0
+	add	x2, x5, x0
+	.loc 1 2292 0
+	ldr	x2, [x2, -8]
+	cmp	x3, x2
+	bne	.L1394
+.L1398:
+	.loc 1 2288 0
+	cmp	x1, x0
+	bne	.L1399
+.L1396:
+.LBE2376:
+.LBE2375:
+	.loc 1 2697 0
+	ldr	x0, [x25, 104]
+	adrp	x1, .LC118
+	add	x1, x1, :lo12:.LC118
+	bl	_dev_info
+.LVL1410:
+	.loc 1 2699 0
+	str	x19, [x25, 224]
+	ldr	w0, [x19, 40]
+	.loc 1 2784 0
+	cmp	w0, 20
+	bne	.L1413
+.LVL1411:
+.L1643:
+	.loc 1 2785 0
+	mov	w0, 1
+	str	w0, [x25, 592]
+	.loc 1 2787 0
+	ldr	x0, [x25, 104]
+	adrp	x1, .LC121
+	.loc 1 2786 0
+	str	wzr, [x25, 612]
+	.loc 1 2787 0
+	add	x1, x1, :lo12:.LC121
+	bl	_dev_info
+.LVL1412:
+	.loc 1 2797 0
+	ldr	w0, [x25, 468]
+	cbz	w0, .L1416
+.L1645:
+	.loc 1 2798 0
+	ldr	x0, [x25, 216]
+	bl	ebc_buf_release
+.LVL1413:
+	b	.L1417
+.L1327:
+	.loc 1 2501 0
+	ldr	w1, [x19, 40]
+	cmp	w1, 16
+	bne	.L1329
+	.loc 1 2502 0
+	mov	w1, 21
+	str	w1, [x19, 40]
+.L1330:
+	.loc 1 2510 0
+	cmp	w0, 1
+	beq	.L1331
+	.loc 1 2511 0
+	ldr	w1, [x25, 596]
+	cbnz	w1, .L1332
+	.loc 1 2511 0 is_stmt 0 discriminator 1
+	ldr	w1, [x25, 252]
+	cmp	w1, 4
+	beq	.L1629
+.L1331:
+	.loc 1 2609 0 is_stmt 1
+	ldr	w0, [x25, 468]
+	cbnz	w0, .L1436
+.L1435:
+	.loc 1 2610 0
+	str	x19, [x25, 216]
+.L1436:
+	.loc 1 2612 0
+	ldr	w2, [x19, 40]
+	cmp	w2, 11
+	bgt	.L1367
+	cmp	w2, 7
+	bge	.L1442
+	cmp	w2, 0
+	beq	.L1369
+	blt	.L1366
+	cmp	w2, 2
+	bge	.L1370
+.L1366:
+	.loc 1 2775 0
+	ldr	x0, [x25, 104]
+	adrp	x1, .LC120
+	add	x1, x1, :lo12:.LC120
+	.loc 1 2778 0
+	mov	w26, 0
+	.loc 1 2775 0
+	bl	_dev_err
+.LVL1414:
+	.loc 1 2776 0
+	mov	x0, x19
+	bl	ebc_buf_release
+.LVL1415:
+	.loc 1 2778 0
+	b	.L1255
+.LVL1416:
+.L1306:
+	.loc 1 2403 0
+	adrp	x0, .LANCHOR0
+	add	x0, x0, :lo12:.LANCHOR0
+	ldr	x0, [x0, 8]
+	bl	wake_up_process
+.LVL1417:
+	b	.L1308
+.L1614:
+	.loc 1 2378 0 discriminator 1
+	ldr	w0, [x25, 52]
+	cbz	w0, .L1263
+	.loc 1 2380 0
+	ldr	x0, [x25, 104]
+	adrp	x1, .LC103
+	add	x1, x1, :lo12:.LC103
+	bl	_dev_info
+.LVL1418:
+.LBB2377:
+	.loc 1 2381 0
+	ldr	w0, [x25, 52]
+	cbnz	w0, .L1630
+.L1266:
+.LVL1419:
+.L1264:
+.LBE2377:
+	.loc 1 2382 0 discriminator 11
+	ldr	x0, [x25, 104]
+.LVL1420:
+	adrp	x1, .LC104
+	add	x1, x1, :lo12:.LC104
+	bl	_dev_info
+.LVL1421:
+	b	.L1263
+.L1312:
+	.loc 1 2452 0
+	ldr	w0, [x0, 40]
+	cmp	w0, 18
+	beq	.L1631
+	.loc 1 2462 0
+	cmp	w0, 19
+	beq	.L1632
+	.loc 1 2477 0
+	cmp	w0, 20
+	beq	.L1633
+	.loc 1 2485 0
+	adrp	x0, .LANCHOR0
+	add	x0, x0, :lo12:.LANCHOR0
+	ldr	w1, [x0, 32]
+	cbz	w1, .L1314
+	.loc 1 2486 0
+	ldr	w1, [x0, 36]
+	cmp	w1, 5
+	add	w1, w1, 1
+	str	w1, [x0, 36]
+	ble	.L1325
+	.loc 1 2487 0
+	str	wzr, [x0, 32]
+.L1325:
+	.loc 1 2488 0
+	ldr	w1, [x24, 220]
+	ldr	x0, [x19, 16]
+	bl	check_black_percent.isra.11
+.LVL1422:
+	cbz	w0, .L1314
+.L1591:
+	.loc 1 2552 0
+	mov	x0, x19
+.L1592:
+	bl	ebc_buf_release
+.LVL1423:
+	.loc 1 2554 0
+	b	.L1255
+.LVL1424:
+.L1617:
+	.loc 1 2395 0
+	mov	x0, x24
+	bl	ebc_power_set.constprop.15
+.LVL1425:
+	b	.L1307
+.L1613:
+	.loc 1 2376 0
+	ldr	x0, [x25, 216]
+	ldrsw	x2, [x25, 28]
+	ldr	x1, [x0, 16]
+	ldr	x0, [x25, 160]
+	bl	memcpy
+.LVL1426:
+	.loc 1 2377 0
+	ldr	x0, [x25, 224]
+	ldrsw	x2, [x25, 28]
+	ldr	x1, [x0, 16]
+	ldr	x0, [x25, 152]
+	bl	memcpy
+.LVL1427:
+	b	.L1263
+.L1313:
+	.loc 1 2418 0
+	adrp	x2, .LANCHOR0
+	add	x20, x2, :lo12:.LANCHOR0
+.LVL1428:
+	ldr	w2, [x20, 32]
+	cbz	w2, .L1315
+	.loc 1 2419 0
+	ldr	w0, [x20, 36]
+	cmp	w0, 5
+	add	w0, w0, 1
+	str	w0, [x20, 36]
+	ble	.L1325
+	.loc 1 2420 0
+	str	wzr, [x20, 32]
+	b	.L1325
+.LVL1429:
+.L1332:
+	.loc 1 2512 0
+	ldr	w1, [x25, 252]
+	sub	w2, w1, #1
+	cmp	w2, 1
+	bls	.L1634
+	.loc 1 2515 0
+	cmp	w1, 3
+	beq	.L1635
+.L1333:
+	.loc 1 2521 0
+	cbnz	w0, .L1339
+.L1649:
+	.loc 1 2522 0
+	ldr	w3, [x25, 88]
+	.loc 1 2523 0
+	sub	w0, w3, #1
+	.loc 1 2522 0
+	cmp	w0, 99
+	bhi	.L1340
+.LBB2380:
+	.loc 1 2524 0
+	ldr	x0, [x25, 216]
+	ldr	w2, [x24, 220]
+	ldr	x1, [x0, 16]
+	ldr	x0, [x19, 16]
+	bl	check_diff_percent.isra.12
+.LVL1430:
+	.loc 1 2525 0
+	cmp	w0, 2
+	beq	.L1636
+.L1340:
+.LBE2380:
+	.loc 1 2540 0
+	bl	ebc_get_dsp_list_enum_num
+.LVL1431:
+	mov	w26, w0
+	cbnz	w0, .L1637
+	.loc 1 2545 0
+	ldr	w2, [x25, 248]
+	cmp	w2, 0
+	ble	.L1339
+	.loc 1 2547 0
+	ldr	x0, [x25, 104]
+	adrp	x1, .LC112
+	.loc 1 2546 0
+	str	wzr, [x25, 100]
+	.loc 1 2547 0
+	add	x1, x1, :lo12:.LC112
+	bl	_dev_info
+.LVL1432:
+.LBB2381:
+.LBB2382:
+.LBB2383:
+	.file 17 "./include/linux/jiffies.h"
+	.loc 17 368 0
+	ldr	w0, [x25, 248]
+	bl	__msecs_to_jiffies
+.LVL1433:
+.LBE2383:
+.LBE2382:
+.LBB2384:
+	.loc 1 2548 0
+	ldr	w1, [x25, 100]
+	cmp	w1, 0
+	cset	w1, ne
+.LVL1434:
+	cmp	x0, 0
+	cset	w0, eq
+	tst	w1, w0
+	beq	.L1638
+.L1344:
+.LVL1435:
+.L1342:
+.LBE2384:
+.LBE2381:
+	.loc 1 2550 0 discriminator 17
+	bl	ebc_get_dsp_list_enum_num
+.LVL1436:
+	cbnz	w0, .L1593
+.L1339:
+	ldr	w1, [x19, 40]
+	sub	w1, w1, #12
+	cmp	w1, 11
+	bhi	.L1639
+	adrp	x0, .LANCHOR3
+	add	x0, x0, :lo12:.LANCHOR3
+	add	x0, x0, 56
+	ldr	w1, [x0, w1, uxtw 2]
+	.loc 1 2560 0
+	ldr	w0, [x25, 144]
+	cmp	w0, 7
+	beq	.L1640
+.LVL1437:
+	cmp	w1, 12
+	cset	w2, eq
+	.loc 1 2561 0
+	cmp	w0, 1
+	beq	.L1641
+.L1437:
+	.loc 1 2562 0
+	cmp	w0, 2
+	cset	w0, eq
+	tst	w2, w0
+	bne	.L1347
+.L1350:
+	.loc 1 2576 0
+	mov	w0, 4
+	.loc 1 2577 0
+	str	x19, [x25, 224]
+	.loc 1 2576 0
+	str	w0, [x25, 252]
+	.loc 1 2578 0
+	mov	x5, x25
+	ldr	x0, [x25, 152]
+	ldr	x1, [x25, 16]
+.LVL1438:
+	ldp	x3, x4, [x25, 168]
+	ldr	x2, [x19, 16]
+	bl	refresh_new_image
+.LVL1439:
+	.loc 1 2584 0
+	ldr	w0, [x25, 52]
+	cbz	w0, .L1642
+	.loc 1 2594 0
+	ldr	x0, [x25, 224]
+	ldr	w0, [x0, 40]
+	.loc 1 2596 0
+	cmp	w0, 0
+	.loc 1 2595 0
+	sub	w1, w0, #22
+	.loc 1 2596 0
+	ccmp	w1, 1, 0, ne
+	bhi	.L1438
+.L1365:
+	.loc 1 2784 0
+	cmp	w0, 20
+	beq	.L1643
+.L1413:
+	.loc 1 2788 0
+	cmp	w0, 18
+	beq	.L1644
+.L1414:
+	.loc 1 2797 0
+	ldr	w0, [x25, 468]
+	cbnz	w0, .L1645
+.L1416:
+	.loc 1 2800 0
+	mov	w0, 1
+	str	w0, [x25, 468]
+.L1417:
+	.loc 1 2802 0
+	ldr	x0, [x25, 224]
+	mov	w26, 0
+	str	x0, [x25, 216]
+	b	.L1255
+.L1329:
+	.loc 1 2503 0
+	cmp	w0, 2
+	bne	.L1330
+	.loc 1 2505 0
+	mov	w0, 1
+	str	w0, [x19, 64]
+	.loc 1 2504 0
+	mov	w0, 4
+	str	w0, [x19, 40]
+	b	.L1328
+.LVL1440:
+.L1315:
+	.loc 1 2426 0
+	ldr	x2, [x25, 584]
+	cbz	x2, .L1314
+	.loc 1 2427 0
+	cmp	w1, 19
+	bne	.L1592
+	.loc 1 2428 0
+	str	wzr, [x25, 584]
+	.loc 1 2429 0
+	mov	x0, 3
+	bl	ebc_notify
+.LVL1441:
+	.loc 1 2430 0
+	ldr	x0, [x25, 104]
+	adrp	x1, .LC106
+	add	x1, x1, :lo12:.LC106
+	bl	_dev_info
+.LVL1442:
+	.loc 1 2431 0
+	ldr	w0, [x25, 608]
+	cbz	w0, .L1314
+	.loc 1 2432 0
+	mov	w0, 1
+	.loc 1 2434 0
+	ldr	w1, [x24, 220]
+	.loc 1 2433 0
+	stp	w0, wzr, [x20, 32]
+	.loc 1 2434 0
+	ldr	x0, [x19, 16]
+	bl	check_black_percent.isra.11
+.LVL1443:
+	cbz	w0, .L1314
+	b	.L1587
+.LVL1444:
+	.p2align 3
+.L1639:
+	.loc 1 2560 0
+	ldr	w0, [x25, 144]
+	cmp	w0, 7
+	beq	.L1347
+	.loc 1 2561 0
+	mov	w2, 1
+	cmp	w0, 1
+	bne	.L1437
+.LVL1445:
+.L1347:
+	.loc 1 2563 0
+	ldr	w0, [x25, 52]
+	cbz	w0, .L1350
+.L1668:
+	.loc 1 2564 0
+	ldr	x0, [x25, 104]
+	adrp	x1, .LC103
+.LVL1446:
+	add	x1, x1, :lo12:.LC103
+	bl	_dev_info
+.LVL1447:
+.LBB2392:
+	.loc 1 2565 0
+	ldr	w0, [x25, 52]
+	cbnz	w0, .L1646
+.L1354:
+.LVL1448:
+.L1352:
+.LBE2392:
+	.loc 1 2566 0 discriminator 11
+	bl	ebc_get_dsp_list_enum_num
+.LVL1449:
+	cbz	w0, .L1356
+	.loc 1 2566 0 is_stmt 0 discriminator 1
+	ldr	w26, [x19, 64]
+.LVL1450:
+	cbz	w26, .L1593
+.L1356:
+	.loc 1 2572 0 is_stmt 1
+	ldr	x0, [x25, 104]
+	adrp	x1, .LC104
+	add	x1, x1, :lo12:.LC104
+	bl	_dev_info
+.LVL1451:
+	b	.L1350
+.LVL1452:
+.L1610:
+.LBB2395:
+.LBB2312:
+	.loc 1 2808 0
+	mov	w1, 0
+	add	x0, x29, 112
+	bl	init_wait_entry
+.LVL1453:
+.LBB2307:
+	ldr	x20, [x29, 104]
+.LVL1454:
+	mov	w2, 1
+	add	x1, x29, 112
+	mov	x0, x20
+	bl	prepare_to_wait_event
+.LVL1455:
+.LBB2301:
+	ldr	w1, [x25, 100]
+.LBE2301:
+.LBE2307:
+	mov	x19, 60
+.LBB2308:
+.LBB2302:
+	mov	w2, 0
+	cmp	w1, 0
+	cset	w1, ne
+.LVL1456:
+.L1422:
+.LBE2302:
+	.loc 1 2808 0 is_stmt 0 discriminator 9
+	orr	w1, w1, w2
+.LVL1457:
+	cbnz	w1, .L1421
+.LVL1458:
+	.loc 1 2808 0 discriminator 11
+	cbnz	x0, .L1420
+	.loc 1 2808 0 discriminator 13
+	mov	x0, x19
+.LVL1459:
+	bl	schedule_timeout
+.LVL1460:
+	mov	w2, 1
+	mov	x19, x0
+	add	x1, x29, 112
+	mov	x0, x20
+	bl	prepare_to_wait_event
+.LVL1461:
+.LBB2303:
+	ldr	w1, [x25, 100]
+	cmp	w1, 0
+	cset	w1, ne
+.LVL1462:
+	cmp	x19, 0
+	cset	w2, eq
+	tst	w1, w2
+	beq	.L1422
+.L1421:
+.LBE2303:
+.LBE2308:
+	.loc 1 2808 0
+	ldr	x0, [x29, 104]
+	add	x1, x29, 112
+.LVL1463:
+	bl	finish_wait
+.LVL1464:
+.L1420:
+.LBE2312:
+.LBE2395:
+	.loc 1 2809 0 is_stmt 1 discriminator 16
+	ldr	w0, [x25, 100]
+.LVL1465:
+	cbnz	w0, .L1255
+	.loc 1 2816 0
+	ldr	w0, [x25, 52]
+	cmp	w0, 1
+	bne	.L1424
+.LBB2396:
+.LBB2397:
+	.loc 1 2817 0 discriminator 3
+	mov	w1, 0
+	add	x0, x29, 112
+	bl	init_wait_entry
+.LVL1466:
+.LBB2398:
+	ldr	x0, [x29, 104]
+	add	x1, x29, 112
+	mov	w2, 1
+	bl	prepare_to_wait_event
+.LVL1467:
+	ldr	w1, [x25, 52]
+	cbz	w1, .L1425
+.L1647:
+	.loc 1 2817 0 is_stmt 0 discriminator 7
+	ldr	w1, [x25, 100]
+	cbnz	w1, .L1425
+.LVL1468:
+	.loc 1 2817 0 discriminator 9
+	cbnz	x0, .L1426
+	.loc 1 2817 0 discriminator 11
+	bl	schedule
+.LVL1469:
+	ldr	x0, [x29, 104]
+	add	x1, x29, 112
+	mov	w2, 1
+	bl	prepare_to_wait_event
+.LVL1470:
+	ldr	w1, [x25, 52]
+	cbnz	w1, .L1647
+.L1425:
+.LBE2398:
+	.loc 1 2817 0 discriminator 8
+	ldr	x0, [x29, 104]
+	add	x1, x29, 112
+	bl	finish_wait
+.LVL1471:
+.L1426:
+.LBE2397:
+.LBE2396:
+	.loc 1 2819 0 is_stmt 1 discriminator 14
+	bl	ebc_get_dsp_list_enum_num
+.LVL1472:
+	cbnz	w0, .L1255
+	.loc 1 2819 0 is_stmt 0 discriminator 1
+	bl	ebc_get_osd_list_enum_num
+.LVL1473:
+	cbnz	w0, .L1255
+	.loc 1 2821 0 is_stmt 1
+	ldr	w0, [x25, 52]
+	cbnz	w0, .L1429
+.L1604:
+	.loc 1 2828 0
+	ldr	w0, [x25, 200]
+	cmp	w0, 1
+	bne	.L1429
+.LBB2399:
+.LBB2400:
+	mov	w1, 0
+	mov	x0, x24
+	bl	ebc_power_set.part.7
+.LVL1474:
+.L1429:
+.LBE2400:
+.LBE2399:
+	.loc 1 2831 0
+	ldr	w0, [x25, 100]
+	cbnz	w0, .L1431
+.LBB2401:
+.LBB2402:
+	.loc 1 2832 0 discriminator 1
+	mov	w1, 0
+	add	x0, x29, 112
+	bl	init_wait_entry
+.LVL1475:
+.L1434:
+.LBB2403:
+	.loc 1 2832 0 is_stmt 0 discriminator 9
+	ldr	x0, [x29, 104]
+	add	x1, x29, 112
+	mov	w2, 1
+	bl	prepare_to_wait_event
+.LVL1476:
+	ldr	w1, [x25, 100]
+	cbnz	w1, .L1432
+.LVL1477:
+	.loc 1 2832 0 discriminator 5
+	cbnz	x0, .L1431
+	.loc 1 2832 0 discriminator 7
+	bl	schedule
+.LVL1478:
+.LBE2403:
+	b	.L1434
+.LVL1479:
+	.p2align 3
+.L1442:
+.LBE2402:
+.LBE2401:
+	.loc 1 2672 0 is_stmt 1
+	ldr	w0, [x25, 52]
+	.loc 1 2612 0
+	mov	w20, 0
+.LVL1480:
+	.loc 1 2672 0
+	cbz	w0, .L1386
+.L1626:
+	.loc 1 2673 0
+	ldr	x0, [x25, 104]
+	adrp	x1, .LC117
+	add	x1, x1, :lo12:.LC117
+	bl	_dev_info
+.LVL1481:
+.LBB2405:
+	.loc 1 2674 0
+	ldr	w0, [x25, 52]
+	cbz	w0, .L1386
+.LBB2406:
+	.loc 1 2674 0 is_stmt 0 discriminator 1
+	mov	w1, 0
+	add	x0, x29, 112
+	bl	init_wait_entry
+.LVL1482:
+	b	.L1390
+.L1648:
+.LVL1483:
+.LBB2407:
+	.loc 1 2674 0 discriminator 5
+	cbnz	x0, .L1386
+	.loc 1 2674 0 discriminator 7
+	bl	schedule
+.LVL1484:
+.L1390:
+	.loc 1 2674 0 discriminator 9
+	ldr	x0, [x29, 104]
+	add	x1, x29, 112
+	mov	w2, 1
+	bl	prepare_to_wait_event
+.LVL1485:
+	ldr	w1, [x25, 52]
+	cbnz	w1, .L1648
+.LBE2407:
+	.loc 1 2674 0 discriminator 4
+	ldr	x0, [x29, 104]
+	add	x1, x29, 112
+	bl	finish_wait
+.LVL1486:
+	b	.L1386
+.LVL1487:
+	.p2align 3
+.L1629:
+.LBE2406:
+.LBE2405:
+	.loc 1 2511 0 is_stmt 1 discriminator 2
+	ldr	w1, [x25, 52]
+	cbz	w1, .L1331
+	.loc 1 2521 0
+	cbnz	w0, .L1339
+	b	.L1649
+.L1635:
+	.loc 1 2515 0 discriminator 1
+	ldr	w1, [x25, 52]
+	cbz	w1, .L1333
+	.loc 1 2517 0
+	ldr	x0, [x25, 104]
+	adrp	x1, .LC103
+	add	x1, x1, :lo12:.LC103
+	bl	_dev_info
+.LVL1488:
+.LBB2408:
+	.loc 1 2518 0
+	ldr	w0, [x25, 52]
+	cbnz	w0, .L1650
+.L1337:
+.LVL1489:
+.L1335:
+.LBE2408:
+	.loc 1 2519 0 discriminator 11
+	ldr	x0, [x25, 104]
+.LVL1490:
+	adrp	x1, .LC104
+	add	x1, x1, :lo12:.LC104
+	bl	_dev_info
+.LVL1491:
+	ldr	w0, [x19, 64]
+	.loc 1 2521 0 discriminator 11
+	cbnz	w0, .L1339
+	b	.L1649
+.LVL1492:
+.L1628:
+	.loc 1 2682 0
+	ldr	w3, [x25, 88]
+	.loc 1 2683 0
+	sub	w1, w3, #1
+	cmp	w1, 99
+	bhi	.L1392
+.LBB2411:
+	.loc 1 2684 0
+	ldr	x0, [x25, 216]
+	ldr	w2, [x24, 220]
+	ldr	x1, [x0, 16]
+	ldr	x0, [x19, 16]
+	bl	check_diff_percent.isra.12
+.LVL1493:
+	mov	w21, w0
+	.loc 1 2685 0
+	cbz	w0, .L1396
+	.loc 1 2690 0
+	cmp	w0, 2
+	beq	.L1598
+.L1394:
+.LBE2411:
+	.loc 1 2705 0
+	cbnz	w20, .L1443
+	.loc 1 2709 0
+	ldr	w0, [x25, 84]
+	.loc 1 2704 0
+	mov	w21, 1
+	.loc 1 2709 0
+	cmp	w0, 0
+	ble	.L1395
+	.loc 1 2710 0
+	ldr	w1, [x29, 100]
+.LVL1494:
+	add	w1, w1, w21
+.LVL1495:
+	str	w1, [x29, 100]
+	.loc 1 2711 0
+	cmp	w0, w1
+	ble	.L1651
+.LVL1496:
+.L1395:
+	.loc 1 2718 0
+	ldr	w0, [x25, 200]
+	cbz	w0, .L1652
+.L1400:
+	.loc 1 2721 0
+	ldr	w1, [x19, 40]
+.LVL1497:
+	mov	x0, x24
+	bl	ebc_lut_update
+.LVL1498:
+	.loc 1 2723 0
+	ldr	w0, [x19, 64]
+	cbnz	w0, .L1401
+	.loc 1 2725 0
+	bl	ebc_get_dsp_list_enum_num
+.LVL1499:
+	cbnz	w0, .L1602
+	.loc 1 2739 0
+	ldr	w0, [x19, 40]
+	.loc 1 2741 0
+	and	w1, w0, -3
+	cmp	w1, 16
+	ccmp	w0, 20, 4, ne
+	beq	.L1401
+	.loc 1 2742 0
+	ldr	w2, [x25, 248]
+	cmp	w2, 0
+	ble	.L1401
+	.loc 1 2743 0
+	ldr	x0, [x25, 104]
+	adrp	x1, .LC112
+	add	x1, x1, :lo12:.LC112
+	bl	_dev_info
+.LVL1500:
+.LBB2412:
+.LBB2413:
+.LBB2414:
+	.loc 17 368 0
+	ldr	w0, [x25, 248]
+	bl	__msecs_to_jiffies
+.LVL1501:
+.LBE2414:
+.LBE2413:
+.LBB2415:
+	.loc 1 2744 0
+	ldr	w1, [x25, 596]
+	cmp	w1, 0
+	cset	w1, ne
+.LVL1502:
+	cmp	x0, 0
+	cset	w0, eq
+	tst	w1, w0
+	bne	.L1404
+.LBE2415:
+	.loc 1 2744 0 is_stmt 0 discriminator 3
+	orr	w1, w1, w0
+.LVL1503:
+	cbnz	w1, .L1404
+.LBB2416:
+.LBB2417:
+.LBB2418:
+	.loc 17 368 0 is_stmt 1 discriminator 4
+	ldr	w0, [x25, 248]
+	bl	__msecs_to_jiffies
+.LVL1504:
+	mov	x20, x0
+.LVL1505:
+.LBE2418:
+.LBE2417:
+	.loc 1 2744 0 discriminator 4
+	mov	w1, 0
+	add	x0, x29, 112
+	bl	init_wait_entry
+.LVL1506:
+.L1407:
+.LBB2419:
+	.loc 1 2744 0 is_stmt 0 discriminator 15
+	ldr	x0, [x29, 104]
+	mov	w2, 1
+	add	x1, x29, 112
+	bl	prepare_to_wait_event
+.LVL1507:
+.LBB2420:
+	ldr	w1, [x25, 596]
+	cmp	w1, 0
+	cset	w1, ne
+.LVL1508:
+	cmp	x20, 0
+	cset	w2, eq
+	tst	w1, w2
+	beq	.L1653
+.L1405:
+.LBE2420:
+.LBE2419:
+	.loc 1 2744 0 discriminator 10
+	ldr	x0, [x29, 104]
+	add	x1, x29, 112
+.LVL1509:
+	bl	finish_wait
+.LVL1510:
+.L1406:
+.L1404:
+.LBE2416:
+.LBE2412:
+	.loc 1 2746 0 is_stmt 1 discriminator 17
+	bl	ebc_get_dsp_list_enum_num
+.LVL1511:
+	cbnz	w0, .L1602
+.L1401:
+	.loc 1 2765 0
+	ldr	w3, [x25, 112]
+	.loc 1 2766 0
+	adrp	x1, .LC119
+	.loc 1 2765 0
+	strb	w3, [x25, 56]
+	.loc 1 2766 0
+	add	x1, x1, :lo12:.LC119
+	.loc 1 2764 0
+	str	x19, [x25, 224]
+	.loc 1 2766 0
+	and	w3, w3, 255
+	ldr	x0, [x25, 104]
+	.loc 1 2770 0
+	adrp	x20, jiffies
+.LVL1512:
+	.loc 1 2766 0
+	ldr	w2, [x19, 40]
+	.loc 1 2770 0
+	add	x19, x24, 720
+	.loc 1 2766 0
+	bl	_dev_info
+.LVL1513:
+	.loc 1 2768 0
+	str	w21, [x25, 252]
+	.loc 1 2767 0
+	mov	w0, 1
+	str	w0, [x25, 52]
+	.loc 1 2769 0
+	mov	x0, x24
+	bl	ebc_frame_start
+.LVL1514:
+	.loc 1 2770 0
+	ldr	x1, [x20, #:lo12:jiffies]
+	mov	x0, x19
+	add	x1, x1, 900
+	bl	mod_timer
+.LVL1515:
+.LBB2423:
+	.loc 1 2771 0
+	ldr	w0, [x25, 52]
+	cbnz	w0, .L1654
+.L1411:
+.LVL1516:
+.L1409:
+.LBE2423:
+	.loc 1 2772 0 discriminator 11
+	ldr	x2, [x20, #:lo12:jiffies]
+	mov	x0, x19
+.LVL1517:
+	mov	x1, 402653184
+	add	x1, x2, x1
+	bl	mod_timer
+.LVL1518:
+	ldr	x0, [x25, 224]
+	ldr	w0, [x0, 40]
+	.loc 1 2773 0 discriminator 11
+	b	.L1365
+.LVL1519:
+.L1443:
+	.loc 1 2718 0
+	ldr	w0, [x25, 200]
+	.loc 1 2708 0
+	mov	w21, 2
+	.loc 1 2706 0
+	str	wzr, [x29, 100]
+	.loc 1 2718 0
+	cbnz	w0, .L1400
+.LVL1520:
+.L1652:
+	.loc 1 2719 0
+	mov	x0, x24
+	bl	ebc_power_set.constprop.15
+.LVL1521:
+	b	.L1400
+.LVL1522:
+.L1367:
+	.loc 1 2612 0
+	cmp	w2, 21
+	ble	.L1370
+	cmp	w2, 23
+	bgt	.L1366
+.L1369:
+	.loc 1 2617 0
+	ldr	w0, [x25, 252]
+	.loc 1 2616 0
+	str	x19, [x25, 224]
+	.loc 1 2617 0
+	sub	w1, w0, #1
+	cmp	w1, 1
+	bls	.L1655
+	.loc 1 2620 0
+	cmp	w0, 4
+	beq	.L1656
+	.loc 1 2626 0
+	ldr	x0, [x25, 216]
+	ldr	w1, [x19, 40]
+	ldr	w0, [x0, 40]
+	cmp	w1, w0
+	beq	.L1374
+	.loc 1 2626 0 is_stmt 0 discriminator 1
+	ldr	w0, [x25, 52]
+	cbnz	w0, .L1657
+.L1381:
+.L1374:
+	.loc 1 2633 0 is_stmt 1
+	ldr	x1, [x19, 16]
+	mov	x3, x25
+	ldr	x0, [x25, 152]
+	ldr	x2, [x25, 168]
+	bl	refresh_new_image_auto
+.LVL1523:
+.L1372:
+	.loc 1 2639 0
+	ldr	w0, [x25, 52]
+	.loc 1 2638 0
+	mov	w1, 3
+	str	w1, [x25, 252]
+	.loc 1 2639 0
+	cbnz	w0, .L1599
+	.loc 1 2640 0
+	mov	w0, 1
+	str	w0, [x25, 52]
+	.loc 1 2641 0
+	ldr	w0, [x25, 200]
+	cbz	w0, .L1658
+.L1384:
+	.loc 1 2643 0
+	ldr	w1, [x19, 40]
+	mov	x0, x24
+	bl	ebc_lut_update
+.LVL1524:
+	.loc 1 2645 0
+	ldr	w1, [x25, 112]
+	.loc 1 2647 0
+	ldr	x0, [x25, 104]
+	.loc 1 2645 0
+	strb	w1, [x25, 56]
+	.loc 1 2647 0
+	and	w2, w1, 255
+	.loc 1 2646 0
+	lsr	w1, w1, 8
+	strb	w1, [x25, 57]
+	.loc 1 2647 0
+	adrp	x1, .LC116
+	add	x1, x1, :lo12:.LC116
+	bl	_dev_info
+.LVL1525:
+	.loc 1 2648 0
+	mov	x0, x24
+	bl	ebc_frame_start
+.LVL1526:
+.L1599:
+	ldr	x0, [x25, 224]
+	ldr	w0, [x0, 40]
+	b	.L1365
+.L1631:
+	.loc 1 2453 0
+	ldr	x0, [x25, 104]
+	adrp	x1, .LC107
+	add	x1, x1, :lo12:.LC107
+	bl	_dev_info
+.LVL1527:
+	.loc 1 2454 0
+	ldr	w0, [x25, 584]
+	cbnz	w0, .L1320
+	.loc 1 2455 0
+	mov	x0, 2
+	bl	ebc_notify
+.LVL1528:
+.L1320:
+	.loc 1 2457 0
+	mov	w0, 1
+	str	w0, [x25, 584]
+.L1590:
+	.loc 1 2456 0
+	adrp	x1, .LANCHOR0
+	add	x1, x1, :lo12:.LANCHOR0
+	.loc 1 2458 0
+	str	wzr, [x25, 612]
+	.loc 1 2459 0
+	mov	x0, x19
+	.loc 1 2456 0
+	str	wzr, [x1, 32]
+	.loc 1 2552 0
+	bl	ebc_buf_release
+.LVL1529:
+	b	.L1255
+.L1630:
+.LBB2426:
+.LBB2378:
+	.loc 1 2381 0 discriminator 1
+	mov	w1, 0
+	add	x0, x29, 112
+	bl	init_wait_entry
+.LVL1530:
+	ldr	x20, [x29, 104]
+.LVL1531:
+	b	.L1267
+.L1659:
+.LVL1532:
+.LBB2379:
+	.loc 1 2381 0 is_stmt 0 discriminator 5
+	cbnz	x0, .L1264
+	.loc 1 2381 0 discriminator 7
+	bl	schedule
+.LVL1533:
+.L1267:
+	.loc 1 2381 0 discriminator 9
+	add	x1, x29, 112
+	mov	w2, 1
+	mov	x0, x20
+	bl	prepare_to_wait_event
+.LVL1534:
+	ldr	w1, [x25, 52]
+	cbnz	w1, .L1659
+.LBE2379:
+	.loc 1 2381 0 discriminator 4
+	ldr	x0, [x29, 104]
+	add	x1, x29, 112
+	bl	finish_wait
+.LVL1535:
+	b	.L1264
+.L1654:
+.LBE2378:
+.LBE2426:
+.LBB2427:
+.LBB2424:
+	.loc 1 2771 0 is_stmt 1 discriminator 1
+	mov	w1, 0
+	add	x0, x29, 112
+	bl	init_wait_entry
+.LVL1536:
+	b	.L1412
+.L1660:
+.LVL1537:
+.LBB2425:
+	.loc 1 2771 0 is_stmt 0 discriminator 5
+	cbnz	x0, .L1409
+	.loc 1 2771 0 discriminator 7
+	bl	schedule
+.LVL1538:
+.L1412:
+	.loc 1 2771 0 discriminator 9
+	ldr	x0, [x29, 104]
+	add	x1, x29, 112
+	mov	w2, 1
+	bl	prepare_to_wait_event
+.LVL1539:
+	ldr	w1, [x25, 52]
+	cbnz	w1, .L1660
+.LBE2425:
+	.loc 1 2771 0 discriminator 4
+	ldr	x0, [x29, 104]
+	add	x1, x29, 112
+	bl	finish_wait
+.LVL1540:
+	b	.L1409
+.LVL1541:
+.L1602:
+.LBE2424:
+.LBE2427:
+	.loc 1 2747 0 is_stmt 1
+	ldr	w0, [x19, 40]
+	sub	w0, w0, #19
+	tst	w0, -3
+	beq	.L1594
+	.loc 1 2753 0
+	ldr	w26, [x19, 64]
+.LVL1542:
+	cbnz	w26, .L1401
+.LVL1543:
+.L1593:
+	.loc 1 2551 0
+	ldr	x0, [x25, 104]
+	adrp	x1, .LC111
+	add	x1, x1, :lo12:.LC111
+	bl	_dev_info
+.LVL1544:
+	.loc 1 2552 0
+	mov	x0, x19
+	b	.L1592
+.L1642:
+	.loc 1 2585 0
+	mov	w0, 1
+	str	w0, [x25, 52]
+	.loc 1 2588 0
+	mov	x0, x24
+	ldr	w1, [x19, 40]
+	bl	ebc_lut_update
+.LVL1545:
+	.loc 1 2589 0
+	ldr	w3, [x25, 112]
+	.loc 1 2591 0
+	adrp	x1, .LC113
+	ldr	x2, [x25, 224]
+	add	x1, x1, :lo12:.LC113
+	.loc 1 2589 0
+	strb	w3, [x25, 56]
+	.loc 1 2590 0
+	lsr	w4, w3, 8
+	strb	w4, [x25, 57]
+	.loc 1 2591 0
+	ldr	x0, [x25, 104]
+	and	w3, w3, 255
+	ldr	w2, [x2, 40]
+	bl	_dev_info
+.LVL1546:
+.LBB2428:
+.LBB2429:
+	.loc 1 1595 0
+	ldr	w0, [x27, 164]
+	.loc 1 1596 0
+	mov	w6, 1
+	ldp	x1, x2, [x25, 152]
+	ldp	x3, x4, [x25, 168]
+	.loc 1 1595 0
+	cbz	w0, .L1358
+	.loc 1 1596 0
+	ldr	x0, [x25, 184]
+	mov	x5, x25
+	bl	get_overlay_image2
+.LVL1547:
+	.loc 1 1611 0
+	ldr	w0, [x25, 60]
+	cbz	w0, .L1360
+.L1665:
+	.loc 1 1612 0
+	ldr	w0, [x25, 200]
+	cbz	w0, .L1661
+.L1361:
+	.loc 1 1614 0
+	ldr	w0, [x27, 164]
+	.loc 1 1615 0
+	mov	w6, 1
+	ldp	x1, x2, [x25, 152]
+	ldp	x3, x4, [x25, 168]
+	.loc 1 1614 0
+	cbz	w0, .L1362
+	.loc 1 1615 0
+	ldr	x0, [x25, 192]
+	mov	x5, x25
+	bl	get_overlay_image2
+.LVL1548:
+.L1363:
+.LBB2430:
+.LBB2431:
+	.loc 1 1586 0
+	str	wzr, [x27, 72]
+	.loc 1 1587 0
+	mov	x0, x27
+	ldr	w1, [x24, 224]
+	bl	flip.isra.4
+.LVL1549:
+.L1364:
+.LBE2431:
+.LBE2430:
+.LBE2429:
+.LBE2428:
+	.loc 1 2594 0
+	ldr	x0, [x25, 224]
+	ldr	w0, [x0, 40]
+	.loc 1 2596 0
+	cmp	w0, 0
+	.loc 1 2595 0
+	sub	w1, w0, #22
+	.loc 1 2596 0
+	ccmp	w1, 1, 0, ne
+	bls	.L1365
+	.loc 1 2597 0
+	ldr	w1, [x25, 52]
+	cbz	w1, .L1365
+.L1438:
+	.loc 1 2600 0
+	ldr	x0, [x25, 104]
+	adrp	x1, .LC115
+	.loc 1 2599 0
+	str	wzr, [x25, 600]
+	.loc 1 2600 0
+	add	x1, x1, :lo12:.LC115
+	bl	_dev_info
+.LVL1550:
+	.loc 1 2601 0
+	ldrb	w1, [x25, 56]
+	lsl	w0, w1, 3
+	sub	w0, w0, w1
+.LBB2435:
+.LBB2436:
+	.loc 17 368 0
+	lsl	w0, w0, 1
+	bl	__msecs_to_jiffies
+.LVL1551:
+.LBE2436:
+.LBE2435:
+	.loc 1 2601 0
+	adrp	x1, jiffies
+	ldr	x1, [x1, #:lo12:jiffies]
+	add	x1, x1, x0
+	add	x0, x24, 664
+	bl	mod_timer
+.LVL1552:
+	ldr	x0, [x25, 224]
+	ldr	w0, [x0, 40]
+	b	.L1365
+.L1644:
+	.loc 1 2789 0
+	ldr	x0, [x25, 104]
+	adrp	x1, .LC122
+	add	x1, x1, :lo12:.LC122
+	bl	_dev_info
+.LVL1553:
+	.loc 1 2790 0
+	ldr	w0, [x25, 584]
+	cbz	w0, .L1662
+	.loc 1 2793 0
+	adrp	x0, .LANCHOR0
+	add	x0, x0, :lo12:.LANCHOR0
+	.loc 1 2792 0
+	mov	w1, 1
+	.loc 1 2794 0
+	str	wzr, [x25, 612]
+	.loc 1 2792 0
+	str	w1, [x25, 584]
+	.loc 1 2793 0
+	str	wzr, [x0, 32]
+	b	.L1414
+.L1633:
+	.loc 1 2478 0
+	ldr	x0, [x25, 104]
+	adrp	x1, .LC109
+	add	x1, x1, :lo12:.LC109
+	bl	_dev_info
+.LVL1554:
+	.loc 1 2480 0
+	mov	w0, 1
+	str	w0, [x25, 592]
+	b	.L1590
+.L1632:
+	.loc 1 2463 0
+	ldr	x0, [x25, 104]
+	adrp	x1, .LC108
+	add	x1, x1, :lo12:.LC108
+	bl	_dev_info
+.LVL1555:
+	.loc 1 2464 0
+	ldr	w0, [x25, 584]
+	cmp	w0, 1
+	beq	.L1663
+.L1322:
+	.loc 1 2467 0
+	ldr	w0, [x25, 608]
+	.loc 1 2466 0
+	str	wzr, [x25, 584]
+	.loc 1 2467 0
+	cbz	w0, .L1591
+	.loc 1 2468 0
+	adrp	x0, .LANCHOR0
+	add	x0, x0, :lo12:.LANCHOR0
+	mov	w1, 1
+	.loc 1 2469 0
+	stp	w1, w1, [x0, 32]
+	.loc 1 2552 0
+	mov	x0, x19
+	b	.L1592
+.LVL1556:
+.L1611:
+.LBB2437:
+.LBB2438:
+	mov	w1, 0
+	mov	x0, x24
+	bl	ebc_power_set.part.7
+.LVL1557:
+	b	.L1257
+.LVL1558:
+.L1662:
+.LBE2438:
+.LBE2437:
+	.loc 1 2791 0
+	mov	x0, 2
+	bl	ebc_notify
+.LVL1559:
+	.loc 1 2793 0
+	adrp	x0, .LANCHOR0
+	add	x0, x0, :lo12:.LANCHOR0
+	.loc 1 2792 0
+	mov	w1, 1
+	.loc 1 2794 0
+	str	wzr, [x25, 612]
+	.loc 1 2792 0
+	str	w1, [x25, 584]
+	.loc 1 2793 0
+	str	wzr, [x0, 32]
+	b	.L1414
+.LVL1560:
+.L1651:
+	.loc 1 2712 0
+	mov	w21, 2
+.LVL1561:
+.L1598:
+	str	w21, [x19, 40]
+	.loc 1 2713 0
+	str	wzr, [x29, 100]
+	b	.L1395
+.LVL1562:
+.L1638:
+.LBB2439:
+	.loc 1 2548 0 discriminator 3
+	orr	w1, w1, w0
+.LVL1563:
+	cbnz	w1, .L1342
+.LBB2385:
+.LBB2386:
+.LBB2387:
+	.loc 17 368 0 discriminator 4
+	ldr	w0, [x25, 248]
+	bl	__msecs_to_jiffies
+.LVL1564:
+	mov	x20, x0
+.LVL1565:
+.LBE2387:
+.LBE2386:
+	.loc 1 2548 0 discriminator 4
+	mov	w1, 0
+	add	x0, x29, 112
+	bl	init_wait_entry
+.LVL1566:
+.L1345:
+.LBB2388:
+	.loc 1 2548 0 is_stmt 0 discriminator 15
+	ldr	x0, [x29, 104]
+	mov	w2, 1
+	add	x1, x29, 112
+	bl	prepare_to_wait_event
+.LVL1567:
+.LBB2389:
+	ldr	w1, [x25, 100]
+	cmp	w1, 0
+	cset	w1, ne
+.LVL1568:
+	cmp	x20, 0
+	cset	w2, eq
+	tst	w1, w2
+	beq	.L1664
+.L1343:
+.LBE2389:
+.LBE2388:
+	.loc 1 2548 0 discriminator 10
+	ldr	x0, [x29, 104]
+	add	x1, x29, 112
+.LVL1569:
+	bl	finish_wait
+.LVL1570:
+	b	.L1342
+.LVL1571:
+	.p2align 3
+.L1358:
+.LBE2385:
+.LBE2439:
+.LBB2440:
+.LBB2432:
+	.loc 1 1604 0 is_stmt 1
+	ldr	x0, [x25, 184]
+	mov	x5, x25
+	bl	get_overlay_image
+.LVL1572:
+	.loc 1 1611 0
+	ldr	w0, [x25, 60]
+	cbnz	w0, .L1665
+.L1360:
+	.loc 1 1633 0
+	mov	w0, 1
+	str	w0, [x25, 600]
+	.loc 1 1634 0
+	ldr	x0, [x25, 104]
+	adrp	x2, .LANCHOR3
+	.loc 1 1632 0
+	str	wzr, [x25, 52]
+	.loc 1 1634 0
+	add	x2, x2, :lo12:.LANCHOR3
+	add	x2, x2, 104
+	adrp	x1, .LC114
+	add	x1, x1, :lo12:.LC114
+	bl	_dev_info
+.LVL1573:
+	b	.L1364
+.L1658:
+.LBE2432:
+.LBE2440:
+	.loc 1 2642 0
+	mov	x0, x24
+	bl	ebc_power_set.constprop.15
+.LVL1574:
+	b	.L1384
+.L1657:
+	.loc 1 2628 0
+	ldr	x0, [x25, 104]
+	adrp	x1, .LC103
+	add	x1, x1, :lo12:.LC103
+	bl	_dev_info
+.LVL1575:
+.LBB2441:
+	.loc 1 2629 0
+	ldr	w0, [x25, 52]
+	cbnz	w0, .L1666
+.L1377:
+.LVL1576:
+.L1375:
+.LBE2441:
+	.loc 1 2624 0 discriminator 11
+	ldr	x0, [x25, 104]
+.LVL1577:
+	adrp	x1, .LC104
+	add	x1, x1, :lo12:.LC104
+	bl	_dev_info
+.LVL1578:
+.L1597:
+	.loc 1 2625 0 discriminator 11
+	ldr	x0, [x25, 224]
+	ldrsw	x2, [x25, 28]
+	ldr	x1, [x0, 16]
+	ldr	x0, [x25, 152]
+	bl	memcpy
+.LVL1579:
+	b	.L1372
+.L1636:
+.LBB2444:
+	.loc 1 2527 0
+	mov	w0, 1
+	str	w0, [x19, 64]
+	.loc 1 2526 0
+	mov	w0, 21
+	str	w0, [x19, 40]
+	.loc 1 2528 0
+	bl	ebc_get_dsp_list_enum_num
+.LVL1580:
+	cbz	w0, .L1331
+.L1594:
+	.loc 1 2530 0
+	ldr	x0, [x25, 104]
+	adrp	x1, .LC110
+	add	x1, x1, :lo12:.LC110
+	bl	_dev_info
+.LVL1581:
+.L1587:
+	.loc 1 2531 0
+	mov	x0, x19
+	.loc 1 2529 0
+	mov	w26, 1
+	.loc 1 2531 0
+	bl	ebc_buf_release
+.LVL1582:
+	.loc 1 2533 0
+	b	.L1255
+.LVL1583:
+	.p2align 3
+.L1664:
+.LBE2444:
+.LBB2445:
+.LBB2391:
+.LBB2390:
+	.loc 1 2548 0 discriminator 9
+	orr	w1, w1, w2
+.LVL1584:
+	cbnz	w1, .L1343
+.LVL1585:
+	.loc 1 2548 0 is_stmt 0 discriminator 11
+	cbnz	x0, .L1342
+	.loc 1 2548 0 discriminator 13
+	mov	x0, x20
+.LVL1586:
+	bl	schedule_timeout
+.LVL1587:
+	mov	x20, x0
+.LBE2390:
+	b	.L1345
+.LVL1588:
+.L1634:
+.LBE2391:
+.LBE2445:
+	.loc 1 2513 0 is_stmt 1
+	ldr	x0, [x25, 216]
+	ldrsw	x2, [x25, 28]
+	ldr	x1, [x0, 16]
+	ldr	x0, [x25, 160]
+	bl	memcpy
+.LVL1589:
+	.loc 1 2514 0
+	ldr	x0, [x25, 224]
+	ldrsw	x2, [x25, 28]
+	ldr	x1, [x0, 16]
+	ldr	x0, [x25, 152]
+	bl	memcpy
+.LVL1590:
+	ldr	w0, [x19, 64]
+	.loc 1 2521 0
+	cbnz	w0, .L1339
+	b	.L1649
+.LVL1591:
+.L1637:
+	.loc 1 2541 0
+	ldr	x0, [x25, 104]
+.LVL1592:
+	adrp	x1, .LC111
+	add	x1, x1, :lo12:.LC111
+	.loc 1 2544 0
+	mov	w26, 0
+	.loc 1 2541 0
+	bl	_dev_info
+.LVL1593:
+	.loc 1 2542 0
+	mov	x0, x19
+	bl	ebc_buf_release
+.LVL1594:
+	.loc 1 2544 0
+	b	.L1255
+.L1656:
+	.loc 1 2620 0 discriminator 1
+	ldr	w0, [x25, 52]
+	cbz	w0, .L1374
+	.loc 1 2622 0
+	ldr	x0, [x25, 104]
+	adrp	x1, .LC103
+	add	x1, x1, :lo12:.LC103
+	bl	_dev_info
+.LVL1595:
+.LBB2446:
+	.loc 1 2623 0
+	ldr	w0, [x25, 52]
+	cbz	w0, .L1375
+.LBB2447:
+	.loc 1 2623 0 is_stmt 0 discriminator 1
+	mov	w1, 0
+	add	x0, x29, 112
+	bl	init_wait_entry
+.LVL1596:
+	b	.L1378
+	.p2align 3
+.L1667:
+.LVL1597:
+.LBB2448:
+	.loc 1 2623 0 discriminator 5
+	cbnz	x0, .L1375
+	.loc 1 2623 0 discriminator 7
+	bl	schedule
+.LVL1598:
+.L1378:
+	.loc 1 2623 0 discriminator 9
+	ldr	x0, [x29, 104]
+	add	x1, x29, 112
+	mov	w2, 1
+	bl	prepare_to_wait_event
+.LVL1599:
+	ldr	w1, [x25, 52]
+	cbnz	w1, .L1667
+.L1376:
+.LBE2448:
+	.loc 1 2623 0 discriminator 4
+	ldr	x0, [x29, 104]
+	add	x1, x29, 112
+	bl	finish_wait
+.LVL1600:
+	b	.L1375
+	.p2align 3
+.L1655:
+.LBE2447:
+.LBE2446:
+	.loc 1 2618 0 is_stmt 1
+	ldr	x0, [x25, 216]
+	ldrsw	x2, [x25, 28]
+	ldr	x1, [x0, 16]
+	ldr	x0, [x25, 160]
+	bl	memcpy
+.LVL1601:
+	b	.L1597
+.LVL1602:
+.L1627:
+	.loc 1 2678 0
+	ldr	x0, [x25, 216]
+	ldrsw	x2, [x25, 28]
+	ldr	x1, [x25, 160]
+	ldr	x0, [x0, 16]
+	bl	memcpy
+.LVL1603:
+	b	.L1391
+.LVL1604:
+.L1641:
+	.loc 1 2561 0 discriminator 1
+	cmp	w1, 7
+	ccmp	w1, 1, 4, ne
+	beq	.L1350
+	b	.L1347
+.LVL1605:
+	.p2align 3
+.L1640:
+	.loc 1 2560 0 discriminator 1
+	cmp	w1, 7
+	beq	.L1350
+	.loc 1 2563 0
+	ldr	w0, [x25, 52]
+	cbz	w0, .L1350
+	b	.L1668
+.LVL1606:
+	.p2align 3
+.L1362:
+.LBB2449:
+.LBB2433:
+	.loc 1 1623 0
+	ldr	x0, [x25, 192]
+	mov	x5, x25
+	bl	get_overlay_image
+.LVL1607:
+	b	.L1363
+.LVL1608:
+.L1653:
+.LBE2433:
+.LBE2449:
+.LBB2450:
+.LBB2422:
+.LBB2421:
+	.loc 1 2744 0 discriminator 9
+	orr	w1, w1, w2
+.LVL1609:
+	cbnz	w1, .L1405
+.LVL1610:
+	.loc 1 2744 0 is_stmt 0 discriminator 11
+	cbnz	x0, .L1404
+	.loc 1 2744 0 discriminator 13
+	mov	x0, x20
+.LVL1611:
+	bl	schedule_timeout
+.LVL1612:
+	mov	x20, x0
+.LBE2421:
+	b	.L1407
+.LVL1613:
+.L1650:
+.LBE2422:
+.LBE2450:
+.LBB2451:
+.LBB2409:
+	.loc 1 2518 0 is_stmt 1 discriminator 1
+	mov	w1, 0
+	add	x0, x29, 112
+	bl	init_wait_entry
+.LVL1614:
+.LBB2410:
+	ldr	x0, [x29, 104]
+	add	x1, x29, 112
+	mov	w2, 1
+	bl	prepare_to_wait_event
+.LVL1615:
+	ldr	w1, [x25, 52]
+	cbz	w1, .L1336
+.L1669:
+.LVL1616:
+	.loc 1 2518 0 is_stmt 0 discriminator 5
+	cbnz	x0, .L1335
+	.loc 1 2518 0 discriminator 7
+	bl	schedule
+.LVL1617:
+	ldr	x0, [x29, 104]
+	add	x1, x29, 112
+	mov	w2, 1
+	bl	prepare_to_wait_event
+.LVL1618:
+	ldr	w1, [x25, 52]
+	cbnz	w1, .L1669
+.L1336:
+.LBE2410:
+	.loc 1 2518 0 discriminator 4
+	ldr	x0, [x29, 104]
+	add	x1, x29, 112
+	bl	finish_wait
+.LVL1619:
+	b	.L1335
+.LVL1620:
+.L1612:
+.LBE2409:
+.LBE2451:
+	.loc 1 2838 0 is_stmt 1
+	bl	__stack_chk_fail
+.LVL1621:
+.L1666:
+.LBB2452:
+.LBB2442:
+	.loc 1 2629 0 discriminator 1
+	mov	w1, 0
+	add	x0, x29, 112
+	bl	init_wait_entry
+.LVL1622:
+.LBB2443:
+	ldr	x0, [x29, 104]
+	add	x1, x29, 112
+	mov	w2, 1
+	bl	prepare_to_wait_event
+.LVL1623:
+	ldr	w1, [x25, 52]
+	cbz	w1, .L1376
+.L1670:
+.LVL1624:
+	.loc 1 2629 0 is_stmt 0 discriminator 5
+	cbnz	x0, .L1375
+	.loc 1 2629 0 discriminator 7
+	bl	schedule
+.LVL1625:
+	ldr	x0, [x29, 104]
+	add	x1, x29, 112
+	mov	w2, 1
+	bl	prepare_to_wait_event
+.LVL1626:
+	ldr	w1, [x25, 52]
+	cbnz	w1, .L1670
+	b	.L1376
+.LVL1627:
+.L1424:
+.LBE2443:
+.LBE2442:
+.LBE2452:
+	.loc 1 2826 0 is_stmt 1
+	bl	ebc_get_dsp_list_enum_num
+.LVL1628:
+	cbnz	w0, .L1255
+	.loc 1 2826 0 is_stmt 0 discriminator 1
+	bl	ebc_get_osd_list_enum_num
+.LVL1629:
+	cbnz	w0, .L1255
+	b	.L1604
+.LVL1630:
+.L1663:
+	.loc 1 2465 0 is_stmt 1
+	mov	x0, 3
+	bl	ebc_notify
+.LVL1631:
+	b	.L1322
+.L1646:
+.LBB2453:
+.LBB2393:
+	.loc 1 2565 0 discriminator 1
+	mov	w1, 0
+	add	x0, x29, 112
+	bl	init_wait_entry
+.LVL1632:
+	b	.L1355
+	.p2align 3
+.L1671:
+.LVL1633:
+.LBB2394:
+	.loc 1 2565 0 is_stmt 0 discriminator 5
+	cbnz	x0, .L1352
+	.loc 1 2565 0 discriminator 7
+	bl	schedule
+.LVL1634:
+.L1355:
+	.loc 1 2565 0 discriminator 9
+	ldr	x0, [x29, 104]
+	add	x1, x29, 112
+	mov	w2, 1
+	bl	prepare_to_wait_event
+.LVL1635:
+	ldr	w1, [x25, 52]
+	cbnz	w1, .L1671
+.LBE2394:
+	.loc 1 2565 0 discriminator 4
+	ldr	x0, [x29, 104]
+	add	x1, x29, 112
+	bl	finish_wait
+.LVL1636:
+	b	.L1352
+.L1661:
+.LBE2393:
+.LBE2453:
+.LBB2454:
+.LBB2434:
+	.loc 1 1613 0 is_stmt 1
+	mov	x0, x24
+	bl	ebc_power_set.constprop.15
+.LVL1637:
+	b	.L1361
+.LVL1638:
+.L1432:
+.LBE2434:
+.LBE2454:
+.LBB2455:
+.LBB2404:
+	.loc 1 2832 0 discriminator 4
+	ldr	x0, [x29, 104]
+	add	x1, x29, 112
+	bl	finish_wait
+.LVL1639:
+.LBE2404:
+.LBE2455:
+	.loc 1 2833 0 discriminator 4
+	str	wzr, [x25, 100]
+	b	.L1255
+	.cfi_endproc
+.LFE2844:
+	.size	ebc_thread, .-ebc_thread
+	.align	2
+	.p2align 3,,7
+	.type	ebc_auto_tast_function, %function
+ebc_auto_tast_function:
+.LFB2837:
+	.loc 1 1875 0
+	.cfi_startproc
+.LVL1640:
+	stp	x29, x30, [sp, -112]!
+	.cfi_def_cfa_offset 112
+	.cfi_offset 29, -112
+	.cfi_offset 30, -104
+	adrp	x0, __stack_chk_guard
+.LVL1641:
+	add	x0, x0, :lo12:__stack_chk_guard
+	add	x29, sp, 0
+	.cfi_def_cfa_register 29
+	stp	x25, x26, [sp, 64]
+	.cfi_offset 25, -48
+	.cfi_offset 26, -40
+	.loc 1 1876 0
+	adrp	x26, .LANCHOR0
+	.loc 1 1875 0
+	stp	x19, x20, [sp, 16]
+.LBB2456:
+.LBB2457:
+.LBB2458:
+	.loc 12 290 0
+	mov	x25, 2
+.LBE2458:
+.LBE2457:
+.LBE2456:
+	.loc 1 1875 0
+	stp	x21, x22, [sp, 32]
+	stp	x23, x24, [sp, 48]
+	.cfi_offset 19, -96
+	.cfi_offset 20, -88
+	.cfi_offset 21, -80
+	.cfi_offset 22, -72
+	.cfi_offset 23, -64
+	.cfi_offset 24, -56
+	adrp	x23, .LANCHOR1
+	stp	x27, x28, [sp, 80]
+	.cfi_offset 27, -32
+	.cfi_offset 28, -24
+	.loc 1 1886 0
+	add	x23, x23, :lo12:.LANCHOR1
+	.loc 1 1876 0
+	ldr	x22, [x26, #:lo12:.LANCHOR0]
+.LVL1642:
+	.loc 1 1886 0
+	add	x21, x23, 712
+	.loc 1 1875 0
+	ldr	x1, [x0]
+	str	x1, [x29, 104]
+	mov	x1,0
+	.loc 1 1888 0
+	add	x23, x23, 352
+	.loc 1 1877 0
+	add	x20, x22, 24
+	.loc 1 1878 0
+	add	x19, x22, 192
+	add	x28, x22, 720
+	adrp	x27, jiffies
+.LBB2463:
+.LBB2460:
+.LBB2461:
+	.loc 4 19 0
+#APP
+// 19 "./arch/arm64/include/asm/current.h" 1
+	mrs x24, sp_el0
+// 0 "" 2
+.LVL1643:
+#NO_APP
+	b	.L1696
+	.p2align 3
+.L1705:
+.LBE2461:
+.LBE2460:
+.LBE2463:
+	.loc 1 1894 0
+	cmp	w0, 4
+	beq	.L1675
+	cmp	w0, 1
+	beq	.L1704
+	.loc 1 2040 0
+	ldr	w1, [x19, 72]
+	.loc 1 2041 0
+	mov	x0, x20
+	.loc 1 2040 0
+	sub	w1, w1, #1
+	str	w1, [x19, 72]
+	.loc 1 2041 0
+	ldr	w1, [x22, 224]
+	bl	flip.isra.4
+.LVL1644:
+	.loc 1 2043 0
+	add	x0, x26, :lo12:.LANCHOR0
+	ldr	x0, [x0, 16]
+	bl	wake_up_process
+.LVL1645:
+	.loc 1 2045 0
+	ldr	w4, [x19, 72]
+	cbz	w4, .L1681
+	.loc 1 2047 0
+	ldr	w0, [x20, 164]
+	cbz	w0, .L1695
+	.loc 1 2048 0
+	ldrsw	x0, [x20, 72]
+	mov	w6, 2
+	.loc 1 2049 0
+	ldp	x2, x1, [x19, 216]
+	.loc 1 2048 0
+	add	x0, x19, x0, lsl 3
+	ldrb	w3, [x22, 248]
+	ldr	x5, [x22, 320]
+	ldr	x1, [x1, 16]
+	ldr	x0, [x0, 184]
+	ldr	x2, [x2, 16]
+	bl	direct_mode_data_change2.isra.3
+.LVL1646:
+	.p2align 2
+.L1681:
+	.loc 1 2061 0
+	mov	x0, x21
+	bl	up
+.LVL1647:
+	.loc 1 2062 0
+	bl	schedule
+.LVL1648:
+.L1696:
+	.loc 1 1886 0
+	mov	x0, x21
+	bl	down
+.LVL1649:
+	.loc 1 1888 0
+	mov	x0, x23
+	bl	down
+.LVL1650:
+.LBB2464:
+.LBB2462:
+.LBB2459:
+	.loc 12 290 0
+	str	x25, [x24, 32]
+.LBE2459:
+.LBE2462:
+.LBE2464:
+	.loc 1 1893 0
+#APP
+// 1893 "drivers/gpu/drm/rockchip/ebc-dev/ebc_dev.c" 1
+	dmb ish
+// 0 "" 2
+	.loc 1 1894 0
+#NO_APP
+	ldr	w0, [x19, 252]
+	cmp	w0, 3
+	bne	.L1705
+	.loc 1 1972 0
+	ldr	w0, [x19, 60]
+	.loc 1 1971 0
+	str	wzr, [x19, 68]
+	.loc 1 1972 0
+	cbnz	w0, .L1686
+	.loc 1 1972 0 is_stmt 0 discriminator 1
+	ldr	w0, [x19, 64]
+	cbz	w0, .L1687
+.L1686:
+	.loc 1 1973 0 is_stmt 1
+	ldr	w1, [x22, 224]
+	mov	x0, x20
+	bl	flip.isra.4
+.LVL1651:
+	.loc 1 1975 0
+	add	x0, x26, :lo12:.LANCHOR0
+	ldr	x0, [x0, 16]
+	bl	wake_up_process
+.LVL1652:
+	.loc 1 1977 0
+	ldr	w0, [x20, 164]
+	cbz	w0, .L1688
+	.loc 1 1978 0
+	ldrsw	x0, [x20, 72]
+	mov	w5, 2
+	ldp	x1, x2, [x19, 152]
+	mov	x4, x19
+	add	x0, x19, x0, lsl 3
+	ldr	x3, [x19, 168]
+	ldr	x0, [x0, 184]
+	bl	get_auto_image2
+.LVL1653:
+	b	.L1681
+	.p2align 3
+.L1704:
+	.loc 1 2019 0
+	ldr	w1, [x19, 72]
+	.loc 1 2020 0
+	mov	x0, x20
+	.loc 1 2019 0
+	sub	w1, w1, #1
+	str	w1, [x19, 72]
+	.loc 1 2020 0
+	ldr	w1, [x22, 224]
+	bl	flip.isra.4
+.LVL1654:
+	.loc 1 2022 0
+	add	x0, x26, :lo12:.LANCHOR0
+	ldr	x0, [x0, 16]
+	bl	wake_up_process
+.LVL1655:
+	.loc 1 2024 0
+	ldr	w4, [x19, 72]
+	cbz	w4, .L1681
+	.loc 1 2026 0
+	ldr	w0, [x20, 164]
+	cbz	w0, .L1693
+	.loc 1 2027 0
+	ldrsw	x0, [x20, 72]
+	mov	w6, 2
+	.loc 1 2028 0
+	ldp	x2, x1, [x19, 216]
+	.loc 1 2027 0
+	add	x0, x19, x0, lsl 3
+	ldrb	w3, [x22, 248]
+	ldr	x5, [x22, 320]
+	ldr	x1, [x1, 16]
+	ldr	x0, [x0, 184]
+	ldr	x2, [x2, 16]
+	bl	direct_mode_data_change_part2.isra.8
+.LVL1656:
+	b	.L1681
+	.p2align 3
+.L1675:
+	.loc 1 1896 0
+	ldr	w0, [x19, 76]
+	cbz	w0, .L1677
+	.loc 1 1899 0
+	ldr	w0, [x19, 60]
+	.loc 1 1898 0
+	str	wzr, [x19, 68]
+	.loc 1 1897 0
+	str	wzr, [x19, 76]
+	.loc 1 1899 0
+	cbnz	w0, .L1678
+	.loc 1 1899 0 is_stmt 0 discriminator 1
+	ldr	w0, [x19, 64]
+	cbz	w0, .L1679
+.L1678:
+	.loc 1 1900 0 is_stmt 1
+	ldr	w1, [x22, 224]
+	mov	x0, x20
+	bl	flip.isra.4
+.LVL1657:
+	.loc 1 1902 0
+	add	x0, x26, :lo12:.LANCHOR0
+	ldr	x0, [x0, 16]
+	bl	wake_up_process
+.LVL1658:
+	.loc 1 1904 0
+	ldr	w0, [x20, 164]
+	cbz	w0, .L1680
+	.loc 1 1905 0
+	ldrsw	x0, [x20, 72]
+	mov	w6, 2
+	ldp	x1, x2, [x19, 152]
+	mov	x5, x19
+	add	x0, x19, x0, lsl 3
+	ldp	x3, x4, [x19, 168]
+	ldr	x0, [x0, 184]
+	bl	get_overlay_image2
+.LVL1659:
+	b	.L1681
+	.p2align 3
+.L1688:
+	.loc 1 1985 0
+	ldrsw	x0, [x20, 72]
+	mov	w5, 2
+	ldp	x1, x2, [x19, 152]
+	mov	x4, x19
+	add	x0, x19, x0, lsl 3
+	ldr	x3, [x19, 168]
+	ldr	x0, [x0, 184]
+	bl	get_auto_image
+.LVL1660:
+	b	.L1681
+	.p2align 3
+.L1677:
+	.loc 1 1952 0
+	mov	x0, x23
+	bl	up
+.LVL1661:
+	.loc 1 1954 0
+	ldr	w0, [x20, 164]
+	cbz	w0, .L1685
+	.loc 1 1955 0
+	ldrsw	x0, [x20, 72]
+	mov	x4, x19
+	ldp	x1, x2, [x19, 152]
+	add	x0, x19, x0, lsl 3
+	ldr	x3, [x19, 168]
+	ldr	x0, [x0, 184]
+	bl	get_overlay_image_area2.isra.0
+.LVL1662:
+	b	.L1681
+	.p2align 3
+.L1680:
+	.loc 1 1913 0
+	ldrsw	x0, [x20, 72]
+	mov	w6, 2
+	ldp	x1, x2, [x19, 152]
+	mov	x5, x19
+	add	x0, x19, x0, lsl 3
+	ldp	x3, x4, [x19, 168]
+	ldr	x0, [x0, 184]
+	bl	get_overlay_image
+.LVL1663:
+	b	.L1681
+	.p2align 3
+.L1695:
+	.loc 1 2054 0
+	ldrsw	x0, [x20, 72]
+	mov	w6, 2
+	.loc 1 2055 0
+	ldp	x2, x1, [x19, 216]
+	.loc 1 2054 0
+	add	x0, x19, x0, lsl 3
+	ldrb	w3, [x22, 248]
+	ldr	x5, [x22, 320]
+	ldr	x1, [x1, 16]
+	ldr	x0, [x0, 184]
+	ldr	x2, [x2, 16]
+	bl	direct_mode_data_change.isra.2
+.LVL1664:
+	b	.L1681
+	.p2align 3
+.L1693:
+	.loc 1 2033 0
+	ldrsw	x0, [x20, 72]
+	mov	w6, 2
+	.loc 1 2034 0
+	ldp	x2, x1, [x19, 216]
+	.loc 1 2033 0
+	add	x0, x19, x0, lsl 3
+	ldrb	w3, [x22, 248]
+	ldr	x5, [x22, 320]
+	ldr	x1, [x1, 16]
+	ldr	x0, [x0, 184]
+	ldr	x2, [x2, 16]
+	bl	direct_mode_data_change_part.isra.9
+.LVL1665:
+	b	.L1681
+	.p2align 3
+.L1687:
+	.loc 1 1993 0
+	mov	x0, x23
+	bl	up
+.LVL1666:
+	.loc 1 1995 0
+	ldr	w0, [x19, 612]
+	cbz	w0, .L1706
+.L1689:
+	.loc 1 2000 0
+	ldr	w0, [x20, 164]
+	cbz	w0, .L1690
+	.loc 1 2001 0
+	ldrsw	x0, [x20, 72]
+	mov	w5, 1
+	ldp	x1, x2, [x19, 152]
+	mov	x4, x19
+	add	x0, x19, x0, lsl 3
+	ldr	x3, [x19, 168]
+	ldr	x0, [x0, 184]
+	bl	get_auto_image2
+.LVL1667:
+.L1691:
+	.loc 1 2014 0
+	mov	w0, 1
+	.loc 1 2015 0
+	ldr	x1, [x27, #:lo12:jiffies]
+	.loc 1 2014 0
+	str	w0, [x19, 68]
+	.loc 1 2015 0
+	mov	x0, x28
+	add	x1, x1, 1
+	bl	mod_timer
+.LVL1668:
+	b	.L1681
+	.p2align 3
+.L1679:
+	.loc 1 1922 0
+	mov	x0, x23
+	bl	up
+.LVL1669:
+	.loc 1 1924 0
+	ldr	w0, [x19, 612]
+	cbz	w0, .L1707
+.L1682:
+	.loc 1 1931 0
+	ldr	w0, [x20, 164]
+	cbz	w0, .L1683
+	.loc 1 1932 0
+	ldrsw	x0, [x20, 72]
+	mov	w6, 1
+	ldp	x1, x2, [x19, 152]
+	mov	x5, x19
+	add	x0, x19, x0, lsl 3
+	ldp	x3, x4, [x19, 168]
+	ldr	x0, [x0, 184]
+	bl	get_overlay_image2
+.LVL1670:
+	b	.L1691
+	.p2align 3
+.L1685:
+	.loc 1 1962 0
+	ldrsw	x0, [x20, 72]
+	mov	x5, x19
+	ldp	x1, x2, [x19, 152]
+	add	x0, x19, x0, lsl 3
+	ldp	x3, x4, [x19, 168]
+	ldr	x0, [x0, 184]
+	bl	get_overlay_image_area
+.LVL1671:
+	b	.L1681
+	.p2align 3
+.L1690:
+	.loc 1 2008 0
+	ldrsw	x0, [x20, 72]
+	mov	w5, 1
+	ldp	x1, x2, [x19, 152]
+	mov	x4, x19
+	add	x0, x19, x0, lsl 3
+	ldr	x3, [x19, 168]
+	ldr	x0, [x0, 184]
+	bl	get_auto_image
+.LVL1672:
+	b	.L1691
+	.p2align 3
+.L1683:
+	.loc 1 1940 0
+	ldrsw	x0, [x20, 72]
+	mov	w6, 1
+	ldp	x1, x2, [x19, 152]
+	mov	x5, x19
+	add	x0, x19, x0, lsl 3
+	ldp	x3, x4, [x19, 168]
+	ldr	x0, [x0, 184]
+	bl	get_overlay_image
+.LVL1673:
+	b	.L1691
+	.p2align 3
+.L1706:
+	.loc 1 1997 0
+	ldr	x1, [x19, 224]
+	.loc 1 1996 0
+	mov	x3, x19
+	ldr	x0, [x19, 152]
+	ldr	x2, [x19, 168]
+	ldr	x1, [x1, 16]
+	bl	refresh_new_image_auto
+.LVL1674:
+	b	.L1689
+	.p2align 3
+.L1707:
+	.loc 1 1927 0
+	ldr	x2, [x19, 224]
+	.loc 1 1925 0
+	mov	x5, x19
+	ldr	x1, [x19, 16]
+	ldr	x0, [x19, 152]
+	ldp	x3, x4, [x19, 168]
+	ldr	x2, [x2, 16]
+	bl	refresh_new_image
+.LVL1675:
+	b	.L1682
+	.cfi_endproc
+.LFE2837:
+	.size	ebc_auto_tast_function, .-ebc_auto_tast_function
+	.data
+	.align	3
+	.set	.LANCHOR1,. + 0
+	.type	ebc_driver, %object
+	.size	ebc_driver, 224
+ebc_driver:
+	.xword	ebc_probe
+	.xword	ebc_remove
+	.zero	24
+	.xword	.LC123
+	.zero	32
+	.xword	ebc_match
+	.zero	64
+	.xword	ebc_pm
+	.zero	48
+	.zero	16
+	.type	ebc_misc, %object
+	.size	ebc_misc, 80
+ebc_misc:
+	.word	243
+	.zero	4
+	.xword	.LC66
+	.xword	ebc_ops
+	.zero	56
+	.type	ebc_thread_wq, %object
+	.size	ebc_thread_wq, 24
+ebc_thread_wq:
+	.word	0
+	.zero	4
+	.xword	ebc_thread_wq+8
+	.xword	ebc_thread_wq+8
+	.type	ebc_auto_assist_thread_sem, %object
+	.size	ebc_auto_assist_thread_sem, 24
+ebc_auto_assist_thread_sem:
+	.word	0
+	.word	1
+	.xword	ebc_auto_assist_thread_sem+8
+	.xword	ebc_auto_assist_thread_sem+8
+	.type	ebc_assist_finished_flag_sem, %object
+	.size	ebc_assist_finished_flag_sem, 24
+ebc_assist_finished_flag_sem:
+	.word	0
+	.word	1
+	.xword	ebc_assist_finished_flag_sem+8
+	.xword	ebc_assist_finished_flag_sem+8
+	.type	waveform_misc, %object
+	.size	waveform_misc, 80
+waveform_misc:
+	.word	244
+	.zero	4
+	.xword	.LC132
+	.xword	waveform_ops
+	.zero	56
+	.type	dev_attr_waveform_version, %object
+	.size	dev_attr_waveform_version, 32
+dev_attr_waveform_version:
+	.xword	.LC131
+	.hword	292
+	.zero	6
+	.xword	waveform_version_read
+	.xword	0
+	.type	dev_attr_pmic_name, %object
+	.size	dev_attr_pmic_name, 32
+dev_attr_pmic_name:
+	.xword	.LC130
+	.hword	292
+	.zero	6
+	.xword	pmic_name_read
+	.xword	0
+	.type	dev_attr_pmic_temp, %object
+	.size	dev_attr_pmic_temp, 32
+dev_attr_pmic_temp:
+	.xword	.LC129
+	.hword	292
+	.zero	6
+	.xword	pmic_temp_read
+	.xword	0
+	.type	dev_attr_pmic_vcom, %object
+	.size	dev_attr_pmic_vcom, 32
+dev_attr_pmic_vcom:
+	.xword	.LC128
+	.hword	420
+	.zero	6
+	.xword	pmic_vcom_read
+	.xword	pmic_vcom_write
+	.type	dev_attr_ebc_version, %object
+	.size	dev_attr_ebc_version, 32
+dev_attr_ebc_version:
+	.xword	.LC127
+	.hword	292
+	.zero	6
+	.xword	ebc_version_read
+	.xword	0
+	.type	dev_attr_ebc_state, %object
+	.size	dev_attr_ebc_state, 32
+dev_attr_ebc_state:
+	.xword	.LC126
+	.hword	292
+	.zero	6
+	.xword	ebc_state_read
+	.xword	0
+	.type	dev_attr_ebc_buf_state, %object
+	.size	dev_attr_ebc_buf_state, 32
+dev_attr_ebc_buf_state:
+	.xword	.LC125
+	.hword	292
+	.zero	6
+	.xword	ebc_buf_state_read
+	.xword	0
+	.type	dev_attr_auto_frame_state, %object
+	.size	dev_attr_auto_frame_state, 32
+dev_attr_auto_frame_state:
+	.xword	.LC124
+	.hword	292
+	.zero	6
+	.xword	auto_frame_state_read
+	.xword	0
+	.type	ebc_auto_thread_sem, %object
+	.size	ebc_auto_thread_sem, 24
+ebc_auto_thread_sem:
+	.word	0
+	.word	1
+	.xword	ebc_auto_thread_sem+8
+	.xword	ebc_auto_thread_sem+8
+	.bss
+	.align	3
+	.set	.LANCHOR0,. + 0
+	.type	global_ebc, %object
+	.size	global_ebc, 8
+global_ebc:
+	.zero	8
+	.type	ebc_auto_task, %object
+	.size	ebc_auto_task, 8
+ebc_auto_task:
+	.zero	8
+	.type	ebc_auto_assist_task, %object
+	.size	ebc_auto_assist_task, 8
+ebc_auto_assist_task:
+	.zero	8
+	.type	ebc_task, %object
+	.size	ebc_task, 8
+ebc_task:
+	.zero	8
+	.type	resume_count_start, %object
+	.size	resume_count_start, 4
+resume_count_start:
+	.zero	4
+	.type	resume_frame_count, %object
+	.size	resume_frame_count, 4
+resume_frame_count:
+	.zero	4
+	.section	.rodata
+	.align	3
+	.set	.LANCHOR2,. + 0
+	.type	__func__.35512, %object
+	.size	__func__.35512, 11
+__func__.35512:
+	.string	"ebc_io_ctl"
+	.align	3
+	.set	.LANCHOR3,. + 0
+	.type	__func__.35860, %object
+	.size	__func__.35860, 12
+__func__.35860:
+	.string	"ebc_suspend"
+	.zero	4
+	.type	__func__.35152, %object
+	.size	__func__.35152, 16
+__func__.35152:
+	.string	"ebc_frame_start"
+	.type	__func__.35784, %object
+	.size	__func__.35784, 19
+__func__.35784:
+	.string	"ebc_lut_table_init"
+	.zero	5
+	.type	CSWTCH.299, %object
+	.size	CSWTCH.299, 48
+CSWTCH.299:
+	.word	7
+	.word	7
+	.word	1
+	.word	2
+	.word	1
+	.word	12
+	.word	12
+	.word	12
+	.word	12
+	.word	12
+	.word	1
+	.word	2
+	.type	__func__.35145, %object
+	.size	__func__.35145, 27
+__func__.35145:
+	.string	"ebc_overlay_bg_frame_start"
+	.zero	5
+	.type	ebc_match, %object
+	.size	ebc_match, 400
+ebc_match:
+	.zero	64
+	.string	"rockchip,ebc-dev"
+	.zero	111
+	.zero	8
+	.zero	200
+	.type	ebc_pm, %object
+	.size	ebc_pm, 184
+ebc_pm:
+	.zero	16
+	.xword	ebc_suspend
+	.xword	ebc_resume
+	.zero	152
+	.type	waveform_ops, %object
+	.size	waveform_ops, 288
+waveform_ops:
+	.xword	0
+	.zero	80
+	.xword	waveform_mmap
+	.zero	8
+	.xword	waveform_open
+	.zero	176
+	.type	ebc_ops, %object
+	.size	ebc_ops, 288
+ebc_ops:
+	.xword	0
+	.zero	64
+	.xword	ebc_io_ctl
+	.xword	ebc_io_ctl
+	.xword	ebc_mmap
+	.zero	8
+	.xword	ebc_open
+	.zero	176
+	.section	.discard.addressable,"aw",@progbits
+	.align	3
+	.type	__addressable_ebc_init3831, %object
+	.size	__addressable_ebc_init3831, 8
+__addressable_ebc_init3831:
+	.xword	ebc_init
+	.section	.exitcall.exit,"aw",@progbits
+	.align	3
+	.type	__exitcall_ebc_exit, %object
+	.size	__exitcall_ebc_exit, 8
+__exitcall_ebc_exit:
+	.xword	ebc_exit
+	.section	.rodata.str1.8,"aMS",@progbits,1
+	.align	3
+.LC0:
+	.string	"device resume\n"
+	.zero	1
+.LC1:
+	.string	"ebc_frame_control_timeout, overlay_bg_update=1\n"
+.LC2:
+	.string	"%s: argp NULL\n"
+	.zero	1
+.LC3:
+	.string	"enable bg control\n"
+	.zero	5
+.LC4:
+	.string	"disable bg control\n"
+	.zero	4
+.LC5:
+	.string	"enable resume count\n"
+	.zero	3
+.LC6:
+	.string	"disable resume count\n"
+	.zero	2
+.LC7:
+	.string	"enable ebc overlay, you can use osd buf to show somthing over the system display\n"
+	.zero	6
+.LC8:
+	.string	"disable ebc overlay\n"
+	.zero	3
+.LC9:
+	.string	"EBC_SET_FULL_MODE_NUM failed\n"
+	.zero	2
+.LC10:
+	.string	"EBC_GET_BUFFER_INFO failed\n"
+	.zero	4
+.LC11:
+	.string	"EBC_SET_DIFF_PERCENT failed\n"
+	.zero	3
+.LC12:
+	.string	"EBC_WAIT_NEW_BUF_TIME failed\n"
+	.zero	2
+.LC13:
+	.string	"%s: unknow cmd\n"
+.LC14:
+	.string	"full_mode_num = %d\n"
+	.zero	4
+.LC15:
+	.string	"diff_percent = %d\n"
+	.zero	5
+.LC16:
+	.string	"waiting_new_buf_time = %d\n"
+	.zero	5
+.LC17:
+	.string	"overlay frame done\n"
+	.zero	4
+.LC18:
+	.string	"auto frame done\n"
+	.zero	7
+.LC19:
+	.string	"frame done\n"
+	.zero	4
+.LC20:
+	.string	"temperature = %d, out of range0~50 ,use 0 \n"
+	.zero	4
+.LC21:
+	.string	"temperature = %d, out of range0~50 ,use 50 \n"
+	.zero	3
+.LC22:
+	.string	"ebc_pmic_read_temp failed, ret = %d\n"
+	.zero	3
+.LC23:
+	.string	"lut update use temperature = %d\n"
+	.zero	7
+.LC24:
+	.string	"get lut data failed\n"
+	.zero	3
+.LC25:
+	.string	"%d\n"
+	.zero	4
+.LC26:
+	.string	"5.04_y8"
+.LC27:
+	.string	"%s\n"
+	.zero	4
+.LC28:
+	.string	"invalid value = %s\n"
+	.zero	4
+.LC29:
+	.string	"set vcom value failed\n"
+	.zero	1
+.LC30:
+	.string	"ebc hw power off\n"
+	.zero	6
+.LC31:
+	.string	"%s: device is busy now...\n"
+	.zero	5
+.LC32:
+	.string	"device suspend\n"
+.LC33:
+	.string	"%s: overlay no need to update\n"
+	.zero	1
+.LC34:
+	.string	"%s: auto no need to update\n"
+	.zero	4
+.LC35:
+	.string	"black point > 90percent, skip this frame\n"
+	.zero	6
+.LC36:
+	.string	"diff point > %d percent, force full\n"
+	.zero	3
+.LC37:
+	.string	"ebc_tcon"
+	.zero	7
+.LC38:
+	.string	"not find ebc tcon\n"
+	.zero	5
+.LC39:
+	.string	"pmic"
+	.zero	3
+.LC40:
+	.string	"wrong pmics number\n"
+	.zero	4
+.LC41:
+	.string	"not find pmic node\n"
+	.zero	4
+.LC42:
+	.string	"not find pmic i2c client\n"
+	.zero	6
+.LC43:
+	.string	"use pmic%d\n"
+	.zero	4
+.LC44:
+	.string	"get drvdata from pmic client failed\n"
+	.zero	3
+.LC45:
+	.string	"panel,width"
+	.zero	4
+.LC46:
+	.string	"panel,panel_color"
+	.zero	6
+.LC47:
+	.string	"panel,mirror"
+	.zero	3
+.LC48:
+	.string	"panel,width-mm"
+	.zero	1
+.LC49:
+	.string	"panel,height-mm"
+.LC50:
+	.string	"panel,disable_logo"
+	.zero	5
+.LC51:
+	.string	"panel,rearrange"
+.LC52:
+	.string	"too large resolution, not support\n"
+	.zero	5
+.LC53:
+	.string	"memory-region"
+	.zero	2
+.LC54:
+	.string	"Couldn't address to resource for reserved memory\n"
+	.zero	6
+.LC55:
+	.string	"reserved memory not enough, need %d\n"
+	.zero	3
+.LC56:
+	.string	"Couldn't remap for reserved memory\n"
+	.zero	4
+.LC57:
+	.string	"waveform-region"
+.LC58:
+	.string	"%s:%d: failed to get mem from reserved\n"
+.LC59:
+	.string	"Failed to read waveform from mem, we use waveform file from kernel file instead\n"
+	.zero	7
+.LC60:
+	.string	"Failed to read waveform file from kernel, no waveform!!!\n"
+	.zero	6
+.LC61:
+	.string	"failed to create ebc_task thread\n"
+	.zero	6
+.LC62:
+	.string	"ebc_taskup"
+	.zero	5
+.LC63:
+	.string	"failed to create ebc_taskup thread\n"
+	.zero	4
+.LC64:
+	.string	"use double thread calcu\n"
+	.zero	7
+.LC65:
+	.string	"ebc_thread"
+	.zero	5
+.LC66:
+	.string	"ebc"
+	.zero	4
+.LC67:
+	.string	"ulogo_addr="
+	.zero	4
+.LC68:
+	.string	"klogo_addr="
+	.zero	4
+.LC69:
+	.string	"ulogo_addr=0x%x"
+.LC70:
+	.string	"have ulogo display, ulogo addr = 0x%x\n"
+	.zero	1
+.LC71:
+	.string	"malloc ulogo buffer failed\n"
+	.zero	4
+.LC72:
+	.string	"klogo_addr=0x%x"
+.LC73:
+	.string	"need show klogo, klogo addr = 0x%x\n"
+	.zero	4
+.LC74:
+	.string	"malloc klogo buffer failed\n"
+	.zero	4
+.LC75:
+	.string	"no uboot logo, panel init\n"
+	.zero	5
+.LC76:
+	.string	"ebc_dev_reset"
+	.zero	2
+.LC77:
+	.string	"ebc_dev_logo"
+	.zero	3
+.LC78:
+	.string	"rockchip ebc driver %s probe success\n"
+	.zero	2
+.LC79:
+	.string	"panel,height"
+	.zero	3
+.LC80:
+	.string	"panel,vir_width"
+.LC81:
+	.string	"panel,vir_height"
+	.zero	7
+.LC82:
+	.string	"panel,sdck"
+	.zero	5
+.LC83:
+	.string	"panel,lsl"
+	.zero	6
+.LC84:
+	.string	"panel,lbl"
+	.zero	6
+.LC85:
+	.string	"panel,ldl"
+	.zero	6
+.LC86:
+	.string	"panel,lel"
+	.zero	6
+.LC87:
+	.string	"panel,gdck-sta"
+	.zero	1
+.LC88:
+	.string	"panel,lgonl"
+	.zero	4
+.LC89:
+	.string	"panel,fsl"
+	.zero	6
+.LC90:
+	.string	"panel,fbl"
+	.zero	6
+.LC91:
+	.string	"panel,fdl"
+	.zero	6
+.LC92:
+	.string	"panel,fel"
+	.zero	6
+.LC93:
+	.string	"panel,panel_16bit"
+	.zero	6
+.LC94:
+	.string	"buffer manage init failed\n"
+	.zero	5
+.LC95:
+	.string	"lut table init failed\n"
+	.zero	1
+.LC96:
+	.string	"ebc_task"
+	.zero	7
+.LC97:
+	.string	"failed to run ebc thread\n"
+	.zero	6
+.LC98:
+	.string	"task init failed\n"
+	.zero	6
+.LC99:
+	.string	"failed to probe panel: %d\n"
+	.zero	5
+.LC100:
+	.string	"0\n"
+	.zero	5
+.LC101:
+	.string	"ebc hw power on\n"
+	.zero	7
+.LC102:
+	.string	"ebc suspend, drop osd buf\n"
+	.zero	5
+.LC103:
+	.string	"ebc is busy now, waiting prev mode end...\n"
+	.zero	5
+.LC104:
+	.string	"prev refresh mode end\n"
+	.zero	1
+.LC105:
+	.string	"overlay mode start, frame_total=%d, bw_frame = %d\n"
+	.zero	5
+.LC106:
+	.string	"early resume\n"
+	.zero	2
+.LC107:
+	.string	"customer logo, early suspend\n"
+	.zero	2
+.LC108:
+	.string	"customer logo, early resume\n"
+	.zero	3
+.LC109:
+	.string	"customer logo, power off\n"
+	.zero	6
+.LC110:
+	.string	"have new frame, cancel this frame, force full next frame\n"
+	.zero	6
+.LC111:
+	.string	"have new frame, cancel this frame\n"
+	.zero	5
+.LC112:
+	.string	"waiting new frame %dms\n"
+.LC113:
+	.string	"frame start under overlay, mode = %d, framecount = %d\n"
+	.zero	1
+.LC114:
+	.string	"%s: overlay bg no need to update, overlay_bg_update=1\n"
+	.zero	1
+.LC115:
+	.string	"control bg update under overlay mode, overlay_bg_update=0\n"
+	.zero	5
+.LC116:
+	.string	"auto mode start, frame_total=%d\n"
+	.zero	7
+.LC117:
+	.string	"waiting prev mode end...\n"
+	.zero	6
+.LC118:
+	.string	"check_part_mode==0, no need refresh\n"
+	.zero	3
+.LC119:
+	.string	"frame start, mode = %d, framecount = %d\n"
+	.zero	7
+.LC120:
+	.string	"ebc buffer mode %d error!!!\n"
+	.zero	3
+.LC121:
+	.string	"power off\n"
+	.zero	5
+.LC122:
+	.string	"early suspend\n"
+	.zero	1
+.LC123:
+	.string	"ebc-dev"
+.LC124:
+	.string	"auto_frame_state"
+	.zero	7
+.LC125:
+	.string	"ebc_buf_state"
+	.zero	2
+.LC126:
+	.string	"ebc_state"
+	.zero	6
+.LC127:
+	.string	"ebc_version"
+	.zero	4
+.LC128:
+	.string	"pmic_vcom"
+	.zero	6
+.LC129:
+	.string	"pmic_temp"
+	.zero	6
+.LC130:
+	.string	"pmic_name"
+	.zero	6
+.LC131:
+	.string	"waveform_version"
+	.zero	7
+.LC132:
+	.string	"waveform"
+	.text
+.Letext0:
+	.file 18 "./include/uapi/asm-generic/int-ll64.h"
+	.file 19 "./include/asm-generic/int-ll64.h"
+	.file 20 "./include/uapi/asm-generic/posix_types.h"
+	.file 21 "./include/uapi/linux/types.h"
+	.file 22 "./include/linux/export.h"
+	.file 23 "./include/linux/types.h"
+	.file 24 "./arch/arm64/include/asm/insn.h"
+	.file 25 "./include/linux/init.h"
+	.file 26 "./arch/arm64/include/asm/alternative.h"
+	.file 27 "./include/asm-generic/atomic-long.h"
+	.file 28 "./arch/arm64/include/asm/cache.h"
+	.file 29 "./include/linux/printk.h"
+	.file 30 "./include/linux/fs.h"
+	.file 31 "./include/linux/kernel.h"
+	.file 32 "./include/linux/notifier.h"
+	.file 33 "./include/asm-generic/bug.h"
+	.file 34 "./include/linux/time64.h"
+	.file 35 "./include/uapi/linux/time.h"
+	.file 36 "./include/linux/restart_block.h"
+	.file 37 "./include/linux/compat_time.h"
+	.file 38 "./arch/arm64/include/asm/memory.h"
+	.file 39 "./arch/arm64/include/asm/thread_info.h"
+	.file 40 "./arch/arm64/include/asm/hwcap.h"
+	.file 41 "./arch/arm64/include/uapi/asm/ptrace.h"
+	.file 42 "./include/asm-generic/qspinlock_types.h"
+	.file 43 "./include/asm-generic/qrwlock_types.h"
+	.file 44 "./include/linux/lockdep.h"
+	.file 45 "./include/linux/spinlock_types.h"
+	.file 46 "./include/linux/rwlock_types.h"
+	.file 47 "./include/linux/jump_label.h"
+	.file 48 "./arch/arm64/include/asm/jump_label.h"
+	.file 49 "./arch/arm64/include/asm/cpufeature.h"
+	.file 50 "./include/asm-generic/sections.h"
+	.file 51 "./arch/arm64/include/asm/stack_pointer.h"
+	.file 52 "./arch/arm64/include/asm/sections.h"
+	.file 53 "./arch/arm64/include/asm/virt.h"
+	.file 54 "./arch/arm64/include/asm/processor.h"
+	.file 55 "./arch/arm64/include/asm/fpsimd.h"
+	.file 56 "./include/linux/sched/debug.h"
+	.file 57 "./include/linux/wait.h"
+	.file 58 "./include/linux/cpumask.h"
+	.file 59 "./include/linux/rcupdate.h"
+	.file 60 "./include/linux/list_bl.h"
+	.file 61 "./include/linux/seqlock.h"
+	.file 62 "./include/linux/lockref.h"
+	.file 63 "./include/linux/dcache.h"
+	.file 64 "./include/linux/path.h"
+	.file 65 "./include/linux/pid.h"
+	.file 66 "./include/linux/highuid.h"
+	.file 67 "./include/linux/uidgid.h"
+	.file 68 "./include/linux/osq_lock.h"
+	.file 69 "./include/linux/debug_locks.h"
+	.file 70 "./include/linux/mutex.h"
+	.file 71 "./include/linux/sched.h"
+	.file 72 "./include/linux/time.h"
+	.file 73 "./include/linux/llist.h"
+	.file 74 "./include/linux/smp.h"
+	.file 75 "./include/asm-generic/percpu.h"
+	.file 76 "./arch/arm64/include/asm/smp.h"
+	.file 77 "./include/clocksource/arm_arch_timer.h"
+	.file 78 "./arch/arm64/include/asm/arch_timer.h"
+	.file 79 "./include/linux/timex.h"
+	.file 80 "./include/linux/ktime.h"
+	.file 81 "./include/linux/timekeeping.h"
+	.file 82 "./include/linux/timer.h"
+	.file 83 "./include/linux/workqueue.h"
+	.file 84 "./include/linux/refcount.h"
+	.file 85 "./arch/arm64/include/asm/pgtable-types.h"
+	.file 86 "./include/asm-generic/pgtable-nop4d-hack.h"
+	.file 87 "./arch/arm64/include/asm/page.h"
+	.file 88 "./include/linux/mm_types.h"
+	.file 89 "./include/linux/plist.h"
+	.file 90 "./include/linux/rbtree.h"
+	.file 91 "./include/linux/percpu.h"
+	.file 92 "./include/linux/timerqueue.h"
+	.file 93 "./include/linux/hrtimer.h"
+	.file 94 "./include/linux/seccomp.h"
+	.file 95 "./include/linux/nodemask.h"
+	.file 96 "./include/uapi/asm-generic/signal.h"
+	.file 97 "./include/uapi/asm-generic/siginfo.h"
+	.file 98 "./include/linux/sched/user.h"
+	.file 99 "./include/linux/signal_types.h"
+	.file 100 "./include/linux/mm_types_task.h"
+	.file 101 "./include/linux/task_io_accounting.h"
+	.file 102 "./include/uapi/linux/rseq.h"
+	.file 103 "./include/linux/completion.h"
+	.file 104 "./include/linux/cred.h"
+	.file 105 "./include/linux/iocontext.h"
+	.file 106 "./include/linux/uprobes.h"
+	.file 107 "./include/linux/vmalloc.h"
+	.file 108 "./include/linux/stat.h"
+	.file 109 "./include/linux/shrinker.h"
+	.file 110 "./include/linux/list_lru.h"
+	.file 111 "./include/linux/radix-tree.h"
+	.file 112 "./include/linux/rwsem.h"
+	.file 113 "./arch/arm64/include/asm/uprobes.h"
+	.file 114 "./arch/arm64/include/asm/mmu.h"
+	.file 115 "./include/linux/memremap.h"
+	.file 116 "./include/linux/mm.h"
+	.file 117 "./include/linux/capability.h"
+	.file 118 "./include/linux/semaphore.h"
+	.file 119 "./include/uapi/linux/fiemap.h"
+	.file 120 "./include/linux/migrate_mode.h"
+	.file 121 "./include/linux/rcuwait.h"
+	.file 122 "./include/linux/rcu_sync.h"
+	.file 123 "./include/linux/percpu-rwsem.h"
+	.file 124 "./include/linux/delayed_call.h"
+	.file 125 "./include/uapi/linux/uuid.h"
+	.file 126 "./include/linux/uuid.h"
+	.file 127 "./include/linux/errseq.h"
+	.file 128 "./include/asm-generic/ioctl.h"
+	.file 129 "./include/uapi/linux/fs.h"
+	.file 130 "./include/linux/mmzone.h"
+	.file 131 "./arch/arm64/include/asm/topology.h"
+	.file 132 "./include/linux/arch_topology.h"
+	.file 133 "./include/linux/gfp.h"
+	.file 134 "./include/linux/percpu_counter.h"
+	.file 135 "./include/linux/quota.h"
+	.file 136 "./include/linux/projid.h"
+	.file 137 "./include/linux/module.h"
+	.file 138 "./include/linux/nfs_fs_i.h"
+	.file 139 "./include/linux/key.h"
+	.file 140 "./include/linux/seq_file.h"
+	.file 141 "./include/linux/kobject.h"
+	.file 142 "./include/linux/sysctl.h"
+	.file 143 "./include/linux/assoc_array.h"
+	.file 144 "./include/linux/ratelimit.h"
+	.file 145 "./include/linux/debugfs.h"
+	.file 146 "./include/linux/delay.h"
+	.file 147 "./include/linux/idr.h"
+	.file 148 "./include/linux/kernfs.h"
+	.file 149 "./include/linux/kobject_ns.h"
+	.file 150 "./include/linux/sysfs.h"
+	.file 151 "./include/linux/kref.h"
+	.file 152 "./include/linux/klist.h"
+	.file 153 "./include/linux/pm.h"
+	.file 154 "./include/linux/pm_wakeup.h"
+	.file 155 "./arch/arm64/include/asm/device.h"
+	.file 156 "./include/linux/mod_devicetable.h"
+	.file 157 "./include/linux/fwnode.h"
+	.file 158 "./include/linux/irqdomain.h"
+	.file 159 "./include/linux/rtmutex.h"
+	.file 160 "./include/uapi/linux/i2c.h"
+	.file 161 "./include/linux/i2c.h"
+	.file 162 "./include/linux/irqnr.h"
+	.file 163 "./arch/arm64/include/asm/hardirq.h"
+	.file 164 "./include/linux/irq_cpustat.h"
+	.file 165 "./include/linux/interrupt.h"
+	.file 166 "./include/linux/stddef.h"
+	.file 167 "./arch/arm64/include/asm/pgtable.h"
+	.file 168 "./include/xen/xen.h"
+	.file 169 "./include/linux/io.h"
+	.file 170 "./include/linux/kthread.h"
+	.file 171 "./include/linux/miscdevice.h"
+	.file 172 "./include/linux/percpu-refcount.h"
+	.file 173 "./include/linux/page_ext.h"
+	.file 174 "./include/linux/tracepoint-defs.h"
+	.file 175 "./include/linux/page_ref.h"
+	.file 176 "./include/linux/huge_mm.h"
+	.file 177 "./include/linux/vm_event_item.h"
+	.file 178 "./include/linux/vmstat.h"
+	.file 179 "./include/linux/umh.h"
+	.file 180 "./include/linux/kmod.h"
+	.file 181 "./include/uapi/linux/elf.h"
+	.file 182 "./include/linux/elf.h"
+	.file 183 "./include/linux/moduleparam.h"
+	.file 184 "./include/linux/rbtree_latch.h"
+	.file 185 "./arch/arm64/include/asm/module.h"
+	.file 186 "./arch/arm64/include/asm/extable.h"
+	.file 187 "./include/linux/node.h"
+	.file 188 "./include/linux/cpu.h"
+	.file 189 "./include/linux/platform_device.h"
+	.file 190 "./include/linux/of_platform.h"
+	.file 191 "./include/linux/sched/task.h"
+	.file 192 "./include/uapi/linux/sched/types.h"
+	.file 193 "drivers/gpu/drm/rockchip/ebc-dev/epdlut/epd_lut.h"
+	.file 194 "drivers/gpu/drm/rockchip/ebc-dev/bufmanage/buf_manage.h"
+	.file 195 "drivers/gpu/drm/rockchip/ebc-dev/pmic/../ebc_dev.h"
+	.file 196 "./include/linux/dma-direction.h"
+	.file 197 "./include/linux/scatterlist.h"
+	.file 198 "./include/xen/arm/hypervisor.h"
+	.file 199 "./arch/arm64/include/asm/dma-mapping.h"
+	.file 200 "drivers/gpu/drm/rockchip/ebc-dev/tcon/../ebc_panel.h"
+	.file 201 "./include/linux/thread_info.h"
+	.file 202 "./include/linux/dma-debug.h"
+	.file 203 "./include/linux/err.h"
+	.file 204 "./include/asm-generic/getorder.h"
+	.file 205 "./include/linux/log2.h"
+	.file 206 "./include/uapi/linux/byteorder/little_endian.h"
+	.file 207 "./include/uapi/linux/swab.h"
+	.file 208 "./include/asm-generic/bitops/fls64.h"
+	.file 209 "./include/asm-generic/bitops/builtin-__fls.h"
+	.file 210 "./include/linux/kasan-checks.h"
+	.file 211 "./include/linux/of_address.h"
+	.file 212 "./arch/arm64/include/asm/string.h"
+	.file 213 "./include/linux/string.h"
+	.section	.debug_info,"",@progbits
+.Ldebug_info0:
+	.4byte	0x16f4b
+	.2byte	0x4
+	.4byte	.Ldebug_abbrev0
+	.byte	0x8
+	.uleb128 0x1
+	.4byte	.LASF3323
+	.byte	0x1
+	.4byte	.LASF3324
+	.4byte	.LASF3325
+	.4byte	.Ldebug_ranges0+0x26d0
+	.8byte	0
+	.4byte	.Ldebug_line0
+	.uleb128 0x2
+	.byte	0x8
+	.byte	0x7
+	.4byte	.LASF0
+	.uleb128 0x3
+	.4byte	0x29
+	.uleb128 0x4
+	.4byte	0x29
+	.uleb128 0x3
+	.4byte	0x35
+	.uleb128 0x5
+	.4byte	0x29
+	.4byte	0x4f
+	.uleb128 0x6
+	.4byte	0x4f
+	.byte	0x1
+	.byte	0
+	.uleb128 0x2
+	.byte	0x8
+	.byte	0x7
+	.4byte	.LASF1
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x68
+	.uleb128 0x3
+	.4byte	0x56
+	.uleb128 0x2
+	.byte	0x1
+	.byte	0x8
+	.4byte	.LASF2
+	.uleb128 0x3
+	.4byte	0x61
+	.uleb128 0x2
+	.byte	0x4
+	.byte	0x7
+	.4byte	.LASF3
+	.uleb128 0x3
+	.4byte	0x6d
+	.uleb128 0x8
+	.4byte	.LASF5
+	.byte	0x12
+	.byte	0x14
+	.4byte	0x84
+	.uleb128 0x2
+	.byte	0x1
+	.byte	0x6
+	.4byte	.LASF4
+	.uleb128 0x8
+	.4byte	.LASF6
+	.byte	0x12
+	.byte	0x15
+	.4byte	0x96
+	.uleb128 0x2
+	.byte	0x1
+	.byte	0x8
+	.4byte	.LASF7
+	.uleb128 0x3
+	.4byte	0x96
+	.uleb128 0x2
+	.byte	0x2
+	.byte	0x5
+	.4byte	.LASF8
+	.uleb128 0x8
+	.4byte	.LASF9
+	.byte	0x12
+	.byte	0x18
+	.4byte	0xb4
+	.uleb128 0x2
+	.byte	0x2
+	.byte	0x7
+	.4byte	.LASF10
+	.uleb128 0x8
+	.4byte	.LASF11
+	.byte	0x12
+	.byte	0x1a
+	.4byte	0xc6
+	.uleb128 0x9
+	.byte	0x4
+	.byte	0x5
+	.string	"int"
+	.uleb128 0x3
+	.4byte	0xc6
+	.uleb128 0x8
+	.4byte	.LASF12
+	.byte	0x12
+	.byte	0x1b
+	.4byte	0x6d
+	.uleb128 0x3
+	.4byte	0xd2
+	.uleb128 0x8
+	.4byte	.LASF13
+	.byte	0x12
+	.byte	0x1e
+	.4byte	0xed
+	.uleb128 0x2
+	.byte	0x8
+	.byte	0x5
+	.4byte	.LASF14
+	.uleb128 0x8
+	.4byte	.LASF15
+	.byte	0x12
+	.byte	0x1f
+	.4byte	0xff
+	.uleb128 0x2
+	.byte	0x8
+	.byte	0x7
+	.4byte	.LASF16
+	.uleb128 0xa
+	.string	"s8"
+	.byte	0x13
+	.byte	0x10
+	.4byte	0x79
+	.uleb128 0xa
+	.string	"u8"
+	.byte	0x13
+	.byte	0x11
+	.4byte	0x8b
+	.uleb128 0x3
+	.4byte	0x110
+	.uleb128 0xa
+	.string	"u16"
+	.byte	0x13
+	.byte	0x13
+	.4byte	0xa9
+	.uleb128 0x3
+	.4byte	0x11f
+	.uleb128 0xa
+	.string	"s32"
+	.byte	0x13
+	.byte	0x14
+	.4byte	0xbb
+	.uleb128 0x3
+	.4byte	0x12f
+	.uleb128 0xa
+	.string	"u32"
+	.byte	0x13
+	.byte	0x15
+	.4byte	0xd2
+	.uleb128 0x3
+	.4byte	0x13f
+	.uleb128 0xa
+	.string	"s64"
+	.byte	0x13
+	.byte	0x16
+	.4byte	0xe2
+	.uleb128 0xa
+	.string	"u64"
+	.byte	0x13
+	.byte	0x17
+	.4byte	0xf4
+	.uleb128 0xb
+	.byte	0x4
+	.4byte	0x6d
+	.byte	0xa6
+	.byte	0xa
+	.4byte	0x17e
+	.uleb128 0xc
+	.4byte	.LASF17
+	.byte	0
+	.uleb128 0xc
+	.4byte	.LASF18
+	.byte	0x1
+	.byte	0
+	.uleb128 0x5
+	.4byte	0x29
+	.4byte	0x18e
+	.uleb128 0x6
+	.4byte	0x4f
+	.byte	0xf
+	.byte	0
+	.uleb128 0x8
+	.4byte	.LASF19
+	.byte	0x14
+	.byte	0xf
+	.4byte	0x199
+	.uleb128 0x2
+	.byte	0x8
+	.byte	0x5
+	.4byte	.LASF20
+	.uleb128 0x4
+	.4byte	0x199
+	.uleb128 0x8
+	.4byte	.LASF21
+	.byte	0x14
+	.byte	0x10
+	.4byte	0x29
+	.uleb128 0x8
+	.4byte	.LASF22
+	.byte	0x14
+	.byte	0x1c
+	.4byte	0xc6
+	.uleb128 0x8
+	.4byte	.LASF23
+	.byte	0x14
+	.byte	0x31
+	.4byte	0x6d
+	.uleb128 0x8
+	.4byte	.LASF24
+	.byte	0x14
+	.byte	0x32
+	.4byte	0x6d
+	.uleb128 0x8
+	.4byte	.LASF25
+	.byte	0x14
+	.byte	0x48
+	.4byte	0x1a5
+	.uleb128 0x8
+	.4byte	.LASF26
+	.byte	0x14
+	.byte	0x49
+	.4byte	0x18e
+	.uleb128 0x8
+	.4byte	.LASF27
+	.byte	0x14
+	.byte	0x58
+	.4byte	0xed
+	.uleb128 0x8
+	.4byte	.LASF28
+	.byte	0x14
+	.byte	0x59
+	.4byte	0x18e
+	.uleb128 0x8
+	.4byte	.LASF29
+	.byte	0x14
+	.byte	0x5b
+	.4byte	0x18e
+	.uleb128 0x8
+	.4byte	.LASF30
+	.byte	0x14
+	.byte	0x5c
+	.4byte	0xc6
+	.uleb128 0x8
+	.4byte	.LASF31
+	.byte	0x14
+	.byte	0x5d
+	.4byte	0xc6
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x61
+	.uleb128 0x3
+	.4byte	0x21e
+	.uleb128 0x8
+	.4byte	.LASF32
+	.byte	0x15
+	.byte	0x1f
+	.4byte	0xd2
+	.uleb128 0x8
+	.4byte	.LASF33
+	.byte	0x15
+	.byte	0x20
+	.4byte	0xd2
+	.uleb128 0x3
+	.4byte	0x234
+	.uleb128 0x8
+	.4byte	.LASF34
+	.byte	0x15
+	.byte	0x34
+	.4byte	0x6d
+	.uleb128 0xd
+	.4byte	.LASF62
+	.byte	0x8
+	.byte	0x16
+	.byte	0x3d
+	.4byte	0x274
+	.uleb128 0xe
+	.4byte	.LASF35
+	.byte	0x16
+	.byte	0x3e
+	.4byte	0xc6
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF36
+	.byte	0x16
+	.byte	0x3f
+	.4byte	0xc6
+	.byte	0x4
+	.byte	0
+	.uleb128 0x3
+	.4byte	0x24f
+	.uleb128 0x8
+	.4byte	.LASF37
+	.byte	0x17
+	.byte	0xd
+	.4byte	0x13f
+	.uleb128 0x8
+	.4byte	.LASF38
+	.byte	0x17
+	.byte	0x10
+	.4byte	0x279
+	.uleb128 0x8
+	.4byte	.LASF39
+	.byte	0x17
+	.byte	0x13
+	.4byte	0xb4
+	.uleb128 0x8
+	.4byte	.LASF40
+	.byte	0x17
+	.byte	0x16
+	.4byte	0x1b0
+	.uleb128 0x8
+	.4byte	.LASF41
+	.byte	0x17
+	.byte	0x1b
+	.4byte	0x213
+	.uleb128 0x8
+	.4byte	.LASF42
+	.byte	0x17
+	.byte	0x1e
+	.4byte	0x2bb
+	.uleb128 0x2
+	.byte	0x1
+	.byte	0x2
+	.4byte	.LASF43
+	.uleb128 0x8
+	.4byte	.LASF44
+	.byte	0x17
+	.byte	0x20
+	.4byte	0x1bb
+	.uleb128 0x8
+	.4byte	.LASF45
+	.byte	0x17
+	.byte	0x21
+	.4byte	0x1c6
+	.uleb128 0x8
+	.4byte	.LASF46
+	.byte	0x17
+	.byte	0x2e
+	.4byte	0x1e7
+	.uleb128 0x8
+	.4byte	.LASF47
+	.byte	0x17
+	.byte	0x37
+	.4byte	0x1d1
+	.uleb128 0x8
+	.4byte	.LASF48
+	.byte	0x17
+	.byte	0x3c
+	.4byte	0x1dc
+	.uleb128 0x8
+	.4byte	.LASF49
+	.byte	0x17
+	.byte	0x67
+	.4byte	0x12f
+	.uleb128 0x8
+	.4byte	.LASF50
+	.byte	0x17
+	.byte	0x6d
+	.4byte	0x13f
+	.uleb128 0x8
+	.4byte	.LASF51
+	.byte	0x17
+	.byte	0x86
+	.4byte	0x29
+	.uleb128 0x8
+	.4byte	.LASF52
+	.byte	0x17
+	.byte	0x87
+	.4byte	0x29
+	.uleb128 0x8
+	.4byte	.LASF53
+	.byte	0x17
+	.byte	0x99
+	.4byte	0x15a
+	.uleb128 0x8
+	.4byte	.LASF54
+	.byte	0x17
+	.byte	0x9e
+	.4byte	0x6d
+	.uleb128 0x8
+	.4byte	.LASF55
+	.byte	0x17
+	.byte	0xa0
+	.4byte	0x6d
+	.uleb128 0x8
+	.4byte	.LASF56
+	.byte	0x17
+	.byte	0xa3
+	.4byte	0x15a
+	.uleb128 0x8
+	.4byte	.LASF57
+	.byte	0x17
+	.byte	0xa8
+	.4byte	0x346
+	.uleb128 0x8
+	.4byte	.LASF58
+	.byte	0x17
+	.byte	0xae
+	.4byte	0x29
+	.uleb128 0xf
+	.byte	0x4
+	.byte	0x17
+	.byte	0xb0
+	.4byte	0x37c
+	.uleb128 0xe
+	.4byte	.LASF59
+	.byte	0x17
+	.byte	0xb1
+	.4byte	0xc6
+	.byte	0
+	.byte	0
+	.uleb128 0x8
+	.4byte	.LASF60
+	.byte	0x17
+	.byte	0xb2
+	.4byte	0x367
+	.uleb128 0xf
+	.byte	0x8
+	.byte	0x17
+	.byte	0xb5
+	.4byte	0x39c
+	.uleb128 0xe
+	.4byte	.LASF59
+	.byte	0x17
+	.byte	0xb6
+	.4byte	0x199
+	.byte	0
+	.byte	0
+	.uleb128 0x8
+	.4byte	.LASF61
+	.byte	0x17
+	.byte	0xb7
+	.4byte	0x387
+	.uleb128 0xd
+	.4byte	.LASF63
+	.byte	0x10
+	.byte	0x17
+	.byte	0xba
+	.4byte	0x3cc
+	.uleb128 0xe
+	.4byte	.LASF64
+	.byte	0x17
+	.byte	0xbb
+	.4byte	0x3cc
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF65
+	.byte	0x17
+	.byte	0xbb
+	.4byte	0x3cc
+	.byte	0x8
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x3a7
+	.uleb128 0xd
+	.4byte	.LASF66
+	.byte	0x8
+	.byte	0x17
+	.byte	0xbe
+	.4byte	0x3eb
+	.uleb128 0xe
+	.4byte	.LASF67
+	.byte	0x17
+	.byte	0xbf
+	.4byte	0x410
+	.byte	0
+	.byte	0
+	.uleb128 0xd
+	.4byte	.LASF68
+	.byte	0x10
+	.byte	0x17
+	.byte	0xc2
+	.4byte	0x410
+	.uleb128 0xe
+	.4byte	.LASF64
+	.byte	0x17
+	.byte	0xc3
+	.4byte	0x410
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF69
+	.byte	0x17
+	.byte	0xc3
+	.4byte	0x416
+	.byte	0x8
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x3eb
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x410
+	.uleb128 0xd
+	.4byte	.LASF70
+	.byte	0x10
+	.byte	0x17
+	.byte	0xe0
+	.4byte	0x441
+	.uleb128 0xe
+	.4byte	.LASF64
+	.byte	0x17
+	.byte	0xe1
+	.4byte	0x441
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF71
+	.byte	0x17
+	.byte	0xe2
+	.4byte	0x452
+	.byte	0x8
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x41c
+	.uleb128 0x10
+	.4byte	0x452
+	.uleb128 0x11
+	.4byte	0x441
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x447
+	.uleb128 0x12
+	.byte	0x8
+	.uleb128 0x13
+	.4byte	.LASF72
+	.byte	0x18
+	.2byte	0x1da
+	.4byte	0x466
+	.uleb128 0x14
+	.4byte	0x2b0
+	.4byte	0x475
+	.uleb128 0x11
+	.4byte	0x29
+	.byte	0
+	.uleb128 0x5
+	.4byte	0x490
+	.4byte	0x485
+	.uleb128 0x6
+	.4byte	0x4f
+	.byte	0xf
+	.byte	0
+	.uleb128 0x3
+	.4byte	0x475
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x45a
+	.uleb128 0x3
+	.4byte	0x48a
+	.uleb128 0x15
+	.4byte	.LASF75
+	.byte	0x18
+	.2byte	0x1db
+	.4byte	0x485
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x4a7
+	.uleb128 0x16
+	.4byte	0xc6
+	.uleb128 0x8
+	.4byte	.LASF73
+	.byte	0x19
+	.byte	0x75
+	.4byte	0x4b7
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x4bd
+	.uleb128 0x17
+	.uleb128 0x8
+	.4byte	.LASF74
+	.byte	0x19
+	.byte	0x78
+	.4byte	0xc6
+	.uleb128 0x5
+	.4byte	0x4be
+	.4byte	0x4d4
+	.uleb128 0x18
+	.byte	0
+	.uleb128 0x19
+	.4byte	.LASF76
+	.byte	0x19
+	.byte	0x87
+	.4byte	0x4c9
+	.uleb128 0x19
+	.4byte	.LASF77
+	.byte	0x19
+	.byte	0x87
+	.4byte	0x4c9
+	.uleb128 0x19
+	.4byte	.LASF78
+	.byte	0x19
+	.byte	0x88
+	.4byte	0x4c9
+	.uleb128 0x19
+	.4byte	.LASF79
+	.byte	0x19
+	.byte	0x88
+	.4byte	0x4c9
+	.uleb128 0x5
+	.4byte	0x61
+	.4byte	0x50b
+	.uleb128 0x18
+	.byte	0
+	.uleb128 0x19
+	.4byte	.LASF80
+	.byte	0x19
+	.byte	0x8f
+	.4byte	0x500
+	.uleb128 0x19
+	.4byte	.LASF81
+	.byte	0x19
+	.byte	0x90
+	.4byte	0x21e
+	.uleb128 0x19
+	.4byte	.LASF82
+	.byte	0x19
+	.byte	0x91
+	.4byte	0x6d
+	.uleb128 0x19
+	.4byte	.LASF83
+	.byte	0x19
+	.byte	0x9a
+	.4byte	0x2b0
+	.uleb128 0x19
+	.4byte	.LASF84
+	.byte	0x19
+	.byte	0xa0
+	.4byte	0x4b7
+	.uleb128 0x19
+	.4byte	.LASF85
+	.byte	0x19
+	.byte	0xa2
+	.4byte	0x2b0
+	.uleb128 0x19
+	.4byte	.LASF86
+	.byte	0x1a
+	.byte	0x11
+	.4byte	0xc6
+	.uleb128 0x8
+	.4byte	.LASF87
+	.byte	0x1b
+	.byte	0x18
+	.4byte	0x39c
+	.uleb128 0x19
+	.4byte	.LASF88
+	.byte	0x1c
+	.byte	0x3f
+	.4byte	0x29
+	.uleb128 0x5
+	.4byte	0x68
+	.4byte	0x579
+	.uleb128 0x18
+	.byte	0
+	.uleb128 0x3
+	.4byte	0x56e
+	.uleb128 0x19
+	.4byte	.LASF89
+	.byte	0x1d
+	.byte	0xb
+	.4byte	0x579
+	.uleb128 0x19
+	.4byte	.LASF90
+	.byte	0x1d
+	.byte	0xc
+	.4byte	0x56
+	.uleb128 0x19
+	.4byte	.LASF91
+	.byte	0x1d
+	.byte	0xd
+	.4byte	0x579
+	.uleb128 0x5
+	.4byte	0xc6
+	.4byte	0x5aa
+	.uleb128 0x18
+	.byte	0
+	.uleb128 0x19
+	.4byte	.LASF92
+	.byte	0x1d
+	.byte	0x40
+	.4byte	0x59f
+	.uleb128 0x19
+	.4byte	.LASF93
+	.byte	0x1d
+	.byte	0x54
+	.4byte	0x500
+	.uleb128 0x19
+	.4byte	.LASF94
+	.byte	0x1d
+	.byte	0xc1
+	.4byte	0xc6
+	.uleb128 0x19
+	.4byte	.LASF95
+	.byte	0x1d
+	.byte	0xc2
+	.4byte	0xc6
+	.uleb128 0x15
+	.4byte	.LASF96
+	.byte	0x1d
+	.2byte	0x11d
+	.4byte	0xc6
+	.uleb128 0x1a
+	.4byte	.LASF97
+	.2byte	0x120
+	.byte	0x1d
+	.2byte	0x1dd
+	.4byte	0x7c9
+	.uleb128 0x1b
+	.4byte	.LASF98
+	.byte	0x1e
+	.2byte	0x710
+	.4byte	0x74a1
+	.byte	0
+	.uleb128 0x1b
+	.4byte	.LASF99
+	.byte	0x1e
+	.2byte	0x711
+	.4byte	0x87a4
+	.byte	0x8
+	.uleb128 0x1b
+	.4byte	.LASF100
+	.byte	0x1e
+	.2byte	0x712
+	.4byte	0x87ce
+	.byte	0x10
+	.uleb128 0x1b
+	.4byte	.LASF101
+	.byte	0x1e
+	.2byte	0x713
+	.4byte	0x87f2
+	.byte	0x18
+	.uleb128 0x1b
+	.4byte	.LASF102
+	.byte	0x1e
+	.2byte	0x714
+	.4byte	0x784e
+	.byte	0x20
+	.uleb128 0x1b
+	.4byte	.LASF103
+	.byte	0x1e
+	.2byte	0x715
+	.4byte	0x784e
+	.byte	0x28
+	.uleb128 0x1b
+	.4byte	.LASF104
+	.byte	0x1e
+	.2byte	0x716
+	.4byte	0x880c
+	.byte	0x30
+	.uleb128 0x1b
+	.4byte	.LASF105
+	.byte	0x1e
+	.2byte	0x717
+	.4byte	0x880c
+	.byte	0x38
+	.uleb128 0x1b
+	.4byte	.LASF106
+	.byte	0x1e
+	.2byte	0x718
+	.4byte	0x8831
+	.byte	0x40
+	.uleb128 0x1b
+	.4byte	.LASF107
+	.byte	0x1e
+	.2byte	0x719
+	.4byte	0x8850
+	.byte	0x48
+	.uleb128 0x1b
+	.4byte	.LASF108
+	.byte	0x1e
+	.2byte	0x71a
+	.4byte	0x8850
+	.byte	0x50
+	.uleb128 0x1b
+	.4byte	.LASF109
+	.byte	0x1e
+	.2byte	0x71b
+	.4byte	0x886a
+	.byte	0x58
+	.uleb128 0x1b
+	.4byte	.LASF110
+	.byte	0x1e
+	.2byte	0x71c
+	.4byte	0x29
+	.byte	0x60
+	.uleb128 0x1b
+	.4byte	.LASF111
+	.byte	0x1e
+	.2byte	0x71d
+	.4byte	0x8884
+	.byte	0x68
+	.uleb128 0x1b
+	.4byte	.LASF112
+	.byte	0x1e
+	.2byte	0x71e
+	.4byte	0x889e
+	.byte	0x70
+	.uleb128 0x1b
+	.4byte	.LASF113
+	.byte	0x1e
+	.2byte	0x71f
+	.4byte	0x8884
+	.byte	0x78
+	.uleb128 0x1b
+	.4byte	.LASF114
+	.byte	0x1e
+	.2byte	0x720
+	.4byte	0x88c2
+	.byte	0x80
+	.uleb128 0x1b
+	.4byte	.LASF115
+	.byte	0x1e
+	.2byte	0x721
+	.4byte	0x88e1
+	.byte	0x88
+	.uleb128 0x1b
+	.4byte	.LASF116
+	.byte	0x1e
+	.2byte	0x722
+	.4byte	0x8900
+	.byte	0x90
+	.uleb128 0x1b
+	.4byte	.LASF117
+	.byte	0x1e
+	.2byte	0x723
+	.4byte	0x892e
+	.byte	0x98
+	.uleb128 0x1b
+	.4byte	.LASF118
+	.byte	0x1e
+	.2byte	0x724
+	.4byte	0x5924
+	.byte	0xa0
+	.uleb128 0x1b
+	.4byte	.LASF119
+	.byte	0x1e
+	.2byte	0x725
+	.4byte	0x8943
+	.byte	0xa8
+	.uleb128 0x1b
+	.4byte	.LASF120
+	.byte	0x1e
+	.2byte	0x726
+	.4byte	0x8900
+	.byte	0xb0
+	.uleb128 0x1b
+	.4byte	.LASF121
+	.byte	0x1e
+	.2byte	0x727
+	.4byte	0x896c
+	.byte	0xb8
+	.uleb128 0x1b
+	.4byte	.LASF122
+	.byte	0x1e
+	.2byte	0x728
+	.4byte	0x8995
+	.byte	0xc0
+	.uleb128 0x1b
+	.4byte	.LASF123
+	.byte	0x1e
+	.2byte	0x729
+	.4byte	0x89bf
+	.byte	0xc8
+	.uleb128 0x1b
+	.4byte	.LASF124
+	.byte	0x1e
+	.2byte	0x72a
+	.4byte	0x89e3
+	.byte	0xd0
+	.uleb128 0x1b
+	.4byte	.LASF125
+	.byte	0x1e
+	.2byte	0x72c
+	.4byte	0x8aa7
+	.byte	0xd8
+	.uleb128 0x1b
+	.4byte	.LASF126
+	.byte	0x1e
+	.2byte	0x730
+	.4byte	0x8ad5
+	.byte	0xe0
+	.uleb128 0x1b
+	.4byte	.LASF127
+	.byte	0x1e
+	.2byte	0x732
+	.4byte	0x8afe
+	.byte	0xe8
+	.uleb128 0x1b
+	.4byte	.LASF128
+	.byte	0x1e
+	.2byte	0x734
+	.4byte	0x8afe
+	.byte	0xf0
+	.uleb128 0x1b
+	.4byte	.LASF129
+	.byte	0x1e
+	.2byte	0x736
+	.4byte	0x88c2
+	.byte	0xf8
+	.uleb128 0x1c
+	.4byte	.LASF130
+	.byte	0x1e
+	.2byte	0x738
+	.4byte	0x15a
+	.2byte	0x100
+	.uleb128 0x1c
+	.4byte	.LASF131
+	.byte	0x1e
+	.2byte	0x739
+	.4byte	0x15a
+	.2byte	0x108
+	.uleb128 0x1c
+	.4byte	.LASF132
+	.byte	0x1e
+	.2byte	0x73a
+	.4byte	0x15a
+	.2byte	0x110
+	.uleb128 0x1c
+	.4byte	.LASF133
+	.byte	0x1e
+	.2byte	0x73b
+	.4byte	0x15a
+	.2byte	0x118
+	.byte	0
+	.uleb128 0x3
+	.4byte	0x5e2
+	.uleb128 0x15
+	.4byte	.LASF134
+	.byte	0x1d
+	.2byte	0x1dd
+	.4byte	0x7c9
+	.uleb128 0x1d
+	.4byte	.LASF135
+	.byte	0x10
+	.byte	0x1f
+	.2byte	0x129
+	.4byte	0x800
+	.uleb128 0xe
+	.4byte	.LASF116
+	.byte	0x20
+	.byte	0x3d
+	.4byte	0xe65
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF136
+	.byte	0x20
+	.byte	0x3e
+	.4byte	0x66ee
+	.byte	0x8
+	.byte	0
+	.uleb128 0x15
+	.4byte	.LASF137
+	.byte	0x1f
+	.2byte	0x129
+	.4byte	0x7da
+	.uleb128 0x10
+	.4byte	0x817
+	.uleb128 0x11
+	.4byte	0x15a
+	.byte	0
+	.uleb128 0x15
+	.4byte	.LASF138
+	.byte	0x1f
+	.2byte	0x12a
+	.4byte	0x823
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x80c
+	.uleb128 0x14
+	.4byte	0x199
+	.4byte	0x838
+	.uleb128 0x11
+	.4byte	0xc6
+	.byte	0
+	.uleb128 0x15
+	.4byte	.LASF139
+	.byte	0x1f
+	.2byte	0x12b
+	.4byte	0x844
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x829
+	.uleb128 0x15
+	.4byte	.LASF140
+	.byte	0x1f
+	.2byte	0x1f6
+	.4byte	0xc6
+	.uleb128 0x15
+	.4byte	.LASF141
+	.byte	0x1f
+	.2byte	0x1f7
+	.4byte	0xc6
+	.uleb128 0x15
+	.4byte	.LASF142
+	.byte	0x1f
+	.2byte	0x1f8
+	.4byte	0xc6
+	.uleb128 0x15
+	.4byte	.LASF143
+	.byte	0x1f
+	.2byte	0x1f9
+	.4byte	0xc6
+	.uleb128 0x15
+	.4byte	.LASF144
+	.byte	0x1f
+	.2byte	0x1fa
+	.4byte	0xc6
+	.uleb128 0x15
+	.4byte	.LASF145
+	.byte	0x1f
+	.2byte	0x1fb
+	.4byte	0xc6
+	.uleb128 0x15
+	.4byte	.LASF146
+	.byte	0x1f
+	.2byte	0x1fc
+	.4byte	0xc6
+	.uleb128 0x15
+	.4byte	.LASF147
+	.byte	0x1f
+	.2byte	0x1fd
+	.4byte	0xc6
+	.uleb128 0x15
+	.4byte	.LASF148
+	.byte	0x1f
+	.2byte	0x1ff
+	.4byte	0x2b0
+	.uleb128 0x15
+	.4byte	.LASF149
+	.byte	0x1f
+	.2byte	0x206
+	.4byte	0x37c
+	.uleb128 0x15
+	.4byte	.LASF150
+	.byte	0x1f
+	.2byte	0x21a
+	.4byte	0xc6
+	.uleb128 0x15
+	.4byte	.LASF151
+	.byte	0x1f
+	.2byte	0x21c
+	.4byte	0x2b0
+	.uleb128 0x1e
+	.4byte	.LASF180
+	.byte	0x4
+	.4byte	0x6d
+	.byte	0x1f
+	.2byte	0x222
+	.4byte	0x916
+	.uleb128 0xc
+	.4byte	.LASF152
+	.byte	0
+	.uleb128 0xc
+	.4byte	.LASF153
+	.byte	0x1
+	.uleb128 0xc
+	.4byte	.LASF154
+	.byte	0x2
+	.uleb128 0xc
+	.4byte	.LASF155
+	.byte	0x3
+	.uleb128 0xc
+	.4byte	.LASF156
+	.byte	0x4
+	.uleb128 0xc
+	.4byte	.LASF157
+	.byte	0x5
+	.uleb128 0xc
+	.4byte	.LASF158
+	.byte	0x6
+	.byte	0
+	.uleb128 0x15
+	.4byte	.LASF159
+	.byte	0x1f
+	.2byte	0x22a
+	.4byte	0x8da
+	.uleb128 0x1d
+	.4byte	.LASF160
+	.byte	0x3
+	.byte	0x1f
+	.2byte	0x241
+	.4byte	0x957
+	.uleb128 0x1b
+	.4byte	.LASF161
+	.byte	0x1f
+	.2byte	0x242
+	.4byte	0x61
+	.byte	0
+	.uleb128 0x1b
+	.4byte	.LASF162
+	.byte	0x1f
+	.2byte	0x243
+	.4byte	0x61
+	.byte	0x1
+	.uleb128 0x1b
+	.4byte	.LASF163
+	.byte	0x1f
+	.2byte	0x244
+	.4byte	0x2b0
+	.byte	0x2
+	.byte	0
+	.uleb128 0x3
+	.4byte	0x922
+	.uleb128 0x5
+	.4byte	0x957
+	.4byte	0x96c
+	.uleb128 0x6
+	.4byte	0x4f
+	.byte	0x11
+	.byte	0
+	.uleb128 0x3
+	.4byte	0x95c
+	.uleb128 0x15
+	.4byte	.LASF164
+	.byte	0x1f
+	.2byte	0x247
+	.4byte	0x96c
+	.uleb128 0x15
+	.4byte	.LASF165
+	.byte	0x1f
+	.2byte	0x249
+	.4byte	0x579
+	.uleb128 0x15
+	.4byte	.LASF166
+	.byte	0x1f
+	.2byte	0x254
+	.4byte	0x579
+	.uleb128 0xd
+	.4byte	.LASF167
+	.byte	0xc
+	.byte	0x21
+	.byte	0x17
+	.4byte	0x9d2
+	.uleb128 0xe
+	.4byte	.LASF168
+	.byte	0x21
+	.byte	0x1b
+	.4byte	0xc6
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF169
+	.byte	0x21
+	.byte	0x21
+	.4byte	0xc6
+	.byte	0x4
+	.uleb128 0xe
+	.4byte	.LASF170
+	.byte	0x21
+	.byte	0x23
+	.4byte	0xb4
+	.byte	0x8
+	.uleb128 0xe
+	.4byte	.LASF171
+	.byte	0x21
+	.byte	0x25
+	.4byte	0xb4
+	.byte	0xa
+	.byte	0
+	.uleb128 0x8
+	.4byte	.LASF172
+	.byte	0x22
+	.byte	0x8
+	.4byte	0xe2
+	.uleb128 0xd
+	.4byte	.LASF173
+	.byte	0x10
+	.byte	0x23
+	.byte	0xa
+	.4byte	0xa02
+	.uleb128 0xe
+	.4byte	.LASF174
+	.byte	0x23
+	.byte	0xb
+	.4byte	0x1f2
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF175
+	.byte	0x23
+	.byte	0xc
+	.4byte	0x199
+	.byte	0x8
+	.byte	0
+	.uleb128 0xd
+	.4byte	.LASF176
+	.byte	0x8
+	.byte	0x23
+	.byte	0x15
+	.4byte	0xa27
+	.uleb128 0xe
+	.4byte	.LASF177
+	.byte	0x23
+	.byte	0x16
+	.4byte	0xc6
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF178
+	.byte	0x23
+	.byte	0x17
+	.4byte	0xc6
+	.byte	0x4
+	.byte	0
+	.uleb128 0xd
+	.4byte	.LASF179
+	.byte	0x10
+	.byte	0x22
+	.byte	0x15
+	.4byte	0xa4c
+	.uleb128 0xe
+	.4byte	.LASF174
+	.byte	0x22
+	.byte	0x16
+	.4byte	0x9d2
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF175
+	.byte	0x22
+	.byte	0x17
+	.4byte	0x199
+	.byte	0x8
+	.byte	0
+	.uleb128 0x1f
+	.4byte	.LASF181
+	.byte	0x4
+	.4byte	0x6d
+	.byte	0x24
+	.byte	0x10
+	.4byte	0xa6f
+	.uleb128 0xc
+	.4byte	.LASF182
+	.byte	0
+	.uleb128 0xc
+	.4byte	.LASF183
+	.byte	0x1
+	.uleb128 0xc
+	.4byte	.LASF184
+	.byte	0x2
+	.byte	0
+	.uleb128 0xf
+	.byte	0x28
+	.byte	0x24
+	.byte	0x1d
+	.4byte	0xac0
+	.uleb128 0xe
+	.4byte	.LASF185
+	.byte	0x24
+	.byte	0x1e
+	.4byte	0xac0
+	.byte	0
+	.uleb128 0x20
+	.string	"val"
+	.byte	0x24
+	.byte	0x1f
+	.4byte	0x13f
+	.byte	0x8
+	.uleb128 0xe
+	.4byte	.LASF171
+	.byte	0x24
+	.byte	0x20
+	.4byte	0x13f
+	.byte	0xc
+	.uleb128 0xe
+	.4byte	.LASF186
+	.byte	0x24
+	.byte	0x21
+	.4byte	0x13f
+	.byte	0x10
+	.uleb128 0xe
+	.4byte	.LASF187
+	.byte	0x24
+	.byte	0x22
+	.4byte	0x15a
+	.byte	0x18
+	.uleb128 0xe
+	.4byte	.LASF188
+	.byte	0x24
+	.byte	0x23
+	.4byte	0xac0
+	.byte	0x20
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x13f
+	.uleb128 0x21
+	.byte	0x8
+	.byte	0x24
+	.byte	0x29
+	.4byte	0xae5
+	.uleb128 0x22
+	.4byte	.LASF189
+	.byte	0x24
+	.byte	0x2a
+	.4byte	0xae5
+	.uleb128 0x22
+	.4byte	.LASF190
+	.byte	0x24
+	.byte	0x2b
+	.4byte	0xb10
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x9dd
+	.uleb128 0xd
+	.4byte	.LASF191
+	.byte	0x8
+	.byte	0x25
+	.byte	0xa
+	.4byte	0xb10
+	.uleb128 0xe
+	.4byte	.LASF174
+	.byte	0x25
+	.byte	0xb
+	.4byte	0x22bb
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF175
+	.byte	0x25
+	.byte	0xc
+	.4byte	0x12f
+	.byte	0x4
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xaeb
+	.uleb128 0xf
+	.byte	0x18
+	.byte	0x24
+	.byte	0x26
+	.4byte	0xb49
+	.uleb128 0xe
+	.4byte	.LASF192
+	.byte	0x24
+	.byte	0x27
+	.4byte	0x2a5
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF193
+	.byte	0x24
+	.byte	0x28
+	.4byte	0xa4c
+	.byte	0x4
+	.uleb128 0x23
+	.4byte	0xac6
+	.byte	0x8
+	.uleb128 0xe
+	.4byte	.LASF194
+	.byte	0x24
+	.byte	0x2d
+	.4byte	0x15a
+	.byte	0x10
+	.byte	0
+	.uleb128 0xf
+	.byte	0x20
+	.byte	0x24
+	.byte	0x30
+	.4byte	0xb8e
+	.uleb128 0xe
+	.4byte	.LASF195
+	.byte	0x24
+	.byte	0x31
+	.4byte	0xb93
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF196
+	.byte	0x24
+	.byte	0x32
+	.4byte	0xc6
+	.byte	0x8
+	.uleb128 0xe
+	.4byte	.LASF197
+	.byte	0x24
+	.byte	0x33
+	.4byte	0xc6
+	.byte	0xc
+	.uleb128 0xe
+	.4byte	.LASF174
+	.byte	0x24
+	.byte	0x34
+	.4byte	0x29
+	.byte	0x10
+	.uleb128 0xe
+	.4byte	.LASF175
+	.byte	0x24
+	.byte	0x35
+	.4byte	0x29
+	.byte	0x18
+	.byte	0
+	.uleb128 0x24
+	.4byte	.LASF244
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xb8e
+	.uleb128 0x21
+	.byte	0x28
+	.byte	0x24
+	.byte	0x1b
+	.4byte	0xbc3
+	.uleb128 0x22
+	.4byte	.LASF198
+	.byte	0x24
+	.byte	0x24
+	.4byte	0xa6f
+	.uleb128 0x22
+	.4byte	.LASF199
+	.byte	0x24
+	.byte	0x2e
+	.4byte	0xb16
+	.uleb128 0x22
+	.4byte	.LASF106
+	.byte	0x24
+	.byte	0x36
+	.4byte	0xb49
+	.byte	0
+	.uleb128 0xd
+	.4byte	.LASF200
+	.byte	0x30
+	.byte	0x24
+	.byte	0x19
+	.4byte	0xbe1
+	.uleb128 0x20
+	.string	"fn"
+	.byte	0x24
+	.byte	0x1a
+	.4byte	0xbf6
+	.byte	0
+	.uleb128 0x23
+	.4byte	0xb99
+	.byte	0x8
+	.byte	0
+	.uleb128 0x14
+	.4byte	0x199
+	.4byte	0xbf0
+	.uleb128 0x11
+	.4byte	0xbf0
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xbc3
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xbe1
+	.uleb128 0x19
+	.4byte	.LASF201
+	.byte	0x26
+	.byte	0xb7
+	.4byte	0x14f
+	.uleb128 0x19
+	.4byte	.LASF202
+	.byte	0x26
+	.byte	0xbc
+	.4byte	0x15a
+	.uleb128 0x19
+	.4byte	.LASF203
+	.byte	0x26
+	.byte	0xbf
+	.4byte	0x15a
+	.uleb128 0x25
+	.4byte	.LASF311
+	.byte	0x33
+	.byte	0x8
+	.4byte	0x29
+	.uleb128 0x8
+	.4byte	.LASF204
+	.byte	0x27
+	.byte	0x22
+	.4byte	0x29
+	.uleb128 0xd
+	.4byte	.LASF205
+	.byte	0x20
+	.byte	0x27
+	.byte	0x27
+	.4byte	0xc70
+	.uleb128 0xe
+	.4byte	.LASF171
+	.byte	0x27
+	.byte	0x28
+	.4byte	0x29
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF206
+	.byte	0x27
+	.byte	0x29
+	.4byte	0xc28
+	.byte	0x8
+	.uleb128 0xe
+	.4byte	.LASF207
+	.byte	0x27
+	.byte	0x2b
+	.4byte	0x15a
+	.byte	0x10
+	.uleb128 0xe
+	.4byte	.LASF208
+	.byte	0x27
+	.byte	0x2d
+	.4byte	0xc6
+	.byte	0x18
+	.byte	0
+	.uleb128 0x19
+	.4byte	.LASF209
+	.byte	0x28
+	.byte	0x34
+	.4byte	0x6d
+	.uleb128 0x19
+	.4byte	.LASF210
+	.byte	0x28
+	.byte	0x34
+	.4byte	0x6d
+	.uleb128 0x19
+	.4byte	.LASF211
+	.byte	0x28
+	.byte	0x3f
+	.4byte	0x29
+	.uleb128 0x5
+	.4byte	0xca1
+	.4byte	0xca1
+	.uleb128 0x6
+	.4byte	0x4f
+	.byte	0x1f
+	.byte	0
+	.uleb128 0x2
+	.byte	0x10
+	.byte	0x7
+	.4byte	.LASF212
+	.uleb128 0x5
+	.4byte	0xd2
+	.4byte	0xcb8
+	.uleb128 0x6
+	.4byte	0x4f
+	.byte	0x2
+	.byte	0
+	.uleb128 0x26
+	.4byte	.LASF213
+	.2byte	0x210
+	.byte	0x29
+	.byte	0x4f
+	.4byte	0xcf9
+	.uleb128 0xe
+	.4byte	.LASF214
+	.byte	0x29
+	.byte	0x50
+	.4byte	0xc91
+	.byte	0
+	.uleb128 0x27
+	.4byte	.LASF215
+	.byte	0x29
+	.byte	0x51
+	.4byte	0xd2
+	.2byte	0x200
+	.uleb128 0x27
+	.4byte	.LASF216
+	.byte	0x29
+	.byte	0x52
+	.4byte	0xd2
+	.2byte	0x204
+	.uleb128 0x27
+	.4byte	.LASF217
+	.byte	0x29
+	.byte	0x53
+	.4byte	0xcf9
+	.2byte	0x208
+	.byte	0
+	.uleb128 0x5
+	.4byte	0xd2
+	.4byte	0xd09
+	.uleb128 0x6
+	.4byte	0x4f
+	.byte	0x1
+	.byte	0
+	.uleb128 0xf
+	.byte	0x2
+	.byte	0x2a
+	.byte	0x29
+	.4byte	0xd2a
+	.uleb128 0xe
+	.4byte	.LASF218
+	.byte	0x2a
+	.byte	0x2a
+	.4byte	0x110
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF219
+	.byte	0x2a
+	.byte	0x2b
+	.4byte	0x110
+	.byte	0x1
+	.byte	0
+	.uleb128 0xf
+	.byte	0x4
+	.byte	0x2a
+	.byte	0x2d
+	.4byte	0xd4b
+	.uleb128 0xe
+	.4byte	.LASF220
+	.byte	0x2a
+	.byte	0x2e
+	.4byte	0x11f
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF221
+	.byte	0x2a
+	.byte	0x2f
+	.4byte	0x11f
+	.byte	0x2
+	.byte	0
+	.uleb128 0x21
+	.byte	0x4
+	.byte	0x2a
+	.byte	0x20
+	.4byte	0xd69
+	.uleb128 0x28
+	.string	"val"
+	.byte	0x2a
+	.byte	0x21
+	.4byte	0x37c
+	.uleb128 0x29
+	.4byte	0xd09
+	.uleb128 0x29
+	.4byte	0xd2a
+	.byte	0
+	.uleb128 0xd
+	.4byte	.LASF222
+	.byte	0x4
+	.byte	0x2a
+	.byte	0x1f
+	.4byte	0xd7c
+	.uleb128 0x23
+	.4byte	0xd4b
+	.byte	0
+	.byte	0
+	.uleb128 0x8
+	.4byte	.LASF223
+	.byte	0x2a
+	.byte	0x3d
+	.4byte	0xd69
+	.uleb128 0xf
+	.byte	0x4
+	.byte	0x2b
+	.byte	0x10
+	.4byte	0xda8
+	.uleb128 0xe
+	.4byte	.LASF224
+	.byte	0x2b
+	.byte	0x12
+	.4byte	0x110
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF225
+	.byte	0x2b
+	.byte	0x13
+	.4byte	0xda8
+	.byte	0x1
+	.byte	0
+	.uleb128 0x5
+	.4byte	0x110
+	.4byte	0xdb8
+	.uleb128 0x6
+	.4byte	0x4f
+	.byte	0x2
+	.byte	0
+	.uleb128 0x21
+	.byte	0x4
+	.byte	0x2b
+	.byte	0xe
+	.4byte	0xdd1
+	.uleb128 0x22
+	.4byte	.LASF226
+	.byte	0x2b
+	.byte	0xf
+	.4byte	0x37c
+	.uleb128 0x29
+	.4byte	0xd87
+	.byte	0
+	.uleb128 0xd
+	.4byte	.LASF227
+	.byte	0x8
+	.byte	0x2b
+	.byte	0xd
+	.4byte	0xdf0
+	.uleb128 0x23
+	.4byte	0xdb8
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF228
+	.byte	0x2b
+	.byte	0x1a
+	.4byte	0xd7c
+	.byte	0x4
+	.byte	0
+	.uleb128 0x8
+	.4byte	.LASF229
+	.byte	0x2b
+	.byte	0x1b
+	.4byte	0xdd1
+	.uleb128 0x19
+	.4byte	.LASF230
+	.byte	0x2c
+	.byte	0x11
+	.4byte	0xc6
+	.uleb128 0x19
+	.4byte	.LASF231
+	.byte	0x2c
+	.byte	0x12
+	.4byte	0xc6
+	.uleb128 0x2a
+	.4byte	.LASF958
+	.byte	0
+	.byte	0x2c
+	.2byte	0x1b1
+	.uleb128 0xd
+	.4byte	.LASF232
+	.byte	0x4
+	.byte	0x2d
+	.byte	0x14
+	.4byte	0xe33
+	.uleb128 0xe
+	.4byte	.LASF233
+	.byte	0x2d
+	.byte	0x15
+	.4byte	0xd7c
+	.byte	0
+	.byte	0
+	.uleb128 0x8
+	.4byte	.LASF234
+	.byte	0x2d
+	.byte	0x1d
+	.4byte	0xe1a
+	.uleb128 0x21
+	.byte	0x4
+	.byte	0x2d
+	.byte	0x3e
+	.4byte	0xe52
+	.uleb128 0x22
+	.4byte	.LASF235
+	.byte	0x2d
+	.byte	0x3f
+	.4byte	0xe1a
+	.byte	0
+	.uleb128 0xd
+	.4byte	.LASF236
+	.byte	0x4
+	.byte	0x2d
+	.byte	0x3d
+	.4byte	0xe65
+	.uleb128 0x23
+	.4byte	0xe3e
+	.byte	0
+	.byte	0
+	.uleb128 0x8
+	.4byte	.LASF237
+	.byte	0x2d
+	.byte	0x49
+	.4byte	0xe52
+	.uleb128 0xf
+	.byte	0x8
+	.byte	0x2e
+	.byte	0xb
+	.4byte	0xe85
+	.uleb128 0xe
+	.4byte	.LASF233
+	.byte	0x2e
+	.byte	0xc
+	.4byte	0xdf0
+	.byte	0
+	.byte	0
+	.uleb128 0x8
+	.4byte	.LASF238
+	.byte	0x2e
+	.byte	0x14
+	.4byte	0xe70
+	.uleb128 0x19
+	.4byte	.LASF239
+	.byte	0x2f
+	.byte	0x4f
+	.4byte	0x2b0
+	.uleb128 0x21
+	.byte	0x8
+	.byte	0x2f
+	.byte	0x66
+	.4byte	0xec5
+	.uleb128 0x22
+	.4byte	.LASF193
+	.byte	0x2f
+	.byte	0x67
+	.4byte	0x29
+	.uleb128 0x22
+	.4byte	.LASF240
+	.byte	0x2f
+	.byte	0x68
+	.4byte	0xef6
+	.uleb128 0x22
+	.4byte	.LASF64
+	.byte	0x2f
+	.byte	0x69
+	.4byte	0xf01
+	.byte	0
+	.uleb128 0xd
+	.4byte	.LASF241
+	.byte	0x18
+	.byte	0x30
+	.byte	0x3b
+	.4byte	0xef6
+	.uleb128 0xe
+	.4byte	.LASF242
+	.byte	0x30
+	.byte	0x3c
+	.4byte	0xf26
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF243
+	.byte	0x30
+	.byte	0x3d
+	.4byte	0xf26
+	.byte	0x8
+	.uleb128 0x20
+	.string	"key"
+	.byte	0x30
+	.byte	0x3e
+	.4byte	0xf26
+	.byte	0x10
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xec5
+	.uleb128 0x24
+	.4byte	.LASF245
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xefc
+	.uleb128 0xd
+	.4byte	.LASF246
+	.byte	0x10
+	.byte	0x2f
+	.byte	0x57
+	.4byte	0xf26
+	.uleb128 0xe
+	.4byte	.LASF247
+	.byte	0x2f
+	.byte	0x58
+	.4byte	0x37c
+	.byte	0
+	.uleb128 0x23
+	.4byte	0xe9b
+	.byte	0x8
+	.byte	0
+	.uleb128 0x8
+	.4byte	.LASF248
+	.byte	0x30
+	.byte	0x39
+	.4byte	0x15a
+	.uleb128 0x5
+	.4byte	0xec5
+	.4byte	0xf3c
+	.uleb128 0x18
+	.byte	0
+	.uleb128 0x19
+	.4byte	.LASF249
+	.byte	0x2f
+	.byte	0x92
+	.4byte	0xf31
+	.uleb128 0x19
+	.4byte	.LASF250
+	.byte	0x2f
+	.byte	0x93
+	.4byte	0xf31
+	.uleb128 0x1d
+	.4byte	.LASF251
+	.byte	0x10
+	.byte	0x2f
+	.2byte	0x120
+	.4byte	0xf6d
+	.uleb128 0x2b
+	.string	"key"
+	.byte	0x2f
+	.2byte	0x121
+	.4byte	0xf07
+	.byte	0
+	.byte	0
+	.uleb128 0x1f
+	.4byte	.LASF252
+	.byte	0x4
+	.4byte	0x6d
+	.byte	0x31
+	.byte	0x2f
+	.4byte	0xf96
+	.uleb128 0xc
+	.4byte	.LASF253
+	.byte	0
+	.uleb128 0xc
+	.4byte	.LASF254
+	.byte	0x1
+	.uleb128 0xc
+	.4byte	.LASF255
+	.byte	0x2
+	.uleb128 0xc
+	.4byte	.LASF256
+	.byte	0x3
+	.byte	0
+	.uleb128 0xd
+	.4byte	.LASF257
+	.byte	0x18
+	.byte	0x31
+	.byte	0x42
+	.4byte	0xff7
+	.uleb128 0xe
+	.4byte	.LASF258
+	.byte	0x31
+	.byte	0x43
+	.4byte	0x2b0
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF259
+	.byte	0x31
+	.byte	0x44
+	.4byte	0x2b0
+	.byte	0x1
+	.uleb128 0xe
+	.4byte	.LASF260
+	.byte	0x31
+	.byte	0x45
+	.4byte	0x2b0
+	.byte	0x2
+	.uleb128 0xe
+	.4byte	.LASF193
+	.byte	0x31
+	.byte	0x46
+	.4byte	0xf6d
+	.byte	0x4
+	.uleb128 0xe
+	.4byte	.LASF261
+	.byte	0x31
+	.byte	0x47
+	.4byte	0x110
+	.byte	0x8
+	.uleb128 0xe
+	.4byte	.LASF262
+	.byte	0x31
+	.byte	0x48
+	.4byte	0x110
+	.byte	0x9
+	.uleb128 0xe
+	.4byte	.LASF263
+	.byte	0x31
+	.byte	0x49
+	.4byte	0x14f
+	.byte	0x10
+	.byte	0
+	.uleb128 0x3
+	.4byte	0xf96
+	.uleb128 0xd
+	.4byte	.LASF264
+	.byte	0x30
+	.byte	0x31
+	.byte	0x51
+	.4byte	0x1051
+	.uleb128 0xe
+	.4byte	.LASF265
+	.byte	0x31
+	.byte	0x52
+	.4byte	0x56
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF266
+	.byte	0x31
+	.byte	0x53
+	.4byte	0x15a
+	.byte	0x8
+	.uleb128 0xe
+	.4byte	.LASF267
+	.byte	0x31
+	.byte	0x54
+	.4byte	0x15a
+	.byte	0x10
+	.uleb128 0xe
+	.4byte	.LASF268
+	.byte	0x31
+	.byte	0x55
+	.4byte	0x15a
+	.byte	0x18
+	.uleb128 0xe
+	.4byte	.LASF269
+	.byte	0x31
+	.byte	0x56
+	.4byte	0x15a
+	.byte	0x20
+	.uleb128 0xe
+	.4byte	.LASF270
+	.byte	0x31
+	.byte	0x57
+	.4byte	0x1051
+	.byte	0x28
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xff7
+	.uleb128 0x19
+	.4byte	.LASF271
+	.byte	0x31
+	.byte	0x5a
+	.4byte	0xffc
+	.uleb128 0x5
+	.4byte	0x29
+	.4byte	0x1072
+	.uleb128 0x6
+	.4byte	0x4f
+	.byte	0
+	.byte	0
+	.uleb128 0x15
+	.4byte	.LASF272
+	.byte	0x31
+	.2byte	0x165
+	.4byte	0x1062
+	.uleb128 0x5
+	.4byte	0xf52
+	.4byte	0x108e
+	.uleb128 0x6
+	.4byte	0x4f
+	.byte	0x3d
+	.byte	0
+	.uleb128 0x15
+	.4byte	.LASF273
+	.byte	0x31
+	.2byte	0x166
+	.4byte	0x107e
+	.uleb128 0x15
+	.4byte	.LASF274
+	.byte	0x31
+	.2byte	0x167
+	.4byte	0xf52
+	.uleb128 0x19
+	.4byte	.LASF275
+	.byte	0x32
+	.byte	0x23
+	.4byte	0x500
+	.uleb128 0x19
+	.4byte	.LASF276
+	.byte	0x32
+	.byte	0x23
+	.4byte	0x500
+	.uleb128 0x19
+	.4byte	.LASF277
+	.byte	0x32
+	.byte	0x23
+	.4byte	0x500
+	.uleb128 0x19
+	.4byte	.LASF278
+	.byte	0x32
+	.byte	0x24
+	.4byte	0x500
+	.uleb128 0x19
+	.4byte	.LASF279
+	.byte	0x32
+	.byte	0x24
+	.4byte	0x500
+	.uleb128 0x19
+	.4byte	.LASF280
+	.byte	0x32
+	.byte	0x24
+	.4byte	0x500
+	.uleb128 0x19
+	.4byte	.LASF281
+	.byte	0x32
+	.byte	0x25
+	.4byte	0x500
+	.uleb128 0x19
+	.4byte	.LASF282
+	.byte	0x32
+	.byte	0x25
+	.4byte	0x500
+	.uleb128 0x19
+	.4byte	.LASF283
+	.byte	0x32
+	.byte	0x26
+	.4byte	0x500
+	.uleb128 0x19
+	.4byte	.LASF284
+	.byte	0x32
+	.byte	0x26
+	.4byte	0x500
+	.uleb128 0x19
+	.4byte	.LASF285
+	.byte	0x32
+	.byte	0x27
+	.4byte	0x500
+	.uleb128 0x19
+	.4byte	.LASF286
+	.byte	0x32
+	.byte	0x27
+	.4byte	0x500
+	.uleb128 0x19
+	.4byte	.LASF287
+	.byte	0x32
+	.byte	0x28
+	.4byte	0x500
+	.uleb128 0x19
+	.4byte	.LASF288
+	.byte	0x32
+	.byte	0x28
+	.4byte	0x500
+	.uleb128 0x19
+	.4byte	.LASF289
+	.byte	0x32
+	.byte	0x29
+	.4byte	0x500
+	.uleb128 0x19
+	.4byte	.LASF290
+	.byte	0x32
+	.byte	0x2a
+	.4byte	0x500
+	.uleb128 0x19
+	.4byte	.LASF291
+	.byte	0x32
+	.byte	0x2a
+	.4byte	0x500
+	.uleb128 0x19
+	.4byte	.LASF292
+	.byte	0x32
+	.byte	0x2a
+	.4byte	0x500
+	.uleb128 0x19
+	.4byte	.LASF293
+	.byte	0x32
+	.byte	0x2b
+	.4byte	0x500
+	.uleb128 0x19
+	.4byte	.LASF294
+	.byte	0x32
+	.byte	0x2b
+	.4byte	0x500
+	.uleb128 0x19
+	.4byte	.LASF295
+	.byte	0x32
+	.byte	0x2c
+	.4byte	0x500
+	.uleb128 0x19
+	.4byte	.LASF296
+	.byte	0x32
+	.byte	0x2c
+	.4byte	0x500
+	.uleb128 0x19
+	.4byte	.LASF297
+	.byte	0x32
+	.byte	0x2d
+	.4byte	0x500
+	.uleb128 0x19
+	.4byte	.LASF298
+	.byte	0x32
+	.byte	0x2d
+	.4byte	0x500
+	.uleb128 0x19
+	.4byte	.LASF299
+	.byte	0x32
+	.byte	0x2e
+	.4byte	0x500
+	.uleb128 0x19
+	.4byte	.LASF300
+	.byte	0x32
+	.byte	0x2e
+	.4byte	0x500
+	.uleb128 0x19
+	.4byte	.LASF301
+	.byte	0x32
+	.byte	0x2f
+	.4byte	0x500
+	.uleb128 0x19
+	.4byte	.LASF302
+	.byte	0x32
+	.byte	0x2f
+	.4byte	0x500
+	.uleb128 0x19
+	.4byte	.LASF303
+	.byte	0x32
+	.byte	0x30
+	.4byte	0x500
+	.uleb128 0x19
+	.4byte	.LASF304
+	.byte	0x32
+	.byte	0x30
+	.4byte	0x500
+	.uleb128 0x19
+	.4byte	.LASF305
+	.byte	0x32
+	.byte	0x33
+	.4byte	0x500
+	.uleb128 0x19
+	.4byte	.LASF306
+	.byte	0x32
+	.byte	0x33
+	.4byte	0x500
+	.uleb128 0x19
+	.4byte	.LASF307
+	.byte	0x32
+	.byte	0x36
+	.4byte	0x500
+	.uleb128 0x19
+	.4byte	.LASF308
+	.byte	0x32
+	.byte	0x36
+	.4byte	0x500
+	.uleb128 0x19
+	.4byte	.LASF309
+	.byte	0x32
+	.byte	0x39
+	.4byte	0x500
+	.uleb128 0x19
+	.4byte	.LASF310
+	.byte	0x32
+	.byte	0x39
+	.4byte	0x500
+	.uleb128 0x2c
+	.4byte	.LASF312
+	.byte	0x32
+	.byte	0x3b
+	.uleb128 0x2c
+	.4byte	.LASF313
+	.byte	0x32
+	.byte	0x3b
+	.uleb128 0x19
+	.4byte	.LASF314
+	.byte	0x34
+	.byte	0x15
+	.4byte	0x500
+	.uleb128 0x19
+	.4byte	.LASF315
+	.byte	0x34
+	.byte	0x15
+	.4byte	0x500
+	.uleb128 0x19
+	.4byte	.LASF316
+	.byte	0x34
+	.byte	0x16
+	.4byte	0x500
+	.uleb128 0x19
+	.4byte	.LASF317
+	.byte	0x34
+	.byte	0x16
+	.4byte	0x500
+	.uleb128 0x19
+	.4byte	.LASF318
+	.byte	0x34
+	.byte	0x17
+	.4byte	0x500
+	.uleb128 0x19
+	.4byte	.LASF319
+	.byte	0x34
+	.byte	0x17
+	.4byte	0x500
+	.uleb128 0x19
+	.4byte	.LASF320
+	.byte	0x34
+	.byte	0x18
+	.4byte	0x500
+	.uleb128 0x19
+	.4byte	.LASF321
+	.byte	0x34
+	.byte	0x18
+	.4byte	0x500
+	.uleb128 0x19
+	.4byte	.LASF322
+	.byte	0x34
+	.byte	0x19
+	.4byte	0x500
+	.uleb128 0x19
+	.4byte	.LASF323
+	.byte	0x34
+	.byte	0x19
+	.4byte	0x500
+	.uleb128 0x19
+	.4byte	.LASF324
+	.byte	0x34
+	.byte	0x1a
+	.4byte	0x500
+	.uleb128 0x19
+	.4byte	.LASF325
+	.byte	0x34
+	.byte	0x1a
+	.4byte	0x500
+	.uleb128 0x19
+	.4byte	.LASF326
+	.byte	0x34
+	.byte	0x1b
+	.4byte	0x500
+	.uleb128 0x19
+	.4byte	.LASF327
+	.byte	0x34
+	.byte	0x1b
+	.4byte	0x500
+	.uleb128 0x19
+	.4byte	.LASF328
+	.byte	0x34
+	.byte	0x1c
+	.4byte	0x500
+	.uleb128 0x19
+	.4byte	.LASF329
+	.byte	0x34
+	.byte	0x1c
+	.4byte	0x500
+	.uleb128 0x19
+	.4byte	.LASF330
+	.byte	0x34
+	.byte	0x1e
+	.4byte	0x500
+	.uleb128 0x19
+	.4byte	.LASF331
+	.byte	0x34
+	.byte	0x1e
+	.4byte	0x500
+	.uleb128 0x19
+	.4byte	.LASF332
+	.byte	0x34
+	.byte	0x1f
+	.4byte	0x500
+	.uleb128 0x19
+	.4byte	.LASF333
+	.byte	0x34
+	.byte	0x1f
+	.4byte	0x500
+	.uleb128 0x5
+	.4byte	0x13f
+	.4byte	0x132c
+	.uleb128 0x6
+	.4byte	0x4f
+	.byte	0x1
+	.byte	0
+	.uleb128 0x19
+	.4byte	.LASF334
+	.byte	0x35
+	.byte	0x4a
+	.4byte	0x131c
+	.uleb128 0x19
+	.4byte	.LASF335
+	.byte	0x36
+	.byte	0x56
+	.4byte	0x346
+	.uleb128 0x26
+	.4byte	.LASF336
+	.2byte	0x110
+	.byte	0x36
+	.byte	0x59
+	.4byte	0x138c
+	.uleb128 0xe
+	.4byte	.LASF337
+	.byte	0x36
+	.byte	0x5c
+	.4byte	0xc6
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF338
+	.byte	0x36
+	.byte	0x5e
+	.4byte	0xc6
+	.byte	0x4
+	.uleb128 0xe
+	.4byte	.LASF339
+	.byte	0x36
+	.byte	0x5f
+	.4byte	0xc6
+	.byte	0x8
+	.uleb128 0xe
+	.4byte	.LASF340
+	.byte	0x36
+	.byte	0x61
+	.4byte	0x138c
+	.byte	0x10
+	.uleb128 0xe
+	.4byte	.LASF341
+	.byte	0x36
+	.byte	0x62
+	.4byte	0x138c
+	.byte	0x90
+	.byte	0
+	.uleb128 0x5
+	.4byte	0x139c
+	.4byte	0x139c
+	.uleb128 0x6
+	.4byte	0x4f
+	.byte	0xf
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x13a2
+	.uleb128 0x24
+	.4byte	.LASF342
+	.uleb128 0xd
+	.4byte	.LASF343
+	.byte	0x68
+	.byte	0x36
+	.byte	0x66
+	.4byte	0x144d
+	.uleb128 0x20
+	.string	"x19"
+	.byte	0x36
+	.byte	0x67
+	.4byte	0x29
+	.byte	0
+	.uleb128 0x20
+	.string	"x20"
+	.byte	0x36
+	.byte	0x68
+	.4byte	0x29
+	.byte	0x8
+	.uleb128 0x20
+	.string	"x21"
+	.byte	0x36
+	.byte	0x69
+	.4byte	0x29
+	.byte	0x10
+	.uleb128 0x20
+	.string	"x22"
+	.byte	0x36
+	.byte	0x6a
+	.4byte	0x29
+	.byte	0x18
+	.uleb128 0x20
+	.string	"x23"
+	.byte	0x36
+	.byte	0x6b
+	.4byte	0x29
+	.byte	0x20
+	.uleb128 0x20
+	.string	"x24"
+	.byte	0x36
+	.byte	0x6c
+	.4byte	0x29
+	.byte	0x28
+	.uleb128 0x20
+	.string	"x25"
+	.byte	0x36
+	.byte	0x6d
+	.4byte	0x29
+	.byte	0x30
+	.uleb128 0x20
+	.string	"x26"
+	.byte	0x36
+	.byte	0x6e
+	.4byte	0x29
+	.byte	0x38
+	.uleb128 0x20
+	.string	"x27"
+	.byte	0x36
+	.byte	0x6f
+	.4byte	0x29
+	.byte	0x40
+	.uleb128 0x20
+	.string	"x28"
+	.byte	0x36
+	.byte	0x70
+	.4byte	0x29
+	.byte	0x48
+	.uleb128 0x20
+	.string	"fp"
+	.byte	0x36
+	.byte	0x71
+	.4byte	0x29
+	.byte	0x50
+	.uleb128 0x20
+	.string	"sp"
+	.byte	0x36
+	.byte	0x72
+	.4byte	0x29
+	.byte	0x58
+	.uleb128 0x20
+	.string	"pc"
+	.byte	0x36
+	.byte	0x73
+	.4byte	0x29
+	.byte	0x60
+	.byte	0
+	.uleb128 0x2d
+	.2byte	0x220
+	.byte	0x36
+	.byte	0x7e
+	.4byte	0x147b
+	.uleb128 0xe
+	.4byte	.LASF344
+	.byte	0x36
+	.byte	0x7f
+	.4byte	0x29
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF345
+	.byte	0x36
+	.byte	0x80
+	.4byte	0x29
+	.byte	0x8
+	.uleb128 0xe
+	.4byte	.LASF346
+	.byte	0x36
+	.byte	0x81
+	.4byte	0xcb8
+	.byte	0x10
+	.byte	0
+	.uleb128 0x26
+	.4byte	.LASF347
+	.2byte	0x3d0
+	.byte	0x36
+	.byte	0x76
+	.4byte	0x14fb
+	.uleb128 0xe
+	.4byte	.LASF343
+	.byte	0x36
+	.byte	0x77
+	.4byte	0x13a7
+	.byte	0
+	.uleb128 0x20
+	.string	"uw"
+	.byte	0x36
+	.byte	0x82
+	.4byte	0x144d
+	.byte	0x70
+	.uleb128 0x27
+	.4byte	.LASF348
+	.byte	0x36
+	.byte	0x84
+	.4byte	0x6d
+	.2byte	0x290
+	.uleb128 0x27
+	.4byte	.LASF349
+	.byte	0x36
+	.byte	0x85
+	.4byte	0x458
+	.2byte	0x298
+	.uleb128 0x27
+	.4byte	.LASF350
+	.byte	0x36
+	.byte	0x86
+	.4byte	0x6d
+	.2byte	0x2a0
+	.uleb128 0x27
+	.4byte	.LASF351
+	.byte	0x36
+	.byte	0x87
+	.4byte	0x6d
+	.2byte	0x2a4
+	.uleb128 0x27
+	.4byte	.LASF352
+	.byte	0x36
+	.byte	0x88
+	.4byte	0x29
+	.2byte	0x2a8
+	.uleb128 0x27
+	.4byte	.LASF353
+	.byte	0x36
+	.byte	0x89
+	.4byte	0x29
+	.2byte	0x2b0
+	.uleb128 0x27
+	.4byte	.LASF354
+	.byte	0x36
+	.byte	0x8a
+	.4byte	0x1342
+	.2byte	0x2b8
+	.byte	0
+	.uleb128 0x15
+	.4byte	.LASF355
+	.byte	0x36
+	.2byte	0x111
+	.4byte	0x29
+	.uleb128 0x19
+	.4byte	.LASF356
+	.byte	0x37
+	.byte	0x59
+	.4byte	0xc6
+	.uleb128 0x19
+	.4byte	.LASF357
+	.byte	0x38
+	.byte	0x30
+	.4byte	0x500
+	.uleb128 0x19
+	.4byte	.LASF358
+	.byte	0x38
+	.byte	0x30
+	.4byte	0x500
+	.uleb128 0xd
+	.4byte	.LASF359
+	.byte	0x28
+	.byte	0x39
+	.byte	0x1c
+	.4byte	0x1565
+	.uleb128 0xe
+	.4byte	.LASF171
+	.byte	0x39
+	.byte	0x1d
+	.4byte	0x6d
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF360
+	.byte	0x39
+	.byte	0x1e
+	.4byte	0x458
+	.byte	0x8
+	.uleb128 0xe
+	.4byte	.LASF71
+	.byte	0x39
+	.byte	0x1f
+	.4byte	0x1565
+	.byte	0x10
+	.uleb128 0xe
+	.4byte	.LASF361
+	.byte	0x39
+	.byte	0x20
+	.4byte	0x3a7
+	.byte	0x18
+	.byte	0
+	.uleb128 0x8
+	.4byte	.LASF362
+	.byte	0x39
+	.byte	0x11
+	.4byte	0x1570
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x1576
+	.uleb128 0x14
+	.4byte	0xc6
+	.4byte	0x1594
+	.uleb128 0x11
+	.4byte	0x1594
+	.uleb128 0x11
+	.4byte	0x6d
+	.uleb128 0x11
+	.4byte	0xc6
+	.uleb128 0x11
+	.4byte	0x458
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x1528
+	.uleb128 0xd
+	.4byte	.LASF363
+	.byte	0x18
+	.byte	0x39
+	.byte	0x23
+	.4byte	0x15bf
+	.uleb128 0xe
+	.4byte	.LASF116
+	.byte	0x39
+	.byte	0x24
+	.4byte	0xe65
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF136
+	.byte	0x39
+	.byte	0x25
+	.4byte	0x3a7
+	.byte	0x8
+	.byte	0
+	.uleb128 0x8
+	.4byte	.LASF364
+	.byte	0x39
+	.byte	0x27
+	.4byte	0x159a
+	.uleb128 0xd
+	.4byte	.LASF365
+	.byte	0x8
+	.byte	0x3a
+	.byte	0x10
+	.4byte	0x15e3
+	.uleb128 0xe
+	.4byte	.LASF366
+	.byte	0x3a
+	.byte	0x10
+	.4byte	0x1062
+	.byte	0
+	.byte	0
+	.uleb128 0x3
+	.4byte	0x15ca
+	.uleb128 0x8
+	.4byte	.LASF367
+	.byte	0x3a
+	.byte	0x10
+	.4byte	0x15ca
+	.uleb128 0x19
+	.4byte	.LASF368
+	.byte	0x3a
+	.byte	0x26
+	.4byte	0x6d
+	.uleb128 0x19
+	.4byte	.LASF369
+	.byte	0x3a
+	.byte	0x59
+	.4byte	0x15ca
+	.uleb128 0x19
+	.4byte	.LASF370
+	.byte	0x3a
+	.byte	0x5a
+	.4byte	0x15ca
+	.uleb128 0x19
+	.4byte	.LASF371
+	.byte	0x3a
+	.byte	0x5b
+	.4byte	0x15ca
+	.uleb128 0x19
+	.4byte	.LASF372
+	.byte	0x3a
+	.byte	0x5c
+	.4byte	0x15ca
+	.uleb128 0x13
+	.4byte	.LASF373
+	.byte	0x3a
+	.2byte	0x2d2
+	.4byte	0x1636
+	.uleb128 0x5
+	.4byte	0x15ca
+	.4byte	0x1646
+	.uleb128 0x6
+	.4byte	0x4f
+	.byte	0
+	.byte	0
+	.uleb128 0x5
+	.4byte	0x30
+	.4byte	0x1656
+	.uleb128 0x6
+	.4byte	0x4f
+	.byte	0
+	.byte	0
+	.uleb128 0x3
+	.4byte	0x1646
+	.uleb128 0x15
+	.4byte	.LASF374
+	.byte	0x3a
+	.2byte	0x303
+	.4byte	0x1656
+	.uleb128 0x5
+	.4byte	0x30
+	.4byte	0x167d
+	.uleb128 0x6
+	.4byte	0x4f
+	.byte	0x40
+	.uleb128 0x6
+	.4byte	0x4f
+	.byte	0
+	.byte	0
+	.uleb128 0x3
+	.4byte	0x1667
+	.uleb128 0x15
+	.4byte	.LASF375
+	.byte	0x3a
+	.2byte	0x357
+	.4byte	0x167d
+	.uleb128 0x19
+	.4byte	.LASF376
+	.byte	0x3b
+	.byte	0x67
+	.4byte	0xc6
+	.uleb128 0xd
+	.4byte	.LASF377
+	.byte	0x8
+	.byte	0x3c
+	.byte	0x22
+	.4byte	0x16b2
+	.uleb128 0xe
+	.4byte	.LASF67
+	.byte	0x3c
+	.byte	0x23
+	.4byte	0x16d7
+	.byte	0
+	.byte	0
+	.uleb128 0xd
+	.4byte	.LASF378
+	.byte	0x10
+	.byte	0x3c
+	.byte	0x26
+	.4byte	0x16d7
+	.uleb128 0xe
+	.4byte	.LASF64
+	.byte	0x3c
+	.byte	0x27
+	.4byte	0x16d7
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF69
+	.byte	0x3c
+	.byte	0x27
+	.4byte	0x16dd
+	.byte	0x8
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x16b2
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x16d7
+	.uleb128 0xd
+	.4byte	.LASF379
+	.byte	0x4
+	.byte	0x3d
+	.byte	0x30
+	.4byte	0x16fc
+	.uleb128 0xe
+	.4byte	.LASF380
+	.byte	0x3d
+	.byte	0x31
+	.4byte	0x6d
+	.byte	0
+	.byte	0
+	.uleb128 0x8
+	.4byte	.LASF381
+	.byte	0x3d
+	.byte	0x35
+	.4byte	0x16e3
+	.uleb128 0x2e
+	.byte	0x8
+	.byte	0x3d
+	.2byte	0x19b
+	.4byte	0x172b
+	.uleb128 0x1b
+	.4byte	.LASF379
+	.byte	0x3d
+	.2byte	0x19c
+	.4byte	0x16e3
+	.byte	0
+	.uleb128 0x1b
+	.4byte	.LASF116
+	.byte	0x3d
+	.2byte	0x19d
+	.4byte	0xe65
+	.byte	0x4
+	.byte	0
+	.uleb128 0x13
+	.4byte	.LASF382
+	.byte	0x3d
+	.2byte	0x19e
+	.4byte	0x1707
+	.uleb128 0xf
+	.byte	0x8
+	.byte	0x3e
+	.byte	0x1e
+	.4byte	0x1758
+	.uleb128 0xe
+	.4byte	.LASF116
+	.byte	0x3e
+	.byte	0x1f
+	.4byte	0xe65
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF383
+	.byte	0x3e
+	.byte	0x20
+	.4byte	0xc6
+	.byte	0x4
+	.byte	0
+	.uleb128 0x21
+	.byte	0x8
+	.byte	0x3e
+	.byte	0x1a
+	.4byte	0x1771
+	.uleb128 0x22
+	.4byte	.LASF384
+	.byte	0x3e
+	.byte	0x1c
+	.4byte	0xf4
+	.uleb128 0x29
+	.4byte	0x1737
+	.byte	0
+	.uleb128 0xd
+	.4byte	.LASF385
+	.byte	0x8
+	.byte	0x3e
+	.byte	0x19
+	.4byte	0x1784
+	.uleb128 0x23
+	.4byte	0x1758
+	.byte	0
+	.byte	0
+	.uleb128 0xf
+	.byte	0x8
+	.byte	0x3f
+	.byte	0x32
+	.4byte	0x17a5
+	.uleb128 0xe
+	.4byte	.LASF386
+	.byte	0x3f
+	.byte	0x33
+	.4byte	0x13f
+	.byte	0
+	.uleb128 0x20
+	.string	"len"
+	.byte	0x3f
+	.byte	0x33
+	.4byte	0x13f
+	.byte	0x4
+	.byte	0
+	.uleb128 0x21
+	.byte	0x8
+	.byte	0x3f
+	.byte	0x31
+	.4byte	0x17be
+	.uleb128 0x29
+	.4byte	0x1784
+	.uleb128 0x22
+	.4byte	.LASF387
+	.byte	0x3f
+	.byte	0x35
+	.4byte	0x15a
+	.byte	0
+	.uleb128 0xd
+	.4byte	.LASF388
+	.byte	0x10
+	.byte	0x3f
+	.byte	0x30
+	.4byte	0x17dd
+	.uleb128 0x23
+	.4byte	0x17a5
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF265
+	.byte	0x3f
+	.byte	0x37
+	.4byte	0x17e2
+	.byte	0x8
+	.byte	0
+	.uleb128 0x3
+	.4byte	0x17be
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x9d
+	.uleb128 0x19
+	.4byte	.LASF389
+	.byte	0x3f
+	.byte	0x3c
+	.4byte	0x17dd
+	.uleb128 0x19
+	.4byte	.LASF390
+	.byte	0x3f
+	.byte	0x3d
+	.4byte	0x17dd
+	.uleb128 0xd
+	.4byte	.LASF391
+	.byte	0x30
+	.byte	0x3f
+	.byte	0x3f
+	.4byte	0x1847
+	.uleb128 0xe
+	.4byte	.LASF392
+	.byte	0x3f
+	.byte	0x40
+	.4byte	0x199
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF393
+	.byte	0x3f
+	.byte	0x41
+	.4byte	0x199
+	.byte	0x8
+	.uleb128 0xe
+	.4byte	.LASF394
+	.byte	0x3f
+	.byte	0x42
+	.4byte	0x199
+	.byte	0x10
+	.uleb128 0xe
+	.4byte	.LASF395
+	.byte	0x3f
+	.byte	0x43
+	.4byte	0x199
+	.byte	0x18
+	.uleb128 0xe
+	.4byte	.LASF396
+	.byte	0x3f
+	.byte	0x44
+	.4byte	0x1847
+	.byte	0x20
+	.byte	0
+	.uleb128 0x5
+	.4byte	0x199
+	.4byte	0x1857
+	.uleb128 0x6
+	.4byte	0x4f
+	.byte	0x1
+	.byte	0
+	.uleb128 0x19
+	.4byte	.LASF397
+	.byte	0x3f
+	.byte	0x46
+	.4byte	0x17fe
+	.uleb128 0x21
+	.byte	0x10
+	.byte	0x3f
+	.byte	0x6b
+	.4byte	0x1881
+	.uleb128 0x22
+	.4byte	.LASF398
+	.byte	0x3f
+	.byte	0x6c
+	.4byte	0x3a7
+	.uleb128 0x22
+	.4byte	.LASF399
+	.byte	0x3f
+	.byte	0x6d
+	.4byte	0x1881
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x15bf
+	.uleb128 0x21
+	.byte	0x10
+	.byte	0x3f
+	.byte	0x74
+	.4byte	0x18b1
+	.uleb128 0x22
+	.4byte	.LASF400
+	.byte	0x3f
+	.byte	0x75
+	.4byte	0x3eb
+	.uleb128 0x22
+	.4byte	.LASF401
+	.byte	0x3f
+	.byte	0x76
+	.4byte	0x16b2
+	.uleb128 0x22
+	.4byte	.LASF402
+	.byte	0x3f
+	.byte	0x77
+	.4byte	0x41c
+	.byte	0
+	.uleb128 0xd
+	.4byte	.LASF403
+	.byte	0xd0
+	.byte	0x3f
+	.byte	0x59
+	.4byte	0x1990
+	.uleb128 0xe
+	.4byte	.LASF404
+	.byte	0x3f
+	.byte	0x5b
+	.4byte	0x6d
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF405
+	.byte	0x3f
+	.byte	0x5c
+	.4byte	0x16fc
+	.byte	0x4
+	.uleb128 0xe
+	.4byte	.LASF406
+	.byte	0x3f
+	.byte	0x5d
+	.4byte	0x16b2
+	.byte	0x8
+	.uleb128 0xe
+	.4byte	.LASF407
+	.byte	0x3f
+	.byte	0x5e
+	.4byte	0x1995
+	.byte	0x18
+	.uleb128 0xe
+	.4byte	.LASF408
+	.byte	0x3f
+	.byte	0x5f
+	.4byte	0x17be
+	.byte	0x20
+	.uleb128 0xe
+	.4byte	.LASF409
+	.byte	0x3f
+	.byte	0x60
+	.4byte	0x1c7f
+	.byte	0x30
+	.uleb128 0xe
+	.4byte	.LASF410
+	.byte	0x3f
+	.byte	0x62
+	.4byte	0x1c85
+	.byte	0x38
+	.uleb128 0xe
+	.4byte	.LASF411
+	.byte	0x3f
+	.byte	0x65
+	.4byte	0x1771
+	.byte	0x58
+	.uleb128 0xe
+	.4byte	.LASF412
+	.byte	0x3f
+	.byte	0x66
+	.4byte	0x1d6d
+	.byte	0x60
+	.uleb128 0xe
+	.4byte	.LASF413
+	.byte	0x3f
+	.byte	0x67
+	.4byte	0x20e7
+	.byte	0x68
+	.uleb128 0xe
+	.4byte	.LASF414
+	.byte	0x3f
+	.byte	0x68
+	.4byte	0x29
+	.byte	0x70
+	.uleb128 0xe
+	.4byte	.LASF415
+	.byte	0x3f
+	.byte	0x69
+	.4byte	0x458
+	.byte	0x78
+	.uleb128 0x23
+	.4byte	0x1862
+	.byte	0x80
+	.uleb128 0xe
+	.4byte	.LASF416
+	.byte	0x3f
+	.byte	0x6f
+	.4byte	0x3a7
+	.byte	0x90
+	.uleb128 0xe
+	.4byte	.LASF417
+	.byte	0x3f
+	.byte	0x70
+	.4byte	0x3a7
+	.byte	0xa0
+	.uleb128 0x20
+	.string	"d_u"
+	.byte	0x3f
+	.byte	0x78
+	.4byte	0x1887
+	.byte	0xb0
+	.uleb128 0xe
+	.4byte	.LASF130
+	.byte	0x3f
+	.byte	0x7a
+	.4byte	0x15a
+	.byte	0xc0
+	.uleb128 0xe
+	.4byte	.LASF131
+	.byte	0x3f
+	.byte	0x7b
+	.4byte	0x15a
+	.byte	0xc8
+	.byte	0
+	.uleb128 0x3
+	.4byte	0x18b1
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x18b1
+	.uleb128 0x1a
+	.4byte	.LASF418
+	.2byte	0x2a0
+	.byte	0x1e
+	.2byte	0x263
+	.4byte	0x1c7a
+	.uleb128 0x1b
+	.4byte	.LASF419
+	.byte	0x1e
+	.2byte	0x264
+	.4byte	0x28f
+	.byte	0
+	.uleb128 0x1b
+	.4byte	.LASF420
+	.byte	0x1e
+	.2byte	0x265
+	.4byte	0xb4
+	.byte	0x2
+	.uleb128 0x1b
+	.4byte	.LASF421
+	.byte	0x1e
+	.2byte	0x266
+	.4byte	0x240a
+	.byte	0x4
+	.uleb128 0x1b
+	.4byte	.LASF422
+	.byte	0x1e
+	.2byte	0x267
+	.4byte	0x242a
+	.byte	0x8
+	.uleb128 0x1b
+	.4byte	.LASF423
+	.byte	0x1e
+	.2byte	0x268
+	.4byte	0x6d
+	.byte	0xc
+	.uleb128 0x1b
+	.4byte	.LASF424
+	.byte	0x1e
+	.2byte	0x26b
+	.4byte	0x7b62
+	.byte	0x10
+	.uleb128 0x1b
+	.4byte	.LASF425
+	.byte	0x1e
+	.2byte	0x26c
+	.4byte	0x7b62
+	.byte	0x18
+	.uleb128 0x1b
+	.4byte	.LASF426
+	.byte	0x1e
+	.2byte	0x26f
+	.4byte	0x7cdb
+	.byte	0x20
+	.uleb128 0x1b
+	.4byte	.LASF427
+	.byte	0x1e
+	.2byte	0x270
+	.4byte	0x20e7
+	.byte	0x28
+	.uleb128 0x1b
+	.4byte	.LASF428
+	.byte	0x1e
+	.2byte	0x271
+	.4byte	0x509c
+	.byte	0x30
+	.uleb128 0x1b
+	.4byte	.LASF429
+	.byte	0x1e
+	.2byte	0x274
+	.4byte	0x458
+	.byte	0x38
+	.uleb128 0x1b
+	.4byte	.LASF430
+	.byte	0x1e
+	.2byte	0x278
+	.4byte	0x29
+	.byte	0x40
+	.uleb128 0x23
+	.4byte	0x7ac8
+	.byte	0x48
+	.uleb128 0x1b
+	.4byte	.LASF431
+	.byte	0x1e
+	.2byte	0x284
+	.4byte	0x284
+	.byte	0x4c
+	.uleb128 0x1b
+	.4byte	.LASF432
+	.byte	0x1e
+	.2byte	0x285
+	.4byte	0x2d8
+	.byte	0x50
+	.uleb128 0x1b
+	.4byte	.LASF433
+	.byte	0x1e
+	.2byte	0x286
+	.4byte	0xa27
+	.byte	0x58
+	.uleb128 0x1b
+	.4byte	.LASF434
+	.byte	0x1e
+	.2byte	0x287
+	.4byte	0xa27
+	.byte	0x68
+	.uleb128 0x1b
+	.4byte	.LASF435
+	.byte	0x1e
+	.2byte	0x288
+	.4byte	0xa27
+	.byte	0x78
+	.uleb128 0x1b
+	.4byte	.LASF436
+	.byte	0x1e
+	.2byte	0x289
+	.4byte	0xe65
+	.byte	0x88
+	.uleb128 0x1b
+	.4byte	.LASF437
+	.byte	0x1e
+	.2byte	0x28a
+	.4byte	0xb4
+	.byte	0x8c
+	.uleb128 0x1b
+	.4byte	.LASF438
+	.byte	0x1e
+	.2byte	0x28b
+	.4byte	0x110
+	.byte	0x8e
+	.uleb128 0x1b
+	.4byte	.LASF439
+	.byte	0x1e
+	.2byte	0x28c
+	.4byte	0x110
+	.byte	0x8f
+	.uleb128 0x1b
+	.4byte	.LASF440
+	.byte	0x1e
+	.2byte	0x28d
+	.4byte	0x31a
+	.byte	0x90
+	.uleb128 0x1b
+	.4byte	.LASF441
+	.byte	0x1e
+	.2byte	0x294
+	.4byte	0x29
+	.byte	0x98
+	.uleb128 0x1b
+	.4byte	.LASF442
+	.byte	0x1e
+	.2byte	0x295
+	.4byte	0x4d5c
+	.byte	0xa0
+	.uleb128 0x1b
+	.4byte	.LASF443
+	.byte	0x1e
+	.2byte	0x297
+	.4byte	0x29
+	.byte	0xd0
+	.uleb128 0x1b
+	.4byte	.LASF444
+	.byte	0x1e
+	.2byte	0x298
+	.4byte	0x29
+	.byte	0xd8
+	.uleb128 0x1b
+	.4byte	.LASF445
+	.byte	0x1e
+	.2byte	0x29a
+	.4byte	0x3eb
+	.byte	0xe0
+	.uleb128 0x1b
+	.4byte	.LASF446
+	.byte	0x1e
+	.2byte	0x29b
+	.4byte	0x3a7
+	.byte	0xf0
+	.uleb128 0x1c
+	.4byte	.LASF447
+	.byte	0x1e
+	.2byte	0x29d
+	.4byte	0x7ce6
+	.2byte	0x100
+	.uleb128 0x1c
+	.4byte	.LASF448
+	.byte	0x1e
+	.2byte	0x2a0
+	.4byte	0xc6
+	.2byte	0x108
+	.uleb128 0x1c
+	.4byte	.LASF449
+	.byte	0x1e
+	.2byte	0x2a1
+	.4byte	0x11f
+	.2byte	0x10c
+	.uleb128 0x1c
+	.4byte	.LASF450
+	.byte	0x1e
+	.2byte	0x2a2
+	.4byte	0x11f
+	.2byte	0x10e
+	.uleb128 0x1c
+	.4byte	.LASF451
+	.byte	0x1e
+	.2byte	0x2a4
+	.4byte	0x3a7
+	.2byte	0x110
+	.uleb128 0x1c
+	.4byte	.LASF452
+	.byte	0x1e
+	.2byte	0x2a5
+	.4byte	0x3a7
+	.2byte	0x120
+	.uleb128 0x1c
+	.4byte	.LASF453
+	.byte	0x1e
+	.2byte	0x2a6
+	.4byte	0x3a7
+	.2byte	0x130
+	.uleb128 0x2f
+	.4byte	0x7aea
+	.2byte	0x140
+	.uleb128 0x1c
+	.4byte	.LASF454
+	.byte	0x1e
+	.2byte	0x2ab
+	.4byte	0x39c
+	.2byte	0x150
+	.uleb128 0x1c
+	.4byte	.LASF455
+	.byte	0x1e
+	.2byte	0x2ac
+	.4byte	0x39c
+	.2byte	0x158
+	.uleb128 0x1c
+	.4byte	.LASF456
+	.byte	0x1e
+	.2byte	0x2ad
+	.4byte	0x37c
+	.2byte	0x160
+	.uleb128 0x1c
+	.4byte	.LASF457
+	.byte	0x1e
+	.2byte	0x2ae
+	.4byte	0x37c
+	.2byte	0x164
+	.uleb128 0x1c
+	.4byte	.LASF458
+	.byte	0x1e
+	.2byte	0x2af
+	.4byte	0x37c
+	.2byte	0x168
+	.uleb128 0x1c
+	.4byte	.LASF459
+	.byte	0x1e
+	.2byte	0x2b3
+	.4byte	0x7cec
+	.2byte	0x170
+	.uleb128 0x1c
+	.4byte	.LASF460
+	.byte	0x1e
+	.2byte	0x2b4
+	.4byte	0x7d34
+	.2byte	0x178
+	.uleb128 0x1c
+	.4byte	.LASF461
+	.byte	0x1e
+	.2byte	0x2b5
+	.4byte	0x4f97
+	.2byte	0x180
+	.uleb128 0x1c
+	.4byte	.LASF462
+	.byte	0x1e
+	.2byte	0x2b6
+	.4byte	0x3a7
+	.2byte	0x250
+	.uleb128 0x2f
+	.4byte	0x7b0c
+	.2byte	0x260
+	.uleb128 0x1c
+	.4byte	.LASF463
+	.byte	0x1e
+	.2byte	0x2bf
+	.4byte	0xd2
+	.2byte	0x268
+	.uleb128 0x1c
+	.4byte	.LASF464
+	.byte	0x1e
+	.2byte	0x2c2
+	.4byte	0xd2
+	.2byte	0x26c
+	.uleb128 0x1c
+	.4byte	.LASF465
+	.byte	0x1e
+	.2byte	0x2c3
+	.4byte	0x7d3f
+	.2byte	0x270
+	.uleb128 0x1c
+	.4byte	.LASF466
+	.byte	0x1e
+	.2byte	0x2c7
+	.4byte	0x7d4a
+	.2byte	0x278
+	.uleb128 0x1c
+	.4byte	.LASF467
+	.byte	0x1e
+	.2byte	0x2cb
+	.4byte	0x7d55
+	.2byte	0x280
+	.uleb128 0x1c
+	.4byte	.LASF468
+	.byte	0x1e
+	.2byte	0x2ce
+	.4byte	0x458
+	.2byte	0x288
+	.uleb128 0x1c
+	.4byte	.LASF130
+	.byte	0x1e
+	.2byte	0x2d0
+	.4byte	0x15a
+	.2byte	0x290
+	.uleb128 0x1c
+	.4byte	.LASF131
+	.byte	0x1e
+	.2byte	0x2d1
+	.4byte	0x15a
+	.2byte	0x298
+	.byte	0
+	.uleb128 0x3
+	.4byte	0x199b
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x199b
+	.uleb128 0x5
+	.4byte	0x96
+	.4byte	0x1c95
+	.uleb128 0x6
+	.4byte	0x4f
+	.byte	0x1f
+	.byte	0
+	.uleb128 0xd
+	.4byte	.LASF469
+	.byte	0xc0
+	.byte	0x3f
+	.byte	0x8a
+	.4byte	0x1d68
+	.uleb128 0xe
+	.4byte	.LASF470
+	.byte	0x3f
+	.byte	0x8b
+	.4byte	0x2184
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF471
+	.byte	0x3f
+	.byte	0x8c
+	.4byte	0x2184
+	.byte	0x8
+	.uleb128 0xe
+	.4byte	.LASF406
+	.byte	0x3f
+	.byte	0x8d
+	.4byte	0x21aa
+	.byte	0x10
+	.uleb128 0xe
+	.4byte	.LASF472
+	.byte	0x3f
+	.byte	0x8e
+	.4byte	0x21d4
+	.byte	0x18
+	.uleb128 0xe
+	.4byte	.LASF473
+	.byte	0x3f
+	.byte	0x90
+	.4byte	0x21e9
+	.byte	0x20
+	.uleb128 0xe
+	.4byte	.LASF474
+	.byte	0x3f
+	.byte	0x91
+	.4byte	0x21fe
+	.byte	0x28
+	.uleb128 0xe
+	.4byte	.LASF475
+	.byte	0x3f
+	.byte	0x92
+	.4byte	0x220f
+	.byte	0x30
+	.uleb128 0xe
+	.4byte	.LASF476
+	.byte	0x3f
+	.byte	0x93
+	.4byte	0x220f
+	.byte	0x38
+	.uleb128 0xe
+	.4byte	.LASF477
+	.byte	0x3f
+	.byte	0x94
+	.4byte	0x2225
+	.byte	0x40
+	.uleb128 0xe
+	.4byte	.LASF478
+	.byte	0x3f
+	.byte	0x95
+	.4byte	0x2244
+	.byte	0x48
+	.uleb128 0xe
+	.4byte	.LASF479
+	.byte	0x3f
+	.byte	0x96
+	.4byte	0x2264
+	.byte	0x50
+	.uleb128 0xe
+	.4byte	.LASF480
+	.byte	0x3f
+	.byte	0x97
+	.4byte	0x227e
+	.byte	0x58
+	.uleb128 0xe
+	.4byte	.LASF481
+	.byte	0x3f
+	.byte	0x98
+	.4byte	0x229e
+	.byte	0x60
+	.uleb128 0x23
+	.4byte	0x2152
+	.byte	0x68
+	.uleb128 0xe
+	.4byte	.LASF131
+	.byte	0x3f
+	.byte	0x9c
+	.4byte	0x15a
+	.byte	0x70
+	.uleb128 0xe
+	.4byte	.LASF132
+	.byte	0x3f
+	.byte	0x9d
+	.4byte	0x15a
+	.byte	0x78
+	.uleb128 0xe
+	.4byte	.LASF133
+	.byte	0x3f
+	.byte	0x9e
+	.4byte	0x15a
+	.byte	0x80
+	.byte	0
+	.uleb128 0x3
+	.4byte	0x1c95
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x1d68
+	.uleb128 0x1a
+	.4byte	.LASF482
+	.2byte	0x6c0
+	.byte	0x1e
+	.2byte	0x585
+	.4byte	0x20e7
+	.uleb128 0x1b
+	.4byte	.LASF483
+	.byte	0x1e
+	.2byte	0x586
+	.4byte	0x3a7
+	.byte	0
+	.uleb128 0x1b
+	.4byte	.LASF484
+	.byte	0x1e
+	.2byte	0x587
+	.4byte	0x284
+	.byte	0x10
+	.uleb128 0x1b
+	.4byte	.LASF485
+	.byte	0x1e
+	.2byte	0x588
+	.4byte	0x96
+	.byte	0x14
+	.uleb128 0x1b
+	.4byte	.LASF486
+	.byte	0x1e
+	.2byte	0x589
+	.4byte	0x29
+	.byte	0x18
+	.uleb128 0x1b
+	.4byte	.LASF487
+	.byte	0x1e
+	.2byte	0x58a
+	.4byte	0x2d8
+	.byte	0x20
+	.uleb128 0x1b
+	.4byte	.LASF488
+	.byte	0x1e
+	.2byte	0x58b
+	.4byte	0x83b4
+	.byte	0x28
+	.uleb128 0x1b
+	.4byte	.LASF489
+	.byte	0x1e
+	.2byte	0x58c
+	.4byte	0x858a
+	.byte	0x30
+	.uleb128 0x1b
+	.4byte	.LASF490
+	.byte	0x1e
+	.2byte	0x58d
+	.4byte	0x8590
+	.byte	0x38
+	.uleb128 0x1b
+	.4byte	.LASF491
+	.byte	0x1e
+	.2byte	0x58e
+	.4byte	0x8596
+	.byte	0x40
+	.uleb128 0x1b
+	.4byte	.LASF492
+	.byte	0x1e
+	.2byte	0x58f
+	.4byte	0x85a6
+	.byte	0x48
+	.uleb128 0x1b
+	.4byte	.LASF493
+	.byte	0x1e
+	.2byte	0x590
+	.4byte	0x29
+	.byte	0x50
+	.uleb128 0x1b
+	.4byte	.LASF494
+	.byte	0x1e
+	.2byte	0x591
+	.4byte	0x29
+	.byte	0x58
+	.uleb128 0x1b
+	.4byte	.LASF495
+	.byte	0x1e
+	.2byte	0x592
+	.4byte	0x29
+	.byte	0x60
+	.uleb128 0x1b
+	.4byte	.LASF496
+	.byte	0x1e
+	.2byte	0x593
+	.4byte	0x1995
+	.byte	0x68
+	.uleb128 0x1b
+	.4byte	.LASF497
+	.byte	0x1e
+	.2byte	0x594
+	.4byte	0x4d5c
+	.byte	0x70
+	.uleb128 0x1b
+	.4byte	.LASF498
+	.byte	0x1e
+	.2byte	0x595
+	.4byte	0xc6
+	.byte	0xa0
+	.uleb128 0x1b
+	.4byte	.LASF499
+	.byte	0x1e
+	.2byte	0x596
+	.4byte	0x37c
+	.byte	0xa4
+	.uleb128 0x1b
+	.4byte	.LASF500
+	.byte	0x1e
+	.2byte	0x598
+	.4byte	0x458
+	.byte	0xa8
+	.uleb128 0x1b
+	.4byte	.LASF501
+	.byte	0x1e
+	.2byte	0x59a
+	.4byte	0x85b6
+	.byte	0xb0
+	.uleb128 0x1b
+	.4byte	.LASF502
+	.byte	0x1e
+	.2byte	0x59c
+	.4byte	0x85cc
+	.byte	0xb8
+	.uleb128 0x1b
+	.4byte	.LASF503
+	.byte	0x1e
+	.2byte	0x59d
+	.4byte	0x869f
+	.byte	0xc0
+	.uleb128 0x1b
+	.4byte	.LASF504
+	.byte	0x1e
+	.2byte	0x5a0
+	.4byte	0x86af
+	.byte	0xc8
+	.uleb128 0x1b
+	.4byte	.LASF505
+	.byte	0x1e
+	.2byte	0x5a3
+	.4byte	0x86ba
+	.byte	0xd0
+	.uleb128 0x1b
+	.4byte	.LASF506
+	.byte	0x1e
+	.2byte	0x5a4
+	.4byte	0xa9
+	.byte	0xd8
+	.uleb128 0x1b
+	.4byte	.LASF507
+	.byte	0x1e
+	.2byte	0x5a6
+	.4byte	0x1699
+	.byte	0xe0
+	.uleb128 0x1b
+	.4byte	.LASF508
+	.byte	0x1e
+	.2byte	0x5a7
+	.4byte	0x3a7
+	.byte	0xe8
+	.uleb128 0x1b
+	.4byte	.LASF509
+	.byte	0x1e
+	.2byte	0x5a8
+	.4byte	0x7aac
+	.byte	0xf8
+	.uleb128 0x1c
+	.4byte	.LASF510
+	.byte	0x1e
+	.2byte	0x5a9
+	.4byte	0x478c
+	.2byte	0x100
+	.uleb128 0x1c
+	.4byte	.LASF511
+	.byte	0x1e
+	.2byte	0x5aa
+	.4byte	0x86c5
+	.2byte	0x108
+	.uleb128 0x1c
+	.4byte	.LASF512
+	.byte	0x1e
+	.2byte	0x5ab
+	.4byte	0x3eb
+	.2byte	0x110
+	.uleb128 0x1c
+	.4byte	.LASF513
+	.byte	0x1e
+	.2byte	0x5ac
+	.4byte	0x6d
+	.2byte	0x120
+	.uleb128 0x1c
+	.4byte	.LASF514
+	.byte	0x1e
+	.2byte	0x5ad
+	.4byte	0x74a7
+	.2byte	0x128
+	.uleb128 0x1c
+	.4byte	.LASF515
+	.byte	0x1e
+	.2byte	0x5af
+	.4byte	0x825c
+	.2byte	0x268
+	.uleb128 0x1c
+	.4byte	.LASF516
+	.byte	0x1e
+	.2byte	0x5b1
+	.4byte	0x86cb
+	.2byte	0x420
+	.uleb128 0x1c
+	.4byte	.LASF517
+	.byte	0x1e
+	.2byte	0x5b2
+	.4byte	0x5c9a
+	.2byte	0x440
+	.uleb128 0x1c
+	.4byte	.LASF518
+	.byte	0x1e
+	.2byte	0x5b4
+	.4byte	0x458
+	.2byte	0x450
+	.uleb128 0x1c
+	.4byte	.LASF519
+	.byte	0x1e
+	.2byte	0x5b5
+	.4byte	0x6d
+	.2byte	0x458
+	.uleb128 0x1c
+	.4byte	.LASF520
+	.byte	0x1e
+	.2byte	0x5b6
+	.4byte	0x33b
+	.2byte	0x45c
+	.uleb128 0x1c
+	.4byte	.LASF521
+	.byte	0x1e
+	.2byte	0x5ba
+	.4byte	0x13f
+	.2byte	0x460
+	.uleb128 0x1c
+	.4byte	.LASF522
+	.byte	0x1e
+	.2byte	0x5c0
+	.4byte	0x2464
+	.2byte	0x468
+	.uleb128 0x1c
+	.4byte	.LASF523
+	.byte	0x1e
+	.2byte	0x5c6
+	.4byte	0x21e
+	.2byte	0x488
+	.uleb128 0x1c
+	.4byte	.LASF524
+	.byte	0x1e
+	.2byte	0x5c8
+	.4byte	0x1d6d
+	.2byte	0x490
+	.uleb128 0x1c
+	.4byte	.LASF525
+	.byte	0x1e
+	.2byte	0x5cd
+	.4byte	0xc6
+	.2byte	0x498
+	.uleb128 0x1c
+	.4byte	.LASF526
+	.byte	0x1e
+	.2byte	0x5cf
+	.4byte	0x4ae2
+	.2byte	0x4a0
+	.uleb128 0x1c
+	.4byte	.LASF527
+	.byte	0x1e
+	.2byte	0x5d2
+	.4byte	0x558
+	.2byte	0x4e0
+	.uleb128 0x1c
+	.4byte	.LASF528
+	.byte	0x1e
+	.2byte	0x5d5
+	.4byte	0x558
+	.2byte	0x4e8
+	.uleb128 0x1c
+	.4byte	.LASF529
+	.byte	0x1e
+	.2byte	0x5d8
+	.4byte	0xc6
+	.2byte	0x4f0
+	.uleb128 0x1c
+	.4byte	.LASF530
+	.byte	0x1e
+	.2byte	0x5db
+	.4byte	0x3253
+	.2byte	0x4f8
+	.uleb128 0x1c
+	.4byte	.LASF531
+	.byte	0x1e
+	.2byte	0x5dc
+	.4byte	0x3d2
+	.2byte	0x500
+	.uleb128 0x1c
+	.4byte	.LASF532
+	.byte	0x1e
+	.2byte	0x5e3
+	.4byte	0x595c
+	.2byte	0x508
+	.uleb128 0x1c
+	.4byte	.LASF533
+	.byte	0x1e
+	.2byte	0x5e9
+	.4byte	0x4c1c
+	.2byte	0x540
+	.uleb128 0x1c
+	.4byte	.LASF534
+	.byte	0x1e
+	.2byte	0x5ea
+	.4byte	0x4c1c
+	.2byte	0x580
+	.uleb128 0x30
+	.string	"rcu"
+	.byte	0x1e
+	.2byte	0x5eb
+	.4byte	0x41c
+	.2byte	0x5a0
+	.uleb128 0x1c
+	.4byte	.LASF535
+	.byte	0x1e
+	.2byte	0x5ec
+	.4byte	0x3205
+	.2byte	0x5b0
+	.uleb128 0x1c
+	.4byte	.LASF536
+	.byte	0x1e
+	.2byte	0x5ee
+	.4byte	0x2464
+	.2byte	0x5e0
+	.uleb128 0x1c
+	.4byte	.LASF537
+	.byte	0x1e
+	.2byte	0x5f3
+	.4byte	0xc6
+	.2byte	0x600
+	.uleb128 0x1c
+	.4byte	.LASF538
+	.byte	0x1e
+	.2byte	0x5f6
+	.4byte	0xe65
+	.2byte	0x640
+	.uleb128 0x1c
+	.4byte	.LASF539
+	.byte	0x1e
+	.2byte	0x5f7
+	.4byte	0x3a7
+	.2byte	0x648
+	.uleb128 0x1c
+	.4byte	.LASF540
+	.byte	0x1e
+	.2byte	0x5f9
+	.4byte	0xe65
+	.2byte	0x658
+	.uleb128 0x1c
+	.4byte	.LASF541
+	.byte	0x1e
+	.2byte	0x5fa
+	.4byte	0x3a7
+	.2byte	0x660
+	.uleb128 0x1c
+	.4byte	.LASF130
+	.byte	0x1e
+	.2byte	0x5fc
+	.4byte	0x15a
+	.2byte	0x670
+	.uleb128 0x1c
+	.4byte	.LASF131
+	.byte	0x1e
+	.2byte	0x5fd
+	.4byte	0x15a
+	.2byte	0x678
+	.uleb128 0x1c
+	.4byte	.LASF132
+	.byte	0x1e
+	.2byte	0x5fe
+	.4byte	0x15a
+	.2byte	0x680
+	.uleb128 0x1c
+	.4byte	.LASF133
+	.byte	0x1e
+	.2byte	0x5ff
+	.4byte	0x15a
+	.2byte	0x688
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x1d73
+	.uleb128 0xf
+	.byte	0x8
+	.byte	0x3f
+	.byte	0x9a
+	.4byte	0x2102
+	.uleb128 0xe
+	.4byte	.LASF130
+	.byte	0x3f
+	.byte	0x9a
+	.4byte	0x15a
+	.byte	0
+	.byte	0
+	.uleb128 0x10
+	.4byte	0x2112
+	.uleb128 0x11
+	.4byte	0x2112
+	.uleb128 0x11
+	.4byte	0x2142
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x213d
+	.uleb128 0xd
+	.4byte	.LASF542
+	.byte	0x10
+	.byte	0x40
+	.byte	0x8
+	.4byte	0x213d
+	.uleb128 0x20
+	.string	"mnt"
+	.byte	0x40
+	.byte	0x9
+	.4byte	0x225e
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF403
+	.byte	0x40
+	.byte	0xa
+	.4byte	0x1995
+	.byte	0x8
+	.byte	0
+	.uleb128 0x3
+	.4byte	0x2118
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x2118
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x2102
+	.uleb128 0x31
+	.byte	0
+	.byte	0x3f
+	.byte	0x9a
+	.uleb128 0x21
+	.byte	0x8
+	.byte	0x3f
+	.byte	0x9a
+	.4byte	0x2170
+	.uleb128 0x22
+	.4byte	.LASF543
+	.byte	0x3f
+	.byte	0x9a
+	.4byte	0x2148
+	.uleb128 0x29
+	.4byte	0x20ed
+	.uleb128 0x29
+	.4byte	0x214e
+	.byte	0
+	.uleb128 0x14
+	.4byte	0xc6
+	.4byte	0x2184
+	.uleb128 0x11
+	.4byte	0x1995
+	.uleb128 0x11
+	.4byte	0x6d
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x2170
+	.uleb128 0x14
+	.4byte	0xc6
+	.4byte	0x219e
+	.uleb128 0x11
+	.4byte	0x219e
+	.uleb128 0x11
+	.4byte	0x21a4
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x1990
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x17be
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x218a
+	.uleb128 0x14
+	.4byte	0xc6
+	.4byte	0x21ce
+	.uleb128 0x11
+	.4byte	0x219e
+	.uleb128 0x11
+	.4byte	0x6d
+	.uleb128 0x11
+	.4byte	0x56
+	.uleb128 0x11
+	.4byte	0x21ce
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x17dd
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x21b0
+	.uleb128 0x14
+	.4byte	0xc6
+	.4byte	0x21e9
+	.uleb128 0x11
+	.4byte	0x219e
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x21da
+	.uleb128 0x14
+	.4byte	0xc6
+	.4byte	0x21fe
+	.uleb128 0x11
+	.4byte	0x1995
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x21ef
+	.uleb128 0x10
+	.4byte	0x220f
+	.uleb128 0x11
+	.4byte	0x1995
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x2204
+	.uleb128 0x10
+	.4byte	0x2225
+	.uleb128 0x11
+	.4byte	0x1995
+	.uleb128 0x11
+	.4byte	0x1c7f
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x2215
+	.uleb128 0x14
+	.4byte	0x21e
+	.4byte	0x2244
+	.uleb128 0x11
+	.4byte	0x1995
+	.uleb128 0x11
+	.4byte	0x21e
+	.uleb128 0x11
+	.4byte	0xc6
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x222b
+	.uleb128 0x24
+	.4byte	.LASF544
+	.uleb128 0x14
+	.4byte	0x225e
+	.4byte	0x225e
+	.uleb128 0x11
+	.4byte	0x2142
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x224a
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x224f
+	.uleb128 0x14
+	.4byte	0xc6
+	.4byte	0x227e
+	.uleb128 0x11
+	.4byte	0x2112
+	.uleb128 0x11
+	.4byte	0x2b0
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x226a
+	.uleb128 0x14
+	.4byte	0x1995
+	.4byte	0x2298
+	.uleb128 0x11
+	.4byte	0x1995
+	.uleb128 0x11
+	.4byte	0x2298
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x1c7a
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x2284
+	.uleb128 0x19
+	.4byte	.LASF545
+	.byte	0x3f
+	.byte	0xe6
+	.4byte	0x172b
+	.uleb128 0x15
+	.4byte	.LASF546
+	.byte	0x3f
+	.2byte	0x1fe
+	.4byte	0xc6
+	.uleb128 0x8
+	.4byte	.LASF547
+	.byte	0x25
+	.byte	0x8
+	.4byte	0x12f
+	.uleb128 0x1f
+	.4byte	.LASF548
+	.byte	0x4
+	.4byte	0x6d
+	.byte	0x41
+	.byte	0x8
+	.4byte	0x22f5
+	.uleb128 0xc
+	.4byte	.LASF549
+	.byte	0
+	.uleb128 0xc
+	.4byte	.LASF550
+	.byte	0x1
+	.uleb128 0xc
+	.4byte	.LASF551
+	.byte	0x2
+	.uleb128 0xc
+	.4byte	.LASF552
+	.byte	0x3
+	.uleb128 0xc
+	.4byte	.LASF553
+	.byte	0x4
+	.byte	0
+	.uleb128 0xd
+	.4byte	.LASF554
+	.byte	0x10
+	.byte	0x41
+	.byte	0x35
+	.4byte	0x2318
+	.uleb128 0x20
+	.string	"nr"
+	.byte	0x41
+	.byte	0x36
+	.4byte	0xc6
+	.byte	0
+	.uleb128 0x20
+	.string	"ns"
+	.byte	0x41
+	.byte	0x37
+	.4byte	0x231d
+	.byte	0x8
+	.byte	0
+	.uleb128 0x24
+	.4byte	.LASF555
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x2318
+	.uleb128 0x32
+	.string	"pid"
+	.byte	0x60
+	.byte	0x41
+	.byte	0x3a
+	.4byte	0x2378
+	.uleb128 0xe
+	.4byte	.LASF383
+	.byte	0x41
+	.byte	0x3c
+	.4byte	0x37c
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF556
+	.byte	0x41
+	.byte	0x3d
+	.4byte	0x6d
+	.byte	0x4
+	.uleb128 0xe
+	.4byte	.LASF557
+	.byte	0x41
+	.byte	0x3f
+	.4byte	0x2378
+	.byte	0x8
+	.uleb128 0xe
+	.4byte	.LASF558
+	.byte	0x41
+	.byte	0x41
+	.4byte	0x15bf
+	.byte	0x28
+	.uleb128 0x20
+	.string	"rcu"
+	.byte	0x41
+	.byte	0x42
+	.4byte	0x41c
+	.byte	0x40
+	.uleb128 0xe
+	.4byte	.LASF559
+	.byte	0x41
+	.byte	0x43
+	.4byte	0x2388
+	.byte	0x50
+	.byte	0
+	.uleb128 0x5
+	.4byte	0x3d2
+	.4byte	0x2388
+	.uleb128 0x6
+	.4byte	0x4f
+	.byte	0x3
+	.byte	0
+	.uleb128 0x5
+	.4byte	0x22f5
+	.4byte	0x2398
+	.uleb128 0x6
+	.4byte	0x4f
+	.byte	0
+	.byte	0
+	.uleb128 0x19
+	.4byte	.LASF560
+	.byte	0x41
+	.byte	0x46
+	.4byte	0x2323
+	.uleb128 0x19
+	.4byte	.LASF561
+	.byte	0x41
+	.byte	0x48
+	.4byte	0x7c9
+	.uleb128 0x19
+	.4byte	.LASF562
+	.byte	0x41
+	.byte	0x62
+	.4byte	0x2318
+	.uleb128 0x19
+	.4byte	.LASF563
+	.byte	0x42
+	.byte	0x23
+	.4byte	0xc6
+	.uleb128 0x19
+	.4byte	.LASF564
+	.byte	0x42
+	.byte	0x24
+	.4byte	0xc6
+	.uleb128 0x19
+	.4byte	.LASF565
+	.byte	0x42
+	.byte	0x52
+	.4byte	0xc6
+	.uleb128 0x19
+	.4byte	.LASF566
+	.byte	0x42
+	.byte	0x53
+	.4byte	0xc6
+	.uleb128 0x24
+	.4byte	.LASF567
+	.uleb128 0x19
+	.4byte	.LASF568
+	.byte	0x43
+	.byte	0x13
+	.4byte	0x23e5
+	.uleb128 0xf
+	.byte	0x4
+	.byte	0x43
+	.byte	0x15
+	.4byte	0x240a
+	.uleb128 0x20
+	.string	"val"
+	.byte	0x43
+	.byte	0x16
+	.4byte	0x2c2
+	.byte	0
+	.byte	0
+	.uleb128 0x8
+	.4byte	.LASF569
+	.byte	0x43
+	.byte	0x17
+	.4byte	0x23f5
+	.uleb128 0xf
+	.byte	0x4
+	.byte	0x43
+	.byte	0x1a
+	.4byte	0x242a
+	.uleb128 0x20
+	.string	"val"
+	.byte	0x43
+	.byte	0x1b
+	.4byte	0x2cd
+	.byte	0
+	.byte	0
+	.uleb128 0x8
+	.4byte	.LASF570
+	.byte	0x43
+	.byte	0x1c
+	.4byte	0x2415
+	.uleb128 0xd
+	.4byte	.LASF571
+	.byte	0x4
+	.byte	0x44
+	.byte	0xf
+	.4byte	0x244e
+	.uleb128 0xe
+	.4byte	.LASF221
+	.byte	0x44
+	.byte	0x14
+	.4byte	0x37c
+	.byte	0
+	.byte	0
+	.uleb128 0x19
+	.4byte	.LASF572
+	.byte	0x45
+	.byte	0xb
+	.4byte	0xc6
+	.uleb128 0x19
+	.4byte	.LASF573
+	.byte	0x45
+	.byte	0xc
+	.4byte	0xc6
+	.uleb128 0xd
+	.4byte	.LASF574
+	.byte	0x20
+	.byte	0x46
+	.byte	0x35
+	.4byte	0x24a1
+	.uleb128 0xe
+	.4byte	.LASF98
+	.byte	0x46
+	.byte	0x36
+	.4byte	0x558
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF228
+	.byte	0x46
+	.byte	0x37
+	.4byte	0xe65
+	.byte	0x8
+	.uleb128 0x20
+	.string	"osq"
+	.byte	0x46
+	.byte	0x39
+	.4byte	0x2435
+	.byte	0xc
+	.uleb128 0xe
+	.4byte	.LASF575
+	.byte	0x46
+	.byte	0x3b
+	.4byte	0x3a7
+	.byte	0x10
+	.byte	0
+	.uleb128 0x1a
+	.4byte	.LASF576
+	.2byte	0xe80
+	.byte	0x47
+	.2byte	0x287
+	.4byte	0x2eff
+	.uleb128 0x1b
+	.4byte	.LASF205
+	.byte	0x47
+	.2byte	0x28d
+	.4byte	0xc33
+	.byte	0
+	.uleb128 0x1b
+	.4byte	.LASF577
+	.byte	0x47
+	.2byte	0x290
+	.4byte	0x1a0
+	.byte	0x20
+	.uleb128 0x1b
+	.4byte	.LASF578
+	.byte	0x47
+	.2byte	0x298
+	.4byte	0x458
+	.byte	0x28
+	.uleb128 0x1b
+	.4byte	.LASF579
+	.byte	0x47
+	.2byte	0x299
+	.4byte	0x37c
+	.byte	0x30
+	.uleb128 0x1b
+	.4byte	.LASF171
+	.byte	0x47
+	.2byte	0x29b
+	.4byte	0x6d
+	.byte	0x34
+	.uleb128 0x1b
+	.4byte	.LASF580
+	.byte	0x47
+	.2byte	0x29c
+	.4byte	0x6d
+	.byte	0x38
+	.uleb128 0x1b
+	.4byte	.LASF581
+	.byte	0x47
+	.2byte	0x29f
+	.4byte	0x2f10
+	.byte	0x40
+	.uleb128 0x1b
+	.4byte	.LASF582
+	.byte	0x47
+	.2byte	0x2a0
+	.4byte	0xc6
+	.byte	0x48
+	.uleb128 0x2b
+	.string	"cpu"
+	.byte	0x47
+	.2byte	0x2a3
+	.4byte	0x6d
+	.byte	0x4c
+	.uleb128 0x1b
+	.4byte	.LASF583
+	.byte	0x47
+	.2byte	0x2a5
+	.4byte	0x6d
+	.byte	0x50
+	.uleb128 0x1b
+	.4byte	.LASF584
+	.byte	0x47
+	.2byte	0x2a6
+	.4byte	0x29
+	.byte	0x58
+	.uleb128 0x1b
+	.4byte	.LASF585
+	.byte	0x47
+	.2byte	0x2a7
+	.4byte	0x2eff
+	.byte	0x60
+	.uleb128 0x1b
+	.4byte	.LASF586
+	.byte	0x47
+	.2byte	0x2b0
+	.4byte	0xc6
+	.byte	0x68
+	.uleb128 0x1b
+	.4byte	.LASF587
+	.byte	0x47
+	.2byte	0x2b1
+	.4byte	0xc6
+	.byte	0x6c
+	.uleb128 0x1b
+	.4byte	.LASF588
+	.byte	0x47
+	.2byte	0x2b3
+	.4byte	0xc6
+	.byte	0x70
+	.uleb128 0x1b
+	.4byte	.LASF589
+	.byte	0x47
+	.2byte	0x2b5
+	.4byte	0xc6
+	.byte	0x74
+	.uleb128 0x1b
+	.4byte	.LASF590
+	.byte	0x47
+	.2byte	0x2b6
+	.4byte	0xc6
+	.byte	0x78
+	.uleb128 0x1b
+	.4byte	.LASF591
+	.byte	0x47
+	.2byte	0x2b7
+	.4byte	0xc6
+	.byte	0x7c
+	.uleb128 0x1b
+	.4byte	.LASF592
+	.byte	0x47
+	.2byte	0x2b8
+	.4byte	0x6d
+	.byte	0x80
+	.uleb128 0x1b
+	.4byte	.LASF593
+	.byte	0x47
+	.2byte	0x2ba
+	.4byte	0x451e
+	.byte	0x88
+	.uleb128 0x2b
+	.string	"se"
+	.byte	0x47
+	.2byte	0x2bb
+	.4byte	0x415b
+	.byte	0xc0
+	.uleb128 0x30
+	.string	"rt"
+	.byte	0x47
+	.2byte	0x2bc
+	.4byte	0x4288
+	.2byte	0x2c0
+	.uleb128 0x1c
+	.4byte	.LASF594
+	.byte	0x47
+	.2byte	0x2bf
+	.4byte	0x15a
+	.2byte	0x310
+	.uleb128 0x1c
+	.4byte	.LASF595
+	.byte	0x47
+	.2byte	0x2c0
+	.4byte	0xc6
+	.2byte	0x318
+	.uleb128 0x1c
+	.4byte	.LASF596
+	.byte	0x47
+	.2byte	0x2c1
+	.4byte	0x15a
+	.2byte	0x320
+	.uleb128 0x1c
+	.4byte	.LASF597
+	.byte	0x47
+	.2byte	0x2c2
+	.4byte	0x15a
+	.2byte	0x328
+	.uleb128 0x1c
+	.4byte	.LASF598
+	.byte	0x47
+	.2byte	0x2c5
+	.4byte	0x4529
+	.2byte	0x330
+	.uleb128 0x30
+	.string	"dl"
+	.byte	0x47
+	.2byte	0x2c7
+	.4byte	0x432b
+	.2byte	0x338
+	.uleb128 0x1c
+	.4byte	.LASF599
+	.byte	0x47
+	.2byte	0x2d9
+	.4byte	0x6d
+	.2byte	0x420
+	.uleb128 0x1c
+	.4byte	.LASF600
+	.byte	0x47
+	.2byte	0x2da
+	.4byte	0xc6
+	.2byte	0x424
+	.uleb128 0x1c
+	.4byte	.LASF601
+	.byte	0x47
+	.2byte	0x2db
+	.4byte	0x15e8
+	.2byte	0x428
+	.uleb128 0x1c
+	.4byte	.LASF602
+	.byte	0x47
+	.2byte	0x2dc
+	.4byte	0x15e8
+	.2byte	0x430
+	.uleb128 0x1c
+	.4byte	.LASF603
+	.byte	0x47
+	.2byte	0x2df
+	.4byte	0xc6
+	.2byte	0x438
+	.uleb128 0x1c
+	.4byte	.LASF604
+	.byte	0x47
+	.2byte	0x2e0
+	.4byte	0x4456
+	.2byte	0x43c
+	.uleb128 0x1c
+	.4byte	.LASF605
+	.byte	0x47
+	.2byte	0x2e1
+	.4byte	0x3a7
+	.2byte	0x440
+	.uleb128 0x1c
+	.4byte	.LASF606
+	.byte	0x47
+	.2byte	0x2e2
+	.4byte	0x4534
+	.2byte	0x450
+	.uleb128 0x1c
+	.4byte	.LASF607
+	.byte	0x47
+	.2byte	0x2e6
+	.4byte	0x29
+	.2byte	0x458
+	.uleb128 0x1c
+	.4byte	.LASF608
+	.byte	0x47
+	.2byte	0x2e7
+	.4byte	0x110
+	.2byte	0x460
+	.uleb128 0x1c
+	.4byte	.LASF609
+	.byte	0x47
+	.2byte	0x2e8
+	.4byte	0x110
+	.2byte	0x461
+	.uleb128 0x1c
+	.4byte	.LASF610
+	.byte	0x47
+	.2byte	0x2e9
+	.4byte	0xc6
+	.2byte	0x464
+	.uleb128 0x1c
+	.4byte	.LASF611
+	.byte	0x47
+	.2byte	0x2ea
+	.4byte	0x3a7
+	.2byte	0x468
+	.uleb128 0x1c
+	.4byte	.LASF612
+	.byte	0x47
+	.2byte	0x2ed
+	.4byte	0x3ed9
+	.2byte	0x478
+	.uleb128 0x1c
+	.4byte	.LASF557
+	.byte	0x47
+	.2byte	0x2ef
+	.4byte	0x3a7
+	.2byte	0x498
+	.uleb128 0x1c
+	.4byte	.LASF613
+	.byte	0x47
+	.2byte	0x2f1
+	.4byte	0x33e5
+	.2byte	0x4a8
+	.uleb128 0x1c
+	.4byte	.LASF614
+	.byte	0x47
+	.2byte	0x2f2
+	.4byte	0x3416
+	.2byte	0x4d0
+	.uleb128 0x30
+	.string	"mm"
+	.byte	0x47
+	.2byte	0x2f5
+	.4byte	0x455d
+	.2byte	0x4e8
+	.uleb128 0x1c
+	.4byte	.LASF615
+	.byte	0x47
+	.2byte	0x2f6
+	.4byte	0x455d
+	.2byte	0x4f0
+	.uleb128 0x1c
+	.4byte	.LASF616
+	.byte	0x47
+	.2byte	0x2f9
+	.4byte	0x3bb4
+	.2byte	0x4f8
+	.uleb128 0x1c
+	.4byte	.LASF617
+	.byte	0x47
+	.2byte	0x2fc
+	.4byte	0x3d14
+	.2byte	0x520
+	.uleb128 0x1c
+	.4byte	.LASF618
+	.byte	0x47
+	.2byte	0x2fe
+	.4byte	0xc6
+	.2byte	0x538
+	.uleb128 0x1c
+	.4byte	.LASF619
+	.byte	0x47
+	.2byte	0x2ff
+	.4byte	0xc6
+	.2byte	0x53c
+	.uleb128 0x1c
+	.4byte	.LASF620
+	.byte	0x47
+	.2byte	0x300
+	.4byte	0xc6
+	.2byte	0x540
+	.uleb128 0x1c
+	.4byte	.LASF621
+	.byte	0x47
+	.2byte	0x302
+	.4byte	0xc6
+	.2byte	0x544
+	.uleb128 0x1c
+	.4byte	.LASF622
+	.byte	0x47
+	.2byte	0x304
+	.4byte	0x29
+	.2byte	0x548
+	.uleb128 0x1c
+	.4byte	.LASF623
+	.byte	0x47
+	.2byte	0x307
+	.4byte	0x6d
+	.2byte	0x550
+	.uleb128 0x33
+	.4byte	.LASF624
+	.byte	0x47
+	.2byte	0x30a
+	.4byte	0x6d
+	.byte	0x4
+	.byte	0x1
+	.byte	0x1f
+	.2byte	0x554
+	.uleb128 0x33
+	.4byte	.LASF625
+	.byte	0x47
+	.2byte	0x30b
+	.4byte	0x6d
+	.byte	0x4
+	.byte	0x1
+	.byte	0x1e
+	.2byte	0x554
+	.uleb128 0x33
+	.4byte	.LASF626
+	.byte	0x47
+	.2byte	0x30c
+	.4byte	0x6d
+	.byte	0x4
+	.byte	0x1
+	.byte	0x1d
+	.2byte	0x554
+	.uleb128 0x33
+	.4byte	.LASF627
+	.byte	0x47
+	.2byte	0x30d
+	.4byte	0x6d
+	.byte	0x4
+	.byte	0x1
+	.byte	0x1c
+	.2byte	0x554
+	.uleb128 0x33
+	.4byte	.LASF628
+	.byte	0x47
+	.2byte	0x30f
+	.4byte	0x6d
+	.byte	0x4
+	.byte	0x1
+	.byte	0x1b
+	.2byte	0x554
+	.uleb128 0x33
+	.4byte	.LASF629
+	.byte	0x47
+	.2byte	0x318
+	.4byte	0x6d
+	.byte	0x4
+	.byte	0x1
+	.byte	0x1f
+	.2byte	0x558
+	.uleb128 0x33
+	.4byte	.LASF630
+	.byte	0x47
+	.2byte	0x319
+	.4byte	0x6d
+	.byte	0x4
+	.byte	0x1
+	.byte	0x1e
+	.2byte	0x558
+	.uleb128 0x33
+	.4byte	.LASF631
+	.byte	0x47
+	.2byte	0x31e
+	.4byte	0x6d
+	.byte	0x4
+	.byte	0x1
+	.byte	0x1d
+	.2byte	0x558
+	.uleb128 0x33
+	.4byte	.LASF632
+	.byte	0x47
+	.2byte	0x320
+	.4byte	0x6d
+	.byte	0x4
+	.byte	0x1
+	.byte	0x1c
+	.2byte	0x558
+	.uleb128 0x33
+	.4byte	.LASF633
+	.byte	0x47
+	.2byte	0x328
+	.4byte	0x6d
+	.byte	0x4
+	.byte	0x1
+	.byte	0x1b
+	.2byte	0x558
+	.uleb128 0x33
+	.4byte	.LASF634
+	.byte	0x47
+	.2byte	0x32c
+	.4byte	0x6d
+	.byte	0x4
+	.byte	0x1
+	.byte	0x1a
+	.2byte	0x558
+	.uleb128 0x1c
+	.4byte	.LASF635
+	.byte	0x47
+	.2byte	0x32f
+	.4byte	0x29
+	.2byte	0x560
+	.uleb128 0x1c
+	.4byte	.LASF200
+	.byte	0x47
+	.2byte	0x331
+	.4byte	0xbc3
+	.2byte	0x568
+	.uleb128 0x30
+	.string	"pid"
+	.byte	0x47
+	.2byte	0x333
+	.4byte	0x29a
+	.2byte	0x598
+	.uleb128 0x1c
+	.4byte	.LASF636
+	.byte	0x47
+	.2byte	0x334
+	.4byte	0x29a
+	.2byte	0x59c
+	.uleb128 0x1c
+	.4byte	.LASF637
+	.byte	0x47
+	.2byte	0x338
+	.4byte	0x29
+	.2byte	0x5a0
+	.uleb128 0x1c
+	.4byte	.LASF638
+	.byte	0x47
+	.2byte	0x341
+	.4byte	0x2eff
+	.2byte	0x5a8
+	.uleb128 0x1c
+	.4byte	.LASF639
+	.byte	0x47
+	.2byte	0x344
+	.4byte	0x2eff
+	.2byte	0x5b0
+	.uleb128 0x1c
+	.4byte	.LASF640
+	.byte	0x47
+	.2byte	0x349
+	.4byte	0x3a7
+	.2byte	0x5b8
+	.uleb128 0x1c
+	.4byte	.LASF641
+	.byte	0x47
+	.2byte	0x34a
+	.4byte	0x3a7
+	.2byte	0x5c8
+	.uleb128 0x1c
+	.4byte	.LASF642
+	.byte	0x47
+	.2byte	0x34b
+	.4byte	0x2eff
+	.2byte	0x5d8
+	.uleb128 0x1c
+	.4byte	.LASF643
+	.byte	0x47
+	.2byte	0x353
+	.4byte	0x3a7
+	.2byte	0x5e0
+	.uleb128 0x1c
+	.4byte	.LASF644
+	.byte	0x47
+	.2byte	0x354
+	.4byte	0x3a7
+	.2byte	0x5f0
+	.uleb128 0x1c
+	.4byte	.LASF645
+	.byte	0x47
+	.2byte	0x357
+	.4byte	0x4563
+	.2byte	0x600
+	.uleb128 0x1c
+	.4byte	.LASF646
+	.byte	0x47
+	.2byte	0x358
+	.4byte	0x4569
+	.2byte	0x608
+	.uleb128 0x1c
+	.4byte	.LASF647
+	.byte	0x47
+	.2byte	0x359
+	.4byte	0x3a7
+	.2byte	0x648
+	.uleb128 0x1c
+	.4byte	.LASF648
+	.byte	0x47
+	.2byte	0x35a
+	.4byte	0x3a7
+	.2byte	0x658
+	.uleb128 0x1c
+	.4byte	.LASF649
+	.byte	0x47
+	.2byte	0x35c
+	.4byte	0x459e
+	.2byte	0x668
+	.uleb128 0x1c
+	.4byte	.LASF650
+	.byte	0x47
+	.2byte	0x35f
+	.4byte	0x45a4
+	.2byte	0x670
+	.uleb128 0x1c
+	.4byte	.LASF651
+	.byte	0x47
+	.2byte	0x362
+	.4byte	0x45a4
+	.2byte	0x678
+	.uleb128 0x1c
+	.4byte	.LASF652
+	.byte	0x47
+	.2byte	0x364
+	.4byte	0x15a
+	.2byte	0x680
+	.uleb128 0x1c
+	.4byte	.LASF653
+	.byte	0x47
+	.2byte	0x365
+	.4byte	0x15a
+	.2byte	0x688
+	.uleb128 0x1c
+	.4byte	.LASF654
+	.byte	0x47
+	.2byte	0x36a
+	.4byte	0x15a
+	.2byte	0x690
+	.uleb128 0x1c
+	.4byte	.LASF655
+	.byte	0x47
+	.2byte	0x36c
+	.4byte	0x45aa
+	.2byte	0x698
+	.uleb128 0x1c
+	.4byte	.LASF656
+	.byte	0x47
+	.2byte	0x36d
+	.4byte	0x6d
+	.2byte	0x6a0
+	.uleb128 0x1c
+	.4byte	.LASF657
+	.byte	0x47
+	.2byte	0x36f
+	.4byte	0x3e74
+	.2byte	0x6a8
+	.uleb128 0x1c
+	.4byte	.LASF658
+	.byte	0x47
+	.2byte	0x378
+	.4byte	0x29
+	.2byte	0x6c0
+	.uleb128 0x1c
+	.4byte	.LASF659
+	.byte	0x47
+	.2byte	0x379
+	.4byte	0x29
+	.2byte	0x6c8
+	.uleb128 0x1c
+	.4byte	.LASF660
+	.byte	0x47
+	.2byte	0x37c
+	.4byte	0x15a
+	.2byte	0x6d0
+	.uleb128 0x1c
+	.4byte	.LASF661
+	.byte	0x47
+	.2byte	0x37f
+	.4byte	0x15a
+	.2byte	0x6d8
+	.uleb128 0x1c
+	.4byte	.LASF662
+	.byte	0x47
+	.2byte	0x382
+	.4byte	0x29
+	.2byte	0x6e0
+	.uleb128 0x1c
+	.4byte	.LASF663
+	.byte	0x47
+	.2byte	0x383
+	.4byte	0x29
+	.2byte	0x6e8
+	.uleb128 0x1c
+	.4byte	.LASF664
+	.byte	0x47
+	.2byte	0x386
+	.4byte	0x3ea5
+	.2byte	0x6f0
+	.uleb128 0x1c
+	.4byte	.LASF665
+	.byte	0x47
+	.2byte	0x387
+	.4byte	0x45b0
+	.2byte	0x708
+	.uleb128 0x1c
+	.4byte	.LASF666
+	.byte	0x47
+	.2byte	0x38d
+	.4byte	0x46f8
+	.2byte	0x738
+	.uleb128 0x1c
+	.4byte	.LASF667
+	.byte	0x47
+	.2byte	0x390
+	.4byte	0x46f8
+	.2byte	0x740
+	.uleb128 0x1c
+	.4byte	.LASF668
+	.byte	0x47
+	.2byte	0x393
+	.4byte	0x46f8
+	.2byte	0x748
+	.uleb128 0x1c
+	.4byte	.LASF669
+	.byte	0x47
+	.2byte	0x39c
+	.4byte	0x46fe
+	.2byte	0x750
+	.uleb128 0x1c
+	.4byte	.LASF670
+	.byte	0x47
+	.2byte	0x39e
+	.4byte	0x4713
+	.2byte	0x760
+	.uleb128 0x1c
+	.4byte	.LASF671
+	.byte	0x47
+	.2byte	0x3a5
+	.4byte	0x29
+	.2byte	0x768
+	.uleb128 0x1c
+	.4byte	.LASF672
+	.byte	0x47
+	.2byte	0x3a6
+	.4byte	0x29
+	.2byte	0x770
+	.uleb128 0x30
+	.string	"fs"
+	.byte	0x47
+	.2byte	0x3a9
+	.4byte	0x471e
+	.2byte	0x778
+	.uleb128 0x1c
+	.4byte	.LASF673
+	.byte	0x47
+	.2byte	0x3ac
+	.4byte	0x4729
+	.2byte	0x780
+	.uleb128 0x1c
+	.4byte	.LASF674
+	.byte	0x47
+	.2byte	0x3af
+	.4byte	0x4734
+	.2byte	0x788
+	.uleb128 0x1c
+	.4byte	.LASF675
+	.byte	0x47
+	.2byte	0x3b2
+	.4byte	0x473f
+	.2byte	0x790
+	.uleb128 0x1c
+	.4byte	.LASF676
+	.byte	0x47
+	.2byte	0x3b3
+	.4byte	0x474a
+	.2byte	0x798
+	.uleb128 0x1c
+	.4byte	.LASF677
+	.byte	0x47
+	.2byte	0x3b4
+	.4byte	0x3819
+	.2byte	0x7a0
+	.uleb128 0x1c
+	.4byte	.LASF678
+	.byte	0x47
+	.2byte	0x3b5
+	.4byte	0x3819
+	.2byte	0x7a8
+	.uleb128 0x1c
+	.4byte	.LASF679
+	.byte	0x47
+	.2byte	0x3b7
+	.4byte	0x3819
+	.2byte	0x7b0
+	.uleb128 0x1c
+	.4byte	.LASF219
+	.byte	0x47
+	.2byte	0x3b8
+	.4byte	0x3b8f
+	.2byte	0x7b8
+	.uleb128 0x1c
+	.4byte	.LASF680
+	.byte	0x47
+	.2byte	0x3b9
+	.4byte	0x29
+	.2byte	0x7d0
+	.uleb128 0x1c
+	.4byte	.LASF681
+	.byte	0x47
+	.2byte	0x3ba
+	.4byte	0x2e3
+	.2byte	0x7d8
+	.uleb128 0x1c
+	.4byte	.LASF682
+	.byte	0x47
+	.2byte	0x3bb
+	.4byte	0x6d
+	.2byte	0x7e0
+	.uleb128 0x1c
+	.4byte	.LASF683
+	.byte	0x47
+	.2byte	0x3bd
+	.4byte	0x441
+	.2byte	0x7e8
+	.uleb128 0x1c
+	.4byte	.LASF684
+	.byte	0x47
+	.2byte	0x3bf
+	.4byte	0x4755
+	.2byte	0x7f0
+	.uleb128 0x1c
+	.4byte	.LASF685
+	.byte	0x47
+	.2byte	0x3c4
+	.4byte	0x378d
+	.2byte	0x7f8
+	.uleb128 0x1c
+	.4byte	.LASF686
+	.byte	0x47
+	.2byte	0x3c7
+	.4byte	0x15a
+	.2byte	0x808
+	.uleb128 0x1c
+	.4byte	.LASF687
+	.byte	0x47
+	.2byte	0x3c8
+	.4byte	0x15a
+	.2byte	0x810
+	.uleb128 0x1c
+	.4byte	.LASF688
+	.byte	0x47
+	.2byte	0x3cb
+	.4byte	0xe65
+	.2byte	0x818
+	.uleb128 0x1c
+	.4byte	.LASF689
+	.byte	0x47
+	.2byte	0x3ce
+	.4byte	0xe33
+	.2byte	0x81c
+	.uleb128 0x1c
+	.4byte	.LASF690
+	.byte	0x47
+	.2byte	0x3d0
+	.4byte	0x4478
+	.2byte	0x820
+	.uleb128 0x1c
+	.4byte	.LASF691
+	.byte	0x47
+	.2byte	0x3d4
+	.4byte	0x3466
+	.2byte	0x828
+	.uleb128 0x1c
+	.4byte	.LASF692
+	.byte	0x47
+	.2byte	0x3d6
+	.4byte	0x2eff
+	.2byte	0x838
+	.uleb128 0x1c
+	.4byte	.LASF693
+	.byte	0x47
+	.2byte	0x3d8
+	.4byte	0x4760
+	.2byte	0x840
+	.uleb128 0x1c
+	.4byte	.LASF694
+	.byte	0x47
+	.2byte	0x400
+	.4byte	0x458
+	.2byte	0x848
+	.uleb128 0x1c
+	.4byte	.LASF695
+	.byte	0x47
+	.2byte	0x403
+	.4byte	0x476b
+	.2byte	0x850
+	.uleb128 0x1c
+	.4byte	.LASF696
+	.byte	0x47
+	.2byte	0x407
+	.4byte	0x4776
+	.2byte	0x858
+	.uleb128 0x1c
+	.4byte	.LASF697
+	.byte	0x47
+	.2byte	0x40b
+	.4byte	0x4781
+	.2byte	0x860
+	.uleb128 0x1c
+	.4byte	.LASF698
+	.byte	0x47
+	.2byte	0x40d
+	.4byte	0x478c
+	.2byte	0x868
+	.uleb128 0x1c
+	.4byte	.LASF699
+	.byte	0x47
+	.2byte	0x40f
+	.4byte	0x4823
+	.2byte	0x870
+	.uleb128 0x1c
+	.4byte	.LASF700
+	.byte	0x47
+	.2byte	0x412
+	.4byte	0x29
+	.2byte	0x878
+	.uleb128 0x1c
+	.4byte	.LASF701
+	.byte	0x47
+	.2byte	0x413
+	.4byte	0x4829
+	.2byte	0x880
+	.uleb128 0x1c
+	.4byte	.LASF702
+	.byte	0x47
+	.2byte	0x415
+	.4byte	0x3dab
+	.2byte	0x888
+	.uleb128 0x1c
+	.4byte	.LASF703
+	.byte	0x47
+	.2byte	0x418
+	.4byte	0x6d
+	.2byte	0x8c8
+	.uleb128 0x1c
+	.4byte	.LASF704
+	.byte	0x47
+	.2byte	0x41c
+	.4byte	0x15a
+	.2byte	0x8d0
+	.uleb128 0x1c
+	.4byte	.LASF705
+	.byte	0x47
+	.2byte	0x41e
+	.4byte	0x15a
+	.2byte	0x8d8
+	.uleb128 0x1c
+	.4byte	.LASF706
+	.byte	0x47
+	.2byte	0x420
+	.4byte	0x15a
+	.2byte	0x8e0
+	.uleb128 0x1c
+	.4byte	.LASF707
+	.byte	0x47
+	.2byte	0x424
+	.4byte	0x37d2
+	.2byte	0x8e8
+	.uleb128 0x1c
+	.4byte	.LASF708
+	.byte	0x47
+	.2byte	0x426
+	.4byte	0x16fc
+	.2byte	0x8f0
+	.uleb128 0x1c
+	.4byte	.LASF709
+	.byte	0x47
+	.2byte	0x427
+	.4byte	0xc6
+	.2byte	0x8f4
+	.uleb128 0x1c
+	.4byte	.LASF710
+	.byte	0x47
+	.2byte	0x428
+	.4byte	0xc6
+	.2byte	0x8f8
+	.uleb128 0x1c
+	.4byte	.LASF711
+	.byte	0x47
+	.2byte	0x42c
+	.4byte	0x4834
+	.2byte	0x900
+	.uleb128 0x1c
+	.4byte	.LASF712
+	.byte	0x47
+	.2byte	0x42e
+	.4byte	0x3a7
+	.2byte	0x908
+	.uleb128 0x1c
+	.4byte	.LASF713
+	.byte	0x47
+	.2byte	0x435
+	.4byte	0x483f
+	.2byte	0x918
+	.uleb128 0x1c
+	.4byte	.LASF714
+	.byte	0x47
+	.2byte	0x437
+	.4byte	0x484a
+	.2byte	0x920
+	.uleb128 0x1c
+	.4byte	.LASF715
+	.byte	0x47
+	.2byte	0x439
+	.4byte	0x3a7
+	.2byte	0x928
+	.uleb128 0x1c
+	.4byte	.LASF716
+	.byte	0x47
+	.2byte	0x43a
+	.4byte	0x4855
+	.2byte	0x938
+	.uleb128 0x1c
+	.4byte	.LASF717
+	.byte	0x47
+	.2byte	0x43d
+	.4byte	0x485b
+	.2byte	0x940
+	.uleb128 0x1c
+	.4byte	.LASF718
+	.byte	0x47
+	.2byte	0x43e
+	.4byte	0x2464
+	.2byte	0x950
+	.uleb128 0x1c
+	.4byte	.LASF719
+	.byte	0x47
+	.2byte	0x43f
+	.4byte	0x3a7
+	.2byte	0x970
+	.uleb128 0x1c
+	.4byte	.LASF720
+	.byte	0x47
+	.2byte	0x47d
+	.4byte	0x4876
+	.2byte	0x980
+	.uleb128 0x1c
+	.4byte	.LASF721
+	.byte	0x47
+	.2byte	0x47e
+	.4byte	0x13f
+	.2byte	0x988
+	.uleb128 0x1c
+	.4byte	.LASF722
+	.byte	0x47
+	.2byte	0x47f
+	.4byte	0x13f
+	.2byte	0x98c
+	.uleb128 0x1c
+	.4byte	.LASF723
+	.byte	0x47
+	.2byte	0x484
+	.4byte	0x29
+	.2byte	0x990
+	.uleb128 0x1c
+	.4byte	.LASF724
+	.byte	0x47
+	.2byte	0x487
+	.4byte	0x3da3
+	.2byte	0x998
+	.uleb128 0x30
+	.string	"rcu"
+	.byte	0x47
+	.2byte	0x489
+	.4byte	0x41c
+	.2byte	0x998
+	.uleb128 0x1c
+	.4byte	.LASF725
+	.byte	0x47
+	.2byte	0x48c
+	.4byte	0x4881
+	.2byte	0x9a8
+	.uleb128 0x1c
+	.4byte	.LASF726
+	.byte	0x47
+	.2byte	0x48e
+	.4byte	0x3d72
+	.2byte	0x9b0
+	.uleb128 0x1c
+	.4byte	.LASF727
+	.byte	0x47
+	.2byte	0x491
+	.4byte	0x488c
+	.2byte	0x9c0
+	.uleb128 0x1c
+	.4byte	.LASF728
+	.byte	0x47
+	.2byte	0x49c
+	.4byte	0xc6
+	.2byte	0x9c8
+	.uleb128 0x1c
+	.4byte	.LASF729
+	.byte	0x47
+	.2byte	0x49d
+	.4byte	0xc6
+	.2byte	0x9cc
+	.uleb128 0x1c
+	.4byte	.LASF730
+	.byte	0x47
+	.2byte	0x49f
+	.4byte	0x29
+	.2byte	0x9d0
+	.uleb128 0x1c
+	.4byte	.LASF731
+	.byte	0x47
+	.2byte	0x4a9
+	.4byte	0x15a
+	.2byte	0x9d8
+	.uleb128 0x1c
+	.4byte	.LASF732
+	.byte	0x47
+	.2byte	0x4aa
+	.4byte	0x15a
+	.2byte	0x9e0
+	.uleb128 0x1c
+	.4byte	.LASF733
+	.byte	0x47
+	.2byte	0x4c7
+	.4byte	0x29
+	.2byte	0x9e8
+	.uleb128 0x1c
+	.4byte	.LASF734
+	.byte	0x47
+	.2byte	0x4ca
+	.4byte	0x29
+	.2byte	0x9f0
+	.uleb128 0x1c
+	.4byte	.LASF735
+	.byte	0x47
+	.2byte	0x4e4
+	.4byte	0x4897
+	.2byte	0x9f8
+	.uleb128 0x1c
+	.4byte	.LASF736
+	.byte	0x47
+	.2byte	0x4e5
+	.4byte	0x330
+	.2byte	0xa00
+	.uleb128 0x1c
+	.4byte	.LASF737
+	.byte	0x47
+	.2byte	0x4e6
+	.4byte	0xc6
+	.2byte	0xa04
+	.uleb128 0x1c
+	.4byte	.LASF738
+	.byte	0x47
+	.2byte	0x4e9
+	.4byte	0x6d
+	.2byte	0xa08
+	.uleb128 0x1c
+	.4byte	.LASF739
+	.byte	0x47
+	.2byte	0x4ec
+	.4byte	0x4897
+	.2byte	0xa10
+	.uleb128 0x1c
+	.4byte	.LASF740
+	.byte	0x47
+	.2byte	0x4f0
+	.4byte	0x48a2
+	.2byte	0xa18
+	.uleb128 0x1c
+	.4byte	.LASF741
+	.byte	0x47
+	.2byte	0x4f4
+	.4byte	0x48f7
+	.2byte	0xa20
+	.uleb128 0x1c
+	.4byte	.LASF742
+	.byte	0x47
+	.2byte	0x4fd
+	.4byte	0xc6
+	.2byte	0xa28
+	.uleb128 0x1c
+	.4byte	.LASF743
+	.byte	0x47
+	.2byte	0x4ff
+	.4byte	0x2eff
+	.2byte	0xa30
+	.uleb128 0x1c
+	.4byte	.LASF744
+	.byte	0x47
+	.2byte	0x502
+	.4byte	0x496a
+	.2byte	0xa38
+	.uleb128 0x1c
+	.4byte	.LASF745
+	.byte	0x47
+	.2byte	0x506
+	.4byte	0x37c
+	.2byte	0xa40
+	.uleb128 0x1c
+	.4byte	.LASF746
+	.byte	0x47
+	.2byte	0x50d
+	.4byte	0x458
+	.2byte	0xa48
+	.uleb128 0x2f
+	.4byte	0x44b5
+	.2byte	0xa50
+	.uleb128 0x2f
+	.4byte	0x44f4
+	.2byte	0xa58
+	.uleb128 0x1c
+	.4byte	.LASF747
+	.byte	0x47
+	.2byte	0x521
+	.4byte	0x2464
+	.2byte	0xa60
+	.uleb128 0x1c
+	.4byte	.LASF748
+	.byte	0x47
+	.2byte	0x524
+	.4byte	0x15a
+	.2byte	0xa80
+	.uleb128 0x1c
+	.4byte	.LASF749
+	.byte	0x47
+	.2byte	0x525
+	.4byte	0x15a
+	.2byte	0xa88
+	.uleb128 0x1c
+	.4byte	.LASF750
+	.byte	0x47
+	.2byte	0x52e
+	.4byte	0x147b
+	.2byte	0xa90
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x24a1
+	.uleb128 0x19
+	.4byte	.LASF751
+	.byte	0x48
+	.byte	0xa
+	.4byte	0xa02
+	.uleb128 0xd
+	.4byte	.LASF752
+	.byte	0x8
+	.byte	0x49
+	.byte	0x46
+	.4byte	0x2f29
+	.uleb128 0xe
+	.4byte	.LASF64
+	.byte	0x49
+	.byte	0x47
+	.4byte	0x2f29
+	.byte	0
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x2f10
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x2f35
+	.uleb128 0x10
+	.4byte	0x2f40
+	.uleb128 0x11
+	.4byte	0x458
+	.byte	0
+	.uleb128 0x19
+	.4byte	.LASF753
+	.byte	0x4a
+	.byte	0x1e
+	.4byte	0x6d
+	.uleb128 0x5
+	.4byte	0x29
+	.4byte	0x2f5b
+	.uleb128 0x6
+	.4byte	0x4f
+	.byte	0x7
+	.byte	0
+	.uleb128 0x19
+	.4byte	.LASF754
+	.byte	0x4b
+	.byte	0x13
+	.4byte	0x2f4b
+	.uleb128 0x19
+	.4byte	.LASF755
+	.byte	0x4c
+	.byte	0x26
+	.4byte	0xc6
+	.uleb128 0x10
+	.4byte	0x2f81
+	.uleb128 0x11
+	.4byte	0x2f81
+	.uleb128 0x11
+	.4byte	0x6d
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x15e3
+	.uleb128 0x19
+	.4byte	.LASF756
+	.byte	0x4c
+	.byte	0x48
+	.4byte	0x2f92
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x2f71
+	.uleb128 0xd
+	.4byte	.LASF757
+	.byte	0x18
+	.byte	0x4c
+	.byte	0x5b
+	.4byte	0x2fc9
+	.uleb128 0xe
+	.4byte	.LASF578
+	.byte	0x4c
+	.byte	0x5c
+	.4byte	0x458
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF758
+	.byte	0x4c
+	.byte	0x5d
+	.4byte	0x2eff
+	.byte	0x8
+	.uleb128 0xe
+	.4byte	.LASF759
+	.byte	0x4c
+	.byte	0x5e
+	.4byte	0x199
+	.byte	0x10
+	.byte	0
+	.uleb128 0x19
+	.4byte	.LASF757
+	.byte	0x4c
+	.byte	0x61
+	.4byte	0x2f98
+	.uleb128 0x19
+	.4byte	.LASF760
+	.byte	0x4c
+	.byte	0x62
+	.4byte	0x199
+	.uleb128 0x19
+	.4byte	.LASF761
+	.byte	0x4a
+	.byte	0x7c
+	.4byte	0x6d
+	.uleb128 0x19
+	.4byte	.LASF762
+	.byte	0x4a
+	.byte	0x80
+	.4byte	0xc6
+	.uleb128 0x16
+	.4byte	0x15a
+	.uleb128 0x19
+	.4byte	.LASF763
+	.byte	0x4d
+	.byte	0x60
+	.4byte	0x3005
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x2ff5
+	.uleb128 0x19
+	.4byte	.LASF764
+	.byte	0x4e
+	.byte	0x22
+	.4byte	0xf52
+	.uleb128 0x1f
+	.4byte	.LASF765
+	.byte	0x4
+	.4byte	0x6d
+	.byte	0x4e
+	.byte	0x29
+	.4byte	0x3039
+	.uleb128 0xc
+	.4byte	.LASF766
+	.byte	0
+	.uleb128 0xc
+	.4byte	.LASF767
+	.byte	0x1
+	.uleb128 0xc
+	.4byte	.LASF768
+	.byte	0x2
+	.byte	0
+	.uleb128 0xd
+	.4byte	.LASF769
+	.byte	0x48
+	.byte	0x4e
+	.byte	0x31
+	.4byte	0x30b1
+	.uleb128 0xe
+	.4byte	.LASF770
+	.byte	0x4e
+	.byte	0x32
+	.4byte	0x3016
+	.byte	0
+	.uleb128 0x20
+	.string	"id"
+	.byte	0x4e
+	.byte	0x33
+	.4byte	0x30b6
+	.byte	0x8
+	.uleb128 0xe
+	.4byte	.LASF771
+	.byte	0x4e
+	.byte	0x34
+	.4byte	0x56
+	.byte	0x10
+	.uleb128 0xe
+	.4byte	.LASF772
+	.byte	0x4e
+	.byte	0x35
+	.4byte	0x30c2
+	.byte	0x18
+	.uleb128 0xe
+	.4byte	.LASF773
+	.byte	0x4e
+	.byte	0x36
+	.4byte	0x30c2
+	.byte	0x20
+	.uleb128 0xe
+	.4byte	.LASF774
+	.byte	0x4e
+	.byte	0x37
+	.4byte	0x3005
+	.byte	0x28
+	.uleb128 0xe
+	.4byte	.LASF775
+	.byte	0x4e
+	.byte	0x38
+	.4byte	0x3005
+	.byte	0x30
+	.uleb128 0xe
+	.4byte	.LASF776
+	.byte	0x4e
+	.byte	0x39
+	.4byte	0x30e7
+	.byte	0x38
+	.uleb128 0xe
+	.4byte	.LASF777
+	.byte	0x4e
+	.byte	0x3a
+	.4byte	0x30e7
+	.byte	0x40
+	.byte	0
+	.uleb128 0x3
+	.4byte	0x3039
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x30bc
+	.uleb128 0x34
+	.uleb128 0x16
+	.4byte	0x13f
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x30bd
+	.uleb128 0x14
+	.4byte	0xc6
+	.4byte	0x30dc
+	.uleb128 0x11
+	.4byte	0x29
+	.uleb128 0x11
+	.4byte	0x30dc
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x30e2
+	.uleb128 0x24
+	.4byte	.LASF778
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x30c8
+	.uleb128 0x19
+	.4byte	.LASF779
+	.byte	0x4e
+	.byte	0x3d
+	.4byte	0x30f8
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x30b1
+	.uleb128 0x19
+	.4byte	.LASF780
+	.byte	0x4f
+	.byte	0x8b
+	.4byte	0x29
+	.uleb128 0x19
+	.4byte	.LASF781
+	.byte	0x4f
+	.byte	0x8c
+	.4byte	0x29
+	.uleb128 0x19
+	.4byte	.LASF782
+	.byte	0x11
+	.byte	0x4e
+	.4byte	0x15a
+	.uleb128 0x19
+	.4byte	.LASF783
+	.byte	0x11
+	.byte	0x4f
+	.4byte	0x35
+	.uleb128 0x19
+	.4byte	.LASF784
+	.byte	0x11
+	.byte	0xbc
+	.4byte	0x29
+	.uleb128 0x8
+	.4byte	.LASF785
+	.byte	0x50
+	.byte	0x1c
+	.4byte	0x14f
+	.uleb128 0x19
+	.4byte	.LASF786
+	.byte	0x51
+	.byte	0xa
+	.4byte	0xc6
+	.uleb128 0x15
+	.4byte	.LASF787
+	.byte	0x51
+	.2byte	0x11e
+	.4byte	0xc6
+	.uleb128 0x14
+	.4byte	0x458
+	.4byte	0x3166
+	.uleb128 0x11
+	.4byte	0x458
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x3157
+	.uleb128 0xd
+	.4byte	.LASF788
+	.byte	0x38
+	.byte	0x52
+	.byte	0xc
+	.4byte	0x31c1
+	.uleb128 0xe
+	.4byte	.LASF361
+	.byte	0x52
+	.byte	0x11
+	.4byte	0x3eb
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF194
+	.byte	0x52
+	.byte	0x12
+	.4byte	0x29
+	.byte	0x10
+	.uleb128 0xe
+	.4byte	.LASF789
+	.byte	0x52
+	.byte	0x13
+	.4byte	0x31d2
+	.byte	0x18
+	.uleb128 0xe
+	.4byte	.LASF171
+	.byte	0x52
+	.byte	0x14
+	.4byte	0x13f
+	.byte	0x20
+	.uleb128 0xe
+	.4byte	.LASF130
+	.byte	0x52
+	.byte	0x1a
+	.4byte	0x15a
+	.byte	0x28
+	.uleb128 0xe
+	.4byte	.LASF131
+	.byte	0x52
+	.byte	0x1b
+	.4byte	0x15a
+	.byte	0x30
+	.byte	0
+	.uleb128 0x10
+	.4byte	0x31cc
+	.uleb128 0x11
+	.4byte	0x31cc
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x316c
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x31c1
+	.uleb128 0x19
+	.4byte	.LASF790
+	.byte	0x52
+	.byte	0xc3
+	.4byte	0x6d
+	.uleb128 0x8
+	.4byte	.LASF791
+	.byte	0x53
+	.byte	0x16
+	.4byte	0x31ee
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x31f4
+	.uleb128 0x10
+	.4byte	0x31ff
+	.uleb128 0x11
+	.4byte	0x31ff
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x3205
+	.uleb128 0xd
+	.4byte	.LASF792
+	.byte	0x30
+	.byte	0x53
+	.byte	0x67
+	.4byte	0x324e
+	.uleb128 0xe
+	.4byte	.LASF793
+	.byte	0x53
+	.byte	0x68
+	.4byte	0x558
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF361
+	.byte	0x53
+	.byte	0x69
+	.4byte	0x3a7
+	.byte	0x8
+	.uleb128 0xe
+	.4byte	.LASF71
+	.byte	0x53
+	.byte	0x6a
+	.4byte	0x31e3
+	.byte	0x18
+	.uleb128 0xe
+	.4byte	.LASF130
+	.byte	0x53
+	.byte	0x6e
+	.4byte	0x15a
+	.byte	0x20
+	.uleb128 0xe
+	.4byte	.LASF131
+	.byte	0x53
+	.byte	0x6f
+	.4byte	0x15a
+	.byte	0x28
+	.byte	0
+	.uleb128 0x24
+	.4byte	.LASF794
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x324e
+	.uleb128 0x15
+	.4byte	.LASF795
+	.byte	0x53
+	.2byte	0x187
+	.4byte	0x3253
+	.uleb128 0x15
+	.4byte	.LASF796
+	.byte	0x53
+	.2byte	0x188
+	.4byte	0x3253
+	.uleb128 0x15
+	.4byte	.LASF797
+	.byte	0x53
+	.2byte	0x189
+	.4byte	0x3253
+	.uleb128 0x15
+	.4byte	.LASF798
+	.byte	0x53
+	.2byte	0x18a
+	.4byte	0x3253
+	.uleb128 0x15
+	.4byte	.LASF799
+	.byte	0x53
+	.2byte	0x18b
+	.4byte	0x3253
+	.uleb128 0x15
+	.4byte	.LASF800
+	.byte	0x53
+	.2byte	0x18c
+	.4byte	0x3253
+	.uleb128 0x15
+	.4byte	.LASF801
+	.byte	0x53
+	.2byte	0x18d
+	.4byte	0x3253
+	.uleb128 0xd
+	.4byte	.LASF802
+	.byte	0x4
+	.byte	0x54
+	.byte	0x13
+	.4byte	0x32c6
+	.uleb128 0xe
+	.4byte	.LASF803
+	.byte	0x54
+	.byte	0x14
+	.4byte	0x37c
+	.byte	0
+	.byte	0
+	.uleb128 0x8
+	.4byte	.LASF804
+	.byte	0x54
+	.byte	0x15
+	.4byte	0x32ad
+	.uleb128 0x8
+	.4byte	.LASF805
+	.byte	0x55
+	.byte	0x19
+	.4byte	0x15a
+	.uleb128 0x8
+	.4byte	.LASF806
+	.byte	0x55
+	.byte	0x1a
+	.4byte	0x15a
+	.uleb128 0x8
+	.4byte	.LASF807
+	.byte	0x55
+	.byte	0x1c
+	.4byte	0x15a
+	.uleb128 0xf
+	.byte	0x8
+	.byte	0x55
+	.byte	0x21
+	.4byte	0x3307
+	.uleb128 0x20
+	.string	"pte"
+	.byte	0x55
+	.byte	0x21
+	.4byte	0x32d1
+	.byte	0
+	.byte	0
+	.uleb128 0x8
+	.4byte	.LASF808
+	.byte	0x55
+	.byte	0x21
+	.4byte	0x32f2
+	.uleb128 0xf
+	.byte	0x8
+	.byte	0x55
+	.byte	0x26
+	.4byte	0x3327
+	.uleb128 0x20
+	.string	"pmd"
+	.byte	0x55
+	.byte	0x26
+	.4byte	0x32dc
+	.byte	0
+	.byte	0
+	.uleb128 0x8
+	.4byte	.LASF809
+	.byte	0x55
+	.byte	0x26
+	.4byte	0x3312
+	.uleb128 0xf
+	.byte	0x8
+	.byte	0x55
+	.byte	0x31
+	.4byte	0x3347
+	.uleb128 0x20
+	.string	"pgd"
+	.byte	0x55
+	.byte	0x31
+	.4byte	0x32e7
+	.byte	0
+	.byte	0
+	.uleb128 0x8
+	.4byte	.LASF810
+	.byte	0x55
+	.byte	0x31
+	.4byte	0x3332
+	.uleb128 0xf
+	.byte	0x8
+	.byte	0x55
+	.byte	0x35
+	.4byte	0x3367
+	.uleb128 0xe
+	.4byte	.LASF811
+	.byte	0x55
+	.byte	0x35
+	.4byte	0x32d1
+	.byte	0
+	.byte	0
+	.uleb128 0x8
+	.4byte	.LASF812
+	.byte	0x55
+	.byte	0x35
+	.4byte	0x3352
+	.uleb128 0xf
+	.byte	0x8
+	.byte	0x56
+	.byte	0xf
+	.4byte	0x3387
+	.uleb128 0x20
+	.string	"pgd"
+	.byte	0x56
+	.byte	0xf
+	.4byte	0x3347
+	.byte	0
+	.byte	0
+	.uleb128 0x8
+	.4byte	.LASF813
+	.byte	0x56
+	.byte	0xf
+	.4byte	0x3372
+	.uleb128 0x8
+	.4byte	.LASF814
+	.byte	0x57
+	.byte	0x2a
+	.4byte	0x339d
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x33a3
+	.uleb128 0xd
+	.4byte	.LASF815
+	.byte	0x40
+	.byte	0x58
+	.byte	0x47
+	.4byte	0x33e0
+	.uleb128 0xe
+	.4byte	.LASF171
+	.byte	0x58
+	.byte	0x48
+	.4byte	0x29
+	.byte	0
+	.uleb128 0x23
+	.4byte	0x52f6
+	.byte	0x8
+	.uleb128 0x23
+	.4byte	0x5328
+	.byte	0x30
+	.uleb128 0xe
+	.4byte	.LASF816
+	.byte	0x58
+	.byte	0xb8
+	.4byte	0x37c
+	.byte	0x34
+	.uleb128 0xe
+	.4byte	.LASF817
+	.byte	0x58
+	.byte	0xbb
+	.4byte	0x4897
+	.byte	0x38
+	.byte	0
+	.uleb128 0x3
+	.4byte	0x33a3
+	.uleb128 0xd
+	.4byte	.LASF818
+	.byte	0x28
+	.byte	0x59
+	.byte	0x55
+	.4byte	0x3416
+	.uleb128 0xe
+	.4byte	.LASF589
+	.byte	0x59
+	.byte	0x56
+	.4byte	0xc6
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF819
+	.byte	0x59
+	.byte	0x57
+	.4byte	0x3a7
+	.byte	0x8
+	.uleb128 0xe
+	.4byte	.LASF820
+	.byte	0x59
+	.byte	0x58
+	.4byte	0x3a7
+	.byte	0x18
+	.byte	0
+	.uleb128 0xd
+	.4byte	.LASF821
+	.byte	0x18
+	.byte	0x5a
+	.byte	0x24
+	.4byte	0x3447
+	.uleb128 0xe
+	.4byte	.LASF822
+	.byte	0x5a
+	.byte	0x25
+	.4byte	0x29
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF823
+	.byte	0x5a
+	.byte	0x26
+	.4byte	0x3447
+	.byte	0x8
+	.uleb128 0xe
+	.4byte	.LASF824
+	.byte	0x5a
+	.byte	0x27
+	.4byte	0x3447
+	.byte	0x10
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x3416
+	.uleb128 0xd
+	.4byte	.LASF825
+	.byte	0x8
+	.byte	0x5a
+	.byte	0x2b
+	.4byte	0x3466
+	.uleb128 0xe
+	.4byte	.LASF821
+	.byte	0x5a
+	.byte	0x2c
+	.4byte	0x3447
+	.byte	0
+	.byte	0
+	.uleb128 0xd
+	.4byte	.LASF826
+	.byte	0x10
+	.byte	0x5a
+	.byte	0x39
+	.4byte	0x348b
+	.uleb128 0xe
+	.4byte	.LASF825
+	.byte	0x5a
+	.byte	0x3a
+	.4byte	0x344d
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF827
+	.byte	0x5a
+	.byte	0x3b
+	.4byte	0x3447
+	.byte	0x8
+	.byte	0
+	.uleb128 0x19
+	.4byte	.LASF828
+	.byte	0x5b
+	.byte	0x47
+	.4byte	0x458
+	.uleb128 0x19
+	.4byte	.LASF829
+	.byte	0x5b
+	.byte	0x48
+	.4byte	0x34a1
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x30
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x6d
+	.uleb128 0x1f
+	.4byte	.LASF830
+	.byte	0x4
+	.4byte	0x6d
+	.byte	0x5b
+	.byte	0x5d
+	.4byte	0x34d6
+	.uleb128 0xc
+	.4byte	.LASF831
+	.byte	0
+	.uleb128 0xc
+	.4byte	.LASF832
+	.byte	0x1
+	.uleb128 0xc
+	.4byte	.LASF833
+	.byte	0x2
+	.uleb128 0xc
+	.4byte	.LASF834
+	.byte	0x3
+	.byte	0
+	.uleb128 0x5
+	.4byte	0x5c
+	.4byte	0x34e6
+	.uleb128 0x6
+	.4byte	0x4f
+	.byte	0x2
+	.byte	0
+	.uleb128 0x3
+	.4byte	0x34d6
+	.uleb128 0x19
+	.4byte	.LASF835
+	.byte	0x5b
+	.byte	0x64
+	.4byte	0x34e6
+	.uleb128 0x19
+	.4byte	.LASF836
+	.byte	0x5b
+	.byte	0x66
+	.4byte	0x34ad
+	.uleb128 0xd
+	.4byte	.LASF837
+	.byte	0x20
+	.byte	0x5c
+	.byte	0x9
+	.4byte	0x3526
+	.uleb128 0xe
+	.4byte	.LASF838
+	.byte	0x5c
+	.byte	0xa
+	.4byte	0x3416
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF194
+	.byte	0x5c
+	.byte	0xb
+	.4byte	0x3135
+	.byte	0x18
+	.byte	0
+	.uleb128 0xd
+	.4byte	.LASF839
+	.byte	0x10
+	.byte	0x5c
+	.byte	0xe
+	.4byte	0x354b
+	.uleb128 0xe
+	.4byte	.LASF136
+	.byte	0x5c
+	.byte	0xf
+	.4byte	0x344d
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF64
+	.byte	0x5c
+	.byte	0x10
+	.4byte	0x354b
+	.byte	0x8
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x3501
+	.uleb128 0x1f
+	.4byte	.LASF840
+	.byte	0x4
+	.4byte	0x6d
+	.byte	0x52
+	.byte	0xbe
+	.4byte	0x356e
+	.uleb128 0xc
+	.4byte	.LASF841
+	.byte	0
+	.uleb128 0xc
+	.4byte	.LASF842
+	.byte	0x1
+	.byte	0
+	.uleb128 0xd
+	.4byte	.LASF843
+	.byte	0x48
+	.byte	0x5d
+	.byte	0x6f
+	.4byte	0x35db
+	.uleb128 0xe
+	.4byte	.LASF838
+	.byte	0x5d
+	.byte	0x70
+	.4byte	0x3501
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF844
+	.byte	0x5d
+	.byte	0x71
+	.4byte	0x3135
+	.byte	0x20
+	.uleb128 0xe
+	.4byte	.LASF789
+	.byte	0x5d
+	.byte	0x72
+	.4byte	0x35f0
+	.byte	0x28
+	.uleb128 0xe
+	.4byte	.LASF845
+	.byte	0x5d
+	.byte	0x73
+	.4byte	0x3663
+	.byte	0x30
+	.uleb128 0xe
+	.4byte	.LASF577
+	.byte	0x5d
+	.byte	0x74
+	.4byte	0x110
+	.byte	0x38
+	.uleb128 0xe
+	.4byte	.LASF846
+	.byte	0x5d
+	.byte	0x75
+	.4byte	0x110
+	.byte	0x39
+	.uleb128 0xe
+	.4byte	.LASF847
+	.byte	0x5d
+	.byte	0x76
+	.4byte	0x110
+	.byte	0x3a
+	.uleb128 0xe
+	.4byte	.LASF130
+	.byte	0x5d
+	.byte	0x78
+	.4byte	0x15a
+	.byte	0x40
+	.byte	0
+	.uleb128 0x14
+	.4byte	0x3551
+	.4byte	0x35ea
+	.uleb128 0x11
+	.4byte	0x35ea
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x356e
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x35db
+	.uleb128 0xd
+	.4byte	.LASF848
+	.byte	0x40
+	.byte	0x5d
+	.byte	0x99
+	.4byte	0x3663
+	.uleb128 0xe
+	.4byte	.LASF849
+	.byte	0x5d
+	.byte	0x9a
+	.4byte	0x374f
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF850
+	.byte	0x5d
+	.byte	0x9b
+	.4byte	0x6d
+	.byte	0x8
+	.uleb128 0xe
+	.4byte	.LASF192
+	.byte	0x5d
+	.byte	0x9c
+	.4byte	0x2a5
+	.byte	0xc
+	.uleb128 0x20
+	.string	"seq"
+	.byte	0x5d
+	.byte	0x9d
+	.4byte	0x16fc
+	.byte	0x10
+	.uleb128 0xe
+	.4byte	.LASF851
+	.byte	0x5d
+	.byte	0x9e
+	.4byte	0x35ea
+	.byte	0x18
+	.uleb128 0xe
+	.4byte	.LASF852
+	.byte	0x5d
+	.byte	0x9f
+	.4byte	0x3526
+	.byte	0x20
+	.uleb128 0xe
+	.4byte	.LASF853
+	.byte	0x5d
+	.byte	0xa0
+	.4byte	0x375a
+	.byte	0x30
+	.uleb128 0xe
+	.4byte	.LASF854
+	.byte	0x5d
+	.byte	0xa1
+	.4byte	0x3135
+	.byte	0x38
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x35f6
+	.uleb128 0x26
+	.4byte	.LASF855
+	.2byte	0x240
+	.byte	0x5d
+	.byte	0xcc
+	.4byte	0x374f
+	.uleb128 0xe
+	.4byte	.LASF116
+	.byte	0x5d
+	.byte	0xcd
+	.4byte	0xe33
+	.byte	0
+	.uleb128 0x20
+	.string	"cpu"
+	.byte	0x5d
+	.byte	0xce
+	.4byte	0x6d
+	.byte	0x4
+	.uleb128 0xe
+	.4byte	.LASF856
+	.byte	0x5d
+	.byte	0xcf
+	.4byte	0x6d
+	.byte	0x8
+	.uleb128 0xe
+	.4byte	.LASF857
+	.byte	0x5d
+	.byte	0xd0
+	.4byte	0x6d
+	.byte	0xc
+	.uleb128 0x35
+	.4byte	.LASF858
+	.byte	0x5d
+	.byte	0xd1
+	.4byte	0x6d
+	.byte	0x4
+	.byte	0x1
+	.byte	0x1f
+	.byte	0x10
+	.uleb128 0x35
+	.4byte	.LASF859
+	.byte	0x5d
+	.byte	0xd2
+	.4byte	0x6d
+	.byte	0x4
+	.byte	0x1
+	.byte	0x1e
+	.byte	0x10
+	.uleb128 0x35
+	.4byte	.LASF860
+	.byte	0x5d
+	.byte	0xd3
+	.4byte	0x6d
+	.byte	0x4
+	.byte	0x1
+	.byte	0x1d
+	.byte	0x10
+	.uleb128 0x35
+	.4byte	.LASF861
+	.byte	0x5d
+	.byte	0xd4
+	.4byte	0x6d
+	.byte	0x4
+	.byte	0x1
+	.byte	0x1c
+	.byte	0x10
+	.uleb128 0xe
+	.4byte	.LASF862
+	.byte	0x5d
+	.byte	0xd6
+	.4byte	0x6d
+	.byte	0x14
+	.uleb128 0xe
+	.4byte	.LASF863
+	.byte	0x5d
+	.byte	0xd7
+	.4byte	0xb4
+	.byte	0x18
+	.uleb128 0xe
+	.4byte	.LASF864
+	.byte	0x5d
+	.byte	0xd8
+	.4byte	0xb4
+	.byte	0x1a
+	.uleb128 0xe
+	.4byte	.LASF865
+	.byte	0x5d
+	.byte	0xd9
+	.4byte	0x6d
+	.byte	0x1c
+	.uleb128 0xe
+	.4byte	.LASF866
+	.byte	0x5d
+	.byte	0xdb
+	.4byte	0x3135
+	.byte	0x20
+	.uleb128 0xe
+	.4byte	.LASF867
+	.byte	0x5d
+	.byte	0xdc
+	.4byte	0x35ea
+	.byte	0x28
+	.uleb128 0xe
+	.4byte	.LASF868
+	.byte	0x5d
+	.byte	0xdd
+	.4byte	0x3135
+	.byte	0x30
+	.uleb128 0xe
+	.4byte	.LASF869
+	.byte	0x5d
+	.byte	0xde
+	.4byte	0x35ea
+	.byte	0x38
+	.uleb128 0xe
+	.4byte	.LASF870
+	.byte	0x5d
+	.byte	0xdf
+	.4byte	0x3760
+	.byte	0x40
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x3669
+	.uleb128 0x16
+	.4byte	0x3135
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x3755
+	.uleb128 0x5
+	.4byte	0x35f6
+	.4byte	0x3770
+	.uleb128 0x6
+	.4byte	0x4f
+	.byte	0x7
+	.byte	0
+	.uleb128 0x15
+	.4byte	.LASF871
+	.byte	0x5d
+	.2byte	0x135
+	.4byte	0x6d
+	.uleb128 0x24
+	.4byte	.LASF872
+	.uleb128 0x15
+	.4byte	.LASF873
+	.byte	0x5d
+	.2byte	0x15c
+	.4byte	0x377c
+	.uleb128 0xd
+	.4byte	.LASF685
+	.byte	0x10
+	.byte	0x5e
+	.byte	0x1c
+	.4byte	0x37b2
+	.uleb128 0xe
+	.4byte	.LASF874
+	.byte	0x5e
+	.byte	0x1d
+	.4byte	0xc6
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF875
+	.byte	0x5e
+	.byte	0x1e
+	.4byte	0x37b7
+	.byte	0x8
+	.byte	0
+	.uleb128 0x24
+	.4byte	.LASF876
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x37b2
+	.uleb128 0xf
+	.byte	0x8
+	.byte	0x5f
+	.byte	0x62
+	.4byte	0x37d2
+	.uleb128 0xe
+	.4byte	.LASF366
+	.byte	0x5f
+	.byte	0x62
+	.4byte	0x1062
+	.byte	0
+	.byte	0
+	.uleb128 0x8
+	.4byte	.LASF877
+	.byte	0x5f
+	.byte	0x62
+	.4byte	0x37bd
+	.uleb128 0x19
+	.4byte	.LASF878
+	.byte	0x5f
+	.byte	0x63
+	.4byte	0x37d2
+	.uleb128 0x5
+	.4byte	0x37d2
+	.4byte	0x37f8
+	.uleb128 0x6
+	.4byte	0x4f
+	.byte	0x4
+	.byte	0
+	.uleb128 0x15
+	.4byte	.LASF879
+	.byte	0x5f
+	.2byte	0x19a
+	.4byte	0x37e8
+	.uleb128 0xf
+	.byte	0x8
+	.byte	0x60
+	.byte	0x5a
+	.4byte	0x3819
+	.uleb128 0x20
+	.string	"sig"
+	.byte	0x60
+	.byte	0x5b
+	.4byte	0x1062
+	.byte	0
+	.byte	0
+	.uleb128 0x8
+	.4byte	.LASF880
+	.byte	0x60
+	.byte	0x5c
+	.4byte	0x3804
+	.uleb128 0x36
+	.4byte	.LASF1059
+	.byte	0x8
+	.byte	0x61
+	.byte	0x8
+	.4byte	0x3847
+	.uleb128 0x22
+	.4byte	.LASF881
+	.byte	0x61
+	.byte	0x9
+	.4byte	0xc6
+	.uleb128 0x22
+	.4byte	.LASF882
+	.byte	0x61
+	.byte	0xa
+	.4byte	0x458
+	.byte	0
+	.uleb128 0x8
+	.4byte	.LASF883
+	.byte	0x61
+	.byte	0xb
+	.4byte	0x3824
+	.uleb128 0xf
+	.byte	0x8
+	.byte	0x61
+	.byte	0x39
+	.4byte	0x3873
+	.uleb128 0xe
+	.4byte	.LASF884
+	.byte	0x61
+	.byte	0x3a
+	.4byte	0x1b0
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF885
+	.byte	0x61
+	.byte	0x3b
+	.4byte	0x1bb
+	.byte	0x4
+	.byte	0
+	.uleb128 0xf
+	.byte	0x18
+	.byte	0x61
+	.byte	0x3f
+	.4byte	0x38ac
+	.uleb128 0xe
+	.4byte	.LASF886
+	.byte	0x61
+	.byte	0x40
+	.4byte	0x208
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF887
+	.byte	0x61
+	.byte	0x41
+	.4byte	0xc6
+	.byte	0x4
+	.uleb128 0xe
+	.4byte	.LASF888
+	.byte	0x61
+	.byte	0x42
+	.4byte	0x3847
+	.byte	0x8
+	.uleb128 0xe
+	.4byte	.LASF889
+	.byte	0x61
+	.byte	0x43
+	.4byte	0xc6
+	.byte	0x10
+	.byte	0
+	.uleb128 0xf
+	.byte	0x10
+	.byte	0x61
+	.byte	0x47
+	.4byte	0x38d9
+	.uleb128 0xe
+	.4byte	.LASF884
+	.byte	0x61
+	.byte	0x48
+	.4byte	0x1b0
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF885
+	.byte	0x61
+	.byte	0x49
+	.4byte	0x1bb
+	.byte	0x4
+	.uleb128 0xe
+	.4byte	.LASF888
+	.byte	0x61
+	.byte	0x4a
+	.4byte	0x3847
+	.byte	0x8
+	.byte	0
+	.uleb128 0xf
+	.byte	0x20
+	.byte	0x61
+	.byte	0x4e
+	.4byte	0x391e
+	.uleb128 0xe
+	.4byte	.LASF884
+	.byte	0x61
+	.byte	0x4f
+	.4byte	0x1b0
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF885
+	.byte	0x61
+	.byte	0x50
+	.4byte	0x1bb
+	.byte	0x4
+	.uleb128 0xe
+	.4byte	.LASF890
+	.byte	0x61
+	.byte	0x51
+	.4byte	0xc6
+	.byte	0x8
+	.uleb128 0xe
+	.4byte	.LASF891
+	.byte	0x61
+	.byte	0x52
+	.4byte	0x1fd
+	.byte	0x10
+	.uleb128 0xe
+	.4byte	.LASF892
+	.byte	0x61
+	.byte	0x53
+	.4byte	0x1fd
+	.byte	0x18
+	.byte	0
+	.uleb128 0xf
+	.byte	0x18
+	.byte	0x61
+	.byte	0x6b
+	.4byte	0x394b
+	.uleb128 0xe
+	.4byte	.LASF893
+	.byte	0x61
+	.byte	0x6c
+	.4byte	0x394b
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF894
+	.byte	0x61
+	.byte	0x6d
+	.4byte	0x458
+	.byte	0x8
+	.uleb128 0xe
+	.4byte	.LASF895
+	.byte	0x61
+	.byte	0x6e
+	.4byte	0x458
+	.byte	0x10
+	.byte	0
+	.uleb128 0x5
+	.4byte	0x61
+	.4byte	0x395b
+	.uleb128 0x6
+	.4byte	0x4f
+	.byte	0x7
+	.byte	0
+	.uleb128 0xf
+	.byte	0xc
+	.byte	0x61
+	.byte	0x71
+	.4byte	0x397c
+	.uleb128 0xe
+	.4byte	.LASF896
+	.byte	0x61
+	.byte	0x72
+	.4byte	0x394b
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF897
+	.byte	0x61
+	.byte	0x73
+	.4byte	0xd2
+	.byte	0x8
+	.byte	0
+	.uleb128 0x21
+	.byte	0x18
+	.byte	0x61
+	.byte	0x64
+	.4byte	0x39a6
+	.uleb128 0x22
+	.4byte	.LASF898
+	.byte	0x61
+	.byte	0x69
+	.4byte	0xa2
+	.uleb128 0x22
+	.4byte	.LASF899
+	.byte	0x61
+	.byte	0x6f
+	.4byte	0x391e
+	.uleb128 0x22
+	.4byte	.LASF900
+	.byte	0x61
+	.byte	0x74
+	.4byte	0x395b
+	.byte	0
+	.uleb128 0xf
+	.byte	0x20
+	.byte	0x61
+	.byte	0x57
+	.4byte	0x39c1
+	.uleb128 0xe
+	.4byte	.LASF901
+	.byte	0x61
+	.byte	0x58
+	.4byte	0x458
+	.byte	0
+	.uleb128 0x23
+	.4byte	0x397c
+	.byte	0x8
+	.byte	0
+	.uleb128 0xf
+	.byte	0x10
+	.byte	0x61
+	.byte	0x79
+	.4byte	0x39e2
+	.uleb128 0xe
+	.4byte	.LASF902
+	.byte	0x61
+	.byte	0x7a
+	.4byte	0x199
+	.byte	0
+	.uleb128 0x20
+	.string	"_fd"
+	.byte	0x61
+	.byte	0x7b
+	.4byte	0xc6
+	.byte	0x8
+	.byte	0
+	.uleb128 0xf
+	.byte	0x10
+	.byte	0x61
+	.byte	0x7f
+	.4byte	0x3a0f
+	.uleb128 0xe
+	.4byte	.LASF903
+	.byte	0x61
+	.byte	0x80
+	.4byte	0x458
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF904
+	.byte	0x61
+	.byte	0x81
+	.4byte	0xc6
+	.byte	0x8
+	.uleb128 0xe
+	.4byte	.LASF905
+	.byte	0x61
+	.byte	0x82
+	.4byte	0x6d
+	.byte	0xc
+	.byte	0
+	.uleb128 0x21
+	.byte	0x70
+	.byte	0x61
+	.byte	0x35
+	.4byte	0x3a70
+	.uleb128 0x22
+	.4byte	.LASF906
+	.byte	0x61
+	.byte	0x36
+	.4byte	0x3a70
+	.uleb128 0x22
+	.4byte	.LASF907
+	.byte	0x61
+	.byte	0x3c
+	.4byte	0x3852
+	.uleb128 0x22
+	.4byte	.LASF908
+	.byte	0x61
+	.byte	0x44
+	.4byte	0x3873
+	.uleb128 0x28
+	.string	"_rt"
+	.byte	0x61
+	.byte	0x4b
+	.4byte	0x38ac
+	.uleb128 0x22
+	.4byte	.LASF909
+	.byte	0x61
+	.byte	0x54
+	.4byte	0x38d9
+	.uleb128 0x22
+	.4byte	.LASF910
+	.byte	0x61
+	.byte	0x76
+	.4byte	0x39a6
+	.uleb128 0x22
+	.4byte	.LASF911
+	.byte	0x61
+	.byte	0x7c
+	.4byte	0x39c1
+	.uleb128 0x22
+	.4byte	.LASF912
+	.byte	0x61
+	.byte	0x83
+	.4byte	0x39e2
+	.byte	0
+	.uleb128 0x5
+	.4byte	0xc6
+	.4byte	0x3a80
+	.uleb128 0x6
+	.4byte	0x4f
+	.byte	0x1b
+	.byte	0
+	.uleb128 0xd
+	.4byte	.LASF913
+	.byte	0x80
+	.byte	0x61
+	.byte	0x2b
+	.4byte	0x3abd
+	.uleb128 0xe
+	.4byte	.LASF914
+	.byte	0x61
+	.byte	0x2c
+	.4byte	0xc6
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF915
+	.byte	0x61
+	.byte	0x2e
+	.4byte	0xc6
+	.byte	0x4
+	.uleb128 0xe
+	.4byte	.LASF916
+	.byte	0x61
+	.byte	0x2f
+	.4byte	0xc6
+	.byte	0x8
+	.uleb128 0xe
+	.4byte	.LASF917
+	.byte	0x61
+	.byte	0x84
+	.4byte	0x3a0f
+	.byte	0x10
+	.byte	0
+	.uleb128 0x8
+	.4byte	.LASF918
+	.byte	0x61
+	.byte	0x85
+	.4byte	0x3a80
+	.uleb128 0xd
+	.4byte	.LASF919
+	.byte	0x98
+	.byte	0x62
+	.byte	0x10
+	.4byte	0x3b89
+	.uleb128 0xe
+	.4byte	.LASF920
+	.byte	0x62
+	.byte	0x11
+	.4byte	0x32c6
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF921
+	.byte	0x62
+	.byte	0x12
+	.4byte	0x37c
+	.byte	0x4
+	.uleb128 0xe
+	.4byte	.LASF922
+	.byte	0x62
+	.byte	0x13
+	.4byte	0x37c
+	.byte	0x8
+	.uleb128 0xe
+	.4byte	.LASF923
+	.byte	0x62
+	.byte	0x18
+	.4byte	0x558
+	.byte	0x10
+	.uleb128 0xe
+	.4byte	.LASF924
+	.byte	0x62
+	.byte	0x1e
+	.4byte	0x29
+	.byte	0x18
+	.uleb128 0xe
+	.4byte	.LASF925
+	.byte	0x62
+	.byte	0x1f
+	.4byte	0x29
+	.byte	0x20
+	.uleb128 0xe
+	.4byte	.LASF926
+	.byte	0x62
+	.byte	0x20
+	.4byte	0x558
+	.byte	0x28
+	.uleb128 0xe
+	.4byte	.LASF927
+	.byte	0x62
+	.byte	0x23
+	.4byte	0x869f
+	.byte	0x30
+	.uleb128 0xe
+	.4byte	.LASF928
+	.byte	0x62
+	.byte	0x24
+	.4byte	0x869f
+	.byte	0x38
+	.uleb128 0xe
+	.4byte	.LASF929
+	.byte	0x62
+	.byte	0x28
+	.4byte	0x3eb
+	.byte	0x40
+	.uleb128 0x20
+	.string	"uid"
+	.byte	0x62
+	.byte	0x29
+	.4byte	0x240a
+	.byte	0x50
+	.uleb128 0xe
+	.4byte	.LASF930
+	.byte	0x62
+	.byte	0x2d
+	.4byte	0x558
+	.byte	0x58
+	.uleb128 0xe
+	.4byte	.LASF931
+	.byte	0x62
+	.byte	0x31
+	.4byte	0x94b3
+	.byte	0x60
+	.uleb128 0xe
+	.4byte	.LASF130
+	.byte	0x62
+	.byte	0x33
+	.4byte	0x15a
+	.byte	0x88
+	.uleb128 0xe
+	.4byte	.LASF131
+	.byte	0x62
+	.byte	0x34
+	.4byte	0x15a
+	.byte	0x90
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x3ac8
+	.uleb128 0xd
+	.4byte	.LASF922
+	.byte	0x18
+	.byte	0x63
+	.byte	0x1a
+	.4byte	0x3bb4
+	.uleb128 0xe
+	.4byte	.LASF932
+	.byte	0x63
+	.byte	0x1b
+	.4byte	0x3a7
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF675
+	.byte	0x63
+	.byte	0x1c
+	.4byte	0x3819
+	.byte	0x10
+	.byte	0
+	.uleb128 0xd
+	.4byte	.LASF616
+	.byte	0x28
+	.byte	0x64
+	.byte	0x22
+	.4byte	0x3bd9
+	.uleb128 0xe
+	.4byte	.LASF933
+	.byte	0x64
+	.byte	0x23
+	.4byte	0x15a
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF934
+	.byte	0x64
+	.byte	0x24
+	.4byte	0x3bd9
+	.byte	0x8
+	.byte	0
+	.uleb128 0x5
+	.4byte	0x3be9
+	.4byte	0x3be9
+	.uleb128 0x6
+	.4byte	0x4f
+	.byte	0x3
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x3bef
+	.uleb128 0x1d
+	.4byte	.LASF935
+	.byte	0xd8
+	.byte	0x58
+	.2byte	0x10e
+	.4byte	0x3d14
+	.uleb128 0x1b
+	.4byte	.LASF936
+	.byte	0x58
+	.2byte	0x111
+	.4byte	0x29
+	.byte	0
+	.uleb128 0x1b
+	.4byte	.LASF937
+	.byte	0x58
+	.2byte	0x112
+	.4byte	0x29
+	.byte	0x8
+	.uleb128 0x1b
+	.4byte	.LASF938
+	.byte	0x58
+	.2byte	0x116
+	.4byte	0x3be9
+	.byte	0x10
+	.uleb128 0x1b
+	.4byte	.LASF939
+	.byte	0x58
+	.2byte	0x116
+	.4byte	0x3be9
+	.byte	0x18
+	.uleb128 0x1b
+	.4byte	.LASF940
+	.byte	0x58
+	.2byte	0x118
+	.4byte	0x3416
+	.byte	0x20
+	.uleb128 0x1b
+	.4byte	.LASF941
+	.byte	0x58
+	.2byte	0x120
+	.4byte	0x29
+	.byte	0x38
+	.uleb128 0x1b
+	.4byte	.LASF942
+	.byte	0x58
+	.2byte	0x124
+	.4byte	0x455d
+	.byte	0x40
+	.uleb128 0x1b
+	.4byte	.LASF943
+	.byte	0x58
+	.2byte	0x125
+	.4byte	0x3367
+	.byte	0x48
+	.uleb128 0x1b
+	.4byte	.LASF944
+	.byte	0x58
+	.2byte	0x126
+	.4byte	0x29
+	.byte	0x50
+	.uleb128 0x23
+	.4byte	0x54b4
+	.byte	0x58
+	.uleb128 0x1b
+	.4byte	.LASF945
+	.byte	0x58
+	.2byte	0x13e
+	.4byte	0x3a7
+	.byte	0x78
+	.uleb128 0x1b
+	.4byte	.LASF946
+	.byte	0x58
+	.2byte	0x140
+	.4byte	0x54db
+	.byte	0x88
+	.uleb128 0x1b
+	.4byte	.LASF947
+	.byte	0x58
+	.2byte	0x143
+	.4byte	0x55d1
+	.byte	0x90
+	.uleb128 0x1b
+	.4byte	.LASF948
+	.byte	0x58
+	.2byte	0x146
+	.4byte	0x29
+	.byte	0x98
+	.uleb128 0x1b
+	.4byte	.LASF949
+	.byte	0x58
+	.2byte	0x148
+	.4byte	0x5482
+	.byte	0xa0
+	.uleb128 0x1b
+	.4byte	.LASF950
+	.byte	0x58
+	.2byte	0x149
+	.4byte	0x458
+	.byte	0xa8
+	.uleb128 0x1b
+	.4byte	.LASF951
+	.byte	0x58
+	.2byte	0x14b
+	.4byte	0x558
+	.byte	0xb0
+	.uleb128 0x1b
+	.4byte	.LASF952
+	.byte	0x58
+	.2byte	0x152
+	.4byte	0x5488
+	.byte	0xb8
+	.uleb128 0x1b
+	.4byte	.LASF130
+	.byte	0x58
+	.2byte	0x154
+	.4byte	0x15a
+	.byte	0xb8
+	.uleb128 0x1b
+	.4byte	.LASF131
+	.byte	0x58
+	.2byte	0x155
+	.4byte	0x15a
+	.byte	0xc0
+	.uleb128 0x1b
+	.4byte	.LASF132
+	.byte	0x58
+	.2byte	0x156
+	.4byte	0x15a
+	.byte	0xc8
+	.uleb128 0x1b
+	.4byte	.LASF133
+	.byte	0x58
+	.2byte	0x157
+	.4byte	0x15a
+	.byte	0xd0
+	.byte	0
+	.uleb128 0xd
+	.4byte	.LASF953
+	.byte	0x18
+	.byte	0x64
+	.byte	0x33
+	.4byte	0x3d39
+	.uleb128 0xe
+	.4byte	.LASF954
+	.byte	0x64
+	.byte	0x34
+	.4byte	0xc6
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF383
+	.byte	0x64
+	.byte	0x35
+	.4byte	0x3d39
+	.byte	0x4
+	.byte	0
+	.uleb128 0x5
+	.4byte	0xc6
+	.4byte	0x3d49
+	.uleb128 0x6
+	.4byte	0x4f
+	.byte	0x4
+	.byte	0
+	.uleb128 0xd
+	.4byte	.LASF955
+	.byte	0x28
+	.byte	0x64
+	.byte	0x39
+	.4byte	0x3d62
+	.uleb128 0xe
+	.4byte	.LASF383
+	.byte	0x64
+	.byte	0x3a
+	.4byte	0x3d62
+	.byte	0
+	.byte	0
+	.uleb128 0x5
+	.4byte	0x558
+	.4byte	0x3d72
+	.uleb128 0x6
+	.4byte	0x4f
+	.byte	0x4
+	.byte	0
+	.uleb128 0xd
+	.4byte	.LASF956
+	.byte	0x10
+	.byte	0x64
+	.byte	0x3d
+	.4byte	0x3da3
+	.uleb128 0xe
+	.4byte	.LASF815
+	.byte	0x64
+	.byte	0x3e
+	.4byte	0x339d
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF854
+	.byte	0x64
+	.byte	0x40
+	.4byte	0xd2
+	.byte	0x8
+	.uleb128 0xe
+	.4byte	.LASF957
+	.byte	0x64
+	.byte	0x41
+	.4byte	0xd2
+	.byte	0xc
+	.byte	0
+	.uleb128 0x37
+	.4byte	.LASF959
+	.byte	0
+	.byte	0x64
+	.byte	0x49
+	.uleb128 0xd
+	.4byte	.LASF960
+	.byte	0x40
+	.byte	0x65
+	.byte	0xc
+	.4byte	0x3e18
+	.uleb128 0xe
+	.4byte	.LASF961
+	.byte	0x65
+	.byte	0xf
+	.4byte	0x15a
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF962
+	.byte	0x65
+	.byte	0x11
+	.4byte	0x15a
+	.byte	0x8
+	.uleb128 0xe
+	.4byte	.LASF963
+	.byte	0x65
+	.byte	0x13
+	.4byte	0x15a
+	.byte	0x10
+	.uleb128 0xe
+	.4byte	.LASF964
+	.byte	0x65
+	.byte	0x15
+	.4byte	0x15a
+	.byte	0x18
+	.uleb128 0xe
+	.4byte	.LASF965
+	.byte	0x65
+	.byte	0x17
+	.4byte	0x15a
+	.byte	0x20
+	.uleb128 0xe
+	.4byte	.LASF966
+	.byte	0x65
+	.byte	0x1f
+	.4byte	0x15a
+	.byte	0x28
+	.uleb128 0xe
+	.4byte	.LASF967
+	.byte	0x65
+	.byte	0x25
+	.4byte	0x15a
+	.byte	0x30
+	.uleb128 0xe
+	.4byte	.LASF968
+	.byte	0x65
+	.byte	0x2e
+	.4byte	0x15a
+	.byte	0x38
+	.byte	0
+	.uleb128 0x21
+	.byte	0x8
+	.byte	0x66
+	.byte	0x6d
+	.4byte	0x3e37
+	.uleb128 0x22
+	.4byte	.LASF969
+	.byte	0x66
+	.byte	0x6e
+	.4byte	0xf4
+	.uleb128 0x28
+	.string	"ptr"
+	.byte	0x66
+	.byte	0x70
+	.4byte	0xf4
+	.byte	0
+	.uleb128 0xd
+	.4byte	.LASF720
+	.byte	0x20
+	.byte	0x66
+	.byte	0x3e
+	.4byte	0x3e74
+	.uleb128 0xe
+	.4byte	.LASF970
+	.byte	0x66
+	.byte	0x4b
+	.4byte	0xd2
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF971
+	.byte	0x66
+	.byte	0x5a
+	.4byte	0xd2
+	.byte	0x4
+	.uleb128 0xe
+	.4byte	.LASF972
+	.byte	0x66
+	.byte	0x7c
+	.4byte	0x3e18
+	.byte	0x8
+	.uleb128 0xe
+	.4byte	.LASF171
+	.byte	0x66
+	.byte	0x90
+	.4byte	0xd2
+	.byte	0x10
+	.byte	0
+	.uleb128 0xd
+	.4byte	.LASF657
+	.byte	0x18
+	.byte	0x47
+	.byte	0xed
+	.4byte	0x3ea5
+	.uleb128 0xe
+	.4byte	.LASF652
+	.byte	0x47
+	.byte	0xef
+	.4byte	0x15a
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF653
+	.byte	0x47
+	.byte	0xf0
+	.4byte	0x15a
+	.byte	0x8
+	.uleb128 0xe
+	.4byte	.LASF116
+	.byte	0x47
+	.byte	0xf1
+	.4byte	0xe33
+	.byte	0x10
+	.byte	0
+	.uleb128 0xd
+	.4byte	.LASF973
+	.byte	0x18
+	.byte	0x47
+	.byte	0xff
+	.4byte	0x3ed9
+	.uleb128 0x1b
+	.4byte	.LASF652
+	.byte	0x47
+	.2byte	0x100
+	.4byte	0x15a
+	.byte	0
+	.uleb128 0x1b
+	.4byte	.LASF653
+	.byte	0x47
+	.2byte	0x101
+	.4byte	0x15a
+	.byte	0x8
+	.uleb128 0x1b
+	.4byte	.LASF974
+	.byte	0x47
+	.2byte	0x102
+	.4byte	0xff
+	.byte	0x10
+	.byte	0
+	.uleb128 0x1d
+	.4byte	.LASF612
+	.byte	0x20
+	.byte	0x47
+	.2byte	0x128
+	.4byte	0x3f1b
+	.uleb128 0x1b
+	.4byte	.LASF975
+	.byte	0x47
+	.2byte	0x12d
+	.4byte	0x29
+	.byte	0
+	.uleb128 0x1b
+	.4byte	.LASF976
+	.byte	0x47
+	.2byte	0x130
+	.4byte	0xff
+	.byte	0x8
+	.uleb128 0x1b
+	.4byte	.LASF977
+	.byte	0x47
+	.2byte	0x135
+	.4byte	0xff
+	.byte	0x10
+	.uleb128 0x1b
+	.4byte	.LASF978
+	.byte	0x47
+	.2byte	0x138
+	.4byte	0xff
+	.byte	0x18
+	.byte	0
+	.uleb128 0x1d
+	.4byte	.LASF979
+	.byte	0x10
+	.byte	0x47
+	.2byte	0x14b
+	.4byte	0x3f43
+	.uleb128 0x1b
+	.4byte	.LASF980
+	.byte	0x47
+	.2byte	0x14c
+	.4byte	0x29
+	.byte	0
+	.uleb128 0x1b
+	.4byte	.LASF981
+	.byte	0x47
+	.2byte	0x14d
+	.4byte	0x13f
+	.byte	0x8
+	.byte	0
+	.uleb128 0x1d
+	.4byte	.LASF982
+	.byte	0x8
+	.byte	0x47
+	.2byte	0x166
+	.4byte	0x3f6b
+	.uleb128 0x1b
+	.4byte	.LASF983
+	.byte	0x47
+	.2byte	0x167
+	.4byte	0x6d
+	.byte	0
+	.uleb128 0x1b
+	.4byte	.LASF984
+	.byte	0x47
+	.2byte	0x168
+	.4byte	0x6d
+	.byte	0x4
+	.byte	0
+	.uleb128 0x1d
+	.4byte	.LASF985
+	.byte	0x40
+	.byte	0x47
+	.2byte	0x197
+	.4byte	0x3fee
+	.uleb128 0x1b
+	.4byte	.LASF986
+	.byte	0x47
+	.2byte	0x198
+	.4byte	0x15a
+	.byte	0
+	.uleb128 0x1b
+	.4byte	.LASF987
+	.byte	0x47
+	.2byte	0x199
+	.4byte	0x15a
+	.byte	0x8
+	.uleb128 0x1b
+	.4byte	.LASF988
+	.byte	0x47
+	.2byte	0x19a
+	.4byte	0x15a
+	.byte	0x10
+	.uleb128 0x1b
+	.4byte	.LASF989
+	.byte	0x47
+	.2byte	0x19b
+	.4byte	0x13f
+	.byte	0x18
+	.uleb128 0x1b
+	.4byte	.LASF990
+	.byte	0x47
+	.2byte	0x19c
+	.4byte	0x13f
+	.byte	0x1c
+	.uleb128 0x1b
+	.4byte	.LASF991
+	.byte	0x47
+	.2byte	0x19d
+	.4byte	0x29
+	.byte	0x20
+	.uleb128 0x1b
+	.4byte	.LASF992
+	.byte	0x47
+	.2byte	0x19e
+	.4byte	0x29
+	.byte	0x28
+	.uleb128 0x1b
+	.4byte	.LASF993
+	.byte	0x47
+	.2byte	0x19f
+	.4byte	0x29
+	.byte	0x30
+	.uleb128 0x1b
+	.4byte	.LASF982
+	.byte	0x47
+	.2byte	0x1a0
+	.4byte	0x3f43
+	.byte	0x38
+	.byte	0
+	.uleb128 0x1d
+	.4byte	.LASF994
+	.byte	0xd8
+	.byte	0x47
+	.2byte	0x1a3
+	.4byte	0x415b
+	.uleb128 0x1b
+	.4byte	.LASF995
+	.byte	0x47
+	.2byte	0x1a5
+	.4byte	0x15a
+	.byte	0
+	.uleb128 0x1b
+	.4byte	.LASF996
+	.byte	0x47
+	.2byte	0x1a6
+	.4byte	0x15a
+	.byte	0x8
+	.uleb128 0x1b
+	.4byte	.LASF997
+	.byte	0x47
+	.2byte	0x1a7
+	.4byte	0x15a
+	.byte	0x10
+	.uleb128 0x1b
+	.4byte	.LASF998
+	.byte	0x47
+	.2byte	0x1a8
+	.4byte	0x15a
+	.byte	0x18
+	.uleb128 0x1b
+	.4byte	.LASF999
+	.byte	0x47
+	.2byte	0x1a9
+	.4byte	0x15a
+	.byte	0x20
+	.uleb128 0x1b
+	.4byte	.LASF1000
+	.byte	0x47
+	.2byte	0x1aa
+	.4byte	0x15a
+	.byte	0x28
+	.uleb128 0x1b
+	.4byte	.LASF1001
+	.byte	0x47
+	.2byte	0x1ac
+	.4byte	0x15a
+	.byte	0x30
+	.uleb128 0x1b
+	.4byte	.LASF1002
+	.byte	0x47
+	.2byte	0x1ad
+	.4byte	0x15a
+	.byte	0x38
+	.uleb128 0x1b
+	.4byte	.LASF1003
+	.byte	0x47
+	.2byte	0x1ae
+	.4byte	0x14f
+	.byte	0x40
+	.uleb128 0x1b
+	.4byte	.LASF1004
+	.byte	0x47
+	.2byte	0x1b0
+	.4byte	0x15a
+	.byte	0x48
+	.uleb128 0x1b
+	.4byte	.LASF1005
+	.byte	0x47
+	.2byte	0x1b1
+	.4byte	0x15a
+	.byte	0x50
+	.uleb128 0x1b
+	.4byte	.LASF1006
+	.byte	0x47
+	.2byte	0x1b2
+	.4byte	0x15a
+	.byte	0x58
+	.uleb128 0x1b
+	.4byte	.LASF1007
+	.byte	0x47
+	.2byte	0x1b3
+	.4byte	0x15a
+	.byte	0x60
+	.uleb128 0x1b
+	.4byte	.LASF1008
+	.byte	0x47
+	.2byte	0x1b5
+	.4byte	0x15a
+	.byte	0x68
+	.uleb128 0x1b
+	.4byte	.LASF1009
+	.byte	0x47
+	.2byte	0x1b6
+	.4byte	0x15a
+	.byte	0x70
+	.uleb128 0x1b
+	.4byte	.LASF1010
+	.byte	0x47
+	.2byte	0x1b7
+	.4byte	0x15a
+	.byte	0x78
+	.uleb128 0x1b
+	.4byte	.LASF1011
+	.byte	0x47
+	.2byte	0x1b8
+	.4byte	0x15a
+	.byte	0x80
+	.uleb128 0x1b
+	.4byte	.LASF1012
+	.byte	0x47
+	.2byte	0x1b9
+	.4byte	0x15a
+	.byte	0x88
+	.uleb128 0x1b
+	.4byte	.LASF1013
+	.byte	0x47
+	.2byte	0x1bb
+	.4byte	0x15a
+	.byte	0x90
+	.uleb128 0x1b
+	.4byte	.LASF1014
+	.byte	0x47
+	.2byte	0x1bc
+	.4byte	0x15a
+	.byte	0x98
+	.uleb128 0x1b
+	.4byte	.LASF1015
+	.byte	0x47
+	.2byte	0x1bd
+	.4byte	0x15a
+	.byte	0xa0
+	.uleb128 0x1b
+	.4byte	.LASF1016
+	.byte	0x47
+	.2byte	0x1be
+	.4byte	0x15a
+	.byte	0xa8
+	.uleb128 0x1b
+	.4byte	.LASF1017
+	.byte	0x47
+	.2byte	0x1bf
+	.4byte	0x15a
+	.byte	0xb0
+	.uleb128 0x1b
+	.4byte	.LASF1018
+	.byte	0x47
+	.2byte	0x1c0
+	.4byte	0x15a
+	.byte	0xb8
+	.uleb128 0x1b
+	.4byte	.LASF1019
+	.byte	0x47
+	.2byte	0x1c1
+	.4byte	0x15a
+	.byte	0xc0
+	.uleb128 0x1b
+	.4byte	.LASF1020
+	.byte	0x47
+	.2byte	0x1c2
+	.4byte	0x15a
+	.byte	0xc8
+	.uleb128 0x1b
+	.4byte	.LASF1021
+	.byte	0x47
+	.2byte	0x1c3
+	.4byte	0x15a
+	.byte	0xd0
+	.byte	0
+	.uleb128 0x1a
+	.4byte	.LASF1022
+	.2byte	0x200
+	.byte	0x47
+	.2byte	0x1c7
+	.4byte	0x4277
+	.uleb128 0x1b
+	.4byte	.LASF1023
+	.byte	0x47
+	.2byte	0x1c9
+	.4byte	0x3f1b
+	.byte	0
+	.uleb128 0x1b
+	.4byte	.LASF1024
+	.byte	0x47
+	.2byte	0x1ca
+	.4byte	0x29
+	.byte	0x10
+	.uleb128 0x1b
+	.4byte	.LASF1025
+	.byte	0x47
+	.2byte	0x1cb
+	.4byte	0x3416
+	.byte	0x18
+	.uleb128 0x1b
+	.4byte	.LASF1026
+	.byte	0x47
+	.2byte	0x1cc
+	.4byte	0x3a7
+	.byte	0x30
+	.uleb128 0x1b
+	.4byte	.LASF588
+	.byte	0x47
+	.2byte	0x1cd
+	.4byte	0x6d
+	.byte	0x40
+	.uleb128 0x1b
+	.4byte	.LASF1027
+	.byte	0x47
+	.2byte	0x1cf
+	.4byte	0x15a
+	.byte	0x48
+	.uleb128 0x1b
+	.4byte	.LASF974
+	.byte	0x47
+	.2byte	0x1d0
+	.4byte	0x15a
+	.byte	0x50
+	.uleb128 0x1b
+	.4byte	.LASF1028
+	.byte	0x47
+	.2byte	0x1d1
+	.4byte	0x15a
+	.byte	0x58
+	.uleb128 0x1b
+	.4byte	.LASF1029
+	.byte	0x47
+	.2byte	0x1d2
+	.4byte	0x15a
+	.byte	0x60
+	.uleb128 0x1b
+	.4byte	.LASF1030
+	.byte	0x47
+	.2byte	0x1d4
+	.4byte	0x15a
+	.byte	0x68
+	.uleb128 0x1b
+	.4byte	.LASF1031
+	.byte	0x47
+	.2byte	0x1d6
+	.4byte	0x3fee
+	.byte	0x70
+	.uleb128 0x1c
+	.4byte	.LASF1032
+	.byte	0x47
+	.2byte	0x1d9
+	.4byte	0xc6
+	.2byte	0x148
+	.uleb128 0x1c
+	.4byte	.LASF639
+	.byte	0x47
+	.2byte	0x1da
+	.4byte	0x4277
+	.2byte	0x150
+	.uleb128 0x1c
+	.4byte	.LASF1033
+	.byte	0x47
+	.2byte	0x1dc
+	.4byte	0x4282
+	.2byte	0x158
+	.uleb128 0x1c
+	.4byte	.LASF1034
+	.byte	0x47
+	.2byte	0x1de
+	.4byte	0x4282
+	.2byte	0x160
+	.uleb128 0x30
+	.string	"avg"
+	.byte	0x47
+	.2byte	0x1e8
+	.4byte	0x3f6b
+	.2byte	0x180
+	.uleb128 0x1c
+	.4byte	.LASF130
+	.byte	0x47
+	.2byte	0x1eb
+	.4byte	0x15a
+	.2byte	0x1c0
+	.uleb128 0x1c
+	.4byte	.LASF131
+	.byte	0x47
+	.2byte	0x1ec
+	.4byte	0x15a
+	.2byte	0x1c8
+	.uleb128 0x1c
+	.4byte	.LASF132
+	.byte	0x47
+	.2byte	0x1ed
+	.4byte	0x15a
+	.2byte	0x1d0
+	.uleb128 0x1c
+	.4byte	.LASF133
+	.byte	0x47
+	.2byte	0x1ee
+	.4byte	0x15a
+	.2byte	0x1d8
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x415b
+	.uleb128 0x24
+	.4byte	.LASF1033
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x427d
+	.uleb128 0x1d
+	.4byte	.LASF1035
+	.byte	0x50
+	.byte	0x47
+	.2byte	0x1f1
+	.4byte	0x4325
+	.uleb128 0x1b
+	.4byte	.LASF1036
+	.byte	0x47
+	.2byte	0x1f2
+	.4byte	0x3a7
+	.byte	0
+	.uleb128 0x1b
+	.4byte	.LASF1037
+	.byte	0x47
+	.2byte	0x1f3
+	.4byte	0x29
+	.byte	0x10
+	.uleb128 0x1b
+	.4byte	.LASF1038
+	.byte	0x47
+	.2byte	0x1f4
+	.4byte	0x29
+	.byte	0x18
+	.uleb128 0x1b
+	.4byte	.LASF1039
+	.byte	0x47
+	.2byte	0x1f5
+	.4byte	0x6d
+	.byte	0x20
+	.uleb128 0x1b
+	.4byte	.LASF588
+	.byte	0x47
+	.2byte	0x1f6
+	.4byte	0xb4
+	.byte	0x24
+	.uleb128 0x1b
+	.4byte	.LASF1040
+	.byte	0x47
+	.2byte	0x1f7
+	.4byte	0xb4
+	.byte	0x26
+	.uleb128 0x1b
+	.4byte	.LASF1041
+	.byte	0x47
+	.2byte	0x1f9
+	.4byte	0x4325
+	.byte	0x28
+	.uleb128 0x1b
+	.4byte	.LASF130
+	.byte	0x47
+	.2byte	0x202
+	.4byte	0x15a
+	.byte	0x30
+	.uleb128 0x1b
+	.4byte	.LASF131
+	.byte	0x47
+	.2byte	0x203
+	.4byte	0x15a
+	.byte	0x38
+	.uleb128 0x1b
+	.4byte	.LASF132
+	.byte	0x47
+	.2byte	0x204
+	.4byte	0x15a
+	.byte	0x40
+	.uleb128 0x1b
+	.4byte	.LASF133
+	.byte	0x47
+	.2byte	0x205
+	.4byte	0x15a
+	.byte	0x48
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x4288
+	.uleb128 0x1d
+	.4byte	.LASF1042
+	.byte	0xe8
+	.byte	0x47
+	.2byte	0x208
+	.4byte	0x4418
+	.uleb128 0x1b
+	.4byte	.LASF821
+	.byte	0x47
+	.2byte	0x209
+	.4byte	0x3416
+	.byte	0
+	.uleb128 0x1b
+	.4byte	.LASF1043
+	.byte	0x47
+	.2byte	0x210
+	.4byte	0x15a
+	.byte	0x18
+	.uleb128 0x1b
+	.4byte	.LASF1044
+	.byte	0x47
+	.2byte	0x211
+	.4byte	0x15a
+	.byte	0x20
+	.uleb128 0x1b
+	.4byte	.LASF1045
+	.byte	0x47
+	.2byte	0x212
+	.4byte	0x15a
+	.byte	0x28
+	.uleb128 0x1b
+	.4byte	.LASF1046
+	.byte	0x47
+	.2byte	0x213
+	.4byte	0x15a
+	.byte	0x30
+	.uleb128 0x1b
+	.4byte	.LASF1047
+	.byte	0x47
+	.2byte	0x214
+	.4byte	0x15a
+	.byte	0x38
+	.uleb128 0x1b
+	.4byte	.LASF1048
+	.byte	0x47
+	.2byte	0x21b
+	.4byte	0x14f
+	.byte	0x40
+	.uleb128 0x1b
+	.4byte	.LASF1049
+	.byte	0x47
+	.2byte	0x21c
+	.4byte	0x15a
+	.byte	0x48
+	.uleb128 0x1b
+	.4byte	.LASF171
+	.byte	0x47
+	.2byte	0x21d
+	.4byte	0x6d
+	.byte	0x50
+	.uleb128 0x38
+	.4byte	.LASF1050
+	.byte	0x47
+	.2byte	0x237
+	.4byte	0x6d
+	.byte	0x4
+	.byte	0x1
+	.byte	0x1f
+	.byte	0x54
+	.uleb128 0x38
+	.4byte	.LASF1051
+	.byte	0x47
+	.2byte	0x238
+	.4byte	0x6d
+	.byte	0x4
+	.byte	0x1
+	.byte	0x1e
+	.byte	0x54
+	.uleb128 0x38
+	.4byte	.LASF1052
+	.byte	0x47
+	.2byte	0x239
+	.4byte	0x6d
+	.byte	0x4
+	.byte	0x1
+	.byte	0x1d
+	.byte	0x54
+	.uleb128 0x38
+	.4byte	.LASF1053
+	.byte	0x47
+	.2byte	0x23a
+	.4byte	0x6d
+	.byte	0x4
+	.byte	0x1
+	.byte	0x1c
+	.byte	0x54
+	.uleb128 0x38
+	.4byte	.LASF1054
+	.byte	0x47
+	.2byte	0x23b
+	.4byte	0x6d
+	.byte	0x4
+	.byte	0x1
+	.byte	0x1b
+	.byte	0x54
+	.uleb128 0x1b
+	.4byte	.LASF1055
+	.byte	0x47
+	.2byte	0x241
+	.4byte	0x356e
+	.byte	0x58
+	.uleb128 0x1b
+	.4byte	.LASF1056
+	.byte	0x47
+	.2byte	0x24a
+	.4byte	0x356e
+	.byte	0xa0
+	.byte	0
+	.uleb128 0x2e
+	.byte	0x4
+	.byte	0x47
+	.2byte	0x271
+	.4byte	0x4456
+	.uleb128 0x1b
+	.4byte	.LASF677
+	.byte	0x47
+	.2byte	0x272
+	.4byte	0x110
+	.byte	0
+	.uleb128 0x1b
+	.4byte	.LASF1057
+	.byte	0x47
+	.2byte	0x273
+	.4byte	0x110
+	.byte	0x1
+	.uleb128 0x1b
+	.4byte	.LASF1058
+	.byte	0x47
+	.2byte	0x274
+	.4byte	0x110
+	.byte	0x2
+	.uleb128 0x2b
+	.string	"pad"
+	.byte	0x47
+	.2byte	0x277
+	.4byte	0x110
+	.byte	0x3
+	.byte	0
+	.uleb128 0x39
+	.4byte	.LASF1060
+	.byte	0x4
+	.byte	0x47
+	.2byte	0x270
+	.4byte	0x4478
+	.uleb128 0x3a
+	.string	"b"
+	.byte	0x47
+	.2byte	0x278
+	.4byte	0x4418
+	.uleb128 0x3a
+	.string	"s"
+	.byte	0x47
+	.2byte	0x279
+	.4byte	0x13f
+	.byte	0
+	.uleb128 0x1d
+	.4byte	.LASF1061
+	.byte	0x8
+	.byte	0x47
+	.2byte	0x283
+	.4byte	0x4493
+	.uleb128 0x1b
+	.4byte	.LASF64
+	.byte	0x47
+	.2byte	0x284
+	.4byte	0x4493
+	.byte	0
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x4478
+	.uleb128 0x2e
+	.byte	0x8
+	.byte	0x47
+	.2byte	0x510
+	.4byte	0x44b0
+	.uleb128 0x1b
+	.4byte	.LASF130
+	.byte	0x47
+	.2byte	0x510
+	.4byte	0x15a
+	.byte	0
+	.byte	0
+	.uleb128 0x3b
+	.byte	0
+	.byte	0x47
+	.2byte	0x510
+	.uleb128 0x3c
+	.byte	0x8
+	.byte	0x47
+	.2byte	0x510
+	.4byte	0x44d8
+	.uleb128 0x3d
+	.4byte	.LASF1211
+	.byte	0x47
+	.2byte	0x510
+	.4byte	0x6d
+	.byte	0x4
+	.byte	0x1
+	.byte	0x1f
+	.uleb128 0x29
+	.4byte	0x4499
+	.uleb128 0x29
+	.4byte	0x44b0
+	.byte	0
+	.uleb128 0x2e
+	.byte	0x8
+	.byte	0x47
+	.2byte	0x513
+	.4byte	0x44ef
+	.uleb128 0x1b
+	.4byte	.LASF131
+	.byte	0x47
+	.2byte	0x513
+	.4byte	0x15a
+	.byte	0
+	.byte	0
+	.uleb128 0x3b
+	.byte	0
+	.byte	0x47
+	.2byte	0x513
+	.uleb128 0x3c
+	.byte	0x8
+	.byte	0x47
+	.2byte	0x513
+	.4byte	0x4514
+	.uleb128 0x3e
+	.4byte	.LASF1062
+	.byte	0x47
+	.2byte	0x513
+	.4byte	0x6d
+	.uleb128 0x29
+	.4byte	0x44d8
+	.uleb128 0x29
+	.4byte	0x44ef
+	.byte	0
+	.uleb128 0x24
+	.4byte	.LASF593
+	.uleb128 0x3
+	.4byte	0x4514
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x4519
+	.uleb128 0x24
+	.4byte	.LASF1063
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x4524
+	.uleb128 0x24
+	.4byte	.LASF1064
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x452f
+	.uleb128 0x1a
+	.4byte	.LASF1065
+	.2byte	0x378
+	.byte	0x58
+	.2byte	0x166
+	.4byte	0x455d
+	.uleb128 0x23
+	.4byte	0x563a
+	.byte	0
+	.uleb128 0x1c
+	.4byte	.LASF1066
+	.byte	0x58
+	.2byte	0x206
+	.4byte	0x5962
+	.2byte	0x378
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x453a
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x2323
+	.uleb128 0x5
+	.4byte	0x3eb
+	.4byte	0x4579
+	.uleb128 0x6
+	.4byte	0x4f
+	.byte	0x3
+	.byte	0
+	.uleb128 0xd
+	.4byte	.LASF1067
+	.byte	0x20
+	.byte	0x67
+	.byte	0x1a
+	.4byte	0x459e
+	.uleb128 0xe
+	.4byte	.LASF1068
+	.byte	0x67
+	.byte	0x1b
+	.4byte	0x6d
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF1069
+	.byte	0x67
+	.byte	0x1c
+	.4byte	0x15bf
+	.byte	0x8
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x4579
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xc6
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x15a
+	.uleb128 0x5
+	.4byte	0x3a7
+	.4byte	0x45c0
+	.uleb128 0x6
+	.4byte	0x4f
+	.byte	0x2
+	.byte	0
+	.uleb128 0xd
+	.4byte	.LASF668
+	.byte	0xa8
+	.byte	0x68
+	.byte	0x74
+	.4byte	0x46f3
+	.uleb128 0xe
+	.4byte	.LASF579
+	.byte	0x68
+	.byte	0x75
+	.4byte	0x37c
+	.byte	0
+	.uleb128 0x20
+	.string	"uid"
+	.byte	0x68
+	.byte	0x7d
+	.4byte	0x240a
+	.byte	0x4
+	.uleb128 0x20
+	.string	"gid"
+	.byte	0x68
+	.byte	0x7e
+	.4byte	0x242a
+	.byte	0x8
+	.uleb128 0xe
+	.4byte	.LASF1070
+	.byte	0x68
+	.byte	0x7f
+	.4byte	0x240a
+	.byte	0xc
+	.uleb128 0xe
+	.4byte	.LASF1071
+	.byte	0x68
+	.byte	0x80
+	.4byte	0x242a
+	.byte	0x10
+	.uleb128 0xe
+	.4byte	.LASF1072
+	.byte	0x68
+	.byte	0x81
+	.4byte	0x240a
+	.byte	0x14
+	.uleb128 0xe
+	.4byte	.LASF1073
+	.byte	0x68
+	.byte	0x82
+	.4byte	0x242a
+	.byte	0x18
+	.uleb128 0xe
+	.4byte	.LASF1074
+	.byte	0x68
+	.byte	0x83
+	.4byte	0x240a
+	.byte	0x1c
+	.uleb128 0xe
+	.4byte	.LASF1075
+	.byte	0x68
+	.byte	0x84
+	.4byte	0x242a
+	.byte	0x20
+	.uleb128 0xe
+	.4byte	.LASF1076
+	.byte	0x68
+	.byte	0x85
+	.4byte	0x6d
+	.byte	0x24
+	.uleb128 0xe
+	.4byte	.LASF1077
+	.byte	0x68
+	.byte	0x86
+	.4byte	0x5a71
+	.byte	0x28
+	.uleb128 0xe
+	.4byte	.LASF1078
+	.byte	0x68
+	.byte	0x87
+	.4byte	0x5a71
+	.byte	0x30
+	.uleb128 0xe
+	.4byte	.LASF1079
+	.byte	0x68
+	.byte	0x88
+	.4byte	0x5a71
+	.byte	0x38
+	.uleb128 0xe
+	.4byte	.LASF1080
+	.byte	0x68
+	.byte	0x89
+	.4byte	0x5a71
+	.byte	0x40
+	.uleb128 0xe
+	.4byte	.LASF1081
+	.byte	0x68
+	.byte	0x8a
+	.4byte	0x5a71
+	.byte	0x48
+	.uleb128 0xe
+	.4byte	.LASF1082
+	.byte	0x68
+	.byte	0x8c
+	.4byte	0x96
+	.byte	0x50
+	.uleb128 0xe
+	.4byte	.LASF928
+	.byte	0x68
+	.byte	0x8e
+	.4byte	0x869f
+	.byte	0x58
+	.uleb128 0xe
+	.4byte	.LASF1083
+	.byte	0x68
+	.byte	0x8f
+	.4byte	0x869f
+	.byte	0x60
+	.uleb128 0xe
+	.4byte	.LASF1084
+	.byte	0x68
+	.byte	0x90
+	.4byte	0x869f
+	.byte	0x68
+	.uleb128 0xe
+	.4byte	.LASF1085
+	.byte	0x68
+	.byte	0x91
+	.4byte	0x869f
+	.byte	0x70
+	.uleb128 0xe
+	.4byte	.LASF746
+	.byte	0x68
+	.byte	0x94
+	.4byte	0x458
+	.byte	0x78
+	.uleb128 0xe
+	.4byte	.LASF1086
+	.byte	0x68
+	.byte	0x96
+	.4byte	0x3b89
+	.byte	0x80
+	.uleb128 0xe
+	.4byte	.LASF1087
+	.byte	0x68
+	.byte	0x97
+	.4byte	0x595c
+	.byte	0x88
+	.uleb128 0xe
+	.4byte	.LASF1088
+	.byte	0x68
+	.byte	0x98
+	.4byte	0x9594
+	.byte	0x90
+	.uleb128 0x23
+	.4byte	0x9575
+	.byte	0x98
+	.byte	0
+	.uleb128 0x3
+	.4byte	0x45c0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x46f3
+	.uleb128 0x5
+	.4byte	0x61
+	.4byte	0x470e
+	.uleb128 0x6
+	.4byte	0x4f
+	.byte	0xf
+	.byte	0
+	.uleb128 0x24
+	.4byte	.LASF670
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x470e
+	.uleb128 0x24
+	.4byte	.LASF1089
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x4719
+	.uleb128 0x24
+	.4byte	.LASF1090
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x4724
+	.uleb128 0x24
+	.4byte	.LASF674
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x472f
+	.uleb128 0x24
+	.4byte	.LASF1091
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x473a
+	.uleb128 0x24
+	.4byte	.LASF1092
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x4745
+	.uleb128 0x24
+	.4byte	.LASF684
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x4750
+	.uleb128 0x24
+	.4byte	.LASF1093
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x475b
+	.uleb128 0x24
+	.4byte	.LASF695
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x4766
+	.uleb128 0x24
+	.4byte	.LASF1094
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x4771
+	.uleb128 0x24
+	.4byte	.LASF697
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x477c
+	.uleb128 0x24
+	.4byte	.LASF698
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x4787
+	.uleb128 0xd
+	.4byte	.LASF699
+	.byte	0x78
+	.byte	0x69
+	.byte	0x63
+	.4byte	0x4823
+	.uleb128 0xe
+	.4byte	.LASF1095
+	.byte	0x69
+	.byte	0x64
+	.4byte	0x558
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF1096
+	.byte	0x69
+	.byte	0x65
+	.4byte	0x37c
+	.byte	0x8
+	.uleb128 0xe
+	.4byte	.LASF1097
+	.byte	0x69
+	.byte	0x66
+	.4byte	0x37c
+	.byte	0xc
+	.uleb128 0xe
+	.4byte	.LASF116
+	.byte	0x69
+	.byte	0x69
+	.4byte	0xe65
+	.byte	0x10
+	.uleb128 0xe
+	.4byte	.LASF1098
+	.byte	0x69
+	.byte	0x6b
+	.4byte	0xb4
+	.byte	0x14
+	.uleb128 0xe
+	.4byte	.LASF1099
+	.byte	0x69
+	.byte	0x70
+	.4byte	0xc6
+	.byte	0x18
+	.uleb128 0xe
+	.4byte	.LASF1100
+	.byte	0x69
+	.byte	0x71
+	.4byte	0x29
+	.byte	0x20
+	.uleb128 0xe
+	.4byte	.LASF1101
+	.byte	0x69
+	.byte	0x73
+	.4byte	0x4cff
+	.byte	0x28
+	.uleb128 0xe
+	.4byte	.LASF1102
+	.byte	0x69
+	.byte	0x74
+	.4byte	0x5d6f
+	.byte	0x38
+	.uleb128 0xe
+	.4byte	.LASF1103
+	.byte	0x69
+	.byte	0x75
+	.4byte	0x3d2
+	.byte	0x40
+	.uleb128 0xe
+	.4byte	.LASF1104
+	.byte	0x69
+	.byte	0x77
+	.4byte	0x3205
+	.byte	0x48
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x4792
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x3abd
+	.uleb128 0x24
+	.4byte	.LASF1105
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x482f
+	.uleb128 0x24
+	.4byte	.LASF1106
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x483a
+	.uleb128 0x24
+	.4byte	.LASF1107
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x4845
+	.uleb128 0x24
+	.4byte	.LASF1108
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x4850
+	.uleb128 0x5
+	.4byte	0x486b
+	.4byte	0x486b
+	.uleb128 0x6
+	.4byte	0x4f
+	.byte	0x1
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x4871
+	.uleb128 0x24
+	.4byte	.LASF1109
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x3e37
+	.uleb128 0x24
+	.4byte	.LASF1110
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x487c
+	.uleb128 0x24
+	.4byte	.LASF1111
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x4887
+	.uleb128 0x24
+	.4byte	.LASF817
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x4892
+	.uleb128 0x24
+	.4byte	.LASF1112
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x489d
+	.uleb128 0xd
+	.4byte	.LASF1113
+	.byte	0x40
+	.byte	0x6a
+	.byte	0x4a
+	.4byte	0x48f7
+	.uleb128 0xe
+	.4byte	.LASF577
+	.byte	0x6a
+	.byte	0x4b
+	.4byte	0x4db9
+	.byte	0
+	.uleb128 0x23
+	.4byte	0x4e24
+	.byte	0x8
+	.uleb128 0xe
+	.4byte	.LASF1114
+	.byte	0x6a
+	.byte	0x59
+	.4byte	0x4e3c
+	.byte	0x20
+	.uleb128 0xe
+	.4byte	.LASF1115
+	.byte	0x6a
+	.byte	0x5a
+	.4byte	0x29
+	.byte	0x28
+	.uleb128 0xe
+	.4byte	.LASF1116
+	.byte	0x6a
+	.byte	0x5c
+	.4byte	0x4e97
+	.byte	0x30
+	.uleb128 0xe
+	.4byte	.LASF1032
+	.byte	0x6a
+	.byte	0x5d
+	.4byte	0x6d
+	.byte	0x38
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x48a8
+	.uleb128 0xd
+	.4byte	.LASF1117
+	.byte	0x40
+	.byte	0x6b
+	.byte	0x22
+	.4byte	0x496a
+	.uleb128 0xe
+	.4byte	.LASF64
+	.byte	0x6b
+	.byte	0x23
+	.4byte	0x496a
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF1118
+	.byte	0x6b
+	.byte	0x24
+	.4byte	0x458
+	.byte	0x8
+	.uleb128 0xe
+	.4byte	.LASF957
+	.byte	0x6b
+	.byte	0x25
+	.4byte	0x29
+	.byte	0x10
+	.uleb128 0xe
+	.4byte	.LASF171
+	.byte	0x6b
+	.byte	0x26
+	.4byte	0x29
+	.byte	0x18
+	.uleb128 0xe
+	.4byte	.LASF1119
+	.byte	0x6b
+	.byte	0x27
+	.4byte	0x597d
+	.byte	0x20
+	.uleb128 0xe
+	.4byte	.LASF1120
+	.byte	0x6b
+	.byte	0x28
+	.4byte	0x6d
+	.byte	0x28
+	.uleb128 0xe
+	.4byte	.LASF1121
+	.byte	0x6b
+	.byte	0x29
+	.4byte	0x346
+	.byte	0x30
+	.uleb128 0xe
+	.4byte	.LASF1122
+	.byte	0x6b
+	.byte	0x2a
+	.4byte	0x30b6
+	.byte	0x38
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x48fd
+	.uleb128 0x15
+	.4byte	.LASF1123
+	.byte	0x47
+	.2byte	0x5d0
+	.4byte	0x4563
+	.uleb128 0x3f
+	.4byte	.LASF1124
+	.2byte	0x4000
+	.byte	0x47
+	.2byte	0x68a
+	.4byte	0x49a3
+	.uleb128 0x3e
+	.4byte	.LASF758
+	.byte	0x47
+	.2byte	0x68c
+	.4byte	0x24a1
+	.uleb128 0x3e
+	.4byte	.LASF578
+	.byte	0x47
+	.2byte	0x691
+	.4byte	0x49a3
+	.byte	0
+	.uleb128 0x5
+	.4byte	0x29
+	.4byte	0x49b4
+	.uleb128 0x40
+	.4byte	0x4f
+	.2byte	0x7ff
+	.byte	0
+	.uleb128 0x15
+	.4byte	.LASF1125
+	.byte	0x47
+	.2byte	0x698
+	.4byte	0x49a3
+	.uleb128 0xd
+	.4byte	.LASF1126
+	.byte	0x88
+	.byte	0x6c
+	.byte	0x18
+	.4byte	0x4a99
+	.uleb128 0xe
+	.4byte	.LASF1127
+	.byte	0x6c
+	.byte	0x19
+	.4byte	0x13f
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF874
+	.byte	0x6c
+	.byte	0x1a
+	.4byte	0x28f
+	.byte	0x4
+	.uleb128 0xe
+	.4byte	.LASF1128
+	.byte	0x6c
+	.byte	0x1b
+	.4byte	0x6d
+	.byte	0x8
+	.uleb128 0xe
+	.4byte	.LASF1129
+	.byte	0x6c
+	.byte	0x1c
+	.4byte	0x304
+	.byte	0xc
+	.uleb128 0xe
+	.4byte	.LASF1130
+	.byte	0x6c
+	.byte	0x1d
+	.4byte	0x15a
+	.byte	0x10
+	.uleb128 0xe
+	.4byte	.LASF1131
+	.byte	0x6c
+	.byte	0x1e
+	.4byte	0x15a
+	.byte	0x18
+	.uleb128 0x20
+	.string	"ino"
+	.byte	0x6c
+	.byte	0x27
+	.4byte	0x15a
+	.byte	0x20
+	.uleb128 0x20
+	.string	"dev"
+	.byte	0x6c
+	.byte	0x28
+	.4byte	0x284
+	.byte	0x28
+	.uleb128 0xe
+	.4byte	.LASF1132
+	.byte	0x6c
+	.byte	0x29
+	.4byte	0x284
+	.byte	0x2c
+	.uleb128 0x20
+	.string	"uid"
+	.byte	0x6c
+	.byte	0x2a
+	.4byte	0x240a
+	.byte	0x30
+	.uleb128 0x20
+	.string	"gid"
+	.byte	0x6c
+	.byte	0x2b
+	.4byte	0x242a
+	.byte	0x34
+	.uleb128 0xe
+	.4byte	.LASF957
+	.byte	0x6c
+	.byte	0x2c
+	.4byte	0x2d8
+	.byte	0x38
+	.uleb128 0xe
+	.4byte	.LASF1133
+	.byte	0x6c
+	.byte	0x2d
+	.4byte	0xa27
+	.byte	0x40
+	.uleb128 0xe
+	.4byte	.LASF1134
+	.byte	0x6c
+	.byte	0x2e
+	.4byte	0xa27
+	.byte	0x50
+	.uleb128 0xe
+	.4byte	.LASF1135
+	.byte	0x6c
+	.byte	0x2f
+	.4byte	0xa27
+	.byte	0x60
+	.uleb128 0xe
+	.4byte	.LASF1136
+	.byte	0x6c
+	.byte	0x30
+	.4byte	0xa27
+	.byte	0x70
+	.uleb128 0xe
+	.4byte	.LASF1137
+	.byte	0x6c
+	.byte	0x31
+	.4byte	0x15a
+	.byte	0x80
+	.byte	0
+	.uleb128 0xd
+	.4byte	.LASF1138
+	.byte	0x20
+	.byte	0x6d
+	.byte	0xc
+	.4byte	0x4ae2
+	.uleb128 0xe
+	.4byte	.LASF1139
+	.byte	0x6d
+	.byte	0xd
+	.4byte	0x330
+	.byte	0
+	.uleb128 0x20
+	.string	"nid"
+	.byte	0x6d
+	.byte	0x10
+	.4byte	0xc6
+	.byte	0x4
+	.uleb128 0xe
+	.4byte	.LASF1140
+	.byte	0x6d
+	.byte	0x17
+	.4byte	0x29
+	.byte	0x8
+	.uleb128 0xe
+	.4byte	.LASF1141
+	.byte	0x6d
+	.byte	0x1e
+	.4byte	0x29
+	.byte	0x10
+	.uleb128 0xe
+	.4byte	.LASF1142
+	.byte	0x6d
+	.byte	0x21
+	.4byte	0x4897
+	.byte	0x18
+	.byte	0
+	.uleb128 0xd
+	.4byte	.LASF1143
+	.byte	0x40
+	.byte	0x6d
+	.byte	0x3c
+	.4byte	0x4b4e
+	.uleb128 0xe
+	.4byte	.LASF1144
+	.byte	0x6d
+	.byte	0x3d
+	.4byte	0x4b6e
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF1145
+	.byte	0x6d
+	.byte	0x3f
+	.4byte	0x4b6e
+	.byte	0x8
+	.uleb128 0xe
+	.4byte	.LASF1146
+	.byte	0x6d
+	.byte	0x42
+	.4byte	0x199
+	.byte	0x10
+	.uleb128 0xe
+	.4byte	.LASF1147
+	.byte	0x6d
+	.byte	0x43
+	.4byte	0xc6
+	.byte	0x18
+	.uleb128 0xe
+	.4byte	.LASF171
+	.byte	0x6d
+	.byte	0x44
+	.4byte	0x6d
+	.byte	0x1c
+	.uleb128 0xe
+	.4byte	.LASF932
+	.byte	0x6d
+	.byte	0x47
+	.4byte	0x3a7
+	.byte	0x20
+	.uleb128 0x20
+	.string	"id"
+	.byte	0x6d
+	.byte	0x4a
+	.4byte	0xc6
+	.byte	0x30
+	.uleb128 0xe
+	.4byte	.LASF1148
+	.byte	0x6d
+	.byte	0x4d
+	.4byte	0x4b74
+	.byte	0x38
+	.byte	0
+	.uleb128 0x14
+	.4byte	0x29
+	.4byte	0x4b62
+	.uleb128 0x11
+	.4byte	0x4b62
+	.uleb128 0x11
+	.4byte	0x4b68
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x4ae2
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x4a99
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x4b4e
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x558
+	.uleb128 0xd
+	.4byte	.LASF1149
+	.byte	0x18
+	.byte	0x6e
+	.byte	0x1c
+	.4byte	0x4b9f
+	.uleb128 0xe
+	.4byte	.LASF932
+	.byte	0x6e
+	.byte	0x1d
+	.4byte	0x3a7
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF1150
+	.byte	0x6e
+	.byte	0x1f
+	.4byte	0x199
+	.byte	0x10
+	.byte	0
+	.uleb128 0xd
+	.4byte	.LASF1151
+	.byte	0x10
+	.byte	0x6e
+	.byte	0x22
+	.4byte	0x4bc4
+	.uleb128 0x20
+	.string	"rcu"
+	.byte	0x6e
+	.byte	0x23
+	.4byte	0x41c
+	.byte	0
+	.uleb128 0x20
+	.string	"lru"
+	.byte	0x6e
+	.byte	0x25
+	.4byte	0x4bc4
+	.byte	0x10
+	.byte	0
+	.uleb128 0x5
+	.4byte	0x4bd3
+	.4byte	0x4bd3
+	.uleb128 0x41
+	.4byte	0x4f
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x4b7a
+	.uleb128 0xd
+	.4byte	.LASF1152
+	.byte	0x40
+	.byte	0x6e
+	.byte	0x28
+	.4byte	0x4c16
+	.uleb128 0xe
+	.4byte	.LASF116
+	.byte	0x6e
+	.byte	0x2a
+	.4byte	0xe65
+	.byte	0
+	.uleb128 0x20
+	.string	"lru"
+	.byte	0x6e
+	.byte	0x2c
+	.4byte	0x4b7a
+	.byte	0x8
+	.uleb128 0xe
+	.4byte	.LASF1153
+	.byte	0x6e
+	.byte	0x2f
+	.4byte	0x4c16
+	.byte	0x20
+	.uleb128 0xe
+	.4byte	.LASF1150
+	.byte	0x6e
+	.byte	0x31
+	.4byte	0x199
+	.byte	0x28
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x4b9f
+	.uleb128 0xd
+	.4byte	.LASF1154
+	.byte	0x20
+	.byte	0x6e
+	.byte	0x34
+	.4byte	0x4c59
+	.uleb128 0xe
+	.4byte	.LASF838
+	.byte	0x6e
+	.byte	0x35
+	.4byte	0x4c59
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF932
+	.byte	0x6e
+	.byte	0x37
+	.4byte	0x3a7
+	.byte	0x8
+	.uleb128 0xe
+	.4byte	.LASF1155
+	.byte	0x6e
+	.byte	0x38
+	.4byte	0xc6
+	.byte	0x18
+	.uleb128 0xe
+	.4byte	.LASF1156
+	.byte	0x6e
+	.byte	0x39
+	.4byte	0x2b0
+	.byte	0x1c
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x4bd9
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xe65
+	.uleb128 0x21
+	.byte	0x10
+	.byte	0x6f
+	.byte	0x63
+	.4byte	0x4c84
+	.uleb128 0x22
+	.4byte	.LASF1157
+	.byte	0x6f
+	.byte	0x64
+	.4byte	0x3a7
+	.uleb128 0x22
+	.4byte	.LASF70
+	.byte	0x6f
+	.byte	0x65
+	.4byte	0x41c
+	.byte	0
+	.uleb128 0x26
+	.4byte	.LASF1158
+	.2byte	0x240
+	.byte	0x6f
+	.byte	0x5c
+	.4byte	0x4cf9
+	.uleb128 0xe
+	.4byte	.LASF261
+	.byte	0x6f
+	.byte	0x5d
+	.4byte	0x96
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF854
+	.byte	0x6f
+	.byte	0x5e
+	.4byte	0x96
+	.byte	0x1
+	.uleb128 0xe
+	.4byte	.LASF383
+	.byte	0x6f
+	.byte	0x5f
+	.4byte	0x96
+	.byte	0x2
+	.uleb128 0xe
+	.4byte	.LASF1159
+	.byte	0x6f
+	.byte	0x60
+	.4byte	0x96
+	.byte	0x3
+	.uleb128 0xe
+	.4byte	.LASF639
+	.byte	0x6f
+	.byte	0x61
+	.4byte	0x4cf9
+	.byte	0x8
+	.uleb128 0xe
+	.4byte	.LASF1160
+	.byte	0x6f
+	.byte	0x62
+	.4byte	0x4d30
+	.byte	0x10
+	.uleb128 0x23
+	.4byte	0x4c65
+	.byte	0x18
+	.uleb128 0xe
+	.4byte	.LASF1161
+	.byte	0x6f
+	.byte	0x67
+	.4byte	0x4d36
+	.byte	0x28
+	.uleb128 0x27
+	.4byte	.LASF1162
+	.byte	0x6f
+	.byte	0x68
+	.4byte	0x4d46
+	.2byte	0x228
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x4c84
+	.uleb128 0xd
+	.4byte	.LASF1163
+	.byte	0x10
+	.byte	0x6f
+	.byte	0x70
+	.4byte	0x4d30
+	.uleb128 0xe
+	.4byte	.LASF1164
+	.byte	0x6f
+	.byte	0x71
+	.4byte	0xe65
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF1139
+	.byte	0x6f
+	.byte	0x72
+	.4byte	0x330
+	.byte	0x4
+	.uleb128 0xe
+	.4byte	.LASF1165
+	.byte	0x6f
+	.byte	0x73
+	.4byte	0x4cf9
+	.byte	0x8
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x4cff
+	.uleb128 0x5
+	.4byte	0x458
+	.4byte	0x4d46
+	.uleb128 0x6
+	.4byte	0x4f
+	.byte	0x3f
+	.byte	0
+	.uleb128 0x5
+	.4byte	0x29
+	.4byte	0x4d5c
+	.uleb128 0x6
+	.4byte	0x4f
+	.byte	0x2
+	.uleb128 0x6
+	.4byte	0x4f
+	.byte	0
+	.byte	0
+	.uleb128 0xd
+	.4byte	.LASF1166
+	.byte	0x30
+	.byte	0x70
+	.byte	0x1e
+	.4byte	0x4db1
+	.uleb128 0xe
+	.4byte	.LASF383
+	.byte	0x70
+	.byte	0x1f
+	.4byte	0x558
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF575
+	.byte	0x70
+	.byte	0x20
+	.4byte	0x3a7
+	.byte	0x8
+	.uleb128 0xe
+	.4byte	.LASF228
+	.byte	0x70
+	.byte	0x21
+	.4byte	0xe33
+	.byte	0x18
+	.uleb128 0x20
+	.string	"osq"
+	.byte	0x70
+	.byte	0x23
+	.4byte	0x2435
+	.byte	0x1c
+	.uleb128 0xe
+	.4byte	.LASF98
+	.byte	0x70
+	.byte	0x28
+	.4byte	0x2eff
+	.byte	0x20
+	.uleb128 0xe
+	.4byte	.LASF1167
+	.byte	0x70
+	.byte	0x31
+	.4byte	0x199
+	.byte	0x28
+	.byte	0
+	.uleb128 0x37
+	.4byte	.LASF1168
+	.byte	0
+	.byte	0x71
+	.byte	0x18
+	.uleb128 0x1f
+	.4byte	.LASF1169
+	.byte	0x4
+	.4byte	0x6d
+	.byte	0x6a
+	.byte	0x40
+	.4byte	0x4de2
+	.uleb128 0xc
+	.4byte	.LASF1170
+	.byte	0
+	.uleb128 0xc
+	.4byte	.LASF1171
+	.byte	0x1
+	.uleb128 0xc
+	.4byte	.LASF1172
+	.byte	0x2
+	.uleb128 0xc
+	.4byte	.LASF1173
+	.byte	0x3
+	.byte	0
+	.uleb128 0xf
+	.byte	0x8
+	.byte	0x6a
+	.byte	0x4e
+	.4byte	0x4e03
+	.uleb128 0xe
+	.4byte	.LASF1174
+	.byte	0x6a
+	.byte	0x4f
+	.4byte	0x4db1
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF1175
+	.byte	0x6a
+	.byte	0x50
+	.4byte	0x29
+	.byte	0
+	.byte	0
+	.uleb128 0xf
+	.byte	0x18
+	.byte	0x6a
+	.byte	0x53
+	.4byte	0x4e24
+	.uleb128 0xe
+	.4byte	.LASF1176
+	.byte	0x6a
+	.byte	0x54
+	.4byte	0x41c
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF1177
+	.byte	0x6a
+	.byte	0x55
+	.4byte	0x29
+	.byte	0x10
+	.byte	0
+	.uleb128 0x21
+	.byte	0x18
+	.byte	0x6a
+	.byte	0x4d
+	.4byte	0x4e37
+	.uleb128 0x29
+	.4byte	0x4de2
+	.uleb128 0x29
+	.4byte	0x4e03
+	.byte	0
+	.uleb128 0x24
+	.4byte	.LASF1178
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x4e37
+	.uleb128 0xd
+	.4byte	.LASF1179
+	.byte	0x30
+	.byte	0x6a
+	.byte	0x60
+	.4byte	0x4e97
+	.uleb128 0xe
+	.4byte	.LASF1178
+	.byte	0x6a
+	.byte	0x61
+	.4byte	0x4e3c
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF71
+	.byte	0x6a
+	.byte	0x62
+	.4byte	0x29
+	.byte	0x8
+	.uleb128 0xe
+	.4byte	.LASF578
+	.byte	0x6a
+	.byte	0x63
+	.4byte	0x29
+	.byte	0x10
+	.uleb128 0xe
+	.4byte	.LASF1180
+	.byte	0x6a
+	.byte	0x64
+	.4byte	0x29
+	.byte	0x18
+	.uleb128 0xe
+	.4byte	.LASF1181
+	.byte	0x6a
+	.byte	0x65
+	.4byte	0x2b0
+	.byte	0x20
+	.uleb128 0xe
+	.4byte	.LASF64
+	.byte	0x6a
+	.byte	0x67
+	.4byte	0x4e97
+	.byte	0x28
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x4e42
+	.uleb128 0xd
+	.4byte	.LASF1182
+	.byte	0x8
+	.byte	0x6a
+	.byte	0x72
+	.4byte	0x4eb6
+	.uleb128 0xe
+	.4byte	.LASF1183
+	.byte	0x6a
+	.byte	0x73
+	.4byte	0x4ebb
+	.byte	0
+	.byte	0
+	.uleb128 0x24
+	.4byte	.LASF1183
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x4eb6
+	.uleb128 0xf
+	.byte	0x18
+	.byte	0x72
+	.byte	0x1c
+	.4byte	0x4eed
+	.uleb128 0x20
+	.string	"id"
+	.byte	0x72
+	.byte	0x1d
+	.4byte	0x39c
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF1184
+	.byte	0x72
+	.byte	0x1e
+	.4byte	0x458
+	.byte	0x8
+	.uleb128 0xe
+	.4byte	.LASF171
+	.byte	0x72
+	.byte	0x1f
+	.4byte	0x29
+	.byte	0x10
+	.byte	0
+	.uleb128 0x8
+	.4byte	.LASF1185
+	.byte	0x72
+	.byte	0x20
+	.4byte	0x4ec1
+	.uleb128 0x8
+	.4byte	.LASF1186
+	.byte	0x72
+	.byte	0x2f
+	.4byte	0x4b7
+	.uleb128 0xd
+	.4byte	.LASF1187
+	.byte	0x10
+	.byte	0x72
+	.byte	0x31
+	.4byte	0x4f27
+	.uleb128 0xe
+	.4byte	.LASF1188
+	.byte	0x72
+	.byte	0x32
+	.4byte	0xc6
+	.byte	0
+	.uleb128 0x20
+	.string	"fn"
+	.byte	0x72
+	.byte	0x33
+	.4byte	0x4ef8
+	.byte	0x8
+	.byte	0
+	.uleb128 0x19
+	.4byte	.LASF1189
+	.byte	0x72
+	.byte	0x38
+	.4byte	0x500
+	.uleb128 0x19
+	.4byte	.LASF1190
+	.byte	0x72
+	.byte	0x38
+	.4byte	0x500
+	.uleb128 0x19
+	.4byte	.LASF1191
+	.byte	0x72
+	.byte	0x39
+	.4byte	0x37c
+	.uleb128 0x19
+	.4byte	.LASF1187
+	.byte	0x72
+	.byte	0x3d
+	.4byte	0x4f03
+	.uleb128 0x8
+	.4byte	.LASF1192
+	.byte	0x58
+	.byte	0x1a
+	.4byte	0xc6
+	.uleb128 0xf
+	.byte	0x28
+	.byte	0x58
+	.byte	0x51
+	.4byte	0x4f97
+	.uleb128 0x20
+	.string	"lru"
+	.byte	0x58
+	.byte	0x57
+	.4byte	0x3a7
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF1193
+	.byte	0x58
+	.byte	0x59
+	.4byte	0x509c
+	.byte	0x10
+	.uleb128 0xe
+	.4byte	.LASF850
+	.byte	0x58
+	.byte	0x5a
+	.4byte	0x29
+	.byte	0x18
+	.uleb128 0xe
+	.4byte	.LASF360
+	.byte	0x58
+	.byte	0x61
+	.4byte	0x29
+	.byte	0x20
+	.byte	0
+	.uleb128 0x1d
+	.4byte	.LASF1194
+	.byte	0xd0
+	.byte	0x1e
+	.2byte	0x1a7
+	.4byte	0x509c
+	.uleb128 0x1b
+	.4byte	.LASF1195
+	.byte	0x1e
+	.2byte	0x1a8
+	.4byte	0x1c7f
+	.byte	0
+	.uleb128 0x1b
+	.4byte	.LASF1196
+	.byte	0x1e
+	.2byte	0x1a9
+	.4byte	0x4cff
+	.byte	0x8
+	.uleb128 0x1b
+	.4byte	.LASF1197
+	.byte	0x1e
+	.2byte	0x1aa
+	.4byte	0x37c
+	.byte	0x18
+	.uleb128 0x1b
+	.4byte	.LASF1198
+	.byte	0x1e
+	.2byte	0x1ab
+	.4byte	0x3466
+	.byte	0x20
+	.uleb128 0x1b
+	.4byte	.LASF1199
+	.byte	0x1e
+	.2byte	0x1ac
+	.4byte	0x4d5c
+	.byte	0x30
+	.uleb128 0x1b
+	.4byte	.LASF1200
+	.byte	0x1e
+	.2byte	0x1ae
+	.4byte	0x29
+	.byte	0x60
+	.uleb128 0x1b
+	.4byte	.LASF1201
+	.byte	0x1e
+	.2byte	0x1b0
+	.4byte	0x29
+	.byte	0x68
+	.uleb128 0x1b
+	.4byte	.LASF1202
+	.byte	0x1e
+	.2byte	0x1b1
+	.4byte	0x29
+	.byte	0x70
+	.uleb128 0x1b
+	.4byte	.LASF1203
+	.byte	0x1e
+	.2byte	0x1b2
+	.4byte	0x7939
+	.byte	0x78
+	.uleb128 0x1b
+	.4byte	.LASF171
+	.byte	0x1e
+	.2byte	0x1b3
+	.4byte	0x29
+	.byte	0x80
+	.uleb128 0x1b
+	.4byte	.LASF1204
+	.byte	0x1e
+	.2byte	0x1b4
+	.4byte	0xe65
+	.byte	0x88
+	.uleb128 0x1b
+	.4byte	.LASF1139
+	.byte	0x1e
+	.2byte	0x1b5
+	.4byte	0x330
+	.byte	0x8c
+	.uleb128 0x1b
+	.4byte	.LASF1157
+	.byte	0x1e
+	.2byte	0x1b6
+	.4byte	0x3a7
+	.byte	0x90
+	.uleb128 0x1b
+	.4byte	.LASF1205
+	.byte	0x1e
+	.2byte	0x1b7
+	.4byte	0x458
+	.byte	0xa0
+	.uleb128 0x1b
+	.4byte	.LASF1206
+	.byte	0x1e
+	.2byte	0x1b8
+	.4byte	0x5ceb
+	.byte	0xa8
+	.uleb128 0x1b
+	.4byte	.LASF130
+	.byte	0x1e
+	.2byte	0x1ba
+	.4byte	0x15a
+	.byte	0xb0
+	.uleb128 0x1b
+	.4byte	.LASF131
+	.byte	0x1e
+	.2byte	0x1bb
+	.4byte	0x15a
+	.byte	0xb8
+	.uleb128 0x1b
+	.4byte	.LASF132
+	.byte	0x1e
+	.2byte	0x1bc
+	.4byte	0x15a
+	.byte	0xc0
+	.uleb128 0x1b
+	.4byte	.LASF133
+	.byte	0x1e
+	.2byte	0x1bd
+	.4byte	0x15a
+	.byte	0xc8
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x4f97
+	.uleb128 0xf
+	.byte	0x10
+	.byte	0x58
+	.byte	0x66
+	.4byte	0x50cf
+	.uleb128 0xe
+	.4byte	.LASF64
+	.byte	0x58
+	.byte	0x67
+	.4byte	0x339d
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF1119
+	.byte	0x58
+	.byte	0x69
+	.4byte	0xc6
+	.byte	0x8
+	.uleb128 0xe
+	.4byte	.LASF1207
+	.byte	0x58
+	.byte	0x6a
+	.4byte	0xc6
+	.byte	0xc
+	.byte	0
+	.uleb128 0x21
+	.byte	0x10
+	.byte	0x58
+	.byte	0x64
+	.4byte	0x50e8
+	.uleb128 0x22
+	.4byte	.LASF1208
+	.byte	0x58
+	.byte	0x65
+	.4byte	0x3a7
+	.uleb128 0x29
+	.4byte	0x50a2
+	.byte	0
+	.uleb128 0xf
+	.byte	0x4
+	.byte	0x58
+	.byte	0x77
+	.4byte	0x511e
+	.uleb128 0x35
+	.4byte	.LASF1209
+	.byte	0x58
+	.byte	0x78
+	.4byte	0x6d
+	.byte	0x4
+	.byte	0x10
+	.byte	0x10
+	.byte	0
+	.uleb128 0x35
+	.4byte	.LASF1210
+	.byte	0x58
+	.byte	0x79
+	.4byte	0x6d
+	.byte	0x4
+	.byte	0xf
+	.byte	0x1
+	.byte	0
+	.uleb128 0x35
+	.4byte	.LASF1211
+	.byte	0x58
+	.byte	0x7a
+	.4byte	0x6d
+	.byte	0x4
+	.byte	0x1
+	.byte	0
+	.byte	0
+	.byte	0
+	.uleb128 0x21
+	.byte	0x8
+	.byte	0x58
+	.byte	0x74
+	.4byte	0x5142
+	.uleb128 0x22
+	.4byte	.LASF1212
+	.byte	0x58
+	.byte	0x75
+	.4byte	0x458
+	.uleb128 0x22
+	.4byte	.LASF1213
+	.byte	0x58
+	.byte	0x76
+	.4byte	0x29
+	.uleb128 0x29
+	.4byte	0x50e8
+	.byte	0
+	.uleb128 0xf
+	.byte	0x28
+	.byte	0x58
+	.byte	0x63
+	.4byte	0x516f
+	.uleb128 0x23
+	.4byte	0x50cf
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF1214
+	.byte	0x58
+	.byte	0x71
+	.4byte	0x5174
+	.byte	0x10
+	.uleb128 0xe
+	.4byte	.LASF1215
+	.byte	0x58
+	.byte	0x73
+	.4byte	0x458
+	.byte	0x18
+	.uleb128 0x23
+	.4byte	0x511e
+	.byte	0x20
+	.byte	0
+	.uleb128 0x24
+	.4byte	.LASF1216
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x516f
+	.uleb128 0xf
+	.byte	0x10
+	.byte	0x58
+	.byte	0x7e
+	.4byte	0x51b3
+	.uleb128 0xe
+	.4byte	.LASF1217
+	.byte	0x58
+	.byte	0x7f
+	.4byte	0x29
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF1218
+	.byte	0x58
+	.byte	0x82
+	.4byte	0x96
+	.byte	0x8
+	.uleb128 0xe
+	.4byte	.LASF1219
+	.byte	0x58
+	.byte	0x83
+	.4byte	0x96
+	.byte	0x9
+	.uleb128 0xe
+	.4byte	.LASF1220
+	.byte	0x58
+	.byte	0x84
+	.4byte	0x37c
+	.byte	0xc
+	.byte	0
+	.uleb128 0xf
+	.byte	0x20
+	.byte	0x58
+	.byte	0x86
+	.4byte	0x51e0
+	.uleb128 0xe
+	.4byte	.LASF1221
+	.byte	0x58
+	.byte	0x87
+	.4byte	0x29
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF1222
+	.byte	0x58
+	.byte	0x88
+	.4byte	0x29
+	.byte	0x8
+	.uleb128 0xe
+	.4byte	.LASF1223
+	.byte	0x58
+	.byte	0x89
+	.4byte	0x3a7
+	.byte	0x10
+	.byte	0
+	.uleb128 0x21
+	.byte	0x8
+	.byte	0x58
+	.byte	0x8f
+	.4byte	0x51ff
+	.uleb128 0x22
+	.4byte	.LASF1224
+	.byte	0x58
+	.byte	0x90
+	.4byte	0x455d
+	.uleb128 0x22
+	.4byte	.LASF1225
+	.byte	0x58
+	.byte	0x91
+	.4byte	0x37c
+	.byte	0
+	.uleb128 0xf
+	.byte	0x28
+	.byte	0x58
+	.byte	0x8b
+	.4byte	0x523e
+	.uleb128 0xe
+	.4byte	.LASF1226
+	.byte	0x58
+	.byte	0x8c
+	.4byte	0x29
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF1227
+	.byte	0x58
+	.byte	0x8d
+	.4byte	0x3392
+	.byte	0x8
+	.uleb128 0xe
+	.4byte	.LASF1228
+	.byte	0x58
+	.byte	0x8e
+	.4byte	0x29
+	.byte	0x10
+	.uleb128 0x23
+	.4byte	0x51e0
+	.byte	0x18
+	.uleb128 0x20
+	.string	"ptl"
+	.byte	0x58
+	.byte	0x96
+	.4byte	0xe65
+	.byte	0x20
+	.byte	0
+	.uleb128 0xf
+	.byte	0x18
+	.byte	0x58
+	.byte	0x99
+	.4byte	0x526b
+	.uleb128 0xe
+	.4byte	.LASF1229
+	.byte	0x58
+	.byte	0x9b
+	.4byte	0x52f0
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF1230
+	.byte	0x58
+	.byte	0x9c
+	.4byte	0x29
+	.byte	0x8
+	.uleb128 0xe
+	.4byte	.LASF1231
+	.byte	0x58
+	.byte	0x9d
+	.4byte	0x29
+	.byte	0x10
+	.byte	0
+	.uleb128 0xd
+	.4byte	.LASF1232
+	.byte	0xc8
+	.byte	0x73
+	.byte	0x72
+	.4byte	0x52f0
+	.uleb128 0xe
+	.4byte	.LASF1233
+	.byte	0x73
+	.byte	0x73
+	.4byte	0xc7aa
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF1234
+	.byte	0x73
+	.byte	0x74
+	.4byte	0xc7ea
+	.byte	0x8
+	.uleb128 0xe
+	.4byte	.LASF1235
+	.byte	0x73
+	.byte	0x75
+	.4byte	0xc73e
+	.byte	0x10
+	.uleb128 0xe
+	.4byte	.LASF1236
+	.byte	0x73
+	.byte	0x76
+	.4byte	0x2b0
+	.byte	0x38
+	.uleb128 0x20
+	.string	"res"
+	.byte	0x73
+	.byte	0x77
+	.4byte	0x9672
+	.byte	0x40
+	.uleb128 0x20
+	.string	"ref"
+	.byte	0x73
+	.byte	0x78
+	.4byte	0xc5c5
+	.byte	0xa0
+	.uleb128 0xe
+	.4byte	.LASF1237
+	.byte	0x73
+	.byte	0x79
+	.4byte	0xc80b
+	.byte	0xa8
+	.uleb128 0x20
+	.string	"dev"
+	.byte	0x73
+	.byte	0x7a
+	.4byte	0xa496
+	.byte	0xb0
+	.uleb128 0xe
+	.4byte	.LASF793
+	.byte	0x73
+	.byte	0x7b
+	.4byte	0x458
+	.byte	0xb8
+	.uleb128 0xe
+	.4byte	.LASF193
+	.byte	0x73
+	.byte	0x7c
+	.4byte	0xc787
+	.byte	0xc0
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x526b
+	.uleb128 0x21
+	.byte	0x28
+	.byte	0x58
+	.byte	0x50
+	.4byte	0x5328
+	.uleb128 0x29
+	.4byte	0x4f5e
+	.uleb128 0x29
+	.4byte	0x5142
+	.uleb128 0x29
+	.4byte	0x517a
+	.uleb128 0x29
+	.4byte	0x51b3
+	.uleb128 0x29
+	.4byte	0x51ff
+	.uleb128 0x29
+	.4byte	0x523e
+	.uleb128 0x22
+	.4byte	.LASF70
+	.byte	0x58
+	.byte	0xa1
+	.4byte	0x41c
+	.byte	0
+	.uleb128 0x21
+	.byte	0x4
+	.byte	0x58
+	.byte	0xa4
+	.4byte	0x535d
+	.uleb128 0x22
+	.4byte	.LASF1238
+	.byte	0x58
+	.byte	0xa9
+	.4byte	0x37c
+	.uleb128 0x22
+	.4byte	.LASF1239
+	.byte	0x58
+	.byte	0xb1
+	.4byte	0x6d
+	.uleb128 0x22
+	.4byte	.LASF852
+	.byte	0x58
+	.byte	0xb3
+	.4byte	0x6d
+	.uleb128 0x22
+	.4byte	.LASF1240
+	.byte	0x58
+	.byte	0xb4
+	.4byte	0xc6
+	.byte	0
+	.uleb128 0x1a
+	.4byte	.LASF1241
+	.2byte	0x100
+	.byte	0x1e
+	.2byte	0x395
+	.4byte	0x547d
+	.uleb128 0x2b
+	.string	"f_u"
+	.byte	0x1e
+	.2byte	0x399
+	.4byte	0x7e13
+	.byte	0
+	.uleb128 0x1b
+	.4byte	.LASF1242
+	.byte	0x1e
+	.2byte	0x39a
+	.4byte	0x2118
+	.byte	0x10
+	.uleb128 0x1b
+	.4byte	.LASF1243
+	.byte	0x1e
+	.2byte	0x39b
+	.4byte	0x1c7f
+	.byte	0x20
+	.uleb128 0x1b
+	.4byte	.LASF1244
+	.byte	0x1e
+	.2byte	0x39c
+	.4byte	0x7cec
+	.byte	0x28
+	.uleb128 0x1b
+	.4byte	.LASF1245
+	.byte	0x1e
+	.2byte	0x3a2
+	.4byte	0xe65
+	.byte	0x30
+	.uleb128 0x1b
+	.4byte	.LASF1246
+	.byte	0x1e
+	.2byte	0x3a3
+	.4byte	0x7528
+	.byte	0x34
+	.uleb128 0x1b
+	.4byte	.LASF1247
+	.byte	0x1e
+	.2byte	0x3a4
+	.4byte	0x558
+	.byte	0x38
+	.uleb128 0x1b
+	.4byte	.LASF1248
+	.byte	0x1e
+	.2byte	0x3a5
+	.4byte	0x6d
+	.byte	0x40
+	.uleb128 0x1b
+	.4byte	.LASF1249
+	.byte	0x1e
+	.2byte	0x3a6
+	.4byte	0x33b
+	.byte	0x44
+	.uleb128 0x1b
+	.4byte	.LASF1250
+	.byte	0x1e
+	.2byte	0x3a7
+	.4byte	0x2464
+	.byte	0x48
+	.uleb128 0x1b
+	.4byte	.LASF1251
+	.byte	0x1e
+	.2byte	0x3a8
+	.4byte	0x2d8
+	.byte	0x68
+	.uleb128 0x1b
+	.4byte	.LASF1252
+	.byte	0x1e
+	.2byte	0x3a9
+	.4byte	0x7d5b
+	.byte	0x70
+	.uleb128 0x1b
+	.4byte	.LASF1253
+	.byte	0x1e
+	.2byte	0x3aa
+	.4byte	0x46f8
+	.byte	0x90
+	.uleb128 0x1b
+	.4byte	.LASF1254
+	.byte	0x1e
+	.2byte	0x3ab
+	.4byte	0x7db7
+	.byte	0x98
+	.uleb128 0x1b
+	.4byte	.LASF1255
+	.byte	0x1e
+	.2byte	0x3ad
+	.4byte	0x15a
+	.byte	0xb8
+	.uleb128 0x1b
+	.4byte	.LASF1256
+	.byte	0x1e
+	.2byte	0x3af
+	.4byte	0x458
+	.byte	0xc0
+	.uleb128 0x1b
+	.4byte	.LASF1205
+	.byte	0x1e
+	.2byte	0x3b2
+	.4byte	0x458
+	.byte	0xc8
+	.uleb128 0x1b
+	.4byte	.LASF1257
+	.byte	0x1e
+	.2byte	0x3b6
+	.4byte	0x3a7
+	.byte	0xd0
+	.uleb128 0x1b
+	.4byte	.LASF1258
+	.byte	0x1e
+	.2byte	0x3b7
+	.4byte	0x3a7
+	.byte	0xe0
+	.uleb128 0x1b
+	.4byte	.LASF1259
+	.byte	0x1e
+	.2byte	0x3b9
+	.4byte	0x509c
+	.byte	0xf0
+	.uleb128 0x1b
+	.4byte	.LASF1260
+	.byte	0x1e
+	.2byte	0x3ba
+	.4byte	0x5ceb
+	.byte	0xf8
+	.byte	0
+	.uleb128 0x3
+	.4byte	0x535d
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x535d
+	.uleb128 0x2a
+	.4byte	.LASF952
+	.byte	0
+	.byte	0x58
+	.2byte	0x105
+	.uleb128 0x2e
+	.byte	0x20
+	.byte	0x58
+	.2byte	0x131
+	.4byte	0x54b4
+	.uleb128 0x2b
+	.string	"rb"
+	.byte	0x58
+	.2byte	0x132
+	.4byte	0x3416
+	.byte	0
+	.uleb128 0x1b
+	.4byte	.LASF1261
+	.byte	0x58
+	.2byte	0x133
+	.4byte	0x29
+	.byte	0x18
+	.byte	0
+	.uleb128 0x3c
+	.byte	0x20
+	.byte	0x58
+	.2byte	0x130
+	.4byte	0x54d6
+	.uleb128 0x3e
+	.4byte	.LASF1262
+	.byte	0x58
+	.2byte	0x134
+	.4byte	0x5491
+	.uleb128 0x3e
+	.4byte	.LASF1263
+	.byte	0x58
+	.2byte	0x135
+	.4byte	0x56
+	.byte	0
+	.uleb128 0x24
+	.4byte	.LASF946
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x54d6
+	.uleb128 0x1d
+	.4byte	.LASF1264
+	.byte	0x88
+	.byte	0x74
+	.2byte	0x195
+	.4byte	0x55cc
+	.uleb128 0x1b
+	.4byte	.LASF111
+	.byte	0x74
+	.2byte	0x196
+	.4byte	0xc923
+	.byte	0
+	.uleb128 0x1b
+	.4byte	.LASF1265
+	.byte	0x74
+	.2byte	0x197
+	.4byte	0xc923
+	.byte	0x8
+	.uleb128 0x1b
+	.4byte	.LASF1266
+	.byte	0x74
+	.2byte	0x198
+	.4byte	0xc93d
+	.byte	0x10
+	.uleb128 0x1b
+	.4byte	.LASF1267
+	.byte	0x74
+	.2byte	0x199
+	.4byte	0xc952
+	.byte	0x18
+	.uleb128 0x1b
+	.4byte	.LASF1268
+	.byte	0x74
+	.2byte	0x19a
+	.4byte	0xc967
+	.byte	0x20
+	.uleb128 0x1b
+	.4byte	.LASF1269
+	.byte	0x74
+	.2byte	0x19b
+	.4byte	0xc981
+	.byte	0x28
+	.uleb128 0x1b
+	.4byte	.LASF1270
+	.byte	0x74
+	.2byte	0x19d
+	.4byte	0xc99c
+	.byte	0x30
+	.uleb128 0x1b
+	.4byte	.LASF1271
+	.byte	0x74
+	.2byte	0x19f
+	.4byte	0xc9b1
+	.byte	0x38
+	.uleb128 0x1b
+	.4byte	.LASF1272
+	.byte	0x74
+	.2byte	0x1a3
+	.4byte	0xc967
+	.byte	0x40
+	.uleb128 0x1b
+	.4byte	.LASF1273
+	.byte	0x74
+	.2byte	0x1a6
+	.4byte	0xc967
+	.byte	0x48
+	.uleb128 0x1b
+	.4byte	.LASF1274
+	.byte	0x74
+	.2byte	0x1ab
+	.4byte	0xc9da
+	.byte	0x50
+	.uleb128 0x1b
+	.4byte	.LASF265
+	.byte	0x74
+	.2byte	0x1b1
+	.4byte	0xc9ef
+	.byte	0x58
+	.uleb128 0x1b
+	.4byte	.LASF1275
+	.byte	0x74
+	.2byte	0x1cf
+	.4byte	0xca09
+	.byte	0x60
+	.uleb128 0x1b
+	.4byte	.LASF130
+	.byte	0x74
+	.2byte	0x1d2
+	.4byte	0x15a
+	.byte	0x68
+	.uleb128 0x1b
+	.4byte	.LASF131
+	.byte	0x74
+	.2byte	0x1d3
+	.4byte	0x15a
+	.byte	0x70
+	.uleb128 0x1b
+	.4byte	.LASF132
+	.byte	0x74
+	.2byte	0x1d4
+	.4byte	0x15a
+	.byte	0x78
+	.uleb128 0x1b
+	.4byte	.LASF133
+	.byte	0x74
+	.2byte	0x1d5
+	.4byte	0x15a
+	.byte	0x80
+	.byte	0
+	.uleb128 0x3
+	.4byte	0x54e1
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x55cc
+	.uleb128 0x1d
+	.4byte	.LASF1276
+	.byte	0x10
+	.byte	0x58
+	.2byte	0x15a
+	.4byte	0x55ff
+	.uleb128 0x1b
+	.4byte	.LASF758
+	.byte	0x58
+	.2byte	0x15b
+	.4byte	0x2eff
+	.byte	0
+	.uleb128 0x1b
+	.4byte	.LASF64
+	.byte	0x58
+	.2byte	0x15c
+	.4byte	0x55ff
+	.byte	0x8
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x55d7
+	.uleb128 0x1d
+	.4byte	.LASF1277
+	.byte	0x38
+	.byte	0x58
+	.2byte	0x15f
+	.4byte	0x563a
+	.uleb128 0x1b
+	.4byte	.LASF1278
+	.byte	0x58
+	.2byte	0x160
+	.4byte	0x37c
+	.byte	0
+	.uleb128 0x1b
+	.4byte	.LASF1279
+	.byte	0x58
+	.2byte	0x161
+	.4byte	0x55d7
+	.byte	0x8
+	.uleb128 0x1b
+	.4byte	.LASF1280
+	.byte	0x58
+	.2byte	0x162
+	.4byte	0x4579
+	.byte	0x18
+	.byte	0
+	.uleb128 0x42
+	.2byte	0x378
+	.byte	0x58
+	.2byte	0x167
+	.4byte	0x5901
+	.uleb128 0x1b
+	.4byte	.LASF109
+	.byte	0x58
+	.2byte	0x168
+	.4byte	0x3be9
+	.byte	0
+	.uleb128 0x1b
+	.4byte	.LASF1281
+	.byte	0x58
+	.2byte	0x169
+	.4byte	0x344d
+	.byte	0x8
+	.uleb128 0x1b
+	.4byte	.LASF1282
+	.byte	0x58
+	.2byte	0x16a
+	.4byte	0x15a
+	.byte	0x10
+	.uleb128 0x1b
+	.4byte	.LASF118
+	.byte	0x58
+	.2byte	0x16c
+	.4byte	0x5924
+	.byte	0x18
+	.uleb128 0x1b
+	.4byte	.LASF1283
+	.byte	0x58
+	.2byte	0x170
+	.4byte	0x29
+	.byte	0x20
+	.uleb128 0x1b
+	.4byte	.LASF1284
+	.byte	0x58
+	.2byte	0x171
+	.4byte	0x29
+	.byte	0x28
+	.uleb128 0x1b
+	.4byte	.LASF1285
+	.byte	0x58
+	.2byte	0x177
+	.4byte	0x29
+	.byte	0x30
+	.uleb128 0x1b
+	.4byte	.LASF1286
+	.byte	0x58
+	.2byte	0x178
+	.4byte	0x29
+	.byte	0x38
+	.uleb128 0x2b
+	.string	"pgd"
+	.byte	0x58
+	.2byte	0x179
+	.4byte	0x592a
+	.byte	0x40
+	.uleb128 0x1b
+	.4byte	.LASF1287
+	.byte	0x58
+	.2byte	0x184
+	.4byte	0x37c
+	.byte	0x48
+	.uleb128 0x1b
+	.4byte	.LASF1288
+	.byte	0x58
+	.2byte	0x18d
+	.4byte	0x37c
+	.byte	0x4c
+	.uleb128 0x1b
+	.4byte	.LASF1289
+	.byte	0x58
+	.2byte	0x190
+	.4byte	0x558
+	.byte	0x50
+	.uleb128 0x1b
+	.4byte	.LASF1290
+	.byte	0x58
+	.2byte	0x192
+	.4byte	0xc6
+	.byte	0x58
+	.uleb128 0x1b
+	.4byte	.LASF1291
+	.byte	0x58
+	.2byte	0x194
+	.4byte	0xe65
+	.byte	0x5c
+	.uleb128 0x1b
+	.4byte	.LASF1292
+	.byte	0x58
+	.2byte	0x197
+	.4byte	0x4d5c
+	.byte	0x60
+	.uleb128 0x1b
+	.4byte	.LASF1293
+	.byte	0x58
+	.2byte	0x199
+	.4byte	0x3a7
+	.byte	0x90
+	.uleb128 0x1b
+	.4byte	.LASF1294
+	.byte	0x58
+	.2byte	0x1a0
+	.4byte	0x29
+	.byte	0xa0
+	.uleb128 0x1b
+	.4byte	.LASF1295
+	.byte	0x58
+	.2byte	0x1a1
+	.4byte	0x29
+	.byte	0xa8
+	.uleb128 0x1b
+	.4byte	.LASF1296
+	.byte	0x58
+	.2byte	0x1a3
+	.4byte	0x29
+	.byte	0xb0
+	.uleb128 0x1b
+	.4byte	.LASF930
+	.byte	0x58
+	.2byte	0x1a4
+	.4byte	0x29
+	.byte	0xb8
+	.uleb128 0x1b
+	.4byte	.LASF1297
+	.byte	0x58
+	.2byte	0x1a5
+	.4byte	0x29
+	.byte	0xc0
+	.uleb128 0x1b
+	.4byte	.LASF1298
+	.byte	0x58
+	.2byte	0x1a6
+	.4byte	0x29
+	.byte	0xc8
+	.uleb128 0x1b
+	.4byte	.LASF1299
+	.byte	0x58
+	.2byte	0x1a7
+	.4byte	0x29
+	.byte	0xd0
+	.uleb128 0x1b
+	.4byte	.LASF1300
+	.byte	0x58
+	.2byte	0x1a8
+	.4byte	0x29
+	.byte	0xd8
+	.uleb128 0x1b
+	.4byte	.LASF1301
+	.byte	0x58
+	.2byte	0x1a9
+	.4byte	0x29
+	.byte	0xe0
+	.uleb128 0x1b
+	.4byte	.LASF1302
+	.byte	0x58
+	.2byte	0x1ab
+	.4byte	0xe65
+	.byte	0xe8
+	.uleb128 0x1b
+	.4byte	.LASF1303
+	.byte	0x58
+	.2byte	0x1ac
+	.4byte	0x29
+	.byte	0xf0
+	.uleb128 0x1b
+	.4byte	.LASF1304
+	.byte	0x58
+	.2byte	0x1ac
+	.4byte	0x29
+	.byte	0xf8
+	.uleb128 0x1c
+	.4byte	.LASF1305
+	.byte	0x58
+	.2byte	0x1ac
+	.4byte	0x29
+	.2byte	0x100
+	.uleb128 0x1c
+	.4byte	.LASF1306
+	.byte	0x58
+	.2byte	0x1ac
+	.4byte	0x29
+	.2byte	0x108
+	.uleb128 0x1c
+	.4byte	.LASF1307
+	.byte	0x58
+	.2byte	0x1ad
+	.4byte	0x29
+	.2byte	0x110
+	.uleb128 0x30
+	.string	"brk"
+	.byte	0x58
+	.2byte	0x1ad
+	.4byte	0x29
+	.2byte	0x118
+	.uleb128 0x1c
+	.4byte	.LASF1308
+	.byte	0x58
+	.2byte	0x1ad
+	.4byte	0x29
+	.2byte	0x120
+	.uleb128 0x1c
+	.4byte	.LASF1309
+	.byte	0x58
+	.2byte	0x1ae
+	.4byte	0x29
+	.2byte	0x128
+	.uleb128 0x1c
+	.4byte	.LASF1310
+	.byte	0x58
+	.2byte	0x1ae
+	.4byte	0x29
+	.2byte	0x130
+	.uleb128 0x1c
+	.4byte	.LASF1311
+	.byte	0x58
+	.2byte	0x1ae
+	.4byte	0x29
+	.2byte	0x138
+	.uleb128 0x1c
+	.4byte	.LASF1312
+	.byte	0x58
+	.2byte	0x1ae
+	.4byte	0x29
+	.2byte	0x140
+	.uleb128 0x1c
+	.4byte	.LASF1313
+	.byte	0x58
+	.2byte	0x1b0
+	.4byte	0x5930
+	.2byte	0x148
+	.uleb128 0x1c
+	.4byte	.LASF617
+	.byte	0x58
+	.2byte	0x1b6
+	.4byte	0x3d49
+	.2byte	0x2b8
+	.uleb128 0x1c
+	.4byte	.LASF1314
+	.byte	0x58
+	.2byte	0x1b8
+	.4byte	0x5945
+	.2byte	0x2e0
+	.uleb128 0x1c
+	.4byte	.LASF1315
+	.byte	0x58
+	.2byte	0x1bb
+	.4byte	0x4eed
+	.2byte	0x2e8
+	.uleb128 0x1c
+	.4byte	.LASF171
+	.byte	0x58
+	.2byte	0x1bd
+	.4byte	0x29
+	.2byte	0x300
+	.uleb128 0x1c
+	.4byte	.LASF1277
+	.byte	0x58
+	.2byte	0x1bf
+	.4byte	0x594b
+	.2byte	0x308
+	.uleb128 0x1c
+	.4byte	.LASF1316
+	.byte	0x58
+	.2byte	0x1c1
+	.4byte	0x37c
+	.2byte	0x310
+	.uleb128 0x1c
+	.4byte	.LASF1317
+	.byte	0x58
+	.2byte	0x1c4
+	.4byte	0xe65
+	.2byte	0x314
+	.uleb128 0x1c
+	.4byte	.LASF1318
+	.byte	0x58
+	.2byte	0x1c5
+	.4byte	0x5956
+	.2byte	0x318
+	.uleb128 0x1c
+	.4byte	.LASF98
+	.byte	0x58
+	.2byte	0x1d2
+	.4byte	0x2eff
+	.2byte	0x320
+	.uleb128 0x1c
+	.4byte	.LASF1087
+	.byte	0x58
+	.2byte	0x1d4
+	.4byte	0x595c
+	.2byte	0x328
+	.uleb128 0x1c
+	.4byte	.LASF1319
+	.byte	0x58
+	.2byte	0x1d7
+	.4byte	0x5482
+	.2byte	0x330
+	.uleb128 0x1c
+	.4byte	.LASF1320
+	.byte	0x58
+	.2byte	0x1f1
+	.4byte	0x37c
+	.2byte	0x338
+	.uleb128 0x1c
+	.4byte	.LASF1182
+	.byte	0x58
+	.2byte	0x1f6
+	.4byte	0x4e9d
+	.2byte	0x340
+	.uleb128 0x1c
+	.4byte	.LASF1321
+	.byte	0x58
+	.2byte	0x1fa
+	.4byte	0x3205
+	.2byte	0x348
+	.byte	0
+	.uleb128 0x14
+	.4byte	0x29
+	.4byte	0x5924
+	.uleb128 0x11
+	.4byte	0x5482
+	.uleb128 0x11
+	.4byte	0x29
+	.uleb128 0x11
+	.4byte	0x29
+	.uleb128 0x11
+	.4byte	0x29
+	.uleb128 0x11
+	.4byte	0x29
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x5901
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x3347
+	.uleb128 0x5
+	.4byte	0x29
+	.4byte	0x5940
+	.uleb128 0x6
+	.4byte	0x4f
+	.byte	0x2d
+	.byte	0
+	.uleb128 0x24
+	.4byte	.LASF1322
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x5940
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x5605
+	.uleb128 0x24
+	.4byte	.LASF1323
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x5951
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x23e5
+	.uleb128 0x5
+	.4byte	0x29
+	.4byte	0x5971
+	.uleb128 0x41
+	.4byte	0x4f
+	.byte	0
+	.uleb128 0x15
+	.4byte	.LASF1324
+	.byte	0x58
+	.2byte	0x209
+	.4byte	0x453a
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x339d
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x5989
+	.uleb128 0x1d
+	.4byte	.LASF1325
+	.byte	0x68
+	.byte	0x74
+	.2byte	0x163
+	.4byte	0x5a4d
+	.uleb128 0x2b
+	.string	"vma"
+	.byte	0x74
+	.2byte	0x164
+	.4byte	0x3be9
+	.byte	0
+	.uleb128 0x1b
+	.4byte	.LASF171
+	.byte	0x74
+	.2byte	0x165
+	.4byte	0x6d
+	.byte	0x8
+	.uleb128 0x1b
+	.4byte	.LASF1139
+	.byte	0x74
+	.2byte	0x166
+	.4byte	0x330
+	.byte	0xc
+	.uleb128 0x1b
+	.4byte	.LASF1326
+	.byte	0x74
+	.2byte	0x167
+	.4byte	0x29
+	.byte	0x10
+	.uleb128 0x1b
+	.4byte	.LASF1327
+	.byte	0x74
+	.2byte	0x168
+	.4byte	0x29
+	.byte	0x18
+	.uleb128 0x2b
+	.string	"pmd"
+	.byte	0x74
+	.2byte	0x169
+	.4byte	0xc7e4
+	.byte	0x20
+	.uleb128 0x2b
+	.string	"pud"
+	.byte	0x74
+	.2byte	0x16b
+	.4byte	0xc8e8
+	.byte	0x28
+	.uleb128 0x1b
+	.4byte	.LASF1328
+	.byte	0x74
+	.2byte	0x16e
+	.4byte	0x3307
+	.byte	0x30
+	.uleb128 0x1b
+	.4byte	.LASF1329
+	.byte	0x74
+	.2byte	0x170
+	.4byte	0x339d
+	.byte	0x38
+	.uleb128 0x1b
+	.4byte	.LASF1142
+	.byte	0x74
+	.2byte	0x171
+	.4byte	0x4897
+	.byte	0x40
+	.uleb128 0x1b
+	.4byte	.LASF815
+	.byte	0x74
+	.2byte	0x172
+	.4byte	0x339d
+	.byte	0x48
+	.uleb128 0x2b
+	.string	"pte"
+	.byte	0x74
+	.2byte	0x178
+	.4byte	0xc8ee
+	.byte	0x50
+	.uleb128 0x2b
+	.string	"ptl"
+	.byte	0x74
+	.2byte	0x17c
+	.4byte	0x4c5f
+	.byte	0x58
+	.uleb128 0x1b
+	.4byte	.LASF1330
+	.byte	0x74
+	.2byte	0x180
+	.4byte	0x3392
+	.byte	0x60
+	.byte	0
+	.uleb128 0x19
+	.4byte	.LASF1331
+	.byte	0x75
+	.byte	0x16
+	.4byte	0xc6
+	.uleb128 0xd
+	.4byte	.LASF1332
+	.byte	0x8
+	.byte	0x75
+	.byte	0x18
+	.4byte	0x5a71
+	.uleb128 0x20
+	.string	"cap"
+	.byte	0x75
+	.byte	0x19
+	.4byte	0xcf9
+	.byte	0
+	.byte	0
+	.uleb128 0x8
+	.4byte	.LASF1333
+	.byte	0x75
+	.byte	0x1a
+	.4byte	0x5a58
+	.uleb128 0x3
+	.4byte	0x5a71
+	.uleb128 0x19
+	.4byte	.LASF1334
+	.byte	0x75
+	.byte	0x2d
+	.4byte	0x5a7c
+	.uleb128 0x19
+	.4byte	.LASF1335
+	.byte	0x75
+	.byte	0x2e
+	.4byte	0x5a7c
+	.uleb128 0xd
+	.4byte	.LASF1336
+	.byte	0x18
+	.byte	0x76
+	.byte	0x10
+	.4byte	0x5ac8
+	.uleb128 0xe
+	.4byte	.LASF116
+	.byte	0x76
+	.byte	0x11
+	.4byte	0xe33
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF383
+	.byte	0x76
+	.byte	0x12
+	.4byte	0x6d
+	.byte	0x4
+	.uleb128 0xe
+	.4byte	.LASF575
+	.byte	0x76
+	.byte	0x13
+	.4byte	0x3a7
+	.byte	0x8
+	.byte	0
+	.uleb128 0xd
+	.4byte	.LASF1337
+	.byte	0x38
+	.byte	0x77
+	.byte	0x11
+	.4byte	0x5b1d
+	.uleb128 0xe
+	.4byte	.LASF1338
+	.byte	0x77
+	.byte	0x12
+	.4byte	0xf4
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF1339
+	.byte	0x77
+	.byte	0x14
+	.4byte	0xf4
+	.byte	0x8
+	.uleb128 0xe
+	.4byte	.LASF1340
+	.byte	0x77
+	.byte	0x16
+	.4byte	0xf4
+	.byte	0x10
+	.uleb128 0xe
+	.4byte	.LASF1341
+	.byte	0x77
+	.byte	0x17
+	.4byte	0x5b1d
+	.byte	0x18
+	.uleb128 0xe
+	.4byte	.LASF1342
+	.byte	0x77
+	.byte	0x18
+	.4byte	0xd2
+	.byte	0x28
+	.uleb128 0xe
+	.4byte	.LASF1343
+	.byte	0x77
+	.byte	0x19
+	.4byte	0xca8
+	.byte	0x2c
+	.byte	0
+	.uleb128 0x5
+	.4byte	0xf4
+	.4byte	0x5b2d
+	.uleb128 0x6
+	.4byte	0x4f
+	.byte	0x1
+	.byte	0
+	.uleb128 0x1f
+	.4byte	.LASF1344
+	.byte	0x4
+	.4byte	0x6d
+	.byte	0x78
+	.byte	0xf
+	.4byte	0x5b56
+	.uleb128 0xc
+	.4byte	.LASF1345
+	.byte	0
+	.uleb128 0xc
+	.4byte	.LASF1346
+	.byte	0x1
+	.uleb128 0xc
+	.4byte	.LASF1347
+	.byte	0x2
+	.uleb128 0xc
+	.4byte	.LASF1348
+	.byte	0x3
+	.byte	0
+	.uleb128 0xd
+	.4byte	.LASF1349
+	.byte	0x8
+	.byte	0x79
+	.byte	0x14
+	.4byte	0x5b6f
+	.uleb128 0xe
+	.4byte	.LASF758
+	.byte	0x79
+	.byte	0x15
+	.4byte	0x2eff
+	.byte	0
+	.byte	0
+	.uleb128 0x1f
+	.4byte	.LASF1350
+	.byte	0x4
+	.4byte	0x6d
+	.byte	0x7a
+	.byte	0x1d
+	.4byte	0x5b92
+	.uleb128 0xc
+	.4byte	.LASF1351
+	.byte	0
+	.uleb128 0xc
+	.4byte	.LASF1352
+	.byte	0x1
+	.uleb128 0xc
+	.4byte	.LASF1353
+	.byte	0x2
+	.byte	0
+	.uleb128 0xd
+	.4byte	.LASF1354
+	.byte	0x40
+	.byte	0x7a
+	.byte	0x20
+	.4byte	0x5be7
+	.uleb128 0xe
+	.4byte	.LASF1355
+	.byte	0x7a
+	.byte	0x21
+	.4byte	0xc6
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF1356
+	.byte	0x7a
+	.byte	0x22
+	.4byte	0xc6
+	.byte	0x4
+	.uleb128 0xe
+	.4byte	.LASF1357
+	.byte	0x7a
+	.byte	0x23
+	.4byte	0x15bf
+	.byte	0x8
+	.uleb128 0xe
+	.4byte	.LASF1358
+	.byte	0x7a
+	.byte	0x25
+	.4byte	0xc6
+	.byte	0x20
+	.uleb128 0xe
+	.4byte	.LASF1359
+	.byte	0x7a
+	.byte	0x26
+	.4byte	0x41c
+	.byte	0x28
+	.uleb128 0xe
+	.4byte	.LASF1360
+	.byte	0x7a
+	.byte	0x28
+	.4byte	0x5b6f
+	.byte	0x38
+	.byte	0
+	.uleb128 0xd
+	.4byte	.LASF1361
+	.byte	0x88
+	.byte	0x7b
+	.byte	0xc
+	.4byte	0x5c30
+	.uleb128 0x20
+	.string	"rss"
+	.byte	0x7b
+	.byte	0xd
+	.4byte	0x5b92
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF1362
+	.byte	0x7b
+	.byte	0xe
+	.4byte	0x34a7
+	.byte	0x40
+	.uleb128 0xe
+	.4byte	.LASF1363
+	.byte	0x7b
+	.byte	0xf
+	.4byte	0x4d5c
+	.byte	0x48
+	.uleb128 0xe
+	.4byte	.LASF1364
+	.byte	0x7b
+	.byte	0x10
+	.4byte	0x5b56
+	.byte	0x78
+	.uleb128 0xe
+	.4byte	.LASF1365
+	.byte	0x7b
+	.byte	0x11
+	.4byte	0xc6
+	.byte	0x80
+	.byte	0
+	.uleb128 0xd
+	.4byte	.LASF1366
+	.byte	0x10
+	.byte	0x7c
+	.byte	0xa
+	.4byte	0x5c54
+	.uleb128 0x20
+	.string	"fn"
+	.byte	0x7c
+	.byte	0xb
+	.4byte	0x2f2f
+	.byte	0
+	.uleb128 0x20
+	.string	"arg"
+	.byte	0x7c
+	.byte	0xc
+	.4byte	0x458
+	.byte	0x8
+	.byte	0
+	.uleb128 0xf
+	.byte	0x10
+	.byte	0x7d
+	.byte	0x17
+	.4byte	0x5c67
+	.uleb128 0x20
+	.string	"b"
+	.byte	0x7d
+	.byte	0x18
+	.4byte	0x5c67
+	.byte	0
+	.byte	0
+	.uleb128 0x5
+	.4byte	0x8b
+	.4byte	0x5c77
+	.uleb128 0x6
+	.4byte	0x4f
+	.byte	0xf
+	.byte	0
+	.uleb128 0x8
+	.4byte	.LASF1367
+	.byte	0x7d
+	.byte	0x19
+	.4byte	0x5c54
+	.uleb128 0x3
+	.4byte	0x5c77
+	.uleb128 0xf
+	.byte	0x10
+	.byte	0x7e
+	.byte	0x18
+	.4byte	0x5c9a
+	.uleb128 0x20
+	.string	"b"
+	.byte	0x7e
+	.byte	0x19
+	.4byte	0x5c67
+	.byte	0
+	.byte	0
+	.uleb128 0x8
+	.4byte	.LASF1368
+	.byte	0x7e
+	.byte	0x1a
+	.4byte	0x5c87
+	.uleb128 0x3
+	.4byte	0x5c9a
+	.uleb128 0x19
+	.4byte	.LASF1369
+	.byte	0x7e
+	.byte	0x29
+	.4byte	0x5c82
+	.uleb128 0x19
+	.4byte	.LASF1370
+	.byte	0x7e
+	.byte	0x2a
+	.4byte	0x5ca5
+	.uleb128 0x5
+	.4byte	0x11a
+	.4byte	0x5cd0
+	.uleb128 0x6
+	.4byte	0x4f
+	.byte	0xf
+	.byte	0
+	.uleb128 0x3
+	.4byte	0x5cc0
+	.uleb128 0x19
+	.4byte	.LASF1371
+	.byte	0x7e
+	.byte	0x51
+	.4byte	0x5cd0
+	.uleb128 0x19
+	.4byte	.LASF1372
+	.byte	0x7e
+	.byte	0x52
+	.4byte	0x5cd0
+	.uleb128 0x8
+	.4byte	.LASF1373
+	.byte	0x7f
+	.byte	0x8
+	.4byte	0x13f
+	.uleb128 0x21
+	.byte	0x10
+	.byte	0x69
+	.byte	0x53
+	.4byte	0x5d15
+	.uleb128 0x22
+	.4byte	.LASF1374
+	.byte	0x69
+	.byte	0x54
+	.4byte	0x3a7
+	.uleb128 0x22
+	.4byte	.LASF1375
+	.byte	0x69
+	.byte	0x55
+	.4byte	0x5174
+	.byte	0
+	.uleb128 0x21
+	.byte	0x10
+	.byte	0x69
+	.byte	0x57
+	.4byte	0x5d34
+	.uleb128 0x22
+	.4byte	.LASF1376
+	.byte	0x69
+	.byte	0x58
+	.4byte	0x3eb
+	.uleb128 0x22
+	.4byte	.LASF1377
+	.byte	0x69
+	.byte	0x59
+	.4byte	0x41c
+	.byte	0
+	.uleb128 0xd
+	.4byte	.LASF1378
+	.byte	0x38
+	.byte	0x69
+	.byte	0x49
+	.4byte	0x5d6f
+	.uleb128 0x20
+	.string	"q"
+	.byte	0x69
+	.byte	0x4a
+	.4byte	0x48a2
+	.byte	0
+	.uleb128 0x20
+	.string	"ioc"
+	.byte	0x69
+	.byte	0x4b
+	.4byte	0x4823
+	.byte	0x8
+	.uleb128 0x23
+	.4byte	0x5cf6
+	.byte	0x10
+	.uleb128 0x23
+	.4byte	0x5d15
+	.byte	0x20
+	.uleb128 0xe
+	.4byte	.LASF171
+	.byte	0x69
+	.byte	0x5c
+	.4byte	0x6d
+	.byte	0x30
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x5d34
+	.uleb128 0x19
+	.4byte	.LASF1379
+	.byte	0x80
+	.byte	0xb
+	.4byte	0x6d
+	.uleb128 0xd
+	.4byte	.LASF1380
+	.byte	0x18
+	.byte	0x81
+	.byte	0x5c
+	.4byte	0x5db1
+	.uleb128 0xe
+	.4byte	.LASF1381
+	.byte	0x81
+	.byte	0x5d
+	.4byte	0x29
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF1382
+	.byte	0x81
+	.byte	0x5e
+	.4byte	0x29
+	.byte	0x8
+	.uleb128 0xe
+	.4byte	.LASF1383
+	.byte	0x81
+	.byte	0x5f
+	.4byte	0x29
+	.byte	0x10
+	.byte	0
+	.uleb128 0xd
+	.4byte	.LASF1384
+	.byte	0x38
+	.byte	0x81
+	.byte	0x62
+	.4byte	0x5de2
+	.uleb128 0xe
+	.4byte	.LASF1385
+	.byte	0x81
+	.byte	0x63
+	.4byte	0x199
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF393
+	.byte	0x81
+	.byte	0x64
+	.4byte	0x199
+	.byte	0x8
+	.uleb128 0xe
+	.4byte	.LASF396
+	.byte	0x81
+	.byte	0x65
+	.4byte	0x5de2
+	.byte	0x10
+	.byte	0
+	.uleb128 0x5
+	.4byte	0x199
+	.4byte	0x5df2
+	.uleb128 0x6
+	.4byte	0x4f
+	.byte	0x4
+	.byte	0
+	.uleb128 0x19
+	.4byte	.LASF1386
+	.byte	0x1e
+	.byte	0x49
+	.4byte	0x5d80
+	.uleb128 0x19
+	.4byte	.LASF1387
+	.byte	0x1e
+	.byte	0x4b
+	.4byte	0x6d
+	.uleb128 0x19
+	.4byte	.LASF1388
+	.byte	0x1e
+	.byte	0x4c
+	.4byte	0x5db1
+	.uleb128 0x19
+	.4byte	.LASF1389
+	.byte	0x1e
+	.byte	0x4d
+	.4byte	0xc6
+	.uleb128 0x19
+	.4byte	.LASF1390
+	.byte	0x1e
+	.byte	0x4d
+	.4byte	0xc6
+	.uleb128 0x19
+	.4byte	.LASF1391
+	.byte	0x1e
+	.byte	0x4e
+	.4byte	0xc6
+	.uleb128 0x19
+	.4byte	.LASF1392
+	.byte	0x1e
+	.byte	0x4f
+	.4byte	0xc6
+	.uleb128 0x19
+	.4byte	.LASF1393
+	.byte	0x1e
+	.byte	0x50
+	.4byte	0xc6
+	.uleb128 0x19
+	.4byte	.LASF1394
+	.byte	0x1e
+	.byte	0x51
+	.4byte	0xc6
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x5e5b
+	.uleb128 0x1d
+	.4byte	.LASF1395
+	.byte	0x28
+	.byte	0x1e
+	.2byte	0x137
+	.4byte	0x5ec4
+	.uleb128 0x1b
+	.4byte	.LASF1396
+	.byte	0x1e
+	.2byte	0x138
+	.4byte	0x5482
+	.byte	0
+	.uleb128 0x1b
+	.4byte	.LASF1397
+	.byte	0x1e
+	.2byte	0x13d
+	.4byte	0x2d8
+	.byte	0x8
+	.uleb128 0x1b
+	.4byte	.LASF1398
+	.byte	0x1e
+	.2byte	0x13e
+	.4byte	0x7573
+	.byte	0x10
+	.uleb128 0x1b
+	.4byte	.LASF360
+	.byte	0x1e
+	.2byte	0x13f
+	.4byte	0x458
+	.byte	0x18
+	.uleb128 0x1b
+	.4byte	.LASF1399
+	.byte	0x1e
+	.2byte	0x140
+	.4byte	0xc6
+	.byte	0x20
+	.uleb128 0x1b
+	.4byte	.LASF1400
+	.byte	0x1e
+	.2byte	0x141
+	.4byte	0x11f
+	.byte	0x24
+	.uleb128 0x1b
+	.4byte	.LASF1401
+	.byte	0x1e
+	.2byte	0x142
+	.4byte	0x11f
+	.byte	0x26
+	.byte	0
+	.uleb128 0xd
+	.4byte	.LASF1402
+	.byte	0x50
+	.byte	0x1e
+	.byte	0xd9
+	.4byte	0x5f3d
+	.uleb128 0xe
+	.4byte	.LASF1403
+	.byte	0x1e
+	.byte	0xda
+	.4byte	0x6d
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF1404
+	.byte	0x1e
+	.byte	0xdb
+	.4byte	0x28f
+	.byte	0x4
+	.uleb128 0xe
+	.4byte	.LASF1405
+	.byte	0x1e
+	.byte	0xdc
+	.4byte	0x240a
+	.byte	0x8
+	.uleb128 0xe
+	.4byte	.LASF1406
+	.byte	0x1e
+	.byte	0xdd
+	.4byte	0x242a
+	.byte	0xc
+	.uleb128 0xe
+	.4byte	.LASF1407
+	.byte	0x1e
+	.byte	0xde
+	.4byte	0x2d8
+	.byte	0x10
+	.uleb128 0xe
+	.4byte	.LASF1408
+	.byte	0x1e
+	.byte	0xdf
+	.4byte	0xa27
+	.byte	0x18
+	.uleb128 0xe
+	.4byte	.LASF1409
+	.byte	0x1e
+	.byte	0xe0
+	.4byte	0xa27
+	.byte	0x28
+	.uleb128 0xe
+	.4byte	.LASF1410
+	.byte	0x1e
+	.byte	0xe1
+	.4byte	0xa27
+	.byte	0x38
+	.uleb128 0xe
+	.4byte	.LASF1411
+	.byte	0x1e
+	.byte	0xe8
+	.4byte	0x5482
+	.byte	0x48
+	.byte	0
+	.uleb128 0x5
+	.4byte	0x224
+	.4byte	0x5f4d
+	.uleb128 0x6
+	.4byte	0x4f
+	.byte	0x5
+	.byte	0
+	.uleb128 0x3
+	.4byte	0x5f3d
+	.uleb128 0x19
+	.4byte	.LASF1412
+	.byte	0x82
+	.byte	0x45
+	.4byte	0x5f4d
+	.uleb128 0x19
+	.4byte	.LASF1413
+	.byte	0x82
+	.byte	0x5a
+	.4byte	0xc6
+	.uleb128 0xd
+	.4byte	.LASF1414
+	.byte	0x68
+	.byte	0x82
+	.byte	0x63
+	.4byte	0x5f8d
+	.uleb128 0xe
+	.4byte	.LASF1415
+	.byte	0x82
+	.byte	0x64
+	.4byte	0x5f8d
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF1416
+	.byte	0x82
+	.byte	0x65
+	.4byte	0x29
+	.byte	0x60
+	.byte	0
+	.uleb128 0x5
+	.4byte	0x3a7
+	.4byte	0x5f9d
+	.uleb128 0x6
+	.4byte	0x4f
+	.byte	0x5
+	.byte	0
+	.uleb128 0xd
+	.4byte	.LASF1417
+	.byte	0
+	.byte	0x82
+	.byte	0x71
+	.4byte	0x5fb4
+	.uleb128 0x20
+	.string	"x"
+	.byte	0x82
+	.byte	0x72
+	.4byte	0x5fb4
+	.byte	0
+	.byte	0
+	.uleb128 0x5
+	.4byte	0x61
+	.4byte	0x5fc3
+	.uleb128 0x41
+	.4byte	0x4f
+	.byte	0
+	.uleb128 0x1f
+	.4byte	.LASF1418
+	.byte	0x4
+	.4byte	0x6d
+	.byte	0x82
+	.byte	0x87
+	.4byte	0x602e
+	.uleb128 0xc
+	.4byte	.LASF1419
+	.byte	0
+	.uleb128 0xc
+	.4byte	.LASF1420
+	.byte	0x1
+	.uleb128 0xc
+	.4byte	.LASF1421
+	.byte	0x1
+	.uleb128 0xc
+	.4byte	.LASF1422
+	.byte	0x2
+	.uleb128 0xc
+	.4byte	.LASF1423
+	.byte	0x3
+	.uleb128 0xc
+	.4byte	.LASF1424
+	.byte	0x4
+	.uleb128 0xc
+	.4byte	.LASF1425
+	.byte	0x5
+	.uleb128 0xc
+	.4byte	.LASF1426
+	.byte	0x6
+	.uleb128 0xc
+	.4byte	.LASF1427
+	.byte	0x7
+	.uleb128 0xc
+	.4byte	.LASF1428
+	.byte	0x8
+	.uleb128 0xc
+	.4byte	.LASF1429
+	.byte	0x9
+	.uleb128 0xc
+	.4byte	.LASF1430
+	.byte	0xa
+	.uleb128 0xc
+	.4byte	.LASF1431
+	.byte	0xb
+	.uleb128 0xc
+	.4byte	.LASF1432
+	.byte	0xc
+	.uleb128 0xc
+	.4byte	.LASF1433
+	.byte	0xd
+	.byte	0
+	.uleb128 0x1f
+	.4byte	.LASF1434
+	.byte	0x4
+	.4byte	0x6d
+	.byte	0x82
+	.byte	0x9f
+	.4byte	0x6111
+	.uleb128 0xc
+	.4byte	.LASF1435
+	.byte	0
+	.uleb128 0xc
+	.4byte	.LASF1436
+	.byte	0
+	.uleb128 0xc
+	.4byte	.LASF1437
+	.byte	0x1
+	.uleb128 0xc
+	.4byte	.LASF1438
+	.byte	0x2
+	.uleb128 0xc
+	.4byte	.LASF1439
+	.byte	0x3
+	.uleb128 0xc
+	.4byte	.LASF1440
+	.byte	0x4
+	.uleb128 0xc
+	.4byte	.LASF1441
+	.byte	0x5
+	.uleb128 0xc
+	.4byte	.LASF1442
+	.byte	0x6
+	.uleb128 0xc
+	.4byte	.LASF1443
+	.byte	0x7
+	.uleb128 0xc
+	.4byte	.LASF1444
+	.byte	0x8
+	.uleb128 0xc
+	.4byte	.LASF1445
+	.byte	0x9
+	.uleb128 0xc
+	.4byte	.LASF1446
+	.byte	0xa
+	.uleb128 0xc
+	.4byte	.LASF1447
+	.byte	0xb
+	.uleb128 0xc
+	.4byte	.LASF1448
+	.byte	0xc
+	.uleb128 0xc
+	.4byte	.LASF1449
+	.byte	0xd
+	.uleb128 0xc
+	.4byte	.LASF1450
+	.byte	0xe
+	.uleb128 0xc
+	.4byte	.LASF1451
+	.byte	0xf
+	.uleb128 0xc
+	.4byte	.LASF1452
+	.byte	0x10
+	.uleb128 0xc
+	.4byte	.LASF1453
+	.byte	0x11
+	.uleb128 0xc
+	.4byte	.LASF1454
+	.byte	0x12
+	.uleb128 0xc
+	.4byte	.LASF1455
+	.byte	0x13
+	.uleb128 0xc
+	.4byte	.LASF1456
+	.byte	0x14
+	.uleb128 0xc
+	.4byte	.LASF1457
+	.byte	0x15
+	.uleb128 0xc
+	.4byte	.LASF1458
+	.byte	0x16
+	.uleb128 0xc
+	.4byte	.LASF1459
+	.byte	0x17
+	.uleb128 0xc
+	.4byte	.LASF1460
+	.byte	0x18
+	.uleb128 0xc
+	.4byte	.LASF1461
+	.byte	0x19
+	.uleb128 0xc
+	.4byte	.LASF1462
+	.byte	0x1a
+	.uleb128 0xc
+	.4byte	.LASF1463
+	.byte	0x1b
+	.uleb128 0xc
+	.4byte	.LASF1464
+	.byte	0x1c
+	.uleb128 0xc
+	.4byte	.LASF1465
+	.byte	0x1d
+	.uleb128 0xc
+	.4byte	.LASF1466
+	.byte	0x1e
+	.uleb128 0xc
+	.4byte	.LASF1467
+	.byte	0x1f
+	.uleb128 0xc
+	.4byte	.LASF1468
+	.byte	0x20
+	.uleb128 0xc
+	.4byte	.LASF1469
+	.byte	0x21
+	.byte	0
+	.uleb128 0xd
+	.4byte	.LASF1470
+	.byte	0x20
+	.byte	0x82
+	.byte	0xea
+	.4byte	0x6136
+	.uleb128 0xe
+	.4byte	.LASF1471
+	.byte	0x82
+	.byte	0xf3
+	.4byte	0x3f
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF1472
+	.byte	0x82
+	.byte	0xf4
+	.4byte	0x3f
+	.byte	0x10
+	.byte	0
+	.uleb128 0xd
+	.4byte	.LASF1473
+	.byte	0x88
+	.byte	0x82
+	.byte	0xf7
+	.4byte	0x617f
+	.uleb128 0xe
+	.4byte	.LASF1474
+	.byte	0x82
+	.byte	0xf8
+	.4byte	0x617f
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF1475
+	.byte	0x82
+	.byte	0xf9
+	.4byte	0x6111
+	.byte	0x50
+	.uleb128 0xe
+	.4byte	.LASF1476
+	.byte	0x82
+	.byte	0xfb
+	.4byte	0x558
+	.byte	0x70
+	.uleb128 0xe
+	.4byte	.LASF1477
+	.byte	0x82
+	.byte	0xfd
+	.4byte	0x29
+	.byte	0x78
+	.uleb128 0xe
+	.4byte	.LASF1478
+	.byte	0x82
+	.byte	0xff
+	.4byte	0x62fb
+	.byte	0x80
+	.byte	0
+	.uleb128 0x5
+	.4byte	0x3a7
+	.4byte	0x618f
+	.uleb128 0x6
+	.4byte	0x4f
+	.byte	0x4
+	.byte	0
+	.uleb128 0x1a
+	.4byte	.LASF1479
+	.2byte	0x1680
+	.byte	0x82
+	.2byte	0x284
+	.4byte	0x62fb
+	.uleb128 0x1b
+	.4byte	.LASF1480
+	.byte	0x82
+	.2byte	0x285
+	.4byte	0x668e
+	.byte	0
+	.uleb128 0x1c
+	.4byte	.LASF1481
+	.byte	0x82
+	.2byte	0x286
+	.4byte	0x669e
+	.2byte	0x1380
+	.uleb128 0x1c
+	.4byte	.LASF1482
+	.byte	0x82
+	.2byte	0x287
+	.4byte	0xc6
+	.2byte	0x13c0
+	.uleb128 0x1c
+	.4byte	.LASF1483
+	.byte	0x82
+	.2byte	0x2a0
+	.4byte	0x29
+	.2byte	0x13c8
+	.uleb128 0x1c
+	.4byte	.LASF1484
+	.byte	0x82
+	.2byte	0x2a1
+	.4byte	0x29
+	.2byte	0x13d0
+	.uleb128 0x1c
+	.4byte	.LASF1485
+	.byte	0x82
+	.2byte	0x2a2
+	.4byte	0x29
+	.2byte	0x13d8
+	.uleb128 0x1c
+	.4byte	.LASF1486
+	.byte	0x82
+	.2byte	0x2a4
+	.4byte	0xc6
+	.2byte	0x13e0
+	.uleb128 0x1c
+	.4byte	.LASF1487
+	.byte	0x82
+	.2byte	0x2a5
+	.4byte	0x15bf
+	.2byte	0x13e8
+	.uleb128 0x1c
+	.4byte	.LASF1488
+	.byte	0x82
+	.2byte	0x2a6
+	.4byte	0x15bf
+	.2byte	0x1400
+	.uleb128 0x1c
+	.4byte	.LASF1489
+	.byte	0x82
+	.2byte	0x2a7
+	.4byte	0x2eff
+	.2byte	0x1418
+	.uleb128 0x1c
+	.4byte	.LASF1490
+	.byte	0x82
+	.2byte	0x2a9
+	.4byte	0xc6
+	.2byte	0x1420
+	.uleb128 0x1c
+	.4byte	.LASF1491
+	.byte	0x82
+	.2byte	0x2aa
+	.4byte	0x63dc
+	.2byte	0x1424
+	.uleb128 0x1c
+	.4byte	.LASF1492
+	.byte	0x82
+	.2byte	0x2ac
+	.4byte	0xc6
+	.2byte	0x1428
+	.uleb128 0x1c
+	.4byte	.LASF1493
+	.byte	0x82
+	.2byte	0x2af
+	.4byte	0xc6
+	.2byte	0x142c
+	.uleb128 0x1c
+	.4byte	.LASF1494
+	.byte	0x82
+	.2byte	0x2b0
+	.4byte	0x63dc
+	.2byte	0x1430
+	.uleb128 0x1c
+	.4byte	.LASF1495
+	.byte	0x82
+	.2byte	0x2b1
+	.4byte	0x15bf
+	.2byte	0x1438
+	.uleb128 0x1c
+	.4byte	.LASF1496
+	.byte	0x82
+	.2byte	0x2b2
+	.4byte	0x2eff
+	.2byte	0x1450
+	.uleb128 0x1c
+	.4byte	.LASF1497
+	.byte	0x82
+	.2byte	0x2b8
+	.4byte	0x29
+	.2byte	0x1458
+	.uleb128 0x1c
+	.4byte	.LASF1498
+	.byte	0x82
+	.2byte	0x2c3
+	.4byte	0x5f9d
+	.2byte	0x1480
+	.uleb128 0x1c
+	.4byte	.LASF1499
+	.byte	0x82
+	.2byte	0x2c4
+	.4byte	0xe65
+	.2byte	0x1480
+	.uleb128 0x1c
+	.4byte	.LASF1473
+	.byte	0x82
+	.2byte	0x2d7
+	.4byte	0x6136
+	.2byte	0x1488
+	.uleb128 0x1c
+	.4byte	.LASF171
+	.byte	0x82
+	.2byte	0x2d9
+	.4byte	0x29
+	.2byte	0x1510
+	.uleb128 0x1c
+	.4byte	.LASF1500
+	.byte	0x82
+	.2byte	0x2db
+	.4byte	0x5f9d
+	.2byte	0x1540
+	.uleb128 0x1c
+	.4byte	.LASF1501
+	.byte	0x82
+	.2byte	0x2de
+	.4byte	0x66ae
+	.2byte	0x1540
+	.uleb128 0x1c
+	.4byte	.LASF1502
+	.byte	0x82
+	.2byte	0x2df
+	.4byte	0x66b4
+	.2byte	0x1548
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x618f
+	.uleb128 0x13
+	.4byte	.LASF1503
+	.byte	0x82
+	.2byte	0x110
+	.4byte	0x6d
+	.uleb128 0x1d
+	.4byte	.LASF1504
+	.byte	0x50
+	.byte	0x82
+	.2byte	0x11d
+	.4byte	0x634f
+	.uleb128 0x1b
+	.4byte	.LASF383
+	.byte	0x82
+	.2byte	0x11e
+	.4byte	0xc6
+	.byte	0
+	.uleb128 0x1b
+	.4byte	.LASF1505
+	.byte	0x82
+	.2byte	0x11f
+	.4byte	0xc6
+	.byte	0x4
+	.uleb128 0x1b
+	.4byte	.LASF1146
+	.byte	0x82
+	.2byte	0x120
+	.4byte	0xc6
+	.byte	0x8
+	.uleb128 0x1b
+	.4byte	.LASF1474
+	.byte	0x82
+	.2byte	0x123
+	.4byte	0x634f
+	.byte	0x10
+	.byte	0
+	.uleb128 0x5
+	.4byte	0x3a7
+	.4byte	0x635f
+	.uleb128 0x6
+	.4byte	0x4f
+	.byte	0x3
+	.byte	0
+	.uleb128 0x1d
+	.4byte	.LASF1506
+	.byte	0x60
+	.byte	0x82
+	.2byte	0x126
+	.4byte	0x6394
+	.uleb128 0x2b
+	.string	"pcp"
+	.byte	0x82
+	.2byte	0x127
+	.4byte	0x630d
+	.byte	0
+	.uleb128 0x1b
+	.4byte	.LASF1507
+	.byte	0x82
+	.2byte	0x12d
+	.4byte	0x106
+	.byte	0x50
+	.uleb128 0x1b
+	.4byte	.LASF1508
+	.byte	0x82
+	.2byte	0x12e
+	.4byte	0x6394
+	.byte	0x51
+	.byte	0
+	.uleb128 0x5
+	.4byte	0x106
+	.4byte	0x63a4
+	.uleb128 0x6
+	.4byte	0x4f
+	.byte	0xc
+	.byte	0
+	.uleb128 0x1d
+	.4byte	.LASF1509
+	.byte	0x22
+	.byte	0x82
+	.2byte	0x132
+	.4byte	0x63cc
+	.uleb128 0x1b
+	.4byte	.LASF1507
+	.byte	0x82
+	.2byte	0x133
+	.4byte	0x106
+	.byte	0
+	.uleb128 0x1b
+	.4byte	.LASF1510
+	.byte	0x82
+	.2byte	0x134
+	.4byte	0x63cc
+	.byte	0x1
+	.byte	0
+	.uleb128 0x5
+	.4byte	0x106
+	.4byte	0x63dc
+	.uleb128 0x6
+	.4byte	0x4f
+	.byte	0x20
+	.byte	0
+	.uleb128 0x1e
+	.4byte	.LASF1511
+	.byte	0x4
+	.4byte	0x6d
+	.byte	0x82
+	.2byte	0x139
+	.4byte	0x6406
+	.uleb128 0xc
+	.4byte	.LASF1512
+	.byte	0
+	.uleb128 0xc
+	.4byte	.LASF1513
+	.byte	0x1
+	.uleb128 0xc
+	.4byte	.LASF1514
+	.byte	0x2
+	.uleb128 0xc
+	.4byte	.LASF1515
+	.byte	0x3
+	.byte	0
+	.uleb128 0x1a
+	.4byte	.LASF1516
+	.2byte	0x680
+	.byte	0x82
+	.2byte	0x172
+	.4byte	0x65d4
+	.uleb128 0x1b
+	.4byte	.LASF1517
+	.byte	0x82
+	.2byte	0x176
+	.4byte	0x65d4
+	.byte	0
+	.uleb128 0x1b
+	.4byte	.LASF1518
+	.byte	0x82
+	.2byte	0x178
+	.4byte	0x29
+	.byte	0x18
+	.uleb128 0x1b
+	.4byte	.LASF1519
+	.byte	0x82
+	.2byte	0x183
+	.4byte	0x65e4
+	.byte	0x20
+	.uleb128 0x1b
+	.4byte	.LASF1520
+	.byte	0x82
+	.2byte	0x188
+	.4byte	0x62fb
+	.byte	0x38
+	.uleb128 0x1b
+	.4byte	.LASF1521
+	.byte	0x82
+	.2byte	0x189
+	.4byte	0x65f4
+	.byte	0x40
+	.uleb128 0x1b
+	.4byte	.LASF1522
+	.byte	0x82
+	.2byte	0x18c
+	.4byte	0x2b0
+	.byte	0x48
+	.uleb128 0x1b
+	.4byte	.LASF1523
+	.byte	0x82
+	.2byte	0x198
+	.4byte	0x29
+	.byte	0x50
+	.uleb128 0x1b
+	.4byte	.LASF1524
+	.byte	0x82
+	.2byte	0x1c3
+	.4byte	0x29
+	.byte	0x58
+	.uleb128 0x1b
+	.4byte	.LASF1525
+	.byte	0x82
+	.2byte	0x1c4
+	.4byte	0x29
+	.byte	0x60
+	.uleb128 0x1b
+	.4byte	.LASF1526
+	.byte	0x82
+	.2byte	0x1c5
+	.4byte	0x29
+	.byte	0x68
+	.uleb128 0x1b
+	.4byte	.LASF265
+	.byte	0x82
+	.2byte	0x1c7
+	.4byte	0x56
+	.byte	0x70
+	.uleb128 0x1b
+	.4byte	.LASF1527
+	.byte	0x82
+	.2byte	0x1cf
+	.4byte	0x29
+	.byte	0x78
+	.uleb128 0x1b
+	.4byte	.LASF1528
+	.byte	0x82
+	.2byte	0x1d7
+	.4byte	0xc6
+	.byte	0x80
+	.uleb128 0x1b
+	.4byte	.LASF1498
+	.byte	0x82
+	.2byte	0x1da
+	.4byte	0x5f9d
+	.byte	0xc0
+	.uleb128 0x1b
+	.4byte	.LASF1414
+	.byte	0x82
+	.2byte	0x1dd
+	.4byte	0x65fa
+	.byte	0xc0
+	.uleb128 0x1c
+	.4byte	.LASF171
+	.byte	0x82
+	.2byte	0x1e0
+	.4byte	0x29
+	.2byte	0x538
+	.uleb128 0x1c
+	.4byte	.LASF116
+	.byte	0x82
+	.2byte	0x1e3
+	.4byte	0xe65
+	.2byte	0x540
+	.uleb128 0x1c
+	.4byte	.LASF1500
+	.byte	0x82
+	.2byte	0x1e6
+	.4byte	0x5f9d
+	.2byte	0x580
+	.uleb128 0x1c
+	.4byte	.LASF1529
+	.byte	0x82
+	.2byte	0x1ed
+	.4byte	0x29
+	.2byte	0x580
+	.uleb128 0x1c
+	.4byte	.LASF1530
+	.byte	0x82
+	.2byte	0x1f1
+	.4byte	0x29
+	.2byte	0x588
+	.uleb128 0x1c
+	.4byte	.LASF1531
+	.byte	0x82
+	.2byte	0x1f3
+	.4byte	0x3f
+	.2byte	0x590
+	.uleb128 0x1c
+	.4byte	.LASF1532
+	.byte	0x82
+	.2byte	0x1fc
+	.4byte	0x6d
+	.2byte	0x5a0
+	.uleb128 0x1c
+	.4byte	.LASF1533
+	.byte	0x82
+	.2byte	0x1fd
+	.4byte	0x6d
+	.2byte	0x5a4
+	.uleb128 0x1c
+	.4byte	.LASF1534
+	.byte	0x82
+	.2byte	0x1fe
+	.4byte	0xc6
+	.2byte	0x5a8
+	.uleb128 0x1c
+	.4byte	.LASF1535
+	.byte	0x82
+	.2byte	0x203
+	.4byte	0x2b0
+	.2byte	0x5ac
+	.uleb128 0x1c
+	.4byte	.LASF1536
+	.byte	0x82
+	.2byte	0x206
+	.4byte	0x2b0
+	.2byte	0x5ad
+	.uleb128 0x1c
+	.4byte	.LASF1537
+	.byte	0x82
+	.2byte	0x208
+	.4byte	0x5f9d
+	.2byte	0x5c0
+	.uleb128 0x1c
+	.4byte	.LASF1502
+	.byte	0x82
+	.2byte	0x20a
+	.4byte	0x660a
+	.2byte	0x5c0
+	.uleb128 0x1c
+	.4byte	.LASF1538
+	.byte	0x82
+	.2byte	0x20b
+	.4byte	0x661a
+	.2byte	0x628
+	.uleb128 0x1c
+	.4byte	.LASF130
+	.byte	0x82
+	.2byte	0x20d
+	.4byte	0x15a
+	.2byte	0x628
+	.uleb128 0x1c
+	.4byte	.LASF131
+	.byte	0x82
+	.2byte	0x20e
+	.4byte	0x15a
+	.2byte	0x630
+	.uleb128 0x1c
+	.4byte	.LASF132
+	.byte	0x82
+	.2byte	0x20f
+	.4byte	0x15a
+	.2byte	0x638
+	.uleb128 0x1c
+	.4byte	.LASF133
+	.byte	0x82
+	.2byte	0x210
+	.4byte	0x15a
+	.2byte	0x640
+	.byte	0
+	.uleb128 0x5
+	.4byte	0x29
+	.4byte	0x65e4
+	.uleb128 0x6
+	.4byte	0x4f
+	.byte	0x2
+	.byte	0
+	.uleb128 0x5
+	.4byte	0x199
+	.4byte	0x65f4
+	.uleb128 0x6
+	.4byte	0x4f
+	.byte	0x2
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x635f
+	.uleb128 0x5
+	.4byte	0x5f68
+	.4byte	0x660a
+	.uleb128 0x6
+	.4byte	0x4f
+	.byte	0xa
+	.byte	0
+	.uleb128 0x5
+	.4byte	0x558
+	.4byte	0x661a
+	.uleb128 0x6
+	.4byte	0x4f
+	.byte	0xc
+	.byte	0
+	.uleb128 0x5
+	.4byte	0x558
+	.4byte	0x6629
+	.uleb128 0x41
+	.4byte	0x4f
+	.byte	0
+	.uleb128 0x1d
+	.4byte	.LASF1539
+	.byte	0x10
+	.byte	0x82
+	.2byte	0x25f
+	.4byte	0x6651
+	.uleb128 0x1b
+	.4byte	.LASF1516
+	.byte	0x82
+	.2byte	0x260
+	.4byte	0x6651
+	.byte	0
+	.uleb128 0x1b
+	.4byte	.LASF1540
+	.byte	0x82
+	.2byte	0x261
+	.4byte	0xc6
+	.byte	0x8
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x6406
+	.uleb128 0x1d
+	.4byte	.LASF1541
+	.byte	0x40
+	.byte	0x82
+	.2byte	0x272
+	.4byte	0x6672
+	.uleb128 0x1b
+	.4byte	.LASF1542
+	.byte	0x82
+	.2byte	0x273
+	.4byte	0x6672
+	.byte	0
+	.byte	0
+	.uleb128 0x5
+	.4byte	0x6629
+	.4byte	0x6682
+	.uleb128 0x6
+	.4byte	0x4f
+	.byte	0x3
+	.byte	0
+	.uleb128 0x15
+	.4byte	.LASF1543
+	.byte	0x82
+	.2byte	0x278
+	.4byte	0x339d
+	.uleb128 0x5
+	.4byte	0x6406
+	.4byte	0x669e
+	.uleb128 0x6
+	.4byte	0x4f
+	.byte	0x2
+	.byte	0
+	.uleb128 0x5
+	.4byte	0x6657
+	.4byte	0x66ae
+	.uleb128 0x6
+	.4byte	0x4f
+	.byte	0
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x63a4
+	.uleb128 0x5
+	.4byte	0x558
+	.4byte	0x66c4
+	.uleb128 0x6
+	.4byte	0x4f
+	.byte	0x20
+	.byte	0
+	.uleb128 0x8
+	.4byte	.LASF1544
+	.byte	0x20
+	.byte	0x33
+	.4byte	0x66cf
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x66d5
+	.uleb128 0x14
+	.4byte	0xc6
+	.4byte	0x66ee
+	.uleb128 0x11
+	.4byte	0x66ee
+	.uleb128 0x11
+	.4byte	0x29
+	.uleb128 0x11
+	.4byte	0x458
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x66f4
+	.uleb128 0xd
+	.4byte	.LASF1545
+	.byte	0x18
+	.byte	0x20
+	.byte	0x36
+	.4byte	0x6725
+	.uleb128 0xe
+	.4byte	.LASF1546
+	.byte	0x20
+	.byte	0x37
+	.4byte	0x66c4
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF64
+	.byte	0x20
+	.byte	0x38
+	.4byte	0x66ee
+	.byte	0x8
+	.uleb128 0xe
+	.4byte	.LASF1547
+	.byte	0x20
+	.byte	0x39
+	.4byte	0xc6
+	.byte	0x10
+	.byte	0
+	.uleb128 0xd
+	.4byte	.LASF1548
+	.byte	0x38
+	.byte	0x20
+	.byte	0x41
+	.4byte	0x674a
+	.uleb128 0xe
+	.4byte	.LASF1549
+	.byte	0x20
+	.byte	0x42
+	.4byte	0x4d5c
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF136
+	.byte	0x20
+	.byte	0x43
+	.4byte	0x66ee
+	.byte	0x30
+	.byte	0
+	.uleb128 0x19
+	.4byte	.LASF1550
+	.byte	0x20
+	.byte	0xee
+	.4byte	0x6725
+	.uleb128 0x15
+	.4byte	.LASF1551
+	.byte	0x82
+	.2byte	0x368
+	.4byte	0xc6
+	.uleb128 0x5
+	.4byte	0xc6
+	.4byte	0x6771
+	.uleb128 0x6
+	.4byte	0x4f
+	.byte	0x2
+	.byte	0
+	.uleb128 0x15
+	.4byte	.LASF1552
+	.byte	0x82
+	.2byte	0x394
+	.4byte	0x6761
+	.uleb128 0x15
+	.4byte	.LASF1553
+	.byte	0x82
+	.2byte	0x3a0
+	.4byte	0x500
+	.uleb128 0x15
+	.4byte	.LASF1554
+	.byte	0x82
+	.2byte	0x3a5
+	.4byte	0x618f
+	.uleb128 0x1d
+	.4byte	.LASF1555
+	.byte	0x10
+	.byte	0x82
+	.2byte	0x469
+	.4byte	0x67bd
+	.uleb128 0x1b
+	.4byte	.LASF1556
+	.byte	0x82
+	.2byte	0x476
+	.4byte	0x29
+	.byte	0
+	.uleb128 0x1b
+	.4byte	.LASF1557
+	.byte	0x82
+	.2byte	0x479
+	.4byte	0x67bd
+	.byte	0x8
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x29
+	.uleb128 0x15
+	.4byte	.LASF1555
+	.byte	0x82
+	.2byte	0x493
+	.4byte	0x67cf
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x67d5
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x6795
+	.uleb128 0x15
+	.4byte	.LASF1558
+	.byte	0x82
+	.2byte	0x4ea
+	.4byte	0xc6
+	.uleb128 0xd
+	.4byte	.LASF1559
+	.byte	0x28
+	.byte	0x83
+	.byte	0x7
+	.4byte	0x6848
+	.uleb128 0xe
+	.4byte	.LASF1560
+	.byte	0x83
+	.byte	0x8
+	.4byte	0xc6
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF1561
+	.byte	0x83
+	.byte	0x9
+	.4byte	0xc6
+	.byte	0x4
+	.uleb128 0xe
+	.4byte	.LASF1562
+	.byte	0x83
+	.byte	0xa
+	.4byte	0xc6
+	.byte	0x8
+	.uleb128 0xe
+	.4byte	.LASF1563
+	.byte	0x83
+	.byte	0xb
+	.4byte	0xc6
+	.byte	0xc
+	.uleb128 0xe
+	.4byte	.LASF1564
+	.byte	0x83
+	.byte	0xc
+	.4byte	0x15e8
+	.byte	0x10
+	.uleb128 0xe
+	.4byte	.LASF1565
+	.byte	0x83
+	.byte	0xd
+	.4byte	0x15e8
+	.byte	0x18
+	.uleb128 0xe
+	.4byte	.LASF1566
+	.byte	0x83
+	.byte	0xe
+	.4byte	0x15e8
+	.byte	0x20
+	.byte	0
+	.uleb128 0x5
+	.4byte	0x67e7
+	.4byte	0x6858
+	.uleb128 0x6
+	.4byte	0x4f
+	.byte	0x7
+	.byte	0
+	.uleb128 0x19
+	.4byte	.LASF1559
+	.byte	0x83
+	.byte	0x11
+	.4byte	0x6848
+	.uleb128 0x19
+	.4byte	.LASF1567
+	.byte	0x84
+	.byte	0x11
+	.4byte	0x29
+	.uleb128 0x19
+	.4byte	.LASF1568
+	.byte	0x84
+	.byte	0x1c
+	.4byte	0x29
+	.uleb128 0x19
+	.4byte	.LASF1569
+	.byte	0x84
+	.byte	0x24
+	.4byte	0x29
+	.uleb128 0x15
+	.4byte	.LASF1570
+	.byte	0x85
+	.2byte	0x259
+	.4byte	0x330
+	.uleb128 0xd
+	.4byte	.LASF1571
+	.byte	0x28
+	.byte	0x86
+	.byte	0x14
+	.4byte	0x68cd
+	.uleb128 0xe
+	.4byte	.LASF116
+	.byte	0x86
+	.byte	0x15
+	.4byte	0xe33
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF383
+	.byte	0x86
+	.byte	0x16
+	.4byte	0x14f
+	.byte	0x8
+	.uleb128 0xe
+	.4byte	.LASF932
+	.byte	0x86
+	.byte	0x18
+	.4byte	0x3a7
+	.byte	0x10
+	.uleb128 0xe
+	.4byte	.LASF1213
+	.byte	0x86
+	.byte	0x1a
+	.4byte	0x68cd
+	.byte	0x20
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x12f
+	.uleb128 0x19
+	.4byte	.LASF1572
+	.byte	0x86
+	.byte	0x1d
+	.4byte	0xc6
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x68e4
+	.uleb128 0x1d
+	.4byte	.LASF1573
+	.byte	0xd0
+	.byte	0x87
+	.2byte	0x126
+	.4byte	0x698e
+	.uleb128 0x1b
+	.4byte	.LASF1574
+	.byte	0x87
+	.2byte	0x127
+	.4byte	0x3eb
+	.byte	0
+	.uleb128 0x1b
+	.4byte	.LASF1575
+	.byte	0x87
+	.2byte	0x128
+	.4byte	0x3a7
+	.byte	0x10
+	.uleb128 0x1b
+	.4byte	.LASF1576
+	.byte	0x87
+	.2byte	0x129
+	.4byte	0x3a7
+	.byte	0x20
+	.uleb128 0x1b
+	.4byte	.LASF1577
+	.byte	0x87
+	.2byte	0x12a
+	.4byte	0x3a7
+	.byte	0x30
+	.uleb128 0x1b
+	.4byte	.LASF1578
+	.byte	0x87
+	.2byte	0x12b
+	.4byte	0x2464
+	.byte	0x40
+	.uleb128 0x1b
+	.4byte	.LASF1579
+	.byte	0x87
+	.2byte	0x12c
+	.4byte	0xe65
+	.byte	0x60
+	.uleb128 0x1b
+	.4byte	.LASF1580
+	.byte	0x87
+	.2byte	0x12d
+	.4byte	0x37c
+	.byte	0x64
+	.uleb128 0x1b
+	.4byte	.LASF1581
+	.byte	0x87
+	.2byte	0x12e
+	.4byte	0x20e7
+	.byte	0x68
+	.uleb128 0x1b
+	.4byte	.LASF1582
+	.byte	0x87
+	.2byte	0x12f
+	.4byte	0x6a11
+	.byte	0x70
+	.uleb128 0x1b
+	.4byte	.LASF1583
+	.byte	0x87
+	.2byte	0x130
+	.4byte	0x2d8
+	.byte	0x78
+	.uleb128 0x1b
+	.4byte	.LASF1584
+	.byte	0x87
+	.2byte	0x131
+	.4byte	0x29
+	.byte	0x80
+	.uleb128 0x1b
+	.4byte	.LASF1585
+	.byte	0x87
+	.2byte	0x132
+	.4byte	0x6a3b
+	.byte	0x88
+	.byte	0
+	.uleb128 0x8
+	.4byte	.LASF1586
+	.byte	0x88
+	.byte	0x14
+	.4byte	0x1bb
+	.uleb128 0xf
+	.byte	0x4
+	.byte	0x88
+	.byte	0x16
+	.4byte	0x69ae
+	.uleb128 0x20
+	.string	"val"
+	.byte	0x88
+	.byte	0x17
+	.4byte	0x698e
+	.byte	0
+	.byte	0
+	.uleb128 0x8
+	.4byte	.LASF1587
+	.byte	0x88
+	.byte	0x18
+	.4byte	0x6999
+	.uleb128 0x1f
+	.4byte	.LASF1588
+	.byte	0x4
+	.4byte	0x6d
+	.byte	0x87
+	.byte	0x36
+	.4byte	0x69dc
+	.uleb128 0xc
+	.4byte	.LASF1589
+	.byte	0
+	.uleb128 0xc
+	.4byte	.LASF1590
+	.byte	0x1
+	.uleb128 0xc
+	.4byte	.LASF1591
+	.byte	0x2
+	.byte	0
+	.uleb128 0x8
+	.4byte	.LASF1592
+	.byte	0x87
+	.byte	0x42
+	.4byte	0xed
+	.uleb128 0x21
+	.byte	0x4
+	.byte	0x87
+	.byte	0x45
+	.4byte	0x6a11
+	.uleb128 0x28
+	.string	"uid"
+	.byte	0x87
+	.byte	0x46
+	.4byte	0x240a
+	.uleb128 0x28
+	.string	"gid"
+	.byte	0x87
+	.byte	0x47
+	.4byte	0x242a
+	.uleb128 0x22
+	.4byte	.LASF1593
+	.byte	0x87
+	.byte	0x48
+	.4byte	0x69ae
+	.byte	0
+	.uleb128 0xd
+	.4byte	.LASF1594
+	.byte	0x8
+	.byte	0x87
+	.byte	0x44
+	.4byte	0x6a30
+	.uleb128 0x23
+	.4byte	0x69e7
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF193
+	.byte	0x87
+	.byte	0x4a
+	.4byte	0x69b9
+	.byte	0x4
+	.byte	0
+	.uleb128 0x19
+	.4byte	.LASF1595
+	.byte	0x87
+	.byte	0xc1
+	.4byte	0xe65
+	.uleb128 0xd
+	.4byte	.LASF1596
+	.byte	0x48
+	.byte	0x87
+	.byte	0xcd
+	.4byte	0x6ab4
+	.uleb128 0xe
+	.4byte	.LASF1597
+	.byte	0x87
+	.byte	0xce
+	.4byte	0x69dc
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF1598
+	.byte	0x87
+	.byte	0xcf
+	.4byte	0x69dc
+	.byte	0x8
+	.uleb128 0xe
+	.4byte	.LASF1599
+	.byte	0x87
+	.byte	0xd0
+	.4byte	0x69dc
+	.byte	0x10
+	.uleb128 0xe
+	.4byte	.LASF1600
+	.byte	0x87
+	.byte	0xd1
+	.4byte	0x69dc
+	.byte	0x18
+	.uleb128 0xe
+	.4byte	.LASF1601
+	.byte	0x87
+	.byte	0xd2
+	.4byte	0x69dc
+	.byte	0x20
+	.uleb128 0xe
+	.4byte	.LASF1602
+	.byte	0x87
+	.byte	0xd3
+	.4byte	0x69dc
+	.byte	0x28
+	.uleb128 0xe
+	.4byte	.LASF1603
+	.byte	0x87
+	.byte	0xd4
+	.4byte	0x69dc
+	.byte	0x30
+	.uleb128 0xe
+	.4byte	.LASF1604
+	.byte	0x87
+	.byte	0xd5
+	.4byte	0x9d2
+	.byte	0x38
+	.uleb128 0xe
+	.4byte	.LASF1605
+	.byte	0x87
+	.byte	0xd6
+	.4byte	0x9d2
+	.byte	0x40
+	.byte	0
+	.uleb128 0xd
+	.4byte	.LASF1606
+	.byte	0x48
+	.byte	0x87
+	.byte	0xde
+	.4byte	0x6b2d
+	.uleb128 0xe
+	.4byte	.LASF1607
+	.byte	0x87
+	.byte	0xdf
+	.4byte	0x6b6f
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF1608
+	.byte	0x87
+	.byte	0xe0
+	.4byte	0xc6
+	.byte	0x8
+	.uleb128 0xe
+	.4byte	.LASF1609
+	.byte	0x87
+	.byte	0xe2
+	.4byte	0x3a7
+	.byte	0x10
+	.uleb128 0xe
+	.4byte	.LASF1610
+	.byte	0x87
+	.byte	0xe3
+	.4byte	0x29
+	.byte	0x20
+	.uleb128 0xe
+	.4byte	.LASF1611
+	.byte	0x87
+	.byte	0xe4
+	.4byte	0x6d
+	.byte	0x28
+	.uleb128 0xe
+	.4byte	.LASF1612
+	.byte	0x87
+	.byte	0xe5
+	.4byte	0x6d
+	.byte	0x2c
+	.uleb128 0xe
+	.4byte	.LASF1613
+	.byte	0x87
+	.byte	0xe6
+	.4byte	0x69dc
+	.byte	0x30
+	.uleb128 0xe
+	.4byte	.LASF1614
+	.byte	0x87
+	.byte	0xe7
+	.4byte	0x69dc
+	.byte	0x38
+	.uleb128 0xe
+	.4byte	.LASF1615
+	.byte	0x87
+	.byte	0xe8
+	.4byte	0x458
+	.byte	0x40
+	.byte	0
+	.uleb128 0x1d
+	.4byte	.LASF1616
+	.byte	0x20
+	.byte	0x87
+	.2byte	0x1c4
+	.4byte	0x6b6f
+	.uleb128 0x1b
+	.4byte	.LASF1617
+	.byte	0x87
+	.2byte	0x1c5
+	.4byte	0xc6
+	.byte	0
+	.uleb128 0x1b
+	.4byte	.LASF1618
+	.byte	0x87
+	.2byte	0x1c6
+	.4byte	0x7179
+	.byte	0x8
+	.uleb128 0x1b
+	.4byte	.LASF1619
+	.byte	0x87
+	.2byte	0x1c7
+	.4byte	0x74a1
+	.byte	0x10
+	.uleb128 0x1b
+	.4byte	.LASF1620
+	.byte	0x87
+	.2byte	0x1c8
+	.4byte	0x6b6f
+	.byte	0x18
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x6b2d
+	.uleb128 0x1a
+	.4byte	.LASF1621
+	.2byte	0x180
+	.byte	0x87
+	.2byte	0x109
+	.4byte	0x6b9e
+	.uleb128 0x1b
+	.4byte	.LASF1622
+	.byte	0x87
+	.2byte	0x10a
+	.4byte	0x2f4b
+	.byte	0
+	.uleb128 0x1b
+	.4byte	.LASF59
+	.byte	0x87
+	.2byte	0x10b
+	.4byte	0x6b9e
+	.byte	0x40
+	.byte	0
+	.uleb128 0x5
+	.4byte	0x6890
+	.4byte	0x6bae
+	.uleb128 0x6
+	.4byte	0x4f
+	.byte	0x7
+	.byte	0
+	.uleb128 0x15
+	.4byte	.LASF1621
+	.byte	0x87
+	.2byte	0x10e
+	.4byte	0x6b75
+	.uleb128 0x1d
+	.4byte	.LASF1623
+	.byte	0x50
+	.byte	0x87
+	.2byte	0x136
+	.4byte	0x6c4a
+	.uleb128 0x1b
+	.4byte	.LASF1624
+	.byte	0x87
+	.2byte	0x137
+	.4byte	0x6c63
+	.byte	0
+	.uleb128 0x1b
+	.4byte	.LASF1625
+	.byte	0x87
+	.2byte	0x138
+	.4byte	0x6c63
+	.byte	0x8
+	.uleb128 0x1b
+	.4byte	.LASF1626
+	.byte	0x87
+	.2byte	0x139
+	.4byte	0x6c63
+	.byte	0x10
+	.uleb128 0x1b
+	.4byte	.LASF1627
+	.byte	0x87
+	.2byte	0x13a
+	.4byte	0x6c63
+	.byte	0x18
+	.uleb128 0x1b
+	.4byte	.LASF1628
+	.byte	0x87
+	.2byte	0x13b
+	.4byte	0x6c78
+	.byte	0x20
+	.uleb128 0x1b
+	.4byte	.LASF1629
+	.byte	0x87
+	.2byte	0x13c
+	.4byte	0x6c78
+	.byte	0x28
+	.uleb128 0x1b
+	.4byte	.LASF1630
+	.byte	0x87
+	.2byte	0x13d
+	.4byte	0x6c78
+	.byte	0x30
+	.uleb128 0x1b
+	.4byte	.LASF1631
+	.byte	0x87
+	.2byte	0x13e
+	.4byte	0x6c98
+	.byte	0x38
+	.uleb128 0x1b
+	.4byte	.LASF130
+	.byte	0x87
+	.2byte	0x140
+	.4byte	0x15a
+	.byte	0x40
+	.uleb128 0x1b
+	.4byte	.LASF131
+	.byte	0x87
+	.2byte	0x141
+	.4byte	0x15a
+	.byte	0x48
+	.byte	0
+	.uleb128 0x3
+	.4byte	0x6bba
+	.uleb128 0x14
+	.4byte	0xc6
+	.4byte	0x6c63
+	.uleb128 0x11
+	.4byte	0x20e7
+	.uleb128 0x11
+	.4byte	0xc6
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x6c4f
+	.uleb128 0x14
+	.4byte	0xc6
+	.4byte	0x6c78
+	.uleb128 0x11
+	.4byte	0x68de
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x6c69
+	.uleb128 0x14
+	.4byte	0xc6
+	.4byte	0x6c92
+	.uleb128 0x11
+	.4byte	0x20e7
+	.uleb128 0x11
+	.4byte	0x6c92
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x6a11
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x6c7e
+	.uleb128 0x1d
+	.4byte	.LASF1632
+	.byte	0x68
+	.byte	0x87
+	.2byte	0x145
+	.4byte	0x6d55
+	.uleb128 0x1b
+	.4byte	.LASF1633
+	.byte	0x87
+	.2byte	0x146
+	.4byte	0x6c78
+	.byte	0
+	.uleb128 0x1b
+	.4byte	.LASF1634
+	.byte	0x87
+	.2byte	0x147
+	.4byte	0x6d6e
+	.byte	0x8
+	.uleb128 0x1b
+	.4byte	.LASF1635
+	.byte	0x87
+	.2byte	0x148
+	.4byte	0x6d7f
+	.byte	0x10
+	.uleb128 0x1b
+	.4byte	.LASF1636
+	.byte	0x87
+	.2byte	0x149
+	.4byte	0x6c78
+	.byte	0x18
+	.uleb128 0x1b
+	.4byte	.LASF1637
+	.byte	0x87
+	.2byte	0x14a
+	.4byte	0x6c78
+	.byte	0x20
+	.uleb128 0x1b
+	.4byte	.LASF1638
+	.byte	0x87
+	.2byte	0x14b
+	.4byte	0x6c78
+	.byte	0x28
+	.uleb128 0x1b
+	.4byte	.LASF1639
+	.byte	0x87
+	.2byte	0x14c
+	.4byte	0x6c63
+	.byte	0x30
+	.uleb128 0x1b
+	.4byte	.LASF1640
+	.byte	0x87
+	.2byte	0x14f
+	.4byte	0x6d9a
+	.byte	0x38
+	.uleb128 0x1b
+	.4byte	.LASF1641
+	.byte	0x87
+	.2byte	0x150
+	.4byte	0x6dba
+	.byte	0x40
+	.uleb128 0x1b
+	.4byte	.LASF1642
+	.byte	0x87
+	.2byte	0x152
+	.4byte	0x6dd4
+	.byte	0x48
+	.uleb128 0x1b
+	.4byte	.LASF1631
+	.byte	0x87
+	.2byte	0x154
+	.4byte	0x6c98
+	.byte	0x50
+	.uleb128 0x1b
+	.4byte	.LASF130
+	.byte	0x87
+	.2byte	0x156
+	.4byte	0x15a
+	.byte	0x58
+	.uleb128 0x1b
+	.4byte	.LASF131
+	.byte	0x87
+	.2byte	0x157
+	.4byte	0x15a
+	.byte	0x60
+	.byte	0
+	.uleb128 0x3
+	.4byte	0x6c9e
+	.uleb128 0x14
+	.4byte	0x68de
+	.4byte	0x6d6e
+	.uleb128 0x11
+	.4byte	0x20e7
+	.uleb128 0x11
+	.4byte	0xc6
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x6d5a
+	.uleb128 0x10
+	.4byte	0x6d7f
+	.uleb128 0x11
+	.4byte	0x68de
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x6d74
+	.uleb128 0x14
+	.4byte	0x6d94
+	.4byte	0x6d94
+	.uleb128 0x11
+	.4byte	0x1c7f
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x69dc
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x6d85
+	.uleb128 0x14
+	.4byte	0xc6
+	.4byte	0x6db4
+	.uleb128 0x11
+	.4byte	0x1c7f
+	.uleb128 0x11
+	.4byte	0x6db4
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x69ae
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x6da0
+	.uleb128 0x14
+	.4byte	0xc6
+	.4byte	0x6dd4
+	.uleb128 0x11
+	.4byte	0x1c7f
+	.uleb128 0x11
+	.4byte	0x6d94
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x6dc0
+	.uleb128 0x1d
+	.4byte	.LASF1643
+	.byte	0x78
+	.byte	0x87
+	.2byte	0x15d
+	.4byte	0x6eb8
+	.uleb128 0x1b
+	.4byte	.LASF1644
+	.byte	0x87
+	.2byte	0x15e
+	.4byte	0xc6
+	.byte	0
+	.uleb128 0x1b
+	.4byte	.LASF1645
+	.byte	0x87
+	.2byte	0x15f
+	.4byte	0x15a
+	.byte	0x8
+	.uleb128 0x1b
+	.4byte	.LASF1646
+	.byte	0x87
+	.2byte	0x160
+	.4byte	0x15a
+	.byte	0x10
+	.uleb128 0x1b
+	.4byte	.LASF1647
+	.byte	0x87
+	.2byte	0x161
+	.4byte	0x15a
+	.byte	0x18
+	.uleb128 0x1b
+	.4byte	.LASF1648
+	.byte	0x87
+	.2byte	0x162
+	.4byte	0x15a
+	.byte	0x20
+	.uleb128 0x1b
+	.4byte	.LASF1649
+	.byte	0x87
+	.2byte	0x163
+	.4byte	0x15a
+	.byte	0x28
+	.uleb128 0x1b
+	.4byte	.LASF1650
+	.byte	0x87
+	.2byte	0x164
+	.4byte	0x15a
+	.byte	0x30
+	.uleb128 0x1b
+	.4byte	.LASF1651
+	.byte	0x87
+	.2byte	0x165
+	.4byte	0x14f
+	.byte	0x38
+	.uleb128 0x1b
+	.4byte	.LASF1652
+	.byte	0x87
+	.2byte	0x167
+	.4byte	0x14f
+	.byte	0x40
+	.uleb128 0x1b
+	.4byte	.LASF1653
+	.byte	0x87
+	.2byte	0x168
+	.4byte	0xc6
+	.byte	0x48
+	.uleb128 0x1b
+	.4byte	.LASF1654
+	.byte	0x87
+	.2byte	0x169
+	.4byte	0xc6
+	.byte	0x4c
+	.uleb128 0x1b
+	.4byte	.LASF1655
+	.byte	0x87
+	.2byte	0x16a
+	.4byte	0x15a
+	.byte	0x50
+	.uleb128 0x1b
+	.4byte	.LASF1656
+	.byte	0x87
+	.2byte	0x16b
+	.4byte	0x15a
+	.byte	0x58
+	.uleb128 0x1b
+	.4byte	.LASF1657
+	.byte	0x87
+	.2byte	0x16c
+	.4byte	0x15a
+	.byte	0x60
+	.uleb128 0x1b
+	.4byte	.LASF1658
+	.byte	0x87
+	.2byte	0x16d
+	.4byte	0x14f
+	.byte	0x68
+	.uleb128 0x1b
+	.4byte	.LASF1659
+	.byte	0x87
+	.2byte	0x16e
+	.4byte	0xc6
+	.byte	0x70
+	.byte	0
+	.uleb128 0x1d
+	.4byte	.LASF1660
+	.byte	0x38
+	.byte	0x87
+	.2byte	0x191
+	.4byte	0x6f48
+	.uleb128 0x1b
+	.4byte	.LASF171
+	.byte	0x87
+	.2byte	0x192
+	.4byte	0x6d
+	.byte	0
+	.uleb128 0x1b
+	.4byte	.LASF1661
+	.byte	0x87
+	.2byte	0x193
+	.4byte	0x6d
+	.byte	0x4
+	.uleb128 0x1b
+	.4byte	.LASF1662
+	.byte	0x87
+	.2byte	0x195
+	.4byte	0x6d
+	.byte	0x8
+	.uleb128 0x1b
+	.4byte	.LASF1663
+	.byte	0x87
+	.2byte	0x196
+	.4byte	0x6d
+	.byte	0xc
+	.uleb128 0x1b
+	.4byte	.LASF1664
+	.byte	0x87
+	.2byte	0x197
+	.4byte	0x6d
+	.byte	0x10
+	.uleb128 0x1b
+	.4byte	.LASF1665
+	.byte	0x87
+	.2byte	0x198
+	.4byte	0x6d
+	.byte	0x14
+	.uleb128 0x1b
+	.4byte	.LASF1666
+	.byte	0x87
+	.2byte	0x199
+	.4byte	0x6d
+	.byte	0x18
+	.uleb128 0x2b
+	.string	"ino"
+	.byte	0x87
+	.2byte	0x19a
+	.4byte	0xff
+	.byte	0x20
+	.uleb128 0x1b
+	.4byte	.LASF1137
+	.byte	0x87
+	.2byte	0x19b
+	.4byte	0x31a
+	.byte	0x28
+	.uleb128 0x1b
+	.4byte	.LASF1667
+	.byte	0x87
+	.2byte	0x19c
+	.4byte	0x31a
+	.byte	0x30
+	.byte	0
+	.uleb128 0x1d
+	.4byte	.LASF1668
+	.byte	0xb0
+	.byte	0x87
+	.2byte	0x19f
+	.4byte	0x6f70
+	.uleb128 0x1b
+	.4byte	.LASF1669
+	.byte	0x87
+	.2byte	0x1a0
+	.4byte	0x6d
+	.byte	0
+	.uleb128 0x1b
+	.4byte	.LASF1670
+	.byte	0x87
+	.2byte	0x1a1
+	.4byte	0x6f70
+	.byte	0x8
+	.byte	0
+	.uleb128 0x5
+	.4byte	0x6eb8
+	.4byte	0x6f80
+	.uleb128 0x6
+	.4byte	0x4f
+	.byte	0x2
+	.byte	0
+	.uleb128 0x1d
+	.4byte	.LASF1671
+	.byte	0x20
+	.byte	0x87
+	.2byte	0x1a5
+	.4byte	0x6ff6
+	.uleb128 0x1b
+	.4byte	.LASF1672
+	.byte	0x87
+	.2byte	0x1a6
+	.4byte	0xc6
+	.byte	0
+	.uleb128 0x1b
+	.4byte	.LASF423
+	.byte	0x87
+	.2byte	0x1a7
+	.4byte	0x6d
+	.byte	0x4
+	.uleb128 0x1b
+	.4byte	.LASF1673
+	.byte	0x87
+	.2byte	0x1a8
+	.4byte	0x6d
+	.byte	0x8
+	.uleb128 0x1b
+	.4byte	.LASF1674
+	.byte	0x87
+	.2byte	0x1aa
+	.4byte	0x6d
+	.byte	0xc
+	.uleb128 0x1b
+	.4byte	.LASF1675
+	.byte	0x87
+	.2byte	0x1ab
+	.4byte	0x6d
+	.byte	0x10
+	.uleb128 0x1b
+	.4byte	.LASF1676
+	.byte	0x87
+	.2byte	0x1ac
+	.4byte	0x6d
+	.byte	0x14
+	.uleb128 0x1b
+	.4byte	.LASF1677
+	.byte	0x87
+	.2byte	0x1ad
+	.4byte	0x6d
+	.byte	0x18
+	.uleb128 0x1b
+	.4byte	.LASF1678
+	.byte	0x87
+	.2byte	0x1ae
+	.4byte	0x6d
+	.byte	0x1c
+	.byte	0
+	.uleb128 0x1d
+	.4byte	.LASF1679
+	.byte	0x68
+	.byte	0x87
+	.2byte	0x1b2
+	.4byte	0x70ad
+	.uleb128 0x1b
+	.4byte	.LASF1680
+	.byte	0x87
+	.2byte	0x1b3
+	.4byte	0x70d0
+	.byte	0
+	.uleb128 0x1b
+	.4byte	.LASF1681
+	.byte	0x87
+	.2byte	0x1b4
+	.4byte	0x6c63
+	.byte	0x8
+	.uleb128 0x1b
+	.4byte	.LASF1682
+	.byte	0x87
+	.2byte	0x1b5
+	.4byte	0x70ea
+	.byte	0x10
+	.uleb128 0x1b
+	.4byte	.LASF1683
+	.byte	0x87
+	.2byte	0x1b6
+	.4byte	0x70ea
+	.byte	0x18
+	.uleb128 0x1b
+	.4byte	.LASF1684
+	.byte	0x87
+	.2byte	0x1b7
+	.4byte	0x6c63
+	.byte	0x20
+	.uleb128 0x1b
+	.4byte	.LASF1685
+	.byte	0x87
+	.2byte	0x1b8
+	.4byte	0x710f
+	.byte	0x28
+	.uleb128 0x1b
+	.4byte	.LASF1686
+	.byte	0x87
+	.2byte	0x1b9
+	.4byte	0x7134
+	.byte	0x30
+	.uleb128 0x1b
+	.4byte	.LASF1687
+	.byte	0x87
+	.2byte	0x1ba
+	.4byte	0x7153
+	.byte	0x38
+	.uleb128 0x1b
+	.4byte	.LASF1688
+	.byte	0x87
+	.2byte	0x1bc
+	.4byte	0x7134
+	.byte	0x40
+	.uleb128 0x1b
+	.4byte	.LASF1689
+	.byte	0x87
+	.2byte	0x1bd
+	.4byte	0x7173
+	.byte	0x48
+	.uleb128 0x1b
+	.4byte	.LASF1690
+	.byte	0x87
+	.2byte	0x1be
+	.4byte	0x70ea
+	.byte	0x50
+	.uleb128 0x1b
+	.4byte	.LASF130
+	.byte	0x87
+	.2byte	0x1c0
+	.4byte	0x15a
+	.byte	0x58
+	.uleb128 0x1b
+	.4byte	.LASF131
+	.byte	0x87
+	.2byte	0x1c1
+	.4byte	0x15a
+	.byte	0x60
+	.byte	0
+	.uleb128 0x3
+	.4byte	0x6ff6
+	.uleb128 0x14
+	.4byte	0xc6
+	.4byte	0x70d0
+	.uleb128 0x11
+	.4byte	0x20e7
+	.uleb128 0x11
+	.4byte	0xc6
+	.uleb128 0x11
+	.4byte	0xc6
+	.uleb128 0x11
+	.4byte	0x2112
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x70b2
+	.uleb128 0x14
+	.4byte	0xc6
+	.4byte	0x70ea
+	.uleb128 0x11
+	.4byte	0x20e7
+	.uleb128 0x11
+	.4byte	0x6d
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x70d6
+	.uleb128 0x14
+	.4byte	0xc6
+	.4byte	0x7109
+	.uleb128 0x11
+	.4byte	0x20e7
+	.uleb128 0x11
+	.4byte	0xc6
+	.uleb128 0x11
+	.4byte	0x7109
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x6f80
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x70f0
+	.uleb128 0x14
+	.4byte	0xc6
+	.4byte	0x712e
+	.uleb128 0x11
+	.4byte	0x20e7
+	.uleb128 0x11
+	.4byte	0x6a11
+	.uleb128 0x11
+	.4byte	0x712e
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x6dda
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x7115
+	.uleb128 0x14
+	.4byte	0xc6
+	.4byte	0x7153
+	.uleb128 0x11
+	.4byte	0x20e7
+	.uleb128 0x11
+	.4byte	0x6c92
+	.uleb128 0x11
+	.4byte	0x712e
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x713a
+	.uleb128 0x14
+	.4byte	0xc6
+	.4byte	0x716d
+	.uleb128 0x11
+	.4byte	0x20e7
+	.uleb128 0x11
+	.4byte	0x716d
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x6f48
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x7159
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x6c4a
+	.uleb128 0x1a
+	.4byte	.LASF163
+	.2byte	0x380
+	.byte	0x89
+	.2byte	0x14c
+	.4byte	0x74a1
+	.uleb128 0x1b
+	.4byte	.LASF577
+	.byte	0x89
+	.2byte	0x14d
+	.4byte	0xd321
+	.byte	0
+	.uleb128 0x1b
+	.4byte	.LASF932
+	.byte	0x89
+	.2byte	0x150
+	.4byte	0x3a7
+	.byte	0x8
+	.uleb128 0x1b
+	.4byte	.LASF265
+	.byte	0x89
+	.2byte	0x153
+	.4byte	0xd1c7
+	.byte	0x18
+	.uleb128 0x1b
+	.4byte	.LASF1691
+	.byte	0x89
+	.2byte	0x156
+	.4byte	0xd1d7
+	.byte	0x50
+	.uleb128 0x1b
+	.4byte	.LASF1692
+	.byte	0x89
+	.2byte	0x157
+	.4byte	0xd298
+	.byte	0xd0
+	.uleb128 0x1b
+	.4byte	.LASF1693
+	.byte	0x89
+	.2byte	0x158
+	.4byte	0x56
+	.byte	0xd8
+	.uleb128 0x1b
+	.4byte	.LASF1694
+	.byte	0x89
+	.2byte	0x159
+	.4byte	0x56
+	.byte	0xe0
+	.uleb128 0x1b
+	.4byte	.LASF1695
+	.byte	0x89
+	.2byte	0x15a
+	.4byte	0x9114
+	.byte	0xe8
+	.uleb128 0x1b
+	.4byte	.LASF1696
+	.byte	0x89
+	.2byte	0x15d
+	.4byte	0xd40a
+	.byte	0xf0
+	.uleb128 0x1b
+	.4byte	.LASF1697
+	.byte	0x89
+	.2byte	0x15e
+	.4byte	0xd410
+	.byte	0xf8
+	.uleb128 0x1c
+	.4byte	.LASF1698
+	.byte	0x89
+	.2byte	0x15f
+	.4byte	0x6d
+	.2byte	0x100
+	.uleb128 0x1c
+	.4byte	.LASF1699
+	.byte	0x89
+	.2byte	0x167
+	.4byte	0x2464
+	.2byte	0x108
+	.uleb128 0x30
+	.string	"kp"
+	.byte	0x89
+	.2byte	0x169
+	.4byte	0xd416
+	.2byte	0x128
+	.uleb128 0x1c
+	.4byte	.LASF1700
+	.byte	0x89
+	.2byte	0x16a
+	.4byte	0x6d
+	.2byte	0x130
+	.uleb128 0x1c
+	.4byte	.LASF1701
+	.byte	0x89
+	.2byte	0x16d
+	.4byte	0x6d
+	.2byte	0x134
+	.uleb128 0x1c
+	.4byte	.LASF1702
+	.byte	0x89
+	.2byte	0x16e
+	.4byte	0xd40a
+	.2byte	0x138
+	.uleb128 0x1c
+	.4byte	.LASF1703
+	.byte	0x89
+	.2byte	0x16f
+	.4byte	0xd410
+	.2byte	0x140
+	.uleb128 0x1c
+	.4byte	.LASF1704
+	.byte	0x89
+	.2byte	0x182
+	.4byte	0x2b0
+	.2byte	0x148
+	.uleb128 0x1c
+	.4byte	.LASF1705
+	.byte	0x89
+	.2byte	0x184
+	.4byte	0x2b0
+	.2byte	0x149
+	.uleb128 0x1c
+	.4byte	.LASF1706
+	.byte	0x89
+	.2byte	0x187
+	.4byte	0xd40a
+	.2byte	0x150
+	.uleb128 0x1c
+	.4byte	.LASF1707
+	.byte	0x89
+	.2byte	0x188
+	.4byte	0xd410
+	.2byte	0x158
+	.uleb128 0x1c
+	.4byte	.LASF1708
+	.byte	0x89
+	.2byte	0x189
+	.4byte	0x6d
+	.2byte	0x160
+	.uleb128 0x1c
+	.4byte	.LASF1709
+	.byte	0x89
+	.2byte	0x18c
+	.4byte	0x6d
+	.2byte	0x164
+	.uleb128 0x1c
+	.4byte	.LASF1710
+	.byte	0x89
+	.2byte	0x18d
+	.4byte	0xd441
+	.2byte	0x168
+	.uleb128 0x1c
+	.4byte	.LASF1711
+	.byte	0x89
+	.2byte	0x190
+	.4byte	0x4a1
+	.2byte	0x170
+	.uleb128 0x1c
+	.4byte	.LASF1712
+	.byte	0x89
+	.2byte	0x193
+	.4byte	0xd373
+	.2byte	0x180
+	.uleb128 0x1c
+	.4byte	.LASF1713
+	.byte	0x89
+	.2byte	0x194
+	.4byte	0xd373
+	.2byte	0x1d0
+	.uleb128 0x1c
+	.4byte	.LASF1714
+	.byte	0x89
+	.2byte	0x197
+	.4byte	0xd149
+	.2byte	0x220
+	.uleb128 0x1c
+	.4byte	.LASF1715
+	.byte	0x89
+	.2byte	0x199
+	.4byte	0x29
+	.2byte	0x248
+	.uleb128 0x1c
+	.4byte	.LASF1716
+	.byte	0x89
+	.2byte	0x19d
+	.4byte	0x6d
+	.2byte	0x250
+	.uleb128 0x1c
+	.4byte	.LASF1717
+	.byte	0x89
+	.2byte	0x19e
+	.4byte	0x3a7
+	.2byte	0x258
+	.uleb128 0x1c
+	.4byte	.LASF1718
+	.byte	0x89
+	.2byte	0x19f
+	.4byte	0xd447
+	.2byte	0x268
+	.uleb128 0x1c
+	.4byte	.LASF1719
+	.byte	0x89
+	.2byte	0x1a4
+	.4byte	0xd44d
+	.2byte	0x270
+	.uleb128 0x1c
+	.4byte	.LASF1720
+	.byte	0x89
+	.2byte	0x1a5
+	.4byte	0xd3cf
+	.2byte	0x278
+	.uleb128 0x1c
+	.4byte	.LASF1721
+	.byte	0x89
+	.2byte	0x1a8
+	.4byte	0xd458
+	.2byte	0x290
+	.uleb128 0x1c
+	.4byte	.LASF1722
+	.byte	0x89
+	.2byte	0x1ab
+	.4byte	0xd463
+	.2byte	0x298
+	.uleb128 0x1c
+	.4byte	.LASF1723
+	.byte	0x89
+	.2byte	0x1b0
+	.4byte	0x21e
+	.2byte	0x2a0
+	.uleb128 0x1c
+	.4byte	.LASF1724
+	.byte	0x89
+	.2byte	0x1b4
+	.4byte	0x458
+	.2byte	0x2a8
+	.uleb128 0x1c
+	.4byte	.LASF1725
+	.byte	0x89
+	.2byte	0x1b5
+	.4byte	0x6d
+	.2byte	0x2b0
+	.uleb128 0x1c
+	.4byte	.LASF1726
+	.byte	0x89
+	.2byte	0x1b9
+	.4byte	0x6d
+	.2byte	0x2b4
+	.uleb128 0x1c
+	.4byte	.LASF1727
+	.byte	0x89
+	.2byte	0x1ba
+	.4byte	0xd469
+	.2byte	0x2b8
+	.uleb128 0x1c
+	.4byte	.LASF1728
+	.byte	0x89
+	.2byte	0x1bd
+	.4byte	0xef6
+	.2byte	0x2c0
+	.uleb128 0x1c
+	.4byte	.LASF1729
+	.byte	0x89
+	.2byte	0x1be
+	.4byte	0x6d
+	.2byte	0x2c8
+	.uleb128 0x1c
+	.4byte	.LASF1730
+	.byte	0x89
+	.2byte	0x1c1
+	.4byte	0x6d
+	.2byte	0x2cc
+	.uleb128 0x1c
+	.4byte	.LASF1731
+	.byte	0x89
+	.2byte	0x1c2
+	.4byte	0xbabd
+	.2byte	0x2d0
+	.uleb128 0x1c
+	.4byte	.LASF1732
+	.byte	0x89
+	.2byte	0x1c5
+	.4byte	0xd474
+	.2byte	0x2d8
+	.uleb128 0x1c
+	.4byte	.LASF1733
+	.byte	0x89
+	.2byte	0x1c6
+	.4byte	0x6d
+	.2byte	0x2e0
+	.uleb128 0x1c
+	.4byte	.LASF1734
+	.byte	0x89
+	.2byte	0x1c7
+	.4byte	0xd485
+	.2byte	0x2e8
+	.uleb128 0x1c
+	.4byte	.LASF1735
+	.byte	0x89
+	.2byte	0x1c8
+	.4byte	0x6d
+	.2byte	0x2f0
+	.uleb128 0x1c
+	.4byte	.LASF1736
+	.byte	0x89
+	.2byte	0x1d9
+	.4byte	0x3a7
+	.2byte	0x2f8
+	.uleb128 0x1c
+	.4byte	.LASF1737
+	.byte	0x89
+	.2byte	0x1db
+	.4byte	0x3a7
+	.2byte	0x308
+	.uleb128 0x1c
+	.4byte	.LASF1738
+	.byte	0x89
+	.2byte	0x1de
+	.4byte	0x4b7
+	.2byte	0x318
+	.uleb128 0x1c
+	.4byte	.LASF1739
+	.byte	0x89
+	.2byte	0x1e0
+	.4byte	0x37c
+	.2byte	0x320
+	.uleb128 0x1c
+	.4byte	.LASF130
+	.byte	0x89
+	.2byte	0x1ed
+	.4byte	0x15a
+	.2byte	0x328
+	.uleb128 0x1c
+	.4byte	.LASF131
+	.byte	0x89
+	.2byte	0x1ee
+	.4byte	0x15a
+	.2byte	0x330
+	.uleb128 0x1c
+	.4byte	.LASF132
+	.byte	0x89
+	.2byte	0x1ef
+	.4byte	0x15a
+	.2byte	0x338
+	.uleb128 0x1c
+	.4byte	.LASF133
+	.byte	0x89
+	.2byte	0x1f0
+	.4byte	0x15a
+	.2byte	0x340
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x717f
+	.uleb128 0x1a
+	.4byte	.LASF1740
+	.2byte	0x140
+	.byte	0x87
+	.2byte	0x20f
+	.4byte	0x74f8
+	.uleb128 0x1b
+	.4byte	.LASF171
+	.byte	0x87
+	.2byte	0x210
+	.4byte	0x6d
+	.byte	0
+	.uleb128 0x1b
+	.4byte	.LASF1741
+	.byte	0x87
+	.2byte	0x211
+	.4byte	0x4d5c
+	.byte	0x8
+	.uleb128 0x1b
+	.4byte	.LASF673
+	.byte	0x87
+	.2byte	0x212
+	.4byte	0x74f8
+	.byte	0x38
+	.uleb128 0x1b
+	.4byte	.LASF1742
+	.byte	0x87
+	.2byte	0x213
+	.4byte	0x7508
+	.byte	0x50
+	.uleb128 0x30
+	.string	"ops"
+	.byte	0x87
+	.2byte	0x214
+	.4byte	0x7518
+	.2byte	0x128
+	.byte	0
+	.uleb128 0x5
+	.4byte	0x1c7f
+	.4byte	0x7508
+	.uleb128 0x6
+	.4byte	0x4f
+	.byte	0x2
+	.byte	0
+	.uleb128 0x5
+	.4byte	0x6ab4
+	.4byte	0x7518
+	.uleb128 0x6
+	.4byte	0x4f
+	.byte	0x2
+	.byte	0
+	.uleb128 0x5
+	.4byte	0x7179
+	.4byte	0x7528
+	.uleb128 0x6
+	.4byte	0x4f
+	.byte	0x2
+	.byte	0
+	.uleb128 0x1e
+	.4byte	.LASF1743
+	.byte	0x4
+	.4byte	0x6d
+	.byte	0x1e
+	.2byte	0x125
+	.4byte	0x755e
+	.uleb128 0xc
+	.4byte	.LASF1744
+	.byte	0
+	.uleb128 0xc
+	.4byte	.LASF1745
+	.byte	0x1
+	.uleb128 0xc
+	.4byte	.LASF1746
+	.byte	0x2
+	.uleb128 0xc
+	.4byte	.LASF1747
+	.byte	0x3
+	.uleb128 0xc
+	.4byte	.LASF1748
+	.byte	0x4
+	.uleb128 0xc
+	.4byte	.LASF1749
+	.byte	0x5
+	.byte	0
+	.uleb128 0x10
+	.4byte	0x7573
+	.uleb128 0x11
+	.4byte	0x5e55
+	.uleb128 0x11
+	.4byte	0x199
+	.uleb128 0x11
+	.4byte	0x199
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x755e
+	.uleb128 0x1d
+	.4byte	.LASF1750
+	.byte	0xc8
+	.byte	0x1e
+	.2byte	0x162
+	.4byte	0x76cc
+	.uleb128 0x1b
+	.4byte	.LASF1751
+	.byte	0x1e
+	.2byte	0x163
+	.4byte	0x76f0
+	.byte	0
+	.uleb128 0x1b
+	.4byte	.LASF1752
+	.byte	0x1e
+	.2byte	0x164
+	.4byte	0x770a
+	.byte	0x8
+	.uleb128 0x1b
+	.4byte	.LASF1753
+	.byte	0x1e
+	.2byte	0x167
+	.4byte	0x7724
+	.byte	0x10
+	.uleb128 0x1b
+	.4byte	.LASF1754
+	.byte	0x1e
+	.2byte	0x16a
+	.4byte	0x7739
+	.byte	0x18
+	.uleb128 0x1b
+	.4byte	.LASF1755
+	.byte	0x1e
+	.2byte	0x170
+	.4byte	0x775d
+	.byte	0x20
+	.uleb128 0x1b
+	.4byte	.LASF1756
+	.byte	0x1e
+	.2byte	0x173
+	.4byte	0x7796
+	.byte	0x28
+	.uleb128 0x1b
+	.4byte	.LASF1757
+	.byte	0x1e
+	.2byte	0x176
+	.4byte	0x77c9
+	.byte	0x30
+	.uleb128 0x1b
+	.4byte	.LASF1758
+	.byte	0x1e
+	.2byte	0x17b
+	.4byte	0x77e3
+	.byte	0x38
+	.uleb128 0x1b
+	.4byte	.LASF1759
+	.byte	0x1e
+	.2byte	0x17c
+	.4byte	0x77fe
+	.byte	0x40
+	.uleb128 0x1b
+	.4byte	.LASF1760
+	.byte	0x1e
+	.2byte	0x17d
+	.4byte	0x7818
+	.byte	0x48
+	.uleb128 0x1b
+	.4byte	.LASF1761
+	.byte	0x1e
+	.2byte	0x17e
+	.4byte	0x7829
+	.byte	0x50
+	.uleb128 0x1b
+	.4byte	.LASF1762
+	.byte	0x1e
+	.2byte	0x17f
+	.4byte	0x784e
+	.byte	0x58
+	.uleb128 0x1b
+	.4byte	.LASF1763
+	.byte	0x1e
+	.2byte	0x184
+	.4byte	0x7872
+	.byte	0x60
+	.uleb128 0x1b
+	.4byte	.LASF1764
+	.byte	0x1e
+	.2byte	0x186
+	.4byte	0x788c
+	.byte	0x68
+	.uleb128 0x1b
+	.4byte	.LASF1765
+	.byte	0x1e
+	.2byte	0x187
+	.4byte	0x7829
+	.byte	0x70
+	.uleb128 0x1b
+	.4byte	.LASF1766
+	.byte	0x1e
+	.2byte	0x188
+	.4byte	0x7739
+	.byte	0x78
+	.uleb128 0x1b
+	.4byte	.LASF1767
+	.byte	0x1e
+	.2byte	0x189
+	.4byte	0x78ab
+	.byte	0x80
+	.uleb128 0x1b
+	.4byte	.LASF1768
+	.byte	0x1e
+	.2byte	0x18b
+	.4byte	0x78cc
+	.byte	0x88
+	.uleb128 0x1b
+	.4byte	.LASF1769
+	.byte	0x1e
+	.2byte	0x18c
+	.4byte	0x78e6
+	.byte	0x90
+	.uleb128 0x1b
+	.4byte	.LASF1770
+	.byte	0x1e
+	.2byte	0x18f
+	.4byte	0x7916
+	.byte	0x98
+	.uleb128 0x1b
+	.4byte	.LASF1771
+	.byte	0x1e
+	.2byte	0x191
+	.4byte	0x7927
+	.byte	0xa0
+	.uleb128 0x1b
+	.4byte	.LASF130
+	.byte	0x1e
+	.2byte	0x193
+	.4byte	0x15a
+	.byte	0xa8
+	.uleb128 0x1b
+	.4byte	.LASF131
+	.byte	0x1e
+	.2byte	0x194
+	.4byte	0x15a
+	.byte	0xb0
+	.uleb128 0x1b
+	.4byte	.LASF132
+	.byte	0x1e
+	.2byte	0x195
+	.4byte	0x15a
+	.byte	0xb8
+	.uleb128 0x1b
+	.4byte	.LASF133
+	.byte	0x1e
+	.2byte	0x196
+	.4byte	0x15a
+	.byte	0xc0
+	.byte	0
+	.uleb128 0x3
+	.4byte	0x7579
+	.uleb128 0x14
+	.4byte	0xc6
+	.4byte	0x76e5
+	.uleb128 0x11
+	.4byte	0x339d
+	.uleb128 0x11
+	.4byte	0x76e5
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x76eb
+	.uleb128 0x24
+	.4byte	.LASF1772
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x76d1
+	.uleb128 0x14
+	.4byte	0xc6
+	.4byte	0x770a
+	.uleb128 0x11
+	.4byte	0x5482
+	.uleb128 0x11
+	.4byte	0x339d
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x76f6
+	.uleb128 0x14
+	.4byte	0xc6
+	.4byte	0x7724
+	.uleb128 0x11
+	.4byte	0x509c
+	.uleb128 0x11
+	.4byte	0x76e5
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x7710
+	.uleb128 0x14
+	.4byte	0xc6
+	.4byte	0x7739
+	.uleb128 0x11
+	.4byte	0x339d
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x772a
+	.uleb128 0x14
+	.4byte	0xc6
+	.4byte	0x775d
+	.uleb128 0x11
+	.4byte	0x5482
+	.uleb128 0x11
+	.4byte	0x509c
+	.uleb128 0x11
+	.4byte	0x3cc
+	.uleb128 0x11
+	.4byte	0x6d
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x773f
+	.uleb128 0x14
+	.4byte	0xc6
+	.4byte	0x7790
+	.uleb128 0x11
+	.4byte	0x5482
+	.uleb128 0x11
+	.4byte	0x509c
+	.uleb128 0x11
+	.4byte	0x2d8
+	.uleb128 0x11
+	.4byte	0x6d
+	.uleb128 0x11
+	.4byte	0x6d
+	.uleb128 0x11
+	.4byte	0x597d
+	.uleb128 0x11
+	.4byte	0x7790
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x458
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x7763
+	.uleb128 0x14
+	.4byte	0xc6
+	.4byte	0x77c9
+	.uleb128 0x11
+	.4byte	0x5482
+	.uleb128 0x11
+	.4byte	0x509c
+	.uleb128 0x11
+	.4byte	0x2d8
+	.uleb128 0x11
+	.4byte	0x6d
+	.uleb128 0x11
+	.4byte	0x6d
+	.uleb128 0x11
+	.4byte	0x339d
+	.uleb128 0x11
+	.4byte	0x458
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x779c
+	.uleb128 0x14
+	.4byte	0x30f
+	.4byte	0x77e3
+	.uleb128 0x11
+	.4byte	0x509c
+	.uleb128 0x11
+	.4byte	0x30f
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x77cf
+	.uleb128 0x10
+	.4byte	0x77fe
+	.uleb128 0x11
+	.4byte	0x339d
+	.uleb128 0x11
+	.4byte	0x6d
+	.uleb128 0x11
+	.4byte	0x6d
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x77e9
+	.uleb128 0x14
+	.4byte	0xc6
+	.4byte	0x7818
+	.uleb128 0x11
+	.4byte	0x339d
+	.uleb128 0x11
+	.4byte	0x330
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x7804
+	.uleb128 0x10
+	.4byte	0x7829
+	.uleb128 0x11
+	.4byte	0x339d
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x781e
+	.uleb128 0x14
+	.4byte	0x2ee
+	.4byte	0x7843
+	.uleb128 0x11
+	.4byte	0x5e55
+	.uleb128 0x11
+	.4byte	0x7843
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x7849
+	.uleb128 0x24
+	.4byte	.LASF1773
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x782f
+	.uleb128 0x14
+	.4byte	0xc6
+	.4byte	0x7872
+	.uleb128 0x11
+	.4byte	0x509c
+	.uleb128 0x11
+	.4byte	0x339d
+	.uleb128 0x11
+	.4byte	0x339d
+	.uleb128 0x11
+	.4byte	0x5b2d
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x7854
+	.uleb128 0x14
+	.4byte	0x2b0
+	.4byte	0x788c
+	.uleb128 0x11
+	.4byte	0x339d
+	.uleb128 0x11
+	.4byte	0x6301
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x7878
+	.uleb128 0x14
+	.4byte	0xc6
+	.4byte	0x78ab
+	.uleb128 0x11
+	.4byte	0x339d
+	.uleb128 0x11
+	.4byte	0x29
+	.uleb128 0x11
+	.4byte	0x29
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x7892
+	.uleb128 0x10
+	.4byte	0x78c6
+	.uleb128 0x11
+	.4byte	0x339d
+	.uleb128 0x11
+	.4byte	0x78c6
+	.uleb128 0x11
+	.4byte	0x78c6
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x2b0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x78b1
+	.uleb128 0x14
+	.4byte	0xc6
+	.4byte	0x78e6
+	.uleb128 0x11
+	.4byte	0x509c
+	.uleb128 0x11
+	.4byte	0x339d
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x78d2
+	.uleb128 0x14
+	.4byte	0xc6
+	.4byte	0x7905
+	.uleb128 0x11
+	.4byte	0x7905
+	.uleb128 0x11
+	.4byte	0x5482
+	.uleb128 0x11
+	.4byte	0x7910
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x790b
+	.uleb128 0x24
+	.4byte	.LASF1774
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x30f
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x78ec
+	.uleb128 0x10
+	.4byte	0x7927
+	.uleb128 0x11
+	.4byte	0x5482
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x791c
+	.uleb128 0x15
+	.4byte	.LASF1775
+	.byte	0x1e
+	.2byte	0x199
+	.4byte	0x76cc
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x76cc
+	.uleb128 0x1d
+	.4byte	.LASF1776
+	.byte	0xf8
+	.byte	0x1e
+	.2byte	0x1c6
+	.4byte	0x7aac
+	.uleb128 0x1b
+	.4byte	.LASF1777
+	.byte	0x1e
+	.2byte	0x1c7
+	.4byte	0x284
+	.byte	0
+	.uleb128 0x1b
+	.4byte	.LASF1778
+	.byte	0x1e
+	.2byte	0x1c8
+	.4byte	0xc6
+	.byte	0x4
+	.uleb128 0x1b
+	.4byte	.LASF1779
+	.byte	0x1e
+	.2byte	0x1c9
+	.4byte	0x1c7f
+	.byte	0x8
+	.uleb128 0x1b
+	.4byte	.LASF1780
+	.byte	0x1e
+	.2byte	0x1ca
+	.4byte	0x20e7
+	.byte	0x10
+	.uleb128 0x1b
+	.4byte	.LASF1781
+	.byte	0x1e
+	.2byte	0x1cb
+	.4byte	0x2464
+	.byte	0x18
+	.uleb128 0x1b
+	.4byte	.LASF1782
+	.byte	0x1e
+	.2byte	0x1cc
+	.4byte	0x458
+	.byte	0x38
+	.uleb128 0x1b
+	.4byte	.LASF1783
+	.byte	0x1e
+	.2byte	0x1cd
+	.4byte	0x458
+	.byte	0x40
+	.uleb128 0x1b
+	.4byte	.LASF1784
+	.byte	0x1e
+	.2byte	0x1ce
+	.4byte	0xc6
+	.byte	0x48
+	.uleb128 0x1b
+	.4byte	.LASF1785
+	.byte	0x1e
+	.2byte	0x1cf
+	.4byte	0x2b0
+	.byte	0x4c
+	.uleb128 0x1b
+	.4byte	.LASF1786
+	.byte	0x1e
+	.2byte	0x1d1
+	.4byte	0x3a7
+	.byte	0x50
+	.uleb128 0x1b
+	.4byte	.LASF1787
+	.byte	0x1e
+	.2byte	0x1d3
+	.4byte	0x7aac
+	.byte	0x60
+	.uleb128 0x1b
+	.4byte	.LASF1788
+	.byte	0x1e
+	.2byte	0x1d4
+	.4byte	0x6d
+	.byte	0x68
+	.uleb128 0x1b
+	.4byte	.LASF1789
+	.byte	0x1e
+	.2byte	0x1d5
+	.4byte	0x110
+	.byte	0x6c
+	.uleb128 0x1b
+	.4byte	.LASF1790
+	.byte	0x1e
+	.2byte	0x1d6
+	.4byte	0x7ab7
+	.byte	0x70
+	.uleb128 0x1b
+	.4byte	.LASF1791
+	.byte	0x1e
+	.2byte	0x1d8
+	.4byte	0x6d
+	.byte	0x78
+	.uleb128 0x1b
+	.4byte	.LASF1792
+	.byte	0x1e
+	.2byte	0x1d9
+	.4byte	0xc6
+	.byte	0x7c
+	.uleb128 0x1b
+	.4byte	.LASF1793
+	.byte	0x1e
+	.2byte	0x1da
+	.4byte	0x7ac2
+	.byte	0x80
+	.uleb128 0x1b
+	.4byte	.LASF1794
+	.byte	0x1e
+	.2byte	0x1db
+	.4byte	0x48a2
+	.byte	0x88
+	.uleb128 0x1b
+	.4byte	.LASF1795
+	.byte	0x1e
+	.2byte	0x1dc
+	.4byte	0x478c
+	.byte	0x90
+	.uleb128 0x1b
+	.4byte	.LASF1796
+	.byte	0x1e
+	.2byte	0x1dd
+	.4byte	0x3a7
+	.byte	0x98
+	.uleb128 0x1b
+	.4byte	.LASF1797
+	.byte	0x1e
+	.2byte	0x1e4
+	.4byte	0x29
+	.byte	0xa8
+	.uleb128 0x1b
+	.4byte	.LASF1798
+	.byte	0x1e
+	.2byte	0x1e7
+	.4byte	0xc6
+	.byte	0xb0
+	.uleb128 0x1b
+	.4byte	.LASF1799
+	.byte	0x1e
+	.2byte	0x1e9
+	.4byte	0x2464
+	.byte	0xb8
+	.uleb128 0x1b
+	.4byte	.LASF130
+	.byte	0x1e
+	.2byte	0x1eb
+	.4byte	0x15a
+	.byte	0xd8
+	.uleb128 0x1b
+	.4byte	.LASF131
+	.byte	0x1e
+	.2byte	0x1ec
+	.4byte	0x15a
+	.byte	0xe0
+	.uleb128 0x1b
+	.4byte	.LASF132
+	.byte	0x1e
+	.2byte	0x1ed
+	.4byte	0x15a
+	.byte	0xe8
+	.uleb128 0x1b
+	.4byte	.LASF133
+	.byte	0x1e
+	.2byte	0x1ee
+	.4byte	0x15a
+	.byte	0xf0
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x793f
+	.uleb128 0x24
+	.4byte	.LASF1800
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x7ab2
+	.uleb128 0x24
+	.4byte	.LASF1801
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x7abd
+	.uleb128 0x3c
+	.byte	0x4
+	.byte	0x1e
+	.2byte	0x280
+	.4byte	0x7aea
+	.uleb128 0x3e
+	.4byte	.LASF1802
+	.byte	0x1e
+	.2byte	0x281
+	.4byte	0x74
+	.uleb128 0x3e
+	.4byte	.LASF1803
+	.byte	0x1e
+	.2byte	0x282
+	.4byte	0x6d
+	.byte	0
+	.uleb128 0x3c
+	.byte	0x10
+	.byte	0x1e
+	.2byte	0x2a7
+	.4byte	0x7b0c
+	.uleb128 0x3e
+	.4byte	.LASF1804
+	.byte	0x1e
+	.2byte	0x2a8
+	.4byte	0x3d2
+	.uleb128 0x3e
+	.4byte	.LASF1805
+	.byte	0x1e
+	.2byte	0x2a9
+	.4byte	0x41c
+	.byte	0
+	.uleb128 0x3c
+	.byte	0x8
+	.byte	0x1e
+	.2byte	0x2b7
+	.4byte	0x7b52
+	.uleb128 0x3e
+	.4byte	.LASF1806
+	.byte	0x1e
+	.2byte	0x2b8
+	.4byte	0x4881
+	.uleb128 0x3e
+	.4byte	.LASF1807
+	.byte	0x1e
+	.2byte	0x2b9
+	.4byte	0x7aac
+	.uleb128 0x3e
+	.4byte	.LASF1808
+	.byte	0x1e
+	.2byte	0x2ba
+	.4byte	0x7b57
+	.uleb128 0x3e
+	.4byte	.LASF1809
+	.byte	0x1e
+	.2byte	0x2bb
+	.4byte	0x21e
+	.uleb128 0x3e
+	.4byte	.LASF1810
+	.byte	0x1e
+	.2byte	0x2bc
+	.4byte	0x6d
+	.byte	0
+	.uleb128 0x24
+	.4byte	.LASF1811
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x7b52
+	.uleb128 0x24
+	.4byte	.LASF1812
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x7b5d
+	.uleb128 0x1a
+	.4byte	.LASF1813
+	.2byte	0x100
+	.byte	0x1e
+	.2byte	0x73e
+	.4byte	0x7cd6
+	.uleb128 0x1b
+	.4byte	.LASF1814
+	.byte	0x1e
+	.2byte	0x73f
+	.4byte	0x8b1d
+	.byte	0
+	.uleb128 0x1b
+	.4byte	.LASF1815
+	.byte	0x1e
+	.2byte	0x740
+	.4byte	0x8b42
+	.byte	0x8
+	.uleb128 0x1b
+	.4byte	.LASF1816
+	.byte	0x1e
+	.2byte	0x741
+	.4byte	0x8b5c
+	.byte	0x10
+	.uleb128 0x1b
+	.4byte	.LASF1817
+	.byte	0x1e
+	.2byte	0x742
+	.4byte	0x8b7b
+	.byte	0x18
+	.uleb128 0x1b
+	.4byte	.LASF1818
+	.byte	0x1e
+	.2byte	0x743
+	.4byte	0x8b95
+	.byte	0x20
+	.uleb128 0x1b
+	.4byte	.LASF1819
+	.byte	0x1e
+	.2byte	0x745
+	.4byte	0x8bb4
+	.byte	0x28
+	.uleb128 0x1b
+	.4byte	.LASF1820
+	.byte	0x1e
+	.2byte	0x747
+	.4byte	0x8bd8
+	.byte	0x30
+	.uleb128 0x1b
+	.4byte	.LASF1821
+	.byte	0x1e
+	.2byte	0x748
+	.4byte	0x8bf7
+	.byte	0x38
+	.uleb128 0x1b
+	.4byte	.LASF1822
+	.byte	0x1e
+	.2byte	0x749
+	.4byte	0x8c11
+	.byte	0x40
+	.uleb128 0x1b
+	.4byte	.LASF1823
+	.byte	0x1e
+	.2byte	0x74a
+	.4byte	0x8c30
+	.byte	0x48
+	.uleb128 0x1b
+	.4byte	.LASF1824
+	.byte	0x1e
+	.2byte	0x74b
+	.4byte	0x8c4f
+	.byte	0x50
+	.uleb128 0x1b
+	.4byte	.LASF1825
+	.byte	0x1e
+	.2byte	0x74c
+	.4byte	0x8c11
+	.byte	0x58
+	.uleb128 0x1b
+	.4byte	.LASF1826
+	.byte	0x1e
+	.2byte	0x74d
+	.4byte	0x8c73
+	.byte	0x60
+	.uleb128 0x1b
+	.4byte	.LASF1827
+	.byte	0x1e
+	.2byte	0x74e
+	.4byte	0x8c9c
+	.byte	0x68
+	.uleb128 0x1b
+	.4byte	.LASF1828
+	.byte	0x1e
+	.2byte	0x750
+	.4byte	0x8cbc
+	.byte	0x70
+	.uleb128 0x1b
+	.4byte	.LASF1829
+	.byte	0x1e
+	.2byte	0x751
+	.4byte	0x8cdb
+	.byte	0x78
+	.uleb128 0x1b
+	.4byte	.LASF1830
+	.byte	0x1e
+	.2byte	0x752
+	.4byte	0x8d05
+	.byte	0x80
+	.uleb128 0x1b
+	.4byte	.LASF1831
+	.byte	0x1e
+	.2byte	0x753
+	.4byte	0x8d24
+	.byte	0x88
+	.uleb128 0x1b
+	.4byte	.LASF1832
+	.byte	0x1e
+	.2byte	0x754
+	.4byte	0x8d4e
+	.byte	0x90
+	.uleb128 0x1b
+	.4byte	.LASF1833
+	.byte	0x1e
+	.2byte	0x756
+	.4byte	0x8d73
+	.byte	0x98
+	.uleb128 0x1b
+	.4byte	.LASF1834
+	.byte	0x1e
+	.2byte	0x757
+	.4byte	0x8d9c
+	.byte	0xa0
+	.uleb128 0x1b
+	.4byte	.LASF1835
+	.byte	0x1e
+	.2byte	0x75a
+	.4byte	0x8c4f
+	.byte	0xa8
+	.uleb128 0x1b
+	.4byte	.LASF1836
+	.byte	0x1e
+	.2byte	0x75b
+	.4byte	0x8dbb
+	.byte	0xb0
+	.uleb128 0x1b
+	.4byte	.LASF130
+	.byte	0x1e
+	.2byte	0x75d
+	.4byte	0x15a
+	.byte	0xb8
+	.uleb128 0x1b
+	.4byte	.LASF131
+	.byte	0x1e
+	.2byte	0x75e
+	.4byte	0x15a
+	.byte	0xc0
+	.uleb128 0x1b
+	.4byte	.LASF132
+	.byte	0x1e
+	.2byte	0x75f
+	.4byte	0x15a
+	.byte	0xc8
+	.uleb128 0x1b
+	.4byte	.LASF133
+	.byte	0x1e
+	.2byte	0x760
+	.4byte	0x15a
+	.byte	0xd0
+	.byte	0
+	.uleb128 0x3
+	.4byte	0x7b68
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x7cd6
+	.uleb128 0x24
+	.4byte	.LASF1837
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x7ce1
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x7c9
+	.uleb128 0x1d
+	.4byte	.LASF1838
+	.byte	0x38
+	.byte	0x1e
+	.2byte	0x452
+	.4byte	0x7d34
+	.uleb128 0x1b
+	.4byte	.LASF1839
+	.byte	0x1e
+	.2byte	0x453
+	.4byte	0xe65
+	.byte	0
+	.uleb128 0x1b
+	.4byte	.LASF1840
+	.byte	0x1e
+	.2byte	0x454
+	.4byte	0x3a7
+	.byte	0x8
+	.uleb128 0x1b
+	.4byte	.LASF1841
+	.byte	0x1e
+	.2byte	0x455
+	.4byte	0x3a7
+	.byte	0x18
+	.uleb128 0x1b
+	.4byte	.LASF1842
+	.byte	0x1e
+	.2byte	0x456
+	.4byte	0x3a7
+	.byte	0x28
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x7cf2
+	.uleb128 0x24
+	.4byte	.LASF1843
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x7d3a
+	.uleb128 0x24
+	.4byte	.LASF1844
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x7d45
+	.uleb128 0x24
+	.4byte	.LASF1845
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x7d50
+	.uleb128 0x1d
+	.4byte	.LASF1846
+	.byte	0x20
+	.byte	0x1e
+	.2byte	0x376
+	.4byte	0x7db7
+	.uleb128 0x1b
+	.4byte	.LASF116
+	.byte	0x1e
+	.2byte	0x377
+	.4byte	0xe85
+	.byte	0
+	.uleb128 0x2b
+	.string	"pid"
+	.byte	0x1e
+	.2byte	0x378
+	.4byte	0x4563
+	.byte	0x8
+	.uleb128 0x1b
+	.4byte	.LASF548
+	.byte	0x1e
+	.2byte	0x379
+	.4byte	0x22c6
+	.byte	0x10
+	.uleb128 0x2b
+	.string	"uid"
+	.byte	0x1e
+	.2byte	0x37a
+	.4byte	0x240a
+	.byte	0x14
+	.uleb128 0x1b
+	.4byte	.LASF1072
+	.byte	0x1e
+	.2byte	0x37a
+	.4byte	0x240a
+	.byte	0x18
+	.uleb128 0x1b
+	.4byte	.LASF1847
+	.byte	0x1e
+	.2byte	0x37b
+	.4byte	0xc6
+	.byte	0x1c
+	.byte	0
+	.uleb128 0x1d
+	.4byte	.LASF1848
+	.byte	0x20
+	.byte	0x1e
+	.2byte	0x381
+	.4byte	0x7e13
+	.uleb128 0x1b
+	.4byte	.LASF1849
+	.byte	0x1e
+	.2byte	0x382
+	.4byte	0x29
+	.byte	0
+	.uleb128 0x1b
+	.4byte	.LASF957
+	.byte	0x1e
+	.2byte	0x383
+	.4byte	0x6d
+	.byte	0x8
+	.uleb128 0x1b
+	.4byte	.LASF1850
+	.byte	0x1e
+	.2byte	0x384
+	.4byte	0x6d
+	.byte	0xc
+	.uleb128 0x1b
+	.4byte	.LASF1851
+	.byte	0x1e
+	.2byte	0x387
+	.4byte	0x6d
+	.byte	0x10
+	.uleb128 0x1b
+	.4byte	.LASF1852
+	.byte	0x1e
+	.2byte	0x388
+	.4byte	0x6d
+	.byte	0x14
+	.uleb128 0x1b
+	.4byte	.LASF1853
+	.byte	0x1e
+	.2byte	0x389
+	.4byte	0x2d8
+	.byte	0x18
+	.byte	0
+	.uleb128 0x3c
+	.byte	0x10
+	.byte	0x1e
+	.2byte	0x396
+	.4byte	0x7e35
+	.uleb128 0x3e
+	.4byte	.LASF1854
+	.byte	0x1e
+	.2byte	0x397
+	.4byte	0x2f10
+	.uleb128 0x3e
+	.4byte	.LASF1855
+	.byte	0x1e
+	.2byte	0x398
+	.4byte	0x41c
+	.byte	0
+	.uleb128 0x13
+	.4byte	.LASF1856
+	.byte	0x1e
+	.2byte	0x3f0
+	.4byte	0x458
+	.uleb128 0x1d
+	.4byte	.LASF1857
+	.byte	0x20
+	.byte	0x1e
+	.2byte	0x3f4
+	.4byte	0x7e83
+	.uleb128 0x1b
+	.4byte	.LASF1858
+	.byte	0x1e
+	.2byte	0x3f5
+	.4byte	0x7fca
+	.byte	0
+	.uleb128 0x1b
+	.4byte	.LASF1859
+	.byte	0x1e
+	.2byte	0x3f6
+	.4byte	0x7fdb
+	.byte	0x8
+	.uleb128 0x1b
+	.4byte	.LASF130
+	.byte	0x1e
+	.2byte	0x3f8
+	.4byte	0x15a
+	.byte	0x10
+	.uleb128 0x1b
+	.4byte	.LASF131
+	.byte	0x1e
+	.2byte	0x3f9
+	.4byte	0x15a
+	.byte	0x18
+	.byte	0
+	.uleb128 0x3
+	.4byte	0x7e41
+	.uleb128 0x10
+	.4byte	0x7e98
+	.uleb128 0x11
+	.4byte	0x7e98
+	.uleb128 0x11
+	.4byte	0x7e98
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x7e9e
+	.uleb128 0x1d
+	.4byte	.LASF1860
+	.byte	0xe8
+	.byte	0x1e
+	.2byte	0x42e
+	.4byte	0x7fca
+	.uleb128 0x1b
+	.4byte	.LASF1861
+	.byte	0x1e
+	.2byte	0x42f
+	.4byte	0x7e98
+	.byte	0
+	.uleb128 0x1b
+	.4byte	.LASF1862
+	.byte	0x1e
+	.2byte	0x430
+	.4byte	0x3a7
+	.byte	0x8
+	.uleb128 0x1b
+	.4byte	.LASF1863
+	.byte	0x1e
+	.2byte	0x431
+	.4byte	0x3eb
+	.byte	0x18
+	.uleb128 0x1b
+	.4byte	.LASF1864
+	.byte	0x1e
+	.2byte	0x432
+	.4byte	0x3a7
+	.byte	0x28
+	.uleb128 0x1b
+	.4byte	.LASF1865
+	.byte	0x1e
+	.2byte	0x433
+	.4byte	0x7e35
+	.byte	0x38
+	.uleb128 0x1b
+	.4byte	.LASF1866
+	.byte	0x1e
+	.2byte	0x434
+	.4byte	0x6d
+	.byte	0x40
+	.uleb128 0x1b
+	.4byte	.LASF1867
+	.byte	0x1e
+	.2byte	0x435
+	.4byte	0x96
+	.byte	0x44
+	.uleb128 0x1b
+	.4byte	.LASF1868
+	.byte	0x1e
+	.2byte	0x436
+	.4byte	0x6d
+	.byte	0x48
+	.uleb128 0x1b
+	.4byte	.LASF1869
+	.byte	0x1e
+	.2byte	0x437
+	.4byte	0xc6
+	.byte	0x4c
+	.uleb128 0x1b
+	.4byte	.LASF1870
+	.byte	0x1e
+	.2byte	0x438
+	.4byte	0x15bf
+	.byte	0x50
+	.uleb128 0x1b
+	.4byte	.LASF1871
+	.byte	0x1e
+	.2byte	0x439
+	.4byte	0x5482
+	.byte	0x68
+	.uleb128 0x1b
+	.4byte	.LASF1872
+	.byte	0x1e
+	.2byte	0x43a
+	.4byte	0x2d8
+	.byte	0x70
+	.uleb128 0x1b
+	.4byte	.LASF1873
+	.byte	0x1e
+	.2byte	0x43b
+	.4byte	0x2d8
+	.byte	0x78
+	.uleb128 0x1b
+	.4byte	.LASF1874
+	.byte	0x1e
+	.2byte	0x43d
+	.4byte	0x824a
+	.byte	0x80
+	.uleb128 0x1b
+	.4byte	.LASF1875
+	.byte	0x1e
+	.2byte	0x43f
+	.4byte	0x29
+	.byte	0x88
+	.uleb128 0x1b
+	.4byte	.LASF1876
+	.byte	0x1e
+	.2byte	0x440
+	.4byte	0x29
+	.byte	0x90
+	.uleb128 0x1b
+	.4byte	.LASF1877
+	.byte	0x1e
+	.2byte	0x442
+	.4byte	0x8250
+	.byte	0x98
+	.uleb128 0x1b
+	.4byte	.LASF1878
+	.byte	0x1e
+	.2byte	0x443
+	.4byte	0x8256
+	.byte	0xa0
+	.uleb128 0x1b
+	.4byte	.LASF1879
+	.byte	0x1e
+	.2byte	0x44b
+	.4byte	0x81c0
+	.byte	0xa8
+	.uleb128 0x1b
+	.4byte	.LASF1880
+	.byte	0x1e
+	.2byte	0x44d
+	.4byte	0x3a7
+	.byte	0xc8
+	.uleb128 0x1b
+	.4byte	.LASF130
+	.byte	0x1e
+	.2byte	0x44e
+	.4byte	0x15a
+	.byte	0xd8
+	.uleb128 0x1b
+	.4byte	.LASF131
+	.byte	0x1e
+	.2byte	0x44f
+	.4byte	0x15a
+	.byte	0xe0
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x7e88
+	.uleb128 0x10
+	.4byte	0x7fdb
+	.uleb128 0x11
+	.4byte	0x7e98
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x7fd0
+	.uleb128 0x1d
+	.4byte	.LASF1881
+	.byte	0x58
+	.byte	0x1e
+	.2byte	0x3fc
+	.4byte	0x807e
+	.uleb128 0x1b
+	.4byte	.LASF1882
+	.byte	0x1e
+	.2byte	0x3fd
+	.4byte	0x8097
+	.byte	0
+	.uleb128 0x1b
+	.4byte	.LASF1883
+	.byte	0x1e
+	.2byte	0x3fe
+	.4byte	0x80ac
+	.byte	0x8
+	.uleb128 0x1b
+	.4byte	.LASF1884
+	.byte	0x1e
+	.2byte	0x3ff
+	.4byte	0x80c1
+	.byte	0x10
+	.uleb128 0x1b
+	.4byte	.LASF1885
+	.byte	0x1e
+	.2byte	0x400
+	.4byte	0x80d2
+	.byte	0x18
+	.uleb128 0x1b
+	.4byte	.LASF1886
+	.byte	0x1e
+	.2byte	0x401
+	.4byte	0x7fdb
+	.byte	0x20
+	.uleb128 0x1b
+	.4byte	.LASF1887
+	.byte	0x1e
+	.2byte	0x402
+	.4byte	0x80ec
+	.byte	0x28
+	.uleb128 0x1b
+	.4byte	.LASF1888
+	.byte	0x1e
+	.2byte	0x403
+	.4byte	0x8101
+	.byte	0x30
+	.uleb128 0x1b
+	.4byte	.LASF1889
+	.byte	0x1e
+	.2byte	0x404
+	.4byte	0x8120
+	.byte	0x38
+	.uleb128 0x1b
+	.4byte	.LASF1890
+	.byte	0x1e
+	.2byte	0x405
+	.4byte	0x8136
+	.byte	0x40
+	.uleb128 0x1b
+	.4byte	.LASF130
+	.byte	0x1e
+	.2byte	0x407
+	.4byte	0x15a
+	.byte	0x48
+	.uleb128 0x1b
+	.4byte	.LASF131
+	.byte	0x1e
+	.2byte	0x408
+	.4byte	0x15a
+	.byte	0x50
+	.byte	0
+	.uleb128 0x3
+	.4byte	0x7fe1
+	.uleb128 0x14
+	.4byte	0xc6
+	.4byte	0x8097
+	.uleb128 0x11
+	.4byte	0x7e98
+	.uleb128 0x11
+	.4byte	0x7e98
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x8083
+	.uleb128 0x14
+	.4byte	0x29
+	.4byte	0x80ac
+	.uleb128 0x11
+	.4byte	0x7e98
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x809d
+	.uleb128 0x14
+	.4byte	0x7e35
+	.4byte	0x80c1
+	.uleb128 0x11
+	.4byte	0x7e35
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x80b2
+	.uleb128 0x10
+	.4byte	0x80d2
+	.uleb128 0x11
+	.4byte	0x7e35
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x80c7
+	.uleb128 0x14
+	.4byte	0xc6
+	.4byte	0x80ec
+	.uleb128 0x11
+	.4byte	0x7e98
+	.uleb128 0x11
+	.4byte	0xc6
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x80d8
+	.uleb128 0x14
+	.4byte	0x2b0
+	.4byte	0x8101
+	.uleb128 0x11
+	.4byte	0x7e98
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x80f2
+	.uleb128 0x14
+	.4byte	0xc6
+	.4byte	0x8120
+	.uleb128 0x11
+	.4byte	0x7e98
+	.uleb128 0x11
+	.4byte	0xc6
+	.uleb128 0x11
+	.4byte	0x3cc
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x8107
+	.uleb128 0x10
+	.4byte	0x8136
+	.uleb128 0x11
+	.4byte	0x7e98
+	.uleb128 0x11
+	.4byte	0x7790
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x8126
+	.uleb128 0xd
+	.4byte	.LASF1891
+	.byte	0x20
+	.byte	0x8a
+	.byte	0xa
+	.4byte	0x816d
+	.uleb128 0xe
+	.4byte	.LASF577
+	.byte	0x8a
+	.byte	0xb
+	.4byte	0x13f
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF98
+	.byte	0x8a
+	.byte	0xc
+	.4byte	0x8172
+	.byte	0x8
+	.uleb128 0xe
+	.4byte	.LASF932
+	.byte	0x8a
+	.byte	0xd
+	.4byte	0x3a7
+	.byte	0x10
+	.byte	0
+	.uleb128 0x24
+	.4byte	.LASF1892
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x816d
+	.uleb128 0xd
+	.4byte	.LASF1893
+	.byte	0x8
+	.byte	0x8a
+	.byte	0x11
+	.4byte	0x8191
+	.uleb128 0xe
+	.4byte	.LASF98
+	.byte	0x8a
+	.byte	0x12
+	.4byte	0x8196
+	.byte	0
+	.byte	0
+	.uleb128 0x24
+	.4byte	.LASF1894
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x8191
+	.uleb128 0x2e
+	.byte	0x18
+	.byte	0x1e
+	.2byte	0x447
+	.4byte	0x81c0
+	.uleb128 0x1b
+	.4byte	.LASF1821
+	.byte	0x1e
+	.2byte	0x448
+	.4byte	0x3a7
+	.byte	0
+	.uleb128 0x1b
+	.4byte	.LASF577
+	.byte	0x1e
+	.2byte	0x449
+	.4byte	0xc6
+	.byte	0x10
+	.byte	0
+	.uleb128 0x3c
+	.byte	0x20
+	.byte	0x1e
+	.2byte	0x444
+	.4byte	0x81ee
+	.uleb128 0x3e
+	.4byte	.LASF1895
+	.byte	0x1e
+	.2byte	0x445
+	.4byte	0x813c
+	.uleb128 0x3e
+	.4byte	.LASF1896
+	.byte	0x1e
+	.2byte	0x446
+	.4byte	0x8178
+	.uleb128 0x3a
+	.string	"afs"
+	.byte	0x1e
+	.2byte	0x44a
+	.4byte	0x819c
+	.byte	0
+	.uleb128 0x1d
+	.4byte	.LASF1897
+	.byte	0x30
+	.byte	0x1e
+	.2byte	0x523
+	.4byte	0x824a
+	.uleb128 0x1b
+	.4byte	.LASF1898
+	.byte	0x1e
+	.2byte	0x524
+	.4byte	0xe85
+	.byte	0
+	.uleb128 0x1b
+	.4byte	.LASF1899
+	.byte	0x1e
+	.2byte	0x525
+	.4byte	0xc6
+	.byte	0x8
+	.uleb128 0x1b
+	.4byte	.LASF1900
+	.byte	0x1e
+	.2byte	0x526
+	.4byte	0xc6
+	.byte	0xc
+	.uleb128 0x1b
+	.4byte	.LASF1901
+	.byte	0x1e
+	.2byte	0x527
+	.4byte	0x824a
+	.byte	0x10
+	.uleb128 0x1b
+	.4byte	.LASF1902
+	.byte	0x1e
+	.2byte	0x528
+	.4byte	0x5482
+	.byte	0x18
+	.uleb128 0x1b
+	.4byte	.LASF1903
+	.byte	0x1e
+	.2byte	0x529
+	.4byte	0x41c
+	.byte	0x20
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x81ee
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x7e83
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x807e
+	.uleb128 0x1a
+	.4byte	.LASF1904
+	.2byte	0x1b8
+	.byte	0x1e
+	.2byte	0x57f
+	.4byte	0x8292
+	.uleb128 0x1b
+	.4byte	.LASF1211
+	.byte	0x1e
+	.2byte	0x580
+	.4byte	0xc6
+	.byte	0
+	.uleb128 0x1b
+	.4byte	.LASF1905
+	.byte	0x1e
+	.2byte	0x581
+	.4byte	0x15bf
+	.byte	0x8
+	.uleb128 0x1b
+	.4byte	.LASF1363
+	.byte	0x1e
+	.2byte	0x582
+	.4byte	0x8292
+	.byte	0x20
+	.byte	0
+	.uleb128 0x5
+	.4byte	0x5be7
+	.4byte	0x82a2
+	.uleb128 0x6
+	.4byte	0x4f
+	.byte	0x2
+	.byte	0
+	.uleb128 0x1d
+	.4byte	.LASF1906
+	.byte	0x68
+	.byte	0x1e
+	.2byte	0x8ae
+	.4byte	0x83b4
+	.uleb128 0x1b
+	.4byte	.LASF265
+	.byte	0x1e
+	.2byte	0x8af
+	.4byte	0x56
+	.byte	0
+	.uleb128 0x1b
+	.4byte	.LASF1907
+	.byte	0x1e
+	.2byte	0x8b0
+	.4byte	0xc6
+	.byte	0x8
+	.uleb128 0x1b
+	.4byte	.LASF1908
+	.byte	0x1e
+	.2byte	0x8b6
+	.4byte	0x8fe3
+	.byte	0x10
+	.uleb128 0x1b
+	.4byte	.LASF1909
+	.byte	0x1e
+	.2byte	0x8b8
+	.4byte	0x900c
+	.byte	0x18
+	.uleb128 0x1b
+	.4byte	.LASF1910
+	.byte	0x1e
+	.2byte	0x8ba
+	.4byte	0x9017
+	.byte	0x20
+	.uleb128 0x1b
+	.4byte	.LASF1911
+	.byte	0x1e
+	.2byte	0x8bb
+	.4byte	0x8e37
+	.byte	0x28
+	.uleb128 0x1b
+	.4byte	.LASF98
+	.byte	0x1e
+	.2byte	0x8bc
+	.4byte	0x74a1
+	.byte	0x30
+	.uleb128 0x1b
+	.4byte	.LASF64
+	.byte	0x1e
+	.2byte	0x8bd
+	.4byte	0x83b4
+	.byte	0x38
+	.uleb128 0x1b
+	.4byte	.LASF1912
+	.byte	0x1e
+	.2byte	0x8be
+	.4byte	0x3d2
+	.byte	0x40
+	.uleb128 0x1b
+	.4byte	.LASF1913
+	.byte	0x1e
+	.2byte	0x8c0
+	.4byte	0xe11
+	.byte	0x48
+	.uleb128 0x1b
+	.4byte	.LASF1914
+	.byte	0x1e
+	.2byte	0x8c1
+	.4byte	0xe11
+	.byte	0x48
+	.uleb128 0x1b
+	.4byte	.LASF1915
+	.byte	0x1e
+	.2byte	0x8c2
+	.4byte	0xe11
+	.byte	0x48
+	.uleb128 0x1b
+	.4byte	.LASF1916
+	.byte	0x1e
+	.2byte	0x8c3
+	.4byte	0x901d
+	.byte	0x48
+	.uleb128 0x1b
+	.4byte	.LASF1917
+	.byte	0x1e
+	.2byte	0x8c5
+	.4byte	0xe11
+	.byte	0x48
+	.uleb128 0x1b
+	.4byte	.LASF1918
+	.byte	0x1e
+	.2byte	0x8c6
+	.4byte	0xe11
+	.byte	0x48
+	.uleb128 0x1b
+	.4byte	.LASF1919
+	.byte	0x1e
+	.2byte	0x8c7
+	.4byte	0xe11
+	.byte	0x48
+	.uleb128 0x1b
+	.4byte	.LASF130
+	.byte	0x1e
+	.2byte	0x8c9
+	.4byte	0x15a
+	.byte	0x48
+	.uleb128 0x1b
+	.4byte	.LASF131
+	.byte	0x1e
+	.2byte	0x8ca
+	.4byte	0x15a
+	.byte	0x50
+	.uleb128 0x1b
+	.4byte	.LASF132
+	.byte	0x1e
+	.2byte	0x8cb
+	.4byte	0x15a
+	.byte	0x58
+	.uleb128 0x1b
+	.4byte	.LASF133
+	.byte	0x1e
+	.2byte	0x8cc
+	.4byte	0x15a
+	.byte	0x60
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x82a2
+	.uleb128 0x1a
+	.4byte	.LASF1920
+	.2byte	0x110
+	.byte	0x1e
+	.2byte	0x791
+	.4byte	0x8585
+	.uleb128 0x1b
+	.4byte	.LASF1921
+	.byte	0x1e
+	.2byte	0x792
+	.4byte	0x8dd0
+	.byte	0
+	.uleb128 0x1b
+	.4byte	.LASF1922
+	.byte	0x1e
+	.2byte	0x793
+	.4byte	0x8de1
+	.byte	0x8
+	.uleb128 0x1b
+	.4byte	.LASF1923
+	.byte	0x1e
+	.2byte	0x795
+	.4byte	0x8df7
+	.byte	0x10
+	.uleb128 0x1b
+	.4byte	.LASF1924
+	.byte	0x1e
+	.2byte	0x796
+	.4byte	0x8e11
+	.byte	0x18
+	.uleb128 0x1b
+	.4byte	.LASF1925
+	.byte	0x1e
+	.2byte	0x797
+	.4byte	0x8e26
+	.byte	0x20
+	.uleb128 0x1b
+	.4byte	.LASF1926
+	.byte	0x1e
+	.2byte	0x798
+	.4byte	0x8de1
+	.byte	0x28
+	.uleb128 0x1b
+	.4byte	.LASF1927
+	.byte	0x1e
+	.2byte	0x799
+	.4byte	0x8e37
+	.byte	0x30
+	.uleb128 0x1b
+	.4byte	.LASF1928
+	.byte	0x1e
+	.2byte	0x79a
+	.4byte	0x6c63
+	.byte	0x38
+	.uleb128 0x1b
+	.4byte	.LASF1929
+	.byte	0x1e
+	.2byte	0x79b
+	.4byte	0x8e4c
+	.byte	0x40
+	.uleb128 0x1b
+	.4byte	.LASF1930
+	.byte	0x1e
+	.2byte	0x79c
+	.4byte	0x8e4c
+	.byte	0x48
+	.uleb128 0x1b
+	.4byte	.LASF1931
+	.byte	0x1e
+	.2byte	0x79d
+	.4byte	0x8e4c
+	.byte	0x50
+	.uleb128 0x1b
+	.4byte	.LASF1932
+	.byte	0x1e
+	.2byte	0x79e
+	.4byte	0x8e4c
+	.byte	0x58
+	.uleb128 0x1b
+	.4byte	.LASF1933
+	.byte	0x1e
+	.2byte	0x79f
+	.4byte	0x8e71
+	.byte	0x60
+	.uleb128 0x1b
+	.4byte	.LASF1934
+	.byte	0x1e
+	.2byte	0x7a0
+	.4byte	0x8e90
+	.byte	0x68
+	.uleb128 0x1b
+	.4byte	.LASF1935
+	.byte	0x1e
+	.2byte	0x7a1
+	.4byte	0x8eb4
+	.byte	0x70
+	.uleb128 0x1b
+	.4byte	.LASF1936
+	.byte	0x1e
+	.2byte	0x7a2
+	.4byte	0x3166
+	.byte	0x78
+	.uleb128 0x1b
+	.4byte	.LASF1937
+	.byte	0x1e
+	.2byte	0x7a3
+	.4byte	0x8eca
+	.byte	0x80
+	.uleb128 0x1b
+	.4byte	.LASF1938
+	.byte	0x1e
+	.2byte	0x7a4
+	.4byte	0x8e37
+	.byte	0x88
+	.uleb128 0x1b
+	.4byte	.LASF1939
+	.byte	0x1e
+	.2byte	0x7a5
+	.4byte	0x8ee0
+	.byte	0x90
+	.uleb128 0x1b
+	.4byte	.LASF1940
+	.byte	0x1e
+	.2byte	0x7a7
+	.4byte	0x8efa
+	.byte	0x98
+	.uleb128 0x1b
+	.4byte	.LASF1941
+	.byte	0x1e
+	.2byte	0x7a8
+	.4byte	0x8f19
+	.byte	0xa0
+	.uleb128 0x1b
+	.4byte	.LASF1942
+	.byte	0x1e
+	.2byte	0x7a9
+	.4byte	0x8efa
+	.byte	0xa8
+	.uleb128 0x1b
+	.4byte	.LASF1943
+	.byte	0x1e
+	.2byte	0x7aa
+	.4byte	0x8efa
+	.byte	0xb0
+	.uleb128 0x1b
+	.4byte	.LASF1944
+	.byte	0x1e
+	.2byte	0x7ab
+	.4byte	0x8efa
+	.byte	0xb8
+	.uleb128 0x1b
+	.4byte	.LASF1945
+	.byte	0x1e
+	.2byte	0x7ad
+	.4byte	0x8f42
+	.byte	0xc0
+	.uleb128 0x1b
+	.4byte	.LASF1946
+	.byte	0x1e
+	.2byte	0x7ae
+	.4byte	0x8f6b
+	.byte	0xc8
+	.uleb128 0x1b
+	.4byte	.LASF1947
+	.byte	0x1e
+	.2byte	0x7af
+	.4byte	0x8f86
+	.byte	0xd0
+	.uleb128 0x1b
+	.4byte	.LASF1948
+	.byte	0x1e
+	.2byte	0x7b1
+	.4byte	0x8fa5
+	.byte	0xd8
+	.uleb128 0x1b
+	.4byte	.LASF1949
+	.byte	0x1e
+	.2byte	0x7b2
+	.4byte	0x8fbf
+	.byte	0xe0
+	.uleb128 0x1b
+	.4byte	.LASF1950
+	.byte	0x1e
+	.2byte	0x7b4
+	.4byte	0x8fbf
+	.byte	0xe8
+	.uleb128 0x1b
+	.4byte	.LASF130
+	.byte	0x1e
+	.2byte	0x7b7
+	.4byte	0x15a
+	.byte	0xf0
+	.uleb128 0x1b
+	.4byte	.LASF131
+	.byte	0x1e
+	.2byte	0x7b8
+	.4byte	0x15a
+	.byte	0xf8
+	.uleb128 0x1c
+	.4byte	.LASF132
+	.byte	0x1e
+	.2byte	0x7b9
+	.4byte	0x15a
+	.2byte	0x100
+	.uleb128 0x1c
+	.4byte	.LASF133
+	.byte	0x1e
+	.2byte	0x7ba
+	.4byte	0x15a
+	.2byte	0x108
+	.byte	0
+	.uleb128 0x3
+	.4byte	0x83ba
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x8585
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x6d55
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x70ad
+	.uleb128 0x24
+	.4byte	.LASF1951
+	.uleb128 0x3
+	.4byte	0x859c
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x85a1
+	.uleb128 0x24
+	.4byte	.LASF1952
+	.uleb128 0x3
+	.4byte	0x85ac
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x85bc
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x85b1
+	.uleb128 0x24
+	.4byte	.LASF1953
+	.uleb128 0x3
+	.4byte	0x85c2
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x85c7
+	.uleb128 0x32
+	.string	"key"
+	.byte	0xd0
+	.byte	0x8b
+	.byte	0x9b
+	.4byte	0x869f
+	.uleb128 0xe
+	.4byte	.LASF579
+	.byte	0x8b
+	.byte	0x9c
+	.4byte	0x32c6
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF1954
+	.byte	0x8b
+	.byte	0x9d
+	.4byte	0x92e9
+	.byte	0x4
+	.uleb128 0x23
+	.4byte	0x93e4
+	.byte	0x8
+	.uleb128 0x20
+	.string	"sem"
+	.byte	0x8b
+	.byte	0xa2
+	.4byte	0x4d5c
+	.byte	0x20
+	.uleb128 0xe
+	.4byte	.LASF1086
+	.byte	0x8b
+	.byte	0xa3
+	.4byte	0x949b
+	.byte	0x50
+	.uleb128 0xe
+	.4byte	.LASF746
+	.byte	0x8b
+	.byte	0xa4
+	.4byte	0x458
+	.byte	0x58
+	.uleb128 0x23
+	.4byte	0x9403
+	.byte	0x60
+	.uleb128 0xe
+	.4byte	.LASF1955
+	.byte	0x8b
+	.byte	0xa9
+	.4byte	0x9d2
+	.byte	0x68
+	.uleb128 0x20
+	.string	"uid"
+	.byte	0x8b
+	.byte	0xaa
+	.4byte	0x240a
+	.byte	0x70
+	.uleb128 0x20
+	.string	"gid"
+	.byte	0x8b
+	.byte	0xab
+	.4byte	0x242a
+	.byte	0x74
+	.uleb128 0xe
+	.4byte	.LASF1956
+	.byte	0x8b
+	.byte	0xac
+	.4byte	0x92f4
+	.byte	0x78
+	.uleb128 0xe
+	.4byte	.LASF1957
+	.byte	0x8b
+	.byte	0xad
+	.4byte	0xb4
+	.byte	0x7c
+	.uleb128 0xe
+	.4byte	.LASF1958
+	.byte	0x8b
+	.byte	0xae
+	.4byte	0xb4
+	.byte	0x7e
+	.uleb128 0xe
+	.4byte	.LASF577
+	.byte	0x8b
+	.byte	0xb2
+	.4byte	0xa2
+	.byte	0x80
+	.uleb128 0xe
+	.4byte	.LASF171
+	.byte	0x8b
+	.byte	0xb9
+	.4byte	0x29
+	.byte	0x88
+	.uleb128 0x23
+	.4byte	0x9443
+	.byte	0x90
+	.uleb128 0x23
+	.4byte	0x947d
+	.byte	0xa8
+	.uleb128 0xe
+	.4byte	.LASF1959
+	.byte	0x8b
+	.byte	0xea
+	.4byte	0x94a1
+	.byte	0xc8
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x85d2
+	.uleb128 0x24
+	.4byte	.LASF1960
+	.uleb128 0x3
+	.4byte	0x86a5
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x86aa
+	.uleb128 0x24
+	.4byte	.LASF1961
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x86b5
+	.uleb128 0x24
+	.4byte	.LASF1962
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x86c0
+	.uleb128 0x5
+	.4byte	0x61
+	.4byte	0x86db
+	.uleb128 0x6
+	.4byte	0x4f
+	.byte	0x1f
+	.byte	0
+	.uleb128 0x1d
+	.4byte	.LASF1963
+	.byte	0x18
+	.byte	0x1e
+	.2byte	0x6c7
+	.4byte	0x871d
+	.uleb128 0x1b
+	.4byte	.LASF1964
+	.byte	0x1e
+	.2byte	0x6c8
+	.4byte	0x6d
+	.byte	0
+	.uleb128 0x1b
+	.4byte	.LASF1965
+	.byte	0x1e
+	.2byte	0x6c9
+	.4byte	0x6d
+	.byte	0x4
+	.uleb128 0x1b
+	.4byte	.LASF1966
+	.byte	0x1e
+	.2byte	0x6ca
+	.4byte	0x6d
+	.byte	0x8
+	.uleb128 0x1b
+	.4byte	.LASF1967
+	.byte	0x1e
+	.2byte	0x6cb
+	.4byte	0x871d
+	.byte	0x10
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x5ac8
+	.uleb128 0x13
+	.4byte	.LASF1968
+	.byte	0x1e
+	.2byte	0x6e9
+	.4byte	0x872f
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x8735
+	.uleb128 0x14
+	.4byte	0xc6
+	.4byte	0x875d
+	.uleb128 0x11
+	.4byte	0x875d
+	.uleb128 0x11
+	.4byte	0x56
+	.uleb128 0x11
+	.4byte	0xc6
+	.uleb128 0x11
+	.4byte	0x2d8
+	.uleb128 0x11
+	.4byte	0x15a
+	.uleb128 0x11
+	.4byte	0x6d
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x8763
+	.uleb128 0x1d
+	.4byte	.LASF1969
+	.byte	0x10
+	.byte	0x1e
+	.2byte	0x6ec
+	.4byte	0x878b
+	.uleb128 0x1b
+	.4byte	.LASF1970
+	.byte	0x1e
+	.2byte	0x6ed
+	.4byte	0x8723
+	.byte	0
+	.uleb128 0x2b
+	.string	"pos"
+	.byte	0x1e
+	.2byte	0x6ee
+	.4byte	0x2d8
+	.byte	0x8
+	.byte	0
+	.uleb128 0x14
+	.4byte	0x2d8
+	.4byte	0x87a4
+	.uleb128 0x11
+	.4byte	0x5482
+	.uleb128 0x11
+	.4byte	0x2d8
+	.uleb128 0x11
+	.4byte	0xc6
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x878b
+	.uleb128 0x14
+	.4byte	0x2ee
+	.4byte	0x87c8
+	.uleb128 0x11
+	.4byte	0x5482
+	.uleb128 0x11
+	.4byte	0x21e
+	.uleb128 0x11
+	.4byte	0x2e3
+	.uleb128 0x11
+	.4byte	0x87c8
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x2d8
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x87aa
+	.uleb128 0x14
+	.4byte	0x2ee
+	.4byte	0x87f2
+	.uleb128 0x11
+	.4byte	0x5482
+	.uleb128 0x11
+	.4byte	0x56
+	.uleb128 0x11
+	.4byte	0x2e3
+	.uleb128 0x11
+	.4byte	0x87c8
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x87d4
+	.uleb128 0x14
+	.4byte	0xc6
+	.4byte	0x880c
+	.uleb128 0x11
+	.4byte	0x5482
+	.uleb128 0x11
+	.4byte	0x875d
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x87f8
+	.uleb128 0x14
+	.4byte	0x244
+	.4byte	0x8826
+	.uleb128 0x11
+	.4byte	0x5482
+	.uleb128 0x11
+	.4byte	0x8826
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x882c
+	.uleb128 0x24
+	.4byte	.LASF1971
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x8812
+	.uleb128 0x14
+	.4byte	0x199
+	.4byte	0x8850
+	.uleb128 0x11
+	.4byte	0x5482
+	.uleb128 0x11
+	.4byte	0x6d
+	.uleb128 0x11
+	.4byte	0x29
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x8837
+	.uleb128 0x14
+	.4byte	0xc6
+	.4byte	0x886a
+	.uleb128 0x11
+	.4byte	0x5482
+	.uleb128 0x11
+	.4byte	0x3be9
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x8856
+	.uleb128 0x14
+	.4byte	0xc6
+	.4byte	0x8884
+	.uleb128 0x11
+	.4byte	0x1c7f
+	.uleb128 0x11
+	.4byte	0x5482
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x8870
+	.uleb128 0x14
+	.4byte	0xc6
+	.4byte	0x889e
+	.uleb128 0x11
+	.4byte	0x5482
+	.uleb128 0x11
+	.4byte	0x7e35
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x888a
+	.uleb128 0x14
+	.4byte	0xc6
+	.4byte	0x88c2
+	.uleb128 0x11
+	.4byte	0x5482
+	.uleb128 0x11
+	.4byte	0x2d8
+	.uleb128 0x11
+	.4byte	0x2d8
+	.uleb128 0x11
+	.4byte	0xc6
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x88a4
+	.uleb128 0x14
+	.4byte	0xc6
+	.4byte	0x88e1
+	.uleb128 0x11
+	.4byte	0xc6
+	.uleb128 0x11
+	.4byte	0x5482
+	.uleb128 0x11
+	.4byte	0xc6
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x88c8
+	.uleb128 0x14
+	.4byte	0xc6
+	.4byte	0x8900
+	.uleb128 0x11
+	.4byte	0x5482
+	.uleb128 0x11
+	.4byte	0xc6
+	.uleb128 0x11
+	.4byte	0x7e98
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x88e7
+	.uleb128 0x14
+	.4byte	0x2ee
+	.4byte	0x892e
+	.uleb128 0x11
+	.4byte	0x5482
+	.uleb128 0x11
+	.4byte	0x339d
+	.uleb128 0x11
+	.4byte	0xc6
+	.uleb128 0x11
+	.4byte	0x2e3
+	.uleb128 0x11
+	.4byte	0x87c8
+	.uleb128 0x11
+	.4byte	0xc6
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x8906
+	.uleb128 0x14
+	.4byte	0xc6
+	.4byte	0x8943
+	.uleb128 0x11
+	.4byte	0xc6
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x8934
+	.uleb128 0x14
+	.4byte	0x2ee
+	.4byte	0x896c
+	.uleb128 0x11
+	.4byte	0x4881
+	.uleb128 0x11
+	.4byte	0x5482
+	.uleb128 0x11
+	.4byte	0x87c8
+	.uleb128 0x11
+	.4byte	0x2e3
+	.uleb128 0x11
+	.4byte	0x6d
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x8949
+	.uleb128 0x14
+	.4byte	0x2ee
+	.4byte	0x8995
+	.uleb128 0x11
+	.4byte	0x5482
+	.uleb128 0x11
+	.4byte	0x87c8
+	.uleb128 0x11
+	.4byte	0x4881
+	.uleb128 0x11
+	.4byte	0x2e3
+	.uleb128 0x11
+	.4byte	0x6d
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x8972
+	.uleb128 0x14
+	.4byte	0xc6
+	.4byte	0x89b9
+	.uleb128 0x11
+	.4byte	0x5482
+	.uleb128 0x11
+	.4byte	0x199
+	.uleb128 0x11
+	.4byte	0x89b9
+	.uleb128 0x11
+	.4byte	0x7790
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x7e98
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x899b
+	.uleb128 0x14
+	.4byte	0x199
+	.4byte	0x89e3
+	.uleb128 0x11
+	.4byte	0x5482
+	.uleb128 0x11
+	.4byte	0xc6
+	.uleb128 0x11
+	.4byte	0x2d8
+	.uleb128 0x11
+	.4byte	0x2d8
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x89c5
+	.uleb128 0x10
+	.4byte	0x89f9
+	.uleb128 0x11
+	.4byte	0x89f9
+	.uleb128 0x11
+	.4byte	0x5482
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x89ff
+	.uleb128 0xd
+	.4byte	.LASF1972
+	.byte	0x80
+	.byte	0x8c
+	.byte	0x10
+	.4byte	0x8aa7
+	.uleb128 0x20
+	.string	"buf"
+	.byte	0x8c
+	.byte	0x11
+	.4byte	0x21e
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF957
+	.byte	0x8c
+	.byte	0x12
+	.4byte	0x2e3
+	.byte	0x8
+	.uleb128 0xe
+	.4byte	.LASF1973
+	.byte	0x8c
+	.byte	0x13
+	.4byte	0x2e3
+	.byte	0x10
+	.uleb128 0xe
+	.4byte	.LASF383
+	.byte	0x8c
+	.byte	0x14
+	.4byte	0x2e3
+	.byte	0x18
+	.uleb128 0xe
+	.4byte	.LASF1974
+	.byte	0x8c
+	.byte	0x15
+	.4byte	0x2e3
+	.byte	0x20
+	.uleb128 0xe
+	.4byte	.LASF850
+	.byte	0x8c
+	.byte	0x16
+	.4byte	0x2d8
+	.byte	0x28
+	.uleb128 0xe
+	.4byte	.LASF1975
+	.byte	0x8c
+	.byte	0x17
+	.4byte	0x2d8
+	.byte	0x30
+	.uleb128 0xe
+	.4byte	.LASF1693
+	.byte	0x8c
+	.byte	0x18
+	.4byte	0x15a
+	.byte	0x38
+	.uleb128 0xe
+	.4byte	.LASF116
+	.byte	0x8c
+	.byte	0x19
+	.4byte	0x2464
+	.byte	0x40
+	.uleb128 0x20
+	.string	"op"
+	.byte	0x8c
+	.byte	0x1a
+	.4byte	0x95dc
+	.byte	0x60
+	.uleb128 0xe
+	.4byte	.LASF1976
+	.byte	0x8c
+	.byte	0x1b
+	.4byte	0xc6
+	.byte	0x68
+	.uleb128 0xe
+	.4byte	.LASF1241
+	.byte	0x8c
+	.byte	0x1c
+	.4byte	0x95e2
+	.byte	0x70
+	.uleb128 0xe
+	.4byte	.LASF360
+	.byte	0x8c
+	.byte	0x1d
+	.4byte	0x458
+	.byte	0x78
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x89e9
+	.uleb128 0x14
+	.4byte	0x2ee
+	.4byte	0x8ad5
+	.uleb128 0x11
+	.4byte	0x5482
+	.uleb128 0x11
+	.4byte	0x2d8
+	.uleb128 0x11
+	.4byte	0x5482
+	.uleb128 0x11
+	.4byte	0x2d8
+	.uleb128 0x11
+	.4byte	0x2e3
+	.uleb128 0x11
+	.4byte	0x6d
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x8aad
+	.uleb128 0x14
+	.4byte	0xc6
+	.4byte	0x8afe
+	.uleb128 0x11
+	.4byte	0x5482
+	.uleb128 0x11
+	.4byte	0x2d8
+	.uleb128 0x11
+	.4byte	0x5482
+	.uleb128 0x11
+	.4byte	0x2d8
+	.uleb128 0x11
+	.4byte	0x15a
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x8adb
+	.uleb128 0x14
+	.4byte	0x1995
+	.4byte	0x8b1d
+	.uleb128 0x11
+	.4byte	0x1c7f
+	.uleb128 0x11
+	.4byte	0x1995
+	.uleb128 0x11
+	.4byte	0x6d
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x8b04
+	.uleb128 0x14
+	.4byte	0x56
+	.4byte	0x8b3c
+	.uleb128 0x11
+	.4byte	0x1995
+	.uleb128 0x11
+	.4byte	0x1c7f
+	.uleb128 0x11
+	.4byte	0x8b3c
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x5c30
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x8b23
+	.uleb128 0x14
+	.4byte	0xc6
+	.4byte	0x8b5c
+	.uleb128 0x11
+	.4byte	0x1c7f
+	.uleb128 0x11
+	.4byte	0xc6
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x8b48
+	.uleb128 0x14
+	.4byte	0xc6
+	.4byte	0x8b7b
+	.uleb128 0x11
+	.4byte	0x225e
+	.uleb128 0x11
+	.4byte	0x1c7f
+	.uleb128 0x11
+	.4byte	0xc6
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x8b62
+	.uleb128 0x14
+	.4byte	0x7b62
+	.4byte	0x8b95
+	.uleb128 0x11
+	.4byte	0x1c7f
+	.uleb128 0x11
+	.4byte	0xc6
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x8b81
+	.uleb128 0x14
+	.4byte	0xc6
+	.4byte	0x8bb4
+	.uleb128 0x11
+	.4byte	0x1995
+	.uleb128 0x11
+	.4byte	0x21e
+	.uleb128 0x11
+	.4byte	0xc6
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x8b9b
+	.uleb128 0x14
+	.4byte	0xc6
+	.4byte	0x8bd8
+	.uleb128 0x11
+	.4byte	0x1c7f
+	.uleb128 0x11
+	.4byte	0x1995
+	.uleb128 0x11
+	.4byte	0x28f
+	.uleb128 0x11
+	.4byte	0x2b0
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x8bba
+	.uleb128 0x14
+	.4byte	0xc6
+	.4byte	0x8bf7
+	.uleb128 0x11
+	.4byte	0x1995
+	.uleb128 0x11
+	.4byte	0x1c7f
+	.uleb128 0x11
+	.4byte	0x1995
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x8bde
+	.uleb128 0x14
+	.4byte	0xc6
+	.4byte	0x8c11
+	.uleb128 0x11
+	.4byte	0x1c7f
+	.uleb128 0x11
+	.4byte	0x1995
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x8bfd
+	.uleb128 0x14
+	.4byte	0xc6
+	.4byte	0x8c30
+	.uleb128 0x11
+	.4byte	0x1c7f
+	.uleb128 0x11
+	.4byte	0x1995
+	.uleb128 0x11
+	.4byte	0x56
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x8c17
+	.uleb128 0x14
+	.4byte	0xc6
+	.4byte	0x8c4f
+	.uleb128 0x11
+	.4byte	0x1c7f
+	.uleb128 0x11
+	.4byte	0x1995
+	.uleb128 0x11
+	.4byte	0x28f
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x8c36
+	.uleb128 0x14
+	.4byte	0xc6
+	.4byte	0x8c73
+	.uleb128 0x11
+	.4byte	0x1c7f
+	.uleb128 0x11
+	.4byte	0x1995
+	.uleb128 0x11
+	.4byte	0x28f
+	.uleb128 0x11
+	.4byte	0x284
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x8c55
+	.uleb128 0x14
+	.4byte	0xc6
+	.4byte	0x8c9c
+	.uleb128 0x11
+	.4byte	0x1c7f
+	.uleb128 0x11
+	.4byte	0x1995
+	.uleb128 0x11
+	.4byte	0x1c7f
+	.uleb128 0x11
+	.4byte	0x1995
+	.uleb128 0x11
+	.4byte	0x6d
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x8c79
+	.uleb128 0x14
+	.4byte	0xc6
+	.4byte	0x8cb6
+	.uleb128 0x11
+	.4byte	0x1995
+	.uleb128 0x11
+	.4byte	0x8cb6
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x5ec4
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x8ca2
+	.uleb128 0x14
+	.4byte	0xc6
+	.4byte	0x8cdb
+	.uleb128 0x11
+	.4byte	0x225e
+	.uleb128 0x11
+	.4byte	0x1995
+	.uleb128 0x11
+	.4byte	0x8cb6
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x8cc2
+	.uleb128 0x14
+	.4byte	0xc6
+	.4byte	0x8cff
+	.uleb128 0x11
+	.4byte	0x2112
+	.uleb128 0x11
+	.4byte	0x8cff
+	.uleb128 0x11
+	.4byte	0x13f
+	.uleb128 0x11
+	.4byte	0x6d
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x49c0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x8ce1
+	.uleb128 0x14
+	.4byte	0x2ee
+	.4byte	0x8d24
+	.uleb128 0x11
+	.4byte	0x1995
+	.uleb128 0x11
+	.4byte	0x21e
+	.uleb128 0x11
+	.4byte	0x2e3
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x8d0b
+	.uleb128 0x14
+	.4byte	0xc6
+	.4byte	0x8d48
+	.uleb128 0x11
+	.4byte	0x1c7f
+	.uleb128 0x11
+	.4byte	0x8d48
+	.uleb128 0x11
+	.4byte	0x15a
+	.uleb128 0x11
+	.4byte	0x15a
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x86db
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x8d2a
+	.uleb128 0x14
+	.4byte	0xc6
+	.4byte	0x8d6d
+	.uleb128 0x11
+	.4byte	0x1c7f
+	.uleb128 0x11
+	.4byte	0x8d6d
+	.uleb128 0x11
+	.4byte	0xc6
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xa27
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x8d54
+	.uleb128 0x14
+	.4byte	0xc6
+	.4byte	0x8d9c
+	.uleb128 0x11
+	.4byte	0x1c7f
+	.uleb128 0x11
+	.4byte	0x1995
+	.uleb128 0x11
+	.4byte	0x5482
+	.uleb128 0x11
+	.4byte	0x6d
+	.uleb128 0x11
+	.4byte	0x28f
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x8d79
+	.uleb128 0x14
+	.4byte	0xc6
+	.4byte	0x8dbb
+	.uleb128 0x11
+	.4byte	0x1c7f
+	.uleb128 0x11
+	.4byte	0x7b62
+	.uleb128 0x11
+	.4byte	0xc6
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x8da2
+	.uleb128 0x14
+	.4byte	0x1c7f
+	.4byte	0x8dd0
+	.uleb128 0x11
+	.4byte	0x20e7
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x8dc1
+	.uleb128 0x10
+	.4byte	0x8de1
+	.uleb128 0x11
+	.4byte	0x1c7f
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x8dd6
+	.uleb128 0x10
+	.4byte	0x8df7
+	.uleb128 0x11
+	.4byte	0x1c7f
+	.uleb128 0x11
+	.4byte	0xc6
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x8de7
+	.uleb128 0x14
+	.4byte	0xc6
+	.4byte	0x8e11
+	.uleb128 0x11
+	.4byte	0x1c7f
+	.uleb128 0x11
+	.4byte	0x76e5
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x8dfd
+	.uleb128 0x14
+	.4byte	0xc6
+	.4byte	0x8e26
+	.uleb128 0x11
+	.4byte	0x1c7f
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x8e17
+	.uleb128 0x10
+	.4byte	0x8e37
+	.uleb128 0x11
+	.4byte	0x20e7
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x8e2c
+	.uleb128 0x14
+	.4byte	0xc6
+	.4byte	0x8e4c
+	.uleb128 0x11
+	.4byte	0x20e7
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x8e3d
+	.uleb128 0x14
+	.4byte	0xc6
+	.4byte	0x8e66
+	.uleb128 0x11
+	.4byte	0x1995
+	.uleb128 0x11
+	.4byte	0x8e66
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x8e6c
+	.uleb128 0x24
+	.4byte	.LASF1977
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x8e52
+	.uleb128 0x14
+	.4byte	0xc6
+	.4byte	0x8e90
+	.uleb128 0x11
+	.4byte	0x20e7
+	.uleb128 0x11
+	.4byte	0x45a4
+	.uleb128 0x11
+	.4byte	0x21e
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x8e77
+	.uleb128 0x14
+	.4byte	0xc6
+	.4byte	0x8eb4
+	.uleb128 0x11
+	.4byte	0x225e
+	.uleb128 0x11
+	.4byte	0x20e7
+	.uleb128 0x11
+	.4byte	0x45a4
+	.uleb128 0x11
+	.4byte	0x21e
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x8e96
+	.uleb128 0x10
+	.4byte	0x8eca
+	.uleb128 0x11
+	.4byte	0x458
+	.uleb128 0x11
+	.4byte	0x458
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x8eba
+	.uleb128 0x10
+	.4byte	0x8ee0
+	.uleb128 0x11
+	.4byte	0x20e7
+	.uleb128 0x11
+	.4byte	0xc6
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x8ed0
+	.uleb128 0x14
+	.4byte	0xc6
+	.4byte	0x8efa
+	.uleb128 0x11
+	.4byte	0x89f9
+	.uleb128 0x11
+	.4byte	0x1995
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x8ee6
+	.uleb128 0x14
+	.4byte	0xc6
+	.4byte	0x8f19
+	.uleb128 0x11
+	.4byte	0x225e
+	.uleb128 0x11
+	.4byte	0x89f9
+	.uleb128 0x11
+	.4byte	0x1995
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x8f00
+	.uleb128 0x14
+	.4byte	0x2ee
+	.4byte	0x8f42
+	.uleb128 0x11
+	.4byte	0x20e7
+	.uleb128 0x11
+	.4byte	0xc6
+	.uleb128 0x11
+	.4byte	0x21e
+	.uleb128 0x11
+	.4byte	0x2e3
+	.uleb128 0x11
+	.4byte	0x2d8
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x8f1f
+	.uleb128 0x14
+	.4byte	0x2ee
+	.4byte	0x8f6b
+	.uleb128 0x11
+	.4byte	0x20e7
+	.uleb128 0x11
+	.4byte	0xc6
+	.uleb128 0x11
+	.4byte	0x56
+	.uleb128 0x11
+	.4byte	0x2e3
+	.uleb128 0x11
+	.4byte	0x2d8
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x8f48
+	.uleb128 0x14
+	.4byte	0x8f80
+	.4byte	0x8f80
+	.uleb128 0x11
+	.4byte	0x1c7f
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x68de
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x8f71
+	.uleb128 0x14
+	.4byte	0xc6
+	.4byte	0x8fa5
+	.uleb128 0x11
+	.4byte	0x20e7
+	.uleb128 0x11
+	.4byte	0x339d
+	.uleb128 0x11
+	.4byte	0x330
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x8f8c
+	.uleb128 0x14
+	.4byte	0x199
+	.4byte	0x8fbf
+	.uleb128 0x11
+	.4byte	0x20e7
+	.uleb128 0x11
+	.4byte	0x4b68
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x8fab
+	.uleb128 0x14
+	.4byte	0x1995
+	.4byte	0x8fe3
+	.uleb128 0x11
+	.4byte	0x83b4
+	.uleb128 0x11
+	.4byte	0xc6
+	.uleb128 0x11
+	.4byte	0x56
+	.uleb128 0x11
+	.4byte	0x458
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x8fc5
+	.uleb128 0x14
+	.4byte	0x1995
+	.4byte	0x900c
+	.uleb128 0x11
+	.4byte	0x225e
+	.uleb128 0x11
+	.4byte	0x83b4
+	.uleb128 0x11
+	.4byte	0xc6
+	.uleb128 0x11
+	.4byte	0x56
+	.uleb128 0x11
+	.4byte	0x458
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x8fe9
+	.uleb128 0x16
+	.4byte	0x458
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x9012
+	.uleb128 0x5
+	.4byte	0xe11
+	.4byte	0x902d
+	.uleb128 0x6
+	.4byte	0x4f
+	.byte	0x2
+	.byte	0
+	.uleb128 0xd
+	.4byte	.LASF1978
+	.byte	0x60
+	.byte	0x8d
+	.byte	0x42
+	.4byte	0x9108
+	.uleb128 0xe
+	.4byte	.LASF265
+	.byte	0x8d
+	.byte	0x43
+	.4byte	0x56
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF361
+	.byte	0x8d
+	.byte	0x44
+	.4byte	0x3a7
+	.byte	0x8
+	.uleb128 0xe
+	.4byte	.LASF639
+	.byte	0x8d
+	.byte	0x45
+	.4byte	0x9114
+	.byte	0x18
+	.uleb128 0xe
+	.4byte	.LASF1979
+	.byte	0x8d
+	.byte	0x46
+	.4byte	0xa002
+	.byte	0x20
+	.uleb128 0xe
+	.4byte	.LASF1980
+	.byte	0x8d
+	.byte	0x47
+	.4byte	0xa08d
+	.byte	0x28
+	.uleb128 0x20
+	.string	"sd"
+	.byte	0x8d
+	.byte	0x48
+	.4byte	0x98e7
+	.byte	0x30
+	.uleb128 0xe
+	.4byte	.LASF1981
+	.byte	0x8d
+	.byte	0x49
+	.4byte	0x9f66
+	.byte	0x38
+	.uleb128 0x35
+	.4byte	.LASF1982
+	.byte	0x8d
+	.byte	0x4d
+	.4byte	0x6d
+	.byte	0x4
+	.byte	0x1
+	.byte	0x1f
+	.byte	0x3c
+	.uleb128 0x35
+	.4byte	.LASF1983
+	.byte	0x8d
+	.byte	0x4e
+	.4byte	0x6d
+	.byte	0x4
+	.byte	0x1
+	.byte	0x1e
+	.byte	0x3c
+	.uleb128 0x35
+	.4byte	.LASF1984
+	.byte	0x8d
+	.byte	0x4f
+	.4byte	0x6d
+	.byte	0x4
+	.byte	0x1
+	.byte	0x1d
+	.byte	0x3c
+	.uleb128 0x35
+	.4byte	.LASF1985
+	.byte	0x8d
+	.byte	0x50
+	.4byte	0x6d
+	.byte	0x4
+	.byte	0x1
+	.byte	0x1c
+	.byte	0x3c
+	.uleb128 0x35
+	.4byte	.LASF1986
+	.byte	0x8d
+	.byte	0x51
+	.4byte	0x6d
+	.byte	0x4
+	.byte	0x1
+	.byte	0x1b
+	.byte	0x3c
+	.uleb128 0xe
+	.4byte	.LASF130
+	.byte	0x8d
+	.byte	0x53
+	.4byte	0x15a
+	.byte	0x40
+	.uleb128 0xe
+	.4byte	.LASF131
+	.byte	0x8d
+	.byte	0x54
+	.4byte	0x15a
+	.byte	0x48
+	.uleb128 0xe
+	.4byte	.LASF132
+	.byte	0x8d
+	.byte	0x55
+	.4byte	0x15a
+	.byte	0x50
+	.uleb128 0xe
+	.4byte	.LASF133
+	.byte	0x8d
+	.byte	0x56
+	.4byte	0x15a
+	.byte	0x58
+	.byte	0
+	.uleb128 0x15
+	.4byte	.LASF1987
+	.byte	0x1e
+	.2byte	0x93d
+	.4byte	0x9114
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x902d
+	.uleb128 0x15
+	.4byte	.LASF1988
+	.byte	0x1e
+	.2byte	0xa20
+	.4byte	0x5174
+	.uleb128 0x15
+	.4byte	.LASF1989
+	.byte	0x1e
+	.2byte	0xa38
+	.4byte	0x20e7
+	.uleb128 0x15
+	.4byte	.LASF1990
+	.byte	0x1e
+	.2byte	0xa5d
+	.4byte	0x7c9
+	.uleb128 0x15
+	.4byte	.LASF1991
+	.byte	0x1e
+	.2byte	0xa5e
+	.4byte	0x7c9
+	.uleb128 0x5
+	.4byte	0x5c
+	.4byte	0x915a
+	.uleb128 0x6
+	.4byte	0x4f
+	.byte	0x8
+	.byte	0
+	.uleb128 0x3
+	.4byte	0x914a
+	.uleb128 0x43
+	.4byte	.LASF3022
+	.byte	0x1e
+	.2byte	0xba4
+	.4byte	0x915a
+	.uleb128 0x15
+	.4byte	.LASF1992
+	.byte	0x1e
+	.2byte	0xc7f
+	.4byte	0x7c9
+	.uleb128 0x15
+	.4byte	.LASF1993
+	.byte	0x1e
+	.2byte	0xc8b
+	.4byte	0x7cd6
+	.uleb128 0x15
+	.4byte	.LASF1994
+	.byte	0x1e
+	.2byte	0xc9c
+	.4byte	0x7cd6
+	.uleb128 0x15
+	.4byte	.LASF1995
+	.byte	0x1e
+	.2byte	0xcee
+	.4byte	0x1d68
+	.uleb128 0x15
+	.4byte	.LASF1996
+	.byte	0x1e
+	.2byte	0xcf2
+	.4byte	0x7c9
+	.uleb128 0x15
+	.4byte	.LASF1997
+	.byte	0x1e
+	.2byte	0xcf3
+	.4byte	0x7cd6
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x2e3
+	.uleb128 0x8
+	.4byte	.LASF1998
+	.byte	0x8e
+	.byte	0x28
+	.4byte	0x91c4
+	.uleb128 0x14
+	.4byte	0xc6
+	.4byte	0x91e7
+	.uleb128 0x11
+	.4byte	0x91e7
+	.uleb128 0x11
+	.4byte	0xc6
+	.uleb128 0x11
+	.4byte	0x458
+	.uleb128 0x11
+	.4byte	0x91b3
+	.uleb128 0x11
+	.4byte	0x87c8
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x91ed
+	.uleb128 0xd
+	.4byte	.LASF1999
+	.byte	0x40
+	.byte	0x8e
+	.byte	0x71
+	.4byte	0x9266
+	.uleb128 0xe
+	.4byte	.LASF2000
+	.byte	0x8e
+	.byte	0x73
+	.4byte	0x56
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF793
+	.byte	0x8e
+	.byte	0x74
+	.4byte	0x458
+	.byte	0x8
+	.uleb128 0xe
+	.4byte	.LASF2001
+	.byte	0x8e
+	.byte	0x75
+	.4byte	0xc6
+	.byte	0x10
+	.uleb128 0xe
+	.4byte	.LASF874
+	.byte	0x8e
+	.byte	0x76
+	.4byte	0x28f
+	.byte	0x14
+	.uleb128 0xe
+	.4byte	.LASF2002
+	.byte	0x8e
+	.byte	0x77
+	.4byte	0x91e7
+	.byte	0x18
+	.uleb128 0xe
+	.4byte	.LASF1998
+	.byte	0x8e
+	.byte	0x78
+	.4byte	0x928b
+	.byte	0x20
+	.uleb128 0xe
+	.4byte	.LASF106
+	.byte	0x8e
+	.byte	0x79
+	.4byte	0x9291
+	.byte	0x28
+	.uleb128 0xe
+	.4byte	.LASF2003
+	.byte	0x8e
+	.byte	0x7a
+	.4byte	0x458
+	.byte	0x30
+	.uleb128 0xe
+	.4byte	.LASF2004
+	.byte	0x8e
+	.byte	0x7b
+	.4byte	0x458
+	.byte	0x38
+	.byte	0
+	.uleb128 0xd
+	.4byte	.LASF2005
+	.byte	0x20
+	.byte	0x8e
+	.byte	0x5f
+	.4byte	0x928b
+	.uleb128 0xe
+	.4byte	.LASF2006
+	.byte	0x8e
+	.byte	0x60
+	.4byte	0x37c
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF1069
+	.byte	0x8e
+	.byte	0x61
+	.4byte	0x15bf
+	.byte	0x8
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x91b9
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x9266
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x240a
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x242a
+	.uleb128 0x5
+	.4byte	0x91ed
+	.4byte	0x92ae
+	.uleb128 0x18
+	.byte	0
+	.uleb128 0x19
+	.4byte	.LASF2007
+	.byte	0x8e
+	.byte	0xca
+	.4byte	0x92a3
+	.uleb128 0xd
+	.4byte	.LASF2008
+	.byte	0x10
+	.byte	0x8f
+	.byte	0x1a
+	.4byte	0x92de
+	.uleb128 0xe
+	.4byte	.LASF1160
+	.byte	0x8f
+	.byte	0x1b
+	.4byte	0x92e3
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF2009
+	.byte	0x8f
+	.byte	0x1c
+	.4byte	0x29
+	.byte	0x8
+	.byte	0
+	.uleb128 0x24
+	.4byte	.LASF2010
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x92de
+	.uleb128 0x8
+	.4byte	.LASF2011
+	.byte	0x8b
+	.byte	0x21
+	.4byte	0x2f9
+	.uleb128 0x8
+	.4byte	.LASF2012
+	.byte	0x8b
+	.byte	0x24
+	.4byte	0x304
+	.uleb128 0xd
+	.4byte	.LASF2013
+	.byte	0x18
+	.byte	0x8b
+	.byte	0x58
+	.4byte	0x9330
+	.uleb128 0xe
+	.4byte	.LASF193
+	.byte	0x8b
+	.byte	0x59
+	.4byte	0x933a
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF2014
+	.byte	0x8b
+	.byte	0x5a
+	.4byte	0x56
+	.byte	0x8
+	.uleb128 0xe
+	.4byte	.LASF2015
+	.byte	0x8b
+	.byte	0x5b
+	.4byte	0x2e3
+	.byte	0x10
+	.byte	0
+	.uleb128 0x24
+	.4byte	.LASF2016
+	.uleb128 0x3
+	.4byte	0x9330
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x9330
+	.uleb128 0x36
+	.4byte	.LASF2017
+	.byte	0x20
+	.byte	0x8b
+	.byte	0x5e
+	.4byte	0x9363
+	.uleb128 0x22
+	.4byte	.LASF2018
+	.byte	0x8b
+	.byte	0x5f
+	.4byte	0x458
+	.uleb128 0x22
+	.4byte	.LASF793
+	.byte	0x8b
+	.byte	0x60
+	.4byte	0x9368
+	.byte	0
+	.uleb128 0x3
+	.4byte	0x9340
+	.uleb128 0x5
+	.4byte	0x458
+	.4byte	0x9378
+	.uleb128 0x6
+	.4byte	0x4f
+	.byte	0x3
+	.byte	0
+	.uleb128 0x8
+	.4byte	.LASF2019
+	.byte	0x8b
+	.byte	0x83
+	.4byte	0x9383
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x9389
+	.uleb128 0x14
+	.4byte	0xc6
+	.4byte	0x93a7
+	.uleb128 0x11
+	.4byte	0x869f
+	.uleb128 0x11
+	.4byte	0x93a7
+	.uleb128 0x11
+	.4byte	0x93ad
+	.uleb128 0x11
+	.4byte	0x869f
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x9335
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x9363
+	.uleb128 0xd
+	.4byte	.LASF2020
+	.byte	0x18
+	.byte	0x8b
+	.byte	0x88
+	.4byte	0x93e4
+	.uleb128 0xe
+	.4byte	.LASF2021
+	.byte	0x8b
+	.byte	0x89
+	.4byte	0x9378
+	.byte	0
+	.uleb128 0x20
+	.string	"key"
+	.byte	0x8b
+	.byte	0x8a
+	.4byte	0x869f
+	.byte	0x8
+	.uleb128 0xe
+	.4byte	.LASF2022
+	.byte	0x8b
+	.byte	0x8b
+	.4byte	0x933a
+	.byte	0x10
+	.byte	0
+	.uleb128 0x21
+	.byte	0x18
+	.byte	0x8b
+	.byte	0x9e
+	.4byte	0x9403
+	.uleb128 0x22
+	.4byte	.LASF2023
+	.byte	0x8b
+	.byte	0x9f
+	.4byte	0x3a7
+	.uleb128 0x22
+	.4byte	.LASF2024
+	.byte	0x8b
+	.byte	0xa0
+	.4byte	0x3416
+	.byte	0
+	.uleb128 0x21
+	.byte	0x8
+	.byte	0x8b
+	.byte	0xa5
+	.4byte	0x9422
+	.uleb128 0x22
+	.4byte	.LASF2025
+	.byte	0x8b
+	.byte	0xa6
+	.4byte	0x9d2
+	.uleb128 0x22
+	.4byte	.LASF2026
+	.byte	0x8b
+	.byte	0xa7
+	.4byte	0x9d2
+	.byte	0
+	.uleb128 0xf
+	.byte	0x10
+	.byte	0x8b
+	.byte	0xcc
+	.4byte	0x9443
+	.uleb128 0xe
+	.4byte	.LASF193
+	.byte	0x8b
+	.byte	0xcd
+	.4byte	0x933a
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF2014
+	.byte	0x8b
+	.byte	0xce
+	.4byte	0x21e
+	.byte	0x8
+	.byte	0
+	.uleb128 0x21
+	.byte	0x18
+	.byte	0x8b
+	.byte	0xca
+	.4byte	0x945c
+	.uleb128 0x22
+	.4byte	.LASF2027
+	.byte	0x8b
+	.byte	0xcb
+	.4byte	0x92ff
+	.uleb128 0x29
+	.4byte	0x9422
+	.byte	0
+	.uleb128 0xf
+	.byte	0x20
+	.byte	0x8b
+	.byte	0xd8
+	.4byte	0x947d
+	.uleb128 0xe
+	.4byte	.LASF2028
+	.byte	0x8b
+	.byte	0xda
+	.4byte	0x3a7
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF2029
+	.byte	0x8b
+	.byte	0xdb
+	.4byte	0x92b9
+	.byte	0x10
+	.byte	0
+	.uleb128 0x21
+	.byte	0x20
+	.byte	0x8b
+	.byte	0xd6
+	.4byte	0x9496
+	.uleb128 0x22
+	.4byte	.LASF2030
+	.byte	0x8b
+	.byte	0xd7
+	.4byte	0x9340
+	.uleb128 0x29
+	.4byte	0x945c
+	.byte	0
+	.uleb128 0x24
+	.4byte	.LASF2031
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x9496
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x93b3
+	.uleb128 0x15
+	.4byte	.LASF2032
+	.byte	0x8b
+	.2byte	0x190
+	.4byte	0x92a3
+	.uleb128 0xd
+	.4byte	.LASF2033
+	.byte	0x28
+	.byte	0x90
+	.byte	0xf
+	.4byte	0x9514
+	.uleb128 0xe
+	.4byte	.LASF116
+	.byte	0x90
+	.byte	0x10
+	.4byte	0xe33
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF2034
+	.byte	0x90
+	.byte	0x12
+	.4byte	0xc6
+	.byte	0x4
+	.uleb128 0xe
+	.4byte	.LASF2035
+	.byte	0x90
+	.byte	0x13
+	.4byte	0xc6
+	.byte	0x8
+	.uleb128 0xe
+	.4byte	.LASF2036
+	.byte	0x90
+	.byte	0x14
+	.4byte	0xc6
+	.byte	0xc
+	.uleb128 0xe
+	.4byte	.LASF2037
+	.byte	0x90
+	.byte	0x15
+	.4byte	0xc6
+	.byte	0x10
+	.uleb128 0xe
+	.4byte	.LASF2038
+	.byte	0x90
+	.byte	0x16
+	.4byte	0x29
+	.byte	0x18
+	.uleb128 0xe
+	.4byte	.LASF171
+	.byte	0x90
+	.byte	0x17
+	.4byte	0x29
+	.byte	0x20
+	.byte	0
+	.uleb128 0x19
+	.4byte	.LASF2039
+	.byte	0x90
+	.byte	0x4a
+	.4byte	0x94b3
+	.uleb128 0x19
+	.4byte	.LASF2040
+	.byte	0x62
+	.byte	0x3b
+	.4byte	0x3ac8
+	.uleb128 0xd
+	.4byte	.LASF1088
+	.byte	0x8
+	.byte	0x68
+	.byte	0x1e
+	.4byte	0x955b
+	.uleb128 0xe
+	.4byte	.LASF579
+	.byte	0x68
+	.byte	0x1f
+	.4byte	0x37c
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF2041
+	.byte	0x68
+	.byte	0x20
+	.4byte	0xc6
+	.byte	0x4
+	.uleb128 0x20
+	.string	"gid"
+	.byte	0x68
+	.byte	0x21
+	.4byte	0x955b
+	.byte	0x8
+	.byte	0
+	.uleb128 0x5
+	.4byte	0x242a
+	.4byte	0x956a
+	.uleb128 0x41
+	.4byte	0x4f
+	.byte	0
+	.uleb128 0x19
+	.4byte	.LASF2042
+	.byte	0x68
+	.byte	0x3d
+	.4byte	0x952a
+	.uleb128 0x21
+	.byte	0x10
+	.byte	0x68
+	.byte	0x9a
+	.4byte	0x9594
+	.uleb128 0x22
+	.4byte	.LASF2043
+	.byte	0x68
+	.byte	0x9b
+	.4byte	0xc6
+	.uleb128 0x28
+	.string	"rcu"
+	.byte	0x68
+	.byte	0x9c
+	.4byte	0x41c
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x952a
+	.uleb128 0xd
+	.4byte	.LASF2044
+	.byte	0x20
+	.byte	0x8c
+	.byte	0x20
+	.4byte	0x95d7
+	.uleb128 0xe
+	.4byte	.LASF1849
+	.byte	0x8c
+	.byte	0x21
+	.4byte	0x95fc
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF2045
+	.byte	0x8c
+	.byte	0x22
+	.4byte	0x9612
+	.byte	0x8
+	.uleb128 0xe
+	.4byte	.LASF64
+	.byte	0x8c
+	.byte	0x23
+	.4byte	0x9631
+	.byte	0x10
+	.uleb128 0xe
+	.4byte	.LASF2046
+	.byte	0x8c
+	.byte	0x24
+	.4byte	0x964b
+	.byte	0x18
+	.byte	0
+	.uleb128 0x3
+	.4byte	0x959a
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x95d7
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x547d
+	.uleb128 0x14
+	.4byte	0x458
+	.4byte	0x95fc
+	.uleb128 0x11
+	.4byte	0x89f9
+	.uleb128 0x11
+	.4byte	0x87c8
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x95e8
+	.uleb128 0x10
+	.4byte	0x9612
+	.uleb128 0x11
+	.4byte	0x89f9
+	.uleb128 0x11
+	.4byte	0x458
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x9602
+	.uleb128 0x14
+	.4byte	0x458
+	.4byte	0x9631
+	.uleb128 0x11
+	.4byte	0x89f9
+	.uleb128 0x11
+	.4byte	0x458
+	.uleb128 0x11
+	.4byte	0x87c8
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x9618
+	.uleb128 0x14
+	.4byte	0xc6
+	.4byte	0x964b
+	.uleb128 0x11
+	.4byte	0x89f9
+	.uleb128 0x11
+	.4byte	0x458
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x9637
+	.uleb128 0x19
+	.4byte	.LASF2047
+	.byte	0x91
+	.byte	0x28
+	.4byte	0x1995
+	.uleb128 0x19
+	.4byte	.LASF2048
+	.byte	0x92
+	.byte	0x18
+	.4byte	0x29
+	.uleb128 0x19
+	.4byte	.LASF2049
+	.byte	0x92
+	.byte	0x38
+	.4byte	0x29
+	.uleb128 0xd
+	.4byte	.LASF2050
+	.byte	0x60
+	.byte	0xe
+	.byte	0x14
+	.4byte	0x970f
+	.uleb128 0xe
+	.4byte	.LASF1849
+	.byte	0xe
+	.byte	0x15
+	.4byte	0x351
+	.byte	0
+	.uleb128 0x20
+	.string	"end"
+	.byte	0xe
+	.byte	0x16
+	.4byte	0x351
+	.byte	0x8
+	.uleb128 0xe
+	.4byte	.LASF265
+	.byte	0xe
+	.byte	0x17
+	.4byte	0x56
+	.byte	0x10
+	.uleb128 0xe
+	.4byte	.LASF171
+	.byte	0xe
+	.byte	0x18
+	.4byte	0x29
+	.byte	0x18
+	.uleb128 0xe
+	.4byte	.LASF771
+	.byte	0xe
+	.byte	0x19
+	.4byte	0x29
+	.byte	0x20
+	.uleb128 0xe
+	.4byte	.LASF639
+	.byte	0xe
+	.byte	0x1a
+	.4byte	0x9714
+	.byte	0x28
+	.uleb128 0xe
+	.4byte	.LASF641
+	.byte	0xe
+	.byte	0x1a
+	.4byte	0x9714
+	.byte	0x30
+	.uleb128 0xe
+	.4byte	.LASF2002
+	.byte	0xe
+	.byte	0x1a
+	.4byte	0x9714
+	.byte	0x38
+	.uleb128 0xe
+	.4byte	.LASF130
+	.byte	0xe
+	.byte	0x1c
+	.4byte	0x15a
+	.byte	0x40
+	.uleb128 0xe
+	.4byte	.LASF131
+	.byte	0xe
+	.byte	0x1d
+	.4byte	0x15a
+	.byte	0x48
+	.uleb128 0xe
+	.4byte	.LASF132
+	.byte	0xe
+	.byte	0x1e
+	.4byte	0x15a
+	.byte	0x50
+	.uleb128 0xe
+	.4byte	.LASF133
+	.byte	0xe
+	.byte	0x1f
+	.4byte	0x15a
+	.byte	0x58
+	.byte	0
+	.uleb128 0x3
+	.4byte	0x9672
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x9672
+	.uleb128 0x19
+	.4byte	.LASF2051
+	.byte	0xe
+	.byte	0xaf
+	.4byte	0x9672
+	.uleb128 0x19
+	.4byte	.LASF2052
+	.byte	0xe
+	.byte	0xb0
+	.4byte	0x9672
+	.uleb128 0x32
+	.string	"idr"
+	.byte	0x18
+	.byte	0x93
+	.byte	0x13
+	.4byte	0x9761
+	.uleb128 0xe
+	.4byte	.LASF2053
+	.byte	0x93
+	.byte	0x14
+	.4byte	0x4cff
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF2054
+	.byte	0x93
+	.byte	0x15
+	.4byte	0x6d
+	.byte	0x10
+	.uleb128 0xe
+	.4byte	.LASF2055
+	.byte	0x93
+	.byte	0x16
+	.4byte	0x6d
+	.byte	0x14
+	.byte	0
+	.uleb128 0xd
+	.4byte	.LASF2056
+	.byte	0x80
+	.byte	0x93
+	.byte	0xe0
+	.4byte	0x977a
+	.uleb128 0xe
+	.4byte	.LASF2057
+	.byte	0x93
+	.byte	0xe1
+	.4byte	0x17e
+	.byte	0
+	.byte	0
+	.uleb128 0x19
+	.4byte	.LASF2056
+	.byte	0x93
+	.byte	0xe4
+	.4byte	0x9785
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x9761
+	.uleb128 0xd
+	.4byte	.LASF2058
+	.byte	0x18
+	.byte	0x94
+	.byte	0x54
+	.4byte	0x97bc
+	.uleb128 0xe
+	.4byte	.LASF2059
+	.byte	0x94
+	.byte	0x55
+	.4byte	0x29
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF640
+	.byte	0x94
+	.byte	0x57
+	.4byte	0x344d
+	.byte	0x8
+	.uleb128 0xe
+	.4byte	.LASF1160
+	.byte	0x94
+	.byte	0x5d
+	.4byte	0x9828
+	.byte	0x10
+	.byte	0
+	.uleb128 0xd
+	.4byte	.LASF2060
+	.byte	0x60
+	.byte	0x94
+	.byte	0xbd
+	.4byte	0x9828
+	.uleb128 0x20
+	.string	"kn"
+	.byte	0x94
+	.byte	0xbf
+	.4byte	0x98e7
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF171
+	.byte	0x94
+	.byte	0xc0
+	.4byte	0x6d
+	.byte	0x8
+	.uleb128 0xe
+	.4byte	.LASF2061
+	.byte	0x94
+	.byte	0xc3
+	.4byte	0x9730
+	.byte	0x10
+	.uleb128 0xe
+	.4byte	.LASF2062
+	.byte	0x94
+	.byte	0xc4
+	.4byte	0x13f
+	.byte	0x28
+	.uleb128 0xe
+	.4byte	.LASF2063
+	.byte	0x94
+	.byte	0xc5
+	.4byte	0x13f
+	.byte	0x2c
+	.uleb128 0xe
+	.4byte	.LASF2064
+	.byte	0x94
+	.byte	0xc6
+	.4byte	0x9b9e
+	.byte	0x30
+	.uleb128 0xe
+	.4byte	.LASF2065
+	.byte	0x94
+	.byte	0xc9
+	.4byte	0x3a7
+	.byte	0x38
+	.uleb128 0xe
+	.4byte	.LASF2066
+	.byte	0x94
+	.byte	0xcb
+	.4byte	0x15bf
+	.byte	0x48
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x97bc
+	.uleb128 0xd
+	.4byte	.LASF2067
+	.byte	0x8
+	.byte	0x94
+	.byte	0x60
+	.4byte	0x9847
+	.uleb128 0xe
+	.4byte	.LASF2068
+	.byte	0x94
+	.byte	0x61
+	.4byte	0x98e7
+	.byte	0
+	.byte	0
+	.uleb128 0xd
+	.4byte	.LASF2069
+	.byte	0x80
+	.byte	0x94
+	.byte	0x83
+	.4byte	0x98e7
+	.uleb128 0xe
+	.4byte	.LASF383
+	.byte	0x94
+	.byte	0x84
+	.4byte	0x37c
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF852
+	.byte	0x94
+	.byte	0x85
+	.4byte	0x37c
+	.byte	0x4
+	.uleb128 0xe
+	.4byte	.LASF639
+	.byte	0x94
+	.byte	0x8f
+	.4byte	0x98e7
+	.byte	0x8
+	.uleb128 0xe
+	.4byte	.LASF265
+	.byte	0x94
+	.byte	0x90
+	.4byte	0x56
+	.byte	0x10
+	.uleb128 0x20
+	.string	"rb"
+	.byte	0x94
+	.byte	0x92
+	.4byte	0x3416
+	.byte	0x18
+	.uleb128 0x20
+	.string	"ns"
+	.byte	0x94
+	.byte	0x94
+	.4byte	0x30b6
+	.byte	0x30
+	.uleb128 0xe
+	.4byte	.LASF386
+	.byte	0x94
+	.byte	0x95
+	.4byte	0x6d
+	.byte	0x38
+	.uleb128 0x23
+	.4byte	0x9a39
+	.byte	0x40
+	.uleb128 0xe
+	.4byte	.LASF2070
+	.byte	0x94
+	.byte	0x9c
+	.4byte	0x458
+	.byte	0x60
+	.uleb128 0x20
+	.string	"id"
+	.byte	0x94
+	.byte	0x9e
+	.4byte	0x9a1d
+	.byte	0x68
+	.uleb128 0xe
+	.4byte	.LASF171
+	.byte	0x94
+	.byte	0x9f
+	.4byte	0xb4
+	.byte	0x70
+	.uleb128 0xe
+	.4byte	.LASF874
+	.byte	0x94
+	.byte	0xa0
+	.4byte	0x28f
+	.byte	0x72
+	.uleb128 0xe
+	.4byte	.LASF1402
+	.byte	0x94
+	.byte	0xa1
+	.4byte	0x9a68
+	.byte	0x78
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x9847
+	.uleb128 0xd
+	.4byte	.LASF2071
+	.byte	0x20
+	.byte	0x94
+	.byte	0x64
+	.4byte	0x992a
+	.uleb128 0x20
+	.string	"ops"
+	.byte	0x94
+	.byte	0x65
+	.4byte	0x99eb
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF111
+	.byte	0x94
+	.byte	0x66
+	.4byte	0x99f6
+	.byte	0x8
+	.uleb128 0xe
+	.4byte	.LASF957
+	.byte	0x94
+	.byte	0x67
+	.4byte	0x2d8
+	.byte	0x10
+	.uleb128 0xe
+	.4byte	.LASF2072
+	.byte	0x94
+	.byte	0x68
+	.4byte	0x98e7
+	.byte	0x18
+	.byte	0
+	.uleb128 0xd
+	.4byte	.LASF2073
+	.byte	0x70
+	.byte	0x94
+	.byte	0xe2
+	.4byte	0x99e6
+	.uleb128 0xe
+	.4byte	.LASF111
+	.byte	0x94
+	.byte	0xe7
+	.4byte	0x9c67
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF113
+	.byte	0x94
+	.byte	0xe8
+	.4byte	0x9c78
+	.byte	0x8
+	.uleb128 0xe
+	.4byte	.LASF2074
+	.byte	0x94
+	.byte	0xf5
+	.4byte	0x964b
+	.byte	0x10
+	.uleb128 0xe
+	.4byte	.LASF2075
+	.byte	0x94
+	.byte	0xf7
+	.4byte	0x95fc
+	.byte	0x18
+	.uleb128 0xe
+	.4byte	.LASF2076
+	.byte	0x94
+	.byte	0xf8
+	.4byte	0x9631
+	.byte	0x20
+	.uleb128 0xe
+	.4byte	.LASF2077
+	.byte	0x94
+	.byte	0xf9
+	.4byte	0x9612
+	.byte	0x28
+	.uleb128 0xe
+	.4byte	.LASF100
+	.byte	0x94
+	.byte	0xfb
+	.4byte	0x9c9c
+	.byte	0x30
+	.uleb128 0x1b
+	.4byte	.LASF2078
+	.byte	0x94
+	.2byte	0x105
+	.4byte	0x2e3
+	.byte	0x38
+	.uleb128 0x1b
+	.4byte	.LASF2079
+	.byte	0x94
+	.2byte	0x10c
+	.4byte	0x2b0
+	.byte	0x40
+	.uleb128 0x1b
+	.4byte	.LASF101
+	.byte	0x94
+	.2byte	0x10d
+	.4byte	0x9c9c
+	.byte	0x48
+	.uleb128 0x1b
+	.4byte	.LASF106
+	.byte	0x94
+	.2byte	0x110
+	.4byte	0x9cb6
+	.byte	0x50
+	.uleb128 0x1b
+	.4byte	.LASF109
+	.byte	0x94
+	.2byte	0x113
+	.4byte	0x9cd0
+	.byte	0x58
+	.uleb128 0x1b
+	.4byte	.LASF130
+	.byte	0x94
+	.2byte	0x119
+	.4byte	0x15a
+	.byte	0x60
+	.uleb128 0x1b
+	.4byte	.LASF131
+	.byte	0x94
+	.2byte	0x11a
+	.4byte	0x15a
+	.byte	0x68
+	.byte	0
+	.uleb128 0x3
+	.4byte	0x992a
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x99e6
+	.uleb128 0x24
+	.4byte	.LASF2080
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x99f1
+	.uleb128 0xf
+	.byte	0x8
+	.byte	0x94
+	.byte	0x6d
+	.4byte	0x9a1d
+	.uleb128 0x20
+	.string	"ino"
+	.byte	0x94
+	.byte	0x74
+	.4byte	0x13f
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF2081
+	.byte	0x94
+	.byte	0x75
+	.4byte	0x13f
+	.byte	0x4
+	.byte	0
+	.uleb128 0x36
+	.4byte	.LASF2082
+	.byte	0x8
+	.byte	0x94
+	.byte	0x6c
+	.4byte	0x9a39
+	.uleb128 0x29
+	.4byte	0x99fc
+	.uleb128 0x28
+	.string	"id"
+	.byte	0x94
+	.byte	0x77
+	.4byte	0x15a
+	.byte	0
+	.uleb128 0x21
+	.byte	0x20
+	.byte	0x94
+	.byte	0x96
+	.4byte	0x9a63
+	.uleb128 0x28
+	.string	"dir"
+	.byte	0x94
+	.byte	0x97
+	.4byte	0x978b
+	.uleb128 0x22
+	.4byte	.LASF1823
+	.byte	0x94
+	.byte	0x98
+	.4byte	0x982e
+	.uleb128 0x22
+	.4byte	.LASF2083
+	.byte	0x94
+	.byte	0x99
+	.4byte	0x98ed
+	.byte	0
+	.uleb128 0x24
+	.4byte	.LASF2084
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x9a63
+	.uleb128 0xd
+	.4byte	.LASF2085
+	.byte	0x50
+	.byte	0x94
+	.byte	0xab
+	.4byte	0x9af3
+	.uleb128 0xe
+	.4byte	.LASF1934
+	.byte	0x94
+	.byte	0xac
+	.4byte	0x9b0c
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF1940
+	.byte	0x94
+	.byte	0xad
+	.4byte	0x9b26
+	.byte	0x8
+	.uleb128 0xe
+	.4byte	.LASF1824
+	.byte	0x94
+	.byte	0xaf
+	.4byte	0x9b45
+	.byte	0x10
+	.uleb128 0xe
+	.4byte	.LASF1825
+	.byte	0x94
+	.byte	0xb1
+	.4byte	0x9b5a
+	.byte	0x18
+	.uleb128 0xe
+	.4byte	.LASF1827
+	.byte	0x94
+	.byte	0xb2
+	.4byte	0x9b79
+	.byte	0x20
+	.uleb128 0xe
+	.4byte	.LASF1943
+	.byte	0x94
+	.byte	0xb4
+	.4byte	0x9b98
+	.byte	0x28
+	.uleb128 0xe
+	.4byte	.LASF130
+	.byte	0x94
+	.byte	0xb7
+	.4byte	0x15a
+	.byte	0x30
+	.uleb128 0xe
+	.4byte	.LASF131
+	.byte	0x94
+	.byte	0xb8
+	.4byte	0x15a
+	.byte	0x38
+	.uleb128 0xe
+	.4byte	.LASF132
+	.byte	0x94
+	.byte	0xb9
+	.4byte	0x15a
+	.byte	0x40
+	.uleb128 0xe
+	.4byte	.LASF133
+	.byte	0x94
+	.byte	0xba
+	.4byte	0x15a
+	.byte	0x48
+	.byte	0
+	.uleb128 0x14
+	.4byte	0xc6
+	.4byte	0x9b0c
+	.uleb128 0x11
+	.4byte	0x9828
+	.uleb128 0x11
+	.4byte	0x45a4
+	.uleb128 0x11
+	.4byte	0x21e
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x9af3
+	.uleb128 0x14
+	.4byte	0xc6
+	.4byte	0x9b26
+	.uleb128 0x11
+	.4byte	0x89f9
+	.uleb128 0x11
+	.4byte	0x9828
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x9b12
+	.uleb128 0x14
+	.4byte	0xc6
+	.4byte	0x9b45
+	.uleb128 0x11
+	.4byte	0x98e7
+	.uleb128 0x11
+	.4byte	0x56
+	.uleb128 0x11
+	.4byte	0x28f
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x9b2c
+	.uleb128 0x14
+	.4byte	0xc6
+	.4byte	0x9b5a
+	.uleb128 0x11
+	.4byte	0x98e7
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x9b4b
+	.uleb128 0x14
+	.4byte	0xc6
+	.4byte	0x9b79
+	.uleb128 0x11
+	.4byte	0x98e7
+	.uleb128 0x11
+	.4byte	0x98e7
+	.uleb128 0x11
+	.4byte	0x56
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x9b60
+	.uleb128 0x14
+	.4byte	0xc6
+	.4byte	0x9b98
+	.uleb128 0x11
+	.4byte	0x89f9
+	.uleb128 0x11
+	.4byte	0x98e7
+	.uleb128 0x11
+	.4byte	0x9828
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x9b7f
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x9a6e
+	.uleb128 0xd
+	.4byte	.LASF2086
+	.byte	0x98
+	.byte	0x94
+	.byte	0xce
+	.4byte	0x9c52
+	.uleb128 0x20
+	.string	"kn"
+	.byte	0x94
+	.byte	0xd0
+	.4byte	0x98e7
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF1241
+	.byte	0x94
+	.byte	0xd1
+	.4byte	0x5482
+	.byte	0x8
+	.uleb128 0xe
+	.4byte	.LASF1972
+	.byte	0x94
+	.byte	0xd2
+	.4byte	0x89f9
+	.byte	0x10
+	.uleb128 0xe
+	.4byte	.LASF2070
+	.byte	0x94
+	.byte	0xd3
+	.4byte	0x458
+	.byte	0x18
+	.uleb128 0xe
+	.4byte	.LASF574
+	.byte	0x94
+	.byte	0xd6
+	.4byte	0x2464
+	.byte	0x20
+	.uleb128 0xe
+	.4byte	.LASF2087
+	.byte	0x94
+	.byte	0xd7
+	.4byte	0x2464
+	.byte	0x40
+	.uleb128 0xe
+	.4byte	.LASF2006
+	.byte	0x94
+	.byte	0xd8
+	.4byte	0xc6
+	.byte	0x60
+	.uleb128 0xe
+	.4byte	.LASF932
+	.byte	0x94
+	.byte	0xd9
+	.4byte	0x3a7
+	.byte	0x68
+	.uleb128 0xe
+	.4byte	.LASF2088
+	.byte	0x94
+	.byte	0xda
+	.4byte	0x21e
+	.byte	0x78
+	.uleb128 0xe
+	.4byte	.LASF2078
+	.byte	0x94
+	.byte	0xdc
+	.4byte	0x2e3
+	.byte	0x80
+	.uleb128 0x35
+	.4byte	.LASF2089
+	.byte	0x94
+	.byte	0xdd
+	.4byte	0x2b0
+	.byte	0x1
+	.byte	0x1
+	.byte	0x7
+	.byte	0x88
+	.uleb128 0x35
+	.4byte	.LASF2090
+	.byte	0x94
+	.byte	0xde
+	.4byte	0x2b0
+	.byte	0x1
+	.byte	0x1
+	.byte	0x6
+	.byte	0x88
+	.uleb128 0xe
+	.4byte	.LASF947
+	.byte	0x94
+	.byte	0xdf
+	.4byte	0x55d1
+	.byte	0x90
+	.byte	0
+	.uleb128 0x14
+	.4byte	0xc6
+	.4byte	0x9c61
+	.uleb128 0x11
+	.4byte	0x9c61
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x9ba4
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x9c52
+	.uleb128 0x10
+	.4byte	0x9c78
+	.uleb128 0x11
+	.4byte	0x9c61
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x9c6d
+	.uleb128 0x14
+	.4byte	0x2ee
+	.4byte	0x9c9c
+	.uleb128 0x11
+	.4byte	0x9c61
+	.uleb128 0x11
+	.4byte	0x21e
+	.uleb128 0x11
+	.4byte	0x2e3
+	.uleb128 0x11
+	.4byte	0x2d8
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x9c7e
+	.uleb128 0x14
+	.4byte	0x244
+	.4byte	0x9cb6
+	.uleb128 0x11
+	.4byte	0x9c61
+	.uleb128 0x11
+	.4byte	0x8826
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x9ca2
+	.uleb128 0x14
+	.4byte	0xc6
+	.4byte	0x9cd0
+	.uleb128 0x11
+	.4byte	0x9c61
+	.uleb128 0x11
+	.4byte	0x3be9
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x9cbc
+	.uleb128 0x1f
+	.4byte	.LASF2091
+	.byte	0x4
+	.4byte	0x6d
+	.byte	0x95
+	.byte	0x1a
+	.4byte	0x9cf9
+	.uleb128 0xc
+	.4byte	.LASF2092
+	.byte	0
+	.uleb128 0xc
+	.4byte	.LASF2093
+	.byte	0x1
+	.uleb128 0xc
+	.4byte	.LASF2094
+	.byte	0x2
+	.byte	0
+	.uleb128 0xd
+	.4byte	.LASF2095
+	.byte	0x30
+	.byte	0x95
+	.byte	0x27
+	.4byte	0x9d4e
+	.uleb128 0xe
+	.4byte	.LASF193
+	.byte	0x95
+	.byte	0x28
+	.4byte	0x9cd6
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF2096
+	.byte	0x95
+	.byte	0x29
+	.4byte	0x9d58
+	.byte	0x8
+	.uleb128 0xe
+	.4byte	.LASF2097
+	.byte	0x95
+	.byte	0x2a
+	.4byte	0x9017
+	.byte	0x10
+	.uleb128 0xe
+	.4byte	.LASF2098
+	.byte	0x95
+	.byte	0x2b
+	.4byte	0x9d78
+	.byte	0x18
+	.uleb128 0xe
+	.4byte	.LASF2099
+	.byte	0x95
+	.byte	0x2c
+	.4byte	0x9d83
+	.byte	0x20
+	.uleb128 0xe
+	.4byte	.LASF2100
+	.byte	0x95
+	.byte	0x2d
+	.4byte	0x2f2f
+	.byte	0x28
+	.byte	0
+	.uleb128 0x3
+	.4byte	0x9cf9
+	.uleb128 0x16
+	.4byte	0x2b0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x9d53
+	.uleb128 0x14
+	.4byte	0x30b6
+	.4byte	0x9d6d
+	.uleb128 0x11
+	.4byte	0x9d6d
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x9d73
+	.uleb128 0x24
+	.4byte	.LASF2101
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x9d5e
+	.uleb128 0x16
+	.4byte	0x30b6
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x9d7e
+	.uleb128 0xd
+	.4byte	.LASF2102
+	.byte	0x10
+	.byte	0x96
+	.byte	0x1e
+	.4byte	0x9dae
+	.uleb128 0xe
+	.4byte	.LASF265
+	.byte	0x96
+	.byte	0x1f
+	.4byte	0x56
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF874
+	.byte	0x96
+	.byte	0x20
+	.4byte	0x28f
+	.byte	0x8
+	.byte	0
+	.uleb128 0xd
+	.4byte	.LASF2103
+	.byte	0x28
+	.byte	0x96
+	.byte	0x54
+	.4byte	0x9df7
+	.uleb128 0xe
+	.4byte	.LASF265
+	.byte	0x96
+	.byte	0x55
+	.4byte	0x56
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF2104
+	.byte	0x96
+	.byte	0x56
+	.4byte	0x9e1b
+	.byte	0x8
+	.uleb128 0xe
+	.4byte	.LASF2105
+	.byte	0x96
+	.byte	0x58
+	.4byte	0x9e95
+	.byte	0x10
+	.uleb128 0xe
+	.4byte	.LASF2106
+	.byte	0x96
+	.byte	0x5a
+	.4byte	0x9e9b
+	.byte	0x18
+	.uleb128 0xe
+	.4byte	.LASF2107
+	.byte	0x96
+	.byte	0x5b
+	.4byte	0x9ea1
+	.byte	0x20
+	.byte	0
+	.uleb128 0x3
+	.4byte	0x9dae
+	.uleb128 0x14
+	.4byte	0x28f
+	.4byte	0x9e15
+	.uleb128 0x11
+	.4byte	0x9114
+	.uleb128 0x11
+	.4byte	0x9e15
+	.uleb128 0x11
+	.4byte	0xc6
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x9d89
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x9dfc
+	.uleb128 0x14
+	.4byte	0x28f
+	.4byte	0x9e3a
+	.uleb128 0x11
+	.4byte	0x9114
+	.uleb128 0x11
+	.4byte	0x9e3a
+	.uleb128 0x11
+	.4byte	0xc6
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x9e40
+	.uleb128 0xd
+	.4byte	.LASF2108
+	.byte	0x38
+	.byte	0x96
+	.byte	0xa1
+	.4byte	0x9e95
+	.uleb128 0xe
+	.4byte	.LASF2083
+	.byte	0x96
+	.byte	0xa2
+	.4byte	0x9d89
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF957
+	.byte	0x96
+	.byte	0xa3
+	.4byte	0x2e3
+	.byte	0x10
+	.uleb128 0xe
+	.4byte	.LASF360
+	.byte	0x96
+	.byte	0xa4
+	.4byte	0x458
+	.byte	0x18
+	.uleb128 0xe
+	.4byte	.LASF100
+	.byte	0x96
+	.byte	0xa5
+	.4byte	0x9ecf
+	.byte	0x20
+	.uleb128 0xe
+	.4byte	.LASF101
+	.byte	0x96
+	.byte	0xa7
+	.4byte	0x9ecf
+	.byte	0x28
+	.uleb128 0xe
+	.4byte	.LASF109
+	.byte	0x96
+	.byte	0xa9
+	.4byte	0x9ef3
+	.byte	0x30
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x9e21
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x9e15
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x9e3a
+	.uleb128 0x14
+	.4byte	0x2ee
+	.4byte	0x9ecf
+	.uleb128 0x11
+	.4byte	0x5482
+	.uleb128 0x11
+	.4byte	0x9114
+	.uleb128 0x11
+	.4byte	0x9e3a
+	.uleb128 0x11
+	.4byte	0x21e
+	.uleb128 0x11
+	.4byte	0x2d8
+	.uleb128 0x11
+	.4byte	0x2e3
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x9ea7
+	.uleb128 0x14
+	.4byte	0xc6
+	.4byte	0x9ef3
+	.uleb128 0x11
+	.4byte	0x5482
+	.uleb128 0x11
+	.4byte	0x9114
+	.uleb128 0x11
+	.4byte	0x9e3a
+	.uleb128 0x11
+	.4byte	0x3be9
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x9ed5
+	.uleb128 0xd
+	.4byte	.LASF2109
+	.byte	0x10
+	.byte	0x96
+	.byte	0xd6
+	.4byte	0x9f1e
+	.uleb128 0xe
+	.4byte	.LASF2046
+	.byte	0x96
+	.byte	0xd7
+	.4byte	0x9f3c
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF2110
+	.byte	0x96
+	.byte	0xd8
+	.4byte	0x9f60
+	.byte	0x8
+	.byte	0
+	.uleb128 0x3
+	.4byte	0x9ef9
+	.uleb128 0x14
+	.4byte	0x2ee
+	.4byte	0x9f3c
+	.uleb128 0x11
+	.4byte	0x9114
+	.uleb128 0x11
+	.4byte	0x9e15
+	.uleb128 0x11
+	.4byte	0x21e
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x9f23
+	.uleb128 0x14
+	.4byte	0x2ee
+	.4byte	0x9f60
+	.uleb128 0x11
+	.4byte	0x9114
+	.uleb128 0x11
+	.4byte	0x9e15
+	.uleb128 0x11
+	.4byte	0x56
+	.uleb128 0x11
+	.4byte	0x2e3
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x9f42
+	.uleb128 0xd
+	.4byte	.LASF1981
+	.byte	0x4
+	.byte	0x97
+	.byte	0x15
+	.4byte	0x9f7f
+	.uleb128 0xe
+	.4byte	.LASF1095
+	.byte	0x97
+	.byte	0x16
+	.4byte	0x32c6
+	.byte	0
+	.byte	0
+	.uleb128 0x19
+	.4byte	.LASF2111
+	.byte	0x8d
+	.byte	0x26
+	.4byte	0x500
+	.uleb128 0x19
+	.4byte	.LASF2112
+	.byte	0x8d
+	.byte	0x2a
+	.4byte	0x15a
+	.uleb128 0xd
+	.4byte	.LASF1979
+	.byte	0xa0
+	.byte	0x8d
+	.byte	0xcb
+	.4byte	0xa002
+	.uleb128 0xe
+	.4byte	.LASF932
+	.byte	0x8d
+	.byte	0xcc
+	.4byte	0x3a7
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF2113
+	.byte	0x8d
+	.byte	0xcd
+	.4byte	0xe65
+	.byte	0x10
+	.uleb128 0xe
+	.4byte	.LASF2114
+	.byte	0x8d
+	.byte	0xce
+	.4byte	0x902d
+	.byte	0x18
+	.uleb128 0xe
+	.4byte	.LASF2115
+	.byte	0x8d
+	.byte	0xcf
+	.4byte	0xa296
+	.byte	0x78
+	.uleb128 0xe
+	.4byte	.LASF130
+	.byte	0x8d
+	.byte	0xd1
+	.4byte	0x15a
+	.byte	0x80
+	.uleb128 0xe
+	.4byte	.LASF131
+	.byte	0x8d
+	.byte	0xd2
+	.4byte	0x15a
+	.byte	0x88
+	.uleb128 0xe
+	.4byte	.LASF132
+	.byte	0x8d
+	.byte	0xd3
+	.4byte	0x15a
+	.byte	0x90
+	.uleb128 0xe
+	.4byte	.LASF133
+	.byte	0x8d
+	.byte	0xd4
+	.4byte	0x15a
+	.byte	0x98
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x9f95
+	.uleb128 0xd
+	.4byte	.LASF2116
+	.byte	0x50
+	.byte	0x8d
+	.byte	0x91
+	.4byte	0xa08d
+	.uleb128 0xe
+	.4byte	.LASF113
+	.byte	0x8d
+	.byte	0x92
+	.4byte	0xa09e
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF2109
+	.byte	0x8d
+	.byte	0x93
+	.4byte	0xa0a4
+	.byte	0x8
+	.uleb128 0xe
+	.4byte	.LASF2117
+	.byte	0x8d
+	.byte	0x94
+	.4byte	0x9e9b
+	.byte	0x10
+	.uleb128 0xe
+	.4byte	.LASF2118
+	.byte	0x8d
+	.byte	0x95
+	.4byte	0xa0bf
+	.byte	0x18
+	.uleb128 0xe
+	.4byte	.LASF2119
+	.byte	0x8d
+	.byte	0x96
+	.4byte	0xa0d4
+	.byte	0x20
+	.uleb128 0xe
+	.4byte	.LASF2120
+	.byte	0x8d
+	.byte	0x97
+	.4byte	0xa0ef
+	.byte	0x28
+	.uleb128 0xe
+	.4byte	.LASF130
+	.byte	0x8d
+	.byte	0x99
+	.4byte	0x15a
+	.byte	0x30
+	.uleb128 0xe
+	.4byte	.LASF131
+	.byte	0x8d
+	.byte	0x9a
+	.4byte	0x15a
+	.byte	0x38
+	.uleb128 0xe
+	.4byte	.LASF132
+	.byte	0x8d
+	.byte	0x9b
+	.4byte	0x15a
+	.byte	0x40
+	.uleb128 0xe
+	.4byte	.LASF133
+	.byte	0x8d
+	.byte	0x9c
+	.4byte	0x15a
+	.byte	0x48
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xa008
+	.uleb128 0x10
+	.4byte	0xa09e
+	.uleb128 0x11
+	.4byte	0x9114
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xa093
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x9f1e
+	.uleb128 0x14
+	.4byte	0xa0b9
+	.4byte	0xa0b9
+	.uleb128 0x11
+	.4byte	0x9114
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x9d4e
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xa0aa
+	.uleb128 0x14
+	.4byte	0x30b6
+	.4byte	0xa0d4
+	.uleb128 0x11
+	.4byte	0x9114
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xa0c5
+	.uleb128 0x10
+	.4byte	0xa0ef
+	.uleb128 0x11
+	.4byte	0x9114
+	.uleb128 0x11
+	.4byte	0x9297
+	.uleb128 0x11
+	.4byte	0x929d
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xa0da
+	.uleb128 0x26
+	.4byte	.LASF2121
+	.2byte	0x1220
+	.byte	0x8d
+	.byte	0x9f
+	.4byte	0xa142
+	.uleb128 0xe
+	.4byte	.LASF2122
+	.byte	0x8d
+	.byte	0xa0
+	.4byte	0xa142
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF2123
+	.byte	0x8d
+	.byte	0xa1
+	.4byte	0xa152
+	.byte	0x18
+	.uleb128 0x27
+	.4byte	.LASF2124
+	.byte	0x8d
+	.byte	0xa2
+	.4byte	0xc6
+	.2byte	0x218
+	.uleb128 0x44
+	.string	"buf"
+	.byte	0x8d
+	.byte	0xa3
+	.4byte	0xa162
+	.2byte	0x21c
+	.uleb128 0x27
+	.4byte	.LASF2125
+	.byte	0x8d
+	.byte	0xa4
+	.4byte	0xc6
+	.2byte	0x121c
+	.byte	0
+	.uleb128 0x5
+	.4byte	0x21e
+	.4byte	0xa152
+	.uleb128 0x6
+	.4byte	0x4f
+	.byte	0x2
+	.byte	0
+	.uleb128 0x5
+	.4byte	0x21e
+	.4byte	0xa162
+	.uleb128 0x6
+	.4byte	0x4f
+	.byte	0x3f
+	.byte	0
+	.uleb128 0x5
+	.4byte	0x61
+	.4byte	0xa173
+	.uleb128 0x40
+	.4byte	0x4f
+	.2byte	0xfff
+	.byte	0
+	.uleb128 0xd
+	.4byte	.LASF2126
+	.byte	0x18
+	.byte	0x8d
+	.byte	0xa7
+	.4byte	0xa1a4
+	.uleb128 0xe
+	.4byte	.LASF875
+	.byte	0x8d
+	.byte	0xa8
+	.4byte	0xa1c3
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF265
+	.byte	0x8d
+	.byte	0xa9
+	.4byte	0xa1e2
+	.byte	0x8
+	.uleb128 0xe
+	.4byte	.LASF2127
+	.byte	0x8d
+	.byte	0xaa
+	.4byte	0xa20c
+	.byte	0x10
+	.byte	0
+	.uleb128 0x3
+	.4byte	0xa173
+	.uleb128 0x14
+	.4byte	0xc6
+	.4byte	0xa1bd
+	.uleb128 0x11
+	.4byte	0xa002
+	.uleb128 0x11
+	.4byte	0x9114
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xa1a9
+	.uleb128 0x3
+	.4byte	0xa1bd
+	.uleb128 0x14
+	.4byte	0x56
+	.4byte	0xa1dc
+	.uleb128 0x11
+	.4byte	0xa002
+	.uleb128 0x11
+	.4byte	0x9114
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xa1c8
+	.uleb128 0x3
+	.4byte	0xa1dc
+	.uleb128 0x14
+	.4byte	0xc6
+	.4byte	0xa200
+	.uleb128 0x11
+	.4byte	0xa002
+	.uleb128 0x11
+	.4byte	0x9114
+	.uleb128 0x11
+	.4byte	0xa200
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xa0f5
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xa1e7
+	.uleb128 0x3
+	.4byte	0xa206
+	.uleb128 0xd
+	.4byte	.LASF2128
+	.byte	0x20
+	.byte	0x8d
+	.byte	0xae
+	.4byte	0xa242
+	.uleb128 0xe
+	.4byte	.LASF2083
+	.byte	0x8d
+	.byte	0xaf
+	.4byte	0x9d89
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF2046
+	.byte	0x8d
+	.byte	0xb0
+	.4byte	0xa261
+	.byte	0x10
+	.uleb128 0xe
+	.4byte	.LASF2110
+	.byte	0x8d
+	.byte	0xb2
+	.4byte	0xa285
+	.byte	0x18
+	.byte	0
+	.uleb128 0x14
+	.4byte	0x2ee
+	.4byte	0xa25b
+	.uleb128 0x11
+	.4byte	0x9114
+	.uleb128 0x11
+	.4byte	0xa25b
+	.uleb128 0x11
+	.4byte	0x21e
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xa211
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xa242
+	.uleb128 0x14
+	.4byte	0x2ee
+	.4byte	0xa285
+	.uleb128 0x11
+	.4byte	0x9114
+	.uleb128 0x11
+	.4byte	0xa25b
+	.uleb128 0x11
+	.4byte	0x56
+	.uleb128 0x11
+	.4byte	0x2e3
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xa267
+	.uleb128 0x19
+	.4byte	.LASF2129
+	.byte	0x8d
+	.byte	0xb6
+	.4byte	0x9f1e
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xa1a4
+	.uleb128 0x19
+	.4byte	.LASF2130
+	.byte	0x8d
+	.byte	0xf5
+	.4byte	0x9114
+	.uleb128 0x19
+	.4byte	.LASF2131
+	.byte	0x8d
+	.byte	0xf7
+	.4byte	0x9114
+	.uleb128 0x19
+	.4byte	.LASF2132
+	.byte	0x8d
+	.byte	0xf9
+	.4byte	0x9114
+	.uleb128 0x19
+	.4byte	.LASF2133
+	.byte	0x8d
+	.byte	0xfb
+	.4byte	0x9114
+	.uleb128 0x19
+	.4byte	.LASF2134
+	.byte	0x8d
+	.byte	0xfd
+	.4byte	0x9114
+	.uleb128 0xd
+	.4byte	.LASF2135
+	.byte	0x20
+	.byte	0x98
+	.byte	0x27
+	.4byte	0xa304
+	.uleb128 0xe
+	.4byte	.LASF2136
+	.byte	0x98
+	.byte	0x28
+	.4byte	0x458
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF2137
+	.byte	0x98
+	.byte	0x29
+	.4byte	0x3a7
+	.byte	0x8
+	.uleb128 0xe
+	.4byte	.LASF2138
+	.byte	0x98
+	.byte	0x2a
+	.4byte	0x9f66
+	.byte	0x18
+	.byte	0
+	.uleb128 0x19
+	.4byte	.LASF2139
+	.byte	0x99
+	.byte	0x22
+	.4byte	0x4b7
+	.uleb128 0x19
+	.4byte	.LASF2140
+	.byte	0x99
+	.byte	0x23
+	.4byte	0x4b7
+	.uleb128 0x19
+	.4byte	.LASF2141
+	.byte	0x99
+	.byte	0x39
+	.4byte	0x579
+	.uleb128 0xd
+	.4byte	.LASF2142
+	.byte	0x4
+	.byte	0x99
+	.byte	0x3e
+	.4byte	0xa33e
+	.uleb128 0xe
+	.4byte	.LASF2006
+	.byte	0x99
+	.byte	0x3f
+	.4byte	0xc6
+	.byte	0
+	.byte	0
+	.uleb128 0x8
+	.4byte	.LASF2143
+	.byte	0x99
+	.byte	0x40
+	.4byte	0xa325
+	.uleb128 0x1d
+	.4byte	.LASF2144
+	.byte	0xb8
+	.byte	0x99
+	.2byte	0x122
+	.4byte	0xa482
+	.uleb128 0x1b
+	.4byte	.LASF2145
+	.byte	0x99
+	.2byte	0x123
+	.4byte	0xa778
+	.byte	0
+	.uleb128 0x1b
+	.4byte	.LASF2146
+	.byte	0x99
+	.2byte	0x124
+	.4byte	0xa789
+	.byte	0x8
+	.uleb128 0x1b
+	.4byte	.LASF2147
+	.byte	0x99
+	.2byte	0x125
+	.4byte	0xa778
+	.byte	0x10
+	.uleb128 0x1b
+	.4byte	.LASF2148
+	.byte	0x99
+	.2byte	0x126
+	.4byte	0xa778
+	.byte	0x18
+	.uleb128 0x1b
+	.4byte	.LASF2149
+	.byte	0x99
+	.2byte	0x127
+	.4byte	0xa778
+	.byte	0x20
+	.uleb128 0x1b
+	.4byte	.LASF2150
+	.byte	0x99
+	.2byte	0x128
+	.4byte	0xa778
+	.byte	0x28
+	.uleb128 0x1b
+	.4byte	.LASF2151
+	.byte	0x99
+	.2byte	0x129
+	.4byte	0xa778
+	.byte	0x30
+	.uleb128 0x1b
+	.4byte	.LASF2152
+	.byte	0x99
+	.2byte	0x12a
+	.4byte	0xa778
+	.byte	0x38
+	.uleb128 0x1b
+	.4byte	.LASF2153
+	.byte	0x99
+	.2byte	0x12b
+	.4byte	0xa778
+	.byte	0x40
+	.uleb128 0x1b
+	.4byte	.LASF2154
+	.byte	0x99
+	.2byte	0x12c
+	.4byte	0xa778
+	.byte	0x48
+	.uleb128 0x1b
+	.4byte	.LASF2155
+	.byte	0x99
+	.2byte	0x12d
+	.4byte	0xa778
+	.byte	0x50
+	.uleb128 0x1b
+	.4byte	.LASF2156
+	.byte	0x99
+	.2byte	0x12e
+	.4byte	0xa778
+	.byte	0x58
+	.uleb128 0x1b
+	.4byte	.LASF2157
+	.byte	0x99
+	.2byte	0x12f
+	.4byte	0xa778
+	.byte	0x60
+	.uleb128 0x1b
+	.4byte	.LASF2158
+	.byte	0x99
+	.2byte	0x130
+	.4byte	0xa778
+	.byte	0x68
+	.uleb128 0x1b
+	.4byte	.LASF2159
+	.byte	0x99
+	.2byte	0x131
+	.4byte	0xa778
+	.byte	0x70
+	.uleb128 0x1b
+	.4byte	.LASF2160
+	.byte	0x99
+	.2byte	0x132
+	.4byte	0xa778
+	.byte	0x78
+	.uleb128 0x1b
+	.4byte	.LASF2161
+	.byte	0x99
+	.2byte	0x133
+	.4byte	0xa778
+	.byte	0x80
+	.uleb128 0x1b
+	.4byte	.LASF2162
+	.byte	0x99
+	.2byte	0x134
+	.4byte	0xa778
+	.byte	0x88
+	.uleb128 0x1b
+	.4byte	.LASF2163
+	.byte	0x99
+	.2byte	0x135
+	.4byte	0xa778
+	.byte	0x90
+	.uleb128 0x1b
+	.4byte	.LASF2164
+	.byte	0x99
+	.2byte	0x136
+	.4byte	0xa778
+	.byte	0x98
+	.uleb128 0x1b
+	.4byte	.LASF2165
+	.byte	0x99
+	.2byte	0x137
+	.4byte	0xa778
+	.byte	0xa0
+	.uleb128 0x1b
+	.4byte	.LASF2166
+	.byte	0x99
+	.2byte	0x138
+	.4byte	0xa778
+	.byte	0xa8
+	.uleb128 0x1b
+	.4byte	.LASF2167
+	.byte	0x99
+	.2byte	0x139
+	.4byte	0xa778
+	.byte	0xb0
+	.byte	0
+	.uleb128 0x3
+	.4byte	0xa349
+	.uleb128 0x14
+	.4byte	0xc6
+	.4byte	0xa496
+	.uleb128 0x11
+	.4byte	0xa496
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xa49c
+	.uleb128 0x1a
+	.4byte	.LASF2168
+	.2byte	0x3b0
+	.byte	0x2
+	.2byte	0x407
+	.4byte	0xa773
+	.uleb128 0x1b
+	.4byte	.LASF639
+	.byte	0x2
+	.2byte	0x408
+	.4byte	0xa496
+	.byte	0
+	.uleb128 0x2b
+	.string	"p"
+	.byte	0x2
+	.2byte	0x40a
+	.4byte	0xb494
+	.byte	0x8
+	.uleb128 0x1b
+	.4byte	.LASF2114
+	.byte	0x2
+	.2byte	0x40c
+	.4byte	0x902d
+	.byte	0x10
+	.uleb128 0x1b
+	.4byte	.LASF2169
+	.byte	0x2
+	.2byte	0x40d
+	.4byte	0x56
+	.byte	0x70
+	.uleb128 0x1b
+	.4byte	.LASF193
+	.byte	0x2
+	.2byte	0x40e
+	.4byte	0xb05b
+	.byte	0x78
+	.uleb128 0x1b
+	.4byte	.LASF574
+	.byte	0x2
+	.2byte	0x410
+	.4byte	0x2464
+	.byte	0x80
+	.uleb128 0x2b
+	.string	"bus"
+	.byte	0x2
+	.2byte	0x414
+	.4byte	0xacfd
+	.byte	0xa0
+	.uleb128 0x1b
+	.4byte	.LASF2170
+	.byte	0x2
+	.2byte	0x415
+	.4byte	0xae71
+	.byte	0xa8
+	.uleb128 0x1b
+	.4byte	.LASF2171
+	.byte	0x2
+	.2byte	0x417
+	.4byte	0x458
+	.byte	0xb0
+	.uleb128 0x1b
+	.4byte	.LASF2172
+	.byte	0x2
+	.2byte	0x419
+	.4byte	0x458
+	.byte	0xb8
+	.uleb128 0x1b
+	.4byte	.LASF2173
+	.byte	0x2
+	.2byte	0x41b
+	.4byte	0xb3ff
+	.byte	0xc0
+	.uleb128 0x1c
+	.4byte	.LASF2174
+	.byte	0x2
+	.2byte	0x41c
+	.4byte	0xa836
+	.2byte	0x128
+	.uleb128 0x1c
+	.4byte	.LASF2175
+	.byte	0x2
+	.2byte	0x41d
+	.4byte	0xb49a
+	.2byte	0x260
+	.uleb128 0x1c
+	.4byte	.LASF2176
+	.byte	0x2
+	.2byte	0x420
+	.4byte	0xb59c
+	.2byte	0x268
+	.uleb128 0x1c
+	.4byte	.LASF2177
+	.byte	0x2
+	.2byte	0x423
+	.4byte	0xb5a7
+	.2byte	0x270
+	.uleb128 0x1c
+	.4byte	.LASF2178
+	.byte	0x2
+	.2byte	0x426
+	.4byte	0x3a7
+	.2byte	0x278
+	.uleb128 0x1c
+	.4byte	.LASF2179
+	.byte	0x2
+	.2byte	0x42c
+	.4byte	0xb6df
+	.2byte	0x288
+	.uleb128 0x1c
+	.4byte	.LASF2180
+	.byte	0x2
+	.2byte	0x42d
+	.4byte	0x45aa
+	.2byte	0x290
+	.uleb128 0x1c
+	.4byte	.LASF2181
+	.byte	0x2
+	.2byte	0x42e
+	.4byte	0x15a
+	.2byte	0x298
+	.uleb128 0x1c
+	.4byte	.LASF2182
+	.byte	0x2
+	.2byte	0x433
+	.4byte	0x15a
+	.2byte	0x2a0
+	.uleb128 0x1c
+	.4byte	.LASF2183
+	.byte	0x2
+	.2byte	0x434
+	.4byte	0x29
+	.2byte	0x2a8
+	.uleb128 0x1c
+	.4byte	.LASF2184
+	.byte	0x2
+	.2byte	0x436
+	.4byte	0xb6e5
+	.2byte	0x2b0
+	.uleb128 0x1c
+	.4byte	.LASF2185
+	.byte	0x2
+	.2byte	0x438
+	.4byte	0x3a7
+	.2byte	0x2b8
+	.uleb128 0x1c
+	.4byte	.LASF2186
+	.byte	0x2
+	.2byte	0x43a
+	.4byte	0xb6f0
+	.2byte	0x2c8
+	.uleb128 0x1c
+	.4byte	.LASF2187
+	.byte	0x2
+	.2byte	0x43d
+	.4byte	0xb6fb
+	.2byte	0x2d0
+	.uleb128 0x1c
+	.4byte	.LASF2188
+	.byte	0x2
+	.2byte	0x440
+	.4byte	0xb706
+	.2byte	0x2d8
+	.uleb128 0x1c
+	.4byte	.LASF2189
+	.byte	0x2
+	.2byte	0x442
+	.4byte	0xacd0
+	.2byte	0x2e0
+	.uleb128 0x1c
+	.4byte	.LASF2190
+	.byte	0x2
+	.2byte	0x444
+	.4byte	0xb7ba
+	.2byte	0x2f0
+	.uleb128 0x1c
+	.4byte	.LASF2191
+	.byte	0x2
+	.2byte	0x445
+	.4byte	0xb3cf
+	.2byte	0x2f8
+	.uleb128 0x1c
+	.4byte	.LASF2192
+	.byte	0x2
+	.2byte	0x447
+	.4byte	0x284
+	.2byte	0x300
+	.uleb128 0x30
+	.string	"id"
+	.byte	0x2
+	.2byte	0x448
+	.4byte	0x13f
+	.2byte	0x304
+	.uleb128 0x1c
+	.4byte	.LASF2193
+	.byte	0x2
+	.2byte	0x44a
+	.4byte	0xe65
+	.2byte	0x308
+	.uleb128 0x1c
+	.4byte	.LASF2194
+	.byte	0x2
+	.2byte	0x44b
+	.4byte	0x3a7
+	.2byte	0x310
+	.uleb128 0x1c
+	.4byte	.LASF2195
+	.byte	0x2
+	.2byte	0x44d
+	.4byte	0xa2d3
+	.2byte	0x320
+	.uleb128 0x1c
+	.4byte	.LASF2196
+	.byte	0x2
+	.2byte	0x44e
+	.4byte	0xb24b
+	.2byte	0x340
+	.uleb128 0x1c
+	.4byte	.LASF2197
+	.byte	0x2
+	.2byte	0x44f
+	.4byte	0xae51
+	.2byte	0x348
+	.uleb128 0x1c
+	.4byte	.LASF113
+	.byte	0x2
+	.2byte	0x451
+	.4byte	0xa789
+	.2byte	0x350
+	.uleb128 0x1c
+	.4byte	.LASF2198
+	.byte	0x2
+	.2byte	0x452
+	.4byte	0xb7c5
+	.2byte	0x358
+	.uleb128 0x1c
+	.4byte	.LASF2199
+	.byte	0x2
+	.2byte	0x453
+	.4byte	0xb7d0
+	.2byte	0x360
+	.uleb128 0x33
+	.4byte	.LASF2200
+	.byte	0x2
+	.2byte	0x455
+	.4byte	0x2b0
+	.byte	0x1
+	.byte	0x1
+	.byte	0x7
+	.2byte	0x368
+	.uleb128 0x33
+	.4byte	.LASF2201
+	.byte	0x2
+	.2byte	0x456
+	.4byte	0x2b0
+	.byte	0x1
+	.byte	0x1
+	.byte	0x6
+	.2byte	0x368
+	.uleb128 0x33
+	.4byte	.LASF2202
+	.byte	0x2
+	.2byte	0x457
+	.4byte	0x2b0
+	.byte	0x1
+	.byte	0x1
+	.byte	0x5
+	.2byte	0x368
+	.uleb128 0x33
+	.4byte	.LASF2203
+	.byte	0x2
+	.2byte	0x458
+	.4byte	0x2b0
+	.byte	0x1
+	.byte	0x1
+	.byte	0x4
+	.2byte	0x368
+	.uleb128 0x1c
+	.4byte	.LASF130
+	.byte	0x2
+	.2byte	0x45a
+	.4byte	0x15a
+	.2byte	0x370
+	.uleb128 0x1c
+	.4byte	.LASF131
+	.byte	0x2
+	.2byte	0x45b
+	.4byte	0x15a
+	.2byte	0x378
+	.uleb128 0x1c
+	.4byte	.LASF132
+	.byte	0x2
+	.2byte	0x45c
+	.4byte	0x15a
+	.2byte	0x380
+	.uleb128 0x1c
+	.4byte	.LASF133
+	.byte	0x2
+	.2byte	0x45d
+	.4byte	0x15a
+	.2byte	0x388
+	.uleb128 0x1c
+	.4byte	.LASF2204
+	.byte	0x2
+	.2byte	0x45e
+	.4byte	0x15a
+	.2byte	0x390
+	.uleb128 0x1c
+	.4byte	.LASF2205
+	.byte	0x2
+	.2byte	0x45f
+	.4byte	0x15a
+	.2byte	0x398
+	.uleb128 0x1c
+	.4byte	.LASF748
+	.byte	0x2
+	.2byte	0x460
+	.4byte	0x15a
+	.2byte	0x3a0
+	.uleb128 0x1c
+	.4byte	.LASF749
+	.byte	0x2
+	.2byte	0x461
+	.4byte	0x15a
+	.2byte	0x3a8
+	.byte	0
+	.uleb128 0x3
+	.4byte	0xa49c
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xa487
+	.uleb128 0x10
+	.4byte	0xa789
+	.uleb128 0x11
+	.4byte	0xa496
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xa77e
+	.uleb128 0x1e
+	.4byte	.LASF2206
+	.byte	0x4
+	.4byte	0x6d
+	.byte	0x99
+	.2byte	0x1fc
+	.4byte	0xa7b9
+	.uleb128 0xc
+	.4byte	.LASF2207
+	.byte	0
+	.uleb128 0xc
+	.4byte	.LASF2208
+	.byte	0x1
+	.uleb128 0xc
+	.4byte	.LASF2209
+	.byte	0x2
+	.uleb128 0xc
+	.4byte	.LASF2210
+	.byte	0x3
+	.byte	0
+	.uleb128 0x1e
+	.4byte	.LASF2211
+	.byte	0x4
+	.4byte	0x6d
+	.byte	0x99
+	.2byte	0x212
+	.4byte	0xa7e9
+	.uleb128 0xc
+	.4byte	.LASF2212
+	.byte	0
+	.uleb128 0xc
+	.4byte	.LASF2213
+	.byte	0x1
+	.uleb128 0xc
+	.4byte	.LASF2214
+	.byte	0x2
+	.uleb128 0xc
+	.4byte	.LASF2215
+	.byte	0x3
+	.uleb128 0xc
+	.4byte	.LASF2216
+	.byte	0x4
+	.byte	0
+	.uleb128 0x1d
+	.4byte	.LASF2217
+	.byte	0x20
+	.byte	0x99
+	.2byte	0x21e
+	.4byte	0xa82b
+	.uleb128 0x1b
+	.4byte	.LASF116
+	.byte	0x99
+	.2byte	0x21f
+	.4byte	0xe65
+	.byte	0
+	.uleb128 0x1b
+	.4byte	.LASF1095
+	.byte	0x99
+	.2byte	0x220
+	.4byte	0x6d
+	.byte	0x4
+	.uleb128 0x1b
+	.4byte	.LASF2218
+	.byte	0x99
+	.2byte	0x222
+	.4byte	0x3a7
+	.byte	0x8
+	.uleb128 0x1b
+	.4byte	.LASF2219
+	.byte	0x99
+	.2byte	0x225
+	.4byte	0xa830
+	.byte	0x18
+	.byte	0
+	.uleb128 0x24
+	.4byte	.LASF2220
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xa82b
+	.uleb128 0x1a
+	.4byte	.LASF2221
+	.2byte	0x138
+	.byte	0x99
+	.2byte	0x249
+	.4byte	0xab31
+	.uleb128 0x1b
+	.4byte	.LASF2222
+	.byte	0x99
+	.2byte	0x24a
+	.4byte	0xa33e
+	.byte	0
+	.uleb128 0x38
+	.4byte	.LASF2223
+	.byte	0x99
+	.2byte	0x24b
+	.4byte	0x6d
+	.byte	0x4
+	.byte	0x1
+	.byte	0x1f
+	.byte	0x4
+	.uleb128 0x38
+	.4byte	.LASF2224
+	.byte	0x99
+	.2byte	0x24c
+	.4byte	0x6d
+	.byte	0x4
+	.byte	0x1
+	.byte	0x1e
+	.byte	0x4
+	.uleb128 0x38
+	.4byte	.LASF2225
+	.byte	0x99
+	.2byte	0x24d
+	.4byte	0x2b0
+	.byte	0x1
+	.byte	0x1
+	.byte	0x5
+	.byte	0x4
+	.uleb128 0x38
+	.4byte	.LASF2226
+	.byte	0x99
+	.2byte	0x24e
+	.4byte	0x2b0
+	.byte	0x1
+	.byte	0x1
+	.byte	0x4
+	.byte	0x4
+	.uleb128 0x38
+	.4byte	.LASF2227
+	.byte	0x99
+	.2byte	0x24f
+	.4byte	0x2b0
+	.byte	0x1
+	.byte	0x1
+	.byte	0x3
+	.byte	0x4
+	.uleb128 0x38
+	.4byte	.LASF2228
+	.byte	0x99
+	.2byte	0x250
+	.4byte	0x2b0
+	.byte	0x1
+	.byte	0x1
+	.byte	0x2
+	.byte	0x4
+	.uleb128 0x38
+	.4byte	.LASF2229
+	.byte	0x99
+	.2byte	0x251
+	.4byte	0x2b0
+	.byte	0x1
+	.byte	0x1
+	.byte	0x1
+	.byte	0x4
+	.uleb128 0x38
+	.4byte	.LASF2230
+	.byte	0x99
+	.2byte	0x252
+	.4byte	0x2b0
+	.byte	0x1
+	.byte	0x1
+	.byte	0
+	.byte	0x4
+	.uleb128 0x38
+	.4byte	.LASF2231
+	.byte	0x99
+	.2byte	0x253
+	.4byte	0x2b0
+	.byte	0x1
+	.byte	0x1
+	.byte	0x7
+	.byte	0x5
+	.uleb128 0x38
+	.4byte	.LASF2232
+	.byte	0x99
+	.2byte	0x254
+	.4byte	0x2b0
+	.byte	0x1
+	.byte	0x1
+	.byte	0x6
+	.byte	0x5
+	.uleb128 0x1b
+	.4byte	.LASF2233
+	.byte	0x99
+	.2byte	0x255
+	.4byte	0x13f
+	.byte	0x8
+	.uleb128 0x1b
+	.4byte	.LASF116
+	.byte	0x99
+	.2byte	0x256
+	.4byte	0xe65
+	.byte	0xc
+	.uleb128 0x1b
+	.4byte	.LASF361
+	.byte	0x99
+	.2byte	0x258
+	.4byte	0x3a7
+	.byte	0x10
+	.uleb128 0x1b
+	.4byte	.LASF1067
+	.byte	0x99
+	.2byte	0x259
+	.4byte	0x4579
+	.byte	0x20
+	.uleb128 0x1b
+	.4byte	.LASF2234
+	.byte	0x99
+	.2byte	0x25a
+	.4byte	0xac33
+	.byte	0x40
+	.uleb128 0x38
+	.4byte	.LASF2235
+	.byte	0x99
+	.2byte	0x25b
+	.4byte	0x2b0
+	.byte	0x1
+	.byte	0x1
+	.byte	0x7
+	.byte	0x48
+	.uleb128 0x38
+	.4byte	.LASF2236
+	.byte	0x99
+	.2byte	0x25c
+	.4byte	0x2b0
+	.byte	0x1
+	.byte	0x1
+	.byte	0x6
+	.byte	0x48
+	.uleb128 0x38
+	.4byte	.LASF2237
+	.byte	0x99
+	.2byte	0x25d
+	.4byte	0x2b0
+	.byte	0x1
+	.byte	0x1
+	.byte	0x5
+	.byte	0x48
+	.uleb128 0x38
+	.4byte	.LASF2238
+	.byte	0x99
+	.2byte	0x25e
+	.4byte	0x6d
+	.byte	0x4
+	.byte	0x1
+	.byte	0x1c
+	.byte	0x48
+	.uleb128 0x38
+	.4byte	.LASF2239
+	.byte	0x99
+	.2byte	0x25f
+	.4byte	0x6d
+	.byte	0x4
+	.byte	0x1
+	.byte	0x1b
+	.byte	0x48
+	.uleb128 0x1b
+	.4byte	.LASF2240
+	.byte	0x99
+	.2byte	0x264
+	.4byte	0x316c
+	.byte	0x50
+	.uleb128 0x1b
+	.4byte	.LASF2241
+	.byte	0x99
+	.2byte	0x265
+	.4byte	0x29
+	.byte	0x88
+	.uleb128 0x1b
+	.4byte	.LASF2242
+	.byte	0x99
+	.2byte	0x266
+	.4byte	0x3205
+	.byte	0x90
+	.uleb128 0x1b
+	.4byte	.LASF2243
+	.byte	0x99
+	.2byte	0x267
+	.4byte	0x15bf
+	.byte	0xc0
+	.uleb128 0x1b
+	.4byte	.LASF2244
+	.byte	0x99
+	.2byte	0x268
+	.4byte	0xac3e
+	.byte	0xd8
+	.uleb128 0x1b
+	.4byte	.LASF2245
+	.byte	0x99
+	.2byte	0x269
+	.4byte	0x37c
+	.byte	0xe0
+	.uleb128 0x1b
+	.4byte	.LASF2246
+	.byte	0x99
+	.2byte	0x26a
+	.4byte	0x37c
+	.byte	0xe4
+	.uleb128 0x38
+	.4byte	.LASF2247
+	.byte	0x99
+	.2byte	0x26b
+	.4byte	0x6d
+	.byte	0x4
+	.byte	0x3
+	.byte	0x1d
+	.byte	0xe8
+	.uleb128 0x38
+	.4byte	.LASF2248
+	.byte	0x99
+	.2byte	0x26c
+	.4byte	0x6d
+	.byte	0x4
+	.byte	0x1
+	.byte	0x1c
+	.byte	0xe8
+	.uleb128 0x38
+	.4byte	.LASF2249
+	.byte	0x99
+	.2byte	0x26d
+	.4byte	0x6d
+	.byte	0x4
+	.byte	0x1
+	.byte	0x1b
+	.byte	0xe8
+	.uleb128 0x38
+	.4byte	.LASF2250
+	.byte	0x99
+	.2byte	0x26e
+	.4byte	0x6d
+	.byte	0x4
+	.byte	0x1
+	.byte	0x1a
+	.byte	0xe8
+	.uleb128 0x38
+	.4byte	.LASF2251
+	.byte	0x99
+	.2byte	0x26f
+	.4byte	0x6d
+	.byte	0x4
+	.byte	0x1
+	.byte	0x19
+	.byte	0xe8
+	.uleb128 0x38
+	.4byte	.LASF2252
+	.byte	0x99
+	.2byte	0x270
+	.4byte	0x2b0
+	.byte	0x1
+	.byte	0x1
+	.byte	0
+	.byte	0xe8
+	.uleb128 0x38
+	.4byte	.LASF2253
+	.byte	0x99
+	.2byte	0x271
+	.4byte	0x6d
+	.byte	0x4
+	.byte	0x1
+	.byte	0x17
+	.byte	0xe8
+	.uleb128 0x38
+	.4byte	.LASF2254
+	.byte	0x99
+	.2byte	0x272
+	.4byte	0x6d
+	.byte	0x4
+	.byte	0x1
+	.byte	0x16
+	.byte	0xe8
+	.uleb128 0x38
+	.4byte	.LASF2255
+	.byte	0x99
+	.2byte	0x273
+	.4byte	0x6d
+	.byte	0x4
+	.byte	0x1
+	.byte	0x15
+	.byte	0xe8
+	.uleb128 0x38
+	.4byte	.LASF2256
+	.byte	0x99
+	.2byte	0x274
+	.4byte	0x6d
+	.byte	0x4
+	.byte	0x1
+	.byte	0x14
+	.byte	0xe8
+	.uleb128 0x38
+	.4byte	.LASF2257
+	.byte	0x99
+	.2byte	0x275
+	.4byte	0x6d
+	.byte	0x4
+	.byte	0x1
+	.byte	0x13
+	.byte	0xe8
+	.uleb128 0x1b
+	.4byte	.LASF2258
+	.byte	0x99
+	.2byte	0x276
+	.4byte	0x6d
+	.byte	0xec
+	.uleb128 0x1b
+	.4byte	.LASF2259
+	.byte	0x99
+	.2byte	0x277
+	.4byte	0xa7b9
+	.byte	0xf0
+	.uleb128 0x1b
+	.4byte	.LASF2260
+	.byte	0x99
+	.2byte	0x278
+	.4byte	0xa78f
+	.byte	0xf4
+	.uleb128 0x1b
+	.4byte	.LASF2261
+	.byte	0x99
+	.2byte	0x279
+	.4byte	0xc6
+	.byte	0xf8
+	.uleb128 0x1b
+	.4byte	.LASF2262
+	.byte	0x99
+	.2byte	0x27a
+	.4byte	0xc6
+	.byte	0xfc
+	.uleb128 0x1c
+	.4byte	.LASF2263
+	.byte	0x99
+	.2byte	0x27b
+	.4byte	0x29
+	.2byte	0x100
+	.uleb128 0x1c
+	.4byte	.LASF2264
+	.byte	0x99
+	.2byte	0x27c
+	.4byte	0x29
+	.2byte	0x108
+	.uleb128 0x1c
+	.4byte	.LASF2265
+	.byte	0x99
+	.2byte	0x27d
+	.4byte	0x29
+	.2byte	0x110
+	.uleb128 0x1c
+	.4byte	.LASF2266
+	.byte	0x99
+	.2byte	0x27e
+	.4byte	0x29
+	.2byte	0x118
+	.uleb128 0x1c
+	.4byte	.LASF2267
+	.byte	0x99
+	.2byte	0x280
+	.4byte	0xac44
+	.2byte	0x120
+	.uleb128 0x1c
+	.4byte	.LASF2268
+	.byte	0x99
+	.2byte	0x281
+	.4byte	0xac5a
+	.2byte	0x128
+	.uleb128 0x30
+	.string	"qos"
+	.byte	0x99
+	.2byte	0x282
+	.4byte	0xac65
+	.2byte	0x130
+	.byte	0
+	.uleb128 0xd
+	.4byte	.LASF2269
+	.byte	0xd0
+	.byte	0x9a
+	.byte	0x38
+	.4byte	0xac33
+	.uleb128 0xe
+	.4byte	.LASF265
+	.byte	0x9a
+	.byte	0x39
+	.4byte	0x56
+	.byte	0
+	.uleb128 0x20
+	.string	"id"
+	.byte	0x9a
+	.byte	0x3a
+	.4byte	0xc6
+	.byte	0x8
+	.uleb128 0xe
+	.4byte	.LASF361
+	.byte	0x9a
+	.byte	0x3b
+	.4byte	0x3a7
+	.byte	0x10
+	.uleb128 0xe
+	.4byte	.LASF116
+	.byte	0x9a
+	.byte	0x3c
+	.4byte	0xe65
+	.byte	0x20
+	.uleb128 0xe
+	.4byte	.LASF2244
+	.byte	0x9a
+	.byte	0x3d
+	.4byte	0xac3e
+	.byte	0x28
+	.uleb128 0xe
+	.4byte	.LASF2270
+	.byte	0x9a
+	.byte	0x3e
+	.4byte	0x316c
+	.byte	0x30
+	.uleb128 0xe
+	.4byte	.LASF2241
+	.byte	0x9a
+	.byte	0x3f
+	.4byte	0x29
+	.byte	0x68
+	.uleb128 0xe
+	.4byte	.LASF2271
+	.byte	0x9a
+	.byte	0x40
+	.4byte	0x3135
+	.byte	0x70
+	.uleb128 0xe
+	.4byte	.LASF2272
+	.byte	0x9a
+	.byte	0x41
+	.4byte	0x3135
+	.byte	0x78
+	.uleb128 0xe
+	.4byte	.LASF2273
+	.byte	0x9a
+	.byte	0x42
+	.4byte	0x3135
+	.byte	0x80
+	.uleb128 0xe
+	.4byte	.LASF2274
+	.byte	0x9a
+	.byte	0x43
+	.4byte	0x3135
+	.byte	0x88
+	.uleb128 0xe
+	.4byte	.LASF2275
+	.byte	0x9a
+	.byte	0x44
+	.4byte	0x3135
+	.byte	0x90
+	.uleb128 0xe
+	.4byte	.LASF2276
+	.byte	0x9a
+	.byte	0x45
+	.4byte	0x29
+	.byte	0x98
+	.uleb128 0xe
+	.4byte	.LASF2277
+	.byte	0x9a
+	.byte	0x46
+	.4byte	0x29
+	.byte	0xa0
+	.uleb128 0xe
+	.4byte	.LASF2278
+	.byte	0x9a
+	.byte	0x47
+	.4byte	0x29
+	.byte	0xa8
+	.uleb128 0xe
+	.4byte	.LASF2279
+	.byte	0x9a
+	.byte	0x48
+	.4byte	0x29
+	.byte	0xb0
+	.uleb128 0xe
+	.4byte	.LASF2280
+	.byte	0x9a
+	.byte	0x49
+	.4byte	0x29
+	.byte	0xb8
+	.uleb128 0x20
+	.string	"dev"
+	.byte	0x9a
+	.byte	0x4a
+	.4byte	0xa496
+	.byte	0xc0
+	.uleb128 0x35
+	.4byte	.LASF852
+	.byte	0x9a
+	.byte	0x4b
+	.4byte	0x2b0
+	.byte	0x1
+	.byte	0x1
+	.byte	0x7
+	.byte	0xc8
+	.uleb128 0x35
+	.4byte	.LASF2281
+	.byte	0x9a
+	.byte	0x4c
+	.4byte	0x2b0
+	.byte	0x1
+	.byte	0x1
+	.byte	0x6
+	.byte	0xc8
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xab31
+	.uleb128 0x24
+	.4byte	.LASF2282
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xac39
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xa7e9
+	.uleb128 0x10
+	.4byte	0xac5a
+	.uleb128 0x11
+	.4byte	0xa496
+	.uleb128 0x11
+	.4byte	0x12f
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xac4a
+	.uleb128 0x24
+	.4byte	.LASF2283
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xac60
+	.uleb128 0x1d
+	.4byte	.LASF2284
+	.byte	0xd8
+	.byte	0x99
+	.2byte	0x296
+	.4byte	0xacba
+	.uleb128 0x2b
+	.string	"ops"
+	.byte	0x99
+	.2byte	0x297
+	.4byte	0xa349
+	.byte	0
+	.uleb128 0x1b
+	.4byte	.LASF2285
+	.byte	0x99
+	.2byte	0x298
+	.4byte	0xacca
+	.byte	0xb8
+	.uleb128 0x1b
+	.4byte	.LASF2286
+	.byte	0x99
+	.2byte	0x299
+	.4byte	0xa778
+	.byte	0xc0
+	.uleb128 0x1b
+	.4byte	.LASF2287
+	.byte	0x99
+	.2byte	0x29a
+	.4byte	0xa789
+	.byte	0xc8
+	.uleb128 0x1b
+	.4byte	.LASF2288
+	.byte	0x99
+	.2byte	0x29b
+	.4byte	0xa789
+	.byte	0xd0
+	.byte	0
+	.uleb128 0x10
+	.4byte	0xacca
+	.uleb128 0x11
+	.4byte	0xa496
+	.uleb128 0x11
+	.4byte	0x2b0
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xacba
+	.uleb128 0xd
+	.4byte	.LASF2289
+	.byte	0x10
+	.byte	0x9b
+	.byte	0x13
+	.4byte	0xacf5
+	.uleb128 0xe
+	.4byte	.LASF2290
+	.byte	0x9b
+	.byte	0x15
+	.4byte	0x458
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF2291
+	.byte	0x9b
+	.byte	0x1a
+	.4byte	0x2b0
+	.byte	0x8
+	.byte	0
+	.uleb128 0x37
+	.4byte	.LASF2292
+	.byte	0
+	.byte	0x9b
+	.byte	0x20
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xad03
+	.uleb128 0xd
+	.4byte	.LASF2293
+	.byte	0xd0
+	.byte	0x2
+	.byte	0x7a
+	.4byte	0xae51
+	.uleb128 0xe
+	.4byte	.LASF265
+	.byte	0x2
+	.byte	0x7b
+	.4byte	0x56
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF2294
+	.byte	0x2
+	.byte	0x7c
+	.4byte	0x56
+	.byte	0x8
+	.uleb128 0xe
+	.4byte	.LASF2295
+	.byte	0x2
+	.byte	0x7d
+	.4byte	0xa496
+	.byte	0x10
+	.uleb128 0xe
+	.4byte	.LASF2296
+	.byte	0x2
+	.byte	0x7e
+	.4byte	0xae51
+	.byte	0x18
+	.uleb128 0xe
+	.4byte	.LASF2297
+	.byte	0x2
+	.byte	0x7f
+	.4byte	0xae51
+	.byte	0x20
+	.uleb128 0xe
+	.4byte	.LASF2298
+	.byte	0x2
+	.byte	0x80
+	.4byte	0xae51
+	.byte	0x28
+	.uleb128 0xe
+	.4byte	.LASF2299
+	.byte	0x2
+	.byte	0x82
+	.4byte	0xafa0
+	.byte	0x30
+	.uleb128 0xe
+	.4byte	.LASF2127
+	.byte	0x2
+	.byte	0x83
+	.4byte	0xafba
+	.byte	0x38
+	.uleb128 0xe
+	.4byte	.LASF2300
+	.byte	0x2
+	.byte	0x84
+	.4byte	0xa778
+	.byte	0x40
+	.uleb128 0xe
+	.4byte	.LASF2301
+	.byte	0x2
+	.byte	0x85
+	.4byte	0xa789
+	.byte	0x48
+	.uleb128 0xe
+	.4byte	.LASF2302
+	.byte	0x2
+	.byte	0x86
+	.4byte	0xa778
+	.byte	0x50
+	.uleb128 0xe
+	.4byte	.LASF2303
+	.byte	0x2
+	.byte	0x87
+	.4byte	0xa789
+	.byte	0x58
+	.uleb128 0xe
+	.4byte	.LASF2304
+	.byte	0x2
+	.byte	0x89
+	.4byte	0xa778
+	.byte	0x60
+	.uleb128 0xe
+	.4byte	.LASF2201
+	.byte	0x2
+	.byte	0x8a
+	.4byte	0xa778
+	.byte	0x68
+	.uleb128 0xe
+	.4byte	.LASF2147
+	.byte	0x2
+	.byte	0x8c
+	.4byte	0xafd4
+	.byte	0x70
+	.uleb128 0xe
+	.4byte	.LASF2148
+	.byte	0x2
+	.byte	0x8d
+	.4byte	0xa778
+	.byte	0x78
+	.uleb128 0xe
+	.4byte	.LASF2305
+	.byte	0x2
+	.byte	0x8f
+	.4byte	0xa778
+	.byte	0x80
+	.uleb128 0xe
+	.4byte	.LASF2306
+	.byte	0x2
+	.byte	0x91
+	.4byte	0xa778
+	.byte	0x88
+	.uleb128 0x20
+	.string	"pm"
+	.byte	0x2
+	.byte	0x93
+	.4byte	0xafda
+	.byte	0x90
+	.uleb128 0xe
+	.4byte	.LASF2307
+	.byte	0x2
+	.byte	0x95
+	.4byte	0xafea
+	.byte	0x98
+	.uleb128 0x20
+	.string	"p"
+	.byte	0x2
+	.byte	0x97
+	.4byte	0xaff5
+	.byte	0xa0
+	.uleb128 0xe
+	.4byte	.LASF2308
+	.byte	0x2
+	.byte	0x98
+	.4byte	0xe11
+	.byte	0xa8
+	.uleb128 0xe
+	.4byte	.LASF2309
+	.byte	0x2
+	.byte	0x9a
+	.4byte	0x2b0
+	.byte	0xa8
+	.uleb128 0xe
+	.4byte	.LASF130
+	.byte	0x2
+	.byte	0x9c
+	.4byte	0x15a
+	.byte	0xb0
+	.uleb128 0xe
+	.4byte	.LASF131
+	.byte	0x2
+	.byte	0x9d
+	.4byte	0x15a
+	.byte	0xb8
+	.uleb128 0xe
+	.4byte	.LASF132
+	.byte	0x2
+	.byte	0x9e
+	.4byte	0x15a
+	.byte	0xc0
+	.uleb128 0xe
+	.4byte	.LASF133
+	.byte	0x2
+	.byte	0x9f
+	.4byte	0x15a
+	.byte	0xc8
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xae57
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x9df7
+	.uleb128 0x14
+	.4byte	0xc6
+	.4byte	0xae71
+	.uleb128 0x11
+	.4byte	0xa496
+	.uleb128 0x11
+	.4byte	0xae71
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xae77
+	.uleb128 0x1d
+	.4byte	.LASF2310
+	.byte	0xa8
+	.byte	0x2
+	.2byte	0x12a
+	.4byte	0xafa0
+	.uleb128 0x1b
+	.4byte	.LASF265
+	.byte	0x2
+	.2byte	0x12b
+	.4byte	0x56
+	.byte	0
+	.uleb128 0x2b
+	.string	"bus"
+	.byte	0x2
+	.2byte	0x12c
+	.4byte	0xacfd
+	.byte	0x8
+	.uleb128 0x1b
+	.4byte	.LASF98
+	.byte	0x2
+	.2byte	0x12e
+	.4byte	0x74a1
+	.byte	0x10
+	.uleb128 0x1b
+	.4byte	.LASF2311
+	.byte	0x2
+	.2byte	0x12f
+	.4byte	0x56
+	.byte	0x18
+	.uleb128 0x1b
+	.4byte	.LASF2312
+	.byte	0x2
+	.2byte	0x131
+	.4byte	0x2b0
+	.byte	0x20
+	.uleb128 0x1b
+	.4byte	.LASF2313
+	.byte	0x2
+	.2byte	0x132
+	.4byte	0xb061
+	.byte	0x24
+	.uleb128 0x1b
+	.4byte	.LASF2314
+	.byte	0x2
+	.2byte	0x134
+	.4byte	0xb0c6
+	.byte	0x28
+	.uleb128 0x1b
+	.4byte	.LASF2315
+	.byte	0x2
+	.2byte	0x135
+	.4byte	0xb10d
+	.byte	0x30
+	.uleb128 0x1b
+	.4byte	.LASF2300
+	.byte	0x2
+	.2byte	0x137
+	.4byte	0xa778
+	.byte	0x38
+	.uleb128 0x1b
+	.4byte	.LASF2301
+	.byte	0x2
+	.2byte	0x138
+	.4byte	0xa789
+	.byte	0x40
+	.uleb128 0x1b
+	.4byte	.LASF2302
+	.byte	0x2
+	.2byte	0x139
+	.4byte	0xa778
+	.byte	0x48
+	.uleb128 0x1b
+	.4byte	.LASF2303
+	.byte	0x2
+	.2byte	0x13a
+	.4byte	0xa789
+	.byte	0x50
+	.uleb128 0x1b
+	.4byte	.LASF2147
+	.byte	0x2
+	.2byte	0x13b
+	.4byte	0xafd4
+	.byte	0x58
+	.uleb128 0x1b
+	.4byte	.LASF2148
+	.byte	0x2
+	.2byte	0x13c
+	.4byte	0xa778
+	.byte	0x60
+	.uleb128 0x1b
+	.4byte	.LASF2197
+	.byte	0x2
+	.2byte	0x13d
+	.4byte	0xae51
+	.byte	0x68
+	.uleb128 0x2b
+	.string	"pm"
+	.byte	0x2
+	.2byte	0x13f
+	.4byte	0xafda
+	.byte	0x70
+	.uleb128 0x1b
+	.4byte	.LASF2316
+	.byte	0x2
+	.2byte	0x140
+	.4byte	0xa789
+	.byte	0x78
+	.uleb128 0x2b
+	.string	"p"
+	.byte	0x2
+	.2byte	0x142
+	.4byte	0xb118
+	.byte	0x80
+	.uleb128 0x1b
+	.4byte	.LASF130
+	.byte	0x2
+	.2byte	0x144
+	.4byte	0x15a
+	.byte	0x88
+	.uleb128 0x1b
+	.4byte	.LASF131
+	.byte	0x2
+	.2byte	0x145
+	.4byte	0x15a
+	.byte	0x90
+	.uleb128 0x1b
+	.4byte	.LASF132
+	.byte	0x2
+	.2byte	0x146
+	.4byte	0x15a
+	.byte	0x98
+	.uleb128 0x1b
+	.4byte	.LASF133
+	.byte	0x2
+	.2byte	0x147
+	.4byte	0x15a
+	.byte	0xa0
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xae5d
+	.uleb128 0x14
+	.4byte	0xc6
+	.4byte	0xafba
+	.uleb128 0x11
+	.4byte	0xa496
+	.uleb128 0x11
+	.4byte	0xa200
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xafa6
+	.uleb128 0x14
+	.4byte	0xc6
+	.4byte	0xafd4
+	.uleb128 0x11
+	.4byte	0xa496
+	.uleb128 0x11
+	.4byte	0xa33e
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xafc0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xa482
+	.uleb128 0x24
+	.4byte	.LASF2307
+	.uleb128 0x3
+	.4byte	0xafe0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xafe5
+	.uleb128 0x24
+	.4byte	.LASF2317
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xaff0
+	.uleb128 0x1d
+	.4byte	.LASF2318
+	.byte	0x30
+	.byte	0x2
+	.2byte	0x249
+	.4byte	0xb056
+	.uleb128 0x1b
+	.4byte	.LASF265
+	.byte	0x2
+	.2byte	0x24a
+	.4byte	0x56
+	.byte	0
+	.uleb128 0x1b
+	.4byte	.LASF2197
+	.byte	0x2
+	.2byte	0x24b
+	.4byte	0xae51
+	.byte	0x8
+	.uleb128 0x1b
+	.4byte	.LASF2127
+	.byte	0x2
+	.2byte	0x24c
+	.4byte	0xafba
+	.byte	0x10
+	.uleb128 0x1b
+	.4byte	.LASF2319
+	.byte	0x2
+	.2byte	0x24d
+	.4byte	0xb2bd
+	.byte	0x18
+	.uleb128 0x1b
+	.4byte	.LASF113
+	.byte	0x2
+	.2byte	0x24f
+	.4byte	0xa789
+	.byte	0x20
+	.uleb128 0x2b
+	.string	"pm"
+	.byte	0x2
+	.2byte	0x251
+	.4byte	0xafda
+	.byte	0x28
+	.byte	0
+	.uleb128 0x3
+	.4byte	0xaffb
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xb056
+	.uleb128 0x1f
+	.4byte	.LASF2313
+	.byte	0x4
+	.4byte	0x6d
+	.byte	0x2
+	.byte	0xf9
+	.4byte	0xb084
+	.uleb128 0xc
+	.4byte	.LASF2320
+	.byte	0
+	.uleb128 0xc
+	.4byte	.LASF2321
+	.byte	0x1
+	.uleb128 0xc
+	.4byte	.LASF2322
+	.byte	0x2
+	.byte	0
+	.uleb128 0xd
+	.4byte	.LASF2323
+	.byte	0xc8
+	.byte	0x9c
+	.byte	0xf1
+	.4byte	0xb0c1
+	.uleb128 0xe
+	.4byte	.LASF265
+	.byte	0x9c
+	.byte	0xf2
+	.4byte	0x86cb
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF193
+	.byte	0x9c
+	.byte	0xf3
+	.4byte	0x86cb
+	.byte	0x20
+	.uleb128 0xe
+	.4byte	.LASF2324
+	.byte	0x9c
+	.byte	0xf4
+	.4byte	0xb809
+	.byte	0x40
+	.uleb128 0xe
+	.4byte	.LASF793
+	.byte	0x9c
+	.byte	0xf5
+	.4byte	0x30b6
+	.byte	0xc0
+	.byte	0
+	.uleb128 0x3
+	.4byte	0xb084
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xb0c1
+	.uleb128 0xd
+	.4byte	.LASF2325
+	.byte	0x20
+	.byte	0x9c
+	.byte	0xbf
+	.4byte	0xb108
+	.uleb128 0x20
+	.string	"id"
+	.byte	0x9c
+	.byte	0xc0
+	.4byte	0xb7f9
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF2172
+	.byte	0x9c
+	.byte	0xc1
+	.4byte	0xb7ee
+	.byte	0x10
+	.uleb128 0x20
+	.string	"cls"
+	.byte	0x9c
+	.byte	0xc2
+	.4byte	0xd2
+	.byte	0x18
+	.uleb128 0xe
+	.4byte	.LASF2326
+	.byte	0x9c
+	.byte	0xc3
+	.4byte	0xd2
+	.byte	0x1c
+	.byte	0
+	.uleb128 0x3
+	.4byte	0xb0cc
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xb108
+	.uleb128 0x24
+	.4byte	.LASF2327
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xb113
+	.uleb128 0x1d
+	.4byte	.LASF2196
+	.byte	0x98
+	.byte	0x2
+	.2byte	0x1ae
+	.4byte	0xb220
+	.uleb128 0x1b
+	.4byte	.LASF265
+	.byte	0x2
+	.2byte	0x1af
+	.4byte	0x56
+	.byte	0
+	.uleb128 0x1b
+	.4byte	.LASF98
+	.byte	0x2
+	.2byte	0x1b0
+	.4byte	0x74a1
+	.byte	0x8
+	.uleb128 0x1b
+	.4byte	.LASF2328
+	.byte	0x2
+	.2byte	0x1b2
+	.4byte	0xae51
+	.byte	0x10
+	.uleb128 0x1b
+	.4byte	.LASF2297
+	.byte	0x2
+	.2byte	0x1b3
+	.4byte	0xae51
+	.byte	0x18
+	.uleb128 0x1b
+	.4byte	.LASF2329
+	.byte	0x2
+	.2byte	0x1b4
+	.4byte	0x9114
+	.byte	0x20
+	.uleb128 0x1b
+	.4byte	.LASF2330
+	.byte	0x2
+	.2byte	0x1b6
+	.4byte	0xafba
+	.byte	0x28
+	.uleb128 0x1b
+	.4byte	.LASF2319
+	.byte	0x2
+	.2byte	0x1b7
+	.4byte	0xb23a
+	.byte	0x30
+	.uleb128 0x1b
+	.4byte	.LASF2331
+	.byte	0x2
+	.2byte	0x1b9
+	.4byte	0xb251
+	.byte	0x38
+	.uleb128 0x1b
+	.4byte	.LASF2332
+	.byte	0x2
+	.2byte	0x1ba
+	.4byte	0xa789
+	.byte	0x40
+	.uleb128 0x1b
+	.4byte	.LASF2333
+	.byte	0x2
+	.2byte	0x1bc
+	.4byte	0xa778
+	.byte	0x48
+	.uleb128 0x1b
+	.4byte	.LASF2334
+	.byte	0x2
+	.2byte	0x1be
+	.4byte	0xa0b9
+	.byte	0x50
+	.uleb128 0x1b
+	.4byte	.LASF2119
+	.byte	0x2
+	.2byte	0x1bf
+	.4byte	0xb266
+	.byte	0x58
+	.uleb128 0x1b
+	.4byte	.LASF2120
+	.byte	0x2
+	.2byte	0x1c1
+	.4byte	0xb281
+	.byte	0x60
+	.uleb128 0x2b
+	.string	"pm"
+	.byte	0x2
+	.2byte	0x1c3
+	.4byte	0xafda
+	.byte	0x68
+	.uleb128 0x2b
+	.string	"p"
+	.byte	0x2
+	.2byte	0x1c5
+	.4byte	0xaff5
+	.byte	0x70
+	.uleb128 0x1b
+	.4byte	.LASF130
+	.byte	0x2
+	.2byte	0x1c7
+	.4byte	0x15a
+	.byte	0x78
+	.uleb128 0x1b
+	.4byte	.LASF131
+	.byte	0x2
+	.2byte	0x1c8
+	.4byte	0x15a
+	.byte	0x80
+	.uleb128 0x1b
+	.4byte	.LASF132
+	.byte	0x2
+	.2byte	0x1c9
+	.4byte	0x15a
+	.byte	0x88
+	.uleb128 0x1b
+	.4byte	.LASF133
+	.byte	0x2
+	.2byte	0x1ca
+	.4byte	0x15a
+	.byte	0x90
+	.byte	0
+	.uleb128 0x14
+	.4byte	0x21e
+	.4byte	0xb234
+	.uleb128 0x11
+	.4byte	0xa496
+	.uleb128 0x11
+	.4byte	0xb234
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x28f
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xb220
+	.uleb128 0x10
+	.4byte	0xb24b
+	.uleb128 0x11
+	.4byte	0xb24b
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xb11e
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xb240
+	.uleb128 0x14
+	.4byte	0x30b6
+	.4byte	0xb266
+	.uleb128 0x11
+	.4byte	0xa496
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xb257
+	.uleb128 0x10
+	.4byte	0xb281
+	.uleb128 0x11
+	.4byte	0xa496
+	.uleb128 0x11
+	.4byte	0x9297
+	.uleb128 0x11
+	.4byte	0x929d
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xb26c
+	.uleb128 0x15
+	.4byte	.LASF2335
+	.byte	0x2
+	.2byte	0x1d2
+	.4byte	0x9114
+	.uleb128 0x15
+	.4byte	.LASF2336
+	.byte	0x2
+	.2byte	0x1d3
+	.4byte	0x9114
+	.uleb128 0x14
+	.4byte	0x21e
+	.4byte	0xb2bd
+	.uleb128 0x11
+	.4byte	0xa496
+	.uleb128 0x11
+	.4byte	0xb234
+	.uleb128 0x11
+	.4byte	0x9297
+	.uleb128 0x11
+	.4byte	0x929d
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xb29f
+	.uleb128 0x1d
+	.4byte	.LASF2337
+	.byte	0x20
+	.byte	0x2
+	.2byte	0x255
+	.4byte	0xb2f8
+	.uleb128 0x1b
+	.4byte	.LASF2083
+	.byte	0x2
+	.2byte	0x256
+	.4byte	0x9d89
+	.byte	0
+	.uleb128 0x1b
+	.4byte	.LASF2046
+	.byte	0x2
+	.2byte	0x257
+	.4byte	0xb317
+	.byte	0x10
+	.uleb128 0x1b
+	.4byte	.LASF2110
+	.byte	0x2
+	.2byte	0x259
+	.4byte	0xb33b
+	.byte	0x18
+	.byte	0
+	.uleb128 0x14
+	.4byte	0x2ee
+	.4byte	0xb311
+	.uleb128 0x11
+	.4byte	0xa496
+	.uleb128 0x11
+	.4byte	0xb311
+	.uleb128 0x11
+	.4byte	0x21e
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xb2c3
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xb2f8
+	.uleb128 0x14
+	.4byte	0x2ee
+	.4byte	0xb33b
+	.uleb128 0x11
+	.4byte	0xa496
+	.uleb128 0x11
+	.4byte	0xb311
+	.uleb128 0x11
+	.4byte	0x56
+	.uleb128 0x11
+	.4byte	0x2e3
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xb31d
+	.uleb128 0x1d
+	.4byte	.LASF2338
+	.byte	0x10
+	.byte	0x2
+	.2byte	0x30b
+	.4byte	0xb369
+	.uleb128 0x1b
+	.4byte	.LASF2339
+	.byte	0x2
+	.2byte	0x310
+	.4byte	0x6d
+	.byte	0
+	.uleb128 0x1b
+	.4byte	.LASF2340
+	.byte	0x2
+	.2byte	0x311
+	.4byte	0x29
+	.byte	0x8
+	.byte	0
+	.uleb128 0xd
+	.4byte	.LASF2341
+	.byte	0x38
+	.byte	0x9d
+	.byte	0x15
+	.4byte	0xb3ca
+	.uleb128 0xe
+	.4byte	.LASF2342
+	.byte	0x9d
+	.byte	0x16
+	.4byte	0xb3cf
+	.byte	0
+	.uleb128 0x20
+	.string	"ops"
+	.byte	0x9d
+	.byte	0x17
+	.4byte	0xb984
+	.byte	0x8
+	.uleb128 0x20
+	.string	"dev"
+	.byte	0x9d
+	.byte	0x18
+	.4byte	0xa496
+	.byte	0x10
+	.uleb128 0xe
+	.4byte	.LASF130
+	.byte	0x9d
+	.byte	0x1a
+	.4byte	0x15a
+	.byte	0x18
+	.uleb128 0xe
+	.4byte	.LASF131
+	.byte	0x9d
+	.byte	0x1b
+	.4byte	0x15a
+	.byte	0x20
+	.uleb128 0xe
+	.4byte	.LASF132
+	.byte	0x9d
+	.byte	0x1c
+	.4byte	0x15a
+	.byte	0x28
+	.uleb128 0xe
+	.4byte	.LASF133
+	.byte	0x9d
+	.byte	0x1d
+	.4byte	0x15a
+	.byte	0x30
+	.byte	0
+	.uleb128 0x3
+	.4byte	0xb369
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xb369
+	.uleb128 0x1e
+	.4byte	.LASF2343
+	.byte	0x4
+	.4byte	0x6d
+	.byte	0x2
+	.2byte	0x396
+	.4byte	0xb3ff
+	.uleb128 0xc
+	.4byte	.LASF2344
+	.byte	0
+	.uleb128 0xc
+	.4byte	.LASF2345
+	.byte	0x1
+	.uleb128 0xc
+	.4byte	.LASF2346
+	.byte	0x2
+	.uleb128 0xc
+	.4byte	.LASF2347
+	.byte	0x3
+	.byte	0
+	.uleb128 0x1d
+	.4byte	.LASF2348
+	.byte	0x68
+	.byte	0x2
+	.2byte	0x3a8
+	.4byte	0xb48f
+	.uleb128 0x1b
+	.4byte	.LASF2349
+	.byte	0x2
+	.2byte	0x3a9
+	.4byte	0x3a7
+	.byte	0
+	.uleb128 0x1b
+	.4byte	.LASF2350
+	.byte	0x2
+	.2byte	0x3aa
+	.4byte	0x3a7
+	.byte	0x10
+	.uleb128 0x1b
+	.4byte	.LASF2351
+	.byte	0x2
+	.2byte	0x3ab
+	.4byte	0x3a7
+	.byte	0x20
+	.uleb128 0x1b
+	.4byte	.LASF2352
+	.byte	0x2
+	.2byte	0x3ac
+	.4byte	0x3a7
+	.byte	0x30
+	.uleb128 0x1b
+	.4byte	.LASF2353
+	.byte	0x2
+	.2byte	0x3ad
+	.4byte	0x2b0
+	.byte	0x40
+	.uleb128 0x1b
+	.4byte	.LASF759
+	.byte	0x2
+	.2byte	0x3ae
+	.4byte	0xb3d5
+	.byte	0x44
+	.uleb128 0x1b
+	.4byte	.LASF130
+	.byte	0x2
+	.2byte	0x3b0
+	.4byte	0x15a
+	.byte	0x48
+	.uleb128 0x1b
+	.4byte	.LASF131
+	.byte	0x2
+	.2byte	0x3b1
+	.4byte	0x15a
+	.byte	0x50
+	.uleb128 0x1b
+	.4byte	.LASF132
+	.byte	0x2
+	.2byte	0x3b2
+	.4byte	0x15a
+	.byte	0x58
+	.uleb128 0x1b
+	.4byte	.LASF133
+	.byte	0x2
+	.2byte	0x3b3
+	.4byte	0x15a
+	.byte	0x60
+	.byte	0
+	.uleb128 0x24
+	.4byte	.LASF2354
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xb48f
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xac6b
+	.uleb128 0xd
+	.4byte	.LASF2355
+	.byte	0xb0
+	.byte	0x9e
+	.byte	0x9f
+	.4byte	0xb59c
+	.uleb128 0xe
+	.4byte	.LASF1821
+	.byte	0x9e
+	.byte	0xa0
+	.4byte	0x3a7
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF265
+	.byte	0x9e
+	.byte	0xa1
+	.4byte	0x56
+	.byte	0x10
+	.uleb128 0x20
+	.string	"ops"
+	.byte	0x9e
+	.byte	0xa2
+	.4byte	0xbe8f
+	.byte	0x18
+	.uleb128 0xe
+	.4byte	.LASF2356
+	.byte	0x9e
+	.byte	0xa3
+	.4byte	0x458
+	.byte	0x20
+	.uleb128 0xe
+	.4byte	.LASF171
+	.byte	0x9e
+	.byte	0xa4
+	.4byte	0x6d
+	.byte	0x28
+	.uleb128 0xe
+	.4byte	.LASF2357
+	.byte	0x9e
+	.byte	0xa5
+	.4byte	0x6d
+	.byte	0x2c
+	.uleb128 0xe
+	.4byte	.LASF2191
+	.byte	0x9e
+	.byte	0xa8
+	.4byte	0xb3cf
+	.byte	0x30
+	.uleb128 0xe
+	.4byte	.LASF2358
+	.byte	0x9e
+	.byte	0xa9
+	.4byte	0xbc7a
+	.byte	0x38
+	.uleb128 0x20
+	.string	"gc"
+	.byte	0x9e
+	.byte	0xaa
+	.4byte	0xbe9a
+	.byte	0x40
+	.uleb128 0xe
+	.4byte	.LASF639
+	.byte	0x9e
+	.byte	0xac
+	.4byte	0xb59c
+	.byte	0x48
+	.uleb128 0xe
+	.4byte	.LASF130
+	.byte	0x9e
+	.byte	0xb2
+	.4byte	0x15a
+	.byte	0x50
+	.uleb128 0xe
+	.4byte	.LASF131
+	.byte	0x9e
+	.byte	0xb3
+	.4byte	0x15a
+	.byte	0x58
+	.uleb128 0xe
+	.4byte	.LASF132
+	.byte	0x9e
+	.byte	0xb4
+	.4byte	0x15a
+	.byte	0x60
+	.uleb128 0xe
+	.4byte	.LASF133
+	.byte	0x9e
+	.byte	0xb5
+	.4byte	0x15a
+	.byte	0x68
+	.uleb128 0xe
+	.4byte	.LASF2359
+	.byte	0x9e
+	.byte	0xb8
+	.4byte	0x35c
+	.byte	0x70
+	.uleb128 0xe
+	.4byte	.LASF2360
+	.byte	0x9e
+	.byte	0xb9
+	.4byte	0x6d
+	.byte	0x78
+	.uleb128 0xe
+	.4byte	.LASF2361
+	.byte	0x9e
+	.byte	0xba
+	.4byte	0x6d
+	.byte	0x7c
+	.uleb128 0xe
+	.4byte	.LASF2362
+	.byte	0x9e
+	.byte	0xbb
+	.4byte	0x4cff
+	.byte	0x80
+	.uleb128 0xe
+	.4byte	.LASF2363
+	.byte	0x9e
+	.byte	0xbc
+	.4byte	0x2464
+	.byte	0x90
+	.uleb128 0xe
+	.4byte	.LASF2364
+	.byte	0x9e
+	.byte	0xbd
+	.4byte	0xbea0
+	.byte	0xb0
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xb4a0
+	.uleb128 0x24
+	.4byte	.LASF2365
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xb5a2
+	.uleb128 0xd
+	.4byte	.LASF2366
+	.byte	0xc0
+	.byte	0x9
+	.byte	0x84
+	.4byte	0xb6da
+	.uleb128 0xe
+	.4byte	.LASF2367
+	.byte	0x9
+	.byte	0x85
+	.4byte	0xdbc4
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF2368
+	.byte	0x9
+	.byte	0x88
+	.4byte	0xdbe9
+	.byte	0x8
+	.uleb128 0xe
+	.4byte	.LASF109
+	.byte	0x9
+	.byte	0x8b
+	.4byte	0xdc17
+	.byte	0x10
+	.uleb128 0xe
+	.4byte	.LASF2369
+	.byte	0x9
+	.byte	0x8f
+	.4byte	0xdc4b
+	.byte	0x18
+	.uleb128 0xe
+	.4byte	.LASF2370
+	.byte	0x9
+	.byte	0x92
+	.4byte	0xdc79
+	.byte	0x20
+	.uleb128 0xe
+	.4byte	.LASF2371
+	.byte	0x9
+	.byte	0x96
+	.4byte	0xdc9e
+	.byte	0x28
+	.uleb128 0xe
+	.4byte	.LASF2372
+	.byte	0x9
+	.byte	0x9d
+	.4byte	0xdcc7
+	.byte	0x30
+	.uleb128 0xe
+	.4byte	.LASF2373
+	.byte	0x9
+	.byte	0xa0
+	.4byte	0xdcec
+	.byte	0x38
+	.uleb128 0xe
+	.4byte	.LASF2374
+	.byte	0x9
+	.byte	0xa4
+	.4byte	0xdd15
+	.byte	0x40
+	.uleb128 0xe
+	.4byte	.LASF2375
+	.byte	0x9
+	.byte	0xa7
+	.4byte	0xdc9e
+	.byte	0x48
+	.uleb128 0xe
+	.4byte	.LASF2376
+	.byte	0x9
+	.byte	0xaa
+	.4byte	0xdd35
+	.byte	0x50
+	.uleb128 0xe
+	.4byte	.LASF2377
+	.byte	0x9
+	.byte	0xad
+	.4byte	0xdd35
+	.byte	0x58
+	.uleb128 0xe
+	.4byte	.LASF2378
+	.byte	0x9
+	.byte	0xb0
+	.4byte	0xdd55
+	.byte	0x60
+	.uleb128 0xe
+	.4byte	.LASF2379
+	.byte	0x9
+	.byte	0xb3
+	.4byte	0xdd55
+	.byte	0x68
+	.uleb128 0xe
+	.4byte	.LASF2380
+	.byte	0x9
+	.byte	0xb6
+	.4byte	0xdd75
+	.byte	0x70
+	.uleb128 0xe
+	.4byte	.LASF2381
+	.byte	0x9
+	.byte	0xb8
+	.4byte	0xdd8f
+	.byte	0x78
+	.uleb128 0xe
+	.4byte	.LASF2382
+	.byte	0x9
+	.byte	0xb9
+	.4byte	0xdda9
+	.byte	0x80
+	.uleb128 0xe
+	.4byte	.LASF2383
+	.byte	0x9
+	.byte	0xba
+	.4byte	0xdda9
+	.byte	0x88
+	.uleb128 0xe
+	.4byte	.LASF2384
+	.byte	0x9
+	.byte	0xbb
+	.4byte	0xddd2
+	.byte	0x90
+	.uleb128 0xe
+	.4byte	.LASF2385
+	.byte	0x9
+	.byte	0xbd
+	.4byte	0xdded
+	.byte	0x98
+	.uleb128 0xe
+	.4byte	.LASF130
+	.byte	0x9
+	.byte	0xc3
+	.4byte	0x15a
+	.byte	0xa0
+	.uleb128 0xe
+	.4byte	.LASF131
+	.byte	0x9
+	.byte	0xc4
+	.4byte	0x15a
+	.byte	0xa8
+	.uleb128 0xe
+	.4byte	.LASF132
+	.byte	0x9
+	.byte	0xc5
+	.4byte	0x15a
+	.byte	0xb0
+	.uleb128 0xe
+	.4byte	.LASF133
+	.byte	0x9
+	.byte	0xc6
+	.4byte	0x15a
+	.byte	0xb8
+	.byte	0
+	.uleb128 0x3
+	.4byte	0xb5ad
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xb6da
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xb341
+	.uleb128 0x24
+	.4byte	.LASF2386
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xb6eb
+	.uleb128 0x45
+	.string	"cma"
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xb6f6
+	.uleb128 0x24
+	.4byte	.LASF2387
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xb701
+	.uleb128 0xd
+	.4byte	.LASF2388
+	.byte	0xf0
+	.byte	0xd
+	.byte	0x33
+	.4byte	0xb7b5
+	.uleb128 0xe
+	.4byte	.LASF265
+	.byte	0xd
+	.byte	0x34
+	.4byte	0x56
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF193
+	.byte	0xd
+	.byte	0x35
+	.4byte	0x56
+	.byte	0x8
+	.uleb128 0xe
+	.4byte	.LASF2389
+	.byte	0xd
+	.byte	0x36
+	.4byte	0xbb86
+	.byte	0x10
+	.uleb128 0xe
+	.4byte	.LASF2390
+	.byte	0xd
+	.byte	0x37
+	.4byte	0x56
+	.byte	0x18
+	.uleb128 0xe
+	.4byte	.LASF2191
+	.byte	0xd
+	.byte	0x38
+	.4byte	0xb369
+	.byte	0x20
+	.uleb128 0xe
+	.4byte	.LASF2391
+	.byte	0xd
+	.byte	0x3a
+	.4byte	0xbbda
+	.byte	0x58
+	.uleb128 0xe
+	.4byte	.LASF2392
+	.byte	0xd
+	.byte	0x3b
+	.4byte	0xbbda
+	.byte	0x60
+	.uleb128 0xe
+	.4byte	.LASF639
+	.byte	0xd
+	.byte	0x3c
+	.4byte	0xb7ba
+	.byte	0x68
+	.uleb128 0xe
+	.4byte	.LASF2002
+	.byte	0xd
+	.byte	0x3d
+	.4byte	0xb7ba
+	.byte	0x70
+	.uleb128 0xe
+	.4byte	.LASF641
+	.byte	0xd
+	.byte	0x3e
+	.4byte	0xb7ba
+	.byte	0x78
+	.uleb128 0xe
+	.4byte	.LASF2114
+	.byte	0xd
+	.byte	0x40
+	.4byte	0x902d
+	.byte	0x80
+	.uleb128 0xe
+	.4byte	.LASF2393
+	.byte	0xd
+	.byte	0x42
+	.4byte	0x29
+	.byte	0xe0
+	.uleb128 0xe
+	.4byte	.LASF793
+	.byte	0xd
+	.byte	0x43
+	.4byte	0x458
+	.byte	0xe8
+	.byte	0
+	.uleb128 0x3
+	.4byte	0xb70c
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xb70c
+	.uleb128 0x24
+	.4byte	.LASF2198
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xb7c0
+	.uleb128 0x24
+	.4byte	.LASF2199
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xb7cb
+	.uleb128 0x15
+	.4byte	.LASF2394
+	.byte	0x2
+	.2byte	0x590
+	.4byte	0xa778
+	.uleb128 0x15
+	.4byte	.LASF2395
+	.byte	0x2
+	.2byte	0x592
+	.4byte	0xa778
+	.uleb128 0x8
+	.4byte	.LASF2396
+	.byte	0x9c
+	.byte	0xe
+	.4byte	0x29
+	.uleb128 0x5
+	.4byte	0x8b
+	.4byte	0xb809
+	.uleb128 0x6
+	.4byte	0x4f
+	.byte	0x8
+	.byte	0
+	.uleb128 0x5
+	.4byte	0x61
+	.4byte	0xb819
+	.uleb128 0x6
+	.4byte	0x4f
+	.byte	0x7f
+	.byte	0
+	.uleb128 0x5
+	.4byte	0x61
+	.4byte	0xb829
+	.uleb128 0x6
+	.4byte	0x4f
+	.byte	0x13
+	.byte	0
+	.uleb128 0x1d
+	.4byte	.LASF2397
+	.byte	0x20
+	.byte	0x9c
+	.2byte	0x222
+	.4byte	0xb851
+	.uleb128 0x1b
+	.4byte	.LASF265
+	.byte	0x9c
+	.2byte	0x223
+	.4byte	0xb819
+	.byte	0
+	.uleb128 0x1b
+	.4byte	.LASF2172
+	.byte	0x9c
+	.2byte	0x224
+	.4byte	0xb7ee
+	.byte	0x18
+	.byte	0
+	.uleb128 0x3
+	.4byte	0xb829
+	.uleb128 0x5
+	.4byte	0x68
+	.4byte	0xb866
+	.uleb128 0x6
+	.4byte	0x4f
+	.byte	0xf
+	.byte	0
+	.uleb128 0x3
+	.4byte	0xb856
+	.uleb128 0x19
+	.4byte	.LASF2398
+	.byte	0x9f
+	.byte	0x14
+	.4byte	0xc6
+	.uleb128 0xd
+	.4byte	.LASF2399
+	.byte	0x20
+	.byte	0x9f
+	.byte	0x1e
+	.4byte	0xb8a7
+	.uleb128 0xe
+	.4byte	.LASF228
+	.byte	0x9f
+	.byte	0x1f
+	.4byte	0xe33
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF2400
+	.byte	0x9f
+	.byte	0x20
+	.4byte	0x3466
+	.byte	0x8
+	.uleb128 0xe
+	.4byte	.LASF98
+	.byte	0x9f
+	.byte	0x21
+	.4byte	0x2eff
+	.byte	0x18
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xb8ad
+	.uleb128 0x24
+	.4byte	.LASF2401
+	.uleb128 0xd
+	.4byte	.LASF2402
+	.byte	0x80
+	.byte	0x9d
+	.byte	0x75
+	.4byte	0xb97f
+	.uleb128 0x20
+	.string	"get"
+	.byte	0x9d
+	.byte	0x76
+	.4byte	0xba10
+	.byte	0
+	.uleb128 0x20
+	.string	"put"
+	.byte	0x9d
+	.byte	0x77
+	.4byte	0xba21
+	.byte	0x8
+	.uleb128 0xe
+	.4byte	.LASF2403
+	.byte	0x9d
+	.byte	0x78
+	.4byte	0xba36
+	.byte	0x10
+	.uleb128 0xe
+	.4byte	.LASF2404
+	.byte	0x9d
+	.byte	0x79
+	.4byte	0xba56
+	.byte	0x18
+	.uleb128 0xe
+	.4byte	.LASF2405
+	.byte	0x9d
+	.byte	0x7b
+	.4byte	0xba70
+	.byte	0x20
+	.uleb128 0xe
+	.4byte	.LASF2406
+	.byte	0x9d
+	.byte	0x7d
+	.4byte	0xba99
+	.byte	0x28
+	.uleb128 0xe
+	.4byte	.LASF2407
+	.byte	0x9d
+	.byte	0x82
+	.4byte	0xbac3
+	.byte	0x30
+	.uleb128 0xe
+	.4byte	.LASF2408
+	.byte	0x9d
+	.byte	0x85
+	.4byte	0xbad8
+	.byte	0x38
+	.uleb128 0xe
+	.4byte	.LASF2409
+	.byte	0x9d
+	.byte	0x87
+	.4byte	0xbaf2
+	.byte	0x40
+	.uleb128 0xe
+	.4byte	.LASF2410
+	.byte	0x9d
+	.byte	0x8a
+	.4byte	0xbb0c
+	.byte	0x48
+	.uleb128 0xe
+	.4byte	.LASF2411
+	.byte	0x9d
+	.byte	0x8c
+	.4byte	0xbb40
+	.byte	0x50
+	.uleb128 0xe
+	.4byte	.LASF2412
+	.byte	0x9d
+	.byte	0x91
+	.4byte	0xbaf2
+	.byte	0x58
+	.uleb128 0xe
+	.4byte	.LASF2413
+	.byte	0x9d
+	.byte	0x94
+	.4byte	0xbad8
+	.byte	0x60
+	.uleb128 0xe
+	.4byte	.LASF2414
+	.byte	0x9d
+	.byte	0x96
+	.4byte	0xba10
+	.byte	0x68
+	.uleb128 0xe
+	.4byte	.LASF2415
+	.byte	0x9d
+	.byte	0x97
+	.4byte	0xbb60
+	.byte	0x70
+	.uleb128 0xe
+	.4byte	.LASF2416
+	.byte	0x9d
+	.byte	0x99
+	.4byte	0xbb7a
+	.byte	0x78
+	.byte	0
+	.uleb128 0x3
+	.4byte	0xb8b2
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xb97f
+	.uleb128 0xd
+	.4byte	.LASF2417
+	.byte	0x10
+	.byte	0x9d
+	.byte	0x26
+	.4byte	0xb9ba
+	.uleb128 0xe
+	.4byte	.LASF2418
+	.byte	0x9d
+	.byte	0x27
+	.4byte	0x6d
+	.byte	0
+	.uleb128 0x20
+	.string	"id"
+	.byte	0x9d
+	.byte	0x28
+	.4byte	0x6d
+	.byte	0x4
+	.uleb128 0xe
+	.4byte	.LASF2419
+	.byte	0x9d
+	.byte	0x29
+	.4byte	0xb9ba
+	.byte	0x8
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xb3ca
+	.uleb128 0xd
+	.4byte	.LASF2420
+	.byte	0x50
+	.byte	0x9d
+	.byte	0x34
+	.4byte	0xb9f1
+	.uleb128 0xe
+	.4byte	.LASF2191
+	.byte	0x9d
+	.byte	0x35
+	.4byte	0xb3cf
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF2421
+	.byte	0x9d
+	.byte	0x36
+	.4byte	0x6d
+	.byte	0x8
+	.uleb128 0xe
+	.4byte	.LASF1723
+	.byte	0x9d
+	.byte	0x37
+	.4byte	0xb9f1
+	.byte	0x10
+	.byte	0
+	.uleb128 0x5
+	.4byte	0x15a
+	.4byte	0xba01
+	.uleb128 0x6
+	.4byte	0x4f
+	.byte	0x7
+	.byte	0
+	.uleb128 0x14
+	.4byte	0xb3cf
+	.4byte	0xba10
+	.uleb128 0x11
+	.4byte	0xb3cf
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xba01
+	.uleb128 0x10
+	.4byte	0xba21
+	.uleb128 0x11
+	.4byte	0xb3cf
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xba16
+	.uleb128 0x14
+	.4byte	0x2b0
+	.4byte	0xba36
+	.uleb128 0x11
+	.4byte	0xb9ba
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xba27
+	.uleb128 0x14
+	.4byte	0x30b6
+	.4byte	0xba50
+	.uleb128 0x11
+	.4byte	0xb9ba
+	.uleb128 0x11
+	.4byte	0xba50
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xa773
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xba3c
+	.uleb128 0x14
+	.4byte	0x2b0
+	.4byte	0xba70
+	.uleb128 0x11
+	.4byte	0xb9ba
+	.uleb128 0x11
+	.4byte	0x56
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xba5c
+	.uleb128 0x14
+	.4byte	0xc6
+	.4byte	0xba99
+	.uleb128 0x11
+	.4byte	0xb9ba
+	.uleb128 0x11
+	.4byte	0x56
+	.uleb128 0x11
+	.4byte	0x6d
+	.uleb128 0x11
+	.4byte	0x458
+	.uleb128 0x11
+	.4byte	0x2e3
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xba76
+	.uleb128 0x14
+	.4byte	0xc6
+	.4byte	0xbabd
+	.uleb128 0x11
+	.4byte	0xb9ba
+	.uleb128 0x11
+	.4byte	0x56
+	.uleb128 0x11
+	.4byte	0xbabd
+	.uleb128 0x11
+	.4byte	0x2e3
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x56
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xba9f
+	.uleb128 0x14
+	.4byte	0xb3cf
+	.4byte	0xbad8
+	.uleb128 0x11
+	.4byte	0xb9ba
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xbac9
+	.uleb128 0x14
+	.4byte	0xb3cf
+	.4byte	0xbaf2
+	.uleb128 0x11
+	.4byte	0xb9ba
+	.uleb128 0x11
+	.4byte	0xb3cf
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xbade
+	.uleb128 0x14
+	.4byte	0xb3cf
+	.4byte	0xbb0c
+	.uleb128 0x11
+	.4byte	0xb9ba
+	.uleb128 0x11
+	.4byte	0x56
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xbaf8
+	.uleb128 0x14
+	.4byte	0xc6
+	.4byte	0xbb3a
+	.uleb128 0x11
+	.4byte	0xb9ba
+	.uleb128 0x11
+	.4byte	0x56
+	.uleb128 0x11
+	.4byte	0x56
+	.uleb128 0x11
+	.4byte	0x6d
+	.uleb128 0x11
+	.4byte	0x6d
+	.uleb128 0x11
+	.4byte	0xbb3a
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xb9c0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xbb12
+	.uleb128 0x14
+	.4byte	0xc6
+	.4byte	0xbb5a
+	.uleb128 0x11
+	.4byte	0xb9ba
+	.uleb128 0x11
+	.4byte	0xbb5a
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xb98a
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xbb46
+	.uleb128 0x14
+	.4byte	0xc6
+	.4byte	0xbb7a
+	.uleb128 0x11
+	.4byte	0xb9ba
+	.uleb128 0x11
+	.4byte	0xa496
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xbb66
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x14a
+	.uleb128 0x8
+	.4byte	.LASF2389
+	.byte	0xd
+	.byte	0x1c
+	.4byte	0x13f
+	.uleb128 0xd
+	.4byte	.LASF2422
+	.byte	0x58
+	.byte	0xd
+	.byte	0x1f
+	.4byte	0xbbda
+	.uleb128 0xe
+	.4byte	.LASF265
+	.byte	0xd
+	.byte	0x20
+	.4byte	0x21e
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF2423
+	.byte	0xd
+	.byte	0x21
+	.4byte	0xc6
+	.byte	0x8
+	.uleb128 0xe
+	.4byte	.LASF2424
+	.byte	0xd
+	.byte	0x22
+	.4byte	0x458
+	.byte	0x10
+	.uleb128 0xe
+	.4byte	.LASF64
+	.byte	0xd
+	.byte	0x23
+	.4byte	0xbbda
+	.byte	0x18
+	.uleb128 0xe
+	.4byte	.LASF2083
+	.byte	0xd
+	.byte	0x2b
+	.4byte	0x9e40
+	.byte	0x20
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xbb91
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xb7b5
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x23f
+	.uleb128 0x19
+	.4byte	.LASF2425
+	.byte	0xd
+	.byte	0x6a
+	.4byte	0xa008
+	.uleb128 0x19
+	.4byte	.LASF2426
+	.byte	0xd
+	.byte	0x6b
+	.4byte	0xb97f
+	.uleb128 0x19
+	.4byte	.LASF2427
+	.byte	0xd
+	.byte	0x87
+	.4byte	0xb7ba
+	.uleb128 0x19
+	.4byte	.LASF2428
+	.byte	0xd
+	.byte	0x88
+	.4byte	0xb7ba
+	.uleb128 0x19
+	.4byte	.LASF2429
+	.byte	0xd
+	.byte	0x89
+	.4byte	0xb7ba
+	.uleb128 0x19
+	.4byte	.LASF2430
+	.byte	0xd
+	.byte	0x8a
+	.4byte	0xb7ba
+	.uleb128 0x19
+	.4byte	.LASF2431
+	.byte	0xd
+	.byte	0x8b
+	.4byte	0xe33
+	.uleb128 0xd
+	.4byte	.LASF2432
+	.byte	0x50
+	.byte	0x9e
+	.byte	0x3f
+	.4byte	0xbc6a
+	.uleb128 0xe
+	.4byte	.LASF2191
+	.byte	0x9e
+	.byte	0x40
+	.4byte	0xb3cf
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF2433
+	.byte	0x9e
+	.byte	0x41
+	.4byte	0xc6
+	.byte	0x8
+	.uleb128 0xe
+	.4byte	.LASF2434
+	.byte	0x9e
+	.byte	0x42
+	.4byte	0xbc6a
+	.byte	0xc
+	.byte	0
+	.uleb128 0x5
+	.4byte	0x13f
+	.4byte	0xbc7a
+	.uleb128 0x6
+	.4byte	0x4f
+	.byte	0xf
+	.byte	0
+	.uleb128 0x1f
+	.4byte	.LASF2435
+	.byte	0x4
+	.4byte	0x6d
+	.byte	0x9e
+	.byte	0x4c
+	.4byte	0xbcbb
+	.uleb128 0xc
+	.4byte	.LASF2436
+	.byte	0
+	.uleb128 0xc
+	.4byte	.LASF2437
+	.byte	0x1
+	.uleb128 0xc
+	.4byte	.LASF2438
+	.byte	0x2
+	.uleb128 0xc
+	.4byte	.LASF2439
+	.byte	0x3
+	.uleb128 0xc
+	.4byte	.LASF2440
+	.byte	0x4
+	.uleb128 0xc
+	.4byte	.LASF2441
+	.byte	0x5
+	.uleb128 0xc
+	.4byte	.LASF2442
+	.byte	0x6
+	.uleb128 0xc
+	.4byte	.LASF2443
+	.byte	0x7
+	.byte	0
+	.uleb128 0xd
+	.4byte	.LASF2444
+	.byte	0x50
+	.byte	0x9e
+	.byte	0x66
+	.4byte	0xbd40
+	.uleb128 0xe
+	.4byte	.LASF2299
+	.byte	0x9e
+	.byte	0x67
+	.4byte	0xbd5e
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF2445
+	.byte	0x9e
+	.byte	0x69
+	.4byte	0xbd83
+	.byte	0x8
+	.uleb128 0x20
+	.string	"map"
+	.byte	0x9e
+	.byte	0x6b
+	.4byte	0xbda2
+	.byte	0x10
+	.uleb128 0xe
+	.4byte	.LASF2446
+	.byte	0x9e
+	.byte	0x6c
+	.4byte	0xbdb8
+	.byte	0x18
+	.uleb128 0xe
+	.4byte	.LASF2447
+	.byte	0x9e
+	.byte	0x6d
+	.4byte	0xbde6
+	.byte	0x20
+	.uleb128 0xe
+	.4byte	.LASF2367
+	.byte	0x9e
+	.byte	0x72
+	.4byte	0xbe0a
+	.byte	0x28
+	.uleb128 0xe
+	.4byte	.LASF2368
+	.byte	0x9e
+	.byte	0x74
+	.4byte	0xbe25
+	.byte	0x30
+	.uleb128 0xe
+	.4byte	.LASF2286
+	.byte	0x9e
+	.byte	0x76
+	.4byte	0xbe44
+	.byte	0x38
+	.uleb128 0xe
+	.4byte	.LASF2448
+	.byte	0x9e
+	.byte	0x77
+	.4byte	0xbe5a
+	.byte	0x40
+	.uleb128 0xe
+	.4byte	.LASF2449
+	.byte	0x9e
+	.byte	0x78
+	.4byte	0xbe7e
+	.byte	0x48
+	.byte	0
+	.uleb128 0x3
+	.4byte	0xbcbb
+	.uleb128 0x14
+	.4byte	0xc6
+	.4byte	0xbd5e
+	.uleb128 0x11
+	.4byte	0xb59c
+	.uleb128 0x11
+	.4byte	0xb7ba
+	.uleb128 0x11
+	.4byte	0xbc7a
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xbd45
+	.uleb128 0x14
+	.4byte	0xc6
+	.4byte	0xbd7d
+	.uleb128 0x11
+	.4byte	0xb59c
+	.uleb128 0x11
+	.4byte	0xbd7d
+	.uleb128 0x11
+	.4byte	0xbc7a
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xbc39
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xbd64
+	.uleb128 0x14
+	.4byte	0xc6
+	.4byte	0xbda2
+	.uleb128 0x11
+	.4byte	0xb59c
+	.uleb128 0x11
+	.4byte	0x6d
+	.uleb128 0x11
+	.4byte	0x35c
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xbd89
+	.uleb128 0x10
+	.4byte	0xbdb8
+	.uleb128 0x11
+	.4byte	0xb59c
+	.uleb128 0x11
+	.4byte	0x6d
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xbda8
+	.uleb128 0x14
+	.4byte	0xc6
+	.4byte	0xbde6
+	.uleb128 0x11
+	.4byte	0xb59c
+	.uleb128 0x11
+	.4byte	0xb7ba
+	.uleb128 0x11
+	.4byte	0xbb80
+	.uleb128 0x11
+	.4byte	0x6d
+	.uleb128 0x11
+	.4byte	0x67bd
+	.uleb128 0x11
+	.4byte	0x34a7
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xbdbe
+	.uleb128 0x14
+	.4byte	0xc6
+	.4byte	0xbe0a
+	.uleb128 0x11
+	.4byte	0xb59c
+	.uleb128 0x11
+	.4byte	0x6d
+	.uleb128 0x11
+	.4byte	0x6d
+	.uleb128 0x11
+	.4byte	0x458
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xbdec
+	.uleb128 0x10
+	.4byte	0xbe25
+	.uleb128 0x11
+	.4byte	0xb59c
+	.uleb128 0x11
+	.4byte	0x6d
+	.uleb128 0x11
+	.4byte	0x6d
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xbe10
+	.uleb128 0x14
+	.4byte	0xc6
+	.4byte	0xbe44
+	.uleb128 0x11
+	.4byte	0xb59c
+	.uleb128 0x11
+	.4byte	0xb8a7
+	.uleb128 0x11
+	.4byte	0x2b0
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xbe2b
+	.uleb128 0x10
+	.4byte	0xbe5a
+	.uleb128 0x11
+	.4byte	0xb59c
+	.uleb128 0x11
+	.4byte	0xb8a7
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xbe4a
+	.uleb128 0x14
+	.4byte	0xc6
+	.4byte	0xbe7e
+	.uleb128 0x11
+	.4byte	0xb59c
+	.uleb128 0x11
+	.4byte	0xbd7d
+	.uleb128 0x11
+	.4byte	0x67bd
+	.uleb128 0x11
+	.4byte	0x34a7
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xbe60
+	.uleb128 0x19
+	.4byte	.LASF2450
+	.byte	0x9e
+	.byte	0x81
+	.4byte	0xbcbb
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xbd40
+	.uleb128 0x24
+	.4byte	.LASF2451
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xbe95
+	.uleb128 0x5
+	.4byte	0x6d
+	.4byte	0xbeaf
+	.uleb128 0x41
+	.4byte	0x4f
+	.byte	0
+	.uleb128 0x15
+	.4byte	.LASF2452
+	.byte	0x9e
+	.2byte	0x121
+	.4byte	0xb97f
+	.uleb128 0x15
+	.4byte	.LASF2453
+	.byte	0x9e
+	.2byte	0x1a5
+	.4byte	0xbd40
+	.uleb128 0xd
+	.4byte	.LASF2454
+	.byte	0x10
+	.byte	0xa0
+	.byte	0x45
+	.4byte	0xbf04
+	.uleb128 0xe
+	.4byte	.LASF1118
+	.byte	0xa0
+	.byte	0x46
+	.4byte	0xa9
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF171
+	.byte	0xa0
+	.byte	0x47
+	.4byte	0xa9
+	.byte	0x2
+	.uleb128 0x20
+	.string	"len"
+	.byte	0xa0
+	.byte	0x54
+	.4byte	0xa9
+	.byte	0x4
+	.uleb128 0x20
+	.string	"buf"
+	.byte	0xa0
+	.byte	0x55
+	.4byte	0xbf04
+	.byte	0x8
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x8b
+	.uleb128 0x36
+	.4byte	.LASF2455
+	.byte	0x22
+	.byte	0xa0
+	.byte	0x87
+	.4byte	0xbf38
+	.uleb128 0x22
+	.4byte	.LASF2456
+	.byte	0xa0
+	.byte	0x88
+	.4byte	0x8b
+	.uleb128 0x22
+	.4byte	.LASF2457
+	.byte	0xa0
+	.byte	0x89
+	.4byte	0xa9
+	.uleb128 0x22
+	.4byte	.LASF2458
+	.byte	0xa0
+	.byte	0x8a
+	.4byte	0xbf38
+	.byte	0
+	.uleb128 0x5
+	.4byte	0x8b
+	.4byte	0xbf48
+	.uleb128 0x6
+	.4byte	0x4f
+	.byte	0x21
+	.byte	0
+	.uleb128 0x19
+	.4byte	.LASF2459
+	.byte	0xa1
+	.byte	0x27
+	.4byte	0xad03
+	.uleb128 0x19
+	.4byte	.LASF2460
+	.byte	0xa1
+	.byte	0x28
+	.4byte	0xaffb
+	.uleb128 0x19
+	.4byte	.LASF2461
+	.byte	0xa1
+	.byte	0x29
+	.4byte	0xaffb
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xbf6f
+	.uleb128 0x1a
+	.4byte	.LASF2462
+	.2byte	0x3e8
+	.byte	0xa1
+	.2byte	0x148
+	.4byte	0xbfe9
+	.uleb128 0x1b
+	.4byte	.LASF171
+	.byte	0xa1
+	.2byte	0x149
+	.4byte	0xb4
+	.byte	0
+	.uleb128 0x1b
+	.4byte	.LASF1118
+	.byte	0xa1
+	.2byte	0x14a
+	.4byte	0xb4
+	.byte	0x2
+	.uleb128 0x1b
+	.4byte	.LASF265
+	.byte	0xa1
+	.2byte	0x14d
+	.4byte	0xb819
+	.byte	0x4
+	.uleb128 0x1b
+	.4byte	.LASF2463
+	.byte	0xa1
+	.2byte	0x14e
+	.4byte	0xc0f4
+	.byte	0x18
+	.uleb128 0x2b
+	.string	"dev"
+	.byte	0xa1
+	.2byte	0x14f
+	.4byte	0xa49c
+	.byte	0x20
+	.uleb128 0x1c
+	.4byte	.LASF2464
+	.byte	0xa1
+	.2byte	0x150
+	.4byte	0xc6
+	.2byte	0x3d0
+	.uleb128 0x30
+	.string	"irq"
+	.byte	0xa1
+	.2byte	0x151
+	.4byte	0xc6
+	.2byte	0x3d4
+	.uleb128 0x1c
+	.4byte	.LASF2465
+	.byte	0xa1
+	.2byte	0x152
+	.4byte	0x3a7
+	.2byte	0x3d8
+	.byte	0
+	.uleb128 0x3
+	.4byte	0xbf6f
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x110
+	.uleb128 0x1a
+	.4byte	.LASF2466
+	.2byte	0x4c0
+	.byte	0xa1
+	.2byte	0x2a0
+	.4byte	0xc0f4
+	.uleb128 0x1b
+	.4byte	.LASF98
+	.byte	0xa1
+	.2byte	0x2a1
+	.4byte	0x74a1
+	.byte	0
+	.uleb128 0x1b
+	.4byte	.LASF2196
+	.byte	0xa1
+	.2byte	0x2a2
+	.4byte	0x6d
+	.byte	0x8
+	.uleb128 0x1b
+	.4byte	.LASF2467
+	.byte	0xa1
+	.2byte	0x2a3
+	.4byte	0xc34f
+	.byte	0x10
+	.uleb128 0x1b
+	.4byte	.LASF2468
+	.byte	0xa1
+	.2byte	0x2a4
+	.4byte	0x458
+	.byte	0x18
+	.uleb128 0x1b
+	.4byte	.LASF2469
+	.byte	0xa1
+	.2byte	0x2a7
+	.4byte	0xc355
+	.byte	0x20
+	.uleb128 0x1b
+	.4byte	.LASF2470
+	.byte	0xa1
+	.2byte	0x2a8
+	.4byte	0xb876
+	.byte	0x28
+	.uleb128 0x1b
+	.4byte	.LASF2471
+	.byte	0xa1
+	.2byte	0x2a9
+	.4byte	0xb876
+	.byte	0x48
+	.uleb128 0x1b
+	.4byte	.LASF1037
+	.byte	0xa1
+	.2byte	0x2ab
+	.4byte	0xc6
+	.byte	0x68
+	.uleb128 0x1b
+	.4byte	.LASF2472
+	.byte	0xa1
+	.2byte	0x2ac
+	.4byte	0xc6
+	.byte	0x6c
+	.uleb128 0x2b
+	.string	"dev"
+	.byte	0xa1
+	.2byte	0x2ad
+	.4byte	0xa49c
+	.byte	0x70
+	.uleb128 0x30
+	.string	"nr"
+	.byte	0xa1
+	.2byte	0x2af
+	.4byte	0xc6
+	.2byte	0x420
+	.uleb128 0x1c
+	.4byte	.LASF265
+	.byte	0xa1
+	.2byte	0x2b0
+	.4byte	0xc35b
+	.2byte	0x424
+	.uleb128 0x1c
+	.4byte	.LASF2473
+	.byte	0xa1
+	.2byte	0x2b1
+	.4byte	0x4579
+	.2byte	0x458
+	.uleb128 0x1c
+	.4byte	.LASF2474
+	.byte	0xa1
+	.2byte	0x2b3
+	.4byte	0x2464
+	.2byte	0x478
+	.uleb128 0x1c
+	.4byte	.LASF2475
+	.byte	0xa1
+	.2byte	0x2b4
+	.4byte	0x3a7
+	.2byte	0x498
+	.uleb128 0x1c
+	.4byte	.LASF2476
+	.byte	0xa1
+	.2byte	0x2b6
+	.4byte	0xc36b
+	.2byte	0x4a8
+	.uleb128 0x1c
+	.4byte	.LASF2477
+	.byte	0xa1
+	.2byte	0x2b7
+	.4byte	0xc371
+	.2byte	0x4b0
+	.uleb128 0x1c
+	.4byte	.LASF2478
+	.byte	0xa1
+	.2byte	0x2b9
+	.4byte	0xb59c
+	.2byte	0x4b8
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xbff4
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x970f
+	.uleb128 0x1d
+	.4byte	.LASF2479
+	.byte	0x18
+	.byte	0xa1
+	.2byte	0x207
+	.4byte	0xc135
+	.uleb128 0x1b
+	.4byte	.LASF2480
+	.byte	0xa1
+	.2byte	0x20e
+	.4byte	0xc159
+	.byte	0
+	.uleb128 0x1b
+	.4byte	.LASF2481
+	.byte	0xa1
+	.2byte	0x210
+	.4byte	0xc192
+	.byte	0x8
+	.uleb128 0x1b
+	.4byte	.LASF2482
+	.byte	0xa1
+	.2byte	0x215
+	.4byte	0xc1a7
+	.byte	0x10
+	.byte	0
+	.uleb128 0x3
+	.4byte	0xc100
+	.uleb128 0x14
+	.4byte	0xc6
+	.4byte	0xc153
+	.uleb128 0x11
+	.4byte	0xc0f4
+	.uleb128 0x11
+	.4byte	0xc153
+	.uleb128 0x11
+	.4byte	0xc6
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xbec7
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xc13a
+	.uleb128 0x14
+	.4byte	0xc6
+	.4byte	0xc18c
+	.uleb128 0x11
+	.4byte	0xc0f4
+	.uleb128 0x11
+	.4byte	0x11f
+	.uleb128 0x11
+	.4byte	0xb4
+	.uleb128 0x11
+	.4byte	0x61
+	.uleb128 0x11
+	.4byte	0x110
+	.uleb128 0x11
+	.4byte	0xc6
+	.uleb128 0x11
+	.4byte	0xc18c
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xbf0a
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xc15f
+	.uleb128 0x14
+	.4byte	0x13f
+	.4byte	0xc1a7
+	.uleb128 0x11
+	.4byte	0xc0f4
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xc198
+	.uleb128 0x1d
+	.4byte	.LASF2483
+	.byte	0x18
+	.byte	0xa1
+	.2byte	0x225
+	.4byte	0xc1e2
+	.uleb128 0x1b
+	.4byte	.LASF2484
+	.byte	0xa1
+	.2byte	0x226
+	.4byte	0xc1f7
+	.byte	0
+	.uleb128 0x1b
+	.4byte	.LASF2485
+	.byte	0xa1
+	.2byte	0x227
+	.4byte	0xc211
+	.byte	0x8
+	.uleb128 0x1b
+	.4byte	.LASF2486
+	.byte	0xa1
+	.2byte	0x228
+	.4byte	0xc1f7
+	.byte	0x10
+	.byte	0
+	.uleb128 0x3
+	.4byte	0xc1ad
+	.uleb128 0x10
+	.4byte	0xc1f7
+	.uleb128 0x11
+	.4byte	0xc0f4
+	.uleb128 0x11
+	.4byte	0x6d
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xc1e7
+	.uleb128 0x14
+	.4byte	0xc6
+	.4byte	0xc211
+	.uleb128 0x11
+	.4byte	0xc0f4
+	.uleb128 0x11
+	.4byte	0x6d
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xc1fd
+	.uleb128 0x1d
+	.4byte	.LASF2487
+	.byte	0x50
+	.byte	0xa1
+	.2byte	0x254
+	.4byte	0xc2a7
+	.uleb128 0x1b
+	.4byte	.LASF2488
+	.byte	0xa1
+	.2byte	0x255
+	.4byte	0xc2b6
+	.byte	0
+	.uleb128 0x1b
+	.4byte	.LASF2489
+	.byte	0xa1
+	.2byte	0x257
+	.4byte	0xc2b6
+	.byte	0x8
+	.uleb128 0x1b
+	.4byte	.LASF2490
+	.byte	0xa1
+	.2byte	0x258
+	.4byte	0xc2cc
+	.byte	0x10
+	.uleb128 0x1b
+	.4byte	.LASF2491
+	.byte	0xa1
+	.2byte	0x259
+	.4byte	0xc2b6
+	.byte	0x18
+	.uleb128 0x1b
+	.4byte	.LASF2492
+	.byte	0xa1
+	.2byte	0x25a
+	.4byte	0xc2cc
+	.byte	0x20
+	.uleb128 0x1b
+	.4byte	.LASF2493
+	.byte	0xa1
+	.2byte	0x25b
+	.4byte	0xc2b6
+	.byte	0x28
+	.uleb128 0x1b
+	.4byte	.LASF2494
+	.byte	0xa1
+	.2byte	0x25d
+	.4byte	0xc2dd
+	.byte	0x30
+	.uleb128 0x1b
+	.4byte	.LASF2495
+	.byte	0xa1
+	.2byte	0x25e
+	.4byte	0xc2dd
+	.byte	0x38
+	.uleb128 0x1b
+	.4byte	.LASF2496
+	.byte	0xa1
+	.2byte	0x261
+	.4byte	0xc2e8
+	.byte	0x40
+	.uleb128 0x1b
+	.4byte	.LASF2497
+	.byte	0xa1
+	.2byte	0x262
+	.4byte	0xc2e8
+	.byte	0x48
+	.byte	0
+	.uleb128 0x14
+	.4byte	0xc6
+	.4byte	0xc2b6
+	.uleb128 0x11
+	.4byte	0xc0f4
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xc2a7
+	.uleb128 0x10
+	.4byte	0xc2cc
+	.uleb128 0x11
+	.4byte	0xc0f4
+	.uleb128 0x11
+	.4byte	0xc6
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xc2bc
+	.uleb128 0x10
+	.4byte	0xc2dd
+	.uleb128 0x11
+	.4byte	0xc0f4
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xc2d2
+	.uleb128 0x24
+	.4byte	.LASF2498
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xc2e3
+	.uleb128 0x1d
+	.4byte	.LASF2499
+	.byte	0x18
+	.byte	0xa1
+	.2byte	0x27f
+	.4byte	0xc34a
+	.uleb128 0x1b
+	.4byte	.LASF171
+	.byte	0xa1
+	.2byte	0x280
+	.4byte	0x15a
+	.byte	0
+	.uleb128 0x1b
+	.4byte	.LASF2500
+	.byte	0xa1
+	.2byte	0x281
+	.4byte	0xc6
+	.byte	0x8
+	.uleb128 0x1b
+	.4byte	.LASF2501
+	.byte	0xa1
+	.2byte	0x282
+	.4byte	0x11f
+	.byte	0xc
+	.uleb128 0x1b
+	.4byte	.LASF2502
+	.byte	0xa1
+	.2byte	0x283
+	.4byte	0x11f
+	.byte	0xe
+	.uleb128 0x1b
+	.4byte	.LASF2503
+	.byte	0xa1
+	.2byte	0x284
+	.4byte	0x11f
+	.byte	0x10
+	.uleb128 0x1b
+	.4byte	.LASF2504
+	.byte	0xa1
+	.2byte	0x285
+	.4byte	0x11f
+	.byte	0x12
+	.byte	0
+	.uleb128 0x3
+	.4byte	0xc2ee
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xc135
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xc1e2
+	.uleb128 0x5
+	.4byte	0x61
+	.4byte	0xc36b
+	.uleb128 0x6
+	.4byte	0x4f
+	.byte	0x2f
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xc217
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xc34a
+	.uleb128 0x19
+	.4byte	.LASF2505
+	.byte	0xa2
+	.byte	0x8
+	.4byte	0xc6
+	.uleb128 0xf
+	.byte	0x40
+	.byte	0xa3
+	.byte	0x1d
+	.4byte	0xc3a3
+	.uleb128 0xe
+	.4byte	.LASF2506
+	.byte	0xa3
+	.byte	0x1e
+	.4byte	0x6d
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF2507
+	.byte	0xa3
+	.byte	0x1f
+	.4byte	0xc3a3
+	.byte	0x4
+	.byte	0
+	.uleb128 0x5
+	.4byte	0x6d
+	.4byte	0xc3b3
+	.uleb128 0x6
+	.4byte	0x4f
+	.byte	0x6
+	.byte	0
+	.uleb128 0x8
+	.4byte	.LASF2508
+	.byte	0xa3
+	.byte	0x20
+	.4byte	0xc382
+	.uleb128 0x19
+	.4byte	.LASF2509
+	.byte	0xa4
+	.byte	0x15
+	.4byte	0xc3b3
+	.uleb128 0xd
+	.4byte	.LASF2510
+	.byte	0x8
+	.byte	0xa3
+	.byte	0x2c
+	.4byte	0xc3e2
+	.uleb128 0x20
+	.string	"hcr"
+	.byte	0xa3
+	.byte	0x2d
+	.4byte	0x15a
+	.byte	0
+	.byte	0
+	.uleb128 0x19
+	.4byte	.LASF2511
+	.byte	0xa3
+	.byte	0x30
+	.4byte	0xc3c9
+	.uleb128 0x15
+	.4byte	.LASF2512
+	.byte	0xa5
+	.2byte	0x102
+	.4byte	0x162a
+	.uleb128 0x15
+	.4byte	.LASF2513
+	.byte	0xa5
+	.2byte	0x1ae
+	.4byte	0x2b0
+	.uleb128 0x46
+	.byte	0x4
+	.4byte	0x6d
+	.byte	0xa5
+	.2byte	0x1d0
+	.4byte	0xc455
+	.uleb128 0xc
+	.4byte	.LASF2514
+	.byte	0
+	.uleb128 0xc
+	.4byte	.LASF2515
+	.byte	0x1
+	.uleb128 0xc
+	.4byte	.LASF2516
+	.byte	0x2
+	.uleb128 0xc
+	.4byte	.LASF2517
+	.byte	0x3
+	.uleb128 0xc
+	.4byte	.LASF2518
+	.byte	0x4
+	.uleb128 0xc
+	.4byte	.LASF2519
+	.byte	0x5
+	.uleb128 0xc
+	.4byte	.LASF2520
+	.byte	0x6
+	.uleb128 0xc
+	.4byte	.LASF2521
+	.byte	0x7
+	.uleb128 0xc
+	.4byte	.LASF2522
+	.byte	0x8
+	.uleb128 0xc
+	.4byte	.LASF2523
+	.byte	0x9
+	.uleb128 0xc
+	.4byte	.LASF2524
+	.byte	0xa
+	.byte	0
+	.uleb128 0x5
+	.4byte	0x5c
+	.4byte	0xc465
+	.uleb128 0x6
+	.4byte	0x4f
+	.byte	0x9
+	.byte	0
+	.uleb128 0x3
+	.4byte	0xc455
+	.uleb128 0x15
+	.4byte	.LASF2525
+	.byte	0xa5
+	.2byte	0x1e5
+	.4byte	0xc465
+	.uleb128 0x15
+	.4byte	.LASF2526
+	.byte	0xa5
+	.2byte	0x203
+	.4byte	0x2eff
+	.uleb128 0x5
+	.4byte	0x29
+	.4byte	0xc493
+	.uleb128 0x40
+	.4byte	0x4f
+	.2byte	0x1ff
+	.byte	0
+	.uleb128 0x19
+	.4byte	.LASF2527
+	.byte	0xa7
+	.byte	0x39
+	.4byte	0xc482
+	.uleb128 0x5
+	.4byte	0x3347
+	.4byte	0xc4af
+	.uleb128 0x40
+	.4byte	0x4f
+	.2byte	0x1ff
+	.byte	0
+	.uleb128 0x15
+	.4byte	.LASF2528
+	.byte	0xa7
+	.2byte	0x2c3
+	.4byte	0xc49e
+	.uleb128 0x5
+	.4byte	0x3347
+	.4byte	0xc4c6
+	.uleb128 0x18
+	.byte	0
+	.uleb128 0x15
+	.4byte	.LASF2529
+	.byte	0xa7
+	.2byte	0x2c4
+	.4byte	0xc4bb
+	.uleb128 0x15
+	.4byte	.LASF2530
+	.byte	0xa7
+	.2byte	0x2c5
+	.4byte	0xc49e
+	.uleb128 0x15
+	.4byte	.LASF2531
+	.byte	0xa7
+	.2byte	0x2c6
+	.4byte	0xc49e
+	.uleb128 0x19
+	.4byte	.LASF2532
+	.byte	0xa8
+	.byte	0x1e
+	.4byte	0x304
+	.uleb128 0x19
+	.4byte	.LASF2533
+	.byte	0x6b
+	.byte	0xb0
+	.4byte	0x3a7
+	.uleb128 0xb
+	.byte	0x4
+	.4byte	0x6d
+	.byte	0xa9
+	.byte	0x9d
+	.4byte	0xc52b
+	.uleb128 0xc
+	.4byte	.LASF2534
+	.byte	0x1
+	.uleb128 0xc
+	.4byte	.LASF2535
+	.byte	0x2
+	.uleb128 0xc
+	.4byte	.LASF2536
+	.byte	0x4
+	.uleb128 0xc
+	.4byte	.LASF2537
+	.byte	0x8
+	.uleb128 0xc
+	.4byte	.LASF2538
+	.byte	0x10
+	.byte	0
+	.uleb128 0x19
+	.4byte	.LASF2539
+	.byte	0xaa
+	.byte	0x45
+	.4byte	0x2eff
+	.uleb128 0xd
+	.4byte	.LASF2540
+	.byte	0x50
+	.byte	0xab
+	.byte	0x42
+	.4byte	0xc5af
+	.uleb128 0xe
+	.4byte	.LASF2541
+	.byte	0xab
+	.byte	0x43
+	.4byte	0xc6
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF265
+	.byte	0xab
+	.byte	0x44
+	.4byte	0x56
+	.byte	0x8
+	.uleb128 0xe
+	.4byte	.LASF2542
+	.byte	0xab
+	.byte	0x45
+	.4byte	0x7cec
+	.byte	0x10
+	.uleb128 0xe
+	.4byte	.LASF932
+	.byte	0xab
+	.byte	0x46
+	.4byte	0x3a7
+	.byte	0x18
+	.uleb128 0xe
+	.4byte	.LASF639
+	.byte	0xab
+	.byte	0x47
+	.4byte	0xa496
+	.byte	0x28
+	.uleb128 0xe
+	.4byte	.LASF2543
+	.byte	0xab
+	.byte	0x48
+	.4byte	0xa496
+	.byte	0x30
+	.uleb128 0xe
+	.4byte	.LASF2197
+	.byte	0xab
+	.byte	0x49
+	.4byte	0xae51
+	.byte	0x38
+	.uleb128 0xe
+	.4byte	.LASF2544
+	.byte	0xab
+	.byte	0x4a
+	.4byte	0x56
+	.byte	0x40
+	.uleb128 0xe
+	.4byte	.LASF874
+	.byte	0xab
+	.byte	0x4b
+	.4byte	0x28f
+	.byte	0x48
+	.byte	0
+	.uleb128 0x8
+	.4byte	.LASF2545
+	.byte	0xac
+	.byte	0x3c
+	.4byte	0xc5ba
+	.uleb128 0x10
+	.4byte	0xc5c5
+	.uleb128 0x11
+	.4byte	0xc5c5
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xc5cb
+	.uleb128 0xd
+	.4byte	.LASF2546
+	.byte	0x38
+	.byte	0xac
+	.byte	0x58
+	.4byte	0xc623
+	.uleb128 0xe
+	.4byte	.LASF383
+	.byte	0xac
+	.byte	0x59
+	.4byte	0x558
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF2547
+	.byte	0xac
+	.byte	0x5e
+	.4byte	0x29
+	.byte	0x8
+	.uleb128 0xe
+	.4byte	.LASF113
+	.byte	0xac
+	.byte	0x5f
+	.4byte	0xc623
+	.byte	0x10
+	.uleb128 0xe
+	.4byte	.LASF2548
+	.byte	0xac
+	.byte	0x60
+	.4byte	0xc623
+	.byte	0x18
+	.uleb128 0x35
+	.4byte	.LASF2549
+	.byte	0xac
+	.byte	0x61
+	.4byte	0x2b0
+	.byte	0x1
+	.byte	0x1
+	.byte	0x7
+	.byte	0x20
+	.uleb128 0x20
+	.string	"rcu"
+	.byte	0xac
+	.byte	0x62
+	.4byte	0x41c
+	.byte	0x28
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xc5af
+	.uleb128 0xd
+	.4byte	.LASF2550
+	.byte	0x20
+	.byte	0xad
+	.byte	0xa
+	.4byte	0xc666
+	.uleb128 0xe
+	.4byte	.LASF854
+	.byte	0xad
+	.byte	0xb
+	.4byte	0x2e3
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF957
+	.byte	0xad
+	.byte	0xc
+	.4byte	0x2e3
+	.byte	0x8
+	.uleb128 0xe
+	.4byte	.LASF2551
+	.byte	0xad
+	.byte	0xd
+	.4byte	0x9d58
+	.byte	0x10
+	.uleb128 0xe
+	.4byte	.LASF1711
+	.byte	0xad
+	.byte	0xe
+	.4byte	0x4b7
+	.byte	0x18
+	.byte	0
+	.uleb128 0xd
+	.4byte	.LASF2552
+	.byte	0x18
+	.byte	0xae
+	.byte	0x18
+	.4byte	0xc697
+	.uleb128 0xe
+	.4byte	.LASF71
+	.byte	0xae
+	.byte	0x19
+	.4byte	0x458
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF793
+	.byte	0xae
+	.byte	0x1a
+	.4byte	0x458
+	.byte	0x8
+	.uleb128 0xe
+	.4byte	.LASF589
+	.byte	0xae
+	.byte	0x1b
+	.4byte	0xc6
+	.byte	0x10
+	.byte	0
+	.uleb128 0xd
+	.4byte	.LASF2553
+	.byte	0x30
+	.byte	0xae
+	.byte	0x1e
+	.4byte	0xc6e0
+	.uleb128 0xe
+	.4byte	.LASF265
+	.byte	0xae
+	.byte	0x1f
+	.4byte	0x56
+	.byte	0
+	.uleb128 0x20
+	.string	"key"
+	.byte	0xae
+	.byte	0x20
+	.4byte	0xf07
+	.byte	0x8
+	.uleb128 0xe
+	.4byte	.LASF2554
+	.byte	0xae
+	.byte	0x21
+	.4byte	0x4a1
+	.byte	0x18
+	.uleb128 0xe
+	.4byte	.LASF2555
+	.byte	0xae
+	.byte	0x22
+	.4byte	0x4b7
+	.byte	0x20
+	.uleb128 0xe
+	.4byte	.LASF2556
+	.byte	0xae
+	.byte	0x23
+	.4byte	0xc6e0
+	.byte	0x28
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xc666
+	.uleb128 0x8
+	.4byte	.LASF2557
+	.byte	0xae
+	.byte	0x27
+	.4byte	0xcd
+	.uleb128 0x19
+	.4byte	.LASF2558
+	.byte	0xaf
+	.byte	0xa
+	.4byte	0xc697
+	.uleb128 0x19
+	.4byte	.LASF2559
+	.byte	0xaf
+	.byte	0xb
+	.4byte	0xc697
+	.uleb128 0x19
+	.4byte	.LASF2560
+	.byte	0xaf
+	.byte	0xc
+	.4byte	0xc697
+	.uleb128 0x19
+	.4byte	.LASF2561
+	.byte	0xaf
+	.byte	0xd
+	.4byte	0xc697
+	.uleb128 0x19
+	.4byte	.LASF2562
+	.byte	0xaf
+	.byte	0xe
+	.4byte	0xc697
+	.uleb128 0x19
+	.4byte	.LASF2563
+	.byte	0xaf
+	.byte	0xf
+	.4byte	0xc697
+	.uleb128 0x19
+	.4byte	.LASF2564
+	.byte	0xaf
+	.byte	0x10
+	.4byte	0xc697
+	.uleb128 0xd
+	.4byte	.LASF2565
+	.byte	0x28
+	.byte	0x73
+	.byte	0x14
+	.4byte	0xc787
+	.uleb128 0xe
+	.4byte	.LASF2566
+	.byte	0x73
+	.byte	0x15
+	.4byte	0x30
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF2567
+	.byte	0x73
+	.byte	0x16
+	.4byte	0x30
+	.byte	0x8
+	.uleb128 0xe
+	.4byte	.LASF2368
+	.byte	0x73
+	.byte	0x17
+	.4byte	0x29
+	.byte	0x10
+	.uleb128 0xe
+	.4byte	.LASF2568
+	.byte	0x73
+	.byte	0x18
+	.4byte	0x29
+	.byte	0x18
+	.uleb128 0xe
+	.4byte	.LASF2367
+	.byte	0x73
+	.byte	0x19
+	.4byte	0x29
+	.byte	0x20
+	.byte	0
+	.uleb128 0x1f
+	.4byte	.LASF2569
+	.byte	0x4
+	.4byte	0x6d
+	.byte	0x73
+	.byte	0x39
+	.4byte	0xc7aa
+	.uleb128 0xc
+	.4byte	.LASF2570
+	.byte	0x1
+	.uleb128 0xc
+	.4byte	.LASF2571
+	.byte	0x2
+	.uleb128 0xc
+	.4byte	.LASF2572
+	.byte	0x3
+	.byte	0
+	.uleb128 0x8
+	.4byte	.LASF2573
+	.byte	0x73
+	.byte	0x5f
+	.4byte	0xc7b5
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xc7bb
+	.uleb128 0x14
+	.4byte	0xc6
+	.4byte	0xc7de
+	.uleb128 0x11
+	.4byte	0x3be9
+	.uleb128 0x11
+	.4byte	0x29
+	.uleb128 0x11
+	.4byte	0xc7de
+	.uleb128 0x11
+	.4byte	0x6d
+	.uleb128 0x11
+	.4byte	0xc7e4
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x33e0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x3327
+	.uleb128 0x8
+	.4byte	.LASF2574
+	.byte	0x73
+	.byte	0x64
+	.4byte	0xc7f5
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xc7fb
+	.uleb128 0x10
+	.4byte	0xc80b
+	.uleb128 0x11
+	.4byte	0x339d
+	.uleb128 0x11
+	.4byte	0x458
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xc5ba
+	.uleb128 0x19
+	.4byte	.LASF2575
+	.byte	0x74
+	.byte	0x2a
+	.4byte	0x29
+	.uleb128 0x19
+	.4byte	.LASF2576
+	.byte	0x74
+	.byte	0x34
+	.4byte	0x29
+	.uleb128 0x19
+	.4byte	.LASF2577
+	.byte	0x74
+	.byte	0x35
+	.4byte	0x458
+	.uleb128 0x19
+	.4byte	.LASF2578
+	.byte	0x74
+	.byte	0x36
+	.4byte	0xc6
+	.uleb128 0x19
+	.4byte	.LASF2579
+	.byte	0x74
+	.byte	0x39
+	.4byte	0xc6
+	.uleb128 0x19
+	.4byte	.LASF2580
+	.byte	0x74
+	.byte	0x3f
+	.4byte	0xcd
+	.uleb128 0x19
+	.4byte	.LASF2581
+	.byte	0x74
+	.byte	0x40
+	.4byte	0xcd
+	.uleb128 0x19
+	.4byte	.LASF2582
+	.byte	0x74
+	.byte	0x41
+	.4byte	0xc6
+	.uleb128 0x19
+	.4byte	.LASF2583
+	.byte	0x74
+	.byte	0x44
+	.4byte	0xcd
+	.uleb128 0x19
+	.4byte	.LASF2584
+	.byte	0x74
+	.byte	0x45
+	.4byte	0xcd
+	.uleb128 0x19
+	.4byte	.LASF2585
+	.byte	0x74
+	.byte	0x46
+	.4byte	0xc6
+	.uleb128 0x19
+	.4byte	.LASF2586
+	.byte	0x74
+	.byte	0x8b
+	.4byte	0xc6
+	.uleb128 0x19
+	.4byte	.LASF2587
+	.byte	0x74
+	.byte	0x8d
+	.4byte	0x29
+	.uleb128 0x19
+	.4byte	.LASF2588
+	.byte	0x74
+	.byte	0x8e
+	.4byte	0x29
+	.uleb128 0x19
+	.4byte	.LASF2589
+	.byte	0x74
+	.byte	0x90
+	.4byte	0xc6
+	.uleb128 0x19
+	.4byte	.LASF2590
+	.byte	0x74
+	.byte	0x91
+	.4byte	0xc6
+	.uleb128 0x19
+	.4byte	.LASF2591
+	.byte	0x74
+	.byte	0x92
+	.4byte	0x29
+	.uleb128 0x5
+	.4byte	0x3367
+	.4byte	0xc8dc
+	.uleb128 0x6
+	.4byte	0x4f
+	.byte	0xf
+	.byte	0
+	.uleb128 0x15
+	.4byte	.LASF2592
+	.byte	0x74
+	.2byte	0x142
+	.4byte	0xc8cc
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x3387
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x3307
+	.uleb128 0x1e
+	.4byte	.LASF2593
+	.byte	0x4
+	.4byte	0x6d
+	.byte	0x74
+	.2byte	0x18a
+	.4byte	0xc918
+	.uleb128 0xc
+	.4byte	.LASF2594
+	.byte	0
+	.uleb128 0xc
+	.4byte	.LASF2595
+	.byte	0x1
+	.uleb128 0xc
+	.4byte	.LASF2596
+	.byte	0x2
+	.byte	0
+	.uleb128 0x10
+	.4byte	0xc923
+	.uleb128 0x11
+	.4byte	0x3be9
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xc918
+	.uleb128 0x14
+	.4byte	0xc6
+	.4byte	0xc93d
+	.uleb128 0x11
+	.4byte	0x3be9
+	.uleb128 0x11
+	.4byte	0x29
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xc929
+	.uleb128 0x14
+	.4byte	0xc6
+	.4byte	0xc952
+	.uleb128 0x11
+	.4byte	0x3be9
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xc943
+	.uleb128 0x14
+	.4byte	0x4f53
+	.4byte	0xc967
+	.uleb128 0x11
+	.4byte	0x5983
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xc958
+	.uleb128 0x14
+	.4byte	0x4f53
+	.4byte	0xc981
+	.uleb128 0x11
+	.4byte	0x5983
+	.uleb128 0x11
+	.4byte	0xc8f4
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xc96d
+	.uleb128 0x10
+	.4byte	0xc99c
+	.uleb128 0x11
+	.4byte	0x5983
+	.uleb128 0x11
+	.4byte	0x29
+	.uleb128 0x11
+	.4byte	0x29
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xc987
+	.uleb128 0x14
+	.4byte	0x29
+	.4byte	0xc9b1
+	.uleb128 0x11
+	.4byte	0x3be9
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xc9a2
+	.uleb128 0x14
+	.4byte	0xc6
+	.4byte	0xc9da
+	.uleb128 0x11
+	.4byte	0x3be9
+	.uleb128 0x11
+	.4byte	0x29
+	.uleb128 0x11
+	.4byte	0x458
+	.uleb128 0x11
+	.4byte	0xc6
+	.uleb128 0x11
+	.4byte	0xc6
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xc9b7
+	.uleb128 0x14
+	.4byte	0x56
+	.4byte	0xc9ef
+	.uleb128 0x11
+	.4byte	0x3be9
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xc9e0
+	.uleb128 0x14
+	.4byte	0x339d
+	.4byte	0xca09
+	.uleb128 0x11
+	.4byte	0x3be9
+	.uleb128 0x11
+	.4byte	0x29
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xc9f5
+	.uleb128 0x19
+	.4byte	.LASF2597
+	.byte	0xb0
+	.byte	0x4c
+	.4byte	0xa211
+	.uleb128 0x13
+	.4byte	.LASF2598
+	.byte	0x74
+	.2byte	0x2ba
+	.4byte	0x781e
+	.uleb128 0x5
+	.4byte	0xca3c
+	.4byte	0xca31
+	.uleb128 0x18
+	.byte	0
+	.uleb128 0x3
+	.4byte	0xca26
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xca1a
+	.uleb128 0x3
+	.4byte	0xca36
+	.uleb128 0x15
+	.4byte	.LASF2599
+	.byte	0x74
+	.2byte	0x2c8
+	.4byte	0xca31
+	.uleb128 0x1f
+	.4byte	.LASF2600
+	.byte	0x4
+	.4byte	0x6d
+	.byte	0xb1
+	.byte	0x19
+	.4byte	0xcbba
+	.uleb128 0xc
+	.4byte	.LASF2601
+	.byte	0
+	.uleb128 0xc
+	.4byte	.LASF2602
+	.byte	0x1
+	.uleb128 0xc
+	.4byte	.LASF2603
+	.byte	0x2
+	.uleb128 0xc
+	.4byte	.LASF2604
+	.byte	0x3
+	.uleb128 0xc
+	.4byte	.LASF2605
+	.byte	0x4
+	.uleb128 0xc
+	.4byte	.LASF2606
+	.byte	0x5
+	.uleb128 0xc
+	.4byte	.LASF2607
+	.byte	0x6
+	.uleb128 0xc
+	.4byte	.LASF2608
+	.byte	0x7
+	.uleb128 0xc
+	.4byte	.LASF2609
+	.byte	0x8
+	.uleb128 0xc
+	.4byte	.LASF2610
+	.byte	0x9
+	.uleb128 0xc
+	.4byte	.LASF2611
+	.byte	0xa
+	.uleb128 0xc
+	.4byte	.LASF2612
+	.byte	0xb
+	.uleb128 0xc
+	.4byte	.LASF2613
+	.byte	0xc
+	.uleb128 0xc
+	.4byte	.LASF2614
+	.byte	0xd
+	.uleb128 0xc
+	.4byte	.LASF2615
+	.byte	0xe
+	.uleb128 0xc
+	.4byte	.LASF2616
+	.byte	0xf
+	.uleb128 0xc
+	.4byte	.LASF2617
+	.byte	0x10
+	.uleb128 0xc
+	.4byte	.LASF2618
+	.byte	0x11
+	.uleb128 0xc
+	.4byte	.LASF2619
+	.byte	0x12
+	.uleb128 0xc
+	.4byte	.LASF2620
+	.byte	0x13
+	.uleb128 0xc
+	.4byte	.LASF2621
+	.byte	0x14
+	.uleb128 0xc
+	.4byte	.LASF2622
+	.byte	0x15
+	.uleb128 0xc
+	.4byte	.LASF2623
+	.byte	0x16
+	.uleb128 0xc
+	.4byte	.LASF2624
+	.byte	0x17
+	.uleb128 0xc
+	.4byte	.LASF2625
+	.byte	0x18
+	.uleb128 0xc
+	.4byte	.LASF2626
+	.byte	0x19
+	.uleb128 0xc
+	.4byte	.LASF2627
+	.byte	0x1a
+	.uleb128 0xc
+	.4byte	.LASF2628
+	.byte	0x1b
+	.uleb128 0xc
+	.4byte	.LASF2629
+	.byte	0x1c
+	.uleb128 0xc
+	.4byte	.LASF2630
+	.byte	0x1d
+	.uleb128 0xc
+	.4byte	.LASF2631
+	.byte	0x1e
+	.uleb128 0xc
+	.4byte	.LASF2632
+	.byte	0x1f
+	.uleb128 0xc
+	.4byte	.LASF2633
+	.byte	0x20
+	.uleb128 0xc
+	.4byte	.LASF2634
+	.byte	0x21
+	.uleb128 0xc
+	.4byte	.LASF2635
+	.byte	0x22
+	.uleb128 0xc
+	.4byte	.LASF2636
+	.byte	0x23
+	.uleb128 0xc
+	.4byte	.LASF2637
+	.byte	0x24
+	.uleb128 0xc
+	.4byte	.LASF2638
+	.byte	0x25
+	.uleb128 0xc
+	.4byte	.LASF2639
+	.byte	0x26
+	.uleb128 0xc
+	.4byte	.LASF2640
+	.byte	0x27
+	.uleb128 0xc
+	.4byte	.LASF2641
+	.byte	0x28
+	.uleb128 0xc
+	.4byte	.LASF2642
+	.byte	0x29
+	.uleb128 0xc
+	.4byte	.LASF2643
+	.byte	0x2a
+	.uleb128 0xc
+	.4byte	.LASF2644
+	.byte	0x2b
+	.uleb128 0xc
+	.4byte	.LASF2645
+	.byte	0x2c
+	.uleb128 0xc
+	.4byte	.LASF2646
+	.byte	0x2d
+	.uleb128 0xc
+	.4byte	.LASF2647
+	.byte	0x2e
+	.uleb128 0xc
+	.4byte	.LASF2648
+	.byte	0x2f
+	.uleb128 0xc
+	.4byte	.LASF2649
+	.byte	0x30
+	.uleb128 0xc
+	.4byte	.LASF2650
+	.byte	0x31
+	.uleb128 0xc
+	.4byte	.LASF2651
+	.byte	0x32
+	.uleb128 0xc
+	.4byte	.LASF2652
+	.byte	0x33
+	.uleb128 0xc
+	.4byte	.LASF2653
+	.byte	0x34
+	.uleb128 0xc
+	.4byte	.LASF2654
+	.byte	0x35
+	.uleb128 0xc
+	.4byte	.LASF2655
+	.byte	0x36
+	.uleb128 0xc
+	.4byte	.LASF2656
+	.byte	0x37
+	.uleb128 0xc
+	.4byte	.LASF2657
+	.byte	0x38
+	.uleb128 0xc
+	.4byte	.LASF2658
+	.byte	0x39
+	.byte	0
+	.uleb128 0x19
+	.4byte	.LASF2659
+	.byte	0xb2
+	.byte	0xc
+	.4byte	0xc6
+	.uleb128 0x26
+	.4byte	.LASF2660
+	.2byte	0x1c8
+	.byte	0xb2
+	.byte	0x2d
+	.4byte	0xcbdf
+	.uleb128 0xe
+	.4byte	.LASF2006
+	.byte	0xb2
+	.byte	0x2e
+	.4byte	0xcbdf
+	.byte	0
+	.byte	0
+	.uleb128 0x5
+	.4byte	0x29
+	.4byte	0xcbef
+	.uleb128 0x6
+	.4byte	0x4f
+	.byte	0x38
+	.byte	0
+	.uleb128 0x19
+	.4byte	.LASF2661
+	.byte	0xb2
+	.byte	0x31
+	.4byte	0xcbc5
+	.uleb128 0x19
+	.4byte	.LASF2662
+	.byte	0xb2
+	.byte	0x83
+	.4byte	0x660a
+	.uleb128 0x5
+	.4byte	0x558
+	.4byte	0xcc14
+	.uleb128 0x41
+	.4byte	0x4f
+	.byte	0
+	.uleb128 0x19
+	.4byte	.LASF1538
+	.byte	0xb2
+	.byte	0x84
+	.4byte	0xcc05
+	.uleb128 0x19
+	.4byte	.LASF2663
+	.byte	0xb2
+	.byte	0x85
+	.4byte	0x66b4
+	.uleb128 0x5
+	.4byte	0x5c
+	.4byte	0xcc35
+	.uleb128 0x18
+	.byte	0
+	.uleb128 0x3
+	.4byte	0xcc2a
+	.uleb128 0x15
+	.4byte	.LASF2664
+	.byte	0xb2
+	.2byte	0x183
+	.4byte	0xcc35
+	.uleb128 0x15
+	.4byte	.LASF2665
+	.byte	0x74
+	.2byte	0x8dc
+	.4byte	0xc6
+	.uleb128 0x15
+	.4byte	.LASF2666
+	.byte	0x74
+	.2byte	0x8dd
+	.4byte	0xc6
+	.uleb128 0x15
+	.4byte	.LASF2667
+	.byte	0x74
+	.2byte	0x8e0
+	.4byte	0x558
+	.uleb128 0x15
+	.4byte	.LASF2668
+	.byte	0x74
+	.2byte	0x9b0
+	.4byte	0x29
+	.uleb128 0x15
+	.4byte	.LASF2669
+	.byte	0x74
+	.2byte	0xa8e
+	.4byte	0xf52
+	.uleb128 0x15
+	.4byte	.LASF2670
+	.byte	0x74
+	.2byte	0xa9b
+	.4byte	0xf52
+	.uleb128 0x15
+	.4byte	.LASF2671
+	.byte	0x74
+	.2byte	0xad6
+	.4byte	0xc6
+	.uleb128 0x15
+	.4byte	.LASF2672
+	.byte	0x74
+	.2byte	0xae1
+	.4byte	0xc6
+	.uleb128 0x15
+	.4byte	.LASF2673
+	.byte	0x74
+	.2byte	0xb0b
+	.4byte	0xc6
+	.uleb128 0x15
+	.4byte	.LASF2674
+	.byte	0x74
+	.2byte	0xb0c
+	.4byte	0xc6
+	.uleb128 0x15
+	.4byte	.LASF2675
+	.byte	0x74
+	.2byte	0xb0e
+	.4byte	0x558
+	.uleb128 0x15
+	.4byte	.LASF2676
+	.byte	0x74
+	.2byte	0xb43
+	.4byte	0xc629
+	.uleb128 0x19
+	.4byte	.LASF2677
+	.byte	0xb3
+	.byte	0x38
+	.4byte	0x92a3
+	.uleb128 0x19
+	.4byte	.LASF2678
+	.byte	0xb4
+	.byte	0x21
+	.4byte	0x500
+	.uleb128 0x8
+	.4byte	.LASF2679
+	.byte	0xb5
+	.byte	0x10
+	.4byte	0xf4
+	.uleb128 0x8
+	.4byte	.LASF2680
+	.byte	0xb5
+	.byte	0x11
+	.4byte	0xa9
+	.uleb128 0x8
+	.4byte	.LASF2681
+	.byte	0xb5
+	.byte	0x13
+	.4byte	0xf4
+	.uleb128 0x8
+	.4byte	.LASF2682
+	.byte	0xb5
+	.byte	0x15
+	.4byte	0xd2
+	.uleb128 0x8
+	.4byte	.LASF2683
+	.byte	0xb5
+	.byte	0x16
+	.4byte	0xf4
+	.uleb128 0x8
+	.4byte	.LASF2684
+	.byte	0xb5
+	.byte	0x17
+	.4byte	0xe2
+	.uleb128 0x21
+	.byte	0x8
+	.byte	0xb5
+	.byte	0x94
+	.4byte	0xcd4d
+	.uleb128 0x22
+	.4byte	.LASF2685
+	.byte	0xb5
+	.byte	0x95
+	.4byte	0xcd18
+	.uleb128 0x22
+	.4byte	.LASF2686
+	.byte	0xb5
+	.byte	0x96
+	.4byte	0xccec
+	.byte	0
+	.uleb128 0xf
+	.byte	0x10
+	.byte	0xb5
+	.byte	0x92
+	.4byte	0xcd6e
+	.uleb128 0xe
+	.4byte	.LASF2687
+	.byte	0xb5
+	.byte	0x93
+	.4byte	0xcd23
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF2688
+	.byte	0xb5
+	.byte	0x97
+	.4byte	0xcd2e
+	.byte	0x8
+	.byte	0
+	.uleb128 0x8
+	.4byte	.LASF2689
+	.byte	0xb5
+	.byte	0x98
+	.4byte	0xcd4d
+	.uleb128 0xd
+	.4byte	.LASF2690
+	.byte	0x18
+	.byte	0xb5
+	.byte	0xc0
+	.4byte	0xcdce
+	.uleb128 0xe
+	.4byte	.LASF2691
+	.byte	0xb5
+	.byte	0xc1
+	.4byte	0xcd0d
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF2692
+	.byte	0xb5
+	.byte	0xc2
+	.4byte	0x96
+	.byte	0x4
+	.uleb128 0xe
+	.4byte	.LASF2693
+	.byte	0xb5
+	.byte	0xc3
+	.4byte	0x96
+	.byte	0x5
+	.uleb128 0xe
+	.4byte	.LASF2694
+	.byte	0xb5
+	.byte	0xc4
+	.4byte	0xccf7
+	.byte	0x6
+	.uleb128 0xe
+	.4byte	.LASF2695
+	.byte	0xb5
+	.byte	0xc5
+	.4byte	0xccec
+	.byte	0x8
+	.uleb128 0xe
+	.4byte	.LASF2696
+	.byte	0xb5
+	.byte	0xc6
+	.4byte	0xcd18
+	.byte	0x10
+	.byte	0
+	.uleb128 0x8
+	.4byte	.LASF2697
+	.byte	0xb5
+	.byte	0xc7
+	.4byte	0xcd79
+	.uleb128 0x1d
+	.4byte	.LASF2698
+	.byte	0x40
+	.byte	0xb5
+	.2byte	0x13c
+	.4byte	0xce69
+	.uleb128 0x1b
+	.4byte	.LASF2699
+	.byte	0xb5
+	.2byte	0x13d
+	.4byte	0xcd0d
+	.byte	0
+	.uleb128 0x1b
+	.4byte	.LASF2700
+	.byte	0xb5
+	.2byte	0x13e
+	.4byte	0xcd0d
+	.byte	0x4
+	.uleb128 0x1b
+	.4byte	.LASF2701
+	.byte	0xb5
+	.2byte	0x13f
+	.4byte	0xcd18
+	.byte	0x8
+	.uleb128 0x1b
+	.4byte	.LASF2702
+	.byte	0xb5
+	.2byte	0x140
+	.4byte	0xccec
+	.byte	0x10
+	.uleb128 0x1b
+	.4byte	.LASF2703
+	.byte	0xb5
+	.2byte	0x141
+	.4byte	0xcd02
+	.byte	0x18
+	.uleb128 0x1b
+	.4byte	.LASF2704
+	.byte	0xb5
+	.2byte	0x142
+	.4byte	0xcd18
+	.byte	0x20
+	.uleb128 0x1b
+	.4byte	.LASF2705
+	.byte	0xb5
+	.2byte	0x143
+	.4byte	0xcd0d
+	.byte	0x28
+	.uleb128 0x1b
+	.4byte	.LASF2706
+	.byte	0xb5
+	.2byte	0x144
+	.4byte	0xcd0d
+	.byte	0x2c
+	.uleb128 0x1b
+	.4byte	.LASF2707
+	.byte	0xb5
+	.2byte	0x145
+	.4byte	0xcd18
+	.byte	0x30
+	.uleb128 0x1b
+	.4byte	.LASF2708
+	.byte	0xb5
+	.2byte	0x146
+	.4byte	0xcd18
+	.byte	0x38
+	.byte	0
+	.uleb128 0x5
+	.4byte	0xcd6e
+	.4byte	0xce74
+	.uleb128 0x18
+	.byte	0
+	.uleb128 0x19
+	.4byte	.LASF2709
+	.byte	0xb6
+	.byte	0x25
+	.4byte	0xce69
+	.uleb128 0xd
+	.4byte	.LASF2710
+	.byte	0x20
+	.byte	0xb7
+	.byte	0x31
+	.4byte	0xcebc
+	.uleb128 0xe
+	.4byte	.LASF171
+	.byte	0xb7
+	.byte	0x33
+	.4byte	0x6d
+	.byte	0
+	.uleb128 0x20
+	.string	"set"
+	.byte	0xb7
+	.byte	0x35
+	.4byte	0xcf3b
+	.byte	0x8
+	.uleb128 0x20
+	.string	"get"
+	.byte	0xb7
+	.byte	0x37
+	.4byte	0xcf55
+	.byte	0x10
+	.uleb128 0xe
+	.4byte	.LASF2368
+	.byte	0xb7
+	.byte	0x39
+	.4byte	0x2f2f
+	.byte	0x18
+	.byte	0
+	.uleb128 0x3
+	.4byte	0xce7f
+	.uleb128 0x14
+	.4byte	0xc6
+	.4byte	0xced5
+	.uleb128 0x11
+	.4byte	0x56
+	.uleb128 0x11
+	.4byte	0xced5
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xcf36
+	.uleb128 0xd
+	.4byte	.LASF2711
+	.byte	0x28
+	.byte	0xb7
+	.byte	0x47
+	.4byte	0xcf36
+	.uleb128 0xe
+	.4byte	.LASF265
+	.byte	0xb7
+	.byte	0x48
+	.4byte	0x56
+	.byte	0
+	.uleb128 0x20
+	.string	"mod"
+	.byte	0xb7
+	.byte	0x49
+	.4byte	0x74a1
+	.byte	0x8
+	.uleb128 0x20
+	.string	"ops"
+	.byte	0xb7
+	.byte	0x4a
+	.4byte	0xd009
+	.byte	0x10
+	.uleb128 0xe
+	.4byte	.LASF1956
+	.byte	0xb7
+	.byte	0x4b
+	.4byte	0x12a
+	.byte	0x18
+	.uleb128 0xe
+	.4byte	.LASF556
+	.byte	0xb7
+	.byte	0x4c
+	.4byte	0x106
+	.byte	0x1a
+	.uleb128 0xe
+	.4byte	.LASF171
+	.byte	0xb7
+	.byte	0x4d
+	.4byte	0x110
+	.byte	0x1b
+	.uleb128 0x23
+	.4byte	0xcf5b
+	.byte	0x20
+	.byte	0
+	.uleb128 0x3
+	.4byte	0xcedb
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xcec1
+	.uleb128 0x14
+	.4byte	0xc6
+	.4byte	0xcf55
+	.uleb128 0x11
+	.4byte	0x21e
+	.uleb128 0x11
+	.4byte	0xced5
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xcf41
+	.uleb128 0x21
+	.byte	0x8
+	.byte	0xb7
+	.byte	0x4e
+	.4byte	0xcf85
+	.uleb128 0x28
+	.string	"arg"
+	.byte	0xb7
+	.byte	0x4f
+	.4byte	0x458
+	.uleb128 0x28
+	.string	"str"
+	.byte	0xb7
+	.byte	0x50
+	.4byte	0xcfaf
+	.uleb128 0x28
+	.string	"arr"
+	.byte	0xb7
+	.byte	0x51
+	.4byte	0xd003
+	.byte	0
+	.uleb128 0xd
+	.4byte	.LASF2712
+	.byte	0x10
+	.byte	0xb7
+	.byte	0x58
+	.4byte	0xcfaa
+	.uleb128 0xe
+	.4byte	.LASF2001
+	.byte	0xb7
+	.byte	0x59
+	.4byte	0x6d
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF2713
+	.byte	0xb7
+	.byte	0x5a
+	.4byte	0x21e
+	.byte	0x8
+	.byte	0
+	.uleb128 0x3
+	.4byte	0xcf85
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xcfaa
+	.uleb128 0xd
+	.4byte	.LASF2714
+	.byte	0x20
+	.byte	0xb7
+	.byte	0x5e
+	.4byte	0xcffe
+	.uleb128 0x20
+	.string	"max"
+	.byte	0xb7
+	.byte	0x60
+	.4byte	0x6d
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF2715
+	.byte	0xb7
+	.byte	0x61
+	.4byte	0x6d
+	.byte	0x4
+	.uleb128 0x20
+	.string	"num"
+	.byte	0xb7
+	.byte	0x62
+	.4byte	0x34a7
+	.byte	0x8
+	.uleb128 0x20
+	.string	"ops"
+	.byte	0xb7
+	.byte	0x63
+	.4byte	0xd009
+	.byte	0x10
+	.uleb128 0xe
+	.4byte	.LASF2716
+	.byte	0xb7
+	.byte	0x64
+	.4byte	0x458
+	.byte	0x18
+	.byte	0
+	.uleb128 0x3
+	.4byte	0xcfb5
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xcffe
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xcebc
+	.uleb128 0x5
+	.4byte	0xcf36
+	.4byte	0xd01a
+	.uleb128 0x18
+	.byte	0
+	.uleb128 0x3
+	.4byte	0xd00f
+	.uleb128 0x19
+	.4byte	.LASF2717
+	.byte	0xb7
+	.byte	0x55
+	.4byte	0xd01a
+	.uleb128 0x19
+	.4byte	.LASF2718
+	.byte	0xb7
+	.byte	0x55
+	.4byte	0xd01a
+	.uleb128 0x15
+	.4byte	.LASF2719
+	.byte	0xb7
+	.2byte	0x155
+	.4byte	0xcebc
+	.uleb128 0x15
+	.4byte	.LASF2720
+	.byte	0xb7
+	.2byte	0x15a
+	.4byte	0xcebc
+	.uleb128 0x15
+	.4byte	.LASF2721
+	.byte	0xb7
+	.2byte	0x15f
+	.4byte	0xcebc
+	.uleb128 0x15
+	.4byte	.LASF2722
+	.byte	0xb7
+	.2byte	0x164
+	.4byte	0xcebc
+	.uleb128 0x15
+	.4byte	.LASF2723
+	.byte	0xb7
+	.2byte	0x169
+	.4byte	0xcebc
+	.uleb128 0x15
+	.4byte	.LASF2724
+	.byte	0xb7
+	.2byte	0x16e
+	.4byte	0xcebc
+	.uleb128 0x15
+	.4byte	.LASF2725
+	.byte	0xb7
+	.2byte	0x173
+	.4byte	0xcebc
+	.uleb128 0x15
+	.4byte	.LASF2726
+	.byte	0xb7
+	.2byte	0x178
+	.4byte	0xcebc
+	.uleb128 0x15
+	.4byte	.LASF2727
+	.byte	0xb7
+	.2byte	0x17d
+	.4byte	0xcebc
+	.uleb128 0x15
+	.4byte	.LASF2728
+	.byte	0xb7
+	.2byte	0x184
+	.4byte	0xcebc
+	.uleb128 0x15
+	.4byte	.LASF2729
+	.byte	0xb7
+	.2byte	0x189
+	.4byte	0xcebc
+	.uleb128 0x15
+	.4byte	.LASF2730
+	.byte	0xb7
+	.2byte	0x18f
+	.4byte	0xcebc
+	.uleb128 0x15
+	.4byte	.LASF2731
+	.byte	0xb7
+	.2byte	0x195
+	.4byte	0xcebc
+	.uleb128 0x15
+	.4byte	.LASF2732
+	.byte	0xb7
+	.2byte	0x1fe
+	.4byte	0xcebc
+	.uleb128 0x15
+	.4byte	.LASF2733
+	.byte	0xb7
+	.2byte	0x200
+	.4byte	0xcebc
+	.uleb128 0xd
+	.4byte	.LASF2734
+	.byte	0x30
+	.byte	0xb8
+	.byte	0x28
+	.4byte	0xd102
+	.uleb128 0xe
+	.4byte	.LASF838
+	.byte	0xb8
+	.byte	0x29
+	.4byte	0xd102
+	.byte	0
+	.byte	0
+	.uleb128 0x5
+	.4byte	0x3416
+	.4byte	0xd112
+	.uleb128 0x6
+	.4byte	0x4f
+	.byte	0x1
+	.byte	0
+	.uleb128 0xd
+	.4byte	.LASF2735
+	.byte	0x10
+	.byte	0xb9
+	.byte	0x18
+	.4byte	0xd143
+	.uleb128 0x20
+	.string	"plt"
+	.byte	0xb9
+	.byte	0x19
+	.4byte	0xd143
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF2736
+	.byte	0xb9
+	.byte	0x1a
+	.4byte	0xc6
+	.byte	0x8
+	.uleb128 0xe
+	.4byte	.LASF2737
+	.byte	0xb9
+	.byte	0x1b
+	.4byte	0xc6
+	.byte	0xc
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xcdd9
+	.uleb128 0xd
+	.4byte	.LASF2738
+	.byte	0x28
+	.byte	0xb9
+	.byte	0x1e
+	.4byte	0xd17a
+	.uleb128 0xe
+	.4byte	.LASF2739
+	.byte	0xb9
+	.byte	0x1f
+	.4byte	0xd112
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF1711
+	.byte	0xb9
+	.byte	0x20
+	.4byte	0xd112
+	.byte	0x10
+	.uleb128 0xe
+	.4byte	.LASF2740
+	.byte	0xb9
+	.byte	0x23
+	.4byte	0xd1b6
+	.byte	0x20
+	.byte	0
+	.uleb128 0xd
+	.4byte	.LASF2741
+	.byte	0x10
+	.byte	0xb9
+	.byte	0x32
+	.4byte	0xd1b6
+	.uleb128 0xe
+	.4byte	.LASF2742
+	.byte	0xb9
+	.byte	0x3b
+	.4byte	0x229
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF2743
+	.byte	0xb9
+	.byte	0x3c
+	.4byte	0x229
+	.byte	0x4
+	.uleb128 0xe
+	.4byte	.LASF2744
+	.byte	0xb9
+	.byte	0x3d
+	.4byte	0x229
+	.byte	0x8
+	.uleb128 0x20
+	.string	"br"
+	.byte	0xb9
+	.byte	0x3e
+	.4byte	0x229
+	.byte	0xc
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xd17a
+	.uleb128 0x19
+	.4byte	.LASF2745
+	.byte	0xb9
+	.byte	0x2d
+	.4byte	0x15a
+	.uleb128 0x5
+	.4byte	0x61
+	.4byte	0xd1d7
+	.uleb128 0x6
+	.4byte	0x4f
+	.byte	0x37
+	.byte	0
+	.uleb128 0xd
+	.4byte	.LASF2746
+	.byte	0x80
+	.byte	0x89
+	.byte	0x2e
+	.4byte	0xd21f
+	.uleb128 0xe
+	.4byte	.LASF2114
+	.byte	0x89
+	.byte	0x2f
+	.4byte	0x902d
+	.byte	0
+	.uleb128 0x20
+	.string	"mod"
+	.byte	0x89
+	.byte	0x30
+	.4byte	0x74a1
+	.byte	0x60
+	.uleb128 0xe
+	.4byte	.LASF2747
+	.byte	0x89
+	.byte	0x31
+	.4byte	0x9114
+	.byte	0x68
+	.uleb128 0x20
+	.string	"mp"
+	.byte	0x89
+	.byte	0x32
+	.4byte	0xd224
+	.byte	0x70
+	.uleb128 0xe
+	.4byte	.LASF2748
+	.byte	0x89
+	.byte	0x33
+	.4byte	0x459e
+	.byte	0x78
+	.byte	0
+	.uleb128 0x24
+	.4byte	.LASF2749
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xd21f
+	.uleb128 0xd
+	.4byte	.LASF2750
+	.byte	0x38
+	.byte	0x89
+	.byte	0x36
+	.4byte	0xd27f
+	.uleb128 0xe
+	.4byte	.LASF2083
+	.byte	0x89
+	.byte	0x37
+	.4byte	0x9d89
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF2046
+	.byte	0x89
+	.byte	0x38
+	.4byte	0xd2a4
+	.byte	0x10
+	.uleb128 0xe
+	.4byte	.LASF2110
+	.byte	0x89
+	.byte	0x3a
+	.4byte	0xd2c8
+	.byte	0x18
+	.uleb128 0xe
+	.4byte	.LASF2751
+	.byte	0x89
+	.byte	0x3c
+	.4byte	0xd2de
+	.byte	0x20
+	.uleb128 0xe
+	.4byte	.LASF2752
+	.byte	0x89
+	.byte	0x3d
+	.4byte	0xd2f3
+	.byte	0x28
+	.uleb128 0xe
+	.4byte	.LASF2368
+	.byte	0x89
+	.byte	0x3e
+	.4byte	0xd304
+	.byte	0x30
+	.byte	0
+	.uleb128 0x14
+	.4byte	0x2ee
+	.4byte	0xd298
+	.uleb128 0x11
+	.4byte	0xd298
+	.uleb128 0x11
+	.4byte	0xd29e
+	.uleb128 0x11
+	.4byte	0x21e
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xd22a
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xd1d7
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xd27f
+	.uleb128 0x14
+	.4byte	0x2ee
+	.4byte	0xd2c8
+	.uleb128 0x11
+	.4byte	0xd298
+	.uleb128 0x11
+	.4byte	0xd29e
+	.uleb128 0x11
+	.4byte	0x56
+	.uleb128 0x11
+	.4byte	0x2e3
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xd2aa
+	.uleb128 0x10
+	.4byte	0xd2de
+	.uleb128 0x11
+	.4byte	0x74a1
+	.uleb128 0x11
+	.4byte	0x56
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xd2ce
+	.uleb128 0x14
+	.4byte	0xc6
+	.4byte	0xd2f3
+	.uleb128 0x11
+	.4byte	0x74a1
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xd2e4
+	.uleb128 0x10
+	.4byte	0xd304
+	.uleb128 0x11
+	.4byte	0x74a1
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xd2f9
+	.uleb128 0x19
+	.4byte	.LASF2753
+	.byte	0x89
+	.byte	0x4a
+	.4byte	0xd22a
+	.uleb128 0x15
+	.4byte	.LASF2754
+	.byte	0x89
+	.2byte	0x10c
+	.4byte	0xc6
+	.uleb128 0x1e
+	.4byte	.LASF2755
+	.byte	0x4
+	.4byte	0x6d
+	.byte	0x89
+	.2byte	0x119
+	.4byte	0xd34b
+	.uleb128 0xc
+	.4byte	.LASF2756
+	.byte	0
+	.uleb128 0xc
+	.4byte	.LASF2757
+	.byte	0x1
+	.uleb128 0xc
+	.4byte	.LASF2758
+	.byte	0x2
+	.uleb128 0xc
+	.4byte	.LASF2759
+	.byte	0x3
+	.byte	0
+	.uleb128 0x1d
+	.4byte	.LASF2760
+	.byte	0x38
+	.byte	0x89
+	.2byte	0x120
+	.4byte	0xd373
+	.uleb128 0x2b
+	.string	"mod"
+	.byte	0x89
+	.2byte	0x121
+	.4byte	0x74a1
+	.byte	0
+	.uleb128 0x1b
+	.4byte	.LASF838
+	.byte	0x89
+	.2byte	0x122
+	.4byte	0xd0e9
+	.byte	0x8
+	.byte	0
+	.uleb128 0x1d
+	.4byte	.LASF2761
+	.byte	0x50
+	.byte	0x89
+	.2byte	0x125
+	.4byte	0xd3cf
+	.uleb128 0x1b
+	.4byte	.LASF845
+	.byte	0x89
+	.2byte	0x127
+	.4byte	0x458
+	.byte	0
+	.uleb128 0x1b
+	.4byte	.LASF957
+	.byte	0x89
+	.2byte	0x129
+	.4byte	0x6d
+	.byte	0x8
+	.uleb128 0x1b
+	.4byte	.LASF2762
+	.byte	0x89
+	.2byte	0x12b
+	.4byte	0x6d
+	.byte	0xc
+	.uleb128 0x1b
+	.4byte	.LASF2763
+	.byte	0x89
+	.2byte	0x12d
+	.4byte	0x6d
+	.byte	0x10
+	.uleb128 0x1b
+	.4byte	.LASF2764
+	.byte	0x89
+	.2byte	0x12f
+	.4byte	0x6d
+	.byte	0x14
+	.uleb128 0x2b
+	.string	"mtn"
+	.byte	0x89
+	.2byte	0x132
+	.4byte	0xd34b
+	.byte	0x18
+	.byte	0
+	.uleb128 0x1d
+	.4byte	.LASF2765
+	.byte	0x18
+	.byte	0x89
+	.2byte	0x13d
+	.4byte	0xd404
+	.uleb128 0x1b
+	.4byte	.LASF2766
+	.byte	0x89
+	.2byte	0x13e
+	.4byte	0xd404
+	.byte	0
+	.uleb128 0x1b
+	.4byte	.LASF2767
+	.byte	0x89
+	.2byte	0x13f
+	.4byte	0x6d
+	.byte	0x8
+	.uleb128 0x1b
+	.4byte	.LASF2768
+	.byte	0x89
+	.2byte	0x140
+	.4byte	0x21e
+	.byte	0x10
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xcdce
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x274
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x13a
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xcedb
+	.uleb128 0xd
+	.4byte	.LASF2769
+	.byte	0x8
+	.byte	0xba
+	.byte	0x12
+	.4byte	0xd441
+	.uleb128 0xe
+	.4byte	.LASF2770
+	.byte	0xba
+	.byte	0x14
+	.4byte	0xc6
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF2771
+	.byte	0xba
+	.byte	0x14
+	.4byte	0xc6
+	.byte	0x4
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xd41c
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x995
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xd3cf
+	.uleb128 0x24
+	.4byte	.LASF2772
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xd453
+	.uleb128 0x24
+	.4byte	.LASF2773
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xd45e
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xc6e6
+	.uleb128 0x24
+	.4byte	.LASF2774
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xd47a
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xd46f
+	.uleb128 0x24
+	.4byte	.LASF2775
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xd48b
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xd480
+	.uleb128 0x15
+	.4byte	.LASF2776
+	.byte	0x89
+	.2byte	0x1f6
+	.4byte	0x2464
+	.uleb128 0x15
+	.4byte	.LASF2777
+	.byte	0x89
+	.2byte	0x317
+	.4byte	0xa002
+	.uleb128 0x15
+	.4byte	.LASF2778
+	.byte	0x89
+	.2byte	0x318
+	.4byte	0xa008
+	.uleb128 0x15
+	.4byte	.LASF2779
+	.byte	0x89
+	.2byte	0x319
+	.4byte	0xc6
+	.uleb128 0x26
+	.4byte	.LASF838
+	.2byte	0x3b0
+	.byte	0xbb
+	.byte	0x16
+	.4byte	0xd4db
+	.uleb128 0x20
+	.string	"dev"
+	.byte	0xbb
+	.byte	0x17
+	.4byte	0xa49c
+	.byte	0
+	.byte	0
+	.uleb128 0x5
+	.4byte	0xd4e6
+	.4byte	0xd4e6
+	.uleb128 0x18
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xd4c1
+	.uleb128 0x19
+	.4byte	.LASF2780
+	.byte	0xbb
+	.byte	0x1f
+	.4byte	0xd4db
+	.uleb128 0x19
+	.4byte	.LASF2781
+	.byte	0xbc
+	.byte	0x5a
+	.4byte	0x2b0
+	.uleb128 0x19
+	.4byte	.LASF2782
+	.byte	0xbc
+	.byte	0x6c
+	.4byte	0xad03
+	.uleb128 0x26
+	.4byte	.LASF2783
+	.2byte	0x3e8
+	.byte	0xbd
+	.byte	0x17
+	.4byte	0xd598
+	.uleb128 0xe
+	.4byte	.LASF265
+	.byte	0xbd
+	.byte	0x18
+	.4byte	0x56
+	.byte	0
+	.uleb128 0x20
+	.string	"id"
+	.byte	0xbd
+	.byte	0x19
+	.4byte	0xc6
+	.byte	0x8
+	.uleb128 0xe
+	.4byte	.LASF2784
+	.byte	0xbd
+	.byte	0x1a
+	.4byte	0x2b0
+	.byte	0xc
+	.uleb128 0x20
+	.string	"dev"
+	.byte	0xbd
+	.byte	0x1b
+	.4byte	0xa49c
+	.byte	0x10
+	.uleb128 0x27
+	.4byte	.LASF2785
+	.byte	0xbd
+	.byte	0x1c
+	.4byte	0x13f
+	.2byte	0x3c0
+	.uleb128 0x27
+	.4byte	.LASF2050
+	.byte	0xbd
+	.byte	0x1d
+	.4byte	0x9714
+	.2byte	0x3c8
+	.uleb128 0x27
+	.4byte	.LASF2786
+	.byte	0xbd
+	.byte	0x1f
+	.4byte	0xd59d
+	.2byte	0x3d0
+	.uleb128 0x27
+	.4byte	.LASF2787
+	.byte	0xbd
+	.byte	0x20
+	.4byte	0x21e
+	.2byte	0x3d8
+	.uleb128 0x27
+	.4byte	.LASF2788
+	.byte	0xbd
+	.byte	0x23
+	.4byte	0xd5a8
+	.2byte	0x3e0
+	.uleb128 0x27
+	.4byte	.LASF2189
+	.byte	0xbd
+	.byte	0x26
+	.4byte	0xacf5
+	.2byte	0x3e8
+	.byte	0
+	.uleb128 0x3
+	.4byte	0xd50d
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xb851
+	.uleb128 0x24
+	.4byte	.LASF2788
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xd5a3
+	.uleb128 0x19
+	.4byte	.LASF2789
+	.byte	0xbd
+	.byte	0x30
+	.4byte	0xad03
+	.uleb128 0x19
+	.4byte	.LASF2790
+	.byte	0xbd
+	.byte	0x31
+	.4byte	0xa49c
+	.uleb128 0xd
+	.4byte	.LASF2791
+	.byte	0xe0
+	.byte	0xbd
+	.byte	0xba
+	.4byte	0xd631
+	.uleb128 0xe
+	.4byte	.LASF2300
+	.byte	0xbd
+	.byte	0xbb
+	.4byte	0xd646
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF2302
+	.byte	0xbd
+	.byte	0xbc
+	.4byte	0xd646
+	.byte	0x8
+	.uleb128 0xe
+	.4byte	.LASF2303
+	.byte	0xbd
+	.byte	0xbd
+	.4byte	0xd657
+	.byte	0x10
+	.uleb128 0xe
+	.4byte	.LASF2147
+	.byte	0xbd
+	.byte	0xbe
+	.4byte	0xd671
+	.byte	0x18
+	.uleb128 0xe
+	.4byte	.LASF2148
+	.byte	0xbd
+	.byte	0xbf
+	.4byte	0xd646
+	.byte	0x20
+	.uleb128 0xe
+	.4byte	.LASF2170
+	.byte	0xbd
+	.byte	0xc0
+	.4byte	0xae77
+	.byte	0x28
+	.uleb128 0xe
+	.4byte	.LASF2792
+	.byte	0xbd
+	.byte	0xc1
+	.4byte	0xd59d
+	.byte	0xd0
+	.uleb128 0xe
+	.4byte	.LASF2793
+	.byte	0xbd
+	.byte	0xc2
+	.4byte	0x2b0
+	.byte	0xd8
+	.byte	0
+	.uleb128 0x14
+	.4byte	0xc6
+	.4byte	0xd640
+	.uleb128 0x11
+	.4byte	0xd640
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xd50d
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xd631
+	.uleb128 0x10
+	.4byte	0xd657
+	.uleb128 0x11
+	.4byte	0xd640
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xd64c
+	.uleb128 0x14
+	.4byte	0xc6
+	.4byte	0xd671
+	.uleb128 0x11
+	.4byte	0xd640
+	.uleb128 0x11
+	.4byte	0xa33e
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xd65d
+	.uleb128 0x5
+	.4byte	0xb0c1
+	.4byte	0xd682
+	.uleb128 0x18
+	.byte	0
+	.uleb128 0x3
+	.4byte	0xd677
+	.uleb128 0x19
+	.4byte	.LASF2794
+	.byte	0xbe
+	.byte	0x31
+	.4byte	0xd682
+	.uleb128 0x19
+	.4byte	.LASF2795
+	.byte	0xbf
+	.byte	0x16
+	.4byte	0xe85
+	.uleb128 0x19
+	.4byte	.LASF2796
+	.byte	0xbf
+	.byte	0x17
+	.4byte	0xe65
+	.uleb128 0x19
+	.4byte	.LASF2797
+	.byte	0xbf
+	.byte	0x19
+	.4byte	0x497c
+	.uleb128 0x19
+	.4byte	.LASF2798
+	.byte	0xbf
+	.byte	0x1a
+	.4byte	0x24a1
+	.uleb128 0x19
+	.4byte	.LASF2799
+	.byte	0x10
+	.byte	0x8c
+	.4byte	0x2b0
+	.uleb128 0x1e
+	.4byte	.LASF2800
+	.byte	0x4
+	.4byte	0x6d
+	.byte	0x10
+	.2byte	0x130
+	.4byte	0xd6ed
+	.uleb128 0xc
+	.4byte	.LASF2801
+	.byte	0
+	.uleb128 0xc
+	.4byte	.LASF2802
+	.byte	0x1
+	.uleb128 0xc
+	.4byte	.LASF2803
+	.byte	0x2
+	.byte	0
+	.uleb128 0x5
+	.4byte	0x5174
+	.4byte	0xd703
+	.uleb128 0x6
+	.4byte	0x4f
+	.byte	0x1
+	.uleb128 0x6
+	.4byte	0x4f
+	.byte	0xd
+	.byte	0
+	.uleb128 0x15
+	.4byte	.LASF2804
+	.byte	0x10
+	.2byte	0x13b
+	.4byte	0xd6ed
+	.uleb128 0xb
+	.byte	0x4
+	.4byte	0x6d
+	.byte	0xb
+	.byte	0x1b
+	.4byte	0xd728
+	.uleb128 0xc
+	.4byte	.LASF2805
+	.byte	0
+	.uleb128 0xc
+	.4byte	.LASF2806
+	.byte	0x1
+	.byte	0
+	.uleb128 0xd
+	.4byte	.LASF2807
+	.byte	0xd0
+	.byte	0xb
+	.byte	0x20
+	.4byte	0xd740
+	.uleb128 0x20
+	.string	"ws"
+	.byte	0xb
+	.byte	0x21
+	.4byte	0xab31
+	.byte	0
+	.byte	0
+	.uleb128 0xd
+	.4byte	.LASF2808
+	.byte	0x4
+	.byte	0xc0
+	.byte	0x7
+	.4byte	0xd759
+	.uleb128 0xe
+	.4byte	.LASF2809
+	.byte	0xc0
+	.byte	0x8
+	.4byte	0xc6
+	.byte	0
+	.byte	0
+	.uleb128 0x1f
+	.4byte	.LASF2810
+	.byte	0x4
+	.4byte	0x6d
+	.byte	0xc1
+	.byte	0xf
+	.4byte	0xd7b8
+	.uleb128 0xc
+	.4byte	.LASF2811
+	.byte	0
+	.uleb128 0xc
+	.4byte	.LASF2812
+	.byte	0x1
+	.uleb128 0xc
+	.4byte	.LASF2813
+	.byte	0x2
+	.uleb128 0xc
+	.4byte	.LASF2814
+	.byte	0x3
+	.uleb128 0xc
+	.4byte	.LASF2815
+	.byte	0x4
+	.uleb128 0xc
+	.4byte	.LASF2816
+	.byte	0x5
+	.uleb128 0xc
+	.4byte	.LASF2817
+	.byte	0x6
+	.uleb128 0xc
+	.4byte	.LASF2818
+	.byte	0x7
+	.uleb128 0xc
+	.4byte	.LASF2819
+	.byte	0x8
+	.uleb128 0xc
+	.4byte	.LASF2820
+	.byte	0x9
+	.uleb128 0xc
+	.4byte	.LASF2821
+	.byte	0xa
+	.uleb128 0xc
+	.4byte	.LASF2822
+	.byte	0xb
+	.uleb128 0xc
+	.4byte	.LASF2823
+	.byte	0xc
+	.byte	0
+	.uleb128 0xd
+	.4byte	.LASF2824
+	.byte	0x20
+	.byte	0xc1
+	.byte	0x20
+	.4byte	0xd7e9
+	.uleb128 0xe
+	.4byte	.LASF2825
+	.byte	0xc1
+	.byte	0x21
+	.4byte	0x6d
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF793
+	.byte	0xc1
+	.byte	0x22
+	.4byte	0x34a7
+	.byte	0x8
+	.uleb128 0xe
+	.4byte	.LASF2826
+	.byte	0xc1
+	.byte	0x23
+	.4byte	0xd7e9
+	.byte	0x10
+	.byte	0
+	.uleb128 0x5
+	.4byte	0xbfee
+	.4byte	0xd7f9
+	.uleb128 0x6
+	.4byte	0x4f
+	.byte	0x1
+	.byte	0
+	.uleb128 0x1f
+	.4byte	.LASF2827
+	.byte	0x4
+	.4byte	0x6d
+	.byte	0xc2
+	.byte	0xe
+	.4byte	0xd828
+	.uleb128 0xc
+	.4byte	.LASF2828
+	.byte	0
+	.uleb128 0xc
+	.4byte	.LASF2829
+	.byte	0x1
+	.uleb128 0xc
+	.4byte	.LASF2830
+	.byte	0x2
+	.uleb128 0xc
+	.4byte	.LASF2831
+	.byte	0x3
+	.uleb128 0xc
+	.4byte	.LASF2832
+	.byte	0x4
+	.byte	0
+	.uleb128 0xd
+	.4byte	.LASF2833
+	.byte	0x48
+	.byte	0xc2
+	.byte	0x16
+	.4byte	0xd8b9
+	.uleb128 0xe
+	.4byte	.LASF759
+	.byte	0xc2
+	.byte	0x17
+	.4byte	0xd7f9
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF2834
+	.byte	0xc2
+	.byte	0x18
+	.4byte	0x29
+	.byte	0x8
+	.uleb128 0xe
+	.4byte	.LASF2835
+	.byte	0xc2
+	.byte	0x19
+	.4byte	0x21e
+	.byte	0x10
+	.uleb128 0xe
+	.4byte	.LASF2836
+	.byte	0xc2
+	.byte	0x1a
+	.4byte	0x46fe
+	.byte	0x18
+	.uleb128 0xe
+	.4byte	.LASF2837
+	.byte	0xc2
+	.byte	0x1b
+	.4byte	0xc6
+	.byte	0x28
+	.uleb128 0x20
+	.string	"len"
+	.byte	0xc2
+	.byte	0x1c
+	.4byte	0xc6
+	.byte	0x2c
+	.uleb128 0xe
+	.4byte	.LASF2838
+	.byte	0xc2
+	.byte	0x1d
+	.4byte	0xc6
+	.byte	0x30
+	.uleb128 0xe
+	.4byte	.LASF2839
+	.byte	0xc2
+	.byte	0x1e
+	.4byte	0xc6
+	.byte	0x34
+	.uleb128 0xe
+	.4byte	.LASF2840
+	.byte	0xc2
+	.byte	0x1f
+	.4byte	0xc6
+	.byte	0x38
+	.uleb128 0xe
+	.4byte	.LASF2841
+	.byte	0xc2
+	.byte	0x20
+	.4byte	0xc6
+	.byte	0x3c
+	.uleb128 0xe
+	.4byte	.LASF2842
+	.byte	0xc2
+	.byte	0x21
+	.4byte	0xc6
+	.byte	0x40
+	.byte	0
+	.uleb128 0x1f
+	.4byte	.LASF2843
+	.byte	0x4
+	.4byte	0x6d
+	.byte	0xc3
+	.byte	0x4a
+	.4byte	0xd95a
+	.uleb128 0xc
+	.4byte	.LASF2844
+	.byte	0
+	.uleb128 0xc
+	.4byte	.LASF2845
+	.byte	0x1
+	.uleb128 0xc
+	.4byte	.LASF2846
+	.byte	0x2
+	.uleb128 0xc
+	.4byte	.LASF2847
+	.byte	0x3
+	.uleb128 0xc
+	.4byte	.LASF2848
+	.byte	0x4
+	.uleb128 0xc
+	.4byte	.LASF2849
+	.byte	0x5
+	.uleb128 0xc
+	.4byte	.LASF2850
+	.byte	0x6
+	.uleb128 0xc
+	.4byte	.LASF2851
+	.byte	0x7
+	.uleb128 0xc
+	.4byte	.LASF2852
+	.byte	0x8
+	.uleb128 0xc
+	.4byte	.LASF2853
+	.byte	0x9
+	.uleb128 0xc
+	.4byte	.LASF2854
+	.byte	0xa
+	.uleb128 0xc
+	.4byte	.LASF2855
+	.byte	0xb
+	.uleb128 0xc
+	.4byte	.LASF2856
+	.byte	0xc
+	.uleb128 0xc
+	.4byte	.LASF2857
+	.byte	0xd
+	.uleb128 0xc
+	.4byte	.LASF2858
+	.byte	0xe
+	.uleb128 0xc
+	.4byte	.LASF2859
+	.byte	0xf
+	.uleb128 0xc
+	.4byte	.LASF2860
+	.byte	0x10
+	.uleb128 0xc
+	.4byte	.LASF2861
+	.byte	0x11
+	.uleb128 0xc
+	.4byte	.LASF2862
+	.byte	0x12
+	.uleb128 0xc
+	.4byte	.LASF2863
+	.byte	0x13
+	.uleb128 0xc
+	.4byte	.LASF2864
+	.byte	0x14
+	.uleb128 0xc
+	.4byte	.LASF2865
+	.byte	0x15
+	.uleb128 0xc
+	.4byte	.LASF2866
+	.byte	0x16
+	.uleb128 0xc
+	.4byte	.LASF2867
+	.byte	0x17
+	.byte	0
+	.uleb128 0xd
+	.4byte	.LASF2868
+	.byte	0x40
+	.byte	0xc3
+	.byte	0x68
+	.4byte	0xda03
+	.uleb128 0xe
+	.4byte	.LASF854
+	.byte	0xc3
+	.byte	0x69
+	.4byte	0xc6
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF2869
+	.byte	0xc3
+	.byte	0x6a
+	.4byte	0xc6
+	.byte	0x4
+	.uleb128 0xe
+	.4byte	.LASF2870
+	.byte	0xc3
+	.byte	0x6b
+	.4byte	0xc6
+	.byte	0x8
+	.uleb128 0xe
+	.4byte	.LASF262
+	.byte	0xc3
+	.byte	0x6c
+	.4byte	0xc6
+	.byte	0xc
+	.uleb128 0xe
+	.4byte	.LASF2871
+	.byte	0xc3
+	.byte	0x6d
+	.4byte	0xc6
+	.byte	0x10
+	.uleb128 0xe
+	.4byte	.LASF2838
+	.byte	0xc3
+	.byte	0x6e
+	.4byte	0xc6
+	.byte	0x14
+	.uleb128 0xe
+	.4byte	.LASF2839
+	.byte	0xc3
+	.byte	0x6f
+	.4byte	0xc6
+	.byte	0x18
+	.uleb128 0xe
+	.4byte	.LASF2840
+	.byte	0xc3
+	.byte	0x70
+	.4byte	0xc6
+	.byte	0x1c
+	.uleb128 0xe
+	.4byte	.LASF2841
+	.byte	0xc3
+	.byte	0x71
+	.4byte	0xc6
+	.byte	0x20
+	.uleb128 0xe
+	.4byte	.LASF2872
+	.byte	0xc3
+	.byte	0x72
+	.4byte	0xc6
+	.byte	0x24
+	.uleb128 0xe
+	.4byte	.LASF2873
+	.byte	0xc3
+	.byte	0x73
+	.4byte	0xc6
+	.byte	0x28
+	.uleb128 0xe
+	.4byte	.LASF2842
+	.byte	0xc3
+	.byte	0x74
+	.4byte	0xc6
+	.byte	0x2c
+	.uleb128 0xe
+	.4byte	.LASF2836
+	.byte	0xc3
+	.byte	0x75
+	.4byte	0x46fe
+	.byte	0x30
+	.byte	0
+	.uleb128 0xd
+	.4byte	.LASF2874
+	.byte	0x50
+	.byte	0x3
+	.byte	0x10
+	.4byte	0xda7c
+	.uleb128 0x20
+	.string	"dev"
+	.byte	0x3
+	.byte	0x11
+	.4byte	0xa496
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF2875
+	.byte	0x3
+	.byte	0x12
+	.4byte	0x46fe
+	.byte	0x8
+	.uleb128 0xe
+	.4byte	.LASF2876
+	.byte	0x3
+	.byte	0x13
+	.4byte	0x458
+	.byte	0x18
+	.uleb128 0xe
+	.4byte	.LASF2877
+	.byte	0x3
+	.byte	0x14
+	.4byte	0xda92
+	.byte	0x20
+	.uleb128 0xe
+	.4byte	.LASF2878
+	.byte	0x3
+	.byte	0x15
+	.4byte	0xdaa3
+	.byte	0x28
+	.uleb128 0xe
+	.4byte	.LASF2879
+	.byte	0x3
+	.byte	0x16
+	.4byte	0xdaa3
+	.byte	0x30
+	.uleb128 0xe
+	.4byte	.LASF2880
+	.byte	0x3
+	.byte	0x17
+	.4byte	0xdabd
+	.byte	0x38
+	.uleb128 0xe
+	.4byte	.LASF2881
+	.byte	0x3
+	.byte	0x18
+	.4byte	0xdad2
+	.byte	0x40
+	.uleb128 0xe
+	.4byte	.LASF2882
+	.byte	0x3
+	.byte	0x19
+	.4byte	0xdaec
+	.byte	0x48
+	.byte	0
+	.uleb128 0x10
+	.4byte	0xda8c
+	.uleb128 0x11
+	.4byte	0xda8c
+	.uleb128 0x11
+	.4byte	0x2b0
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xda03
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xda7c
+	.uleb128 0x10
+	.4byte	0xdaa3
+	.uleb128 0x11
+	.4byte	0xda8c
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xda98
+	.uleb128 0x14
+	.4byte	0xc6
+	.4byte	0xdabd
+	.uleb128 0x11
+	.4byte	0xda8c
+	.uleb128 0x11
+	.4byte	0x45a4
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xdaa9
+	.uleb128 0x14
+	.4byte	0xc6
+	.4byte	0xdad2
+	.uleb128 0x11
+	.4byte	0xda8c
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xdac3
+	.uleb128 0x14
+	.4byte	0xc6
+	.4byte	0xdaec
+	.uleb128 0x11
+	.4byte	0xda8c
+	.uleb128 0x11
+	.4byte	0xc6
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xdad8
+	.uleb128 0x1f
+	.4byte	.LASF2883
+	.byte	0x4
+	.4byte	0x6d
+	.byte	0xc4
+	.byte	0x5
+	.4byte	0xdb1b
+	.uleb128 0xc
+	.4byte	.LASF2884
+	.byte	0
+	.uleb128 0xc
+	.4byte	.LASF2885
+	.byte	0x1
+	.uleb128 0xc
+	.4byte	.LASF2886
+	.byte	0x2
+	.uleb128 0xc
+	.4byte	.LASF2887
+	.byte	0x3
+	.byte	0
+	.uleb128 0xd
+	.4byte	.LASF2888
+	.byte	0x20
+	.byte	0xc5
+	.byte	0xb
+	.4byte	0xdb64
+	.uleb128 0xe
+	.4byte	.LASF2889
+	.byte	0xc5
+	.byte	0xc
+	.4byte	0x29
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF854
+	.byte	0xc5
+	.byte	0xd
+	.4byte	0x6d
+	.byte	0x8
+	.uleb128 0xe
+	.4byte	.LASF2423
+	.byte	0xc5
+	.byte	0xe
+	.4byte	0x6d
+	.byte	0xc
+	.uleb128 0xe
+	.4byte	.LASF2890
+	.byte	0xc5
+	.byte	0xf
+	.4byte	0x325
+	.byte	0x10
+	.uleb128 0xe
+	.4byte	.LASF2891
+	.byte	0xc5
+	.byte	0x11
+	.4byte	0x6d
+	.byte	0x18
+	.byte	0
+	.uleb128 0xd
+	.4byte	.LASF2892
+	.byte	0x10
+	.byte	0xc5
+	.byte	0x2a
+	.4byte	0xdb95
+	.uleb128 0x20
+	.string	"sgl"
+	.byte	0xc5
+	.byte	0x2b
+	.4byte	0xdb95
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF2893
+	.byte	0xc5
+	.byte	0x2c
+	.4byte	0x6d
+	.byte	0x8
+	.uleb128 0xe
+	.4byte	.LASF2894
+	.byte	0xc5
+	.byte	0x2d
+	.4byte	0x6d
+	.byte	0xc
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xdb1b
+	.uleb128 0x14
+	.4byte	0x458
+	.4byte	0xdbbe
+	.uleb128 0x11
+	.4byte	0xa496
+	.uleb128 0x11
+	.4byte	0x2e3
+	.uleb128 0x11
+	.4byte	0xdbbe
+	.uleb128 0x11
+	.4byte	0x330
+	.uleb128 0x11
+	.4byte	0x29
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x325
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xdb9b
+	.uleb128 0x10
+	.4byte	0xdbe9
+	.uleb128 0x11
+	.4byte	0xa496
+	.uleb128 0x11
+	.4byte	0x2e3
+	.uleb128 0x11
+	.4byte	0x458
+	.uleb128 0x11
+	.4byte	0x325
+	.uleb128 0x11
+	.4byte	0x29
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xdbca
+	.uleb128 0x14
+	.4byte	0xc6
+	.4byte	0xdc17
+	.uleb128 0x11
+	.4byte	0xa496
+	.uleb128 0x11
+	.4byte	0x3be9
+	.uleb128 0x11
+	.4byte	0x458
+	.uleb128 0x11
+	.4byte	0x325
+	.uleb128 0x11
+	.4byte	0x2e3
+	.uleb128 0x11
+	.4byte	0x29
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xdbef
+	.uleb128 0x14
+	.4byte	0xc6
+	.4byte	0xdc45
+	.uleb128 0x11
+	.4byte	0xa496
+	.uleb128 0x11
+	.4byte	0xdc45
+	.uleb128 0x11
+	.4byte	0x458
+	.uleb128 0x11
+	.4byte	0x325
+	.uleb128 0x11
+	.4byte	0x2e3
+	.uleb128 0x11
+	.4byte	0x29
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xdb64
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xdc1d
+	.uleb128 0x14
+	.4byte	0x325
+	.4byte	0xdc79
+	.uleb128 0x11
+	.4byte	0xa496
+	.uleb128 0x11
+	.4byte	0x339d
+	.uleb128 0x11
+	.4byte	0x29
+	.uleb128 0x11
+	.4byte	0x2e3
+	.uleb128 0x11
+	.4byte	0xdaf2
+	.uleb128 0x11
+	.4byte	0x29
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xdc51
+	.uleb128 0x10
+	.4byte	0xdc9e
+	.uleb128 0x11
+	.4byte	0xa496
+	.uleb128 0x11
+	.4byte	0x325
+	.uleb128 0x11
+	.4byte	0x2e3
+	.uleb128 0x11
+	.4byte	0xdaf2
+	.uleb128 0x11
+	.4byte	0x29
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xdc7f
+	.uleb128 0x14
+	.4byte	0xc6
+	.4byte	0xdcc7
+	.uleb128 0x11
+	.4byte	0xa496
+	.uleb128 0x11
+	.4byte	0xdb95
+	.uleb128 0x11
+	.4byte	0xc6
+	.uleb128 0x11
+	.4byte	0xdaf2
+	.uleb128 0x11
+	.4byte	0x29
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xdca4
+	.uleb128 0x10
+	.4byte	0xdcec
+	.uleb128 0x11
+	.4byte	0xa496
+	.uleb128 0x11
+	.4byte	0xdb95
+	.uleb128 0x11
+	.4byte	0xc6
+	.uleb128 0x11
+	.4byte	0xdaf2
+	.uleb128 0x11
+	.4byte	0x29
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xdccd
+	.uleb128 0x14
+	.4byte	0x325
+	.4byte	0xdd15
+	.uleb128 0x11
+	.4byte	0xa496
+	.uleb128 0x11
+	.4byte	0x346
+	.uleb128 0x11
+	.4byte	0x2e3
+	.uleb128 0x11
+	.4byte	0xdaf2
+	.uleb128 0x11
+	.4byte	0x29
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xdcf2
+	.uleb128 0x10
+	.4byte	0xdd35
+	.uleb128 0x11
+	.4byte	0xa496
+	.uleb128 0x11
+	.4byte	0x325
+	.uleb128 0x11
+	.4byte	0x2e3
+	.uleb128 0x11
+	.4byte	0xdaf2
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xdd1b
+	.uleb128 0x10
+	.4byte	0xdd55
+	.uleb128 0x11
+	.4byte	0xa496
+	.uleb128 0x11
+	.4byte	0xdb95
+	.uleb128 0x11
+	.4byte	0xc6
+	.uleb128 0x11
+	.4byte	0xdaf2
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xdd3b
+	.uleb128 0x10
+	.4byte	0xdd75
+	.uleb128 0x11
+	.4byte	0xa496
+	.uleb128 0x11
+	.4byte	0x458
+	.uleb128 0x11
+	.4byte	0x2e3
+	.uleb128 0x11
+	.4byte	0xdaf2
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xdd5b
+	.uleb128 0x14
+	.4byte	0xc6
+	.4byte	0xdd8f
+	.uleb128 0x11
+	.4byte	0xa496
+	.uleb128 0x11
+	.4byte	0x325
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xdd7b
+	.uleb128 0x14
+	.4byte	0xc6
+	.4byte	0xdda9
+	.uleb128 0x11
+	.4byte	0xa496
+	.uleb128 0x11
+	.4byte	0x15a
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xdd95
+	.uleb128 0x14
+	.4byte	0x458
+	.4byte	0xddd2
+	.uleb128 0x11
+	.4byte	0xa496
+	.uleb128 0x11
+	.4byte	0x458
+	.uleb128 0x11
+	.4byte	0x325
+	.uleb128 0x11
+	.4byte	0x2e3
+	.uleb128 0x11
+	.4byte	0x29
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xddaf
+	.uleb128 0x10
+	.4byte	0xdded
+	.uleb128 0x11
+	.4byte	0xa496
+	.uleb128 0x11
+	.4byte	0x458
+	.uleb128 0x11
+	.4byte	0x2e3
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xddd8
+	.uleb128 0x19
+	.4byte	.LASF2895
+	.byte	0x9
+	.byte	0xc9
+	.4byte	0xb6da
+	.uleb128 0x19
+	.4byte	.LASF2896
+	.byte	0x9
+	.byte	0xca
+	.4byte	0xb6da
+	.uleb128 0x19
+	.4byte	.LASF2897
+	.byte	0x9
+	.byte	0xcb
+	.4byte	0xb6da
+	.uleb128 0x24
+	.4byte	.LASF2898
+	.uleb128 0x19
+	.4byte	.LASF2899
+	.byte	0xc6
+	.byte	0x7
+	.4byte	0xde24
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xde14
+	.uleb128 0x24
+	.4byte	.LASF2900
+	.uleb128 0x19
+	.4byte	.LASF2901
+	.byte	0xc6
+	.byte	0x8
+	.4byte	0xde3a
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xde2a
+	.uleb128 0x19
+	.4byte	.LASF2902
+	.byte	0xc6
+	.byte	0x16
+	.4byte	0xb6df
+	.uleb128 0x19
+	.4byte	.LASF2903
+	.byte	0xc7
+	.byte	0x1b
+	.4byte	0xb6da
+	.uleb128 0xd
+	.4byte	.LASF2904
+	.byte	0x18
+	.byte	0xc8
+	.byte	0xf
+	.4byte	0xde87
+	.uleb128 0xe
+	.4byte	.LASF2835
+	.byte	0xc8
+	.byte	0x10
+	.4byte	0x458
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF2834
+	.byte	0xc8
+	.byte	0x11
+	.4byte	0x29
+	.byte	0x8
+	.uleb128 0xe
+	.4byte	.LASF957
+	.byte	0xc8
+	.byte	0x12
+	.4byte	0x2e3
+	.byte	0x10
+	.byte	0
+	.uleb128 0xd
+	.4byte	.LASF2905
+	.byte	0xa8
+	.byte	0xc8
+	.byte	0x15
+	.4byte	0xdfe3
+	.uleb128 0x20
+	.string	"dev"
+	.byte	0xc8
+	.byte	0x16
+	.4byte	0xa496
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF2906
+	.byte	0xc8
+	.byte	0x17
+	.4byte	0xe0a4
+	.byte	0x8
+	.uleb128 0xe
+	.4byte	.LASF2907
+	.byte	0xc8
+	.byte	0x18
+	.4byte	0xda8c
+	.byte	0x10
+	.uleb128 0x20
+	.string	"fb"
+	.byte	0xc8
+	.byte	0x19
+	.4byte	0xe0aa
+	.byte	0x18
+	.uleb128 0xe
+	.4byte	.LASF2908
+	.byte	0xc8
+	.byte	0x1a
+	.4byte	0xc6
+	.byte	0x48
+	.uleb128 0xe
+	.4byte	.LASF262
+	.byte	0xc8
+	.byte	0x1c
+	.4byte	0x13f
+	.byte	0x4c
+	.uleb128 0xe
+	.4byte	.LASF2870
+	.byte	0xc8
+	.byte	0x1d
+	.4byte	0x13f
+	.byte	0x50
+	.uleb128 0xe
+	.4byte	.LASF2909
+	.byte	0xc8
+	.byte	0x1e
+	.4byte	0x13f
+	.byte	0x54
+	.uleb128 0xe
+	.4byte	.LASF2910
+	.byte	0xc8
+	.byte	0x1f
+	.4byte	0x13f
+	.byte	0x58
+	.uleb128 0xe
+	.4byte	.LASF2872
+	.byte	0xc8
+	.byte	0x20
+	.4byte	0x13f
+	.byte	0x5c
+	.uleb128 0xe
+	.4byte	.LASF2873
+	.byte	0xc8
+	.byte	0x21
+	.4byte	0x13f
+	.byte	0x60
+	.uleb128 0xe
+	.4byte	.LASF2911
+	.byte	0xc8
+	.byte	0x22
+	.4byte	0x13f
+	.byte	0x64
+	.uleb128 0xe
+	.4byte	.LASF2912
+	.byte	0xc8
+	.byte	0x23
+	.4byte	0x13f
+	.byte	0x68
+	.uleb128 0x20
+	.string	"lsl"
+	.byte	0xc8
+	.byte	0x24
+	.4byte	0x13f
+	.byte	0x6c
+	.uleb128 0x20
+	.string	"lbl"
+	.byte	0xc8
+	.byte	0x25
+	.4byte	0x13f
+	.byte	0x70
+	.uleb128 0x20
+	.string	"ldl"
+	.byte	0xc8
+	.byte	0x26
+	.4byte	0x13f
+	.byte	0x74
+	.uleb128 0x20
+	.string	"lel"
+	.byte	0xc8
+	.byte	0x27
+	.4byte	0x13f
+	.byte	0x78
+	.uleb128 0xe
+	.4byte	.LASF2913
+	.byte	0xc8
+	.byte	0x28
+	.4byte	0x13f
+	.byte	0x7c
+	.uleb128 0xe
+	.4byte	.LASF2914
+	.byte	0xc8
+	.byte	0x29
+	.4byte	0x13f
+	.byte	0x80
+	.uleb128 0x20
+	.string	"fsl"
+	.byte	0xc8
+	.byte	0x2a
+	.4byte	0x13f
+	.byte	0x84
+	.uleb128 0x20
+	.string	"fbl"
+	.byte	0xc8
+	.byte	0x2b
+	.4byte	0x13f
+	.byte	0x88
+	.uleb128 0x20
+	.string	"fdl"
+	.byte	0xc8
+	.byte	0x2c
+	.4byte	0x13f
+	.byte	0x8c
+	.uleb128 0x20
+	.string	"fel"
+	.byte	0xc8
+	.byte	0x2d
+	.4byte	0x13f
+	.byte	0x90
+	.uleb128 0xe
+	.4byte	.LASF2915
+	.byte	0xc8
+	.byte	0x2e
+	.4byte	0x13f
+	.byte	0x94
+	.uleb128 0xe
+	.4byte	.LASF2871
+	.byte	0xc8
+	.byte	0x2f
+	.4byte	0x13f
+	.byte	0x98
+	.uleb128 0xe
+	.4byte	.LASF2916
+	.byte	0xc8
+	.byte	0x30
+	.4byte	0x13f
+	.byte	0x9c
+	.uleb128 0xe
+	.4byte	.LASF2917
+	.byte	0xc8
+	.byte	0x31
+	.4byte	0x13f
+	.byte	0xa0
+	.uleb128 0xe
+	.4byte	.LASF2918
+	.byte	0xc8
+	.byte	0x32
+	.4byte	0x13f
+	.byte	0xa4
+	.byte	0
+	.uleb128 0xd
+	.4byte	.LASF2919
+	.byte	0x70
+	.byte	0xa
+	.byte	0x17
+	.4byte	0xe0a4
+	.uleb128 0x20
+	.string	"dev"
+	.byte	0xa
+	.byte	0x18
+	.4byte	0xa496
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF2920
+	.byte	0xa
+	.byte	0x19
+	.4byte	0x458
+	.byte	0x8
+	.uleb128 0x20
+	.string	"len"
+	.byte	0xa
+	.byte	0x1a
+	.4byte	0x6d
+	.byte	0x10
+	.uleb128 0x20
+	.string	"irq"
+	.byte	0xa
+	.byte	0x1b
+	.4byte	0xc6
+	.byte	0x14
+	.uleb128 0xe
+	.4byte	.LASF2921
+	.byte	0xa
+	.byte	0x1d
+	.4byte	0xe0bf
+	.byte	0x18
+	.uleb128 0xe
+	.4byte	.LASF2922
+	.byte	0xa
+	.byte	0x1e
+	.4byte	0xe0bf
+	.byte	0x20
+	.uleb128 0xe
+	.4byte	.LASF2923
+	.byte	0xa
+	.byte	0x1f
+	.4byte	0xe0ca
+	.byte	0x28
+	.uleb128 0xe
+	.4byte	.LASF2924
+	.byte	0xa
+	.byte	0x21
+	.4byte	0xe0ea
+	.byte	0x30
+	.uleb128 0xe
+	.4byte	.LASF2925
+	.byte	0xa
+	.byte	0x22
+	.4byte	0xe0fb
+	.byte	0x38
+	.uleb128 0xe
+	.4byte	.LASF2926
+	.byte	0xa
+	.byte	0x23
+	.4byte	0xe120
+	.byte	0x40
+	.uleb128 0xe
+	.4byte	.LASF2927
+	.byte	0xa
+	.byte	0x24
+	.4byte	0xe13b
+	.byte	0x48
+	.uleb128 0xe
+	.4byte	.LASF2928
+	.byte	0xa
+	.byte	0x25
+	.4byte	0xe151
+	.byte	0x50
+	.uleb128 0xe
+	.4byte	.LASF2929
+	.byte	0xa
+	.byte	0x26
+	.4byte	0xe175
+	.byte	0x58
+	.uleb128 0xe
+	.4byte	.LASF2930
+	.byte	0xa
+	.byte	0x27
+	.4byte	0xe18b
+	.byte	0x60
+	.uleb128 0xe
+	.4byte	.LASF2931
+	.byte	0xa
+	.byte	0x28
+	.4byte	0x4b7
+	.byte	0x68
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xdfe3
+	.uleb128 0x5
+	.4byte	0xde56
+	.4byte	0xe0ba
+	.uleb128 0x6
+	.4byte	0x4f
+	.byte	0x1
+	.byte	0
+	.uleb128 0x45
+	.string	"clk"
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xe0ba
+	.uleb128 0x24
+	.4byte	.LASF2932
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xe0c5
+	.uleb128 0x14
+	.4byte	0xc6
+	.4byte	0xe0e4
+	.uleb128 0x11
+	.4byte	0xe0a4
+	.uleb128 0x11
+	.4byte	0xe0e4
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xde87
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xe0d0
+	.uleb128 0x10
+	.4byte	0xe0fb
+	.uleb128 0x11
+	.4byte	0xe0a4
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xe0f0
+	.uleb128 0x10
+	.4byte	0xe120
+	.uleb128 0x11
+	.4byte	0xe0a4
+	.uleb128 0x11
+	.4byte	0xc6
+	.uleb128 0x11
+	.4byte	0xc6
+	.uleb128 0x11
+	.4byte	0xc6
+	.uleb128 0x11
+	.4byte	0xc6
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xe101
+	.uleb128 0x10
+	.4byte	0xe13b
+	.uleb128 0x11
+	.4byte	0xe0a4
+	.uleb128 0x11
+	.4byte	0x13f
+	.uleb128 0x11
+	.4byte	0x13f
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xe126
+	.uleb128 0x10
+	.4byte	0xe151
+	.uleb128 0x11
+	.4byte	0xe0a4
+	.uleb128 0x11
+	.4byte	0x13f
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xe141
+	.uleb128 0x14
+	.4byte	0xc6
+	.4byte	0xe175
+	.uleb128 0x11
+	.4byte	0xe0a4
+	.uleb128 0x11
+	.4byte	0x34a7
+	.uleb128 0x11
+	.4byte	0xc6
+	.uleb128 0x11
+	.4byte	0xc6
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xe157
+	.uleb128 0x10
+	.4byte	0xe18b
+	.uleb128 0x11
+	.4byte	0xe0a4
+	.uleb128 0x11
+	.4byte	0xc6
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xe17b
+	.uleb128 0x1f
+	.4byte	.LASF2933
+	.byte	0x4
+	.4byte	0x6d
+	.byte	0x1
+	.byte	0x33
+	.4byte	0xe1ba
+	.uleb128 0xc
+	.4byte	.LASF2934
+	.byte	0x1
+	.uleb128 0xc
+	.4byte	.LASF2935
+	.byte	0x2
+	.uleb128 0xc
+	.4byte	.LASF2936
+	.byte	0x3
+	.uleb128 0xc
+	.4byte	.LASF2937
+	.byte	0x4
+	.byte	0
+	.uleb128 0x1f
+	.4byte	.LASF2938
+	.byte	0x4
+	.4byte	0x6d
+	.byte	0x1
+	.byte	0x3a
+	.4byte	0xe1e3
+	.uleb128 0xc
+	.4byte	.LASF2939
+	.byte	0
+	.uleb128 0xc
+	.4byte	.LASF2940
+	.byte	0x1
+	.uleb128 0xc
+	.4byte	.LASF2941
+	.byte	0x2
+	.uleb128 0xc
+	.4byte	.LASF2942
+	.byte	0x3
+	.byte	0
+	.uleb128 0x26
+	.4byte	.LASF2943
+	.2byte	0x268
+	.byte	0x1
+	.byte	0x42
+	.4byte	0xe462
+	.uleb128 0xe
+	.4byte	.LASF2944
+	.byte	0x1
+	.byte	0x43
+	.4byte	0x29
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF2945
+	.byte	0x1
+	.byte	0x44
+	.4byte	0x21e
+	.byte	0x8
+	.uleb128 0xe
+	.4byte	.LASF2946
+	.byte	0x1
+	.byte	0x45
+	.4byte	0x21e
+	.byte	0x10
+	.uleb128 0xe
+	.4byte	.LASF2947
+	.byte	0x1
+	.byte	0x46
+	.4byte	0xc6
+	.byte	0x18
+	.uleb128 0xe
+	.4byte	.LASF2948
+	.byte	0x1
+	.byte	0x47
+	.4byte	0xc6
+	.byte	0x1c
+	.uleb128 0xe
+	.4byte	.LASF2949
+	.byte	0x1
+	.byte	0x48
+	.4byte	0xc6
+	.byte	0x20
+	.uleb128 0xe
+	.4byte	.LASF2950
+	.byte	0x1
+	.byte	0x49
+	.4byte	0x29
+	.byte	0x28
+	.uleb128 0xe
+	.4byte	.LASF2951
+	.byte	0x1
+	.byte	0x4a
+	.4byte	0xc6
+	.byte	0x30
+	.uleb128 0xe
+	.4byte	.LASF2952
+	.byte	0x1
+	.byte	0x4b
+	.4byte	0xc6
+	.byte	0x34
+	.uleb128 0xe
+	.4byte	.LASF2953
+	.byte	0x1
+	.byte	0x4c
+	.4byte	0x61
+	.byte	0x38
+	.uleb128 0xe
+	.4byte	.LASF2954
+	.byte	0x1
+	.byte	0x4d
+	.4byte	0x61
+	.byte	0x39
+	.uleb128 0xe
+	.4byte	.LASF2955
+	.byte	0x1
+	.byte	0x4e
+	.4byte	0xc6
+	.byte	0x3c
+	.uleb128 0xe
+	.4byte	.LASF2956
+	.byte	0x1
+	.byte	0x4f
+	.4byte	0xc6
+	.byte	0x40
+	.uleb128 0xe
+	.4byte	.LASF2957
+	.byte	0x1
+	.byte	0x50
+	.4byte	0xc6
+	.byte	0x44
+	.uleb128 0xe
+	.4byte	.LASF2958
+	.byte	0x1
+	.byte	0x51
+	.4byte	0xc6
+	.byte	0x48
+	.uleb128 0xe
+	.4byte	.LASF2959
+	.byte	0x1
+	.byte	0x52
+	.4byte	0xc6
+	.byte	0x4c
+	.uleb128 0xe
+	.4byte	.LASF2960
+	.byte	0x1
+	.byte	0x53
+	.4byte	0xc6
+	.byte	0x50
+	.uleb128 0xe
+	.4byte	.LASF2961
+	.byte	0x1
+	.byte	0x54
+	.4byte	0xc6
+	.byte	0x54
+	.uleb128 0xe
+	.4byte	.LASF2962
+	.byte	0x1
+	.byte	0x55
+	.4byte	0xc6
+	.byte	0x58
+	.uleb128 0xe
+	.4byte	.LASF2870
+	.byte	0x1
+	.byte	0x56
+	.4byte	0xc6
+	.byte	0x5c
+	.uleb128 0xe
+	.4byte	.LASF262
+	.byte	0x1
+	.byte	0x57
+	.4byte	0xc6
+	.byte	0x60
+	.uleb128 0xe
+	.4byte	.LASF2963
+	.byte	0x1
+	.byte	0x58
+	.4byte	0xc6
+	.byte	0x64
+	.uleb128 0x20
+	.string	"dev"
+	.byte	0x1
+	.byte	0x59
+	.4byte	0xa496
+	.byte	0x68
+	.uleb128 0xe
+	.4byte	.LASF2964
+	.byte	0x1
+	.byte	0x5a
+	.4byte	0xd7b8
+	.byte	0x70
+	.uleb128 0xe
+	.4byte	.LASF2965
+	.byte	0x1
+	.byte	0x5b
+	.4byte	0xc6
+	.byte	0x90
+	.uleb128 0xe
+	.4byte	.LASF2966
+	.byte	0x1
+	.byte	0x5c
+	.4byte	0xbfee
+	.byte	0x98
+	.uleb128 0xe
+	.4byte	.LASF2967
+	.byte	0x1
+	.byte	0x5d
+	.4byte	0xbfee
+	.byte	0xa0
+	.uleb128 0xe
+	.4byte	.LASF2968
+	.byte	0x1
+	.byte	0x5e
+	.4byte	0xbfee
+	.byte	0xa8
+	.uleb128 0xe
+	.4byte	.LASF2969
+	.byte	0x1
+	.byte	0x5f
+	.4byte	0xbfee
+	.byte	0xb0
+	.uleb128 0xe
+	.4byte	.LASF2970
+	.byte	0x1
+	.byte	0x60
+	.4byte	0xe462
+	.byte	0xb8
+	.uleb128 0xe
+	.4byte	.LASF2971
+	.byte	0x1
+	.byte	0x61
+	.4byte	0xc6
+	.byte	0xc8
+	.uleb128 0xe
+	.4byte	.LASF2972
+	.byte	0x1
+	.byte	0x62
+	.4byte	0x21e
+	.byte	0xd0
+	.uleb128 0xe
+	.4byte	.LASF2973
+	.byte	0x1
+	.byte	0x63
+	.4byte	0xe472
+	.byte	0xd8
+	.uleb128 0xe
+	.4byte	.LASF2974
+	.byte	0x1
+	.byte	0x64
+	.4byte	0xe472
+	.byte	0xe0
+	.uleb128 0xe
+	.4byte	.LASF2975
+	.byte	0x1
+	.byte	0x65
+	.4byte	0xe472
+	.byte	0xe8
+	.uleb128 0xe
+	.4byte	.LASF2976
+	.byte	0x1
+	.byte	0x66
+	.4byte	0xe472
+	.byte	0xf0
+	.uleb128 0xe
+	.4byte	.LASF2977
+	.byte	0x1
+	.byte	0x67
+	.4byte	0xc6
+	.byte	0xf8
+	.uleb128 0xe
+	.4byte	.LASF2978
+	.byte	0x1
+	.byte	0x68
+	.4byte	0xc6
+	.byte	0xfc
+	.uleb128 0x27
+	.4byte	.LASF2979
+	.byte	0x1
+	.byte	0x69
+	.4byte	0xd728
+	.2byte	0x100
+	.uleb128 0x27
+	.4byte	.LASF2980
+	.byte	0x1
+	.byte	0x6a
+	.4byte	0xc6
+	.2byte	0x1d0
+	.uleb128 0x27
+	.4byte	.LASF2981
+	.byte	0x1
+	.byte	0x6c
+	.4byte	0xc6
+	.2byte	0x1d4
+	.uleb128 0x27
+	.4byte	.LASF2982
+	.byte	0x1
+	.byte	0x6e
+	.4byte	0x316c
+	.2byte	0x1d8
+	.uleb128 0x27
+	.4byte	.LASF2983
+	.byte	0x1
+	.byte	0x71
+	.4byte	0x316c
+	.2byte	0x210
+	.uleb128 0x27
+	.4byte	.LASF2984
+	.byte	0x1
+	.byte	0x74
+	.4byte	0xc6
+	.2byte	0x248
+	.uleb128 0x27
+	.4byte	.LASF2985
+	.byte	0x1
+	.byte	0x76
+	.4byte	0xc6
+	.2byte	0x24c
+	.uleb128 0x27
+	.4byte	.LASF2986
+	.byte	0x1
+	.byte	0x78
+	.4byte	0xc6
+	.2byte	0x250
+	.uleb128 0x27
+	.4byte	.LASF2987
+	.byte	0x1
+	.byte	0x7a
+	.4byte	0xc6
+	.2byte	0x254
+	.uleb128 0x27
+	.4byte	.LASF2988
+	.byte	0x1
+	.byte	0x7b
+	.4byte	0xc6
+	.2byte	0x258
+	.uleb128 0x27
+	.4byte	.LASF2989
+	.byte	0x1
+	.byte	0x7c
+	.4byte	0xc6
+	.2byte	0x25c
+	.uleb128 0x27
+	.4byte	.LASF2990
+	.byte	0x1
+	.byte	0x7d
+	.4byte	0xc6
+	.2byte	0x260
+	.uleb128 0x27
+	.4byte	.LASF2991
+	.byte	0x1
+	.byte	0x7e
+	.4byte	0xc6
+	.2byte	0x264
+	.byte	0
+	.uleb128 0x5
+	.4byte	0x458
+	.4byte	0xe472
+	.uleb128 0x6
+	.4byte	0x4f
+	.byte	0x1
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xd828
+	.uleb128 0x47
+	.string	"ebc"
+	.2byte	0x328
+	.byte	0x1
+	.byte	0x81
+	.4byte	0xe4c2
+	.uleb128 0x20
+	.string	"dev"
+	.byte	0x1
+	.byte	0x82
+	.4byte	0xa496
+	.byte	0
+	.uleb128 0xe
+	.4byte	.LASF2906
+	.byte	0x1
+	.byte	0x83
+	.4byte	0xe0a4
+	.byte	0x8
+	.uleb128 0xe
+	.4byte	.LASF2907
+	.byte	0x1
+	.byte	0x84
+	.4byte	0xda8c
+	.byte	0x10
+	.uleb128 0xe
+	.4byte	.LASF2992
+	.byte	0x1
+	.byte	0x85
+	.4byte	0xde87
+	.byte	0x18
+	.uleb128 0xe
+	.4byte	.LASF1742
+	.byte	0x1
+	.byte	0x86
+	.4byte	0xe1e3
+	.byte	0xc0
+	.byte	0
+	.uleb128 0x48
+	.4byte	.LASF2993
+	.byte	0x1
+	.byte	0x8b
+	.4byte	0xe4d7
+	.uleb128 0x9
+	.byte	0x3
+	.8byte	global_ebc
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xe478
+	.uleb128 0x48
+	.4byte	.LASF2994
+	.byte	0x1
+	.byte	0x8c
+	.4byte	0x2eff
+	.uleb128 0x9
+	.byte	0x3
+	.8byte	ebc_task
+	.uleb128 0x48
+	.4byte	.LASF2995
+	.byte	0x1
+	.byte	0x8d
+	.4byte	0x2eff
+	.uleb128 0x9
+	.byte	0x3
+	.8byte	ebc_auto_task
+	.uleb128 0x48
+	.4byte	.LASF2996
+	.byte	0x1
+	.byte	0x8e
+	.4byte	0x159a
+	.uleb128 0x9
+	.byte	0x3
+	.8byte	ebc_thread_wq
+	.uleb128 0x48
+	.4byte	.LASF2997
+	.byte	0x1
+	.byte	0x8f
+	.4byte	0x5a97
+	.uleb128 0x9
+	.byte	0x3
+	.8byte	ebc_auto_thread_sem
+	.uleb128 0x48
+	.4byte	.LASF2998
+	.byte	0x1
+	.byte	0x91
+	.4byte	0x2eff
+	.uleb128 0x9
+	.byte	0x3
+	.8byte	ebc_auto_assist_task
+	.uleb128 0x48
+	.4byte	.LASF2999
+	.byte	0x1
+	.byte	0x92
+	.4byte	0x5a97
+	.uleb128 0x9
+	.byte	0x3
+	.8byte	ebc_auto_assist_thread_sem
+	.uleb128 0x48
+	.4byte	.LASF3000
+	.byte	0x1
+	.byte	0x93
+	.4byte	0x5a97
+	.uleb128 0x9
+	.byte	0x3
+	.8byte	ebc_assist_finished_flag_sem
+	.uleb128 0x49
+	.4byte	.LASF3001
+	.byte	0x1
+	.2byte	0x929
+	.4byte	0xc6
+	.uleb128 0x9
+	.byte	0x3
+	.8byte	resume_frame_count
+	.uleb128 0x49
+	.4byte	.LASF3002
+	.byte	0x1
+	.2byte	0x92a
+	.4byte	0xc6
+	.uleb128 0x9
+	.byte	0x3
+	.8byte	resume_count_start
+	.uleb128 0x49
+	.4byte	.LASF3003
+	.byte	0x1
+	.2byte	0xc5b
+	.4byte	0x7c9
+	.uleb128 0x9
+	.byte	0x3
+	.8byte	ebc_ops
+	.uleb128 0x49
+	.4byte	.LASF3004
+	.byte	0x1
+	.2byte	0xc65
+	.4byte	0xc536
+	.uleb128 0x9
+	.byte	0x3
+	.8byte	ebc_misc
+	.uleb128 0x49
+	.4byte	.LASF3005
+	.byte	0x1
+	.2byte	0xc82
+	.4byte	0x7c9
+	.uleb128 0x9
+	.byte	0x3
+	.8byte	waveform_ops
+	.uleb128 0x49
+	.4byte	.LASF3006
+	.byte	0x1
+	.2byte	0xc88
+	.4byte	0xc536
+	.uleb128 0x9
+	.byte	0x3
+	.8byte	waveform_misc
+	.uleb128 0x49
+	.4byte	.LASF3007
+	.byte	0x1
+	.2byte	0xc97
+	.4byte	0xb2c3
+	.uleb128 0x9
+	.byte	0x3
+	.8byte	dev_attr_waveform_version
+	.uleb128 0x49
+	.4byte	.LASF3008
+	.byte	0x1
+	.2byte	0xca2
+	.4byte	0xb2c3
+	.uleb128 0x9
+	.byte	0x3
+	.8byte	dev_attr_pmic_name
+	.uleb128 0x49
+	.4byte	.LASF3009
+	.byte	0x1
+	.2byte	0xcb0
+	.4byte	0xb2c3
+	.uleb128 0x9
+	.byte	0x3
+	.8byte	dev_attr_pmic_temp
+	.uleb128 0x49
+	.4byte	.LASF3010
+	.byte	0x1
+	.2byte	0xcd3
+	.4byte	0xb2c3
+	.uleb128 0x9
+	.byte	0x3
+	.8byte	dev_attr_pmic_vcom
+	.uleb128 0x49
+	.4byte	.LASF3011
+	.byte	0x1
+	.2byte	0xcdd
+	.4byte	0xb2c3
+	.uleb128 0x9
+	.byte	0x3
+	.8byte	dev_attr_ebc_version
+	.uleb128 0x49
+	.4byte	.LASF3012
+	.byte	0x1
+	.2byte	0xce6
+	.4byte	0xb2c3
+	.uleb128 0x9
+	.byte	0x3
+	.8byte	dev_attr_ebc_state
+	.uleb128 0x49
+	.4byte	.LASF3013
+	.byte	0x1
+	.2byte	0xcef
+	.4byte	0xb2c3
+	.uleb128 0x9
+	.byte	0x3
+	.8byte	dev_attr_ebc_buf_state
+	.uleb128 0x49
+	.4byte	.LASF3014
+	.byte	0x1
+	.2byte	0xd02
+	.4byte	0xb2c3
+	.uleb128 0x9
+	.byte	0x3
+	.8byte	dev_attr_auto_frame_state
+	.uleb128 0x49
+	.4byte	.LASF3015
+	.byte	0x1
+	.2byte	0xed8
+	.4byte	0xa482
+	.uleb128 0x9
+	.byte	0x3
+	.8byte	ebc_pm
+	.uleb128 0x5
+	.4byte	0xb0c1
+	.4byte	0xe6ca
+	.uleb128 0x6
+	.4byte	0x4f
+	.byte	0x1
+	.byte	0
+	.uleb128 0x3
+	.4byte	0xe6ba
+	.uleb128 0x49
+	.4byte	.LASF3016
+	.byte	0x1
+	.2byte	0xedd
+	.4byte	0xe6ca
+	.uleb128 0x9
+	.byte	0x3
+	.8byte	ebc_match
+	.uleb128 0x49
+	.4byte	.LASF3017
+	.byte	0x1
+	.2byte	0xee3
+	.4byte	0xd5c4
+	.uleb128 0x9
+	.byte	0x3
+	.8byte	ebc_driver
+	.uleb128 0x49
+	.4byte	.LASF3018
+	.byte	0x1
+	.2byte	0xef7
+	.4byte	0x458
+	.uleb128 0x9
+	.byte	0x3
+	.8byte	__addressable_ebc_init3831
+	.uleb128 0x49
+	.4byte	.LASF3019
+	.byte	0x1
+	.2byte	0xef8
+	.4byte	0x4ac
+	.uleb128 0x9
+	.byte	0x3
+	.8byte	__exitcall_ebc_exit
+	.uleb128 0x4a
+	.4byte	.LASF3074
+	.byte	0x1
+	.2byte	0xef2
+	.8byte	.LFB2875
+	.8byte	.LFE2875-.LFB2875
+	.uleb128 0x1
+	.byte	0x9c
+	.4byte	0xe753
+	.uleb128 0x4b
+	.8byte	.LVL74
+	.4byte	0x16c45
+	.byte	0
+	.uleb128 0x4c
+	.4byte	.LASF3020
+	.byte	0x1
+	.2byte	0xeed
+	.4byte	0xc6
+	.8byte	.LFB2874
+	.8byte	.LFE2874-.LFB2874
+	.uleb128 0x1
+	.byte	0x9c
+	.4byte	0xe783
+	.uleb128 0x4b
+	.8byte	.LVL720
+	.4byte	0x16c50
+	.byte	0
+	.uleb128 0x4d
+	.4byte	.LASF3021
+	.byte	0x1
+	.2byte	0xecc
+	.4byte	0xc6
+	.8byte	.LFB2873
+	.8byte	.LFE2873-.LFB2873
+	.uleb128 0x1
+	.byte	0x9c
+	.4byte	0xe81f
+	.uleb128 0x4e
+	.string	"dev"
+	.byte	0x1
+	.2byte	0xecc
+	.4byte	0xa496
+	.4byte	.LLST22
+	.uleb128 0x4f
+	.string	"ebc"
+	.byte	0x1
+	.2byte	0xece
+	.4byte	0xe4d7
+	.uleb128 0x43
+	.4byte	.LASF2943
+	.byte	0x1
+	.2byte	0xecf
+	.4byte	0xe81f
+	.uleb128 0x50
+	.4byte	0x15ee7
+	.8byte	.LBB1128
+	.8byte	.LBE1128-.LBB1128
+	.byte	0x1
+	.2byte	0xece
+	.4byte	0xe7ef
+	.uleb128 0x51
+	.4byte	0x15ef8
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x15ad8
+	.8byte	.LBB1130
+	.8byte	.LBE1130-.LBB1130
+	.byte	0x1
+	.2byte	0xed1
+	.4byte	0xe811
+	.uleb128 0x51
+	.4byte	0x15ae4
+	.byte	0
+	.uleb128 0x4b
+	.8byte	.LVL78
+	.4byte	0x16c5b
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xe1e3
+	.uleb128 0x4d
+	.4byte	.LASF3023
+	.byte	0x1
+	.2byte	0xebb
+	.4byte	0xc6
+	.8byte	.LFB2872
+	.8byte	.LFE2872-.LFB2872
+	.uleb128 0x1
+	.byte	0x9c
+	.4byte	0xe92c
+	.uleb128 0x4e
+	.string	"dev"
+	.byte	0x1
+	.2byte	0xebb
+	.4byte	0xa496
+	.4byte	.LLST268
+	.uleb128 0x4f
+	.string	"ebc"
+	.byte	0x1
+	.2byte	0xebd
+	.4byte	0xe4d7
+	.uleb128 0x43
+	.4byte	.LASF2943
+	.byte	0x1
+	.2byte	0xebe
+	.4byte	0xe81f
+	.uleb128 0x52
+	.4byte	.LASF3024
+	.4byte	0xe93c
+	.uleb128 0x9
+	.byte	0x3
+	.8byte	__func__.35860
+	.uleb128 0x50
+	.4byte	0x15ee7
+	.8byte	.LBB1638
+	.8byte	.LBE1638-.LBB1638
+	.byte	0x1
+	.2byte	0xebd
+	.4byte	0xe8a4
+	.uleb128 0x51
+	.4byte	0x15ef8
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x15af0
+	.8byte	.LBB1640
+	.8byte	.LBE1640-.LBB1640
+	.byte	0x1
+	.2byte	0xec6
+	.4byte	0xe8c6
+	.uleb128 0x51
+	.4byte	0x15afc
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x15728
+	.8byte	.LBB1642
+	.8byte	.LBE1642-.LBB1642
+	.byte	0x1
+	.2byte	0xec2
+	.4byte	0xe911
+	.uleb128 0x51
+	.4byte	0x15745
+	.uleb128 0x51
+	.4byte	0x15739
+	.uleb128 0x53
+	.8byte	.LBB1643
+	.8byte	.LBE1643-.LBB1643
+	.uleb128 0x54
+	.4byte	0x15751
+	.uleb128 0x4b
+	.8byte	.LVL888
+	.4byte	0x166e9
+	.byte	0
+	.byte	0
+	.uleb128 0x4b
+	.8byte	.LVL886
+	.4byte	0x16c5b
+	.uleb128 0x4b
+	.8byte	.LVL887
+	.4byte	0x16c5b
+	.byte	0
+	.uleb128 0x5
+	.4byte	0x68
+	.4byte	0xe93c
+	.uleb128 0x6
+	.4byte	0x4f
+	.byte	0xb
+	.byte	0
+	.uleb128 0x3
+	.4byte	0xe92c
+	.uleb128 0x4c
+	.4byte	.LASF3025
+	.byte	0x1
+	.2byte	0xeb4
+	.4byte	0xc6
+	.8byte	.LFB2871
+	.8byte	.LFE2871-.LFB2871
+	.uleb128 0x1
+	.byte	0x9c
+	.4byte	0xe981
+	.uleb128 0x55
+	.4byte	.LASF3026
+	.byte	0x1
+	.2byte	0xeb4
+	.4byte	0xd640
+	.4byte	.LLST24
+	.uleb128 0x4b
+	.8byte	.LVL84
+	.4byte	0x16c67
+	.byte	0
+	.uleb128 0x4c
+	.4byte	.LASF3027
+	.byte	0x1
+	.2byte	0xe34
+	.4byte	0xc6
+	.8byte	.LFB2870
+	.8byte	.LFE2870-.LFB2870
+	.uleb128 0x1
+	.byte	0x9c
+	.4byte	0xfee4
+	.uleb128 0x55
+	.4byte	.LASF3026
+	.byte	0x1
+	.2byte	0xe34
+	.4byte	0xd640
+	.4byte	.LLST298
+	.uleb128 0x4f
+	.string	"dev"
+	.byte	0x1
+	.2byte	0xe36
+	.4byte	0xa496
+	.uleb128 0x43
+	.4byte	.LASF3028
+	.byte	0x1
+	.2byte	0xe37
+	.4byte	0xb7ba
+	.uleb128 0x56
+	.4byte	.LASF3029
+	.byte	0x1
+	.2byte	0xe38
+	.4byte	0xd640
+	.4byte	.LLST299
+	.uleb128 0x43
+	.4byte	.LASF3030
+	.byte	0x1
+	.2byte	0xe39
+	.4byte	0xb7ba
+	.uleb128 0x56
+	.4byte	.LASF3031
+	.byte	0x1
+	.2byte	0xe3a
+	.4byte	0xbf69
+	.4byte	.LLST300
+	.uleb128 0x4f
+	.string	"ebc"
+	.byte	0x1
+	.2byte	0xe3b
+	.4byte	0xe4d7
+	.uleb128 0x56
+	.4byte	.LASF2943
+	.byte	0x1
+	.2byte	0xe3c
+	.4byte	0xe81f
+	.4byte	.LLST301
+	.uleb128 0x43
+	.4byte	.LASF2992
+	.byte	0x1
+	.2byte	0xe3d
+	.4byte	0xe0e4
+	.uleb128 0x56
+	.4byte	.LASF932
+	.byte	0x1
+	.2byte	0xe3e
+	.4byte	0xbbe6
+	.4byte	.LLST302
+	.uleb128 0x43
+	.4byte	.LASF2389
+	.byte	0x1
+	.2byte	0xe3f
+	.4byte	0xbb86
+	.uleb128 0x4f
+	.string	"ret"
+	.byte	0x1
+	.2byte	0xe40
+	.4byte	0xc6
+	.uleb128 0x56
+	.4byte	.LASF957
+	.byte	0x1
+	.2byte	0xe41
+	.4byte	0xc6
+	.4byte	.LLST303
+	.uleb128 0x57
+	.string	"i"
+	.byte	0x1
+	.2byte	0xe42
+	.4byte	0xc6
+	.4byte	.LLST304
+	.uleb128 0x58
+	.4byte	0x15f05
+	.8byte	.LBB1938
+	.4byte	.Ldebug_ranges0+0x1500
+	.byte	0x1
+	.2byte	0xe44
+	.4byte	0xea9a
+	.uleb128 0x51
+	.4byte	0x15f2e
+	.uleb128 0x51
+	.4byte	0x15f22
+	.uleb128 0x51
+	.4byte	0x15f16
+	.uleb128 0x4b
+	.8byte	.LVL998
+	.4byte	0x16c72
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x15de2
+	.8byte	.LBB1942
+	.8byte	.LBE1942-.LBB1942
+	.byte	0x1
+	.2byte	0xe56
+	.4byte	0xead9
+	.uleb128 0x51
+	.4byte	0x15df2
+	.uleb128 0x59
+	.4byte	0x15ee7
+	.8byte	.LBB1943
+	.8byte	.LBE1943-.LBB1943
+	.byte	0xbd
+	.byte	0xdb
+	.uleb128 0x51
+	.4byte	0x15ef8
+	.byte	0
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x15e04
+	.8byte	.LBB1945
+	.8byte	.LBE1945-.LBB1945
+	.byte	0x1
+	.2byte	0xe71
+	.4byte	0xeb19
+	.uleb128 0x51
+	.4byte	0x15e15
+	.uleb128 0x5a
+	.4byte	0x15ee7
+	.8byte	.LBB1946
+	.8byte	.LBE1946-.LBB1946
+	.byte	0xa1
+	.2byte	0x166
+	.uleb128 0x51
+	.4byte	0x15ef8
+	.byte	0
+	.byte	0
+	.uleb128 0x58
+	.4byte	0x120cc
+	.8byte	.LBB1948
+	.4byte	.Ldebug_ranges0+0x1530
+	.byte	0x1
+	.2byte	0xe85
+	.4byte	0xf5e8
+	.uleb128 0x51
+	.4byte	0x120dd
+	.uleb128 0x5b
+	.4byte	.Ldebug_ranges0+0x1530
+	.uleb128 0x54
+	.4byte	0x120e9
+	.uleb128 0x58
+	.4byte	0x15e28
+	.8byte	.LBB1950
+	.4byte	.Ldebug_ranges0+0x1580
+	.byte	0x1
+	.2byte	0xb3d
+	.4byte	0xeba9
+	.uleb128 0x51
+	.4byte	0x15e50
+	.uleb128 0x51
+	.4byte	0x15e44
+	.uleb128 0x51
+	.4byte	0x15e39
+	.uleb128 0x5c
+	.4byte	0x15e5d
+	.8byte	.LBB1951
+	.4byte	.Ldebug_ranges0+0x1580
+	.byte	0xd
+	.2byte	0x49c
+	.uleb128 0x51
+	.4byte	0x15e91
+	.uleb128 0x51
+	.4byte	0x15e85
+	.uleb128 0x51
+	.4byte	0x15e79
+	.uleb128 0x51
+	.4byte	0x15e6e
+	.uleb128 0x5b
+	.4byte	.Ldebug_ranges0+0x1580
+	.uleb128 0x54
+	.4byte	0x15e9c
+	.uleb128 0x4b
+	.8byte	.LVL1023
+	.4byte	0x16c7e
+	.byte	0
+	.byte	0
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x15e28
+	.8byte	.LBB1962
+	.8byte	.LBE1962-.LBB1962
+	.byte	0x1
+	.2byte	0xb40
+	.4byte	0xec26
+	.uleb128 0x51
+	.4byte	0x15e50
+	.uleb128 0x51
+	.4byte	0x15e44
+	.uleb128 0x51
+	.4byte	0x15e39
+	.uleb128 0x5a
+	.4byte	0x15e5d
+	.8byte	.LBB1963
+	.8byte	.LBE1963-.LBB1963
+	.byte	0xd
+	.2byte	0x49c
+	.uleb128 0x51
+	.4byte	0x15e91
+	.uleb128 0x51
+	.4byte	0x15e85
+	.uleb128 0x51
+	.4byte	0x15e79
+	.uleb128 0x51
+	.4byte	0x15e6e
+	.uleb128 0x53
+	.8byte	.LBB1964
+	.8byte	.LBE1964-.LBB1964
+	.uleb128 0x54
+	.4byte	0x15e9c
+	.uleb128 0x4b
+	.8byte	.LVL1024
+	.4byte	0x16c7e
+	.byte	0
+	.byte	0
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x15e28
+	.8byte	.LBB1965
+	.8byte	.LBE1965-.LBB1965
+	.byte	0x1
+	.2byte	0xb43
+	.4byte	0xeca3
+	.uleb128 0x51
+	.4byte	0x15e50
+	.uleb128 0x51
+	.4byte	0x15e44
+	.uleb128 0x51
+	.4byte	0x15e39
+	.uleb128 0x5a
+	.4byte	0x15e5d
+	.8byte	.LBB1966
+	.8byte	.LBE1966-.LBB1966
+	.byte	0xd
+	.2byte	0x49c
+	.uleb128 0x51
+	.4byte	0x15e91
+	.uleb128 0x51
+	.4byte	0x15e85
+	.uleb128 0x51
+	.4byte	0x15e79
+	.uleb128 0x51
+	.4byte	0x15e6e
+	.uleb128 0x53
+	.8byte	.LBB1967
+	.8byte	.LBE1967-.LBB1967
+	.uleb128 0x54
+	.4byte	0x15e9c
+	.uleb128 0x4b
+	.8byte	.LVL1025
+	.4byte	0x16c7e
+	.byte	0
+	.byte	0
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x15e28
+	.8byte	.LBB1968
+	.8byte	.LBE1968-.LBB1968
+	.byte	0x1
+	.2byte	0xb46
+	.4byte	0xed20
+	.uleb128 0x51
+	.4byte	0x15e50
+	.uleb128 0x51
+	.4byte	0x15e44
+	.uleb128 0x51
+	.4byte	0x15e39
+	.uleb128 0x5a
+	.4byte	0x15e5d
+	.8byte	.LBB1969
+	.8byte	.LBE1969-.LBB1969
+	.byte	0xd
+	.2byte	0x49c
+	.uleb128 0x51
+	.4byte	0x15e91
+	.uleb128 0x51
+	.4byte	0x15e85
+	.uleb128 0x51
+	.4byte	0x15e79
+	.uleb128 0x51
+	.4byte	0x15e6e
+	.uleb128 0x53
+	.8byte	.LBB1970
+	.8byte	.LBE1970-.LBB1970
+	.uleb128 0x54
+	.4byte	0x15e9c
+	.uleb128 0x4b
+	.8byte	.LVL1026
+	.4byte	0x16c7e
+	.byte	0
+	.byte	0
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x15e28
+	.8byte	.LBB1971
+	.8byte	.LBE1971-.LBB1971
+	.byte	0x1
+	.2byte	0xb49
+	.4byte	0xed9d
+	.uleb128 0x51
+	.4byte	0x15e50
+	.uleb128 0x51
+	.4byte	0x15e44
+	.uleb128 0x51
+	.4byte	0x15e39
+	.uleb128 0x5a
+	.4byte	0x15e5d
+	.8byte	.LBB1972
+	.8byte	.LBE1972-.LBB1972
+	.byte	0xd
+	.2byte	0x49c
+	.uleb128 0x51
+	.4byte	0x15e91
+	.uleb128 0x51
+	.4byte	0x15e85
+	.uleb128 0x51
+	.4byte	0x15e79
+	.uleb128 0x51
+	.4byte	0x15e6e
+	.uleb128 0x53
+	.8byte	.LBB1973
+	.8byte	.LBE1973-.LBB1973
+	.uleb128 0x54
+	.4byte	0x15e9c
+	.uleb128 0x4b
+	.8byte	.LVL1027
+	.4byte	0x16c7e
+	.byte	0
+	.byte	0
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x15e28
+	.8byte	.LBB1974
+	.8byte	.LBE1974-.LBB1974
+	.byte	0x1
+	.2byte	0xb4c
+	.4byte	0xee1a
+	.uleb128 0x51
+	.4byte	0x15e50
+	.uleb128 0x51
+	.4byte	0x15e44
+	.uleb128 0x51
+	.4byte	0x15e39
+	.uleb128 0x5a
+	.4byte	0x15e5d
+	.8byte	.LBB1975
+	.8byte	.LBE1975-.LBB1975
+	.byte	0xd
+	.2byte	0x49c
+	.uleb128 0x51
+	.4byte	0x15e91
+	.uleb128 0x51
+	.4byte	0x15e85
+	.uleb128 0x51
+	.4byte	0x15e79
+	.uleb128 0x51
+	.4byte	0x15e6e
+	.uleb128 0x53
+	.8byte	.LBB1976
+	.8byte	.LBE1976-.LBB1976
+	.uleb128 0x54
+	.4byte	0x15e9c
+	.uleb128 0x4b
+	.8byte	.LVL1028
+	.4byte	0x16c7e
+	.byte	0
+	.byte	0
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x15e28
+	.8byte	.LBB1977
+	.8byte	.LBE1977-.LBB1977
+	.byte	0x1
+	.2byte	0xb4f
+	.4byte	0xee97
+	.uleb128 0x51
+	.4byte	0x15e50
+	.uleb128 0x51
+	.4byte	0x15e44
+	.uleb128 0x51
+	.4byte	0x15e39
+	.uleb128 0x5a
+	.4byte	0x15e5d
+	.8byte	.LBB1978
+	.8byte	.LBE1978-.LBB1978
+	.byte	0xd
+	.2byte	0x49c
+	.uleb128 0x51
+	.4byte	0x15e91
+	.uleb128 0x51
+	.4byte	0x15e85
+	.uleb128 0x51
+	.4byte	0x15e79
+	.uleb128 0x51
+	.4byte	0x15e6e
+	.uleb128 0x53
+	.8byte	.LBB1979
+	.8byte	.LBE1979-.LBB1979
+	.uleb128 0x54
+	.4byte	0x15e9c
+	.uleb128 0x4b
+	.8byte	.LVL1029
+	.4byte	0x16c7e
+	.byte	0
+	.byte	0
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x15e28
+	.8byte	.LBB1980
+	.8byte	.LBE1980-.LBB1980
+	.byte	0x1
+	.2byte	0xb52
+	.4byte	0xef14
+	.uleb128 0x51
+	.4byte	0x15e50
+	.uleb128 0x51
+	.4byte	0x15e44
+	.uleb128 0x51
+	.4byte	0x15e39
+	.uleb128 0x5a
+	.4byte	0x15e5d
+	.8byte	.LBB1981
+	.8byte	.LBE1981-.LBB1981
+	.byte	0xd
+	.2byte	0x49c
+	.uleb128 0x51
+	.4byte	0x15e91
+	.uleb128 0x51
+	.4byte	0x15e85
+	.uleb128 0x51
+	.4byte	0x15e79
+	.uleb128 0x51
+	.4byte	0x15e6e
+	.uleb128 0x53
+	.8byte	.LBB1982
+	.8byte	.LBE1982-.LBB1982
+	.uleb128 0x54
+	.4byte	0x15e9c
+	.uleb128 0x4b
+	.8byte	.LVL1030
+	.4byte	0x16c7e
+	.byte	0
+	.byte	0
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x15e28
+	.8byte	.LBB1983
+	.8byte	.LBE1983-.LBB1983
+	.byte	0x1
+	.2byte	0xb55
+	.4byte	0xef91
+	.uleb128 0x51
+	.4byte	0x15e50
+	.uleb128 0x51
+	.4byte	0x15e44
+	.uleb128 0x51
+	.4byte	0x15e39
+	.uleb128 0x5a
+	.4byte	0x15e5d
+	.8byte	.LBB1984
+	.8byte	.LBE1984-.LBB1984
+	.byte	0xd
+	.2byte	0x49c
+	.uleb128 0x51
+	.4byte	0x15e91
+	.uleb128 0x51
+	.4byte	0x15e85
+	.uleb128 0x51
+	.4byte	0x15e79
+	.uleb128 0x51
+	.4byte	0x15e6e
+	.uleb128 0x53
+	.8byte	.LBB1985
+	.8byte	.LBE1985-.LBB1985
+	.uleb128 0x54
+	.4byte	0x15e9c
+	.uleb128 0x4b
+	.8byte	.LVL1031
+	.4byte	0x16c7e
+	.byte	0
+	.byte	0
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x15e28
+	.8byte	.LBB1986
+	.8byte	.LBE1986-.LBB1986
+	.byte	0x1
+	.2byte	0xb58
+	.4byte	0xf00e
+	.uleb128 0x51
+	.4byte	0x15e50
+	.uleb128 0x51
+	.4byte	0x15e44
+	.uleb128 0x51
+	.4byte	0x15e39
+	.uleb128 0x5a
+	.4byte	0x15e5d
+	.8byte	.LBB1987
+	.8byte	.LBE1987-.LBB1987
+	.byte	0xd
+	.2byte	0x49c
+	.uleb128 0x51
+	.4byte	0x15e91
+	.uleb128 0x51
+	.4byte	0x15e85
+	.uleb128 0x51
+	.4byte	0x15e79
+	.uleb128 0x51
+	.4byte	0x15e6e
+	.uleb128 0x53
+	.8byte	.LBB1988
+	.8byte	.LBE1988-.LBB1988
+	.uleb128 0x54
+	.4byte	0x15e9c
+	.uleb128 0x4b
+	.8byte	.LVL1032
+	.4byte	0x16c7e
+	.byte	0
+	.byte	0
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x15e28
+	.8byte	.LBB1989
+	.8byte	.LBE1989-.LBB1989
+	.byte	0x1
+	.2byte	0xb5b
+	.4byte	0xf08b
+	.uleb128 0x51
+	.4byte	0x15e50
+	.uleb128 0x51
+	.4byte	0x15e44
+	.uleb128 0x51
+	.4byte	0x15e39
+	.uleb128 0x5a
+	.4byte	0x15e5d
+	.8byte	.LBB1990
+	.8byte	.LBE1990-.LBB1990
+	.byte	0xd
+	.2byte	0x49c
+	.uleb128 0x51
+	.4byte	0x15e91
+	.uleb128 0x51
+	.4byte	0x15e85
+	.uleb128 0x51
+	.4byte	0x15e79
+	.uleb128 0x51
+	.4byte	0x15e6e
+	.uleb128 0x53
+	.8byte	.LBB1991
+	.8byte	.LBE1991-.LBB1991
+	.uleb128 0x54
+	.4byte	0x15e9c
+	.uleb128 0x4b
+	.8byte	.LVL1033
+	.4byte	0x16c7e
+	.byte	0
+	.byte	0
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x15e28
+	.8byte	.LBB1992
+	.8byte	.LBE1992-.LBB1992
+	.byte	0x1
+	.2byte	0xb5e
+	.4byte	0xf108
+	.uleb128 0x51
+	.4byte	0x15e50
+	.uleb128 0x51
+	.4byte	0x15e44
+	.uleb128 0x51
+	.4byte	0x15e39
+	.uleb128 0x5a
+	.4byte	0x15e5d
+	.8byte	.LBB1993
+	.8byte	.LBE1993-.LBB1993
+	.byte	0xd
+	.2byte	0x49c
+	.uleb128 0x51
+	.4byte	0x15e91
+	.uleb128 0x51
+	.4byte	0x15e85
+	.uleb128 0x51
+	.4byte	0x15e79
+	.uleb128 0x51
+	.4byte	0x15e6e
+	.uleb128 0x53
+	.8byte	.LBB1994
+	.8byte	.LBE1994-.LBB1994
+	.uleb128 0x54
+	.4byte	0x15e9c
+	.uleb128 0x4b
+	.8byte	.LVL1034
+	.4byte	0x16c7e
+	.byte	0
+	.byte	0
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x15e28
+	.8byte	.LBB1995
+	.8byte	.LBE1995-.LBB1995
+	.byte	0x1
+	.2byte	0xb61
+	.4byte	0xf185
+	.uleb128 0x51
+	.4byte	0x15e50
+	.uleb128 0x51
+	.4byte	0x15e44
+	.uleb128 0x51
+	.4byte	0x15e39
+	.uleb128 0x5a
+	.4byte	0x15e5d
+	.8byte	.LBB1996
+	.8byte	.LBE1996-.LBB1996
+	.byte	0xd
+	.2byte	0x49c
+	.uleb128 0x51
+	.4byte	0x15e91
+	.uleb128 0x51
+	.4byte	0x15e85
+	.uleb128 0x51
+	.4byte	0x15e79
+	.uleb128 0x51
+	.4byte	0x15e6e
+	.uleb128 0x53
+	.8byte	.LBB1997
+	.8byte	.LBE1997-.LBB1997
+	.uleb128 0x54
+	.4byte	0x15e9c
+	.uleb128 0x4b
+	.8byte	.LVL1035
+	.4byte	0x16c7e
+	.byte	0
+	.byte	0
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x15e28
+	.8byte	.LBB1998
+	.8byte	.LBE1998-.LBB1998
+	.byte	0x1
+	.2byte	0xb64
+	.4byte	0xf202
+	.uleb128 0x51
+	.4byte	0x15e50
+	.uleb128 0x51
+	.4byte	0x15e44
+	.uleb128 0x51
+	.4byte	0x15e39
+	.uleb128 0x5a
+	.4byte	0x15e5d
+	.8byte	.LBB1999
+	.8byte	.LBE1999-.LBB1999
+	.byte	0xd
+	.2byte	0x49c
+	.uleb128 0x51
+	.4byte	0x15e91
+	.uleb128 0x51
+	.4byte	0x15e85
+	.uleb128 0x51
+	.4byte	0x15e79
+	.uleb128 0x51
+	.4byte	0x15e6e
+	.uleb128 0x53
+	.8byte	.LBB2000
+	.8byte	.LBE2000-.LBB2000
+	.uleb128 0x54
+	.4byte	0x15e9c
+	.uleb128 0x4b
+	.8byte	.LVL1036
+	.4byte	0x16c7e
+	.byte	0
+	.byte	0
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x15e28
+	.8byte	.LBB2001
+	.8byte	.LBE2001-.LBB2001
+	.byte	0x1
+	.2byte	0xb67
+	.4byte	0xf27f
+	.uleb128 0x51
+	.4byte	0x15e50
+	.uleb128 0x51
+	.4byte	0x15e44
+	.uleb128 0x51
+	.4byte	0x15e39
+	.uleb128 0x5a
+	.4byte	0x15e5d
+	.8byte	.LBB2002
+	.8byte	.LBE2002-.LBB2002
+	.byte	0xd
+	.2byte	0x49c
+	.uleb128 0x51
+	.4byte	0x15e91
+	.uleb128 0x51
+	.4byte	0x15e85
+	.uleb128 0x51
+	.4byte	0x15e79
+	.uleb128 0x51
+	.4byte	0x15e6e
+	.uleb128 0x53
+	.8byte	.LBB2003
+	.8byte	.LBE2003-.LBB2003
+	.uleb128 0x54
+	.4byte	0x15e9c
+	.uleb128 0x4b
+	.8byte	.LVL1037
+	.4byte	0x16c7e
+	.byte	0
+	.byte	0
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x15e28
+	.8byte	.LBB2004
+	.8byte	.LBE2004-.LBB2004
+	.byte	0x1
+	.2byte	0xb6a
+	.4byte	0xf2fc
+	.uleb128 0x51
+	.4byte	0x15e50
+	.uleb128 0x51
+	.4byte	0x15e44
+	.uleb128 0x51
+	.4byte	0x15e39
+	.uleb128 0x5a
+	.4byte	0x15e5d
+	.8byte	.LBB2005
+	.8byte	.LBE2005-.LBB2005
+	.byte	0xd
+	.2byte	0x49c
+	.uleb128 0x51
+	.4byte	0x15e91
+	.uleb128 0x51
+	.4byte	0x15e85
+	.uleb128 0x51
+	.4byte	0x15e79
+	.uleb128 0x51
+	.4byte	0x15e6e
+	.uleb128 0x53
+	.8byte	.LBB2006
+	.8byte	.LBE2006-.LBB2006
+	.uleb128 0x54
+	.4byte	0x15e9c
+	.uleb128 0x4b
+	.8byte	.LVL1038
+	.4byte	0x16c7e
+	.byte	0
+	.byte	0
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x15e28
+	.8byte	.LBB2007
+	.8byte	.LBE2007-.LBB2007
+	.byte	0x1
+	.2byte	0xb6d
+	.4byte	0xf379
+	.uleb128 0x51
+	.4byte	0x15e50
+	.uleb128 0x51
+	.4byte	0x15e44
+	.uleb128 0x51
+	.4byte	0x15e39
+	.uleb128 0x5a
+	.4byte	0x15e5d
+	.8byte	.LBB2008
+	.8byte	.LBE2008-.LBB2008
+	.byte	0xd
+	.2byte	0x49c
+	.uleb128 0x51
+	.4byte	0x15e91
+	.uleb128 0x51
+	.4byte	0x15e85
+	.uleb128 0x51
+	.4byte	0x15e79
+	.uleb128 0x51
+	.4byte	0x15e6e
+	.uleb128 0x53
+	.8byte	.LBB2009
+	.8byte	.LBE2009-.LBB2009
+	.uleb128 0x54
+	.4byte	0x15e9c
+	.uleb128 0x4b
+	.8byte	.LVL1039
+	.4byte	0x16c7e
+	.byte	0
+	.byte	0
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x15e28
+	.8byte	.LBB2010
+	.8byte	.LBE2010-.LBB2010
+	.byte	0x1
+	.2byte	0xb70
+	.4byte	0xf3f6
+	.uleb128 0x51
+	.4byte	0x15e50
+	.uleb128 0x51
+	.4byte	0x15e44
+	.uleb128 0x51
+	.4byte	0x15e39
+	.uleb128 0x5a
+	.4byte	0x15e5d
+	.8byte	.LBB2011
+	.8byte	.LBE2011-.LBB2011
+	.byte	0xd
+	.2byte	0x49c
+	.uleb128 0x51
+	.4byte	0x15e91
+	.uleb128 0x51
+	.4byte	0x15e85
+	.uleb128 0x51
+	.4byte	0x15e79
+	.uleb128 0x51
+	.4byte	0x15e6e
+	.uleb128 0x53
+	.8byte	.LBB2012
+	.8byte	.LBE2012-.LBB2012
+	.uleb128 0x54
+	.4byte	0x15e9c
+	.uleb128 0x4b
+	.8byte	.LVL1040
+	.4byte	0x16c7e
+	.byte	0
+	.byte	0
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x15e28
+	.8byte	.LBB2013
+	.8byte	.LBE2013-.LBB2013
+	.byte	0x1
+	.2byte	0xb73
+	.4byte	0xf473
+	.uleb128 0x51
+	.4byte	0x15e50
+	.uleb128 0x51
+	.4byte	0x15e44
+	.uleb128 0x51
+	.4byte	0x15e39
+	.uleb128 0x5a
+	.4byte	0x15e5d
+	.8byte	.LBB2014
+	.8byte	.LBE2014-.LBB2014
+	.byte	0xd
+	.2byte	0x49c
+	.uleb128 0x51
+	.4byte	0x15e91
+	.uleb128 0x51
+	.4byte	0x15e85
+	.uleb128 0x51
+	.4byte	0x15e79
+	.uleb128 0x51
+	.4byte	0x15e6e
+	.uleb128 0x53
+	.8byte	.LBB2015
+	.8byte	.LBE2015-.LBB2015
+	.uleb128 0x54
+	.4byte	0x15e9c
+	.uleb128 0x4b
+	.8byte	.LVL1041
+	.4byte	0x16c7e
+	.byte	0
+	.byte	0
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x15e28
+	.8byte	.LBB2016
+	.8byte	.LBE2016-.LBB2016
+	.byte	0x1
+	.2byte	0xb76
+	.4byte	0xf4f0
+	.uleb128 0x51
+	.4byte	0x15e50
+	.uleb128 0x51
+	.4byte	0x15e44
+	.uleb128 0x51
+	.4byte	0x15e39
+	.uleb128 0x5a
+	.4byte	0x15e5d
+	.8byte	.LBB2017
+	.8byte	.LBE2017-.LBB2017
+	.byte	0xd
+	.2byte	0x49c
+	.uleb128 0x51
+	.4byte	0x15e91
+	.uleb128 0x51
+	.4byte	0x15e85
+	.uleb128 0x51
+	.4byte	0x15e79
+	.uleb128 0x51
+	.4byte	0x15e6e
+	.uleb128 0x53
+	.8byte	.LBB2018
+	.8byte	.LBE2018-.LBB2018
+	.uleb128 0x54
+	.4byte	0x15e9c
+	.uleb128 0x4b
+	.8byte	.LVL1042
+	.4byte	0x16c7e
+	.byte	0
+	.byte	0
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x15e28
+	.8byte	.LBB2019
+	.8byte	.LBE2019-.LBB2019
+	.byte	0x1
+	.2byte	0xb79
+	.4byte	0xf56d
+	.uleb128 0x51
+	.4byte	0x15e50
+	.uleb128 0x51
+	.4byte	0x15e44
+	.uleb128 0x51
+	.4byte	0x15e39
+	.uleb128 0x5a
+	.4byte	0x15e5d
+	.8byte	.LBB2020
+	.8byte	.LBE2020-.LBB2020
+	.byte	0xd
+	.2byte	0x49c
+	.uleb128 0x51
+	.4byte	0x15e91
+	.uleb128 0x51
+	.4byte	0x15e85
+	.uleb128 0x51
+	.4byte	0x15e79
+	.uleb128 0x51
+	.4byte	0x15e6e
+	.uleb128 0x53
+	.8byte	.LBB2021
+	.8byte	.LBE2021-.LBB2021
+	.uleb128 0x54
+	.4byte	0x15e9c
+	.uleb128 0x4b
+	.8byte	.LVL1043
+	.4byte	0x16c7e
+	.byte	0
+	.byte	0
+	.byte	0
+	.uleb128 0x5a
+	.4byte	0x15e28
+	.8byte	.LBB2022
+	.8byte	.LBE2022-.LBB2022
+	.byte	0x1
+	.2byte	0xb7c
+	.uleb128 0x51
+	.4byte	0x15e50
+	.uleb128 0x51
+	.4byte	0x15e44
+	.uleb128 0x51
+	.4byte	0x15e39
+	.uleb128 0x5a
+	.4byte	0x15e5d
+	.8byte	.LBB2023
+	.8byte	.LBE2023-.LBB2023
+	.byte	0xd
+	.2byte	0x49c
+	.uleb128 0x51
+	.4byte	0x15e91
+	.uleb128 0x51
+	.4byte	0x15e85
+	.uleb128 0x51
+	.4byte	0x15e79
+	.uleb128 0x51
+	.4byte	0x15e6e
+	.uleb128 0x53
+	.8byte	.LBB2024
+	.8byte	.LBE2024-.LBB2024
+	.uleb128 0x54
+	.4byte	0x15e9c
+	.uleb128 0x4b
+	.8byte	.LVL1044
+	.4byte	0x16c7e
+	.byte	0
+	.byte	0
+	.byte	0
+	.byte	0
+	.byte	0
+	.uleb128 0x58
+	.4byte	0x10020
+	.8byte	.LBB2031
+	.4byte	.Ldebug_ranges0+0x15d0
+	.byte	0x1
+	.2byte	0xe90
+	.4byte	0xf6e1
+	.uleb128 0x51
+	.4byte	0x10031
+	.uleb128 0x5b
+	.4byte	.Ldebug_ranges0+0x15d0
+	.uleb128 0x5d
+	.4byte	0x1003d
+	.4byte	.LLST305
+	.uleb128 0x54
+	.4byte	0x10049
+	.uleb128 0x54
+	.4byte	0x10055
+	.uleb128 0x54
+	.4byte	0x10061
+	.uleb128 0x5e
+	.4byte	0x1006d
+	.uleb128 0x3
+	.byte	0x91
+	.sleb128 -104
+	.uleb128 0x54
+	.4byte	0x10077
+	.uleb128 0x54
+	.4byte	0x10083
+	.uleb128 0x54
+	.4byte	0x1008f
+	.uleb128 0x54
+	.4byte	0x10099
+	.uleb128 0x58
+	.4byte	0x15f3b
+	.8byte	.LBB2033
+	.4byte	.Ldebug_ranges0+0x1660
+	.byte	0x1
+	.2byte	0xd5e
+	.4byte	0xf65d
+	.uleb128 0x51
+	.4byte	0x15f4b
+	.byte	0
+	.uleb128 0x4b
+	.8byte	.LVL1046
+	.4byte	0x16c8a
+	.uleb128 0x4b
+	.8byte	.LVL1047
+	.4byte	0x16c96
+	.uleb128 0x4b
+	.8byte	.LVL1048
+	.4byte	0x16ca1
+	.uleb128 0x4b
+	.8byte	.LVL1049
+	.4byte	0x16cac
+	.uleb128 0x4b
+	.8byte	.LVL1050
+	.4byte	0x16cb7
+	.uleb128 0x4b
+	.8byte	.LVL1051
+	.4byte	0x16cb7
+	.uleb128 0x4b
+	.8byte	.LVL1126
+	.4byte	0x16cc1
+	.uleb128 0x4b
+	.8byte	.LVL1166
+	.4byte	0x16cc1
+	.uleb128 0x4b
+	.8byte	.LVL1177
+	.4byte	0x16cc1
+	.uleb128 0x4b
+	.8byte	.LVL1183
+	.4byte	0x16cc1
+	.byte	0
+	.byte	0
+	.uleb128 0x58
+	.4byte	0x100a6
+	.8byte	.LBB2045
+	.4byte	.Ldebug_ranges0+0x1690
+	.byte	0x1
+	.2byte	0xe97
+	.4byte	0xf7ba
+	.uleb128 0x51
+	.4byte	0x100b7
+	.uleb128 0x5b
+	.4byte	.Ldebug_ranges0+0x1690
+	.uleb128 0x54
+	.4byte	0x100c3
+	.uleb128 0x5d
+	.4byte	0x100cf
+	.4byte	.LLST306
+	.uleb128 0x54
+	.4byte	0x100db
+	.uleb128 0x5e
+	.4byte	0x100e7
+	.uleb128 0x3
+	.byte	0x91
+	.sleb128 -104
+	.uleb128 0x5d
+	.4byte	0x100f1
+	.4byte	.LLST307
+	.uleb128 0x54
+	.4byte	0x100fd
+	.uleb128 0x54
+	.4byte	0x10109
+	.uleb128 0x58
+	.4byte	0x15f3b
+	.8byte	.LBB2047
+	.4byte	.Ldebug_ranges0+0x16f0
+	.byte	0x1
+	.2byte	0xd28
+	.4byte	0xf750
+	.uleb128 0x51
+	.4byte	0x15f4b
+	.byte	0
+	.uleb128 0x4b
+	.8byte	.LVL1053
+	.4byte	0x16c8a
+	.uleb128 0x4b
+	.8byte	.LVL1054
+	.4byte	0x16c96
+	.uleb128 0x4b
+	.8byte	.LVL1065
+	.4byte	0x16ca1
+	.uleb128 0x4b
+	.8byte	.LVL1066
+	.4byte	0x16ccd
+	.uleb128 0x4b
+	.8byte	.LVL1162
+	.4byte	0x16cc1
+	.uleb128 0x4b
+	.8byte	.LVL1163
+	.4byte	0x16cd8
+	.uleb128 0x4b
+	.8byte	.LVL1164
+	.4byte	0x16cc1
+	.uleb128 0x4b
+	.8byte	.LVL1194
+	.4byte	0x16cc1
+	.byte	0
+	.byte	0
+	.uleb128 0x58
+	.4byte	0xffe8
+	.8byte	.LBB2056
+	.4byte	.Ldebug_ranges0+0x1720
+	.byte	0x1
+	.2byte	0xe9e
+	.4byte	0xf976
+	.uleb128 0x51
+	.4byte	0xfff9
+	.uleb128 0x5b
+	.4byte	.Ldebug_ranges0+0x1720
+	.uleb128 0x5e
+	.4byte	0x10005
+	.uleb128 0x3
+	.byte	0x91
+	.sleb128 -104
+	.uleb128 0x50
+	.4byte	0x1617e
+	.8byte	.LBB2058
+	.8byte	.LBE2058-.LBB2058
+	.byte	0x1
+	.2byte	0xd98
+	.4byte	0xf830
+	.uleb128 0x51
+	.4byte	0x16193
+	.uleb128 0x51
+	.4byte	0x1618a
+	.uleb128 0x53
+	.8byte	.LBB2059
+	.8byte	.LBE2059-.LBB2059
+	.uleb128 0x5d
+	.4byte	0x1619c
+	.4byte	.LLST308
+	.uleb128 0x5d
+	.4byte	0x161a6
+	.4byte	.LLST309
+	.byte	0
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x1617e
+	.8byte	.LBB2060
+	.8byte	.LBE2060-.LBB2060
+	.byte	0x1
+	.2byte	0xda1
+	.4byte	0xf87b
+	.uleb128 0x51
+	.4byte	0x16193
+	.uleb128 0x51
+	.4byte	0x1618a
+	.uleb128 0x53
+	.8byte	.LBB2061
+	.8byte	.LBE2061-.LBB2061
+	.uleb128 0x5d
+	.4byte	0x1619c
+	.4byte	.LLST310
+	.uleb128 0x5d
+	.4byte	0x161a6
+	.4byte	.LLST311
+	.byte	0
+	.byte	0
+	.uleb128 0x5f
+	.8byte	.LBB2062
+	.8byte	.LBE2062-.LBB2062
+	.4byte	0xf8b4
+	.uleb128 0x5d
+	.4byte	0x10012
+	.4byte	.LLST312
+	.uleb128 0x4b
+	.8byte	.LVL1080
+	.4byte	0x16ce3
+	.uleb128 0x4b
+	.8byte	.LVL1082
+	.4byte	0x16cee
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x1617e
+	.8byte	.LBB2063
+	.8byte	.LBE2063-.LBB2063
+	.byte	0x1
+	.2byte	0xdac
+	.4byte	0xf8ff
+	.uleb128 0x51
+	.4byte	0x16193
+	.uleb128 0x51
+	.4byte	0x1618a
+	.uleb128 0x53
+	.8byte	.LBB2064
+	.8byte	.LBE2064-.LBB2064
+	.uleb128 0x5d
+	.4byte	0x1619c
+	.4byte	.LLST313
+	.uleb128 0x5d
+	.4byte	0x161a6
+	.4byte	.LLST314
+	.byte	0
+	.byte	0
+	.uleb128 0x4b
+	.8byte	.LVL1067
+	.4byte	0x16ce3
+	.uleb128 0x4b
+	.8byte	.LVL1068
+	.4byte	0x16cfa
+	.uleb128 0x4b
+	.8byte	.LVL1073
+	.4byte	0x16ce3
+	.uleb128 0x4b
+	.8byte	.LVL1074
+	.4byte	0x16cfa
+	.uleb128 0x4b
+	.8byte	.LVL1079
+	.4byte	0x16c5b
+	.uleb128 0x4b
+	.8byte	.LVL1083
+	.4byte	0x16cfa
+	.uleb128 0x4b
+	.8byte	.LVL1168
+	.4byte	0x16cc1
+	.uleb128 0x4b
+	.8byte	.LVL1171
+	.4byte	0x16cc1
+	.uleb128 0x4b
+	.8byte	.LVL1175
+	.4byte	0x16cc1
+	.byte	0
+	.byte	0
+	.uleb128 0x50
+	.4byte	0xffce
+	.8byte	.LBB2068
+	.8byte	.LBE2068-.LBB2068
+	.byte	0x1
+	.2byte	0xea5
+	.4byte	0xfa10
+	.uleb128 0x51
+	.4byte	0xffdb
+	.uleb128 0x58
+	.4byte	0x15b6e
+	.8byte	.LBB2070
+	.4byte	.Ldebug_ranges0+0x1770
+	.byte	0x1
+	.2byte	0xdc4
+	.4byte	0xf9db
+	.uleb128 0x51
+	.4byte	0x15b90
+	.uleb128 0x51
+	.4byte	0x15b85
+	.uleb128 0x51
+	.4byte	0x15b7a
+	.uleb128 0x5b
+	.4byte	.Ldebug_ranges0+0x1770
+	.uleb128 0x5d
+	.4byte	0x15b9b
+	.4byte	.LLST315
+	.uleb128 0x4b
+	.8byte	.LVL1089
+	.4byte	0x16d06
+	.byte	0
+	.byte	0
+	.uleb128 0x4b
+	.8byte	.LVL1090
+	.4byte	0x16d11
+	.uleb128 0x4b
+	.8byte	.LVL1091
+	.4byte	0x16d1c
+	.uleb128 0x4b
+	.8byte	.LVL1092
+	.4byte	0x16d11
+	.uleb128 0x4b
+	.8byte	.LVL1093
+	.4byte	0x16d1c
+	.byte	0
+	.uleb128 0x58
+	.4byte	0xfee4
+	.8byte	.LBB2074
+	.4byte	.Ldebug_ranges0+0x17a0
+	.byte	0x1
+	.2byte	0xea8
+	.4byte	0xfd19
+	.uleb128 0x51
+	.4byte	0xff01
+	.uleb128 0x51
+	.4byte	0xfef5
+	.uleb128 0x5b
+	.4byte	.Ldebug_ranges0+0x17a0
+	.uleb128 0x54
+	.4byte	0xff0d
+	.uleb128 0x5d
+	.4byte	0xff19
+	.4byte	.LLST316
+	.uleb128 0x5d
+	.4byte	0xff25
+	.4byte	.LLST317
+	.uleb128 0x5d
+	.4byte	0xff31
+	.4byte	.LLST318
+	.uleb128 0x5d
+	.4byte	0xff3d
+	.4byte	.LLST319
+	.uleb128 0x5d
+	.4byte	0xff49
+	.4byte	.LLST320
+	.uleb128 0x5d
+	.4byte	0xff55
+	.4byte	.LLST321
+	.uleb128 0x54
+	.4byte	0xff61
+	.uleb128 0x5d
+	.4byte	0xff6d
+	.4byte	.LLST322
+	.uleb128 0x5d
+	.4byte	0xff79
+	.4byte	.LLST323
+	.uleb128 0x50
+	.4byte	0x12176
+	.8byte	.LBB2076
+	.8byte	.LBE2076-.LBB2076
+	.byte	0x1
+	.2byte	0xe08
+	.4byte	0xfaf2
+	.uleb128 0x51
+	.4byte	0x12187
+	.uleb128 0x51
+	.4byte	0x12187
+	.uleb128 0x53
+	.8byte	.LBB2077
+	.8byte	.LBE2077-.LBB2077
+	.uleb128 0x5d
+	.4byte	0x12193
+	.4byte	.LLST324
+	.uleb128 0x4b
+	.8byte	.LVL1108
+	.4byte	0x16d27
+	.uleb128 0x4b
+	.8byte	.LVL1110
+	.4byte	0x16d32
+	.uleb128 0x4b
+	.8byte	.LVL1111
+	.4byte	0x16d3d
+	.byte	0
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x15ceb
+	.8byte	.LBB2078
+	.8byte	.LBE2078-.LBB2078
+	.byte	0x1
+	.2byte	0xdee
+	.4byte	0xfb49
+	.uleb128 0x51
+	.4byte	0x15d08
+	.uleb128 0x51
+	.4byte	0x15cfc
+	.uleb128 0x5a
+	.4byte	0x15d15
+	.8byte	.LBB2079
+	.8byte	.LBE2079-.LBB2079
+	.byte	0x10
+	.2byte	0x2e7
+	.uleb128 0x51
+	.4byte	0x15d32
+	.uleb128 0x51
+	.4byte	0x15d26
+	.uleb128 0x4b
+	.8byte	.LVL1132
+	.4byte	0x16d48
+	.byte	0
+	.byte	0
+	.uleb128 0x58
+	.4byte	0xff86
+	.8byte	.LBB2081
+	.4byte	.Ldebug_ranges0+0x17f0
+	.byte	0x1
+	.2byte	0xe0e
+	.4byte	0xfb89
+	.uleb128 0x51
+	.4byte	0xffab
+	.uleb128 0x60
+	.4byte	0xff9f
+	.4byte	.LLST325
+	.uleb128 0x51
+	.4byte	0xff93
+	.uleb128 0x5b
+	.4byte	.Ldebug_ranges0+0x17f0
+	.uleb128 0x54
+	.4byte	0xffb7
+	.uleb128 0x5d
+	.4byte	0xffc1
+	.4byte	.LLST326
+	.byte	0
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x15ceb
+	.8byte	.LBB2085
+	.8byte	.LBE2085-.LBB2085
+	.byte	0x1
+	.2byte	0xdfc
+	.4byte	0xfbe0
+	.uleb128 0x51
+	.4byte	0x15d08
+	.uleb128 0x51
+	.4byte	0x15cfc
+	.uleb128 0x5a
+	.4byte	0x15d15
+	.8byte	.LBB2086
+	.8byte	.LBE2086-.LBB2086
+	.byte	0x10
+	.2byte	0x2e7
+	.uleb128 0x51
+	.4byte	0x15d32
+	.uleb128 0x51
+	.4byte	0x15d26
+	.uleb128 0x4b
+	.8byte	.LVL1147
+	.4byte	0x16d48
+	.byte	0
+	.byte	0
+	.uleb128 0x58
+	.4byte	0xff86
+	.8byte	.LBB2088
+	.4byte	.Ldebug_ranges0+0x1820
+	.byte	0x1
+	.2byte	0xe1c
+	.4byte	0xfc20
+	.uleb128 0x51
+	.4byte	0xffab
+	.uleb128 0x60
+	.4byte	0xff9f
+	.4byte	.LLST327
+	.uleb128 0x51
+	.4byte	0xff93
+	.uleb128 0x5b
+	.4byte	.Ldebug_ranges0+0x1820
+	.uleb128 0x54
+	.4byte	0xffb7
+	.uleb128 0x5d
+	.4byte	0xffc1
+	.4byte	.LLST328
+	.byte	0
+	.byte	0
+	.uleb128 0x4b
+	.8byte	.LVL1095
+	.4byte	0x16d54
+	.uleb128 0x4b
+	.8byte	.LVL1097
+	.4byte	0x16d54
+	.uleb128 0x4b
+	.8byte	.LVL1099
+	.4byte	0x16d5f
+	.uleb128 0x4b
+	.8byte	.LVL1103
+	.4byte	0x16d5f
+	.uleb128 0x4b
+	.8byte	.LVL1106
+	.4byte	0x16c5b
+	.uleb128 0x4b
+	.8byte	.LVL1107
+	.4byte	0x16d6b
+	.uleb128 0x4b
+	.8byte	.LVL1112
+	.4byte	0x16d76
+	.uleb128 0x4b
+	.8byte	.LVL1113
+	.4byte	0x16d76
+	.uleb128 0x4b
+	.8byte	.LVL1129
+	.4byte	0x16d81
+	.uleb128 0x4b
+	.8byte	.LVL1131
+	.4byte	0x16c5b
+	.uleb128 0x4b
+	.8byte	.LVL1136
+	.4byte	0x16d8c
+	.uleb128 0x4b
+	.8byte	.LVL1139
+	.4byte	0x16d27
+	.uleb128 0x4b
+	.8byte	.LVL1144
+	.4byte	0x16d3d
+	.uleb128 0x4b
+	.8byte	.LVL1146
+	.4byte	0x16c5b
+	.uleb128 0x4b
+	.8byte	.LVL1150
+	.4byte	0x16d8c
+	.uleb128 0x4b
+	.8byte	.LVL1153
+	.4byte	0x16d27
+	.uleb128 0x4b
+	.8byte	.LVL1157
+	.4byte	0x16d3d
+	.uleb128 0x4b
+	.8byte	.LVL1189
+	.4byte	0x16cc1
+	.uleb128 0x4b
+	.8byte	.LVL1192
+	.4byte	0x16cc1
+	.byte	0
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x15dbf
+	.8byte	.LBB2095
+	.8byte	.LBE2095-.LBB2095
+	.byte	0x1
+	.2byte	0xeaa
+	.4byte	0xfd62
+	.uleb128 0x51
+	.4byte	0x15dd6
+	.uleb128 0x51
+	.4byte	0x15dcb
+	.uleb128 0x59
+	.4byte	0x15ec1
+	.8byte	.LBB2096
+	.8byte	.LBE2096-.LBB2096
+	.byte	0xbd
+	.byte	0xe1
+	.uleb128 0x51
+	.4byte	0x15eda
+	.uleb128 0x51
+	.4byte	0x15ece
+	.byte	0
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x1012c
+	.8byte	.LBB2098
+	.8byte	.LBE2098-.LBB2098
+	.byte	0x1
+	.2byte	0xead
+	.4byte	0xfe06
+	.uleb128 0x51
+	.4byte	0x1013d
+	.uleb128 0x4b
+	.8byte	.LVL1114
+	.4byte	0x16d96
+	.uleb128 0x4b
+	.8byte	.LVL1115
+	.4byte	0x16d96
+	.uleb128 0x4b
+	.8byte	.LVL1116
+	.4byte	0x16da1
+	.uleb128 0x4b
+	.8byte	.LVL1117
+	.4byte	0x16da1
+	.uleb128 0x4b
+	.8byte	.LVL1118
+	.4byte	0x16da1
+	.uleb128 0x4b
+	.8byte	.LVL1119
+	.4byte	0x16da1
+	.uleb128 0x4b
+	.8byte	.LVL1120
+	.4byte	0x16da1
+	.uleb128 0x4b
+	.8byte	.LVL1121
+	.4byte	0x16da1
+	.uleb128 0x4b
+	.8byte	.LVL1122
+	.4byte	0x16da1
+	.uleb128 0x4b
+	.8byte	.LVL1123
+	.4byte	0x16da1
+	.byte	0
+	.uleb128 0x4b
+	.8byte	.LVL999
+	.4byte	0x16c8a
+	.uleb128 0x4b
+	.8byte	.LVL1000
+	.4byte	0x16dad
+	.uleb128 0x4b
+	.8byte	.LVL1002
+	.4byte	0x16db8
+	.uleb128 0x4b
+	.8byte	.LVL1008
+	.4byte	0x16dc4
+	.uleb128 0x4b
+	.8byte	.LVL1011
+	.4byte	0x16dd0
+	.uleb128 0x4b
+	.8byte	.LVL1012
+	.4byte	0x16cc1
+	.uleb128 0x4b
+	.8byte	.LVL1020
+	.4byte	0x16c5b
+	.uleb128 0x4b
+	.8byte	.LVL1055
+	.4byte	0x16cc1
+	.uleb128 0x4b
+	.8byte	.LVL1057
+	.4byte	0x16cc1
+	.uleb128 0x4b
+	.8byte	.LVL1060
+	.4byte	0x16cc1
+	.uleb128 0x4b
+	.8byte	.LVL1062
+	.4byte	0x16cc1
+	.uleb128 0x4b
+	.8byte	.LVL1124
+	.4byte	0x16c5b
+	.uleb128 0x4b
+	.8byte	.LVL1127
+	.4byte	0x16cc1
+	.uleb128 0x4b
+	.8byte	.LVL1160
+	.4byte	0x16cc1
+	.uleb128 0x4b
+	.8byte	.LVL1169
+	.4byte	0x16cc1
+	.uleb128 0x4b
+	.8byte	.LVL1179
+	.4byte	0x16cc1
+	.uleb128 0x4b
+	.8byte	.LVL1185
+	.4byte	0x16ddc
+	.byte	0
+	.uleb128 0x61
+	.4byte	.LASF3045
+	.byte	0x1
+	.2byte	0xddc
+	.4byte	0xc6
+	.byte	0x1
+	.4byte	0xff86
+	.uleb128 0x62
+	.string	"ebc"
+	.byte	0x1
+	.2byte	0xddc
+	.4byte	0xe4d7
+	.uleb128 0x63
+	.4byte	.LASF2992
+	.byte	0x1
+	.2byte	0xddc
+	.4byte	0xe0e4
+	.uleb128 0x43
+	.4byte	.LASF2943
+	.byte	0x1
+	.2byte	0xdde
+	.4byte	0xe81f
+	.uleb128 0x43
+	.4byte	.LASF3032
+	.byte	0x1
+	.2byte	0xddf
+	.4byte	0x6d
+	.uleb128 0x43
+	.4byte	.LASF3033
+	.byte	0x1
+	.2byte	0xde0
+	.4byte	0x6d
+	.uleb128 0x43
+	.4byte	.LASF3034
+	.byte	0x1
+	.2byte	0xde1
+	.4byte	0xc6
+	.uleb128 0x43
+	.4byte	.LASF3035
+	.byte	0x1
+	.2byte	0xde2
+	.4byte	0xc6
+	.uleb128 0x43
+	.4byte	.LASF3036
+	.byte	0x1
+	.2byte	0xde3
+	.4byte	0x21e
+	.uleb128 0x43
+	.4byte	.LASF3037
+	.byte	0x1
+	.2byte	0xde4
+	.4byte	0x21e
+	.uleb128 0x4f
+	.string	"buf"
+	.byte	0x1
+	.2byte	0xde5
+	.4byte	0xe472
+	.uleb128 0x43
+	.4byte	.LASF3038
+	.byte	0x1
+	.2byte	0xde6
+	.4byte	0x458
+	.uleb128 0x43
+	.4byte	.LASF3039
+	.byte	0x1
+	.2byte	0xde7
+	.4byte	0x458
+	.byte	0
+	.uleb128 0x64
+	.4byte	.LASF3043
+	.byte	0x1
+	.2byte	0xdd0
+	.byte	0x1
+	.4byte	0xffce
+	.uleb128 0x63
+	.4byte	.LASF3040
+	.byte	0x1
+	.2byte	0xdd0
+	.4byte	0xbfee
+	.uleb128 0x63
+	.4byte	.LASF3041
+	.byte	0x1
+	.2byte	0xdd0
+	.4byte	0xbfee
+	.uleb128 0x63
+	.4byte	.LASF957
+	.byte	0x1
+	.2byte	0xdd0
+	.4byte	0xc6
+	.uleb128 0x4f
+	.string	"i"
+	.byte	0x1
+	.2byte	0xdd2
+	.4byte	0xc6
+	.uleb128 0x43
+	.4byte	.LASF3042
+	.byte	0x1
+	.2byte	0xdd3
+	.4byte	0x110
+	.byte	0
+	.uleb128 0x64
+	.4byte	.LASF3044
+	.byte	0x1
+	.2byte	0xdb1
+	.byte	0x1
+	.4byte	0xffe8
+	.uleb128 0x63
+	.4byte	.LASF2943
+	.byte	0x1
+	.2byte	0xdb1
+	.4byte	0xe81f
+	.byte	0
+	.uleb128 0x61
+	.4byte	.LASF3046
+	.byte	0x1
+	.2byte	0xd8e
+	.4byte	0xc6
+	.byte	0x1
+	.4byte	0x10020
+	.uleb128 0x63
+	.4byte	.LASF2943
+	.byte	0x1
+	.2byte	0xd8e
+	.4byte	0xe81f
+	.uleb128 0x43
+	.4byte	.LASF2434
+	.byte	0x1
+	.2byte	0xd90
+	.4byte	0xd740
+	.uleb128 0x65
+	.uleb128 0x4f
+	.string	"__k"
+	.byte	0x1
+	.2byte	0xda6
+	.4byte	0x2eff
+	.byte	0
+	.byte	0
+	.uleb128 0x61
+	.4byte	.LASF3047
+	.byte	0x1
+	.2byte	0xd41
+	.4byte	0xc6
+	.byte	0x1
+	.4byte	0x100a6
+	.uleb128 0x62
+	.string	"ebc"
+	.byte	0x1
+	.2byte	0xd41
+	.4byte	0xe4d7
+	.uleb128 0x4f
+	.string	"dev"
+	.byte	0x1
+	.2byte	0xd43
+	.4byte	0xa496
+	.uleb128 0x43
+	.4byte	.LASF2992
+	.byte	0x1
+	.2byte	0xd44
+	.4byte	0xe0e4
+	.uleb128 0x43
+	.4byte	.LASF2943
+	.byte	0x1
+	.2byte	0xd45
+	.4byte	0xe81f
+	.uleb128 0x43
+	.4byte	.LASF3048
+	.byte	0x1
+	.2byte	0xd46
+	.4byte	0xb7ba
+	.uleb128 0x4f
+	.string	"r"
+	.byte	0x1
+	.2byte	0xd47
+	.4byte	0x9672
+	.uleb128 0x43
+	.4byte	.LASF3049
+	.byte	0x1
+	.2byte	0xd48
+	.4byte	0xc6
+	.uleb128 0x4f
+	.string	"ret"
+	.byte	0x1
+	.2byte	0xd49
+	.4byte	0xc6
+	.uleb128 0x4f
+	.string	"i"
+	.byte	0x1
+	.2byte	0xd49
+	.4byte	0xc6
+	.uleb128 0x43
+	.4byte	.LASF3050
+	.byte	0x1
+	.2byte	0xd4a
+	.4byte	0xc6
+	.byte	0
+	.uleb128 0x61
+	.4byte	.LASF3051
+	.byte	0x1
+	.2byte	0xd15
+	.4byte	0xc6
+	.byte	0x1
+	.4byte	0x10117
+	.uleb128 0x63
+	.4byte	.LASF2943
+	.byte	0x1
+	.2byte	0xd15
+	.4byte	0xe81f
+	.uleb128 0x4f
+	.string	"ret"
+	.byte	0x1
+	.2byte	0xd17
+	.4byte	0xc6
+	.uleb128 0x4f
+	.string	"dev"
+	.byte	0x1
+	.2byte	0xd18
+	.4byte	0xa496
+	.uleb128 0x43
+	.4byte	.LASF3048
+	.byte	0x1
+	.2byte	0xd19
+	.4byte	0xb7ba
+	.uleb128 0x4f
+	.string	"r"
+	.byte	0x1
+	.2byte	0xd1a
+	.4byte	0x9672
+	.uleb128 0x43
+	.4byte	.LASF2950
+	.byte	0x1
+	.2byte	0xd1b
+	.4byte	0x29
+	.uleb128 0x43
+	.4byte	.LASF2951
+	.byte	0x1
+	.2byte	0xd1c
+	.4byte	0xc6
+	.uleb128 0x66
+	.4byte	.LASF3024
+	.4byte	0x10127
+	.4byte	.LASF3051
+	.byte	0
+	.uleb128 0x5
+	.4byte	0x68
+	.4byte	0x10127
+	.uleb128 0x6
+	.4byte	0x4f
+	.byte	0x12
+	.byte	0
+	.uleb128 0x3
+	.4byte	0x10117
+	.uleb128 0x61
+	.4byte	.LASF3052
+	.byte	0x1
+	.2byte	0xd04
+	.4byte	0xc6
+	.byte	0x1
+	.4byte	0x1014a
+	.uleb128 0x63
+	.4byte	.LASF2943
+	.byte	0x1
+	.2byte	0xd04
+	.4byte	0xe81f
+	.byte	0
+	.uleb128 0x61
+	.4byte	.LASF3053
+	.byte	0x1
+	.2byte	0xcf1
+	.4byte	0x2ee
+	.byte	0x1
+	.4byte	0x101a2
+	.uleb128 0x63
+	.4byte	.LASF2168
+	.byte	0x1
+	.2byte	0xcf1
+	.4byte	0xa496
+	.uleb128 0x63
+	.4byte	.LASF2083
+	.byte	0x1
+	.2byte	0xcf2
+	.4byte	0xb311
+	.uleb128 0x62
+	.string	"buf"
+	.byte	0x1
+	.2byte	0xcf3
+	.4byte	0x21e
+	.uleb128 0x43
+	.4byte	.LASF2992
+	.byte	0x1
+	.2byte	0xcf5
+	.4byte	0xe0e4
+	.uleb128 0x43
+	.4byte	.LASF2943
+	.byte	0x1
+	.2byte	0xcf6
+	.4byte	0xe81f
+	.uleb128 0x4f
+	.string	"i"
+	.byte	0x1
+	.2byte	0xcf7
+	.4byte	0xc6
+	.byte	0
+	.uleb128 0x4c
+	.4byte	.LASF3054
+	.byte	0x1
+	.2byte	0xce8
+	.4byte	0x2ee
+	.8byte	.LFB2861
+	.8byte	.LFE2861-.LFB2861
+	.uleb128 0x1
+	.byte	0x9c
+	.4byte	0x10202
+	.uleb128 0x55
+	.4byte	.LASF2168
+	.byte	0x1
+	.2byte	0xce8
+	.4byte	0xa496
+	.4byte	.LLST211
+	.uleb128 0x55
+	.4byte	.LASF2083
+	.byte	0x1
+	.2byte	0xce9
+	.4byte	0xb311
+	.4byte	.LLST212
+	.uleb128 0x4e
+	.string	"buf"
+	.byte	0x1
+	.2byte	0xcea
+	.4byte	0x21e
+	.4byte	.LLST213
+	.uleb128 0x4b
+	.8byte	.LVL698
+	.4byte	0x16de6
+	.byte	0
+	.uleb128 0x4c
+	.4byte	.LASF3055
+	.byte	0x1
+	.2byte	0xcdf
+	.4byte	0x2ee
+	.8byte	.LFB2860
+	.8byte	.LFE2860-.LFB2860
+	.uleb128 0x1
+	.byte	0x9c
+	.4byte	0x10262
+	.uleb128 0x55
+	.4byte	.LASF2168
+	.byte	0x1
+	.2byte	0xcdf
+	.4byte	0xa496
+	.4byte	.LLST196
+	.uleb128 0x55
+	.4byte	.LASF2083
+	.byte	0x1
+	.2byte	0xce0
+	.4byte	0xb311
+	.4byte	.LLST197
+	.uleb128 0x4e
+	.string	"buf"
+	.byte	0x1
+	.2byte	0xce1
+	.4byte	0x21e
+	.4byte	.LLST198
+	.uleb128 0x4b
+	.8byte	.LVL670
+	.4byte	0x16df1
+	.byte	0
+	.uleb128 0x4c
+	.4byte	.LASF3056
+	.byte	0x1
+	.2byte	0xcd6
+	.4byte	0x2ee
+	.8byte	.LFB2859
+	.8byte	.LFE2859-.LFB2859
+	.uleb128 0x1
+	.byte	0x9c
+	.4byte	0x102c2
+	.uleb128 0x55
+	.4byte	.LASF2168
+	.byte	0x1
+	.2byte	0xcd6
+	.4byte	0xa496
+	.4byte	.LLST199
+	.uleb128 0x55
+	.4byte	.LASF2083
+	.byte	0x1
+	.2byte	0xcd7
+	.4byte	0xb311
+	.4byte	.LLST200
+	.uleb128 0x4e
+	.string	"buf"
+	.byte	0x1
+	.2byte	0xcd8
+	.4byte	0x21e
+	.4byte	.LLST201
+	.uleb128 0x4b
+	.8byte	.LVL675
+	.4byte	0x16df1
+	.byte	0
+	.uleb128 0x4c
+	.4byte	.LASF3057
+	.byte	0x1
+	.2byte	0xcbe
+	.4byte	0x2ee
+	.8byte	.LFB2858
+	.8byte	.LFE2858-.LFB2858
+	.uleb128 0x1
+	.byte	0x9c
+	.4byte	0x10392
+	.uleb128 0x55
+	.4byte	.LASF2168
+	.byte	0x1
+	.2byte	0xcbe
+	.4byte	0xa496
+	.4byte	.LLST214
+	.uleb128 0x55
+	.4byte	.LASF2083
+	.byte	0x1
+	.2byte	0xcbf
+	.4byte	0xb311
+	.4byte	.LLST215
+	.uleb128 0x4e
+	.string	"buf"
+	.byte	0x1
+	.2byte	0xcc0
+	.4byte	0x56
+	.4byte	.LLST216
+	.uleb128 0x55
+	.4byte	.LASF383
+	.byte	0x1
+	.2byte	0xcc0
+	.4byte	0x2e3
+	.4byte	.LLST217
+	.uleb128 0x57
+	.string	"ebc"
+	.byte	0x1
+	.2byte	0xcc2
+	.4byte	0xe4d7
+	.4byte	.LLST218
+	.uleb128 0x56
+	.4byte	.LASF2424
+	.byte	0x1
+	.2byte	0xcc3
+	.4byte	0xc6
+	.4byte	.LLST219
+	.uleb128 0x4f
+	.string	"ret"
+	.byte	0x1
+	.2byte	0xcc3
+	.4byte	0xc6
+	.uleb128 0x4b
+	.8byte	.LVL704
+	.4byte	0x16dfd
+	.uleb128 0x4b
+	.8byte	.LVL706
+	.4byte	0x16e09
+	.uleb128 0x4b
+	.8byte	.LVL711
+	.4byte	0x16cc1
+	.uleb128 0x4b
+	.8byte	.LVL714
+	.4byte	0x16cc1
+	.uleb128 0x4b
+	.8byte	.LVL715
+	.4byte	0x16ddc
+	.byte	0
+	.uleb128 0x4d
+	.4byte	.LASF3058
+	.byte	0x1
+	.2byte	0xcb2
+	.4byte	0x2ee
+	.8byte	.LFB2857
+	.8byte	.LFE2857-.LFB2857
+	.uleb128 0x1
+	.byte	0x9c
+	.4byte	0x1042c
+	.uleb128 0x55
+	.4byte	.LASF2168
+	.byte	0x1
+	.2byte	0xcb2
+	.4byte	0xa496
+	.4byte	.LLST202
+	.uleb128 0x55
+	.4byte	.LASF2083
+	.byte	0x1
+	.2byte	0xcb3
+	.4byte	0xb311
+	.4byte	.LLST203
+	.uleb128 0x4e
+	.string	"buf"
+	.byte	0x1
+	.2byte	0xcb4
+	.4byte	0x21e
+	.4byte	.LLST204
+	.uleb128 0x4f
+	.string	"ebc"
+	.byte	0x1
+	.2byte	0xcb6
+	.4byte	0xe4d7
+	.uleb128 0x43
+	.4byte	.LASF2424
+	.byte	0x1
+	.2byte	0xcb7
+	.4byte	0xc6
+	.uleb128 0x50
+	.4byte	0x15a97
+	.8byte	.LBB1588
+	.8byte	.LBE1588-.LBB1588
+	.byte	0x1
+	.2byte	0xcb9
+	.4byte	0x1041e
+	.uleb128 0x51
+	.4byte	0x15aa7
+	.byte	0
+	.uleb128 0x4b
+	.8byte	.LVL680
+	.4byte	0x16df1
+	.byte	0
+	.uleb128 0x4d
+	.4byte	.LASF3059
+	.byte	0x1
+	.2byte	0xca4
+	.4byte	0x2ee
+	.8byte	.LFB2856
+	.8byte	.LFE2856-.LFB2856
+	.uleb128 0x1
+	.byte	0x9c
+	.4byte	0x104d5
+	.uleb128 0x55
+	.4byte	.LASF2168
+	.byte	0x1
+	.2byte	0xca4
+	.4byte	0xa496
+	.4byte	.LLST205
+	.uleb128 0x55
+	.4byte	.LASF2083
+	.byte	0x1
+	.2byte	0xca5
+	.4byte	0xb311
+	.4byte	.LLST206
+	.uleb128 0x4e
+	.string	"buf"
+	.byte	0x1
+	.2byte	0xca6
+	.4byte	0x21e
+	.4byte	.LLST207
+	.uleb128 0x4f
+	.string	"ebc"
+	.byte	0x1
+	.2byte	0xca8
+	.4byte	0xe4d7
+	.uleb128 0x67
+	.string	"t"
+	.byte	0x1
+	.2byte	0xca9
+	.4byte	0xc6
+	.uleb128 0x2
+	.byte	0x91
+	.sleb128 4
+	.uleb128 0x58
+	.4byte	0x15ab3
+	.8byte	.LBB1590
+	.4byte	.Ldebug_ranges0+0xee0
+	.byte	0x1
+	.2byte	0xcab
+	.4byte	0x104ba
+	.uleb128 0x51
+	.4byte	0x15ace
+	.uleb128 0x51
+	.4byte	0x15ac3
+	.byte	0
+	.uleb128 0x4b
+	.8byte	.LVL687
+	.4byte	0x16df1
+	.uleb128 0x4b
+	.8byte	.LVL690
+	.4byte	0x16ddc
+	.byte	0
+	.uleb128 0x4c
+	.4byte	.LASF3060
+	.byte	0x1
+	.2byte	0xc99
+	.4byte	0x2ee
+	.8byte	.LFB2855
+	.8byte	.LFE2855-.LFB2855
+	.uleb128 0x1
+	.byte	0x9c
+	.4byte	0x10541
+	.uleb128 0x55
+	.4byte	.LASF2168
+	.byte	0x1
+	.2byte	0xc99
+	.4byte	0xa496
+	.4byte	.LLST208
+	.uleb128 0x55
+	.4byte	.LASF2083
+	.byte	0x1
+	.2byte	0xc9a
+	.4byte	0xb311
+	.4byte	.LLST209
+	.uleb128 0x4e
+	.string	"buf"
+	.byte	0x1
+	.2byte	0xc9b
+	.4byte	0x21e
+	.4byte	.LLST210
+	.uleb128 0x4f
+	.string	"ebc"
+	.byte	0x1
+	.2byte	0xc9d
+	.4byte	0xe4d7
+	.uleb128 0x4b
+	.8byte	.LVL695
+	.4byte	0x16df1
+	.byte	0
+	.uleb128 0x4c
+	.4byte	.LASF3061
+	.byte	0x1
+	.2byte	0xc8e
+	.4byte	0x2ee
+	.8byte	.LFB2854
+	.8byte	.LFE2854-.LFB2854
+	.uleb128 0x1
+	.byte	0x9c
+	.4byte	0x105ba
+	.uleb128 0x55
+	.4byte	.LASF2168
+	.byte	0x1
+	.2byte	0xc8e
+	.4byte	0xa496
+	.4byte	.LLST220
+	.uleb128 0x55
+	.4byte	.LASF2083
+	.byte	0x1
+	.2byte	0xc8f
+	.4byte	0xb311
+	.4byte	.LLST221
+	.uleb128 0x4e
+	.string	"buf"
+	.byte	0x1
+	.2byte	0xc90
+	.4byte	0x21e
+	.4byte	.LLST222
+	.uleb128 0x43
+	.4byte	.LASF3062
+	.byte	0x1
+	.2byte	0xc92
+	.4byte	0x56
+	.uleb128 0x4b
+	.8byte	.LVL717
+	.4byte	0x16e14
+	.uleb128 0x4b
+	.8byte	.LVL718
+	.4byte	0x16df1
+	.byte	0
+	.uleb128 0x61
+	.4byte	.LASF3063
+	.byte	0x1
+	.2byte	0xc7b
+	.4byte	0xc6
+	.byte	0x1
+	.4byte	0x105e4
+	.uleb128 0x63
+	.4byte	.LASF418
+	.byte	0x1
+	.2byte	0xc7b
+	.4byte	0x1c7f
+	.uleb128 0x63
+	.4byte	.LASF1241
+	.byte	0x1
+	.2byte	0xc7b
+	.4byte	0x5482
+	.byte	0
+	.uleb128 0x4c
+	.4byte	.LASF3064
+	.byte	0x1
+	.2byte	0xc6b
+	.4byte	0xc6
+	.8byte	.LFB2852
+	.8byte	.LFE2852-.LFB2852
+	.uleb128 0x1
+	.byte	0x9c
+	.4byte	0x1064c
+	.uleb128 0x55
+	.4byte	.LASF1241
+	.byte	0x1
+	.2byte	0xc6b
+	.4byte	0x5482
+	.4byte	.LLST27
+	.uleb128 0x4e
+	.string	"vma"
+	.byte	0x1
+	.2byte	0xc6b
+	.4byte	0x3be9
+	.4byte	.LLST28
+	.uleb128 0x43
+	.4byte	.LASF2943
+	.byte	0x1
+	.2byte	0xc6d
+	.4byte	0xe81f
+	.uleb128 0x43
+	.4byte	.LASF854
+	.byte	0x1
+	.2byte	0xc6e
+	.4byte	0x29
+	.uleb128 0x4b
+	.8byte	.LVL92
+	.4byte	0x16e1f
+	.byte	0
+	.uleb128 0x68
+	.4byte	.LASF3065
+	.byte	0x1
+	.2byte	0xc54
+	.4byte	0xc6
+	.4byte	0x10675
+	.uleb128 0x63
+	.4byte	.LASF418
+	.byte	0x1
+	.2byte	0xc54
+	.4byte	0x1c7f
+	.uleb128 0x63
+	.4byte	.LASF1241
+	.byte	0x1
+	.2byte	0xc54
+	.4byte	0x5482
+	.byte	0
+	.uleb128 0x4c
+	.4byte	.LASF3066
+	.byte	0x1
+	.2byte	0xc45
+	.4byte	0xc6
+	.8byte	.LFB2850
+	.8byte	.LFE2850-.LFB2850
+	.uleb128 0x1
+	.byte	0x9c
+	.4byte	0x106de
+	.uleb128 0x55
+	.4byte	.LASF1241
+	.byte	0x1
+	.2byte	0xc45
+	.4byte	0x5482
+	.4byte	.LLST25
+	.uleb128 0x4e
+	.string	"vma"
+	.byte	0x1
+	.2byte	0xc45
+	.4byte	0x3be9
+	.4byte	.LLST26
+	.uleb128 0x43
+	.4byte	.LASF854
+	.byte	0x1
+	.2byte	0xc47
+	.4byte	0x29
+	.uleb128 0x4b
+	.8byte	.LVL86
+	.4byte	0x16e2b
+	.uleb128 0x4b
+	.8byte	.LVL87
+	.4byte	0x16e1f
+	.byte	0
+	.uleb128 0x4c
+	.4byte	.LASF3067
+	.byte	0x1
+	.2byte	0xb82
+	.4byte	0x199
+	.8byte	.LFB2849
+	.8byte	.LFE2849-.LFB2849
+	.uleb128 0x1
+	.byte	0x9c
+	.4byte	0x120b7
+	.uleb128 0x55
+	.4byte	.LASF1241
+	.byte	0x1
+	.2byte	0xb82
+	.4byte	0x5482
+	.4byte	.LLST29
+	.uleb128 0x4e
+	.string	"cmd"
+	.byte	0x1
+	.2byte	0xb82
+	.4byte	0x6d
+	.4byte	.LLST30
+	.uleb128 0x4e
+	.string	"arg"
+	.byte	0x1
+	.2byte	0xb82
+	.4byte	0x29
+	.4byte	.LLST31
+	.uleb128 0x43
+	.4byte	.LASF3068
+	.byte	0x1
+	.2byte	0xb84
+	.4byte	0x458
+	.uleb128 0x43
+	.4byte	.LASF2992
+	.byte	0x1
+	.2byte	0xb85
+	.4byte	0xe0e4
+	.uleb128 0x43
+	.4byte	.LASF2943
+	.byte	0x1
+	.2byte	0xb86
+	.4byte	0xe81f
+	.uleb128 0x49
+	.4byte	.LASF3069
+	.byte	0x1
+	.2byte	0xb87
+	.4byte	0xd95a
+	.uleb128 0x3
+	.byte	0x91
+	.sleb128 -72
+	.uleb128 0x4f
+	.string	"buf"
+	.byte	0x1
+	.2byte	0xb88
+	.4byte	0xe472
+	.uleb128 0x43
+	.4byte	.LASF3070
+	.byte	0x1
+	.2byte	0xb89
+	.4byte	0xc6
+	.uleb128 0x43
+	.4byte	.LASF3071
+	.byte	0x1
+	.2byte	0xb8a
+	.4byte	0x29
+	.uleb128 0x4f
+	.string	"ret"
+	.byte	0x1
+	.2byte	0xb8b
+	.4byte	0xc6
+	.uleb128 0x52
+	.4byte	.LASF3024
+	.4byte	0x120c7
+	.uleb128 0x9
+	.byte	0x3
+	.8byte	__func__.35512
+	.uleb128 0x69
+	.4byte	.Ldebug_ranges0+0xc0
+	.4byte	0x109dd
+	.uleb128 0x56
+	.4byte	.LASF3072
+	.byte	0x1
+	.2byte	0xc15
+	.4byte	0xc6
+	.4byte	.LLST40
+	.uleb128 0x5c
+	.4byte	0x15ba6
+	.8byte	.LBB1166
+	.4byte	.Ldebug_ranges0+0x100
+	.byte	0x1
+	.2byte	0xc16
+	.uleb128 0x51
+	.4byte	0x15bcb
+	.uleb128 0x51
+	.4byte	0x15bc0
+	.uleb128 0x51
+	.4byte	0x15bb6
+	.uleb128 0x6a
+	.4byte	0x15c04
+	.8byte	.LBB1167
+	.4byte	.Ldebug_ranges0+0x100
+	.byte	0x8
+	.byte	0x9b
+	.uleb128 0x51
+	.4byte	0x15c29
+	.uleb128 0x51
+	.4byte	0x15c1e
+	.uleb128 0x51
+	.4byte	0x15c14
+	.uleb128 0x6b
+	.4byte	0x15ca1
+	.8byte	.LBB1169
+	.4byte	.Ldebug_ranges0+0x150
+	.byte	0x8
+	.byte	0x84
+	.4byte	0x10912
+	.uleb128 0x51
+	.4byte	0x15cbc
+	.uleb128 0x60
+	.4byte	0x15cb1
+	.4byte	.LLST41
+	.uleb128 0x5b
+	.4byte	.Ldebug_ranges0+0x150
+	.uleb128 0x5d
+	.4byte	0x15cc7
+	.4byte	.LLST42
+	.uleb128 0x5d
+	.4byte	0x15cd2
+	.4byte	.LLST43
+	.uleb128 0x6c
+	.4byte	0x1608b
+	.8byte	.LBB1171
+	.8byte	.LBE1171-.LBB1171
+	.byte	0x5
+	.byte	0x4d
+	.4byte	0x10878
+	.uleb128 0x53
+	.8byte	.LBB1172
+	.8byte	.LBE1172-.LBB1172
+	.uleb128 0x5d
+	.4byte	0x1609b
+	.4byte	.LLST44
+	.byte	0
+	.byte	0
+	.uleb128 0x5f
+	.8byte	.LBB1173
+	.8byte	.LBE1173-.LBB1173
+	.4byte	0x108cc
+	.uleb128 0x54
+	.4byte	0x15cde
+	.uleb128 0x59
+	.4byte	0x160ca
+	.8byte	.LBB1174
+	.8byte	.LBE1174-.LBB1174
+	.byte	0x5
+	.byte	0x56
+	.uleb128 0x51
+	.4byte	0x160e5
+	.uleb128 0x51
+	.4byte	0x160da
+	.uleb128 0x53
+	.8byte	.LBB1175
+	.8byte	.LBE1175-.LBB1175
+	.uleb128 0x54
+	.4byte	0x160f0
+	.byte	0
+	.byte	0
+	.byte	0
+	.uleb128 0x59
+	.4byte	0x1605f
+	.8byte	.LBB1176
+	.8byte	.LBE1176-.LBB1176
+	.byte	0x5
+	.byte	0x55
+	.uleb128 0x51
+	.4byte	0x16079
+	.uleb128 0x51
+	.4byte	0x1606f
+	.uleb128 0x59
+	.4byte	0x16152
+	.8byte	.LBB1177
+	.8byte	.LBE1177-.LBB1177
+	.byte	0xc9
+	.byte	0x61
+	.uleb128 0x51
+	.4byte	0x1616c
+	.uleb128 0x51
+	.4byte	0x16162
+	.byte	0
+	.byte	0
+	.byte	0
+	.byte	0
+	.uleb128 0x6c
+	.4byte	0x15c6d
+	.8byte	.LBB1183
+	.8byte	.LBE1183-.LBB1183
+	.byte	0x8
+	.byte	0x86
+	.4byte	0x109cd
+	.uleb128 0x51
+	.4byte	0x15c7d
+	.uleb128 0x53
+	.8byte	.LBB1184
+	.8byte	.LBE1184-.LBB1184
+	.uleb128 0x5d
+	.4byte	0x15c88
+	.4byte	.LLST45
+	.uleb128 0x69
+	.4byte	.Ldebug_ranges0+0x1a0
+	.4byte	0x10998
+	.uleb128 0x5d
+	.4byte	0x15c94
+	.4byte	.LLST46
+	.uleb128 0x59
+	.4byte	0x160ca
+	.8byte	.LBB1186
+	.8byte	.LBE1186-.LBB1186
+	.byte	0x5
+	.byte	0xfe
+	.uleb128 0x51
+	.4byte	0x160e5
+	.uleb128 0x51
+	.4byte	0x160da
+	.uleb128 0x53
+	.8byte	.LBB1187
+	.8byte	.LBE1187-.LBB1187
+	.uleb128 0x54
+	.4byte	0x160f0
+	.byte	0
+	.byte	0
+	.byte	0
+	.uleb128 0x59
+	.4byte	0x1608b
+	.8byte	.LBB1188
+	.8byte	.LBE1188-.LBB1188
+	.byte	0x5
+	.byte	0xfd
+	.uleb128 0x53
+	.8byte	.LBB1189
+	.8byte	.LBE1189-.LBB1189
+	.uleb128 0x5d
+	.4byte	0x1609b
+	.4byte	.LLST47
+	.byte	0
+	.byte	0
+	.byte	0
+	.byte	0
+	.uleb128 0x4b
+	.8byte	.LVL132
+	.4byte	0x16e36
+	.byte	0
+	.byte	0
+	.byte	0
+	.uleb128 0x58
+	.4byte	0x15bd5
+	.8byte	.LBB1132
+	.4byte	.Ldebug_ranges0+0
+	.byte	0x1
+	.2byte	0xc37
+	.4byte	0x10c19
+	.uleb128 0x51
+	.4byte	0x15bfa
+	.uleb128 0x51
+	.4byte	0x15bef
+	.uleb128 0x51
+	.4byte	0x15be5
+	.uleb128 0x6a
+	.4byte	0x15c33
+	.8byte	.LBB1133
+	.4byte	.Ldebug_ranges0+0
+	.byte	0x8
+	.byte	0x93
+	.uleb128 0x51
+	.4byte	0x15c58
+	.uleb128 0x51
+	.4byte	0x15c4d
+	.uleb128 0x51
+	.4byte	0x15c43
+	.uleb128 0x5b
+	.4byte	.Ldebug_ranges0+0
+	.uleb128 0x5d
+	.4byte	0x15c61
+	.4byte	.LLST32
+	.uleb128 0x6b
+	.4byte	0x15ca1
+	.8byte	.LBB1135
+	.4byte	.Ldebug_ranges0+0x50
+	.byte	0x8
+	.byte	0x72
+	.4byte	0x10b41
+	.uleb128 0x51
+	.4byte	0x15cbc
+	.uleb128 0x60
+	.4byte	0x15cb1
+	.4byte	.LLST33
+	.uleb128 0x5b
+	.4byte	.Ldebug_ranges0+0x50
+	.uleb128 0x5d
+	.4byte	0x15cc7
+	.4byte	.LLST34
+	.uleb128 0x5d
+	.4byte	0x15cd2
+	.4byte	.LLST35
+	.uleb128 0x6c
+	.4byte	0x1608b
+	.8byte	.LBB1137
+	.8byte	.LBE1137-.LBB1137
+	.byte	0x5
+	.byte	0x4d
+	.4byte	0x10aa7
+	.uleb128 0x53
+	.8byte	.LBB1138
+	.8byte	.LBE1138-.LBB1138
+	.uleb128 0x5d
+	.4byte	0x1609b
+	.4byte	.LLST36
+	.byte	0
+	.byte	0
+	.uleb128 0x6c
+	.4byte	0x1605f
+	.8byte	.LBB1139
+	.8byte	.LBE1139-.LBB1139
+	.byte	0x5
+	.byte	0x55
+	.4byte	0x10aef
+	.uleb128 0x51
+	.4byte	0x16079
+	.uleb128 0x51
+	.4byte	0x1606f
+	.uleb128 0x59
+	.4byte	0x16152
+	.8byte	.LBB1140
+	.8byte	.LBE1140-.LBB1140
+	.byte	0xc9
+	.byte	0x61
+	.uleb128 0x51
+	.4byte	0x1616c
+	.uleb128 0x51
+	.4byte	0x16162
+	.byte	0
+	.byte	0
+	.uleb128 0x53
+	.8byte	.LBB1142
+	.8byte	.LBE1142-.LBB1142
+	.uleb128 0x54
+	.4byte	0x15cde
+	.uleb128 0x59
+	.4byte	0x160ca
+	.8byte	.LBB1143
+	.8byte	.LBE1143-.LBB1143
+	.byte	0x5
+	.byte	0x56
+	.uleb128 0x51
+	.4byte	0x160e5
+	.uleb128 0x51
+	.4byte	0x160da
+	.uleb128 0x53
+	.8byte	.LBB1144
+	.8byte	.LBE1144-.LBB1144
+	.uleb128 0x54
+	.4byte	0x160f0
+	.byte	0
+	.byte	0
+	.byte	0
+	.byte	0
+	.byte	0
+	.uleb128 0x6c
+	.4byte	0x15c6d
+	.8byte	.LBB1149
+	.8byte	.LBE1149-.LBB1149
+	.byte	0x8
+	.byte	0x74
+	.4byte	0x10bfc
+	.uleb128 0x51
+	.4byte	0x15c7d
+	.uleb128 0x53
+	.8byte	.LBB1150
+	.8byte	.LBE1150-.LBB1150
+	.uleb128 0x5d
+	.4byte	0x15c88
+	.4byte	.LLST37
+	.uleb128 0x69
+	.4byte	.Ldebug_ranges0+0x90
+	.4byte	0x10bc7
+	.uleb128 0x5d
+	.4byte	0x15c94
+	.4byte	.LLST38
+	.uleb128 0x59
+	.4byte	0x160ca
+	.8byte	.LBB1152
+	.8byte	.LBE1152-.LBB1152
+	.byte	0x5
+	.byte	0xfe
+	.uleb128 0x51
+	.4byte	0x160e5
+	.uleb128 0x51
+	.4byte	0x160da
+	.uleb128 0x53
+	.8byte	.LBB1153
+	.8byte	.LBE1153-.LBB1153
+	.uleb128 0x54
+	.4byte	0x160f0
+	.byte	0
+	.byte	0
+	.byte	0
+	.uleb128 0x59
+	.4byte	0x1608b
+	.8byte	.LBB1154
+	.8byte	.LBE1154-.LBB1154
+	.byte	0x5
+	.byte	0xfd
+	.uleb128 0x53
+	.8byte	.LBB1155
+	.8byte	.LBE1155-.LBB1155
+	.uleb128 0x5d
+	.4byte	0x1609b
+	.4byte	.LLST39
+	.byte	0
+	.byte	0
+	.byte	0
+	.byte	0
+	.uleb128 0x4b
+	.8byte	.LVL110
+	.4byte	0x16e42
+	.uleb128 0x4b
+	.8byte	.LVL316
+	.4byte	0x16cb7
+	.byte	0
+	.byte	0
+	.byte	0
+	.uleb128 0x58
+	.4byte	0x15ba6
+	.8byte	.LBB1202
+	.4byte	.Ldebug_ranges0+0x1d0
+	.byte	0x1
+	.2byte	0xc11
+	.4byte	0x10e39
+	.uleb128 0x51
+	.4byte	0x15bcb
+	.uleb128 0x51
+	.4byte	0x15bc0
+	.uleb128 0x51
+	.4byte	0x15bb6
+	.uleb128 0x6a
+	.4byte	0x15c04
+	.8byte	.LBB1203
+	.4byte	.Ldebug_ranges0+0x1d0
+	.byte	0x8
+	.byte	0x9b
+	.uleb128 0x51
+	.4byte	0x15c29
+	.uleb128 0x51
+	.4byte	0x15c1e
+	.uleb128 0x51
+	.4byte	0x15c14
+	.uleb128 0x6b
+	.4byte	0x15ca1
+	.8byte	.LBB1205
+	.4byte	.Ldebug_ranges0+0x210
+	.byte	0x8
+	.byte	0x84
+	.4byte	0x10d6f
+	.uleb128 0x51
+	.4byte	0x15cbc
+	.uleb128 0x60
+	.4byte	0x15cb1
+	.4byte	.LLST48
+	.uleb128 0x5b
+	.4byte	.Ldebug_ranges0+0x210
+	.uleb128 0x5d
+	.4byte	0x15cc7
+	.4byte	.LLST49
+	.uleb128 0x5d
+	.4byte	0x15cd2
+	.4byte	.LLST50
+	.uleb128 0x6c
+	.4byte	0x1608b
+	.8byte	.LBB1207
+	.8byte	.LBE1207-.LBB1207
+	.byte	0x5
+	.byte	0x4d
+	.4byte	0x10cd5
+	.uleb128 0x53
+	.8byte	.LBB1208
+	.8byte	.LBE1208-.LBB1208
+	.uleb128 0x5d
+	.4byte	0x1609b
+	.4byte	.LLST51
+	.byte	0
+	.byte	0
+	.uleb128 0x5f
+	.8byte	.LBB1209
+	.8byte	.LBE1209-.LBB1209
+	.4byte	0x10d29
+	.uleb128 0x54
+	.4byte	0x15cde
+	.uleb128 0x59
+	.4byte	0x160ca
+	.8byte	.LBB1210
+	.8byte	.LBE1210-.LBB1210
+	.byte	0x5
+	.byte	0x56
+	.uleb128 0x51
+	.4byte	0x160e5
+	.uleb128 0x51
+	.4byte	0x160da
+	.uleb128 0x53
+	.8byte	.LBB1211
+	.8byte	.LBE1211-.LBB1211
+	.uleb128 0x54
+	.4byte	0x160f0
+	.byte	0
+	.byte	0
+	.byte	0
+	.uleb128 0x59
+	.4byte	0x1605f
+	.8byte	.LBB1212
+	.8byte	.LBE1212-.LBB1212
+	.byte	0x5
+	.byte	0x55
+	.uleb128 0x51
+	.4byte	0x16079
+	.uleb128 0x51
+	.4byte	0x1606f
+	.uleb128 0x59
+	.4byte	0x16152
+	.8byte	.LBB1213
+	.8byte	.LBE1213-.LBB1213
+	.byte	0xc9
+	.byte	0x61
+	.uleb128 0x51
+	.4byte	0x1616c
+	.uleb128 0x51
+	.4byte	0x16162
+	.byte	0
+	.byte	0
+	.byte	0
+	.byte	0
+	.uleb128 0x6c
+	.4byte	0x15c6d
+	.8byte	.LBB1217
+	.8byte	.LBE1217-.LBB1217
+	.byte	0x8
+	.byte	0x86
+	.4byte	0x10e2a
+	.uleb128 0x51
+	.4byte	0x15c7d
+	.uleb128 0x53
+	.8byte	.LBB1218
+	.8byte	.LBE1218-.LBB1218
+	.uleb128 0x5d
+	.4byte	0x15c88
+	.4byte	.LLST52
+	.uleb128 0x69
+	.4byte	.Ldebug_ranges0+0x250
+	.4byte	0x10df5
+	.uleb128 0x5d
+	.4byte	0x15c94
+	.4byte	.LLST53
+	.uleb128 0x59
+	.4byte	0x160ca
+	.8byte	.LBB1220
+	.8byte	.LBE1220-.LBB1220
+	.byte	0x5
+	.byte	0xfe
+	.uleb128 0x51
+	.4byte	0x160e5
+	.uleb128 0x51
+	.4byte	0x160da
+	.uleb128 0x53
+	.8byte	.LBB1221
+	.8byte	.LBE1221-.LBB1221
+	.uleb128 0x54
+	.4byte	0x160f0
+	.byte	0
+	.byte	0
+	.byte	0
+	.uleb128 0x59
+	.4byte	0x1608b
+	.8byte	.LBB1222
+	.8byte	.LBE1222-.LBB1222
+	.byte	0x5
+	.byte	0xfd
+	.uleb128 0x53
+	.8byte	.LBB1223
+	.8byte	.LBE1223-.LBB1223
+	.uleb128 0x5d
+	.4byte	0x1609b
+	.4byte	.LLST54
+	.byte	0
+	.byte	0
+	.byte	0
+	.byte	0
+	.uleb128 0x4b
+	.8byte	.LVL151
+	.4byte	0x16e36
+	.byte	0
+	.byte	0
+	.uleb128 0x58
+	.4byte	0x15bd5
+	.8byte	.LBB1231
+	.4byte	.Ldebug_ranges0+0x280
+	.byte	0x1
+	.2byte	0xc2e
+	.4byte	0x11075
+	.uleb128 0x51
+	.4byte	0x15bfa
+	.uleb128 0x51
+	.4byte	0x15bef
+	.uleb128 0x51
+	.4byte	0x15be5
+	.uleb128 0x6a
+	.4byte	0x15c33
+	.8byte	.LBB1232
+	.4byte	.Ldebug_ranges0+0x280
+	.byte	0x8
+	.byte	0x93
+	.uleb128 0x51
+	.4byte	0x15c58
+	.uleb128 0x51
+	.4byte	0x15c4d
+	.uleb128 0x51
+	.4byte	0x15c43
+	.uleb128 0x5b
+	.4byte	.Ldebug_ranges0+0x280
+	.uleb128 0x5d
+	.4byte	0x15c61
+	.4byte	.LLST55
+	.uleb128 0x6b
+	.4byte	0x15ca1
+	.8byte	.LBB1234
+	.4byte	.Ldebug_ranges0+0x2e0
+	.byte	0x8
+	.byte	0x72
+	.4byte	0x10f9d
+	.uleb128 0x51
+	.4byte	0x15cbc
+	.uleb128 0x60
+	.4byte	0x15cb1
+	.4byte	.LLST56
+	.uleb128 0x5b
+	.4byte	.Ldebug_ranges0+0x2e0
+	.uleb128 0x5d
+	.4byte	0x15cc7
+	.4byte	.LLST57
+	.uleb128 0x5d
+	.4byte	0x15cd2
+	.4byte	.LLST58
+	.uleb128 0x6c
+	.4byte	0x1608b
+	.8byte	.LBB1236
+	.8byte	.LBE1236-.LBB1236
+	.byte	0x5
+	.byte	0x4d
+	.4byte	0x10f03
+	.uleb128 0x53
+	.8byte	.LBB1237
+	.8byte	.LBE1237-.LBB1237
+	.uleb128 0x5d
+	.4byte	0x1609b
+	.4byte	.LLST59
+	.byte	0
+	.byte	0
+	.uleb128 0x5f
+	.8byte	.LBB1238
+	.8byte	.LBE1238-.LBB1238
+	.4byte	0x10f57
+	.uleb128 0x54
+	.4byte	0x15cde
+	.uleb128 0x59
+	.4byte	0x160ca
+	.8byte	.LBB1239
+	.8byte	.LBE1239-.LBB1239
+	.byte	0x5
+	.byte	0x56
+	.uleb128 0x51
+	.4byte	0x160e5
+	.uleb128 0x51
+	.4byte	0x160da
+	.uleb128 0x53
+	.8byte	.LBB1240
+	.8byte	.LBE1240-.LBB1240
+	.uleb128 0x54
+	.4byte	0x160f0
+	.byte	0
+	.byte	0
+	.byte	0
+	.uleb128 0x59
+	.4byte	0x1605f
+	.8byte	.LBB1241
+	.8byte	.LBE1241-.LBB1241
+	.byte	0x5
+	.byte	0x55
+	.uleb128 0x51
+	.4byte	0x16079
+	.uleb128 0x51
+	.4byte	0x1606f
+	.uleb128 0x59
+	.4byte	0x16152
+	.8byte	.LBB1242
+	.8byte	.LBE1242-.LBB1242
+	.byte	0xc9
+	.byte	0x61
+	.uleb128 0x51
+	.4byte	0x1616c
+	.uleb128 0x51
+	.4byte	0x16162
+	.byte	0
+	.byte	0
+	.byte	0
+	.byte	0
+	.uleb128 0x6c
+	.4byte	0x15c6d
+	.8byte	.LBB1248
+	.8byte	.LBE1248-.LBB1248
+	.byte	0x8
+	.byte	0x74
+	.4byte	0x11058
+	.uleb128 0x51
+	.4byte	0x15c7d
+	.uleb128 0x53
+	.8byte	.LBB1249
+	.8byte	.LBE1249-.LBB1249
+	.uleb128 0x5d
+	.4byte	0x15c88
+	.4byte	.LLST60
+	.uleb128 0x69
+	.4byte	.Ldebug_ranges0+0x330
+	.4byte	0x11023
+	.uleb128 0x5d
+	.4byte	0x15c94
+	.4byte	.LLST61
+	.uleb128 0x59
+	.4byte	0x160ca
+	.8byte	.LBB1251
+	.8byte	.LBE1251-.LBB1251
+	.byte	0x5
+	.byte	0xfe
+	.uleb128 0x51
+	.4byte	0x160e5
+	.uleb128 0x51
+	.4byte	0x160da
+	.uleb128 0x53
+	.8byte	.LBB1252
+	.8byte	.LBE1252-.LBB1252
+	.uleb128 0x54
+	.4byte	0x160f0
+	.byte	0
+	.byte	0
+	.byte	0
+	.uleb128 0x59
+	.4byte	0x1608b
+	.8byte	.LBB1253
+	.8byte	.LBE1253-.LBB1253
+	.byte	0x5
+	.byte	0xfd
+	.uleb128 0x53
+	.8byte	.LBB1254
+	.8byte	.LBE1254-.LBB1254
+	.uleb128 0x5d
+	.4byte	0x1609b
+	.4byte	.LLST62
+	.byte	0
+	.byte	0
+	.byte	0
+	.byte	0
+	.uleb128 0x4b
+	.8byte	.LVL162
+	.4byte	0x16e42
+	.uleb128 0x4b
+	.8byte	.LVL322
+	.4byte	0x16cb7
+	.byte	0
+	.byte	0
+	.byte	0
+	.uleb128 0x58
+	.4byte	0x15bd5
+	.8byte	.LBB1267
+	.4byte	.Ldebug_ranges0+0x360
+	.byte	0x1
+	.2byte	0xbe2
+	.4byte	0x112a0
+	.uleb128 0x51
+	.4byte	0x15bfa
+	.uleb128 0x51
+	.4byte	0x15bef
+	.uleb128 0x51
+	.4byte	0x15be5
+	.uleb128 0x6a
+	.4byte	0x15c33
+	.8byte	.LBB1268
+	.4byte	.Ldebug_ranges0+0x360
+	.byte	0x8
+	.byte	0x93
+	.uleb128 0x51
+	.4byte	0x15c58
+	.uleb128 0x51
+	.4byte	0x15c4d
+	.uleb128 0x51
+	.4byte	0x15c43
+	.uleb128 0x5b
+	.4byte	.Ldebug_ranges0+0x360
+	.uleb128 0x54
+	.4byte	0x15c61
+	.uleb128 0x6b
+	.4byte	0x15ca1
+	.8byte	.LBB1270
+	.4byte	.Ldebug_ranges0+0x3a0
+	.byte	0x8
+	.byte	0x72
+	.4byte	0x111d5
+	.uleb128 0x51
+	.4byte	0x15cbc
+	.uleb128 0x60
+	.4byte	0x15cb1
+	.4byte	.LLST63
+	.uleb128 0x5b
+	.4byte	.Ldebug_ranges0+0x3a0
+	.uleb128 0x5d
+	.4byte	0x15cc7
+	.4byte	.LLST64
+	.uleb128 0x5d
+	.4byte	0x15cd2
+	.4byte	.LLST65
+	.uleb128 0x6c
+	.4byte	0x1608b
+	.8byte	.LBB1272
+	.8byte	.LBE1272-.LBB1272
+	.byte	0x5
+	.byte	0x4d
+	.4byte	0x1113b
+	.uleb128 0x53
+	.8byte	.LBB1273
+	.8byte	.LBE1273-.LBB1273
+	.uleb128 0x5d
+	.4byte	0x1609b
+	.4byte	.LLST66
+	.byte	0
+	.byte	0
+	.uleb128 0x5f
+	.8byte	.LBB1274
+	.8byte	.LBE1274-.LBB1274
+	.4byte	0x1118f
+	.uleb128 0x54
+	.4byte	0x15cde
+	.uleb128 0x59
+	.4byte	0x160ca
+	.8byte	.LBB1275
+	.8byte	.LBE1275-.LBB1275
+	.byte	0x5
+	.byte	0x56
+	.uleb128 0x51
+	.4byte	0x160e5
+	.uleb128 0x51
+	.4byte	0x160da
+	.uleb128 0x53
+	.8byte	.LBB1276
+	.8byte	.LBE1276-.LBB1276
+	.uleb128 0x54
+	.4byte	0x160f0
+	.byte	0
+	.byte	0
+	.byte	0
+	.uleb128 0x59
+	.4byte	0x1605f
+	.8byte	.LBB1277
+	.8byte	.LBE1277-.LBB1277
+	.byte	0x5
+	.byte	0x55
+	.uleb128 0x51
+	.4byte	0x16079
+	.uleb128 0x51
+	.4byte	0x1606f
+	.uleb128 0x59
+	.4byte	0x16152
+	.8byte	.LBB1278
+	.8byte	.LBE1278-.LBB1278
+	.byte	0xc9
+	.byte	0x61
+	.uleb128 0x51
+	.4byte	0x1616c
+	.uleb128 0x51
+	.4byte	0x16162
+	.byte	0
+	.byte	0
+	.byte	0
+	.byte	0
+	.uleb128 0x6c
+	.4byte	0x15c6d
+	.8byte	.LBB1282
+	.8byte	.LBE1282-.LBB1282
+	.byte	0x8
+	.byte	0x74
+	.4byte	0x11290
+	.uleb128 0x51
+	.4byte	0x15c7d
+	.uleb128 0x53
+	.8byte	.LBB1283
+	.8byte	.LBE1283-.LBB1283
+	.uleb128 0x5d
+	.4byte	0x15c88
+	.4byte	.LLST67
+	.uleb128 0x69
+	.4byte	.Ldebug_ranges0+0x3e0
+	.4byte	0x1125b
+	.uleb128 0x5d
+	.4byte	0x15c94
+	.4byte	.LLST68
+	.uleb128 0x59
+	.4byte	0x160ca
+	.8byte	.LBB1285
+	.8byte	.LBE1285-.LBB1285
+	.byte	0x5
+	.byte	0xfe
+	.uleb128 0x51
+	.4byte	0x160e5
+	.uleb128 0x51
+	.4byte	0x160da
+	.uleb128 0x53
+	.8byte	.LBB1286
+	.8byte	.LBE1286-.LBB1286
+	.uleb128 0x54
+	.4byte	0x160f0
+	.byte	0
+	.byte	0
+	.byte	0
+	.uleb128 0x59
+	.4byte	0x1608b
+	.8byte	.LBB1287
+	.8byte	.LBE1287-.LBB1287
+	.byte	0x5
+	.byte	0xfd
+	.uleb128 0x53
+	.8byte	.LBB1288
+	.8byte	.LBE1288-.LBB1288
+	.uleb128 0x5d
+	.4byte	0x1609b
+	.4byte	.LLST69
+	.byte	0
+	.byte	0
+	.byte	0
+	.byte	0
+	.uleb128 0x4b
+	.8byte	.LVL176
+	.4byte	0x16e42
+	.byte	0
+	.byte	0
+	.byte	0
+	.uleb128 0x58
+	.4byte	0x15ba6
+	.8byte	.LBB1296
+	.4byte	.Ldebug_ranges0+0x410
+	.byte	0x1
+	.2byte	0xbaf
+	.4byte	0x114c0
+	.uleb128 0x51
+	.4byte	0x15bcb
+	.uleb128 0x51
+	.4byte	0x15bc0
+	.uleb128 0x51
+	.4byte	0x15bb6
+	.uleb128 0x6a
+	.4byte	0x15c04
+	.8byte	.LBB1297
+	.4byte	.Ldebug_ranges0+0x410
+	.byte	0x8
+	.byte	0x9b
+	.uleb128 0x51
+	.4byte	0x15c29
+	.uleb128 0x51
+	.4byte	0x15c1e
+	.uleb128 0x51
+	.4byte	0x15c14
+	.uleb128 0x6b
+	.4byte	0x15ca1
+	.8byte	.LBB1299
+	.4byte	.Ldebug_ranges0+0x460
+	.byte	0x8
+	.byte	0x84
+	.4byte	0x113f6
+	.uleb128 0x51
+	.4byte	0x15cbc
+	.uleb128 0x60
+	.4byte	0x15cb1
+	.4byte	.LLST70
+	.uleb128 0x5b
+	.4byte	.Ldebug_ranges0+0x460
+	.uleb128 0x5d
+	.4byte	0x15cc7
+	.4byte	.LLST71
+	.uleb128 0x5d
+	.4byte	0x15cd2
+	.4byte	.LLST72
+	.uleb128 0x6c
+	.4byte	0x1608b
+	.8byte	.LBB1301
+	.8byte	.LBE1301-.LBB1301
+	.byte	0x5
+	.byte	0x4d
+	.4byte	0x1135c
+	.uleb128 0x53
+	.8byte	.LBB1302
+	.8byte	.LBE1302-.LBB1302
+	.uleb128 0x5d
+	.4byte	0x1609b
+	.4byte	.LLST73
+	.byte	0
+	.byte	0
+	.uleb128 0x5f
+	.8byte	.LBB1303
+	.8byte	.LBE1303-.LBB1303
+	.4byte	0x113b0
+	.uleb128 0x54
+	.4byte	0x15cde
+	.uleb128 0x59
+	.4byte	0x160ca
+	.8byte	.LBB1304
+	.8byte	.LBE1304-.LBB1304
+	.byte	0x5
+	.byte	0x56
+	.uleb128 0x51
+	.4byte	0x160e5
+	.uleb128 0x51
+	.4byte	0x160da
+	.uleb128 0x53
+	.8byte	.LBB1305
+	.8byte	.LBE1305-.LBB1305
+	.uleb128 0x54
+	.4byte	0x160f0
+	.byte	0
+	.byte	0
+	.byte	0
+	.uleb128 0x59
+	.4byte	0x1605f
+	.8byte	.LBB1306
+	.8byte	.LBE1306-.LBB1306
+	.byte	0x5
+	.byte	0x55
+	.uleb128 0x51
+	.4byte	0x16079
+	.uleb128 0x51
+	.4byte	0x1606f
+	.uleb128 0x59
+	.4byte	0x16152
+	.8byte	.LBB1307
+	.8byte	.LBE1307-.LBB1307
+	.byte	0xc9
+	.byte	0x61
+	.uleb128 0x51
+	.4byte	0x1616c
+	.uleb128 0x51
+	.4byte	0x16162
+	.byte	0
+	.byte	0
+	.byte	0
+	.byte	0
+	.uleb128 0x6c
+	.4byte	0x15c6d
+	.8byte	.LBB1313
+	.8byte	.LBE1313-.LBB1313
+	.byte	0x8
+	.byte	0x86
+	.4byte	0x114b1
+	.uleb128 0x51
+	.4byte	0x15c7d
+	.uleb128 0x53
+	.8byte	.LBB1314
+	.8byte	.LBE1314-.LBB1314
+	.uleb128 0x5d
+	.4byte	0x15c88
+	.4byte	.LLST74
+	.uleb128 0x69
+	.4byte	.Ldebug_ranges0+0x4b0
+	.4byte	0x1147c
+	.uleb128 0x5d
+	.4byte	0x15c94
+	.4byte	.LLST75
+	.uleb128 0x59
+	.4byte	0x160ca
+	.8byte	.LBB1316
+	.8byte	.LBE1316-.LBB1316
+	.byte	0x5
+	.byte	0xfe
+	.uleb128 0x51
+	.4byte	0x160e5
+	.uleb128 0x51
+	.4byte	0x160da
+	.uleb128 0x53
+	.8byte	.LBB1317
+	.8byte	.LBE1317-.LBB1317
+	.uleb128 0x54
+	.4byte	0x160f0
+	.byte	0
+	.byte	0
+	.byte	0
+	.uleb128 0x59
+	.4byte	0x1608b
+	.8byte	.LBB1318
+	.8byte	.LBE1318-.LBB1318
+	.byte	0x5
+	.byte	0xfd
+	.uleb128 0x53
+	.8byte	.LBB1319
+	.8byte	.LBE1319-.LBB1319
+	.uleb128 0x5d
+	.4byte	0x1609b
+	.4byte	.LLST76
+	.byte	0
+	.byte	0
+	.byte	0
+	.byte	0
+	.uleb128 0x4b
+	.8byte	.LVL195
+	.4byte	0x16e36
+	.byte	0
+	.byte	0
+	.uleb128 0x58
+	.4byte	0x15bd5
+	.8byte	.LBB1330
+	.4byte	.Ldebug_ranges0+0x4e0
+	.byte	0x1
+	.2byte	0xc1a
+	.4byte	0x116fc
+	.uleb128 0x51
+	.4byte	0x15bfa
+	.uleb128 0x51
+	.4byte	0x15bef
+	.uleb128 0x51
+	.4byte	0x15be5
+	.uleb128 0x6a
+	.4byte	0x15c33
+	.8byte	.LBB1331
+	.4byte	.Ldebug_ranges0+0x4e0
+	.byte	0x8
+	.byte	0x93
+	.uleb128 0x51
+	.4byte	0x15c58
+	.uleb128 0x51
+	.4byte	0x15c4d
+	.uleb128 0x51
+	.4byte	0x15c43
+	.uleb128 0x5b
+	.4byte	.Ldebug_ranges0+0x4e0
+	.uleb128 0x5d
+	.4byte	0x15c61
+	.4byte	.LLST77
+	.uleb128 0x6b
+	.4byte	0x15ca1
+	.8byte	.LBB1333
+	.4byte	.Ldebug_ranges0+0x540
+	.byte	0x8
+	.byte	0x72
+	.4byte	0x11624
+	.uleb128 0x51
+	.4byte	0x15cbc
+	.uleb128 0x60
+	.4byte	0x15cb1
+	.4byte	.LLST78
+	.uleb128 0x5b
+	.4byte	.Ldebug_ranges0+0x540
+	.uleb128 0x5d
+	.4byte	0x15cc7
+	.4byte	.LLST79
+	.uleb128 0x5d
+	.4byte	0x15cd2
+	.4byte	.LLST80
+	.uleb128 0x6c
+	.4byte	0x1608b
+	.8byte	.LBB1335
+	.8byte	.LBE1335-.LBB1335
+	.byte	0x5
+	.byte	0x4d
+	.4byte	0x1158a
+	.uleb128 0x53
+	.8byte	.LBB1336
+	.8byte	.LBE1336-.LBB1336
+	.uleb128 0x5d
+	.4byte	0x1609b
+	.4byte	.LLST81
+	.byte	0
+	.byte	0
+	.uleb128 0x5f
+	.8byte	.LBB1337
+	.8byte	.LBE1337-.LBB1337
+	.4byte	0x115de
+	.uleb128 0x54
+	.4byte	0x15cde
+	.uleb128 0x59
+	.4byte	0x160ca
+	.8byte	.LBB1338
+	.8byte	.LBE1338-.LBB1338
+	.byte	0x5
+	.byte	0x56
+	.uleb128 0x51
+	.4byte	0x160e5
+	.uleb128 0x51
+	.4byte	0x160da
+	.uleb128 0x53
+	.8byte	.LBB1339
+	.8byte	.LBE1339-.LBB1339
+	.uleb128 0x54
+	.4byte	0x160f0
+	.byte	0
+	.byte	0
+	.byte	0
+	.uleb128 0x59
+	.4byte	0x1605f
+	.8byte	.LBB1340
+	.8byte	.LBE1340-.LBB1340
+	.byte	0x5
+	.byte	0x55
+	.uleb128 0x51
+	.4byte	0x16079
+	.uleb128 0x51
+	.4byte	0x1606f
+	.uleb128 0x59
+	.4byte	0x16152
+	.8byte	.LBB1341
+	.8byte	.LBE1341-.LBB1341
+	.byte	0xc9
+	.byte	0x61
+	.uleb128 0x51
+	.4byte	0x1616c
+	.uleb128 0x51
+	.4byte	0x16162
+	.byte	0
+	.byte	0
+	.byte	0
+	.byte	0
+	.uleb128 0x6c
+	.4byte	0x15c6d
+	.8byte	.LBB1347
+	.8byte	.LBE1347-.LBB1347
+	.byte	0x8
+	.byte	0x74
+	.4byte	0x116df
+	.uleb128 0x51
+	.4byte	0x15c7d
+	.uleb128 0x53
+	.8byte	.LBB1348
+	.8byte	.LBE1348-.LBB1348
+	.uleb128 0x5d
+	.4byte	0x15c88
+	.4byte	.LLST82
+	.uleb128 0x69
+	.4byte	.Ldebug_ranges0+0x590
+	.4byte	0x116aa
+	.uleb128 0x5d
+	.4byte	0x15c94
+	.4byte	.LLST83
+	.uleb128 0x59
+	.4byte	0x160ca
+	.8byte	.LBB1350
+	.8byte	.LBE1350-.LBB1350
+	.byte	0x5
+	.byte	0xfe
+	.uleb128 0x51
+	.4byte	0x160e5
+	.uleb128 0x51
+	.4byte	0x160da
+	.uleb128 0x53
+	.8byte	.LBB1351
+	.8byte	.LBE1351-.LBB1351
+	.uleb128 0x54
+	.4byte	0x160f0
+	.byte	0
+	.byte	0
+	.byte	0
+	.uleb128 0x59
+	.4byte	0x1608b
+	.8byte	.LBB1352
+	.8byte	.LBE1352-.LBB1352
+	.byte	0x5
+	.byte	0xfd
+	.uleb128 0x53
+	.8byte	.LBB1353
+	.8byte	.LBE1353-.LBB1353
+	.uleb128 0x5d
+	.4byte	0x1609b
+	.4byte	.LLST84
+	.byte	0
+	.byte	0
+	.byte	0
+	.byte	0
+	.uleb128 0x4b
+	.8byte	.LVL208
+	.4byte	0x16e42
+	.uleb128 0x4b
+	.8byte	.LVL310
+	.4byte	0x16cb7
+	.byte	0
+	.byte	0
+	.byte	0
+	.uleb128 0x58
+	.4byte	0x15ba6
+	.8byte	.LBB1366
+	.4byte	.Ldebug_ranges0+0x5c0
+	.byte	0x1
+	.2byte	0xc28
+	.4byte	0x1191c
+	.uleb128 0x51
+	.4byte	0x15bcb
+	.uleb128 0x51
+	.4byte	0x15bc0
+	.uleb128 0x51
+	.4byte	0x15bb6
+	.uleb128 0x6a
+	.4byte	0x15c04
+	.8byte	.LBB1367
+	.4byte	.Ldebug_ranges0+0x5c0
+	.byte	0x8
+	.byte	0x9b
+	.uleb128 0x51
+	.4byte	0x15c29
+	.uleb128 0x51
+	.4byte	0x15c1e
+	.uleb128 0x51
+	.4byte	0x15c14
+	.uleb128 0x6b
+	.4byte	0x15ca1
+	.8byte	.LBB1369
+	.4byte	.Ldebug_ranges0+0x620
+	.byte	0x8
+	.byte	0x84
+	.4byte	0x11852
+	.uleb128 0x51
+	.4byte	0x15cbc
+	.uleb128 0x60
+	.4byte	0x15cb1
+	.4byte	.LLST85
+	.uleb128 0x5b
+	.4byte	.Ldebug_ranges0+0x620
+	.uleb128 0x5d
+	.4byte	0x15cc7
+	.4byte	.LLST86
+	.uleb128 0x5d
+	.4byte	0x15cd2
+	.4byte	.LLST87
+	.uleb128 0x6c
+	.4byte	0x1608b
+	.8byte	.LBB1371
+	.8byte	.LBE1371-.LBB1371
+	.byte	0x5
+	.byte	0x4d
+	.4byte	0x117b8
+	.uleb128 0x53
+	.8byte	.LBB1372
+	.8byte	.LBE1372-.LBB1372
+	.uleb128 0x5d
+	.4byte	0x1609b
+	.4byte	.LLST88
+	.byte	0
+	.byte	0
+	.uleb128 0x5f
+	.8byte	.LBB1373
+	.8byte	.LBE1373-.LBB1373
+	.4byte	0x1180c
+	.uleb128 0x54
+	.4byte	0x15cde
+	.uleb128 0x59
+	.4byte	0x160ca
+	.8byte	.LBB1374
+	.8byte	.LBE1374-.LBB1374
+	.byte	0x5
+	.byte	0x56
+	.uleb128 0x51
+	.4byte	0x160e5
+	.uleb128 0x51
+	.4byte	0x160da
+	.uleb128 0x53
+	.8byte	.LBB1375
+	.8byte	.LBE1375-.LBB1375
+	.uleb128 0x54
+	.4byte	0x160f0
+	.byte	0
+	.byte	0
+	.byte	0
+	.uleb128 0x59
+	.4byte	0x1605f
+	.8byte	.LBB1376
+	.8byte	.LBE1376-.LBB1376
+	.byte	0x5
+	.byte	0x55
+	.uleb128 0x51
+	.4byte	0x16079
+	.uleb128 0x51
+	.4byte	0x1606f
+	.uleb128 0x59
+	.4byte	0x16152
+	.8byte	.LBB1377
+	.8byte	.LBE1377-.LBB1377
+	.byte	0xc9
+	.byte	0x61
+	.uleb128 0x51
+	.4byte	0x1616c
+	.uleb128 0x51
+	.4byte	0x16162
+	.byte	0
+	.byte	0
+	.byte	0
+	.byte	0
+	.uleb128 0x6c
+	.4byte	0x15c6d
+	.8byte	.LBB1385
+	.8byte	.LBE1385-.LBB1385
+	.byte	0x8
+	.byte	0x86
+	.4byte	0x1190d
+	.uleb128 0x51
+	.4byte	0x15c7d
+	.uleb128 0x53
+	.8byte	.LBB1386
+	.8byte	.LBE1386-.LBB1386
+	.uleb128 0x5d
+	.4byte	0x15c88
+	.4byte	.LLST89
+	.uleb128 0x69
+	.4byte	.Ldebug_ranges0+0x670
+	.4byte	0x118d8
+	.uleb128 0x5d
+	.4byte	0x15c94
+	.4byte	.LLST90
+	.uleb128 0x59
+	.4byte	0x160ca
+	.8byte	.LBB1388
+	.8byte	.LBE1388-.LBB1388
+	.byte	0x5
+	.byte	0xfe
+	.uleb128 0x51
+	.4byte	0x160e5
+	.uleb128 0x51
+	.4byte	0x160da
+	.uleb128 0x53
+	.8byte	.LBB1389
+	.8byte	.LBE1389-.LBB1389
+	.uleb128 0x54
+	.4byte	0x160f0
+	.byte	0
+	.byte	0
+	.byte	0
+	.uleb128 0x59
+	.4byte	0x1608b
+	.8byte	.LBB1390
+	.8byte	.LBE1390-.LBB1390
+	.byte	0x5
+	.byte	0xfd
+	.uleb128 0x53
+	.8byte	.LBB1391
+	.8byte	.LBE1391-.LBB1391
+	.uleb128 0x5d
+	.4byte	0x1609b
+	.4byte	.LLST91
+	.byte	0
+	.byte	0
+	.byte	0
+	.byte	0
+	.uleb128 0x4b
+	.8byte	.LVL296
+	.4byte	0x16e36
+	.byte	0
+	.byte	0
+	.uleb128 0x58
+	.4byte	0x15bd5
+	.8byte	.LBB1402
+	.4byte	.Ldebug_ranges0+0x6a0
+	.byte	0x1
+	.2byte	0xbca
+	.4byte	0x11b47
+	.uleb128 0x51
+	.4byte	0x15bfa
+	.uleb128 0x51
+	.4byte	0x15bef
+	.uleb128 0x51
+	.4byte	0x15be5
+	.uleb128 0x6a
+	.4byte	0x15c33
+	.8byte	.LBB1403
+	.4byte	.Ldebug_ranges0+0x6a0
+	.byte	0x8
+	.byte	0x93
+	.uleb128 0x51
+	.4byte	0x15c58
+	.uleb128 0x51
+	.4byte	0x15c4d
+	.uleb128 0x51
+	.4byte	0x15c43
+	.uleb128 0x5b
+	.4byte	.Ldebug_ranges0+0x6a0
+	.uleb128 0x54
+	.4byte	0x15c61
+	.uleb128 0x6b
+	.4byte	0x15ca1
+	.8byte	.LBB1405
+	.4byte	.Ldebug_ranges0+0x6e0
+	.byte	0x8
+	.byte	0x72
+	.4byte	0x11a7c
+	.uleb128 0x51
+	.4byte	0x15cbc
+	.uleb128 0x60
+	.4byte	0x15cb1
+	.4byte	.LLST92
+	.uleb128 0x5b
+	.4byte	.Ldebug_ranges0+0x6e0
+	.uleb128 0x5d
+	.4byte	0x15cc7
+	.4byte	.LLST93
+	.uleb128 0x5d
+	.4byte	0x15cd2
+	.4byte	.LLST94
+	.uleb128 0x6c
+	.4byte	0x1608b
+	.8byte	.LBB1407
+	.8byte	.LBE1407-.LBB1407
+	.byte	0x5
+	.byte	0x4d
+	.4byte	0x119e2
+	.uleb128 0x53
+	.8byte	.LBB1408
+	.8byte	.LBE1408-.LBB1408
+	.uleb128 0x5d
+	.4byte	0x1609b
+	.4byte	.LLST95
+	.byte	0
+	.byte	0
+	.uleb128 0x5f
+	.8byte	.LBB1409
+	.8byte	.LBE1409-.LBB1409
+	.4byte	0x11a36
+	.uleb128 0x54
+	.4byte	0x15cde
+	.uleb128 0x59
+	.4byte	0x160ca
+	.8byte	.LBB1410
+	.8byte	.LBE1410-.LBB1410
+	.byte	0x5
+	.byte	0x56
+	.uleb128 0x51
+	.4byte	0x160e5
+	.uleb128 0x51
+	.4byte	0x160da
+	.uleb128 0x53
+	.8byte	.LBB1411
+	.8byte	.LBE1411-.LBB1411
+	.uleb128 0x54
+	.4byte	0x160f0
+	.byte	0
+	.byte	0
+	.byte	0
+	.uleb128 0x59
+	.4byte	0x1605f
+	.8byte	.LBB1412
+	.8byte	.LBE1412-.LBB1412
+	.byte	0x5
+	.byte	0x55
+	.uleb128 0x51
+	.4byte	0x16079
+	.uleb128 0x51
+	.4byte	0x1606f
+	.uleb128 0x59
+	.4byte	0x16152
+	.8byte	.LBB1413
+	.8byte	.LBE1413-.LBB1413
+	.byte	0xc9
+	.byte	0x61
+	.uleb128 0x51
+	.4byte	0x1616c
+	.uleb128 0x51
+	.4byte	0x16162
+	.byte	0
+	.byte	0
+	.byte	0
+	.byte	0
+	.uleb128 0x6c
+	.4byte	0x15c6d
+	.8byte	.LBB1417
+	.8byte	.LBE1417-.LBB1417
+	.byte	0x8
+	.byte	0x74
+	.4byte	0x11b37
+	.uleb128 0x51
+	.4byte	0x15c7d
+	.uleb128 0x53
+	.8byte	.LBB1418
+	.8byte	.LBE1418-.LBB1418
+	.uleb128 0x5d
+	.4byte	0x15c88
+	.4byte	.LLST96
+	.uleb128 0x69
+	.4byte	.Ldebug_ranges0+0x720
+	.4byte	0x11b02
+	.uleb128 0x5d
+	.4byte	0x15c94
+	.4byte	.LLST97
+	.uleb128 0x59
+	.4byte	0x160ca
+	.8byte	.LBB1420
+	.8byte	.LBE1420-.LBB1420
+	.byte	0x5
+	.byte	0xfe
+	.uleb128 0x51
+	.4byte	0x160e5
+	.uleb128 0x51
+	.4byte	0x160da
+	.uleb128 0x53
+	.8byte	.LBB1421
+	.8byte	.LBE1421-.LBB1421
+	.uleb128 0x54
+	.4byte	0x160f0
+	.byte	0
+	.byte	0
+	.byte	0
+	.uleb128 0x59
+	.4byte	0x1608b
+	.8byte	.LBB1422
+	.8byte	.LBE1422-.LBB1422
+	.byte	0x5
+	.byte	0xfd
+	.uleb128 0x53
+	.8byte	.LBB1423
+	.8byte	.LBE1423-.LBB1423
+	.uleb128 0x5d
+	.4byte	0x1609b
+	.4byte	.LLST98
+	.byte	0
+	.byte	0
+	.byte	0
+	.byte	0
+	.uleb128 0x4b
+	.8byte	.LVL231
+	.4byte	0x16e42
+	.byte	0
+	.byte	0
+	.byte	0
+	.uleb128 0x58
+	.4byte	0x15bd5
+	.8byte	.LBB1431
+	.4byte	.Ldebug_ranges0+0x750
+	.byte	0x1
+	.2byte	0xbb2
+	.4byte	0x11d83
+	.uleb128 0x51
+	.4byte	0x15bfa
+	.uleb128 0x51
+	.4byte	0x15bef
+	.uleb128 0x51
+	.4byte	0x15be5
+	.uleb128 0x6a
+	.4byte	0x15c33
+	.8byte	.LBB1432
+	.4byte	.Ldebug_ranges0+0x750
+	.byte	0x8
+	.byte	0x93
+	.uleb128 0x51
+	.4byte	0x15c58
+	.uleb128 0x51
+	.4byte	0x15c4d
+	.uleb128 0x51
+	.4byte	0x15c43
+	.uleb128 0x5b
+	.4byte	.Ldebug_ranges0+0x750
+	.uleb128 0x5d
+	.4byte	0x15c61
+	.4byte	.LLST99
+	.uleb128 0x6b
+	.4byte	0x15ca1
+	.8byte	.LBB1434
+	.4byte	.Ldebug_ranges0+0x7a0
+	.byte	0x8
+	.byte	0x72
+	.4byte	0x11cab
+	.uleb128 0x51
+	.4byte	0x15cbc
+	.uleb128 0x60
+	.4byte	0x15cb1
+	.4byte	.LLST100
+	.uleb128 0x5b
+	.4byte	.Ldebug_ranges0+0x7a0
+	.uleb128 0x5d
+	.4byte	0x15cc7
+	.4byte	.LLST101
+	.uleb128 0x5d
+	.4byte	0x15cd2
+	.4byte	.LLST102
+	.uleb128 0x6c
+	.4byte	0x1608b
+	.8byte	.LBB1436
+	.8byte	.LBE1436-.LBB1436
+	.byte	0x5
+	.byte	0x4d
+	.4byte	0x11c11
+	.uleb128 0x53
+	.8byte	.LBB1437
+	.8byte	.LBE1437-.LBB1437
+	.uleb128 0x5d
+	.4byte	0x1609b
+	.4byte	.LLST103
+	.byte	0
+	.byte	0
+	.uleb128 0x5f
+	.8byte	.LBB1438
+	.8byte	.LBE1438-.LBB1438
+	.4byte	0x11c65
+	.uleb128 0x54
+	.4byte	0x15cde
+	.uleb128 0x59
+	.4byte	0x160ca
+	.8byte	.LBB1439
+	.8byte	.LBE1439-.LBB1439
+	.byte	0x5
+	.byte	0x56
+	.uleb128 0x51
+	.4byte	0x160e5
+	.uleb128 0x51
+	.4byte	0x160da
+	.uleb128 0x53
+	.8byte	.LBB1440
+	.8byte	.LBE1440-.LBB1440
+	.uleb128 0x54
+	.4byte	0x160f0
+	.byte	0
+	.byte	0
+	.byte	0
+	.uleb128 0x59
+	.4byte	0x1605f
+	.8byte	.LBB1441
+	.8byte	.LBE1441-.LBB1441
+	.byte	0x5
+	.byte	0x55
+	.uleb128 0x51
+	.4byte	0x16079
+	.uleb128 0x51
+	.4byte	0x1606f
+	.uleb128 0x59
+	.4byte	0x16152
+	.8byte	.LBB1442
+	.8byte	.LBE1442-.LBB1442
+	.byte	0xc9
+	.byte	0x61
+	.uleb128 0x51
+	.4byte	0x1616c
+	.uleb128 0x51
+	.4byte	0x16162
+	.byte	0
+	.byte	0
+	.byte	0
+	.byte	0
+	.uleb128 0x6c
+	.4byte	0x15c6d
+	.8byte	.LBB1446
+	.8byte	.LBE1446-.LBB1446
+	.byte	0x8
+	.byte	0x74
+	.4byte	0x11d66
+	.uleb128 0x51
+	.4byte	0x15c7d
+	.uleb128 0x53
+	.8byte	.LBB1447
+	.8byte	.LBE1447-.LBB1447
+	.uleb128 0x5d
+	.4byte	0x15c88
+	.4byte	.LLST104
+	.uleb128 0x69
+	.4byte	.Ldebug_ranges0+0x7e0
+	.4byte	0x11d31
+	.uleb128 0x5d
+	.4byte	0x15c94
+	.4byte	.LLST105
+	.uleb128 0x59
+	.4byte	0x160ca
+	.8byte	.LBB1449
+	.8byte	.LBE1449-.LBB1449
+	.byte	0x5
+	.byte	0xfe
+	.uleb128 0x51
+	.4byte	0x160e5
+	.uleb128 0x51
+	.4byte	0x160da
+	.uleb128 0x53
+	.8byte	.LBB1450
+	.8byte	.LBE1450-.LBB1450
+	.uleb128 0x54
+	.4byte	0x160f0
+	.byte	0
+	.byte	0
+	.byte	0
+	.uleb128 0x59
+	.4byte	0x1608b
+	.8byte	.LBB1451
+	.8byte	.LBE1451-.LBB1451
+	.byte	0x5
+	.byte	0xfd
+	.uleb128 0x53
+	.8byte	.LBB1452
+	.8byte	.LBE1452-.LBB1452
+	.uleb128 0x5d
+	.4byte	0x1609b
+	.4byte	.LLST106
+	.byte	0
+	.byte	0
+	.byte	0
+	.byte	0
+	.uleb128 0x4b
+	.8byte	.LVL248
+	.4byte	0x16e42
+	.uleb128 0x4b
+	.8byte	.LVL328
+	.4byte	0x16cb7
+	.byte	0
+	.byte	0
+	.byte	0
+	.uleb128 0x58
+	.4byte	0x15ba6
+	.8byte	.LBB1462
+	.4byte	.Ldebug_ranges0+0x810
+	.byte	0x1
+	.2byte	0xbc2
+	.4byte	0x11f3d
+	.uleb128 0x51
+	.4byte	0x15bcb
+	.uleb128 0x51
+	.4byte	0x15bc0
+	.uleb128 0x51
+	.4byte	0x15bb6
+	.uleb128 0x6a
+	.4byte	0x15c04
+	.8byte	.LBB1463
+	.4byte	.Ldebug_ranges0+0x810
+	.byte	0x8
+	.byte	0x9b
+	.uleb128 0x51
+	.4byte	0x15c29
+	.uleb128 0x51
+	.4byte	0x15c1e
+	.uleb128 0x51
+	.4byte	0x15c14
+	.uleb128 0x6b
+	.4byte	0x15ca1
+	.8byte	.LBB1465
+	.4byte	.Ldebug_ranges0+0x870
+	.byte	0x8
+	.byte	0x84
+	.4byte	0x11ea0
+	.uleb128 0x51
+	.4byte	0x15cbc
+	.uleb128 0x60
+	.4byte	0x15cb1
+	.4byte	.LLST107
+	.uleb128 0x5b
+	.4byte	.Ldebug_ranges0+0x870
+	.uleb128 0x5d
+	.4byte	0x15cc7
+	.4byte	.LLST108
+	.uleb128 0x5d
+	.4byte	0x15cd2
+	.4byte	.LLST109
+	.uleb128 0x6c
+	.4byte	0x1608b
+	.8byte	.LBB1467
+	.8byte	.LBE1467-.LBB1467
+	.byte	0x5
+	.byte	0x4d
+	.4byte	0x11e3f
+	.uleb128 0x53
+	.8byte	.LBB1468
+	.8byte	.LBE1468-.LBB1468
+	.uleb128 0x5d
+	.4byte	0x1609b
+	.4byte	.LLST110
+	.byte	0
+	.byte	0
+	.uleb128 0x6c
+	.4byte	0x1605f
+	.8byte	.LBB1469
+	.8byte	.LBE1469-.LBB1469
+	.byte	0x5
+	.byte	0x55
+	.4byte	0x11e87
+	.uleb128 0x51
+	.4byte	0x16079
+	.uleb128 0x51
+	.4byte	0x1606f
+	.uleb128 0x59
+	.4byte	0x16152
+	.8byte	.LBB1470
+	.8byte	.LBE1470-.LBB1470
+	.byte	0xc9
+	.byte	0x61
+	.uleb128 0x51
+	.4byte	0x1616c
+	.uleb128 0x51
+	.4byte	0x16162
+	.byte	0
+	.byte	0
+	.uleb128 0x53
+	.8byte	.LBB1472
+	.8byte	.LBE1472-.LBB1472
+	.uleb128 0x54
+	.4byte	0x15cde
+	.byte	0
+	.byte	0
+	.byte	0
+	.uleb128 0x6c
+	.4byte	0x15c6d
+	.8byte	.LBB1479
+	.8byte	.LBE1479-.LBB1479
+	.byte	0x8
+	.byte	0x86
+	.4byte	0x11f2e
+	.uleb128 0x51
+	.4byte	0x15c7d
+	.uleb128 0x53
+	.8byte	.LBB1480
+	.8byte	.LBE1480-.LBB1480
+	.uleb128 0x5d
+	.4byte	0x15c88
+	.4byte	.LLST111
+	.uleb128 0x6c
+	.4byte	0x1608b
+	.8byte	.LBB1481
+	.8byte	.LBE1481-.LBB1481
+	.byte	0x5
+	.byte	0xfd
+	.4byte	0x11f11
+	.uleb128 0x53
+	.8byte	.LBB1482
+	.8byte	.LBE1482-.LBB1482
+	.uleb128 0x5d
+	.4byte	0x1609b
+	.4byte	.LLST112
+	.byte	0
+	.byte	0
+	.uleb128 0x53
+	.8byte	.LBB1483
+	.8byte	.LBE1483-.LBB1483
+	.uleb128 0x5d
+	.4byte	0x15c94
+	.4byte	.LLST113
+	.byte	0
+	.byte	0
+	.byte	0
+	.uleb128 0x4b
+	.8byte	.LVL303
+	.4byte	0x16e36
+	.byte	0
+	.byte	0
+	.uleb128 0x4b
+	.8byte	.LVL96
+	.4byte	0x16cc1
+	.uleb128 0x4b
+	.8byte	.LVL112
+	.4byte	0x16c5b
+	.uleb128 0x4b
+	.8byte	.LVL134
+	.4byte	0x16c5b
+	.uleb128 0x4b
+	.8byte	.LVL135
+	.4byte	0x16c5b
+	.uleb128 0x4b
+	.8byte	.LVL136
+	.4byte	0x16c5b
+	.uleb128 0x4b
+	.8byte	.LVL137
+	.4byte	0x16c5b
+	.uleb128 0x4b
+	.8byte	.LVL164
+	.4byte	0x16c5b
+	.uleb128 0x4b
+	.8byte	.LVL177
+	.4byte	0x16e4e
+	.uleb128 0x4b
+	.8byte	.LVL178
+	.4byte	0x16e59
+	.uleb128 0x4b
+	.8byte	.LVL179
+	.4byte	0x16d81
+	.uleb128 0x4b
+	.8byte	.LVL180
+	.4byte	0x16e64
+	.uleb128 0x4b
+	.8byte	.LVL181
+	.4byte	0x16e2b
+	.uleb128 0x4b
+	.8byte	.LVL196
+	.4byte	0x16c5b
+	.uleb128 0x4b
+	.8byte	.LVL197
+	.4byte	0x16c5b
+	.uleb128 0x4b
+	.8byte	.LVL210
+	.4byte	0x16c5b
+	.uleb128 0x4b
+	.8byte	.LVL219
+	.4byte	0x16cc1
+	.uleb128 0x4b
+	.8byte	.LVL232
+	.4byte	0x16e2b
+	.uleb128 0x4b
+	.8byte	.LVL233
+	.4byte	0x16e6f
+	.uleb128 0x4b
+	.8byte	.LVL235
+	.4byte	0x16d3d
+	.uleb128 0x4b
+	.8byte	.LVL250
+	.4byte	0x16d27
+	.uleb128 0x4b
+	.8byte	.LVL252
+	.4byte	0x16e2b
+	.uleb128 0x4b
+	.8byte	.LVL261
+	.4byte	0x16e7a
+	.uleb128 0x4b
+	.8byte	.LVL263
+	.4byte	0x16e85
+	.uleb128 0x4b
+	.8byte	.LVL288
+	.4byte	0x16cc1
+	.uleb128 0x4b
+	.8byte	.LVL305
+	.4byte	0x16d81
+	.uleb128 0x4b
+	.8byte	.LVL311
+	.4byte	0x16cc1
+	.uleb128 0x4b
+	.8byte	.LVL317
+	.4byte	0x16cc1
+	.uleb128 0x4b
+	.8byte	.LVL323
+	.4byte	0x16cc1
+	.uleb128 0x4b
+	.8byte	.LVL326
+	.4byte	0x16ddc
+	.byte	0
+	.uleb128 0x5
+	.4byte	0x68
+	.4byte	0x120c7
+	.uleb128 0x6
+	.4byte	0x4f
+	.byte	0xa
+	.byte	0
+	.uleb128 0x3
+	.4byte	0x120b7
+	.uleb128 0x61
+	.4byte	.LASF3073
+	.byte	0x1
+	.2byte	0xb39
+	.4byte	0xc6
+	.byte	0x1
+	.4byte	0x120f6
+	.uleb128 0x63
+	.4byte	.LASF2992
+	.byte	0x1
+	.2byte	0xb39
+	.4byte	0xe0e4
+	.uleb128 0x4f
+	.string	"dev"
+	.byte	0x1
+	.2byte	0xb3b
+	.4byte	0xa496
+	.byte	0
+	.uleb128 0x4a
+	.4byte	.LASF3075
+	.byte	0x1
+	.2byte	0xb33
+	.8byte	.LFB2847
+	.8byte	.LFE2847-.LFB2847
+	.uleb128 0x1
+	.byte	0x9c
+	.4byte	0x12130
+	.uleb128 0x4e
+	.string	"t"
+	.byte	0x1
+	.2byte	0xb33
+	.4byte	0x31cc
+	.4byte	.LLST192
+	.uleb128 0x4b
+	.8byte	.LVL646
+	.4byte	0x13669
+	.byte	0
+	.uleb128 0x4a
+	.4byte	.LASF3076
+	.byte	0x1
+	.2byte	0xb29
+	.8byte	.LFB2846
+	.8byte	.LFE2846-.LFB2846
+	.uleb128 0x1
+	.byte	0x9c
+	.4byte	0x12176
+	.uleb128 0x4e
+	.string	"t"
+	.byte	0x1
+	.2byte	0xb29
+	.4byte	0x31cc
+	.4byte	.LLST23
+	.uleb128 0x43
+	.4byte	.LASF2943
+	.byte	0x1
+	.2byte	0xb2b
+	.4byte	0xe81f
+	.uleb128 0x4b
+	.8byte	.LVL81
+	.4byte	0x16c5b
+	.byte	0
+	.uleb128 0x61
+	.4byte	.LASF3077
+	.byte	0x1
+	.2byte	0xb18
+	.4byte	0xc6
+	.byte	0x1
+	.4byte	0x121a0
+	.uleb128 0x63
+	.4byte	.LASF2992
+	.byte	0x1
+	.2byte	0xb18
+	.4byte	0xe0e4
+	.uleb128 0x4f
+	.string	"buf"
+	.byte	0x1
+	.2byte	0xb1a
+	.4byte	0xe472
+	.byte	0
+	.uleb128 0x4c
+	.4byte	.LASF3078
+	.byte	0x1
+	.2byte	0x92b
+	.4byte	0xc6
+	.8byte	.LFB2844
+	.8byte	.LFE2844-.LFB2844
+	.uleb128 0x1
+	.byte	0x9c
+	.4byte	0x133a4
+	.uleb128 0x4e
+	.string	"ptr"
+	.byte	0x1
+	.2byte	0x92b
+	.4byte	0x458
+	.4byte	.LLST358
+	.uleb128 0x57
+	.string	"ebc"
+	.byte	0x1
+	.2byte	0x92d
+	.4byte	0xe4d7
+	.4byte	.LLST359
+	.uleb128 0x43
+	.4byte	.LASF2943
+	.byte	0x1
+	.2byte	0x92e
+	.4byte	0xe81f
+	.uleb128 0x43
+	.4byte	.LASF2992
+	.byte	0x1
+	.2byte	0x92f
+	.4byte	0xe0e4
+	.uleb128 0x4f
+	.string	"buf"
+	.byte	0x1
+	.2byte	0x930
+	.4byte	0xe472
+	.uleb128 0x56
+	.4byte	.LASF3079
+	.byte	0x1
+	.2byte	0x931
+	.4byte	0xc6
+	.4byte	.LLST360
+	.uleb128 0x56
+	.4byte	.LASF2960
+	.byte	0x1
+	.2byte	0x932
+	.4byte	0xc6
+	.4byte	.LLST361
+	.uleb128 0x49
+	.4byte	.LASF874
+	.byte	0x1
+	.2byte	0x933
+	.4byte	0xc6
+	.uleb128 0x1
+	.byte	0x65
+	.uleb128 0x56
+	.4byte	.LASF3080
+	.byte	0x1
+	.2byte	0x934
+	.4byte	0xc6
+	.4byte	.LLST362
+	.uleb128 0x43
+	.4byte	.LASF3081
+	.byte	0x1
+	.2byte	0x935
+	.4byte	0xc6
+	.uleb128 0x6d
+	.4byte	.LASF3101
+	.byte	0x1
+	.2byte	0xa30
+	.uleb128 0x6e
+	.4byte	.LASF3083
+	.byte	0x1
+	.2byte	0xadf
+	.8byte	.L1365
+	.uleb128 0x69
+	.4byte	.Ldebug_ranges0+0x2390
+	.4byte	0x12315
+	.uleb128 0x43
+	.4byte	.LASF3082
+	.byte	0x1
+	.2byte	0x94d
+	.4byte	0xc6
+	.uleb128 0x53
+	.8byte	.LBB2378
+	.8byte	.LBE2378-.LBB2378
+	.uleb128 0x6e
+	.4byte	.LASF3084
+	.byte	0x1
+	.2byte	0x94d
+	.8byte	.L1266
+	.uleb128 0x49
+	.4byte	.LASF3085
+	.byte	0x1
+	.2byte	0x94d
+	.4byte	0x1528
+	.uleb128 0x2
+	.byte	0x91
+	.sleb128 -48
+	.uleb128 0x43
+	.4byte	.LASF3082
+	.byte	0x1
+	.2byte	0x94d
+	.4byte	0x199
+	.uleb128 0x5f
+	.8byte	.LBB2379
+	.8byte	.LBE2379-.LBB2379
+	.4byte	0x122f9
+	.uleb128 0x56
+	.4byte	.LASF3086
+	.byte	0x1
+	.2byte	0x94d
+	.4byte	0x199
+	.4byte	.LLST390
+	.uleb128 0x4b
+	.8byte	.LVL1533
+	.4byte	0x16e90
+	.uleb128 0x4b
+	.8byte	.LVL1534
+	.4byte	0x16e9b
+	.byte	0
+	.uleb128 0x4b
+	.8byte	.LVL1530
+	.4byte	0x16ea7
+	.uleb128 0x4b
+	.8byte	.LVL1535
+	.4byte	0x16eb3
+	.byte	0
+	.byte	0
+	.uleb128 0x69
+	.4byte	.Ldebug_ranges0+0x24f0
+	.4byte	0x123cf
+	.uleb128 0x43
+	.4byte	.LASF3082
+	.byte	0x1
+	.2byte	0x9d6
+	.4byte	0xc6
+	.uleb128 0x53
+	.8byte	.LBB2409
+	.8byte	.LBE2409-.LBB2409
+	.uleb128 0x6e
+	.4byte	.LASF3084
+	.byte	0x1
+	.2byte	0x9d6
+	.8byte	.L1337
+	.uleb128 0x49
+	.4byte	.LASF3085
+	.byte	0x1
+	.2byte	0x9d6
+	.4byte	0x1528
+	.uleb128 0x2
+	.byte	0x91
+	.sleb128 -48
+	.uleb128 0x43
+	.4byte	.LASF3082
+	.byte	0x1
+	.2byte	0x9d6
+	.4byte	0x199
+	.uleb128 0x5f
+	.8byte	.LBB2410
+	.8byte	.LBE2410-.LBB2410
+	.4byte	0x123b3
+	.uleb128 0x56
+	.4byte	.LASF3086
+	.byte	0x1
+	.2byte	0x9d6
+	.4byte	0x199
+	.4byte	.LLST399
+	.uleb128 0x4b
+	.8byte	.LVL1615
+	.4byte	0x16e9b
+	.uleb128 0x4b
+	.8byte	.LVL1617
+	.4byte	0x16e90
+	.uleb128 0x4b
+	.8byte	.LVL1618
+	.4byte	0x16e9b
+	.byte	0
+	.uleb128 0x4b
+	.8byte	.LVL1614
+	.4byte	0x16ea7
+	.uleb128 0x4b
+	.8byte	.LVL1619
+	.4byte	0x16eb3
+	.byte	0
+	.byte	0
+	.uleb128 0x69
+	.4byte	.Ldebug_ranges0+0x23c0
+	.4byte	0x12419
+	.uleb128 0x4f
+	.string	"ret"
+	.byte	0x1
+	.2byte	0x9dc
+	.4byte	0xc6
+	.uleb128 0x4b
+	.8byte	.LVL1430
+	.4byte	0x16a80
+	.uleb128 0x4b
+	.8byte	.LVL1580
+	.4byte	0x16ebf
+	.uleb128 0x4b
+	.8byte	.LVL1581
+	.4byte	0x16c5b
+	.uleb128 0x4b
+	.8byte	.LVL1582
+	.4byte	0x16e7a
+	.byte	0
+	.uleb128 0x69
+	.4byte	.Ldebug_ranges0+0x23f0
+	.4byte	0x1255c
+	.uleb128 0x43
+	.4byte	.LASF3082
+	.byte	0x1
+	.2byte	0x9f4
+	.4byte	0x199
+	.uleb128 0x5f
+	.8byte	.LBB2384
+	.8byte	.LBE2384-.LBB2384
+	.4byte	0x12454
+	.uleb128 0x56
+	.4byte	.LASF3087
+	.byte	0x1
+	.2byte	0x9f4
+	.4byte	0x2b0
+	.4byte	.LLST391
+	.byte	0
+	.uleb128 0x69
+	.4byte	.Ldebug_ranges0+0x2430
+	.4byte	0x12530
+	.uleb128 0x6e
+	.4byte	.LASF3084
+	.byte	0x1
+	.2byte	0x9f4
+	.8byte	.L1344
+	.uleb128 0x49
+	.4byte	.LASF3085
+	.byte	0x1
+	.2byte	0x9f4
+	.4byte	0x1528
+	.uleb128 0x2
+	.byte	0x91
+	.sleb128 -48
+	.uleb128 0x56
+	.4byte	.LASF3082
+	.byte	0x1
+	.2byte	0x9f4
+	.4byte	0x199
+	.4byte	.LLST392
+	.uleb128 0x69
+	.4byte	.Ldebug_ranges0+0x2460
+	.4byte	0x124e6
+	.uleb128 0x56
+	.4byte	.LASF3086
+	.byte	0x1
+	.2byte	0x9f4
+	.4byte	0x199
+	.4byte	.LLST393
+	.uleb128 0x5f
+	.8byte	.LBB2389
+	.8byte	.LBE2389-.LBB2389
+	.4byte	0x124cb
+	.uleb128 0x56
+	.4byte	.LASF3087
+	.byte	0x1
+	.2byte	0x9f4
+	.4byte	0x2b0
+	.4byte	.LLST394
+	.byte	0
+	.uleb128 0x4b
+	.8byte	.LVL1567
+	.4byte	0x16e9b
+	.uleb128 0x4b
+	.8byte	.LVL1587
+	.4byte	0x16eca
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x15f8f
+	.8byte	.LBB2386
+	.8byte	.LBE2386-.LBB2386
+	.byte	0x1
+	.2byte	0x9f4
+	.4byte	0x12515
+	.uleb128 0x51
+	.4byte	0x15fa0
+	.uleb128 0x4b
+	.8byte	.LVL1564
+	.4byte	0x16ed5
+	.byte	0
+	.uleb128 0x4b
+	.8byte	.LVL1566
+	.4byte	0x16ea7
+	.uleb128 0x4b
+	.8byte	.LVL1570
+	.4byte	0x16eb3
+	.byte	0
+	.uleb128 0x5a
+	.4byte	0x15f8f
+	.8byte	.LBB2382
+	.8byte	.LBE2382-.LBB2382
+	.byte	0x1
+	.2byte	0x9f4
+	.uleb128 0x51
+	.4byte	0x15fa0
+	.uleb128 0x4b
+	.8byte	.LVL1433
+	.4byte	0x16ed5
+	.byte	0
+	.byte	0
+	.uleb128 0x69
+	.4byte	.Ldebug_ranges0+0x2490
+	.4byte	0x12609
+	.uleb128 0x43
+	.4byte	.LASF3082
+	.byte	0x1
+	.2byte	0xa05
+	.4byte	0xc6
+	.uleb128 0x53
+	.8byte	.LBB2393
+	.8byte	.LBE2393-.LBB2393
+	.uleb128 0x6e
+	.4byte	.LASF3084
+	.byte	0x1
+	.2byte	0xa05
+	.8byte	.L1354
+	.uleb128 0x49
+	.4byte	.LASF3085
+	.byte	0x1
+	.2byte	0xa05
+	.4byte	0x1528
+	.uleb128 0x2
+	.byte	0x91
+	.sleb128 -48
+	.uleb128 0x43
+	.4byte	.LASF3082
+	.byte	0x1
+	.2byte	0xa05
+	.4byte	0x199
+	.uleb128 0x5f
+	.8byte	.LBB2394
+	.8byte	.LBE2394-.LBB2394
+	.4byte	0x125ed
+	.uleb128 0x56
+	.4byte	.LASF3086
+	.byte	0x1
+	.2byte	0xa05
+	.4byte	0x199
+	.4byte	.LLST395
+	.uleb128 0x4b
+	.8byte	.LVL1634
+	.4byte	0x16e90
+	.uleb128 0x4b
+	.8byte	.LVL1635
+	.4byte	0x16e9b
+	.byte	0
+	.uleb128 0x4b
+	.8byte	.LVL1632
+	.4byte	0x16ea7
+	.uleb128 0x4b
+	.8byte	.LVL1636
+	.4byte	0x16eb3
+	.byte	0
+	.byte	0
+	.uleb128 0x5f
+	.8byte	.LBB2446
+	.8byte	.LBE2446-.LBB2446
+	.4byte	0x126c2
+	.uleb128 0x43
+	.4byte	.LASF3082
+	.byte	0x1
+	.2byte	0xa3f
+	.4byte	0xc6
+	.uleb128 0x53
+	.8byte	.LBB2447
+	.8byte	.LBE2447-.LBB2447
+	.uleb128 0x6e
+	.4byte	.LASF3084
+	.byte	0x1
+	.2byte	0xa3f
+	.8byte	.L1377
+	.uleb128 0x49
+	.4byte	.LASF3085
+	.byte	0x1
+	.2byte	0xa3f
+	.4byte	0x1528
+	.uleb128 0x2
+	.byte	0x91
+	.sleb128 -48
+	.uleb128 0x43
+	.4byte	.LASF3082
+	.byte	0x1
+	.2byte	0xa3f
+	.4byte	0x199
+	.uleb128 0x5f
+	.8byte	.LBB2448
+	.8byte	.LBE2448-.LBB2448
+	.4byte	0x126a6
+	.uleb128 0x56
+	.4byte	.LASF3086
+	.byte	0x1
+	.2byte	0xa3f
+	.4byte	0x199
+	.4byte	.LLST407
+	.uleb128 0x4b
+	.8byte	.LVL1598
+	.4byte	0x16e90
+	.uleb128 0x4b
+	.8byte	.LVL1599
+	.4byte	0x16e9b
+	.byte	0
+	.uleb128 0x4b
+	.8byte	.LVL1596
+	.4byte	0x16ea7
+	.uleb128 0x4b
+	.8byte	.LVL1600
+	.4byte	0x16eb3
+	.byte	0
+	.byte	0
+	.uleb128 0x69
+	.4byte	.Ldebug_ranges0+0x2630
+	.4byte	0x1276f
+	.uleb128 0x43
+	.4byte	.LASF3082
+	.byte	0x1
+	.2byte	0xa45
+	.4byte	0xc6
+	.uleb128 0x53
+	.8byte	.LBB2442
+	.8byte	.LBE2442-.LBB2442
+	.uleb128 0x6e
+	.4byte	.LASF3084
+	.byte	0x1
+	.2byte	0xa45
+	.8byte	.L1381
+	.uleb128 0x49
+	.4byte	.LASF3085
+	.byte	0x1
+	.2byte	0xa45
+	.4byte	0x1528
+	.uleb128 0x2
+	.byte	0x91
+	.sleb128 -48
+	.uleb128 0x43
+	.4byte	.LASF3082
+	.byte	0x1
+	.2byte	0xa45
+	.4byte	0x199
+	.uleb128 0x5f
+	.8byte	.LBB2443
+	.8byte	.LBE2443-.LBB2443
+	.4byte	0x12760
+	.uleb128 0x56
+	.4byte	.LASF3086
+	.byte	0x1
+	.2byte	0xa45
+	.4byte	0x199
+	.4byte	.LLST406
+	.uleb128 0x4b
+	.8byte	.LVL1623
+	.4byte	0x16e9b
+	.uleb128 0x4b
+	.8byte	.LVL1625
+	.4byte	0x16e90
+	.uleb128 0x4b
+	.8byte	.LVL1626
+	.4byte	0x16e9b
+	.byte	0
+	.uleb128 0x4b
+	.8byte	.LVL1622
+	.4byte	0x16ea7
+	.byte	0
+	.byte	0
+	.uleb128 0x5f
+	.8byte	.LBB2405
+	.8byte	.LBE2405-.LBB2405
+	.4byte	0x12828
+	.uleb128 0x43
+	.4byte	.LASF3082
+	.byte	0x1
+	.2byte	0xa72
+	.4byte	0xc6
+	.uleb128 0x53
+	.8byte	.LBB2406
+	.8byte	.LBE2406-.LBB2406
+	.uleb128 0x6e
+	.4byte	.LASF3084
+	.byte	0x1
+	.2byte	0xa72
+	.8byte	.L1389
+	.uleb128 0x49
+	.4byte	.LASF3085
+	.byte	0x1
+	.2byte	0xa72
+	.4byte	0x1528
+	.uleb128 0x2
+	.byte	0x91
+	.sleb128 -48
+	.uleb128 0x43
+	.4byte	.LASF3082
+	.byte	0x1
+	.2byte	0xa72
+	.4byte	0x199
+	.uleb128 0x5f
+	.8byte	.LBB2407
+	.8byte	.LBE2407-.LBB2407
+	.4byte	0x1280c
+	.uleb128 0x56
+	.4byte	.LASF3086
+	.byte	0x1
+	.2byte	0xa72
+	.4byte	0x199
+	.4byte	.LLST398
+	.uleb128 0x4b
+	.8byte	.LVL1484
+	.4byte	0x16e90
+	.uleb128 0x4b
+	.8byte	.LVL1485
+	.4byte	0x16e9b
+	.byte	0
+	.uleb128 0x4b
+	.8byte	.LVL1482
+	.4byte	0x16ea7
+	.uleb128 0x4b
+	.8byte	.LVL1486
+	.4byte	0x16eb3
+	.byte	0
+	.byte	0
+	.uleb128 0x5f
+	.8byte	.LBB2411
+	.8byte	.LBE2411-.LBB2411
+	.4byte	0x1285b
+	.uleb128 0x57
+	.string	"ret"
+	.byte	0x1
+	.2byte	0xa7c
+	.4byte	0xc6
+	.4byte	.LLST400
+	.uleb128 0x4b
+	.8byte	.LVL1493
+	.4byte	0x16a80
+	.byte	0
+	.uleb128 0x69
+	.4byte	.Ldebug_ranges0+0x2520
+	.4byte	0x1299e
+	.uleb128 0x43
+	.4byte	.LASF3082
+	.byte	0x1
+	.2byte	0xab8
+	.4byte	0x199
+	.uleb128 0x5f
+	.8byte	.LBB2415
+	.8byte	.LBE2415-.LBB2415
+	.4byte	0x12896
+	.uleb128 0x56
+	.4byte	.LASF3087
+	.byte	0x1
+	.2byte	0xab8
+	.4byte	0x2b0
+	.4byte	.LLST401
+	.byte	0
+	.uleb128 0x69
+	.4byte	.Ldebug_ranges0+0x2550
+	.4byte	0x12972
+	.uleb128 0x6e
+	.4byte	.LASF3084
+	.byte	0x1
+	.2byte	0xab8
+	.8byte	.L1406
+	.uleb128 0x49
+	.4byte	.LASF3085
+	.byte	0x1
+	.2byte	0xab8
+	.4byte	0x1528
+	.uleb128 0x2
+	.byte	0x91
+	.sleb128 -48
+	.uleb128 0x56
+	.4byte	.LASF3082
+	.byte	0x1
+	.2byte	0xab8
+	.4byte	0x199
+	.4byte	.LLST402
+	.uleb128 0x69
+	.4byte	.Ldebug_ranges0+0x2580
+	.4byte	0x12928
+	.uleb128 0x56
+	.4byte	.LASF3086
+	.byte	0x1
+	.2byte	0xab8
+	.4byte	0x199
+	.4byte	.LLST403
+	.uleb128 0x5f
+	.8byte	.LBB2420
+	.8byte	.LBE2420-.LBB2420
+	.4byte	0x1290d
+	.uleb128 0x56
+	.4byte	.LASF3087
+	.byte	0x1
+	.2byte	0xab8
+	.4byte	0x2b0
+	.4byte	.LLST404
+	.byte	0
+	.uleb128 0x4b
+	.8byte	.LVL1507
+	.4byte	0x16e9b
+	.uleb128 0x4b
+	.8byte	.LVL1612
+	.4byte	0x16eca
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x15f8f
+	.8byte	.LBB2417
+	.8byte	.LBE2417-.LBB2417
+	.byte	0x1
+	.2byte	0xab8
+	.4byte	0x12957
+	.uleb128 0x51
+	.4byte	0x15fa0
+	.uleb128 0x4b
+	.8byte	.LVL1504
+	.4byte	0x16ed5
+	.byte	0
+	.uleb128 0x4b
+	.8byte	.LVL1506
+	.4byte	0x16ea7
+	.uleb128 0x4b
+	.8byte	.LVL1510
+	.4byte	0x16eb3
+	.byte	0
+	.uleb128 0x5a
+	.4byte	0x15f8f
+	.8byte	.LBB2413
+	.8byte	.LBE2413-.LBB2413
+	.byte	0x1
+	.2byte	0xab8
+	.uleb128 0x51
+	.4byte	0x15fa0
+	.uleb128 0x4b
+	.8byte	.LVL1501
+	.4byte	0x16ed5
+	.byte	0
+	.byte	0
+	.uleb128 0x69
+	.4byte	.Ldebug_ranges0+0x25b0
+	.4byte	0x12a4b
+	.uleb128 0x43
+	.4byte	.LASF3082
+	.byte	0x1
+	.2byte	0xad3
+	.4byte	0xc6
+	.uleb128 0x53
+	.8byte	.LBB2424
+	.8byte	.LBE2424-.LBB2424
+	.uleb128 0x6e
+	.4byte	.LASF3084
+	.byte	0x1
+	.2byte	0xad3
+	.8byte	.L1411
+	.uleb128 0x49
+	.4byte	.LASF3085
+	.byte	0x1
+	.2byte	0xad3
+	.4byte	0x1528
+	.uleb128 0x2
+	.byte	0x91
+	.sleb128 -48
+	.uleb128 0x43
+	.4byte	.LASF3082
+	.byte	0x1
+	.2byte	0xad3
+	.4byte	0x199
+	.uleb128 0x5f
+	.8byte	.LBB2425
+	.8byte	.LBE2425-.LBB2425
+	.4byte	0x12a2f
+	.uleb128 0x56
+	.4byte	.LASF3086
+	.byte	0x1
+	.2byte	0xad3
+	.4byte	0x199
+	.4byte	.LLST405
+	.uleb128 0x4b
+	.8byte	.LVL1538
+	.4byte	0x16e90
+	.uleb128 0x4b
+	.8byte	.LVL1539
+	.4byte	0x16e9b
+	.byte	0
+	.uleb128 0x4b
+	.8byte	.LVL1536
+	.4byte	0x16ea7
+	.uleb128 0x4b
+	.8byte	.LVL1540
+	.4byte	0x16eb3
+	.byte	0
+	.byte	0
+	.uleb128 0x69
+	.4byte	.Ldebug_ranges0+0x1eb0
+	.4byte	0x12b1d
+	.uleb128 0x43
+	.4byte	.LASF3082
+	.byte	0x1
+	.2byte	0xaf8
+	.4byte	0x199
+	.uleb128 0x6f
+	.4byte	0x12a72
+	.uleb128 0x43
+	.4byte	.LASF3087
+	.byte	0x1
+	.2byte	0xaf8
+	.4byte	0x2b0
+	.byte	0
+	.uleb128 0x5b
+	.4byte	.Ldebug_ranges0+0x1eb0
+	.uleb128 0x6e
+	.4byte	.LASF3084
+	.byte	0x1
+	.2byte	0xaf8
+	.8byte	.L1420
+	.uleb128 0x49
+	.4byte	.LASF3085
+	.byte	0x1
+	.2byte	0xaf8
+	.4byte	0x1528
+	.uleb128 0x2
+	.byte	0x91
+	.sleb128 -48
+	.uleb128 0x56
+	.4byte	.LASF3082
+	.byte	0x1
+	.2byte	0xaf8
+	.4byte	0x199
+	.4byte	.LLST363
+	.uleb128 0x69
+	.4byte	.Ldebug_ranges0+0x1f10
+	.4byte	0x12b01
+	.uleb128 0x56
+	.4byte	.LASF3086
+	.byte	0x1
+	.2byte	0xaf8
+	.4byte	0x199
+	.4byte	.LLST364
+	.uleb128 0x69
+	.4byte	.Ldebug_ranges0+0x1f80
+	.4byte	0x12ad9
+	.uleb128 0x56
+	.4byte	.LASF3087
+	.byte	0x1
+	.2byte	0xaf8
+	.4byte	0x2b0
+	.4byte	.LLST365
+	.byte	0
+	.uleb128 0x4b
+	.8byte	.LVL1455
+	.4byte	0x16e9b
+	.uleb128 0x4b
+	.8byte	.LVL1460
+	.4byte	0x16eca
+	.uleb128 0x4b
+	.8byte	.LVL1461
+	.4byte	0x16e9b
+	.byte	0
+	.uleb128 0x4b
+	.8byte	.LVL1453
+	.4byte	0x16ea7
+	.uleb128 0x4b
+	.8byte	.LVL1464
+	.4byte	0x16eb3
+	.byte	0
+	.byte	0
+	.uleb128 0x5f
+	.8byte	.LBB2396
+	.8byte	.LBE2396-.LBB2396
+	.4byte	0x12be3
+	.uleb128 0x43
+	.4byte	.LASF3082
+	.byte	0x1
+	.2byte	0xb01
+	.4byte	0xc6
+	.uleb128 0x53
+	.8byte	.LBB2397
+	.8byte	.LBE2397-.LBB2397
+	.uleb128 0x6e
+	.4byte	.LASF3084
+	.byte	0x1
+	.2byte	0xb01
+	.8byte	.L1426
+	.uleb128 0x49
+	.4byte	.LASF3085
+	.byte	0x1
+	.2byte	0xb01
+	.4byte	0x1528
+	.uleb128 0x2
+	.byte	0x91
+	.sleb128 -48
+	.uleb128 0x43
+	.4byte	.LASF3082
+	.byte	0x1
+	.2byte	0xb01
+	.4byte	0x199
+	.uleb128 0x5f
+	.8byte	.LBB2398
+	.8byte	.LBE2398-.LBB2398
+	.4byte	0x12bc7
+	.uleb128 0x56
+	.4byte	.LASF3086
+	.byte	0x1
+	.2byte	0xb01
+	.4byte	0x199
+	.4byte	.LLST396
+	.uleb128 0x4b
+	.8byte	.LVL1467
+	.4byte	0x16e9b
+	.uleb128 0x4b
+	.8byte	.LVL1469
+	.4byte	0x16e90
+	.uleb128 0x4b
+	.8byte	.LVL1470
+	.4byte	0x16e9b
+	.byte	0
+	.uleb128 0x4b
+	.8byte	.LVL1466
+	.4byte	0x16ea7
+	.uleb128 0x4b
+	.8byte	.LVL1471
+	.4byte	0x16eb3
+	.byte	0
+	.byte	0
+	.uleb128 0x69
+	.4byte	.Ldebug_ranges0+0x24c0
+	.4byte	0x12c84
+	.uleb128 0x43
+	.4byte	.LASF3082
+	.byte	0x1
+	.2byte	0xb10
+	.4byte	0xc6
+	.uleb128 0x5b
+	.4byte	.Ldebug_ranges0+0x24c0
+	.uleb128 0x6e
+	.4byte	.LASF3084
+	.byte	0x1
+	.2byte	0xb10
+	.8byte	.L1433
+	.uleb128 0x49
+	.4byte	.LASF3085
+	.byte	0x1
+	.2byte	0xb10
+	.4byte	0x1528
+	.uleb128 0x2
+	.byte	0x91
+	.sleb128 -48
+	.uleb128 0x43
+	.4byte	.LASF3082
+	.byte	0x1
+	.2byte	0xb10
+	.4byte	0x199
+	.uleb128 0x5f
+	.8byte	.LBB2403
+	.8byte	.LBE2403-.LBB2403
+	.4byte	0x12c68
+	.uleb128 0x56
+	.4byte	.LASF3086
+	.byte	0x1
+	.2byte	0xb10
+	.4byte	0x199
+	.4byte	.LLST397
+	.uleb128 0x4b
+	.8byte	.LVL1476
+	.4byte	0x16e9b
+	.uleb128 0x4b
+	.8byte	.LVL1478
+	.4byte	0x16e90
+	.byte	0
+	.uleb128 0x4b
+	.8byte	.LVL1475
+	.4byte	0x16ea7
+	.uleb128 0x4b
+	.8byte	.LVL1639
+	.4byte	0x16eb3
+	.byte	0
+	.byte	0
+	.uleb128 0x58
+	.4byte	0x155a2
+	.8byte	.LBB2316
+	.4byte	.Ldebug_ranges0+0x1fc0
+	.byte	0x1
+	.2byte	0x952
+	.4byte	0x12de7
+	.uleb128 0x51
+	.4byte	0x155eb
+	.uleb128 0x51
+	.4byte	0x155eb
+	.uleb128 0x51
+	.4byte	0x155eb
+	.uleb128 0x60
+	.4byte	0x155df
+	.4byte	.LLST366
+	.uleb128 0x60
+	.4byte	0x155d3
+	.4byte	.LLST367
+	.uleb128 0x60
+	.4byte	0x155c7
+	.4byte	.LLST368
+	.uleb128 0x60
+	.4byte	0x155bb
+	.4byte	.LLST369
+	.uleb128 0x60
+	.4byte	0x155af
+	.4byte	.LLST370
+	.uleb128 0x5b
+	.4byte	.Ldebug_ranges0+0x1fc0
+	.uleb128 0x54
+	.4byte	0x155f7
+	.uleb128 0x5d
+	.4byte	0x15603
+	.4byte	.LLST371
+	.uleb128 0x54
+	.4byte	0x1560f
+	.uleb128 0x5d
+	.4byte	0x1561b
+	.4byte	.LLST372
+	.uleb128 0x5d
+	.4byte	0x15627
+	.4byte	.LLST373
+	.uleb128 0x5d
+	.4byte	0x15633
+	.4byte	.LLST374
+	.uleb128 0x5d
+	.4byte	0x1563f
+	.4byte	.LLST375
+	.uleb128 0x5d
+	.4byte	0x1564b
+	.4byte	.LLST376
+	.uleb128 0x5e
+	.4byte	0x15657
+	.uleb128 0x1
+	.byte	0x66
+	.uleb128 0x5d
+	.4byte	0x15661
+	.4byte	.LLST377
+	.uleb128 0x5d
+	.4byte	0x1566b
+	.4byte	.LLST378
+	.uleb128 0x5d
+	.4byte	0x15677
+	.4byte	.LLST379
+	.uleb128 0x5d
+	.4byte	0x15683
+	.4byte	.LLST380
+	.uleb128 0x5d
+	.4byte	0x1568f
+	.4byte	.LLST381
+	.uleb128 0x69
+	.4byte	.Ldebug_ranges0+0x2040
+	.4byte	0x12d64
+	.uleb128 0x5d
+	.4byte	0x156d6
+	.4byte	.LLST382
+	.byte	0
+	.uleb128 0x69
+	.4byte	.Ldebug_ranges0+0x20b0
+	.4byte	0x12d77
+	.uleb128 0x5d
+	.4byte	0x156e8
+	.4byte	.LLST383
+	.byte	0
+	.uleb128 0x69
+	.4byte	.Ldebug_ranges0+0x2120
+	.4byte	0x12d8a
+	.uleb128 0x5d
+	.4byte	0x156fa
+	.4byte	.LLST384
+	.byte	0
+	.uleb128 0x69
+	.4byte	.Ldebug_ranges0+0x2190
+	.4byte	0x12d9d
+	.uleb128 0x5d
+	.4byte	0x1570c
+	.4byte	.LLST385
+	.byte	0
+	.uleb128 0x69
+	.4byte	.Ldebug_ranges0+0x2200
+	.4byte	0x12db0
+	.uleb128 0x5d
+	.4byte	0x1571a
+	.4byte	.LLST386
+	.byte	0
+	.uleb128 0x69
+	.4byte	.Ldebug_ranges0+0x2270
+	.4byte	0x12dc3
+	.uleb128 0x5d
+	.4byte	0x156a0
+	.4byte	.LLST387
+	.byte	0
+	.uleb128 0x69
+	.4byte	.Ldebug_ranges0+0x22d0
+	.4byte	0x12dd6
+	.uleb128 0x5d
+	.4byte	0x156b2
+	.4byte	.LLST388
+	.byte	0
+	.uleb128 0x5b
+	.4byte	.Ldebug_ranges0+0x2330
+	.uleb128 0x5d
+	.4byte	0x156c4
+	.4byte	.LLST389
+	.byte	0
+	.byte	0
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x13444
+	.8byte	.LBB2375
+	.8byte	.LBE2375-.LBB2375
+	.byte	0x1
+	.2byte	0xa88
+	.4byte	0x12e4d
+	.uleb128 0x51
+	.4byte	0x13455
+	.uleb128 0x51
+	.4byte	0x13461
+	.uleb128 0x51
+	.4byte	0x1346d
+	.uleb128 0x53
+	.8byte	.LBB2376
+	.8byte	.LBE2376-.LBB2376
+	.uleb128 0x54
+	.4byte	0x13479
+	.uleb128 0x54
+	.4byte	0x13483
+	.uleb128 0x54
+	.4byte	0x1348f
+	.uleb128 0x54
+	.4byte	0x1349b
+	.uleb128 0x54
+	.4byte	0x134a7
+	.uleb128 0x54
+	.4byte	0x134b3
+	.uleb128 0x54
+	.4byte	0x134bf
+	.uleb128 0x70
+	.4byte	0x134cb
+	.byte	0
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x15728
+	.8byte	.LBB2399
+	.8byte	.LBE2399-.LBB2399
+	.byte	0x1
+	.2byte	0xb0d
+	.4byte	0x12e98
+	.uleb128 0x51
+	.4byte	0x15745
+	.uleb128 0x51
+	.4byte	0x15739
+	.uleb128 0x53
+	.8byte	.LBB2400
+	.8byte	.LBE2400-.LBB2400
+	.uleb128 0x54
+	.4byte	0x15751
+	.uleb128 0x4b
+	.8byte	.LVL1474
+	.4byte	0x166e9
+	.byte	0
+	.byte	0
+	.uleb128 0x58
+	.4byte	0x13d17
+	.8byte	.LBB2428
+	.4byte	.Ldebug_ranges0+0x25e0
+	.byte	0x1
+	.2byte	0xa20
+	.4byte	0x12f4d
+	.uleb128 0x51
+	.4byte	0x13d24
+	.uleb128 0x5b
+	.4byte	.Ldebug_ranges0+0x25e0
+	.uleb128 0x54
+	.4byte	0x13d30
+	.uleb128 0x54
+	.4byte	0x13d3c
+	.uleb128 0x54
+	.4byte	0x13d48
+	.uleb128 0x50
+	.4byte	0x13d6b
+	.8byte	.LBB2430
+	.8byte	.LBE2430-.LBB2430
+	.byte	0x1
+	.2byte	0x65e
+	.4byte	0x12efd
+	.uleb128 0x51
+	.4byte	0x13d84
+	.uleb128 0x51
+	.4byte	0x13d78
+	.uleb128 0x4b
+	.8byte	.LVL1549
+	.4byte	0x165e7
+	.byte	0
+	.uleb128 0x4b
+	.8byte	.LVL1547
+	.4byte	0x147bd
+	.uleb128 0x4b
+	.8byte	.LVL1548
+	.4byte	0x147bd
+	.uleb128 0x4b
+	.8byte	.LVL1572
+	.4byte	0x14e71
+	.uleb128 0x4b
+	.8byte	.LVL1573
+	.4byte	0x16c5b
+	.uleb128 0x4b
+	.8byte	.LVL1607
+	.4byte	0x14e71
+	.uleb128 0x4b
+	.8byte	.LVL1637
+	.4byte	0x16b91
+	.byte	0
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x15f8f
+	.8byte	.LBB2435
+	.8byte	.LBE2435-.LBB2435
+	.byte	0x1
+	.2byte	0xa29
+	.4byte	0x12f7c
+	.uleb128 0x51
+	.4byte	0x15fa0
+	.uleb128 0x4b
+	.8byte	.LVL1551
+	.4byte	0x16ed5
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x15728
+	.8byte	.LBB2437
+	.8byte	.LBE2437-.LBB2437
+	.byte	0x1
+	.2byte	0x93a
+	.4byte	0x12fc7
+	.uleb128 0x51
+	.4byte	0x15745
+	.uleb128 0x51
+	.4byte	0x15739
+	.uleb128 0x53
+	.8byte	.LBB2438
+	.8byte	.LBE2438-.LBB2438
+	.uleb128 0x54
+	.4byte	0x15751
+	.uleb128 0x4b
+	.8byte	.LVL1557
+	.4byte	0x166e9
+	.byte	0
+	.byte	0
+	.uleb128 0x4b
+	.8byte	.LVL1324
+	.4byte	0x16ee1
+	.uleb128 0x4b
+	.8byte	.LVL1372
+	.4byte	0x13544
+	.uleb128 0x4b
+	.8byte	.LVL1373
+	.4byte	0x16c5b
+	.uleb128 0x4b
+	.8byte	.LVL1374
+	.4byte	0x13b51
+	.uleb128 0x4b
+	.8byte	.LVL1375
+	.4byte	0x16e7a
+	.uleb128 0x4b
+	.8byte	.LVL1394
+	.4byte	0x16c5b
+	.uleb128 0x4b
+	.8byte	.LVL1395
+	.4byte	0x16e7a
+	.uleb128 0x4b
+	.8byte	.LVL1405
+	.4byte	0x16eec
+	.uleb128 0x4b
+	.8byte	.LVL1410
+	.4byte	0x16c5b
+	.uleb128 0x4b
+	.8byte	.LVL1412
+	.4byte	0x16c5b
+	.uleb128 0x4b
+	.8byte	.LVL1413
+	.4byte	0x16e7a
+	.uleb128 0x4b
+	.8byte	.LVL1414
+	.4byte	0x16cc1
+	.uleb128 0x4b
+	.8byte	.LVL1415
+	.4byte	0x16e7a
+	.uleb128 0x4b
+	.8byte	.LVL1417
+	.4byte	0x16cee
+	.uleb128 0x4b
+	.8byte	.LVL1418
+	.4byte	0x16c5b
+	.uleb128 0x4b
+	.8byte	.LVL1421
+	.4byte	0x16c5b
+	.uleb128 0x4b
+	.8byte	.LVL1422
+	.4byte	0x16a27
+	.uleb128 0x4b
+	.8byte	.LVL1423
+	.4byte	0x16e7a
+	.uleb128 0x4b
+	.8byte	.LVL1425
+	.4byte	0x16b91
+	.uleb128 0x4b
+	.8byte	.LVL1426
+	.4byte	0x16d8c
+	.uleb128 0x4b
+	.8byte	.LVL1427
+	.4byte	0x16d8c
+	.uleb128 0x4b
+	.8byte	.LVL1431
+	.4byte	0x16ebf
+	.uleb128 0x4b
+	.8byte	.LVL1432
+	.4byte	0x16c5b
+	.uleb128 0x4b
+	.8byte	.LVL1436
+	.4byte	0x16ebf
+	.uleb128 0x4b
+	.8byte	.LVL1439
+	.4byte	0x15309
+	.uleb128 0x4b
+	.8byte	.LVL1441
+	.4byte	0x16ef7
+	.uleb128 0x4b
+	.8byte	.LVL1442
+	.4byte	0x16c5b
+	.uleb128 0x4b
+	.8byte	.LVL1443
+	.4byte	0x16a27
+	.uleb128 0x4b
+	.8byte	.LVL1447
+	.4byte	0x16c5b
+	.uleb128 0x4b
+	.8byte	.LVL1449
+	.4byte	0x16ebf
+	.uleb128 0x4b
+	.8byte	.LVL1451
+	.4byte	0x16c5b
+	.uleb128 0x4b
+	.8byte	.LVL1472
+	.4byte	0x16ebf
+	.uleb128 0x4b
+	.8byte	.LVL1473
+	.4byte	0x16f02
+	.uleb128 0x4b
+	.8byte	.LVL1481
+	.4byte	0x16c5b
+	.uleb128 0x4b
+	.8byte	.LVL1488
+	.4byte	0x16c5b
+	.uleb128 0x4b
+	.8byte	.LVL1491
+	.4byte	0x16c5b
+	.uleb128 0x4b
+	.8byte	.LVL1498
+	.4byte	0x13544
+	.uleb128 0x4b
+	.8byte	.LVL1499
+	.4byte	0x16ebf
+	.uleb128 0x4b
+	.8byte	.LVL1500
+	.4byte	0x16c5b
+	.uleb128 0x4b
+	.8byte	.LVL1511
+	.4byte	0x16ebf
+	.uleb128 0x4b
+	.8byte	.LVL1513
+	.4byte	0x16c5b
+	.uleb128 0x4b
+	.8byte	.LVL1514
+	.4byte	0x13b51
+	.uleb128 0x4b
+	.8byte	.LVL1515
+	.4byte	0x16d1c
+	.uleb128 0x4b
+	.8byte	.LVL1518
+	.4byte	0x16d1c
+	.uleb128 0x4b
+	.8byte	.LVL1521
+	.4byte	0x16b91
+	.uleb128 0x4b
+	.8byte	.LVL1523
+	.4byte	0x15242
+	.uleb128 0x4b
+	.8byte	.LVL1524
+	.4byte	0x13544
+	.uleb128 0x4b
+	.8byte	.LVL1525
+	.4byte	0x16c5b
+	.uleb128 0x4b
+	.8byte	.LVL1526
+	.4byte	0x13b51
+	.uleb128 0x4b
+	.8byte	.LVL1527
+	.4byte	0x16c5b
+	.uleb128 0x4b
+	.8byte	.LVL1528
+	.4byte	0x16ef7
+	.uleb128 0x4b
+	.8byte	.LVL1529
+	.4byte	0x16e7a
+	.uleb128 0x4b
+	.8byte	.LVL1544
+	.4byte	0x16c5b
+	.uleb128 0x4b
+	.8byte	.LVL1545
+	.4byte	0x13544
+	.uleb128 0x4b
+	.8byte	.LVL1546
+	.4byte	0x16c5b
+	.uleb128 0x4b
+	.8byte	.LVL1550
+	.4byte	0x16c5b
+	.uleb128 0x4b
+	.8byte	.LVL1552
+	.4byte	0x16d1c
+	.uleb128 0x4b
+	.8byte	.LVL1553
+	.4byte	0x16c5b
+	.uleb128 0x4b
+	.8byte	.LVL1554
+	.4byte	0x16c5b
+	.uleb128 0x4b
+	.8byte	.LVL1555
+	.4byte	0x16c5b
+	.uleb128 0x4b
+	.8byte	.LVL1559
+	.4byte	0x16ef7
+	.uleb128 0x4b
+	.8byte	.LVL1574
+	.4byte	0x16b91
+	.uleb128 0x4b
+	.8byte	.LVL1575
+	.4byte	0x16c5b
+	.uleb128 0x4b
+	.8byte	.LVL1578
+	.4byte	0x16c5b
+	.uleb128 0x4b
+	.8byte	.LVL1579
+	.4byte	0x16d8c
+	.uleb128 0x4b
+	.8byte	.LVL1589
+	.4byte	0x16d8c
+	.uleb128 0x4b
+	.8byte	.LVL1590
+	.4byte	0x16d8c
+	.uleb128 0x4b
+	.8byte	.LVL1593
+	.4byte	0x16c5b
+	.uleb128 0x4b
+	.8byte	.LVL1594
+	.4byte	0x16e7a
+	.uleb128 0x4b
+	.8byte	.LVL1595
+	.4byte	0x16c5b
+	.uleb128 0x4b
+	.8byte	.LVL1601
+	.4byte	0x16d8c
+	.uleb128 0x4b
+	.8byte	.LVL1603
+	.4byte	0x16d8c
+	.uleb128 0x4b
+	.8byte	.LVL1621
+	.4byte	0x16ddc
+	.uleb128 0x4b
+	.8byte	.LVL1628
+	.4byte	0x16ebf
+	.uleb128 0x4b
+	.8byte	.LVL1629
+	.4byte	0x16f02
+	.uleb128 0x4b
+	.8byte	.LVL1631
+	.4byte	0x16ef7
+	.byte	0
+	.uleb128 0x61
+	.4byte	.LASF3088
+	.byte	0x1
+	.2byte	0x8fe
+	.4byte	0xc6
+	.byte	0x1
+	.4byte	0x13444
+	.uleb128 0x63
+	.4byte	.LASF3089
+	.byte	0x1
+	.2byte	0x8fe
+	.4byte	0xe472
+	.uleb128 0x63
+	.4byte	.LASF3090
+	.byte	0x1
+	.2byte	0x8fe
+	.4byte	0xe472
+	.uleb128 0x63
+	.4byte	.LASF2943
+	.byte	0x1
+	.2byte	0x8fe
+	.4byte	0xe81f
+	.uleb128 0x4f
+	.string	"i"
+	.byte	0x1
+	.2byte	0x900
+	.4byte	0xc6
+	.uleb128 0x43
+	.4byte	.LASF3091
+	.byte	0x1
+	.2byte	0x901
+	.4byte	0x15a
+	.uleb128 0x43
+	.4byte	.LASF3092
+	.byte	0x1
+	.2byte	0x901
+	.4byte	0x15a
+	.uleb128 0x43
+	.4byte	.LASF3093
+	.byte	0x1
+	.2byte	0x902
+	.4byte	0xc6
+	.uleb128 0x43
+	.4byte	.LASF3094
+	.byte	0x1
+	.2byte	0x903
+	.4byte	0xc6
+	.uleb128 0x43
+	.4byte	.LASF3095
+	.byte	0x1
+	.2byte	0x904
+	.4byte	0x45aa
+	.uleb128 0x43
+	.4byte	.LASF3096
+	.byte	0x1
+	.2byte	0x905
+	.4byte	0x45aa
+	.uleb128 0x43
+	.4byte	.LASF3097
+	.byte	0x1
+	.2byte	0x906
+	.4byte	0xc6
+	.uleb128 0x43
+	.4byte	.LASF3098
+	.byte	0x1
+	.2byte	0x907
+	.4byte	0xc6
+	.byte	0
+	.uleb128 0x61
+	.4byte	.LASF3099
+	.byte	0x1
+	.2byte	0x8e7
+	.4byte	0xc6
+	.byte	0x1
+	.4byte	0x134d4
+	.uleb128 0x63
+	.4byte	.LASF3089
+	.byte	0x1
+	.2byte	0x8e7
+	.4byte	0xe472
+	.uleb128 0x63
+	.4byte	.LASF3090
+	.byte	0x1
+	.2byte	0x8e7
+	.4byte	0xe472
+	.uleb128 0x63
+	.4byte	.LASF3100
+	.byte	0x1
+	.2byte	0x8e7
+	.4byte	0xc6
+	.uleb128 0x4f
+	.string	"i"
+	.byte	0x1
+	.2byte	0x8e9
+	.4byte	0xc6
+	.uleb128 0x43
+	.4byte	.LASF3091
+	.byte	0x1
+	.2byte	0x8ea
+	.4byte	0x15a
+	.uleb128 0x43
+	.4byte	.LASF3092
+	.byte	0x1
+	.2byte	0x8ea
+	.4byte	0x15a
+	.uleb128 0x43
+	.4byte	.LASF3093
+	.byte	0x1
+	.2byte	0x8eb
+	.4byte	0xc6
+	.uleb128 0x43
+	.4byte	.LASF3094
+	.byte	0x1
+	.2byte	0x8ec
+	.4byte	0xc6
+	.uleb128 0x43
+	.4byte	.LASF3095
+	.byte	0x1
+	.2byte	0x8ed
+	.4byte	0x45aa
+	.uleb128 0x43
+	.4byte	.LASF3096
+	.byte	0x1
+	.2byte	0x8ee
+	.4byte	0x45aa
+	.uleb128 0x6d
+	.4byte	.LASF3102
+	.byte	0x1
+	.2byte	0x8fa
+	.byte	0
+	.uleb128 0x61
+	.4byte	.LASF3103
+	.byte	0x1
+	.2byte	0x8ce
+	.4byte	0xc6
+	.byte	0x1
+	.4byte	0x13544
+	.uleb128 0x62
+	.string	"buf"
+	.byte	0x1
+	.2byte	0x8ce
+	.4byte	0xe472
+	.uleb128 0x63
+	.4byte	.LASF2943
+	.byte	0x1
+	.2byte	0x8ce
+	.4byte	0xe81f
+	.uleb128 0x4f
+	.string	"i"
+	.byte	0x1
+	.2byte	0x8d0
+	.4byte	0xc6
+	.uleb128 0x43
+	.4byte	.LASF3091
+	.byte	0x1
+	.2byte	0x8d1
+	.4byte	0x15a
+	.uleb128 0x43
+	.4byte	.LASF3095
+	.byte	0x1
+	.2byte	0x8d2
+	.4byte	0x45aa
+	.uleb128 0x43
+	.4byte	.LASF3104
+	.byte	0x1
+	.2byte	0x8d3
+	.4byte	0xc6
+	.uleb128 0x43
+	.4byte	.LASF3100
+	.byte	0x1
+	.2byte	0x8d4
+	.4byte	0xc6
+	.uleb128 0x43
+	.4byte	.LASF3098
+	.byte	0x1
+	.2byte	0x8d5
+	.4byte	0xc6
+	.byte	0
+	.uleb128 0x4d
+	.4byte	.LASF3105
+	.byte	0x1
+	.2byte	0x870
+	.4byte	0xc6
+	.8byte	.LFB2840
+	.8byte	.LFE2840-.LFB2840
+	.uleb128 0x1
+	.byte	0x9c
+	.4byte	0x1363f
+	.uleb128 0x4e
+	.string	"ebc"
+	.byte	0x1
+	.2byte	0x870
+	.4byte	0xe4d7
+	.4byte	.LLST193
+	.uleb128 0x55
+	.4byte	.LASF2837
+	.byte	0x1
+	.2byte	0x870
+	.4byte	0xc6
+	.4byte	.LLST194
+	.uleb128 0x43
+	.4byte	.LASF2943
+	.byte	0x1
+	.2byte	0x872
+	.4byte	0xe81f
+	.uleb128 0x56
+	.4byte	.LASF3106
+	.byte	0x1
+	.2byte	0x873
+	.4byte	0xc6
+	.4byte	.LLST195
+	.uleb128 0x67
+	.string	"ret"
+	.byte	0x1
+	.2byte	0x874
+	.4byte	0xc6
+	.uleb128 0x1
+	.byte	0x64
+	.uleb128 0x43
+	.4byte	.LASF3107
+	.byte	0x1
+	.2byte	0x875
+	.4byte	0xc6
+	.uleb128 0x50
+	.4byte	0x15ab3
+	.8byte	.LBB1586
+	.8byte	.LBE1586-.LBB1586
+	.byte	0x1
+	.2byte	0x878
+	.4byte	0x135e3
+	.uleb128 0x51
+	.4byte	0x15ace
+	.uleb128 0x51
+	.4byte	0x15ac3
+	.byte	0
+	.uleb128 0x4b
+	.8byte	.LVL653
+	.4byte	0x16c5b
+	.uleb128 0x4b
+	.8byte	.LVL654
+	.4byte	0x16f0d
+	.uleb128 0x4b
+	.8byte	.LVL656
+	.4byte	0x16cc1
+	.uleb128 0x4b
+	.8byte	.LVL660
+	.4byte	0x16cc1
+	.uleb128 0x4b
+	.8byte	.LVL661
+	.4byte	0x16c5b
+	.uleb128 0x4b
+	.8byte	.LVL663
+	.4byte	0x16c5b
+	.uleb128 0x4b
+	.8byte	.LVL665
+	.4byte	0x16ddc
+	.byte	0
+	.uleb128 0x61
+	.4byte	.LASF3108
+	.byte	0x1
+	.2byte	0x845
+	.4byte	0xc6
+	.byte	0x1
+	.4byte	0x13669
+	.uleb128 0x63
+	.4byte	.LASF874
+	.byte	0x1
+	.2byte	0x845
+	.4byte	0xc6
+	.uleb128 0x43
+	.4byte	.LASF3107
+	.byte	0x1
+	.2byte	0x847
+	.4byte	0xc6
+	.byte	0
+	.uleb128 0x4a
+	.4byte	.LASF3109
+	.byte	0x1
+	.2byte	0x814
+	.8byte	.LFB2838
+	.8byte	.LFE2838-.LFB2838
+	.uleb128 0x1
+	.byte	0x9c
+	.4byte	0x13723
+	.uleb128 0x43
+	.4byte	.LASF2943
+	.byte	0x1
+	.2byte	0x816
+	.4byte	0xe81f
+	.uleb128 0x4b
+	.8byte	.LVL634
+	.4byte	0x16c5b
+	.uleb128 0x4b
+	.8byte	.LVL635
+	.4byte	0x16d81
+	.uleb128 0x4b
+	.8byte	.LVL636
+	.4byte	0x16c5b
+	.uleb128 0x4b
+	.8byte	.LVL637
+	.4byte	0x16cb7
+	.uleb128 0x4b
+	.8byte	.LVL638
+	.4byte	0x16d1c
+	.uleb128 0x4b
+	.8byte	.LVL639
+	.4byte	0x16d81
+	.uleb128 0x4b
+	.8byte	.LVL640
+	.4byte	0x16cee
+	.uleb128 0x4b
+	.8byte	.LVL641
+	.4byte	0x16c5b
+	.uleb128 0x4b
+	.8byte	.LVL642
+	.4byte	0x16cb7
+	.uleb128 0x4b
+	.8byte	.LVL643
+	.4byte	0x16d1c
+	.uleb128 0x4b
+	.8byte	.LVL644
+	.4byte	0x16cee
+	.byte	0
+	.uleb128 0x4c
+	.4byte	.LASF3110
+	.byte	0x1
+	.2byte	0x752
+	.4byte	0xc6
+	.8byte	.LFB2837
+	.8byte	.LFE2837-.LFB2837
+	.uleb128 0x1
+	.byte	0x9c
+	.4byte	0x139ba
+	.uleb128 0x55
+	.4byte	.LASF793
+	.byte	0x1
+	.2byte	0x752
+	.4byte	0x458
+	.4byte	.LLST408
+	.uleb128 0x67
+	.string	"ebc"
+	.byte	0x1
+	.2byte	0x754
+	.4byte	0xe4d7
+	.uleb128 0x1
+	.byte	0x66
+	.uleb128 0x43
+	.4byte	.LASF2992
+	.byte	0x1
+	.2byte	0x755
+	.4byte	0xe0e4
+	.uleb128 0x43
+	.4byte	.LASF2943
+	.byte	0x1
+	.2byte	0x756
+	.4byte	0xe81f
+	.uleb128 0x43
+	.4byte	.LASF3111
+	.byte	0x1
+	.2byte	0x757
+	.4byte	0xe1ba
+	.uleb128 0x69
+	.4byte	.Ldebug_ranges0+0x2660
+	.4byte	0x13819
+	.uleb128 0x3c
+	.byte	0x8
+	.byte	0x1
+	.2byte	0x765
+	.4byte	0x137b2
+	.uleb128 0x3e
+	.4byte	.LASF3112
+	.byte	0x1
+	.2byte	0x765
+	.4byte	0x1a0
+	.uleb128 0x3a
+	.string	"__c"
+	.byte	0x1
+	.2byte	0x765
+	.4byte	0x139ba
+	.byte	0
+	.uleb128 0x4f
+	.string	"__u"
+	.byte	0x1
+	.2byte	0x765
+	.4byte	0x13790
+	.uleb128 0x58
+	.4byte	0x1623b
+	.8byte	.LBB2457
+	.4byte	.Ldebug_ranges0+0x26a0
+	.byte	0x1
+	.2byte	0x765
+	.4byte	0x137e6
+	.uleb128 0x51
+	.4byte	0x1625e
+	.uleb128 0x51
+	.4byte	0x16252
+	.uleb128 0x51
+	.4byte	0x16248
+	.byte	0
+	.uleb128 0x5a
+	.4byte	0x1608b
+	.8byte	.LBB2460
+	.8byte	.LBE2460-.LBB2460
+	.byte	0x1
+	.2byte	0x765
+	.uleb128 0x53
+	.8byte	.LBB2461
+	.8byte	.LBE2461-.LBB2461
+	.uleb128 0x5e
+	.4byte	0x1609b
+	.uleb128 0x1
+	.byte	0x68
+	.byte	0
+	.byte	0
+	.byte	0
+	.uleb128 0x4b
+	.8byte	.LVL1644
+	.4byte	0x165e7
+	.uleb128 0x4b
+	.8byte	.LVL1645
+	.4byte	0x16cee
+	.uleb128 0x4b
+	.8byte	.LVL1646
+	.4byte	0x164fd
+	.uleb128 0x4b
+	.8byte	.LVL1647
+	.4byte	0x16f18
+	.uleb128 0x4b
+	.8byte	.LVL1648
+	.4byte	0x16e90
+	.uleb128 0x4b
+	.8byte	.LVL1649
+	.4byte	0x16f22
+	.uleb128 0x4b
+	.8byte	.LVL1650
+	.4byte	0x16f22
+	.uleb128 0x4b
+	.8byte	.LVL1651
+	.4byte	0x165e7
+	.uleb128 0x4b
+	.8byte	.LVL1652
+	.4byte	0x16cee
+	.uleb128 0x4b
+	.8byte	.LVL1653
+	.4byte	0x140d9
+	.uleb128 0x4b
+	.8byte	.LVL1654
+	.4byte	0x165e7
+	.uleb128 0x4b
+	.8byte	.LVL1655
+	.4byte	0x16cee
+	.uleb128 0x4b
+	.8byte	.LVL1656
+	.4byte	0x167a9
+	.uleb128 0x4b
+	.8byte	.LVL1657
+	.4byte	0x165e7
+	.uleb128 0x4b
+	.8byte	.LVL1658
+	.4byte	0x16cee
+	.uleb128 0x4b
+	.8byte	.LVL1659
+	.4byte	0x147bd
+	.uleb128 0x4b
+	.8byte	.LVL1660
+	.4byte	0x142b5
+	.uleb128 0x4b
+	.8byte	.LVL1661
+	.4byte	0x16f18
+	.uleb128 0x4b
+	.8byte	.LVL1662
+	.4byte	0x1629d
+	.uleb128 0x4b
+	.8byte	.LVL1663
+	.4byte	0x14e71
+	.uleb128 0x4b
+	.8byte	.LVL1664
+	.4byte	0x1643e
+	.uleb128 0x4b
+	.8byte	.LVL1665
+	.4byte	0x16910
+	.uleb128 0x4b
+	.8byte	.LVL1666
+	.4byte	0x16f18
+	.uleb128 0x4b
+	.8byte	.LVL1667
+	.4byte	0x140d9
+	.uleb128 0x4b
+	.8byte	.LVL1668
+	.4byte	0x16d1c
+	.uleb128 0x4b
+	.8byte	.LVL1669
+	.4byte	0x16f18
+	.uleb128 0x4b
+	.8byte	.LVL1670
+	.4byte	0x147bd
+	.uleb128 0x4b
+	.8byte	.LVL1671
+	.4byte	0x145e0
+	.uleb128 0x4b
+	.8byte	.LVL1672
+	.4byte	0x142b5
+	.uleb128 0x4b
+	.8byte	.LVL1673
+	.4byte	0x14e71
+	.uleb128 0x4b
+	.8byte	.LVL1674
+	.4byte	0x15242
+	.uleb128 0x4b
+	.8byte	.LVL1675
+	.4byte	0x15309
+	.byte	0
+	.uleb128 0x5
+	.4byte	0x61
+	.4byte	0x139ca
+	.uleb128 0x6
+	.4byte	0x4f
+	.byte	0
+	.byte	0
+	.uleb128 0x4c
+	.4byte	.LASF3113
+	.byte	0x1
+	.2byte	0x6f9
+	.4byte	0xc6
+	.8byte	.LFB2836
+	.8byte	.LFE2836-.LFB2836
+	.uleb128 0x1
+	.byte	0x9c
+	.4byte	0x13b51
+	.uleb128 0x55
+	.4byte	.LASF793
+	.byte	0x1
+	.2byte	0x6f9
+	.4byte	0x458
+	.4byte	.LLST293
+	.uleb128 0x67
+	.string	"ebc"
+	.byte	0x1
+	.2byte	0x6fb
+	.4byte	0xe4d7
+	.uleb128 0x1
+	.byte	0x69
+	.uleb128 0x43
+	.4byte	.LASF2992
+	.byte	0x1
+	.2byte	0x6fc
+	.4byte	0xe0e4
+	.uleb128 0x43
+	.4byte	.LASF2943
+	.byte	0x1
+	.2byte	0x6fd
+	.4byte	0xe81f
+	.uleb128 0x69
+	.4byte	.Ldebug_ranges0+0x1490
+	.4byte	0x13ab4
+	.uleb128 0x3c
+	.byte	0x8
+	.byte	0x1
+	.2byte	0x704
+	.4byte	0x13a4d
+	.uleb128 0x3e
+	.4byte	.LASF3112
+	.byte	0x1
+	.2byte	0x704
+	.4byte	0x1a0
+	.uleb128 0x3a
+	.string	"__c"
+	.byte	0x1
+	.2byte	0x704
+	.4byte	0x139ba
+	.byte	0
+	.uleb128 0x4f
+	.string	"__u"
+	.byte	0x1
+	.2byte	0x704
+	.4byte	0x13a2b
+	.uleb128 0x58
+	.4byte	0x1623b
+	.8byte	.LBB1779
+	.4byte	.Ldebug_ranges0+0x14d0
+	.byte	0x1
+	.2byte	0x704
+	.4byte	0x13a81
+	.uleb128 0x51
+	.4byte	0x1625e
+	.uleb128 0x51
+	.4byte	0x16252
+	.uleb128 0x51
+	.4byte	0x16248
+	.byte	0
+	.uleb128 0x5a
+	.4byte	0x1608b
+	.8byte	.LBB1782
+	.8byte	.LBE1782-.LBB1782
+	.byte	0x1
+	.2byte	0x704
+	.uleb128 0x53
+	.8byte	.LBB1783
+	.8byte	.LBE1783-.LBB1783
+	.uleb128 0x5e
+	.4byte	0x1609b
+	.uleb128 0x1
+	.byte	0x67
+	.byte	0
+	.byte	0
+	.byte	0
+	.uleb128 0x4b
+	.8byte	.LVL976
+	.4byte	0x164fd
+	.uleb128 0x4b
+	.8byte	.LVL977
+	.4byte	0x16f18
+	.uleb128 0x4b
+	.8byte	.LVL978
+	.4byte	0x16f18
+	.uleb128 0x4b
+	.8byte	.LVL979
+	.4byte	0x16e90
+	.uleb128 0x4b
+	.8byte	.LVL980
+	.4byte	0x16f22
+	.uleb128 0x4b
+	.8byte	.LVL981
+	.4byte	0x140d9
+	.uleb128 0x4b
+	.8byte	.LVL982
+	.4byte	0x167a9
+	.uleb128 0x4b
+	.8byte	.LVL983
+	.4byte	0x147bd
+	.uleb128 0x4b
+	.8byte	.LVL984
+	.4byte	0x142b5
+	.uleb128 0x4b
+	.8byte	.LVL985
+	.4byte	0x14e71
+	.uleb128 0x4b
+	.8byte	.LVL986
+	.4byte	0x1643e
+	.uleb128 0x4b
+	.8byte	.LVL987
+	.4byte	0x16910
+	.byte	0
+	.uleb128 0x4a
+	.4byte	.LASF3114
+	.byte	0x1
+	.2byte	0x668
+	.8byte	.LFB2835
+	.8byte	.LFE2835-.LFB2835
+	.uleb128 0x1
+	.byte	0x9c
+	.4byte	0x13d17
+	.uleb128 0x4e
+	.string	"ebc"
+	.byte	0x1
+	.2byte	0x668
+	.4byte	0xe4d7
+	.4byte	.LLST292
+	.uleb128 0x43
+	.4byte	.LASF2992
+	.byte	0x1
+	.2byte	0x66a
+	.4byte	0xe0e4
+	.uleb128 0x43
+	.4byte	.LASF2943
+	.byte	0x1
+	.2byte	0x66b
+	.4byte	0xe81f
+	.uleb128 0x52
+	.4byte	.LASF3024
+	.4byte	0xb866
+	.uleb128 0x9
+	.byte	0x3
+	.8byte	__func__.35152
+	.uleb128 0x50
+	.4byte	0x13d6b
+	.8byte	.LBB1774
+	.8byte	.LBE1774-.LBB1774
+	.byte	0x1
+	.2byte	0x67f
+	.4byte	0x13bde
+	.uleb128 0x51
+	.4byte	0x13d84
+	.uleb128 0x51
+	.4byte	0x13d78
+	.uleb128 0x4b
+	.8byte	.LVL952
+	.4byte	0x165e7
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x13d6b
+	.8byte	.LBB1776
+	.8byte	.LBE1776-.LBB1776
+	.byte	0x1
+	.2byte	0x6f1
+	.4byte	0x13c12
+	.uleb128 0x51
+	.4byte	0x13d84
+	.uleb128 0x51
+	.4byte	0x13d78
+	.uleb128 0x4b
+	.8byte	.LVL959
+	.4byte	0x165e7
+	.byte	0
+	.uleb128 0x4b
+	.8byte	.LVL943
+	.4byte	0x1643e
+	.uleb128 0x4b
+	.8byte	.LVL944
+	.4byte	0x164fd
+	.uleb128 0x4b
+	.8byte	.LVL946
+	.4byte	0x16910
+	.uleb128 0x4b
+	.8byte	.LVL947
+	.4byte	0x167a9
+	.uleb128 0x4b
+	.8byte	.LVL950
+	.4byte	0x16cb7
+	.uleb128 0x4b
+	.8byte	.LVL951
+	.4byte	0x145e0
+	.uleb128 0x4b
+	.8byte	.LVL953
+	.4byte	0x16cb7
+	.uleb128 0x4b
+	.8byte	.LVL954
+	.4byte	0x1629d
+	.uleb128 0x4b
+	.8byte	.LVL957
+	.4byte	0x142b5
+	.uleb128 0x4b
+	.8byte	.LVL958
+	.4byte	0x140d9
+	.uleb128 0x4b
+	.8byte	.LVL962
+	.4byte	0x140d9
+	.uleb128 0x4b
+	.8byte	.LVL963
+	.4byte	0x1629d
+	.uleb128 0x4b
+	.8byte	.LVL964
+	.4byte	0x167a9
+	.uleb128 0x4b
+	.8byte	.LVL965
+	.4byte	0x16910
+	.uleb128 0x4b
+	.8byte	.LVL966
+	.4byte	0x164fd
+	.uleb128 0x4b
+	.8byte	.LVL967
+	.4byte	0x1643e
+	.uleb128 0x4b
+	.8byte	.LVL968
+	.4byte	0x142b5
+	.uleb128 0x4b
+	.8byte	.LVL969
+	.4byte	0x16c5b
+	.uleb128 0x4b
+	.8byte	.LVL970
+	.4byte	0x145e0
+	.uleb128 0x4b
+	.8byte	.LVL971
+	.4byte	0x16c5b
+	.byte	0
+	.uleb128 0x64
+	.4byte	.LASF3115
+	.byte	0x1
+	.2byte	0x636
+	.byte	0x1
+	.4byte	0x13d56
+	.uleb128 0x62
+	.string	"ebc"
+	.byte	0x1
+	.2byte	0x636
+	.4byte	0xe4d7
+	.uleb128 0x43
+	.4byte	.LASF2992
+	.byte	0x1
+	.2byte	0x638
+	.4byte	0xe0e4
+	.uleb128 0x43
+	.4byte	.LASF2943
+	.byte	0x1
+	.2byte	0x639
+	.4byte	0xe81f
+	.uleb128 0x66
+	.4byte	.LASF3024
+	.4byte	0x13d66
+	.4byte	.LASF3115
+	.byte	0
+	.uleb128 0x5
+	.4byte	0x68
+	.4byte	0x13d66
+	.uleb128 0x6
+	.4byte	0x4f
+	.byte	0x1a
+	.byte	0
+	.uleb128 0x3
+	.4byte	0x13d56
+	.uleb128 0x64
+	.4byte	.LASF3116
+	.byte	0x1
+	.2byte	0x630
+	.byte	0x1
+	.4byte	0x13d91
+	.uleb128 0x63
+	.4byte	.LASF2992
+	.byte	0x1
+	.2byte	0x630
+	.4byte	0xe0e4
+	.uleb128 0x63
+	.4byte	.LASF2943
+	.byte	0x1
+	.2byte	0x630
+	.4byte	0xe81f
+	.byte	0
+	.uleb128 0x64
+	.4byte	.LASF3117
+	.byte	0x1
+	.2byte	0x625
+	.byte	0x1
+	.4byte	0x13dc3
+	.uleb128 0x63
+	.4byte	.LASF2992
+	.byte	0x1
+	.2byte	0x625
+	.4byte	0xe0e4
+	.uleb128 0x63
+	.4byte	.LASF2943
+	.byte	0x1
+	.2byte	0x625
+	.4byte	0xe81f
+	.uleb128 0x4f
+	.string	"buf"
+	.byte	0x1
+	.2byte	0x627
+	.4byte	0x13dc3
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xde56
+	.uleb128 0x64
+	.4byte	.LASF3118
+	.byte	0x1
+	.2byte	0x5f7
+	.byte	0x1
+	.4byte	0x13e93
+	.uleb128 0x63
+	.4byte	.LASF3119
+	.byte	0x1
+	.2byte	0x5f7
+	.4byte	0xbfee
+	.uleb128 0x63
+	.4byte	.LASF3120
+	.byte	0x1
+	.2byte	0x5f7
+	.4byte	0x45aa
+	.uleb128 0x63
+	.4byte	.LASF3121
+	.byte	0x1
+	.2byte	0x5f7
+	.4byte	0x45aa
+	.uleb128 0x63
+	.4byte	.LASF2943
+	.byte	0x1
+	.2byte	0x5f7
+	.4byte	0xe81f
+	.uleb128 0x63
+	.4byte	.LASF874
+	.byte	0x1
+	.2byte	0x5f7
+	.4byte	0xe1ba
+	.uleb128 0x43
+	.4byte	.LASF2992
+	.byte	0x1
+	.2byte	0x5f9
+	.4byte	0xe0e4
+	.uleb128 0x43
+	.4byte	.LASF3122
+	.byte	0x1
+	.2byte	0x5fa
+	.4byte	0x15a
+	.uleb128 0x43
+	.4byte	.LASF3123
+	.byte	0x1
+	.2byte	0x5fa
+	.4byte	0x15a
+	.uleb128 0x43
+	.4byte	.LASF2870
+	.byte	0x1
+	.2byte	0x5fb
+	.4byte	0xc6
+	.uleb128 0x43
+	.4byte	.LASF262
+	.byte	0x1
+	.2byte	0x5fb
+	.4byte	0xc6
+	.uleb128 0x4f
+	.string	"i"
+	.byte	0x1
+	.2byte	0x5fc
+	.4byte	0xc6
+	.uleb128 0x4f
+	.string	"j"
+	.byte	0x1
+	.2byte	0x5fc
+	.4byte	0xc6
+	.uleb128 0x43
+	.4byte	.LASF3124
+	.byte	0x1
+	.2byte	0x5fd
+	.4byte	0xc6
+	.uleb128 0x43
+	.4byte	.LASF2826
+	.byte	0x1
+	.2byte	0x5fe
+	.4byte	0xbfee
+	.uleb128 0x43
+	.4byte	.LASF3125
+	.byte	0x1
+	.2byte	0x5ff
+	.4byte	0xc6
+	.uleb128 0x43
+	.4byte	.LASF3126
+	.byte	0x1
+	.2byte	0x600
+	.4byte	0xbfee
+	.byte	0
+	.uleb128 0x64
+	.4byte	.LASF3127
+	.byte	0x1
+	.2byte	0x5cc
+	.byte	0x1
+	.4byte	0x13f5d
+	.uleb128 0x63
+	.4byte	.LASF3119
+	.byte	0x1
+	.2byte	0x5cc
+	.4byte	0xbfee
+	.uleb128 0x63
+	.4byte	.LASF3120
+	.byte	0x1
+	.2byte	0x5cc
+	.4byte	0x45aa
+	.uleb128 0x63
+	.4byte	.LASF3121
+	.byte	0x1
+	.2byte	0x5cc
+	.4byte	0x45aa
+	.uleb128 0x63
+	.4byte	.LASF2943
+	.byte	0x1
+	.2byte	0x5cc
+	.4byte	0xe81f
+	.uleb128 0x63
+	.4byte	.LASF874
+	.byte	0x1
+	.2byte	0x5cc
+	.4byte	0xe1ba
+	.uleb128 0x43
+	.4byte	.LASF2992
+	.byte	0x1
+	.2byte	0x5ce
+	.4byte	0xe0e4
+	.uleb128 0x4f
+	.string	"i"
+	.byte	0x1
+	.2byte	0x5cf
+	.4byte	0xc6
+	.uleb128 0x4f
+	.string	"j"
+	.byte	0x1
+	.2byte	0x5cf
+	.4byte	0xc6
+	.uleb128 0x43
+	.4byte	.LASF2870
+	.byte	0x1
+	.2byte	0x5d0
+	.4byte	0xc6
+	.uleb128 0x43
+	.4byte	.LASF262
+	.byte	0x1
+	.2byte	0x5d1
+	.4byte	0xc6
+	.uleb128 0x43
+	.4byte	.LASF3122
+	.byte	0x1
+	.2byte	0x5d2
+	.4byte	0x15a
+	.uleb128 0x43
+	.4byte	.LASF3123
+	.byte	0x1
+	.2byte	0x5d2
+	.4byte	0x15a
+	.uleb128 0x43
+	.4byte	.LASF3124
+	.byte	0x1
+	.2byte	0x5d3
+	.4byte	0xc6
+	.uleb128 0x43
+	.4byte	.LASF2826
+	.byte	0x1
+	.2byte	0x5d4
+	.4byte	0xbfee
+	.uleb128 0x43
+	.4byte	.LASF3125
+	.byte	0x1
+	.2byte	0x5d5
+	.4byte	0xc6
+	.uleb128 0x43
+	.4byte	.LASF3126
+	.byte	0x1
+	.2byte	0x5d6
+	.4byte	0xbfee
+	.byte	0
+	.uleb128 0x64
+	.4byte	.LASF3128
+	.byte	0x1
+	.2byte	0x59f
+	.byte	0x1
+	.4byte	0x1401b
+	.uleb128 0x63
+	.4byte	.LASF3119
+	.byte	0x1
+	.2byte	0x59f
+	.4byte	0xbfee
+	.uleb128 0x63
+	.4byte	.LASF3120
+	.byte	0x1
+	.2byte	0x59f
+	.4byte	0x45aa
+	.uleb128 0x63
+	.4byte	.LASF3121
+	.byte	0x1
+	.2byte	0x59f
+	.4byte	0x45aa
+	.uleb128 0x63
+	.4byte	.LASF2943
+	.byte	0x1
+	.2byte	0x59f
+	.4byte	0xe81f
+	.uleb128 0x63
+	.4byte	.LASF874
+	.byte	0x1
+	.2byte	0x59f
+	.4byte	0xe1ba
+	.uleb128 0x43
+	.4byte	.LASF2992
+	.byte	0x1
+	.2byte	0x5a1
+	.4byte	0xe0e4
+	.uleb128 0x43
+	.4byte	.LASF3122
+	.byte	0x1
+	.2byte	0x5a2
+	.4byte	0x15a
+	.uleb128 0x43
+	.4byte	.LASF3123
+	.byte	0x1
+	.2byte	0x5a2
+	.4byte	0x15a
+	.uleb128 0x43
+	.4byte	.LASF2870
+	.byte	0x1
+	.2byte	0x5a3
+	.4byte	0xc6
+	.uleb128 0x43
+	.4byte	.LASF262
+	.byte	0x1
+	.2byte	0x5a3
+	.4byte	0xc6
+	.uleb128 0x4f
+	.string	"i"
+	.byte	0x1
+	.2byte	0x5a4
+	.4byte	0xc6
+	.uleb128 0x4f
+	.string	"j"
+	.byte	0x1
+	.2byte	0x5a4
+	.4byte	0xc6
+	.uleb128 0x43
+	.4byte	.LASF3124
+	.byte	0x1
+	.2byte	0x5a5
+	.4byte	0xc6
+	.uleb128 0x43
+	.4byte	.LASF2826
+	.byte	0x1
+	.2byte	0x5a6
+	.4byte	0xbfee
+	.uleb128 0x43
+	.4byte	.LASF3125
+	.byte	0x1
+	.2byte	0x5a7
+	.4byte	0xc6
+	.byte	0
+	.uleb128 0x64
+	.4byte	.LASF3129
+	.byte	0x1
+	.2byte	0x575
+	.byte	0x1
+	.4byte	0x140d9
+	.uleb128 0x63
+	.4byte	.LASF3119
+	.byte	0x1
+	.2byte	0x575
+	.4byte	0xbfee
+	.uleb128 0x63
+	.4byte	.LASF3120
+	.byte	0x1
+	.2byte	0x575
+	.4byte	0x45aa
+	.uleb128 0x63
+	.4byte	.LASF3121
+	.byte	0x1
+	.2byte	0x575
+	.4byte	0x45aa
+	.uleb128 0x63
+	.4byte	.LASF2943
+	.byte	0x1
+	.2byte	0x575
+	.4byte	0xe81f
+	.uleb128 0x63
+	.4byte	.LASF874
+	.byte	0x1
+	.2byte	0x575
+	.4byte	0xe1ba
+	.uleb128 0x43
+	.4byte	.LASF2992
+	.byte	0x1
+	.2byte	0x577
+	.4byte	0xe0e4
+	.uleb128 0x4f
+	.string	"i"
+	.byte	0x1
+	.2byte	0x578
+	.4byte	0xc6
+	.uleb128 0x4f
+	.string	"j"
+	.byte	0x1
+	.2byte	0x578
+	.4byte	0xc6
+	.uleb128 0x43
+	.4byte	.LASF2870
+	.byte	0x1
+	.2byte	0x579
+	.4byte	0xc6
+	.uleb128 0x43
+	.4byte	.LASF262
+	.byte	0x1
+	.2byte	0x57a
+	.4byte	0xc6
+	.uleb128 0x43
+	.4byte	.LASF3122
+	.byte	0x1
+	.2byte	0x57b
+	.4byte	0x15a
+	.uleb128 0x43
+	.4byte	.LASF3123
+	.byte	0x1
+	.2byte	0x57b
+	.4byte	0x15a
+	.uleb128 0x43
+	.4byte	.LASF3124
+	.byte	0x1
+	.2byte	0x57c
+	.4byte	0xc6
+	.uleb128 0x43
+	.4byte	.LASF2826
+	.byte	0x1
+	.2byte	0x57d
+	.4byte	0xbfee
+	.uleb128 0x43
+	.4byte	.LASF3125
+	.byte	0x1
+	.2byte	0x57e
+	.4byte	0xc6
+	.byte	0
+	.uleb128 0x4a
+	.4byte	.LASF3130
+	.byte	0x1
+	.2byte	0x53c
+	.8byte	.LFB2827
+	.8byte	.LFE2827-.LFB2827
+	.uleb128 0x1
+	.byte	0x9c
+	.4byte	0x14207
+	.uleb128 0x55
+	.4byte	.LASF3119
+	.byte	0x1
+	.2byte	0x53c
+	.4byte	0xbfee
+	.4byte	.LLST240
+	.uleb128 0x55
+	.4byte	.LASF3120
+	.byte	0x1
+	.2byte	0x53c
+	.4byte	0x45aa
+	.4byte	.LLST241
+	.uleb128 0x55
+	.4byte	.LASF3121
+	.byte	0x1
+	.2byte	0x53c
+	.4byte	0x45aa
+	.4byte	.LLST242
+	.uleb128 0x55
+	.4byte	.LASF3131
+	.byte	0x1
+	.2byte	0x53c
+	.4byte	0xbfee
+	.4byte	.LLST243
+	.uleb128 0x55
+	.4byte	.LASF2943
+	.byte	0x1
+	.2byte	0x53c
+	.4byte	0xe81f
+	.4byte	.LLST244
+	.uleb128 0x55
+	.4byte	.LASF874
+	.byte	0x1
+	.2byte	0x53c
+	.4byte	0xe1ba
+	.4byte	.LLST245
+	.uleb128 0x43
+	.4byte	.LASF2992
+	.byte	0x1
+	.2byte	0x53e
+	.4byte	0xe0e4
+	.uleb128 0x57
+	.string	"i"
+	.byte	0x1
+	.2byte	0x53f
+	.4byte	0xc6
+	.4byte	.LLST246
+	.uleb128 0x4f
+	.string	"j"
+	.byte	0x1
+	.2byte	0x540
+	.4byte	0xc6
+	.uleb128 0x56
+	.4byte	.LASF2870
+	.byte	0x1
+	.2byte	0x541
+	.4byte	0xc6
+	.4byte	.LLST247
+	.uleb128 0x43
+	.4byte	.LASF262
+	.byte	0x1
+	.2byte	0x542
+	.4byte	0xc6
+	.uleb128 0x43
+	.4byte	.LASF3122
+	.byte	0x1
+	.2byte	0x543
+	.4byte	0x15a
+	.uleb128 0x43
+	.4byte	.LASF3123
+	.byte	0x1
+	.2byte	0x543
+	.4byte	0x15a
+	.uleb128 0x56
+	.4byte	.LASF3126
+	.byte	0x1
+	.2byte	0x544
+	.4byte	0xbfee
+	.4byte	.LLST248
+	.uleb128 0x56
+	.4byte	.LASF3093
+	.byte	0x1
+	.2byte	0x545
+	.4byte	0xc6
+	.4byte	.LLST249
+	.uleb128 0x56
+	.4byte	.LASF3132
+	.byte	0x1
+	.2byte	0x546
+	.4byte	0x45a4
+	.4byte	.LLST250
+	.uleb128 0x4b
+	.8byte	.LVL790
+	.4byte	0x16cb7
+	.uleb128 0x4b
+	.8byte	.LVL798
+	.4byte	0x163ca
+	.uleb128 0x4b
+	.8byte	.LVL803
+	.4byte	0x163ca
+	.byte	0
+	.uleb128 0x61
+	.4byte	.LASF3133
+	.byte	0x1
+	.2byte	0x4c3
+	.4byte	0x13f
+	.byte	0x1
+	.4byte	0x142b5
+	.uleb128 0x63
+	.4byte	.LASF3120
+	.byte	0x1
+	.2byte	0x4c3
+	.4byte	0x45aa
+	.uleb128 0x63
+	.4byte	.LASF3121
+	.byte	0x1
+	.2byte	0x4c3
+	.4byte	0x45aa
+	.uleb128 0x63
+	.4byte	.LASF3131
+	.byte	0x1
+	.2byte	0x4c3
+	.4byte	0xbfee
+	.uleb128 0x63
+	.4byte	.LASF2943
+	.byte	0x1
+	.2byte	0x4c3
+	.4byte	0xe81f
+	.uleb128 0x63
+	.4byte	.LASF845
+	.byte	0x1
+	.2byte	0x4c3
+	.4byte	0xc6
+	.uleb128 0x43
+	.4byte	.LASF2953
+	.byte	0x1
+	.2byte	0x4c5
+	.4byte	0x110
+	.uleb128 0x43
+	.4byte	.LASF3134
+	.byte	0x1
+	.2byte	0x4c6
+	.4byte	0x110
+	.uleb128 0x43
+	.4byte	.LASF2826
+	.byte	0x1
+	.2byte	0x4c7
+	.4byte	0xbfee
+	.uleb128 0x43
+	.4byte	.LASF3135
+	.byte	0x1
+	.2byte	0x4c8
+	.4byte	0x13f
+	.uleb128 0x43
+	.4byte	.LASF3136
+	.byte	0x1
+	.2byte	0x4c8
+	.4byte	0x13f
+	.uleb128 0x43
+	.4byte	.LASF3137
+	.byte	0x1
+	.2byte	0x4c9
+	.4byte	0x15a
+	.uleb128 0x43
+	.4byte	.LASF3123
+	.byte	0x1
+	.2byte	0x4ca
+	.4byte	0x15a
+	.uleb128 0x43
+	.4byte	.LASF3122
+	.byte	0x1
+	.2byte	0x4cb
+	.4byte	0x15a
+	.byte	0
+	.uleb128 0x4a
+	.4byte	.LASF3138
+	.byte	0x1
+	.2byte	0x419
+	.8byte	.LFB2825
+	.8byte	.LFE2825-.LFB2825
+	.uleb128 0x1
+	.byte	0x9c
+	.4byte	0x14414
+	.uleb128 0x71
+	.4byte	.LASF3119
+	.byte	0x1
+	.2byte	0x419
+	.4byte	0xbfee
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x71
+	.4byte	.LASF3120
+	.byte	0x1
+	.2byte	0x419
+	.4byte	0x45aa
+	.uleb128 0x1
+	.byte	0x51
+	.uleb128 0x71
+	.4byte	.LASF3121
+	.byte	0x1
+	.2byte	0x419
+	.4byte	0x45aa
+	.uleb128 0x1
+	.byte	0x52
+	.uleb128 0x71
+	.4byte	.LASF3131
+	.byte	0x1
+	.2byte	0x419
+	.4byte	0xbfee
+	.uleb128 0x1
+	.byte	0x53
+	.uleb128 0x71
+	.4byte	.LASF2943
+	.byte	0x1
+	.2byte	0x419
+	.4byte	0xe81f
+	.uleb128 0x1
+	.byte	0x54
+	.uleb128 0x55
+	.4byte	.LASF874
+	.byte	0x1
+	.2byte	0x419
+	.4byte	0xe1ba
+	.4byte	.LLST12
+	.uleb128 0x43
+	.4byte	.LASF2992
+	.byte	0x1
+	.2byte	0x41b
+	.4byte	0xe0e4
+	.uleb128 0x57
+	.string	"i"
+	.byte	0x1
+	.2byte	0x41c
+	.4byte	0xc6
+	.4byte	.LLST13
+	.uleb128 0x4f
+	.string	"j"
+	.byte	0x1
+	.2byte	0x41d
+	.4byte	0xc6
+	.uleb128 0x56
+	.4byte	.LASF2870
+	.byte	0x1
+	.2byte	0x41e
+	.4byte	0xc6
+	.4byte	.LLST14
+	.uleb128 0x43
+	.4byte	.LASF262
+	.byte	0x1
+	.2byte	0x41f
+	.4byte	0xc6
+	.uleb128 0x56
+	.4byte	.LASF3122
+	.byte	0x1
+	.2byte	0x420
+	.4byte	0x15a
+	.4byte	.LLST15
+	.uleb128 0x56
+	.4byte	.LASF3123
+	.byte	0x1
+	.2byte	0x420
+	.4byte	0x15a
+	.4byte	.LLST16
+	.uleb128 0x56
+	.4byte	.LASF3126
+	.byte	0x1
+	.2byte	0x421
+	.4byte	0xbfee
+	.4byte	.LLST17
+	.uleb128 0x49
+	.4byte	.LASF2953
+	.byte	0x1
+	.2byte	0x422
+	.4byte	0x110
+	.uleb128 0x1
+	.byte	0x5d
+	.uleb128 0x43
+	.4byte	.LASF3134
+	.byte	0x1
+	.2byte	0x423
+	.4byte	0x110
+	.uleb128 0x43
+	.4byte	.LASF2826
+	.byte	0x1
+	.2byte	0x424
+	.4byte	0xbfee
+	.uleb128 0x43
+	.4byte	.LASF2916
+	.byte	0x1
+	.2byte	0x425
+	.4byte	0xc6
+	.uleb128 0x43
+	.4byte	.LASF3135
+	.byte	0x1
+	.2byte	0x426
+	.4byte	0x110
+	.uleb128 0x43
+	.4byte	.LASF3136
+	.byte	0x1
+	.2byte	0x426
+	.4byte	0x110
+	.uleb128 0x56
+	.4byte	.LASF3137
+	.byte	0x1
+	.2byte	0x427
+	.4byte	0x15a
+	.4byte	.LLST18
+	.uleb128 0x56
+	.4byte	.LASF3093
+	.byte	0x1
+	.2byte	0x428
+	.4byte	0xc6
+	.4byte	.LLST19
+	.uleb128 0x56
+	.4byte	.LASF3132
+	.byte	0x1
+	.2byte	0x429
+	.4byte	0x45a4
+	.4byte	.LLST20
+	.byte	0
+	.uleb128 0x64
+	.4byte	.LASF3139
+	.byte	0x1
+	.2byte	0x3e5
+	.byte	0x1
+	.4byte	0x1453e
+	.uleb128 0x63
+	.4byte	.LASF3119
+	.byte	0x1
+	.2byte	0x3e5
+	.4byte	0xbfee
+	.uleb128 0x63
+	.4byte	.LASF3120
+	.byte	0x1
+	.2byte	0x3e5
+	.4byte	0x45aa
+	.uleb128 0x63
+	.4byte	.LASF3121
+	.byte	0x1
+	.2byte	0x3e5
+	.4byte	0x45aa
+	.uleb128 0x63
+	.4byte	.LASF3131
+	.byte	0x1
+	.2byte	0x3e5
+	.4byte	0xbfee
+	.uleb128 0x63
+	.4byte	.LASF3140
+	.byte	0x1
+	.2byte	0x3e5
+	.4byte	0xbfee
+	.uleb128 0x63
+	.4byte	.LASF2943
+	.byte	0x1
+	.2byte	0x3e5
+	.4byte	0xe81f
+	.uleb128 0x43
+	.4byte	.LASF2992
+	.byte	0x1
+	.2byte	0x3e7
+	.4byte	0xe0e4
+	.uleb128 0x4f
+	.string	"i"
+	.byte	0x1
+	.2byte	0x3e8
+	.4byte	0xc6
+	.uleb128 0x4f
+	.string	"j"
+	.byte	0x1
+	.2byte	0x3e9
+	.4byte	0xc6
+	.uleb128 0x43
+	.4byte	.LASF2870
+	.byte	0x1
+	.2byte	0x3ea
+	.4byte	0xc6
+	.uleb128 0x43
+	.4byte	.LASF262
+	.byte	0x1
+	.2byte	0x3eb
+	.4byte	0xc6
+	.uleb128 0x43
+	.4byte	.LASF3122
+	.byte	0x1
+	.2byte	0x3ec
+	.4byte	0x15a
+	.uleb128 0x43
+	.4byte	.LASF3123
+	.byte	0x1
+	.2byte	0x3ec
+	.4byte	0x15a
+	.uleb128 0x43
+	.4byte	.LASF3141
+	.byte	0x1
+	.2byte	0x3ed
+	.4byte	0x45aa
+	.uleb128 0x43
+	.4byte	.LASF3142
+	.byte	0x1
+	.2byte	0x3ed
+	.4byte	0x45aa
+	.uleb128 0x43
+	.4byte	.LASF3126
+	.byte	0x1
+	.2byte	0x3ee
+	.4byte	0xbfee
+	.uleb128 0x43
+	.4byte	.LASF3143
+	.byte	0x1
+	.2byte	0x3ef
+	.4byte	0xbfee
+	.uleb128 0x43
+	.4byte	.LASF3144
+	.byte	0x1
+	.2byte	0x3f0
+	.4byte	0xbfee
+	.uleb128 0x43
+	.4byte	.LASF3145
+	.byte	0x1
+	.2byte	0x3f1
+	.4byte	0xbfee
+	.uleb128 0x43
+	.4byte	.LASF3146
+	.byte	0x1
+	.2byte	0x3f1
+	.4byte	0xbfee
+	.uleb128 0x43
+	.4byte	.LASF2838
+	.byte	0x1
+	.2byte	0x3f2
+	.4byte	0xc6
+	.uleb128 0x43
+	.4byte	.LASF2840
+	.byte	0x1
+	.2byte	0x3f3
+	.4byte	0xc6
+	.uleb128 0x43
+	.4byte	.LASF2839
+	.byte	0x1
+	.2byte	0x3f4
+	.4byte	0xc6
+	.uleb128 0x43
+	.4byte	.LASF2841
+	.byte	0x1
+	.2byte	0x3f5
+	.4byte	0xc6
+	.byte	0
+	.uleb128 0x61
+	.4byte	.LASF3147
+	.byte	0x1
+	.2byte	0x388
+	.4byte	0x13f
+	.byte	0x1
+	.4byte	0x145e0
+	.uleb128 0x63
+	.4byte	.LASF3123
+	.byte	0x1
+	.2byte	0x388
+	.4byte	0x15a
+	.uleb128 0x63
+	.4byte	.LASF3122
+	.byte	0x1
+	.2byte	0x388
+	.4byte	0x15a
+	.uleb128 0x63
+	.4byte	.LASF3131
+	.byte	0x1
+	.2byte	0x388
+	.4byte	0xbfee
+	.uleb128 0x63
+	.4byte	.LASF3140
+	.byte	0x1
+	.2byte	0x388
+	.4byte	0xbfee
+	.uleb128 0x63
+	.4byte	.LASF2943
+	.byte	0x1
+	.2byte	0x388
+	.4byte	0xe81f
+	.uleb128 0x63
+	.4byte	.LASF845
+	.byte	0x1
+	.2byte	0x388
+	.4byte	0xc6
+	.uleb128 0x43
+	.4byte	.LASF3134
+	.byte	0x1
+	.2byte	0x38a
+	.4byte	0x110
+	.uleb128 0x43
+	.4byte	.LASF2826
+	.byte	0x1
+	.2byte	0x38b
+	.4byte	0xbfee
+	.uleb128 0x43
+	.4byte	.LASF3135
+	.byte	0x1
+	.2byte	0x38c
+	.4byte	0x13f
+	.uleb128 0x43
+	.4byte	.LASF3136
+	.byte	0x1
+	.2byte	0x38c
+	.4byte	0x13f
+	.uleb128 0x43
+	.4byte	.LASF3137
+	.byte	0x1
+	.2byte	0x38d
+	.4byte	0x15a
+	.uleb128 0x43
+	.4byte	.LASF3148
+	.byte	0x1
+	.2byte	0x38e
+	.4byte	0x110
+	.byte	0
+	.uleb128 0x4a
+	.4byte	.LASF3149
+	.byte	0x1
+	.2byte	0x2f7
+	.8byte	.LFB2822
+	.8byte	.LFE2822-.LFB2822
+	.uleb128 0x1
+	.byte	0x9c
+	.4byte	0x147bd
+	.uleb128 0x55
+	.4byte	.LASF3119
+	.byte	0x1
+	.2byte	0x2f7
+	.4byte	0xbfee
+	.4byte	.LLST0
+	.uleb128 0x71
+	.4byte	.LASF3120
+	.byte	0x1
+	.2byte	0x2f7
+	.4byte	0x45aa
+	.uleb128 0x1
+	.byte	0x51
+	.uleb128 0x71
+	.4byte	.LASF3121
+	.byte	0x1
+	.2byte	0x2f7
+	.4byte	0x45aa
+	.uleb128 0x1
+	.byte	0x52
+	.uleb128 0x71
+	.4byte	.LASF3131
+	.byte	0x1
+	.2byte	0x2f7
+	.4byte	0xbfee
+	.uleb128 0x1
+	.byte	0x53
+	.uleb128 0x71
+	.4byte	.LASF3140
+	.byte	0x1
+	.2byte	0x2f7
+	.4byte	0xbfee
+	.uleb128 0x1
+	.byte	0x54
+	.uleb128 0x71
+	.4byte	.LASF2943
+	.byte	0x1
+	.2byte	0x2f7
+	.4byte	0xe81f
+	.uleb128 0x1
+	.byte	0x55
+	.uleb128 0x43
+	.4byte	.LASF2992
+	.byte	0x1
+	.2byte	0x2f9
+	.4byte	0xe0e4
+	.uleb128 0x67
+	.string	"i"
+	.byte	0x1
+	.2byte	0x2fa
+	.4byte	0xc6
+	.uleb128 0x1
+	.byte	0x67
+	.uleb128 0x67
+	.string	"j"
+	.byte	0x1
+	.2byte	0x2fb
+	.4byte	0xc6
+	.uleb128 0x1
+	.byte	0x5a
+	.uleb128 0x56
+	.4byte	.LASF2870
+	.byte	0x1
+	.2byte	0x2fc
+	.4byte	0xc6
+	.4byte	.LLST1
+	.uleb128 0x56
+	.4byte	.LASF262
+	.byte	0x1
+	.2byte	0x2fd
+	.4byte	0xc6
+	.4byte	.LLST2
+	.uleb128 0x56
+	.4byte	.LASF3122
+	.byte	0x1
+	.2byte	0x2fe
+	.4byte	0x15a
+	.4byte	.LLST3
+	.uleb128 0x56
+	.4byte	.LASF3123
+	.byte	0x1
+	.2byte	0x2fe
+	.4byte	0x15a
+	.4byte	.LLST4
+	.uleb128 0x43
+	.4byte	.LASF3141
+	.byte	0x1
+	.2byte	0x2ff
+	.4byte	0x45aa
+	.uleb128 0x43
+	.4byte	.LASF3142
+	.byte	0x1
+	.2byte	0x2ff
+	.4byte	0x45aa
+	.uleb128 0x56
+	.4byte	.LASF3126
+	.byte	0x1
+	.2byte	0x300
+	.4byte	0xbfee
+	.4byte	.LLST5
+	.uleb128 0x49
+	.4byte	.LASF3150
+	.byte	0x1
+	.2byte	0x301
+	.4byte	0xbfee
+	.uleb128 0x1
+	.byte	0x5c
+	.uleb128 0x43
+	.4byte	.LASF3143
+	.byte	0x1
+	.2byte	0x302
+	.4byte	0xbfee
+	.uleb128 0x56
+	.4byte	.LASF3144
+	.byte	0x1
+	.2byte	0x303
+	.4byte	0xbfee
+	.4byte	.LLST6
+	.uleb128 0x43
+	.4byte	.LASF3134
+	.byte	0x1
+	.2byte	0x304
+	.4byte	0x110
+	.uleb128 0x43
+	.4byte	.LASF2826
+	.byte	0x1
+	.2byte	0x305
+	.4byte	0xbfee
+	.uleb128 0x43
+	.4byte	.LASF3148
+	.byte	0x1
+	.2byte	0x306
+	.4byte	0x110
+	.uleb128 0x43
+	.4byte	.LASF3145
+	.byte	0x1
+	.2byte	0x307
+	.4byte	0xbfee
+	.uleb128 0x49
+	.4byte	.LASF3146
+	.byte	0x1
+	.2byte	0x307
+	.4byte	0xbfee
+	.uleb128 0x1
+	.byte	0x60
+	.uleb128 0x43
+	.4byte	.LASF2916
+	.byte	0x1
+	.2byte	0x308
+	.4byte	0xc6
+	.uleb128 0x43
+	.4byte	.LASF3135
+	.byte	0x1
+	.2byte	0x309
+	.4byte	0x110
+	.uleb128 0x43
+	.4byte	.LASF3136
+	.byte	0x1
+	.2byte	0x309
+	.4byte	0x110
+	.uleb128 0x56
+	.4byte	.LASF3137
+	.byte	0x1
+	.2byte	0x30a
+	.4byte	0x15a
+	.4byte	.LLST7
+	.uleb128 0x56
+	.4byte	.LASF2838
+	.byte	0x1
+	.2byte	0x30b
+	.4byte	0xc6
+	.4byte	.LLST8
+	.uleb128 0x56
+	.4byte	.LASF2840
+	.byte	0x1
+	.2byte	0x30c
+	.4byte	0xc6
+	.4byte	.LLST9
+	.uleb128 0x56
+	.4byte	.LASF2839
+	.byte	0x1
+	.2byte	0x30d
+	.4byte	0xc6
+	.4byte	.LLST10
+	.uleb128 0x56
+	.4byte	.LASF2841
+	.byte	0x1
+	.2byte	0x30e
+	.4byte	0xc6
+	.4byte	.LLST11
+	.byte	0
+	.uleb128 0x4a
+	.4byte	.LASF3151
+	.byte	0x1
+	.2byte	0x29a
+	.8byte	.LFB2821
+	.8byte	.LFE2821-.LFB2821
+	.uleb128 0x1
+	.byte	0x9c
+	.4byte	0x14e71
+	.uleb128 0x55
+	.4byte	.LASF3119
+	.byte	0x1
+	.2byte	0x29a
+	.4byte	0xbfee
+	.4byte	.LLST114
+	.uleb128 0x55
+	.4byte	.LASF3120
+	.byte	0x1
+	.2byte	0x29a
+	.4byte	0x45aa
+	.4byte	.LLST115
+	.uleb128 0x55
+	.4byte	.LASF3121
+	.byte	0x1
+	.2byte	0x29a
+	.4byte	0x45aa
+	.4byte	.LLST116
+	.uleb128 0x55
+	.4byte	.LASF3131
+	.byte	0x1
+	.2byte	0x29a
+	.4byte	0xbfee
+	.4byte	.LLST117
+	.uleb128 0x55
+	.4byte	.LASF3140
+	.byte	0x1
+	.2byte	0x29a
+	.4byte	0xbfee
+	.4byte	.LLST118
+	.uleb128 0x55
+	.4byte	.LASF2943
+	.byte	0x1
+	.2byte	0x29a
+	.4byte	0xe81f
+	.4byte	.LLST119
+	.uleb128 0x55
+	.4byte	.LASF874
+	.byte	0x1
+	.2byte	0x29a
+	.4byte	0xe1ba
+	.4byte	.LLST120
+	.uleb128 0x43
+	.4byte	.LASF2992
+	.byte	0x1
+	.2byte	0x29c
+	.4byte	0xe0e4
+	.uleb128 0x57
+	.string	"i"
+	.byte	0x1
+	.2byte	0x29d
+	.4byte	0xc6
+	.4byte	.LLST121
+	.uleb128 0x4f
+	.string	"j"
+	.byte	0x1
+	.2byte	0x29d
+	.4byte	0xc6
+	.uleb128 0x43
+	.4byte	.LASF262
+	.byte	0x1
+	.2byte	0x29d
+	.4byte	0xc6
+	.uleb128 0x56
+	.4byte	.LASF2870
+	.byte	0x1
+	.2byte	0x29d
+	.4byte	0xc6
+	.4byte	.LLST122
+	.uleb128 0x56
+	.4byte	.LASF3093
+	.byte	0x1
+	.2byte	0x29e
+	.4byte	0xc6
+	.4byte	.LLST123
+	.uleb128 0x56
+	.4byte	.LASF3132
+	.byte	0x1
+	.2byte	0x29f
+	.4byte	0x45a4
+	.4byte	.LLST124
+	.uleb128 0x43
+	.4byte	.LASF3125
+	.byte	0x1
+	.2byte	0x2a0
+	.4byte	0xc6
+	.uleb128 0x69
+	.4byte	.Ldebug_ranges0+0x8c0
+	.4byte	0x14e63
+	.uleb128 0x56
+	.4byte	.LASF3126
+	.byte	0x1
+	.2byte	0x2b7
+	.4byte	0xbfee
+	.4byte	.LLST125
+	.uleb128 0x69
+	.4byte	.Ldebug_ranges0+0x8f0
+	.4byte	0x14b9a
+	.uleb128 0x56
+	.4byte	.LASF3123
+	.byte	0x1
+	.2byte	0x2b9
+	.4byte	0x15a
+	.4byte	.LLST126
+	.uleb128 0x56
+	.4byte	.LASF3122
+	.byte	0x1
+	.2byte	0x2ba
+	.4byte	0x15a
+	.4byte	.LLST127
+	.uleb128 0x5b
+	.4byte	.Ldebug_ranges0+0x930
+	.uleb128 0x56
+	.4byte	.LASF3152
+	.byte	0x1
+	.2byte	0x2bd
+	.4byte	0x2b0
+	.4byte	.LLST128
+	.uleb128 0x49
+	.4byte	.LASF3136
+	.byte	0x1
+	.2byte	0x2be
+	.4byte	0x13f
+	.uleb128 0x1
+	.byte	0x56
+	.uleb128 0x56
+	.4byte	.LASF3137
+	.byte	0x1
+	.2byte	0x2bf
+	.4byte	0x15a
+	.4byte	.LLST129
+	.uleb128 0x69
+	.4byte	.Ldebug_ranges0+0x970
+	.4byte	0x1497a
+	.uleb128 0x43
+	.4byte	.LASF3134
+	.byte	0x1
+	.2byte	0x2c2
+	.4byte	0x110
+	.uleb128 0x56
+	.4byte	.LASF3148
+	.byte	0x1
+	.2byte	0x2c2
+	.4byte	0x110
+	.4byte	.LLST130
+	.uleb128 0x43
+	.4byte	.LASF2953
+	.byte	0x1
+	.2byte	0x2c2
+	.4byte	0x110
+	.uleb128 0x56
+	.4byte	.LASF3135
+	.byte	0x1
+	.2byte	0x2c2
+	.4byte	0x13f
+	.4byte	.LLST131
+	.uleb128 0x43
+	.4byte	.LASF2826
+	.byte	0x1
+	.2byte	0x2c2
+	.4byte	0xbfee
+	.byte	0
+	.uleb128 0x69
+	.4byte	.Ldebug_ranges0+0x9b0
+	.4byte	0x149c8
+	.uleb128 0x43
+	.4byte	.LASF3134
+	.byte	0x1
+	.2byte	0x2c3
+	.4byte	0x110
+	.uleb128 0x56
+	.4byte	.LASF3148
+	.byte	0x1
+	.2byte	0x2c3
+	.4byte	0x110
+	.4byte	.LLST132
+	.uleb128 0x43
+	.4byte	.LASF2953
+	.byte	0x1
+	.2byte	0x2c3
+	.4byte	0x110
+	.uleb128 0x56
+	.4byte	.LASF3135
+	.byte	0x1
+	.2byte	0x2c3
+	.4byte	0x13f
+	.4byte	.LLST133
+	.uleb128 0x43
+	.4byte	.LASF2826
+	.byte	0x1
+	.2byte	0x2c3
+	.4byte	0xbfee
+	.byte	0
+	.uleb128 0x69
+	.4byte	.Ldebug_ranges0+0x9e0
+	.4byte	0x14a16
+	.uleb128 0x43
+	.4byte	.LASF3134
+	.byte	0x1
+	.2byte	0x2c4
+	.4byte	0x110
+	.uleb128 0x56
+	.4byte	.LASF3148
+	.byte	0x1
+	.2byte	0x2c4
+	.4byte	0x110
+	.4byte	.LLST134
+	.uleb128 0x43
+	.4byte	.LASF2953
+	.byte	0x1
+	.2byte	0x2c4
+	.4byte	0x110
+	.uleb128 0x56
+	.4byte	.LASF3135
+	.byte	0x1
+	.2byte	0x2c4
+	.4byte	0x13f
+	.4byte	.LLST135
+	.uleb128 0x43
+	.4byte	.LASF2826
+	.byte	0x1
+	.2byte	0x2c4
+	.4byte	0xbfee
+	.byte	0
+	.uleb128 0x69
+	.4byte	.Ldebug_ranges0+0xa10
+	.4byte	0x14a64
+	.uleb128 0x43
+	.4byte	.LASF3134
+	.byte	0x1
+	.2byte	0x2c5
+	.4byte	0x110
+	.uleb128 0x56
+	.4byte	.LASF3148
+	.byte	0x1
+	.2byte	0x2c5
+	.4byte	0x110
+	.4byte	.LLST136
+	.uleb128 0x43
+	.4byte	.LASF2953
+	.byte	0x1
+	.2byte	0x2c5
+	.4byte	0x110
+	.uleb128 0x56
+	.4byte	.LASF3135
+	.byte	0x1
+	.2byte	0x2c5
+	.4byte	0x13f
+	.4byte	.LLST137
+	.uleb128 0x43
+	.4byte	.LASF2826
+	.byte	0x1
+	.2byte	0x2c5
+	.4byte	0xbfee
+	.byte	0
+	.uleb128 0x69
+	.4byte	.Ldebug_ranges0+0xa40
+	.4byte	0x14ab2
+	.uleb128 0x43
+	.4byte	.LASF3134
+	.byte	0x1
+	.2byte	0x2c6
+	.4byte	0x110
+	.uleb128 0x56
+	.4byte	.LASF3148
+	.byte	0x1
+	.2byte	0x2c6
+	.4byte	0x110
+	.4byte	.LLST138
+	.uleb128 0x43
+	.4byte	.LASF2953
+	.byte	0x1
+	.2byte	0x2c6
+	.4byte	0x110
+	.uleb128 0x56
+	.4byte	.LASF3135
+	.byte	0x1
+	.2byte	0x2c6
+	.4byte	0x13f
+	.4byte	.LLST139
+	.uleb128 0x43
+	.4byte	.LASF2826
+	.byte	0x1
+	.2byte	0x2c6
+	.4byte	0xbfee
+	.byte	0
+	.uleb128 0x69
+	.4byte	.Ldebug_ranges0+0xa70
+	.4byte	0x14b00
+	.uleb128 0x43
+	.4byte	.LASF3134
+	.byte	0x1
+	.2byte	0x2c7
+	.4byte	0x110
+	.uleb128 0x56
+	.4byte	.LASF3148
+	.byte	0x1
+	.2byte	0x2c7
+	.4byte	0x110
+	.4byte	.LLST140
+	.uleb128 0x43
+	.4byte	.LASF2953
+	.byte	0x1
+	.2byte	0x2c7
+	.4byte	0x110
+	.uleb128 0x56
+	.4byte	.LASF3135
+	.byte	0x1
+	.2byte	0x2c7
+	.4byte	0x13f
+	.4byte	.LLST141
+	.uleb128 0x43
+	.4byte	.LASF2826
+	.byte	0x1
+	.2byte	0x2c7
+	.4byte	0xbfee
+	.byte	0
+	.uleb128 0x69
+	.4byte	.Ldebug_ranges0+0xaa0
+	.4byte	0x14b4e
+	.uleb128 0x43
+	.4byte	.LASF3134
+	.byte	0x1
+	.2byte	0x2c8
+	.4byte	0x110
+	.uleb128 0x56
+	.4byte	.LASF3148
+	.byte	0x1
+	.2byte	0x2c8
+	.4byte	0x110
+	.4byte	.LLST142
+	.uleb128 0x43
+	.4byte	.LASF2953
+	.byte	0x1
+	.2byte	0x2c8
+	.4byte	0x110
+	.uleb128 0x56
+	.4byte	.LASF3135
+	.byte	0x1
+	.2byte	0x2c8
+	.4byte	0x13f
+	.4byte	.LLST143
+	.uleb128 0x43
+	.4byte	.LASF2826
+	.byte	0x1
+	.2byte	0x2c8
+	.4byte	0xbfee
+	.byte	0
+	.uleb128 0x5b
+	.4byte	.Ldebug_ranges0+0xad0
+	.uleb128 0x43
+	.4byte	.LASF3134
+	.byte	0x1
+	.2byte	0x2c9
+	.4byte	0x110
+	.uleb128 0x56
+	.4byte	.LASF3148
+	.byte	0x1
+	.2byte	0x2c9
+	.4byte	0x110
+	.4byte	.LLST144
+	.uleb128 0x43
+	.4byte	.LASF2953
+	.byte	0x1
+	.2byte	0x2c9
+	.4byte	0x110
+	.uleb128 0x56
+	.4byte	.LASF3135
+	.byte	0x1
+	.2byte	0x2c9
+	.4byte	0x13f
+	.4byte	.LLST145
+	.uleb128 0x43
+	.4byte	.LASF2826
+	.byte	0x1
+	.2byte	0x2c9
+	.4byte	0xbfee
+	.byte	0
+	.byte	0
+	.byte	0
+	.uleb128 0x5b
+	.4byte	.Ldebug_ranges0+0xb00
+	.uleb128 0x56
+	.4byte	.LASF3123
+	.byte	0x1
+	.2byte	0x2d7
+	.4byte	0x15a
+	.4byte	.LLST146
+	.uleb128 0x56
+	.4byte	.LASF3122
+	.byte	0x1
+	.2byte	0x2d8
+	.4byte	0x15a
+	.4byte	.LLST147
+	.uleb128 0x5b
+	.4byte	.Ldebug_ranges0+0xb30
+	.uleb128 0x56
+	.4byte	.LASF3152
+	.byte	0x1
+	.2byte	0x2db
+	.4byte	0x2b0
+	.4byte	.LLST148
+	.uleb128 0x56
+	.4byte	.LASF3136
+	.byte	0x1
+	.2byte	0x2dc
+	.4byte	0x13f
+	.4byte	.LLST149
+	.uleb128 0x56
+	.4byte	.LASF3137
+	.byte	0x1
+	.2byte	0x2dd
+	.4byte	0x15a
+	.4byte	.LLST150
+	.uleb128 0x69
+	.4byte	.Ldebug_ranges0+0xb60
+	.4byte	0x14c42
+	.uleb128 0x43
+	.4byte	.LASF3134
+	.byte	0x1
+	.2byte	0x2e0
+	.4byte	0x110
+	.uleb128 0x56
+	.4byte	.LASF3148
+	.byte	0x1
+	.2byte	0x2e0
+	.4byte	0x110
+	.4byte	.LLST151
+	.uleb128 0x43
+	.4byte	.LASF2953
+	.byte	0x1
+	.2byte	0x2e0
+	.4byte	0x110
+	.uleb128 0x56
+	.4byte	.LASF3135
+	.byte	0x1
+	.2byte	0x2e0
+	.4byte	0x13f
+	.4byte	.LLST152
+	.uleb128 0x43
+	.4byte	.LASF2826
+	.byte	0x1
+	.2byte	0x2e0
+	.4byte	0xbfee
+	.byte	0
+	.uleb128 0x69
+	.4byte	.Ldebug_ranges0+0xba0
+	.4byte	0x14c90
+	.uleb128 0x43
+	.4byte	.LASF3134
+	.byte	0x1
+	.2byte	0x2e1
+	.4byte	0x110
+	.uleb128 0x56
+	.4byte	.LASF3148
+	.byte	0x1
+	.2byte	0x2e1
+	.4byte	0x110
+	.4byte	.LLST153
+	.uleb128 0x43
+	.4byte	.LASF2953
+	.byte	0x1
+	.2byte	0x2e1
+	.4byte	0x110
+	.uleb128 0x56
+	.4byte	.LASF3135
+	.byte	0x1
+	.2byte	0x2e1
+	.4byte	0x13f
+	.4byte	.LLST154
+	.uleb128 0x43
+	.4byte	.LASF2826
+	.byte	0x1
+	.2byte	0x2e1
+	.4byte	0xbfee
+	.byte	0
+	.uleb128 0x69
+	.4byte	.Ldebug_ranges0+0xbd0
+	.4byte	0x14cde
+	.uleb128 0x43
+	.4byte	.LASF3134
+	.byte	0x1
+	.2byte	0x2e2
+	.4byte	0x110
+	.uleb128 0x56
+	.4byte	.LASF3148
+	.byte	0x1
+	.2byte	0x2e2
+	.4byte	0x110
+	.4byte	.LLST155
+	.uleb128 0x43
+	.4byte	.LASF2953
+	.byte	0x1
+	.2byte	0x2e2
+	.4byte	0x110
+	.uleb128 0x56
+	.4byte	.LASF3135
+	.byte	0x1
+	.2byte	0x2e2
+	.4byte	0x13f
+	.4byte	.LLST156
+	.uleb128 0x43
+	.4byte	.LASF2826
+	.byte	0x1
+	.2byte	0x2e2
+	.4byte	0xbfee
+	.byte	0
+	.uleb128 0x69
+	.4byte	.Ldebug_ranges0+0xc00
+	.4byte	0x14d2c
+	.uleb128 0x43
+	.4byte	.LASF3134
+	.byte	0x1
+	.2byte	0x2e3
+	.4byte	0x110
+	.uleb128 0x56
+	.4byte	.LASF3148
+	.byte	0x1
+	.2byte	0x2e3
+	.4byte	0x110
+	.4byte	.LLST157
+	.uleb128 0x43
+	.4byte	.LASF2953
+	.byte	0x1
+	.2byte	0x2e3
+	.4byte	0x110
+	.uleb128 0x56
+	.4byte	.LASF3135
+	.byte	0x1
+	.2byte	0x2e3
+	.4byte	0x13f
+	.4byte	.LLST158
+	.uleb128 0x43
+	.4byte	.LASF2826
+	.byte	0x1
+	.2byte	0x2e3
+	.4byte	0xbfee
+	.byte	0
+	.uleb128 0x69
+	.4byte	.Ldebug_ranges0+0xc30
+	.4byte	0x14d7a
+	.uleb128 0x43
+	.4byte	.LASF3134
+	.byte	0x1
+	.2byte	0x2e4
+	.4byte	0x110
+	.uleb128 0x56
+	.4byte	.LASF3148
+	.byte	0x1
+	.2byte	0x2e4
+	.4byte	0x110
+	.4byte	.LLST159
+	.uleb128 0x43
+	.4byte	.LASF2953
+	.byte	0x1
+	.2byte	0x2e4
+	.4byte	0x110
+	.uleb128 0x56
+	.4byte	.LASF3135
+	.byte	0x1
+	.2byte	0x2e4
+	.4byte	0x13f
+	.4byte	.LLST160
+	.uleb128 0x43
+	.4byte	.LASF2826
+	.byte	0x1
+	.2byte	0x2e4
+	.4byte	0xbfee
+	.byte	0
+	.uleb128 0x69
+	.4byte	.Ldebug_ranges0+0xc60
+	.4byte	0x14dc8
+	.uleb128 0x43
+	.4byte	.LASF3134
+	.byte	0x1
+	.2byte	0x2e5
+	.4byte	0x110
+	.uleb128 0x56
+	.4byte	.LASF3148
+	.byte	0x1
+	.2byte	0x2e5
+	.4byte	0x110
+	.4byte	.LLST161
+	.uleb128 0x43
+	.4byte	.LASF2953
+	.byte	0x1
+	.2byte	0x2e5
+	.4byte	0x110
+	.uleb128 0x56
+	.4byte	.LASF3135
+	.byte	0x1
+	.2byte	0x2e5
+	.4byte	0x13f
+	.4byte	.LLST162
+	.uleb128 0x43
+	.4byte	.LASF2826
+	.byte	0x1
+	.2byte	0x2e5
+	.4byte	0xbfee
+	.byte	0
+	.uleb128 0x69
+	.4byte	.Ldebug_ranges0+0xc90
+	.4byte	0x14e16
+	.uleb128 0x43
+	.4byte	.LASF3134
+	.byte	0x1
+	.2byte	0x2e6
+	.4byte	0x110
+	.uleb128 0x56
+	.4byte	.LASF3148
+	.byte	0x1
+	.2byte	0x2e6
+	.4byte	0x110
+	.4byte	.LLST163
+	.uleb128 0x43
+	.4byte	.LASF2953
+	.byte	0x1
+	.2byte	0x2e6
+	.4byte	0x110
+	.uleb128 0x56
+	.4byte	.LASF3135
+	.byte	0x1
+	.2byte	0x2e6
+	.4byte	0x13f
+	.4byte	.LLST164
+	.uleb128 0x43
+	.4byte	.LASF2826
+	.byte	0x1
+	.2byte	0x2e6
+	.4byte	0xbfee
+	.byte	0
+	.uleb128 0x5b
+	.4byte	.Ldebug_ranges0+0xcc0
+	.uleb128 0x43
+	.4byte	.LASF3134
+	.byte	0x1
+	.2byte	0x2e7
+	.4byte	0x110
+	.uleb128 0x56
+	.4byte	.LASF3148
+	.byte	0x1
+	.2byte	0x2e7
+	.4byte	0x110
+	.4byte	.LLST165
+	.uleb128 0x43
+	.4byte	.LASF2953
+	.byte	0x1
+	.2byte	0x2e7
+	.4byte	0x110
+	.uleb128 0x56
+	.4byte	.LASF3135
+	.byte	0x1
+	.2byte	0x2e7
+	.4byte	0x13f
+	.4byte	.LLST166
+	.uleb128 0x43
+	.4byte	.LASF2826
+	.byte	0x1
+	.2byte	0x2e7
+	.4byte	0xbfee
+	.byte	0
+	.byte	0
+	.byte	0
+	.byte	0
+	.uleb128 0x4b
+	.8byte	.LVL340
+	.4byte	0x16cb7
+	.byte	0
+	.uleb128 0x4a
+	.4byte	.LASF3153
+	.byte	0x1
+	.2byte	0x252
+	.8byte	.LFB2820
+	.8byte	.LFE2820-.LFB2820
+	.uleb128 0x1
+	.byte	0x9c
+	.4byte	0x15242
+	.uleb128 0x55
+	.4byte	.LASF3119
+	.byte	0x1
+	.2byte	0x252
+	.4byte	0xbfee
+	.4byte	.LLST167
+	.uleb128 0x55
+	.4byte	.LASF3120
+	.byte	0x1
+	.2byte	0x252
+	.4byte	0x45aa
+	.4byte	.LLST168
+	.uleb128 0x55
+	.4byte	.LASF3121
+	.byte	0x1
+	.2byte	0x252
+	.4byte	0x45aa
+	.4byte	.LLST169
+	.uleb128 0x55
+	.4byte	.LASF3131
+	.byte	0x1
+	.2byte	0x252
+	.4byte	0xbfee
+	.4byte	.LLST170
+	.uleb128 0x55
+	.4byte	.LASF3140
+	.byte	0x1
+	.2byte	0x252
+	.4byte	0xbfee
+	.4byte	.LLST171
+	.uleb128 0x55
+	.4byte	.LASF2943
+	.byte	0x1
+	.2byte	0x252
+	.4byte	0xe81f
+	.4byte	.LLST172
+	.uleb128 0x55
+	.4byte	.LASF874
+	.byte	0x1
+	.2byte	0x252
+	.4byte	0xe1ba
+	.4byte	.LLST173
+	.uleb128 0x43
+	.4byte	.LASF2992
+	.byte	0x1
+	.2byte	0x254
+	.4byte	0xe0e4
+	.uleb128 0x57
+	.string	"i"
+	.byte	0x1
+	.2byte	0x255
+	.4byte	0xc6
+	.4byte	.LLST174
+	.uleb128 0x4f
+	.string	"j"
+	.byte	0x1
+	.2byte	0x255
+	.4byte	0xc6
+	.uleb128 0x43
+	.4byte	.LASF262
+	.byte	0x1
+	.2byte	0x255
+	.4byte	0xc6
+	.uleb128 0x56
+	.4byte	.LASF2870
+	.byte	0x1
+	.2byte	0x255
+	.4byte	0xc6
+	.4byte	.LLST175
+	.uleb128 0x56
+	.4byte	.LASF3093
+	.byte	0x1
+	.2byte	0x256
+	.4byte	0xc6
+	.4byte	.LLST176
+	.uleb128 0x56
+	.4byte	.LASF3132
+	.byte	0x1
+	.2byte	0x257
+	.4byte	0x45a4
+	.4byte	.LLST177
+	.uleb128 0x56
+	.4byte	.LASF3125
+	.byte	0x1
+	.2byte	0x258
+	.4byte	0xc6
+	.4byte	.LLST178
+	.uleb128 0x69
+	.4byte	.Ldebug_ranges0+0xcf0
+	.4byte	0x15227
+	.uleb128 0x56
+	.4byte	.LASF3123
+	.byte	0x1
+	.2byte	0x277
+	.4byte	0x15a
+	.4byte	.LLST179
+	.uleb128 0x56
+	.4byte	.LASF3122
+	.byte	0x1
+	.2byte	0x278
+	.4byte	0x15a
+	.4byte	.LLST180
+	.uleb128 0x5b
+	.4byte	.Ldebug_ranges0+0xd20
+	.uleb128 0x56
+	.4byte	.LASF3152
+	.byte	0x1
+	.2byte	0x27b
+	.4byte	0x2b0
+	.4byte	.LLST181
+	.uleb128 0x56
+	.4byte	.LASF3126
+	.byte	0x1
+	.2byte	0x27c
+	.4byte	0xbfee
+	.4byte	.LLST182
+	.uleb128 0x43
+	.4byte	.LASF3136
+	.byte	0x1
+	.2byte	0x27d
+	.4byte	0x110
+	.uleb128 0x56
+	.4byte	.LASF3137
+	.byte	0x1
+	.2byte	0x27e
+	.4byte	0x15a
+	.4byte	.LLST183
+	.uleb128 0x69
+	.4byte	.Ldebug_ranges0+0xd50
+	.4byte	0x15023
+	.uleb128 0x43
+	.4byte	.LASF3134
+	.byte	0x1
+	.2byte	0x281
+	.4byte	0x110
+	.uleb128 0x56
+	.4byte	.LASF3148
+	.byte	0x1
+	.2byte	0x281
+	.4byte	0x110
+	.4byte	.LLST184
+	.uleb128 0x43
+	.4byte	.LASF2953
+	.byte	0x1
+	.2byte	0x281
+	.4byte	0x110
+	.uleb128 0x43
+	.4byte	.LASF3135
+	.byte	0x1
+	.2byte	0x281
+	.4byte	0x13f
+	.uleb128 0x43
+	.4byte	.LASF2826
+	.byte	0x1
+	.2byte	0x281
+	.4byte	0xbfee
+	.byte	0
+	.uleb128 0x69
+	.4byte	.Ldebug_ranges0+0xd90
+	.4byte	0x1506d
+	.uleb128 0x43
+	.4byte	.LASF3134
+	.byte	0x1
+	.2byte	0x282
+	.4byte	0x110
+	.uleb128 0x56
+	.4byte	.LASF3148
+	.byte	0x1
+	.2byte	0x282
+	.4byte	0x110
+	.4byte	.LLST185
+	.uleb128 0x43
+	.4byte	.LASF2953
+	.byte	0x1
+	.2byte	0x282
+	.4byte	0x110
+	.uleb128 0x43
+	.4byte	.LASF3135
+	.byte	0x1
+	.2byte	0x282
+	.4byte	0x13f
+	.uleb128 0x43
+	.4byte	.LASF2826
+	.byte	0x1
+	.2byte	0x282
+	.4byte	0xbfee
+	.byte	0
+	.uleb128 0x69
+	.4byte	.Ldebug_ranges0+0xdc0
+	.4byte	0x150b7
+	.uleb128 0x43
+	.4byte	.LASF3134
+	.byte	0x1
+	.2byte	0x283
+	.4byte	0x110
+	.uleb128 0x56
+	.4byte	.LASF3148
+	.byte	0x1
+	.2byte	0x283
+	.4byte	0x110
+	.4byte	.LLST186
+	.uleb128 0x43
+	.4byte	.LASF2953
+	.byte	0x1
+	.2byte	0x283
+	.4byte	0x110
+	.uleb128 0x43
+	.4byte	.LASF3135
+	.byte	0x1
+	.2byte	0x283
+	.4byte	0x13f
+	.uleb128 0x43
+	.4byte	.LASF2826
+	.byte	0x1
+	.2byte	0x283
+	.4byte	0xbfee
+	.byte	0
+	.uleb128 0x69
+	.4byte	.Ldebug_ranges0+0xdf0
+	.4byte	0x15101
+	.uleb128 0x43
+	.4byte	.LASF3134
+	.byte	0x1
+	.2byte	0x284
+	.4byte	0x110
+	.uleb128 0x56
+	.4byte	.LASF3148
+	.byte	0x1
+	.2byte	0x284
+	.4byte	0x110
+	.4byte	.LLST187
+	.uleb128 0x43
+	.4byte	.LASF2953
+	.byte	0x1
+	.2byte	0x284
+	.4byte	0x110
+	.uleb128 0x43
+	.4byte	.LASF3135
+	.byte	0x1
+	.2byte	0x284
+	.4byte	0x13f
+	.uleb128 0x43
+	.4byte	.LASF2826
+	.byte	0x1
+	.2byte	0x284
+	.4byte	0xbfee
+	.byte	0
+	.uleb128 0x69
+	.4byte	.Ldebug_ranges0+0xe20
+	.4byte	0x1514b
+	.uleb128 0x43
+	.4byte	.LASF3134
+	.byte	0x1
+	.2byte	0x287
+	.4byte	0x110
+	.uleb128 0x56
+	.4byte	.LASF3148
+	.byte	0x1
+	.2byte	0x287
+	.4byte	0x110
+	.4byte	.LLST188
+	.uleb128 0x43
+	.4byte	.LASF2953
+	.byte	0x1
+	.2byte	0x287
+	.4byte	0x110
+	.uleb128 0x43
+	.4byte	.LASF3135
+	.byte	0x1
+	.2byte	0x287
+	.4byte	0x13f
+	.uleb128 0x43
+	.4byte	.LASF2826
+	.byte	0x1
+	.2byte	0x287
+	.4byte	0xbfee
+	.byte	0
+	.uleb128 0x69
+	.4byte	.Ldebug_ranges0+0xe50
+	.4byte	0x15195
+	.uleb128 0x43
+	.4byte	.LASF3134
+	.byte	0x1
+	.2byte	0x288
+	.4byte	0x110
+	.uleb128 0x56
+	.4byte	.LASF3148
+	.byte	0x1
+	.2byte	0x288
+	.4byte	0x110
+	.4byte	.LLST189
+	.uleb128 0x43
+	.4byte	.LASF2953
+	.byte	0x1
+	.2byte	0x288
+	.4byte	0x110
+	.uleb128 0x43
+	.4byte	.LASF3135
+	.byte	0x1
+	.2byte	0x288
+	.4byte	0x13f
+	.uleb128 0x43
+	.4byte	.LASF2826
+	.byte	0x1
+	.2byte	0x288
+	.4byte	0xbfee
+	.byte	0
+	.uleb128 0x69
+	.4byte	.Ldebug_ranges0+0xe80
+	.4byte	0x151df
+	.uleb128 0x43
+	.4byte	.LASF3134
+	.byte	0x1
+	.2byte	0x289
+	.4byte	0x110
+	.uleb128 0x56
+	.4byte	.LASF3148
+	.byte	0x1
+	.2byte	0x289
+	.4byte	0x110
+	.4byte	.LLST190
+	.uleb128 0x43
+	.4byte	.LASF2953
+	.byte	0x1
+	.2byte	0x289
+	.4byte	0x110
+	.uleb128 0x43
+	.4byte	.LASF3135
+	.byte	0x1
+	.2byte	0x289
+	.4byte	0x13f
+	.uleb128 0x43
+	.4byte	.LASF2826
+	.byte	0x1
+	.2byte	0x289
+	.4byte	0xbfee
+	.byte	0
+	.uleb128 0x5b
+	.4byte	.Ldebug_ranges0+0xeb0
+	.uleb128 0x43
+	.4byte	.LASF3134
+	.byte	0x1
+	.2byte	0x28a
+	.4byte	0x110
+	.uleb128 0x56
+	.4byte	.LASF3148
+	.byte	0x1
+	.2byte	0x28a
+	.4byte	0x110
+	.4byte	.LLST191
+	.uleb128 0x43
+	.4byte	.LASF2953
+	.byte	0x1
+	.2byte	0x28a
+	.4byte	0x110
+	.uleb128 0x43
+	.4byte	.LASF3135
+	.byte	0x1
+	.2byte	0x28a
+	.4byte	0x13f
+	.uleb128 0x43
+	.4byte	.LASF2826
+	.byte	0x1
+	.2byte	0x28a
+	.4byte	0xbfee
+	.byte	0
+	.byte	0
+	.byte	0
+	.uleb128 0x4b
+	.8byte	.LVL556
+	.4byte	0x16cb7
+	.uleb128 0x4b
+	.8byte	.LVL621
+	.4byte	0x16cb7
+	.byte	0
+	.uleb128 0x72
+	.4byte	.LASF3159
+	.byte	0x1
+	.2byte	0x216
+	.8byte	.LFB2819
+	.8byte	.LFE2819-.LFB2819
+	.uleb128 0x1
+	.byte	0x9c
+	.4byte	0x15309
+	.uleb128 0x71
+	.4byte	.LASF3154
+	.byte	0x1
+	.2byte	0x216
+	.4byte	0x45aa
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x71
+	.4byte	.LASF3155
+	.byte	0x1
+	.2byte	0x216
+	.4byte	0x45aa
+	.uleb128 0x1
+	.byte	0x51
+	.uleb128 0x71
+	.4byte	.LASF3131
+	.byte	0x1
+	.2byte	0x216
+	.4byte	0x45aa
+	.uleb128 0x1
+	.byte	0x52
+	.uleb128 0x55
+	.4byte	.LASF2943
+	.byte	0x1
+	.2byte	0x216
+	.4byte	0xe81f
+	.4byte	.LLST354
+	.uleb128 0x49
+	.4byte	.LASF2870
+	.byte	0x1
+	.2byte	0x218
+	.4byte	0xc6
+	.uleb128 0x1
+	.byte	0x5e
+	.uleb128 0x49
+	.4byte	.LASF262
+	.byte	0x1
+	.2byte	0x218
+	.4byte	0xc6
+	.uleb128 0x1
+	.byte	0x5a
+	.uleb128 0x43
+	.4byte	.LASF3156
+	.byte	0x1
+	.2byte	0x219
+	.4byte	0x15a
+	.uleb128 0x56
+	.4byte	.LASF3157
+	.byte	0x1
+	.2byte	0x219
+	.4byte	0x15a
+	.4byte	.LLST355
+	.uleb128 0x56
+	.4byte	.LASF3134
+	.byte	0x1
+	.2byte	0x21a
+	.4byte	0x15a
+	.4byte	.LLST356
+	.uleb128 0x67
+	.string	"i"
+	.byte	0x1
+	.2byte	0x21b
+	.4byte	0xc6
+	.uleb128 0x1
+	.byte	0x5d
+	.uleb128 0x4f
+	.string	"j"
+	.byte	0x1
+	.2byte	0x21b
+	.4byte	0xc6
+	.uleb128 0x56
+	.4byte	.LASF3158
+	.byte	0x1
+	.2byte	0x21c
+	.4byte	0x15a
+	.4byte	.LLST357
+	.byte	0
+	.uleb128 0x72
+	.4byte	.LASF3160
+	.byte	0x1
+	.2byte	0x1e5
+	.8byte	.LFB2818
+	.8byte	.LFE2818-.LFB2818
+	.uleb128 0x1
+	.byte	0x9c
+	.4byte	0x155a2
+	.uleb128 0x71
+	.4byte	.LASF3154
+	.byte	0x1
+	.2byte	0x1e5
+	.4byte	0x45aa
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x71
+	.4byte	.LASF3161
+	.byte	0x1
+	.2byte	0x1e5
+	.4byte	0x45aa
+	.uleb128 0x1
+	.byte	0x51
+	.uleb128 0x71
+	.4byte	.LASF3155
+	.byte	0x1
+	.2byte	0x1e5
+	.4byte	0x45aa
+	.uleb128 0x1
+	.byte	0x52
+	.uleb128 0x71
+	.4byte	.LASF3131
+	.byte	0x1
+	.2byte	0x1e5
+	.4byte	0x45aa
+	.uleb128 0x1
+	.byte	0x53
+	.uleb128 0x71
+	.4byte	.LASF3140
+	.byte	0x1
+	.2byte	0x1e5
+	.4byte	0x45aa
+	.uleb128 0x1
+	.byte	0x54
+	.uleb128 0x55
+	.4byte	.LASF2943
+	.byte	0x1
+	.2byte	0x1e5
+	.4byte	0xe81f
+	.4byte	.LLST334
+	.uleb128 0x56
+	.4byte	.LASF2870
+	.byte	0x1
+	.2byte	0x1e7
+	.4byte	0xc6
+	.4byte	.LLST335
+	.uleb128 0x49
+	.4byte	.LASF262
+	.byte	0x1
+	.2byte	0x1e7
+	.4byte	0xc6
+	.uleb128 0x1
+	.byte	0x5c
+	.uleb128 0x43
+	.4byte	.LASF3156
+	.byte	0x1
+	.2byte	0x1e8
+	.4byte	0x15a
+	.uleb128 0x56
+	.4byte	.LASF3162
+	.byte	0x1
+	.2byte	0x1e8
+	.4byte	0x15a
+	.4byte	.LLST336
+	.uleb128 0x49
+	.4byte	.LASF3157
+	.byte	0x1
+	.2byte	0x1e8
+	.4byte	0x15a
+	.uleb128 0x1
+	.byte	0x5a
+	.uleb128 0x56
+	.4byte	.LASF3134
+	.byte	0x1
+	.2byte	0x1e9
+	.4byte	0x15a
+	.4byte	.LLST337
+	.uleb128 0x43
+	.4byte	.LASF3148
+	.byte	0x1
+	.2byte	0x1ea
+	.4byte	0x15a
+	.uleb128 0x57
+	.string	"i"
+	.byte	0x1
+	.2byte	0x1eb
+	.4byte	0xc6
+	.4byte	.LLST338
+	.uleb128 0x4f
+	.string	"j"
+	.byte	0x1
+	.2byte	0x1eb
+	.4byte	0xc6
+	.uleb128 0x49
+	.4byte	.LASF3158
+	.byte	0x1
+	.2byte	0x1ec
+	.4byte	0x15a
+	.uleb128 0x1
+	.byte	0x55
+	.uleb128 0x69
+	.4byte	.Ldebug_ranges0+0x1ab0
+	.4byte	0x1541f
+	.uleb128 0x49
+	.4byte	.LASF3163
+	.byte	0x1
+	.2byte	0x1fb
+	.4byte	0x15a
+	.uleb128 0x1
+	.byte	0x55
+	.byte	0
+	.uleb128 0x69
+	.4byte	.Ldebug_ranges0+0x1b10
+	.4byte	0x15439
+	.uleb128 0x56
+	.4byte	.LASF3163
+	.byte	0x1
+	.2byte	0x1fc
+	.4byte	0x15a
+	.4byte	.LLST344
+	.byte	0
+	.uleb128 0x69
+	.4byte	.Ldebug_ranges0+0x1b60
+	.4byte	0x15453
+	.uleb128 0x56
+	.4byte	.LASF3163
+	.byte	0x1
+	.2byte	0x1fd
+	.4byte	0x15a
+	.4byte	.LLST345
+	.byte	0
+	.uleb128 0x69
+	.4byte	.Ldebug_ranges0+0x1850
+	.4byte	0x1546d
+	.uleb128 0x56
+	.4byte	.LASF3163
+	.byte	0x1
+	.2byte	0x1fe
+	.4byte	0x15a
+	.4byte	.LLST339
+	.byte	0
+	.uleb128 0x69
+	.4byte	.Ldebug_ranges0+0x18d0
+	.4byte	0x15487
+	.uleb128 0x56
+	.4byte	.LASF3163
+	.byte	0x1
+	.2byte	0x1ff
+	.4byte	0x15a
+	.4byte	.LLST340
+	.byte	0
+	.uleb128 0x69
+	.4byte	.Ldebug_ranges0+0x1960
+	.4byte	0x154a1
+	.uleb128 0x56
+	.4byte	.LASF3163
+	.byte	0x1
+	.2byte	0x200
+	.4byte	0x15a
+	.4byte	.LLST341
+	.byte	0
+	.uleb128 0x69
+	.4byte	.Ldebug_ranges0+0x19f0
+	.4byte	0x154bb
+	.uleb128 0x56
+	.4byte	.LASF3163
+	.byte	0x1
+	.2byte	0x201
+	.4byte	0x15a
+	.4byte	.LLST342
+	.byte	0
+	.uleb128 0x69
+	.4byte	.Ldebug_ranges0+0x1a70
+	.4byte	0x154d5
+	.uleb128 0x56
+	.4byte	.LASF3163
+	.byte	0x1
+	.2byte	0x202
+	.4byte	0x15a
+	.4byte	.LLST343
+	.byte	0
+	.uleb128 0x69
+	.4byte	.Ldebug_ranges0+0x1c10
+	.4byte	0x154ef
+	.uleb128 0x56
+	.4byte	.LASF3163
+	.byte	0x1
+	.2byte	0x204
+	.4byte	0x15a
+	.4byte	.LLST347
+	.byte	0
+	.uleb128 0x69
+	.4byte	.Ldebug_ranges0+0x1c80
+	.4byte	0x15509
+	.uleb128 0x56
+	.4byte	.LASF3163
+	.byte	0x1
+	.2byte	0x205
+	.4byte	0x15a
+	.4byte	.LLST348
+	.byte	0
+	.uleb128 0x69
+	.4byte	.Ldebug_ranges0+0x1ce0
+	.4byte	0x15523
+	.uleb128 0x56
+	.4byte	.LASF3163
+	.byte	0x1
+	.2byte	0x206
+	.4byte	0x15a
+	.4byte	.LLST349
+	.byte	0
+	.uleb128 0x69
+	.4byte	.Ldebug_ranges0+0x1d40
+	.4byte	0x1553d
+	.uleb128 0x56
+	.4byte	.LASF3163
+	.byte	0x1
+	.2byte	0x207
+	.4byte	0x15a
+	.4byte	.LLST350
+	.byte	0
+	.uleb128 0x69
+	.4byte	.Ldebug_ranges0+0x1da0
+	.4byte	0x15557
+	.uleb128 0x56
+	.4byte	.LASF3163
+	.byte	0x1
+	.2byte	0x208
+	.4byte	0x15a
+	.4byte	.LLST351
+	.byte	0
+	.uleb128 0x69
+	.4byte	.Ldebug_ranges0+0x1e00
+	.4byte	0x15571
+	.uleb128 0x56
+	.4byte	.LASF3163
+	.byte	0x1
+	.2byte	0x209
+	.4byte	0x15a
+	.4byte	.LLST352
+	.byte	0
+	.uleb128 0x69
+	.4byte	.Ldebug_ranges0+0x1e60
+	.4byte	0x1558b
+	.uleb128 0x56
+	.4byte	.LASF3163
+	.byte	0x1
+	.2byte	0x20a
+	.4byte	0x15a
+	.4byte	.LLST353
+	.byte	0
+	.uleb128 0x5b
+	.4byte	.Ldebug_ranges0+0x1bb0
+	.uleb128 0x56
+	.4byte	.LASF3163
+	.byte	0x1
+	.2byte	0x20b
+	.4byte	0x15a
+	.4byte	.LLST346
+	.byte	0
+	.byte	0
+	.uleb128 0x64
+	.4byte	.LASF3164
+	.byte	0x1
+	.2byte	0x1a5
+	.byte	0x1
+	.4byte	0x15728
+	.uleb128 0x63
+	.4byte	.LASF3154
+	.byte	0x1
+	.2byte	0x1a5
+	.4byte	0x45aa
+	.uleb128 0x63
+	.4byte	.LASF3161
+	.byte	0x1
+	.2byte	0x1a5
+	.4byte	0x45aa
+	.uleb128 0x63
+	.4byte	.LASF3155
+	.byte	0x1
+	.2byte	0x1a5
+	.4byte	0x45aa
+	.uleb128 0x63
+	.4byte	.LASF3131
+	.byte	0x1
+	.2byte	0x1a5
+	.4byte	0x45aa
+	.uleb128 0x63
+	.4byte	.LASF3140
+	.byte	0x1
+	.2byte	0x1a5
+	.4byte	0x45aa
+	.uleb128 0x63
+	.4byte	.LASF2943
+	.byte	0x1
+	.2byte	0x1a5
+	.4byte	0xe81f
+	.uleb128 0x43
+	.4byte	.LASF2870
+	.byte	0x1
+	.2byte	0x1a7
+	.4byte	0xc6
+	.uleb128 0x43
+	.4byte	.LASF262
+	.byte	0x1
+	.2byte	0x1a7
+	.4byte	0xc6
+	.uleb128 0x43
+	.4byte	.LASF3156
+	.byte	0x1
+	.2byte	0x1a8
+	.4byte	0x15a
+	.uleb128 0x43
+	.4byte	.LASF3162
+	.byte	0x1
+	.2byte	0x1a8
+	.4byte	0x15a
+	.uleb128 0x43
+	.4byte	.LASF3157
+	.byte	0x1
+	.2byte	0x1a8
+	.4byte	0x15a
+	.uleb128 0x43
+	.4byte	.LASF3134
+	.byte	0x1
+	.2byte	0x1a9
+	.4byte	0x15a
+	.uleb128 0x43
+	.4byte	.LASF3148
+	.byte	0x1
+	.2byte	0x1aa
+	.4byte	0x15a
+	.uleb128 0x43
+	.4byte	.LASF3158
+	.byte	0x1
+	.2byte	0x1ab
+	.4byte	0x15a
+	.uleb128 0x4f
+	.string	"i"
+	.byte	0x1
+	.2byte	0x1ac
+	.4byte	0xc6
+	.uleb128 0x4f
+	.string	"j"
+	.byte	0x1
+	.2byte	0x1ad
+	.4byte	0xc6
+	.uleb128 0x43
+	.4byte	.LASF2838
+	.byte	0x1
+	.2byte	0x1ae
+	.4byte	0xc6
+	.uleb128 0x43
+	.4byte	.LASF2840
+	.byte	0x1
+	.2byte	0x1af
+	.4byte	0xc6
+	.uleb128 0x43
+	.4byte	.LASF2839
+	.byte	0x1
+	.2byte	0x1b0
+	.4byte	0xc6
+	.uleb128 0x43
+	.4byte	.LASF2841
+	.byte	0x1
+	.2byte	0x1b1
+	.4byte	0xc6
+	.uleb128 0x6f
+	.4byte	0x156ad
+	.uleb128 0x43
+	.4byte	.LASF3163
+	.byte	0x1
+	.2byte	0x1ce
+	.4byte	0x15a
+	.byte	0
+	.uleb128 0x6f
+	.4byte	0x156bf
+	.uleb128 0x43
+	.4byte	.LASF3163
+	.byte	0x1
+	.2byte	0x1cf
+	.4byte	0x15a
+	.byte	0
+	.uleb128 0x6f
+	.4byte	0x156d1
+	.uleb128 0x43
+	.4byte	.LASF3163
+	.byte	0x1
+	.2byte	0x1d0
+	.4byte	0x15a
+	.byte	0
+	.uleb128 0x6f
+	.4byte	0x156e3
+	.uleb128 0x43
+	.4byte	.LASF3163
+	.byte	0x1
+	.2byte	0x1d1
+	.4byte	0x15a
+	.byte	0
+	.uleb128 0x6f
+	.4byte	0x156f5
+	.uleb128 0x43
+	.4byte	.LASF3163
+	.byte	0x1
+	.2byte	0x1d2
+	.4byte	0x15a
+	.byte	0
+	.uleb128 0x6f
+	.4byte	0x15707
+	.uleb128 0x43
+	.4byte	.LASF3163
+	.byte	0x1
+	.2byte	0x1d3
+	.4byte	0x15a
+	.byte	0
+	.uleb128 0x6f
+	.4byte	0x15719
+	.uleb128 0x43
+	.4byte	.LASF3163
+	.byte	0x1
+	.2byte	0x1d4
+	.4byte	0x15a
+	.byte	0
+	.uleb128 0x65
+	.uleb128 0x43
+	.4byte	.LASF3163
+	.byte	0x1
+	.2byte	0x1d5
+	.4byte	0x15a
+	.byte	0
+	.byte	0
+	.uleb128 0x61
+	.4byte	.LASF3165
+	.byte	0x1
+	.2byte	0x186
+	.4byte	0xc6
+	.byte	0x1
+	.4byte	0x1575e
+	.uleb128 0x62
+	.string	"ebc"
+	.byte	0x1
+	.2byte	0x186
+	.4byte	0xe4d7
+	.uleb128 0x63
+	.4byte	.LASF3166
+	.byte	0x1
+	.2byte	0x186
+	.4byte	0xc6
+	.uleb128 0x43
+	.4byte	.LASF2943
+	.byte	0x1
+	.2byte	0x188
+	.4byte	0xe81f
+	.byte	0
+	.uleb128 0x61
+	.4byte	.LASF3167
+	.byte	0x1
+	.2byte	0x168
+	.4byte	0x13f
+	.byte	0x3
+	.4byte	0x157ac
+	.uleb128 0x63
+	.4byte	.LASF2826
+	.byte	0x1
+	.2byte	0x168
+	.4byte	0xbfee
+	.uleb128 0x63
+	.4byte	.LASF3122
+	.byte	0x1
+	.2byte	0x168
+	.4byte	0x15a
+	.uleb128 0x63
+	.4byte	.LASF3123
+	.byte	0x1
+	.2byte	0x168
+	.4byte	0x15a
+	.uleb128 0x43
+	.4byte	.LASF3168
+	.byte	0x1
+	.2byte	0x16a
+	.4byte	0x13f
+	.uleb128 0x43
+	.4byte	.LASF3137
+	.byte	0x1
+	.2byte	0x16b
+	.4byte	0x15a
+	.byte	0
+	.uleb128 0x61
+	.4byte	.LASF3169
+	.byte	0x1
+	.2byte	0x14a
+	.4byte	0x13f
+	.byte	0x3
+	.4byte	0x157fa
+	.uleb128 0x63
+	.4byte	.LASF2826
+	.byte	0x1
+	.2byte	0x14a
+	.4byte	0xbfee
+	.uleb128 0x63
+	.4byte	.LASF3122
+	.byte	0x1
+	.2byte	0x14a
+	.4byte	0x15a
+	.uleb128 0x63
+	.4byte	.LASF3123
+	.byte	0x1
+	.2byte	0x14a
+	.4byte	0x15a
+	.uleb128 0x43
+	.4byte	.LASF3168
+	.byte	0x1
+	.2byte	0x14c
+	.4byte	0x13f
+	.uleb128 0x43
+	.4byte	.LASF3137
+	.byte	0x1
+	.2byte	0x14d
+	.4byte	0x15a
+	.byte	0
+	.uleb128 0x61
+	.4byte	.LASF3170
+	.byte	0x1
+	.2byte	0x12c
+	.4byte	0x11f
+	.byte	0x3
+	.4byte	0x15848
+	.uleb128 0x63
+	.4byte	.LASF2826
+	.byte	0x1
+	.2byte	0x12c
+	.4byte	0xbfee
+	.uleb128 0x63
+	.4byte	.LASF3122
+	.byte	0x1
+	.2byte	0x12c
+	.4byte	0x15a
+	.uleb128 0x63
+	.4byte	.LASF3123
+	.byte	0x1
+	.2byte	0x12c
+	.4byte	0x15a
+	.uleb128 0x43
+	.4byte	.LASF3168
+	.byte	0x1
+	.2byte	0x12e
+	.4byte	0x11f
+	.uleb128 0x43
+	.4byte	.LASF3137
+	.byte	0x1
+	.2byte	0x12f
+	.4byte	0x15a
+	.byte	0
+	.uleb128 0x61
+	.4byte	.LASF3171
+	.byte	0x1
+	.2byte	0x120
+	.4byte	0x13f
+	.byte	0x3
+	.4byte	0x1587e
+	.uleb128 0x63
+	.4byte	.LASF2826
+	.byte	0x1
+	.2byte	0x120
+	.4byte	0xbfee
+	.uleb128 0x63
+	.4byte	.LASF3122
+	.byte	0x1
+	.2byte	0x120
+	.4byte	0x15a
+	.uleb128 0x63
+	.4byte	.LASF3123
+	.byte	0x1
+	.2byte	0x120
+	.4byte	0x15a
+	.byte	0
+	.uleb128 0x61
+	.4byte	.LASF3172
+	.byte	0x1
+	.2byte	0x114
+	.4byte	0x13f
+	.byte	0x3
+	.4byte	0x158b4
+	.uleb128 0x63
+	.4byte	.LASF2826
+	.byte	0x1
+	.2byte	0x114
+	.4byte	0xbfee
+	.uleb128 0x63
+	.4byte	.LASF3122
+	.byte	0x1
+	.2byte	0x114
+	.4byte	0x15a
+	.uleb128 0x63
+	.4byte	.LASF3123
+	.byte	0x1
+	.2byte	0x114
+	.4byte	0x15a
+	.byte	0
+	.uleb128 0x61
+	.4byte	.LASF3173
+	.byte	0x1
+	.2byte	0x108
+	.4byte	0x11f
+	.byte	0x3
+	.4byte	0x158ea
+	.uleb128 0x63
+	.4byte	.LASF2826
+	.byte	0x1
+	.2byte	0x108
+	.4byte	0xbfee
+	.uleb128 0x63
+	.4byte	.LASF3122
+	.byte	0x1
+	.2byte	0x108
+	.4byte	0x15a
+	.uleb128 0x63
+	.4byte	.LASF3123
+	.byte	0x1
+	.2byte	0x108
+	.4byte	0x15a
+	.byte	0
+	.uleb128 0x73
+	.4byte	.LASF3174
+	.byte	0xa
+	.byte	0x4a
+	.byte	0x3
+	.4byte	0x1590d
+	.uleb128 0x74
+	.4byte	.LASF2906
+	.byte	0xa
+	.byte	0x4a
+	.4byte	0xe0a4
+	.uleb128 0x74
+	.4byte	.LASF2953
+	.byte	0xa
+	.byte	0x4a
+	.4byte	0xc6
+	.byte	0
+	.uleb128 0x73
+	.4byte	.LASF3175
+	.byte	0xa
+	.byte	0x3b
+	.byte	0x3
+	.4byte	0x1593b
+	.uleb128 0x74
+	.4byte	.LASF2906
+	.byte	0xa
+	.byte	0x3b
+	.4byte	0xe0a4
+	.uleb128 0x74
+	.4byte	.LASF3176
+	.byte	0xa
+	.byte	0x3b
+	.4byte	0x13f
+	.uleb128 0x74
+	.4byte	.LASF3177
+	.byte	0xa
+	.byte	0x3b
+	.4byte	0x13f
+	.byte	0
+	.uleb128 0x73
+	.4byte	.LASF3178
+	.byte	0xa
+	.byte	0x35
+	.byte	0x3
+	.4byte	0x1597f
+	.uleb128 0x74
+	.4byte	.LASF2906
+	.byte	0xa
+	.byte	0x35
+	.4byte	0xe0a4
+	.uleb128 0x74
+	.4byte	.LASF3179
+	.byte	0xa
+	.byte	0x35
+	.4byte	0xc6
+	.uleb128 0x74
+	.4byte	.LASF3180
+	.byte	0xa
+	.byte	0x36
+	.4byte	0xc6
+	.uleb128 0x74
+	.4byte	.LASF3181
+	.byte	0xa
+	.byte	0x36
+	.4byte	0xc6
+	.uleb128 0x74
+	.4byte	.LASF3182
+	.byte	0xa
+	.byte	0x36
+	.4byte	0xc6
+	.byte	0
+	.uleb128 0x73
+	.4byte	.LASF3183
+	.byte	0xa
+	.byte	0x30
+	.byte	0x3
+	.4byte	0x15997
+	.uleb128 0x74
+	.4byte	.LASF2906
+	.byte	0xa
+	.byte	0x30
+	.4byte	0xe0a4
+	.byte	0
+	.uleb128 0x75
+	.4byte	.LASF3184
+	.byte	0xa
+	.byte	0x2b
+	.4byte	0xc6
+	.byte	0x3
+	.4byte	0x159be
+	.uleb128 0x74
+	.4byte	.LASF2906
+	.byte	0xa
+	.byte	0x2b
+	.4byte	0xe0a4
+	.uleb128 0x74
+	.4byte	.LASF2992
+	.byte	0xa
+	.byte	0x2b
+	.4byte	0xe0e4
+	.byte	0
+	.uleb128 0x64
+	.4byte	.LASF3185
+	.byte	0x9
+	.2byte	0x1ab
+	.byte	0x3
+	.4byte	0x15a08
+	.uleb128 0x62
+	.string	"dev"
+	.byte	0x9
+	.2byte	0x1ab
+	.4byte	0xa496
+	.uleb128 0x63
+	.4byte	.LASF1118
+	.byte	0x9
+	.2byte	0x1ac
+	.4byte	0x325
+	.uleb128 0x63
+	.4byte	.LASF957
+	.byte	0x9
+	.2byte	0x1ac
+	.4byte	0x2e3
+	.uleb128 0x62
+	.string	"dir"
+	.byte	0x9
+	.2byte	0x1ad
+	.4byte	0xdaf2
+	.uleb128 0x4f
+	.string	"ops"
+	.byte	0x9
+	.2byte	0x1af
+	.4byte	0xb6df
+	.byte	0
+	.uleb128 0x61
+	.4byte	.LASF3186
+	.byte	0x9
+	.2byte	0x108
+	.4byte	0xb6df
+	.byte	0x3
+	.4byte	0x15a26
+	.uleb128 0x62
+	.string	"dev"
+	.byte	0x9
+	.2byte	0x108
+	.4byte	0xa496
+	.byte	0
+	.uleb128 0x75
+	.4byte	.LASF3187
+	.byte	0xc7
+	.byte	0x1d
+	.4byte	0xb6df
+	.byte	0x3
+	.4byte	0x15a42
+	.uleb128 0x76
+	.string	"bus"
+	.byte	0xc7
+	.byte	0x1d
+	.4byte	0xacfd
+	.byte	0
+	.uleb128 0x75
+	.4byte	.LASF3188
+	.byte	0x9
+	.byte	0xd1
+	.4byte	0xc6
+	.byte	0x3
+	.4byte	0x15a5e
+	.uleb128 0x74
+	.4byte	.LASF3189
+	.byte	0x9
+	.byte	0xd1
+	.4byte	0xc6
+	.byte	0
+	.uleb128 0x73
+	.4byte	.LASF3190
+	.byte	0xca
+	.byte	0xa3
+	.byte	0x3
+	.4byte	0x15a97
+	.uleb128 0x76
+	.string	"dev"
+	.byte	0xca
+	.byte	0xa3
+	.4byte	0xa496
+	.uleb128 0x74
+	.4byte	.LASF3191
+	.byte	0xca
+	.byte	0xa4
+	.4byte	0x325
+	.uleb128 0x74
+	.4byte	.LASF957
+	.byte	0xca
+	.byte	0xa5
+	.4byte	0x2e3
+	.uleb128 0x74
+	.4byte	.LASF3192
+	.byte	0xca
+	.byte	0xa5
+	.4byte	0xc6
+	.byte	0
+	.uleb128 0x75
+	.4byte	.LASF3193
+	.byte	0x3
+	.byte	0x35
+	.4byte	0xc6
+	.byte	0x3
+	.4byte	0x15ab3
+	.uleb128 0x74
+	.4byte	.LASF2907
+	.byte	0x3
+	.byte	0x35
+	.4byte	0xda8c
+	.byte	0
+	.uleb128 0x75
+	.4byte	.LASF3194
+	.byte	0x3
+	.byte	0x30
+	.4byte	0xc6
+	.byte	0x3
+	.4byte	0x15ad8
+	.uleb128 0x74
+	.4byte	.LASF2907
+	.byte	0x3
+	.byte	0x30
+	.4byte	0xda8c
+	.uleb128 0x76
+	.string	"t"
+	.byte	0x3
+	.byte	0x30
+	.4byte	0x45a4
+	.byte	0
+	.uleb128 0x73
+	.4byte	.LASF3195
+	.byte	0x3
+	.byte	0x2b
+	.byte	0x3
+	.4byte	0x15af0
+	.uleb128 0x74
+	.4byte	.LASF2907
+	.byte	0x3
+	.byte	0x2b
+	.4byte	0xda8c
+	.byte	0
+	.uleb128 0x73
+	.4byte	.LASF3196
+	.byte	0x3
+	.byte	0x26
+	.byte	0x3
+	.4byte	0x15b08
+	.uleb128 0x74
+	.4byte	.LASF2907
+	.byte	0x3
+	.byte	0x26
+	.4byte	0xda8c
+	.byte	0
+	.uleb128 0x73
+	.4byte	.LASF3197
+	.byte	0x3
+	.byte	0x21
+	.byte	0x3
+	.4byte	0x15b20
+	.uleb128 0x74
+	.4byte	.LASF2907
+	.byte	0x3
+	.byte	0x21
+	.4byte	0xda8c
+	.byte	0
+	.uleb128 0x73
+	.4byte	.LASF3198
+	.byte	0x3
+	.byte	0x1c
+	.byte	0x3
+	.4byte	0x15b38
+	.uleb128 0x74
+	.4byte	.LASF2907
+	.byte	0x3
+	.byte	0x1c
+	.4byte	0xda8c
+	.byte	0
+	.uleb128 0x73
+	.4byte	.LASF3199
+	.byte	0xb
+	.byte	0x42
+	.byte	0x3
+	.4byte	0x15b50
+	.uleb128 0x74
+	.4byte	.LASF116
+	.byte	0xb
+	.byte	0x42
+	.4byte	0x15b50
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xd728
+	.uleb128 0x73
+	.4byte	.LASF2807
+	.byte	0xb
+	.byte	0x38
+	.byte	0x3
+	.4byte	0x15b6e
+	.uleb128 0x74
+	.4byte	.LASF116
+	.byte	0xb
+	.byte	0x38
+	.4byte	0x15b50
+	.byte	0
+	.uleb128 0x73
+	.4byte	.LASF3200
+	.byte	0xb
+	.byte	0x24
+	.byte	0x3
+	.4byte	0x15ba6
+	.uleb128 0x74
+	.4byte	.LASF116
+	.byte	0xb
+	.byte	0x24
+	.4byte	0x15b50
+	.uleb128 0x74
+	.4byte	.LASF193
+	.byte	0xb
+	.byte	0x24
+	.4byte	0xc6
+	.uleb128 0x74
+	.4byte	.LASF265
+	.byte	0xb
+	.byte	0x25
+	.4byte	0x56
+	.uleb128 0x77
+	.string	"ws"
+	.byte	0xb
+	.byte	0x27
+	.4byte	0xac33
+	.byte	0
+	.uleb128 0x75
+	.4byte	.LASF3201
+	.byte	0x8
+	.byte	0x98
+	.4byte	0x29
+	.byte	0x3
+	.4byte	0x15bd5
+	.uleb128 0x76
+	.string	"to"
+	.byte	0x8
+	.byte	0x98
+	.4byte	0x458
+	.uleb128 0x74
+	.4byte	.LASF1973
+	.byte	0x8
+	.byte	0x98
+	.4byte	0x30b6
+	.uleb128 0x76
+	.string	"n"
+	.byte	0x8
+	.byte	0x98
+	.4byte	0x29
+	.byte	0
+	.uleb128 0x75
+	.4byte	.LASF3202
+	.byte	0x8
+	.byte	0x90
+	.4byte	0x29
+	.byte	0x3
+	.4byte	0x15c04
+	.uleb128 0x76
+	.string	"to"
+	.byte	0x8
+	.byte	0x90
+	.4byte	0x458
+	.uleb128 0x74
+	.4byte	.LASF1973
+	.byte	0x8
+	.byte	0x90
+	.4byte	0x30b6
+	.uleb128 0x76
+	.string	"n"
+	.byte	0x8
+	.byte	0x90
+	.4byte	0x29
+	.byte	0
+	.uleb128 0x75
+	.4byte	.LASF3203
+	.byte	0x8
+	.byte	0x81
+	.4byte	0x29
+	.byte	0x3
+	.4byte	0x15c33
+	.uleb128 0x76
+	.string	"to"
+	.byte	0x8
+	.byte	0x81
+	.4byte	0x458
+	.uleb128 0x74
+	.4byte	.LASF1973
+	.byte	0x8
+	.byte	0x81
+	.4byte	0x30b6
+	.uleb128 0x76
+	.string	"n"
+	.byte	0x8
+	.byte	0x81
+	.4byte	0x29
+	.byte	0
+	.uleb128 0x75
+	.4byte	.LASF3204
+	.byte	0x8
+	.byte	0x6e
+	.4byte	0x29
+	.byte	0x3
+	.4byte	0x15c6d
+	.uleb128 0x76
+	.string	"to"
+	.byte	0x8
+	.byte	0x6e
+	.4byte	0x458
+	.uleb128 0x74
+	.4byte	.LASF1973
+	.byte	0x8
+	.byte	0x6e
+	.4byte	0x30b6
+	.uleb128 0x76
+	.string	"n"
+	.byte	0x8
+	.byte	0x6e
+	.4byte	0x29
+	.uleb128 0x77
+	.string	"res"
+	.byte	0x8
+	.byte	0x70
+	.4byte	0x29
+	.byte	0
+	.uleb128 0x75
+	.4byte	.LASF3205
+	.byte	0x5
+	.byte	0xf5
+	.4byte	0x458
+	.byte	0x3
+	.4byte	0x15ca1
+	.uleb128 0x76
+	.string	"ptr"
+	.byte	0x5
+	.byte	0xf5
+	.4byte	0x30b6
+	.uleb128 0x78
+	.4byte	.LASF3206
+	.byte	0x5
+	.byte	0xf7
+	.4byte	0x458
+	.uleb128 0x65
+	.uleb128 0x78
+	.4byte	.LASF3207
+	.byte	0x5
+	.byte	0xfe
+	.4byte	0x15a
+	.byte	0
+	.byte	0
+	.uleb128 0x75
+	.4byte	.LASF3208
+	.byte	0x5
+	.byte	0x4b
+	.4byte	0x29
+	.byte	0x3
+	.4byte	0x15ceb
+	.uleb128 0x74
+	.4byte	.LASF1118
+	.byte	0x5
+	.byte	0x4b
+	.4byte	0x30b6
+	.uleb128 0x74
+	.4byte	.LASF957
+	.byte	0x5
+	.byte	0x4b
+	.4byte	0x29
+	.uleb128 0x77
+	.string	"ret"
+	.byte	0x5
+	.byte	0x4d
+	.4byte	0x29
+	.uleb128 0x78
+	.4byte	.LASF3209
+	.byte	0x5
+	.byte	0x4d
+	.4byte	0x29
+	.uleb128 0x65
+	.uleb128 0x78
+	.4byte	.LASF3207
+	.byte	0x5
+	.byte	0x56
+	.4byte	0x15a
+	.byte	0
+	.byte	0
+	.uleb128 0x61
+	.4byte	.LASF3210
+	.byte	0x10
+	.2byte	0x2e5
+	.4byte	0x458
+	.byte	0x3
+	.4byte	0x15d15
+	.uleb128 0x63
+	.4byte	.LASF957
+	.byte	0x10
+	.2byte	0x2e5
+	.4byte	0x2e3
+	.uleb128 0x63
+	.4byte	.LASF171
+	.byte	0x10
+	.2byte	0x2e5
+	.4byte	0x330
+	.byte	0
+	.uleb128 0x61
+	.4byte	.LASF3211
+	.byte	0x10
+	.2byte	0x216
+	.4byte	0x458
+	.byte	0x3
+	.4byte	0x15d4d
+	.uleb128 0x63
+	.4byte	.LASF957
+	.byte	0x10
+	.2byte	0x216
+	.4byte	0x2e3
+	.uleb128 0x63
+	.4byte	.LASF171
+	.byte	0x10
+	.2byte	0x216
+	.4byte	0x330
+	.uleb128 0x65
+	.uleb128 0x43
+	.4byte	.LASF850
+	.byte	0x10
+	.2byte	0x21a
+	.4byte	0x6d
+	.byte	0
+	.byte	0
+	.uleb128 0x61
+	.4byte	.LASF3212
+	.byte	0x10
+	.2byte	0x1dd
+	.4byte	0x458
+	.byte	0x3
+	.4byte	0x15d83
+	.uleb128 0x63
+	.4byte	.LASF957
+	.byte	0x10
+	.2byte	0x1dd
+	.4byte	0x2e3
+	.uleb128 0x63
+	.4byte	.LASF171
+	.byte	0x10
+	.2byte	0x1dd
+	.4byte	0x330
+	.uleb128 0x43
+	.4byte	.LASF3213
+	.byte	0x10
+	.2byte	0x1df
+	.4byte	0x6d
+	.byte	0
+	.uleb128 0x61
+	.4byte	.LASF3214
+	.byte	0x10
+	.2byte	0x159
+	.4byte	0x6d
+	.byte	0x3
+	.4byte	0x15da1
+	.uleb128 0x63
+	.4byte	.LASF957
+	.byte	0x10
+	.2byte	0x159
+	.4byte	0x2e3
+	.byte	0
+	.uleb128 0x61
+	.4byte	.LASF3215
+	.byte	0x10
+	.2byte	0x13d
+	.4byte	0xd6c9
+	.byte	0x3
+	.4byte	0x15dbf
+	.uleb128 0x63
+	.4byte	.LASF171
+	.byte	0x10
+	.2byte	0x13d
+	.4byte	0x330
+	.byte	0
+	.uleb128 0x73
+	.4byte	.LASF3216
+	.byte	0xbd
+	.byte	0xde
+	.byte	0x3
+	.4byte	0x15de2
+	.uleb128 0x74
+	.4byte	.LASF3026
+	.byte	0xbd
+	.byte	0xde
+	.4byte	0xd640
+	.uleb128 0x74
+	.4byte	.LASF793
+	.byte	0xbd
+	.byte	0xdf
+	.4byte	0x458
+	.byte	0
+	.uleb128 0x75
+	.4byte	.LASF3217
+	.byte	0xbd
+	.byte	0xd9
+	.4byte	0x458
+	.byte	0x3
+	.4byte	0x15dfe
+	.uleb128 0x74
+	.4byte	.LASF3026
+	.byte	0xbd
+	.byte	0xd9
+	.4byte	0x15dfe
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xd598
+	.uleb128 0x61
+	.4byte	.LASF3218
+	.byte	0xa1
+	.2byte	0x164
+	.4byte	0x458
+	.byte	0x3
+	.4byte	0x15e22
+	.uleb128 0x62
+	.string	"dev"
+	.byte	0xa1
+	.2byte	0x164
+	.4byte	0x15e22
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xbfe9
+	.uleb128 0x61
+	.4byte	.LASF3219
+	.byte	0xd
+	.2byte	0x498
+	.4byte	0xc6
+	.byte	0x3
+	.4byte	0x15e5d
+	.uleb128 0x62
+	.string	"np"
+	.byte	0xd
+	.2byte	0x498
+	.4byte	0xbbe0
+	.uleb128 0x63
+	.4byte	.LASF3220
+	.byte	0xd
+	.2byte	0x499
+	.4byte	0x56
+	.uleb128 0x63
+	.4byte	.LASF3221
+	.byte	0xd
+	.2byte	0x49a
+	.4byte	0xac0
+	.byte	0
+	.uleb128 0x61
+	.4byte	.LASF3222
+	.byte	0xd
+	.2byte	0x1ef
+	.4byte	0xc6
+	.byte	0x3
+	.4byte	0x15ea9
+	.uleb128 0x62
+	.string	"np"
+	.byte	0xd
+	.2byte	0x1ef
+	.4byte	0xbbe0
+	.uleb128 0x63
+	.4byte	.LASF3220
+	.byte	0xd
+	.2byte	0x1f0
+	.4byte	0x56
+	.uleb128 0x63
+	.4byte	.LASF3223
+	.byte	0xd
+	.2byte	0x1f1
+	.4byte	0xac0
+	.uleb128 0x62
+	.string	"sz"
+	.byte	0xd
+	.2byte	0x1f1
+	.4byte	0x2e3
+	.uleb128 0x4f
+	.string	"ret"
+	.byte	0xd
+	.2byte	0x1f3
+	.4byte	0xc6
+	.byte	0
+	.uleb128 0x73
+	.4byte	.LASF3224
+	.byte	0xd
+	.byte	0x83
+	.byte	0x3
+	.4byte	0x15ec1
+	.uleb128 0x74
+	.4byte	.LASF838
+	.byte	0xd
+	.byte	0x83
+	.4byte	0xb7ba
+	.byte	0
+	.uleb128 0x64
+	.4byte	.LASF3225
+	.byte	0x2
+	.2byte	0x4a0
+	.byte	0x3
+	.4byte	0x15ee7
+	.uleb128 0x62
+	.string	"dev"
+	.byte	0x2
+	.2byte	0x4a0
+	.4byte	0xa496
+	.uleb128 0x63
+	.4byte	.LASF793
+	.byte	0x2
+	.2byte	0x4a0
+	.4byte	0x458
+	.byte	0
+	.uleb128 0x61
+	.4byte	.LASF3226
+	.byte	0x2
+	.2byte	0x49b
+	.4byte	0x458
+	.byte	0x3
+	.4byte	0x15f05
+	.uleb128 0x62
+	.string	"dev"
+	.byte	0x2
+	.2byte	0x49b
+	.4byte	0xba50
+	.byte	0
+	.uleb128 0x61
+	.4byte	.LASF3227
+	.byte	0x2
+	.2byte	0x2c5
+	.4byte	0x458
+	.byte	0x3
+	.4byte	0x15f3b
+	.uleb128 0x62
+	.string	"dev"
+	.byte	0x2
+	.2byte	0x2c5
+	.4byte	0xa496
+	.uleb128 0x63
+	.4byte	.LASF957
+	.byte	0x2
+	.2byte	0x2c5
+	.4byte	0x2e3
+	.uleb128 0x62
+	.string	"gfp"
+	.byte	0x2
+	.2byte	0x2c5
+	.4byte	0x330
+	.byte	0
+	.uleb128 0x75
+	.4byte	.LASF3228
+	.byte	0xe
+	.byte	0xca
+	.4byte	0x351
+	.byte	0x3
+	.4byte	0x15f57
+	.uleb128 0x76
+	.string	"res"
+	.byte	0xe
+	.byte	0xca
+	.4byte	0xc0fa
+	.byte	0
+	.uleb128 0x75
+	.4byte	.LASF3229
+	.byte	0xcb
+	.byte	0x22
+	.4byte	0x2b0
+	.byte	0x3
+	.4byte	0x15f73
+	.uleb128 0x76
+	.string	"ptr"
+	.byte	0xcb
+	.byte	0x22
+	.4byte	0x30b6
+	.byte	0
+	.uleb128 0x75
+	.4byte	.LASF3230
+	.byte	0xcc
+	.byte	0x1d
+	.4byte	0xc6
+	.byte	0x3
+	.4byte	0x15f8f
+	.uleb128 0x74
+	.4byte	.LASF957
+	.byte	0xcc
+	.byte	0x1d
+	.4byte	0x29
+	.byte	0
+	.uleb128 0x61
+	.4byte	.LASF3231
+	.byte	0x11
+	.2byte	0x169
+	.4byte	0x29
+	.byte	0x3
+	.4byte	0x15fab
+	.uleb128 0x62
+	.string	"m"
+	.byte	0x11
+	.2byte	0x169
+	.4byte	0x74
+	.byte	0
+	.uleb128 0x61
+	.4byte	.LASF3232
+	.byte	0x11
+	.2byte	0x148
+	.4byte	0x29
+	.byte	0x3
+	.4byte	0x15fc7
+	.uleb128 0x62
+	.string	"m"
+	.byte	0x11
+	.2byte	0x148
+	.4byte	0x74
+	.byte	0
+	.uleb128 0x75
+	.4byte	.LASF3233
+	.byte	0xc9
+	.byte	0x97
+	.4byte	0x2b0
+	.byte	0x3
+	.4byte	0x16003
+	.uleb128 0x74
+	.4byte	.LASF1118
+	.byte	0xc9
+	.byte	0x97
+	.4byte	0x30b6
+	.uleb128 0x74
+	.4byte	.LASF3234
+	.byte	0xc9
+	.byte	0x97
+	.4byte	0x2e3
+	.uleb128 0x74
+	.4byte	.LASF3235
+	.byte	0xc9
+	.byte	0x97
+	.4byte	0x2b0
+	.uleb128 0x77
+	.string	"sz"
+	.byte	0xc9
+	.byte	0x99
+	.4byte	0xc6
+	.byte	0
+	.uleb128 0x73
+	.4byte	.LASF3236
+	.byte	0xc9
+	.byte	0x91
+	.byte	0x3
+	.4byte	0x16033
+	.uleb128 0x74
+	.4byte	.LASF957
+	.byte	0xc9
+	.byte	0x91
+	.4byte	0xc6
+	.uleb128 0x74
+	.4byte	.LASF383
+	.byte	0xc9
+	.byte	0x91
+	.4byte	0x29
+	.uleb128 0x65
+	.uleb128 0x78
+	.4byte	.LASF3237
+	.byte	0xc9
+	.byte	0x93
+	.4byte	0xc6
+	.byte	0
+	.byte	0
+	.uleb128 0x73
+	.4byte	.LASF3238
+	.byte	0xc9
+	.byte	0x80
+	.byte	0x3
+	.4byte	0x1605f
+	.uleb128 0x76
+	.string	"ptr"
+	.byte	0xc9
+	.byte	0x80
+	.4byte	0x30b6
+	.uleb128 0x76
+	.string	"n"
+	.byte	0xc9
+	.byte	0x80
+	.4byte	0x29
+	.uleb128 0x74
+	.4byte	.LASF3239
+	.byte	0xc9
+	.byte	0x81
+	.4byte	0x2b0
+	.byte	0
+	.uleb128 0x75
+	.4byte	.LASF3240
+	.byte	0xc9
+	.byte	0x5f
+	.4byte	0xc6
+	.byte	0x3
+	.4byte	0x16085
+	.uleb128 0x76
+	.string	"ti"
+	.byte	0xc9
+	.byte	0x5f
+	.4byte	0x16085
+	.uleb128 0x74
+	.4byte	.LASF3241
+	.byte	0xc9
+	.byte	0x5f
+	.4byte	0xc6
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xc33
+	.uleb128 0x75
+	.4byte	.LASF3242
+	.byte	0x4
+	.byte	0xf
+	.4byte	0x2eff
+	.byte	0x3
+	.4byte	0x160a7
+	.uleb128 0x78
+	.4byte	.LASF3243
+	.byte	0x4
+	.byte	0x11
+	.4byte	0x29
+	.byte	0
+	.uleb128 0x79
+	.4byte	.LASF3326
+	.byte	0x1f
+	.2byte	0x126
+	.byte	0x3
+	.uleb128 0x75
+	.4byte	.LASF3244
+	.byte	0xcd
+	.byte	0x22
+	.4byte	0xc6
+	.byte	0x3
+	.4byte	0x160ca
+	.uleb128 0x76
+	.string	"n"
+	.byte	0xcd
+	.byte	0x22
+	.4byte	0x15a
+	.byte	0
+	.uleb128 0x75
+	.4byte	.LASF3245
+	.byte	0x7
+	.byte	0x9a
+	.4byte	0xe2
+	.byte	0x3
+	.4byte	0x160fc
+	.uleb128 0x74
+	.4byte	.LASF2424
+	.byte	0x7
+	.byte	0x9a
+	.4byte	0xf4
+	.uleb128 0x74
+	.4byte	.LASF850
+	.byte	0x7
+	.byte	0x9a
+	.4byte	0xc6
+	.uleb128 0x78
+	.4byte	.LASF261
+	.byte	0x7
+	.byte	0x9c
+	.4byte	0x8b
+	.byte	0
+	.uleb128 0x75
+	.4byte	.LASF3246
+	.byte	0xce
+	.byte	0x50
+	.4byte	0xd2
+	.byte	0x3
+	.4byte	0x16116
+	.uleb128 0x76
+	.string	"p"
+	.byte	0xce
+	.byte	0x50
+	.4byte	0xbbe6
+	.byte	0
+	.uleb128 0x75
+	.4byte	.LASF3247
+	.byte	0xcf
+	.byte	0xb8
+	.4byte	0xd2
+	.byte	0x3
+	.4byte	0x16130
+	.uleb128 0x76
+	.string	"p"
+	.byte	0xcf
+	.byte	0xb8
+	.4byte	0x16130
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0xdd
+	.uleb128 0x75
+	.4byte	.LASF3248
+	.byte	0xcf
+	.byte	0x39
+	.4byte	0xd2
+	.byte	0x3
+	.4byte	0x16152
+	.uleb128 0x76
+	.string	"val"
+	.byte	0xcf
+	.byte	0x39
+	.4byte	0xd2
+	.byte	0
+	.uleb128 0x75
+	.4byte	.LASF3249
+	.byte	0x6
+	.byte	0x68
+	.4byte	0xc6
+	.byte	0x3
+	.4byte	0x16178
+	.uleb128 0x76
+	.string	"nr"
+	.byte	0x6
+	.byte	0x68
+	.4byte	0xc6
+	.uleb128 0x74
+	.4byte	.LASF1118
+	.byte	0x6
+	.byte	0x68
+	.4byte	0x16178
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x3a
+	.uleb128 0x73
+	.4byte	.LASF3250
+	.byte	0xf
+	.byte	0x2f
+	.byte	0x3
+	.4byte	0x161b1
+	.uleb128 0x76
+	.string	"i"
+	.byte	0xf
+	.byte	0x2f
+	.4byte	0xc6
+	.uleb128 0x76
+	.string	"v"
+	.byte	0xf
+	.byte	0x2f
+	.4byte	0x161b1
+	.uleb128 0x77
+	.string	"w0"
+	.byte	0xf
+	.byte	0x2f
+	.4byte	0xc6
+	.uleb128 0x77
+	.string	"x1"
+	.byte	0xf
+	.byte	0x2f
+	.4byte	0x161b1
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x37c
+	.uleb128 0x75
+	.4byte	.LASF3251
+	.byte	0xd0
+	.byte	0x1b
+	.4byte	0xc6
+	.byte	0x3
+	.4byte	0x161d1
+	.uleb128 0x76
+	.string	"x"
+	.byte	0xd0
+	.byte	0x1b
+	.4byte	0xf4
+	.byte	0
+	.uleb128 0x75
+	.4byte	.LASF3252
+	.byte	0xd1
+	.byte	0xb
+	.4byte	0x29
+	.byte	0x3
+	.4byte	0x161ed
+	.uleb128 0x74
+	.4byte	.LASF2457
+	.byte	0xd1
+	.byte	0xb
+	.4byte	0x29
+	.byte	0
+	.uleb128 0x73
+	.4byte	.LASF3253
+	.byte	0xd2
+	.byte	0xb
+	.byte	0x3
+	.4byte	0x1620e
+	.uleb128 0x76
+	.string	"p"
+	.byte	0xd2
+	.byte	0xb
+	.4byte	0x1620e
+	.uleb128 0x74
+	.4byte	.LASF957
+	.byte	0xd2
+	.byte	0xb
+	.4byte	0x6d
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x16215
+	.uleb128 0x7a
+	.uleb128 0x3
+	.4byte	0x16214
+	.uleb128 0x73
+	.4byte	.LASF3254
+	.byte	0xd2
+	.byte	0x9
+	.byte	0x3
+	.4byte	0x1623b
+	.uleb128 0x76
+	.string	"p"
+	.byte	0xd2
+	.byte	0x9
+	.4byte	0x1620e
+	.uleb128 0x74
+	.4byte	.LASF957
+	.byte	0xd2
+	.byte	0x9
+	.4byte	0x6d
+	.byte	0
+	.uleb128 0x64
+	.4byte	.LASF3255
+	.byte	0xc
+	.2byte	0x11c
+	.byte	0x3
+	.4byte	0x1626b
+	.uleb128 0x62
+	.string	"p"
+	.byte	0xc
+	.2byte	0x11c
+	.4byte	0x1626b
+	.uleb128 0x62
+	.string	"res"
+	.byte	0xc
+	.2byte	0x11c
+	.4byte	0x458
+	.uleb128 0x63
+	.4byte	.LASF957
+	.byte	0xc
+	.2byte	0x11c
+	.4byte	0xc6
+	.byte	0
+	.uleb128 0x7
+	.byte	0x8
+	.4byte	0x16214
+	.uleb128 0x7b
+	.4byte	0x105ba
+	.8byte	.LFB2853
+	.8byte	.LFE2853-.LFB2853
+	.uleb128 0x1
+	.byte	0x9c
+	.4byte	0x1629d
+	.uleb128 0x60
+	.4byte	0x105cb
+	.4byte	.LLST21
+	.uleb128 0x7c
+	.4byte	0x105d7
+	.uleb128 0x1
+	.byte	0x51
+	.byte	0
+	.uleb128 0x7b
+	.4byte	0x14414
+	.8byte	.LFB2876
+	.8byte	.LFE2876-.LFB2876
+	.uleb128 0x1
+	.byte	0x9c
+	.4byte	0x163ca
+	.uleb128 0x60
+	.4byte	0x14421
+	.4byte	.LLST223
+	.uleb128 0x7c
+	.4byte	0x1442d
+	.uleb128 0x1
+	.byte	0x51
+	.uleb128 0x7c
+	.4byte	0x14439
+	.uleb128 0x1
+	.byte	0x52
+	.uleb128 0x7c
+	.4byte	0x14445
+	.uleb128 0x1
+	.byte	0x53
+	.uleb128 0x7c
+	.4byte	0x1445d
+	.uleb128 0x1
+	.byte	0x54
+	.uleb128 0x51
+	.4byte	0x14451
+	.uleb128 0x54
+	.4byte	0x14469
+	.uleb128 0x5e
+	.4byte	0x14475
+	.uleb128 0x1
+	.byte	0x65
+	.uleb128 0x5d
+	.4byte	0x1447f
+	.4byte	.LLST224
+	.uleb128 0x5d
+	.4byte	0x14489
+	.4byte	.LLST225
+	.uleb128 0x5d
+	.4byte	0x14495
+	.4byte	.LLST226
+	.uleb128 0x5d
+	.4byte	0x144a1
+	.4byte	.LLST227
+	.uleb128 0x5d
+	.4byte	0x144ad
+	.4byte	.LLST228
+	.uleb128 0x54
+	.4byte	0x144b9
+	.uleb128 0x54
+	.4byte	0x144c5
+	.uleb128 0x5d
+	.4byte	0x144d1
+	.4byte	.LLST229
+	.uleb128 0x54
+	.4byte	0x144dd
+	.uleb128 0x5d
+	.4byte	0x144e9
+	.4byte	.LLST230
+	.uleb128 0x54
+	.4byte	0x144f5
+	.uleb128 0x54
+	.4byte	0x14501
+	.uleb128 0x5d
+	.4byte	0x1450d
+	.4byte	.LLST231
+	.uleb128 0x5d
+	.4byte	0x14519
+	.4byte	.LLST232
+	.uleb128 0x5d
+	.4byte	0x14525
+	.4byte	.LLST233
+	.uleb128 0x5d
+	.4byte	0x14531
+	.4byte	.LLST234
+	.uleb128 0x5c
+	.4byte	0x1453e
+	.8byte	.LBB1596
+	.4byte	.Ldebug_ranges0+0xf10
+	.byte	0x1
+	.2byte	0x413
+	.uleb128 0x51
+	.4byte	0x1458b
+	.uleb128 0x51
+	.4byte	0x1457f
+	.uleb128 0x51
+	.4byte	0x14573
+	.uleb128 0x51
+	.4byte	0x14567
+	.uleb128 0x51
+	.4byte	0x1455b
+	.uleb128 0x51
+	.4byte	0x1454f
+	.uleb128 0x5b
+	.4byte	.Ldebug_ranges0+0xf10
+	.uleb128 0x54
+	.4byte	0x14597
+	.uleb128 0x54
+	.4byte	0x145a3
+	.uleb128 0x54
+	.4byte	0x145af
+	.uleb128 0x5d
+	.4byte	0x145bb
+	.4byte	.LLST235
+	.uleb128 0x5d
+	.4byte	0x145c7
+	.4byte	.LLST236
+	.uleb128 0x54
+	.4byte	0x145d3
+	.byte	0
+	.byte	0
+	.byte	0
+	.uleb128 0x7b
+	.4byte	0x14207
+	.8byte	.LFB2877
+	.8byte	.LFE2877-.LFB2877
+	.uleb128 0x1
+	.byte	0x9c
+	.4byte	0x1643e
+	.uleb128 0x7c
+	.4byte	0x14224
+	.uleb128 0x1
+	.byte	0x51
+	.uleb128 0x7c
+	.4byte	0x14230
+	.uleb128 0x1
+	.byte	0x52
+	.uleb128 0x60
+	.4byte	0x14248
+	.4byte	.LLST237
+	.uleb128 0x51
+	.4byte	0x1423c
+	.uleb128 0x51
+	.4byte	0x1423c
+	.uleb128 0x51
+	.4byte	0x14218
+	.uleb128 0x54
+	.4byte	0x14254
+	.uleb128 0x54
+	.4byte	0x14260
+	.uleb128 0x54
+	.4byte	0x1426c
+	.uleb128 0x54
+	.4byte	0x14278
+	.uleb128 0x5e
+	.4byte	0x14284
+	.uleb128 0x1
+	.byte	0x57
+	.uleb128 0x5d
+	.4byte	0x14290
+	.4byte	.LLST238
+	.uleb128 0x54
+	.4byte	0x1429c
+	.uleb128 0x5d
+	.4byte	0x142a8
+	.4byte	.LLST239
+	.byte	0
+	.uleb128 0x7b
+	.4byte	0x1401b
+	.8byte	.LFB2878
+	.8byte	.LFE2878-.LFB2878
+	.uleb128 0x1
+	.byte	0x9c
+	.4byte	0x164fd
+	.uleb128 0x60
+	.4byte	0x14028
+	.4byte	.LLST251
+	.uleb128 0x7c
+	.4byte	0x14034
+	.uleb128 0x1
+	.byte	0x51
+	.uleb128 0x7c
+	.4byte	0x14040
+	.uleb128 0x1
+	.byte	0x52
+	.uleb128 0x60
+	.4byte	0x14058
+	.4byte	.LLST252
+	.uleb128 0x51
+	.4byte	0x1404c
+	.uleb128 0x51
+	.4byte	0x1404c
+	.uleb128 0x51
+	.4byte	0x1404c
+	.uleb128 0x54
+	.4byte	0x14064
+	.uleb128 0x5d
+	.4byte	0x14070
+	.4byte	.LLST253
+	.uleb128 0x54
+	.4byte	0x1407a
+	.uleb128 0x5d
+	.4byte	0x14084
+	.4byte	.LLST254
+	.uleb128 0x54
+	.4byte	0x14090
+	.uleb128 0x5d
+	.4byte	0x1409c
+	.4byte	.LLST255
+	.uleb128 0x5d
+	.4byte	0x140a8
+	.4byte	.LLST256
+	.uleb128 0x5d
+	.4byte	0x140b4
+	.4byte	.LLST257
+	.uleb128 0x5e
+	.4byte	0x140c0
+	.uleb128 0x1
+	.byte	0x55
+	.uleb128 0x5d
+	.4byte	0x140cc
+	.4byte	.LLST258
+	.uleb128 0x5a
+	.4byte	0x158b4
+	.8byte	.LBB1604
+	.8byte	.LBE1604-.LBB1604
+	.byte	0x1
+	.2byte	0x59a
+	.uleb128 0x51
+	.4byte	0x158dd
+	.uleb128 0x51
+	.4byte	0x158d1
+	.uleb128 0x51
+	.4byte	0x158c5
+	.byte	0
+	.byte	0
+	.uleb128 0x7b
+	.4byte	0x13e93
+	.8byte	.LFB2879
+	.8byte	.LFE2879-.LFB2879
+	.uleb128 0x1
+	.byte	0x9c
+	.4byte	0x165e7
+	.uleb128 0x7c
+	.4byte	0x13ea0
+	.uleb128 0x1
+	.byte	0x50
+	.uleb128 0x7c
+	.4byte	0x13eac
+	.uleb128 0x1
+	.byte	0x51
+	.uleb128 0x7c
+	.4byte	0x13eb8
+	.uleb128 0x1
+	.byte	0x52
+	.uleb128 0x60
+	.4byte	0x13ed0
+	.4byte	.LLST259
+	.uleb128 0x51
+	.4byte	0x13ec4
+	.uleb128 0x51
+	.4byte	0x13ec4
+	.uleb128 0x51
+	.4byte	0x13ec4
+	.uleb128 0x54
+	.4byte	0x13edc
+	.uleb128 0x5d
+	.4byte	0x13ee8
+	.4byte	.LLST260
+	.uleb128 0x54
+	.4byte	0x13ef2
+	.uleb128 0x5d
+	.4byte	0x13efc
+	.4byte	.LLST261
+	.uleb128 0x54
+	.4byte	0x13f08
+	.uleb128 0x54
+	.4byte	0x13f14
+	.uleb128 0x54
+	.4byte	0x13f20
+	.uleb128 0x5d
+	.4byte	0x13f2c
+	.4byte	.LLST262
+	.uleb128 0x5e
+	.4byte	0x13f38
+	.uleb128 0x1
+	.byte	0x55
+	.uleb128 0x5d
+	.4byte	0x13f44
+	.4byte	.LLST263
+	.uleb128 0x5d
+	.4byte	0x13f50
+	.4byte	.LLST264
+	.uleb128 0x50
+	.4byte	0x1587e
+	.8byte	.LBB1606
+	.8byte	.LBE1606-.LBB1606
+	.byte	0x1
+	.2byte	0x5ec
+	.4byte	0x165be
+	.uleb128 0x51
+	.4byte	0x158a7
+	.uleb128 0x51
+	.4byte	0x1589b
+	.uleb128 0x51
+	.4byte	0x1588f
+	.byte	0
+	.uleb128 0x5a
+	.4byte	0x15848
+	.8byte	.LBB1608
+	.8byte	.LBE1608-.LBB1608
+	.byte	0x1
+	.2byte	0x5f1
+	.uleb128 0x51
+	.4byte	0x15871
+	.uleb128 0x51
+	.4byte	0x15865
+	.uleb128 0x51
+	.4byte	0x15859
+	.byte	0
+	.byte	0
+	.uleb128 0x7d
+	.4byte	0x13d91
+	.8byte	.LFB2880
+	.8byte	.LFE2880-.LFB2880
+	.uleb128 0x1
+	.byte	0x9c
+	.4byte	0x166e9
+	.uleb128 0x60
+	.4byte	0x13d9e
+	.4byte	.LLST265
+	.uleb128 0x51
+	.4byte	0x13daa
+	.uleb128 0x54
+	.4byte	0x13db6
+	.uleb128 0x58
+	.4byte	0x159be
+	.8byte	.LBB1610
+	.4byte	.Ldebug_ranges0+0xf60
+	.byte	0x1
+	.2byte	0x629
+	.4byte	0x16667
+	.uleb128 0x51
+	.4byte	0x159ef
+	.uleb128 0x51
+	.4byte	0x159e3
+	.uleb128 0x51
+	.4byte	0x159d7
+	.uleb128 0x51
+	.4byte	0x159cb
+	.uleb128 0x5b
+	.4byte	.Ldebug_ranges0+0xf60
+	.uleb128 0x54
+	.4byte	0x159fb
+	.uleb128 0x5c
+	.4byte	0x15a08
+	.8byte	.LBB1612
+	.4byte	.Ldebug_ranges0+0xfb0
+	.byte	0x9
+	.2byte	0x1af
+	.uleb128 0x51
+	.4byte	0x15a19
+	.byte	0
+	.byte	0
+	.byte	0
+	.uleb128 0x58
+	.4byte	0x1593b
+	.8byte	.LBB1621
+	.4byte	.Ldebug_ranges0+0xfe0
+	.byte	0x1
+	.2byte	0x62a
+	.4byte	0x16699
+	.uleb128 0x51
+	.4byte	0x15973
+	.uleb128 0x51
+	.4byte	0x15968
+	.uleb128 0x51
+	.4byte	0x1595d
+	.uleb128 0x51
+	.4byte	0x15952
+	.uleb128 0x51
+	.4byte	0x15947
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x1590d
+	.8byte	.LBB1627
+	.8byte	.LBE1627-.LBB1627
+	.byte	0x1
+	.2byte	0x62b
+	.4byte	0x166c5
+	.uleb128 0x51
+	.4byte	0x1592f
+	.uleb128 0x51
+	.4byte	0x15924
+	.uleb128 0x51
+	.4byte	0x15919
+	.byte	0
+	.uleb128 0x5a
+	.4byte	0x158ea
+	.8byte	.LBB1629
+	.8byte	.LBE1629-.LBB1629
+	.byte	0x1
+	.2byte	0x62c
+	.uleb128 0x51
+	.4byte	0x15901
+	.uleb128 0x51
+	.4byte	0x158f6
+	.byte	0
+	.byte	0
+	.uleb128 0x7d
+	.4byte	0x15728
+	.8byte	.LFB2883
+	.8byte	.LFE2883-.LFB2883
+	.uleb128 0x1
+	.byte	0x9c
+	.4byte	0x167a9
+	.uleb128 0x60
+	.4byte	0x15739
+	.4byte	.LLST266
+	.uleb128 0x60
+	.4byte	0x15745
+	.4byte	.LLST267
+	.uleb128 0x54
+	.4byte	0x15751
+	.uleb128 0x50
+	.4byte	0x1597f
+	.8byte	.LBB1632
+	.8byte	.LBE1632-.LBB1632
+	.byte	0x1
+	.2byte	0x198
+	.4byte	0x1673d
+	.uleb128 0x51
+	.4byte	0x1598b
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x15b08
+	.8byte	.LBB1634
+	.8byte	.LBE1634-.LBB1634
+	.byte	0x1
+	.2byte	0x199
+	.4byte	0x1675f
+	.uleb128 0x51
+	.4byte	0x15b14
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x15b38
+	.8byte	.LBB1636
+	.8byte	.LBE1636-.LBB1636
+	.byte	0x1
+	.2byte	0x19c
+	.4byte	0x1678e
+	.uleb128 0x51
+	.4byte	0x15b44
+	.uleb128 0x4b
+	.8byte	.LVL880
+	.4byte	0x16f2d
+	.byte	0
+	.uleb128 0x4b
+	.8byte	.LVL877
+	.4byte	0x16c5b
+	.uleb128 0x4b
+	.8byte	.LVL881
+	.4byte	0x16c5b
+	.byte	0
+	.uleb128 0x7b
+	.4byte	0x13dc9
+	.8byte	.LFB2884
+	.8byte	.LFE2884-.LFB2884
+	.uleb128 0x1
+	.byte	0x9c
+	.4byte	0x16910
+	.uleb128 0x60
+	.4byte	0x13dd6
+	.4byte	.LLST269
+	.uleb128 0x60
+	.4byte	0x13de2
+	.4byte	.LLST270
+	.uleb128 0x60
+	.4byte	0x13dee
+	.4byte	.LLST271
+	.uleb128 0x60
+	.4byte	0x13e06
+	.4byte	.LLST272
+	.uleb128 0x51
+	.4byte	0x13dfa
+	.uleb128 0x51
+	.4byte	0x13dfa
+	.uleb128 0x51
+	.4byte	0x13dfa
+	.uleb128 0x54
+	.4byte	0x13e12
+	.uleb128 0x54
+	.4byte	0x13e1e
+	.uleb128 0x54
+	.4byte	0x13e2a
+	.uleb128 0x5d
+	.4byte	0x13e36
+	.4byte	.LLST273
+	.uleb128 0x54
+	.4byte	0x13e42
+	.uleb128 0x5d
+	.4byte	0x13e4e
+	.4byte	.LLST274
+	.uleb128 0x54
+	.4byte	0x13e58
+	.uleb128 0x5d
+	.4byte	0x13e62
+	.4byte	.LLST275
+	.uleb128 0x5d
+	.4byte	0x13e6e
+	.4byte	.LLST276
+	.uleb128 0x54
+	.4byte	0x13e7a
+	.uleb128 0x5d
+	.4byte	0x13e86
+	.4byte	.LLST277
+	.uleb128 0x58
+	.4byte	0x157ac
+	.8byte	.LBB1644
+	.4byte	.Ldebug_ranges0+0x1020
+	.byte	0x1
+	.2byte	0x618
+	.4byte	0x168a2
+	.uleb128 0x51
+	.4byte	0x157d5
+	.uleb128 0x51
+	.4byte	0x157c9
+	.uleb128 0x51
+	.4byte	0x157bd
+	.uleb128 0x5b
+	.4byte	.Ldebug_ranges0+0x1020
+	.uleb128 0x54
+	.4byte	0x157e1
+	.uleb128 0x5d
+	.4byte	0x157ed
+	.4byte	.LLST278
+	.uleb128 0x5c
+	.4byte	0x1587e
+	.8byte	.LBB1646
+	.4byte	.Ldebug_ranges0+0x1070
+	.byte	0x1
+	.2byte	0x163
+	.uleb128 0x51
+	.4byte	0x158a7
+	.uleb128 0x51
+	.4byte	0x1589b
+	.uleb128 0x51
+	.4byte	0x1588f
+	.byte	0
+	.byte	0
+	.byte	0
+	.uleb128 0x58
+	.4byte	0x1575e
+	.8byte	.LBB1681
+	.4byte	.Ldebug_ranges0+0x1180
+	.byte	0x1
+	.2byte	0x61f
+	.4byte	0x16902
+	.uleb128 0x51
+	.4byte	0x15787
+	.uleb128 0x51
+	.4byte	0x1577b
+	.uleb128 0x51
+	.4byte	0x1576f
+	.uleb128 0x5b
+	.4byte	.Ldebug_ranges0+0x1180
+	.uleb128 0x54
+	.4byte	0x15793
+	.uleb128 0x5d
+	.4byte	0x1579f
+	.4byte	.LLST279
+	.uleb128 0x5c
+	.4byte	0x15848
+	.8byte	.LBB1683
+	.4byte	.Ldebug_ranges0+0x11e0
+	.byte	0x1
+	.2byte	0x181
+	.uleb128 0x51
+	.4byte	0x15871
+	.uleb128 0x51
+	.4byte	0x15865
+	.uleb128 0x51
+	.4byte	0x15859
+	.byte	0
+	.byte	0
+	.byte	0
+	.uleb128 0x4b
+	.8byte	.LVL894
+	.4byte	0x16cb7
+	.byte	0
+	.uleb128 0x7b
+	.4byte	0x13f5d
+	.8byte	.LFB2885
+	.8byte	.LFE2885-.LFB2885
+	.uleb128 0x1
+	.byte	0x9c
+	.4byte	0x16a27
+	.uleb128 0x60
+	.4byte	0x13f6a
+	.4byte	.LLST280
+	.uleb128 0x60
+	.4byte	0x13f76
+	.4byte	.LLST281
+	.uleb128 0x60
+	.4byte	0x13f82
+	.4byte	.LLST282
+	.uleb128 0x60
+	.4byte	0x13f9a
+	.4byte	.LLST283
+	.uleb128 0x51
+	.4byte	0x13f8e
+	.uleb128 0x51
+	.4byte	0x13f8e
+	.uleb128 0x51
+	.4byte	0x13f8e
+	.uleb128 0x54
+	.4byte	0x13fa6
+	.uleb128 0x5d
+	.4byte	0x13fb2
+	.4byte	.LLST284
+	.uleb128 0x5d
+	.4byte	0x13fbe
+	.4byte	.LLST285
+	.uleb128 0x5d
+	.4byte	0x13fca
+	.4byte	.LLST286
+	.uleb128 0x54
+	.4byte	0x13fd6
+	.uleb128 0x5d
+	.4byte	0x13fe2
+	.4byte	.LLST287
+	.uleb128 0x54
+	.4byte	0x13fec
+	.uleb128 0x5d
+	.4byte	0x13ff6
+	.4byte	.LLST288
+	.uleb128 0x5d
+	.4byte	0x14002
+	.4byte	.LLST289
+	.uleb128 0x5d
+	.4byte	0x1400e
+	.4byte	.LLST290
+	.uleb128 0x58
+	.4byte	0x157fa
+	.8byte	.LBB1730
+	.4byte	.Ldebug_ranges0+0x1310
+	.byte	0x1
+	.2byte	0x5c6
+	.4byte	0x16a0c
+	.uleb128 0x51
+	.4byte	0x15823
+	.uleb128 0x51
+	.4byte	0x15817
+	.uleb128 0x51
+	.4byte	0x1580b
+	.uleb128 0x5b
+	.4byte	.Ldebug_ranges0+0x1310
+	.uleb128 0x54
+	.4byte	0x1582f
+	.uleb128 0x5d
+	.4byte	0x1583b
+	.4byte	.LLST291
+	.uleb128 0x5c
+	.4byte	0x158b4
+	.8byte	.LBB1732
+	.4byte	.Ldebug_ranges0+0x1360
+	.byte	0x1
+	.2byte	0x145
+	.uleb128 0x51
+	.4byte	0x158dd
+	.uleb128 0x51
+	.4byte	0x158d1
+	.uleb128 0x51
+	.4byte	0x158c5
+	.byte	0
+	.byte	0
+	.byte	0
+	.uleb128 0x4b
+	.8byte	.LVL924
+	.4byte	0x16cb7
+	.uleb128 0x4b
+	.8byte	.LVL936
+	.4byte	0x16cb7
+	.byte	0
+	.uleb128 0x7b
+	.4byte	0x134d4
+	.8byte	.LFB2887
+	.8byte	.LFE2887-.LFB2887
+	.uleb128 0x1
+	.byte	0x9c
+	.4byte	0x16a80
+	.uleb128 0x51
+	.4byte	0x134f1
+	.uleb128 0x51
+	.4byte	0x134e5
+	.uleb128 0x54
+	.4byte	0x134fd
+	.uleb128 0x54
+	.4byte	0x13507
+	.uleb128 0x54
+	.4byte	0x13513
+	.uleb128 0x5d
+	.4byte	0x1351f
+	.4byte	.LLST294
+	.uleb128 0x54
+	.4byte	0x1352b
+	.uleb128 0x5d
+	.4byte	0x13537
+	.4byte	.LLST295
+	.uleb128 0x4b
+	.8byte	.LVL990
+	.4byte	0x16f38
+	.byte	0
+	.uleb128 0x7b
+	.4byte	0x133a4
+	.8byte	.LFB2888
+	.8byte	.LFE2888-.LFB2888
+	.uleb128 0x1
+	.byte	0x9c
+	.4byte	0x16af4
+	.uleb128 0x51
+	.4byte	0x133cd
+	.uleb128 0x51
+	.4byte	0x133cd
+	.uleb128 0x51
+	.4byte	0x133c1
+	.uleb128 0x51
+	.4byte	0x133b5
+	.uleb128 0x54
+	.4byte	0x133d9
+	.uleb128 0x54
+	.4byte	0x133e3
+	.uleb128 0x54
+	.4byte	0x133ef
+	.uleb128 0x5e
+	.4byte	0x133fb
+	.uleb128 0x1
+	.byte	0x59
+	.uleb128 0x54
+	.4byte	0x13407
+	.uleb128 0x54
+	.4byte	0x13413
+	.uleb128 0x54
+	.4byte	0x1341f
+	.uleb128 0x5d
+	.4byte	0x1342b
+	.4byte	.LLST296
+	.uleb128 0x5d
+	.4byte	0x13437
+	.4byte	.LLST297
+	.uleb128 0x4b
+	.8byte	.LVL995
+	.4byte	0x16f38
+	.byte	0
+	.uleb128 0x7b
+	.4byte	0x1014a
+	.8byte	.LFB2862
+	.8byte	.LFE2862-.LFB2862
+	.uleb128 0x1
+	.byte	0x9c
+	.4byte	0x16b91
+	.uleb128 0x60
+	.4byte	0x1015b
+	.4byte	.LLST329
+	.uleb128 0x60
+	.4byte	0x10167
+	.4byte	.LLST330
+	.uleb128 0x60
+	.4byte	0x10173
+	.4byte	.LLST331
+	.uleb128 0x54
+	.4byte	0x1017f
+	.uleb128 0x54
+	.4byte	0x1018b
+	.uleb128 0x5d
+	.4byte	0x10197
+	.4byte	.LLST332
+	.uleb128 0x5f
+	.8byte	.LBB2117
+	.8byte	.LBE2117-.LBB2117
+	.4byte	0x16b83
+	.uleb128 0x51
+	.4byte	0x1015b
+	.uleb128 0x51
+	.4byte	0x10167
+	.uleb128 0x51
+	.4byte	0x10173
+	.uleb128 0x53
+	.8byte	.LBB2118
+	.8byte	.LBE2118-.LBB2118
+	.uleb128 0x54
+	.4byte	0x16b2a
+	.uleb128 0x54
+	.4byte	0x16b2f
+	.uleb128 0x54
+	.4byte	0x16b34
+	.byte	0
+	.byte	0
+	.uleb128 0x4b
+	.8byte	.LVL1203
+	.4byte	0x16df1
+	.byte	0
+	.uleb128 0x7d
+	.4byte	0x15728
+	.8byte	.LFB2893
+	.8byte	.LFE2893-.LFB2893
+	.uleb128 0x1
+	.byte	0x9c
+	.4byte	0x16c45
+	.uleb128 0x60
+	.4byte	0x15739
+	.4byte	.LLST333
+	.uleb128 0x54
+	.4byte	0x15751
+	.uleb128 0x51
+	.4byte	0x15745
+	.uleb128 0x50
+	.4byte	0x15b20
+	.8byte	.LBB2119
+	.8byte	.LBE2119-.LBB2119
+	.byte	0x1
+	.2byte	0x191
+	.4byte	0x16be1
+	.uleb128 0x51
+	.4byte	0x15b2c
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x15997
+	.8byte	.LBB2121
+	.8byte	.LBE2121-.LBB2121
+	.byte	0x1
+	.2byte	0x192
+	.4byte	0x16c08
+	.uleb128 0x51
+	.4byte	0x159b2
+	.uleb128 0x51
+	.4byte	0x159a7
+	.byte	0
+	.uleb128 0x50
+	.4byte	0x15b56
+	.8byte	.LBB2123
+	.8byte	.LBE2123-.LBB2123
+	.byte	0x1
+	.2byte	0x18e
+	.4byte	0x16c37
+	.uleb128 0x51
+	.4byte	0x15b62
+	.uleb128 0x4b
+	.8byte	.LVL1211
+	.4byte	0x16f43
+	.byte	0
+	.uleb128 0x4b
+	.8byte	.LVL1208
+	.4byte	0x16c5b
+	.byte	0
+	.uleb128 0x7e
+	.4byte	.LASF3256
+	.4byte	.LASF3256
+	.byte	0xbd
+	.byte	0xcf
+	.uleb128 0x7e
+	.4byte	.LASF3257
+	.4byte	.LASF3257
+	.byte	0xbd
+	.byte	0xcd
+	.uleb128 0x7f
+	.4byte	.LASF3258
+	.4byte	.LASF3258
+	.byte	0x2
+	.2byte	0x5d1
+	.uleb128 0x7e
+	.4byte	.LASF3259
+	.4byte	.LASF3259
+	.byte	0xab
+	.byte	0x4f
+	.uleb128 0x7f
+	.4byte	.LASF3260
+	.4byte	.LASF3260
+	.byte	0x2
+	.2byte	0x2bf
+	.uleb128 0x7f
+	.4byte	.LASF3261
+	.4byte	.LASF3261
+	.byte	0xd
+	.2byte	0x149
+	.uleb128 0x7f
+	.4byte	.LASF3262
+	.4byte	.LASF3262
+	.byte	0xd
+	.2byte	0x172
+	.uleb128 0x7e
+	.4byte	.LASF3263
+	.4byte	.LASF3263
+	.byte	0xd3
+	.byte	0x78
+	.uleb128 0x7e
+	.4byte	.LASF3264
+	.4byte	.LASF3264
+	.byte	0xa9
+	.byte	0x59
+	.uleb128 0x7e
+	.4byte	.LASF3265
+	.4byte	.LASF3265
+	.byte	0xc2
+	.byte	0x34
+	.uleb128 0x80
+	.4byte	.LASF3276
+	.4byte	.LASF3276
+	.uleb128 0x7f
+	.4byte	.LASF3266
+	.4byte	.LASF3266
+	.byte	0x2
+	.2byte	0x5cb
+	.uleb128 0x7e
+	.4byte	.LASF3267
+	.4byte	.LASF3267
+	.byte	0xc1
+	.byte	0x29
+	.uleb128 0x7e
+	.4byte	.LASF3268
+	.4byte	.LASF3268
+	.byte	0xc1
+	.byte	0x2a
+	.uleb128 0x7e
+	.4byte	.LASF3269
+	.4byte	.LASF3269
+	.byte	0xaa
+	.byte	0x9
+	.uleb128 0x7f
+	.4byte	.LASF3270
+	.4byte	.LASF3270
+	.byte	0x47
+	.2byte	0x6b7
+	.uleb128 0x7f
+	.4byte	.LASF3271
+	.4byte	.LASF3271
+	.byte	0x47
+	.2byte	0x675
+	.uleb128 0x7e
+	.4byte	.LASF3272
+	.4byte	.LASF3272
+	.byte	0x9a
+	.byte	0x67
+	.uleb128 0x7e
+	.4byte	.LASF3273
+	.4byte	.LASF3273
+	.byte	0x52
+	.byte	0x53
+	.uleb128 0x7e
+	.4byte	.LASF3274
+	.4byte	.LASF3274
+	.byte	0x52
+	.byte	0xa5
+	.uleb128 0x7e
+	.4byte	.LASF3275
+	.4byte	.LASF3275
+	.byte	0xc2
+	.byte	0x2f
+	.uleb128 0x7e
+	.4byte	.LASF3276
+	.4byte	.LASF3276
+	.byte	0xd4
+	.byte	0x36
+	.uleb128 0x7e
+	.4byte	.LASF3277
+	.4byte	.LASF3277
+	.byte	0xc2
+	.byte	0x28
+	.uleb128 0x7f
+	.4byte	.LASF3278
+	.4byte	.LASF3278
+	.byte	0x10
+	.2byte	0x184
+	.uleb128 0x7e
+	.4byte	.LASF3279
+	.4byte	.LASF3279
+	.byte	0xd5
+	.byte	0x51
+	.uleb128 0x7f
+	.4byte	.LASF3280
+	.4byte	.LASF3280
+	.byte	0x1f
+	.2byte	0x1d9
+	.uleb128 0x7e
+	.4byte	.LASF3281
+	.4byte	.LASF3281
+	.byte	0x3
+	.byte	0x3b
+	.uleb128 0x7e
+	.4byte	.LASF3282
+	.4byte	.LASF3282
+	.byte	0x10
+	.byte	0xb9
+	.uleb128 0x7e
+	.4byte	.LASF3283
+	.4byte	.LASF3283
+	.byte	0x39
+	.byte	0xc2
+	.uleb128 0x80
+	.4byte	.LASF3284
+	.4byte	.LASF3284
+	.uleb128 0x7e
+	.4byte	.LASF3285
+	.4byte	.LASF3285
+	.byte	0xab
+	.byte	0x4e
+	.uleb128 0x7f
+	.4byte	.LASF3286
+	.4byte	.LASF3286
+	.byte	0x2
+	.2byte	0x287
+	.uleb128 0x7e
+	.4byte	.LASF3287
+	.4byte	.LASF3287
+	.byte	0xbe
+	.byte	0x38
+	.uleb128 0x7f
+	.4byte	.LASF3288
+	.4byte	.LASF3288
+	.byte	0xd
+	.2byte	0x165
+	.uleb128 0x7f
+	.4byte	.LASF3289
+	.4byte	.LASF3289
+	.byte	0xa1
+	.2byte	0x37b
+	.uleb128 0x7f
+	.4byte	.LASF3290
+	.4byte	.LASF3290
+	.byte	0xd
+	.2byte	0x125
+	.uleb128 0x80
+	.4byte	.LASF3291
+	.4byte	.LASF3291
+	.uleb128 0x7e
+	.4byte	.LASF3292
+	.4byte	.LASF3292
+	.byte	0xc2
+	.byte	0x32
+	.uleb128 0x7f
+	.4byte	.LASF3293
+	.4byte	.LASF3293
+	.byte	0x1f
+	.2byte	0x1c7
+	.uleb128 0x7f
+	.4byte	.LASF3294
+	.4byte	.LASF3294
+	.byte	0x1f
+	.2byte	0x17e
+	.uleb128 0x7e
+	.4byte	.LASF3295
+	.4byte	.LASF3295
+	.byte	0x3
+	.byte	0x3a
+	.uleb128 0x7e
+	.4byte	.LASF3296
+	.4byte	.LASF3296
+	.byte	0xc1
+	.byte	0x2b
+	.uleb128 0x7f
+	.4byte	.LASF3297
+	.4byte	.LASF3297
+	.byte	0x74
+	.2byte	0xa10
+	.uleb128 0x7e
+	.4byte	.LASF3298
+	.4byte	.LASF3298
+	.byte	0xc2
+	.byte	0x30
+	.uleb128 0x7f
+	.4byte	.LASF3299
+	.4byte	.LASF3299
+	.byte	0x5
+	.2byte	0x19f
+	.uleb128 0x7f
+	.4byte	.LASF3300
+	.4byte	.LASF3300
+	.byte	0x5
+	.2byte	0x199
+	.uleb128 0x7e
+	.4byte	.LASF3301
+	.4byte	.LASF3301
+	.byte	0xc2
+	.byte	0x26
+	.uleb128 0x7e
+	.4byte	.LASF3302
+	.4byte	.LASF3302
+	.byte	0xc2
+	.byte	0x29
+	.uleb128 0x7e
+	.4byte	.LASF3303
+	.4byte	.LASF3303
+	.byte	0xc2
+	.byte	0x25
+	.uleb128 0x7e
+	.4byte	.LASF3304
+	.4byte	.LASF3304
+	.byte	0xc2
+	.byte	0x2e
+	.uleb128 0x7e
+	.4byte	.LASF3305
+	.4byte	.LASF3305
+	.byte	0xc2
+	.byte	0x27
+	.uleb128 0x7e
+	.4byte	.LASF3306
+	.4byte	.LASF3306
+	.byte	0xc2
+	.byte	0x24
+	.uleb128 0x7e
+	.4byte	.LASF3307
+	.4byte	.LASF3307
+	.byte	0x47
+	.byte	0xdc
+	.uleb128 0x7f
+	.4byte	.LASF3308
+	.4byte	.LASF3308
+	.byte	0x39
+	.2byte	0x473
+	.uleb128 0x7f
+	.4byte	.LASF3309
+	.4byte	.LASF3309
+	.byte	0x39
+	.2byte	0x103
+	.uleb128 0x7f
+	.4byte	.LASF3310
+	.4byte	.LASF3310
+	.byte	0x39
+	.2byte	0x474
+	.uleb128 0x7e
+	.4byte	.LASF3311
+	.4byte	.LASF3311
+	.byte	0xc2
+	.byte	0x2a
+	.uleb128 0x7e
+	.4byte	.LASF3312
+	.4byte	.LASF3312
+	.byte	0x47
+	.byte	0xd7
+	.uleb128 0x7f
+	.4byte	.LASF3313
+	.4byte	.LASF3313
+	.byte	0x11
+	.2byte	0x12b
+	.uleb128 0x7e
+	.4byte	.LASF3314
+	.4byte	.LASF3314
+	.byte	0xc2
+	.byte	0x2d
+	.uleb128 0x7e
+	.4byte	.LASF3315
+	.4byte	.LASF3315
+	.byte	0xc2
+	.byte	0x2c
+	.uleb128 0x7e
+	.4byte	.LASF3316
+	.4byte	.LASF3316
+	.byte	0xc3
+	.byte	0x7b
+	.uleb128 0x7e
+	.4byte	.LASF3317
+	.4byte	.LASF3317
+	.byte	0xc2
+	.byte	0x2b
+	.uleb128 0x7e
+	.4byte	.LASF3318
+	.4byte	.LASF3318
+	.byte	0xc1
+	.byte	0x2c
+	.uleb128 0x81
+	.string	"up"
+	.string	"up"
+	.byte	0x76
+	.byte	0x2c
+	.uleb128 0x7e
+	.4byte	.LASF3319
+	.4byte	.LASF3319
+	.byte	0x76
+	.byte	0x27
+	.uleb128 0x7e
+	.4byte	.LASF3320
+	.4byte	.LASF3320
+	.byte	0x9a
+	.byte	0x73
+	.uleb128 0x7e
+	.4byte	.LASF3321
+	.4byte	.LASF3321
+	.byte	0x1d
+	.byte	0xb0
+	.uleb128 0x7e
+	.4byte	.LASF3322
+	.4byte	.LASF3322
+	.byte	0x9a
+	.byte	0x71
+	.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 0x24
+	.byte	0
+	.uleb128 0xb
+	.uleb128 0xb
+	.uleb128 0x3e
+	.uleb128 0xb
+	.uleb128 0x3
+	.uleb128 0xe
+	.byte	0
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0x26
+	.byte	0
+	.uleb128 0x49
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x4
+	.uleb128 0x35
+	.byte	0
+	.uleb128 0x49
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x5
+	.uleb128 0x1
+	.byte	0x1
+	.uleb128 0x49
+	.uleb128 0x13
+	.uleb128 0x1
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x6
+	.uleb128 0x21
+	.byte	0
+	.uleb128 0x49
+	.uleb128 0x13
+	.uleb128 0x2f
+	.uleb128 0xb
+	.byte	0
+	.byte	0
+	.uleb128 0x7
+	.uleb128 0xf
+	.byte	0
+	.uleb128 0xb
+	.uleb128 0xb
+	.uleb128 0x49
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x8
+	.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 0x9
+	.uleb128 0x24
+	.byte	0
+	.uleb128 0xb
+	.uleb128 0xb
+	.uleb128 0x3e
+	.uleb128 0xb
+	.uleb128 0x3
+	.uleb128 0x8
+	.byte	0
+	.byte	0
+	.uleb128 0xa
+	.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 0xb
+	.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 0xc
+	.uleb128 0x28
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0x1c
+	.uleb128 0xb
+	.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 0x13
+	.byte	0x1
+	.uleb128 0xb
+	.uleb128 0xb
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0xb
+	.uleb128 0x1
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x10
+	.uleb128 0x15
+	.byte	0x1
+	.uleb128 0x27
+	.uleb128 0x19
+	.uleb128 0x1
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x11
+	.uleb128 0x5
+	.byte	0
+	.uleb128 0x49
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x12
+	.uleb128 0xf
+	.byte	0
+	.uleb128 0xb
+	.uleb128 0xb
+	.byte	0
+	.byte	0
+	.uleb128 0x13
+	.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 0x14
+	.uleb128 0x15
+	.byte	0x1
+	.uleb128 0x27
+	.uleb128 0x19
+	.uleb128 0x49
+	.uleb128 0x13
+	.uleb128 0x1
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x15
+	.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 0x16
+	.uleb128 0x15
+	.byte	0
+	.uleb128 0x27
+	.uleb128 0x19
+	.uleb128 0x49
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x17
+	.uleb128 0x15
+	.byte	0
+	.uleb128 0x27
+	.uleb128 0x19
+	.byte	0
+	.byte	0
+	.uleb128 0x18
+	.uleb128 0x21
+	.byte	0
+	.byte	0
+	.byte	0
+	.uleb128 0x19
+	.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 0x1a
+	.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 0x1b
+	.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 0x1c
+	.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 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 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 0x1f
+	.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 0x20
+	.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 0x21
+	.uleb128 0x17
+	.byte	0x1
+	.uleb128 0xb
+	.uleb128 0xb
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0xb
+	.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 0xb
+	.uleb128 0x49
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x23
+	.uleb128 0xd
+	.byte	0
+	.uleb128 0x49
+	.uleb128 0x13
+	.uleb128 0x38
+	.uleb128 0xb
+	.byte	0
+	.byte	0
+	.uleb128 0x24
+	.uleb128 0x13
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0x3c
+	.uleb128 0x19
+	.byte	0
+	.byte	0
+	.uleb128 0x25
+	.uleb128 0x34
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0xb
+	.uleb128 0x49
+	.uleb128 0x13
+	.uleb128 0x3f
+	.uleb128 0x19
+	.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 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 0x28
+	.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 0x29
+	.uleb128 0xd
+	.byte	0
+	.uleb128 0x49
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x2a
+	.uleb128 0x13
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0xb
+	.uleb128 0xb
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0x5
+	.byte	0
+	.byte	0
+	.uleb128 0x2b
+	.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 0x2c
+	.uleb128 0x34
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0xb
+	.uleb128 0x3f
+	.uleb128 0x19
+	.uleb128 0x3c
+	.uleb128 0x19
+	.byte	0
+	.byte	0
+	.uleb128 0x2d
+	.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 0x2e
+	.uleb128 0x13
+	.byte	0x1
+	.uleb128 0xb
+	.uleb128 0xb
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0x5
+	.uleb128 0x1
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x2f
+	.uleb128 0xd
+	.byte	0
+	.uleb128 0x49
+	.uleb128 0x13
+	.uleb128 0x38
+	.uleb128 0x5
+	.byte	0
+	.byte	0
+	.uleb128 0x30
+	.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 0x31
+	.uleb128 0x17
+	.byte	0
+	.uleb128 0xb
+	.uleb128 0xb
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0xb
+	.byte	0
+	.byte	0
+	.uleb128 0x32
+	.uleb128 0x13
+	.byte	0x1
+	.uleb128 0x3
+	.uleb128 0x8
+	.uleb128 0xb
+	.uleb128 0xb
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0xb
+	.uleb128 0x1
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x33
+	.uleb128 0xd
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0x5
+	.uleb128 0x49
+	.uleb128 0x13
+	.uleb128 0xb
+	.uleb128 0xb
+	.uleb128 0xd
+	.uleb128 0xb
+	.uleb128 0xc
+	.uleb128 0xb
+	.uleb128 0x38
+	.uleb128 0x5
+	.byte	0
+	.byte	0
+	.uleb128 0x34
+	.uleb128 0x26
+	.byte	0
+	.byte	0
+	.byte	0
+	.uleb128 0x35
+	.uleb128 0xd
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0xb
+	.uleb128 0x49
+	.uleb128 0x13
+	.uleb128 0xb
+	.uleb128 0xb
+	.uleb128 0xd
+	.uleb128 0xb
+	.uleb128 0xc
+	.uleb128 0xb
+	.uleb128 0x38
+	.uleb128 0xb
+	.byte	0
+	.byte	0
+	.uleb128 0x36
+	.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 0x37
+	.uleb128 0x13
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0xb
+	.uleb128 0xb
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0xb
+	.byte	0
+	.byte	0
+	.uleb128 0x38
+	.uleb128 0xd
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0x5
+	.uleb128 0x49
+	.uleb128 0x13
+	.uleb128 0xb
+	.uleb128 0xb
+	.uleb128 0xd
+	.uleb128 0xb
+	.uleb128 0xc
+	.uleb128 0xb
+	.uleb128 0x38
+	.uleb128 0xb
+	.byte	0
+	.byte	0
+	.uleb128 0x39
+	.uleb128 0x17
+	.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 0x3a
+	.uleb128 0xd
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0x8
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0x5
+	.uleb128 0x49
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x3b
+	.uleb128 0x17
+	.byte	0
+	.uleb128 0xb
+	.uleb128 0xb
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0x5
+	.byte	0
+	.byte	0
+	.uleb128 0x3c
+	.uleb128 0x17
+	.byte	0x1
+	.uleb128 0xb
+	.uleb128 0xb
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0x5
+	.uleb128 0x1
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x3d
+	.uleb128 0xd
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0x5
+	.uleb128 0x49
+	.uleb128 0x13
+	.uleb128 0xb
+	.uleb128 0xb
+	.uleb128 0xd
+	.uleb128 0xb
+	.uleb128 0xc
+	.uleb128 0xb
+	.byte	0
+	.byte	0
+	.uleb128 0x3e
+	.uleb128 0xd
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0x5
+	.uleb128 0x49
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x3f
+	.uleb128 0x17
+	.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 0x40
+	.uleb128 0x21
+	.byte	0
+	.uleb128 0x49
+	.uleb128 0x13
+	.uleb128 0x2f
+	.uleb128 0x5
+	.byte	0
+	.byte	0
+	.uleb128 0x41
+	.uleb128 0x21
+	.byte	0
+	.uleb128 0x49
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x42
+	.uleb128 0x13
+	.byte	0x1
+	.uleb128 0xb
+	.uleb128 0x5
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0x5
+	.uleb128 0x1
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x43
+	.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 0x44
+	.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 0x45
+	.uleb128 0x13
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0x8
+	.uleb128 0x3c
+	.uleb128 0x19
+	.byte	0
+	.byte	0
+	.uleb128 0x46
+	.uleb128 0x4
+	.byte	0x1
+	.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 0x47
+	.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 0x48
+	.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 0x49
+	.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 0x4a
+	.uleb128 0x2e
+	.byte	0x1
+	.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 0x4b
+	.uleb128 0x4109
+	.byte	0
+	.uleb128 0x11
+	.uleb128 0x1
+	.uleb128 0x31
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x4c
+	.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 0x4d
+	.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 0x2116
+	.uleb128 0x19
+	.uleb128 0x1
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x4e
+	.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 0x4f
+	.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 0x50
+	.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 0x51
+	.uleb128 0x5
+	.byte	0
+	.uleb128 0x31
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x52
+	.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 0x53
+	.uleb128 0xb
+	.byte	0x1
+	.uleb128 0x11
+	.uleb128 0x1
+	.uleb128 0x12
+	.uleb128 0x7
+	.byte	0
+	.byte	0
+	.uleb128 0x54
+	.uleb128 0x34
+	.byte	0
+	.uleb128 0x31
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x55
+	.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 0x56
+	.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 0x57
+	.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 0x58
+	.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 0x59
+	.uleb128 0x1d
+	.byte	0x1
+	.uleb128 0x31
+	.uleb128 0x13
+	.uleb128 0x11
+	.uleb128 0x1
+	.uleb128 0x12
+	.uleb128 0x7
+	.uleb128 0x58
+	.uleb128 0xb
+	.uleb128 0x59
+	.uleb128 0xb
+	.byte	0
+	.byte	0
+	.uleb128 0x5a
+	.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 0x5b
+	.uleb128 0xb
+	.byte	0x1
+	.uleb128 0x55
+	.uleb128 0x17
+	.byte	0
+	.byte	0
+	.uleb128 0x5c
+	.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 0x5d
+	.uleb128 0x34
+	.byte	0
+	.uleb128 0x31
+	.uleb128 0x13
+	.uleb128 0x2
+	.uleb128 0x17
+	.byte	0
+	.byte	0
+	.uleb128 0x5e
+	.uleb128 0x34
+	.byte	0
+	.uleb128 0x31
+	.uleb128 0x13
+	.uleb128 0x2
+	.uleb128 0x18
+	.byte	0
+	.byte	0
+	.uleb128 0x5f
+	.uleb128 0xb
+	.byte	0x1
+	.uleb128 0x11
+	.uleb128 0x1
+	.uleb128 0x12
+	.uleb128 0x7
+	.uleb128 0x1
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x60
+	.uleb128 0x5
+	.byte	0
+	.uleb128 0x31
+	.uleb128 0x13
+	.uleb128 0x2
+	.uleb128 0x17
+	.byte	0
+	.byte	0
+	.uleb128 0x61
+	.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 0x62
+	.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 0x63
+	.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 0x64
+	.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 0x65
+	.uleb128 0xb
+	.byte	0x1
+	.byte	0
+	.byte	0
+	.uleb128 0x66
+	.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 0x67
+	.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 0x68
+	.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 0x1
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x69
+	.uleb128 0xb
+	.byte	0x1
+	.uleb128 0x55
+	.uleb128 0x17
+	.uleb128 0x1
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x6a
+	.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 0x6b
+	.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 0x6c
+	.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 0x6d
+	.uleb128 0xa
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0x5
+	.byte	0
+	.byte	0
+	.uleb128 0x6e
+	.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 0x6f
+	.uleb128 0xb
+	.byte	0x1
+	.uleb128 0x1
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x70
+	.uleb128 0xa
+	.byte	0
+	.uleb128 0x31
+	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x71
+	.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 0x72
+	.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 0x73
+	.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 0x74
+	.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 0x75
+	.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 0x76
+	.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 0x77
+	.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 0x78
+	.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 0x79
+	.uleb128 0x2e
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0x5
+	.uleb128 0x27
+	.uleb128 0x19
+	.uleb128 0x20
+	.uleb128 0xb
+	.byte	0
+	.byte	0
+	.uleb128 0x7a
+	.uleb128 0x35
+	.byte	0
+	.byte	0
+	.byte	0
+	.uleb128 0x7b
+	.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 0x7c
+	.uleb128 0x5
+	.byte	0
+	.uleb128 0x31
+	.uleb128 0x13
+	.uleb128 0x2
+	.uleb128 0x18
+	.byte	0
+	.byte	0
+	.uleb128 0x7d
+	.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 0x7e
+	.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 0x7f
+	.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 0x80
+	.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 0x81
+	.uleb128 0x2e
+	.byte	0
+	.uleb128 0x3f
+	.uleb128 0x19
+	.uleb128 0x3c
+	.uleb128 0x19
+	.uleb128 0x6e
+	.uleb128 0x8
+	.uleb128 0x3
+	.uleb128 0x8
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0xb
+	.byte	0
+	.byte	0
+	.byte	0
+	.section	.debug_loc,"",@progbits
+.Ldebug_loc0:
+.LLST22:
+	.8byte	.LVL75
+	.8byte	.LVL76
+	.2byte	0x1
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST268:
+	.8byte	.LVL883
+	.8byte	.LVL884
+	.2byte	0x1
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST24:
+	.8byte	.LVL82
+	.8byte	.LVL83
+	.2byte	0x1
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST298:
+	.8byte	.LVL996
+	.8byte	.LVL997
+	.2byte	0x1
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST299:
+	.8byte	.LVL1000
+	.8byte	.LVL1001
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL1012
+	.8byte	.LVL1013
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL1151
+	.8byte	.LVL1152
+	.2byte	0x1
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST300:
+	.8byte	.LVL1008
+	.8byte	.LVL1009
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL1058
+	.8byte	.LVL1059
+	.2byte	0x1
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST301:
+	.8byte	.LVL1012
+	.8byte	.LVL1014
+	.2byte	0x1
+	.byte	0x63
+	.8byte	.LVL1021
+	.8byte	.LVL1058
+	.2byte	0x1
+	.byte	0x63
+	.8byte	.LVL1063
+	.8byte	.LVL1151
+	.2byte	0x1
+	.byte	0x63
+	.8byte	.LVL1152
+	.8byte	.LVL1158
+	.2byte	0x1
+	.byte	0x63
+	.8byte	.LVL1161
+	.8byte	.LVL1178
+	.2byte	0x1
+	.byte	0x63
+	.8byte	.LVL1180
+	.8byte	.LFE2870
+	.2byte	0x1
+	.byte	0x63
+	.8byte	0
+	.8byte	0
+.LLST302:
+	.8byte	.LVL1003
+	.8byte	.LVL1015
+	.2byte	0x1
+	.byte	0x65
+	.8byte	.LVL1019
+	.8byte	.LVL1022
+	.2byte	0x1
+	.byte	0x65
+	.8byte	.LVL1058
+	.8byte	.LVL1063
+	.2byte	0x1
+	.byte	0x65
+	.8byte	.LVL1159
+	.8byte	.LVL1161
+	.2byte	0x1
+	.byte	0x65
+	.8byte	.LVL1184
+	.8byte	.LVL1185
+	.2byte	0x1
+	.byte	0x65
+	.8byte	0
+	.8byte	0
+.LLST303:
+	.8byte	.LVL1003
+	.8byte	.LVL1004
+	.2byte	0x2
+	.byte	0x91
+	.sleb128 -32
+	.8byte	.LVL1004
+	.8byte	.LVL1005
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL1006
+	.8byte	.LVL1010
+	.2byte	0x2
+	.byte	0x91
+	.sleb128 -32
+	.8byte	.LVL1010
+	.8byte	.LVL1061
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL1061
+	.8byte	.LVL1151
+	.2byte	0x2
+	.byte	0x91
+	.sleb128 -32
+	.8byte	.LVL1152
+	.8byte	.LVL1158
+	.2byte	0x2
+	.byte	0x91
+	.sleb128 -32
+	.8byte	.LVL1159
+	.8byte	.LVL1178
+	.2byte	0x2
+	.byte	0x91
+	.sleb128 -32
+	.8byte	.LVL1180
+	.8byte	.LFE2870
+	.2byte	0x2
+	.byte	0x91
+	.sleb128 -32
+	.8byte	0
+	.8byte	0
+.LLST304:
+	.8byte	.LVL1007
+	.8byte	.LVL1014
+	.2byte	0x1
+	.byte	0x63
+	.8byte	.LVL1019
+	.8byte	.LVL1021
+	.2byte	0x1
+	.byte	0x63
+	.8byte	.LVL1058
+	.8byte	.LVL1063
+	.2byte	0x1
+	.byte	0x63
+	.8byte	.LVL1184
+	.8byte	.LVL1185
+	.2byte	0x1
+	.byte	0x63
+	.8byte	0
+	.8byte	0
+.LLST305:
+	.8byte	.LVL1012
+	.8byte	.LVL1017
+	.2byte	0x1
+	.byte	0x6a
+	.8byte	.LVL1045
+	.8byte	.LVL1052
+	.2byte	0x1
+	.byte	0x6a
+	.8byte	.LVL1125
+	.8byte	.LVL1128
+	.2byte	0x1
+	.byte	0x6a
+	.8byte	.LVL1165
+	.8byte	.LVL1167
+	.2byte	0x1
+	.byte	0x6a
+	.8byte	.LVL1172
+	.8byte	.LVL1173
+	.2byte	0x1
+	.byte	0x6a
+	.8byte	.LVL1176
+	.8byte	.LVL1178
+	.2byte	0x1
+	.byte	0x6a
+	.8byte	.LVL1180
+	.8byte	.LVL1181
+	.2byte	0x1
+	.byte	0x6a
+	.8byte	.LVL1182
+	.8byte	.LVL1185
+	.2byte	0x1
+	.byte	0x6a
+	.8byte	0
+	.8byte	0
+.LLST306:
+	.8byte	.LVL1012
+	.8byte	.LVL1017
+	.2byte	0x1
+	.byte	0x6a
+	.8byte	.LVL1052
+	.8byte	.LVL1056
+	.2byte	0x1
+	.byte	0x6a
+	.8byte	.LVL1063
+	.8byte	.LVL1064
+	.2byte	0x1
+	.byte	0x6a
+	.8byte	.LVL1181
+	.8byte	.LVL1182
+	.2byte	0x1
+	.byte	0x6a
+	.8byte	.LVL1184
+	.8byte	.LVL1185
+	.2byte	0x1
+	.byte	0x6a
+	.8byte	0
+	.8byte	0
+.LLST307:
+	.8byte	.LVL1064
+	.8byte	.LVL1065-1
+	.2byte	0x1
+	.byte	0x51
+	.8byte	0
+	.8byte	0
+.LLST308:
+	.8byte	.LVL1069
+	.8byte	.LVL1072
+	.2byte	0x1
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST309:
+	.8byte	.LVL1070
+	.8byte	.LVL1071
+	.2byte	0x1
+	.byte	0x51
+	.8byte	0
+	.8byte	0
+.LLST310:
+	.8byte	.LVL1075
+	.8byte	.LVL1078
+	.2byte	0x1
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST311:
+	.8byte	.LVL1076
+	.8byte	.LVL1077
+	.2byte	0x1
+	.byte	0x51
+	.8byte	0
+	.8byte	0
+.LLST312:
+	.8byte	.LVL1012
+	.8byte	.LVL1017
+	.2byte	0x1
+	.byte	0x6a
+	.8byte	.LVL1081
+	.8byte	.LVL1088
+	.2byte	0x1
+	.byte	0x6a
+	.8byte	.LVL1168
+	.8byte	.LVL1170
+	.2byte	0x1
+	.byte	0x6a
+	.8byte	.LVL1173
+	.8byte	.LVL1174
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL1174
+	.8byte	.LVL1176
+	.2byte	0x1
+	.byte	0x6a
+	.8byte	.LVL1184
+	.8byte	.LVL1185
+	.2byte	0x1
+	.byte	0x6a
+	.8byte	0
+	.8byte	0
+.LLST313:
+	.8byte	.LVL1084
+	.8byte	.LVL1087
+	.2byte	0x1
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST314:
+	.8byte	.LVL1085
+	.8byte	.LVL1086
+	.2byte	0x1
+	.byte	0x51
+	.8byte	0
+	.8byte	0
+.LLST315:
+	.8byte	.LVL1087
+	.8byte	.LVL1089-1
+	.2byte	0x1
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST316:
+	.8byte	.LVL1012
+	.8byte	.LVL1019
+	.2byte	0x2
+	.byte	0x91
+	.sleb128 -28
+	.8byte	.LVL1094
+	.8byte	.LVL1125
+	.2byte	0x2
+	.byte	0x91
+	.sleb128 -28
+	.8byte	.LVL1128
+	.8byte	.LVL1134
+	.2byte	0x2
+	.byte	0x91
+	.sleb128 -28
+	.8byte	.LVL1134
+	.8byte	.LVL1135
+	.2byte	0x1
+	.byte	0x51
+	.8byte	.LVL1138
+	.8byte	.LVL1151
+	.2byte	0x2
+	.byte	0x91
+	.sleb128 -28
+	.8byte	.LVL1152
+	.8byte	.LVL1158
+	.2byte	0x2
+	.byte	0x91
+	.sleb128 -28
+	.8byte	.LVL1184
+	.8byte	.LVL1185
+	.2byte	0x2
+	.byte	0x91
+	.sleb128 -28
+	.8byte	.LVL1187
+	.8byte	.LVL1193
+	.2byte	0x2
+	.byte	0x91
+	.sleb128 -28
+	.8byte	0
+	.8byte	0
+.LLST317:
+	.8byte	.LVL1012
+	.8byte	.LVL1019
+	.2byte	0x2
+	.byte	0x91
+	.sleb128 -24
+	.8byte	.LVL1094
+	.8byte	.LVL1125
+	.2byte	0x2
+	.byte	0x91
+	.sleb128 -24
+	.8byte	.LVL1128
+	.8byte	.LVL1148
+	.2byte	0x2
+	.byte	0x91
+	.sleb128 -24
+	.8byte	.LVL1148
+	.8byte	.LVL1149
+	.2byte	0x1
+	.byte	0x51
+	.8byte	.LVL1152
+	.8byte	.LVL1158
+	.2byte	0x2
+	.byte	0x91
+	.sleb128 -24
+	.8byte	.LVL1184
+	.8byte	.LVL1193
+	.2byte	0x2
+	.byte	0x91
+	.sleb128 -24
+	.8byte	0
+	.8byte	0
+.LLST318:
+	.8byte	.LVL1012
+	.8byte	.LVL1017
+	.2byte	0x1
+	.byte	0x6a
+	.8byte	.LVL1100
+	.8byte	.LVL1109
+	.2byte	0x1
+	.byte	0x6a
+	.8byte	.LVL1111
+	.8byte	.LVL1125
+	.2byte	0x1
+	.byte	0x6a
+	.8byte	.LVL1128
+	.8byte	.LVL1130
+	.2byte	0x1
+	.byte	0x6a
+	.8byte	.LVL1138
+	.8byte	.LVL1151
+	.2byte	0x1
+	.byte	0x6a
+	.8byte	.LVL1152
+	.8byte	.LVL1158
+	.2byte	0x1
+	.byte	0x6a
+	.8byte	.LVL1184
+	.8byte	.LVL1185
+	.2byte	0x1
+	.byte	0x6a
+	.8byte	.LVL1186
+	.8byte	.LVL1187
+	.2byte	0x1
+	.byte	0x6a
+	.8byte	.LVL1190
+	.8byte	.LVL1193
+	.2byte	0x1
+	.byte	0x6a
+	.8byte	0
+	.8byte	0
+.LLST319:
+	.8byte	.LVL1012
+	.8byte	.LVL1016
+	.2byte	0x1
+	.byte	0x68
+	.8byte	.LVL1104
+	.8byte	.LVL1125
+	.2byte	0x1
+	.byte	0x68
+	.8byte	.LVL1128
+	.8byte	.LVL1130
+	.2byte	0x1
+	.byte	0x68
+	.8byte	.LVL1137
+	.8byte	.LVL1151
+	.2byte	0x1
+	.byte	0x68
+	.8byte	.LVL1152
+	.8byte	.LVL1158
+	.2byte	0x1
+	.byte	0x68
+	.8byte	.LVL1184
+	.8byte	.LVL1185
+	.2byte	0x1
+	.byte	0x68
+	.8byte	.LVL1190
+	.8byte	.LVL1193
+	.2byte	0x1
+	.byte	0x68
+	.8byte	0
+	.8byte	0
+.LLST320:
+	.8byte	.LVL1012
+	.8byte	.LVL1017
+	.2byte	0x1
+	.byte	0x6a
+	.8byte	.LVL1096
+	.8byte	.LVL1100
+	.2byte	0x1
+	.byte	0x6a
+	.8byte	.LVL1111
+	.8byte	.LVL1125
+	.2byte	0x1
+	.byte	0x6a
+	.8byte	.LVL1128
+	.8byte	.LVL1145
+	.2byte	0x1
+	.byte	0x6a
+	.8byte	.LVL1152
+	.8byte	.LVL1158
+	.2byte	0x1
+	.byte	0x6a
+	.8byte	.LVL1184
+	.8byte	.LVL1186
+	.2byte	0x1
+	.byte	0x6a
+	.8byte	.LVL1187
+	.8byte	.LVL1190
+	.2byte	0x1
+	.byte	0x6a
+	.8byte	0
+	.8byte	0
+.LLST321:
+	.8byte	.LVL1012
+	.8byte	.LVL1016
+	.2byte	0x1
+	.byte	0x68
+	.8byte	.LVL1098
+	.8byte	.LVL1104
+	.2byte	0x1
+	.byte	0x68
+	.8byte	.LVL1105
+	.8byte	.LVL1125
+	.2byte	0x1
+	.byte	0x68
+	.8byte	.LVL1128
+	.8byte	.LVL1137
+	.2byte	0x1
+	.byte	0x68
+	.8byte	.LVL1152
+	.8byte	.LVL1158
+	.2byte	0x1
+	.byte	0x68
+	.8byte	.LVL1184
+	.8byte	.LVL1190
+	.2byte	0x1
+	.byte	0x68
+	.8byte	0
+	.8byte	0
+.LLST322:
+	.8byte	.LVL1012
+	.8byte	.LVL1018
+	.2byte	0x1
+	.byte	0x6c
+	.8byte	.LVL1101
+	.8byte	.LVL1125
+	.2byte	0x1
+	.byte	0x6c
+	.8byte	.LVL1128
+	.8byte	.LVL1130
+	.2byte	0x1
+	.byte	0x6c
+	.8byte	.LVL1133
+	.8byte	.LVL1151
+	.2byte	0x1
+	.byte	0x6c
+	.8byte	.LVL1152
+	.8byte	.LVL1158
+	.2byte	0x1
+	.byte	0x6c
+	.8byte	.LVL1184
+	.8byte	.LVL1187
+	.2byte	0x1
+	.byte	0x6c
+	.8byte	.LVL1187
+	.8byte	.LVL1188
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL1188
+	.8byte	.LVL1193
+	.2byte	0x1
+	.byte	0x6c
+	.8byte	0
+	.8byte	0
+.LLST323:
+	.8byte	.LVL1012
+	.8byte	.LVL1018
+	.2byte	0x1
+	.byte	0x6b
+	.8byte	.LVL1102
+	.8byte	.LVL1125
+	.2byte	0x1
+	.byte	0x6b
+	.8byte	.LVL1128
+	.8byte	.LVL1130
+	.2byte	0x1
+	.byte	0x6b
+	.8byte	.LVL1138
+	.8byte	.LVL1151
+	.2byte	0x1
+	.byte	0x6b
+	.8byte	.LVL1152
+	.8byte	.LVL1158
+	.2byte	0x1
+	.byte	0x6b
+	.8byte	.LVL1184
+	.8byte	.LVL1185
+	.2byte	0x1
+	.byte	0x6b
+	.8byte	.LVL1190
+	.8byte	.LVL1191
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL1191
+	.8byte	.LVL1193
+	.2byte	0x1
+	.byte	0x6b
+	.8byte	0
+	.8byte	0
+.LLST324:
+	.8byte	.LVL1012
+	.8byte	.LVL1017
+	.2byte	0x1
+	.byte	0x6a
+	.8byte	.LVL1109
+	.8byte	.LVL1125
+	.2byte	0x1
+	.byte	0x6a
+	.8byte	.LVL1128
+	.8byte	.LVL1130
+	.2byte	0x1
+	.byte	0x6a
+	.8byte	.LVL1152
+	.8byte	.LVL1158
+	.2byte	0x1
+	.byte	0x6a
+	.8byte	.LVL1184
+	.8byte	.LVL1185
+	.2byte	0x1
+	.byte	0x6a
+	.8byte	0
+	.8byte	0
+.LLST325:
+	.8byte	.LVL1140
+	.8byte	.LVL1143
+	.2byte	0x1
+	.byte	0x52
+	.8byte	0
+	.8byte	0
+.LLST326:
+	.8byte	.LVL1141
+	.8byte	.LVL1142
+	.2byte	0x1
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST327:
+	.8byte	.LVL1154
+	.8byte	.LVL1157-1
+	.2byte	0x1
+	.byte	0x53
+	.8byte	0
+	.8byte	0
+.LLST328:
+	.8byte	.LVL1155
+	.8byte	.LVL1156
+	.2byte	0x1
+	.byte	0x51
+	.8byte	0
+	.8byte	0
+.LLST211:
+	.8byte	.LVL696
+	.8byte	.LVL697
+	.2byte	0x1
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST212:
+	.8byte	.LVL696
+	.8byte	.LVL698-1
+	.2byte	0x1
+	.byte	0x51
+	.8byte	0
+	.8byte	0
+.LLST213:
+	.8byte	.LVL696
+	.8byte	.LVL698-1
+	.2byte	0x1
+	.byte	0x52
+	.8byte	0
+	.8byte	0
+.LLST196:
+	.8byte	.LVL666
+	.8byte	.LVL667
+	.2byte	0x1
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST197:
+	.8byte	.LVL666
+	.8byte	.LVL668
+	.2byte	0x1
+	.byte	0x51
+	.8byte	0
+	.8byte	0
+.LLST198:
+	.8byte	.LVL666
+	.8byte	.LVL669
+	.2byte	0x1
+	.byte	0x52
+	.8byte	.LVL669
+	.8byte	.LVL670-1
+	.2byte	0x1
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST199:
+	.8byte	.LVL671
+	.8byte	.LVL672
+	.2byte	0x1
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST200:
+	.8byte	.LVL671
+	.8byte	.LVL673
+	.2byte	0x1
+	.byte	0x51
+	.8byte	0
+	.8byte	0
+.LLST201:
+	.8byte	.LVL671
+	.8byte	.LVL674
+	.2byte	0x1
+	.byte	0x52
+	.8byte	.LVL674
+	.8byte	.LVL675-1
+	.2byte	0x1
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST214:
+	.8byte	.LVL699
+	.8byte	.LVL700
+	.2byte	0x1
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST215:
+	.8byte	.LVL699
+	.8byte	.LVL701
+	.2byte	0x1
+	.byte	0x51
+	.8byte	0
+	.8byte	0
+.LLST216:
+	.8byte	.LVL699
+	.8byte	.LVL703
+	.2byte	0x1
+	.byte	0x52
+	.8byte	.LVL703
+	.8byte	.LVL708
+	.2byte	0x1
+	.byte	0x65
+	.8byte	.LVL709
+	.8byte	.LFE2858
+	.2byte	0x1
+	.byte	0x65
+	.8byte	0
+	.8byte	0
+.LLST217:
+	.8byte	.LVL699
+	.8byte	.LVL704-1
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL704-1
+	.8byte	.LVL707
+	.2byte	0x1
+	.byte	0x64
+	.8byte	.LVL709
+	.8byte	.LVL710
+	.2byte	0x1
+	.byte	0x64
+	.8byte	.LVL712
+	.8byte	.LVL713
+	.2byte	0x1
+	.byte	0x64
+	.8byte	0
+	.8byte	0
+.LLST218:
+	.8byte	.LVL702
+	.8byte	.LVL708
+	.2byte	0x1
+	.byte	0x66
+	.8byte	.LVL709
+	.8byte	.LFE2858
+	.2byte	0x1
+	.byte	0x66
+	.8byte	0
+	.8byte	0
+.LLST219:
+	.8byte	.LVL705
+	.8byte	.LVL709
+	.2byte	0x2
+	.byte	0x91
+	.sleb128 20
+	.8byte	.LVL712
+	.8byte	.LFE2858
+	.2byte	0x2
+	.byte	0x91
+	.sleb128 20
+	.8byte	0
+	.8byte	0
+.LLST202:
+	.8byte	.LVL676
+	.8byte	.LVL677
+	.2byte	0x1
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST203:
+	.8byte	.LVL676
+	.8byte	.LVL678
+	.2byte	0x1
+	.byte	0x51
+	.8byte	0
+	.8byte	0
+.LLST204:
+	.8byte	.LVL676
+	.8byte	.LVL679-1
+	.2byte	0x1
+	.byte	0x52
+	.8byte	.LVL679-1
+	.8byte	.LVL681
+	.2byte	0x1
+	.byte	0x63
+	.8byte	0
+	.8byte	0
+.LLST205:
+	.8byte	.LVL682
+	.8byte	.LVL683
+	.2byte	0x1
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST206:
+	.8byte	.LVL682
+	.8byte	.LVL684
+	.2byte	0x1
+	.byte	0x51
+	.8byte	0
+	.8byte	0
+.LLST207:
+	.8byte	.LVL682
+	.8byte	.LVL685
+	.2byte	0x1
+	.byte	0x52
+	.8byte	.LVL685
+	.8byte	.LVL688
+	.2byte	0x1
+	.byte	0x64
+	.8byte	.LVL689
+	.8byte	.LFE2856
+	.2byte	0x1
+	.byte	0x64
+	.8byte	0
+	.8byte	0
+.LLST208:
+	.8byte	.LVL691
+	.8byte	.LVL692
+	.2byte	0x1
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST209:
+	.8byte	.LVL691
+	.8byte	.LVL693
+	.2byte	0x1
+	.byte	0x51
+	.8byte	0
+	.8byte	0
+.LLST210:
+	.8byte	.LVL691
+	.8byte	.LVL694
+	.2byte	0x1
+	.byte	0x52
+	.8byte	.LVL694
+	.8byte	.LVL695-1
+	.2byte	0x1
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST220:
+	.8byte	.LVL716
+	.8byte	.LVL717-1
+	.2byte	0x1
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST221:
+	.8byte	.LVL716
+	.8byte	.LVL717-1
+	.2byte	0x1
+	.byte	0x51
+	.8byte	0
+	.8byte	0
+.LLST222:
+	.8byte	.LVL716
+	.8byte	.LVL717-1
+	.2byte	0x1
+	.byte	0x52
+	.8byte	.LVL717-1
+	.8byte	.LVL719
+	.2byte	0x1
+	.byte	0x63
+	.8byte	0
+	.8byte	0
+.LLST27:
+	.8byte	.LVL89
+	.8byte	.LVL90
+	.2byte	0x1
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST28:
+	.8byte	.LVL89
+	.8byte	.LVL91
+	.2byte	0x1
+	.byte	0x51
+	.8byte	0
+	.8byte	0
+.LLST25:
+	.8byte	.LVL85
+	.8byte	.LVL86-1
+	.2byte	0x1
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST26:
+	.8byte	.LVL85
+	.8byte	.LVL86-1
+	.2byte	0x1
+	.byte	0x51
+	.8byte	.LVL86-1
+	.8byte	.LVL88
+	.2byte	0x1
+	.byte	0x63
+	.8byte	0
+	.8byte	0
+.LLST29:
+	.8byte	.LVL93
+	.8byte	.LVL94
+	.2byte	0x1
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST30:
+	.8byte	.LVL93
+	.8byte	.LVL95
+	.2byte	0x1
+	.byte	0x51
+	.8byte	.LVL97
+	.8byte	.LVL98
+	.2byte	0x1
+	.byte	0x51
+	.8byte	.LVL286
+	.8byte	.LVL287
+	.2byte	0x1
+	.byte	0x51
+	.8byte	0
+	.8byte	0
+.LLST31:
+	.8byte	.LVL93
+	.8byte	.LVL97
+	.2byte	0x1
+	.byte	0x52
+	.8byte	.LVL97
+	.8byte	.LVL115
+	.2byte	0x1
+	.byte	0x65
+	.8byte	.LVL117
+	.8byte	.LVL234
+	.2byte	0x1
+	.byte	0x65
+	.8byte	.LVL236
+	.8byte	.LVL304
+	.2byte	0x1
+	.byte	0x65
+	.8byte	.LVL306
+	.8byte	.LFE2849
+	.2byte	0x1
+	.byte	0x65
+	.8byte	0
+	.8byte	0
+.LLST40:
+	.8byte	.LVL113
+	.8byte	.LVL117
+	.2byte	0x2
+	.byte	0x91
+	.sleb128 -12
+	.8byte	.LVL119
+	.8byte	.LVL133
+	.2byte	0x2
+	.byte	0x91
+	.sleb128 -12
+	.8byte	.LVL275
+	.8byte	.LVL277
+	.2byte	0x2
+	.byte	0x91
+	.sleb128 -12
+	.8byte	.LVL325
+	.8byte	.LVL326
+	.2byte	0x2
+	.byte	0x91
+	.sleb128 -12
+	.8byte	0
+	.8byte	0
+.LLST41:
+	.8byte	.LVL121
+	.8byte	.LVL122
+	.2byte	0x1
+	.byte	0x51
+	.8byte	.LVL123
+	.8byte	.LVL124
+	.2byte	0x1
+	.byte	0x51
+	.8byte	.LVL276
+	.8byte	.LVL277
+	.2byte	0x1
+	.byte	0x51
+	.8byte	0
+	.8byte	0
+.LLST42:
+	.8byte	.LVL113
+	.8byte	.LVL114
+	.2byte	0x1
+	.byte	0x51
+	.8byte	.LVL123
+	.8byte	.LVL126
+	.2byte	0x1
+	.byte	0x51
+	.8byte	0
+	.8byte	0
+.LLST43:
+	.8byte	.LVL120
+	.8byte	.LVL125
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL275
+	.8byte	.LVL277
+	.2byte	0x1
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST44:
+	.8byte	.LVL118
+	.8byte	.LVL122
+	.2byte	0x1
+	.byte	0x51
+	.8byte	.LVL275
+	.8byte	.LVL276
+	.2byte	0x1
+	.byte	0x51
+	.8byte	0
+	.8byte	0
+.LLST45:
+	.8byte	.LVL130
+	.8byte	.LVL132-1
+	.2byte	0x1
+	.byte	0x53
+	.8byte	0
+	.8byte	0
+.LLST46:
+	.8byte	.LVL128
+	.8byte	.LVL131
+	.2byte	0x1
+	.byte	0x51
+	.8byte	0
+	.8byte	0
+.LLST47:
+	.8byte	.LVL127
+	.8byte	.LVL129
+	.2byte	0x1
+	.byte	0x52
+	.8byte	0
+	.8byte	0
+.LLST32:
+	.8byte	.LVL110
+	.8byte	.LVL111
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL313
+	.8byte	.LVL315
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL331
+	.8byte	.LVL333
+	.2byte	0x1
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST33:
+	.8byte	.LVL101
+	.8byte	.LVL103
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL104
+	.8byte	.LVL105
+	.2byte	0x1
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST34:
+	.8byte	.LVL104
+	.8byte	.LVL110-1
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL312
+	.8byte	.LVL313
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL313
+	.8byte	.LVL316-1
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL332
+	.8byte	.LVL333
+	.2byte	0x1
+	.byte	0x53
+	.8byte	0
+	.8byte	0
+.LLST35:
+	.8byte	.LVL100
+	.8byte	.LVL106
+	.2byte	0x1
+	.byte	0x51
+	.8byte	.LVL312
+	.8byte	.LVL314
+	.2byte	0x1
+	.byte	0x51
+	.8byte	0
+	.8byte	0
+.LLST36:
+	.8byte	.LVL99
+	.8byte	.LVL101
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL102
+	.8byte	.LVL103
+	.2byte	0x1
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST37:
+	.8byte	.LVL108
+	.8byte	.LVL110-1
+	.2byte	0x1
+	.byte	0x51
+	.8byte	0
+	.8byte	0
+.LLST38:
+	.8byte	.LVL107
+	.8byte	.LVL109
+	.2byte	0x1
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST39:
+	.8byte	.LVL106
+	.8byte	.LVL108
+	.2byte	0x1
+	.byte	0x51
+	.8byte	0
+	.8byte	0
+.LLST48:
+	.8byte	.LVL140
+	.8byte	.LVL141
+	.2byte	0x1
+	.byte	0x51
+	.8byte	.LVL142
+	.8byte	.LVL143
+	.2byte	0x1
+	.byte	0x51
+	.8byte	.LVL282
+	.8byte	.LVL283
+	.2byte	0x1
+	.byte	0x51
+	.8byte	0
+	.8byte	0
+.LLST49:
+	.8byte	.LVL113
+	.8byte	.LVL114
+	.2byte	0x1
+	.byte	0x51
+	.8byte	.LVL142
+	.8byte	.LVL145
+	.2byte	0x1
+	.byte	0x51
+	.8byte	0
+	.8byte	0
+.LLST50:
+	.8byte	.LVL139
+	.8byte	.LVL144
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL281
+	.8byte	.LVL283
+	.2byte	0x1
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST51:
+	.8byte	.LVL138
+	.8byte	.LVL141
+	.2byte	0x1
+	.byte	0x51
+	.8byte	.LVL281
+	.8byte	.LVL282
+	.2byte	0x1
+	.byte	0x51
+	.8byte	0
+	.8byte	0
+.LLST52:
+	.8byte	.LVL149
+	.8byte	.LVL151-1
+	.2byte	0x1
+	.byte	0x53
+	.8byte	0
+	.8byte	0
+.LLST53:
+	.8byte	.LVL147
+	.8byte	.LVL150
+	.2byte	0x1
+	.byte	0x51
+	.8byte	0
+	.8byte	0
+.LLST54:
+	.8byte	.LVL146
+	.8byte	.LVL148
+	.2byte	0x1
+	.byte	0x52
+	.8byte	0
+	.8byte	0
+.LLST55:
+	.8byte	.LVL162
+	.8byte	.LVL163
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL319
+	.8byte	.LVL321
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL333
+	.8byte	.LFE2849
+	.2byte	0x1
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST56:
+	.8byte	.LVL154
+	.8byte	.LVL155
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL156
+	.8byte	.LVL157
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL278
+	.8byte	.LVL279
+	.2byte	0x1
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST57:
+	.8byte	.LVL156
+	.8byte	.LVL162-1
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL318
+	.8byte	.LVL319
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL319
+	.8byte	.LVL322-1
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL334
+	.8byte	.LFE2849
+	.2byte	0x1
+	.byte	0x53
+	.8byte	0
+	.8byte	0
+.LLST58:
+	.8byte	.LVL153
+	.8byte	.LVL158
+	.2byte	0x1
+	.byte	0x51
+	.8byte	.LVL277
+	.8byte	.LVL279
+	.2byte	0x1
+	.byte	0x51
+	.8byte	.LVL318
+	.8byte	.LVL320
+	.2byte	0x1
+	.byte	0x51
+	.8byte	0
+	.8byte	0
+.LLST59:
+	.8byte	.LVL152
+	.8byte	.LVL155
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL277
+	.8byte	.LVL278
+	.2byte	0x1
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST60:
+	.8byte	.LVL160
+	.8byte	.LVL162-1
+	.2byte	0x1
+	.byte	0x51
+	.8byte	0
+	.8byte	0
+.LLST61:
+	.8byte	.LVL159
+	.8byte	.LVL161
+	.2byte	0x1
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST62:
+	.8byte	.LVL158
+	.8byte	.LVL160
+	.2byte	0x1
+	.byte	0x51
+	.8byte	0
+	.8byte	0
+.LLST63:
+	.8byte	.LVL167
+	.8byte	.LVL168
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL169
+	.8byte	.LVL170
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL267
+	.8byte	.LVL268
+	.2byte	0x1
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST64:
+	.8byte	.LVL169
+	.8byte	.LVL171
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL264
+	.8byte	.LVL265
+	.2byte	0x1
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST65:
+	.8byte	.LVL113
+	.8byte	.LVL114
+	.2byte	0x1
+	.byte	0x51
+	.8byte	.LVL166
+	.8byte	.LVL172
+	.2byte	0x1
+	.byte	0x51
+	.8byte	.LVL264
+	.8byte	.LVL268
+	.2byte	0x1
+	.byte	0x51
+	.8byte	0
+	.8byte	0
+.LLST66:
+	.8byte	.LVL165
+	.8byte	.LVL168
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL266
+	.8byte	.LVL267
+	.2byte	0x1
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST67:
+	.8byte	.LVL174
+	.8byte	.LVL176-1
+	.2byte	0x1
+	.byte	0x51
+	.8byte	0
+	.8byte	0
+.LLST68:
+	.8byte	.LVL173
+	.8byte	.LVL175
+	.2byte	0x1
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST69:
+	.8byte	.LVL172
+	.8byte	.LVL174
+	.2byte	0x1
+	.byte	0x51
+	.8byte	0
+	.8byte	0
+.LLST70:
+	.8byte	.LVL184
+	.8byte	.LVL185
+	.2byte	0x1
+	.byte	0x51
+	.8byte	.LVL186
+	.8byte	.LVL187
+	.2byte	0x1
+	.byte	0x51
+	.8byte	.LVL284
+	.8byte	.LVL285
+	.2byte	0x1
+	.byte	0x51
+	.8byte	0
+	.8byte	0
+.LLST71:
+	.8byte	.LVL113
+	.8byte	.LVL114
+	.2byte	0x1
+	.byte	0x51
+	.8byte	.LVL186
+	.8byte	.LVL189
+	.2byte	0x1
+	.byte	0x51
+	.8byte	0
+	.8byte	0
+.LLST72:
+	.8byte	.LVL183
+	.8byte	.LVL188
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL283
+	.8byte	.LVL285
+	.2byte	0x1
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST73:
+	.8byte	.LVL182
+	.8byte	.LVL185
+	.2byte	0x1
+	.byte	0x51
+	.8byte	.LVL283
+	.8byte	.LVL284
+	.2byte	0x1
+	.byte	0x51
+	.8byte	0
+	.8byte	0
+.LLST74:
+	.8byte	.LVL193
+	.8byte	.LVL195-1
+	.2byte	0x1
+	.byte	0x53
+	.8byte	0
+	.8byte	0
+.LLST75:
+	.8byte	.LVL191
+	.8byte	.LVL194
+	.2byte	0x1
+	.byte	0x51
+	.8byte	0
+	.8byte	0
+.LLST76:
+	.8byte	.LVL190
+	.8byte	.LVL192
+	.2byte	0x1
+	.byte	0x52
+	.8byte	0
+	.8byte	0
+.LLST77:
+	.8byte	.LVL208
+	.8byte	.LVL209
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL307
+	.8byte	.LVL309
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL329
+	.8byte	.LVL331
+	.2byte	0x1
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST78:
+	.8byte	.LVL200
+	.8byte	.LVL201
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL202
+	.8byte	.LVL203
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL280
+	.8byte	.LVL281
+	.2byte	0x1
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST79:
+	.8byte	.LVL202
+	.8byte	.LVL208-1
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL306
+	.8byte	.LVL307
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL307
+	.8byte	.LVL310-1
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL330
+	.8byte	.LVL331
+	.2byte	0x1
+	.byte	0x53
+	.8byte	0
+	.8byte	0
+.LLST80:
+	.8byte	.LVL199
+	.8byte	.LVL204
+	.2byte	0x1
+	.byte	0x51
+	.8byte	.LVL279
+	.8byte	.LVL281
+	.2byte	0x1
+	.byte	0x51
+	.8byte	.LVL306
+	.8byte	.LVL308
+	.2byte	0x1
+	.byte	0x51
+	.8byte	0
+	.8byte	0
+.LLST81:
+	.8byte	.LVL198
+	.8byte	.LVL201
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL279
+	.8byte	.LVL280
+	.2byte	0x1
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST82:
+	.8byte	.LVL206
+	.8byte	.LVL208-1
+	.2byte	0x1
+	.byte	0x51
+	.8byte	0
+	.8byte	0
+.LLST83:
+	.8byte	.LVL205
+	.8byte	.LVL207
+	.2byte	0x1
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST84:
+	.8byte	.LVL204
+	.8byte	.LVL206
+	.2byte	0x1
+	.byte	0x51
+	.8byte	0
+	.8byte	0
+.LLST85:
+	.8byte	.LVL213
+	.8byte	.LVL214
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL215
+	.8byte	.LVL216
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL270
+	.8byte	.LVL271
+	.2byte	0x1
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST86:
+	.8byte	.LVL215
+	.8byte	.LVL217
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL289
+	.8byte	.LVL291
+	.2byte	0x1
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST87:
+	.8byte	.LVL212
+	.8byte	.LVL218
+	.2byte	0x1
+	.byte	0x51
+	.8byte	.LVL268
+	.8byte	.LVL271
+	.2byte	0x1
+	.byte	0x51
+	.8byte	.LVL289
+	.8byte	.LVL290
+	.2byte	0x1
+	.byte	0x51
+	.8byte	0
+	.8byte	0
+.LLST88:
+	.8byte	.LVL211
+	.8byte	.LVL219-1
+	.2byte	0x1
+	.byte	0x52
+	.8byte	.LVL268
+	.8byte	.LVL269
+	.2byte	0x1
+	.byte	0x52
+	.8byte	.LVL289
+	.8byte	.LVL293
+	.2byte	0x1
+	.byte	0x52
+	.8byte	0
+	.8byte	0
+.LLST89:
+	.8byte	.LVL294
+	.8byte	.LVL296-1
+	.2byte	0x1
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST90:
+	.8byte	.LVL292
+	.8byte	.LVL295
+	.2byte	0x1
+	.byte	0x51
+	.8byte	0
+	.8byte	0
+.LLST91:
+	.8byte	.LVL291
+	.8byte	.LVL294
+	.2byte	0x1
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST92:
+	.8byte	.LVL222
+	.8byte	.LVL223
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL224
+	.8byte	.LVL225
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL274
+	.8byte	.LVL275
+	.2byte	0x1
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST93:
+	.8byte	.LVL224
+	.8byte	.LVL226
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL264
+	.8byte	.LVL265
+	.2byte	0x1
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST94:
+	.8byte	.LVL113
+	.8byte	.LVL114
+	.2byte	0x1
+	.byte	0x51
+	.8byte	.LVL221
+	.8byte	.LVL227
+	.2byte	0x1
+	.byte	0x51
+	.8byte	.LVL264
+	.8byte	.LVL266
+	.2byte	0x1
+	.byte	0x51
+	.8byte	.LVL273
+	.8byte	.LVL275
+	.2byte	0x1
+	.byte	0x51
+	.8byte	0
+	.8byte	0
+.LLST95:
+	.8byte	.LVL220
+	.8byte	.LVL223
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL273
+	.8byte	.LVL274
+	.2byte	0x1
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST96:
+	.8byte	.LVL229
+	.8byte	.LVL231-1
+	.2byte	0x1
+	.byte	0x51
+	.8byte	0
+	.8byte	0
+.LLST97:
+	.8byte	.LVL228
+	.8byte	.LVL230
+	.2byte	0x1
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST98:
+	.8byte	.LVL227
+	.8byte	.LVL229
+	.2byte	0x1
+	.byte	0x51
+	.8byte	0
+	.8byte	0
+.LLST99:
+	.8byte	.LVL113
+	.8byte	.LVL116
+	.2byte	0x1
+	.byte	0x67
+	.8byte	.LVL249
+	.8byte	.LVL251
+	.2byte	0x1
+	.byte	0x67
+	.8byte	.LVL324
+	.8byte	.LVL326
+	.2byte	0x1
+	.byte	0x67
+	.8byte	.LVL326
+	.8byte	.LVL327
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL327
+	.8byte	.LVL329
+	.2byte	0x1
+	.byte	0x67
+	.8byte	0
+	.8byte	0
+.LLST100:
+	.8byte	.LVL239
+	.8byte	.LVL240
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL241
+	.8byte	.LVL242
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL272
+	.8byte	.LVL273
+	.2byte	0x1
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST101:
+	.8byte	.LVL241
+	.8byte	.LVL243
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL264
+	.8byte	.LVL265
+	.2byte	0x1
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST102:
+	.8byte	.LVL113
+	.8byte	.LVL114
+	.2byte	0x1
+	.byte	0x51
+	.8byte	.LVL238
+	.8byte	.LVL246
+	.2byte	0x1
+	.byte	0x51
+	.8byte	.LVL264
+	.8byte	.LVL266
+	.2byte	0x1
+	.byte	0x51
+	.8byte	.LVL271
+	.8byte	.LVL273
+	.2byte	0x1
+	.byte	0x51
+	.8byte	0
+	.8byte	0
+.LLST103:
+	.8byte	.LVL237
+	.8byte	.LVL240
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL271
+	.8byte	.LVL272
+	.2byte	0x1
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST104:
+	.8byte	.LVL246
+	.8byte	.LVL248-1
+	.2byte	0x1
+	.byte	0x51
+	.8byte	0
+	.8byte	0
+.LLST105:
+	.8byte	.LVL244
+	.8byte	.LVL247
+	.2byte	0x1
+	.byte	0x52
+	.8byte	0
+	.8byte	0
+.LLST106:
+	.8byte	.LVL243
+	.8byte	.LVL245
+	.2byte	0x1
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST107:
+	.8byte	.LVL256
+	.8byte	.LVL258
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL285
+	.8byte	.LVL286
+	.2byte	0x1
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST108:
+	.8byte	.LVL257
+	.8byte	.LVL260
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL297
+	.8byte	.LVL298
+	.2byte	0x1
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST109:
+	.8byte	.LVL254
+	.8byte	.LVL261-1
+	.2byte	0x1
+	.byte	0x51
+	.8byte	.LVL285
+	.8byte	.LVL286
+	.2byte	0x1
+	.byte	0x51
+	.8byte	.LVL297
+	.8byte	.LVL300
+	.2byte	0x1
+	.byte	0x51
+	.8byte	0
+	.8byte	0
+.LLST110:
+	.8byte	.LVL253
+	.8byte	.LVL255
+	.2byte	0x1
+	.byte	0x52
+	.8byte	.LVL257
+	.8byte	.LVL261-1
+	.2byte	0x1
+	.byte	0x52
+	.8byte	.LVL285
+	.8byte	.LVL286
+	.2byte	0x1
+	.byte	0x52
+	.8byte	.LVL297
+	.8byte	.LVL302
+	.2byte	0x1
+	.byte	0x52
+	.8byte	0
+	.8byte	0
+.LLST111:
+	.8byte	.LVL301
+	.8byte	.LVL303-1
+	.2byte	0x1
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST112:
+	.8byte	.LVL298
+	.8byte	.LVL301
+	.2byte	0x1
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST113:
+	.8byte	.LVL112
+	.8byte	.LVL115
+	.2byte	0x1
+	.byte	0x66
+	.8byte	.LVL259
+	.8byte	.LVL262
+	.2byte	0x1
+	.byte	0x66
+	.8byte	.LVL299
+	.8byte	.LVL304
+	.2byte	0x1
+	.byte	0x66
+	.8byte	.LVL325
+	.8byte	.LVL326
+	.2byte	0x1
+	.byte	0x66
+	.8byte	0
+	.8byte	0
+.LLST192:
+	.8byte	.LVL645
+	.8byte	.LVL646-1
+	.2byte	0x1
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST23:
+	.8byte	.LVL79
+	.8byte	.LVL80
+	.2byte	0x1
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST358:
+	.8byte	.LVL1310
+	.8byte	.LVL1311
+	.2byte	0x1
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST359:
+	.8byte	.LVL1312
+	.8byte	.LVL1320
+	.2byte	0x1
+	.byte	0x68
+	.8byte	.LVL1323
+	.8byte	.LFE2844
+	.2byte	0x1
+	.byte	0x68
+	.8byte	0
+	.8byte	0
+.LLST360:
+	.8byte	.LVL1314
+	.8byte	.LVL1318
+	.2byte	0x1
+	.byte	0x64
+	.8byte	.LVL1323
+	.8byte	.LVL1342
+	.2byte	0x1
+	.byte	0x64
+	.8byte	.LVL1369
+	.8byte	.LVL1376
+	.2byte	0x1
+	.byte	0x64
+	.8byte	.LVL1393
+	.8byte	.LVL1396
+	.2byte	0x1
+	.byte	0x64
+	.8byte	.LVL1404
+	.8byte	.LVL1428
+	.2byte	0x1
+	.byte	0x64
+	.8byte	.LVL1429
+	.8byte	.LVL1440
+	.2byte	0x1
+	.byte	0x64
+	.8byte	.LVL1444
+	.8byte	.LVL1454
+	.2byte	0x1
+	.byte	0x64
+	.8byte	.LVL1479
+	.8byte	.LVL1505
+	.2byte	0x1
+	.byte	0x64
+	.8byte	.LVL1510
+	.8byte	.LVL1512
+	.2byte	0x1
+	.byte	0x64
+	.8byte	.LVL1519
+	.8byte	.LVL1531
+	.2byte	0x1
+	.byte	0x64
+	.8byte	.LVL1541
+	.8byte	.LVL1565
+	.2byte	0x1
+	.byte	0x64
+	.8byte	.LVL1571
+	.8byte	.LVL1583
+	.2byte	0x1
+	.byte	0x64
+	.8byte	.LVL1588
+	.8byte	.LVL1608
+	.2byte	0x1
+	.byte	0x64
+	.8byte	.LVL1613
+	.8byte	.LVL1627
+	.2byte	0x1
+	.byte	0x64
+	.8byte	.LVL1630
+	.8byte	.LVL1638
+	.2byte	0x1
+	.byte	0x64
+	.8byte	0
+	.8byte	0
+.LLST361:
+	.8byte	.LVL1494
+	.8byte	.LVL1497
+	.2byte	0x1
+	.byte	0x51
+	.8byte	.LVL1520
+	.8byte	.LVL1521-1
+	.2byte	0x1
+	.byte	0x51
+	.8byte	.LVL1560
+	.8byte	.LVL1562
+	.2byte	0x1
+	.byte	0x51
+	.8byte	0
+	.8byte	0
+.LLST362:
+	.8byte	.LVL1313
+	.8byte	.LVL1321
+	.2byte	0x1
+	.byte	0x6a
+	.8byte	.LVL1323
+	.8byte	.LVL1591
+	.2byte	0x1
+	.byte	0x6a
+	.8byte	.LVL1591
+	.8byte	.LVL1592
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL1592
+	.8byte	.LFE2844
+	.2byte	0x1
+	.byte	0x6a
+	.8byte	0
+	.8byte	0
+.LLST390:
+	.8byte	.LVL1419
+	.8byte	.LVL1420
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL1532
+	.8byte	.LVL1533-1
+	.2byte	0x1
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST399:
+	.8byte	.LVL1489
+	.8byte	.LVL1490
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL1616
+	.8byte	.LVL1617-1
+	.2byte	0x1
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST391:
+	.8byte	.LVL1434
+	.8byte	.LVL1436-1
+	.2byte	0x1
+	.byte	0x51
+	.8byte	.LVL1562
+	.8byte	.LVL1563
+	.2byte	0x1
+	.byte	0x51
+	.8byte	0
+	.8byte	0
+.LLST392:
+	.8byte	.LVL1314
+	.8byte	.LVL1318
+	.2byte	0x1
+	.byte	0x64
+	.8byte	.LVL1323
+	.8byte	.LVL1342
+	.2byte	0x1
+	.byte	0x64
+	.8byte	.LVL1369
+	.8byte	.LVL1376
+	.2byte	0x1
+	.byte	0x64
+	.8byte	.LVL1393
+	.8byte	.LVL1396
+	.2byte	0x1
+	.byte	0x64
+	.8byte	.LVL1404
+	.8byte	.LVL1407
+	.2byte	0x1
+	.byte	0x64
+	.8byte	.LVL1411
+	.8byte	.LVL1428
+	.2byte	0x1
+	.byte	0x64
+	.8byte	.LVL1429
+	.8byte	.LVL1440
+	.2byte	0x1
+	.byte	0x64
+	.8byte	.LVL1444
+	.8byte	.LVL1454
+	.2byte	0x1
+	.byte	0x64
+	.8byte	.LVL1479
+	.8byte	.LVL1480
+	.2byte	0x1
+	.byte	0x64
+	.8byte	.LVL1487
+	.8byte	.LVL1492
+	.2byte	0x1
+	.byte	0x64
+	.8byte	.LVL1522
+	.8byte	.LVL1531
+	.2byte	0x1
+	.byte	0x64
+	.8byte	.LVL1543
+	.8byte	.LVL1560
+	.2byte	0x1
+	.byte	0x64
+	.8byte	.LVL1562
+	.8byte	.LVL1602
+	.2byte	0x1
+	.byte	0x64
+	.8byte	.LVL1604
+	.8byte	.LVL1608
+	.2byte	0x1
+	.byte	0x64
+	.8byte	.LVL1613
+	.8byte	.LVL1627
+	.2byte	0x1
+	.byte	0x64
+	.8byte	.LVL1630
+	.8byte	.LVL1638
+	.2byte	0x1
+	.byte	0x64
+	.8byte	0
+	.8byte	0
+.LLST393:
+	.8byte	.LVL1435
+	.8byte	.LVL1436-1
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL1585
+	.8byte	.LVL1586
+	.2byte	0x1
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST394:
+	.8byte	.LVL1568
+	.8byte	.LVL1569
+	.2byte	0x1
+	.byte	0x51
+	.8byte	.LVL1583
+	.8byte	.LVL1584
+	.2byte	0x1
+	.byte	0x51
+	.8byte	0
+	.8byte	0
+.LLST395:
+	.8byte	.LVL1448
+	.8byte	.LVL1449-1
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL1633
+	.8byte	.LVL1634-1
+	.2byte	0x1
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST407:
+	.8byte	.LVL1576
+	.8byte	.LVL1577
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL1597
+	.8byte	.LVL1598-1
+	.2byte	0x1
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST406:
+	.8byte	.LVL1576
+	.8byte	.LVL1577
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL1624
+	.8byte	.LVL1625-1
+	.2byte	0x1
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST398:
+	.8byte	.LVL1408
+	.8byte	.LVL1409
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL1483
+	.8byte	.LVL1484-1
+	.2byte	0x1
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST400:
+	.8byte	.LVL1314
+	.8byte	.LVL1319
+	.2byte	0x1
+	.byte	0x65
+	.8byte	.LVL1323
+	.8byte	.LVL1341
+	.2byte	0x1
+	.byte	0x65
+	.8byte	.LVL1369
+	.8byte	.LVL1376
+	.2byte	0x1
+	.byte	0x65
+	.8byte	.LVL1393
+	.8byte	.LVL1396
+	.2byte	0x1
+	.byte	0x65
+	.8byte	.LVL1404
+	.8byte	.LVL1495
+	.2byte	0x1
+	.byte	0x65
+	.8byte	.LVL1496
+	.8byte	.LVL1560
+	.2byte	0x1
+	.byte	0x65
+	.8byte	.LVL1561
+	.8byte	.LVL1562
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL1562
+	.8byte	.LFE2844
+	.2byte	0x1
+	.byte	0x65
+	.8byte	0
+	.8byte	0
+.LLST401:
+	.8byte	.LVL1502
+	.8byte	.LVL1503
+	.2byte	0x1
+	.byte	0x51
+	.8byte	.LVL1510
+	.8byte	.LVL1511-1
+	.2byte	0x1
+	.byte	0x51
+	.8byte	0
+	.8byte	0
+.LLST402:
+	.8byte	.LVL1314
+	.8byte	.LVL1318
+	.2byte	0x1
+	.byte	0x64
+	.8byte	.LVL1323
+	.8byte	.LVL1342
+	.2byte	0x1
+	.byte	0x64
+	.8byte	.LVL1369
+	.8byte	.LVL1376
+	.2byte	0x1
+	.byte	0x64
+	.8byte	.LVL1393
+	.8byte	.LVL1396
+	.2byte	0x1
+	.byte	0x64
+	.8byte	.LVL1404
+	.8byte	.LVL1407
+	.2byte	0x1
+	.byte	0x64
+	.8byte	.LVL1411
+	.8byte	.LVL1428
+	.2byte	0x1
+	.byte	0x64
+	.8byte	.LVL1429
+	.8byte	.LVL1440
+	.2byte	0x1
+	.byte	0x64
+	.8byte	.LVL1444
+	.8byte	.LVL1454
+	.2byte	0x1
+	.byte	0x64
+	.8byte	.LVL1479
+	.8byte	.LVL1480
+	.2byte	0x1
+	.byte	0x64
+	.8byte	.LVL1487
+	.8byte	.LVL1492
+	.2byte	0x1
+	.byte	0x64
+	.8byte	.LVL1505
+	.8byte	.LVL1512
+	.2byte	0x1
+	.byte	0x64
+	.8byte	.LVL1522
+	.8byte	.LVL1531
+	.2byte	0x1
+	.byte	0x64
+	.8byte	.LVL1541
+	.8byte	.LVL1560
+	.2byte	0x1
+	.byte	0x64
+	.8byte	.LVL1562
+	.8byte	.LVL1565
+	.2byte	0x1
+	.byte	0x64
+	.8byte	.LVL1571
+	.8byte	.LVL1583
+	.2byte	0x1
+	.byte	0x64
+	.8byte	.LVL1588
+	.8byte	.LVL1602
+	.2byte	0x1
+	.byte	0x64
+	.8byte	.LVL1604
+	.8byte	.LVL1627
+	.2byte	0x1
+	.byte	0x64
+	.8byte	.LVL1630
+	.8byte	.LVL1638
+	.2byte	0x1
+	.byte	0x64
+	.8byte	0
+	.8byte	0
+.LLST403:
+	.8byte	.LVL1510
+	.8byte	.LVL1511-1
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL1610
+	.8byte	.LVL1611
+	.2byte	0x1
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST404:
+	.8byte	.LVL1508
+	.8byte	.LVL1509
+	.2byte	0x1
+	.byte	0x51
+	.8byte	.LVL1608
+	.8byte	.LVL1609
+	.2byte	0x1
+	.byte	0x51
+	.8byte	0
+	.8byte	0
+.LLST405:
+	.8byte	.LVL1516
+	.8byte	.LVL1517
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL1537
+	.8byte	.LVL1538-1
+	.2byte	0x1
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST363:
+	.8byte	.LVL1314
+	.8byte	.LVL1318
+	.2byte	0x1
+	.byte	0x63
+	.8byte	.LVL1323
+	.8byte	.LVL1325
+	.2byte	0x1
+	.byte	0x63
+	.8byte	.LVL1404
+	.8byte	.LVL1406
+	.2byte	0x1
+	.byte	0x63
+	.8byte	.LVL1452
+	.8byte	.LVL1479
+	.2byte	0x1
+	.byte	0x63
+	.8byte	.LVL1556
+	.8byte	.LVL1558
+	.2byte	0x1
+	.byte	0x63
+	.8byte	.LVL1620
+	.8byte	.LVL1621
+	.2byte	0x1
+	.byte	0x63
+	.8byte	.LVL1627
+	.8byte	.LVL1630
+	.2byte	0x1
+	.byte	0x63
+	.8byte	.LVL1638
+	.8byte	.LFE2844
+	.2byte	0x1
+	.byte	0x63
+	.8byte	0
+	.8byte	0
+.LLST364:
+	.8byte	.LVL1458
+	.8byte	.LVL1459
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL1464
+	.8byte	.LVL1465
+	.2byte	0x1
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST365:
+	.8byte	.LVL1456
+	.8byte	.LVL1457
+	.2byte	0x1
+	.byte	0x51
+	.8byte	.LVL1462
+	.8byte	.LVL1463
+	.2byte	0x1
+	.byte	0x51
+	.8byte	0
+	.8byte	0
+.LLST396:
+	.8byte	.LVL1468
+	.8byte	.LVL1469-1
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL1471
+	.8byte	.LVL1472-1
+	.2byte	0x1
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST397:
+	.8byte	.LVL1314
+	.8byte	.LVL1315
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL1316
+	.8byte	.LVL1317
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL1477
+	.8byte	.LVL1478-1
+	.2byte	0x1
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST366:
+	.8byte	.LVL1337
+	.8byte	.LVL1372-1
+	.2byte	0x1
+	.byte	0x58
+	.8byte	.LVL1376
+	.8byte	.LVL1393
+	.2byte	0x1
+	.byte	0x58
+	.8byte	.LVL1396
+	.8byte	.LVL1404
+	.2byte	0x1
+	.byte	0x58
+	.8byte	.LVL1416
+	.8byte	.LVL1417-1
+	.2byte	0x1
+	.byte	0x58
+	.8byte	.LVL1424
+	.8byte	.LVL1425-1
+	.2byte	0x1
+	.byte	0x58
+	.8byte	0
+	.8byte	0
+.LLST367:
+	.8byte	.LVL1336
+	.8byte	.LVL1372-1
+	.2byte	0x1
+	.byte	0x5b
+	.8byte	.LVL1376
+	.8byte	.LVL1393
+	.2byte	0x1
+	.byte	0x5b
+	.8byte	.LVL1396
+	.8byte	.LVL1404
+	.2byte	0x1
+	.byte	0x5b
+	.8byte	.LVL1416
+	.8byte	.LVL1417-1
+	.2byte	0x1
+	.byte	0x5b
+	.8byte	.LVL1424
+	.8byte	.LVL1425-1
+	.2byte	0x1
+	.byte	0x5b
+	.8byte	0
+	.8byte	0
+.LLST368:
+	.8byte	.LVL1338
+	.8byte	.LVL1372-1
+	.2byte	0x1
+	.byte	0x5c
+	.8byte	.LVL1376
+	.8byte	.LVL1393
+	.2byte	0x1
+	.byte	0x5c
+	.8byte	.LVL1396
+	.8byte	.LVL1404
+	.2byte	0x1
+	.byte	0x5c
+	.8byte	.LVL1416
+	.8byte	.LVL1417-1
+	.2byte	0x1
+	.byte	0x5c
+	.8byte	.LVL1424
+	.8byte	.LVL1425-1
+	.2byte	0x1
+	.byte	0x5c
+	.8byte	0
+	.8byte	0
+.LLST369:
+	.8byte	.LVL1339
+	.8byte	.LVL1372-1
+	.2byte	0x1
+	.byte	0x5d
+	.8byte	.LVL1376
+	.8byte	.LVL1393
+	.2byte	0x1
+	.byte	0x5d
+	.8byte	.LVL1396
+	.8byte	.LVL1404
+	.2byte	0x1
+	.byte	0x5d
+	.8byte	.LVL1416
+	.8byte	.LVL1417-1
+	.2byte	0x1
+	.byte	0x5d
+	.8byte	.LVL1424
+	.8byte	.LVL1425-1
+	.2byte	0x1
+	.byte	0x5d
+	.8byte	0
+	.8byte	0
+.LLST370:
+	.8byte	.LVL1335
+	.8byte	.LVL1372-1
+	.2byte	0x1
+	.byte	0x59
+	.8byte	.LVL1376
+	.8byte	.LVL1393
+	.2byte	0x1
+	.byte	0x59
+	.8byte	.LVL1396
+	.8byte	.LVL1404
+	.2byte	0x1
+	.byte	0x59
+	.8byte	.LVL1416
+	.8byte	.LVL1417-1
+	.2byte	0x1
+	.byte	0x59
+	.8byte	.LVL1424
+	.8byte	.LVL1425-1
+	.2byte	0x1
+	.byte	0x59
+	.8byte	0
+	.8byte	0
+.LLST371:
+	.8byte	.LVL1330
+	.8byte	.LVL1340
+	.2byte	0x1
+	.byte	0x60
+	.8byte	.LVL1369
+	.8byte	.LVL1372-1
+	.2byte	0x1
+	.byte	0x60
+	.8byte	.LVL1416
+	.8byte	.LVL1417-1
+	.2byte	0x1
+	.byte	0x60
+	.8byte	.LVL1424
+	.8byte	.LVL1425-1
+	.2byte	0x1
+	.byte	0x60
+	.8byte	0
+	.8byte	0
+.LLST372:
+	.8byte	.LVL1343
+	.8byte	.LVL1359
+	.2byte	0x1
+	.byte	0x54
+	.8byte	.LVL1360
+	.8byte	.LVL1372-1
+	.2byte	0x1
+	.byte	0x54
+	.8byte	.LVL1377
+	.8byte	.LVL1384
+	.2byte	0x1
+	.byte	0x54
+	.8byte	.LVL1386
+	.8byte	.LVL1393
+	.2byte	0x1
+	.byte	0x54
+	.8byte	.LVL1397
+	.8byte	.LVL1404
+	.2byte	0x1
+	.byte	0x54
+	.8byte	.LVL1416
+	.8byte	.LVL1417-1
+	.2byte	0x1
+	.byte	0x54
+	.8byte	.LVL1424
+	.8byte	.LVL1425-1
+	.2byte	0x1
+	.byte	0x54
+	.8byte	0
+	.8byte	0
+.LLST373:
+	.8byte	.LVL1344
+	.8byte	.LVL1361
+	.2byte	0x1
+	.byte	0x56
+	.8byte	.LVL1366
+	.8byte	.LVL1368
+	.2byte	0x1
+	.byte	0x56
+	.8byte	.LVL1376
+	.8byte	.LVL1393
+	.2byte	0x1
+	.byte	0x56
+	.8byte	.LVL1396
+	.8byte	.LVL1404
+	.2byte	0x1
+	.byte	0x56
+	.8byte	0
+	.8byte	0
+.LLST374:
+	.8byte	.LVL1343
+	.8byte	.LVL1371
+	.2byte	0x1
+	.byte	0x51
+	.8byte	.LVL1376
+	.8byte	.LVL1385
+	.2byte	0x1
+	.byte	0x51
+	.8byte	.LVL1386
+	.8byte	.LVL1393
+	.2byte	0x1
+	.byte	0x51
+	.8byte	.LVL1397
+	.8byte	.LVL1404
+	.2byte	0x1
+	.byte	0x51
+	.8byte	.LVL1416
+	.8byte	.LVL1417-1
+	.2byte	0x1
+	.byte	0x51
+	.8byte	0
+	.8byte	0
+.LLST375:
+	.8byte	.LVL1343
+	.8byte	.LVL1363
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL1367
+	.8byte	.LVL1370
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL1376
+	.8byte	.LVL1393
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL1396
+	.8byte	.LVL1404
+	.2byte	0x1
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST376:
+	.8byte	.LVL1344
+	.8byte	.LVL1362
+	.2byte	0x1
+	.byte	0x52
+	.8byte	.LVL1365
+	.8byte	.LVL1368
+	.2byte	0x1
+	.byte	0x52
+	.8byte	.LVL1376
+	.8byte	.LVL1393
+	.2byte	0x1
+	.byte	0x52
+	.8byte	.LVL1396
+	.8byte	.LVL1404
+	.2byte	0x1
+	.byte	0x52
+	.8byte	0
+	.8byte	0
+.LLST377:
+	.8byte	.LVL1343
+	.8byte	.LVL1344
+	.2byte	0x1
+	.byte	0x55
+	.8byte	.LVL1362
+	.8byte	.LVL1363
+	.2byte	0x1
+	.byte	0x55
+	.8byte	.LVL1363
+	.8byte	.LVL1367
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL1368
+	.8byte	.LVL1372-1
+	.2byte	0x1
+	.byte	0x55
+	.8byte	.LVL1416
+	.8byte	.LVL1417-1
+	.2byte	0x1
+	.byte	0x55
+	.8byte	.LVL1424
+	.8byte	.LVL1425-1
+	.2byte	0x1
+	.byte	0x55
+	.8byte	0
+	.8byte	0
+.LLST378:
+	.8byte	.LVL1314
+	.8byte	.LVL1320
+	.2byte	0x1
+	.byte	0x67
+	.8byte	.LVL1323
+	.8byte	.LVL1329
+	.2byte	0x1
+	.byte	0x67
+	.8byte	.LVL1334
+	.8byte	.LFE2844
+	.2byte	0x1
+	.byte	0x67
+	.8byte	0
+	.8byte	0
+.LLST379:
+	.8byte	.LVL1331
+	.8byte	.LVL1372-1
+	.2byte	0x1
+	.byte	0x5e
+	.8byte	.LVL1376
+	.8byte	.LVL1393
+	.2byte	0x1
+	.byte	0x5e
+	.8byte	.LVL1396
+	.8byte	.LVL1404
+	.2byte	0x1
+	.byte	0x5e
+	.8byte	.LVL1416
+	.8byte	.LVL1417-1
+	.2byte	0x1
+	.byte	0x5e
+	.8byte	.LVL1424
+	.8byte	.LVL1425-1
+	.2byte	0x1
+	.byte	0x5e
+	.8byte	0
+	.8byte	0
+.LLST380:
+	.8byte	.LVL1314
+	.8byte	.LVL1319
+	.2byte	0x1
+	.byte	0x66
+	.8byte	.LVL1323
+	.8byte	.LVL1327
+	.2byte	0x1
+	.byte	0x66
+	.8byte	.LVL1332
+	.8byte	.LFE2844
+	.2byte	0x1
+	.byte	0x66
+	.8byte	0
+	.8byte	0
+.LLST381:
+	.8byte	.LVL1314
+	.8byte	.LVL1322
+	.2byte	0x1
+	.byte	0x6c
+	.8byte	.LVL1323
+	.8byte	.LVL1328
+	.2byte	0x1
+	.byte	0x6c
+	.8byte	.LVL1333
+	.8byte	.LFE2844
+	.2byte	0x1
+	.byte	0x6c
+	.8byte	0
+	.8byte	0
+.LLST382:
+	.8byte	.LVL1343
+	.8byte	.LVL1345
+	.2byte	0x1
+	.byte	0x5f
+	.8byte	.LVL1346
+	.8byte	.LVL1347
+	.2byte	0x1
+	.byte	0x5f
+	.8byte	.LVL1348
+	.8byte	.LVL1349
+	.2byte	0x1
+	.byte	0x5f
+	.8byte	.LVL1350
+	.8byte	.LVL1353
+	.2byte	0x1
+	.byte	0x5f
+	.8byte	.LVL1354
+	.8byte	.LVL1355
+	.2byte	0x1
+	.byte	0x5f
+	.8byte	.LVL1356
+	.8byte	.LVL1357
+	.2byte	0x1
+	.byte	0x5f
+	.8byte	.LVL1358
+	.8byte	.LVL1372-1
+	.2byte	0x1
+	.byte	0x5f
+	.8byte	.LVL1376
+	.8byte	.LVL1377
+	.2byte	0x1
+	.byte	0x5f
+	.8byte	.LVL1381
+	.8byte	.LVL1382
+	.2byte	0x1
+	.byte	0x5f
+	.8byte	.LVL1384
+	.8byte	.LVL1386
+	.2byte	0x1
+	.byte	0x5f
+	.8byte	.LVL1391
+	.8byte	.LVL1392
+	.2byte	0x1
+	.byte	0x5f
+	.8byte	.LVL1396
+	.8byte	.LVL1397
+	.2byte	0x1
+	.byte	0x5f
+	.8byte	.LVL1401
+	.8byte	.LVL1402
+	.2byte	0x1
+	.byte	0x5f
+	.8byte	.LVL1416
+	.8byte	.LVL1417-1
+	.2byte	0x1
+	.byte	0x5f
+	.8byte	.LVL1424
+	.8byte	.LVL1425-1
+	.2byte	0x1
+	.byte	0x5f
+	.8byte	0
+	.8byte	0
+.LLST383:
+	.8byte	.LVL1343
+	.8byte	.LVL1345
+	.2byte	0x1
+	.byte	0x5f
+	.8byte	.LVL1346
+	.8byte	.LVL1347
+	.2byte	0x1
+	.byte	0x5f
+	.8byte	.LVL1348
+	.8byte	.LVL1349
+	.2byte	0x1
+	.byte	0x5f
+	.8byte	.LVL1350
+	.8byte	.LVL1351
+	.2byte	0x1
+	.byte	0x5f
+	.8byte	.LVL1352
+	.8byte	.LVL1355
+	.2byte	0x1
+	.byte	0x5f
+	.8byte	.LVL1356
+	.8byte	.LVL1357
+	.2byte	0x1
+	.byte	0x5f
+	.8byte	.LVL1358
+	.8byte	.LVL1372-1
+	.2byte	0x1
+	.byte	0x5f
+	.8byte	.LVL1376
+	.8byte	.LVL1377
+	.2byte	0x1
+	.byte	0x5f
+	.8byte	.LVL1383
+	.8byte	.LVL1386
+	.2byte	0x1
+	.byte	0x5f
+	.8byte	.LVL1387
+	.8byte	.LVL1388
+	.2byte	0x1
+	.byte	0x5f
+	.8byte	.LVL1396
+	.8byte	.LVL1397
+	.2byte	0x1
+	.byte	0x5f
+	.8byte	.LVL1402
+	.8byte	.LVL1403
+	.2byte	0x1
+	.byte	0x5f
+	.8byte	.LVL1416
+	.8byte	.LVL1417-1
+	.2byte	0x1
+	.byte	0x5f
+	.8byte	.LVL1424
+	.8byte	.LVL1425-1
+	.2byte	0x1
+	.byte	0x5f
+	.8byte	0
+	.8byte	0
+.LLST384:
+	.8byte	.LVL1343
+	.8byte	.LVL1345
+	.2byte	0x1
+	.byte	0x5f
+	.8byte	.LVL1346
+	.8byte	.LVL1347
+	.2byte	0x1
+	.byte	0x5f
+	.8byte	.LVL1348
+	.8byte	.LVL1349
+	.2byte	0x1
+	.byte	0x5f
+	.8byte	.LVL1350
+	.8byte	.LVL1351
+	.2byte	0x1
+	.byte	0x5f
+	.8byte	.LVL1352
+	.8byte	.LVL1353
+	.2byte	0x1
+	.byte	0x5f
+	.8byte	.LVL1354
+	.8byte	.LVL1357
+	.2byte	0x1
+	.byte	0x5f
+	.8byte	.LVL1358
+	.8byte	.LVL1372-1
+	.2byte	0x1
+	.byte	0x5f
+	.8byte	.LVL1376
+	.8byte	.LVL1378
+	.2byte	0x1
+	.byte	0x5f
+	.8byte	.LVL1384
+	.8byte	.LVL1387
+	.2byte	0x1
+	.byte	0x5f
+	.8byte	.LVL1396
+	.8byte	.LVL1398
+	.2byte	0x1
+	.byte	0x5f
+	.8byte	.LVL1416
+	.8byte	.LVL1417-1
+	.2byte	0x1
+	.byte	0x5f
+	.8byte	.LVL1424
+	.8byte	.LVL1425-1
+	.2byte	0x1
+	.byte	0x5f
+	.8byte	0
+	.8byte	0
+.LLST385:
+	.8byte	.LVL1343
+	.8byte	.LVL1345
+	.2byte	0x1
+	.byte	0x5f
+	.8byte	.LVL1346
+	.8byte	.LVL1347
+	.2byte	0x1
+	.byte	0x5f
+	.8byte	.LVL1348
+	.8byte	.LVL1349
+	.2byte	0x1
+	.byte	0x5f
+	.8byte	.LVL1350
+	.8byte	.LVL1351
+	.2byte	0x1
+	.byte	0x5f
+	.8byte	.LVL1352
+	.8byte	.LVL1353
+	.2byte	0x1
+	.byte	0x5f
+	.8byte	.LVL1354
+	.8byte	.LVL1355
+	.2byte	0x1
+	.byte	0x5f
+	.8byte	.LVL1356
+	.8byte	.LVL1372-1
+	.2byte	0x1
+	.byte	0x5f
+	.8byte	.LVL1376
+	.8byte	.LVL1377
+	.2byte	0x1
+	.byte	0x5f
+	.8byte	.LVL1378
+	.8byte	.LVL1379
+	.2byte	0x1
+	.byte	0x5f
+	.8byte	.LVL1384
+	.8byte	.LVL1386
+	.2byte	0x1
+	.byte	0x5f
+	.8byte	.LVL1389
+	.8byte	.LVL1390
+	.2byte	0x1
+	.byte	0x5f
+	.8byte	.LVL1396
+	.8byte	.LVL1397
+	.2byte	0x1
+	.byte	0x5f
+	.8byte	.LVL1400
+	.8byte	.LVL1401
+	.2byte	0x1
+	.byte	0x5f
+	.8byte	.LVL1416
+	.8byte	.LVL1417-1
+	.2byte	0x1
+	.byte	0x5f
+	.8byte	.LVL1424
+	.8byte	.LVL1425-1
+	.2byte	0x1
+	.byte	0x5f
+	.8byte	0
+	.8byte	0
+.LLST386:
+	.8byte	.LVL1343
+	.8byte	.LVL1344
+	.2byte	0x1
+	.byte	0x54
+	.8byte	.LVL1359
+	.8byte	.LVL1364
+	.2byte	0x1
+	.byte	0x54
+	.8byte	.LVL1368
+	.8byte	.LVL1372-1
+	.2byte	0x1
+	.byte	0x54
+	.8byte	.LVL1376
+	.8byte	.LVL1377
+	.2byte	0x1
+	.byte	0x54
+	.8byte	.LVL1384
+	.8byte	.LVL1386
+	.2byte	0x1
+	.byte	0x54
+	.8byte	.LVL1396
+	.8byte	.LVL1397
+	.2byte	0x1
+	.byte	0x54
+	.8byte	.LVL1416
+	.8byte	.LVL1417-1
+	.2byte	0x1
+	.byte	0x54
+	.8byte	.LVL1424
+	.8byte	.LVL1425-1
+	.2byte	0x1
+	.byte	0x54
+	.8byte	0
+	.8byte	0
+.LLST387:
+	.8byte	.LVL1343
+	.8byte	.LVL1347
+	.2byte	0x1
+	.byte	0x5f
+	.8byte	.LVL1348
+	.8byte	.LVL1349
+	.2byte	0x1
+	.byte	0x5f
+	.8byte	.LVL1350
+	.8byte	.LVL1351
+	.2byte	0x1
+	.byte	0x5f
+	.8byte	.LVL1352
+	.8byte	.LVL1353
+	.2byte	0x1
+	.byte	0x5f
+	.8byte	.LVL1354
+	.8byte	.LVL1355
+	.2byte	0x1
+	.byte	0x5f
+	.8byte	.LVL1356
+	.8byte	.LVL1357
+	.2byte	0x1
+	.byte	0x5f
+	.8byte	.LVL1358
+	.8byte	.LVL1372-1
+	.2byte	0x1
+	.byte	0x5f
+	.8byte	.LVL1376
+	.8byte	.LVL1377
+	.2byte	0x1
+	.byte	0x5f
+	.8byte	.LVL1379
+	.8byte	.LVL1380
+	.2byte	0x1
+	.byte	0x5f
+	.8byte	.LVL1384
+	.8byte	.LVL1386
+	.2byte	0x1
+	.byte	0x5f
+	.8byte	.LVL1388
+	.8byte	.LVL1389
+	.2byte	0x1
+	.byte	0x5f
+	.8byte	.LVL1396
+	.8byte	.LVL1397
+	.2byte	0x1
+	.byte	0x5f
+	.8byte	.LVL1398
+	.8byte	.LVL1399
+	.2byte	0x1
+	.byte	0x5f
+	.8byte	.LVL1416
+	.8byte	.LVL1417-1
+	.2byte	0x1
+	.byte	0x5f
+	.8byte	.LVL1424
+	.8byte	.LVL1425-1
+	.2byte	0x1
+	.byte	0x5f
+	.8byte	0
+	.8byte	0
+.LLST388:
+	.8byte	.LVL1343
+	.8byte	.LVL1345
+	.2byte	0x1
+	.byte	0x5f
+	.8byte	.LVL1346
+	.8byte	.LVL1349
+	.2byte	0x1
+	.byte	0x5f
+	.8byte	.LVL1350
+	.8byte	.LVL1351
+	.2byte	0x1
+	.byte	0x5f
+	.8byte	.LVL1352
+	.8byte	.LVL1353
+	.2byte	0x1
+	.byte	0x5f
+	.8byte	.LVL1354
+	.8byte	.LVL1355
+	.2byte	0x1
+	.byte	0x5f
+	.8byte	.LVL1356
+	.8byte	.LVL1357
+	.2byte	0x1
+	.byte	0x5f
+	.8byte	.LVL1358
+	.8byte	.LVL1372-1
+	.2byte	0x1
+	.byte	0x5f
+	.8byte	.LVL1376
+	.8byte	.LVL1377
+	.2byte	0x1
+	.byte	0x5f
+	.8byte	.LVL1380
+	.8byte	.LVL1381
+	.2byte	0x1
+	.byte	0x5f
+	.8byte	.LVL1384
+	.8byte	.LVL1386
+	.2byte	0x1
+	.byte	0x5f
+	.8byte	.LVL1390
+	.8byte	.LVL1391
+	.2byte	0x1
+	.byte	0x5f
+	.8byte	.LVL1396
+	.8byte	.LVL1397
+	.2byte	0x1
+	.byte	0x5f
+	.8byte	.LVL1399
+	.8byte	.LVL1400
+	.2byte	0x1
+	.byte	0x5f
+	.8byte	.LVL1416
+	.8byte	.LVL1417-1
+	.2byte	0x1
+	.byte	0x5f
+	.8byte	.LVL1424
+	.8byte	.LVL1425-1
+	.2byte	0x1
+	.byte	0x5f
+	.8byte	0
+	.8byte	0
+.LLST389:
+	.8byte	.LVL1343
+	.8byte	.LVL1345
+	.2byte	0x1
+	.byte	0x5f
+	.8byte	.LVL1346
+	.8byte	.LVL1347
+	.2byte	0x1
+	.byte	0x5f
+	.8byte	.LVL1348
+	.8byte	.LVL1351
+	.2byte	0x1
+	.byte	0x5f
+	.8byte	.LVL1352
+	.8byte	.LVL1353
+	.2byte	0x1
+	.byte	0x5f
+	.8byte	.LVL1354
+	.8byte	.LVL1355
+	.2byte	0x1
+	.byte	0x5f
+	.8byte	.LVL1356
+	.8byte	.LVL1357
+	.2byte	0x1
+	.byte	0x5f
+	.8byte	.LVL1358
+	.8byte	.LVL1372-1
+	.2byte	0x1
+	.byte	0x5f
+	.8byte	.LVL1376
+	.8byte	.LVL1377
+	.2byte	0x1
+	.byte	0x5f
+	.8byte	.LVL1382
+	.8byte	.LVL1383
+	.2byte	0x1
+	.byte	0x5f
+	.8byte	.LVL1384
+	.8byte	.LVL1386
+	.2byte	0x1
+	.byte	0x5f
+	.8byte	.LVL1392
+	.8byte	.LVL1393
+	.2byte	0x1
+	.byte	0x5f
+	.8byte	.LVL1396
+	.8byte	.LVL1397
+	.2byte	0x1
+	.byte	0x5f
+	.8byte	.LVL1403
+	.8byte	.LVL1404
+	.2byte	0x1
+	.byte	0x5f
+	.8byte	.LVL1416
+	.8byte	.LVL1417-1
+	.2byte	0x1
+	.byte	0x5f
+	.8byte	.LVL1424
+	.8byte	.LVL1425-1
+	.2byte	0x1
+	.byte	0x5f
+	.8byte	0
+	.8byte	0
+.LLST193:
+	.8byte	.LVL647
+	.8byte	.LVL648
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL648
+	.8byte	.LVL655
+	.2byte	0x1
+	.byte	0x64
+	.8byte	.LVL658
+	.8byte	.LVL664
+	.2byte	0x1
+	.byte	0x64
+	.8byte	0
+	.8byte	0
+.LLST194:
+	.8byte	.LVL647
+	.8byte	.LVL650
+	.2byte	0x1
+	.byte	0x51
+	.8byte	.LVL650
+	.8byte	.LVL657
+	.2byte	0x1
+	.byte	0x66
+	.8byte	.LVL658
+	.8byte	.LFE2840
+	.2byte	0x1
+	.byte	0x66
+	.8byte	0
+	.8byte	0
+.LLST195:
+	.8byte	.LVL649
+	.8byte	.LVL652
+	.2byte	0x2
+	.byte	0x70
+	.sleb128 -12
+	.8byte	.LVL652
+	.8byte	.LVL659
+	.2byte	0x2
+	.byte	0x91
+	.sleb128 20
+	.8byte	.LVL659
+	.8byte	.LVL662
+	.2byte	0x2
+	.byte	0x70
+	.sleb128 -12
+	.8byte	.LVL662
+	.8byte	.LFE2840
+	.2byte	0x2
+	.byte	0x91
+	.sleb128 20
+	.8byte	0
+	.8byte	0
+.LLST408:
+	.8byte	.LVL1640
+	.8byte	.LVL1641
+	.2byte	0x1
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST293:
+	.8byte	.LVL972
+	.8byte	.LVL973
+	.2byte	0x1
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST292:
+	.8byte	.LVL942
+	.8byte	.LVL945
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL945
+	.8byte	.LVL948
+	.2byte	0x1
+	.byte	0x64
+	.8byte	.LVL948
+	.8byte	.LVL949
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL949
+	.8byte	.LVL955
+	.2byte	0x1
+	.byte	0x64
+	.8byte	.LVL955
+	.8byte	.LVL956
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL956
+	.8byte	.LVL960
+	.2byte	0x1
+	.byte	0x64
+	.8byte	.LVL961
+	.8byte	.LFE2835
+	.2byte	0x1
+	.byte	0x64
+	.8byte	0
+	.8byte	0
+.LLST240:
+	.8byte	.LVL782
+	.8byte	.LVL783
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL788
+	.8byte	.LVL789
+	.2byte	0x1
+	.byte	0x52
+	.8byte	.LVL793
+	.8byte	.LVL794
+	.2byte	0x1
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST241:
+	.8byte	.LVL782
+	.8byte	.LVL784
+	.2byte	0x1
+	.byte	0x51
+	.8byte	.LVL784
+	.8byte	.LVL797
+	.2byte	0x1
+	.byte	0x64
+	.8byte	.LVL797
+	.8byte	.LVL801
+	.2byte	0x1
+	.byte	0x6b
+	.8byte	.LVL801
+	.8byte	.LVL806
+	.2byte	0x1
+	.byte	0x64
+	.8byte	.LVL810
+	.8byte	.LFE2827
+	.2byte	0x1
+	.byte	0x64
+	.8byte	0
+	.8byte	0
+.LLST242:
+	.8byte	.LVL782
+	.8byte	.LVL796
+	.2byte	0x1
+	.byte	0x52
+	.8byte	.LVL796
+	.8byte	.LVL800
+	.2byte	0x1
+	.byte	0x5f
+	.8byte	.LVL800
+	.8byte	.LVL807
+	.2byte	0x1
+	.byte	0x65
+	.8byte	.LVL810
+	.8byte	.LFE2827
+	.2byte	0x1
+	.byte	0x65
+	.8byte	0
+	.8byte	0
+.LLST243:
+	.8byte	.LVL782
+	.8byte	.LVL795
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL795
+	.8byte	.LVL802
+	.2byte	0x1
+	.byte	0x6c
+	.8byte	.LVL802
+	.8byte	.LVL807
+	.2byte	0x1
+	.byte	0x66
+	.8byte	.LVL810
+	.8byte	.LFE2827
+	.2byte	0x1
+	.byte	0x66
+	.8byte	0
+	.8byte	0
+.LLST244:
+	.8byte	.LVL782
+	.8byte	.LVL806
+	.2byte	0x1
+	.byte	0x54
+	.8byte	.LVL810
+	.8byte	.LVL819
+	.2byte	0x1
+	.byte	0x54
+	.8byte	.LVL819
+	.8byte	.LFE2827
+	.2byte	0x1
+	.byte	0x63
+	.8byte	0
+	.8byte	0
+.LLST245:
+	.8byte	.LVL782
+	.8byte	.LVL790-1
+	.2byte	0x1
+	.byte	0x55
+	.8byte	.LVL810
+	.8byte	.LVL819
+	.2byte	0x1
+	.byte	0x55
+	.8byte	0
+	.8byte	0
+.LLST246:
+	.8byte	.LVL786
+	.8byte	.LVL808
+	.2byte	0x1
+	.byte	0x67
+	.8byte	.LVL813
+	.8byte	.LVL816
+	.2byte	0x1
+	.byte	0x67
+	.8byte	.LVL817
+	.8byte	.LFE2827
+	.2byte	0x1
+	.byte	0x67
+	.8byte	0
+	.8byte	0
+.LLST247:
+	.8byte	.LVL787
+	.8byte	.LVL809
+	.2byte	0x1
+	.byte	0x69
+	.8byte	.LVL810
+	.8byte	.LVL811
+	.2byte	0x1
+	.byte	0x69
+	.8byte	.LVL812
+	.8byte	.LVL814
+	.2byte	0x1
+	.byte	0x69
+	.8byte	.LVL815
+	.8byte	.LFE2827
+	.2byte	0x1
+	.byte	0x69
+	.8byte	0
+	.8byte	0
+.LLST248:
+	.8byte	.LVL792
+	.8byte	.LVL809
+	.2byte	0x1
+	.byte	0x6a
+	.8byte	0
+	.8byte	0
+.LLST249:
+	.8byte	.LVL791
+	.8byte	.LVL798-1
+	.2byte	0x1
+	.byte	0x59
+	.8byte	.LVL799
+	.8byte	.LVL803-1
+	.2byte	0x1
+	.byte	0x59
+	.8byte	.LVL804
+	.8byte	.LVL810
+	.2byte	0x1
+	.byte	0x59
+	.8byte	.LVL820
+	.8byte	.LFE2827
+	.2byte	0x1
+	.byte	0x59
+	.8byte	0
+	.8byte	0
+.LLST250:
+	.8byte	.LVL783
+	.8byte	.LVL785
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL805
+	.8byte	.LVL810
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL815
+	.8byte	.LVL818
+	.2byte	0x1
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST12:
+	.8byte	.LVL30
+	.8byte	.LVL39
+	.2byte	0x1
+	.byte	0x55
+	.8byte	.LVL44
+	.8byte	.LVL46
+	.2byte	0x1
+	.byte	0x55
+	.8byte	.LVL64
+	.8byte	.LVL71
+	.2byte	0x1
+	.byte	0x55
+	.8byte	0
+	.8byte	0
+.LLST13:
+	.8byte	.LVL33
+	.8byte	.LVL68
+	.2byte	0x1
+	.byte	0x62
+	.8byte	.LVL69
+	.8byte	.LFE2825
+	.2byte	0x1
+	.byte	0x62
+	.8byte	0
+	.8byte	0
+.LLST14:
+	.8byte	.LVL34
+	.8byte	.LVL67
+	.2byte	0x1
+	.byte	0x66
+	.8byte	.LVL68
+	.8byte	.LFE2825
+	.2byte	0x1
+	.byte	0x66
+	.8byte	0
+	.8byte	0
+.LLST15:
+	.8byte	.LVL36
+	.8byte	.LVL47
+	.2byte	0x1
+	.byte	0x55
+	.8byte	.LVL49
+	.8byte	.LVL51
+	.2byte	0x1
+	.byte	0x55
+	.8byte	.LVL52
+	.8byte	.LVL53
+	.2byte	0x1
+	.byte	0x55
+	.8byte	.LVL54
+	.8byte	.LVL55
+	.2byte	0x1
+	.byte	0x55
+	.8byte	.LVL56
+	.8byte	.LVL57
+	.2byte	0x1
+	.byte	0x55
+	.8byte	.LVL58
+	.8byte	.LVL59
+	.2byte	0x1
+	.byte	0x55
+	.8byte	.LVL60
+	.8byte	.LVL61
+	.2byte	0x1
+	.byte	0x55
+	.8byte	.LVL62
+	.8byte	.LVL64
+	.2byte	0x1
+	.byte	0x55
+	.8byte	.LVL65
+	.8byte	.LVL68
+	.2byte	0x1
+	.byte	0x55
+	.8byte	0
+	.8byte	0
+.LLST16:
+	.8byte	.LVL36
+	.8byte	.LVL48
+	.2byte	0x1
+	.byte	0x57
+	.8byte	.LVL50
+	.8byte	.LVL64
+	.2byte	0x1
+	.byte	0x57
+	.8byte	.LVL65
+	.8byte	.LVL68
+	.2byte	0x1
+	.byte	0x57
+	.8byte	0
+	.8byte	0
+.LLST17:
+	.8byte	.LVL37
+	.8byte	.LVL38
+	.2byte	0x1
+	.byte	0x5a
+	.8byte	.LVL45
+	.8byte	.LVL46
+	.2byte	0x1
+	.byte	0x5a
+	.8byte	0
+	.8byte	0
+.LLST18:
+	.8byte	.LVL40
+	.8byte	.LVL41
+	.2byte	0x1
+	.byte	0x58
+	.8byte	.LVL42
+	.8byte	.LVL43
+	.2byte	0x1
+	.byte	0x58
+	.8byte	.LVL50
+	.8byte	.LVL63
+	.2byte	0x1
+	.byte	0x58
+	.8byte	0
+	.8byte	0
+.LLST19:
+	.8byte	.LVL35
+	.8byte	.LVL40
+	.2byte	0x1
+	.byte	0x58
+	.8byte	.LVL43
+	.8byte	.LVL46
+	.2byte	0x1
+	.byte	0x58
+	.8byte	.LVL63
+	.8byte	.LVL64
+	.2byte	0x1
+	.byte	0x58
+	.8byte	.LVL65
+	.8byte	.LVL68
+	.2byte	0x1
+	.byte	0x58
+	.8byte	0
+	.8byte	0
+.LLST20:
+	.8byte	.LVL31
+	.8byte	.LVL66
+	.2byte	0x1
+	.byte	0x63
+	.8byte	.LVL68
+	.8byte	.LFE2825
+	.2byte	0x1
+	.byte	0x63
+	.8byte	0
+	.8byte	0
+.LLST0:
+	.8byte	.LVL0
+	.8byte	.LVL1
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL10
+	.8byte	.LVL13
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL20
+	.8byte	.LVL21
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL23
+	.8byte	.LFE2822
+	.2byte	0x1
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST1:
+	.8byte	.LVL4
+	.8byte	.LVL5
+	.2byte	0x1
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST2:
+	.8byte	.LVL3
+	.8byte	.LVL29
+	.2byte	0x1
+	.byte	0x6b
+	.8byte	0
+	.8byte	0
+.LLST3:
+	.8byte	.LVL8
+	.8byte	.LVL17
+	.2byte	0x1
+	.byte	0x57
+	.8byte	.LVL19
+	.8byte	.LFE2822
+	.2byte	0x1
+	.byte	0x57
+	.8byte	0
+	.8byte	0
+.LLST4:
+	.8byte	.LVL8
+	.8byte	.LVL18
+	.2byte	0x1
+	.byte	0x58
+	.8byte	.LVL19
+	.8byte	.LFE2822
+	.2byte	0x1
+	.byte	0x58
+	.8byte	0
+	.8byte	0
+.LLST5:
+	.8byte	.LVL8
+	.8byte	.LVL9
+	.2byte	0x1
+	.byte	0x5f
+	.8byte	.LVL11
+	.8byte	.LVL22
+	.2byte	0x1
+	.byte	0x5f
+	.8byte	.LVL24
+	.8byte	.LFE2822
+	.2byte	0x1
+	.byte	0x5f
+	.8byte	0
+	.8byte	0
+.LLST6:
+	.8byte	.LVL12
+	.8byte	.LVL13
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL15
+	.8byte	.LVL21
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL25
+	.8byte	.LFE2822
+	.2byte	0x1
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST7:
+	.8byte	.LVL14
+	.8byte	.LVL16
+	.2byte	0x1
+	.byte	0x56
+	.8byte	0
+	.8byte	0
+.LLST8:
+	.8byte	.LVL7
+	.8byte	.LVL28
+	.2byte	0x1
+	.byte	0x69
+	.8byte	0
+	.8byte	0
+.LLST9:
+	.8byte	.LVL2
+	.8byte	.LVL26
+	.2byte	0x1
+	.byte	0x65
+	.8byte	0
+	.8byte	0
+.LLST10:
+	.8byte	.LVL6
+	.8byte	.LVL27
+	.2byte	0x1
+	.byte	0x67
+	.8byte	0
+	.8byte	0
+.LLST11:
+	.8byte	.LVL4
+	.8byte	.LVL29
+	.2byte	0x1
+	.byte	0x6c
+	.8byte	0
+	.8byte	0
+.LLST114:
+	.8byte	.LVL335
+	.8byte	.LVL336
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL336
+	.8byte	.LVL478
+	.2byte	0x1
+	.byte	0x67
+	.8byte	.LVL481
+	.8byte	.LVL546
+	.2byte	0x1
+	.byte	0x67
+	.8byte	0
+	.8byte	0
+.LLST115:
+	.8byte	.LVL335
+	.8byte	.LVL338
+	.2byte	0x1
+	.byte	0x51
+	.8byte	.LVL338
+	.8byte	.LVL479
+	.2byte	0x1
+	.byte	0x6a
+	.8byte	.LVL481
+	.8byte	.LVL547
+	.2byte	0x1
+	.byte	0x6a
+	.8byte	0
+	.8byte	0
+.LLST116:
+	.8byte	.LVL335
+	.8byte	.LVL407
+	.2byte	0x1
+	.byte	0x52
+	.8byte	.LVL407
+	.8byte	.LVL476
+	.2byte	0x1
+	.byte	0x64
+	.8byte	.LVL481
+	.8byte	.LVL544
+	.2byte	0x1
+	.byte	0x64
+	.8byte	0
+	.8byte	0
+.LLST117:
+	.8byte	.LVL335
+	.8byte	.LVL405
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL405
+	.8byte	.LVL480
+	.2byte	0x1
+	.byte	0x6b
+	.8byte	.LVL481
+	.8byte	.LVL548
+	.2byte	0x1
+	.byte	0x6b
+	.8byte	0
+	.8byte	0
+.LLST118:
+	.8byte	.LVL335
+	.8byte	.LVL406
+	.2byte	0x1
+	.byte	0x54
+	.8byte	.LVL406
+	.8byte	.LVL480
+	.2byte	0x1
+	.byte	0x6c
+	.8byte	.LVL481
+	.8byte	.LVL548
+	.2byte	0x1
+	.byte	0x6c
+	.8byte	0
+	.8byte	0
+.LLST119:
+	.8byte	.LVL335
+	.8byte	.LVL476
+	.2byte	0x1
+	.byte	0x55
+	.8byte	.LVL481
+	.8byte	.LVL536
+	.2byte	0x1
+	.byte	0x63
+	.8byte	.LVL536
+	.8byte	.LVL542
+	.2byte	0x1
+	.byte	0x55
+	.8byte	.LVL542
+	.8byte	.LVL544
+	.2byte	0x1
+	.byte	0x63
+	.8byte	0
+	.8byte	0
+.LLST120:
+	.8byte	.LVL335
+	.8byte	.LVL340-1
+	.2byte	0x1
+	.byte	0x56
+	.8byte	.LVL536
+	.8byte	.LVL542
+	.2byte	0x1
+	.byte	0x56
+	.8byte	0
+	.8byte	0
+.LLST121:
+	.8byte	.LVL339
+	.8byte	.LVL477
+	.2byte	0x1
+	.byte	0x65
+	.8byte	.LVL481
+	.8byte	.LVL536
+	.2byte	0x1
+	.byte	0x65
+	.8byte	.LVL539
+	.8byte	.LVL540
+	.2byte	0x1
+	.byte	0x65
+	.8byte	.LVL541
+	.8byte	.LVL545
+	.2byte	0x1
+	.byte	0x65
+	.8byte	0
+	.8byte	0
+.LLST122:
+	.8byte	.LVL339
+	.8byte	.LVL477
+	.2byte	0x1
+	.byte	0x66
+	.8byte	.LVL481
+	.8byte	.LVL537
+	.2byte	0x1
+	.byte	0x66
+	.8byte	.LVL538
+	.8byte	.LVL545
+	.2byte	0x1
+	.byte	0x66
+	.8byte	0
+	.8byte	0
+.LLST123:
+	.8byte	.LVL341
+	.8byte	.LVL347
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL403
+	.8byte	.LVL414
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL422
+	.8byte	.LVL425
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL429
+	.8byte	.LVL432
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL436
+	.8byte	.LVL439
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL443
+	.8byte	.LVL446
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL450
+	.8byte	.LVL454
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL457
+	.8byte	.LVL461
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL464
+	.8byte	.LVL468
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL470
+	.8byte	.LVL481
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL509
+	.8byte	.LVL510
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL531
+	.8byte	.LVL533
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL543
+	.8byte	.LFE2821
+	.2byte	0x1
+	.byte	0x53
+	.8byte	0
+	.8byte	0
+.LLST124:
+	.8byte	.LVL337
+	.8byte	.LVL479
+	.2byte	0x1
+	.byte	0x69
+	.8byte	.LVL481
+	.8byte	.LVL547
+	.2byte	0x1
+	.byte	0x69
+	.8byte	0
+	.8byte	0
+.LLST125:
+	.8byte	.LVL342
+	.8byte	.LVL343
+	.2byte	0x1
+	.byte	0x59
+	.8byte	.LVL475
+	.8byte	.LVL481
+	.2byte	0x1
+	.byte	0x59
+	.8byte	0
+	.8byte	0
+.LLST126:
+	.8byte	.LVL342
+	.8byte	.LVL412
+	.2byte	0x1
+	.byte	0x52
+	.8byte	.LVL474
+	.8byte	.LVL483
+	.2byte	0x1
+	.byte	0x52
+	.8byte	.LVL485
+	.8byte	.LVL505
+	.2byte	0x1
+	.byte	0x52
+	.8byte	.LVL533
+	.8byte	.LVL536
+	.2byte	0x1
+	.byte	0x52
+	.8byte	0
+	.8byte	0
+.LLST127:
+	.8byte	.LVL344
+	.8byte	.LVL410
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL481
+	.8byte	.LVL482
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL484
+	.8byte	.LVL487
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL488
+	.8byte	.LVL490
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL491
+	.8byte	.LVL493
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL494
+	.8byte	.LVL496
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL497
+	.8byte	.LVL499
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL500
+	.8byte	.LVL502
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL503
+	.8byte	.LVL505
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL533
+	.8byte	.LVL536
+	.2byte	0x1
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST128:
+	.8byte	.LVL342
+	.8byte	.LVL348
+	.2byte	0x1
+	.byte	0x5a
+	.8byte	.LVL352
+	.8byte	.LVL413
+	.2byte	0x1
+	.byte	0x5a
+	.8byte	.LVL422
+	.8byte	.LVL426
+	.2byte	0x1
+	.byte	0x5a
+	.8byte	.LVL429
+	.8byte	.LVL433
+	.2byte	0x1
+	.byte	0x5a
+	.8byte	.LVL436
+	.8byte	.LVL440
+	.2byte	0x1
+	.byte	0x5a
+	.8byte	.LVL443
+	.8byte	.LVL447
+	.2byte	0x1
+	.byte	0x5a
+	.8byte	.LVL450
+	.8byte	.LVL453
+	.2byte	0x1
+	.byte	0x5a
+	.8byte	.LVL457
+	.8byte	.LVL460
+	.2byte	0x1
+	.byte	0x5a
+	.8byte	.LVL464
+	.8byte	.LVL465
+	.2byte	0x1
+	.byte	0x5a
+	.8byte	.LVL470
+	.8byte	.LVL505
+	.2byte	0x1
+	.byte	0x5a
+	.8byte	.LVL509
+	.8byte	.LVL510
+	.2byte	0x1
+	.byte	0x5a
+	.8byte	.LVL531
+	.8byte	.LVL536
+	.2byte	0x1
+	.byte	0x5a
+	.8byte	0
+	.8byte	0
+.LLST129:
+	.8byte	.LVL344
+	.8byte	.LVL399
+	.2byte	0x1
+	.byte	0x55
+	.8byte	.LVL402
+	.8byte	.LVL409
+	.2byte	0x1
+	.byte	0x55
+	.8byte	.LVL485
+	.8byte	.LVL505
+	.2byte	0x1
+	.byte	0x55
+	.8byte	.LVL533
+	.8byte	.LVL536
+	.2byte	0x1
+	.byte	0x55
+	.8byte	0
+	.8byte	0
+.LLST130:
+	.8byte	.LVL348
+	.8byte	.LVL352
+	.2byte	0x1
+	.byte	0x5a
+	.8byte	0
+	.8byte	0
+.LLST131:
+	.8byte	.LVL342
+	.8byte	.LVL349
+	.2byte	0x1
+	.byte	0x56
+	.8byte	.LVL353
+	.8byte	.LVL411
+	.2byte	0x1
+	.byte	0x56
+	.8byte	.LVL474
+	.8byte	.LVL505
+	.2byte	0x1
+	.byte	0x56
+	.8byte	.LVL533
+	.8byte	.LVL536
+	.2byte	0x1
+	.byte	0x56
+	.8byte	0
+	.8byte	0
+.LLST132:
+	.8byte	.LVL355
+	.8byte	.LVL359
+	.2byte	0x1
+	.byte	0x60
+	.8byte	0
+	.8byte	0
+.LLST133:
+	.8byte	.LVL342
+	.8byte	.LVL351
+	.2byte	0x1
+	.byte	0x5e
+	.8byte	.LVL354
+	.8byte	.LVL357
+	.2byte	0x1
+	.byte	0x5e
+	.8byte	.LVL360
+	.8byte	.LVL364
+	.2byte	0x1
+	.byte	0x5e
+	.8byte	.LVL368
+	.8byte	.LVL371
+	.2byte	0x1
+	.byte	0x5e
+	.8byte	.LVL375
+	.8byte	.LVL378
+	.2byte	0x1
+	.byte	0x5e
+	.8byte	.LVL382
+	.8byte	.LVL385
+	.2byte	0x1
+	.byte	0x5e
+	.8byte	.LVL389
+	.8byte	.LVL392
+	.2byte	0x1
+	.byte	0x5e
+	.8byte	.LVL396
+	.8byte	.LVL398
+	.2byte	0x1
+	.byte	0x5e
+	.8byte	.LVL402
+	.8byte	.LVL417
+	.2byte	0x1
+	.byte	0x5e
+	.8byte	.LVL422
+	.8byte	.LVL424
+	.2byte	0x1
+	.byte	0x5e
+	.8byte	.LVL429
+	.8byte	.LVL431
+	.2byte	0x1
+	.byte	0x5e
+	.8byte	.LVL436
+	.8byte	.LVL438
+	.2byte	0x1
+	.byte	0x5e
+	.8byte	.LVL443
+	.8byte	.LVL445
+	.2byte	0x1
+	.byte	0x5e
+	.8byte	.LVL450
+	.8byte	.LVL452
+	.2byte	0x1
+	.byte	0x5e
+	.8byte	.LVL457
+	.8byte	.LVL459
+	.2byte	0x1
+	.byte	0x5e
+	.8byte	.LVL464
+	.8byte	.LVL467
+	.2byte	0x1
+	.byte	0x5e
+	.8byte	.LVL470
+	.8byte	.LVL481
+	.2byte	0x1
+	.byte	0x5e
+	.8byte	.LVL485
+	.8byte	.LVL486
+	.2byte	0x1
+	.byte	0x5e
+	.8byte	.LVL498
+	.8byte	.LVL501
+	.2byte	0x1
+	.byte	0x5e
+	.8byte	.LVL509
+	.8byte	.LVL510
+	.2byte	0x1
+	.byte	0x5e
+	.8byte	.LVL531
+	.8byte	.LVL536
+	.2byte	0x1
+	.byte	0x5e
+	.8byte	0
+	.8byte	0
+.LLST134:
+	.8byte	.LVL362
+	.8byte	.LVL366
+	.2byte	0x1
+	.byte	0x60
+	.8byte	0
+	.8byte	0
+.LLST135:
+	.8byte	.LVL342
+	.8byte	.LVL351
+	.2byte	0x1
+	.byte	0x5e
+	.8byte	.LVL354
+	.8byte	.LVL357
+	.2byte	0x1
+	.byte	0x5e
+	.8byte	.LVL361
+	.8byte	.LVL364
+	.2byte	0x1
+	.byte	0x5e
+	.8byte	.LVL367
+	.8byte	.LVL371
+	.2byte	0x1
+	.byte	0x5e
+	.8byte	.LVL375
+	.8byte	.LVL378
+	.2byte	0x1
+	.byte	0x5e
+	.8byte	.LVL382
+	.8byte	.LVL385
+	.2byte	0x1
+	.byte	0x5e
+	.8byte	.LVL389
+	.8byte	.LVL392
+	.2byte	0x1
+	.byte	0x5e
+	.8byte	.LVL396
+	.8byte	.LVL398
+	.2byte	0x1
+	.byte	0x5e
+	.8byte	.LVL402
+	.8byte	.LVL417
+	.2byte	0x1
+	.byte	0x5e
+	.8byte	.LVL422
+	.8byte	.LVL424
+	.2byte	0x1
+	.byte	0x5e
+	.8byte	.LVL429
+	.8byte	.LVL431
+	.2byte	0x1
+	.byte	0x5e
+	.8byte	.LVL436
+	.8byte	.LVL438
+	.2byte	0x1
+	.byte	0x5e
+	.8byte	.LVL443
+	.8byte	.LVL445
+	.2byte	0x1
+	.byte	0x5e
+	.8byte	.LVL450
+	.8byte	.LVL452
+	.2byte	0x1
+	.byte	0x5e
+	.8byte	.LVL457
+	.8byte	.LVL459
+	.2byte	0x1
+	.byte	0x5e
+	.8byte	.LVL464
+	.8byte	.LVL467
+	.2byte	0x1
+	.byte	0x5e
+	.8byte	.LVL470
+	.8byte	.LVL481
+	.2byte	0x1
+	.byte	0x5e
+	.8byte	.LVL485
+	.8byte	.LVL486
+	.2byte	0x1
+	.byte	0x5e
+	.8byte	.LVL501
+	.8byte	.LVL504
+	.2byte	0x1
+	.byte	0x5e
+	.8byte	.LVL509
+	.8byte	.LVL510
+	.2byte	0x1
+	.byte	0x5e
+	.8byte	.LVL531
+	.8byte	.LVL536
+	.2byte	0x1
+	.byte	0x5e
+	.8byte	0
+	.8byte	0
+.LLST136:
+	.8byte	.LVL369
+	.8byte	.LVL373
+	.2byte	0x1
+	.byte	0x60
+	.8byte	0
+	.8byte	0
+.LLST137:
+	.8byte	.LVL342
+	.8byte	.LVL351
+	.2byte	0x1
+	.byte	0x5e
+	.8byte	.LVL354
+	.8byte	.LVL357
+	.2byte	0x1
+	.byte	0x5e
+	.8byte	.LVL361
+	.8byte	.LVL364
+	.2byte	0x1
+	.byte	0x5e
+	.8byte	.LVL368
+	.8byte	.LVL371
+	.2byte	0x1
+	.byte	0x5e
+	.8byte	.LVL374
+	.8byte	.LVL378
+	.2byte	0x1
+	.byte	0x5e
+	.8byte	.LVL382
+	.8byte	.LVL385
+	.2byte	0x1
+	.byte	0x5e
+	.8byte	.LVL389
+	.8byte	.LVL392
+	.2byte	0x1
+	.byte	0x5e
+	.8byte	.LVL396
+	.8byte	.LVL398
+	.2byte	0x1
+	.byte	0x5e
+	.8byte	.LVL402
+	.8byte	.LVL417
+	.2byte	0x1
+	.byte	0x5e
+	.8byte	.LVL422
+	.8byte	.LVL424
+	.2byte	0x1
+	.byte	0x5e
+	.8byte	.LVL429
+	.8byte	.LVL431
+	.2byte	0x1
+	.byte	0x5e
+	.8byte	.LVL436
+	.8byte	.LVL438
+	.2byte	0x1
+	.byte	0x5e
+	.8byte	.LVL443
+	.8byte	.LVL445
+	.2byte	0x1
+	.byte	0x5e
+	.8byte	.LVL450
+	.8byte	.LVL452
+	.2byte	0x1
+	.byte	0x5e
+	.8byte	.LVL457
+	.8byte	.LVL459
+	.2byte	0x1
+	.byte	0x5e
+	.8byte	.LVL464
+	.8byte	.LVL467
+	.2byte	0x1
+	.byte	0x5e
+	.8byte	.LVL470
+	.8byte	.LVL481
+	.2byte	0x1
+	.byte	0x5e
+	.8byte	.LVL485
+	.8byte	.LVL486
+	.2byte	0x1
+	.byte	0x5e
+	.8byte	.LVL495
+	.8byte	.LVL498
+	.2byte	0x1
+	.byte	0x5e
+	.8byte	.LVL509
+	.8byte	.LVL510
+	.2byte	0x1
+	.byte	0x5e
+	.8byte	.LVL531
+	.8byte	.LVL536
+	.2byte	0x1
+	.byte	0x5e
+	.8byte	0
+	.8byte	0
+.LLST138:
+	.8byte	.LVL376
+	.8byte	.LVL380
+	.2byte	0x1
+	.byte	0x60
+	.8byte	0
+	.8byte	0
+.LLST139:
+	.8byte	.LVL342
+	.8byte	.LVL351
+	.2byte	0x1
+	.byte	0x5e
+	.8byte	.LVL354
+	.8byte	.LVL357
+	.2byte	0x1
+	.byte	0x5e
+	.8byte	.LVL361
+	.8byte	.LVL364
+	.2byte	0x1
+	.byte	0x5e
+	.8byte	.LVL368
+	.8byte	.LVL371
+	.2byte	0x1
+	.byte	0x5e
+	.8byte	.LVL375
+	.8byte	.LVL378
+	.2byte	0x1
+	.byte	0x5e
+	.8byte	.LVL381
+	.8byte	.LVL385
+	.2byte	0x1
+	.byte	0x5e
+	.8byte	.LVL389
+	.8byte	.LVL392
+	.2byte	0x1
+	.byte	0x5e
+	.8byte	.LVL396
+	.8byte	.LVL398
+	.2byte	0x1
+	.byte	0x5e
+	.8byte	.LVL402
+	.8byte	.LVL417
+	.2byte	0x1
+	.byte	0x5e
+	.8byte	.LVL422
+	.8byte	.LVL424
+	.2byte	0x1
+	.byte	0x5e
+	.8byte	.LVL429
+	.8byte	.LVL431
+	.2byte	0x1
+	.byte	0x5e
+	.8byte	.LVL436
+	.8byte	.LVL438
+	.2byte	0x1
+	.byte	0x5e
+	.8byte	.LVL443
+	.8byte	.LVL445
+	.2byte	0x1
+	.byte	0x5e
+	.8byte	.LVL450
+	.8byte	.LVL452
+	.2byte	0x1
+	.byte	0x5e
+	.8byte	.LVL457
+	.8byte	.LVL459
+	.2byte	0x1
+	.byte	0x5e
+	.8byte	.LVL464
+	.8byte	.LVL467
+	.2byte	0x1
+	.byte	0x5e
+	.8byte	.LVL470
+	.8byte	.LVL481
+	.2byte	0x1
+	.byte	0x5e
+	.8byte	.LVL485
+	.8byte	.LVL486
+	.2byte	0x1
+	.byte	0x5e
+	.8byte	.LVL489
+	.8byte	.LVL492
+	.2byte	0x1
+	.byte	0x5e
+	.8byte	.LVL509
+	.8byte	.LVL510
+	.2byte	0x1
+	.byte	0x5e
+	.8byte	.LVL531
+	.8byte	.LVL536
+	.2byte	0x1
+	.byte	0x5e
+	.8byte	0
+	.8byte	0
+.LLST140:
+	.8byte	.LVL383
+	.8byte	.LVL387
+	.2byte	0x1
+	.byte	0x60
+	.8byte	0
+	.8byte	0
+.LLST141:
+	.8byte	.LVL342
+	.8byte	.LVL351
+	.2byte	0x1
+	.byte	0x5e
+	.8byte	.LVL354
+	.8byte	.LVL357
+	.2byte	0x1
+	.byte	0x5e
+	.8byte	.LVL361
+	.8byte	.LVL364
+	.2byte	0x1
+	.byte	0x5e
+	.8byte	.LVL368
+	.8byte	.LVL371
+	.2byte	0x1
+	.byte	0x5e
+	.8byte	.LVL375
+	.8byte	.LVL378
+	.2byte	0x1
+	.byte	0x5e
+	.8byte	.LVL382
+	.8byte	.LVL385
+	.2byte	0x1
+	.byte	0x5e
+	.8byte	.LVL388
+	.8byte	.LVL392
+	.2byte	0x1
+	.byte	0x5e
+	.8byte	.LVL396
+	.8byte	.LVL398
+	.2byte	0x1
+	.byte	0x5e
+	.8byte	.LVL402
+	.8byte	.LVL417
+	.2byte	0x1
+	.byte	0x5e
+	.8byte	.LVL422
+	.8byte	.LVL424
+	.2byte	0x1
+	.byte	0x5e
+	.8byte	.LVL429
+	.8byte	.LVL431
+	.2byte	0x1
+	.byte	0x5e
+	.8byte	.LVL436
+	.8byte	.LVL438
+	.2byte	0x1
+	.byte	0x5e
+	.8byte	.LVL443
+	.8byte	.LVL445
+	.2byte	0x1
+	.byte	0x5e
+	.8byte	.LVL450
+	.8byte	.LVL452
+	.2byte	0x1
+	.byte	0x5e
+	.8byte	.LVL457
+	.8byte	.LVL459
+	.2byte	0x1
+	.byte	0x5e
+	.8byte	.LVL464
+	.8byte	.LVL467
+	.2byte	0x1
+	.byte	0x5e
+	.8byte	.LVL470
+	.8byte	.LVL481
+	.2byte	0x1
+	.byte	0x5e
+	.8byte	.LVL485
+	.8byte	.LVL486
+	.2byte	0x1
+	.byte	0x5e
+	.8byte	.LVL492
+	.8byte	.LVL495
+	.2byte	0x1
+	.byte	0x5e
+	.8byte	.LVL509
+	.8byte	.LVL510
+	.2byte	0x1
+	.byte	0x5e
+	.8byte	.LVL531
+	.8byte	.LVL536
+	.2byte	0x1
+	.byte	0x5e
+	.8byte	0
+	.8byte	0
+.LLST142:
+	.8byte	.LVL390
+	.8byte	.LVL394
+	.2byte	0x1
+	.byte	0x60
+	.8byte	0
+	.8byte	0
+.LLST143:
+	.8byte	.LVL342
+	.8byte	.LVL351
+	.2byte	0x1
+	.byte	0x5e
+	.8byte	.LVL354
+	.8byte	.LVL357
+	.2byte	0x1
+	.byte	0x5e
+	.8byte	.LVL361
+	.8byte	.LVL364
+	.2byte	0x1
+	.byte	0x5e
+	.8byte	.LVL368
+	.8byte	.LVL371
+	.2byte	0x1
+	.byte	0x5e
+	.8byte	.LVL375
+	.8byte	.LVL378
+	.2byte	0x1
+	.byte	0x5e
+	.8byte	.LVL382
+	.8byte	.LVL385
+	.2byte	0x1
+	.byte	0x5e
+	.8byte	.LVL389
+	.8byte	.LVL392
+	.2byte	0x1
+	.byte	0x5e
+	.8byte	.LVL395
+	.8byte	.LVL398
+	.2byte	0x1
+	.byte	0x5e
+	.8byte	.LVL402
+	.8byte	.LVL417
+	.2byte	0x1
+	.byte	0x5e
+	.8byte	.LVL422
+	.8byte	.LVL424
+	.2byte	0x1
+	.byte	0x5e
+	.8byte	.LVL429
+	.8byte	.LVL431
+	.2byte	0x1
+	.byte	0x5e
+	.8byte	.LVL436
+	.8byte	.LVL438
+	.2byte	0x1
+	.byte	0x5e
+	.8byte	.LVL443
+	.8byte	.LVL445
+	.2byte	0x1
+	.byte	0x5e
+	.8byte	.LVL450
+	.8byte	.LVL452
+	.2byte	0x1
+	.byte	0x5e
+	.8byte	.LVL457
+	.8byte	.LVL459
+	.2byte	0x1
+	.byte	0x5e
+	.8byte	.LVL464
+	.8byte	.LVL467
+	.2byte	0x1
+	.byte	0x5e
+	.8byte	.LVL470
+	.8byte	.LVL481
+	.2byte	0x1
+	.byte	0x5e
+	.8byte	.LVL485
+	.8byte	.LVL489
+	.2byte	0x1
+	.byte	0x5e
+	.8byte	.LVL509
+	.8byte	.LVL510
+	.2byte	0x1
+	.byte	0x5e
+	.8byte	.LVL531
+	.8byte	.LVL536
+	.2byte	0x1
+	.byte	0x5e
+	.8byte	0
+	.8byte	0
+.LLST144:
+	.8byte	.LVL342
+	.8byte	.LVL356
+	.2byte	0x1
+	.byte	0x62
+	.8byte	.LVL361
+	.8byte	.LVL363
+	.2byte	0x1
+	.byte	0x62
+	.8byte	.LVL368
+	.8byte	.LVL370
+	.2byte	0x1
+	.byte	0x62
+	.8byte	.LVL375
+	.8byte	.LVL377
+	.2byte	0x1
+	.byte	0x62
+	.8byte	.LVL382
+	.8byte	.LVL384
+	.2byte	0x1
+	.byte	0x62
+	.8byte	.LVL389
+	.8byte	.LVL391
+	.2byte	0x1
+	.byte	0x62
+	.8byte	.LVL396
+	.8byte	.LVL423
+	.2byte	0x1
+	.byte	0x62
+	.8byte	.LVL429
+	.8byte	.LVL430
+	.2byte	0x1
+	.byte	0x62
+	.8byte	.LVL436
+	.8byte	.LVL437
+	.2byte	0x1
+	.byte	0x62
+	.8byte	.LVL443
+	.8byte	.LVL444
+	.2byte	0x1
+	.byte	0x62
+	.8byte	.LVL450
+	.8byte	.LVL451
+	.2byte	0x1
+	.byte	0x62
+	.8byte	.LVL457
+	.8byte	.LVL458
+	.2byte	0x1
+	.byte	0x62
+	.8byte	.LVL464
+	.8byte	.LVL486
+	.2byte	0x1
+	.byte	0x62
+	.8byte	.LVL504
+	.8byte	.LVL510
+	.2byte	0x1
+	.byte	0x62
+	.8byte	.LVL530
+	.8byte	.LVL536
+	.2byte	0x1
+	.byte	0x62
+	.8byte	0
+	.8byte	0
+.LLST145:
+	.8byte	.LVL401
+	.8byte	.LVL403
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL481
+	.8byte	.LVL486
+	.2byte	0x1
+	.byte	0x53
+	.8byte	0
+	.8byte	0
+.LLST146:
+	.8byte	.LVL342
+	.8byte	.LVL346
+	.2byte	0x1
+	.byte	0x55
+	.8byte	.LVL404
+	.8byte	.LVL481
+	.2byte	0x1
+	.byte	0x55
+	.8byte	.LVL505
+	.8byte	.LVL507
+	.2byte	0x1
+	.byte	0x55
+	.8byte	.LVL509
+	.8byte	.LVL533
+	.2byte	0x1
+	.byte	0x55
+	.8byte	0
+	.8byte	0
+.LLST147:
+	.8byte	.LVL342
+	.8byte	.LVL345
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL408
+	.8byte	.LVL471
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL474
+	.8byte	.LVL481
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL505
+	.8byte	.LVL506
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL508
+	.8byte	.LVL511
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL512
+	.8byte	.LVL514
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL516
+	.8byte	.LVL518
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL520
+	.8byte	.LVL522
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL523
+	.8byte	.LVL525
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL526
+	.8byte	.LVL528
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL529
+	.8byte	.LVL533
+	.2byte	0x1
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST148:
+	.8byte	.LVL342
+	.8byte	.LVL343
+	.2byte	0x1
+	.byte	0x54
+	.8byte	.LVL408
+	.8byte	.LVL415
+	.2byte	0x1
+	.byte	0x54
+	.8byte	.LVL419
+	.8byte	.LVL481
+	.2byte	0x1
+	.byte	0x54
+	.8byte	.LVL505
+	.8byte	.LVL533
+	.2byte	0x1
+	.byte	0x54
+	.8byte	0
+	.8byte	0
+.LLST149:
+	.8byte	.LVL421
+	.8byte	.LVL473
+	.2byte	0x1
+	.byte	0x52
+	.8byte	.LVL505
+	.8byte	.LVL531
+	.2byte	0x1
+	.byte	0x52
+	.8byte	.LVL532
+	.8byte	.LVL533
+	.2byte	0x1
+	.byte	0x52
+	.8byte	0
+	.8byte	0
+.LLST150:
+	.8byte	.LVL342
+	.8byte	.LVL349
+	.2byte	0x1
+	.byte	0x56
+	.8byte	.LVL404
+	.8byte	.LVL466
+	.2byte	0x1
+	.byte	0x56
+	.8byte	.LVL470
+	.8byte	.LVL481
+	.2byte	0x1
+	.byte	0x56
+	.8byte	.LVL509
+	.8byte	.LVL534
+	.2byte	0x1
+	.byte	0x56
+	.8byte	0
+	.8byte	0
+.LLST151:
+	.8byte	.LVL413
+	.8byte	.LVL418
+	.2byte	0x1
+	.byte	0x5a
+	.8byte	0
+	.8byte	0
+.LLST152:
+	.8byte	.LVL420
+	.8byte	.LVL421
+	.2byte	0x1
+	.byte	0x52
+	.8byte	0
+	.8byte	0
+.LLST153:
+	.8byte	.LVL342
+	.8byte	.LVL356
+	.2byte	0x1
+	.byte	0x62
+	.8byte	.LVL361
+	.8byte	.LVL363
+	.2byte	0x1
+	.byte	0x62
+	.8byte	.LVL368
+	.8byte	.LVL370
+	.2byte	0x1
+	.byte	0x62
+	.8byte	.LVL375
+	.8byte	.LVL377
+	.2byte	0x1
+	.byte	0x62
+	.8byte	.LVL382
+	.8byte	.LVL384
+	.2byte	0x1
+	.byte	0x62
+	.8byte	.LVL389
+	.8byte	.LVL391
+	.2byte	0x1
+	.byte	0x62
+	.8byte	.LVL396
+	.8byte	.LVL397
+	.2byte	0x1
+	.byte	0x62
+	.8byte	.LVL402
+	.8byte	.LVL430
+	.2byte	0x1
+	.byte	0x62
+	.8byte	.LVL436
+	.8byte	.LVL437
+	.2byte	0x1
+	.byte	0x62
+	.8byte	.LVL443
+	.8byte	.LVL444
+	.2byte	0x1
+	.byte	0x62
+	.8byte	.LVL450
+	.8byte	.LVL451
+	.2byte	0x1
+	.byte	0x62
+	.8byte	.LVL457
+	.8byte	.LVL458
+	.2byte	0x1
+	.byte	0x62
+	.8byte	.LVL464
+	.8byte	.LVL481
+	.2byte	0x1
+	.byte	0x62
+	.8byte	.LVL485
+	.8byte	.LVL486
+	.2byte	0x1
+	.byte	0x62
+	.8byte	.LVL504
+	.8byte	.LVL510
+	.2byte	0x1
+	.byte	0x62
+	.8byte	.LVL527
+	.8byte	.LVL536
+	.2byte	0x1
+	.byte	0x62
+	.8byte	0
+	.8byte	0
+.LLST154:
+	.8byte	.LVL342
+	.8byte	.LVL348
+	.2byte	0x1
+	.byte	0x5a
+	.8byte	.LVL404
+	.8byte	.LVL413
+	.2byte	0x1
+	.byte	0x5a
+	.8byte	.LVL422
+	.8byte	.LVL426
+	.2byte	0x1
+	.byte	0x5a
+	.8byte	.LVL428
+	.8byte	.LVL433
+	.2byte	0x1
+	.byte	0x5a
+	.8byte	.LVL436
+	.8byte	.LVL440
+	.2byte	0x1
+	.byte	0x5a
+	.8byte	.LVL443
+	.8byte	.LVL447
+	.2byte	0x1
+	.byte	0x5a
+	.8byte	.LVL450
+	.8byte	.LVL453
+	.2byte	0x1
+	.byte	0x5a
+	.8byte	.LVL457
+	.8byte	.LVL460
+	.2byte	0x1
+	.byte	0x5a
+	.8byte	.LVL464
+	.8byte	.LVL465
+	.2byte	0x1
+	.byte	0x5a
+	.8byte	.LVL470
+	.8byte	.LVL481
+	.2byte	0x1
+	.byte	0x5a
+	.8byte	.LVL509
+	.8byte	.LVL510
+	.2byte	0x1
+	.byte	0x5a
+	.8byte	.LVL527
+	.8byte	.LVL530
+	.2byte	0x1
+	.byte	0x5a
+	.8byte	.LVL531
+	.8byte	.LVL535
+	.2byte	0x1
+	.byte	0x5a
+	.8byte	0
+	.8byte	0
+.LLST155:
+	.8byte	.LVL342
+	.8byte	.LVL356
+	.2byte	0x1
+	.byte	0x62
+	.8byte	.LVL361
+	.8byte	.LVL363
+	.2byte	0x1
+	.byte	0x62
+	.8byte	.LVL368
+	.8byte	.LVL370
+	.2byte	0x1
+	.byte	0x62
+	.8byte	.LVL375
+	.8byte	.LVL377
+	.2byte	0x1
+	.byte	0x62
+	.8byte	.LVL382
+	.8byte	.LVL384
+	.2byte	0x1
+	.byte	0x62
+	.8byte	.LVL389
+	.8byte	.LVL391
+	.2byte	0x1
+	.byte	0x62
+	.8byte	.LVL396
+	.8byte	.LVL397
+	.2byte	0x1
+	.byte	0x62
+	.8byte	.LVL402
+	.8byte	.LVL423
+	.2byte	0x1
+	.byte	0x62
+	.8byte	.LVL429
+	.8byte	.LVL437
+	.2byte	0x1
+	.byte	0x62
+	.8byte	.LVL443
+	.8byte	.LVL444
+	.2byte	0x1
+	.byte	0x62
+	.8byte	.LVL450
+	.8byte	.LVL451
+	.2byte	0x1
+	.byte	0x62
+	.8byte	.LVL457
+	.8byte	.LVL458
+	.2byte	0x1
+	.byte	0x62
+	.8byte	.LVL464
+	.8byte	.LVL481
+	.2byte	0x1
+	.byte	0x62
+	.8byte	.LVL485
+	.8byte	.LVL486
+	.2byte	0x1
+	.byte	0x62
+	.8byte	.LVL504
+	.8byte	.LVL510
+	.2byte	0x1
+	.byte	0x62
+	.8byte	.LVL521
+	.8byte	.LVL524
+	.2byte	0x1
+	.byte	0x62
+	.8byte	.LVL530
+	.8byte	.LVL536
+	.2byte	0x1
+	.byte	0x62
+	.8byte	0
+	.8byte	0
+.LLST156:
+	.8byte	.LVL342
+	.8byte	.LVL348
+	.2byte	0x1
+	.byte	0x5a
+	.8byte	.LVL404
+	.8byte	.LVL413
+	.2byte	0x1
+	.byte	0x5a
+	.8byte	.LVL422
+	.8byte	.LVL426
+	.2byte	0x1
+	.byte	0x5a
+	.8byte	.LVL429
+	.8byte	.LVL433
+	.2byte	0x1
+	.byte	0x5a
+	.8byte	.LVL435
+	.8byte	.LVL440
+	.2byte	0x1
+	.byte	0x5a
+	.8byte	.LVL443
+	.8byte	.LVL447
+	.2byte	0x1
+	.byte	0x5a
+	.8byte	.LVL450
+	.8byte	.LVL453
+	.2byte	0x1
+	.byte	0x5a
+	.8byte	.LVL457
+	.8byte	.LVL460
+	.2byte	0x1
+	.byte	0x5a
+	.8byte	.LVL464
+	.8byte	.LVL465
+	.2byte	0x1
+	.byte	0x5a
+	.8byte	.LVL470
+	.8byte	.LVL481
+	.2byte	0x1
+	.byte	0x5a
+	.8byte	.LVL509
+	.8byte	.LVL510
+	.2byte	0x1
+	.byte	0x5a
+	.8byte	.LVL521
+	.8byte	.LVL524
+	.2byte	0x1
+	.byte	0x5a
+	.8byte	.LVL531
+	.8byte	.LVL535
+	.2byte	0x1
+	.byte	0x5a
+	.8byte	0
+	.8byte	0
+.LLST157:
+	.8byte	.LVL342
+	.8byte	.LVL356
+	.2byte	0x1
+	.byte	0x62
+	.8byte	.LVL361
+	.8byte	.LVL363
+	.2byte	0x1
+	.byte	0x62
+	.8byte	.LVL368
+	.8byte	.LVL370
+	.2byte	0x1
+	.byte	0x62
+	.8byte	.LVL375
+	.8byte	.LVL377
+	.2byte	0x1
+	.byte	0x62
+	.8byte	.LVL382
+	.8byte	.LVL384
+	.2byte	0x1
+	.byte	0x62
+	.8byte	.LVL389
+	.8byte	.LVL391
+	.2byte	0x1
+	.byte	0x62
+	.8byte	.LVL396
+	.8byte	.LVL397
+	.2byte	0x1
+	.byte	0x62
+	.8byte	.LVL402
+	.8byte	.LVL423
+	.2byte	0x1
+	.byte	0x62
+	.8byte	.LVL429
+	.8byte	.LVL430
+	.2byte	0x1
+	.byte	0x62
+	.8byte	.LVL436
+	.8byte	.LVL444
+	.2byte	0x1
+	.byte	0x62
+	.8byte	.LVL450
+	.8byte	.LVL451
+	.2byte	0x1
+	.byte	0x62
+	.8byte	.LVL457
+	.8byte	.LVL458
+	.2byte	0x1
+	.byte	0x62
+	.8byte	.LVL464
+	.8byte	.LVL481
+	.2byte	0x1
+	.byte	0x62
+	.8byte	.LVL485
+	.8byte	.LVL486
+	.2byte	0x1
+	.byte	0x62
+	.8byte	.LVL504
+	.8byte	.LVL510
+	.2byte	0x1
+	.byte	0x62
+	.8byte	.LVL524
+	.8byte	.LVL527
+	.2byte	0x1
+	.byte	0x62
+	.8byte	.LVL530
+	.8byte	.LVL536
+	.2byte	0x1
+	.byte	0x62
+	.8byte	0
+	.8byte	0
+.LLST158:
+	.8byte	.LVL342
+	.8byte	.LVL348
+	.2byte	0x1
+	.byte	0x5a
+	.8byte	.LVL404
+	.8byte	.LVL413
+	.2byte	0x1
+	.byte	0x5a
+	.8byte	.LVL422
+	.8byte	.LVL426
+	.2byte	0x1
+	.byte	0x5a
+	.8byte	.LVL429
+	.8byte	.LVL433
+	.2byte	0x1
+	.byte	0x5a
+	.8byte	.LVL436
+	.8byte	.LVL440
+	.2byte	0x1
+	.byte	0x5a
+	.8byte	.LVL442
+	.8byte	.LVL447
+	.2byte	0x1
+	.byte	0x5a
+	.8byte	.LVL450
+	.8byte	.LVL453
+	.2byte	0x1
+	.byte	0x5a
+	.8byte	.LVL457
+	.8byte	.LVL460
+	.2byte	0x1
+	.byte	0x5a
+	.8byte	.LVL464
+	.8byte	.LVL465
+	.2byte	0x1
+	.byte	0x5a
+	.8byte	.LVL470
+	.8byte	.LVL481
+	.2byte	0x1
+	.byte	0x5a
+	.8byte	.LVL509
+	.8byte	.LVL510
+	.2byte	0x1
+	.byte	0x5a
+	.8byte	.LVL524
+	.8byte	.LVL527
+	.2byte	0x1
+	.byte	0x5a
+	.8byte	.LVL531
+	.8byte	.LVL535
+	.2byte	0x1
+	.byte	0x5a
+	.8byte	0
+	.8byte	0
+.LLST159:
+	.8byte	.LVL342
+	.8byte	.LVL356
+	.2byte	0x1
+	.byte	0x62
+	.8byte	.LVL361
+	.8byte	.LVL363
+	.2byte	0x1
+	.byte	0x62
+	.8byte	.LVL368
+	.8byte	.LVL370
+	.2byte	0x1
+	.byte	0x62
+	.8byte	.LVL375
+	.8byte	.LVL377
+	.2byte	0x1
+	.byte	0x62
+	.8byte	.LVL382
+	.8byte	.LVL384
+	.2byte	0x1
+	.byte	0x62
+	.8byte	.LVL389
+	.8byte	.LVL391
+	.2byte	0x1
+	.byte	0x62
+	.8byte	.LVL396
+	.8byte	.LVL397
+	.2byte	0x1
+	.byte	0x62
+	.8byte	.LVL402
+	.8byte	.LVL423
+	.2byte	0x1
+	.byte	0x62
+	.8byte	.LVL429
+	.8byte	.LVL430
+	.2byte	0x1
+	.byte	0x62
+	.8byte	.LVL436
+	.8byte	.LVL437
+	.2byte	0x1
+	.byte	0x62
+	.8byte	.LVL443
+	.8byte	.LVL451
+	.2byte	0x1
+	.byte	0x62
+	.8byte	.LVL457
+	.8byte	.LVL458
+	.2byte	0x1
+	.byte	0x62
+	.8byte	.LVL464
+	.8byte	.LVL481
+	.2byte	0x1
+	.byte	0x62
+	.8byte	.LVL485
+	.8byte	.LVL486
+	.2byte	0x1
+	.byte	0x62
+	.8byte	.LVL504
+	.8byte	.LVL513
+	.2byte	0x1
+	.byte	0x62
+	.8byte	.LVL530
+	.8byte	.LVL536
+	.2byte	0x1
+	.byte	0x62
+	.8byte	0
+	.8byte	0
+.LLST160:
+	.8byte	.LVL342
+	.8byte	.LVL348
+	.2byte	0x1
+	.byte	0x5a
+	.8byte	.LVL404
+	.8byte	.LVL413
+	.2byte	0x1
+	.byte	0x5a
+	.8byte	.LVL422
+	.8byte	.LVL426
+	.2byte	0x1
+	.byte	0x5a
+	.8byte	.LVL429
+	.8byte	.LVL433
+	.2byte	0x1
+	.byte	0x5a
+	.8byte	.LVL436
+	.8byte	.LVL440
+	.2byte	0x1
+	.byte	0x5a
+	.8byte	.LVL443
+	.8byte	.LVL447
+	.2byte	0x1
+	.byte	0x5a
+	.8byte	.LVL449
+	.8byte	.LVL453
+	.2byte	0x1
+	.byte	0x5a
+	.8byte	.LVL457
+	.8byte	.LVL460
+	.2byte	0x1
+	.byte	0x5a
+	.8byte	.LVL464
+	.8byte	.LVL465
+	.2byte	0x1
+	.byte	0x5a
+	.8byte	.LVL470
+	.8byte	.LVL481
+	.2byte	0x1
+	.byte	0x5a
+	.8byte	.LVL509
+	.8byte	.LVL513
+	.2byte	0x1
+	.byte	0x5a
+	.8byte	.LVL531
+	.8byte	.LVL535
+	.2byte	0x1
+	.byte	0x5a
+	.8byte	0
+	.8byte	0
+.LLST161:
+	.8byte	.LVL342
+	.8byte	.LVL356
+	.2byte	0x1
+	.byte	0x62
+	.8byte	.LVL361
+	.8byte	.LVL363
+	.2byte	0x1
+	.byte	0x62
+	.8byte	.LVL368
+	.8byte	.LVL370
+	.2byte	0x1
+	.byte	0x62
+	.8byte	.LVL375
+	.8byte	.LVL377
+	.2byte	0x1
+	.byte	0x62
+	.8byte	.LVL382
+	.8byte	.LVL384
+	.2byte	0x1
+	.byte	0x62
+	.8byte	.LVL389
+	.8byte	.LVL391
+	.2byte	0x1
+	.byte	0x62
+	.8byte	.LVL396
+	.8byte	.LVL397
+	.2byte	0x1
+	.byte	0x62
+	.8byte	.LVL402
+	.8byte	.LVL423
+	.2byte	0x1
+	.byte	0x62
+	.8byte	.LVL429
+	.8byte	.LVL430
+	.2byte	0x1
+	.byte	0x62
+	.8byte	.LVL436
+	.8byte	.LVL437
+	.2byte	0x1
+	.byte	0x62
+	.8byte	.LVL443
+	.8byte	.LVL444
+	.2byte	0x1
+	.byte	0x62
+	.8byte	.LVL450
+	.8byte	.LVL458
+	.2byte	0x1
+	.byte	0x62
+	.8byte	.LVL464
+	.8byte	.LVL481
+	.2byte	0x1
+	.byte	0x62
+	.8byte	.LVL485
+	.8byte	.LVL486
+	.2byte	0x1
+	.byte	0x62
+	.8byte	.LVL504
+	.8byte	.LVL510
+	.2byte	0x1
+	.byte	0x62
+	.8byte	.LVL513
+	.8byte	.LVL517
+	.2byte	0x1
+	.byte	0x62
+	.8byte	.LVL530
+	.8byte	.LVL536
+	.2byte	0x1
+	.byte	0x62
+	.8byte	0
+	.8byte	0
+.LLST162:
+	.8byte	.LVL456
+	.8byte	.LVL461
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL464
+	.8byte	.LVL468
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL470
+	.8byte	.LVL472
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL509
+	.8byte	.LVL510
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL513
+	.8byte	.LVL515
+	.2byte	0x1
+	.byte	0x53
+	.8byte	0
+	.8byte	0
+.LLST163:
+	.8byte	.LVL342
+	.8byte	.LVL356
+	.2byte	0x1
+	.byte	0x62
+	.8byte	.LVL361
+	.8byte	.LVL363
+	.2byte	0x1
+	.byte	0x62
+	.8byte	.LVL368
+	.8byte	.LVL370
+	.2byte	0x1
+	.byte	0x62
+	.8byte	.LVL375
+	.8byte	.LVL377
+	.2byte	0x1
+	.byte	0x62
+	.8byte	.LVL382
+	.8byte	.LVL384
+	.2byte	0x1
+	.byte	0x62
+	.8byte	.LVL389
+	.8byte	.LVL391
+	.2byte	0x1
+	.byte	0x62
+	.8byte	.LVL396
+	.8byte	.LVL397
+	.2byte	0x1
+	.byte	0x62
+	.8byte	.LVL402
+	.8byte	.LVL423
+	.2byte	0x1
+	.byte	0x62
+	.8byte	.LVL429
+	.8byte	.LVL430
+	.2byte	0x1
+	.byte	0x62
+	.8byte	.LVL436
+	.8byte	.LVL437
+	.2byte	0x1
+	.byte	0x62
+	.8byte	.LVL443
+	.8byte	.LVL444
+	.2byte	0x1
+	.byte	0x62
+	.8byte	.LVL450
+	.8byte	.LVL451
+	.2byte	0x1
+	.byte	0x62
+	.8byte	.LVL457
+	.8byte	.LVL481
+	.2byte	0x1
+	.byte	0x62
+	.8byte	.LVL485
+	.8byte	.LVL486
+	.2byte	0x1
+	.byte	0x62
+	.8byte	.LVL504
+	.8byte	.LVL510
+	.2byte	0x1
+	.byte	0x62
+	.8byte	.LVL517
+	.8byte	.LVL521
+	.2byte	0x1
+	.byte	0x62
+	.8byte	.LVL530
+	.8byte	.LVL536
+	.2byte	0x1
+	.byte	0x62
+	.8byte	0
+	.8byte	0
+.LLST164:
+	.8byte	.LVL463
+	.8byte	.LVL468
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL470
+	.8byte	.LVL472
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL509
+	.8byte	.LVL510
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL517
+	.8byte	.LVL519
+	.2byte	0x1
+	.byte	0x53
+	.8byte	0
+	.8byte	0
+.LLST165:
+	.8byte	.LVL342
+	.8byte	.LVL350
+	.2byte	0x1
+	.byte	0x5f
+	.8byte	.LVL354
+	.8byte	.LVL358
+	.2byte	0x1
+	.byte	0x5f
+	.8byte	.LVL361
+	.8byte	.LVL365
+	.2byte	0x1
+	.byte	0x5f
+	.8byte	.LVL368
+	.8byte	.LVL372
+	.2byte	0x1
+	.byte	0x5f
+	.8byte	.LVL375
+	.8byte	.LVL379
+	.2byte	0x1
+	.byte	0x5f
+	.8byte	.LVL382
+	.8byte	.LVL386
+	.2byte	0x1
+	.byte	0x5f
+	.8byte	.LVL389
+	.8byte	.LVL393
+	.2byte	0x1
+	.byte	0x5f
+	.8byte	.LVL396
+	.8byte	.LVL400
+	.2byte	0x1
+	.byte	0x5f
+	.8byte	.LVL402
+	.8byte	.LVL416
+	.2byte	0x1
+	.byte	0x5f
+	.8byte	.LVL422
+	.8byte	.LVL427
+	.2byte	0x1
+	.byte	0x5f
+	.8byte	.LVL429
+	.8byte	.LVL434
+	.2byte	0x1
+	.byte	0x5f
+	.8byte	.LVL436
+	.8byte	.LVL441
+	.2byte	0x1
+	.byte	0x5f
+	.8byte	.LVL443
+	.8byte	.LVL448
+	.2byte	0x1
+	.byte	0x5f
+	.8byte	.LVL450
+	.8byte	.LVL455
+	.2byte	0x1
+	.byte	0x5f
+	.8byte	.LVL457
+	.8byte	.LVL462
+	.2byte	0x1
+	.byte	0x5f
+	.8byte	.LVL464
+	.8byte	.LVL481
+	.2byte	0x1
+	.byte	0x5f
+	.8byte	.LVL485
+	.8byte	.LVL486
+	.2byte	0x1
+	.byte	0x5f
+	.8byte	.LVL505
+	.8byte	.LVL510
+	.2byte	0x1
+	.byte	0x5f
+	.8byte	.LVL531
+	.8byte	.LVL536
+	.2byte	0x1
+	.byte	0x5f
+	.8byte	0
+	.8byte	0
+.LLST166:
+	.8byte	.LVL469
+	.8byte	.LVL472
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL505
+	.8byte	.LVL510
+	.2byte	0x1
+	.byte	0x53
+	.8byte	0
+	.8byte	0
+.LLST167:
+	.8byte	.LVL549
+	.8byte	.LVL551
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL551
+	.8byte	.LVL556-1
+	.2byte	0x1
+	.byte	0x55
+	.8byte	.LVL557
+	.8byte	.LVL559
+	.2byte	0x1
+	.byte	0x55
+	.8byte	.LVL559
+	.8byte	.LVL594
+	.2byte	0x1
+	.byte	0x66
+	.8byte	.LVL598
+	.8byte	.LVL619
+	.2byte	0x1
+	.byte	0x66
+	.8byte	.LVL619
+	.8byte	.LVL620
+	.2byte	0x1
+	.byte	0x55
+	.8byte	.LVL620
+	.8byte	.LVL625
+	.2byte	0x1
+	.byte	0x66
+	.8byte	.LVL629
+	.8byte	.LFE2820
+	.2byte	0x1
+	.byte	0x55
+	.8byte	0
+	.8byte	0
+.LLST168:
+	.8byte	.LVL549
+	.8byte	.LVL594
+	.2byte	0x1
+	.byte	0x51
+	.8byte	.LVL598
+	.8byte	.LVL625
+	.2byte	0x1
+	.byte	0x65
+	.8byte	.LVL629
+	.8byte	.LFE2820
+	.2byte	0x1
+	.byte	0x65
+	.8byte	0
+	.8byte	0
+.LLST169:
+	.8byte	.LVL549
+	.8byte	.LVL593
+	.2byte	0x1
+	.byte	0x52
+	.8byte	.LVL598
+	.8byte	.LVL624
+	.2byte	0x1
+	.byte	0x64
+	.8byte	.LVL629
+	.8byte	.LFE2820
+	.2byte	0x1
+	.byte	0x64
+	.8byte	0
+	.8byte	0
+.LLST170:
+	.8byte	.LVL549
+	.8byte	.LVL595
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL598
+	.8byte	.LVL626
+	.2byte	0x1
+	.byte	0x68
+	.8byte	.LVL629
+	.8byte	.LFE2820
+	.2byte	0x1
+	.byte	0x68
+	.8byte	0
+	.8byte	0
+.LLST171:
+	.8byte	.LVL549
+	.8byte	.LVL596
+	.2byte	0x1
+	.byte	0x54
+	.8byte	.LVL598
+	.8byte	.LVL627
+	.2byte	0x1
+	.byte	0x69
+	.8byte	.LVL629
+	.8byte	.LFE2820
+	.2byte	0x1
+	.byte	0x69
+	.8byte	0
+	.8byte	0
+.LLST172:
+	.8byte	.LVL549
+	.8byte	.LVL550
+	.2byte	0x1
+	.byte	0x55
+	.8byte	.LVL550
+	.8byte	.LVL593
+	.2byte	0x1
+	.byte	0x63
+	.8byte	.LVL598
+	.8byte	.LVL624
+	.2byte	0x1
+	.byte	0x63
+	.8byte	.LVL629
+	.8byte	.LFE2820
+	.2byte	0x1
+	.byte	0x63
+	.8byte	0
+	.8byte	0
+.LLST173:
+	.8byte	.LVL549
+	.8byte	.LVL556-1
+	.2byte	0x1
+	.byte	0x56
+	.8byte	.LVL619
+	.8byte	.LVL621-1
+	.2byte	0x1
+	.byte	0x56
+	.8byte	.LVL629
+	.8byte	.LFE2820
+	.2byte	0x1
+	.byte	0x56
+	.8byte	0
+	.8byte	0
+.LLST174:
+	.8byte	.LVL554
+	.8byte	.LVL595
+	.2byte	0x1
+	.byte	0x67
+	.8byte	.LVL598
+	.8byte	.LVL626
+	.2byte	0x1
+	.byte	0x67
+	.8byte	.LVL630
+	.8byte	.LVL632
+	.2byte	0x1
+	.byte	0x67
+	.8byte	.LVL633
+	.8byte	.LFE2820
+	.2byte	0x1
+	.byte	0x67
+	.8byte	0
+	.8byte	0
+.LLST175:
+	.8byte	.LVL553
+	.8byte	.LVL596
+	.2byte	0x1
+	.byte	0x6a
+	.8byte	.LVL598
+	.8byte	.LVL627
+	.2byte	0x1
+	.byte	0x6a
+	.8byte	.LVL631
+	.8byte	.LFE2820
+	.2byte	0x1
+	.byte	0x6a
+	.8byte	0
+	.8byte	0
+.LLST176:
+	.8byte	.LVL561
+	.8byte	.LVL562
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL592
+	.8byte	.LVL598
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL623
+	.8byte	.LVL629
+	.2byte	0x1
+	.byte	0x53
+	.8byte	0
+	.8byte	0
+.LLST177:
+	.8byte	.LVL552
+	.8byte	.LVL597
+	.2byte	0x1
+	.byte	0x6c
+	.8byte	.LVL598
+	.8byte	.LVL628
+	.2byte	0x1
+	.byte	0x6c
+	.8byte	.LVL629
+	.8byte	.LFE2820
+	.2byte	0x1
+	.byte	0x6c
+	.8byte	0
+	.8byte	0
+.LLST178:
+	.8byte	.LVL555
+	.8byte	.LVL556-1
+	.2byte	0x1
+	.byte	0x5d
+	.8byte	.LVL558
+	.8byte	.LVL560
+	.2byte	0x1
+	.byte	0x5d
+	.8byte	.LVL619
+	.8byte	.LVL621-1
+	.2byte	0x1
+	.byte	0x5d
+	.8byte	.LVL622
+	.8byte	.LVL629
+	.2byte	0x1
+	.byte	0x5d
+	.8byte	0
+	.8byte	0
+.LLST179:
+	.8byte	.LVL561
+	.8byte	.LVL600
+	.2byte	0x1
+	.byte	0x52
+	.8byte	.LVL602
+	.8byte	.LVL619
+	.2byte	0x1
+	.byte	0x52
+	.8byte	0
+	.8byte	0
+.LLST180:
+	.8byte	.LVL561
+	.8byte	.LVL599
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL601
+	.8byte	.LVL604
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL605
+	.8byte	.LVL606
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL607
+	.8byte	.LVL608
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL609
+	.8byte	.LVL611
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL612
+	.8byte	.LVL614
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL615
+	.8byte	.LVL616
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL617
+	.8byte	.LVL619
+	.2byte	0x1
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST181:
+	.8byte	.LVL561
+	.8byte	.LVL563
+	.2byte	0x1
+	.byte	0x5e
+	.8byte	.LVL565
+	.8byte	.LVL619
+	.2byte	0x1
+	.byte	0x5e
+	.8byte	0
+	.8byte	0
+.LLST182:
+	.8byte	.LVL561
+	.8byte	.LVL619
+	.2byte	0x1
+	.byte	0x54
+	.8byte	0
+	.8byte	0
+.LLST183:
+	.8byte	.LVL561
+	.8byte	.LVL590
+	.2byte	0x1
+	.byte	0x55
+	.8byte	.LVL591
+	.8byte	.LVL598
+	.2byte	0x1
+	.byte	0x55
+	.8byte	.LVL602
+	.8byte	.LVL619
+	.2byte	0x1
+	.byte	0x55
+	.8byte	0
+	.8byte	0
+.LLST184:
+	.8byte	.LVL563
+	.8byte	.LVL565
+	.2byte	0x1
+	.byte	0x5e
+	.8byte	0
+	.8byte	0
+.LLST185:
+	.8byte	.LVL567
+	.8byte	.LVL569
+	.2byte	0x1
+	.byte	0x60
+	.8byte	0
+	.8byte	0
+.LLST186:
+	.8byte	.LVL571
+	.8byte	.LVL573
+	.2byte	0x1
+	.byte	0x60
+	.8byte	0
+	.8byte	0
+.LLST187:
+	.8byte	.LVL575
+	.8byte	.LVL577
+	.2byte	0x1
+	.byte	0x60
+	.8byte	0
+	.8byte	0
+.LLST188:
+	.8byte	.LVL561
+	.8byte	.LVL564
+	.2byte	0x1
+	.byte	0x62
+	.8byte	.LVL566
+	.8byte	.LVL568
+	.2byte	0x1
+	.byte	0x62
+	.8byte	.LVL570
+	.8byte	.LVL572
+	.2byte	0x1
+	.byte	0x62
+	.8byte	.LVL574
+	.8byte	.LVL576
+	.2byte	0x1
+	.byte	0x62
+	.8byte	.LVL578
+	.8byte	.LVL582
+	.2byte	0x1
+	.byte	0x62
+	.8byte	.LVL584
+	.8byte	.LVL586
+	.2byte	0x1
+	.byte	0x62
+	.8byte	.LVL588
+	.8byte	.LVL589
+	.2byte	0x1
+	.byte	0x62
+	.8byte	.LVL591
+	.8byte	.LVL598
+	.2byte	0x1
+	.byte	0x62
+	.8byte	.LVL602
+	.8byte	.LVL603
+	.2byte	0x1
+	.byte	0x62
+	.8byte	.LVL610
+	.8byte	.LVL613
+	.2byte	0x1
+	.byte	0x62
+	.8byte	.LVL618
+	.8byte	.LVL619
+	.2byte	0x1
+	.byte	0x62
+	.8byte	0
+	.8byte	0
+.LLST189:
+	.8byte	.LVL581
+	.8byte	.LVL583
+	.2byte	0x1
+	.byte	0x60
+	.8byte	0
+	.8byte	0
+.LLST190:
+	.8byte	.LVL585
+	.8byte	.LVL587
+	.2byte	0x1
+	.byte	0x60
+	.8byte	0
+	.8byte	0
+.LLST191:
+	.8byte	.LVL561
+	.8byte	.LVL564
+	.2byte	0x1
+	.byte	0x62
+	.8byte	.LVL566
+	.8byte	.LVL568
+	.2byte	0x1
+	.byte	0x62
+	.8byte	.LVL570
+	.8byte	.LVL572
+	.2byte	0x1
+	.byte	0x62
+	.8byte	.LVL574
+	.8byte	.LVL576
+	.2byte	0x1
+	.byte	0x62
+	.8byte	.LVL578
+	.8byte	.LVL579
+	.2byte	0x1
+	.byte	0x62
+	.8byte	.LVL580
+	.8byte	.LVL582
+	.2byte	0x1
+	.byte	0x62
+	.8byte	.LVL584
+	.8byte	.LVL586
+	.2byte	0x1
+	.byte	0x62
+	.8byte	.LVL588
+	.8byte	.LVL603
+	.2byte	0x1
+	.byte	0x62
+	.8byte	.LVL618
+	.8byte	.LVL619
+	.2byte	0x1
+	.byte	0x62
+	.8byte	0
+	.8byte	0
+.LLST354:
+	.8byte	.LVL1297
+	.8byte	.LVL1302
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL1309
+	.8byte	.LFE2819
+	.2byte	0x1
+	.byte	0x53
+	.8byte	0
+	.8byte	0
+.LLST355:
+	.8byte	.LVL1301
+	.8byte	.LVL1304
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL1308
+	.8byte	.LFE2819
+	.2byte	0x1
+	.byte	0x53
+	.8byte	0
+	.8byte	0
+.LLST356:
+	.8byte	.LVL1303
+	.8byte	.LVL1306
+	.2byte	0x1
+	.byte	0x54
+	.8byte	0
+	.8byte	0
+.LLST357:
+	.8byte	.LVL1305
+	.8byte	.LVL1307
+	.2byte	0x1
+	.byte	0x53
+	.8byte	0
+	.8byte	0
+.LLST334:
+	.8byte	.LVL1212
+	.8byte	.LVL1219
+	.2byte	0x1
+	.byte	0x55
+	.8byte	.LVL1230
+	.8byte	.LVL1233
+	.2byte	0x1
+	.byte	0x55
+	.8byte	.LVL1234
+	.8byte	.LVL1235
+	.2byte	0x1
+	.byte	0x55
+	.8byte	0
+	.8byte	0
+.LLST335:
+	.8byte	.LVL1213
+	.8byte	.LVL1231
+	.2byte	0x1
+	.byte	0x63
+	.8byte	.LVL1233
+	.8byte	.LFE2818
+	.2byte	0x1
+	.byte	0x63
+	.8byte	0
+	.8byte	0
+.LLST336:
+	.8byte	.LVL1218
+	.8byte	.LVL1228
+	.2byte	0x1
+	.byte	0x56
+	.8byte	.LVL1233
+	.8byte	.LVL1248
+	.2byte	0x1
+	.byte	0x56
+	.8byte	.LVL1250
+	.8byte	.LFE2818
+	.2byte	0x1
+	.byte	0x56
+	.8byte	0
+	.8byte	0
+.LLST337:
+	.8byte	.LVL1216
+	.8byte	.LVL1248
+	.2byte	0x1
+	.byte	0x5b
+	.8byte	.LVL1248
+	.8byte	.LVL1249
+	.2byte	0x1
+	.byte	0x57
+	.8byte	.LVL1249
+	.8byte	.LFE2818
+	.2byte	0x1
+	.byte	0x5b
+	.8byte	0
+	.8byte	0
+.LLST338:
+	.8byte	.LVL1215
+	.8byte	.LVL1232
+	.2byte	0x1
+	.byte	0x6e
+	.8byte	.LVL1233
+	.8byte	.LFE2818
+	.2byte	0x1
+	.byte	0x6e
+	.8byte	0
+	.8byte	0
+.LLST344:
+	.8byte	.LVL1220
+	.8byte	.LVL1221
+	.2byte	0x1
+	.byte	0x57
+	.8byte	.LVL1256
+	.8byte	.LVL1257
+	.2byte	0x1
+	.byte	0x57
+	.8byte	.LVL1262
+	.8byte	.LVL1263
+	.2byte	0x1
+	.byte	0x57
+	.8byte	.LVL1273
+	.8byte	.LVL1274
+	.2byte	0x1
+	.byte	0x57
+	.8byte	0
+	.8byte	0
+.LLST345:
+	.8byte	.LVL1221
+	.8byte	.LVL1222
+	.2byte	0x1
+	.byte	0x57
+	.8byte	.LVL1255
+	.8byte	.LVL1256
+	.2byte	0x1
+	.byte	0x57
+	.8byte	.LVL1260
+	.8byte	.LVL1261
+	.2byte	0x1
+	.byte	0x57
+	.8byte	.LVL1272
+	.8byte	.LVL1273
+	.2byte	0x1
+	.byte	0x57
+	.8byte	0
+	.8byte	0
+.LLST339:
+	.8byte	.LVL1222
+	.8byte	.LVL1223
+	.2byte	0x1
+	.byte	0x57
+	.8byte	.LVL1251
+	.8byte	.LVL1252
+	.2byte	0x1
+	.byte	0x57
+	.8byte	.LVL1258
+	.8byte	.LVL1259
+	.2byte	0x1
+	.byte	0x57
+	.8byte	.LVL1266
+	.8byte	.LVL1267
+	.2byte	0x1
+	.byte	0x57
+	.8byte	0
+	.8byte	0
+.LLST340:
+	.8byte	.LVL1223
+	.8byte	.LVL1224
+	.2byte	0x1
+	.byte	0x57
+	.8byte	.LVL1252
+	.8byte	.LVL1253
+	.2byte	0x1
+	.byte	0x57
+	.8byte	.LVL1263
+	.8byte	.LVL1264
+	.2byte	0x1
+	.byte	0x57
+	.8byte	.LVL1274
+	.8byte	.LVL1275
+	.2byte	0x1
+	.byte	0x57
+	.8byte	0
+	.8byte	0
+.LLST341:
+	.8byte	.LVL1224
+	.8byte	.LVL1225
+	.2byte	0x1
+	.byte	0x57
+	.8byte	.LVL1253
+	.8byte	.LVL1254
+	.2byte	0x1
+	.byte	0x57
+	.8byte	.LVL1261
+	.8byte	.LVL1262
+	.2byte	0x1
+	.byte	0x57
+	.8byte	.LVL1271
+	.8byte	.LVL1272
+	.2byte	0x1
+	.byte	0x57
+	.8byte	0
+	.8byte	0
+.LLST342:
+	.8byte	.LVL1225
+	.8byte	.LVL1226
+	.2byte	0x1
+	.byte	0x57
+	.8byte	.LVL1254
+	.8byte	.LVL1255
+	.2byte	0x1
+	.byte	0x57
+	.8byte	.LVL1259
+	.8byte	.LVL1260
+	.2byte	0x1
+	.byte	0x57
+	.8byte	.LVL1270
+	.8byte	.LVL1271
+	.2byte	0x1
+	.byte	0x57
+	.8byte	0
+	.8byte	0
+.LLST343:
+	.8byte	.LVL1216
+	.8byte	.LVL1217
+	.2byte	0x1
+	.byte	0x57
+	.8byte	.LVL1226
+	.8byte	.LVL1234
+	.2byte	0x1
+	.byte	0x57
+	.8byte	.LVL1250
+	.8byte	.LVL1251
+	.2byte	0x1
+	.byte	0x57
+	.8byte	.LVL1265
+	.8byte	.LVL1266
+	.2byte	0x1
+	.byte	0x57
+	.8byte	0
+	.8byte	0
+.LLST347:
+	.8byte	.LVL1219
+	.8byte	.LVL1229
+	.2byte	0x1
+	.byte	0x55
+	.8byte	.LVL1233
+	.8byte	.LVL1234
+	.2byte	0x1
+	.byte	0x55
+	.8byte	.LVL1235
+	.8byte	.LVL1268
+	.2byte	0x1
+	.byte	0x55
+	.8byte	.LVL1269
+	.8byte	.LVL1290
+	.2byte	0x1
+	.byte	0x55
+	.8byte	.LVL1291
+	.8byte	.LFE2818
+	.2byte	0x1
+	.byte	0x55
+	.8byte	0
+	.8byte	0
+.LLST348:
+	.8byte	.LVL1236
+	.8byte	.LVL1237
+	.2byte	0x1
+	.byte	0x69
+	.8byte	.LVL1238
+	.8byte	.LVL1239
+	.2byte	0x1
+	.byte	0x69
+	.8byte	.LVL1240
+	.8byte	.LVL1241
+	.2byte	0x1
+	.byte	0x69
+	.8byte	.LVL1242
+	.8byte	.LVL1243
+	.2byte	0x1
+	.byte	0x69
+	.8byte	.LVL1244
+	.8byte	.LVL1245
+	.2byte	0x1
+	.byte	0x69
+	.8byte	.LVL1246
+	.8byte	.LVL1247
+	.2byte	0x1
+	.byte	0x69
+	.8byte	.LVL1276
+	.8byte	.LVL1277
+	.2byte	0x1
+	.byte	0x69
+	.8byte	.LVL1286
+	.8byte	.LVL1287
+	.2byte	0x1
+	.byte	0x69
+	.8byte	.LVL1292
+	.8byte	.LVL1293
+	.2byte	0x1
+	.byte	0x69
+	.8byte	0
+	.8byte	0
+.LLST349:
+	.8byte	.LVL1237
+	.8byte	.LVL1239
+	.2byte	0x1
+	.byte	0x69
+	.8byte	.LVL1240
+	.8byte	.LVL1241
+	.2byte	0x1
+	.byte	0x69
+	.8byte	.LVL1242
+	.8byte	.LVL1243
+	.2byte	0x1
+	.byte	0x69
+	.8byte	.LVL1244
+	.8byte	.LVL1245
+	.2byte	0x1
+	.byte	0x69
+	.8byte	.LVL1246
+	.8byte	.LVL1247
+	.2byte	0x1
+	.byte	0x69
+	.8byte	.LVL1277
+	.8byte	.LVL1278
+	.2byte	0x1
+	.byte	0x69
+	.8byte	.LVL1285
+	.8byte	.LVL1286
+	.2byte	0x1
+	.byte	0x69
+	.8byte	.LVL1293
+	.8byte	.LVL1294
+	.2byte	0x1
+	.byte	0x69
+	.8byte	0
+	.8byte	0
+.LLST350:
+	.8byte	.LVL1239
+	.8byte	.LVL1241
+	.2byte	0x1
+	.byte	0x69
+	.8byte	.LVL1242
+	.8byte	.LVL1243
+	.2byte	0x1
+	.byte	0x69
+	.8byte	.LVL1244
+	.8byte	.LVL1245
+	.2byte	0x1
+	.byte	0x69
+	.8byte	.LVL1246
+	.8byte	.LVL1247
+	.2byte	0x1
+	.byte	0x69
+	.8byte	.LVL1278
+	.8byte	.LVL1279
+	.2byte	0x1
+	.byte	0x69
+	.8byte	.LVL1284
+	.8byte	.LVL1285
+	.2byte	0x1
+	.byte	0x69
+	.8byte	.LVL1294
+	.8byte	.LVL1295
+	.2byte	0x1
+	.byte	0x69
+	.8byte	0
+	.8byte	0
+.LLST351:
+	.8byte	.LVL1241
+	.8byte	.LVL1243
+	.2byte	0x1
+	.byte	0x69
+	.8byte	.LVL1244
+	.8byte	.LVL1245
+	.2byte	0x1
+	.byte	0x69
+	.8byte	.LVL1246
+	.8byte	.LVL1247
+	.2byte	0x1
+	.byte	0x69
+	.8byte	.LVL1279
+	.8byte	.LVL1280
+	.2byte	0x1
+	.byte	0x69
+	.8byte	.LVL1283
+	.8byte	.LVL1284
+	.2byte	0x1
+	.byte	0x69
+	.8byte	.LVL1295
+	.8byte	.LVL1296
+	.2byte	0x1
+	.byte	0x69
+	.8byte	0
+	.8byte	0
+.LLST352:
+	.8byte	.LVL1243
+	.8byte	.LVL1245
+	.2byte	0x1
+	.byte	0x69
+	.8byte	.LVL1246
+	.8byte	.LVL1247
+	.2byte	0x1
+	.byte	0x69
+	.8byte	.LVL1280
+	.8byte	.LVL1281
+	.2byte	0x1
+	.byte	0x69
+	.8byte	.LVL1282
+	.8byte	.LVL1283
+	.2byte	0x1
+	.byte	0x69
+	.8byte	.LVL1296
+	.8byte	.LFE2818
+	.2byte	0x1
+	.byte	0x69
+	.8byte	0
+	.8byte	0
+.LLST353:
+	.8byte	.LVL1245
+	.8byte	.LVL1247
+	.2byte	0x1
+	.byte	0x69
+	.8byte	.LVL1281
+	.8byte	.LVL1282
+	.2byte	0x1
+	.byte	0x69
+	.8byte	.LVL1288
+	.8byte	.LVL1289
+	.2byte	0x1
+	.byte	0x69
+	.8byte	0
+	.8byte	0
+.LLST346:
+	.8byte	.LVL1227
+	.8byte	.LVL1228
+	.2byte	0x1
+	.byte	0x56
+	.8byte	.LVL1248
+	.8byte	.LVL1251
+	.2byte	0x1
+	.byte	0x56
+	.8byte	.LVL1265
+	.8byte	.LVL1266
+	.2byte	0x1
+	.byte	0x56
+	.8byte	0
+	.8byte	0
+.LLST21:
+	.8byte	.LVL72
+	.8byte	.LVL73
+	.2byte	0x1
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST223:
+	.8byte	.LVL721
+	.8byte	.LVL722
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL722
+	.8byte	.LVL737
+	.2byte	0x1
+	.byte	0x5a
+	.8byte	.LVL737
+	.8byte	.LVL738
+	.2byte	0x1
+	.byte	0x55
+	.8byte	.LVL738
+	.8byte	.LVL745
+	.2byte	0x1
+	.byte	0x5a
+	.8byte	.LVL755
+	.8byte	.LFE2876
+	.2byte	0x1
+	.byte	0x5a
+	.8byte	0
+	.8byte	0
+.LLST224:
+	.8byte	.LVL734
+	.8byte	.LVL739
+	.2byte	0x1
+	.byte	0x59
+	.8byte	.LVL740
+	.8byte	.LVL741
+	.2byte	0x1
+	.byte	0x59
+	.8byte	.LVL741
+	.8byte	.LVL755
+	.2byte	0x1
+	.byte	0x58
+	.8byte	.LVL755
+	.8byte	.LFE2876
+	.2byte	0x1
+	.byte	0x59
+	.8byte	0
+	.8byte	0
+.LLST225:
+	.8byte	.LVL729
+	.8byte	.LVL730
+	.2byte	0x1
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST226:
+	.8byte	.LVL726
+	.8byte	.LVL728
+	.2byte	0x1
+	.byte	0x55
+	.8byte	.LVL728
+	.8byte	.LVL742
+	.2byte	0x1
+	.byte	0x56
+	.8byte	.LVL756
+	.8byte	.LFE2876
+	.2byte	0x1
+	.byte	0x56
+	.8byte	0
+	.8byte	0
+.LLST227:
+	.8byte	.LVL734
+	.8byte	.LVL749
+	.2byte	0x1
+	.byte	0x56
+	.8byte	.LVL752
+	.8byte	.LFE2876
+	.2byte	0x1
+	.byte	0x56
+	.8byte	0
+	.8byte	0
+.LLST228:
+	.8byte	.LVL734
+	.8byte	.LVL750
+	.2byte	0x1
+	.byte	0x57
+	.8byte	.LVL752
+	.8byte	.LFE2876
+	.2byte	0x1
+	.byte	0x57
+	.8byte	0
+	.8byte	0
+.LLST229:
+	.8byte	.LVL732
+	.8byte	.LVL736
+	.2byte	0x1
+	.byte	0x5d
+	.8byte	.LVL738
+	.8byte	.LFE2876
+	.2byte	0x1
+	.byte	0x5d
+	.8byte	0
+	.8byte	0
+.LLST230:
+	.8byte	.LVL744
+	.8byte	.LVL751
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL752
+	.8byte	.LVL753
+	.2byte	0x1
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST231:
+	.8byte	.LVL723
+	.8byte	.LVL743
+	.2byte	0x1
+	.byte	0x57
+	.8byte	.LVL755
+	.8byte	.LFE2876
+	.2byte	0x1
+	.byte	0x55
+	.8byte	0
+	.8byte	0
+.LLST232:
+	.8byte	.LVL725
+	.8byte	.LVL759
+	.2byte	0x1
+	.byte	0x6e
+	.8byte	0
+	.8byte	0
+.LLST233:
+	.8byte	.LVL727
+	.8byte	.LVL758
+	.2byte	0x1
+	.byte	0x65
+	.8byte	0
+	.8byte	0
+.LLST234:
+	.8byte	.LVL724
+	.8byte	.LVL726
+	.2byte	0x1
+	.byte	0x55
+	.8byte	.LVL726
+	.8byte	.LVL731
+	.2byte	0x1
+	.byte	0x59
+	.8byte	.LVL731
+	.8byte	.LVL733
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL734
+	.8byte	.LVL735
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL757
+	.8byte	.LFE2876
+	.2byte	0x1
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST235:
+	.8byte	.LVL745
+	.8byte	.LVL746
+	.2byte	0x1
+	.byte	0x5a
+	.8byte	.LVL747
+	.8byte	.LVL754
+	.2byte	0x1
+	.byte	0x5a
+	.8byte	0
+	.8byte	0
+.LLST236:
+	.8byte	.LVL743
+	.8byte	.LVL748
+	.2byte	0x1
+	.byte	0x55
+	.8byte	0
+	.8byte	0
+.LLST237:
+	.8byte	.LVL760
+	.8byte	.LVL764
+	.2byte	0x1
+	.byte	0x55
+	.8byte	.LVL765
+	.8byte	.LVL766
+	.2byte	0x1
+	.byte	0x55
+	.8byte	.LVL769
+	.8byte	.LFE2877
+	.2byte	0x1
+	.byte	0x55
+	.8byte	0
+	.8byte	0
+.LLST238:
+	.8byte	.LVL762
+	.8byte	.LVL763
+	.2byte	0x1
+	.byte	0x58
+	.8byte	.LVL765
+	.8byte	.LVL766
+	.2byte	0x1
+	.byte	0x58
+	.8byte	.LVL769
+	.8byte	.LFE2877
+	.2byte	0x1
+	.byte	0x58
+	.8byte	0
+	.8byte	0
+.LLST239:
+	.8byte	.LVL761
+	.8byte	.LVL767
+	.2byte	0x1
+	.byte	0x56
+	.8byte	.LVL768
+	.8byte	.LVL770
+	.2byte	0x1
+	.byte	0x56
+	.8byte	.LVL771
+	.8byte	.LVL772
+	.2byte	0x1
+	.byte	0x56
+	.8byte	.LVL773
+	.8byte	.LVL774
+	.2byte	0x1
+	.byte	0x56
+	.8byte	.LVL775
+	.8byte	.LVL776
+	.2byte	0x1
+	.byte	0x56
+	.8byte	.LVL777
+	.8byte	.LVL778
+	.2byte	0x1
+	.byte	0x56
+	.8byte	.LVL779
+	.8byte	.LVL780
+	.2byte	0x1
+	.byte	0x56
+	.8byte	.LVL781
+	.8byte	.LFE2877
+	.2byte	0x1
+	.byte	0x56
+	.8byte	0
+	.8byte	0
+.LLST251:
+	.8byte	.LVL821
+	.8byte	.LVL829
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL829
+	.8byte	.LVL836
+	.2byte	0x1
+	.byte	0x5a
+	.8byte	.LVL836
+	.8byte	.LVL838
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL838
+	.8byte	.LVL839
+	.2byte	0x1
+	.byte	0x5a
+	.8byte	.LVL839
+	.8byte	.LFE2878
+	.2byte	0x1
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST252:
+	.8byte	.LVL821
+	.8byte	.LVL826
+	.2byte	0x1
+	.byte	0x56
+	.8byte	.LVL839
+	.8byte	.LVL840
+	.2byte	0x1
+	.byte	0x56
+	.8byte	0
+	.8byte	0
+.LLST253:
+	.8byte	.LVL827
+	.8byte	.LVL839
+	.2byte	0x1
+	.byte	0x5c
+	.8byte	.LVL842
+	.8byte	.LVL843
+	.2byte	0x1
+	.byte	0x5c
+	.8byte	.LVL844
+	.8byte	.LFE2878
+	.2byte	0x1
+	.byte	0x5c
+	.8byte	0
+	.8byte	0
+.LLST254:
+	.8byte	.LVL825
+	.8byte	.LVL839
+	.2byte	0x1
+	.byte	0x5e
+	.8byte	.LVL841
+	.8byte	.LFE2878
+	.2byte	0x1
+	.byte	0x5e
+	.8byte	0
+	.8byte	0
+.LLST255:
+	.8byte	.LVL831
+	.8byte	.LVL833
+	.2byte	0x1
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST256:
+	.8byte	.LVL832
+	.8byte	.LVL834
+	.2byte	0x1
+	.byte	0x53
+	.8byte	0
+	.8byte	0
+.LLST257:
+	.8byte	.LVL822
+	.8byte	.LVL824
+	.2byte	0x1
+	.byte	0x54
+	.8byte	0
+	.8byte	0
+.LLST258:
+	.8byte	.LVL828
+	.8byte	.LVL830
+	.2byte	0x1
+	.byte	0x5f
+	.8byte	.LVL835
+	.8byte	.LVL836
+	.2byte	0x1
+	.byte	0x5f
+	.8byte	.LVL837
+	.8byte	.LVL839
+	.2byte	0x1
+	.byte	0x5f
+	.8byte	0
+	.8byte	0
+.LLST259:
+	.8byte	.LVL845
+	.8byte	.LVL854
+	.2byte	0x1
+	.byte	0x56
+	.8byte	.LVL855
+	.8byte	.LFE2879
+	.2byte	0x1
+	.byte	0x56
+	.8byte	0
+	.8byte	0
+.LLST260:
+	.8byte	.LVL849
+	.8byte	.LVL856
+	.2byte	0x1
+	.byte	0x5b
+	.8byte	.LVL858
+	.8byte	.LVL862
+	.2byte	0x1
+	.byte	0x5b
+	.8byte	.LVL863
+	.8byte	.LFE2879
+	.2byte	0x1
+	.byte	0x5b
+	.8byte	0
+	.8byte	0
+.LLST261:
+	.8byte	.LVL850
+	.8byte	.LVL857
+	.2byte	0x1
+	.byte	0x5e
+	.8byte	.LVL859
+	.8byte	.LFE2879
+	.2byte	0x1
+	.byte	0x5e
+	.8byte	0
+	.8byte	0
+.LLST262:
+	.8byte	.LVL846
+	.8byte	.LVL847
+	.2byte	0x1
+	.byte	0x53
+	.8byte	0
+	.8byte	0
+.LLST263:
+	.8byte	.LVL851
+	.8byte	.LVL852
+	.2byte	0x1
+	.byte	0x5d
+	.8byte	.LVL860
+	.8byte	.LVL861
+	.2byte	0x1
+	.byte	0x5d
+	.8byte	0
+	.8byte	0
+.LLST264:
+	.8byte	.LVL853
+	.8byte	.LVL856
+	.2byte	0x1
+	.byte	0x58
+	.8byte	0
+	.8byte	0
+.LLST265:
+	.8byte	.LVL864
+	.8byte	.LVL865
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL865
+	.8byte	.LVL870
+	.2byte	0x1
+	.byte	0x64
+	.8byte	.LVL871
+	.8byte	.LFE2880
+	.2byte	0x1
+	.byte	0x64
+	.8byte	0
+	.8byte	0
+.LLST266:
+	.8byte	.LVL872
+	.8byte	.LVL874
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL874
+	.8byte	.LVL878
+	.2byte	0x1
+	.byte	0x63
+	.8byte	.LVL879
+	.8byte	.LVL882
+	.2byte	0x1
+	.byte	0x63
+	.8byte	0
+	.8byte	0
+.LLST267:
+	.8byte	.LVL872
+	.8byte	.LVL873
+	.2byte	0x1
+	.byte	0x51
+	.8byte	0
+	.8byte	0
+.LLST269:
+	.8byte	.LVL889
+	.8byte	.LVL907
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL910
+	.8byte	.LFE2884
+	.2byte	0x1
+	.byte	0x66
+	.8byte	0
+	.8byte	0
+.LLST270:
+	.8byte	.LVL889
+	.8byte	.LVL900
+	.2byte	0x1
+	.byte	0x51
+	.8byte	.LVL900
+	.8byte	.LVL908
+	.2byte	0x1
+	.byte	0x68
+	.8byte	.LVL910
+	.8byte	.LFE2884
+	.2byte	0x1
+	.byte	0x68
+	.8byte	0
+	.8byte	0
+.LLST271:
+	.8byte	.LVL889
+	.8byte	.LVL901
+	.2byte	0x1
+	.byte	0x52
+	.8byte	.LVL901
+	.8byte	.LVL909
+	.2byte	0x1
+	.byte	0x69
+	.8byte	.LVL910
+	.8byte	.LFE2884
+	.2byte	0x1
+	.byte	0x69
+	.8byte	0
+	.8byte	0
+.LLST272:
+	.8byte	.LVL889
+	.8byte	.LVL894-1
+	.2byte	0x1
+	.byte	0x56
+	.8byte	.LVL910
+	.8byte	.LFE2884
+	.2byte	0x1
+	.byte	0x56
+	.8byte	0
+	.8byte	0
+.LLST273:
+	.8byte	.LVL893
+	.8byte	.LVL908
+	.2byte	0x1
+	.byte	0x67
+	.8byte	.LVL910
+	.8byte	.LVL911
+	.2byte	0x1
+	.byte	0x67
+	.8byte	.LVL912
+	.8byte	.LFE2884
+	.2byte	0x1
+	.byte	0x67
+	.8byte	0
+	.8byte	0
+.LLST274:
+	.8byte	.LVL893
+	.8byte	.LVL907
+	.2byte	0x1
+	.byte	0x65
+	.8byte	.LVL913
+	.8byte	.LVL914
+	.2byte	0x1
+	.byte	0x65
+	.8byte	.LVL915
+	.8byte	.LFE2884
+	.2byte	0x1
+	.byte	0x65
+	.8byte	0
+	.8byte	0
+.LLST275:
+	.8byte	.LVL890
+	.8byte	.LVL891
+	.2byte	0x1
+	.byte	0x53
+	.8byte	0
+	.8byte	0
+.LLST276:
+	.8byte	.LVL892
+	.8byte	.LVL906
+	.2byte	0x1
+	.byte	0x63
+	.8byte	.LVL910
+	.8byte	.LFE2884
+	.2byte	0x1
+	.byte	0x63
+	.8byte	0
+	.8byte	0
+.LLST277:
+	.8byte	.LVL895
+	.8byte	.LVL910
+	.2byte	0x1
+	.byte	0x54
+	.8byte	0
+	.8byte	0
+.LLST278:
+	.8byte	.LVL896
+	.8byte	.LVL898
+	.2byte	0x1
+	.byte	0x5a
+	.8byte	.LVL899
+	.8byte	.LVL903
+	.2byte	0x1
+	.byte	0x5a
+	.8byte	0
+	.8byte	0
+.LLST279:
+	.8byte	.LVL895
+	.8byte	.LVL897
+	.2byte	0x1
+	.byte	0x5a
+	.8byte	.LVL902
+	.8byte	.LVL904
+	.2byte	0x1
+	.byte	0x5a
+	.8byte	.LVL905
+	.8byte	.LVL910
+	.2byte	0x1
+	.byte	0x5a
+	.8byte	0
+	.8byte	0
+.LLST280:
+	.8byte	.LVL916
+	.8byte	.LVL920
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL920
+	.8byte	.LVL934
+	.2byte	0x1
+	.byte	0x6b
+	.8byte	.LVL935
+	.8byte	.LFE2885
+	.2byte	0x1
+	.byte	0x6b
+	.8byte	0
+	.8byte	0
+.LLST281:
+	.8byte	.LVL916
+	.8byte	.LVL930
+	.2byte	0x1
+	.byte	0x51
+	.8byte	.LVL935
+	.8byte	.LFE2885
+	.2byte	0x1
+	.byte	0x64
+	.8byte	0
+	.8byte	0
+.LLST282:
+	.8byte	.LVL916
+	.8byte	.LVL931
+	.2byte	0x1
+	.byte	0x52
+	.8byte	.LVL935
+	.8byte	.LFE2885
+	.2byte	0x1
+	.byte	0x65
+	.8byte	0
+	.8byte	0
+.LLST283:
+	.8byte	.LVL916
+	.8byte	.LVL924-1
+	.2byte	0x1
+	.byte	0x56
+	.8byte	.LVL935
+	.8byte	.LVL936-1
+	.2byte	0x1
+	.byte	0x56
+	.8byte	.LVL937
+	.8byte	.LFE2885
+	.2byte	0x1
+	.byte	0x56
+	.8byte	0
+	.8byte	0
+.LLST284:
+	.8byte	.LVL926
+	.8byte	.LVL928
+	.2byte	0x1
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST285:
+	.8byte	.LVL927
+	.8byte	.LVL929
+	.2byte	0x1
+	.byte	0x52
+	.8byte	0
+	.8byte	0
+.LLST286:
+	.8byte	.LVL921
+	.8byte	.LVL933
+	.2byte	0x1
+	.byte	0x69
+	.8byte	.LVL935
+	.8byte	.LVL937
+	.2byte	0x1
+	.byte	0x69
+	.8byte	.LVL939
+	.8byte	.LFE2885
+	.2byte	0x1
+	.byte	0x69
+	.8byte	0
+	.8byte	0
+.LLST287:
+	.8byte	.LVL922
+	.8byte	.LVL932
+	.2byte	0x1
+	.byte	0x68
+	.8byte	.LVL935
+	.8byte	.LVL937
+	.2byte	0x1
+	.byte	0x68
+	.8byte	.LVL938
+	.8byte	.LVL940
+	.2byte	0x1
+	.byte	0x68
+	.8byte	.LVL941
+	.8byte	.LFE2885
+	.2byte	0x1
+	.byte	0x68
+	.8byte	0
+	.8byte	0
+.LLST288:
+	.8byte	.LVL917
+	.8byte	.LVL918
+	.2byte	0x1
+	.byte	0x54
+	.8byte	0
+	.8byte	0
+.LLST289:
+	.8byte	.LVL919
+	.8byte	.LVL930
+	.2byte	0x1
+	.byte	0x63
+	.8byte	.LVL935
+	.8byte	.LFE2885
+	.2byte	0x1
+	.byte	0x63
+	.8byte	0
+	.8byte	0
+.LLST290:
+	.8byte	.LVL923
+	.8byte	.LVL933
+	.2byte	0x1
+	.byte	0x6a
+	.8byte	.LVL935
+	.8byte	.LVL937
+	.2byte	0x1
+	.byte	0x6a
+	.8byte	0
+	.8byte	0
+.LLST291:
+	.8byte	.LVL925
+	.8byte	.LVL935
+	.2byte	0x1
+	.byte	0x54
+	.8byte	0
+	.8byte	0
+.LLST294:
+	.8byte	.LVL989
+	.8byte	.LVL990-1
+	.2byte	0x1
+	.byte	0x52
+	.8byte	0
+	.8byte	0
+.LLST295:
+	.8byte	.LVL988
+	.8byte	.LVL990-1
+	.2byte	0x1
+	.byte	0x54
+	.8byte	0
+	.8byte	0
+.LLST296:
+	.8byte	.LVL992
+	.8byte	.LVL993
+	.2byte	0x1
+	.byte	0x54
+	.8byte	.LVL994
+	.8byte	.LVL995-1
+	.2byte	0x1
+	.byte	0x54
+	.8byte	0
+	.8byte	0
+.LLST297:
+	.8byte	.LVL991
+	.8byte	.LVL995-1
+	.2byte	0x1
+	.byte	0x58
+	.8byte	0
+	.8byte	0
+.LLST329:
+	.8byte	.LVL1195
+	.8byte	.LVL1196
+	.2byte	0x1
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST330:
+	.8byte	.LVL1195
+	.8byte	.LVL1197
+	.2byte	0x1
+	.byte	0x51
+	.8byte	0
+	.8byte	0
+.LLST331:
+	.8byte	.LVL1195
+	.8byte	.LVL1202
+	.2byte	0x1
+	.byte	0x52
+	.8byte	.LVL1202
+	.8byte	.LVL1203-1
+	.2byte	0x1
+	.byte	0x50
+	.8byte	0
+	.8byte	0
+.LLST332:
+	.8byte	.LVL1198
+	.8byte	.LVL1199
+	.2byte	0x1
+	.byte	0x51
+	.8byte	.LVL1200
+	.8byte	.LVL1201
+	.2byte	0x1
+	.byte	0x51
+	.8byte	0
+	.8byte	0
+.LLST333:
+	.8byte	.LVL1204
+	.8byte	.LVL1205
+	.2byte	0x1
+	.byte	0x50
+	.8byte	.LVL1205
+	.8byte	.LVL1209
+	.2byte	0x1
+	.byte	0x63
+	.8byte	.LVL1210
+	.8byte	.LFE2893
+	.2byte	0x1
+	.byte	0x63
+	.8byte	0
+	.8byte	0
+	.section	.debug_aranges,"",@progbits
+	.4byte	0x4c
+	.2byte	0x2
+	.4byte	.Ldebug_info0
+	.byte	0x8
+	.byte	0
+	.2byte	0
+	.2byte	0
+	.8byte	.Ltext0
+	.8byte	.Letext0-.Ltext0
+	.8byte	.LFB2875
+	.8byte	.LFE2875-.LFB2875
+	.8byte	.LFB2874
+	.8byte	.LFE2874-.LFB2874
+	.8byte	0
+	.8byte	0
+	.section	.debug_ranges,"",@progbits
+.Ldebug_ranges0:
+	.8byte	.LBB1132
+	.8byte	.LBE1132
+	.8byte	.LBB1163
+	.8byte	.LBE1163
+	.8byte	.LBB1164
+	.8byte	.LBE1164
+	.8byte	.LBB1516
+	.8byte	.LBE1516
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1135
+	.8byte	.LBE1135
+	.8byte	.LBB1147
+	.8byte	.LBE1147
+	.8byte	.LBB1148
+	.8byte	.LBE1148
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1151
+	.8byte	.LBE1151
+	.8byte	.LBB1156
+	.8byte	.LBE1156
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1165
+	.8byte	.LBE1165
+	.8byte	.LBB1502
+	.8byte	.LBE1502
+	.8byte	.LBB1503
+	.8byte	.LBE1503
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1166
+	.8byte	.LBE1166
+	.8byte	.LBB1199
+	.8byte	.LBE1199
+	.8byte	.LBB1200
+	.8byte	.LBE1200
+	.8byte	.LBB1201
+	.8byte	.LBE1201
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1169
+	.8byte	.LBE1169
+	.8byte	.LBB1182
+	.8byte	.LBE1182
+	.8byte	.LBB1191
+	.8byte	.LBE1191
+	.8byte	.LBB1192
+	.8byte	.LBE1192
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1185
+	.8byte	.LBE1185
+	.8byte	.LBB1190
+	.8byte	.LBE1190
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1202
+	.8byte	.LBE1202
+	.8byte	.LBB1508
+	.8byte	.LBE1508
+	.8byte	.LBB1509
+	.8byte	.LBE1509
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1205
+	.8byte	.LBE1205
+	.8byte	.LBB1225
+	.8byte	.LBE1225
+	.8byte	.LBB1226
+	.8byte	.LBE1226
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1219
+	.8byte	.LBE1219
+	.8byte	.LBB1224
+	.8byte	.LBE1224
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1231
+	.8byte	.LBE1231
+	.8byte	.LBB1266
+	.8byte	.LBE1266
+	.8byte	.LBB1504
+	.8byte	.LBE1504
+	.8byte	.LBB1505
+	.8byte	.LBE1505
+	.8byte	.LBB1517
+	.8byte	.LBE1517
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1234
+	.8byte	.LBE1234
+	.8byte	.LBB1247
+	.8byte	.LBE1247
+	.8byte	.LBB1256
+	.8byte	.LBE1256
+	.8byte	.LBB1257
+	.8byte	.LBE1257
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1250
+	.8byte	.LBE1250
+	.8byte	.LBB1255
+	.8byte	.LBE1255
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1267
+	.8byte	.LBE1267
+	.8byte	.LBB1494
+	.8byte	.LBE1494
+	.8byte	.LBB1495
+	.8byte	.LBE1495
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1270
+	.8byte	.LBE1270
+	.8byte	.LBB1290
+	.8byte	.LBE1290
+	.8byte	.LBB1291
+	.8byte	.LBE1291
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1284
+	.8byte	.LBE1284
+	.8byte	.LBB1289
+	.8byte	.LBE1289
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1296
+	.8byte	.LBE1296
+	.8byte	.LBB1329
+	.8byte	.LBE1329
+	.8byte	.LBB1510
+	.8byte	.LBE1510
+	.8byte	.LBB1511
+	.8byte	.LBE1511
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1299
+	.8byte	.LBE1299
+	.8byte	.LBB1312
+	.8byte	.LBE1312
+	.8byte	.LBB1321
+	.8byte	.LBE1321
+	.8byte	.LBB1322
+	.8byte	.LBE1322
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1315
+	.8byte	.LBE1315
+	.8byte	.LBB1320
+	.8byte	.LBE1320
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1330
+	.8byte	.LBE1330
+	.8byte	.LBB1365
+	.8byte	.LBE1365
+	.8byte	.LBB1506
+	.8byte	.LBE1506
+	.8byte	.LBB1507
+	.8byte	.LBE1507
+	.8byte	.LBB1515
+	.8byte	.LBE1515
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1333
+	.8byte	.LBE1333
+	.8byte	.LBB1346
+	.8byte	.LBE1346
+	.8byte	.LBB1355
+	.8byte	.LBE1355
+	.8byte	.LBB1356
+	.8byte	.LBE1356
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1349
+	.8byte	.LBE1349
+	.8byte	.LBB1354
+	.8byte	.LBE1354
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1366
+	.8byte	.LBE1366
+	.8byte	.LBB1401
+	.8byte	.LBE1401
+	.8byte	.LBB1496
+	.8byte	.LBE1496
+	.8byte	.LBB1497
+	.8byte	.LBE1497
+	.8byte	.LBB1513
+	.8byte	.LBE1513
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1369
+	.8byte	.LBE1369
+	.8byte	.LBB1382
+	.8byte	.LBE1382
+	.8byte	.LBB1383
+	.8byte	.LBE1383
+	.8byte	.LBB1384
+	.8byte	.LBE1384
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1387
+	.8byte	.LBE1387
+	.8byte	.LBB1392
+	.8byte	.LBE1392
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1402
+	.8byte	.LBE1402
+	.8byte	.LBB1500
+	.8byte	.LBE1500
+	.8byte	.LBB1501
+	.8byte	.LBE1501
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1405
+	.8byte	.LBE1405
+	.8byte	.LBB1425
+	.8byte	.LBE1425
+	.8byte	.LBB1426
+	.8byte	.LBE1426
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1419
+	.8byte	.LBE1419
+	.8byte	.LBB1424
+	.8byte	.LBE1424
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1431
+	.8byte	.LBE1431
+	.8byte	.LBB1498
+	.8byte	.LBE1498
+	.8byte	.LBB1499
+	.8byte	.LBE1499
+	.8byte	.LBB1518
+	.8byte	.LBE1518
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1434
+	.8byte	.LBE1434
+	.8byte	.LBB1454
+	.8byte	.LBE1454
+	.8byte	.LBB1455
+	.8byte	.LBE1455
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1448
+	.8byte	.LBE1448
+	.8byte	.LBB1453
+	.8byte	.LBE1453
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1462
+	.8byte	.LBE1462
+	.8byte	.LBB1492
+	.8byte	.LBE1492
+	.8byte	.LBB1493
+	.8byte	.LBE1493
+	.8byte	.LBB1512
+	.8byte	.LBE1512
+	.8byte	.LBB1514
+	.8byte	.LBE1514
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1465
+	.8byte	.LBE1465
+	.8byte	.LBB1476
+	.8byte	.LBE1476
+	.8byte	.LBB1477
+	.8byte	.LBE1477
+	.8byte	.LBB1478
+	.8byte	.LBE1478
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1519
+	.8byte	.LBE1519
+	.8byte	.LBB1564
+	.8byte	.LBE1564
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1520
+	.8byte	.LBE1520
+	.8byte	.LBB1561
+	.8byte	.LBE1561
+	.8byte	.LBB1563
+	.8byte	.LBE1563
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1521
+	.8byte	.LBE1521
+	.8byte	.LBB1539
+	.8byte	.LBE1539
+	.8byte	.LBB1540
+	.8byte	.LBE1540
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1522
+	.8byte	.LBE1522
+	.8byte	.LBB1523
+	.8byte	.LBE1523
+	.8byte	.LBB1538
+	.8byte	.LBE1538
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1524
+	.8byte	.LBE1524
+	.8byte	.LBB1536
+	.8byte	.LBE1536
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1525
+	.8byte	.LBE1525
+	.8byte	.LBB1537
+	.8byte	.LBE1537
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1526
+	.8byte	.LBE1526
+	.8byte	.LBB1535
+	.8byte	.LBE1535
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1527
+	.8byte	.LBE1527
+	.8byte	.LBB1533
+	.8byte	.LBE1533
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1528
+	.8byte	.LBE1528
+	.8byte	.LBB1534
+	.8byte	.LBE1534
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1529
+	.8byte	.LBE1529
+	.8byte	.LBB1532
+	.8byte	.LBE1532
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1530
+	.8byte	.LBE1530
+	.8byte	.LBB1531
+	.8byte	.LBE1531
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1541
+	.8byte	.LBE1541
+	.8byte	.LBB1562
+	.8byte	.LBE1562
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1542
+	.8byte	.LBE1542
+	.8byte	.LBB1560
+	.8byte	.LBE1560
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1543
+	.8byte	.LBE1543
+	.8byte	.LBB1544
+	.8byte	.LBE1544
+	.8byte	.LBB1559
+	.8byte	.LBE1559
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1545
+	.8byte	.LBE1545
+	.8byte	.LBB1558
+	.8byte	.LBE1558
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1546
+	.8byte	.LBE1546
+	.8byte	.LBB1556
+	.8byte	.LBE1556
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1547
+	.8byte	.LBE1547
+	.8byte	.LBB1557
+	.8byte	.LBE1557
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1548
+	.8byte	.LBE1548
+	.8byte	.LBB1553
+	.8byte	.LBE1553
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1549
+	.8byte	.LBE1549
+	.8byte	.LBB1554
+	.8byte	.LBE1554
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1550
+	.8byte	.LBE1550
+	.8byte	.LBB1555
+	.8byte	.LBE1555
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1551
+	.8byte	.LBE1551
+	.8byte	.LBB1552
+	.8byte	.LBE1552
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1565
+	.8byte	.LBE1565
+	.8byte	.LBB1585
+	.8byte	.LBE1585
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1566
+	.8byte	.LBE1566
+	.8byte	.LBB1584
+	.8byte	.LBE1584
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1567
+	.8byte	.LBE1567
+	.8byte	.LBB1568
+	.8byte	.LBE1568
+	.8byte	.LBB1582
+	.8byte	.LBE1582
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1569
+	.8byte	.LBE1569
+	.8byte	.LBB1583
+	.8byte	.LBE1583
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1570
+	.8byte	.LBE1570
+	.8byte	.LBB1581
+	.8byte	.LBE1581
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1571
+	.8byte	.LBE1571
+	.8byte	.LBB1579
+	.8byte	.LBE1579
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1572
+	.8byte	.LBE1572
+	.8byte	.LBB1580
+	.8byte	.LBE1580
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1573
+	.8byte	.LBE1573
+	.8byte	.LBB1578
+	.8byte	.LBE1578
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1574
+	.8byte	.LBE1574
+	.8byte	.LBB1577
+	.8byte	.LBE1577
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1575
+	.8byte	.LBE1575
+	.8byte	.LBB1576
+	.8byte	.LBE1576
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1590
+	.8byte	.LBE1590
+	.8byte	.LBB1593
+	.8byte	.LBE1593
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1596
+	.8byte	.LBE1596
+	.8byte	.LBB1601
+	.8byte	.LBE1601
+	.8byte	.LBB1602
+	.8byte	.LBE1602
+	.8byte	.LBB1603
+	.8byte	.LBE1603
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1610
+	.8byte	.LBE1610
+	.8byte	.LBB1619
+	.8byte	.LBE1619
+	.8byte	.LBB1620
+	.8byte	.LBE1620
+	.8byte	.LBB1631
+	.8byte	.LBE1631
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1612
+	.8byte	.LBE1612
+	.8byte	.LBB1615
+	.8byte	.LBE1615
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1621
+	.8byte	.LBE1621
+	.8byte	.LBB1625
+	.8byte	.LBE1625
+	.8byte	.LBB1626
+	.8byte	.LBE1626
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1644
+	.8byte	.LBE1644
+	.8byte	.LBB1723
+	.8byte	.LBE1723
+	.8byte	.LBB1724
+	.8byte	.LBE1724
+	.8byte	.LBB1725
+	.8byte	.LBE1725
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1646
+	.8byte	.LBE1646
+	.8byte	.LBB1663
+	.8byte	.LBE1663
+	.8byte	.LBB1664
+	.8byte	.LBE1664
+	.8byte	.LBB1665
+	.8byte	.LBE1665
+	.8byte	.LBB1666
+	.8byte	.LBE1666
+	.8byte	.LBB1667
+	.8byte	.LBE1667
+	.8byte	.LBB1668
+	.8byte	.LBE1668
+	.8byte	.LBB1669
+	.8byte	.LBE1669
+	.8byte	.LBB1670
+	.8byte	.LBE1670
+	.8byte	.LBB1671
+	.8byte	.LBE1671
+	.8byte	.LBB1672
+	.8byte	.LBE1672
+	.8byte	.LBB1673
+	.8byte	.LBE1673
+	.8byte	.LBB1674
+	.8byte	.LBE1674
+	.8byte	.LBB1675
+	.8byte	.LBE1675
+	.8byte	.LBB1676
+	.8byte	.LBE1676
+	.8byte	.LBB1677
+	.8byte	.LBE1677
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1681
+	.8byte	.LBE1681
+	.8byte	.LBB1726
+	.8byte	.LBE1726
+	.8byte	.LBB1727
+	.8byte	.LBE1727
+	.8byte	.LBB1728
+	.8byte	.LBE1728
+	.8byte	.LBB1729
+	.8byte	.LBE1729
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1683
+	.8byte	.LBE1683
+	.8byte	.LBB1702
+	.8byte	.LBE1702
+	.8byte	.LBB1703
+	.8byte	.LBE1703
+	.8byte	.LBB1704
+	.8byte	.LBE1704
+	.8byte	.LBB1705
+	.8byte	.LBE1705
+	.8byte	.LBB1706
+	.8byte	.LBE1706
+	.8byte	.LBB1707
+	.8byte	.LBE1707
+	.8byte	.LBB1708
+	.8byte	.LBE1708
+	.8byte	.LBB1709
+	.8byte	.LBE1709
+	.8byte	.LBB1710
+	.8byte	.LBE1710
+	.8byte	.LBB1711
+	.8byte	.LBE1711
+	.8byte	.LBB1712
+	.8byte	.LBE1712
+	.8byte	.LBB1713
+	.8byte	.LBE1713
+	.8byte	.LBB1714
+	.8byte	.LBE1714
+	.8byte	.LBB1715
+	.8byte	.LBE1715
+	.8byte	.LBB1716
+	.8byte	.LBE1716
+	.8byte	.LBB1717
+	.8byte	.LBE1717
+	.8byte	.LBB1718
+	.8byte	.LBE1718
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1730
+	.8byte	.LBE1730
+	.8byte	.LBB1771
+	.8byte	.LBE1771
+	.8byte	.LBB1772
+	.8byte	.LBE1772
+	.8byte	.LBB1773
+	.8byte	.LBE1773
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1732
+	.8byte	.LBE1732
+	.8byte	.LBB1751
+	.8byte	.LBE1751
+	.8byte	.LBB1752
+	.8byte	.LBE1752
+	.8byte	.LBB1753
+	.8byte	.LBE1753
+	.8byte	.LBB1754
+	.8byte	.LBE1754
+	.8byte	.LBB1755
+	.8byte	.LBE1755
+	.8byte	.LBB1756
+	.8byte	.LBE1756
+	.8byte	.LBB1757
+	.8byte	.LBE1757
+	.8byte	.LBB1758
+	.8byte	.LBE1758
+	.8byte	.LBB1759
+	.8byte	.LBE1759
+	.8byte	.LBB1760
+	.8byte	.LBE1760
+	.8byte	.LBB1761
+	.8byte	.LBE1761
+	.8byte	.LBB1762
+	.8byte	.LBE1762
+	.8byte	.LBB1763
+	.8byte	.LBE1763
+	.8byte	.LBB1764
+	.8byte	.LBE1764
+	.8byte	.LBB1765
+	.8byte	.LBE1765
+	.8byte	.LBB1766
+	.8byte	.LBE1766
+	.8byte	.LBB1767
+	.8byte	.LBE1767
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1778
+	.8byte	.LBE1778
+	.8byte	.LBB1785
+	.8byte	.LBE1785
+	.8byte	.LBB1786
+	.8byte	.LBE1786
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1779
+	.8byte	.LBE1779
+	.8byte	.LBB1784
+	.8byte	.LBE1784
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1938
+	.8byte	.LBE1938
+	.8byte	.LBB1941
+	.8byte	.LBE1941
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1948
+	.8byte	.LBE1948
+	.8byte	.LBB2028
+	.8byte	.LBE2028
+	.8byte	.LBB2029
+	.8byte	.LBE2029
+	.8byte	.LBB2030
+	.8byte	.LBE2030
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB1950
+	.8byte	.LBE1950
+	.8byte	.LBB1959
+	.8byte	.LBE1959
+	.8byte	.LBB1960
+	.8byte	.LBE1960
+	.8byte	.LBB1961
+	.8byte	.LBE1961
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB2031
+	.8byte	.LBE2031
+	.8byte	.LBB2044
+	.8byte	.LBE2044
+	.8byte	.LBB2100
+	.8byte	.LBE2100
+	.8byte	.LBB2104
+	.8byte	.LBE2104
+	.8byte	.LBB2107
+	.8byte	.LBE2107
+	.8byte	.LBB2109
+	.8byte	.LBE2109
+	.8byte	.LBB2110
+	.8byte	.LBE2110
+	.8byte	.LBB2112
+	.8byte	.LBE2112
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB2033
+	.8byte	.LBE2033
+	.8byte	.LBB2036
+	.8byte	.LBE2036
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB2045
+	.8byte	.LBE2045
+	.8byte	.LBB2055
+	.8byte	.LBE2055
+	.8byte	.LBB2103
+	.8byte	.LBE2103
+	.8byte	.LBB2111
+	.8byte	.LBE2111
+	.8byte	.LBB2114
+	.8byte	.LBE2114
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB2047
+	.8byte	.LBE2047
+	.8byte	.LBB2050
+	.8byte	.LBE2050
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB2056
+	.8byte	.LBE2056
+	.8byte	.LBB2105
+	.8byte	.LBE2105
+	.8byte	.LBB2106
+	.8byte	.LBE2106
+	.8byte	.LBB2108
+	.8byte	.LBE2108
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB2070
+	.8byte	.LBE2070
+	.8byte	.LBB2073
+	.8byte	.LBE2073
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB2074
+	.8byte	.LBE2074
+	.8byte	.LBB2101
+	.8byte	.LBE2101
+	.8byte	.LBB2102
+	.8byte	.LBE2102
+	.8byte	.LBB2113
+	.8byte	.LBE2113
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB2081
+	.8byte	.LBE2081
+	.8byte	.LBB2084
+	.8byte	.LBE2084
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB2088
+	.8byte	.LBE2088
+	.8byte	.LBB2091
+	.8byte	.LBE2091
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB2125
+	.8byte	.LBE2125
+	.8byte	.LBB2133
+	.8byte	.LBE2133
+	.8byte	.LBB2137
+	.8byte	.LBE2137
+	.8byte	.LBB2161
+	.8byte	.LBE2161
+	.8byte	.LBB2163
+	.8byte	.LBE2163
+	.8byte	.LBB2174
+	.8byte	.LBE2174
+	.8byte	.LBB2182
+	.8byte	.LBE2182
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB2126
+	.8byte	.LBE2126
+	.8byte	.LBB2132
+	.8byte	.LBE2132
+	.8byte	.LBB2138
+	.8byte	.LBE2138
+	.8byte	.LBB2162
+	.8byte	.LBE2162
+	.8byte	.LBB2164
+	.8byte	.LBE2164
+	.8byte	.LBB2166
+	.8byte	.LBE2166
+	.8byte	.LBB2179
+	.8byte	.LBE2179
+	.8byte	.LBB2189
+	.8byte	.LBE2189
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB2127
+	.8byte	.LBE2127
+	.8byte	.LBB2131
+	.8byte	.LBE2131
+	.8byte	.LBB2139
+	.8byte	.LBE2139
+	.8byte	.LBB2165
+	.8byte	.LBE2165
+	.8byte	.LBB2167
+	.8byte	.LBE2167
+	.8byte	.LBB2169
+	.8byte	.LBE2169
+	.8byte	.LBB2177
+	.8byte	.LBE2177
+	.8byte	.LBB2186
+	.8byte	.LBE2186
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB2128
+	.8byte	.LBE2128
+	.8byte	.LBB2130
+	.8byte	.LBE2130
+	.8byte	.LBB2140
+	.8byte	.LBE2140
+	.8byte	.LBB2168
+	.8byte	.LBE2168
+	.8byte	.LBB2170
+	.8byte	.LBE2170
+	.8byte	.LBB2175
+	.8byte	.LBE2175
+	.8byte	.LBB2185
+	.8byte	.LBE2185
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB2129
+	.8byte	.LBE2129
+	.8byte	.LBB2141
+	.8byte	.LBE2141
+	.8byte	.LBB2143
+	.8byte	.LBE2143
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB2134
+	.8byte	.LBE2134
+	.8byte	.LBB2173
+	.8byte	.LBE2173
+	.8byte	.LBB2180
+	.8byte	.LBE2180
+	.8byte	.LBB2183
+	.8byte	.LBE2183
+	.8byte	.LBB2184
+	.8byte	.LBE2184
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB2135
+	.8byte	.LBE2135
+	.8byte	.LBB2172
+	.8byte	.LBE2172
+	.8byte	.LBB2178
+	.8byte	.LBE2178
+	.8byte	.LBB2188
+	.8byte	.LBE2188
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB2136
+	.8byte	.LBE2136
+	.8byte	.LBB2171
+	.8byte	.LBE2171
+	.8byte	.LBB2176
+	.8byte	.LBE2176
+	.8byte	.LBB2187
+	.8byte	.LBE2187
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB2142
+	.8byte	.LBE2142
+	.8byte	.LBB2158
+	.8byte	.LBE2158
+	.8byte	.LBB2159
+	.8byte	.LBE2159
+	.8byte	.LBB2160
+	.8byte	.LBE2160
+	.8byte	.LBB2181
+	.8byte	.LBE2181
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB2144
+	.8byte	.LBE2144
+	.8byte	.LBB2145
+	.8byte	.LBE2145
+	.8byte	.LBB2190
+	.8byte	.LBE2190
+	.8byte	.LBB2202
+	.8byte	.LBE2202
+	.8byte	.LBB2204
+	.8byte	.LBE2204
+	.8byte	.LBB2205
+	.8byte	.LBE2205
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB2146
+	.8byte	.LBE2146
+	.8byte	.LBB2147
+	.8byte	.LBE2147
+	.8byte	.LBB2191
+	.8byte	.LBE2191
+	.8byte	.LBB2201
+	.8byte	.LBE2201
+	.8byte	.LBB2206
+	.8byte	.LBE2206
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB2148
+	.8byte	.LBE2148
+	.8byte	.LBB2149
+	.8byte	.LBE2149
+	.8byte	.LBB2192
+	.8byte	.LBE2192
+	.8byte	.LBB2200
+	.8byte	.LBE2200
+	.8byte	.LBB2207
+	.8byte	.LBE2207
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB2150
+	.8byte	.LBE2150
+	.8byte	.LBB2151
+	.8byte	.LBE2151
+	.8byte	.LBB2193
+	.8byte	.LBE2193
+	.8byte	.LBB2199
+	.8byte	.LBE2199
+	.8byte	.LBB2208
+	.8byte	.LBE2208
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB2152
+	.8byte	.LBE2152
+	.8byte	.LBB2153
+	.8byte	.LBE2153
+	.8byte	.LBB2194
+	.8byte	.LBE2194
+	.8byte	.LBB2198
+	.8byte	.LBE2198
+	.8byte	.LBB2209
+	.8byte	.LBE2209
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB2154
+	.8byte	.LBE2154
+	.8byte	.LBB2155
+	.8byte	.LBE2155
+	.8byte	.LBB2195
+	.8byte	.LBE2195
+	.8byte	.LBB2197
+	.8byte	.LBE2197
+	.8byte	.LBB2210
+	.8byte	.LBE2210
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB2156
+	.8byte	.LBE2156
+	.8byte	.LBB2157
+	.8byte	.LBE2157
+	.8byte	.LBB2196
+	.8byte	.LBE2196
+	.8byte	.LBB2203
+	.8byte	.LBE2203
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB2298
+	.8byte	.LBE2298
+	.8byte	.LBB2313
+	.8byte	.LBE2313
+	.8byte	.LBB2314
+	.8byte	.LBE2314
+	.8byte	.LBB2315
+	.8byte	.LBE2315
+	.8byte	.LBB2395
+	.8byte	.LBE2395
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB2300
+	.8byte	.LBE2300
+	.8byte	.LBB2304
+	.8byte	.LBE2304
+	.8byte	.LBB2305
+	.8byte	.LBE2305
+	.8byte	.LBB2306
+	.8byte	.LBE2306
+	.8byte	.LBB2307
+	.8byte	.LBE2307
+	.8byte	.LBB2308
+	.8byte	.LBE2308
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB2301
+	.8byte	.LBE2301
+	.8byte	.LBB2302
+	.8byte	.LBE2302
+	.8byte	.LBB2303
+	.8byte	.LBE2303
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB2316
+	.8byte	.LBE2316
+	.8byte	.LBB2369
+	.8byte	.LBE2369
+	.8byte	.LBB2370
+	.8byte	.LBE2370
+	.8byte	.LBB2371
+	.8byte	.LBE2371
+	.8byte	.LBB2372
+	.8byte	.LBE2372
+	.8byte	.LBB2373
+	.8byte	.LBE2373
+	.8byte	.LBB2374
+	.8byte	.LBE2374
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB2318
+	.8byte	.LBE2318
+	.8byte	.LBB2329
+	.8byte	.LBE2329
+	.8byte	.LBB2330
+	.8byte	.LBE2330
+	.8byte	.LBB2344
+	.8byte	.LBE2344
+	.8byte	.LBB2353
+	.8byte	.LBE2353
+	.8byte	.LBB2360
+	.8byte	.LBE2360
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB2319
+	.8byte	.LBE2319
+	.8byte	.LBB2331
+	.8byte	.LBE2331
+	.8byte	.LBB2332
+	.8byte	.LBE2332
+	.8byte	.LBB2346
+	.8byte	.LBE2346
+	.8byte	.LBB2349
+	.8byte	.LBE2349
+	.8byte	.LBB2361
+	.8byte	.LBE2361
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB2320
+	.8byte	.LBE2320
+	.8byte	.LBB2333
+	.8byte	.LBE2333
+	.8byte	.LBB2334
+	.8byte	.LBE2334
+	.8byte	.LBB2340
+	.8byte	.LBE2340
+	.8byte	.LBB2348
+	.8byte	.LBE2348
+	.8byte	.LBB2356
+	.8byte	.LBE2356
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB2321
+	.8byte	.LBE2321
+	.8byte	.LBB2335
+	.8byte	.LBE2335
+	.8byte	.LBB2336
+	.8byte	.LBE2336
+	.8byte	.LBB2341
+	.8byte	.LBE2341
+	.8byte	.LBB2351
+	.8byte	.LBE2351
+	.8byte	.LBB2359
+	.8byte	.LBE2359
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB2322
+	.8byte	.LBE2322
+	.8byte	.LBB2337
+	.8byte	.LBE2337
+	.8byte	.LBB2338
+	.8byte	.LBE2338
+	.8byte	.LBB2339
+	.8byte	.LBE2339
+	.8byte	.LBB2347
+	.8byte	.LBE2347
+	.8byte	.LBB2355
+	.8byte	.LBE2355
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB2323
+	.8byte	.LBE2323
+	.8byte	.LBB2324
+	.8byte	.LBE2324
+	.8byte	.LBB2342
+	.8byte	.LBE2342
+	.8byte	.LBB2350
+	.8byte	.LBE2350
+	.8byte	.LBB2357
+	.8byte	.LBE2357
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB2325
+	.8byte	.LBE2325
+	.8byte	.LBB2326
+	.8byte	.LBE2326
+	.8byte	.LBB2343
+	.8byte	.LBE2343
+	.8byte	.LBB2352
+	.8byte	.LBE2352
+	.8byte	.LBB2358
+	.8byte	.LBE2358
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB2327
+	.8byte	.LBE2327
+	.8byte	.LBB2328
+	.8byte	.LBE2328
+	.8byte	.LBB2345
+	.8byte	.LBE2345
+	.8byte	.LBB2354
+	.8byte	.LBE2354
+	.8byte	.LBB2362
+	.8byte	.LBE2362
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB2377
+	.8byte	.LBE2377
+	.8byte	.LBB2426
+	.8byte	.LBE2426
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB2380
+	.8byte	.LBE2380
+	.8byte	.LBB2444
+	.8byte	.LBE2444
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB2381
+	.8byte	.LBE2381
+	.8byte	.LBB2439
+	.8byte	.LBE2439
+	.8byte	.LBB2445
+	.8byte	.LBE2445
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB2385
+	.8byte	.LBE2385
+	.8byte	.LBB2391
+	.8byte	.LBE2391
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB2388
+	.8byte	.LBE2388
+	.8byte	.LBB2390
+	.8byte	.LBE2390
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB2392
+	.8byte	.LBE2392
+	.8byte	.LBB2453
+	.8byte	.LBE2453
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB2401
+	.8byte	.LBE2401
+	.8byte	.LBB2455
+	.8byte	.LBE2455
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB2408
+	.8byte	.LBE2408
+	.8byte	.LBB2451
+	.8byte	.LBE2451
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB2412
+	.8byte	.LBE2412
+	.8byte	.LBB2450
+	.8byte	.LBE2450
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB2416
+	.8byte	.LBE2416
+	.8byte	.LBB2422
+	.8byte	.LBE2422
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB2419
+	.8byte	.LBE2419
+	.8byte	.LBB2421
+	.8byte	.LBE2421
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB2423
+	.8byte	.LBE2423
+	.8byte	.LBB2427
+	.8byte	.LBE2427
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB2428
+	.8byte	.LBE2428
+	.8byte	.LBB2440
+	.8byte	.LBE2440
+	.8byte	.LBB2449
+	.8byte	.LBE2449
+	.8byte	.LBB2454
+	.8byte	.LBE2454
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB2441
+	.8byte	.LBE2441
+	.8byte	.LBB2452
+	.8byte	.LBE2452
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB2456
+	.8byte	.LBE2456
+	.8byte	.LBB2463
+	.8byte	.LBE2463
+	.8byte	.LBB2464
+	.8byte	.LBE2464
+	.8byte	0
+	.8byte	0
+	.8byte	.LBB2457
+	.8byte	.LBE2457
+	.8byte	.LBB2462
+	.8byte	.LBE2462
+	.8byte	0
+	.8byte	0
+	.8byte	.Ltext0
+	.8byte	.Letext0
+	.8byte	.LFB2875
+	.8byte	.LFE2875
+	.8byte	.LFB2874
+	.8byte	.LFE2874
+	.8byte	0
+	.8byte	0
+	.section	.debug_line,"",@progbits
+.Ldebug_line0:
+	.section	.debug_str,"MS",@progbits,1
+.LASF881:
+	.string	"sival_int"
+.LASF2594:
+	.string	"PE_SIZE_PTE"
+.LASF2337:
+	.string	"device_attribute"
+.LASF170:
+	.string	"line"
+.LASF1821:
+	.string	"link"
+.LASF660:
+	.string	"start_time"
+.LASF2069:
+	.string	"kernfs_node"
+.LASF2213:
+	.string	"RPM_REQ_IDLE"
+.LASF2349:
+	.string	"suppliers"
+.LASF3047:
+	.string	"ebc_buffer_manage_init"
+.LASF2850:
+	.string	"EPD_FULL_GCC16"
+.LASF38:
+	.string	"dev_t"
+.LASF1941:
+	.string	"show_options2"
+.LASF2596:
+	.string	"PE_SIZE_PUD"
+.LASF2559:
+	.string	"__tracepoint_page_ref_mod"
+.LASF2961:
+	.string	"full_mode_num"
+.LASF1013:
+	.string	"nr_wakeups"
+.LASF1849:
+	.string	"start"
+.LASF1307:
+	.string	"start_brk"
+.LASF100:
+	.string	"read"
+.LASF1648:
+	.string	"d_ino_softlimit"
+.LASF1937:
+	.string	"copy_mnt_data"
+.LASF1748:
+	.string	"WRITE_LIFE_LONG"
+.LASF2283:
+	.string	"dev_pm_qos"
+.LASF1170:
+	.string	"UTASK_RUNNING"
+.LASF165:
+	.string	"hex_asc"
+.LASF1038:
+	.string	"watchdog_stamp"
+.LASF2806:
+	.string	"WAKE_LOCK_TYPE_COUNT"
+.LASF2682:
+	.string	"Elf64_Word"
+.LASF833:
+	.string	"PCPU_FC_PAGE"
+.LASF2126:
+	.string	"kset_uevent_ops"
+.LASF371:
+	.string	"__cpu_present_mask"
+.LASF1417:
+	.string	"zone_padding"
+.LASF182:
+	.string	"TT_NONE"
+.LASF1636:
+	.string	"acquire_dquot"
+.LASF2181:
+	.string	"coherent_dma_mask"
+.LASF2329:
+	.string	"dev_kobj"
+.LASF475:
+	.string	"d_release"
+.LASF3187:
+	.string	"get_arch_dma_ops"
+.LASF305:
+	.string	"__ctors_start"
+.LASF577:
+	.string	"state"
+.LASF524:
+	.string	"s_d_op"
+.LASF2945:
+	.string	"ebc_buffer_vir"
+.LASF879:
+	.string	"node_states"
+.LASF2877:
+	.string	"pmic_power_req"
+.LASF871:
+	.string	"hrtimer_resolution"
+.LASF256:
+	.string	"FTR_HIGHER_OR_ZERO_SAFE"
+.LASF1057:
+	.string	"need_qs"
+.LASF2982:
+	.string	"frame_control_timer"
+.LASF137:
+	.string	"panic_notifier_list"
+.LASF1533:
+	.string	"compact_defer_shift"
+.LASF259:
+	.string	"visible"
+.LASF52:
+	.string	"blkcnt_t"
+.LASF1101:
+	.string	"icq_tree"
+.LASF916:
+	.string	"si_code"
+.LASF648:
+	.string	"thread_node"
+.LASF3106:
+	.string	"temperature"
+.LASF1270:
+	.string	"map_pages"
+.LASF544:
+	.string	"vfsmount"
+.LASF2199:
+	.string	"iommu_fwspec"
+.LASF345:
+	.string	"tp2_value"
+.LASF2421:
+	.string	"nargs"
+.LASF1510:
+	.string	"vm_node_stat_diff"
+.LASF1130:
+	.string	"attributes"
+.LASF1987:
+	.string	"fs_kobj"
+.LASF2520:
+	.string	"TASKLET_SOFTIRQ"
+.LASF1388:
+	.string	"inodes_stat"
+.LASF252:
+	.string	"ftr_type"
+.LASF650:
+	.string	"set_child_tid"
+.LASF887:
+	.string	"_overrun"
+.LASF159:
+	.string	"system_state"
+.LASF795:
+	.string	"system_wq"
+.LASF603:
+	.string	"rcu_read_lock_nesting"
+.LASF2979:
+	.string	"suspend_lock"
+.LASF2498:
+	.string	"gpio_desc"
+.LASF932:
+	.string	"list"
+.LASF3204:
+	.string	"_copy_from_user"
+.LASF3230:
+	.string	"get_order"
+.LASF915:
+	.string	"si_errno"
+.LASF534:
+	.string	"s_inode_lru"
+.LASF2659:
+	.string	"sysctl_stat_interval"
+.LASF1094:
+	.string	"blk_plug"
+.LASF2754:
+	.string	"modules_disabled"
+.LASF2612:
+	.string	"PGSCAN_SKIP_DMA32"
+.LASF546:
+	.string	"sysctl_vfs_cache_pressure"
+.LASF2598:
+	.string	"compound_page_dtor"
+.LASF803:
+	.string	"refs"
+.LASF1732:
+	.string	"trace_events"
+.LASF1311:
+	.string	"env_start"
+.LASF2886:
+	.string	"DMA_FROM_DEVICE"
+.LASF755:
+	.string	"cpu_number"
+.LASF404:
+	.string	"d_flags"
+.LASF1281:
+	.string	"mm_rb"
+.LASF2155:
+	.string	"freeze_late"
+.LASF3069:
+	.string	"buf_info"
+.LASF409:
+	.string	"d_inode"
+.LASF1800:
+	.string	"hd_struct"
+.LASF1171:
+	.string	"UTASK_SSTEP"
+.LASF638:
+	.string	"real_parent"
+.LASF218:
+	.string	"locked"
+.LASF73:
+	.string	"exitcall_t"
+.LASF2920:
+	.string	"regs"
+.LASF1007:
+	.string	"slice_max"
+.LASF671:
+	.string	"last_switch_count"
+.LASF2137:
+	.string	"n_node"
+.LASF1592:
+	.string	"qsize_t"
+.LASF3227:
+	.string	"devm_kzalloc"
+.LASF380:
+	.string	"sequence"
+.LASF2499:
+	.string	"i2c_adapter_quirks"
+.LASF673:
+	.string	"files"
+.LASF1331:
+	.string	"file_caps_enabled"
+.LASF2962:
+	.string	"diff_percent"
+.LASF1881:
+	.string	"lock_manager_operations"
+.LASF1670:
+	.string	"s_state"
+.LASF1036:
+	.string	"run_list"
+.LASF2521:
+	.string	"SCHED_SOFTIRQ"
+.LASF1898:
+	.string	"fa_lock"
+.LASF2742:
+	.string	"mov0"
+.LASF2743:
+	.string	"mov1"
+.LASF2744:
+	.string	"mov2"
+.LASF2772:
+	.string	"module_sect_attrs"
+.LASF1839:
+	.string	"flc_lock"
+.LASF1179:
+	.string	"return_instance"
+.LASF2723:
+	.string	"param_ops_uint"
+.LASF861:
+	.string	"softirq_activated"
+.LASF3026:
+	.string	"pdev"
+.LASF797:
+	.string	"system_long_wq"
+.LASF157:
+	.string	"SYSTEM_RESTART"
+.LASF2226:
+	.string	"is_prepared"
+.LASF1986:
+	.string	"uevent_suppress"
+.LASF1486:
+	.string	"node_id"
+.LASF1554:
+	.string	"contig_page_data"
+.LASF2262:
+	.string	"autosuspend_delay"
+.LASF3042:
+	.string	"buffer_in"
+.LASF3:
+	.string	"unsigned int"
+.LASF899:
+	.string	"_addr_bnd"
+.LASF161:
+	.string	"c_true"
+.LASF1546:
+	.string	"notifier_call"
+.LASF3074:
+	.string	"ebc_exit"
+.LASF1801:
+	.string	"gendisk"
+.LASF1661:
+	.string	"spc_timelimit"
+.LASF512:
+	.string	"s_instances"
+.LASF2866:
+	.string	"EPD_AUTO_DU"
+.LASF2704:
+	.string	"sh_size"
+.LASF771:
+	.string	"desc"
+.LASF379:
+	.string	"seqcount"
+.LASF320:
+	.string	"__hyp_idmap_text_start"
+.LASF405:
+	.string	"d_seq"
+.LASF941:
+	.string	"rb_subtree_gap"
+.LASF1511:
+	.string	"zone_type"
+.LASF47:
+	.string	"size_t"
+.LASF209:
+	.string	"compat_elf_hwcap"
+.LASF3308:
+	.string	"prepare_to_wait_event"
+.LASF1078:
+	.string	"cap_permitted"
+.LASF3018:
+	.string	"__addressable_ebc_init3831"
+.LASF183:
+	.string	"TT_NATIVE"
+.LASF1520:
+	.string	"zone_pgdat"
+.LASF548:
+	.string	"pid_type"
+.LASF1656:
+	.string	"d_rt_spc_softlimit"
+.LASF42:
+	.string	"bool"
+.LASF372:
+	.string	"__cpu_active_mask"
+.LASF2370:
+	.string	"map_page"
+.LASF609:
+	.string	"rcu_tasks_idx"
+.LASF608:
+	.string	"rcu_tasks_holdout"
+.LASF1247:
+	.string	"f_count"
+.LASF1737:
+	.string	"target_list"
+.LASF1353:
+	.string	"RCU_BH_SYNC"
+.LASF284:
+	.string	"__init_end"
+.LASF1539:
+	.string	"zoneref"
+.LASF2761:
+	.string	"module_layout"
+.LASF527:
+	.string	"s_remove_count"
+.LASF217:
+	.string	"__reserved"
+.LASF910:
+	.string	"_sigfault"
+.LASF2827:
+	.string	"ebc_buf_status"
+.LASF1775:
+	.string	"empty_aops"
+.LASF87:
+	.string	"atomic_long_t"
+.LASF2079:
+	.string	"prealloc"
+.LASF1273:
+	.string	"pfn_mkwrite"
+.LASF70:
+	.string	"callback_head"
+.LASF342:
+	.string	"perf_event"
+.LASF1256:
+	.string	"f_security"
+.LASF452:
+	.string	"i_sb_list"
+.LASF2465:
+	.string	"detected"
+.LASF774:
+	.string	"read_cntpct_el0"
+.LASF1289:
+	.string	"pgtables_bytes"
+.LASF1815:
+	.string	"get_link"
+.LASF55:
+	.string	"fmode_t"
+.LASF2192:
+	.string	"devt"
+.LASF918:
+	.string	"siginfo_t"
+.LASF2152:
+	.string	"restore"
+.LASF1366:
+	.string	"delayed_call"
+.LASF890:
+	.string	"_status"
+.LASF2875:
+	.string	"pmic_name"
+.LASF1432:
+	.string	"NR_FREE_CMA_PAGES"
+.LASF2396:
+	.string	"kernel_ulong_t"
+.LASF2179:
+	.string	"dma_ops"
+.LASF2108:
+	.string	"bin_attribute"
+.LASF1571:
+	.string	"percpu_counter"
+.LASF2981:
+	.string	"first_in"
+.LASF2297:
+	.string	"dev_groups"
+.LASF2927:
+	.string	"image_addr_set"
+.LASF301:
+	.string	"__softirqentry_text_start"
+.LASF321:
+	.string	"__hyp_idmap_text_end"
+.LASF632:
+	.string	"memcg_kmem_skip_account"
+.LASF2343:
+	.string	"dl_dev_state"
+.LASF866:
+	.string	"expires_next"
+.LASF2056:
+	.string	"ida_bitmap"
+.LASF446:
+	.string	"i_io_list"
+.LASF1897:
+	.string	"fasync_struct"
+.LASF2258:
+	.string	"links_count"
+.LASF2602:
+	.string	"PGPGOUT"
+.LASF1630:
+	.string	"release_dqblk"
+.LASF188:
+	.string	"uaddr2"
+.LASF30:
+	.string	"__kernel_timer_t"
+.LASF1722:
+	.string	"notes_attrs"
+.LASF2452:
+	.string	"irqchip_fwnode_ops"
+.LASF1582:
+	.string	"dq_id"
+.LASF3143:
+	.string	"frame_count_tmp"
+.LASF3155:
+	.string	"image_fb"
+.LASF1757:
+	.string	"write_end"
+.LASF1467:
+	.string	"NR_ION_HEAP_POOL"
+.LASF1392:
+	.string	"sysctl_protected_hardlinks"
+.LASF3300:
+	.string	"__arch_copy_from_user"
+.LASF1145:
+	.string	"scan_objects"
+.LASF1521:
+	.string	"pageset"
+.LASF1206:
+	.string	"wb_err"
+.LASF3201:
+	.string	"copy_to_user"
+.LASF734:
+	.string	"trace_recursion"
+.LASF1305:
+	.string	"start_data"
+.LASF1751:
+	.string	"writepage"
+.LASF1981:
+	.string	"kref"
+.LASF1082:
+	.string	"jit_keyring"
+.LASF169:
+	.string	"file_disp"
+.LASF3132:
+	.string	"auto_need_refresh"
+.LASF2812:
+	.string	"WF_TYPE_GRAY2"
+.LASF1060:
+	.string	"rcu_special"
+.LASF651:
+	.string	"clear_child_tid"
+.LASF698:
+	.string	"backing_dev_info"
+.LASF2517:
+	.string	"NET_RX_SOFTIRQ"
+.LASF2397:
+	.string	"platform_device_id"
+.LASF537:
+	.string	"s_stack_depth"
+.LASF1298:
+	.string	"data_vm"
+.LASF11:
+	.string	"__s32"
+.LASF2454:
+	.string	"i2c_msg"
+.LASF768:
+	.string	"ate_match_acpi_oem_info"
+.LASF392:
+	.string	"nr_dentry"
+.LASF2151:
+	.string	"poweroff"
+.LASF2045:
+	.string	"stop"
+.LASF2564:
+	.string	"__tracepoint_page_ref_unfreeze"
+.LASF2033:
+	.string	"ratelimit_state"
+.LASF531:
+	.string	"s_pins"
+.LASF2496:
+	.string	"scl_gpiod"
+.LASF2051:
+	.string	"ioport_resource"
+.LASF2669:
+	.string	"init_on_alloc"
+.LASF2433:
+	.string	"param_count"
+.LASF2083:
+	.string	"attr"
+.LASF2409:
+	.string	"get_next_child_node"
+.LASF2778:
+	.string	"module_ktype"
+.LASF1983:
+	.string	"state_in_sysfs"
+.LASF1192:
+	.string	"vm_fault_t"
+.LASF1173:
+	.string	"UTASK_SSTEP_TRAPPED"
+.LASF333:
+	.string	"__entry_tramp_text_end"
+.LASF1275:
+	.string	"find_special_page"
+.LASF2549:
+	.string	"force_atomic"
+.LASF106:
+	.string	"poll"
+.LASF2412:
+	.string	"graph_get_next_endpoint"
+.LASF1378:
+	.string	"io_cq"
+.LASF2824:
+	.string	"epd_lut_data"
+.LASF2300:
+	.string	"probe"
+.LASF2690:
+	.string	"elf64_sym"
+.LASF2734:
+	.string	"latch_tree_node"
+.LASF1123:
+	.string	"cad_pid"
+.LASF2914:
+	.string	"lgonl"
+.LASF535:
+	.string	"destroy_work"
+.LASF254:
+	.string	"FTR_LOWER_SAFE"
+.LASF127:
+	.string	"clone_file_range"
+.LASF2488:
+	.string	"recover_bus"
+.LASF2236:
+	.string	"syscore"
+.LASF13:
+	.string	"__s64"
+.LASF836:
+	.string	"pcpu_chosen_fc"
+.LASF391:
+	.string	"dentry_stat_t"
+.LASF3250:
+	.string	"atomic_add"
+.LASF1611:
+	.string	"dqi_bgrace"
+.LASF22:
+	.string	"__kernel_pid_t"
+.LASF158:
+	.string	"SYSTEM_SUSPEND"
+.LASF908:
+	.string	"_timer"
+.LASF1564:
+	.string	"thread_sibling"
+.LASF2366:
+	.string	"dma_map_ops"
+.LASF1999:
+	.string	"ctl_table"
+.LASF44:
+	.string	"uid_t"
+.LASF3279:
+	.string	"strstr"
+.LASF2818:
+	.string	"WF_TYPE_A2"
+.LASF2794:
+	.string	"of_default_bus_match_table"
+.LASF1189:
+	.string	"__bp_harden_hyp_vecs_start"
+.LASF1229:
+	.string	"pgmap"
+.LASF490:
+	.string	"dq_op"
+.LASF2336:
+	.string	"sysfs_dev_char_kobj"
+.LASF607:
+	.string	"rcu_tasks_nvcsw"
+.LASF101:
+	.string	"write"
+.LASF2563:
+	.string	"__tracepoint_page_ref_freeze"
+.LASF2904:
+	.string	"panel_buffer"
+.LASF317:
+	.string	"__exception_text_end"
+.LASF2702:
+	.string	"sh_addr"
+.LASF275:
+	.string	"_text"
+.LASF1855:
+	.string	"fu_rcuhead"
+.LASF2678:
+	.string	"modprobe_path"
+.LASF2185:
+	.string	"dma_pools"
+.LASF2047:
+	.string	"arch_debugfs_dir"
+.LASF898:
+	.string	"_addr_lsb"
+.LASF2005:
+	.string	"ctl_table_poll"
+.LASF463:
+	.string	"i_generation"
+.LASF911:
+	.string	"_sigpoll"
+.LASF281:
+	.string	"__bss_start"
+.LASF1899:
+	.string	"magic"
+.LASF2280:
+	.string	"wakeup_count"
+.LASF970:
+	.string	"cpu_id_start"
+.LASF2408:
+	.string	"get_parent"
+.LASF1018:
+	.string	"nr_wakeups_affine"
+.LASF764:
+	.string	"arch_timer_read_ool_enabled"
+.LASF805:
+	.string	"pteval_t"
+.LASF430:
+	.string	"i_ino"
+.LASF3326:
+	.string	"might_fault"
+.LASF1530:
+	.string	"compact_cached_free_pfn"
+.LASF850:
+	.string	"index"
+.LASF2172:
+	.string	"driver_data"
+.LASF2912:
+	.string	"sdck"
+.LASF2777:
+	.string	"module_kset"
+.LASF2387:
+	.string	"removed_region"
+.LASF2138:
+	.string	"n_ref"
+.LASF873:
+	.string	"tick_cpu_device"
+.LASF3170:
+	.string	"ebc_get_8pix_wf_part"
+.LASF1901:
+	.string	"fa_next"
+.LASF1244:
+	.string	"f_op"
+.LASF2672:
+	.string	"randomize_va_space"
+.LASF2548:
+	.string	"confirm_switch"
+.LASF2862:
+	.string	"EPD_SUSPEND"
+.LASF381:
+	.string	"seqcount_t"
+.LASF1813:
+	.string	"inode_operations"
+.LASF2418:
+	.string	"port"
+.LASF2799:
+	.string	"usercopy_fallback"
+.LASF896:
+	.string	"_dummy_pkey"
+.LASF2792:
+	.string	"id_table"
+.LASF1581:
+	.string	"dq_sb"
+.LASF872:
+	.string	"tick_device"
+.LASF128:
+	.string	"dedupe_file_range"
+.LASF1163:
+	.string	"radix_tree_root"
+.LASF1092:
+	.string	"sighand_struct"
+.LASF2808:
+	.string	"sched_param"
+.LASF1320:
+	.string	"tlb_flush_pending"
+.LASF171:
+	.string	"flags"
+.LASF710:
+	.string	"cpuset_slab_spread_rotor"
+.LASF1917:
+	.string	"i_lock_key"
+.LASF1216:
+	.string	"kmem_cache"
+.LASF2648:
+	.string	"KCOMPACTD_FREE_SCANNED"
+.LASF418:
+	.string	"inode"
+.LASF2747:
+	.string	"drivers_dir"
+.LASF1422:
+	.string	"NR_ZONE_ACTIVE_ANON"
+.LASF167:
+	.string	"bug_entry"
+.LASF288:
+	.string	"__end_ro_after_init"
+.LASF3146:
+	.string	"wf_index_tmp1"
+.LASF1363:
+	.string	"rw_sem"
+.LASF1741:
+	.string	"dqio_sem"
+.LASF1029:
+	.string	"prev_sum_exec_runtime"
+.LASF1706:
+	.string	"gpl_future_syms"
+.LASF2848:
+	.string	"EPD_FULL_GLR16"
+.LASF1012:
+	.string	"nr_forced_migrations"
+.LASF2044:
+	.string	"seq_operations"
+.LASF637:
+	.string	"stack_canary"
+.LASF3104:
+	.string	"no_black_count"
+.LASF1129:
+	.string	"blksize"
+.LASF641:
+	.string	"sibling"
+.LASF1254:
+	.string	"f_ra"
+.LASF1946:
+	.string	"quota_write"
+.LASF1966:
+	.string	"fi_extents_max"
+.LASF2449:
+	.string	"translate"
+.LASF2490:
+	.string	"set_scl"
+.LASF1825:
+	.string	"rmdir"
+.LASF2101:
+	.string	"sock"
+.LASF387:
+	.string	"hash_len"
+.LASF842:
+	.string	"HRTIMER_RESTART"
+.LASF2182:
+	.string	"bus_dma_mask"
+.LASF561:
+	.string	"pidfd_fops"
+.LASF1885:
+	.string	"lm_put_owner"
+.LASF3281:
+	.string	"ebc_pmic_verity_vcom"
+.LASF2492:
+	.string	"set_sda"
+.LASF474:
+	.string	"d_init"
+.LASF1276:
+	.string	"core_thread"
+.LASF1750:
+	.string	"address_space_operations"
+.LASF952:
+	.string	"vm_userfaultfd_ctx"
+.LASF2319:
+	.string	"devnode"
+.LASF849:
+	.string	"cpu_base"
+.LASF1210:
+	.string	"objects"
+.LASF2403:
+	.string	"device_is_available"
+.LASF1573:
+	.string	"dquot"
+.LASF1043:
+	.string	"dl_runtime"
+.LASF3107:
+	.string	"lut_type"
+.LASF85:
+	.string	"initcall_debug"
+.LASF559:
+	.string	"numbers"
+.LASF844:
+	.string	"_softexpires"
+.LASF2031:
+	.string	"key_user"
+.LASF2039:
+	.string	"printk_ratelimit_state"
+.LASF1336:
+	.string	"semaphore"
+.LASF647:
+	.string	"thread_group"
+.LASF2303:
+	.string	"shutdown"
+.LASF1578:
+	.string	"dq_lock"
+.LASF1808:
+	.string	"i_cdev"
+.LASF351:
+	.string	"sve_vl_onexec"
+.LASF1312:
+	.string	"env_end"
+.LASF1597:
+	.string	"dqb_bhardlimit"
+.LASF2003:
+	.string	"extra1"
+.LASF700:
+	.string	"ptrace_message"
+.LASF1733:
+	.string	"num_trace_events"
+.LASF889:
+	.string	"_sys_private"
+.LASF2391:
+	.string	"properties"
+.LASF523:
+	.string	"s_subtype"
+.LASF71:
+	.string	"func"
+.LASF1109:
+	.string	"perf_event_context"
+.LASF2995:
+	.string	"ebc_auto_task"
+.LASF94:
+	.string	"printk_delay_msec"
+.LASF2667:
+	.string	"mmap_pages_allocated"
+.LASF959:
+	.string	"tlbflush_unmap_batch"
+.LASF2141:
+	.string	"power_group_name"
+.LASF778:
+	.string	"clock_event_device"
+.LASF1167:
+	.string	"m_count"
+.LASF2132:
+	.string	"hypervisor_kobj"
+.LASF604:
+	.string	"rcu_read_unlock_special"
+.LASF913:
+	.string	"siginfo"
+.LASF966:
+	.string	"read_bytes"
+.LASF323:
+	.string	"__hyp_text_end"
+.LASF1960:
+	.string	"fsverity_operations"
+.LASF1061:
+	.string	"wake_q_node"
+.LASF1085:
+	.string	"request_key_auth"
+.LASF3006:
+	.string	"waveform_misc"
+.LASF1922:
+	.string	"destroy_inode"
+.LASF2952:
+	.string	"is_busy_now"
+.LASF58:
+	.string	"irq_hw_number_t"
+.LASF2335:
+	.string	"sysfs_dev_block_kobj"
+.LASF554:
+	.string	"upid"
+.LASF1067:
+	.string	"completion"
+.LASF2941:
+	.string	"DATA_CALC_RIGHT"
+.LASF1468:
+	.string	"NR_GPU_HEAP"
+.LASF831:
+	.string	"PCPU_FC_AUTO"
+.LASF1875:
+	.string	"fl_break_time"
+.LASF1172:
+	.string	"UTASK_SSTEP_ACK"
+.LASF77:
+	.string	"__con_initcall_end"
+.LASF1114:
+	.string	"active_uprobe"
+.LASF1940:
+	.string	"show_options"
+.LASF2111:
+	.string	"uevent_helper"
+.LASF3000:
+	.string	"ebc_assist_finished_flag_sem"
+.LASF2950:
+	.string	"lut_buffer_phy"
+.LASF110:
+	.string	"mmap_supported_flags"
+.LASF51:
+	.string	"sector_t"
+.LASF1186:
+	.string	"bp_hardening_cb_t"
+.LASF1777:
+	.string	"bd_dev"
+.LASF1816:
+	.string	"permission"
+.LASF1485:
+	.string	"node_spanned_pages"
+.LASF891:
+	.string	"_utime"
+.LASF2217:
+	.string	"pm_subsys_data"
+.LASF3303:
+	.string	"ebc_empty_osd_buf_get"
+.LASF2318:
+	.string	"device_type"
+.LASF1124:
+	.string	"thread_union"
+.LASF1780:
+	.string	"bd_super"
+.LASF2677:
+	.string	"usermodehelper_table"
+.LASF160:
+	.string	"taint_flag"
+.LASF1947:
+	.string	"get_dquots"
+.LASF3290:
+	.string	"of_find_node_by_phandle"
+.LASF2371:
+	.string	"unmap_page"
+.LASF798:
+	.string	"system_unbound_wq"
+.LASF517:
+	.string	"s_uuid"
+.LASF1635:
+	.string	"destroy_dquot"
+.LASF1647:
+	.string	"d_ino_hardlimit"
+.LASF1845:
+	.string	"fsverity_info"
+.LASF2009:
+	.string	"nr_leaves_on_tree"
+.LASF2975:
+	.string	"prev_osd_buf"
+.LASF1680:
+	.string	"quota_on"
+.LASF2427:
+	.string	"of_root"
+.LASF1264:
+	.string	"vm_operations_struct"
+.LASF2359:
+	.string	"hwirq_max"
+.LASF2933:
+	.string	"ebc_refresh_mode"
+.LASF3248:
+	.string	"__fswab32"
+.LASF2167:
+	.string	"runtime_idle"
+.LASF1861:
+	.string	"fl_next"
+.LASF2495:
+	.string	"unprepare_recovery"
+.LASF441:
+	.string	"i_state"
+.LASF593:
+	.string	"sched_class"
+.LASF1939:
+	.string	"umount_end"
+.LASF691:
+	.string	"pi_waiters"
+.LASF2626:
+	.string	"PGSCAN_DIRECT"
+.LASF1225:
+	.string	"pt_frag_refcount"
+.LASF1817:
+	.string	"permission2"
+.LASF1674:
+	.string	"i_ino_timelimit"
+.LASF226:
+	.string	"cnts"
+.LASF2209:
+	.string	"RPM_SUSPENDED"
+.LASF697:
+	.string	"reclaim_state"
+.LASF3325:
+	.string	"/home/lyx/rk3566-11-eink/kernel"
+.LASF138:
+	.string	"vendor_panic_cb"
+.LASF2767:
+	.string	"num_symtab"
+.LASF1567:
+	.string	"cpu_scale"
+.LASF2614:
+	.string	"PGSCAN_SKIP_MOVABLE"
+.LASF1924:
+	.string	"write_inode"
+.LASF415:
+	.string	"d_fsdata"
+.LASF2210:
+	.string	"RPM_SUSPENDING"
+.LASF2581:
+	.string	"mmap_rnd_bits_max"
+.LASF1200:
+	.string	"nrpages"
+.LASF816:
+	.string	"_refcount"
+.LASF466:
+	.string	"i_crypt_info"
+.LASF3064:
+	.string	"waveform_mmap"
+.LASF1840:
+	.string	"flc_flock"
+.LASF2745:
+	.string	"module_alloc_base"
+.LASF1720:
+	.string	"core_kallsyms"
+.LASF3284:
+	.string	"memcpy"
+.LASF2865:
+	.string	"EPD_FORCE_FULL"
+.LASF2369:
+	.string	"get_sgtable"
+.LASF3137:
+	.string	"xor_val"
+.LASF2124:
+	.string	"envp_idx"
+.LASF465:
+	.string	"i_fsnotify_marks"
+.LASF1984:
+	.string	"state_add_uevent_sent"
+.LASF2637:
+	.string	"OOM_KILL"
+.LASF445:
+	.string	"i_hash"
+.LASF3122:
+	.string	"gray_old"
+.LASF68:
+	.string	"hlist_node"
+.LASF3293:
+	.string	"sprintf"
+.LASF1877:
+	.string	"fl_ops"
+.LASF1684:
+	.string	"quota_sync"
+.LASF2676:
+	.string	"debug_guardpage_ops"
+.LASF2642:
+	.string	"COMPACTISOLATED"
+.LASF3261:
+	.string	"of_property_read_variable_u32_array"
+.LASF328:
+	.string	"__inittext_begin"
+.LASF1364:
+	.string	"writer"
+.LASF763:
+	.string	"arch_timer_read_counter"
+.LASF270:
+	.string	"ftr_bits"
+.LASF627:
+	.string	"sched_remote_wakeup"
+.LASF2148:
+	.string	"resume"
+.LASF690:
+	.string	"wake_q"
+.LASF2644:
+	.string	"COMPACTFAIL"
+.LASF695:
+	.string	"bio_list"
+.LASF1633:
+	.string	"write_dquot"
+.LASF2621:
+	.string	"PGLAZYFREED"
+.LASF1317:
+	.string	"ioctx_lock"
+.LASF311:
+	.string	"current_stack_pointer"
+.LASF2803:
+	.string	"NR_KMALLOC_TYPES"
+.LASF1177:
+	.string	"dup_xol_addr"
+.LASF2443:
+	.string	"DOMAIN_BUS_WAKEUP"
+.LASF1191:
+	.string	"arm64_el2_vector_last_slot"
+.LASF2304:
+	.string	"online"
+.LASF2166:
+	.string	"runtime_resume"
+.LASF1176:
+	.string	"dup_xol_work"
+.LASF3194:
+	.string	"ebc_pmic_read_temp"
+.LASF2846:
+	.string	"EPD_FULL_GC16"
+.LASF3012:
+	.string	"dev_attr_ebc_state"
+.LASF2130:
+	.string	"kernel_kobj"
+.LASF2556:
+	.string	"funcs"
+.LASF2987:
+	.string	"overlay_enable"
+.LASF1076:
+	.string	"securebits"
+.LASF2681:
+	.string	"Elf64_Off"
+.LASF1296:
+	.string	"total_vm"
+.LASF622:
+	.string	"jobctl"
+.LASF2844:
+	.string	"EPD_AUTO"
+.LASF332:
+	.string	"__entry_tramp_text_start"
+.LASF820:
+	.string	"node_list"
+.LASF2440:
+	.string	"DOMAIN_BUS_NEXUS"
+.LASF2007:
+	.string	"sysctl_mount_point"
+.LASF267:
+	.string	"user_mask"
+.LASF2711:
+	.string	"kernel_param"
+.LASF2250:
+	.string	"deferred_resume"
+.LASF1646:
+	.string	"d_spc_softlimit"
+.LASF54:
+	.string	"gfp_t"
+.LASF338:
+	.string	"bps_disabled"
+.LASF876:
+	.string	"seccomp_filter"
+.LASF779:
+	.string	"timer_unstable_counter_workaround"
+.LASF653:
+	.string	"stime"
+.LASF1198:
+	.string	"i_mmap"
+.LASF1121:
+	.string	"phys_addr"
+.LASF398:
+	.string	"d_lru"
+.LASF2377:
+	.string	"sync_single_for_device"
+.LASF1091:
+	.string	"signal_struct"
+.LASF718:
+	.string	"perf_event_mutex"
+.LASF1099:
+	.string	"nr_batch_requests"
+.LASF1428:
+	.string	"NR_PAGETABLE"
+.LASF1697:
+	.string	"crcs"
+.LASF2652:
+	.string	"UNEVICTABLE_PGMLOCKED"
+.LASF807:
+	.string	"pgdval_t"
+.LASF2889:
+	.string	"page_link"
+.LASF1828:
+	.string	"setattr"
+.LASF906:
+	.string	"_pad"
+.LASF1259:
+	.string	"f_mapping"
+.LASF2145:
+	.string	"prepare"
+.LASF2107:
+	.string	"bin_attrs"
+.LASF2899:
+	.string	"HYPERVISOR_shared_info"
+.LASF682:
+	.string	"sas_ss_flags"
+.LASF1249:
+	.string	"f_mode"
+.LASF1398:
+	.string	"ki_complete"
+.LASF3029:
+	.string	"ebc_tcon_pdev"
+.LASF1724:
+	.string	"percpu"
+.LASF583:
+	.string	"wakee_flips"
+.LASF1836:
+	.string	"set_acl"
+.LASF2029:
+	.string	"keys"
+.LASF299:
+	.string	"__irqentry_text_start"
+.LASF563:
+	.string	"overflowuid"
+.LASF800:
+	.string	"system_power_efficient_wq"
+.LASF3172:
+	.string	"ebc_get_8pix_wf2"
+.LASF2170:
+	.string	"driver"
+.LASF1513:
+	.string	"ZONE_NORMAL"
+.LASF3156:
+	.string	"image_new_data"
+.LASF426:
+	.string	"i_op"
+.LASF1655:
+	.string	"d_rt_spc_hardlimit"
+.LASF2994:
+	.string	"ebc_task"
+.LASF2095:
+	.string	"kobj_ns_type_operations"
+.LASF1361:
+	.string	"percpu_rw_semaphore"
+.LASF596:
+	.string	"boost_period"
+.LASF2425:
+	.string	"of_node_ktype"
+.LASF668:
+	.string	"cred"
+.LASF241:
+	.string	"jump_entry"
+.LASF2580:
+	.string	"mmap_rnd_bits_min"
+.LASF1412:
+	.string	"migratetype_names"
+.LASF1152:
+	.string	"list_lru_node"
+.LASF394:
+	.string	"age_limit"
+.LASF2851:
+	.string	"EPD_PART_GC16"
+.LASF237:
+	.string	"spinlock_t"
+.LASF2098:
+	.string	"netlink_ns"
+.LASF363:
+	.string	"wait_queue_head"
+.LASF791:
+	.string	"work_func_t"
+.LASF2191:
+	.string	"fwnode"
+.LASF1768:
+	.string	"is_dirty_writeback"
+.LASF302:
+	.string	"__softirqentry_text_end"
+.LASF1731:
+	.string	"trace_bprintk_fmt_start"
+.LASF665:
+	.string	"cpu_timers"
+.LASF2925:
+	.string	"disable"
+.LASF1269:
+	.string	"huge_fault"
+.LASF1977:
+	.string	"kstatfs"
+.LASF3197:
+	.string	"ebc_pmic_power_off"
+.LASF2603:
+	.string	"PGPGOUTCLEAN"
+.LASF580:
+	.string	"ptrace"
+.LASF2272:
+	.string	"max_time"
+.LASF1562:
+	.string	"package_id"
+.LASF104:
+	.string	"iterate"
+.LASF1153:
+	.string	"memcg_lrus"
+.LASF1804:
+	.string	"i_dentry"
+.LASF2097:
+	.string	"grab_current_ns"
+.LASF3049:
+	.string	"fb_size"
+.LASF854:
+	.string	"offset"
+.LASF1235:
+	.string	"altmap"
+.LASF1843:
+	.string	"fsnotify_mark_connector"
+.LASF912:
+	.string	"_sigsys"
+.LASF3105:
+	.string	"ebc_lut_update"
+.LASF1890:
+	.string	"lm_setup"
+.LASF427:
+	.string	"i_sb"
+.LASF348:
+	.string	"fpsimd_cpu"
+.LASF2759:
+	.string	"MODULE_STATE_UNFORMED"
+.LASF194:
+	.string	"expires"
+.LASF1349:
+	.string	"rcuwait"
+.LASF330:
+	.string	"__mmuoff_data_start"
+.LASF659:
+	.string	"nivcsw"
+.LASF2466:
+	.string	"i2c_adapter"
+.LASF1341:
+	.string	"fe_reserved64"
+.LASF2347:
+	.string	"DL_DEV_UNBINDING"
+.LASF355:
+	.string	"signal_minsigstksz"
+.LASF750:
+	.string	"thread"
+.LASF2317:
+	.string	"subsys_private"
+.LASF2530:
+	.string	"idmap_pg_dir"
+.LASF2487:
+	.string	"i2c_bus_recovery_info"
+.LASF2951:
+	.string	"lut_buffer_size"
+.LASF484:
+	.string	"s_dev"
+.LASF346:
+	.string	"fpsimd_state"
+.LASF1631:
+	.string	"get_next_id"
+.LASF238:
+	.string	"rwlock_t"
+.LASF3324:
+	.string	"drivers/gpu/drm/rockchip/ebc-dev/ebc_dev.c"
+.LASF811:
+	.string	"pgprot"
+.LASF17:
+	.string	"false"
+.LASF1943:
+	.string	"show_path"
+.LASF1221:
+	.string	"_compound_pad_1"
+.LASF1222:
+	.string	"_compound_pad_2"
+.LASF550:
+	.string	"PIDTYPE_TGID"
+.LASF1884:
+	.string	"lm_get_owner"
+.LASF2876:
+	.string	"drvpar"
+.LASF2600:
+	.string	"vm_event_item"
+.LASF2539:
+	.string	"kthreadd_task"
+.LASF1774:
+	.string	"swap_info_struct"
+.LASF88:
+	.string	"__icache_flags"
+.LASF148:
+	.string	"crash_kexec_post_notifiers"
+.LASF3182:
+	.string	"eink_mode"
+.LASF1666:
+	.string	"rt_spc_warnlimit"
+.LASF1159:
+	.string	"exceptional"
+.LASF3118:
+	.string	"direct_mode_data_change_part2"
+.LASF1964:
+	.string	"fi_flags"
+.LASF1548:
+	.string	"blocking_notifier_head"
+.LASF2316:
+	.string	"coredump"
+.LASF3081:
+	.string	"need_type"
+.LASF278:
+	.string	"_data"
+.LASF1502:
+	.string	"vm_stat"
+.LASF557:
+	.string	"tasks"
+.LASF884:
+	.string	"_pid"
+.LASF3150:
+	.string	"data_buf_tmp1"
+.LASF1125:
+	.string	"init_stack"
+.LASF3158:
+	.string	"dmask"
+.LASF1194:
+	.string	"address_space"
+.LASF1185:
+	.string	"mm_context_t"
+.LASF1280:
+	.string	"startup"
+.LASF1387:
+	.string	"sysctl_nr_open"
+.LASF82:
+	.string	"reset_devices"
+.LASF447:
+	.string	"i_wb"
+.LASF2055:
+	.string	"idr_next"
+.LASF3134:
+	.string	"frame_count_data"
+.LASF2930:
+	.string	"frame_start"
+.LASF1219:
+	.string	"compound_order"
+.LASF1223:
+	.string	"deferred_list"
+.LASF924:
+	.string	"locked_shm"
+.LASF1056:
+	.string	"inactive_timer"
+.LASF897:
+	.string	"_pkey"
+.LASF289:
+	.string	"_end"
+.LASF478:
+	.string	"d_dname"
+.LASF1699:
+	.string	"param_lock"
+.LASF943:
+	.string	"vm_page_prot"
+.LASF179:
+	.string	"timespec64"
+.LASF552:
+	.string	"PIDTYPE_SID"
+.LASF2374:
+	.string	"map_resource"
+.LASF476:
+	.string	"d_prune"
+.LASF83:
+	.string	"rodata_enabled"
+.LASF2036:
+	.string	"printed"
+.LASF318:
+	.string	"__hibernate_exit_text_start"
+.LASF2160:
+	.string	"resume_noirq"
+.LASF1519:
+	.string	"lowmem_reserve"
+.LASF815:
+	.string	"page"
+.LASF1642:
+	.string	"get_inode_usage"
+.LASF2388:
+	.string	"device_node"
+.LASF591:
+	.string	"normal_prio"
+.LASF1257:
+	.string	"f_ep_links"
+.LASF2263:
+	.string	"last_busy"
+.LASF1806:
+	.string	"i_pipe"
+.LASF845:
+	.string	"base"
+.LASF1195:
+	.string	"host"
+.LASF185:
+	.string	"uaddr"
+.LASF661:
+	.string	"real_start_time"
+.LASF28:
+	.string	"__kernel_time_t"
+.LASF1961:
+	.string	"unicode_map"
+.LASF2536:
+	.string	"MEMREMAP_WC"
+.LASF2413:
+	.string	"graph_get_remote_endpoint"
+.LASF1536:
+	.string	"contiguous"
+.LASF1299:
+	.string	"exec_vm"
+.LASF2535:
+	.string	"MEMREMAP_WT"
+.LASF2691:
+	.string	"st_name"
+.LASF228:
+	.string	"wait_lock"
+.LASF1778:
+	.string	"bd_openers"
+.LASF701:
+	.string	"last_siginfo"
+.LASF1921:
+	.string	"alloc_inode"
+.LASF2802:
+	.string	"KMALLOC_RECLAIM"
+.LASF410:
+	.string	"d_iname"
+.LASF2194:
+	.string	"devres_head"
+.LASF428:
+	.string	"i_mapping"
+.LASF3285:
+	.string	"misc_register"
+.LASF722:
+	.string	"rseq_sig"
+.LASF3216:
+	.string	"platform_set_drvdata"
+.LASF343:
+	.string	"cpu_context"
+.LASF2284:
+	.string	"dev_pm_domain"
+.LASF1482:
+	.string	"nr_zones"
+.LASF2942:
+	.string	"DATA_CALC_LEFT"
+.LASF3235:
+	.string	"is_source"
+.LASF1344:
+	.string	"migrate_mode"
+.LASF2657:
+	.string	"SWAP_RA_HIT"
+.LASF616:
+	.string	"vmacache"
+.LASF1414:
+	.string	"free_area"
+.LASF1492:
+	.string	"kswapd_failures"
+.LASF2157:
+	.string	"poweroff_late"
+.LASF847:
+	.string	"is_soft"
+.LASF176:
+	.string	"timezone"
+.LASF406:
+	.string	"d_hash"
+.LASF1046:
+	.string	"dl_bw"
+.LASF3209:
+	.string	"limit"
+.LASF2114:
+	.string	"kobj"
+.LASF3294:
+	.string	"kstrtouint"
+.LASF114:
+	.string	"fsync"
+.LASF1962:
+	.string	"mtd_info"
+.LASF423:
+	.string	"i_flags"
+.LASF2863:
+	.string	"EPD_RESUME"
+.LASF3280:
+	.string	"sscanf"
+.LASF3275:
+	.string	"ebc_empty_buf_get"
+.LASF1443:
+	.string	"NR_ISOLATED_ANON"
+.LASF3051:
+	.string	"ebc_lut_table_init"
+.LASF1182:
+	.string	"uprobes_state"
+.LASF1522:
+	.string	"cma_alloc"
+.LASF821:
+	.string	"rb_node"
+.LASF613:
+	.string	"pushable_tasks"
+.LASF2171:
+	.string	"platform_data"
+.LASF1365:
+	.string	"readers_block"
+.LASF676:
+	.string	"sighand"
+.LASF105:
+	.string	"iterate_shared"
+.LASF2104:
+	.string	"is_visible"
+.LASF675:
+	.string	"signal"
+.LASF2090:
+	.string	"released"
+.LASF2586:
+	.string	"sysctl_max_map_count"
+.LASF1634:
+	.string	"alloc_dquot"
+.LASF2142:
+	.string	"pm_message"
+.LASF525:
+	.string	"cleancache_poolid"
+.LASF817:
+	.string	"mem_cgroup"
+.LASF986:
+	.string	"last_update_time"
+.LASF1106:
+	.string	"robust_list_head"
+.LASF3273:
+	.string	"init_timer_key"
+.LASF1449:
+	.string	"NR_ANON_MAPPED"
+.LASF383:
+	.string	"count"
+.LASF3002:
+	.string	"resume_count_start"
+.LASF2998:
+	.string	"ebc_auto_assist_task"
+.LASF556:
+	.string	"level"
+.LASF532:
+	.string	"s_user_ns"
+.LASF1694:
+	.string	"srcversion"
+.LASF829:
+	.string	"pcpu_unit_offsets"
+.LASF3185:
+	.string	"dma_sync_single_for_device"
+.LASF2931:
+	.string	"dsp_end_callback"
+.LASF461:
+	.string	"i_data"
+.LASF1976:
+	.string	"poll_event"
+.LASF2525:
+	.string	"softirq_to_name"
+.LASF66:
+	.string	"hlist_head"
+.LASF506:
+	.string	"s_encoding_flags"
+.LASF1024:
+	.string	"runnable_weight"
+.LASF2415:
+	.string	"graph_parse_endpoint"
+.LASF1370:
+	.string	"uuid_null"
+.LASF1300:
+	.string	"stack_vm"
+.LASF2245:
+	.string	"usage_count"
+.LASF2046:
+	.string	"show"
+.LASF3009:
+	.string	"dev_attr_pmic_temp"
+.LASF7:
+	.string	"unsigned char"
+.LASF1938:
+	.string	"umount_begin"
+.LASF1184:
+	.string	"vdso"
+.LASF1284:
+	.string	"mmap_legacy_base"
+.LASF2633:
+	.string	"PAGEOUTRUN"
+.LASF953:
+	.string	"task_rss_stat"
+.LASF1110:
+	.string	"pipe_inode_info"
+.LASF2971:
+	.string	"ebc_power_status"
+.LASF931:
+	.string	"ratelimit"
+.LASF2457:
+	.string	"word"
+.LASF1982:
+	.string	"state_initialized"
+.LASF819:
+	.string	"prio_list"
+.LASF2511:
+	.string	"nmi_contexts"
+.LASF2115:
+	.string	"uevent_ops"
+.LASF545:
+	.string	"rename_lock"
+.LASF3084:
+	.string	"__out"
+.LASF680:
+	.string	"sas_ss_sp"
+.LASF1421:
+	.string	"NR_ZONE_INACTIVE_ANON"
+.LASF728:
+	.string	"nr_dirtied"
+.LASF3226:
+	.string	"dev_get_drvdata"
+.LASF2364:
+	.string	"linear_revmap"
+.LASF335:
+	.string	"arm64_dma_phys_limit"
+.LASF1419:
+	.string	"NR_FREE_PAGES"
+.LASF3144:
+	.string	"frame_count_tmp1"
+.LASF522:
+	.string	"s_vfs_rename_mutex"
+.LASF2153:
+	.string	"suspend_late"
+.LASF2234:
+	.string	"wakeup"
+.LASF712:
+	.string	"cg_list"
+.LASF1789:
+	.string	"bd_partno"
+.LASF1910:
+	.string	"alloc_mnt_data"
+.LASF2938:
+	.string	"data_calc_mode"
+.LASF1796:
+	.string	"bd_list"
+.LASF2233:
+	.string	"driver_flags"
+.LASF1166:
+	.string	"rw_semaphore"
+.LASF2154:
+	.string	"resume_early"
+.LASF1903:
+	.string	"fa_rcu"
+.LASF1835:
+	.string	"tmpfile"
+.LASF1742:
+	.string	"info"
+.LASF155:
+	.string	"SYSTEM_HALT"
+.LASF1832:
+	.string	"fiemap"
+.LASF2400:
+	.string	"waiters"
+.LASF2673:
+	.string	"sysctl_memory_failure_early_kill"
+.LASF2729:
+	.string	"param_ops_bool_enable_only"
+.LASF3166:
+	.string	"power_status"
+.LASF307:
+	.string	"__start_opd"
+.LASF3289:
+	.string	"of_find_i2c_device_by_node"
+.LASF154:
+	.string	"SYSTEM_RUNNING"
+.LASF2816:
+	.string	"WF_TYPE_GLR16"
+.LASF917:
+	.string	"_sifields"
+.LASF1993:
+	.string	"page_symlink_inode_operations"
+.LASF735:
+	.string	"memcg_in_oom"
+.LASF480:
+	.string	"d_manage"
+.LASF1102:
+	.string	"icq_hint"
+.LASF1963:
+	.string	"fiemap_extent_info"
+.LASF2885:
+	.string	"DMA_TO_DEVICE"
+.LASF2698:
+	.string	"elf64_shdr"
+.LASF298:
+	.string	"__end_rodata"
+.LASF770:
+	.string	"match_type"
+.LASF2716:
+	.string	"elem"
+.LASF863:
+	.string	"nr_retries"
+.LASF2627:
+	.string	"PGSCAN_DIRECT_THROTTLE"
+.LASF883:
+	.string	"sigval_t"
+.LASF1902:
+	.string	"fa_file"
+.LASF2992:
+	.string	"panel"
+.LASF2956:
+	.string	"auto_need_refresh1"
+.LASF2401:
+	.string	"irq_data"
+.LASF3092:
+	.string	"old_buffer_temp"
+.LASF2674:
+	.string	"sysctl_memory_failure_recovery"
+.LASF2661:
+	.string	"vm_event_states"
+.LASF407:
+	.string	"d_parent"
+.LASF2037:
+	.string	"missed"
+.LASF150:
+	.string	"root_mountflags"
+.LASF3149:
+	.string	"get_overlay_image_area"
+.LASF1945:
+	.string	"quota_read"
+.LASF3088:
+	.string	"check_diff_percent"
+.LASF2694:
+	.string	"st_shndx"
+.LASF2368:
+	.string	"free"
+.LASF3057:
+	.string	"pmic_vcom_write"
+.LASF2102:
+	.string	"attribute"
+.LASF449:
+	.string	"i_wb_frn_avg_time"
+.LASF2625:
+	.string	"PGSCAN_KSWAPD"
+.LASF1798:
+	.string	"bd_fsfreeze_count"
+.LASF193:
+	.string	"type"
+.LASF164:
+	.string	"taint_flags"
+.LASF1316:
+	.string	"membarrier_state"
+.LASF3176:
+	.string	"pre_image_addr"
+.LASF2147:
+	.string	"suspend"
+.LASF1711:
+	.string	"init"
+.LASF1090:
+	.string	"files_struct"
+.LASF103:
+	.string	"write_iter"
+.LASF500:
+	.string	"s_security"
+.LASF656:
+	.string	"max_state"
+.LASF530:
+	.string	"s_dio_done_wq"
+.LASF2636:
+	.string	"DROP_SLAB"
+.LASF893:
+	.string	"_dummy_bnd"
+.LASF681:
+	.string	"sas_ss_size"
+.LASF2437:
+	.string	"DOMAIN_BUS_WIRED"
+.LASF1020:
+	.string	"nr_wakeups_passive"
+.LASF1906:
+	.string	"file_system_type"
+.LASF1992:
+	.string	"generic_ro_fops"
+.LASF1134:
+	.string	"mtime"
+.LASF1325:
+	.string	"vm_fault"
+.LASF1351:
+	.string	"RCU_SYNC"
+.LASF1525:
+	.string	"spanned_pages"
+.LASF2121:
+	.string	"kobj_uevent_env"
+.LASF2066:
+	.string	"deactivate_waitq"
+.LASF981:
+	.string	"inv_weight"
+.LASF1923:
+	.string	"dirty_inode"
+.LASF1538:
+	.string	"vm_numa_stat"
+.LASF1481:
+	.string	"node_zonelists"
+.LASF542:
+	.string	"path"
+.LASF2696:
+	.string	"st_size"
+.LASF3013:
+	.string	"dev_attr_ebc_buf_state"
+.LASF189:
+	.string	"rmtp"
+.LASF2395:
+	.string	"platform_notify_remove"
+.LASF998:
+	.string	"wait_sum"
+.LASF1726:
+	.string	"num_tracepoints"
+.LASF619:
+	.string	"exit_code"
+.LASF1027:
+	.string	"exec_start"
+.LASF3321:
+	.string	"printk"
+.LASF2350:
+	.string	"consumers"
+.LASF2067:
+	.string	"kernfs_elem_symlink"
+.LASF1150:
+	.string	"nr_items"
+.LASF2474:
+	.string	"userspace_clients_lock"
+.LASF857:
+	.string	"clock_was_set_seq"
+.LASF1255:
+	.string	"f_version"
+.LASF141:
+	.string	"panic_timeout"
+.LASF1168:
+	.string	"arch_uprobe_task"
+.LASF459:
+	.string	"i_fop"
+.LASF2857:
+	.string	"EPD_A2_DITHER"
+.LASF1822:
+	.string	"unlink"
+.LASF2686:
+	.string	"d_ptr"
+.LASF3059:
+	.string	"pmic_temp_read"
+.LASF1621:
+	.string	"dqstats"
+.LASF990:
+	.string	"period_contrib"
+.LASF605:
+	.string	"rcu_node_entry"
+.LASF1637:
+	.string	"release_dquot"
+.LASF1383:
+	.string	"max_files"
+.LASF1075:
+	.string	"fsgid"
+.LASF2309:
+	.string	"need_parent_lock"
+.LASF1354:
+	.string	"rcu_sync"
+.LASF2582:
+	.string	"mmap_rnd_bits"
+.LASF2430:
+	.string	"of_stdout"
+.LASF947:
+	.string	"vm_ops"
+.LASF2905:
+	.string	"ebc_panel"
+.LASF1271:
+	.string	"pagesize"
+.LASF486:
+	.string	"s_blocksize"
+.LASF948:
+	.string	"vm_pgoff"
+.LASF2270:
+	.string	"timer"
+.LASF2431:
+	.string	"devtree_lock"
+.LASF3159:
+	.string	"refresh_new_image_auto"
+.LASF3082:
+	.string	"__ret"
+.LASF1833:
+	.string	"update_time"
+.LASF1948:
+	.string	"bdev_try_to_free_page"
+.LASF1547:
+	.string	"priority"
+.LASF903:
+	.string	"_call_addr"
+.LASF2021:
+	.string	"check"
+.LASF1385:
+	.string	"nr_inodes"
+.LASF2473:
+	.string	"dev_released"
+.LASF2025:
+	.string	"expiry"
+.LASF571:
+	.string	"optimistic_spin_queue"
+.LASF3133:
+	.string	"get_one_auto_image2"
+.LASF2947:
+	.string	"ebc_buffer_size"
+.LASF3295:
+	.string	"ebc_pmic_set_vcom"
+.LASF2610:
+	.string	"ALLOCSTALL_NORMAL"
+.LASF3126:
+	.string	"data_buf_tmp"
+.LASF326:
+	.string	"__initdata_begin"
+.LASF2879:
+	.string	"pmic_pm_resume"
+.LASF225:
+	.string	"__lstate"
+.LASF2127:
+	.string	"uevent"
+.LASF384:
+	.string	"lock_count"
+.LASF149:
+	.string	"panic_cpu"
+.LASF804:
+	.string	"refcount_t"
+.LASF696:
+	.string	"plug"
+.LASF1334:
+	.string	"__cap_empty_set"
+.LASF1313:
+	.string	"saved_auxv"
+.LASF1716:
+	.string	"num_bugs"
+.LASF1618:
+	.string	"qf_ops"
+.LASF2311:
+	.string	"mod_name"
+.LASF2407:
+	.string	"property_read_string_array"
+.LASF721:
+	.string	"rseq_len"
+.LASF2434:
+	.string	"param"
+.LASF2750:
+	.string	"module_attribute"
+.LASF1286:
+	.string	"highest_vm_end"
+.LASF244:
+	.string	"pollfd"
+.LASF1017:
+	.string	"nr_wakeups_remote"
+.LASF375:
+	.string	"cpu_bit_bitmap"
+.LASF1595:
+	.string	"dq_data_lock"
+.LASF2687:
+	.string	"d_tag"
+.LASF752:
+	.string	"llist_node"
+.LASF1593:
+	.string	"projid"
+.LASF1119:
+	.string	"pages"
+.LASF1156:
+	.string	"memcg_aware"
+.LASF1041:
+	.string	"back"
+.LASF2294:
+	.string	"dev_name"
+.LASF1332:
+	.string	"kernel_cap_struct"
+.LASF2709:
+	.string	"_DYNAMIC"
+.LASF972:
+	.string	"rseq_cs"
+.LASF2405:
+	.string	"property_present"
+.LASF868:
+	.string	"softirq_expires_next"
+.LASF1563:
+	.string	"llc_id"
+.LASF1819:
+	.string	"readlink"
+.LASF2468:
+	.string	"algo_data"
+.LASF1480:
+	.string	"node_zones"
+.LASF3010:
+	.string	"dev_attr_pmic_vcom"
+.LASF1528:
+	.string	"initialized"
+.LASF1786:
+	.string	"bd_holder_disks"
+.LASF63:
+	.string	"list_head"
+.LASF1499:
+	.string	"lru_lock"
+.LASF2735:
+	.string	"mod_plt_sec"
+.LASF636:
+	.string	"tgid"
+.LASF2869:
+	.string	"epd_mode"
+.LASF1107:
+	.string	"compat_robust_list_head"
+.LASF886:
+	.string	"_tid"
+.LASF540:
+	.string	"s_inode_wblist_lock"
+.LASF1973:
+	.string	"from"
+.LASF1783:
+	.string	"bd_holder"
+.LASF1304:
+	.string	"end_code"
+.LASF984:
+	.string	"ewma"
+.LASF222:
+	.string	"qspinlock"
+.LASF90:
+	.string	"linux_banner_ptr"
+.LASF1460:
+	.string	"NR_VMSCAN_WRITE"
+.LASF2770:
+	.string	"insn"
+.LASF1968:
+	.string	"filldir_t"
+.LASF1871:
+	.string	"fl_file"
+.LASF1187:
+	.string	"bp_hardening_data"
+.LASF1053:
+	.string	"dl_non_contending"
+.LASF2494:
+	.string	"prepare_recovery"
+.LASF1969:
+	.string	"dir_context"
+.LASF2509:
+	.string	"irq_stat"
+.LASF2615:
+	.string	"PGFREE"
+.LASF2557:
+	.string	"tracepoint_ptr_t"
+.LASF741:
+	.string	"utask"
+.LASF1440:
+	.string	"NR_UNEVICTABLE"
+.LASF1022:
+	.string	"sched_entity"
+.LASF1645:
+	.string	"d_spc_hardlimit"
+.LASF2707:
+	.string	"sh_addralign"
+.LASF773:
+	.string	"read_cntv_tval_el0"
+.LASF0:
+	.string	"long unsigned int"
+.LASF1002:
+	.string	"sleep_max"
+.LASF322:
+	.string	"__hyp_text_start"
+.LASF1283:
+	.string	"mmap_base"
+.LASF699:
+	.string	"io_context"
+.LASF3087:
+	.string	"__cond"
+.LASF210:
+	.string	"compat_elf_hwcap2"
+.LASF2959:
+	.string	"frame_done"
+.LASF2478:
+	.string	"host_notify_domain"
+.LASF1702:
+	.string	"gpl_syms"
+.LASF2074:
+	.string	"seq_show"
+.LASF766:
+	.string	"ate_match_dt"
+.LASF3224:
+	.string	"of_node_put"
+.LASF1329:
+	.string	"cow_page"
+.LASF1561:
+	.string	"core_id"
+.LASF2458:
+	.string	"block"
+.LASF2660:
+	.string	"vm_event_state"
+.LASF1673:
+	.string	"i_spc_timelimit"
+.LASF1116:
+	.string	"return_instances"
+.LASF1989:
+	.string	"blockdev_superblock"
+.LASF2168:
+	.string	"device"
+.LASF2721:
+	.string	"param_ops_ushort"
+.LASF526:
+	.string	"s_shrink"
+.LASF1494:
+	.string	"kcompactd_classzone_idx"
+.LASF3214:
+	.string	"kmalloc_index"
+.LASF840:
+	.string	"hrtimer_restart"
+.LASF2576:
+	.string	"totalram_pages"
+.LASF2455:
+	.string	"i2c_smbus_data"
+.LASF2974:
+	.string	"curr_dsp_buf"
+.LASF1039:
+	.string	"time_slice"
+.LASF2390:
+	.string	"full_name"
+.LASF2086:
+	.string	"kernfs_open_file"
+.LASF838:
+	.string	"node"
+.LASF1781:
+	.string	"bd_mutex"
+.LASF1348:
+	.string	"MIGRATE_SYNC_NO_COPY"
+.LASF2274:
+	.string	"start_prevent_time"
+.LASF2638:
+	.string	"PGMIGRATE_SUCCESS"
+.LASF633:
+	.string	"no_cgroup_migration"
+.LASF285:
+	.string	"_sinittext"
+.LASF2624:
+	.string	"PGSTEAL_DIRECT"
+.LASF374:
+	.string	"cpu_all_bits"
+.LASF2034:
+	.string	"interval"
+.LASF2692:
+	.string	"st_info"
+.LASF2187:
+	.string	"cma_area"
+.LASF590:
+	.string	"static_prio"
+.LASF2807:
+	.string	"wake_lock"
+.LASF2239:
+	.string	"may_skip_resume"
+.LASF2985:
+	.string	"is_deep_sleep"
+.LASF1143:
+	.string	"shrinker"
+.LASF1052:
+	.string	"dl_yielded"
+.LASF1607:
+	.string	"dqi_format"
+.LASF2641:
+	.string	"COMPACTFREE_SCANNED"
+.LASF2585:
+	.string	"mmap_rnd_compat_bits"
+.LASF594:
+	.string	"last_sleep_ts"
+.LASF454:
+	.string	"i_version"
+.LASF657:
+	.string	"prev_cputime"
+.LASF2176:
+	.string	"msi_domain"
+.LASF1985:
+	.string	"state_remove_uevent_sent"
+.LASF1407:
+	.string	"ia_size"
+.LASF859:
+	.string	"in_hrtirq"
+.LASF503:
+	.string	"s_master_keys"
+.LASF2976:
+	.string	"curr_osd_buf"
+.LASF767:
+	.string	"ate_match_local_cap_id"
+.LASF2422:
+	.string	"property"
+.LASF3052:
+	.string	"ebc_sysfs_init"
+.LASF962:
+	.string	"wchar"
+.LASF316:
+	.string	"__exception_text_start"
+.LASF2394:
+	.string	"platform_notify"
+.LASF62:
+	.string	"kernel_symbol"
+.LASF2897:
+	.string	"dma_virt_ops"
+.LASF2267:
+	.string	"subsys_data"
+.LASF2689:
+	.string	"Elf64_Dyn"
+.LASF2324:
+	.string	"compatible"
+.LASF174:
+	.string	"tv_sec"
+.LASF40:
+	.string	"pid_t"
+.LASF78:
+	.string	"__security_initcall_start"
+.LASF3130:
+	.string	"get_auto_image2"
+.LASF1025:
+	.string	"run_node"
+.LASF1009:
+	.string	"nr_failed_migrations_affine"
+.LASF3229:
+	.string	"IS_ERR"
+.LASF832:
+	.string	"PCPU_FC_EMBED"
+.LASF2065:
+	.string	"supers"
+.LASF2062:
+	.string	"last_ino"
+.LASF692:
+	.string	"pi_top_task"
+.LASF3152:
+	.string	"gray_old_changed"
+.LASF528:
+	.string	"s_fsnotify_inode_refs"
+.LASF416:
+	.string	"d_child"
+.LASF1970:
+	.string	"actor"
+.LASF1178:
+	.string	"uprobe"
+.LASF529:
+	.string	"s_readonly_remount"
+.LASF3253:
+	.string	"kasan_check_write"
+.LASF378:
+	.string	"hlist_bl_node"
+.LASF2693:
+	.string	"st_other"
+.LASF1918:
+	.string	"i_mutex_key"
+.LASF1979:
+	.string	"kset"
+.LASF848:
+	.string	"hrtimer_clock_base"
+.LASF1028:
+	.string	"vruntime"
+.LASF3097:
+	.string	"diff_count"
+.LASF2247:
+	.string	"disable_depth"
+.LASF432:
+	.string	"i_size"
+.LASF1044:
+	.string	"dl_deadline"
+.LASF564:
+	.string	"overflowgid"
+.LASF2665:
+	.string	"min_free_kbytes"
+.LASF1240:
+	.string	"units"
+.LASF3267:
+	.string	"epd_lut_from_mem_init"
+.LASF312:
+	.string	"__nosave_begin"
+.LASF163:
+	.string	"module"
+.LASF2616:
+	.string	"PGACTIVATE"
+.LASF2041:
+	.string	"ngroups"
+.LASF1627:
+	.string	"free_file_info"
+.LASF1174:
+	.string	"autask"
+.LASF2507:
+	.string	"ipi_irqs"
+.LASF567:
+	.string	"user_namespace"
+.LASF2725:
+	.string	"param_ops_ulong"
+.LASF3242:
+	.string	"get_current"
+.LASF232:
+	.string	"raw_spinlock"
+.LASF1487:
+	.string	"kswapd_wait"
+.LASF2256:
+	.string	"timer_autosuspends"
+.LASF2853:
+	.string	"EPD_PART_GLR16"
+.LASF2647:
+	.string	"KCOMPACTD_MIGRATE_SCANNED"
+.LASF1377:
+	.string	"__rcu_head"
+.LASF1721:
+	.string	"sect_attrs"
+.LASF2727:
+	.string	"param_ops_charp"
+.LASF1681:
+	.string	"quota_off"
+.LASF352:
+	.string	"fault_address"
+.LASF1575:
+	.string	"dq_inuse"
+.LASF3041:
+	.string	"out_buffer"
+.LASF3128:
+	.string	"direct_mode_data_change_part"
+.LASF1610:
+	.string	"dqi_flags"
+.LASF2622:
+	.string	"PGREFILL"
+.LASF2731:
+	.string	"param_ops_bint"
+.LASF3277:
+	.string	"ebc_add_to_dsp_buf_list"
+.LASF3282:
+	.string	"kfree"
+.LASF1771:
+	.string	"swap_deactivate"
+.LASF2913:
+	.string	"gdck_sta"
+.LASF1112:
+	.string	"request_queue"
+.LASF1445:
+	.string	"WORKINGSET_REFAULT"
+.LASF1609:
+	.string	"dqi_dirty_list"
+.LASF3054:
+	.string	"ebc_buf_state_read"
+.LASF230:
+	.string	"prove_locking"
+.LASF2760:
+	.string	"mod_tree_node"
+.LASF3053:
+	.string	"auto_frame_state_read"
+.LASF2554:
+	.string	"regfunc"
+.LASF2969:
+	.string	"auto_wf_index"
+.LASF242:
+	.string	"code"
+.LASF654:
+	.string	"gtime"
+.LASF572:
+	.string	"debug_locks"
+.LASF1752:
+	.string	"readpage"
+.LASF2640:
+	.string	"COMPACTMIGRATE_SCANNED"
+.LASF396:
+	.string	"dummy"
+.LASF2353:
+	.string	"need_for_probe"
+.LASF220:
+	.string	"locked_pending"
+.LASF1148:
+	.string	"nr_deferred"
+.LASF1846:
+	.string	"fown_struct"
+.LASF1956:
+	.string	"perm"
+.LASF714:
+	.string	"compat_robust_list"
+.LASF2944:
+	.string	"ebc_buffer_phy"
+.LASF2446:
+	.string	"unmap"
+.LASF1980:
+	.string	"ktype"
+.LASF385:
+	.string	"lockref"
+.LASF2225:
+	.string	"in_dpm_list"
+.LASF1792:
+	.string	"bd_invalidated"
+.LASF1065:
+	.string	"mm_struct"
+.LASF1400:
+	.string	"ki_hint"
+.LASF421:
+	.string	"i_uid"
+.LASF86:
+	.string	"alternatives_applied"
+.LASF2918:
+	.string	"rearrange"
+.LASF597:
+	.string	"boost_expires"
+.LASF2884:
+	.string	"DMA_BIDIRECTIONAL"
+.LASF3299:
+	.string	"__arch_copy_to_user"
+.LASF236:
+	.string	"spinlock"
+.LASF769:
+	.string	"arch_timer_erratum_workaround"
+.LASF555:
+	.string	"pid_namespace"
+.LASF904:
+	.string	"_syscall"
+.LASF2738:
+	.string	"mod_arch_specific"
+.LASF2501:
+	.string	"max_write_len"
+.LASF472:
+	.string	"d_compare"
+.LASF942:
+	.string	"vm_mm"
+.LASF3093:
+	.string	"need_refresh"
+.LASF2789:
+	.string	"platform_bus_type"
+.LASF3119:
+	.string	"data_buf"
+.LASF3038:
+	.string	"ulogo_buf"
+.LASF3313:
+	.string	"__msecs_to_jiffies"
+.LASF1606:
+	.string	"mem_dqinfo"
+.LASF18:
+	.string	"true"
+.LASF456:
+	.string	"i_count"
+.LASF841:
+	.string	"HRTIMER_NORESTART"
+.LASF370:
+	.string	"__cpu_online_mask"
+.LASF1793:
+	.string	"bd_disk"
+.LASF1874:
+	.string	"fl_fasync"
+.LASF3179:
+	.string	"update_mode"
+.LASF2911:
+	.string	"direct_mode"
+.LASF2380:
+	.string	"cache_sync"
+.LASF436:
+	.string	"i_lock"
+.LASF2963:
+	.string	"ebc_dsp_buf_status"
+.LASF408:
+	.string	"d_name"
+.LASF733:
+	.string	"trace"
+.LASF2120:
+	.string	"get_ownership"
+.LASF2653:
+	.string	"UNEVICTABLE_PGMUNLOCKED"
+.LASF195:
+	.string	"ufds"
+.LASF1319:
+	.string	"exe_file"
+.LASF1141:
+	.string	"nr_scanned"
+.LASF646:
+	.string	"pid_links"
+.LASF1175:
+	.string	"vaddr"
+.LASF2259:
+	.string	"request"
+.LASF1479:
+	.string	"pglist_data"
+.LASF3162:
+	.string	"image_osd_data"
+.LASF1743:
+	.string	"rw_hint"
+.LASF2519:
+	.string	"IRQ_POLL_SOFTIRQ"
+.LASF1037:
+	.string	"timeout"
+.LASF672:
+	.string	"last_switch_time"
+.LASF565:
+	.string	"fs_overflowuid"
+.LASF2900:
+	.string	"start_info"
+.LASF2662:
+	.string	"vm_zone_stat"
+.LASF2797:
+	.string	"init_thread_union"
+.LASF1643:
+	.string	"qc_dqblk"
+.LASF2089:
+	.string	"mmapped"
+.LASF2246:
+	.string	"child_count"
+.LASF1911:
+	.string	"kill_sb"
+.LASF412:
+	.string	"d_op"
+.LASF2486:
+	.string	"unlock_bus"
+.LASF1345:
+	.string	"MIGRATE_ASYNC"
+.LASF358:
+	.string	"__sched_text_end"
+.LASF439:
+	.string	"i_write_hint"
+.LASF1083:
+	.string	"process_keyring"
+.LASF2550:
+	.string	"page_ext_operations"
+.LASF2632:
+	.string	"KSWAPD_HIGH_WMARK_HIT_QUICKLY"
+.LASF3055:
+	.string	"ebc_state_read"
+.LASF3291:
+	.string	"__stack_chk_fail"
+.LASF2882:
+	.string	"pmic_set_vcom"
+.LASF2668:
+	.string	"stack_guard_gap"
+.LASF3234:
+	.string	"bytes"
+.LASF1707:
+	.string	"gpl_future_crcs"
+.LASF995:
+	.string	"wait_start"
+.LASF1416:
+	.string	"nr_free"
+.LASF272:
+	.string	"cpu_hwcaps"
+.LASF390:
+	.string	"slash_name"
+.LASF125:
+	.string	"show_fdinfo"
+.LASF2771:
+	.string	"fixup"
+.LASF386:
+	.string	"hash"
+.LASF1215:
+	.string	"freelist"
+.LASF1812:
+	.string	"posix_acl"
+.LASF245:
+	.string	"static_key_mod"
+.LASF168:
+	.string	"bug_addr_disp"
+.LASF1612:
+	.string	"dqi_igrace"
+.LASF2162:
+	.string	"thaw_noirq"
+.LASF940:
+	.string	"vm_rb"
+.LASF3022:
+	.string	"kernel_read_file_str"
+.LASF568:
+	.string	"init_user_ns"
+.LASF2416:
+	.string	"add_links"
+.LASF2143:
+	.string	"pm_message_t"
+.LASF2902:
+	.string	"xen_dma_ops"
+.LASF1413:
+	.string	"page_group_by_mobility_disabled"
+.LASF2342:
+	.string	"secondary"
+.LASF2340:
+	.string	"segment_boundary_mask"
+.LASF1436:
+	.string	"NR_INACTIVE_ANON"
+.LASF246:
+	.string	"static_key"
+.LASF938:
+	.string	"vm_next"
+.LASF2302:
+	.string	"remove"
+.LASF495:
+	.string	"s_magic"
+.LASF1054:
+	.string	"dl_overrun"
+.LASF2367:
+	.string	"alloc"
+.LASF295:
+	.string	"__entry_text_start"
+.LASF751:
+	.string	"sys_tz"
+.LASF2360:
+	.string	"revmap_direct_max_irq"
+.LASF782:
+	.string	"jiffies_64"
+.LASF2030:
+	.string	"payload"
+.LASF1358:
+	.string	"cb_state"
+.LASF2894:
+	.string	"orig_nents"
+.LASF3071:
+	.string	"buf_addr"
+.LASF413:
+	.string	"d_sb"
+.LASF669:
+	.string	"comm"
+.LASF294:
+	.string	"__kprobes_text_end"
+.LASF2273:
+	.string	"last_time"
+.LASF549:
+	.string	"PIDTYPE_PID"
+.LASF954:
+	.string	"events"
+.LASF2201:
+	.string	"offline"
+.LASF1834:
+	.string	"atomic_open"
+.LASF1542:
+	.string	"_zonerefs"
+.LASF143:
+	.string	"panic_on_unrecovered_nmi"
+.LASF1204:
+	.string	"private_lock"
+.LASF434:
+	.string	"i_mtime"
+.LASF2573:
+	.string	"dev_page_fault_t"
+.LASF3110:
+	.string	"ebc_auto_tast_function"
+.LASF24:
+	.string	"__kernel_gid32_t"
+.LASF1430:
+	.string	"NR_BOUNCE"
+.LASF1253:
+	.string	"f_cred"
+.LASF2757:
+	.string	"MODULE_STATE_COMING"
+.LASF2955:
+	.string	"auto_need_refresh0"
+.LASF2200:
+	.string	"offline_disabled"
+.LASF3164:
+	.string	"refresh_new_image_area"
+.LASF3222:
+	.string	"of_property_read_u32_array"
+.LASF2445:
+	.string	"select"
+.LASF89:
+	.string	"linux_banner"
+.LASF2356:
+	.string	"host_data"
+.LASF2730:
+	.string	"param_ops_invbool"
+.LASF2485:
+	.string	"trylock_bus"
+.LASF109:
+	.string	"mmap"
+.LASF282:
+	.string	"__bss_stop"
+.LASF1868:
+	.string	"fl_pid"
+.LASF2688:
+	.string	"d_un"
+.LASF1321:
+	.string	"async_put_work"
+.LASF2085:
+	.string	"kernfs_syscall_ops"
+.LASF2991:
+	.string	"ebc_last_display"
+.LASF1826:
+	.string	"mknod"
+.LASF152:
+	.string	"SYSTEM_BOOTING"
+.LASF1569:
+	.string	"max_freq_scale"
+.LASF2895:
+	.string	"dma_direct_ops"
+.LASF2221:
+	.string	"dev_pm_info"
+.LASF27:
+	.string	"__kernel_loff_t"
+.LASF2285:
+	.string	"detach"
+.LASF118:
+	.string	"get_unmapped_area"
+.LASF1232:
+	.string	"dev_pagemap"
+.LASF2617:
+	.string	"PGDEACTIVATE"
+.LASF3125:
+	.string	"line_step"
+.LASF1753:
+	.string	"writepages"
+.LASF994:
+	.string	"sched_statistics"
+.LASF136:
+	.string	"head"
+.LASF1475:
+	.string	"reclaim_stat"
+.LASF2810:
+	.string	"epd_lut_type"
+.LASF2510:
+	.string	"nmi_ctx"
+.LASF1113:
+	.string	"uprobe_task"
+.LASF3076:
+	.string	"ebc_frame_control_timeout"
+.LASF1772:
+	.string	"writeback_control"
+.LASF1873:
+	.string	"fl_end"
+.LASF3304:
+	.string	"ebc_find_buf_by_phy_addr"
+.LASF1920:
+	.string	"super_operations"
+.LASF395:
+	.string	"want_pages"
+.LASF2923:
+	.string	"regmap_base"
+.LASF339:
+	.string	"wps_disabled"
+.LASF2373:
+	.string	"unmap_sg"
+.LASF2830:
+	.string	"buf_dsp"
+.LASF2832:
+	.string	"buf_error"
+.LASF993:
+	.string	"util_avg"
+.LASF758:
+	.string	"task"
+.LASF598:
+	.string	"sched_task_group"
+.LASF2823:
+	.string	"WF_TYPE_GRAY16"
+.LASF2156:
+	.string	"thaw_early"
+.LASF677:
+	.string	"blocked"
+.LASF429:
+	.string	"i_security"
+.LASF2613:
+	.string	"PGSCAN_SKIP_NORMAL"
+.LASF2893:
+	.string	"nents"
+.LASF756:
+	.string	"__smp_cross_call"
+.LASF2739:
+	.string	"core"
+.LASF1784:
+	.string	"bd_holders"
+.LASF3116:
+	.string	"reset_and_flip"
+.LASF2924:
+	.string	"enable"
+.LASF926:
+	.string	"pipe_bufs"
+.LASF3239:
+	.string	"to_user"
+.LASF2093:
+	.string	"KOBJ_NS_TYPE_NET"
+.LASF296:
+	.string	"__entry_text_end"
+.LASF1340:
+	.string	"fe_length"
+.LASF1659:
+	.string	"d_rt_spc_warns"
+.LASF309:
+	.string	"__noinstr_text_start"
+.LASF467:
+	.string	"i_verity_info"
+.LASF181:
+	.string	"timespec_type"
+.LASF822:
+	.string	"__rb_parent_color"
+.LASF2193:
+	.string	"devres_lock"
+.LASF366:
+	.string	"bits"
+.LASF560:
+	.string	"init_struct_pid"
+.LASF2002:
+	.string	"child"
+.LASF1077:
+	.string	"cap_inheritable"
+.LASF1357:
+	.string	"gp_wait"
+.LASF1814:
+	.string	"lookup"
+.LASF1559:
+	.string	"cpu_topology"
+.LASF3243:
+	.string	"sp_el0"
+.LASF3315:
+	.string	"ebc_dsp_buf_get"
+.LASF2871:
+	.string	"panel_color"
+.LASF1865:
+	.string	"fl_owner"
+.LASF2817:
+	.string	"WF_TYPE_GLD16"
+.LASF2986:
+	.string	"is_power_off"
+.LASF950:
+	.string	"vm_private_data"
+.LASF1913:
+	.string	"s_lock_key"
+.LASF1169:
+	.string	"uprobe_task_state"
+.LASF207:
+	.string	"ttbr0"
+.LASF2116:
+	.string	"kobj_type"
+.LASF2591:
+	.string	"sysctl_overcommit_kbytes"
+.LASF2958:
+	.string	"frame_left"
+.LASF2448:
+	.string	"deactivate"
+.LASF2821:
+	.string	"WF_TYPE_AUTO"
+.LASF1196:
+	.string	"i_pages"
+.LASF3206:
+	.string	"safe_ptr"
+.LASF377:
+	.string	"hlist_bl_head"
+.LASF1665:
+	.string	"ino_warnlimit"
+.LASF1488:
+	.string	"pfmemalloc_wait"
+.LASF2977:
+	.string	"waiting_new_buf_time"
+.LASF115:
+	.string	"fasync"
+.LASF1678:
+	.string	"i_rt_spc_warnlimit"
+.LASF1338:
+	.string	"fe_logical"
+.LASF956:
+	.string	"page_frag"
+.LASF967:
+	.string	"write_bytes"
+.LASF1965:
+	.string	"fi_extents_mapped"
+.LASF1451:
+	.string	"NR_FILE_PAGES"
+.LASF2:
+	.string	"char"
+.LASF925:
+	.string	"unix_inflight"
+.LASF1695:
+	.string	"holders_dir"
+.LASF3085:
+	.string	"__wq_entry"
+.LASF3089:
+	.string	"new_buffer"
+.LASF464:
+	.string	"i_fsnotify_mask"
+.LASF2631:
+	.string	"KSWAPD_LOW_WMARK_HIT_QUICKLY"
+.LASF965:
+	.string	"syscfs"
+.LASF3199:
+	.string	"wake_unlock"
+.LASF2414:
+	.string	"graph_get_port_parent"
+.LASF2651:
+	.string	"UNEVICTABLE_PGRESCUED"
+.LASF2178:
+	.string	"msi_list"
+.LASF3244:
+	.string	"__ilog2_u64"
+.LASF547:
+	.string	"compat_time_t"
+.LASF2978:
+	.string	"ebc_mode"
+.LASF400:
+	.string	"d_alias"
+.LASF1455:
+	.string	"NR_SHMEM"
+.LASF365:
+	.string	"cpumask"
+.LASF2136:
+	.string	"n_klist"
+.LASF1279:
+	.string	"dumper"
+.LASF1708:
+	.string	"num_gpl_future_syms"
+.LASF2244:
+	.string	"wakeirq"
+.LASF818:
+	.string	"plist_node"
+.LASF1079:
+	.string	"cap_effective"
+.LASF1715:
+	.string	"taints"
+.LASF3263:
+	.string	"of_address_to_resource"
+.LASF983:
+	.string	"enqueued"
+.LASF974:
+	.string	"sum_exec_runtime"
+.LASF166:
+	.string	"hex_asc_upper"
+.LASF507:
+	.string	"s_roots"
+.LASF2883:
+	.string	"dma_data_direction"
+.LASF1658:
+	.string	"d_rt_spc_timer"
+.LASF1926:
+	.string	"evict_inode"
+.LASF1459:
+	.string	"NR_UNSTABLE_NFS"
+.LASF2423:
+	.string	"length"
+.LASF1552:
+	.string	"sysctl_lowmem_reserve_ratio"
+.LASF2125:
+	.string	"buflen"
+.LASF1797:
+	.string	"bd_private"
+.LASF1872:
+	.string	"fl_start"
+.LASF3221:
+	.string	"out_value"
+.LASF1930:
+	.string	"freeze_fs"
+.LASF880:
+	.string	"sigset_t"
+.LASF1886:
+	.string	"lm_notify"
+.LASF3108:
+	.string	"normal_mode_lut_type"
+.LASF3178:
+	.string	"ebc_tcon_dsp_mode_set"
+.LASF851:
+	.string	"running"
+.LASF723:
+	.string	"rseq_event_mask"
+.LASF496:
+	.string	"s_root"
+.LASF1851:
+	.string	"ra_pages"
+.LASF75:
+	.string	"aarch32_opcode_cond_checks"
+.LASF184:
+	.string	"TT_COMPAT"
+.LASF835:
+	.string	"pcpu_fc_names"
+.LASF2341:
+	.string	"fwnode_handle"
+.LASF2697:
+	.string	"Elf64_Sym"
+.LASF2064:
+	.string	"syscall_ops"
+.LASF479:
+	.string	"d_automount"
+.LASF1234:
+	.string	"page_free"
+.LASF3112:
+	.string	"__val"
+.LASF1450:
+	.string	"NR_FILE_MAPPED"
+.LASF639:
+	.string	"parent"
+.LASF1133:
+	.string	"atime"
+.LASF126:
+	.string	"copy_file_range"
+.LASF2654:
+	.string	"UNEVICTABLE_PGCLEARED"
+.LASF3296:
+	.string	"epd_lut_get_wf_version"
+.LASF2016:
+	.string	"key_type"
+.LASF3236:
+	.string	"copy_overflow"
+.LASF2410:
+	.string	"get_named_child_node"
+.LASF2227:
+	.string	"is_suspended"
+.LASF2891:
+	.string	"dma_length"
+.LASF2035:
+	.string	"burst"
+.LASF1936:
+	.string	"clone_mnt_data"
+.LASF2746:
+	.string	"module_kobject"
+.LASF3048:
+	.string	"memory"
+.LASF3213:
+	.string	"order"
+.LASF739:
+	.string	"active_memcg"
+.LASF1301:
+	.string	"def_flags"
+.LASF2993:
+	.string	"global_ebc"
+.LASF1442:
+	.string	"NR_SLAB_UNRECLAIMABLE"
+.LASF1095:
+	.string	"refcount"
+.LASF1759:
+	.string	"invalidatepage"
+.LASF3075:
+	.string	"ebc_frame_timeout"
+.LASF364:
+	.string	"wait_queue_head_t"
+.LASF1239:
+	.string	"page_type"
+.LASF2018:
+	.string	"rcu_data0"
+.LASF1080:
+	.string	"cap_bset"
+.LASF864:
+	.string	"nr_hangs"
+.LASF2222:
+	.string	"power_state"
+.LASF744:
+	.string	"stack_vm_area"
+.LASF2788:
+	.string	"mfd_cell"
+.LASF2856:
+	.string	"EPD_A2"
+.LASF2071:
+	.string	"kernfs_elem_attr"
+.LASF3091:
+	.string	"new_buffer_temp"
+.LASF2268:
+	.string	"set_latency_tolerance"
+.LASF573:
+	.string	"debug_locks_silent"
+.LASF1322:
+	.string	"linux_binfmt"
+.LASF142:
+	.string	"panic_on_oops"
+.LASF271:
+	.string	"arm64_ftr_reg_ctrel0"
+.LASF1213:
+	.string	"counters"
+.LASF3254:
+	.string	"kasan_check_read"
+.LASF2028:
+	.string	"name_link"
+.LASF543:
+	.string	"d_canonical_path"
+.LASF191:
+	.string	"compat_timespec"
+.LASF1458:
+	.string	"NR_ANON_THPS"
+.LASF731:
+	.string	"timer_slack_ns"
+.LASF1882:
+	.string	"lm_compare_owner"
+.LASF2293:
+	.string	"bus_type"
+.LASF3169:
+	.string	"ebc_get_8pix_wf_part2"
+.LASF599:
+	.string	"policy"
+.LASF1262:
+	.string	"shared"
+.LASF3016:
+	.string	"ebc_match"
+.LASF2922:
+	.string	"dclk"
+.LASF2186:
+	.string	"dma_mem"
+.LASF359:
+	.string	"wait_queue_entry"
+.LASF2288:
+	.string	"dismiss"
+.LASF1995:
+	.string	"simple_dentry_operations"
+.LASF902:
+	.string	"_band"
+.LASF595:
+	.string	"boost"
+.LASF2075:
+	.string	"seq_start"
+.LASF2779:
+	.string	"module_sysfs_initialized"
+.LASF973:
+	.string	"task_cputime"
+.LASF1165:
+	.string	"rnode"
+.LASF233:
+	.string	"raw_lock"
+.LASF76:
+	.string	"__con_initcall_start"
+.LASF1686:
+	.string	"get_dqblk"
+.LASF3028:
+	.string	"ebc_tcon_node"
+.LASF2786:
+	.string	"id_entry"
+.LASF1765:
+	.string	"putback_page"
+.LASF2505:
+	.string	"nr_irqs"
+.LASF3312:
+	.string	"schedule_timeout"
+.LASF865:
+	.string	"max_hang_time"
+.LASF3202:
+	.string	"copy_from_user"
+.LASF2436:
+	.string	"DOMAIN_BUS_ANY"
+.LASF2040:
+	.string	"root_user"
+.LASF2059:
+	.string	"subdirs"
+.LASF2858:
+	.string	"EPD_DU"
+.LASF1852:
+	.string	"mmap_miss"
+.LASF1623:
+	.string	"quota_format_ops"
+.LASF3314:
+	.string	"ebc_osd_buf_get"
+.LASF3068:
+	.string	"argp"
+.LASF1723:
+	.string	"args"
+.LASF34:
+	.string	"__poll_t"
+.LASF2402:
+	.string	"fwnode_operations"
+.LASF976:
+	.string	"run_delay"
+.LASF1967:
+	.string	"fi_extents_start"
+.LASF2903:
+	.string	"dummy_dma_ops"
+.LASF239:
+	.string	"static_key_initialized"
+.LASF2753:
+	.string	"module_uevent"
+.LASF3079:
+	.string	"is_full_mode"
+.LASF2566:
+	.string	"base_pfn"
+.LASF262:
+	.string	"width"
+.LASF900:
+	.string	"_addr_pkey"
+.LASF3062:
+	.string	"waveform_buffer"
+.LASF297:
+	.string	"__start_rodata"
+.LASF1437:
+	.string	"NR_ACTIVE_ANON"
+.LASF2906:
+	.string	"tcon"
+.LASF1084:
+	.string	"thread_keyring"
+.LASF2714:
+	.string	"kparam_array"
+.LASF3256:
+	.string	"platform_driver_unregister"
+.LASF652:
+	.string	"utime"
+.LASF1303:
+	.string	"start_code"
+.LASF3017:
+	.string	"ebc_driver"
+.LASF2574:
+	.string	"dev_page_free_t"
+.LASF3219:
+	.string	"of_property_read_u32"
+.LASF1367:
+	.string	"guid_t"
+.LASF147:
+	.string	"sysctl_panic_on_stackoverflow"
+.LASF1863:
+	.string	"fl_link"
+.LASF3103:
+	.string	"check_black_percent"
+.LASF2218:
+	.string	"clock_list"
+.LASF1556:
+	.string	"section_mem_map"
+.LASF310:
+	.string	"__noinstr_text_end"
+.LASF2106:
+	.string	"attrs"
+.LASF177:
+	.string	"tz_minuteswest"
+.LASF2428:
+	.string	"of_chosen"
+.LASF3114:
+	.string	"ebc_frame_start"
+.LASF349:
+	.string	"sve_state"
+.LASF1529:
+	.string	"percpu_drift_mark"
+.LASF367:
+	.string	"cpumask_t"
+.LASF134:
+	.string	"kmsg_fops"
+.LASF3305:
+	.string	"ebc_buf_release"
+.LASF1994:
+	.string	"simple_symlink_inode_operations"
+.LASF1602:
+	.string	"dqb_isoftlimit"
+.LASF2502:
+	.string	"max_read_len"
+.LASF601:
+	.string	"cpus_allowed"
+.LASF1258:
+	.string	"f_tfile_llink"
+.LASF1782:
+	.string	"bd_claiming"
+.LASF2146:
+	.string	"complete"
+.LASF2836:
+	.string	"tid_name"
+.LASF1035:
+	.string	"sched_rt_entity"
+.LASF117:
+	.string	"sendpage"
+.LASF3168:
+	.string	"ret_val"
+.LASF837:
+	.string	"timerqueue_node"
+.LASF258:
+	.string	"sign"
+.LASF1596:
+	.string	"mem_dqblk"
+.LASF2741:
+	.string	"plt_entry"
+.LASF3180:
+	.string	"display_mode"
+.LASF1949:
+	.string	"nr_cached_objects"
+.LASF1409:
+	.string	"ia_mtime"
+.LASF1138:
+	.string	"shrink_control"
+.LASF1381:
+	.string	"nr_files"
+.LASF2060:
+	.string	"kernfs_root"
+.LASF729:
+	.string	"nr_dirtied_pause"
+.LASF1466:
+	.string	"NR_ION_HEAP"
+.LASF2722:
+	.string	"param_ops_int"
+.LASF909:
+	.string	"_sigchld"
+.LASF1791:
+	.string	"bd_part_count"
+.LASF357:
+	.string	"__sched_text_start"
+.LASF2843:
+	.string	"panel_refresh_mode"
+.LASF91:
+	.string	"linux_proc_banner"
+.LASF2542:
+	.string	"fops"
+.LASF1242:
+	.string	"f_path"
+.LASF3269:
+	.string	"kthread_create_on_node"
+.LASF711:
+	.string	"cgroups"
+.LASF3205:
+	.string	"__uaccess_mask_ptr"
+.LASF2313:
+	.string	"probe_type"
+.LASF1779:
+	.string	"bd_inode"
+.LASF2215:
+	.string	"RPM_REQ_AUTOSUSPEND"
+.LASF268:
+	.string	"sys_val"
+.LASF303:
+	.string	"__start_once"
+.LASF96:
+	.string	"kptr_restrict"
+.LASF172:
+	.string	"time64_t"
+.LASF2475:
+	.string	"userspace_clients"
+.LASF2112:
+	.string	"uevent_seqnum"
+.LASF3276:
+	.string	"memset"
+.LASF3177:
+	.string	"cur_image_addr"
+.LASF2113:
+	.string	"list_lock"
+.LASF2175:
+	.string	"pm_domain"
+.LASF1066:
+	.string	"cpu_bitmap"
+.LASF828:
+	.string	"pcpu_base_addr"
+.LASF1931:
+	.string	"thaw_super"
+.LASF982:
+	.string	"util_est"
+.LASF1668:
+	.string	"qc_state"
+.LASF2195:
+	.string	"knode_class"
+.LASF1905:
+	.string	"wait_unfrozen"
+.LASF2012:
+	.string	"key_perm_t"
+.LASF2307:
+	.string	"iommu_ops"
+.LASF869:
+	.string	"softirq_next_timer"
+.LASF1790:
+	.string	"bd_part"
+.LASF119:
+	.string	"check_flags"
+.LASF1857:
+	.string	"file_lock_operations"
+.LASF344:
+	.string	"tp_value"
+.LASF3025:
+	.string	"ebc_remove"
+.LASF1862:
+	.string	"fl_list"
+.LASF1238:
+	.string	"_mapcount"
+.LASF860:
+	.string	"hang_detected"
+.LASF2118:
+	.string	"child_ns_type"
+.LASF1617:
+	.string	"qf_fmt_id"
+.LASF1021:
+	.string	"nr_wakeups_idle"
+.LASF1427:
+	.string	"NR_MLOCK"
+.LASF2795:
+	.string	"tasklist_lock"
+.LASF56:
+	.string	"phys_addr_t"
+.LASF1900:
+	.string	"fa_fd"
+.LASF2534:
+	.string	"MEMREMAP_WB"
+.LASF2671:
+	.string	"sysctl_drop_caches"
+.LASF1942:
+	.string	"show_devname"
+.LASF2915:
+	.string	"panel_16bit"
+.LASF1291:
+	.string	"page_table_lock"
+.LASF3015:
+	.string	"ebc_pm"
+.LASF2809:
+	.string	"sched_priority"
+.LASF1625:
+	.string	"read_file_info"
+.LASF2567:
+	.string	"reserve"
+.LASF1740:
+	.string	"quota_info"
+.LASF987:
+	.string	"load_sum"
+.LASF92:
+	.string	"console_printk"
+.LASF702:
+	.string	"ioac"
+.LASF1140:
+	.string	"nr_to_scan"
+.LASF2601:
+	.string	"PGPGIN"
+.LASF1583:
+	.string	"dq_off"
+.LASF1006:
+	.string	"exec_max"
+.LASF1372:
+	.string	"uuid_index"
+.LASF190:
+	.string	"compat_rmtp"
+.LASF437:
+	.string	"i_bytes"
+.LASF2814:
+	.string	"WF_TYPE_GC16"
+.LASF1895:
+	.string	"nfs_fl"
+.LASF403:
+	.string	"dentry"
+.LASF3246:
+	.string	"__be32_to_cpup"
+.LASF2135:
+	.string	"klist_node"
+.LASF1859:
+	.string	"fl_release_private"
+.LASF2854:
+	.string	"EPD_PART_GLD16"
+.LASF3148:
+	.string	"wf_index_data"
+.LASF107:
+	.string	"unlocked_ioctl"
+.LASF3080:
+	.string	"force_full"
+.LASF1117:
+	.string	"vm_struct"
+.LASF1278:
+	.string	"nr_threads"
+.LASF1803:
+	.string	"__i_nlink"
+.LASF145:
+	.string	"panic_on_warn"
+.LASF3073:
+	.string	"ebc_panel_probe"
+.LASF80:
+	.string	"boot_command_line"
+.LASF2463:
+	.string	"adapter"
+.LASF1420:
+	.string	"NR_ZONE_LRU_BASE"
+.LASF2173:
+	.string	"links"
+.LASF1837:
+	.string	"bdi_writeback"
+.LASF1654:
+	.string	"d_spc_warns"
+.LASF1011:
+	.string	"nr_failed_migrations_hot"
+.LASF2907:
+	.string	"pmic"
+.LASF1105:
+	.string	"css_set"
+.LASF1371:
+	.string	"guid_index"
+.LASF2513:
+	.string	"force_irqthreads"
+.LASF1294:
+	.string	"hiwater_rss"
+.LASF2133:
+	.string	"power_kobj"
+.LASF492:
+	.string	"s_export_op"
+.LASF1805:
+	.string	"i_rcu"
+.LASF2849:
+	.string	"EPD_FULL_GLD16"
+.LASF156:
+	.string	"SYSTEM_POWER_OFF"
+.LASF747:
+	.string	"futex_exit_mutex"
+.LASF2462:
+	.string	"i2c_client"
+.LASF1535:
+	.string	"compact_blockskip_flush"
+.LASF1649:
+	.string	"d_space"
+.LASF319:
+	.string	"__hibernate_exit_text_end"
+.LASF2140:
+	.string	"pm_power_off_prepare"
+.LASF2023:
+	.string	"graveyard_link"
+.LASF2791:
+	.string	"platform_driver"
+.LASF1115:
+	.string	"xol_vaddr"
+.LASF122:
+	.string	"splice_read"
+.LASF2679:
+	.string	"Elf64_Addr"
+.LASF1657:
+	.string	"d_rt_space"
+.LASF265:
+	.string	"name"
+.LASF3274:
+	.string	"mod_timer"
+.LASF151:
+	.string	"early_boot_irqs_disabled"
+.LASF658:
+	.string	"nvcsw"
+.LASF3046:
+	.string	"ebc_task_init"
+.LASF2801:
+	.string	"KMALLOC_NORMAL"
+.LASF1058:
+	.string	"exp_need_qs"
+.LASF250:
+	.string	"__stop___jump_table"
+.LASF1111:
+	.string	"task_delay_info"
+.LASF1330:
+	.string	"prealloc_pte"
+.LASF1424:
+	.string	"NR_ZONE_ACTIVE_FILE"
+.LASF2358:
+	.string	"bus_token"
+.LASF422:
+	.string	"i_gid"
+.LASF1588:
+	.string	"quota_type"
+.LASF3121:
+	.string	"buffer_old"
+.LASF1505:
+	.string	"high"
+.LASF431:
+	.string	"i_rdev"
+.LASF1997:
+	.string	"simple_dir_inode_operations"
+.LASF1891:
+	.string	"nfs_lock_info"
+.LASF1342:
+	.string	"fe_flags"
+.LASF687:
+	.string	"self_exec_id"
+.LASF1876:
+	.string	"fl_downgrade_time"
+.LASF2968:
+	.string	"auto_frame_count"
+.LASF2073:
+	.string	"kernfs_ops"
+.LASF2966:
+	.string	"auto_image_new"
+.LASF1860:
+	.string	"file_lock"
+.LASF2756:
+	.string	"MODULE_STATE_LIVE"
+.LASF1393:
+	.string	"sysctl_protected_fifos"
+.LASF1030:
+	.string	"nr_migrations"
+.LASF937:
+	.string	"vm_end"
+.LASF1935:
+	.string	"remount_fs2"
+.LASF2052:
+	.string	"iomem_resource"
+.LASF1866:
+	.string	"fl_flags"
+.LASF2149:
+	.string	"freeze"
+.LASF1426:
+	.string	"NR_ZONE_WRITE_PENDING"
+.LASF1265:
+	.string	"close"
+.LASF3157:
+	.string	"image_fb_data"
+.LASF3039:
+	.string	"klogo_buf"
+.LASF2864:
+	.string	"EPD_POWER_OFF"
+.LASF1470:
+	.string	"zone_reclaim_stat"
+.LASF736:
+	.string	"memcg_oom_gfp_mask"
+.LASF3232:
+	.string	"_msecs_to_jiffies"
+.LASF1652:
+	.string	"d_spc_timer"
+.LASF1728:
+	.string	"jump_entries"
+.LASF3240:
+	.string	"test_ti_thread_flag"
+.LASF2224:
+	.string	"async_suspend"
+.LASF2599:
+	.string	"compound_page_dtors"
+.LASF1975:
+	.string	"read_pos"
+.LASF482:
+	.string	"super_block"
+.LASF3207:
+	.string	"__addr"
+.LASF2291:
+	.string	"dma_coherent"
+.LASF1042:
+	.string	"sched_dl_entity"
+.LASF611:
+	.string	"rcu_tasks_holdout_list"
+.LASF1266:
+	.string	"split"
+.LASF709:
+	.string	"cpuset_mem_spread_rotor"
+.LASF2988:
+	.string	"overlay_bg_update"
+.LASF2008:
+	.string	"assoc_array"
+.LASF566:
+	.string	"fs_overflowgid"
+.LASF1585:
+	.string	"dq_dqb"
+.LASF2683:
+	.string	"Elf64_Xword"
+.LASF958:
+	.string	"lock_class_key"
+.LASF3311:
+	.string	"ebc_get_dsp_list_enum_num"
+.LASF1698:
+	.string	"num_syms"
+.LASF2773:
+	.string	"module_notes_attrs"
+.LASF2081:
+	.string	"generation"
+.LASF553:
+	.string	"PIDTYPE_MAX"
+.LASF2737:
+	.string	"plt_max_entries"
+.LASF2372:
+	.string	"map_sg"
+.LASF1128:
+	.string	"nlink"
+.LASF3034:
+	.string	"ulogo_addr_valid"
+.LASF2546:
+	.string	"percpu_ref"
+.LASF93:
+	.string	"devkmsg_log_str"
+.LASF255:
+	.string	"FTR_HIGHER_SAFE"
+.LASF3218:
+	.string	"i2c_get_clientdata"
+.LASF3203:
+	.string	"_copy_to_user"
+.LASF3249:
+	.string	"test_bit"
+.LASF249:
+	.string	"__start___jump_table"
+.LASF783:
+	.string	"jiffies"
+.LASF2243:
+	.string	"wait_queue"
+.LASF1615:
+	.string	"dqi_priv"
+.LASF617:
+	.string	"rss_stat"
+.LASF708:
+	.string	"mems_allowed_seq"
+.LASF1739:
+	.string	"refcnt"
+.LASF3095:
+	.string	"pbuf_new"
+.LASF2150:
+	.string	"thaw"
+.LASF1687:
+	.string	"get_nextdqblk"
+.LASF518:
+	.string	"s_fs_info"
+.LASF1471:
+	.string	"recent_rotated"
+.LASF2139:
+	.string	"pm_power_off"
+.LASF198:
+	.string	"futex"
+.LASF996:
+	.string	"wait_max"
+.LASF3272:
+	.string	"wakeup_source_add"
+.LASF3196:
+	.string	"ebc_pmic_suspend"
+.LASF1127:
+	.string	"result_mask"
+.LASF2203:
+	.string	"state_synced"
+.LASF2389:
+	.string	"phandle"
+.LASF1632:
+	.string	"dquot_operations"
+.LASF1193:
+	.string	"mapping"
+.LASF3228:
+	.string	"resource_size"
+.LASF3270:
+	.string	"wake_up_process"
+.LASF1323:
+	.string	"kioctx_table"
+.LASF823:
+	.string	"rb_right"
+.LASF3141:
+	.string	"buffer_new_tmp"
+.LASF949:
+	.string	"vm_file"
+.LASF2664:
+	.string	"vmstat_text"
+.LASF2054:
+	.string	"idr_base"
+.LASF745:
+	.string	"stack_refcount"
+.LASF440:
+	.string	"i_blocks"
+.LASF1490:
+	.string	"kswapd_order"
+.LASF2144:
+	.string	"dev_pm_ops"
+.LASF2749:
+	.string	"module_param_attrs"
+.LASF846:
+	.string	"is_rel"
+.LASF2010:
+	.string	"assoc_array_ptr"
+.LASF327:
+	.string	"__initdata_end"
+.LASF2470:
+	.string	"bus_lock"
+.LASF3215:
+	.string	"kmalloc_type"
+.LASF388:
+	.string	"qstr"
+.LASF3123:
+	.string	"gray_new"
+.LASF3040:
+	.string	"in_buffer"
+.LASF1062:
+	.string	"futex_state"
+.LASF1447:
+	.string	"WORKINGSET_RESTORE"
+.LASF628:
+	.string	"sched_psi_wake_requeue"
+.LASF3233:
+	.string	"check_copy_size"
+.LASF737:
+	.string	"memcg_oom_order"
+.LASF706:
+	.string	"acct_timexpd"
+.LASF1375:
+	.string	"__rcu_icq_cache"
+.LASF146:
+	.string	"sysctl_panic_on_rcu_stall"
+.LASF957:
+	.string	"size"
+.LASF1512:
+	.string	"ZONE_DMA32"
+.LASF2269:
+	.string	"wakeup_source"
+.LASF1251:
+	.string	"f_pos"
+.LASF1452:
+	.string	"NR_FILE_DIRTY"
+.LASF19:
+	.string	"__kernel_long_t"
+.LASF726:
+	.string	"task_frag"
+.LASF1958:
+	.string	"datalen"
+.LASF1019:
+	.string	"nr_wakeups_affine_attempts"
+.LASF1435:
+	.string	"NR_LRU_BASE"
+.LASF1710:
+	.string	"extable"
+.LASF1738:
+	.string	"exit"
+.LASF1532:
+	.string	"compact_considered"
+.LASF2710:
+	.string	"kernel_param_ops"
+.LASF443:
+	.string	"dirtied_when"
+.LASF2528:
+	.string	"swapper_pg_dir"
+.LASF337:
+	.string	"suspended_step"
+.LASF251:
+	.string	"static_key_false"
+.LASF1207:
+	.string	"pobjects"
+.LASF1767:
+	.string	"is_partially_uptodate"
+.LASF1202:
+	.string	"writeback_index"
+.LASF1277:
+	.string	"core_state"
+.LASF839:
+	.string	"timerqueue_head"
+.LASF3271:
+	.string	"sched_setscheduler_nocheck"
+.LASF1260:
+	.string	"f_wb_err"
+.LASF2399:
+	.string	"rt_mutex"
+.LASF961:
+	.string	"rchar"
+.LASF3188:
+	.string	"valid_dma_direction"
+.LASF1787:
+	.string	"bd_contains"
+.LASF1108:
+	.string	"futex_pi_state"
+.LASF1126:
+	.string	"kstat"
+.LASF23:
+	.string	"__kernel_uid32_t"
+.LASF2493:
+	.string	"get_bus_free"
+.LASF32:
+	.string	"__le32"
+.LASF433:
+	.string	"i_atime"
+.LASF808:
+	.string	"pte_t"
+.LASF1226:
+	.string	"_pt_pad_1"
+.LASF1228:
+	.string	"_pt_pad_2"
+.LASF2781:
+	.string	"cpuhp_tasks_frozen"
+.LASF1892:
+	.string	"nlm_lockowner"
+.LASF2310:
+	.string	"device_driver"
+.LASF667:
+	.string	"real_cred"
+.LASF3101:
+	.string	"one_buffer_start"
+.LASF2417:
+	.string	"fwnode_endpoint"
+.LASF3086:
+	.string	"__int"
+.LASF923:
+	.string	"epoll_watches"
+.LASF2646:
+	.string	"KCOMPACTD_WAKE"
+.LASF3160:
+	.string	"refresh_new_image"
+.LASF3140:
+	.string	"wf_index"
+.LASF2043:
+	.string	"non_rcu"
+.LASF3161:
+	.string	"image_osd"
+.LASF2607:
+	.string	"PGALLOC_NORMAL"
+.LASF369:
+	.string	"__cpu_possible_mask"
+.LASF786:
+	.string	"timekeeping_suspended"
+.LASF1495:
+	.string	"kcompactd_wait"
+.LASF1599:
+	.string	"dqb_curspace"
+.LASF1355:
+	.string	"gp_state"
+.LASF186:
+	.string	"bitset"
+.LASF991:
+	.string	"load_avg"
+.LASF1274:
+	.string	"access"
+.LASF2460:
+	.string	"i2c_adapter_type"
+.LASF1390:
+	.string	"lease_break_time"
+.LASF1033:
+	.string	"cfs_rq"
+.LASF885:
+	.string	"_uid"
+.LASF340:
+	.string	"hbp_break"
+.LASF3163:
+	.string	"osd_data"
+.LASF3030:
+	.string	"pmic_node"
+.LASF139:
+	.string	"panic_blink"
+.LASF2740:
+	.string	"ftrace_trampoline"
+.LASF895:
+	.string	"_upper"
+.LASF2643:
+	.string	"COMPACTSTALL"
+.LASF10:
+	.string	"short unsigned int"
+.LASF1190:
+	.string	"__bp_harden_hyp_vecs_end"
+.LASF780:
+	.string	"tick_usec"
+.LASF1795:
+	.string	"bd_bdi"
+.LASF2684:
+	.string	"Elf64_Sxword"
+.LASF1909:
+	.string	"mount2"
+.LASF1919:
+	.string	"i_mutex_dir_key"
+.LASF1374:
+	.string	"q_node"
+.LASF2480:
+	.string	"master_xfer"
+.LASF2295:
+	.string	"dev_root"
+.LASF1664:
+	.string	"spc_warnlimit"
+.LASF3147:
+	.string	"get_one_overlay_image2"
+.LASF1463:
+	.string	"NR_WRITTEN"
+.LASF2551:
+	.string	"need"
+.LASF505:
+	.string	"s_encoding"
+.LASF3111:
+	.string	"data_calc_area"
+.LASF1703:
+	.string	"gpl_crcs"
+.LASF1689:
+	.string	"get_state"
+.LASF3191:
+	.string	"dma_handle"
+.LASF1328:
+	.string	"orig_pte"
+.LASF2728:
+	.string	"param_ops_bool"
+.LASF2429:
+	.string	"of_aliases"
+.LASF1603:
+	.string	"dqb_curinodes"
+.LASF1433:
+	.string	"NR_VM_ZONE_STAT_ITEMS"
+.LASF1023:
+	.string	"load"
+.LASF5:
+	.string	"__s8"
+.LASF353:
+	.string	"fault_code"
+.LASF3007:
+	.string	"dev_attr_waveform_version"
+.LASF2180:
+	.string	"dma_mask"
+.LASF2087:
+	.string	"prealloc_mutex"
+.LASF2442:
+	.string	"DOMAIN_BUS_FSL_MC_MSI"
+.LASF1434:
+	.string	"node_stat_item"
+.LASF2464:
+	.string	"init_irq"
+.LASF1308:
+	.string	"start_stack"
+.LASF2042:
+	.string	"init_groups"
+.LASF1880:
+	.string	"android_reserved1"
+.LASF313:
+	.string	"__nosave_end"
+.LASF2006:
+	.string	"event"
+.LASF520:
+	.string	"s_mode"
+.LASF1579:
+	.string	"dq_dqb_lock"
+.LASF21:
+	.string	"__kernel_ulong_t"
+.LASF2575:
+	.string	"max_mapnr"
+.LASF2932:
+	.string	"regmap"
+.LASF2898:
+	.string	"shared_info"
+.LASF772:
+	.string	"read_cntp_tval_el0"
+.LASF2605:
+	.string	"PSWPOUT"
+.LASF1045:
+	.string	"dl_period"
+.LASF3083:
+	.string	"one_buffer_end"
+.LASF1454:
+	.string	"NR_WRITEBACK_TEMP"
+.LASF2482:
+	.string	"functionality"
+.LASF306:
+	.string	"__ctors_end"
+.LASF2235:
+	.string	"wakeup_path"
+.LASF3292:
+	.string	"ebc_buf_state_show"
+.LASF939:
+	.string	"vm_prev"
+.LASF274:
+	.string	"arm64_const_caps_ready"
+.LASF1136:
+	.string	"btime"
+.LASF1879:
+	.string	"fl_u"
+.LASF2004:
+	.string	"extra2"
+.LASF6:
+	.string	"__u8"
+.LASF116:
+	.string	"lock"
+.LASF3195:
+	.string	"ebc_pmic_resume"
+.LASF1531:
+	.string	"compact_cached_migrate_pfn"
+.LASF2606:
+	.string	"PGALLOC_DMA32"
+.LASF2724:
+	.string	"param_ops_long"
+.LASF2928:
+	.string	"frame_addr_set"
+.LASF1048:
+	.string	"runtime"
+.LASF399:
+	.string	"d_wait"
+.LASF2419:
+	.string	"local_fwnode"
+.LASF2717:
+	.string	"__start___param"
+.LASF1149:
+	.string	"list_lru_one"
+.LASF1887:
+	.string	"lm_grant"
+.LASF144:
+	.string	"panic_on_io_nmi"
+.LASF2545:
+	.string	"percpu_ref_func_t"
+.LASF2077:
+	.string	"seq_stop"
+.LASF1218:
+	.string	"compound_dtor"
+.LASF1952:
+	.string	"xattr_handler"
+.LASF1395:
+	.string	"kiocb"
+.LASF2872:
+	.string	"width_mm"
+.LASF1534:
+	.string	"compact_order_failed"
+.LASF1074:
+	.string	"fsuid"
+.LASF3241:
+	.string	"flag"
+.LASF1444:
+	.string	"NR_ISOLATED_FILE"
+.LASF485:
+	.string	"s_blocksize_bits"
+.LASF2264:
+	.string	"active_jiffies"
+.LASF1524:
+	.string	"managed_pages"
+.LASF2558:
+	.string	"__tracepoint_page_ref_set"
+.LASF3184:
+	.string	"ebc_tcon_enable"
+.LASF3323:
+	.ascii	"GNU C89 6.3.1 20170404 -mlittle-endian -mgeneral-regs-only -"
+	.ascii	"mabi=lp64 -march=armv8-a -g -O2 -std=gnu90 -fno-strict-alias"
+	.ascii	"ing -fno-common -fshort-wchar -fno-PIE -fno-asynchronous-unw"
+	.ascii	"ind-tables -fno-delete-n"
+	.string	"ull-pointer-checks -fstack-protector-strong -fno-omit-frame-pointer -fno-optimize-sibling-calls -fno-var-tracking-assignments -fno-strict-overflow -fno-merge-all-constants -fmerge-constants -fstack-check=no -fconserve-stack --param allow-store-data-races=0"
+.LASF2589:
+	.string	"sysctl_overcommit_memory"
+.LASF2504:
+	.string	"max_comb_2nd_msg_len"
+.LASF1570:
+	.string	"gfp_allowed_mask"
+.LASF1155:
+	.string	"shrinker_id"
+.LASF2538:
+	.string	"MEMREMAP_DEC"
+.LASF753:
+	.string	"total_cpus"
+.LASF1160:
+	.string	"root"
+.LASF35:
+	.string	"value_offset"
+.LASF743:
+	.string	"oom_reaper_list"
+.LASF354:
+	.string	"debug"
+.LASF1518:
+	.string	"nr_reserved_highatomic"
+.LASF2333:
+	.string	"shutdown_pre"
+.LASF2253:
+	.string	"no_callbacks"
+.LASF2793:
+	.string	"prevent_deferred_probe"
+.LASF9:
+	.string	"__u16"
+.LASF997:
+	.string	"wait_count"
+.LASF1456:
+	.string	"NR_SHMEM_THPS"
+.LASF1704:
+	.string	"sig_ok"
+.LASF2049:
+	.string	"lpj_fine"
+.LASF504:
+	.string	"s_vop"
+.LASF1619:
+	.string	"qf_owner"
+.LASF3255:
+	.string	"__write_once_size"
+.LASF2800:
+	.string	"kmalloc_cache_type"
+.LASF574:
+	.string	"mutex"
+.LASF3223:
+	.string	"out_values"
+.LASF810:
+	.string	"pgd_t"
+.LASF600:
+	.string	"nr_cpus_allowed"
+.LASF1429:
+	.string	"NR_KERNEL_STACK_KB"
+.LASF1469:
+	.string	"NR_VM_NODE_STAT_ITEMS"
+.LASF234:
+	.string	"raw_spinlock_t"
+.LASF2909:
+	.string	"vir_width"
+.LASF1907:
+	.string	"fs_flags"
+.LASF1761:
+	.string	"freepage"
+.LASF2242:
+	.string	"work"
+.LASF2022:
+	.string	"keytype"
+.LASF922:
+	.string	"sigpending"
+.LASF2183:
+	.string	"dma_pfn_offset"
+.LASF3001:
+	.string	"resume_frame_count"
+.LASF1158:
+	.string	"radix_tree_node"
+.LASF3245:
+	.string	"sign_extend64"
+.LASF2282:
+	.string	"wake_irq"
+.LASF3032:
+	.string	"ulogo_addr"
+.LASF830:
+	.string	"pcpu_fc"
+.LASF2266:
+	.string	"accounting_timestamp"
+.LASF509:
+	.string	"s_bdev"
+.LASF178:
+	.string	"tz_dsttime"
+.LASF12:
+	.string	"__u32"
+.LASF2628:
+	.string	"PGINODESTEAL"
+.LASF643:
+	.string	"ptraced"
+.LASF2720:
+	.string	"param_ops_short"
+.LASF3287:
+	.string	"of_find_device_by_node"
+.LASF2522:
+	.string	"HRTIMER_SOFTIRQ"
+.LASF2597:
+	.string	"shmem_enabled_attr"
+.LASF455:
+	.string	"i_sequence"
+.LASF1478:
+	.string	"pgdat"
+.LASF2578:
+	.string	"page_cluster"
+.LASF3014:
+	.string	"dev_attr_auto_frame_state"
+.LASF1601:
+	.string	"dqb_ihardlimit"
+.LASF411:
+	.string	"d_lockref"
+.LASF2211:
+	.string	"rpm_request"
+.LASF3067:
+	.string	"ebc_io_ctl"
+.LASF1118:
+	.string	"addr"
+.LASF2354:
+	.string	"device_private"
+.LASF3186:
+	.string	"get_dma_ops"
+.LASF2666:
+	.string	"watermark_scale_factor"
+.LASF1810:
+	.string	"i_dir_seq"
+.LASF2092:
+	.string	"KOBJ_NS_TYPE_NONE"
+.LASF1770:
+	.string	"swap_activate"
+.LASF955:
+	.string	"mm_rss_stat"
+.LASF1691:
+	.string	"mkobj"
+.LASF2949:
+	.string	"direct_buf_real_size"
+.LASF3320:
+	.string	"__pm_relax"
+.LASF473:
+	.string	"d_delete"
+.LASF1591:
+	.string	"PRJQUOTA"
+.LASF2038:
+	.string	"begin"
+.LASF2705:
+	.string	"sh_link"
+.LASF3023:
+	.string	"ebc_suspend"
+.LASF2326:
+	.string	"cls_msk"
+.LASF2634:
+	.string	"PGROTATED"
+.LASF1639:
+	.string	"write_info"
+.LASF2128:
+	.string	"kobj_attribute"
+.LASF2248:
+	.string	"idle_notification"
+.LASF1776:
+	.string	"block_device"
+.LASF2091:
+	.string	"kobj_ns_type"
+.LASF2587:
+	.string	"sysctl_user_reserve_kbytes"
+.LASF2785:
+	.string	"num_resources"
+.LASF1544:
+	.string	"notifier_fn_t"
+.LASF3031:
+	.string	"pmic_client"
+.LASF2540:
+	.string	"miscdevice"
+.LASF655:
+	.string	"time_in_state"
+.LASF3045:
+	.string	"ebc_logo_init"
+.LASF1237:
+	.string	"kill"
+.LASF1000:
+	.string	"iowait_sum"
+.LASF3154:
+	.string	"image_new"
+.LASF15:
+	.string	"__u64"
+.LASF694:
+	.string	"journal_info"
+.LASF2847:
+	.string	"EPD_FULL_GL16"
+.LASF625:
+	.string	"sched_contributes_to_load"
+.LASF980:
+	.string	"weight"
+.LASF468:
+	.string	"i_private"
+.LASF1954:
+	.string	"serial"
+.LASF112:
+	.string	"flush"
+.LASF2833:
+	.string	"ebc_buf_s"
+.LASF2165:
+	.string	"runtime_suspend"
+.LASF438:
+	.string	"i_blkbits"
+.LASF2424:
+	.string	"value"
+.LASF2983:
+	.string	"frame_timer"
+.LASF2842:
+	.string	"needpic"
+.LASF1003:
+	.string	"sum_sleep_runtime"
+.LASF3036:
+	.string	"ulogo_addr_str"
+.LASF3117:
+	.string	"flip"
+.LASF1049:
+	.string	"deadline"
+.LASF934:
+	.string	"vmas"
+.LASF1297:
+	.string	"pinned_vm"
+.LASF1483:
+	.string	"node_start_pfn"
+.LASF2516:
+	.string	"NET_TX_SOFTIRQ"
+.LASF703:
+	.string	"psi_flags"
+.LASF1327:
+	.string	"address"
+.LASF1799:
+	.string	"bd_fsfreeze_mutex"
+.LASF1203:
+	.string	"a_ops"
+.LASF2322:
+	.string	"PROBE_FORCE_SYNCHRONOUS"
+.LASF95:
+	.string	"dmesg_restrict"
+.LASF936:
+	.string	"vm_start"
+.LASF493:
+	.string	"s_flags"
+.LASF3145:
+	.string	"wf_index_tmp"
+.LASF373:
+	.string	"cpumask_var_t"
+.LASF1268:
+	.string	"fault"
+.LASF81:
+	.string	"saved_command_line"
+.LASF2867:
+	.string	"EPD_AUTO_DU4"
+.LASF1944:
+	.string	"show_stats"
+.LASF1047:
+	.string	"dl_density"
+.LASF1628:
+	.string	"read_dqblk"
+.LASF1584:
+	.string	"dq_flags"
+.LASF3317:
+	.string	"ebc_get_osd_list_enum_num"
+.LASF3120:
+	.string	"buffer_new"
+.LASF213:
+	.string	"user_fpsimd_state"
+.LASF3286:
+	.string	"device_create_file"
+.LASF521:
+	.string	"s_time_gran"
+.LASF2332:
+	.string	"dev_release"
+.LASF1333:
+	.string	"kernel_cap_t"
+.LASF575:
+	.string	"wait_list"
+.LASF2249:
+	.string	"request_pending"
+.LASF843:
+	.string	"hrtimer"
+.LASF494:
+	.string	"s_iflags"
+.LASF717:
+	.string	"perf_event_ctxp"
+.LASF457:
+	.string	"i_dio_count"
+.LASF510:
+	.string	"s_bdi"
+.LASF2826:
+	.string	"wf_table"
+.LASF1700:
+	.string	"num_kp"
+.LASF3322:
+	.string	"__pm_stay_awake"
+.LASF2533:
+	.string	"vmap_area_list"
+.LASF2997:
+	.string	"ebc_auto_thread_sem"
+.LASF629:
+	.string	"in_execve"
+.LASF2214:
+	.string	"RPM_REQ_SUSPEND"
+.LASF483:
+	.string	"s_list"
+.LASF1600:
+	.string	"dqb_rsvspace"
+.LASF1693:
+	.string	"version"
+.LASF2532:
+	.string	"xen_start_flags"
+.LASF2852:
+	.string	"EPD_PART_GL16"
+.LASF1507:
+	.string	"stat_threshold"
+.LASF2331:
+	.string	"class_release"
+.LASF1854:
+	.string	"fu_llist"
+.LASF688:
+	.string	"alloc_lock"
+.LASF514:
+	.string	"s_dquot"
+.LASF796:
+	.string	"system_highpri_wq"
+.LASF1162:
+	.string	"tags"
+.LASF1853:
+	.string	"prev_pos"
+.LASF2279:
+	.string	"expire_count"
+.LASF277:
+	.string	"_etext"
+.LASF497:
+	.string	"s_umount"
+.LASF2105:
+	.string	"is_bin_visible"
+.LASF1326:
+	.string	"pgoff"
+.LASF2190:
+	.string	"of_node"
+.LASF2855:
+	.string	"EPD_PART_GCC16"
+.LASF1988:
+	.string	"names_cachep"
+.LASF784:
+	.string	"preset_lpj"
+.LASF2189:
+	.string	"archdata"
+.LASF1405:
+	.string	"ia_uid"
+.LASF1335:
+	.string	"__cap_init_eff_set"
+.LASF727:
+	.string	"delays"
+.LASF640:
+	.string	"children"
+.LASF1261:
+	.string	"rb_subtree_last"
+.LASF2237:
+	.string	"no_pm_callbacks"
+.LASF1566:
+	.string	"llc_sibling"
+.LASF2639:
+	.string	"PGMIGRATE_FAIL"
+.LASF2404:
+	.string	"device_get_match_data"
+.LASF649:
+	.string	"vfork_done"
+.LASF199:
+	.string	"nanosleep"
+.LASF1384:
+	.string	"inodes_stat_t"
+.LASF813:
+	.string	"pud_t"
+.LASF2783:
+	.string	"platform_device"
+.LASF1663:
+	.string	"rt_spc_timelimit"
+.LASF221:
+	.string	"tail"
+.LASF1408:
+	.string	"ia_atime"
+.LASF2512:
+	.string	"irq_default_affinity"
+.LASF724:
+	.string	"tlb_ubc"
+.LASF2384:
+	.string	"remap"
+.LASF1616:
+	.string	"quota_format_type"
+.LASF2784:
+	.string	"id_auto"
+.LASF1147:
+	.string	"seeks"
+.LASF576:
+	.string	"task_struct"
+.LASF2873:
+	.string	"height_mm"
+.LASF2608:
+	.string	"PGALLOC_MOVABLE"
+.LASF2240:
+	.string	"suspend_timer"
+.LASF1957:
+	.string	"quotalen"
+.LASF3167:
+	.string	"ebc_get_8pix_wf_part3"
+.LASF2378:
+	.string	"sync_sg_for_cpu"
+.LASF1497:
+	.string	"totalreserve_pages"
+.LASF450:
+	.string	"i_wb_frn_history"
+.LASF585:
+	.string	"last_wakee"
+.LASF64:
+	.string	"next"
+.LASF223:
+	.string	"arch_spinlock_t"
+.LASF3306:
+	.string	"ebc_drop_one_dsp_buf"
+.LASF1214:
+	.string	"slab_cache"
+.LASF1097:
+	.string	"nr_tasks"
+.LASF2476:
+	.string	"bus_recovery_info"
+.LASF1293:
+	.string	"mmlist"
+.LASF1688:
+	.string	"set_dqblk"
+.LASF1212:
+	.string	"s_mem"
+.LASF2208:
+	.string	"RPM_RESUMING"
+.LASF471:
+	.string	"d_weak_revalidate"
+.LASF2973:
+	.string	"prev_dsp_buf"
+.LASF1461:
+	.string	"NR_VMSCAN_IMMEDIATE"
+.LASF513:
+	.string	"s_quota_types"
+.LASF1423:
+	.string	"NR_ZONE_INACTIVE_FILE"
+.LASF2441:
+	.string	"DOMAIN_BUS_IPI"
+.LASF1282:
+	.string	"vmacache_seqnum"
+.LASF761:
+	.string	"setup_max_cpus"
+.LASF1802:
+	.string	"i_nlink"
+.LASF2916:
+	.string	"mirror"
+.LASF1756:
+	.string	"write_begin"
+.LASF2197:
+	.string	"groups"
+.LASF3050:
+	.string	"need_res_size"
+.LASF693:
+	.string	"pi_blocked_on"
+.LASF3027:
+	.string	"ebc_probe"
+.LASF501:
+	.string	"s_xattr"
+.LASF3037:
+	.string	"klogo_addr_str"
+.LASF963:
+	.string	"syscr"
+.LASF1915:
+	.string	"s_vfs_rename_key"
+.LASF1401:
+	.string	"ki_ioprio"
+.LASF1131:
+	.string	"attributes_mask"
+.LASF200:
+	.string	"restart_block"
+.LASF39:
+	.string	"umode_t"
+.LASF201:
+	.string	"memstart_addr"
+.LASF2611:
+	.string	"ALLOCSTALL_MOVABLE"
+.LASF742:
+	.string	"pagefault_disabled"
+.LASF964:
+	.string	"syscw"
+.LASF1369:
+	.string	"guid_null"
+.LASF224:
+	.string	"wlocked"
+.LASF2658:
+	.string	"NR_VM_EVENT_ITEMS"
+.LASF1929:
+	.string	"freeze_super"
+.LASF538:
+	.string	"s_inode_list_lock"
+.LASF2568:
+	.string	"align"
+.LASF3124:
+	.string	"frame_idx"
+.LASF2935:
+	.string	"FULL"
+.LASF204:
+	.string	"mm_segment_t"
+.LASF2726:
+	.string	"param_ops_ullong"
+.LASF1878:
+	.string	"fl_lmops"
+.LASF2787:
+	.string	"driver_override"
+.LASF985:
+	.string	"sched_avg"
+.LASF1682:
+	.string	"quota_enable"
+.LASF1516:
+	.string	"zone"
+.LASF1764:
+	.string	"isolate_page"
+.LASF663:
+	.string	"maj_flt"
+.LASF229:
+	.string	"arch_rwlock_t"
+.LASF3301:
+	.string	"ebc_osd_buf_clone"
+.LASF162:
+	.string	"c_false"
+.LASF870:
+	.string	"clock_base"
+.LASF2880:
+	.string	"pmic_read_temperature"
+.LASF1766:
+	.string	"launder_page"
+.LASF1811:
+	.string	"cdev"
+.LASF1034:
+	.string	"my_q"
+.LASF642:
+	.string	"group_leader"
+.LASF1824:
+	.string	"mkdir"
+.LASF1541:
+	.string	"zonelist"
+.LASF253:
+	.string	"FTR_EXACT"
+.LASF2541:
+	.string	"minor"
+.LASF1667:
+	.string	"nextents"
+.LASF3189:
+	.string	"dma_direction"
+.LASF1:
+	.string	"sizetype"
+.LASF678:
+	.string	"real_blocked"
+.LASF1302:
+	.string	"arg_lock"
+.LASF1709:
+	.string	"num_exentries"
+.LASF3102:
+	.string	"check_out"
+.LASF2577:
+	.string	"high_memory"
+.LASF49:
+	.string	"int32_t"
+.LASF3019:
+	.string	"__exitcall_ebc_exit"
+.LASF1010:
+	.string	"nr_failed_migrations_running"
+.LASF867:
+	.string	"next_timer"
+.LASF740:
+	.string	"throttle_queue"
+.LASF3310:
+	.string	"finish_wait"
+.LASF1448:
+	.string	"WORKINGSET_NODERECLAIM"
+.LASF541:
+	.string	"s_inodes_wb"
+.LASF2216:
+	.string	"RPM_REQ_RESUME"
+.LASF2013:
+	.string	"keyring_index_key"
+.LASF3183:
+	.string	"ebc_tcon_disable"
+.LASF1389:
+	.string	"leases_enable"
+.LASF227:
+	.string	"qrwlock"
+.LASF2656:
+	.string	"SWAP_RA"
+.LASF799:
+	.string	"system_freezable_wq"
+.LASF1848:
+	.string	"file_ra_state"
+.LASF919:
+	.string	"user_struct"
+.LASF2334:
+	.string	"ns_type"
+.LASF2859:
+	.string	"EPD_DU4"
+.LASF588:
+	.string	"on_rq"
+.LASF2308:
+	.string	"lock_key"
+.LASF2531:
+	.string	"tramp_pg_dir"
+.LASF3011:
+	.string	"dev_attr_ebc_version"
+.LASF834:
+	.string	"PCPU_FC_NR"
+.LASF2088:
+	.string	"prealloc_buf"
+.LASF2346:
+	.string	"DL_DEV_DRIVER_BOUND"
+.LASF812:
+	.string	"pgprot_t"
+.LASF1925:
+	.string	"drop_inode"
+.LASF1735:
+	.string	"num_trace_evals"
+.LASF2305:
+	.string	"num_vf"
+.LASF1503:
+	.string	"isolate_mode_t"
+.LASF3190:
+	.string	"debug_dma_sync_single_for_device"
+.LASF99:
+	.string	"llseek"
+.LASF2345:
+	.string	"DL_DEV_PROBING"
+.LASF1754:
+	.string	"set_page_dirty"
+.LASF1788:
+	.string	"bd_block_size"
+.LASF1629:
+	.string	"commit_dqblk"
+.LASF2119:
+	.string	"namespace"
+.LASF1677:
+	.string	"i_ino_warnlimit"
+.LASF2758:
+	.string	"MODULE_STATE_GOING"
+.LASF1064:
+	.string	"rcu_node"
+.LASF2169:
+	.string	"init_name"
+.LASF84:
+	.string	"late_time_init"
+.LASF1932:
+	.string	"unfreeze_fs"
+.LASF877:
+	.string	"nodemask_t"
+.LASF2196:
+	.string	"class"
+.LASF325:
+	.string	"__idmap_text_end"
+.LASF2953:
+	.string	"frame_total"
+.LASF775:
+	.string	"read_cntvct_el0"
+.LASF243:
+	.string	"target"
+.LASF2514:
+	.string	"HI_SOFTIRQ"
+.LASF3192:
+	.string	"direction"
+.LASF928:
+	.string	"session_keyring"
+.LASF334:
+	.string	"__boot_cpu_mode"
+.LASF2019:
+	.string	"key_restrict_link_func_t"
+.LASF1453:
+	.string	"NR_WRITEBACK"
+.LASF3131:
+	.string	"frame_count"
+.LASF487:
+	.string	"s_maxbytes"
+.LASF2325:
+	.string	"acpi_device_id"
+.LASF1650:
+	.string	"d_ino_count"
+.LASF2655:
+	.string	"UNEVICTABLE_PGSTRANDED"
+.LASF2459:
+	.string	"i2c_bus_type"
+.LASF855:
+	.string	"hrtimer_cpu_base"
+.LASF3316:
+	.string	"ebc_notify"
+.LASF1359:
+	.string	"cb_head"
+.LASF1624:
+	.string	"check_quota_file"
+.LASF1893:
+	.string	"nfs4_lock_info"
+.LASF1959:
+	.string	"restrict_link"
+.LASF2289:
+	.string	"dev_archdata"
+.LASF1990:
+	.string	"def_blk_fops"
+.LASF462:
+	.string	"i_devices"
+.LASF329:
+	.string	"__inittext_end"
+.LASF716:
+	.string	"pi_state_cache"
+.LASF945:
+	.string	"anon_vma_chain"
+.LASF1701:
+	.string	"num_gpl_syms"
+.LASF602:
+	.string	"cpus_requested"
+.LASF2562:
+	.string	"__tracepoint_page_ref_mod_unless"
+.LASF3200:
+	.string	"wake_lock_init"
+.LASF1154:
+	.string	"list_lru"
+.LASF216:
+	.string	"fpcr"
+.LASF2068:
+	.string	"target_kn"
+.LASF882:
+	.string	"sival_ptr"
+.LASF420:
+	.string	"i_opflags"
+.LASF713:
+	.string	"robust_list"
+.LASF1683:
+	.string	"quota_disable"
+.LASF3063:
+	.string	"waveform_open"
+.LASF2024:
+	.string	"serial_node"
+.LASF1669:
+	.string	"s_incoredqs"
+.LASF477:
+	.string	"d_iput"
+.LASF108:
+	.string	"compat_ioctl"
+.LASF3208:
+	.string	"__range_ok"
+.LASF287:
+	.string	"__start_ro_after_init"
+.LASF2675:
+	.string	"num_poisoned_pages"
+.LASF875:
+	.string	"filter"
+.LASF3193:
+	.string	"ebc_pmic_get_vcom"
+.LASF2919:
+	.string	"ebc_tcon"
+.LASF2579:
+	.string	"sysctl_legacy_va_layout"
+.LASF2348:
+	.string	"dev_links_info"
+.LASF46:
+	.string	"loff_t"
+.LASF2685:
+	.string	"d_val"
+.LASF645:
+	.string	"thread_pid"
+.LASF1465:
+	.string	"NR_UNRECLAIMABLE_PAGES"
+.LASF2481:
+	.string	"smbus_xfer"
+.LASF2732:
+	.string	"param_array_ops"
+.LASF2645:
+	.string	"COMPACTSUCCESS"
+.LASF905:
+	.string	"_arch"
+.LASF2695:
+	.string	"st_value"
+.LASF2829:
+	.string	"buf_user"
+.LASF2094:
+	.string	"KOBJ_NS_TYPES"
+.LASF69:
+	.string	"pprev"
+.LASF425:
+	.string	"i_default_acl"
+.LASF1376:
+	.string	"ioc_node"
+.LASF2202:
+	.string	"of_node_reused"
+.LASF2082:
+	.string	"kernfs_node_id"
+.LASF2321:
+	.string	"PROBE_PREFER_ASYNCHRONOUS"
+.LASF1103:
+	.string	"icq_list"
+.LASF25:
+	.string	"__kernel_size_t"
+.LASF615:
+	.string	"active_mm"
+.LASF1404:
+	.string	"ia_mode"
+.LASF1051:
+	.string	"dl_boosted"
+.LASF1146:
+	.string	"batch"
+.LASF1850:
+	.string	"async_size"
+.LASF705:
+	.string	"acct_vm_mem1"
+.LASF2946:
+	.string	"ebc_osd_vir"
+.LASF2706:
+	.string	"sh_info"
+.LASF2117:
+	.string	"default_attrs"
+.LASF2569:
+	.string	"memory_type"
+.LASF825:
+	.string	"rb_root"
+.LASF1016:
+	.string	"nr_wakeups_local"
+.LASF2939:
+	.string	"DATA_CALC_NONE"
+.LASF1151:
+	.string	"list_lru_memcg"
+.LASF1745:
+	.string	"WRITE_LIFE_NONE"
+.LASF1744:
+	.string	"WRITE_LIFE_NOT_SET"
+.LASF2718:
+	.string	"__stop___param"
+.LASF2782:
+	.string	"cpu_subsys"
+.LASF679:
+	.string	"saved_sigmask"
+.LASF414:
+	.string	"d_time"
+.LASF2943:
+	.string	"ebc_info"
+.LASF240:
+	.string	"entries"
+.LASF971:
+	.string	"cpu_id"
+.LASF2926:
+	.string	"dsp_mode_set"
+.LASF2620:
+	.string	"PGMAJFAULT"
+.LASF1515:
+	.string	"__MAX_NR_ZONES"
+.LASF2432:
+	.string	"irq_fwspec"
+.LASF3005:
+	.string	"waveform_ops"
+.LASF1773:
+	.string	"iov_iter"
+.LASF511:
+	.string	"s_mtd"
+.LASF2712:
+	.string	"kparam_string"
+.LASF2174:
+	.string	"power"
+.LASF266:
+	.string	"strict_mask"
+.LASF3309:
+	.string	"init_wait_entry"
+.LASF2755:
+	.string	"module_state"
+.LASF3258:
+	.string	"_dev_info"
+.LASF417:
+	.string	"d_subdirs"
+.LASF1955:
+	.string	"last_used_at"
+.LASF1246:
+	.string	"f_write_hint"
+.LASF978:
+	.string	"last_queued"
+.LASF1087:
+	.string	"user_ns"
+.LASF2604:
+	.string	"PSWPIN"
+.LASF67:
+	.string	"first"
+.LASF2198:
+	.string	"iommu_group"
+.LASF558:
+	.string	"wait_pidfd"
+.LASF1914:
+	.string	"s_umount_key"
+.LASF2901:
+	.string	"xen_start_info"
+.LASF2426:
+	.string	"of_fwnode_ops"
+.LASF2837:
+	.string	"buf_mode"
+.LASF944:
+	.string	"vm_flags"
+.LASF1692:
+	.string	"modinfo_attrs"
+.LASF2471:
+	.string	"mux_lock"
+.LASF197:
+	.string	"has_timeout"
+.LASF2708:
+	.string	"sh_entsize"
+.LASF419:
+	.string	"i_mode"
+.LASF1998:
+	.string	"proc_handler"
+.LASF2188:
+	.string	"removed_mem"
+.LASF248:
+	.string	"jump_label_t"
+.LASF3288:
+	.string	"of_get_property"
+.LASF2680:
+	.string	"Elf64_Half"
+.LASF2255:
+	.string	"use_autosuspend"
+.LASF3020:
+	.string	"ebc_init"
+.LASF674:
+	.string	"nsproxy"
+.LASF2223:
+	.string	"can_wakeup"
+.LASF2515:
+	.string	"TIMER_SOFTIRQ"
+.LASF3136:
+	.string	"temp_data"
+.LASF1183:
+	.string	"xol_area"
+.LASF235:
+	.string	"rlock"
+.LASF1856:
+	.string	"fl_owner_t"
+.LASF2700:
+	.string	"sh_type"
+.LASF1072:
+	.string	"euid"
+.LASF1069:
+	.string	"wait"
+.LASF1718:
+	.string	"bug_table"
+.LASF933:
+	.string	"seqnum"
+.LASF444:
+	.string	"dirtied_time_when"
+.LASF1864:
+	.string	"fl_block"
+.LASF2670:
+	.string	"init_on_free"
+.LASF1120:
+	.string	"nr_pages"
+.LASF3165:
+	.string	"ebc_power_set"
+.LASF1730:
+	.string	"num_trace_bprintk_fmt"
+.LASF3252:
+	.string	"__fls"
+.LASF1098:
+	.string	"ioprio"
+.LASF2984:
+	.string	"is_early_suspend"
+.LASF1132:
+	.string	"rdev"
+.LASF1205:
+	.string	"private_data"
+.LASF1847:
+	.string	"signum"
+.LASF508:
+	.string	"s_mounts"
+.LASF634:
+	.string	"use_memdelay"
+.LASF1122:
+	.string	"caller"
+.LASF347:
+	.string	"thread_struct"
+.LASF2123:
+	.string	"envp"
+.LASF787:
+	.string	"persistent_clock_is_local"
+.LASF2382:
+	.string	"dma_supported"
+.LASF3225:
+	.string	"dev_set_drvdata"
+.LASF3318:
+	.string	"epd_lut_get"
+.LASF1504:
+	.string	"per_cpu_pages"
+.LASF1135:
+	.string	"ctime"
+.LASF2383:
+	.string	"set_dma_mask"
+.LASF113:
+	.string	"release"
+.LASF2339:
+	.string	"max_segment_size"
+.LASF37:
+	.string	"__kernel_dev_t"
+.LASF2078:
+	.string	"atomic_write_len"
+.LASF1604:
+	.string	"dqb_btime"
+.LASF2362:
+	.string	"revmap_tree"
+.LASF1287:
+	.string	"mm_users"
+.LASF1446:
+	.string	"WORKINGSET_ACTIVATE"
+.LASF516:
+	.string	"s_id"
+.LASF315:
+	.string	"__alt_instructions_end"
+.LASF1431:
+	.string	"NR_ZSPAGES"
+.LASF533:
+	.string	"s_dentry_lru"
+.LASF2518:
+	.string	"BLOCK_SOFTIRQ"
+.LASF1380:
+	.string	"files_stat_struct"
+.LASF3264:
+	.string	"devm_memremap"
+.LASF814:
+	.string	"pgtable_t"
+.LASF1004:
+	.string	"block_start"
+.LASF2544:
+	.string	"nodename"
+.LASF1823:
+	.string	"symlink"
+.LASF1543:
+	.string	"mem_map"
+.LASF3090:
+	.string	"old_buffer"
+.LASF2929:
+	.string	"lut_data_set"
+.LASF790:
+	.string	"sysctl_timer_migration"
+.LASF2887:
+	.string	"DMA_NONE"
+.LASF1867:
+	.string	"fl_type"
+.LASF59:
+	.string	"counter"
+.LASF2805:
+	.string	"WAKE_LOCK_SUSPEND"
+.LASF1746:
+	.string	"WRITE_LIFE_SHORT"
+.LASF3247:
+	.string	"__swab32p"
+.LASF286:
+	.string	"_einittext"
+.LASF2393:
+	.string	"_flags"
+.LASF402:
+	.string	"d_rcu"
+.LASF206:
+	.string	"addr_limit"
+.LASF2775:
+	.string	"trace_eval_map"
+.LASF1068:
+	.string	"done"
+.LASF211:
+	.string	"elf_hwcap"
+.LASF2719:
+	.string	"param_ops_byte"
+.LASF1953:
+	.string	"fscrypt_operations"
+.LASF2381:
+	.string	"mapping_error"
+.LASF1104:
+	.string	"release_work"
+.LASF1807:
+	.string	"i_bdev"
+.LASF2663:
+	.string	"vm_node_stat"
+.LASF1908:
+	.string	"mount"
+.LASF2804:
+	.string	"kmalloc_caches"
+.LASF1347:
+	.string	"MIGRATE_SYNC"
+.LASF1951:
+	.string	"export_operations"
+.LASF551:
+	.string	"PIDTYPE_PGID"
+.LASF1690:
+	.string	"rm_xquota"
+.LASF1055:
+	.string	"dl_timer"
+.LASF3297:
+	.string	"remap_pfn_range"
+.LASF2344:
+	.string	"DL_DEV_NO_DRIVER"
+.LASF341:
+	.string	"hbp_watch"
+.LASF2811:
+	.string	"WF_TYPE_RESET"
+.LASF2497:
+	.string	"sda_gpiod"
+.LASF1517:
+	.string	"watermark"
+.LASF2392:
+	.string	"deadprops"
+.LASF3260:
+	.string	"devm_kmalloc"
+.LASF16:
+	.string	"long long unsigned int"
+.LASF1263:
+	.string	"anon_name"
+.LASF1411:
+	.string	"ia_file"
+.LASF264:
+	.string	"arm64_ftr_reg"
+.LASF2453:
+	.string	"irq_domain_simple_ops"
+.LASF469:
+	.string	"dentry_operations"
+.LASF738:
+	.string	"memcg_nr_pages_over_high"
+.LASF2917:
+	.string	"disable_logo"
+.LASF1572:
+	.string	"percpu_counter_batch"
+.LASF43:
+	.string	"_Bool"
+.LASF1230:
+	.string	"hmm_data"
+.LASF1001:
+	.string	"sleep_start"
+.LASF662:
+	.string	"min_flt"
+.LASF1842:
+	.string	"flc_lease"
+.LASF2375:
+	.string	"unmap_resource"
+.LASF2980:
+	.string	"wake_lock_is_set"
+.LASF2327:
+	.string	"driver_private"
+.LASF1809:
+	.string	"i_link"
+.LASF1350:
+	.string	"rcu_sync_type"
+.LASF1831:
+	.string	"listxattr"
+.LASF894:
+	.string	"_lower"
+.LASF1705:
+	.string	"async_probe_requested"
+.LASF2277:
+	.string	"active_count"
+.LASF280:
+	.string	"_edata"
+.LASF79:
+	.string	"__security_initcall_end"
+.LASF2129:
+	.string	"kobj_sysfs_ops"
+.LASF2861:
+	.string	"EPD_RESET"
+.LASF2338:
+	.string	"device_dma_parameters"
+.LASF215:
+	.string	"fpsr"
+.LASF498:
+	.string	"s_count"
+.LASF470:
+	.string	"d_revalidate"
+.LASF2296:
+	.string	"bus_groups"
+.LASF809:
+	.string	"pmd_t"
+.LASF489:
+	.string	"s_op"
+.LASF1580:
+	.string	"dq_count"
+.LASF397:
+	.string	"dentry_stat"
+.LASF72:
+	.string	"pstate_check_t"
+.LASF801:
+	.string	"system_freezable_power_efficient_wq"
+.LASF3024:
+	.string	"__func__"
+.LASF57:
+	.string	"resource_size_t"
+.LASF581:
+	.string	"wake_entry"
+.LASF921:
+	.string	"processes"
+.LASF1070:
+	.string	"suid"
+.LASF2444:
+	.string	"irq_domain_ops"
+.LASF2989:
+	.string	"overlay_bg_control"
+.LASF930:
+	.string	"locked_vm"
+.LASF824:
+	.string	"rb_left"
+.LASF2076:
+	.string	"seq_next"
+.LASF276:
+	.string	"_stext"
+.LASF1679:
+	.string	"quotactl_ops"
+.LASF536:
+	.string	"s_sync_lock"
+.LASF2271:
+	.string	"total_time"
+.LASF29:
+	.string	"__kernel_clock_t"
+.LASF393:
+	.string	"nr_unused"
+.LASF2890:
+	.string	"dma_address"
+.LASF2584:
+	.string	"mmap_rnd_compat_bits_max"
+.LASF41:
+	.string	"clockid_t"
+.LASF1576:
+	.string	"dq_free"
+.LASF1550:
+	.string	"reboot_notifier_list"
+.LASF686:
+	.string	"parent_exec_id"
+.LASF2472:
+	.string	"retries"
+.LASF2058:
+	.string	"kernfs_elem_dir"
+.LASF214:
+	.string	"vregs"
+.LASF2593:
+	.string	"page_entry_size"
+.LASF2964:
+	.string	"lut_data"
+.LASF3044:
+	.string	"ebc_other_init"
+.LASF1415:
+	.string	"free_list"
+.LASF589:
+	.string	"prio"
+.LASF3217:
+	.string	"platform_get_drvdata"
+.LASF2524:
+	.string	"NR_SOFTIRQS"
+.LASF2281:
+	.string	"autosleep_enabled"
+.LASF2937:
+	.string	"OVERLAY"
+.LASF644:
+	.string	"ptrace_entry"
+.LASF2484:
+	.string	"lock_bus"
+.LASF1991:
+	.string	"def_chr_fops"
+.LASF586:
+	.string	"recent_used_cpu"
+.LASF1729:
+	.string	"num_jump_entries"
+.LASF491:
+	.string	"s_qcop"
+.LASF60:
+	.string	"atomic_t"
+.LASF3175:
+	.string	"ebc_tcon_image_addr_set"
+.LASF2500:
+	.string	"max_num_msgs"
+.LASF2072:
+	.string	"notify_next"
+.LASF2275:
+	.string	"prevent_sleep_time"
+.LASF2590:
+	.string	"sysctl_overcommit_ratio"
+.LASF203:
+	.string	"kimage_voffset"
+.LASF8:
+	.string	"short int"
+.LASF2323:
+	.string	"of_device_id"
+.LASF2888:
+	.string	"scatterlist"
+.LASF1236:
+	.string	"altmap_valid"
+.LASF3319:
+	.string	"down"
+.LASF102:
+	.string	"read_iter"
+.LASF336:
+	.string	"debug_info"
+.LASF1252:
+	.string	"f_owner"
+.LASF2451:
+	.string	"irq_domain_chip_generic"
+.LASF1352:
+	.string	"RCU_SCHED_SYNC"
+.LASF2940:
+	.string	"DATA_CALC_FULL"
+.LASF2553:
+	.string	"tracepoint"
+.LASF2752:
+	.string	"test"
+.LASF2543:
+	.string	"this_device"
+.LASF1974:
+	.string	"pad_until"
+.LASF458:
+	.string	"i_writecount"
+.LASF448:
+	.string	"i_wb_frn_winner"
+.LASF1916:
+	.string	"s_writers_key"
+.LASF977:
+	.string	"last_arrival"
+.LASF2357:
+	.string	"mapcount"
+.LASF762:
+	.string	"__boot_cpu_id"
+.LASF1553:
+	.string	"numa_zonelist_order"
+.LASF2220:
+	.string	"pm_domain_data"
+.LASF2456:
+	.string	"byte"
+.LASF3283:
+	.string	"__wake_up_sync"
+.LASF1971:
+	.string	"poll_table_struct"
+.LASF1762:
+	.string	"direct_IO"
+.LASF2096:
+	.string	"current_may_mount"
+.LASF382:
+	.string	"seqlock_t"
+.LASF3043:
+	.string	"change_4bit_to_8bit"
+.LASF2921:
+	.string	"hclk"
+.LASF2084:
+	.string	"kernfs_iattrs"
+.LASF2881:
+	.string	"pmic_get_vcom"
+.LASF626:
+	.string	"sched_migrated"
+.LASF1211:
+	.string	"frozen"
+.LASF2312:
+	.string	"suppress_bind_attrs"
+.LASF1233:
+	.string	"page_fault"
+.LASF1438:
+	.string	"NR_INACTIVE_FILE"
+.LASF3237:
+	.string	"__ret_warn_on"
+.LASF1594:
+	.string	"kqid"
+.LASF2450:
+	.string	"irq_generic_chip_ops"
+.LASF2027:
+	.string	"index_key"
+.LASF2257:
+	.string	"memalloc_noio"
+.LASF1590:
+	.string	"GRPQUOTA"
+.LASF1549:
+	.string	"rwsem"
+.LASF1403:
+	.string	"ia_valid"
+.LASF1379:
+	.string	"__invalid_size_argument_for_IOC"
+.LASF1209:
+	.string	"inuse"
+.LASF3174:
+	.string	"ebc_tcon_frame_start"
+.LASF1660:
+	.string	"qc_type_state"
+.LASF2011:
+	.string	"key_serial_t"
+.LASF1558:
+	.string	"__highest_present_section_nr"
+.LASF2330:
+	.string	"dev_uevent"
+.LASF2751:
+	.string	"setup"
+.LASF1245:
+	.string	"f_lock"
+.LASF2650:
+	.string	"UNEVICTABLE_PGSCANNED"
+.LASF852:
+	.string	"active"
+.LASF2447:
+	.string	"xlate"
+.LASF1605:
+	.string	"dqb_itime"
+.LASF1747:
+	.string	"WRITE_LIFE_MEDIUM"
+.LASF2439:
+	.string	"DOMAIN_BUS_PLATFORM_MSI"
+.LASF269:
+	.string	"user_val"
+.LASF453:
+	.string	"i_wb_list"
+.LASF1996:
+	.string	"simple_dir_operations"
+.LASF2352:
+	.string	"defer_hook"
+.LASF129:
+	.string	"fadvise"
+.LASF2583:
+	.string	"mmap_rnd_compat_bits_min"
+.LASF2565:
+	.string	"vmem_altmap"
+.LASF1310:
+	.string	"arg_end"
+.LASF2026:
+	.string	"revoked_at"
+.LASF1157:
+	.string	"private_list"
+.LASF261:
+	.string	"shift"
+.LASF1406:
+	.string	"ia_gid"
+.LASF3098:
+	.string	"vaild_size"
+.LASF36:
+	.string	"name_offset"
+.LASF2103:
+	.string	"attribute_group"
+.LASF300:
+	.string	"__irqentry_text_end"
+.LASF1315:
+	.string	"context"
+.LASF3153:
+	.string	"get_overlay_image"
+.LASF1509:
+	.string	"per_cpu_nodestat"
+.LASF2489:
+	.string	"get_scl"
+.LASF2570:
+	.string	"MEMORY_DEVICE_PRIVATE"
+.LASF1560:
+	.string	"thread_id"
+.LASF732:
+	.string	"default_timer_slack_ns"
+.LASF3061:
+	.string	"waveform_version_read"
+.LASF1736:
+	.string	"source_list"
+.LASF757:
+	.string	"secondary_data"
+.LASF2212:
+	.string	"RPM_REQ_NONE"
+.LASF951:
+	.string	"swap_readahead_info"
+.LASF1096:
+	.string	"active_ref"
+.LASF806:
+	.string	"pmdval_t"
+.LASF2491:
+	.string	"get_sda"
+.LASF1088:
+	.string	"group_info"
+.LASF765:
+	.string	"arch_timer_erratum_match_type"
+.LASF2467:
+	.string	"algo"
+.LASF1241:
+	.string	"file"
+.LASF2314:
+	.string	"of_match_table"
+.LASF2547:
+	.string	"percpu_count_ptr"
+.LASF2934:
+	.string	"PART"
+.LASF3298:
+	.string	"ebc_phy_buf_base_get"
+.LASF2048:
+	.string	"loops_per_jiffy"
+.LASF2479:
+	.string	"i2c_algorithm"
+.LASF3094:
+	.string	"check_size"
+.LASF3171:
+	.string	"ebc_get_8pix_wf3"
+.LASF2828:
+	.string	"buf_idle"
+.LASF1368:
+	.string	"uuid_t"
+.LASF2406:
+	.string	"property_read_int_array"
+.LASF2967:
+	.string	"auto_image_old"
+.LASF1829:
+	.string	"setattr2"
+.LASF3115:
+	.string	"ebc_overlay_bg_frame_start"
+.LASF1324:
+	.string	"init_mm"
+.LASF2630:
+	.string	"KSWAPD_INODESTEAL"
+.LASF1144:
+	.string	"count_objects"
+.LASF3251:
+	.string	"fls64"
+.LASF892:
+	.string	"_stime"
+.LASF2351:
+	.string	"needs_suppliers"
+.LASF2286:
+	.string	"activate"
+.LASF1493:
+	.string	"kcompactd_max_order"
+.LASF781:
+	.string	"tick_nsec"
+.LASF460:
+	.string	"i_flctx"
+.LASF135:
+	.string	"atomic_notifier_head"
+.LASF1031:
+	.string	"statistics"
+.LASF2908:
+	.string	"current_buffer"
+.LASF3129:
+	.string	"direct_mode_data_change"
+.LASF1587:
+	.string	"kprojid_t"
+.LASF666:
+	.string	"ptracer_cred"
+.LASF2110:
+	.string	"store"
+.LASF1272:
+	.string	"page_mkwrite"
+.LASF1978:
+	.string	"kobject"
+.LASF2379:
+	.string	"sync_sg_for_device"
+.LASF1933:
+	.string	"statfs"
+.LASF3278:
+	.string	"__kmalloc"
+.LASF3266:
+	.string	"_dev_err"
+.LASF3257:
+	.string	"__platform_driver_register"
+.LASF2948:
+	.string	"ebc_buf_real_size"
+.LASF2996:
+	.string	"ebc_thread_wq"
+.LASF1763:
+	.string	"migratepage"
+.LASF2635:
+	.string	"DROP_PAGECACHE"
+.LASF792:
+	.string	"work_struct"
+.LASF2870:
+	.string	"height"
+.LASF1063:
+	.string	"task_group"
+.LASF1040:
+	.string	"on_list"
+.LASF2736:
+	.string	"plt_num_entries"
+.LASF2649:
+	.string	"UNEVICTABLE_PGCULLED"
+.LASF570:
+	.string	"kgid_t"
+.LASF582:
+	.string	"on_cpu"
+.LASF2100:
+	.string	"drop_ns"
+.LASF1391:
+	.string	"sysctl_protected_symlinks"
+.LASF3072:
+	.string	"buf_format"
+.LASF2592:
+	.string	"protection_map"
+.LASF2733:
+	.string	"param_ops_string"
+.LASF2328:
+	.string	"class_groups"
+.LASF290:
+	.string	"__per_cpu_load"
+.LASF1894:
+	.string	"nfs4_lock_state"
+.LASF2774:
+	.string	"trace_event_call"
+.LASF1199:
+	.string	"i_mmap_rwsem"
+.LASF1373:
+	.string	"errseq_t"
+.LASF1318:
+	.string	"ioctx_table"
+.LASF1457:
+	.string	"NR_SHMEM_PMDMAPPED"
+.LASF2503:
+	.string	"max_comb_1st_msg_len"
+.LASF1514:
+	.string	"ZONE_MOVABLE"
+.LASF3004:
+	.string	"ebc_misc"
+.LASF2361:
+	.string	"revmap_size"
+.LASF1870:
+	.string	"fl_wait"
+.LASF684:
+	.string	"audit_context"
+.LASF291:
+	.string	"__per_cpu_start"
+.LASF283:
+	.string	"__init_begin"
+.LASF2109:
+	.string	"sysfs_ops"
+.LASF2834:
+	.string	"phy_addr"
+.LASF2134:
+	.string	"firmware_kobj"
+.LASF292:
+	.string	"__per_cpu_end"
+.LASF2609:
+	.string	"ALLOCSTALL_DMA32"
+.LASF2618:
+	.string	"PGLAZYFREE"
+.LASF1820:
+	.string	"create"
+.LASF1402:
+	.string	"iattr"
+.LASF2435:
+	.string	"irq_domain_bus_token"
+.LASF720:
+	.string	"rseq"
+.LASF3138:
+	.string	"get_auto_image"
+.LASF196:
+	.string	"nfds"
+.LASF1059:
+	.string	"sigval"
+.LASF719:
+	.string	"perf_event_list"
+.LASF1640:
+	.string	"get_reserved_space"
+.LASF424:
+	.string	"i_acl"
+.LASF1758:
+	.string	"bmap"
+.LASF3265:
+	.string	"ebc_buf_init"
+.LASF2017:
+	.string	"key_payload"
+.LASF481:
+	.string	"d_real"
+.LASF2529:
+	.string	"swapper_pg_end"
+.LASF3008:
+	.string	"dev_attr_pmic_name"
+.LASF631:
+	.string	"in_user_fault"
+.LASF1889:
+	.string	"lm_change"
+.LASF2508:
+	.string	"irq_cpustat_t"
+.LASF1613:
+	.string	"dqi_max_spc_limit"
+.LASF1227:
+	.string	"pmd_huge_pte"
+.LASF2769:
+	.string	"exception_table_entry"
+.LASF1527:
+	.string	"nr_isolate_pageblock"
+.LASF2276:
+	.string	"event_count"
+.LASF208:
+	.string	"preempt_count"
+.LASF1551:
+	.string	"movable_zone"
+.LASF74:
+	.string	"initcall_entry_t"
+.LASF124:
+	.string	"fallocate"
+.LASF1676:
+	.string	"i_spc_warnlimit"
+.LASF3238:
+	.string	"check_object_size"
+.LASF1484:
+	.string	"node_present_pages"
+.LASF1197:
+	.string	"i_mmap_writable"
+.LASF707:
+	.string	"mems_allowed"
+.LASF2228:
+	.string	"is_noirq_suspended"
+.LASF1727:
+	.string	"tracepoints_ptrs"
+.LASF187:
+	.string	"time"
+.LASF584:
+	.string	"wakee_flip_decay_ts"
+.LASF1523:
+	.string	"zone_start_pfn"
+.LASF519:
+	.string	"s_max_links"
+.LASF1014:
+	.string	"nr_wakeups_sync"
+.LASF1719:
+	.string	"kallsyms"
+.LASF1496:
+	.string	"kcompactd"
+.LASF65:
+	.string	"prev"
+.LASF2184:
+	.string	"dma_parms"
+.LASF1089:
+	.string	"fs_struct"
+.LASF192:
+	.string	"clockid"
+.LASF989:
+	.string	"util_sum"
+.LASF50:
+	.string	"uint32_t"
+.LASF1309:
+	.string	"arg_start"
+.LASF2385:
+	.string	"unremap"
+.LASF2957:
+	.string	"auto_check"
+.LASF2438:
+	.string	"DOMAIN_BUS_PCI_MSI"
+.LASF1137:
+	.string	"blocks"
+.LASF324:
+	.string	"__idmap_text_start"
+.LASF1685:
+	.string	"set_info"
+.LASF3066:
+	.string	"ebc_mmap"
+.LASF2588:
+	.string	"sysctl_admin_reserve_kbytes"
+.LASF788:
+	.string	"timer_list"
+.LASF2990:
+	.string	"resume_count_enable"
+.LASF1653:
+	.string	"d_ino_warns"
+.LASF2469:
+	.string	"lock_ops"
+.LASF1295:
+	.string	"hiwater_vm"
+.LASF3058:
+	.string	"pmic_vcom_read"
+.LASF3259:
+	.string	"misc_deregister"
+.LASF1217:
+	.string	"compound_head"
+.LASF2527:
+	.string	"empty_zero_page"
+.LASF1841:
+	.string	"flc_posix"
+.LASF293:
+	.string	"__kprobes_text_start"
+.LASF26:
+	.string	"__kernel_ssize_t"
+.LASF1180:
+	.string	"orig_ret_vaddr"
+.LASF435:
+	.string	"i_ctime"
+.LASF1785:
+	.string	"bd_write_holder"
+.LASF2163:
+	.string	"poweroff_noirq"
+.LASF3262:
+	.string	"of_parse_phandle"
+.LASF1827:
+	.string	"rename"
+.LASF935:
+	.string	"vm_area_struct"
+.LASF2206:
+	.string	"rpm_status"
+.LASF1904:
+	.string	"sb_writers"
+.LASF1662:
+	.string	"ino_timelimit"
+.LASF121:
+	.string	"splice_write"
+.LASF2820:
+	.string	"PVI_WF_MAX"
+.LASF2061:
+	.string	"ino_idr"
+.LASF1675:
+	.string	"i_rt_spc_timelimit"
+.LASF140:
+	.string	"oops_in_progress"
+.LASF3003:
+	.string	"ebc_ops"
+.LASF3033:
+	.string	"klogo_addr"
+.LASF1620:
+	.string	"qf_next"
+.LASF2376:
+	.string	"sync_single_for_cpu"
+.LASF793:
+	.string	"data"
+.LASF3210:
+	.string	"kzalloc"
+.LASF3231:
+	.string	"msecs_to_jiffies"
+.LASF1888:
+	.string	"lm_break"
+.LASF1188:
+	.string	"hyp_vectors_slot"
+.LASF1208:
+	.string	"slab_list"
+.LASF878:
+	.string	"_unused_nodemask_arg_"
+.LASF623:
+	.string	"personality"
+.LASF1794:
+	.string	"bd_queue"
+.LASF3021:
+	.string	"ebc_resume"
+.LASF2798:
+	.string	"init_task"
+.LASF389:
+	.string	"empty_name"
+.LASF1285:
+	.string	"task_size"
+.LASF539:
+	.string	"s_inodes"
+.LASF901:
+	.string	"_addr"
+.LASF1557:
+	.string	"pageblock_flags"
+.LASF1314:
+	.string	"binfmt"
+.LASF2207:
+	.string	"RPM_ACTIVE"
+.LASF4:
+	.string	"signed char"
+.LASF376:
+	.string	"rcu_scheduler_active"
+.LASF3220:
+	.string	"propname"
+.LASF2070:
+	.string	"priv"
+.LASF1830:
+	.string	"getattr"
+.LASF612:
+	.string	"sched_info"
+.LASF1644:
+	.string	"d_fieldmask"
+.LASF1972:
+	.string	"seq_file"
+.LASF2161:
+	.string	"freeze_noirq"
+.LASF1462:
+	.string	"NR_DIRTIED"
+.LASF2701:
+	.string	"sh_flags"
+.LASF610:
+	.string	"rcu_tasks_idle_cpu"
+.LASF1626:
+	.string	"write_file_info"
+.LASF1818:
+	.string	"get_acl"
+.LASF1928:
+	.string	"sync_fs"
+.LASF130:
+	.string	"android_kabi_reserved1"
+.LASF131:
+	.string	"android_kabi_reserved2"
+.LASF132:
+	.string	"android_kabi_reserved3"
+.LASF133:
+	.string	"android_kabi_reserved4"
+.LASF2204:
+	.string	"android_kabi_reserved5"
+.LASF2205:
+	.string	"android_kabi_reserved6"
+.LASF748:
+	.string	"android_kabi_reserved7"
+.LASF749:
+	.string	"android_kabi_reserved8"
+.LASF247:
+	.string	"enabled"
+.LASF562:
+	.string	"init_pid_ns"
+.LASF97:
+	.string	"file_operations"
+.LASF2831:
+	.string	"buf_osd"
+.LASF1714:
+	.string	"arch"
+.LASF2230:
+	.string	"no_pm"
+.LASF2868:
+	.string	"ebc_buf_info"
+.LASF907:
+	.string	"_kill"
+.LASF785:
+	.string	"ktime_t"
+.LASF1869:
+	.string	"fl_link_cpu"
+.LASF1696:
+	.string	"syms"
+.LASF1026:
+	.string	"group_node"
+.LASF2080:
+	.string	"kernfs_open_node"
+.LASF1651:
+	.string	"d_ino_timer"
+.LASF1439:
+	.string	"NR_ACTIVE_FILE"
+.LASF2032:
+	.string	"key_sysctls"
+.LASF1306:
+	.string	"end_data"
+.LASF350:
+	.string	"sve_vl"
+.LASF2623:
+	.string	"PGSTEAL_KSWAPD"
+.LASF3035:
+	.string	"klogo_addr_valid"
+.LASF2571:
+	.string	"MEMORY_DEVICE_PUBLIC"
+.LASF2301:
+	.string	"sync_state"
+.LASF1397:
+	.string	"ki_pos"
+.LASF988:
+	.string	"runnable_load_sum"
+.LASF2287:
+	.string	"sync"
+.LASF2629:
+	.string	"SLABS_SCANNED"
+.LASF1501:
+	.string	"per_cpu_nodestats"
+.LASF123:
+	.string	"setlease"
+.LASF2177:
+	.string	"pins"
+.LASF2763:
+	.string	"ro_size"
+.LASF2238:
+	.string	"must_resume"
+.LASF20:
+	.string	"long int"
+.LASF1526:
+	.string	"present_pages"
+.LASF1838:
+	.string	"file_lock_context"
+.LASF579:
+	.string	"usage"
+.LASF1506:
+	.string	"per_cpu_pageset"
+.LASF759:
+	.string	"status"
+.LASF914:
+	.string	"si_signo"
+.LASF929:
+	.string	"uidhash_node"
+.LASF279:
+	.string	"_sdata"
+.LASF2819:
+	.string	"WF_TYPE_GCC16"
+.LASF2483:
+	.string	"i2c_lock_operations"
+.LASF1589:
+	.string	"USRQUOTA"
+.LASF2014:
+	.string	"description"
+.LASF2766:
+	.string	"symtab"
+.LASF2892:
+	.string	"sg_table"
+.LASF1093:
+	.string	"rt_mutex_waiter"
+.LASF3142:
+	.string	"buffer_old_tmp"
+.LASF1934:
+	.string	"remount_fs"
+.LASF488:
+	.string	"s_type"
+.LASF2260:
+	.string	"runtime_status"
+.LASF630:
+	.string	"in_iowait"
+.LASF2555:
+	.string	"unregfunc"
+.LASF2878:
+	.string	"pmic_pm_suspend"
+.LASF1073:
+	.string	"egid"
+.LASF1574:
+	.string	"dq_hash"
+.LASF1441:
+	.string	"NR_SLAB_RECLAIMABLE"
+.LASF1844:
+	.string	"fscrypt_info"
+.LASF1927:
+	.string	"put_super"
+.LASF2965:
+	.string	"curr_lut_type"
+.LASF2398:
+	.string	"max_lock_depth"
+.LASF2420:
+	.string	"fwnode_reference_args"
+.LASF614:
+	.string	"pushable_dl_tasks"
+.LASF1248:
+	.string	"f_flags"
+.LASF2936:
+	.string	"AUTO"
+.LASF1243:
+	.string	"f_inode"
+.LASF2000:
+	.string	"procname"
+.LASF3135:
+	.string	"point_data"
+.LASF3268:
+	.string	"epd_lut_from_file_init"
+.LASF2999:
+	.string	"ebc_auto_assist_thread_sem"
+.LASF1638:
+	.string	"mark_dirty"
+.LASF760:
+	.string	"__early_cpu_boot_status"
+.LASF2315:
+	.string	"acpi_match_table"
+.LASF1713:
+	.string	"init_layout"
+.LASF1498:
+	.string	"_pad1_"
+.LASF2748:
+	.string	"kobj_completion"
+.LASF2838:
+	.string	"win_x1"
+.LASF2840:
+	.string	"win_x2"
+.LASF31:
+	.string	"__kernel_clockid_t"
+.LASF685:
+	.string	"seccomp"
+.LASF3077:
+	.string	"ebc_rst_panel"
+.LASF1760:
+	.string	"releasepage"
+.LASF1671:
+	.string	"qc_info"
+.LASF3078:
+	.string	"ebc_thread"
+.LASF3096:
+	.string	"pbuf_old"
+.LASF2860:
+	.string	"EPD_A2_ENTER"
+.LASF1472:
+	.string	"recent_scanned"
+.LASF2910:
+	.string	"vir_height"
+.LASF3173:
+	.string	"ebc_get_8pix_wf"
+.LASF1712:
+	.string	"core_layout"
+.LASF1500:
+	.string	"_pad2_"
+.LASF968:
+	.string	"cancelled_write_bytes"
+.LASF2839:
+	.string	"win_y1"
+.LASF2841:
+	.string	"win_y2"
+.LASF3100:
+	.string	"buf_size"
+.LASF2057:
+	.string	"bitmap"
+.LASF1555:
+	.string	"mem_section"
+.LASF1142:
+	.string	"memcg"
+.LASF888:
+	.string	"_sigval"
+.LASF2537:
+	.string	"MEMREMAP_ENC"
+.LASF2526:
+	.string	"ksoftirqd"
+.LASF670:
+	.string	"nameidata"
+.LASF1394:
+	.string	"sysctl_protected_regular"
+.LASF2765:
+	.string	"mod_kallsyms"
+.LASF356:
+	.string	"sve_max_vl"
+.LASF2835:
+	.string	"virt_addr"
+.LASF1565:
+	.string	"core_sibling"
+.LASF1032:
+	.string	"depth"
+.LASF1537:
+	.string	"_pad3_"
+.LASF362:
+	.string	"wait_queue_func_t"
+.LASF273:
+	.string	"cpu_hwcap_keys"
+.LASF1346:
+	.string	"MIGRATE_SYNC_LIGHT"
+.LASF1008:
+	.string	"nr_migrations_cold"
+.LASF3056:
+	.string	"ebc_version_read"
+.LASF304:
+	.string	"__end_once"
+.LASF2896:
+	.string	"dma_noncoherent_ops"
+.LASF1474:
+	.string	"lists"
+.LASF53:
+	.string	"dma_addr_t"
+.LASF48:
+	.string	"ssize_t"
+.LASF776:
+	.string	"set_next_event_phys"
+.LASF1476:
+	.string	"inactive_age"
+.LASF2572:
+	.string	"MEMORY_DEVICE_FS_DAX"
+.LASF2954:
+	.string	"frame_bw_total"
+.LASF2764:
+	.string	"ro_after_init_size"
+.LASF2015:
+	.string	"desc_len"
+.LASF120:
+	.string	"flock"
+.LASF960:
+	.string	"task_io_accounting"
+.LASF1267:
+	.string	"mremap"
+.LASF515:
+	.string	"s_writers"
+.LASF2813:
+	.string	"WF_TYPE_GRAY4"
+.LASF2552:
+	.string	"tracepoint_func"
+.LASF2122:
+	.string	"argv"
+.LASF361:
+	.string	"entry"
+.LASF1950:
+	.string	"free_cached_objects"
+.LASF794:
+	.string	"workqueue_struct"
+.LASF689:
+	.string	"pi_lock"
+.LASF2790:
+	.string	"platform_bus"
+.LASF853:
+	.string	"get_time"
+.LASF664:
+	.string	"cputime_expires"
+.LASF730:
+	.string	"dirty_paused_when"
+.LASF2001:
+	.string	"maxlen"
+.LASF1425:
+	.string	"NR_ZONE_UNEVICTABLE"
+.LASF1725:
+	.string	"percpu_size"
+.LASF1292:
+	.string	"mmap_sem"
+.LASF3307:
+	.string	"schedule"
+.LASF3151:
+	.string	"get_overlay_image2"
+.LASF2411:
+	.string	"get_reference_args"
+.LASF2254:
+	.string	"irq_safe"
+.LASF175:
+	.string	"tv_nsec"
+.LASF451:
+	.string	"i_lru"
+.LASF1755:
+	.string	"readpages"
+.LASF257:
+	.string	"arm64_ftr_bits"
+.LASF1540:
+	.string	"zone_idx"
+.LASF1139:
+	.string	"gfp_mask"
+.LASF715:
+	.string	"pi_state_list"
+.LASF1464:
+	.string	"NR_KERNEL_MISC_RECLAIMABLE"
+.LASF1586:
+	.string	"projid_t"
+.LASF1201:
+	.string	"nrexceptional"
+.LASF1086:
+	.string	"user"
+.LASF1749:
+	.string	"WRITE_LIFE_EXTREME"
+.LASF1015:
+	.string	"nr_wakeups_migrate"
+.LASF1614:
+	.string	"dqi_max_ino_limit"
+.LASF1608:
+	.string	"dqi_fmt_id"
+.LASF2365:
+	.string	"dev_pin_info"
+.LASF1343:
+	.string	"fe_reserved"
+.LASF1288:
+	.string	"mm_count"
+.LASF2298:
+	.string	"drv_groups"
+.LASF578:
+	.string	"stack"
+.LASF2386:
+	.string	"dma_coherent_mem"
+.LASF260:
+	.string	"strict"
+.LASF202:
+	.string	"kimage_vaddr"
+.LASF1339:
+	.string	"fe_physical"
+.LASF789:
+	.string	"function"
+.LASF1399:
+	.string	"ki_flags"
+.LASF1360:
+	.string	"gp_type"
+.LASF3113:
+	.string	"ebc_auto_assist_tast_function"
+.LASF2960:
+	.string	"part_mode_count"
+.LASF401:
+	.string	"d_in_lookup_hash"
+.LASF1071:
+	.string	"sgid"
+.LASF2099:
+	.string	"initial_ns"
+.LASF2780:
+	.string	"node_devices"
+.LASF827:
+	.string	"rb_leftmost"
+.LASF205:
+	.string	"thread_info"
+.LASF777:
+	.string	"set_next_event_virt"
+.LASF173:
+	.string	"timespec"
+.LASF2768:
+	.string	"strtab"
+.LASF2299:
+	.string	"match"
+.LASF231:
+	.string	"lock_stat"
+.LASF2363:
+	.string	"revmap_tree_mutex"
+.LASF3060:
+	.string	"pmic_name_read"
+.LASF1050:
+	.string	"dl_throttled"
+.LASF442:
+	.string	"i_rwsem"
+.LASF1641:
+	.string	"get_projid"
+.LASF624:
+	.string	"sched_reset_on_fork"
+.LASF1491:
+	.string	"kswapd_classzone_idx"
+.LASF212:
+	.string	"__int128 unsigned"
+.LASF975:
+	.string	"pcount"
+.LASF2164:
+	.string	"restore_noirq"
+.LASF1396:
+	.string	"ki_filp"
+.LASF1081:
+	.string	"cap_ambient"
+.LASF2306:
+	.string	"dma_configure"
+.LASF2261:
+	.string	"runtime_error"
+.LASF3070:
+	.string	"temp_offset"
+.LASF920:
+	.string	"__count"
+.LASF61:
+	.string	"atomic64_t"
+.LASF946:
+	.string	"anon_vma"
+.LASF2251:
+	.string	"runtime_auto"
+.LASF2320:
+	.string	"PROBE_DEFAULT_STRATEGY"
+.LASF3127:
+	.string	"direct_mode_data_change2"
+.LASF2715:
+	.string	"elemsize"
+.LASF862:
+	.string	"nr_events"
+.LASF2290:
+	.string	"iommu"
+.LASF360:
+	.string	"private"
+.LASF2561:
+	.string	"__tracepoint_page_ref_mod_and_return"
+.LASF2762:
+	.string	"text_size"
+.LASF1622:
+	.string	"stat"
+.LASF2972:
+	.string	"lut_ddr_vir"
+.LASF1290:
+	.string	"map_count"
+.LASF621:
+	.string	"pdeath_signal"
+.LASF620:
+	.string	"exit_signal"
+.LASF3302:
+	.string	"ebc_add_to_osd_buf_list"
+.LASF2825:
+	.string	"frame_num"
+.LASF927:
+	.string	"uid_keyring"
+.LASF725:
+	.string	"splice_pipe"
+.LASF3109:
+	.string	"frame_done_callback"
+.LASF1769:
+	.string	"error_remove_page"
+.LASF2292:
+	.string	"pdev_archdata"
+.LASF1489:
+	.string	"kswapd"
+.LASF111:
+	.string	"open"
+.LASF874:
+	.string	"mode"
+.LASF592:
+	.string	"rt_priority"
+.LASF1161:
+	.string	"slots"
+.LASF499:
+	.string	"s_active"
+.LASF969:
+	.string	"ptr64"
+.LASF1410:
+	.string	"ia_ctime"
+.LASF45:
+	.string	"gid_t"
+.LASF587:
+	.string	"wake_cpu"
+.LASF1181:
+	.string	"chained"
+.LASF1337:
+	.string	"fiemap_extent"
+.LASF683:
+	.string	"task_works"
+.LASF1858:
+	.string	"fl_copy_lock"
+.LASF826:
+	.string	"rb_root_cached"
+.LASF33:
+	.string	"__be32"
+.LASF502:
+	.string	"s_cop"
+.LASF992:
+	.string	"runnable_load_avg"
+.LASF1220:
+	.string	"compound_mapcount"
+.LASF1418:
+	.string	"zone_stat_item"
+.LASF3212:
+	.string	"kmalloc_large"
+.LASF2595:
+	.string	"PE_SIZE_PMD"
+.LASF858:
+	.string	"hres_active"
+.LASF1577:
+	.string	"dq_dirty"
+.LASF1717:
+	.string	"bug_list"
+.LASF2232:
+	.string	"direct_complete"
+.LASF754:
+	.string	"__per_cpu_offset"
+.LASF2053:
+	.string	"idr_rt"
+.LASF2477:
+	.string	"quirks"
+.LASF1164:
+	.string	"xa_lock"
+.LASF1896:
+	.string	"nfs4_fl"
+.LASF1477:
+	.string	"refaults"
+.LASF979:
+	.string	"load_weight"
+.LASF2822:
+	.string	"WF_TYPE_MAX"
+.LASF569:
+	.string	"kuid_t"
+.LASF1005:
+	.string	"block_max"
+.LASF606:
+	.string	"rcu_blocked_node"
+.LASF1356:
+	.string	"gp_count"
+.LASF2020:
+	.string	"key_restriction"
+.LASF3099:
+	.string	"check_part_mode"
+.LASF618:
+	.string	"exit_state"
+.LASF153:
+	.string	"SYSTEM_SCHEDULING"
+.LASF2229:
+	.string	"is_late_suspended"
+.LASF308:
+	.string	"__end_opd"
+.LASF1386:
+	.string	"files_stat"
+.LASF1883:
+	.string	"lm_owner_key"
+.LASF1508:
+	.string	"vm_stat_diff"
+.LASF2815:
+	.string	"WF_TYPE_GL16"
+.LASF2252:
+	.string	"ignore_children"
+.LASF2050:
+	.string	"resource"
+.LASF2158:
+	.string	"restore_early"
+.LASF2063:
+	.string	"next_generation"
+.LASF2560:
+	.string	"__tracepoint_page_ref_mod_and_test"
+.LASF1912:
+	.string	"fs_supers"
+.LASF1100:
+	.string	"last_waited"
+.LASF3065:
+	.string	"ebc_open"
+.LASF3181:
+	.string	"three_win_mode"
+.LASF2845:
+	.string	"EPD_OVERLAY"
+.LASF1598:
+	.string	"dqb_bsoftlimit"
+.LASF219:
+	.string	"pending"
+.LASF2970:
+	.string	"direct_buffer"
+.LASF2461:
+	.string	"i2c_client_type"
+.LASF999:
+	.string	"iowait_count"
+.LASF2523:
+	.string	"RCU_SOFTIRQ"
+.LASF2776:
+	.string	"module_mutex"
+.LASF2619:
+	.string	"PGFAULT"
+.LASF1545:
+	.string	"notifier_block"
+.LASF2265:
+	.string	"suspended_jiffies"
+.LASF2131:
+	.string	"mm_kobj"
+.LASF2713:
+	.string	"string"
+.LASF1362:
+	.string	"read_count"
+.LASF1224:
+	.string	"pt_mm"
+.LASF1473:
+	.string	"lruvec"
+.LASF2874:
+	.string	"ebc_pmic"
+.LASF14:
+	.string	"long long int"
+.LASF314:
+	.string	"__alt_instructions"
+.LASF2355:
+	.string	"irq_domain"
+.LASF635:
+	.string	"atomic_flags"
+.LASF2506:
+	.string	"__softirq_pending"
+.LASF1568:
+	.string	"freq_scale"
+.LASF2241:
+	.string	"timer_expires"
+.LASF2796:
+	.string	"mmlist_lock"
+.LASF3198:
+	.string	"ebc_pmic_power_on"
+.LASF1734:
+	.string	"trace_evals"
+.LASF856:
+	.string	"active_bases"
+.LASF2703:
+	.string	"sh_offset"
+.LASF2231:
+	.string	"early_init"
+.LASF2699:
+	.string	"sh_name"
+.LASF746:
+	.string	"security"
+.LASF3139:
+	.string	"get_overlay_image_area2"
+.LASF263:
+	.string	"safe_val"
+.LASF368:
+	.string	"nr_cpu_ids"
+.LASF1250:
+	.string	"f_pos_lock"
+.LASF180:
+	.string	"system_states"
+.LASF2159:
+	.string	"suspend_noirq"
+.LASF1672:
+	.string	"i_fieldmask"
+.LASF98:
+	.string	"owner"
+.LASF704:
+	.string	"acct_rss_mem1"
+.LASF802:
+	.string	"refcount_struct"
+.LASF1231:
+	.string	"_zd_pad_1"
+.LASF2219:
+	.string	"domain_data"
+.LASF331:
+	.string	"__mmuoff_data_end"
+.LASF2278:
+	.string	"relax_count"
+.LASF1382:
+	.string	"nr_free_files"
+.LASF3211:
+	.string	"kmalloc"
+	.ident	"GCC: (Linaro GCC 6.3-2017.05) 6.3.1 20170404"
+	.section	.note.GNU-stack,"",@progbits
diff --git a/kernel/drivers/gpu/drm/rockchip/ebc-dev/epdlut/epd_lut.c b/kernel/drivers/gpu/drm/rockchip/ebc-dev/epdlut/epd_lut.c
index e094205..a970192 100644
--- a/kernel/drivers/gpu/drm/rockchip/ebc-dev/epdlut/epd_lut.c
+++ b/kernel/drivers/gpu/drm/rockchip/ebc-dev/epdlut/epd_lut.c
@@ -16,7 +16,7 @@
 #include "../ebc_dev.h"
 #include "epd_lut.h"
 
-static int (*lut_get)(struct epd_lut_data *, enum epd_lut_type, int);
+static int (*lut_get)(struct epd_lut_data *, enum epd_lut_type, int, int);
 
 int epd_lut_from_mem_init(void *waveform)
 {
@@ -66,9 +66,9 @@
 	return NULL;
 }
 
-int epd_lut_get(struct epd_lut_data *output, enum epd_lut_type lut_type, int temperture)
+int epd_lut_get(struct epd_lut_data *output, enum epd_lut_type lut_type, int temperture, int pic)
 {
-	return lut_get(output, lut_type, temperture);
+	return lut_get(output, lut_type, temperture, pic);
 }
 
 //you can change overlay lut mode here
diff --git a/kernel/drivers/gpu/drm/rockchip/ebc-dev/epdlut/epd_lut.h b/kernel/drivers/gpu/drm/rockchip/ebc-dev/epdlut/epd_lut.h
index b6c535d..15fe6ea 100644
--- a/kernel/drivers/gpu/drm/rockchip/ebc-dev/epdlut/epd_lut.h
+++ b/kernel/drivers/gpu/drm/rockchip/ebc-dev/epdlut/epd_lut.h
@@ -8,6 +8,9 @@
 #ifndef EPD_LUT_H
 #define EPD_LUT_H
 
+#define WF_4BIT	16
+#define WF_5BIT	32
+
 // same to pvi_wf_mode
 enum epd_lut_type {
 	WF_TYPE_RESET = 0,
@@ -38,7 +41,7 @@
 int epd_lut_from_mem_init(void *waveform);
 int epd_lut_from_file_init(struct device *dev, void *waveform, int size);
 const char *epd_lut_get_wf_version(void);
-int epd_lut_get(struct epd_lut_data *output, enum epd_lut_type lut_type, int temperture);
+int epd_lut_get(struct epd_lut_data *output, enum epd_lut_type lut_type, int temperture, int pic);
 
 //you can change overlay lut mode here
 int epd_overlay_lut(void);
@@ -48,12 +51,12 @@
  */
 int pvi_wf_input(void *waveform_file);
 const char *pvi_wf_get_version(void);
-int pvi_wf_get_lut(struct epd_lut_data *output, enum epd_lut_type lut_type, int temperture);
+int pvi_wf_get_lut(struct epd_lut_data *output, enum epd_lut_type lut_type, int temperture, int pic);
 
 /*
  * RKF Waveform Interfaces
  */
 int rkf_wf_input(void *waveform_file);
 const char *rkf_wf_get_version(void);
-int rkf_wf_get_lut(struct epd_lut_data *output, enum epd_lut_type lut_type, int temperture);
+int rkf_wf_get_lut(struct epd_lut_data *output, enum epd_lut_type lut_type, int temperture, int pic);
 #endif
diff --git a/kernel/drivers/gpu/drm/rockchip/ebc-dev/epdlut/pvi_waveform_v8.S b/kernel/drivers/gpu/drm/rockchip/ebc-dev/epdlut/pvi_waveform_v8.S
index 23d54df..d005a38 100644
--- a/kernel/drivers/gpu/drm/rockchip/ebc-dev/epdlut/pvi_waveform_v8.S
+++ b/kernel/drivers/gpu/drm/rockchip/ebc-dev/epdlut/pvi_waveform_v8.S
@@ -16,224 +16,249 @@
 get_wf_frm_num:
 .LFB1552:
 	.file 1 "drivers/gpu/drm/rockchip/ebc-dev/epdlut/pvi_waveform.c"
-	.loc 1 208 0
+	.loc 1 219 0
 	.cfi_startproc
 .LVL0:
 	stp	x29, x30, [sp, -48]!
 	.cfi_def_cfa_offset 48
 	.cfi_offset 29, -48
 	.cfi_offset 30, -40
-	.loc 1 213 0
+	.loc 1 224 0
 	lsl	w0, w0, 2
 .LVL1:
-	.loc 1 208 0
+	.loc 1 219 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
 	stp	x19, x20, [sp, 16]
 	.cfi_offset 19, -32
 	.cfi_offset 20, -24
-	.loc 1 209 0
+	.loc 1 220 0
 	adrp	x20, .LANCHOR0
-	.loc 1 208 0
+	.loc 1 219 0
 	str	x21, [sp, 32]
 	.cfi_offset 21, -16
-	.loc 1 209 0
-	ldr	x15, [x20, #:lo12:.LANCHOR0]
+	.loc 1 220 0
+	ldr	x17, [x20, #:lo12:.LANCHOR0]
 .LVL2:
-	.loc 1 213 0
-	ldrb	w2, [x15, 32]
+	.loc 1 224 0
+	ldrb	w2, [x17, 32]
 	add	x0, x2, x0, sxtw
-	add	x3, x15, x0
-	.loc 1 214 0
-	ldrb	w2, [x15, x0]
+	add	x3, x17, x0
+	.loc 1 225 0
+	ldrb	w2, [x17, x0]
 	ldrb	w6, [x3, 1]
 	ldrb	w5, [x3, 3]
 	ldrb	w3, [x3, 2]
 	add	w2, w2, w6
 	add	w2, w2, w3
 	cmp	w5, w2, uxtb
-	bne	.L40
-	.loc 1 218 0
-	ldr	w2, [x15, x0]
-	.loc 1 220 0
+	bne	.L48
+	.loc 1 229 0
+	ldr	w2, [x17, x0]
+	.loc 1 231 0
 	lsl	w0, w1, 2
 	and	x1, x2, 16777215
 .LVL3:
 	add	x0, x1, x0, sxtw
-	add	x2, x15, x0
-	.loc 1 221 0
-	ldrb	w1, [x15, x0]
+	add	x2, x17, x0
+	.loc 1 232 0
+	ldrb	w1, [x17, x0]
 	ldrb	w5, [x2, 1]
 	ldrb	w3, [x2, 3]
 	ldrb	w2, [x2, 2]
 	add	w1, w1, w5
 	add	w1, w1, w2
 	cmp	w3, w1, uxtb
-	bne	.L41
+	bne	.L49
 	add	x4, x20, :lo12:.LANCHOR0
-	.loc 1 225 0
-	ldr	w0, [x15, x0]
-	.loc 1 227 0
+	.loc 1 236 0
+	ldr	w0, [x17, x0]
+	.loc 1 238 0
 	and	x0, x0, 16777215
 .LBB8:
 .LBB9:
 	.loc 1 55 0
-	ldr	x3, [x4, 8]
+	ldr	x7, [x4, 8]
 .LBE9:
 .LBE8:
-	.loc 1 227 0
-	add	x15, x15, x0
+	.loc 1 238 0
+	add	x17, x17, x0
 .LVL4:
 .LBB13:
 .LBB10:
 	.loc 1 55 0
-	cbz	x3, .L42
-	.loc 1 117 0
+	cbz	x7, .L50
+	.loc 1 60 0
 	adrp	x21, .LANCHOR2
-	mov	w4, 0
+	mov	w12, 0
+	add	x0, x21, :lo12:.LANCHOR2
+	ldr	w11, [x21, #:lo12:.LANCHOR2]
+	cmp	w11, 16
+	beq	.L51
+.L6:
+	.loc 1 114 0
+	add	w8, w12, 5
+	.loc 1 121 0
+	mov	w9, 0
 	mov	w1, 0
-	mov	w5, 1
+	mov	w6, 1
 .LVL5:
-	ldr	w12, [x21, #:lo12:.LANCHOR2]
-	mov	w14, 0
+	mov	w16, 0
 	mov	w19, 0
 .LVL6:
 	.p2align 2
-.L6:
-	.loc 1 66 0
-	ldrb	w0, [x15, w14, uxtw]
-	cmp	w0, 255
-	beq	.L9
-	.loc 1 71 0
-	cmp	w0, 252
-	beq	.L43
-.L10:
-	.loc 1 78 0
-	lsl	w2, w19, 10
-	.loc 1 76 0
-	cbz	w5, .L11
-	.loc 1 78 0
-	add	w8, w2, w1, lsl 5
-	add	w7, w1, 1
-	add	w2, w2, w4
-	add	w8, w8, w4
-	.loc 1 79 0
-	add	w6, w1, 2
-	add	w7, w2, w7, lsl 5
-	.loc 1 80 0
-	add	w5, w1, 3
-.LVL7:
-	add	w6, w2, w6, lsl 5
-	.loc 1 78 0
-	and	w13, w0, 3
+.L7:
+	.loc 1 69 0
+	ldrb	w10, [x17, w16, uxtw]
+	cmp	w10, 255
+	beq	.L8
+	.loc 1 74 0
+	cmp	w10, 252
+	beq	.L52
+.L9:
 	.loc 1 81 0
-	add	w2, w2, w5, lsl 5
-	.loc 1 78 0
-	strb	w13, [x3, w8, uxtw]
-	.loc 1 79 0
-	ubfx	x9, x0, 2, 2
-	strb	w9, [x3, w7, uxtw]
-	.loc 1 80 0
-	ubfx	x10, x0, 4, 2
-	strb	w10, [x3, w6, uxtw]
-	.loc 1 81 0
-	lsr	w11, w0, 6
-	strb	w11, [x3, w2, uxtw]
-	add	w1, w1, 4
-	.loc 1 82 0
-	add	w0, w14, 1
-	.loc 1 84 0
-	cmp	w1, w12
-	bcc	.L12
-	.loc 1 86 0
-	add	w4, w4, 1
-	.loc 1 85 0
-	mov	w1, 0
-	.loc 1 86 0
-	cmp	w4, w12
-	bcc	.L12
-	.loc 1 88 0
-	add	w19, w19, 1
-	.loc 1 87 0
-	mov	w4, 0
-.L12:
-	.loc 1 92 0
-	ldrb	w2, [x15, w0, uxtw]
-	.loc 1 93 0
-	cbz	w2, .L13
-	.p2align 2
-.L15:
-	.loc 1 94 0
 	lsl	w0, w19, 10
-	add	w7, w1, 1
-	add	w8, w0, w1, lsl 5
-	add	w0, w0, w4
-	add	w8, w8, w4
-	.loc 1 95 0
-	add	w6, w1, 2
-	add	w7, w0, w7, lsl 5
-	.loc 1 96 0
-	add	w5, w1, 3
-	add	w6, w0, w6, lsl 5
-	.loc 1 97 0
-	add	w0, w0, w5, lsl 5
-	.loc 1 94 0
-	strb	w13, [x3, w8, uxtw]
-	.loc 1 97 0
+	lsl	w5, w1, w8
+	add	w2, w5, w0
+	lsl	w5, w9, w12
+	add	w0, w0, w5
+	add	w5, w2, w5
+	add	w4, w1, 1
+	.loc 1 82 0
+	add	w3, w1, 2
+	.loc 1 83 0
+	add	w2, w1, 3
+	.loc 1 81 0
+	and	w13, w10, 3
+	strb	w13, [x7, w5, uxtw]
+	.loc 1 82 0
+	lsl	w4, w4, w8
+	.loc 1 83 0
+	lsl	w3, w3, w8
+	.loc 1 82 0
+	add	w4, w4, w0
+	.loc 1 83 0
+	add	w3, w3, w0
+	.loc 1 84 0
+	lsl	w2, w2, w8
+	add	w0, w2, w0
+	.loc 1 79 0
+	cbz	w6, .L10
+	.loc 1 82 0
+	ubfx	x14, x10, 2, 2
+	strb	w14, [x7, w4, uxtw]
+	.loc 1 83 0
+	ubfx	x15, x10, 4, 2
+	strb	w15, [x7, w3, uxtw]
+	.loc 1 84 0
+	lsr	w10, w10, 6
+	strb	w10, [x7, w0, uxtw]
 	add	w1, w1, 4
-	.loc 1 95 0
-	strb	w9, [x3, w7, uxtw]
-	.loc 1 93 0
-	sub	w2, w2, #1
-	.loc 1 96 0
-	strb	w10, [x3, w6, uxtw]
-	.loc 1 98 0
-	cmp	w1, w12
-	.loc 1 97 0
-	strb	w11, [x3, w0, uxtw]
-	.loc 1 98 0
-	bcc	.L14
-	.loc 1 100 0
-	add	w4, w4, 1
-	.loc 1 99 0
+	.loc 1 85 0
+	add	w0, w16, 1
+	.loc 1 87 0
+	cmp	w1, w11
+	bcc	.L11
+	.loc 1 89 0
+	add	w9, w9, 1
+	.loc 1 88 0
 	mov	w1, 0
-	.loc 1 100 0
-	cmp	w4, w12
-	bcc	.L14
-	.loc 1 102 0
+	.loc 1 89 0
+	cmp	w11, w9
+	bhi	.L11
+	.loc 1 91 0
 	add	w19, w19, 1
-	.loc 1 101 0
-	mov	w4, 0
+	.loc 1 90 0
+	mov	w9, 0
+.L11:
+	.loc 1 95 0
+	ldrb	w6, [x17, w0, uxtw]
+.LVL7:
+	.loc 1 96 0
+	cbz	w6, .L12
+	.p2align 2
 .L14:
-	.loc 1 93 0
-	ands	w2, w2, 255
-	bne	.L15
+	.loc 1 97 0
+	lsl	w0, w19, 10
+	lsl	w5, w1, w8
+	add	w4, w1, 1
+	add	w2, w5, w0
+	.loc 1 98 0
+	add	w3, w1, 2
+	.loc 1 97 0
+	lsl	w5, w9, w12
+	add	w0, w0, w5
+	add	w5, w2, w5
+	.loc 1 98 0
+	lsl	w4, w4, w8
+	.loc 1 99 0
+	add	w2, w1, 3
+	.loc 1 98 0
+	add	w4, w4, w0
+	.loc 1 99 0
+	lsl	w3, w3, w8
+	add	w3, w3, w0
+	.loc 1 97 0
+	strb	w13, [x7, w5, uxtw]
+	.loc 1 100 0
+	lsl	w2, w2, w8
+	add	w0, w2, w0
+	.loc 1 98 0
+	strb	w14, [x7, w4, uxtw]
+	.loc 1 100 0
+	add	w1, w1, 4
+	.loc 1 99 0
+	strb	w15, [x7, w3, uxtw]
+	.loc 1 96 0
+	sub	w6, w6, #1
+	.loc 1 100 0
+	strb	w10, [x7, w0, uxtw]
+	.loc 1 101 0
+	cmp	w11, w1
+	bhi	.L13
+	.loc 1 103 0
+	add	w9, w9, 1
+	.loc 1 102 0
+	mov	w1, 0
+	.loc 1 103 0
+	cmp	w11, w9
+	bhi	.L13
+	.loc 1 105 0
+	add	w19, w19, 1
+	.loc 1 104 0
+	mov	w9, 0
 .L13:
-	.loc 1 107 0
-	add	w14, w14, 2
-	mov	w5, 1
+	.loc 1 96 0
+	ands	w6, w6, 255
+	bne	.L14
+.L12:
+	.loc 1 110 0
+	add	w16, w16, 2
+	mov	w6, 1
 .LVL8:
-.L16:
-	.loc 1 61 0
+.L15:
+	.loc 1 64 0
 	cmp	w19, 254
-	bls	.L6
-	.loc 1 62 0
+	bls	.L7
+	.loc 1 65 0
 	adrp	x0, .LC2
 	add	x0, x0, :lo12:.LC2
 	bl	printk
 .LVL9:
-	.loc 1 127 0
-	ldr	w0, [x21, #:lo12:.LANCHOR2]
-	cmp	w0, 32
-	beq	.L7
-.LVL10:
 .L8:
-	.loc 1 139 0
+	.loc 1 130 0
+	ldr	w0, [x21, #:lo12:.LANCHOR2]
+	add	x21, x21, :lo12:.LANCHOR2
+	cmp	w0, 32
+	beq	.L53
+.LVL10:
+.L16:
+	.loc 1 149 0
 	mov	w0, w19
 .L1:
 .LBE10:
 .LBE13:
-	.loc 1 229 0
+	.loc 1 240 0
 	ldp	x19, x20, [sp, 16]
 .LVL11:
 	ldr	x21, [sp, 32]
@@ -248,144 +273,149 @@
 	ret
 .LVL12:
 	.p2align 3
-.L11:
+.L10:
 	.cfi_restore_state
 .LBB14:
 .LBB11:
-	.loc 1 111 0
-	add	w9, w2, w1, lsl 5
-	add	w8, w1, 1
-	add	w2, w2, w4
-	add	w9, w9, w4
-	.loc 1 112 0
-	add	w7, w1, 2
-	add	w8, w2, w8, lsl 5
-	.loc 1 113 0
-	add	w6, w1, 3
-	add	w7, w2, w7, lsl 5
-	.loc 1 111 0
-	and	w10, w0, 3
-	.loc 1 114 0
-	add	w2, w2, w6, lsl 5
-	.loc 1 111 0
-	strb	w10, [x3, w9, uxtw]
-	.loc 1 112 0
-	ubfx	x6, x0, 2, 2
-	strb	w6, [x3, w8, uxtw]
-	.loc 1 113 0
-	ubfx	x6, x0, 4, 2
-	strb	w6, [x3, w7, uxtw]
-	.loc 1 114 0
-	lsr	w0, w0, 6
-	strb	w0, [x3, w2, uxtw]
-	add	w1, w1, 4
 	.loc 1 115 0
-	add	w14, w14, 1
+	ubfx	x2, x10, 2, 2
+	strb	w2, [x7, w4, uxtw]
+	.loc 1 116 0
+	ubfx	x2, x10, 4, 2
+	strb	w2, [x7, w3, uxtw]
 	.loc 1 117 0
-	cmp	w1, w12
-	bcc	.L16
-	.loc 1 119 0
-	add	w4, w4, 1
+	lsr	w10, w10, 6
+	strb	w10, [x7, w0, uxtw]
+	add	w1, w1, 4
 	.loc 1 118 0
-	mov	w1, 0
-	.loc 1 119 0
-	cmp	w12, w4
-	bhi	.L16
-	.loc 1 121 0
-	add	w19, w19, 1
+	add	w16, w16, 1
 	.loc 1 120 0
-	mov	w4, 0
-	.loc 1 118 0
-	mov	w1, w5
-	b	.L16
-.L43:
-	.loc 1 73 0
-	add	w14, w14, 1
-	.loc 1 72 0
-	eor	w5, w5, 1
-	ldrb	w0, [x15, w14, uxtw]
-	b	.L10
-.L9:
-	.loc 1 127 0
-	ldr	w0, [x21, #:lo12:.LANCHOR2]
+	cmp	w1, w11
+	bcc	.L15
+	.loc 1 122 0
+	add	w9, w9, 1
+	.loc 1 121 0
+	mov	w1, 0
+	.loc 1 122 0
+	cmp	w11, w9
+	bhi	.L15
+	.loc 1 124 0
+	add	w19, w19, 1
+	.loc 1 123 0
+	mov	w9, 0
+	.loc 1 121 0
+	mov	w1, w6
+	b	.L15
+	.p2align 3
+.L52:
+	.loc 1 76 0
+	add	w16, w16, 1
+	.loc 1 75 0
+	eor	w6, w6, 1
+	ldrb	w10, [x17, w16, uxtw]
+	b	.L9
+.L53:
+	.loc 1 130 0
+	ldr	w0, [x21, 4]
+	cmp	w0, 16
+	beq	.L54
+	.loc 1 142 0
 	cmp	w0, 32
-	bne	.L8
-	.loc 1 129 0
-	cbz	w19, .L8
-.L7:
+	bne	.L16
+	.loc 1 144 0
+	cbz	w19, .L16
 	add	x20, x20, :lo12:.LANCHOR0
-	.loc 1 99 0
+	mov	w0, 0
+	ldr	x2, [x20, 8]
+.L24:
+	.loc 1 145 0
+	lsl	w1, w0, 10
+	.loc 1 144 0
+	add	w0, w0, 1
+	.loc 1 145 0
+	add	w1, w1, 960
+	.loc 1 144 0
+	and	w0, w0, 255
+	.loc 1 145 0
+	add	x1, x2, x1, sxtw
+	.loc 1 144 0
+	cmp	w0, w19
+	.loc 1 145 0
+	strb	wzr, [x1, 29]
+	.loc 1 144 0
+	bcc	.L24
+	b	.L16
+.LVL13:
+.L51:
+	.loc 1 60 0
+	ldr	w0, [x0, 4]
+	cmp	w0, 32
+	cset	w12, eq
+	b	.L6
+.LVL14:
+.L54:
+	.loc 1 132 0
+	cbz	w19, .L16
+	add	x20, x20, :lo12:.LANCHOR0
 	mov	w8, 0
 	ldr	x1, [x20, 8]
-.LVL13:
-.L21:
+.LVL15:
+.L23:
 	lsl	w7, w8, 10
 	mov	w6, 0
+.LVL16:
 	mov	w5, w7
-.LVL14:
 	.p2align 2
-.L19:
+.L21:
 	lsr	w4, w6, 1
+	.loc 1 102 0
 	mov	w0, 0
 	add	w4, w7, w4, lsl 5
 	.p2align 2
-.L18:
-	.loc 1 132 0
+.L20:
+	.loc 1 135 0
 	add	w3, w0, w5
-.LVL15:
-	.loc 1 133 0
+.LVL17:
+	.loc 1 136 0
 	add	w2, w4, w0, lsr 1
-	.loc 1 131 0
+	.loc 1 134 0
 	add	w0, w0, 2
 	cmp	w0, 32
-	.loc 1 132 0
+	.loc 1 135 0
 	ldrb	w3, [x1, w3, uxtw]
-.LVL16:
-	.loc 1 133 0
+.LVL18:
+	.loc 1 136 0
 	strb	w3, [x1, w2, uxtw]
-	.loc 1 131 0
-	bne	.L18
-	.loc 1 130 0
+	.loc 1 134 0
+	bne	.L20
+	.loc 1 133 0
 	add	w6, w6, 2
 	add	w5, w5, 64
 	cmp	w6, 32
-	bne	.L19
-	.loc 1 129 0
+	bne	.L21
+	.loc 1 132 0
 	add	w8, w8, 1
 	and	w8, w8, 255
 	cmp	w8, w19
-	bcc	.L21
-	b	.L8
-.LVL17:
-.L40:
+	bcc	.L23
+	b	.L16
+.LVL19:
+.L48:
 .LBE11:
 .LBE14:
-	.loc 1 215 0
+	.loc 1 226 0
 	adrp	x1, .LANCHOR1
-.LVL18:
-	adrp	x0, .LC0
-	mov	w2, 215
-	add	x1, x1, :lo12:.LANCHOR1
-	add	x0, x0, :lo12:.LC0
-	bl	printk
-.LVL19:
-	.loc 1 216 0
-	mov	w0, -22
-	b	.L1
 .LVL20:
-.L41:
-	.loc 1 222 0
-	adrp	x1, .LANCHOR1
 	adrp	x0, .LC0
-	mov	w2, 222
+	mov	w2, 226
 	add	x1, x1, :lo12:.LANCHOR1
 	add	x0, x0, :lo12:.LC0
 	bl	printk
 .LVL21:
-	.loc 1 223 0
+	.loc 1 227 0
 	mov	w0, -22
 	b	.L1
-.L42:
+.L50:
 .LBB15:
 .LBB12:
 	.loc 1 56 0
@@ -396,8 +426,21 @@
 	.loc 1 57 0
 	mov	w0, -22
 	b	.L1
+.LVL23:
+.L49:
 .LBE12:
 .LBE15:
+	.loc 1 233 0
+	adrp	x1, .LANCHOR1
+	adrp	x0, .LC0
+	mov	w2, 233
+	add	x1, x1, :lo12:.LANCHOR1
+	add	x0, x0, :lo12:.LC0
+	bl	printk
+.LVL24:
+	.loc 1 234 0
+	mov	w0, -22
+	b	.L1
 	.cfi_endproc
 .LFE1552:
 	.size	get_wf_frm_num, .-get_wf_frm_num
@@ -406,179 +449,179 @@
 	.type	get_wf_mode_index, %function
 get_wf_mode_index:
 .LFB1550:
-	.loc 1 171 0
+	.loc 1 182 0
 	.cfi_startproc
-.LVL23:
-	.loc 1 175 0
+.LVL25:
+	.loc 1 186 0
 	cmp	w0, 10
-	bhi	.L70
-	.loc 1 183 0
+	bhi	.L81
+	.loc 1 194 0
 	adrp	x1, .LANCHOR0
-	.loc 1 178 0
+	.loc 1 189 0
 	mov	w2, 3
 	csel	w0, w0, w2, ne
-.LVL24:
+.LVL26:
 .LBB18:
 .LBB19:
-	.loc 1 156 0
+	.loc 1 167 0
 	ldr	x1, [x1, #:lo12:.LANCHOR0]
 	ldrb	w1, [x1, 16]
 	cmp	w1, 25
-	beq	.L49
-	bls	.L71
+	beq	.L60
+	bls	.L82
 	cmp	w1, 67
-	beq	.L49
-	bls	.L72
+	beq	.L60
+	bls	.L83
 	cmp	w1, 72
-	beq	.L56
+	beq	.L67
 	cmp	w1, 84
-	bne	.L48
-	.loc 1 163 0
+	bne	.L59
+	.loc 1 174 0
 	adrp	x1, .LANCHOR1
 	add	x1, x1, :lo12:.LANCHOR1
 	add	x1, x1, 76
-.LVL25:
+.LVL27:
 .LBE19:
 .LBE18:
-	.loc 1 185 0
-	ldrb	w0, [x1, x0]
-	ret
-.LVL26:
-	.p2align 3
-.L71:
-.LBB27:
-.LBB20:
-	.loc 1 156 0
-	cmp	w1, 18
-	beq	.L58
-	cmp	w1, 22
-	beq	.L52
-	cmp	w1, 9
-	beq	.L73
-.L48:
-	.loc 1 164 0
-	adrp	x1, .LANCHOR1
-	add	x1, x1, :lo12:.LANCHOR1
-	add	x1, x1, 86
-.LVL27:
-.LBE20:
-.LBE27:
-	.loc 1 185 0
+	.loc 1 196 0
 	ldrb	w0, [x1, x0]
 	ret
 .LVL28:
 	.p2align 3
-.L52:
-.LBB28:
-.LBB21:
-	.loc 1 159 0
+.L82:
+.LBB27:
+.LBB20:
+	.loc 1 167 0
+	cmp	w1, 18
+	beq	.L69
+	cmp	w1, 22
+	beq	.L63
+	cmp	w1, 9
+	beq	.L84
+.L59:
+	.loc 1 175 0
 	adrp	x1, .LANCHOR1
 	add	x1, x1, :lo12:.LANCHOR1
-	add	x1, x1, 36
+	add	x1, x1, 86
 .LVL29:
-.LBE21:
-.LBE28:
-	.loc 1 185 0
+.LBE20:
+.LBE27:
+	.loc 1 196 0
 	ldrb	w0, [x1, x0]
 	ret
 .LVL30:
 	.p2align 3
-.L56:
-.LBB29:
-.LBB22:
-	.loc 1 162 0
+.L63:
+.LBB28:
+.LBB21:
+	.loc 1 170 0
 	adrp	x1, .LANCHOR1
 	add	x1, x1, :lo12:.LANCHOR1
-	add	x1, x1, 66
+	add	x1, x1, 36
 .LVL31:
-.LBE22:
-.LBE29:
-	.loc 1 185 0
+.LBE21:
+.LBE28:
+	.loc 1 196 0
 	ldrb	w0, [x1, x0]
 	ret
 .LVL32:
 	.p2align 3
-.L72:
-.LBB30:
-.LBB23:
-	.loc 1 156 0
-	cmp	w1, 35
-	bne	.L48
-	.loc 1 161 0
+.L67:
+.LBB29:
+.LBB22:
+	.loc 1 173 0
 	adrp	x1, .LANCHOR1
 	add	x1, x1, :lo12:.LANCHOR1
-	add	x1, x1, 56
+	add	x1, x1, 66
 .LVL33:
-.LBE23:
-.LBE30:
-	.loc 1 185 0
+.LBE22:
+.LBE29:
+	.loc 1 196 0
 	ldrb	w0, [x1, x0]
 	ret
 .LVL34:
 	.p2align 3
-.L58:
-.LBB31:
-.LBB24:
-	.loc 1 158 0
+.L83:
+.LBB30:
+.LBB23:
+	.loc 1 167 0
+	cmp	w1, 35
+	bne	.L59
+	.loc 1 172 0
 	adrp	x1, .LANCHOR1
 	add	x1, x1, :lo12:.LANCHOR1
-	add	x1, x1, 26
+	add	x1, x1, 56
 .LVL35:
-.LBE24:
-.LBE31:
-	.loc 1 185 0
+.LBE23:
+.LBE30:
+	.loc 1 196 0
 	ldrb	w0, [x1, x0]
 	ret
 .LVL36:
 	.p2align 3
-.L73:
-.LBB32:
-.LBB25:
-	.loc 1 157 0
+.L69:
+.LBB31:
+.LBB24:
+	.loc 1 169 0
 	adrp	x1, .LANCHOR1
 	add	x1, x1, :lo12:.LANCHOR1
-	add	x1, x1, 16
+	add	x1, x1, 26
 .LVL37:
-.LBE25:
-.LBE32:
-	.loc 1 185 0
+.LBE24:
+.LBE31:
+	.loc 1 196 0
 	ldrb	w0, [x1, x0]
 	ret
 .LVL38:
 	.p2align 3
-.L49:
-.LBB33:
-.LBB26:
-	.loc 1 160 0
+.L84:
+.LBB32:
+.LBB25:
+	.loc 1 168 0
 	adrp	x1, .LANCHOR1
 	add	x1, x1, :lo12:.LANCHOR1
-	add	x1, x1, 46
+	add	x1, x1, 16
 .LVL39:
-.LBE26:
-.LBE33:
-	.loc 1 185 0
+.LBE25:
+.LBE32:
+	.loc 1 196 0
 	ldrb	w0, [x1, x0]
 	ret
 .LVL40:
-.L70:
+	.p2align 3
+.L60:
+.LBB33:
+.LBB26:
 	.loc 1 171 0
+	adrp	x1, .LANCHOR1
+	add	x1, x1, :lo12:.LANCHOR1
+	add	x1, x1, 46
+.LVL41:
+.LBE26:
+.LBE33:
+	.loc 1 196 0
+	ldrb	w0, [x1, x0]
+	ret
+.LVL42:
+.L81:
+	.loc 1 182 0
 	stp	x29, x30, [sp, -16]!
 	.cfi_def_cfa_offset 16
 	.cfi_offset 29, -16
 	.cfi_offset 30, -8
-	.loc 1 176 0
+	.loc 1 187 0
 	adrp	x0, .LC3
-.LVL41:
+.LVL43:
 	add	x0, x0, :lo12:.LC3
-	.loc 1 171 0
+	.loc 1 182 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
-	.loc 1 176 0
+	.loc 1 187 0
 	bl	printk
-.LVL42:
-	.loc 1 177 0
+.LVL44:
+	.loc 1 188 0
 	mov	w0, 255
-	.loc 1 186 0
+	.loc 1 197 0
 	ldp	x29, x30, [sp], 16
 	.cfi_restore 30
 	.cfi_restore 29
@@ -593,9 +636,9 @@
 	.type	pvi_wf_get_lut, %function
 pvi_wf_get_lut:
 .LFB1553:
-	.loc 1 232 0
+	.loc 1 243 0
 	.cfi_startproc
-.LVL43:
+.LVL45:
 	stp	x29, x30, [sp, -80]!
 	.cfi_def_cfa_offset 80
 	.cfi_offset 29, -80
@@ -604,13 +647,13 @@
 	.cfi_def_cfa_register 29
 	str	x25, [sp, 64]
 	.cfi_offset 25, -16
-	.loc 1 240 0
+	.loc 1 251 0
 	adrp	x25, .LANCHOR0
-	.loc 1 232 0
+	.loc 1 243 0
 	stp	x19, x20, [sp, 16]
-	.loc 1 240 0
-	ldr	x3, [x25, #:lo12:.LANCHOR0]
-	.loc 1 232 0
+	.loc 1 251 0
+	ldr	x4, [x25, #:lo12:.LANCHOR0]
+	.loc 1 243 0
 	stp	x21, x22, [sp, 32]
 	stp	x23, x24, [sp, 48]
 	.cfi_offset 19, -64
@@ -619,20 +662,20 @@
 	.cfi_offset 22, -40
 	.cfi_offset 23, -32
 	.cfi_offset 24, -24
-	.loc 1 240 0
-	cbz	x3, .L94
+	.loc 1 251 0
+	cbz	x4, .L105
 	mov	w24, w1
-	.loc 1 248 0
+	.loc 1 259 0
 	adrp	x21, .LANCHOR2
 	add	x1, x21, :lo12:.LANCHOR2
-.LVL44:
+.LVL46:
 	mov	x22, x0
 	mov	w20, w2
 	mov	w2, 21846
-.LVL45:
+.LVL47:
 	movk	w2, 0x5555, lsl 16
-	ldr	w0, [x1, 4]
-.LVL46:
+	ldr	w0, [x1, 8]
+.LVL48:
 	smull	x23, w20, w2
 	smull	x2, w0, w2
 	lsr	x23, x23, 32
@@ -640,196 +683,203 @@
 	lsr	x2, x2, 32
 	sub	w2, w2, w0, asr 31
 	cmp	w23, w2
-	beq	.L104
-	.loc 1 251 0
+	beq	.L115
+	.loc 1 262 0
+	str	w3, [x1, 4]
+	.loc 1 264 0
 	cmp	w24, 10
-	beq	.L91
-.L90:
-	.loc 1 253 0
+	beq	.L102
+.L101:
+	.loc 1 266 0
 	add	x0, x25, :lo12:.LANCHOR0
 .LBB34:
 .LBB35:
-	.loc 1 190 0
-	ldrb	w4, [x3, 38]
-.LVL47:
+	.loc 1 201 0
+	ldrb	w5, [x4, 38]
+.LVL49:
 .LBE35:
 .LBE34:
-	.loc 1 253 0
+	.loc 1 266 0
 	ldr	x1, [x22, 16]
 	str	x1, [x0, 8]
 .LBB38:
 .LBB36:
-	.loc 1 194 0
-	cbz	w4, .L79
-	.loc 1 195 0
-	ldrb	w0, [x3, 48]
+	.loc 1 205 0
+	cbz	w5, .L90
+	.loc 1 206 0
+	ldrb	w0, [x4, 48]
 	cmp	w20, w0
-	ble	.L95
-	add	x2, x3, 49
+	ble	.L106
+	add	x2, x4, 49
 	mov	w19, 0
-.LVL48:
-	b	.L81
+.LVL50:
+	b	.L92
 	.p2align 3
-.L82:
+.L93:
 	ldrb	w3, [x2], 1
+.LVL51:
 	cmp	w20, w3
-	ble	.L92
-.L81:
-	.loc 1 194 0
-	add	w19, w19, 1
-	cmp	w4, w19
-	bne	.L82
-.L79:
-	.loc 1 202 0
-	sub	w19, w4, #1
+	ble	.L103
+.LVL52:
 .L92:
+	.loc 1 205 0
+	add	w19, w19, 1
+	cmp	w5, w19
+	bne	.L93
+.L90:
+	.loc 1 213 0
+	sub	w19, w5, #1
+.L103:
 .LBE36:
 .LBE38:
-	.loc 1 255 0
+	.loc 1 268 0
 	mov	w0, w24
 	bl	get_wf_mode_index
-.LVL49:
-	.loc 1 256 0
+.LVL53:
+	.loc 1 269 0
 	mov	w1, w19
 	and	w0, w0, 255
 	bl	get_wf_frm_num
-.LVL50:
-	.loc 1 257 0
-	tbnz	w0, #31, .L89
-	.loc 1 263 0
+.LVL54:
+	.loc 1 270 0
+	tbnz	w0, #31, .L100
+	.loc 1 276 0
 	add	x3, x21, :lo12:.LANCHOR2
-	.loc 1 261 0
+	.loc 1 274 0
 	ldr	w2, [x22]
-	.loc 1 266 0
+	.loc 1 279 0
 	mov	w1, 21846
 	movk	w1, 0x5555, lsl 16
-	.loc 1 261 0
+	.loc 1 274 0
 	and	w2, w2, 65280
-	.loc 1 263 0
-	str	w24, [x3, 8]
-	.loc 1 262 0
+	.loc 1 276 0
+	str	w24, [x3, 12]
+	.loc 1 275 0
 	orr	w0, w2, w0
-	.loc 1 266 0
-	ldr	w3, [x3, 4]
-	.loc 1 262 0
+	.loc 1 279 0
+	ldr	w3, [x3, 8]
+	.loc 1 275 0
 	str	w0, [x22]
-	.loc 1 266 0
+	.loc 1 279 0
 	smull	x0, w3, w1
 	lsr	x0, x0, 32
 	sub	w0, w0, w3, asr 31
 	cmp	w23, w0
-	beq	.L84
-.L91:
-	.loc 1 268 0
+	beq	.L95
+.LVL55:
+.L102:
+	.loc 1 281 0
 	ldr	x1, [x22, 24]
 	add	x0, x25, :lo12:.LANCHOR0
 	str	x1, [x0, 8]
-	.loc 1 269 0
+	.loc 1 282 0
 	bl	epd_overlay_lut
-.LVL51:
+.LVL56:
 .LBB39:
 .LBB40:
-	.loc 1 190 0
+	.loc 1 201 0
 	ldr	x1, [x25, #:lo12:.LANCHOR0]
 	ldrb	w3, [x1, 38]
-.LVL52:
-	.loc 1 194 0
-	cbz	w3, .L85
-	.loc 1 195 0
+.LVL57:
+	.loc 1 205 0
+	cbz	w3, .L96
+	.loc 1 206 0
 	ldrb	w2, [x1, 48]
 	cmp	w20, w2
-	ble	.L96
+	ble	.L107
 	add	x1, x1, 49
 	mov	w19, 0
-.LVL53:
-	b	.L87
+.LVL58:
+	b	.L98
 	.p2align 3
-.L88:
+.L99:
 	ldrb	w2, [x1], 1
 	cmp	w20, w2
-	ble	.L93
-.L87:
-	.loc 1 194 0
+	ble	.L104
+.L98:
+	.loc 1 205 0
 	add	w19, w19, 1
 	cmp	w3, w19
-	bne	.L88
-.LVL54:
-.L85:
-	.loc 1 202 0
+	bne	.L99
+.LVL59:
+.L96:
+	.loc 1 213 0
 	sub	w19, w3, #1
-.LVL55:
-.L93:
+.LVL60:
+.L104:
 .LBE40:
 .LBE39:
-	.loc 1 271 0
+	.loc 1 284 0
 	bl	get_wf_mode_index
-.LVL56:
-	.loc 1 272 0
+.LVL61:
+	.loc 1 285 0
 	and	w0, w0, 255
 	mov	w1, w19
 	bl	get_wf_frm_num
-.LVL57:
-	mov	w1, w0
-	.loc 1 273 0
-	tbnz	w0, #31, .L89
-	.loc 1 277 0
-	ldrb	w2, [x22]
-	.loc 1 279 0
-	add	x21, x21, :lo12:.LANCHOR2
-	.loc 1 282 0
-	mov	w0, 0
-	.loc 1 278 0
-	orr	w1, w2, w1, lsl 8
-	.loc 1 279 0
-	str	w20, [x21, 4]
-	.loc 1 278 0
-	str	w1, [x22]
-.LVL58:
-.L74:
-	.loc 1 283 0
-	ldp	x19, x20, [sp, 16]
-.LVL59:
-	ldp	x21, x22, [sp, 32]
-.LVL60:
-	ldp	x23, x24, [sp, 48]
-.LVL61:
-	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
 .LVL62:
-	.p2align 3
-.L104:
-	.cfi_restore_state
-	.loc 1 248 0 discriminator 1
-	ldr	w0, [x1, 8]
-	cmp	w0, w24
-	beq	.L84
-	.loc 1 251 0
-	cmp	w24, 10
-	bne	.L90
-.LVL63:
-.L84:
-	.loc 1 249 0
+	mov	w1, w0
+	.loc 1 286 0
+	tbnz	w0, #31, .L100
+	.loc 1 290 0
+	ldrb	w2, [x22]
+	.loc 1 292 0
+	add	x21, x21, :lo12:.LANCHOR2
+	.loc 1 295 0
 	mov	w0, 0
-	.loc 1 283 0
-	ldr	x25, [sp, 64]
+	.loc 1 291 0
+	orr	w1, w2, w1, lsl 8
+	.loc 1 292 0
+	str	w20, [x21, 8]
+	.loc 1 291 0
+	str	w1, [x22]
+.LVL63:
+.L85:
+	.loc 1 296 0
 	ldp	x19, x20, [sp, 16]
 .LVL64:
 	ldp	x21, x22, [sp, 32]
 .LVL65:
 	ldp	x23, x24, [sp, 48]
 .LVL66:
+	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
+.LVL67:
+	.p2align 3
+.L115:
+	.cfi_restore_state
+	.loc 1 259 0 discriminator 1
+	ldr	w0, [x1, 12]
+	cmp	w0, w24
+	beq	.L95
+	.loc 1 262 0
+	str	w3, [x1, 4]
+	.loc 1 264 0
+	cmp	w24, 10
+	bne	.L101
+.LVL68:
+.L95:
+	.loc 1 260 0
+	mov	w0, 0
+	.loc 1 296 0
+	ldr	x25, [sp, 64]
+	ldp	x19, x20, [sp, 16]
+.LVL69:
+	ldp	x21, x22, [sp, 32]
+.LVL70:
+	ldp	x23, x24, [sp, 48]
+.LVL71:
 	ldp	x29, x30, [sp], 80
 	.cfi_remember_state
 	.cfi_restore 20
@@ -843,42 +893,42 @@
 	.cfi_restore 30
 	.cfi_def_cfa 31, 0
 	ret
-.LVL67:
-.L95:
+.LVL72:
+.L106:
 	.cfi_restore_state
 .LBB42:
 .LBB37:
-	.loc 1 194 0
+	.loc 1 205 0
 	mov	w19, 0
-.LVL68:
-	b	.L92
-.LVL69:
-.L96:
+.LVL73:
+	b	.L103
+.LVL74:
+.L107:
 .LBE37:
 .LBE42:
 .LBB43:
 .LBB41:
 	mov	w19, 0
-.LVL70:
-	b	.L93
-.LVL71:
-.L94:
+.LVL75:
+	b	.L104
+.LVL76:
+.L105:
 .LBE41:
 .LBE43:
-	.loc 1 241 0
+	.loc 1 252 0
 	mov	w0, -19
-.LVL72:
-	b	.L74
-.LVL73:
-.L89:
-	.loc 1 258 0
+.LVL77:
+	b	.L85
+.LVL78:
+.L100:
+	.loc 1 271 0
 	adrp	x0, .LC4
 	add	x0, x0, :lo12:.LC4
 	bl	printk
-.LVL74:
-	.loc 1 259 0
+.LVL79:
+	.loc 1 272 0
 	mov	w0, -5
-	b	.L74
+	b	.L85
 	.cfi_endproc
 .LFE1553:
 	.size	pvi_wf_get_lut, .-pvi_wf_get_lut
@@ -888,9 +938,9 @@
 	.type	pvi_wf_input, %function
 pvi_wf_input:
 .LFB1554:
-	.loc 1 292 0
+	.loc 1 305 0
 	.cfi_startproc
-.LVL75:
+.LVL80:
 	stp	x29, x30, [sp, -32]!
 	.cfi_def_cfa_offset 32
 	.cfi_offset 29, -32
@@ -900,17 +950,17 @@
 	stp	x19, x20, [sp, 16]
 	.cfi_offset 19, -16
 	.cfi_offset 20, -8
-	.loc 1 295 0
+	.loc 1 308 0
 	adrp	x19, .LANCHOR0
 	ldr	x1, [x19, #:lo12:.LANCHOR0]
-	cbz	x1, .L138
-	.loc 1 296 0
+	cbz	x1, .L149
+	.loc 1 309 0
 	mov	w0, -16
-.LVL76:
-.L105:
-	.loc 1 323 0
+.LVL81:
+.L116:
+	.loc 1 336 0
 	ldp	x19, x20, [sp, 16]
-.LVL77:
+.LVL82:
 	ldp	x29, x30, [sp], 32
 	.cfi_remember_state
 	.cfi_restore 30
@@ -919,66 +969,66 @@
 	.cfi_restore 20
 	.cfi_def_cfa 31, 0
 	ret
-.LVL78:
-.L138:
+.LVL83:
+.L149:
 	.cfi_restore_state
-	.loc 1 298 0
+	.loc 1 311 0
 	ldrb	w1, [x0, 16]
 	mov	x20, x0
 	adrp	x0, .LC5
-.LVL79:
+.LVL84:
 	add	x0, x0, :lo12:.LC5
 	bl	printk
-.LVL80:
-	.loc 1 301 0
+.LVL85:
+	.loc 1 314 0
 	ldrb	w1, [x20, 16]
 	cmp	w1, 25
-	bls	.L139
+	bls	.L150
 	cmp	w1, 67
-	beq	.L109
-	bhi	.L111
+	beq	.L120
+	bhi	.L122
 	cmp	w1, 32
-	beq	.L109
+	beq	.L120
 	cmp	w1, 35
-	beq	.L110
-.L107:
-	.loc 1 315 0
+	beq	.L121
+.L118:
+	.loc 1 328 0
 	ldrb	w2, [x20, 22]
 	adrp	x0, .LC6
 	add	x0, x0, :lo12:.LC6
 	bl	printk
-.LVL81:
-	.loc 1 317 0
+.LVL86:
+	.loc 1 330 0
 	mov	w0, -8
-	b	.L105
-.L109:
-	.loc 1 308 0
+	b	.L116
+.L120:
+	.loc 1 321 0
 	adrp	x0, .LANCHOR2
 	mov	w1, 32
 	str	w1, [x0, #:lo12:.LANCHOR2]
-.L110:
-	.loc 1 320 0
+.L121:
+	.loc 1 333 0
 	str	x20, [x19, #:lo12:.LANCHOR0]
-	.loc 1 322 0
+	.loc 1 335 0
 	mov	w0, 0
-	b	.L105
-.L139:
-	.loc 1 301 0
+	b	.L116
+.L150:
+	.loc 1 314 0
 	cmp	w1, 24
-	bcs	.L109
+	bcs	.L120
 	cmp	w1, 18
-	beq	.L110
+	beq	.L121
 	cmp	w1, 22
-	beq	.L109
+	beq	.L120
 	cmp	w1, 9
-	bne	.L107
-	b	.L110
-.L111:
+	bne	.L118
+	b	.L121
+.L122:
 	cmp	w1, 72
-	beq	.L109
+	beq	.L120
 	cmp	w1, 84
-	beq	.L110
-	b	.L107
+	beq	.L121
+	b	.L118
 	.cfi_endproc
 .LFE1554:
 	.size	pvi_wf_input, .-pvi_wf_input
@@ -988,38 +1038,38 @@
 	.type	pvi_wf_get_version, %function
 pvi_wf_get_version:
 .LFB1555:
-	.loc 1 332 0
+	.loc 1 345 0
 	.cfi_startproc
-	.loc 1 333 0
+	.loc 1 346 0
 	adrp	x0, .LANCHOR0
 	add	x3, x0, :lo12:.LANCHOR0
 	ldr	x1, [x0, #:lo12:.LANCHOR0]
-.LVL82:
-	.loc 1 336 0
-	cbz	x1, .L142
-	.loc 1 339 0
+.LVL87:
+	.loc 1 349 0
+	cbz	x1, .L153
+	.loc 1 352 0
 	add	x1, x1, 65
-.LVL83:
+.LVL88:
 	add	x2, x3, 16
-	.loc 1 342 0
+	.loc 1 355 0
 	mov	x0, x2
-	.loc 1 339 0
+	.loc 1 352 0
 	ldp	x4, x5, [x1]
 	stp	x4, x5, [x3, 16]
 	ldr	x3, [x1, 16]
 	str	x3, [x2, 16]
 	ldr	x1, [x1, 23]
 	str	x1, [x2, 23]
-	.loc 1 340 0
+	.loc 1 353 0
 	strb	wzr, [x2, 31]
-	.loc 1 342 0
+	.loc 1 355 0
 	ret
-.LVL84:
+.LVL89:
 	.p2align 3
-.L142:
-	.loc 1 337 0
+.L153:
+	.loc 1 350 0
 	mov	x0, 0
-	.loc 1 343 0
+	.loc 1 356 0
 	ret
 	.cfi_endproc
 .LFE1555:
@@ -1028,9 +1078,9 @@
 	.section	.rodata
 	.align	3
 	.set	.LANCHOR1,. + 0
-	.type	__func__.16856, %object
-	.size	__func__.16856, 15
-__func__.16856:
+	.type	__func__.16864, %object
+	.size	__func__.16864, 15
+__func__.16864:
 	.string	"get_wf_frm_num"
 	.zero	1
 	.type	pvi_mode_table, %object
@@ -1123,13 +1173,17 @@
 	.size	maxpic, 4
 maxpic:
 	.word	16
-	.type	sftemp.16863, %object
-	.size	sftemp.16863, 4
-sftemp.16863:
+	.type	need_pic, %object
+	.size	need_pic, 4
+need_pic:
+	.word	16
+	.type	sftemp.16872, %object
+	.size	sftemp.16872, 4
+sftemp.16872:
 	.word	-1
-	.type	stype.16862, %object
-	.size	stype.16862, 4
-stype.16862:
+	.type	stype.16871, %object
+	.size	stype.16871, 4
+stype.16871:
 	.word	11
 	.bss
 	.align	3
@@ -1142,9 +1196,9 @@
 	.size	waveformdata, 8
 waveformdata:
 	.zero	8
-	.type	spi_id_buffer.16888, %object
-	.size	spi_id_buffer.16888, 32
-spi_id_buffer.16888:
+	.type	spi_id_buffer.16897, %object
+	.size	spi_id_buffer.16897, 32
+spi_id_buffer.16897:
 	.zero	32
 	.section	.rodata.str1.8,"aMS",@progbits,1
 	.align	3
@@ -1265,15 +1319,15 @@
 	.file 96 "drivers/gpu/drm/rockchip/ebc-dev/epdlut/epd_lut.h"
 	.section	.debug_info,"",@progbits
 .Ldebug_info0:
-	.4byte	0x66da
+	.4byte	0x670f
 	.2byte	0x4
 	.4byte	.Ldebug_abbrev0
 	.byte	0x8
 	.uleb128 0x1
-	.4byte	.LASF1492
-	.byte	0x1
-	.4byte	.LASF1493
 	.4byte	.LASF1494
+	.byte	0x1
+	.4byte	.LASF1495
+	.4byte	.LASF1496
 	.8byte	.Ltext0
 	.8byte	.Letext0-.Ltext0
 	.4byte	.Ldebug_line0
@@ -9743,7 +9797,7 @@
 	.2byte	0x510
 	.4byte	0x4615
 	.uleb128 0x40
-	.4byte	.LASF1495
+	.4byte	.LASF1497
 	.byte	0x21
 	.2byte	0x510
 	.4byte	0x6c
@@ -12892,7 +12946,7 @@
 	.byte	0x4
 	.4byte	0x6c
 	.byte	0x60
-	.byte	0xc
+	.byte	0xf
 	.4byte	0x602c
 	.uleb128 0xc
 	.4byte	.LASF1419
@@ -12938,24 +12992,24 @@
 	.4byte	.LASF1432
 	.byte	0x20
 	.byte	0x60
-	.byte	0x1d
+	.byte	0x20
 	.4byte	0x605d
 	.uleb128 0xe
 	.4byte	.LASF1433
 	.byte	0x60
-	.byte	0x1e
+	.byte	0x21
 	.4byte	0x6c
 	.byte	0
 	.uleb128 0xe
 	.4byte	.LASF741
 	.byte	0x60
-	.byte	0x1f
+	.byte	0x22
 	.4byte	0x2d7f
 	.byte	0x8
 	.uleb128 0xe
 	.4byte	.LASF1434
 	.byte	0x60
-	.byte	0x20
+	.byte	0x23
 	.4byte	0x605d
 	.byte	0x10
 	.byte	0
@@ -13138,7 +13192,7 @@
 	.uleb128 0x45
 	.4byte	.LASF1458
 	.byte	0x1
-	.byte	0x2a
+	.byte	0x28
 	.4byte	0x606d
 	.uleb128 0x9
 	.byte	0x3
@@ -13146,7 +13200,7 @@
 	.uleb128 0x45
 	.4byte	.LASF1459
 	.byte	0x1
-	.byte	0x2b
+	.byte	0x29
 	.4byte	0xbb
 	.uleb128 0x9
 	.byte	0x3
@@ -13154,7 +13208,7 @@
 	.uleb128 0x45
 	.4byte	.LASF1460
 	.byte	0x1
-	.byte	0x2c
+	.byte	0x2a
 	.4byte	0x6203
 	.uleb128 0x9
 	.byte	0x3
@@ -13162,9 +13216,17 @@
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0x6073
+	.uleb128 0x45
+	.4byte	.LASF1461
+	.byte	0x1
+	.byte	0x2b
+	.4byte	0xbb
+	.uleb128 0x9
+	.byte	0x3
+	.8byte	need_pic
 	.uleb128 0x5
 	.4byte	0x105
-	.4byte	0x621f
+	.4byte	0x6234
 	.uleb128 0x6
 	.4byte	0x4e
 	.byte	0x7
@@ -13173,461 +13235,474 @@
 	.byte	0x9
 	.byte	0
 	.uleb128 0x3
-	.4byte	0x6209
+	.4byte	0x621e
 	.uleb128 0x46
-	.4byte	.LASF1461
+	.4byte	.LASF1462
 	.byte	0x1
-	.byte	0x8e
-	.4byte	0x621f
+	.byte	0x99
+	.4byte	0x6234
 	.uleb128 0x9
 	.byte	0x3
 	.8byte	pvi_mode_table
 	.uleb128 0x47
-	.4byte	.LASF1464
+	.4byte	.LASF1465
 	.byte	0x1
-	.2byte	0x14b
+	.2byte	0x158
 	.4byte	0x55
 	.8byte	.LFB1555
 	.8byte	.LFE1555-.LFB1555
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x6282
+	.4byte	0x6297
 	.uleb128 0x48
-	.4byte	.LASF1462
-	.byte	0x1
-	.2byte	0x14d
-	.4byte	0x55
-	.4byte	.LLST16
-	.uleb128 0x49
 	.4byte	.LASF1463
 	.byte	0x1
-	.2byte	0x14e
-	.4byte	0x6282
+	.2byte	0x15a
+	.4byte	0x55
+	.4byte	.LLST17
+	.uleb128 0x49
+	.4byte	.LASF1464
+	.byte	0x1
+	.2byte	0x15b
+	.4byte	0x6297
 	.uleb128 0x9
 	.byte	0x3
-	.8byte	spi_id_buffer.16888
+	.8byte	spi_id_buffer.16897
 	.byte	0
 	.uleb128 0x5
 	.4byte	0x60
-	.4byte	0x6292
+	.4byte	0x62a7
 	.uleb128 0x6
 	.4byte	0x4e
 	.byte	0x1f
 	.byte	0
 	.uleb128 0x47
-	.4byte	.LASF1465
+	.4byte	.LASF1466
 	.byte	0x1
-	.2byte	0x123
+	.2byte	0x130
 	.4byte	0xbb
 	.8byte	.LFB1554
 	.8byte	.LFE1554-.LFB1554
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x62eb
+	.4byte	0x6300
 	.uleb128 0x4a
-	.4byte	.LASF1467
+	.4byte	.LASF1468
 	.byte	0x1
-	.2byte	0x123
+	.2byte	0x130
 	.4byte	0x45b
-	.4byte	.LLST15
+	.4byte	.LLST16
 	.uleb128 0x4b
-	.4byte	.LASF1472
+	.4byte	.LASF1473
 	.byte	0x1
-	.2byte	0x125
+	.2byte	0x132
 	.4byte	0x6203
 	.uleb128 0x4c
-	.8byte	.LVL80
-	.4byte	0x66c7
+	.8byte	.LVL85
+	.4byte	0x66fc
 	.uleb128 0x4c
-	.8byte	.LVL81
-	.4byte	0x66c7
+	.8byte	.LVL86
+	.4byte	0x66fc
 	.byte	0
 	.uleb128 0x4d
-	.4byte	.LASF1466
+	.4byte	.LASF1467
 	.byte	0x1
-	.byte	0xe7
+	.byte	0xf2
 	.4byte	0xbb
 	.8byte	.LFB1553
 	.8byte	.LFE1553-.LFB1553
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x6459
-	.uleb128 0x4e
-	.4byte	.LASF1468
-	.byte	0x1
-	.byte	0xe7
-	.4byte	0x6459
-	.4byte	.LLST8
+	.4byte	0x647e
 	.uleb128 0x4e
 	.4byte	.LASF1469
 	.byte	0x1
-	.byte	0xe7
+	.byte	0xf2
+	.4byte	0x647e
+	.4byte	.LLST8
+	.uleb128 0x4e
+	.4byte	.LASF1470
+	.byte	0x1
+	.byte	0xf2
 	.4byte	0x5fcd
 	.4byte	.LLST9
 	.uleb128 0x4e
 	.4byte	.LASF1457
 	.byte	0x1
-	.byte	0xe7
+	.byte	0xf2
 	.4byte	0xbb
 	.4byte	.LLST10
-	.uleb128 0x45
-	.4byte	.LASF1470
+	.uleb128 0x4f
+	.string	"pic"
 	.byte	0x1
-	.byte	0xe9
-	.4byte	0x5fcd
-	.uleb128 0x9
-	.byte	0x3
-	.8byte	stype.16862
+	.byte	0xf2
+	.4byte	0xbb
+	.4byte	.LLST11
 	.uleb128 0x45
 	.4byte	.LASF1471
 	.byte	0x1
-	.byte	0xea
+	.byte	0xf4
+	.4byte	0x5fcd
+	.uleb128 0x9
+	.byte	0x3
+	.8byte	stype.16871
+	.uleb128 0x45
+	.4byte	.LASF1472
+	.byte	0x1
+	.byte	0xf5
 	.4byte	0xbb
 	.uleb128 0x9
 	.byte	0x3
-	.8byte	sftemp.16863
-	.uleb128 0x4f
-	.4byte	.LASF1473
-	.byte	0x1
-	.byte	0xeb
-	.4byte	0xbb
-	.uleb128 0x4f
+	.8byte	sftemp.16872
+	.uleb128 0x50
 	.4byte	.LASF1474
 	.byte	0x1
-	.byte	0xec
+	.byte	0xf6
 	.4byte	0xbb
-	.uleb128 0x4f
-	.4byte	.LASF1433
-	.byte	0x1
-	.byte	0xed
-	.4byte	0xbb
-	.uleb128 0x45
+	.uleb128 0x50
 	.4byte	.LASF1475
 	.byte	0x1
-	.byte	0xee
+	.byte	0xf7
+	.4byte	0xbb
+	.uleb128 0x50
+	.4byte	.LASF1433
+	.byte	0x1
+	.byte	0xf8
+	.4byte	0xbb
+	.uleb128 0x45
+	.4byte	.LASF1476
+	.byte	0x1
+	.byte	0xf9
 	.4byte	0x5fcd
 	.uleb128 0x1
 	.byte	0x50
-	.uleb128 0x50
-	.4byte	0x6578
+	.uleb128 0x51
+	.4byte	0x65a2
 	.8byte	.LBB34
 	.4byte	.Ldebug_ranges0+0xe0
 	.byte	0x1
-	.byte	0xfe
-	.4byte	0x63cd
-	.uleb128 0x51
-	.4byte	0x6588
+	.2byte	0x10b
+	.4byte	0x63f2
 	.uleb128 0x52
+	.4byte	0x65b2
+	.uleb128 0x53
 	.4byte	.Ldebug_ranges0+0xe0
-	.uleb128 0x53
-	.4byte	0x6593
-	.4byte	.LLST11
-	.uleb128 0x53
-	.4byte	0x659e
+	.uleb128 0x54
+	.4byte	0x65bd
 	.4byte	.LLST12
 	.uleb128 0x54
-	.4byte	0x65a9
+	.4byte	0x65c8
+	.4byte	.LLST13
+	.uleb128 0x55
+	.4byte	0x65d3
 	.uleb128 0x1
 	.byte	0x63
 	.byte	0
 	.byte	0
-	.uleb128 0x55
-	.4byte	0x6578
+	.uleb128 0x51
+	.4byte	0x65a2
 	.8byte	.LBB39
 	.4byte	.Ldebug_ranges0+0x120
 	.byte	0x1
-	.2byte	0x10e
-	.4byte	0x640a
-	.uleb128 0x51
-	.4byte	0x6588
+	.2byte	0x11b
+	.4byte	0x642f
 	.uleb128 0x52
+	.4byte	0x65b2
+	.uleb128 0x53
 	.4byte	.Ldebug_ranges0+0x120
-	.uleb128 0x53
-	.4byte	0x6593
-	.4byte	.LLST13
-	.uleb128 0x53
-	.4byte	0x659e
+	.uleb128 0x54
+	.4byte	0x65bd
 	.4byte	.LLST14
 	.uleb128 0x54
-	.4byte	0x65a9
+	.4byte	0x65c8
+	.4byte	.LLST15
+	.uleb128 0x55
+	.4byte	0x65d3
 	.uleb128 0x1
 	.byte	0x63
 	.byte	0
 	.byte	0
 	.uleb128 0x4c
-	.8byte	.LVL49
-	.4byte	0x65b3
+	.8byte	.LVL53
+	.4byte	0x65dd
 	.uleb128 0x4c
-	.8byte	.LVL50
-	.4byte	0x645f
-	.uleb128 0x4c
-	.8byte	.LVL51
-	.4byte	0x66d2
+	.8byte	.LVL54
+	.4byte	0x6484
 	.uleb128 0x4c
 	.8byte	.LVL56
-	.4byte	0x65b3
+	.4byte	0x6707
 	.uleb128 0x4c
-	.8byte	.LVL57
-	.4byte	0x645f
+	.8byte	.LVL61
+	.4byte	0x65dd
 	.uleb128 0x4c
-	.8byte	.LVL74
-	.4byte	0x66c7
+	.8byte	.LVL62
+	.4byte	0x6484
+	.uleb128 0x4c
+	.8byte	.LVL79
+	.4byte	0x66fc
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0x602c
 	.uleb128 0x56
-	.4byte	.LASF1479
+	.4byte	.LASF1480
 	.byte	0x1
-	.byte	0xcf
+	.byte	0xda
 	.4byte	0xbb
 	.8byte	.LFB1552
 	.8byte	.LFE1552-.LFB1552
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x655d
+	.4byte	0x6587
 	.uleb128 0x4e
 	.4byte	.LASF824
 	.byte	0x1
-	.byte	0xcf
+	.byte	0xda
 	.4byte	0xbb
 	.4byte	.LLST0
 	.uleb128 0x4e
-	.4byte	.LASF1473
+	.4byte	.LASF1474
 	.byte	0x1
-	.byte	0xcf
+	.byte	0xda
 	.4byte	0xbb
 	.4byte	.LLST1
 	.uleb128 0x57
-	.4byte	.LASF1462
+	.4byte	.LASF1463
 	.byte	0x1
-	.byte	0xd1
-	.4byte	0x655d
+	.byte	0xdc
+	.4byte	0x6587
 	.4byte	.LLST2
-	.uleb128 0x4f
-	.4byte	.LASF1476
+	.uleb128 0x50
+	.4byte	.LASF1477
 	.byte	0x1
-	.byte	0xd2
-	.4byte	0x655d
-	.uleb128 0x4f
+	.byte	0xdd
+	.4byte	0x6587
+	.uleb128 0x50
 	.4byte	.LASF503
 	.byte	0x1
-	.byte	0xd3
+	.byte	0xde
 	.4byte	0xbb
 	.uleb128 0x58
-	.4byte	.LASF1477
-	.4byte	0x6573
+	.4byte	.LASF1478
+	.4byte	0x659d
 	.uleb128 0x9
 	.byte	0x3
-	.8byte	__func__.16856
-	.uleb128 0x50
-	.4byte	0x6660
+	.8byte	__func__.16864
+	.uleb128 0x59
+	.4byte	0x668a
 	.8byte	.LBB8
 	.4byte	.Ldebug_ranges0+0
 	.byte	0x1
-	.byte	0xe4
-	.4byte	0x6542
-	.uleb128 0x51
-	.4byte	0x6670
+	.byte	0xef
+	.4byte	0x656c
 	.uleb128 0x52
+	.4byte	0x669a
+	.uleb128 0x53
 	.4byte	.Ldebug_ranges0+0
-	.uleb128 0x59
-	.4byte	0x667b
-	.uleb128 0x59
-	.4byte	0x6686
-	.uleb128 0x53
-	.4byte	0x6691
-	.4byte	.LLST3
-	.uleb128 0x59
-	.4byte	0x669c
-	.uleb128 0x53
-	.4byte	0x66a7
-	.4byte	.LLST4
-	.uleb128 0x59
-	.4byte	0x66b2
-	.uleb128 0x53
+	.uleb128 0x5a
+	.4byte	0x66a5
+	.uleb128 0x5a
+	.4byte	0x66b0
+	.uleb128 0x54
 	.4byte	0x66bb
+	.4byte	.LLST3
+	.uleb128 0x5a
+	.4byte	0x66c6
+	.uleb128 0x54
+	.4byte	0x66d1
+	.4byte	.LLST4
+	.uleb128 0x5a
+	.4byte	0x66dc
+	.uleb128 0x54
+	.4byte	0x66e5
 	.4byte	.LLST5
+	.uleb128 0x5a
+	.4byte	0x66f0
 	.uleb128 0x4c
 	.8byte	.LVL9
-	.4byte	0x66c7
+	.4byte	0x66fc
 	.uleb128 0x4c
 	.8byte	.LVL22
-	.4byte	0x66c7
+	.4byte	0x66fc
 	.byte	0
 	.byte	0
-	.uleb128 0x4c
-	.8byte	.LVL19
-	.4byte	0x66c7
 	.uleb128 0x4c
 	.8byte	.LVL21
-	.4byte	0x66c7
+	.4byte	0x66fc
+	.uleb128 0x4c
+	.8byte	.LVL24
+	.4byte	0x66fc
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0x90
 	.uleb128 0x5
 	.4byte	0x67
-	.4byte	0x6573
+	.4byte	0x659d
 	.uleb128 0x6
 	.4byte	0x4e
 	.byte	0xe
 	.byte	0
 	.uleb128 0x3
-	.4byte	0x6563
-	.uleb128 0x5a
-	.4byte	.LASF1482
+	.4byte	0x658d
+	.uleb128 0x5b
+	.4byte	.LASF1483
 	.byte	0x1
-	.byte	0xbc
+	.byte	0xc7
 	.4byte	0xbb
 	.byte	0x1
-	.4byte	0x65b3
-	.uleb128 0x5b
+	.4byte	0x65dd
+	.uleb128 0x5c
 	.4byte	.LASF1457
 	.byte	0x1
-	.byte	0xbc
+	.byte	0xc7
 	.4byte	0xbb
-	.uleb128 0x4f
-	.4byte	.LASF1478
+	.uleb128 0x50
+	.4byte	.LASF1479
 	.byte	0x1
-	.byte	0xbe
+	.byte	0xc9
 	.4byte	0xbb
-	.uleb128 0x4f
+	.uleb128 0x50
 	.4byte	.LASF886
 	.byte	0x1
-	.byte	0xbf
+	.byte	0xca
 	.4byte	0xbb
-	.uleb128 0x5c
+	.uleb128 0x5d
 	.string	"i"
 	.byte	0x1
-	.byte	0xc0
+	.byte	0xcb
 	.4byte	0xbb
 	.byte	0
 	.uleb128 0x56
-	.4byte	.LASF1480
+	.4byte	.LASF1481
 	.byte	0x1
-	.byte	0xaa
+	.byte	0xb5
 	.4byte	0xfb
 	.8byte	.LFB1550
 	.8byte	.LFE1550-.LFB1550
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x6633
+	.4byte	0x665d
 	.uleb128 0x4e
-	.4byte	.LASF1469
+	.4byte	.LASF1470
 	.byte	0x1
-	.byte	0xaa
+	.byte	0xb5
 	.4byte	0x5fcd
 	.4byte	.LLST6
-	.uleb128 0x4f
-	.4byte	.LASF1481
+	.uleb128 0x50
+	.4byte	.LASF1482
 	.byte	0x1
-	.byte	0xac
-	.4byte	0x6633
-	.uleb128 0x4f
+	.byte	0xb7
+	.4byte	0x665d
+	.uleb128 0x50
 	.4byte	.LASF824
 	.byte	0x1
-	.byte	0xad
+	.byte	0xb8
 	.4byte	0xbb
-	.uleb128 0x50
-	.4byte	0x6639
+	.uleb128 0x59
+	.4byte	0x6663
 	.8byte	.LBB18
 	.4byte	.Ldebug_ranges0+0x50
 	.byte	0x1
-	.byte	0xb7
-	.4byte	0x6625
-	.uleb128 0x51
-	.4byte	0x6649
+	.byte	0xc2
+	.4byte	0x664f
 	.uleb128 0x52
-	.4byte	.Ldebug_ranges0+0x50
+	.4byte	0x6673
 	.uleb128 0x53
-	.4byte	0x6654
+	.4byte	.Ldebug_ranges0+0x50
+	.uleb128 0x54
+	.4byte	0x667e
 	.4byte	.LLST7
 	.byte	0
 	.byte	0
 	.uleb128 0x4c
-	.8byte	.LVL42
-	.4byte	0x66c7
+	.8byte	.LVL44
+	.4byte	0x66fc
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0x105
-	.uleb128 0x5a
-	.4byte	.LASF1483
-	.byte	0x1
-	.byte	0x99
-	.4byte	0x6633
-	.byte	0x1
-	.4byte	0x6660
 	.uleb128 0x5b
-	.4byte	.LASF1462
-	.byte	0x1
-	.byte	0x99
-	.4byte	0x6203
-	.uleb128 0x4f
-	.4byte	.LASF1481
-	.byte	0x1
-	.byte	0x9b
-	.4byte	0x6633
-	.byte	0
-	.uleb128 0x5a
 	.4byte	.LASF1484
 	.byte	0x1
-	.byte	0x2e
-	.4byte	0xbb
+	.byte	0xa4
+	.4byte	0x665d
 	.byte	0x1
-	.4byte	0x66c7
+	.4byte	0x668a
+	.uleb128 0x5c
+	.4byte	.LASF1463
+	.byte	0x1
+	.byte	0xa4
+	.4byte	0x6203
+	.uleb128 0x50
+	.4byte	.LASF1482
+	.byte	0x1
+	.byte	0xa6
+	.4byte	0x665d
+	.byte	0
 	.uleb128 0x5b
-	.4byte	.LASF741
-	.byte	0x1
-	.byte	0x2e
-	.4byte	0x655d
-	.uleb128 0x4f
 	.4byte	.LASF1485
 	.byte	0x1
-	.byte	0x30
-	.4byte	0x6c
-	.uleb128 0x4f
+	.byte	0x2d
+	.4byte	0xbb
+	.byte	0x1
+	.4byte	0x66fc
+	.uleb128 0x5c
+	.4byte	.LASF741
+	.byte	0x1
+	.byte	0x2d
+	.4byte	0x6587
+	.uleb128 0x50
 	.4byte	.LASF1486
+	.byte	0x1
+	.byte	0x2f
+	.4byte	0x6c
+	.uleb128 0x50
+	.4byte	.LASF1487
+	.byte	0x1
+	.byte	0x2f
+	.4byte	0x6c
+	.uleb128 0x50
+	.4byte	.LASF1488
 	.byte	0x1
 	.byte	0x30
 	.4byte	0x6c
-	.uleb128 0x4f
-	.4byte	.LASF1487
+	.uleb128 0x50
+	.4byte	.LASF503
 	.byte	0x1
 	.byte	0x31
 	.4byte	0x6c
-	.uleb128 0x4f
-	.4byte	.LASF503
+	.uleb128 0x50
+	.4byte	.LASF1489
 	.byte	0x1
 	.byte	0x32
-	.4byte	0x6c
-	.uleb128 0x4f
-	.4byte	.LASF1488
+	.4byte	0x90
+	.uleb128 0x5d
+	.string	"i"
 	.byte	0x1
 	.byte	0x33
 	.4byte	0x90
-	.uleb128 0x5c
-	.string	"i"
+	.uleb128 0x50
+	.4byte	.LASF1490
 	.byte	0x1
 	.byte	0x34
-	.4byte	0x90
-	.uleb128 0x4f
-	.4byte	.LASF1489
+	.4byte	0x247
+	.uleb128 0x50
+	.4byte	.LASF1491
 	.byte	0x1
 	.byte	0x35
-	.4byte	0x247
+	.4byte	0xbb
 	.byte	0
-	.uleb128 0x5d
-	.4byte	.LASF1490
-	.4byte	.LASF1490
+	.uleb128 0x5e
+	.4byte	.LASF1492
+	.4byte	.LASF1492
 	.byte	0xd
 	.byte	0xb0
-	.uleb128 0x5d
-	.4byte	.LASF1491
-	.4byte	.LASF1491
+	.uleb128 0x5e
+	.4byte	.LASF1493
+	.4byte	.LASF1493
 	.byte	0x60
-	.byte	0x2c
+	.byte	0x2f
 	.byte	0
 	.section	.debug_abbrev,"",@progbits
 .Ldebug_abbrev0:
@@ -14656,6 +14731,21 @@
 	.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
@@ -14668,7 +14758,7 @@
 	.uleb128 0x13
 	.byte	0
 	.byte	0
-	.uleb128 0x50
+	.uleb128 0x51
 	.uleb128 0x1d
 	.byte	0x1
 	.uleb128 0x31
@@ -14680,31 +14770,22 @@
 	.uleb128 0x58
 	.uleb128 0xb
 	.uleb128 0x59
-	.uleb128 0xb
+	.uleb128 0x5
 	.uleb128 0x1
 	.uleb128 0x13
 	.byte	0
 	.byte	0
-	.uleb128 0x51
+	.uleb128 0x52
 	.uleb128 0x5
 	.byte	0
 	.uleb128 0x31
 	.uleb128 0x13
 	.byte	0
 	.byte	0
-	.uleb128 0x52
+	.uleb128 0x53
 	.uleb128 0xb
 	.byte	0x1
 	.uleb128 0x55
-	.uleb128 0x17
-	.byte	0
-	.byte	0
-	.uleb128 0x53
-	.uleb128 0x34
-	.byte	0
-	.uleb128 0x31
-	.uleb128 0x13
-	.uleb128 0x2
 	.uleb128 0x17
 	.byte	0
 	.byte	0
@@ -14714,24 +14795,16 @@
 	.uleb128 0x31
 	.uleb128 0x13
 	.uleb128 0x2
-	.uleb128 0x18
+	.uleb128 0x17
 	.byte	0
 	.byte	0
 	.uleb128 0x55
-	.uleb128 0x1d
-	.byte	0x1
+	.uleb128 0x34
+	.byte	0
 	.uleb128 0x31
 	.uleb128 0x13
-	.uleb128 0x52
-	.uleb128 0x1
-	.uleb128 0x55
-	.uleb128 0x17
-	.uleb128 0x58
-	.uleb128 0xb
-	.uleb128 0x59
-	.uleb128 0x5
-	.uleb128 0x1
-	.uleb128 0x13
+	.uleb128 0x2
+	.uleb128 0x18
 	.byte	0
 	.byte	0
 	.uleb128 0x56
@@ -14788,13 +14861,30 @@
 	.byte	0
 	.byte	0
 	.uleb128 0x59
+	.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 0x5a
 	.uleb128 0x34
 	.byte	0
 	.uleb128 0x31
 	.uleb128 0x13
 	.byte	0
 	.byte	0
-	.uleb128 0x5a
+	.uleb128 0x5b
 	.uleb128 0x2e
 	.byte	0x1
 	.uleb128 0x3
@@ -14813,7 +14903,7 @@
 	.uleb128 0x13
 	.byte	0
 	.byte	0
-	.uleb128 0x5b
+	.uleb128 0x5c
 	.uleb128 0x5
 	.byte	0
 	.uleb128 0x3
@@ -14826,7 +14916,7 @@
 	.uleb128 0x13
 	.byte	0
 	.byte	0
-	.uleb128 0x5c
+	.uleb128 0x5d
 	.uleb128 0x34
 	.byte	0
 	.uleb128 0x3
@@ -14839,7 +14929,7 @@
 	.uleb128 0x13
 	.byte	0
 	.byte	0
-	.uleb128 0x5d
+	.uleb128 0x5e
 	.uleb128 0x2e
 	.byte	0
 	.uleb128 0x3f
@@ -14859,147 +14949,166 @@
 	.byte	0
 	.section	.debug_loc,"",@progbits
 .Ldebug_loc0:
-.LLST16:
-	.8byte	.LVL82-.Ltext0
-	.8byte	.LVL83-.Ltext0
+.LLST17:
+	.8byte	.LVL87-.Ltext0
+	.8byte	.LVL88-.Ltext0
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL84-.Ltext0
+	.8byte	.LVL89-.Ltext0
 	.8byte	.LFE1555-.Ltext0
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
 	.8byte	0
-.LLST15:
-	.8byte	.LVL75-.Ltext0
-	.8byte	.LVL76-.Ltext0
+.LLST16:
+	.8byte	.LVL80-.Ltext0
+	.8byte	.LVL81-.Ltext0
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL76-.Ltext0
-	.8byte	.LVL77-.Ltext0
+	.8byte	.LVL81-.Ltext0
+	.8byte	.LVL82-.Ltext0
 	.2byte	0x1
 	.byte	0x64
-	.8byte	.LVL78-.Ltext0
-	.8byte	.LVL79-.Ltext0
+	.8byte	.LVL83-.Ltext0
+	.8byte	.LVL84-.Ltext0
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL79-.Ltext0
+	.8byte	.LVL84-.Ltext0
 	.8byte	.LFE1554-.Ltext0
 	.2byte	0x1
 	.byte	0x64
 	.8byte	0
 	.8byte	0
 .LLST8:
-	.8byte	.LVL43-.Ltext0
-	.8byte	.LVL46-.Ltext0
+	.8byte	.LVL45-.Ltext0
+	.8byte	.LVL48-.Ltext0
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL46-.Ltext0
-	.8byte	.LVL60-.Ltext0
-	.2byte	0x1
-	.byte	0x66
-	.8byte	.LVL62-.Ltext0
+	.8byte	.LVL48-.Ltext0
 	.8byte	.LVL65-.Ltext0
 	.2byte	0x1
 	.byte	0x66
 	.8byte	.LVL67-.Ltext0
-	.8byte	.LVL71-.Ltext0
+	.8byte	.LVL70-.Ltext0
 	.2byte	0x1
 	.byte	0x66
-	.8byte	.LVL71-.Ltext0
 	.8byte	.LVL72-.Ltext0
+	.8byte	.LVL76-.Ltext0
+	.2byte	0x1
+	.byte	0x66
+	.8byte	.LVL76-.Ltext0
+	.8byte	.LVL77-.Ltext0
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL73-.Ltext0
+	.8byte	.LVL78-.Ltext0
 	.8byte	.LFE1553-.Ltext0
 	.2byte	0x1
 	.byte	0x66
 	.8byte	0
 	.8byte	0
 .LLST9:
-	.8byte	.LVL43-.Ltext0
-	.8byte	.LVL44-.Ltext0
+	.8byte	.LVL45-.Ltext0
+	.8byte	.LVL46-.Ltext0
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL44-.Ltext0
-	.8byte	.LVL61-.Ltext0
-	.2byte	0x1
-	.byte	0x68
-	.8byte	.LVL61-.Ltext0
-	.8byte	.LVL62-.Ltext0
-	.2byte	0x1
-	.byte	0x51
-	.8byte	.LVL62-.Ltext0
+	.8byte	.LVL46-.Ltext0
 	.8byte	.LVL66-.Ltext0
 	.2byte	0x1
 	.byte	0x68
+	.8byte	.LVL66-.Ltext0
+	.8byte	.LVL67-.Ltext0
+	.2byte	0x1
+	.byte	0x51
 	.8byte	.LVL67-.Ltext0
 	.8byte	.LVL71-.Ltext0
 	.2byte	0x1
 	.byte	0x68
-	.8byte	.LVL71-.Ltext0
-	.8byte	.LVL73-.Ltext0
+	.8byte	.LVL72-.Ltext0
+	.8byte	.LVL76-.Ltext0
+	.2byte	0x1
+	.byte	0x68
+	.8byte	.LVL76-.Ltext0
+	.8byte	.LVL78-.Ltext0
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL73-.Ltext0
+	.8byte	.LVL78-.Ltext0
 	.8byte	.LFE1553-.Ltext0
 	.2byte	0x1
 	.byte	0x68
 	.8byte	0
 	.8byte	0
 .LLST10:
-	.8byte	.LVL43-.Ltext0
 	.8byte	.LVL45-.Ltext0
+	.8byte	.LVL47-.Ltext0
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL45-.Ltext0
-	.8byte	.LVL59-.Ltext0
-	.2byte	0x1
-	.byte	0x64
-	.8byte	.LVL59-.Ltext0
-	.8byte	.LVL62-.Ltext0
-	.2byte	0x1
-	.byte	0x52
-	.8byte	.LVL62-.Ltext0
+	.8byte	.LVL47-.Ltext0
 	.8byte	.LVL64-.Ltext0
 	.2byte	0x1
 	.byte	0x64
+	.8byte	.LVL64-.Ltext0
 	.8byte	.LVL67-.Ltext0
-	.8byte	.LVL71-.Ltext0
-	.2byte	0x1
-	.byte	0x64
-	.8byte	.LVL71-.Ltext0
-	.8byte	.LVL73-.Ltext0
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL73-.Ltext0
+	.8byte	.LVL67-.Ltext0
+	.8byte	.LVL69-.Ltext0
+	.2byte	0x1
+	.byte	0x64
+	.8byte	.LVL72-.Ltext0
+	.8byte	.LVL76-.Ltext0
+	.2byte	0x1
+	.byte	0x64
+	.8byte	.LVL76-.Ltext0
+	.8byte	.LVL78-.Ltext0
+	.2byte	0x1
+	.byte	0x52
+	.8byte	.LVL78-.Ltext0
 	.8byte	.LFE1553-.Ltext0
 	.2byte	0x1
 	.byte	0x64
 	.8byte	0
 	.8byte	0
 .LLST11:
-	.8byte	.LVL47-.Ltext0
-	.8byte	.LVL49-1-.Ltext0
+	.8byte	.LVL45-.Ltext0
+	.8byte	.LVL51-.Ltext0
 	.2byte	0x1
-	.byte	0x54
-	.8byte	.LVL67-.Ltext0
-	.8byte	.LVL69-.Ltext0
+	.byte	0x53
+	.8byte	.LVL52-.Ltext0
+	.8byte	.LVL53-1-.Ltext0
 	.2byte	0x1
-	.byte	0x54
+	.byte	0x53
+	.8byte	.LVL55-.Ltext0
+	.8byte	.LVL56-1-.Ltext0
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL63-.Ltext0
+	.8byte	.LVL74-.Ltext0
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL76-.Ltext0
+	.8byte	.LVL78-.Ltext0
+	.2byte	0x1
+	.byte	0x53
 	.8byte	0
 	.8byte	0
 .LLST12:
-	.8byte	.LVL48-.Ltext0
-	.8byte	.LVL53-.Ltext0
+	.8byte	.LVL49-.Ltext0
+	.8byte	.LVL53-1-.Ltext0
 	.2byte	0x1
-	.byte	0x63
-	.8byte	.LVL54-.Ltext0
-	.8byte	.LVL55-.Ltext0
+	.byte	0x55
+	.8byte	.LVL72-.Ltext0
+	.8byte	.LVL74-.Ltext0
 	.2byte	0x1
-	.byte	0x63
+	.byte	0x55
+	.8byte	0
+	.8byte	0
+.LLST13:
+	.8byte	.LVL50-.Ltext0
 	.8byte	.LVL58-.Ltext0
+	.2byte	0x1
+	.byte	0x63
 	.8byte	.LVL59-.Ltext0
+	.8byte	.LVL60-.Ltext0
 	.2byte	0x1
 	.byte	0x63
 	.8byte	.LVL63-.Ltext0
@@ -15007,36 +15116,40 @@
 	.2byte	0x1
 	.byte	0x63
 	.8byte	.LVL68-.Ltext0
-	.8byte	.LVL70-.Ltext0
+	.8byte	.LVL69-.Ltext0
 	.2byte	0x1
 	.byte	0x63
 	.8byte	.LVL73-.Ltext0
+	.8byte	.LVL75-.Ltext0
+	.2byte	0x1
+	.byte	0x63
+	.8byte	.LVL78-.Ltext0
 	.8byte	.LFE1553-.Ltext0
 	.2byte	0x1
 	.byte	0x63
 	.8byte	0
 	.8byte	0
-.LLST13:
-	.8byte	.LVL52-.Ltext0
-	.8byte	.LVL56-1-.Ltext0
-	.2byte	0x1
-	.byte	0x53
-	.8byte	.LVL69-.Ltext0
-	.8byte	.LVL71-.Ltext0
-	.2byte	0x1
-	.byte	0x53
-	.8byte	0
-	.8byte	0
 .LLST14:
-	.8byte	.LVL53-.Ltext0
-	.8byte	.LVL59-.Ltext0
+	.8byte	.LVL57-.Ltext0
+	.8byte	.LVL61-1-.Ltext0
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL74-.Ltext0
+	.8byte	.LVL76-.Ltext0
+	.2byte	0x1
+	.byte	0x53
+	.8byte	0
+	.8byte	0
+.LLST15:
+	.8byte	.LVL58-.Ltext0
+	.8byte	.LVL64-.Ltext0
 	.2byte	0x1
 	.byte	0x63
-	.8byte	.LVL70-.Ltext0
-	.8byte	.LVL71-.Ltext0
+	.8byte	.LVL75-.Ltext0
+	.8byte	.LVL76-.Ltext0
 	.2byte	0x1
 	.byte	0x63
-	.8byte	.LVL73-.Ltext0
+	.8byte	.LVL78-.Ltext0
 	.8byte	.LFE1553-.Ltext0
 	.2byte	0x1
 	.byte	0x63
@@ -15054,8 +15167,8 @@
 	.8byte	.LVL3-.Ltext0
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL17-.Ltext0
-	.8byte	.LVL18-.Ltext0
+	.8byte	.LVL19-.Ltext0
+	.8byte	.LVL20-.Ltext0
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
@@ -15064,15 +15177,15 @@
 	.8byte	.LVL2-.Ltext0
 	.8byte	.LVL4-.Ltext0
 	.2byte	0x1
-	.byte	0x5f
-	.8byte	.LVL17-.Ltext0
-	.8byte	.LVL19-1-.Ltext0
-	.2byte	0x1
-	.byte	0x5f
-	.8byte	.LVL20-.Ltext0
+	.byte	0x61
+	.8byte	.LVL19-.Ltext0
 	.8byte	.LVL21-1-.Ltext0
 	.2byte	0x1
-	.byte	0x5f
+	.byte	0x61
+	.8byte	.LVL23-.Ltext0
+	.8byte	.LVL24-1-.Ltext0
+	.2byte	0x1
+	.byte	0x61
 	.8byte	0
 	.8byte	0
 .LLST3:
@@ -15081,7 +15194,11 @@
 	.2byte	0x1
 	.byte	0x63
 	.8byte	.LVL12-.Ltext0
-	.8byte	.LVL17-.Ltext0
+	.8byte	.LVL13-.Ltext0
+	.2byte	0x1
+	.byte	0x63
+	.8byte	.LVL14-.Ltext0
+	.8byte	.LVL19-.Ltext0
 	.2byte	0x1
 	.byte	0x63
 	.8byte	0
@@ -15091,12 +15208,12 @@
 	.8byte	.LVL12-.Ltext0
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL13-.Ltext0
 	.8byte	.LVL15-.Ltext0
+	.8byte	.LVL17-.Ltext0
 	.2byte	0x1
 	.byte	0x53
-	.8byte	.LVL16-.Ltext0
-	.8byte	.LVL17-.Ltext0
+	.8byte	.LVL18-.Ltext0
+	.8byte	.LVL19-.Ltext0
 	.2byte	0x1
 	.byte	0x53
 	.8byte	0
@@ -15105,33 +15222,33 @@
 	.8byte	.LVL5-.Ltext0
 	.8byte	.LVL7-.Ltext0
 	.2byte	0x1
-	.byte	0x55
+	.byte	0x56
 	.8byte	.LVL8-.Ltext0
 	.8byte	.LVL9-1-.Ltext0
 	.2byte	0x1
-	.byte	0x55
-	.8byte	.LVL10-.Ltext0
-	.8byte	.LVL14-.Ltext0
+	.byte	0x56
+	.8byte	.LVL9-.Ltext0
+	.8byte	.LVL13-.Ltext0
 	.2byte	0x1
-	.byte	0x55
+	.byte	0x56
+	.8byte	.LVL14-.Ltext0
+	.8byte	.LVL16-.Ltext0
+	.2byte	0x1
+	.byte	0x56
 	.8byte	0
 	.8byte	0
 .LLST6:
-	.8byte	.LVL23-.Ltext0
-	.8byte	.LVL24-.Ltext0
+	.8byte	.LVL25-.Ltext0
+	.8byte	.LVL26-.Ltext0
 	.2byte	0x1
 	.byte	0x50
-	.8byte	.LVL40-.Ltext0
-	.8byte	.LVL41-.Ltext0
+	.8byte	.LVL42-.Ltext0
+	.8byte	.LVL43-.Ltext0
 	.2byte	0x1
 	.byte	0x50
 	.8byte	0
 	.8byte	0
 .LLST7:
-	.8byte	.LVL25-.Ltext0
-	.8byte	.LVL26-.Ltext0
-	.2byte	0x1
-	.byte	0x51
 	.8byte	.LVL27-.Ltext0
 	.8byte	.LVL28-.Ltext0
 	.2byte	0x1
@@ -15158,6 +15275,10 @@
 	.byte	0x51
 	.8byte	.LVL39-.Ltext0
 	.8byte	.LVL40-.Ltext0
+	.2byte	0x1
+	.byte	0x51
+	.8byte	.LVL41-.Ltext0
+	.8byte	.LVL42-.Ltext0
 	.2byte	0x1
 	.byte	0x51
 	.8byte	0
@@ -15259,7 +15380,7 @@
 	.string	"runnable_weight"
 .LASF323:
 	.string	"pushable_dl_tasks"
-.LASF1477:
+.LASF1478:
 	.string	"__func__"
 .LASF703:
 	.string	"cpu_number"
@@ -15289,7 +15410,7 @@
 	.string	"entry"
 .LASF1435:
 	.string	"pvi_waveform"
-.LASF1485:
+.LASF1486:
 	.string	"oldpic"
 .LASF547:
 	.string	"MIGRATE_PCPTYPES"
@@ -15487,7 +15608,7 @@
 	.string	"perf_event_mutex"
 .LASF1380:
 	.string	"dev_uevent"
-.LASF1478:
+.LASF1479:
 	.string	"temp_num"
 .LASF1008:
 	.string	"cancelled_write_bytes"
@@ -15497,13 +15618,13 @@
 	.string	"sve_vl"
 .LASF383:
 	.string	"signal"
-.LASF1466:
+.LASF1467:
 	.string	"pvi_wf_get_lut"
 .LASF202:
 	.string	"_sinittext"
 .LASF969:
 	.string	"_band"
-.LASF1484:
+.LASF1485:
 	.string	"decodewaveform"
 .LASF728:
 	.string	"tick_nsec"
@@ -15879,7 +16000,7 @@
 	.string	"nr_wakeups"
 .LASF289:
 	.string	"wake_entry"
-.LASF1464:
+.LASF1465:
 	.string	"pvi_wf_get_version"
 .LASF394:
 	.string	"parent_exec_id"
@@ -16025,7 +16146,7 @@
 	.string	"start_prevent_time"
 .LASF602:
 	.string	"NR_WRITTEN"
-.LASF1469:
+.LASF1470:
 	.string	"lut_type"
 .LASF1347:
 	.string	"dev_root"
@@ -16079,7 +16200,7 @@
 	.string	"timeout"
 .LASF589:
 	.string	"NR_FILE_MAPPED"
-.LASF1476:
+.LASF1477:
 	.string	"wf_data"
 .LASF337:
 	.string	"sched_psi_wake_requeue"
@@ -16099,11 +16220,11 @@
 	.string	"rb_leftmost"
 .LASF658:
 	.string	"stat_threshold"
-.LASF1463:
+.LASF1464:
 	.string	"spi_id_buffer"
 .LASF1118:
 	.string	"rt_mutex_waiter"
-.LASF1494:
+.LASF1496:
 	.string	"/home/lyx/rk3566-11-eink/kernel"
 .LASF705:
 	.string	"secondary_data"
@@ -16217,7 +16338,7 @@
 	.string	"dl_density"
 .LASF1262:
 	.string	"RPM_REQ_RESUME"
-.LASF1495:
+.LASF1497:
 	.string	"frozen"
 .LASF192:
 	.string	"_text"
@@ -16357,6 +16478,8 @@
 	.string	"HRTIMER_BASE_REALTIME"
 .LASF452:
 	.string	"stack_vm_area"
+.LASF1461:
+	.string	"need_pic"
 .LASF912:
 	.string	"running"
 .LASF223:
@@ -16401,7 +16524,7 @@
 	.string	"init_user_ns"
 .LASF1104:
 	.string	"perf_event_task_context"
-.LASF1467:
+.LASF1468:
 	.string	"waveform_file"
 .LASF1389:
 	.string	"segment_boundary_mask"
@@ -16493,6 +16616,8 @@
 	.string	"refcount"
 .LASF1204:
 	.string	"restore_early"
+.LASF1491:
+	.string	"shift_n"
 .LASF1188:
 	.string	"pm_message"
 .LASF948:
@@ -16609,7 +16734,7 @@
 	.string	"epd_lut_data"
 .LASF694:
 	.string	"zonelist"
-.LASF1493:
+.LASF1495:
 	.string	"drivers/gpu/drm/rockchip/ebc-dev/epdlut/pvi_waveform.c"
 .LASF672:
 	.string	"pageset"
@@ -16729,7 +16854,7 @@
 	.string	"deferred_resume"
 .LASF454:
 	.string	"security"
-.LASF1475:
+.LASF1476:
 	.string	"overlay_lut"
 .LASF166:
 	.string	"FTR_LOWER_SAFE"
@@ -16753,7 +16878,7 @@
 	.string	"dev_pm_info"
 .LASF630:
 	.string	"node_present_pages"
-.LASF1479:
+.LASF1480:
 	.string	"get_wf_frm_num"
 .LASF327:
 	.string	"exit_state"
@@ -16881,7 +17006,7 @@
 	.string	"pcount"
 .LASF1146:
 	.string	"kref"
-.LASF1486:
+.LASF1487:
 	.string	"newpic"
 .LASF436:
 	.string	"nr_dirtied"
@@ -16975,7 +17100,7 @@
 	.string	"active_memcg"
 .LASF1006:
 	.string	"read_bytes"
-.LASF1461:
+.LASF1462:
 	.string	"pvi_mode_table"
 .LASF176:
 	.string	"arm64_ftr_reg"
@@ -17021,7 +17146,7 @@
 	.string	"pm_message_t"
 .LASF1424:
 	.string	"WF_TYPE_GLR16"
-.LASF1488:
+.LASF1489:
 	.string	"tempdata"
 .LASF230:
 	.string	"__alt_instructions"
@@ -17117,7 +17242,7 @@
 	.string	"next_timer"
 .LASF313:
 	.string	"rcu_node_entry"
-.LASF1472:
+.LASF1473:
 	.string	"pvi_wf"
 .LASF858:
 	.string	"list"
@@ -17251,7 +17376,7 @@
 	.string	"zoneref"
 .LASF825:
 	.string	"iattr"
-.LASF1487:
+.LASF1488:
 	.string	"frame_tmp"
 .LASF1051:
 	.string	"slice_max"
@@ -17269,7 +17394,7 @@
 	.string	"self_exec_id"
 .LASF1041:
 	.string	"wait_count"
-.LASF1480:
+.LASF1481:
 	.string	"get_wf_mode_index"
 .LASF1333:
 	.string	"sync"
@@ -17429,7 +17554,7 @@
 	.string	"bps_disabled"
 .LASF755:
 	.string	"notifier_call"
-.LASF1468:
+.LASF1469:
 	.string	"output"
 .LASF402:
 	.string	"journal_info"
@@ -17477,7 +17602,7 @@
 	.string	"NR_UNEVICTABLE"
 .LASF861:
 	.string	"released"
-.LASF1471:
+.LASF1472:
 	.string	"sftemp"
 .LASF819:
 	.string	"target_kn"
@@ -17571,7 +17696,7 @@
 	.string	"argv"
 .LASF666:
 	.string	"__MAX_NR_ZONES"
-.LASF1474:
+.LASF1475:
 	.string	"mode_index"
 .LASF438:
 	.string	"dirty_paused_when"
@@ -17589,7 +17714,7 @@
 	.string	"device_node"
 .LASF732:
 	.string	"ktime_t"
-.LASF1490:
+.LASF1492:
 	.string	"printk"
 .LASF741:
 	.string	"data"
@@ -17647,7 +17772,7 @@
 	.string	"dl_throttled"
 .LASF1184:
 	.string	"n_ref"
-.LASF1465:
+.LASF1466:
 	.string	"pvi_wf_input"
 .LASF391:
 	.string	"task_works"
@@ -17679,7 +17804,7 @@
 	.string	"wf_subversion"
 .LASF256:
 	.string	"suspended_step"
-.LASF1491:
+.LASF1493:
 	.string	"epd_overlay_lut"
 .LASF840:
 	.string	"mmap"
@@ -17689,7 +17814,7 @@
 	.string	"nodemask_t"
 .LASF1327:
 	.string	"autosleep_enabled"
-.LASF1470:
+.LASF1471:
 	.string	"stype"
 .LASF772:
 	.string	"PCPU_FC_EMBED"
@@ -17761,7 +17886,7 @@
 	.string	"load_avg"
 .LASF532:
 	.string	"FDPIC_FUNCPTRS"
-.LASF1462:
+.LASF1463:
 	.string	"waveform"
 .LASF778:
 	.string	"thread_id"
@@ -17785,7 +17910,7 @@
 	.string	"fpsimd_cpu"
 .LASF1260:
 	.string	"RPM_REQ_SUSPEND"
-.LASF1489:
+.LASF1490:
 	.string	"israr"
 .LASF360:
 	.string	"utime"
@@ -17793,7 +17918,7 @@
 	.string	"__nosave_begin"
 .LASF967:
 	.string	"_addr_pkey"
-.LASF1492:
+.LASF1494:
 	.ascii	"GNU C89 6.3.1 20170404 -mlittle-endian -mgeneral-regs-only -"
 	.ascii	"mabi=lp64 -march=armv8-a -g -O2 -std=gnu90 -fno-strict-alias"
 	.ascii	"ing -fno-common -fshort-wchar -fno-PIE -fno-asynchronous-unw"
@@ -17821,7 +17946,7 @@
 	.string	"static_key_mod"
 .LASF543:
 	.string	"MIGRATE_UNMOVABLE"
-.LASF1481:
+.LASF1482:
 	.string	"pvi_modes"
 .LASF959:
 	.string	"_stime"
@@ -17901,7 +18026,7 @@
 	.string	"namespace"
 .LASF1276:
 	.string	"no_pm"
-.LASF1482:
+.LASF1483:
 	.string	"get_wf_temp_index"
 .LASF14:
 	.string	"long long int"
@@ -18187,7 +18312,7 @@
 	.string	"serial"
 .LASF398:
 	.string	"wake_q"
-.LASF1483:
+.LASF1484:
 	.string	"parse_mode_version"
 .LASF598:
 	.string	"NR_UNSTABLE_NFS"
@@ -18215,7 +18340,7 @@
 	.string	"total_time"
 .LASF211:
 	.string	"__kprobes_text_end"
-.LASF1473:
+.LASF1474:
 	.string	"temp_index"
 	.ident	"GCC: (Linaro GCC 6.3-2017.05) 6.3.1 20170404"
 	.section	.note.GNU-stack,"",@progbits
diff --git a/kernel/drivers/gpu/drm/rockchip/ebc-dev/epdlut/rkf_waveform_v8.S b/kernel/drivers/gpu/drm/rockchip/ebc-dev/epdlut/rkf_waveform_v8.S
index 4edd027..dbf7613 100644
--- a/kernel/drivers/gpu/drm/rockchip/ebc-dev/epdlut/rkf_waveform_v8.S
+++ b/kernel/drivers/gpu/drm/rockchip/ebc-dev/epdlut/rkf_waveform_v8.S
@@ -1155,7 +1155,7 @@
 	.cfi_offset 29, -64
 	.cfi_offset 30, -56
 	.loc 1 549 0
-	adrp	x3, .LANCHOR0
+	adrp	x4, .LANCHOR0
 	.loc 1 543 0
 	add	x29, sp, 0
 	.cfi_def_cfa_register 29
@@ -1164,7 +1164,7 @@
 	.cfi_offset 20, -40
 	mov	x19, x0
 	.loc 1 549 0
-	ldr	x0, [x3, #:lo12:.LANCHOR0]
+	ldr	x0, [x4, #:lo12:.LANCHOR0]
 .LVL105:
 	.loc 1 543 0
 	stp	x21, x22, [sp, 32]
@@ -1173,10 +1173,13 @@
 	.cfi_offset 22, -24
 	.cfi_offset 23, -16
 	.loc 1 549 0
-	cbz	x0, .L138
+	cbz	x0, .L139
 	.loc 1 552 0
-	cbz	x19, .L139
-	.loc 1 561 0
+	cbz	x19, .L140
+	.loc 1 555 0
+	cmp	w3, 32
+	beq	.L152
+	.loc 1 566 0
 	mov	w0, 26215
 	mov	w21, w2
 	adrp	x22, .LANCHOR1
@@ -1184,10 +1187,10 @@
 	movk	w0, 0x6666, lsl 16
 	add	x2, x22, :lo12:.LANCHOR1
 .LVL106:
-	.loc 1 555 0
+	.loc 1 560 0
 	cmp	w1, 8
-	beq	.L128
-	.loc 1 561 0
+	beq	.L129
+	.loc 1 566 0
 	ldr	w1, [x22, #:lo12:.LANCHOR1]
 	smull	x20, w21, w0
 	asr	x20, x20, 33
@@ -1196,104 +1199,57 @@
 	asr	x0, x0, 33
 	sub	w0, w0, w1, asr 31
 	cmp	w20, w0
-	beq	.L152
-	.loc 1 564 0
+	beq	.L153
+	.loc 1 569 0
 	cmp	w23, 10
-	beq	.L137
-.L136:
-	.loc 1 566 0
+	bne	.L137
+.L138:
+	.loc 1 589 0
 	ldr	x0, [x19, 8]
-	cbz	x0, .L131
-	.loc 1 567 0
+	cbz	x0, .L135
+	.loc 1 590 0
 	bl	kfree
 .LVL107:
-	.loc 1 568 0
+	.loc 1 591 0
 	str	xzr, [x19, 8]
-.L131:
-	.loc 1 571 0
-	mov	w2, w21
-	mov	w1, w23
-	mov	x0, x19
-	bl	parse_wf_data
 .LVL108:
-	mov	w10, w0
-	.loc 1 572 0
-	tbnz	w0, #31, .L135
-	.loc 1 576 0
-	ldr	x1, [x19, 16]
-	mov	w2, w0
-	add	x0, x19, 8
-	bl	rkf_lut_init_wf_table.isra.1
-.LVL109:
-	.loc 1 582 0
-	ldr	w1, [x22, #:lo12:.LANCHOR1]
-	mov	w0, 26215
-	movk	w0, 0x6666, lsl 16
-	.loc 1 577 0
-	ldr	w2, [x19]
-	.loc 1 579 0
-	add	x3, x22, :lo12:.LANCHOR1
-	.loc 1 577 0
-	and	w2, w2, 65280
-	.loc 1 582 0
-	smull	x0, w1, w0
-	.loc 1 578 0
-	orr	w2, w2, w10
-	.loc 1 579 0
-	str	w23, [x3, 4]
-	.loc 1 578 0
-	str	w2, [x19]
-	.loc 1 582 0
-	asr	x0, x0, 33
-	sub	w0, w0, w1, asr 31
-	cmp	w0, w20
-	beq	.L133
-.L137:
-	.loc 1 584 0
-	ldr	x0, [x19, 8]
-	cbz	x0, .L134
-	.loc 1 585 0
-	bl	kfree
-.LVL110:
-	.loc 1 586 0
-	str	xzr, [x19, 8]
-.L134:
-	.loc 1 588 0
+.L135:
+	.loc 1 593 0
 	bl	epd_overlay_lut
-.LVL111:
-	.loc 1 589 0
+.LVL109:
+	.loc 1 594 0
 	mov	w1, w0
 	mov	w2, w21
 	mov	x0, x19
 	bl	parse_wf_data
-.LVL112:
+.LVL110:
 	mov	w10, w0
-	.loc 1 590 0
-	tbnz	w0, #31, .L135
-	.loc 1 594 0
+	.loc 1 595 0
+	tbnz	w0, #31, .L136
+	.loc 1 599 0
 	ldr	x1, [x19, 24]
 	mov	w2, w0
 	add	x0, x19, 8
 	bl	rkf_lut_init_wf_table.isra.1
-.LVL113:
-	.loc 1 598 0
+.LVL111:
+	.loc 1 603 0
 	str	w21, [x22, #:lo12:.LANCHOR1]
-	.loc 1 596 0
-	ldrb	w1, [x19]
 	.loc 1 601 0
+	ldrb	w1, [x19]
+	.loc 1 606 0
 	mov	w0, 0
-	.loc 1 597 0
+	.loc 1 602 0
 	orr	w10, w1, w10, lsl 8
 	str	w10, [x19]
-.LVL114:
+.LVL112:
 .L126:
-	.loc 1 602 0
+	.loc 1 607 0
 	ldp	x19, x20, [sp, 16]
-.LVL115:
+.LVL113:
 	ldp	x21, x22, [sp, 32]
-.LVL116:
+.LVL114:
 	ldr	x23, [sp, 48]
-.LVL117:
+.LVL115:
 	ldp	x29, x30, [sp], 64
 	.cfi_remember_state
 	.cfi_restore 30
@@ -1305,39 +1261,76 @@
 	.cfi_restore 20
 	.cfi_def_cfa 31, 0
 	ret
-.LVL118:
+.LVL116:
 	.p2align 3
-.L128:
+.L153:
 	.cfi_restore_state
-	.loc 1 561 0
-	ldr	w1, [x22, #:lo12:.LANCHOR1]
+	.loc 1 566 0 discriminator 1
+	ldr	w0, [x2, 4]
+	cmp	w23, w0
+	beq	.L134
+	.loc 1 569 0
+	cmp	w23, 10
+	beq	.L134
+.L137:
+	.loc 1 571 0
+	ldr	x0, [x19, 8]
+	cbz	x0, .L132
+	.loc 1 572 0
+	bl	kfree
+.LVL117:
+	.loc 1 573 0
+	str	xzr, [x19, 8]
+.LVL118:
+.L132:
+	.loc 1 576 0
+	mov	w2, w21
+	mov	w1, w23
+	mov	x0, x19
+	bl	parse_wf_data
 .LVL119:
-	smull	x20, w21, w0
-	.loc 1 556 0
-	mov	w23, 5
-	.loc 1 561 0
-	asr	x20, x20, 33
+	mov	w10, w0
+	.loc 1 577 0
+	tbnz	w0, #31, .L136
+	.loc 1 581 0
+	ldr	x1, [x19, 16]
+	mov	w2, w0
+	add	x0, x19, 8
+	bl	rkf_lut_init_wf_table.isra.1
+.LVL120:
+	.loc 1 587 0
+	ldr	w1, [x22, #:lo12:.LANCHOR1]
+	mov	w0, 26215
+	movk	w0, 0x6666, lsl 16
+	.loc 1 582 0
+	ldr	w2, [x19]
+	.loc 1 584 0
+	add	x3, x22, :lo12:.LANCHOR1
+	.loc 1 582 0
+	and	w2, w2, 65280
+	.loc 1 587 0
 	smull	x0, w1, w0
-	sub	w20, w20, w21, asr 31
+	.loc 1 583 0
+	orr	w2, w2, w10
+	.loc 1 584 0
+	str	w23, [x3, 4]
+	.loc 1 583 0
+	str	w2, [x19]
+	.loc 1 587 0
 	asr	x0, x0, 33
 	sub	w0, w0, w1, asr 31
-	cmp	w20, w0
-	bne	.L136
-	ldr	w0, [x2, 4]
-	cmp	w0, w23
-.LVL120:
-	bne	.L136
+	cmp	w0, w20
+	bne	.L138
 .LVL121:
-.L133:
-	.loc 1 562 0
+.L134:
+	.loc 1 567 0
 	mov	w0, 0
-.L153:
-	.loc 1 602 0
-	ldp	x19, x20, [sp, 16]
-.LVL122:
-	ldp	x21, x22, [sp, 32]
-.LVL123:
+	.loc 1 607 0
 	ldr	x23, [sp, 48]
+.LVL122:
+	ldp	x19, x20, [sp, 16]
+.LVL123:
+	ldp	x21, x22, [sp, 32]
 .LVL124:
 	ldp	x29, x30, [sp], 64
 	.cfi_remember_state
@@ -1352,36 +1345,55 @@
 	ret
 .LVL125:
 	.p2align 3
-.L152:
+.L129:
 	.cfi_restore_state
-	.loc 1 561 0 discriminator 1
-	ldr	w0, [x2, 4]
-	cmp	w23, w0
-	beq	.L133
-	.loc 1 564 0
-	cmp	w23, 10
-	bne	.L136
-	.loc 1 562 0
-	mov	w0, 0
-	b	.L153
+	.loc 1 566 0
+	ldr	w1, [x22, #:lo12:.LANCHOR1]
 .LVL126:
-.L138:
+	smull	x20, w21, w0
+	.loc 1 561 0
+	mov	w23, 5
+	.loc 1 566 0
+	asr	x20, x20, 33
+	smull	x0, w1, w0
+	sub	w20, w20, w21, asr 31
+	asr	x0, x0, 33
+	sub	w0, w0, w1, asr 31
+	cmp	w20, w0
+	bne	.L137
+	ldr	w0, [x2, 4]
+	cmp	w0, w23
+.LVL127:
+	bne	.L137
+	b	.L134
+.LVL128:
+.L139:
 	.loc 1 550 0
 	mov	w0, -19
 	b	.L126
-.L139:
+.L140:
 	.loc 1 553 0
 	mov	w0, -22
 	b	.L126
-.LVL127:
-.L135:
-	.loc 1 573 0
+.LVL129:
+.L136:
+	.loc 1 578 0
+	adrp	x0, .LC7
+	add	x0, x0, :lo12:.LC7
+	bl	printk
+.LVL130:
+	.loc 1 579 0
+	mov	w0, -5
+	b	.L126
+.LVL131:
+.L152:
+	.loc 1 556 0
 	adrp	x0, .LC6
 	add	x0, x0, :lo12:.LC6
 	bl	printk
-.LVL128:
-	.loc 1 574 0
-	mov	w0, -5
+.LVL132:
+	.loc 1 557 0
+	mov	w0, -22
 	b	.L126
 	.cfi_endproc
 .LFE1565:
@@ -1389,13 +1401,13 @@
 	.data
 	.align	2
 	.set	.LANCHOR1,. + 0
-	.type	sftemp.16977, %object
-	.size	sftemp.16977, 4
-sftemp.16977:
+	.type	sftemp.16981, %object
+	.size	sftemp.16981, 4
+sftemp.16981:
 	.word	-1
-	.type	stype.16976, %object
-	.size	stype.16976, 4
-stype.16976:
+	.type	stype.16980, %object
+	.size	stype.16980, 4
+stype.16980:
 	.word	11
 	.bss
 	.align	3
@@ -1429,6 +1441,8 @@
 	.string	"rkf file version: %s\n"
 	.zero	2
 .LC6:
+	.string	"rkf: not support 5bit waveform\n"
+.LC7:
 	.string	"rkf waveform get frame number failed\n"
 	.text
 .Letext0:
@@ -1532,7 +1546,7 @@
 	.file 100 "./arch/arm64/include/asm/string.h"
 	.section	.debug_info,"",@progbits
 .Ldebug_info0:
-	.4byte	0x7144
+	.4byte	0x7161
 	.2byte	0x4
 	.4byte	.Ldebug_abbrev0
 	.byte	0x8
@@ -13139,7 +13153,7 @@
 	.byte	0x4
 	.4byte	0x6c
 	.byte	0x5f
-	.byte	0xc
+	.byte	0xf
 	.4byte	0x6003
 	.uleb128 0x1b
 	.4byte	.LASF1417
@@ -13185,24 +13199,24 @@
 	.4byte	.LASF1430
 	.byte	0x20
 	.byte	0x5f
-	.byte	0x1d
+	.byte	0x20
 	.4byte	0x6034
 	.uleb128 0xc
 	.4byte	.LASF1431
 	.byte	0x5f
-	.byte	0x1e
+	.byte	0x21
 	.4byte	0x6c
 	.byte	0
 	.uleb128 0xc
 	.4byte	.LASF739
 	.byte	0x5f
-	.byte	0x1f
+	.byte	0x22
 	.4byte	0x2d56
 	.byte	0x8
 	.uleb128 0xc
 	.4byte	.LASF1432
 	.byte	0x5f
-	.byte	0x20
+	.byte	0x23
 	.4byte	0x6034
 	.byte	0x10
 	.byte	0
@@ -13427,12 +13441,12 @@
 	.8byte	.LFE1565-.LFB1565
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x62fa
+	.4byte	0x6317
 	.uleb128 0x47
 	.4byte	.LASF1465
 	.byte	0x1
 	.2byte	0x21e
-	.4byte	0x62fa
+	.4byte	0x6317
 	.4byte	.LLST28
 	.uleb128 0x47
 	.4byte	.LASF1466
@@ -13447,60 +13461,69 @@
 	.4byte	0xc0
 	.4byte	.LLST30
 	.uleb128 0x48
+	.string	"pic"
+	.byte	0x1
+	.2byte	0x21e
+	.4byte	0xc0
+	.4byte	.LLST31
+	.uleb128 0x49
 	.4byte	.LASF1468
 	.byte	0x1
 	.2byte	0x220
 	.4byte	0x5fa4
 	.uleb128 0x9
 	.byte	0x3
-	.8byte	stype.16976
-	.uleb128 0x48
+	.8byte	stype.16980
+	.uleb128 0x49
 	.4byte	.LASF1469
 	.byte	0x1
 	.2byte	0x221
 	.4byte	0xc0
 	.uleb128 0x9
 	.byte	0x3
-	.8byte	sftemp.16977
-	.uleb128 0x49
+	.8byte	sftemp.16981
+	.uleb128 0x4a
 	.4byte	.LASF1470
 	.byte	0x1
 	.2byte	0x222
 	.4byte	0xc0
-	.uleb128 0x49
+	.uleb128 0x4a
 	.4byte	.LASF1431
 	.byte	0x1
 	.2byte	0x223
 	.4byte	0xc0
-	.uleb128 0x4a
+	.uleb128 0x4b
 	.8byte	.LVL107
-	.4byte	0x70fd
-	.uleb128 0x4a
-	.8byte	.LVL108
-	.4byte	0x6300
-	.uleb128 0x4a
+	.4byte	0x711a
+	.uleb128 0x4b
 	.8byte	.LVL109
-	.4byte	0x6f79
-	.uleb128 0x4a
+	.4byte	0x7125
+	.uleb128 0x4b
 	.8byte	.LVL110
-	.4byte	0x70fd
-	.uleb128 0x4a
+	.4byte	0x631d
+	.uleb128 0x4b
 	.8byte	.LVL111
-	.4byte	0x7108
-	.uleb128 0x4a
-	.8byte	.LVL112
-	.4byte	0x6300
-	.uleb128 0x4a
-	.8byte	.LVL113
-	.4byte	0x6f79
-	.uleb128 0x4a
-	.8byte	.LVL128
-	.4byte	0x7113
+	.4byte	0x6f96
+	.uleb128 0x4b
+	.8byte	.LVL117
+	.4byte	0x711a
+	.uleb128 0x4b
+	.8byte	.LVL119
+	.4byte	0x631d
+	.uleb128 0x4b
+	.8byte	.LVL120
+	.4byte	0x6f96
+	.uleb128 0x4b
+	.8byte	.LVL130
+	.4byte	0x7130
+	.uleb128 0x4b
+	.8byte	.LVL132
+	.4byte	0x7130
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0x6003
-	.uleb128 0x4b
+	.uleb128 0x4c
 	.4byte	.LASF1488
 	.byte	0x1
 	.2byte	0x1d1
@@ -13509,12 +13532,12 @@
 	.8byte	.LFE1564-.LFB1564
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x67cc
+	.4byte	0x67e9
 	.uleb128 0x47
 	.4byte	.LASF1465
 	.byte	0x1
 	.2byte	0x1d1
-	.4byte	0x62fa
+	.4byte	0x6317
 	.4byte	.LLST8
 	.uleb128 0x47
 	.4byte	.LASF1466
@@ -13528,365 +13551,365 @@
 	.2byte	0x1d1
 	.4byte	0xc0
 	.4byte	.LLST10
-	.uleb128 0x49
+	.uleb128 0x4a
 	.4byte	.LASF1431
 	.byte	0x1
 	.2byte	0x1d3
 	.4byte	0xc0
-	.uleb128 0x4c
-	.4byte	0x6840
+	.uleb128 0x4d
+	.4byte	0x685d
 	.8byte	.LBB268
 	.4byte	.Ldebug_ranges0+0x110
 	.byte	0x1
 	.2byte	0x208
-	.4byte	0x6476
-	.uleb128 0x4d
-	.4byte	0x6851
-	.uleb128 0x4d
-	.4byte	0x685d
+	.4byte	0x6493
 	.uleb128 0x4e
+	.4byte	0x686e
+	.uleb128 0x4e
+	.4byte	0x687a
+	.uleb128 0x4f
 	.4byte	.Ldebug_ranges0+0x110
-	.uleb128 0x4f
-	.4byte	0x6869
-	.uleb128 0x4f
-	.4byte	0x6875
-	.uleb128 0x4f
-	.4byte	0x6881
-	.uleb128 0x4c
-	.4byte	0x6af8
+	.uleb128 0x50
+	.4byte	0x6886
+	.uleb128 0x50
+	.4byte	0x6892
+	.uleb128 0x50
+	.4byte	0x689e
+	.uleb128 0x4d
+	.4byte	0x6b15
 	.8byte	.LBB270
 	.4byte	.Ldebug_ranges0+0x140
 	.byte	0x1
 	.2byte	0x1b3
-	.4byte	0x6445
-	.uleb128 0x4d
-	.4byte	0x6b13
-	.uleb128 0x4d
-	.4byte	0x6b08
+	.4byte	0x6462
 	.uleb128 0x4e
+	.4byte	0x6b30
+	.uleb128 0x4e
+	.4byte	0x6b25
+	.uleb128 0x4f
 	.4byte	.Ldebug_ranges0+0x140
-	.uleb128 0x50
-	.4byte	0x6b1e
-	.4byte	.LLST11
-	.uleb128 0x50
-	.4byte	0x6b29
-	.4byte	.LLST12
-	.uleb128 0x50
-	.4byte	0x6b34
-	.4byte	.LLST13
-	.uleb128 0x4f
-	.4byte	0x6b3f
-	.uleb128 0x4f
-	.4byte	0x6b4a
-	.uleb128 0x4f
-	.4byte	0x6b54
 	.uleb128 0x51
-	.4byte	0x6b60
+	.4byte	0x6b3b
+	.4byte	.LLST11
+	.uleb128 0x51
+	.4byte	0x6b46
+	.4byte	.LLST12
+	.uleb128 0x51
+	.4byte	0x6b51
+	.4byte	.LLST13
+	.uleb128 0x50
+	.4byte	0x6b5c
+	.uleb128 0x50
+	.4byte	0x6b67
+	.uleb128 0x50
+	.4byte	0x6b71
+	.uleb128 0x52
+	.4byte	0x6b7d
 	.8byte	.LBB272
 	.4byte	.Ldebug_ranges0+0x170
 	.byte	0x1
 	.byte	0xe4
-	.uleb128 0x4d
-	.4byte	0x6b7b
-	.uleb128 0x4d
-	.4byte	0x6b70
 	.uleb128 0x4e
+	.4byte	0x6b98
+	.uleb128 0x4e
+	.4byte	0x6b8d
+	.uleb128 0x4f
 	.4byte	.Ldebug_ranges0+0x170
-	.uleb128 0x4f
-	.4byte	0x6b86
-	.uleb128 0x4f
-	.4byte	0x6b91
-	.uleb128 0x52
+	.uleb128 0x50
+	.4byte	0x6ba3
+	.uleb128 0x50
+	.4byte	0x6bae
+	.uleb128 0x53
 	.8byte	.LBB274
 	.8byte	.LBE274-.LBB274
-	.4byte	0x6431
-	.uleb128 0x4f
-	.4byte	0x6b9f
-	.uleb128 0x4f
-	.4byte	0x6baa
+	.4byte	0x644e
+	.uleb128 0x50
+	.4byte	0x6bbc
+	.uleb128 0x50
+	.4byte	0x6bc7
 	.byte	0
-	.uleb128 0x4e
+	.uleb128 0x4f
 	.4byte	.Ldebug_ranges0+0x1c0
-	.uleb128 0x4f
-	.4byte	0x6bb7
-	.uleb128 0x4f
-	.4byte	0x6bc2
+	.uleb128 0x50
+	.4byte	0x6bd4
+	.uleb128 0x50
+	.4byte	0x6bdf
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
-	.uleb128 0x53
-	.4byte	0x6adc
+	.uleb128 0x54
+	.4byte	0x6af9
 	.8byte	.LBB284
 	.8byte	.LBE284-.LBB284
 	.byte	0x1
 	.2byte	0x1b4
-	.4byte	0x6467
-	.uleb128 0x4d
-	.4byte	0x6aec
+	.4byte	0x6484
+	.uleb128 0x4e
+	.4byte	0x6b09
 	.byte	0
-	.uleb128 0x4a
+	.uleb128 0x4b
 	.8byte	.LVL42
-	.4byte	0x6a30
+	.4byte	0x6a4d
 	.byte	0
 	.byte	0
-	.uleb128 0x4c
-	.4byte	0x693c
+	.uleb128 0x4d
+	.4byte	0x6959
 	.8byte	.LBB288
 	.4byte	.Ldebug_ranges0+0x1f0
 	.byte	0x1
 	.2byte	0x1d8
-	.4byte	0x6692
-	.uleb128 0x4d
-	.4byte	0x694d
-	.uleb128 0x4d
-	.4byte	0x6959
+	.4byte	0x66af
 	.uleb128 0x4e
+	.4byte	0x696a
+	.uleb128 0x4e
+	.4byte	0x6976
+	.uleb128 0x4f
 	.4byte	.Ldebug_ranges0+0x1f0
-	.uleb128 0x4f
-	.4byte	0x6965
-	.uleb128 0x4f
-	.4byte	0x6971
-	.uleb128 0x4f
-	.4byte	0x697d
-	.uleb128 0x4f
-	.4byte	0x6989
-	.uleb128 0x4c
-	.4byte	0x6af8
+	.uleb128 0x50
+	.4byte	0x6982
+	.uleb128 0x50
+	.4byte	0x698e
+	.uleb128 0x50
+	.4byte	0x699a
+	.uleb128 0x50
+	.4byte	0x69a6
+	.uleb128 0x4d
+	.4byte	0x6b15
 	.8byte	.LBB290
 	.4byte	.Ldebug_ranges0+0x240
 	.byte	0x1
 	.2byte	0x149
-	.4byte	0x6562
-	.uleb128 0x4d
-	.4byte	0x6b13
-	.uleb128 0x4d
-	.4byte	0x6b08
+	.4byte	0x657f
 	.uleb128 0x4e
+	.4byte	0x6b30
+	.uleb128 0x4e
+	.4byte	0x6b25
+	.uleb128 0x4f
 	.4byte	.Ldebug_ranges0+0x240
-	.uleb128 0x50
-	.4byte	0x6b1e
-	.4byte	.LLST14
-	.uleb128 0x50
-	.4byte	0x6b29
-	.4byte	.LLST15
-	.uleb128 0x50
-	.4byte	0x6b34
-	.4byte	.LLST16
-	.uleb128 0x4f
-	.4byte	0x6b3f
-	.uleb128 0x4f
-	.4byte	0x6b4a
-	.uleb128 0x4f
-	.4byte	0x6b54
 	.uleb128 0x51
-	.4byte	0x6b60
+	.4byte	0x6b3b
+	.4byte	.LLST14
+	.uleb128 0x51
+	.4byte	0x6b46
+	.4byte	.LLST15
+	.uleb128 0x51
+	.4byte	0x6b51
+	.4byte	.LLST16
+	.uleb128 0x50
+	.4byte	0x6b5c
+	.uleb128 0x50
+	.4byte	0x6b67
+	.uleb128 0x50
+	.4byte	0x6b71
+	.uleb128 0x52
+	.4byte	0x6b7d
 	.8byte	.LBB292
 	.4byte	.Ldebug_ranges0+0x270
 	.byte	0x1
 	.byte	0xe4
-	.uleb128 0x4d
-	.4byte	0x6b7b
-	.uleb128 0x4d
-	.4byte	0x6b70
 	.uleb128 0x4e
+	.4byte	0x6b98
+	.uleb128 0x4e
+	.4byte	0x6b8d
+	.uleb128 0x4f
 	.4byte	.Ldebug_ranges0+0x270
-	.uleb128 0x4f
-	.4byte	0x6b86
-	.uleb128 0x4f
-	.4byte	0x6b91
-	.uleb128 0x52
+	.uleb128 0x50
+	.4byte	0x6ba3
+	.uleb128 0x50
+	.4byte	0x6bae
+	.uleb128 0x53
 	.8byte	.LBB294
 	.8byte	.LBE294-.LBB294
-	.4byte	0x654e
-	.uleb128 0x4f
-	.4byte	0x6b9f
-	.uleb128 0x4f
-	.4byte	0x6baa
+	.4byte	0x656b
+	.uleb128 0x50
+	.4byte	0x6bbc
+	.uleb128 0x50
+	.4byte	0x6bc7
 	.byte	0
-	.uleb128 0x4e
+	.uleb128 0x4f
 	.4byte	.Ldebug_ranges0+0x2c0
-	.uleb128 0x4f
-	.4byte	0x6bb7
-	.uleb128 0x4f
-	.4byte	0x6bc2
+	.uleb128 0x50
+	.4byte	0x6bd4
+	.uleb128 0x50
+	.4byte	0x6bdf
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
-	.uleb128 0x53
-	.4byte	0x6adc
+	.uleb128 0x54
+	.4byte	0x6af9
 	.8byte	.LBB304
 	.8byte	.LBE304-.LBB304
 	.byte	0x1
 	.2byte	0x14a
-	.4byte	0x6584
-	.uleb128 0x4d
-	.4byte	0x6aec
+	.4byte	0x65a1
+	.uleb128 0x4e
+	.4byte	0x6b09
 	.byte	0
-	.uleb128 0x53
-	.4byte	0x6996
+	.uleb128 0x54
+	.4byte	0x69b3
 	.8byte	.LBB306
 	.8byte	.LBE306-.LBB306
 	.byte	0x1
 	.2byte	0x155
-	.4byte	0x6669
-	.uleb128 0x4d
-	.4byte	0x69a6
-	.uleb128 0x4d
-	.4byte	0x69a6
-	.uleb128 0x54
+	.4byte	0x6686
+	.uleb128 0x4e
+	.4byte	0x69c3
+	.uleb128 0x4e
+	.4byte	0x69c3
+	.uleb128 0x55
 	.8byte	.LBB307
 	.8byte	.LBE307-.LBB307
-	.uleb128 0x4f
-	.4byte	0x69b1
-	.uleb128 0x4f
-	.4byte	0x69bd
-	.uleb128 0x4f
-	.4byte	0x69c9
-	.uleb128 0x4f
-	.4byte	0x69d3
-	.uleb128 0x4f
-	.4byte	0x69dd
-	.uleb128 0x4f
-	.4byte	0x69e7
 	.uleb128 0x50
-	.4byte	0x69f1
+	.4byte	0x69ce
+	.uleb128 0x50
+	.4byte	0x69da
+	.uleb128 0x50
+	.4byte	0x69e6
+	.uleb128 0x50
+	.4byte	0x69f0
+	.uleb128 0x50
+	.4byte	0x69fa
+	.uleb128 0x50
+	.4byte	0x6a04
+	.uleb128 0x51
+	.4byte	0x6a0e
 	.4byte	.LLST17
-	.uleb128 0x4f
-	.4byte	0x69fd
-	.uleb128 0x4f
-	.4byte	0x6a09
-	.uleb128 0x53
-	.4byte	0x6e39
+	.uleb128 0x50
+	.4byte	0x6a1a
+	.uleb128 0x50
+	.4byte	0x6a26
+	.uleb128 0x54
+	.4byte	0x6e56
 	.8byte	.LBB308
 	.8byte	.LBE308-.LBB308
 	.byte	0x1
 	.2byte	0x109
-	.4byte	0x6643
-	.uleb128 0x4d
-	.4byte	0x6e56
-	.uleb128 0x4d
-	.4byte	0x6e4a
-	.uleb128 0x55
-	.4byte	0x6e63
+	.4byte	0x6660
+	.uleb128 0x4e
+	.4byte	0x6e73
+	.uleb128 0x4e
+	.4byte	0x6e67
+	.uleb128 0x56
+	.4byte	0x6e80
 	.8byte	.LBB309
 	.8byte	.LBE309-.LBB309
 	.byte	0x2
 	.2byte	0x2e7
-	.uleb128 0x4d
-	.4byte	0x6e80
-	.uleb128 0x4d
-	.4byte	0x6e74
-	.uleb128 0x4a
+	.uleb128 0x4e
+	.4byte	0x6e9d
+	.uleb128 0x4e
+	.4byte	0x6e91
+	.uleb128 0x4b
 	.8byte	.LVL50
-	.4byte	0x711e
+	.4byte	0x713b
 	.byte	0
 	.byte	0
-	.uleb128 0x54
+	.uleb128 0x55
 	.8byte	.LBB311
 	.8byte	.LBE311-.LBB311
-	.uleb128 0x50
-	.4byte	0x6a16
+	.uleb128 0x51
+	.4byte	0x6a33
 	.4byte	.LLST18
-	.uleb128 0x50
-	.4byte	0x6a22
+	.uleb128 0x51
+	.4byte	0x6a3f
 	.4byte	.LLST19
 	.byte	0
 	.byte	0
 	.byte	0
-	.uleb128 0x4a
+	.uleb128 0x4b
 	.8byte	.LVL49
-	.4byte	0x6a30
-	.uleb128 0x4a
+	.4byte	0x6a4d
+	.uleb128 0x4b
 	.8byte	.LVL56
-	.4byte	0x70fd
-	.uleb128 0x4a
+	.4byte	0x711a
+	.uleb128 0x4b
 	.8byte	.LVL72
-	.4byte	0x70fd
+	.4byte	0x711a
 	.byte	0
 	.byte	0
-	.uleb128 0x53
-	.4byte	0x6894
+	.uleb128 0x54
+	.4byte	0x68b1
 	.8byte	.LBB317
 	.8byte	.LBE317-.LBB317
 	.byte	0x1
 	.2byte	0x1fc
-	.4byte	0x6797
-	.uleb128 0x4d
-	.4byte	0x68a5
-	.uleb128 0x4d
-	.4byte	0x68b1
-	.uleb128 0x54
+	.4byte	0x67b4
+	.uleb128 0x4e
+	.4byte	0x68c2
+	.uleb128 0x4e
+	.4byte	0x68ce
+	.uleb128 0x55
 	.8byte	.LBB318
 	.8byte	.LBE318-.LBB318
-	.uleb128 0x4f
-	.4byte	0x68bd
-	.uleb128 0x4f
-	.4byte	0x68c9
-	.uleb128 0x4f
-	.4byte	0x68d5
-	.uleb128 0x55
-	.4byte	0x6af8
+	.uleb128 0x50
+	.4byte	0x68da
+	.uleb128 0x50
+	.4byte	0x68e6
+	.uleb128 0x50
+	.4byte	0x68f2
+	.uleb128 0x56
+	.4byte	0x6b15
 	.8byte	.LBB319
 	.8byte	.LBE319-.LBB319
 	.byte	0x1
 	.2byte	0x179
-	.uleb128 0x4d
-	.4byte	0x6b13
-	.uleb128 0x4d
-	.4byte	0x6b08
-	.uleb128 0x54
+	.uleb128 0x4e
+	.4byte	0x6b30
+	.uleb128 0x4e
+	.4byte	0x6b25
+	.uleb128 0x55
 	.8byte	.LBB320
 	.8byte	.LBE320-.LBB320
-	.uleb128 0x50
-	.4byte	0x6b1e
-	.4byte	.LLST20
-	.uleb128 0x50
-	.4byte	0x6b29
-	.4byte	.LLST21
-	.uleb128 0x50
-	.4byte	0x6b34
-	.4byte	.LLST22
-	.uleb128 0x4f
-	.4byte	0x6b3f
-	.uleb128 0x4f
-	.4byte	0x6b4a
-	.uleb128 0x4f
-	.4byte	0x6b54
 	.uleb128 0x51
-	.4byte	0x6b60
+	.4byte	0x6b3b
+	.4byte	.LLST20
+	.uleb128 0x51
+	.4byte	0x6b46
+	.4byte	.LLST21
+	.uleb128 0x51
+	.4byte	0x6b51
+	.4byte	.LLST22
+	.uleb128 0x50
+	.4byte	0x6b5c
+	.uleb128 0x50
+	.4byte	0x6b67
+	.uleb128 0x50
+	.4byte	0x6b71
+	.uleb128 0x52
+	.4byte	0x6b7d
 	.8byte	.LBB321
 	.4byte	.Ldebug_ranges0+0x2f0
 	.byte	0x1
 	.byte	0xe4
-	.uleb128 0x4d
-	.4byte	0x6b7b
-	.uleb128 0x4d
-	.4byte	0x6b70
 	.uleb128 0x4e
+	.4byte	0x6b98
+	.uleb128 0x4e
+	.4byte	0x6b8d
+	.uleb128 0x4f
 	.4byte	.Ldebug_ranges0+0x2f0
-	.uleb128 0x4f
-	.4byte	0x6b86
-	.uleb128 0x4f
-	.4byte	0x6b91
-	.uleb128 0x52
+	.uleb128 0x50
+	.4byte	0x6ba3
+	.uleb128 0x50
+	.4byte	0x6bae
+	.uleb128 0x53
 	.8byte	.LBB323
 	.8byte	.LBE323-.LBB323
-	.4byte	0x6781
-	.uleb128 0x4f
-	.4byte	0x6b9f
-	.uleb128 0x4f
-	.4byte	0x6baa
+	.4byte	0x679e
+	.uleb128 0x50
+	.4byte	0x6bbc
+	.uleb128 0x50
+	.4byte	0x6bc7
 	.byte	0
-	.uleb128 0x4e
+	.uleb128 0x4f
 	.4byte	.Ldebug_ranges0+0x330
-	.uleb128 0x4f
-	.4byte	0x6bb7
-	.uleb128 0x4f
-	.4byte	0x6bc2
+	.uleb128 0x50
+	.4byte	0x6bd4
+	.uleb128 0x50
+	.4byte	0x6bdf
 	.byte	0
 	.byte	0
 	.byte	0
@@ -13894,64 +13917,64 @@
 	.byte	0
 	.byte	0
 	.byte	0
-	.uleb128 0x4a
+	.uleb128 0x4b
 	.8byte	.LVL58
-	.4byte	0x6fe7
-	.uleb128 0x4a
+	.4byte	0x7004
+	.uleb128 0x4b
 	.8byte	.LVL61
-	.4byte	0x6fe7
-	.uleb128 0x4a
+	.4byte	0x7004
+	.uleb128 0x4b
 	.8byte	.LVL64
-	.4byte	0x6fe7
-	.uleb128 0x4a
+	.4byte	0x7004
+	.uleb128 0x4b
 	.8byte	.LVL75
-	.4byte	0x6fe7
+	.4byte	0x7004
 	.byte	0
-	.uleb128 0x56
+	.uleb128 0x57
 	.4byte	.LASF1475
 	.byte	0x1
 	.2byte	0x1bf
 	.4byte	0xc0
 	.byte	0x1
-	.4byte	0x6840
-	.uleb128 0x57
+	.4byte	0x685d
+	.uleb128 0x58
 	.4byte	.LASF739
 	.byte	0x1
 	.2byte	0x1bf
-	.4byte	0x62fa
-	.uleb128 0x57
+	.4byte	0x6317
+	.uleb128 0x58
 	.4byte	.LASF1432
 	.byte	0x1
 	.2byte	0x1bf
 	.4byte	0x6044
-	.uleb128 0x57
+	.uleb128 0x58
 	.4byte	.LASF1431
 	.byte	0x1
 	.2byte	0x1bf
 	.4byte	0xc0
-	.uleb128 0x58
+	.uleb128 0x59
 	.string	"i"
 	.byte	0x1
 	.2byte	0x1c1
 	.4byte	0xc0
-	.uleb128 0x49
+	.uleb128 0x4a
 	.4byte	.LASF1471
 	.byte	0x1
 	.2byte	0x1c2
 	.4byte	0x120
-	.uleb128 0x49
+	.uleb128 0x4a
 	.4byte	.LASF1472
 	.byte	0x1
 	.2byte	0x1c2
 	.4byte	0x120
-	.uleb128 0x59
-	.uleb128 0x49
+	.uleb128 0x5a
+	.uleb128 0x4a
 	.4byte	.LASF1473
 	.byte	0x1
 	.2byte	0x1c5
 	.4byte	0x2d56
-	.uleb128 0x59
-	.uleb128 0x49
+	.uleb128 0x5a
+	.uleb128 0x4a
 	.4byte	.LASF1474
 	.byte	0x1
 	.2byte	0x1c8
@@ -13959,34 +13982,34 @@
 	.byte	0
 	.byte	0
 	.byte	0
-	.uleb128 0x56
+	.uleb128 0x57
 	.4byte	.LASF1476
 	.byte	0x1
 	.2byte	0x1ad
 	.4byte	0xc0
 	.byte	0x1
-	.4byte	0x688e
-	.uleb128 0x57
+	.4byte	0x68ab
+	.uleb128 0x58
 	.4byte	.LASF1465
 	.byte	0x1
 	.2byte	0x1ad
-	.4byte	0x62fa
-	.uleb128 0x57
+	.4byte	0x6317
+	.uleb128 0x58
 	.4byte	.LASF1477
 	.byte	0x1
 	.2byte	0x1ad
 	.4byte	0xc0
-	.uleb128 0x49
+	.uleb128 0x4a
 	.4byte	.LASF1478
 	.byte	0x1
 	.2byte	0x1af
-	.4byte	0x688e
-	.uleb128 0x49
+	.4byte	0x68ab
+	.uleb128 0x4a
 	.4byte	.LASF1431
 	.byte	0x1
 	.2byte	0x1b0
 	.4byte	0x6c
-	.uleb128 0x49
+	.uleb128 0x4a
 	.4byte	.LASF1442
 	.byte	0x1
 	.2byte	0x1b1
@@ -13995,186 +14018,186 @@
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0x97
-	.uleb128 0x56
+	.uleb128 0x57
 	.4byte	.LASF1479
 	.byte	0x1
 	.2byte	0x172
 	.4byte	0xc0
 	.byte	0x1
-	.4byte	0x68e2
-	.uleb128 0x57
+	.4byte	0x68ff
+	.uleb128 0x58
 	.4byte	.LASF1465
 	.byte	0x1
 	.2byte	0x172
-	.4byte	0x62fa
-	.uleb128 0x57
+	.4byte	0x6317
+	.uleb128 0x58
 	.4byte	.LASF1477
 	.byte	0x1
 	.2byte	0x172
 	.4byte	0xc0
-	.uleb128 0x49
+	.uleb128 0x4a
 	.4byte	.LASF1478
 	.byte	0x1
 	.2byte	0x174
-	.4byte	0x688e
-	.uleb128 0x49
+	.4byte	0x68ab
+	.uleb128 0x4a
 	.4byte	.LASF1431
 	.byte	0x1
 	.2byte	0x175
 	.4byte	0x6c
-	.uleb128 0x49
+	.uleb128 0x4a
 	.4byte	.LASF1442
 	.byte	0x1
 	.2byte	0x176
 	.4byte	0x6c
 	.byte	0
-	.uleb128 0x56
+	.uleb128 0x57
 	.4byte	.LASF1480
 	.byte	0x1
 	.2byte	0x15f
 	.4byte	0xc0
 	.byte	0x1
-	.4byte	0x693c
-	.uleb128 0x57
+	.4byte	0x6959
+	.uleb128 0x58
 	.4byte	.LASF1465
 	.byte	0x1
 	.2byte	0x15f
-	.4byte	0x62fa
-	.uleb128 0x57
+	.4byte	0x6317
+	.uleb128 0x58
 	.4byte	.LASF1477
 	.byte	0x1
 	.2byte	0x15f
 	.4byte	0xc0
-	.uleb128 0x57
+	.uleb128 0x58
 	.4byte	.LASF1466
 	.byte	0x1
 	.2byte	0x15f
 	.4byte	0x604a
-	.uleb128 0x49
+	.uleb128 0x4a
 	.4byte	.LASF1478
 	.byte	0x1
 	.2byte	0x161
-	.4byte	0x688e
-	.uleb128 0x49
+	.4byte	0x68ab
+	.uleb128 0x4a
 	.4byte	.LASF1431
 	.byte	0x1
 	.2byte	0x162
 	.4byte	0x6c
-	.uleb128 0x49
+	.uleb128 0x4a
 	.4byte	.LASF1442
 	.byte	0x1
 	.2byte	0x163
 	.4byte	0x6c
 	.byte	0
-	.uleb128 0x56
+	.uleb128 0x57
 	.4byte	.LASF1481
 	.byte	0x1
 	.2byte	0x141
 	.4byte	0xc0
 	.byte	0x1
-	.4byte	0x6996
-	.uleb128 0x57
+	.4byte	0x69b3
+	.uleb128 0x58
 	.4byte	.LASF1465
 	.byte	0x1
 	.2byte	0x141
-	.4byte	0x62fa
-	.uleb128 0x57
+	.4byte	0x6317
+	.uleb128 0x58
 	.4byte	.LASF1477
 	.byte	0x1
 	.2byte	0x141
 	.4byte	0xc0
-	.uleb128 0x49
+	.uleb128 0x4a
 	.4byte	.LASF1482
 	.byte	0x1
 	.2byte	0x143
 	.4byte	0x6003
-	.uleb128 0x49
+	.uleb128 0x4a
 	.4byte	.LASF1478
 	.byte	0x1
 	.2byte	0x144
-	.4byte	0x688e
-	.uleb128 0x49
+	.4byte	0x68ab
+	.uleb128 0x4a
 	.4byte	.LASF1431
 	.byte	0x1
 	.2byte	0x145
 	.4byte	0x6c
-	.uleb128 0x49
+	.uleb128 0x4a
 	.4byte	.LASF1442
 	.byte	0x1
 	.2byte	0x146
 	.4byte	0x6c
 	.byte	0
-	.uleb128 0x5a
+	.uleb128 0x5b
 	.4byte	.LASF1483
 	.byte	0x1
 	.byte	0xfe
 	.4byte	0x2d56
 	.byte	0x1
-	.4byte	0x6a30
-	.uleb128 0x5b
+	.4byte	0x6a4d
+	.uleb128 0x5c
 	.4byte	.LASF1482
 	.byte	0x1
 	.byte	0xfe
-	.4byte	0x62fa
-	.uleb128 0x49
+	.4byte	0x6317
+	.uleb128 0x4a
 	.4byte	.LASF1484
 	.byte	0x1
 	.2byte	0x100
 	.4byte	0x2d56
-	.uleb128 0x49
+	.uleb128 0x4a
 	.4byte	.LASF1485
 	.byte	0x1
 	.2byte	0x100
 	.4byte	0x2d56
-	.uleb128 0x58
+	.uleb128 0x59
 	.string	"i"
 	.byte	0x1
 	.2byte	0x101
 	.4byte	0xc0
-	.uleb128 0x58
+	.uleb128 0x59
 	.string	"j"
 	.byte	0x1
 	.2byte	0x101
 	.4byte	0xc0
-	.uleb128 0x58
+	.uleb128 0x59
 	.string	"k"
 	.byte	0x1
 	.2byte	0x101
 	.4byte	0xc0
-	.uleb128 0x58
+	.uleb128 0x59
 	.string	"h"
 	.byte	0x1
 	.2byte	0x101
 	.4byte	0xc0
-	.uleb128 0x49
+	.uleb128 0x4a
 	.4byte	.LASF1486
 	.byte	0x1
 	.2byte	0x102
 	.4byte	0xc0
-	.uleb128 0x58
+	.uleb128 0x59
 	.string	"num"
 	.byte	0x1
 	.2byte	0x103
 	.4byte	0xc0
-	.uleb128 0x58
+	.uleb128 0x59
 	.string	"len"
 	.byte	0x1
 	.2byte	0x104
 	.4byte	0xc0
-	.uleb128 0x59
-	.uleb128 0x49
+	.uleb128 0x5a
+	.uleb128 0x4a
 	.4byte	.LASF1477
 	.byte	0x1
 	.2byte	0x110
 	.4byte	0xc0
-	.uleb128 0x49
+	.uleb128 0x4a
 	.4byte	.LASF1487
 	.byte	0x1
 	.2byte	0x111
 	.4byte	0xc0
 	.byte	0
 	.byte	0
-	.uleb128 0x5c
+	.uleb128 0x5d
 	.4byte	.LASF1489
 	.byte	0x1
 	.byte	0xf0
@@ -14183,172 +14206,172 @@
 	.8byte	.LFE1557-.LFB1557
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x6ad6
-	.uleb128 0x5d
+	.4byte	0x6af3
+	.uleb128 0x5e
 	.4byte	.LASF1478
 	.byte	0x1
 	.byte	0xf0
-	.4byte	0x688e
+	.4byte	0x68ab
 	.4byte	.LLST0
-	.uleb128 0x5d
+	.uleb128 0x5e
 	.4byte	.LASF1442
 	.byte	0x1
 	.byte	0xf1
 	.4byte	0x6c
 	.4byte	.LLST1
-	.uleb128 0x5e
+	.uleb128 0x5f
 	.string	"out"
 	.byte	0x1
 	.byte	0xf3
-	.4byte	0x6ad6
-	.uleb128 0x5f
-	.4byte	0x6e39
+	.4byte	0x6af3
+	.uleb128 0x60
+	.4byte	0x6e56
 	.8byte	.LBB185
 	.4byte	.Ldebug_ranges0+0
 	.byte	0x1
 	.byte	0xf5
-	.4byte	0x6ac8
-	.uleb128 0x4d
-	.4byte	0x6e56
-	.uleb128 0x4d
-	.4byte	0x6e4a
-	.uleb128 0x60
-	.4byte	0x6e63
+	.4byte	0x6ae5
+	.uleb128 0x4e
+	.4byte	0x6e73
+	.uleb128 0x4e
+	.4byte	0x6e67
+	.uleb128 0x61
+	.4byte	0x6e80
 	.8byte	.LBB186
 	.4byte	.Ldebug_ranges0+0
 	.byte	0x2
 	.2byte	0x2e7
-	.uleb128 0x4d
-	.4byte	0x6e80
-	.uleb128 0x4d
-	.4byte	0x6e74
-	.uleb128 0x4a
+	.uleb128 0x4e
+	.4byte	0x6e9d
+	.uleb128 0x4e
+	.4byte	0x6e91
+	.uleb128 0x4b
 	.8byte	.LVL3
-	.4byte	0x711e
+	.4byte	0x713b
 	.byte	0
 	.byte	0
-	.uleb128 0x4a
+	.uleb128 0x4b
 	.8byte	.LVL4
-	.4byte	0x712a
+	.4byte	0x7147
 	.byte	0
 	.uleb128 0x7
 	.byte	0x8
 	.4byte	0x90
-	.uleb128 0x5a
+	.uleb128 0x5b
 	.4byte	.LASF1490
 	.byte	0x1
 	.byte	0xeb
 	.4byte	0x90
 	.byte	0x3
-	.4byte	0x6af8
-	.uleb128 0x5b
+	.4byte	0x6b15
+	.uleb128 0x5c
 	.4byte	.LASF1478
 	.byte	0x1
 	.byte	0xeb
-	.4byte	0x688e
+	.4byte	0x68ab
 	.byte	0
-	.uleb128 0x5a
+	.uleb128 0x5b
 	.4byte	.LASF1491
 	.byte	0x1
 	.byte	0xba
-	.4byte	0x688e
+	.4byte	0x68ab
 	.byte	0x1
-	.4byte	0x6b60
-	.uleb128 0x5b
+	.4byte	0x6b7d
+	.uleb128 0x5c
 	.4byte	.LASF1477
 	.byte	0x1
 	.byte	0xba
 	.4byte	0xc0
-	.uleb128 0x5b
+	.uleb128 0x5c
 	.4byte	.LASF822
 	.byte	0x1
 	.byte	0xba
 	.4byte	0xc0
-	.uleb128 0x61
+	.uleb128 0x62
 	.4byte	.LASF1492
 	.byte	0x1
 	.byte	0xbc
 	.4byte	0x61d0
-	.uleb128 0x61
+	.uleb128 0x62
 	.4byte	.LASF856
 	.byte	0x1
 	.byte	0xbd
 	.4byte	0x2d56
-	.uleb128 0x61
+	.uleb128 0x62
 	.4byte	.LASF1493
 	.byte	0x1
 	.byte	0xbe
 	.4byte	0x1e1
-	.uleb128 0x61
+	.uleb128 0x62
 	.4byte	.LASF1494
 	.byte	0x1
 	.byte	0xbf
 	.4byte	0x6c
-	.uleb128 0x5e
+	.uleb128 0x5f
 	.string	"pt"
 	.byte	0x1
 	.byte	0xc0
 	.4byte	0x6c
-	.uleb128 0x61
+	.uleb128 0x62
 	.4byte	.LASF1478
 	.byte	0x1
 	.byte	0xc1
 	.4byte	0x442
 	.byte	0
-	.uleb128 0x5a
+	.uleb128 0x5b
 	.4byte	.LASF1495
 	.byte	0x1
 	.byte	0xa8
 	.4byte	0xc0
 	.byte	0x1
-	.4byte	0x6bcf
-	.uleb128 0x5b
+	.4byte	0x6bec
+	.uleb128 0x5c
 	.4byte	.LASF856
 	.byte	0x1
 	.byte	0xa8
 	.4byte	0x1e1
-	.uleb128 0x5b
+	.uleb128 0x5c
 	.4byte	.LASF1477
 	.byte	0x1
 	.byte	0xa8
 	.4byte	0xc0
-	.uleb128 0x61
+	.uleb128 0x62
 	.4byte	.LASF884
 	.byte	0x1
 	.byte	0xaa
 	.4byte	0xc0
-	.uleb128 0x5e
+	.uleb128 0x5f
 	.string	"i"
 	.byte	0x1
 	.byte	0xab
 	.4byte	0xc0
+	.uleb128 0x63
+	.4byte	0x6bd3
 	.uleb128 0x62
-	.4byte	0x6bb6
-	.uleb128 0x61
 	.4byte	.LASF1496
 	.byte	0x1
 	.byte	0xad
 	.4byte	0xc0
-	.uleb128 0x61
+	.uleb128 0x62
 	.4byte	.LASF1497
 	.byte	0x1
 	.byte	0xad
 	.4byte	0xc0
 	.byte	0
-	.uleb128 0x59
-	.uleb128 0x61
+	.uleb128 0x5a
+	.uleb128 0x62
 	.4byte	.LASF1498
 	.byte	0x1
 	.byte	0xae
 	.4byte	0xc0
-	.uleb128 0x61
+	.uleb128 0x62
 	.4byte	.LASF1499
 	.byte	0x1
 	.byte	0xae
 	.4byte	0xc0
 	.byte	0
 	.byte	0
-	.uleb128 0x63
+	.uleb128 0x64
 	.4byte	.LASF1536
 	.byte	0x1
 	.byte	0xa0
@@ -14357,7 +14380,7 @@
 	.8byte	.LFE1553-.LFB1553
 	.uleb128 0x1
 	.byte	0x9c
-	.uleb128 0x64
+	.uleb128 0x65
 	.4byte	.LASF1501
 	.byte	0x1
 	.byte	0x7f
@@ -14366,526 +14389,526 @@
 	.8byte	.LFE1552-.LFB1552
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x6d65
-	.uleb128 0x5d
+	.4byte	0x6d82
+	.uleb128 0x5e
 	.4byte	.LASF1502
 	.byte	0x1
 	.byte	0x7f
 	.4byte	0x442
 	.4byte	.LLST23
-	.uleb128 0x5e
+	.uleb128 0x5f
 	.string	"ret"
 	.byte	0x1
 	.byte	0x81
 	.4byte	0xc0
-	.uleb128 0x5e
+	.uleb128 0x5f
 	.string	"wf"
 	.byte	0x1
 	.byte	0x82
 	.4byte	0x61d0
-	.uleb128 0x5f
-	.4byte	0x6d97
+	.uleb128 0x60
+	.4byte	0x6db4
 	.8byte	.LBB341
 	.4byte	.Ldebug_ranges0+0x360
 	.byte	0x1
 	.byte	0x87
-	.4byte	0x6c68
-	.uleb128 0x4d
-	.4byte	0x6da7
-	.uleb128 0x4a
+	.4byte	0x6c85
+	.uleb128 0x4e
+	.4byte	0x6dc4
+	.uleb128 0x4b
 	.8byte	.LVL81
-	.4byte	0x7133
-	.uleb128 0x4a
+	.4byte	0x7150
+	.uleb128 0x4b
 	.8byte	.LVL102
-	.4byte	0x7113
+	.4byte	0x7130
 	.byte	0
-	.uleb128 0x5f
-	.4byte	0x6d65
+	.uleb128 0x60
+	.4byte	0x6d82
 	.8byte	.LBB344
 	.4byte	.Ldebug_ranges0+0x390
 	.byte	0x1
 	.byte	0x8d
-	.4byte	0x6d3d
-	.uleb128 0x4d
-	.4byte	0x6d75
+	.4byte	0x6d5a
 	.uleb128 0x4e
-	.4byte	.Ldebug_ranges0+0x390
+	.4byte	0x6d92
 	.uleb128 0x4f
-	.4byte	0x6d80
+	.4byte	.Ldebug_ranges0+0x390
 	.uleb128 0x50
-	.4byte	0x6d8b
+	.4byte	0x6d9d
+	.uleb128 0x51
+	.4byte	0x6da8
 	.4byte	.LLST24
-	.uleb128 0x65
-	.4byte	0x6db3
+	.uleb128 0x66
+	.4byte	0x6dd0
 	.8byte	.LBB346
 	.8byte	.LBE346-.LBB346
 	.byte	0x1
 	.byte	0x6e
-	.4byte	0x6d2e
-	.uleb128 0x4d
-	.4byte	0x6dce
-	.uleb128 0x4d
-	.4byte	0x6dc3
-	.uleb128 0x54
+	.4byte	0x6d4b
+	.uleb128 0x4e
+	.4byte	0x6deb
+	.uleb128 0x4e
+	.4byte	0x6de0
+	.uleb128 0x55
 	.8byte	.LBB347
 	.8byte	.LBE347-.LBB347
-	.uleb128 0x4f
-	.4byte	0x6dd9
 	.uleb128 0x50
-	.4byte	0x6de2
+	.4byte	0x6df6
+	.uleb128 0x51
+	.4byte	0x6dff
 	.4byte	.LLST25
-	.uleb128 0x5f
-	.4byte	0x6dee
+	.uleb128 0x60
+	.4byte	0x6e0b
 	.8byte	.LBB348
 	.4byte	.Ldebug_ranges0+0x3c0
 	.byte	0x1
 	.byte	0x54
-	.4byte	0x6d1f
-	.uleb128 0x4d
-	.4byte	0x6e05
-	.uleb128 0x4d
-	.4byte	0x6dfa
+	.4byte	0x6d3c
 	.uleb128 0x4e
-	.4byte	.Ldebug_ranges0+0x3c0
-	.uleb128 0x4f
-	.4byte	0x6e10
-	.uleb128 0x4f
-	.4byte	0x6e19
-	.uleb128 0x50
 	.4byte	0x6e22
-	.4byte	.LLST26
+	.uleb128 0x4e
+	.4byte	0x6e17
+	.uleb128 0x4f
+	.4byte	.Ldebug_ranges0+0x3c0
 	.uleb128 0x50
 	.4byte	0x6e2d
+	.uleb128 0x50
+	.4byte	0x6e36
+	.uleb128 0x51
+	.4byte	0x6e3f
+	.4byte	.LLST26
+	.uleb128 0x51
+	.4byte	0x6e4a
 	.4byte	.LLST27
 	.byte	0
 	.byte	0
-	.uleb128 0x4a
+	.uleb128 0x4b
 	.8byte	.LVL82
-	.4byte	0x713e
+	.4byte	0x715b
 	.byte	0
 	.byte	0
-	.uleb128 0x4a
+	.uleb128 0x4b
 	.8byte	.LVL97
-	.4byte	0x7113
+	.4byte	0x7130
 	.byte	0
 	.byte	0
-	.uleb128 0x4a
+	.uleb128 0x4b
 	.8byte	.LVL91
-	.4byte	0x7113
-	.uleb128 0x4a
+	.4byte	0x7130
+	.uleb128 0x4b
 	.8byte	.LVL98
-	.4byte	0x7113
-	.uleb128 0x4a
+	.4byte	0x7130
+	.uleb128 0x4b
 	.8byte	.LVL103
-	.4byte	0x7113
+	.4byte	0x7130
 	.byte	0
-	.uleb128 0x5a
+	.uleb128 0x5b
 	.4byte	.LASF1503
 	.byte	0x1
 	.byte	0x65
 	.4byte	0xc0
 	.byte	0x1
-	.4byte	0x6d97
-	.uleb128 0x5b
+	.4byte	0x6db4
+	.uleb128 0x5c
 	.4byte	.LASF1492
 	.byte	0x1
 	.byte	0x65
 	.4byte	0x61d0
-	.uleb128 0x61
+	.uleb128 0x62
 	.4byte	.LASF1504
 	.byte	0x1
 	.byte	0x67
 	.4byte	0x120
-	.uleb128 0x61
+	.uleb128 0x62
 	.4byte	.LASF1505
 	.byte	0x1
 	.byte	0x68
 	.4byte	0x120
 	.byte	0
-	.uleb128 0x5a
+	.uleb128 0x5b
 	.4byte	.LASF1506
 	.byte	0x1
 	.byte	0x5b
 	.4byte	0xc0
 	.byte	0x1
-	.4byte	0x6db3
-	.uleb128 0x66
+	.4byte	0x6dd0
+	.uleb128 0x67
 	.string	"buf"
 	.byte	0x1
 	.byte	0x5b
 	.4byte	0x6044
 	.byte	0
-	.uleb128 0x5a
+	.uleb128 0x5b
 	.4byte	.LASF1507
 	.byte	0x1
 	.byte	0x4e
 	.4byte	0x6c
 	.byte	0x1
-	.4byte	0x6dee
-	.uleb128 0x5b
+	.4byte	0x6e0b
+	.uleb128 0x5c
 	.4byte	.LASF1508
 	.byte	0x1
 	.byte	0x4e
-	.4byte	0x6ad6
-	.uleb128 0x5b
+	.4byte	0x6af3
+	.uleb128 0x5c
 	.4byte	.LASF1509
 	.byte	0x1
 	.byte	0x4e
 	.4byte	0x6c
-	.uleb128 0x5e
+	.uleb128 0x5f
 	.string	"i"
 	.byte	0x1
 	.byte	0x50
 	.4byte	0x6c
-	.uleb128 0x61
+	.uleb128 0x62
 	.4byte	.LASF1510
 	.byte	0x1
 	.byte	0x51
 	.4byte	0x6c
 	.byte	0
-	.uleb128 0x67
+	.uleb128 0x68
 	.4byte	.LASF1537
 	.byte	0x1
 	.byte	0x3a
 	.byte	0x1
-	.4byte	0x6e39
-	.uleb128 0x5b
+	.4byte	0x6e56
+	.uleb128 0x5c
 	.4byte	.LASF1511
 	.byte	0x1
 	.byte	0x3a
 	.4byte	0x6c
-	.uleb128 0x5b
+	.uleb128 0x5c
 	.4byte	.LASF1512
 	.byte	0x1
 	.byte	0x3a
 	.4byte	0x2d56
-	.uleb128 0x5e
+	.uleb128 0x5f
 	.string	"i"
 	.byte	0x1
 	.byte	0x3c
 	.4byte	0x6c
-	.uleb128 0x5e
+	.uleb128 0x5f
 	.string	"j"
 	.byte	0x1
 	.byte	0x3c
 	.4byte	0x6c
-	.uleb128 0x61
+	.uleb128 0x62
 	.4byte	.LASF1513
 	.byte	0x1
 	.byte	0x3d
 	.4byte	0x6c
-	.uleb128 0x61
+	.uleb128 0x62
 	.4byte	.LASF1510
 	.byte	0x1
 	.byte	0x3e
 	.4byte	0x6c
 	.byte	0
-	.uleb128 0x56
+	.uleb128 0x57
 	.4byte	.LASF1514
 	.byte	0x2
 	.2byte	0x2e5
 	.4byte	0x442
 	.byte	0x3
-	.4byte	0x6e63
-	.uleb128 0x57
+	.4byte	0x6e80
+	.uleb128 0x58
 	.4byte	.LASF826
 	.byte	0x2
 	.2byte	0x2e5
 	.4byte	0x261
-	.uleb128 0x57
+	.uleb128 0x58
 	.4byte	.LASF61
 	.byte	0x2
 	.2byte	0x2e5
 	.4byte	0x277
 	.byte	0
-	.uleb128 0x56
+	.uleb128 0x57
 	.4byte	.LASF1515
 	.byte	0x2
 	.2byte	0x216
 	.4byte	0x442
 	.byte	0x3
-	.4byte	0x6e9b
-	.uleb128 0x57
+	.4byte	0x6eb8
+	.uleb128 0x58
 	.4byte	.LASF826
 	.byte	0x2
 	.2byte	0x216
 	.4byte	0x261
-	.uleb128 0x57
+	.uleb128 0x58
 	.4byte	.LASF61
 	.byte	0x2
 	.2byte	0x216
 	.4byte	0x277
-	.uleb128 0x59
-	.uleb128 0x49
+	.uleb128 0x5a
+	.uleb128 0x4a
 	.4byte	.LASF909
 	.byte	0x2
 	.2byte	0x21a
 	.4byte	0x6c
 	.byte	0
 	.byte	0
-	.uleb128 0x56
+	.uleb128 0x57
 	.4byte	.LASF1516
 	.byte	0x2
 	.2byte	0x1dd
 	.4byte	0x442
 	.byte	0x3
-	.4byte	0x6ed1
-	.uleb128 0x57
+	.4byte	0x6eee
+	.uleb128 0x58
 	.4byte	.LASF826
 	.byte	0x2
 	.2byte	0x1dd
 	.4byte	0x261
-	.uleb128 0x57
+	.uleb128 0x58
 	.4byte	.LASF61
 	.byte	0x2
 	.2byte	0x1dd
 	.4byte	0x277
-	.uleb128 0x49
+	.uleb128 0x4a
 	.4byte	.LASF1517
 	.byte	0x2
 	.2byte	0x1df
 	.4byte	0x6c
 	.byte	0
-	.uleb128 0x56
+	.uleb128 0x57
 	.4byte	.LASF1518
 	.byte	0x2
 	.2byte	0x159
 	.4byte	0x6c
 	.byte	0x3
-	.4byte	0x6eef
-	.uleb128 0x57
+	.4byte	0x6f0c
+	.uleb128 0x58
 	.4byte	.LASF826
 	.byte	0x2
 	.2byte	0x159
 	.4byte	0x261
 	.byte	0
-	.uleb128 0x56
+	.uleb128 0x57
 	.4byte	.LASF1519
 	.byte	0x2
 	.2byte	0x13d
 	.4byte	0x5f53
 	.byte	0x3
-	.4byte	0x6f0d
-	.uleb128 0x57
+	.4byte	0x6f2a
+	.uleb128 0x58
 	.4byte	.LASF61
 	.byte	0x2
 	.2byte	0x13d
 	.4byte	0x277
 	.byte	0
-	.uleb128 0x5a
+	.uleb128 0x5b
 	.4byte	.LASF1520
 	.byte	0x60
 	.byte	0x1d
 	.4byte	0xc0
 	.byte	0x3
-	.4byte	0x6f29
-	.uleb128 0x5b
+	.4byte	0x6f46
+	.uleb128 0x5c
 	.4byte	.LASF826
 	.byte	0x60
 	.byte	0x1d
 	.4byte	0x2d
 	.byte	0
-	.uleb128 0x5a
+	.uleb128 0x5b
 	.4byte	.LASF1521
 	.byte	0x61
 	.byte	0x22
 	.4byte	0xc0
 	.byte	0x3
-	.4byte	0x6f43
-	.uleb128 0x66
+	.4byte	0x6f60
+	.uleb128 0x67
 	.string	"n"
 	.byte	0x61
 	.byte	0x22
 	.4byte	0x136
 	.byte	0
-	.uleb128 0x5a
+	.uleb128 0x5b
 	.4byte	.LASF1522
 	.byte	0x62
 	.byte	0x1b
 	.4byte	0xc0
 	.byte	0x3
-	.4byte	0x6f5d
-	.uleb128 0x66
+	.4byte	0x6f7a
+	.uleb128 0x67
 	.string	"x"
 	.byte	0x62
 	.byte	0x1b
 	.4byte	0xe4
 	.byte	0
-	.uleb128 0x5a
+	.uleb128 0x5b
 	.4byte	.LASF1523
 	.byte	0x63
 	.byte	0xb
 	.4byte	0x2d
 	.byte	0x3
-	.4byte	0x6f79
-	.uleb128 0x5b
+	.4byte	0x6f96
+	.uleb128 0x5c
 	.4byte	.LASF1524
 	.byte	0x63
 	.byte	0xb
 	.4byte	0x2d
 	.byte	0
-	.uleb128 0x68
-	.4byte	0x67cc
+	.uleb128 0x69
+	.4byte	0x67e9
 	.8byte	.LFB1567
 	.8byte	.LFE1567-.LFB1567
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x6fe7
-	.uleb128 0x69
-	.4byte	0x67e9
+	.4byte	0x7004
+	.uleb128 0x6a
+	.4byte	0x6806
 	.uleb128 0x1
 	.byte	0x51
-	.uleb128 0x6a
-	.4byte	0x67f5
+	.uleb128 0x6b
+	.4byte	0x6812
 	.4byte	.LLST2
-	.uleb128 0x4d
-	.4byte	0x67dd
-	.uleb128 0x4f
-	.4byte	0x6801
-	.uleb128 0x4f
-	.4byte	0x680b
-	.uleb128 0x4f
-	.4byte	0x6817
-	.uleb128 0x54
+	.uleb128 0x4e
+	.4byte	0x67fa
+	.uleb128 0x50
+	.4byte	0x681e
+	.uleb128 0x50
+	.4byte	0x6828
+	.uleb128 0x50
+	.4byte	0x6834
+	.uleb128 0x55
 	.8byte	.LBB194
 	.8byte	.LBE194-.LBB194
-	.uleb128 0x4f
-	.4byte	0x6824
-	.uleb128 0x54
+	.uleb128 0x50
+	.4byte	0x6841
+	.uleb128 0x55
 	.8byte	.LBB195
 	.8byte	.LBE195-.LBB195
-	.uleb128 0x4f
-	.4byte	0x6831
+	.uleb128 0x50
+	.4byte	0x684e
 	.byte	0
 	.byte	0
 	.byte	0
-	.uleb128 0x68
-	.4byte	0x68e2
+	.uleb128 0x69
+	.4byte	0x68ff
 	.8byte	.LFB1569
 	.8byte	.LFE1569-.LFB1569
 	.uleb128 0x1
 	.byte	0x9c
-	.4byte	0x70fd
-	.uleb128 0x6a
-	.4byte	0x68ff
+	.4byte	0x711a
+	.uleb128 0x6b
+	.4byte	0x691c
 	.4byte	.LLST3
-	.uleb128 0x6a
-	.4byte	0x690b
+	.uleb128 0x6b
+	.4byte	0x6928
 	.4byte	.LLST4
+	.uleb128 0x4e
+	.4byte	0x6910
+	.uleb128 0x50
+	.4byte	0x6934
+	.uleb128 0x50
+	.4byte	0x6940
+	.uleb128 0x50
+	.4byte	0x694c
 	.uleb128 0x4d
-	.4byte	0x68f3
-	.uleb128 0x4f
-	.4byte	0x6917
-	.uleb128 0x4f
-	.4byte	0x6923
-	.uleb128 0x4f
-	.4byte	0x692f
-	.uleb128 0x4c
-	.4byte	0x6af8
+	.4byte	0x6b15
 	.8byte	.LBB204
 	.4byte	.Ldebug_ranges0+0x40
 	.byte	0x1
 	.2byte	0x166
-	.4byte	0x70cd
-	.uleb128 0x4d
-	.4byte	0x6b13
-	.uleb128 0x4d
-	.4byte	0x6b08
+	.4byte	0x70ea
 	.uleb128 0x4e
+	.4byte	0x6b30
+	.uleb128 0x4e
+	.4byte	0x6b25
+	.uleb128 0x4f
 	.4byte	.Ldebug_ranges0+0x40
-	.uleb128 0x50
-	.4byte	0x6b1e
-	.4byte	.LLST5
-	.uleb128 0x50
-	.4byte	0x6b29
-	.4byte	.LLST6
-	.uleb128 0x50
-	.4byte	0x6b34
-	.4byte	.LLST7
-	.uleb128 0x4f
-	.4byte	0x6b3f
-	.uleb128 0x4f
-	.4byte	0x6b4a
-	.uleb128 0x4f
-	.4byte	0x6b54
 	.uleb128 0x51
-	.4byte	0x6b60
+	.4byte	0x6b3b
+	.4byte	.LLST5
+	.uleb128 0x51
+	.4byte	0x6b46
+	.4byte	.LLST6
+	.uleb128 0x51
+	.4byte	0x6b51
+	.4byte	.LLST7
+	.uleb128 0x50
+	.4byte	0x6b5c
+	.uleb128 0x50
+	.4byte	0x6b67
+	.uleb128 0x50
+	.4byte	0x6b71
+	.uleb128 0x52
+	.4byte	0x6b7d
 	.8byte	.LBB206
 	.4byte	.Ldebug_ranges0+0x80
 	.byte	0x1
 	.byte	0xe4
-	.uleb128 0x4d
-	.4byte	0x6b7b
-	.uleb128 0x4d
-	.4byte	0x6b70
 	.uleb128 0x4e
+	.4byte	0x6b98
+	.uleb128 0x4e
+	.4byte	0x6b8d
+	.uleb128 0x4f
 	.4byte	.Ldebug_ranges0+0x80
-	.uleb128 0x4f
-	.4byte	0x6b86
-	.uleb128 0x4f
-	.4byte	0x6b91
-	.uleb128 0x6b
+	.uleb128 0x50
+	.4byte	0x6ba3
+	.uleb128 0x50
+	.4byte	0x6bae
+	.uleb128 0x6c
 	.4byte	.Ldebug_ranges0+0xb0
-	.4byte	0x70b9
-	.uleb128 0x4f
-	.4byte	0x6b9f
-	.uleb128 0x4f
-	.4byte	0x6baa
+	.4byte	0x70d6
+	.uleb128 0x50
+	.4byte	0x6bbc
+	.uleb128 0x50
+	.4byte	0x6bc7
 	.byte	0
-	.uleb128 0x4e
+	.uleb128 0x4f
 	.4byte	.Ldebug_ranges0+0xe0
-	.uleb128 0x4f
-	.4byte	0x6bb7
-	.uleb128 0x4f
-	.4byte	0x6bc2
+	.uleb128 0x50
+	.4byte	0x6bd4
+	.uleb128 0x50
+	.4byte	0x6bdf
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
 	.byte	0
-	.uleb128 0x53
-	.4byte	0x6adc
+	.uleb128 0x54
+	.4byte	0x6af9
 	.8byte	.LBB217
 	.8byte	.LBE217-.LBB217
 	.byte	0x1
 	.2byte	0x167
-	.4byte	0x70ef
-	.uleb128 0x4d
-	.4byte	0x6aec
+	.4byte	0x710c
+	.uleb128 0x4e
+	.4byte	0x6b09
 	.byte	0
-	.uleb128 0x4a
+	.uleb128 0x4b
 	.8byte	.LVL21
-	.4byte	0x6a30
+	.4byte	0x6a4d
 	.byte	0
-	.uleb128 0x6c
+	.uleb128 0x6d
 	.4byte	.LASF1525
 	.4byte	.LASF1525
 	.byte	0x2
 	.byte	0xb9
-	.uleb128 0x6c
+	.uleb128 0x6d
 	.4byte	.LASF1526
 	.4byte	.LASF1526
 	.byte	0x5f
-	.byte	0x2c
-	.uleb128 0x6c
+	.byte	0x2f
+	.uleb128 0x6d
 	.4byte	.LASF1527
 	.4byte	.LASF1527
 	.byte	0xe
 	.byte	0xb0
-	.uleb128 0x6d
+	.uleb128 0x6e
 	.4byte	.LASF1528
 	.4byte	.LASF1528
 	.byte	0x2
 	.2byte	0x184
-	.uleb128 0x6e
+	.uleb128 0x6f
 	.4byte	.LASF1530
 	.4byte	.LASF1530
-	.uleb128 0x6c
+	.uleb128 0x6d
 	.4byte	.LASF1529
 	.4byte	.LASF1529
 	.byte	0x64
 	.byte	0x1e
-	.uleb128 0x6e
+	.uleb128 0x6f
 	.4byte	.LASF1531
 	.4byte	.LASF1531
 	.byte	0
@@ -15805,6 +15828,21 @@
 	.byte	0
 	.byte	0
 	.uleb128 0x48
+	.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 0x49
 	.uleb128 0x34
 	.byte	0
 	.uleb128 0x3
@@ -15819,7 +15857,7 @@
 	.uleb128 0x18
 	.byte	0
 	.byte	0
-	.uleb128 0x49
+	.uleb128 0x4a
 	.uleb128 0x34
 	.byte	0
 	.uleb128 0x3
@@ -15832,7 +15870,7 @@
 	.uleb128 0x13
 	.byte	0
 	.byte	0
-	.uleb128 0x4a
+	.uleb128 0x4b
 	.uleb128 0x4109
 	.byte	0
 	.uleb128 0x11
@@ -15841,7 +15879,7 @@
 	.uleb128 0x13
 	.byte	0
 	.byte	0
-	.uleb128 0x4b
+	.uleb128 0x4c
 	.uleb128 0x2e
 	.byte	0x1
 	.uleb128 0x3
@@ -15866,7 +15904,7 @@
 	.uleb128 0x13
 	.byte	0
 	.byte	0
-	.uleb128 0x4c
+	.uleb128 0x4d
 	.uleb128 0x1d
 	.byte	0x1
 	.uleb128 0x31
@@ -15883,25 +15921,18 @@
 	.uleb128 0x13
 	.byte	0
 	.byte	0
-	.uleb128 0x4d
+	.uleb128 0x4e
 	.uleb128 0x5
 	.byte	0
 	.uleb128 0x31
 	.uleb128 0x13
 	.byte	0
 	.byte	0
-	.uleb128 0x4e
+	.uleb128 0x4f
 	.uleb128 0xb
 	.byte	0x1
 	.uleb128 0x55
 	.uleb128 0x17
-	.byte	0
-	.byte	0
-	.uleb128 0x4f
-	.uleb128 0x34
-	.byte	0
-	.uleb128 0x31
-	.uleb128 0x13
 	.byte	0
 	.byte	0
 	.uleb128 0x50
@@ -15909,11 +15940,18 @@
 	.byte	0
 	.uleb128 0x31
 	.uleb128 0x13
+	.byte	0
+	.byte	0
+	.uleb128 0x51
+	.uleb128 0x34
+	.byte	0
+	.uleb128 0x31
+	.uleb128 0x13
 	.uleb128 0x2
 	.uleb128 0x17
 	.byte	0
 	.byte	0
-	.uleb128 0x51
+	.uleb128 0x52
 	.uleb128 0x1d
 	.byte	0x1
 	.uleb128 0x31
@@ -15928,35 +15966,35 @@
 	.uleb128 0xb
 	.byte	0
 	.byte	0
-	.uleb128 0x52
-	.uleb128 0xb
-	.byte	0x1
-	.uleb128 0x11
-	.uleb128 0x1
-	.uleb128 0x12
-	.uleb128 0x7
-	.uleb128 0x1
-	.uleb128 0x13
-	.byte	0
-	.byte	0
 	.uleb128 0x53
-	.uleb128 0x1d
+	.uleb128 0xb
 	.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 0x54
+	.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 0x55
 	.uleb128 0xb
 	.byte	0x1
 	.uleb128 0x11
@@ -15965,7 +16003,7 @@
 	.uleb128 0x7
 	.byte	0
 	.byte	0
-	.uleb128 0x55
+	.uleb128 0x56
 	.uleb128 0x1d
 	.byte	0x1
 	.uleb128 0x31
@@ -15980,7 +16018,7 @@
 	.uleb128 0x5
 	.byte	0
 	.byte	0
-	.uleb128 0x56
+	.uleb128 0x57
 	.uleb128 0x2e
 	.byte	0x1
 	.uleb128 0x3
@@ -15999,7 +16037,7 @@
 	.uleb128 0x13
 	.byte	0
 	.byte	0
-	.uleb128 0x57
+	.uleb128 0x58
 	.uleb128 0x5
 	.byte	0
 	.uleb128 0x3
@@ -16012,7 +16050,7 @@
 	.uleb128 0x13
 	.byte	0
 	.byte	0
-	.uleb128 0x58
+	.uleb128 0x59
 	.uleb128 0x34
 	.byte	0
 	.uleb128 0x3
@@ -16025,12 +16063,12 @@
 	.uleb128 0x13
 	.byte	0
 	.byte	0
-	.uleb128 0x59
+	.uleb128 0x5a
 	.uleb128 0xb
 	.byte	0x1
 	.byte	0
 	.byte	0
-	.uleb128 0x5a
+	.uleb128 0x5b
 	.uleb128 0x2e
 	.byte	0x1
 	.uleb128 0x3
@@ -16049,7 +16087,7 @@
 	.uleb128 0x13
 	.byte	0
 	.byte	0
-	.uleb128 0x5b
+	.uleb128 0x5c
 	.uleb128 0x5
 	.byte	0
 	.uleb128 0x3
@@ -16062,7 +16100,7 @@
 	.uleb128 0x13
 	.byte	0
 	.byte	0
-	.uleb128 0x5c
+	.uleb128 0x5d
 	.uleb128 0x2e
 	.byte	0x1
 	.uleb128 0x3
@@ -16087,7 +16125,7 @@
 	.uleb128 0x13
 	.byte	0
 	.byte	0
-	.uleb128 0x5d
+	.uleb128 0x5e
 	.uleb128 0x5
 	.byte	0
 	.uleb128 0x3
@@ -16102,7 +16140,7 @@
 	.uleb128 0x17
 	.byte	0
 	.byte	0
-	.uleb128 0x5e
+	.uleb128 0x5f
 	.uleb128 0x34
 	.byte	0
 	.uleb128 0x3
@@ -16112,23 +16150,6 @@
 	.uleb128 0x3b
 	.uleb128 0xb
 	.uleb128 0x49
-	.uleb128 0x13
-	.byte	0
-	.byte	0
-	.uleb128 0x5f
-	.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
@@ -16144,10 +16165,27 @@
 	.uleb128 0x58
 	.uleb128 0xb
 	.uleb128 0x59
-	.uleb128 0x5
+	.uleb128 0xb
+	.uleb128 0x1
+	.uleb128 0x13
 	.byte	0
 	.byte	0
 	.uleb128 0x61
+	.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 0x62
 	.uleb128 0x34
 	.byte	0
 	.uleb128 0x3
@@ -16160,40 +16198,40 @@
 	.uleb128 0x13
 	.byte	0
 	.byte	0
-	.uleb128 0x62
+	.uleb128 0x63
 	.uleb128 0xb
 	.byte	0x1
 	.uleb128 0x1
 	.uleb128 0x13
-	.byte	0
-	.byte	0
-	.uleb128 0x63
-	.uleb128 0x2e
-	.byte	0
-	.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
 	.byte	0
 	.byte	0
 	.uleb128 0x64
 	.uleb128 0x2e
+	.byte	0
+	.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
+	.byte	0
+	.byte	0
+	.uleb128 0x65
+	.uleb128 0x2e
 	.byte	0x1
 	.uleb128 0x3f
 	.uleb128 0x19
@@ -16219,7 +16257,7 @@
 	.uleb128 0x13
 	.byte	0
 	.byte	0
-	.uleb128 0x65
+	.uleb128 0x66
 	.uleb128 0x1d
 	.byte	0x1
 	.uleb128 0x31
@@ -16236,7 +16274,7 @@
 	.uleb128 0x13
 	.byte	0
 	.byte	0
-	.uleb128 0x66
+	.uleb128 0x67
 	.uleb128 0x5
 	.byte	0
 	.uleb128 0x3
@@ -16249,7 +16287,7 @@
 	.uleb128 0x13
 	.byte	0
 	.byte	0
-	.uleb128 0x67
+	.uleb128 0x68
 	.uleb128 0x2e
 	.byte	0x1
 	.uleb128 0x3
@@ -16266,7 +16304,7 @@
 	.uleb128 0x13
 	.byte	0
 	.byte	0
-	.uleb128 0x68
+	.uleb128 0x69
 	.uleb128 0x2e
 	.byte	0x1
 	.uleb128 0x31
@@ -16283,7 +16321,7 @@
 	.uleb128 0x13
 	.byte	0
 	.byte	0
-	.uleb128 0x69
+	.uleb128 0x6a
 	.uleb128 0x5
 	.byte	0
 	.uleb128 0x31
@@ -16292,7 +16330,7 @@
 	.uleb128 0x18
 	.byte	0
 	.byte	0
-	.uleb128 0x6a
+	.uleb128 0x6b
 	.uleb128 0x5
 	.byte	0
 	.uleb128 0x31
@@ -16301,30 +16339,13 @@
 	.uleb128 0x17
 	.byte	0
 	.byte	0
-	.uleb128 0x6b
+	.uleb128 0x6c
 	.uleb128 0xb
 	.byte	0x1
 	.uleb128 0x55
 	.uleb128 0x17
 	.uleb128 0x1
 	.uleb128 0x13
-	.byte	0
-	.byte	0
-	.uleb128 0x6c
-	.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 0x6d
@@ -16341,10 +16362,27 @@
 	.uleb128 0x3a
 	.uleb128 0xb
 	.uleb128 0x3b
-	.uleb128 0x5
+	.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
@@ -16366,11 +16404,11 @@
 	.2byte	0x1
 	.byte	0x50
 	.8byte	.LVL105-.Ltext0
-	.8byte	.LVL115-.Ltext0
+	.8byte	.LVL113-.Ltext0
 	.2byte	0x1
 	.byte	0x63
-	.8byte	.LVL118-.Ltext0
-	.8byte	.LVL122-.Ltext0
+	.8byte	.LVL116-.Ltext0
+	.8byte	.LVL123-.Ltext0
 	.2byte	0x1
 	.byte	0x63
 	.8byte	.LVL125-.Ltext0
@@ -16381,37 +16419,41 @@
 	.8byte	0
 .LLST29:
 	.8byte	.LVL104-.Ltext0
-	.8byte	.LVL114-.Ltext0
+	.8byte	.LVL112-.Ltext0
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL114-.Ltext0
-	.8byte	.LVL117-.Ltext0
+	.8byte	.LVL112-.Ltext0
+	.8byte	.LVL115-.Ltext0
 	.2byte	0x1
 	.byte	0x67
-	.8byte	.LVL117-.Ltext0
-	.8byte	.LVL119-.Ltext0
+	.8byte	.LVL115-.Ltext0
+	.8byte	.LVL116-.Ltext0
 	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL119-.Ltext0
-	.8byte	.LVL120-.Ltext0
-	.2byte	0x1
-	.byte	0x67
-	.8byte	.LVL121-.Ltext0
-	.8byte	.LVL124-.Ltext0
+	.8byte	.LVL116-.Ltext0
+	.8byte	.LVL122-.Ltext0
 	.2byte	0x1
 	.byte	0x67
 	.8byte	.LVL125-.Ltext0
 	.8byte	.LVL126-.Ltext0
 	.2byte	0x1
-	.byte	0x67
+	.byte	0x51
 	.8byte	.LVL126-.Ltext0
 	.8byte	.LVL127-.Ltext0
 	.2byte	0x1
+	.byte	0x67
+	.8byte	.LVL128-.Ltext0
+	.8byte	.LVL129-.Ltext0
+	.2byte	0x1
 	.byte	0x51
-	.8byte	.LVL127-.Ltext0
-	.8byte	.LFE1565-.Ltext0
+	.8byte	.LVL129-.Ltext0
+	.8byte	.LVL131-.Ltext0
 	.2byte	0x1
 	.byte	0x67
+	.8byte	.LVL131-.Ltext0
+	.8byte	.LVL132-1-.Ltext0
+	.2byte	0x1
+	.byte	0x51
 	.8byte	0
 	.8byte	0
 .LLST30:
@@ -16420,29 +16462,60 @@
 	.2byte	0x1
 	.byte	0x52
 	.8byte	.LVL106-.Ltext0
-	.8byte	.LVL116-.Ltext0
+	.8byte	.LVL114-.Ltext0
 	.2byte	0x1
 	.byte	0x65
+	.8byte	.LVL114-.Ltext0
 	.8byte	.LVL116-.Ltext0
-	.8byte	.LVL118-.Ltext0
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL118-.Ltext0
-	.8byte	.LVL123-.Ltext0
+	.8byte	.LVL116-.Ltext0
+	.8byte	.LVL124-.Ltext0
 	.2byte	0x1
 	.byte	0x65
 	.8byte	.LVL125-.Ltext0
-	.8byte	.LVL126-.Ltext0
+	.8byte	.LVL128-.Ltext0
 	.2byte	0x1
 	.byte	0x65
-	.8byte	.LVL126-.Ltext0
-	.8byte	.LVL127-.Ltext0
+	.8byte	.LVL128-.Ltext0
+	.8byte	.LVL129-.Ltext0
 	.2byte	0x1
 	.byte	0x52
-	.8byte	.LVL127-.Ltext0
-	.8byte	.LFE1565-.Ltext0
+	.8byte	.LVL129-.Ltext0
+	.8byte	.LVL131-.Ltext0
 	.2byte	0x1
 	.byte	0x65
+	.8byte	.LVL131-.Ltext0
+	.8byte	.LVL132-1-.Ltext0
+	.2byte	0x1
+	.byte	0x52
+	.8byte	0
+	.8byte	0
+.LLST31:
+	.8byte	.LVL104-.Ltext0
+	.8byte	.LVL107-1-.Ltext0
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL108-.Ltext0
+	.8byte	.LVL109-1-.Ltext0
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL112-.Ltext0
+	.8byte	.LVL117-1-.Ltext0
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL118-.Ltext0
+	.8byte	.LVL119-1-.Ltext0
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL121-.Ltext0
+	.8byte	.LVL129-.Ltext0
+	.2byte	0x1
+	.byte	0x53
+	.8byte	.LVL131-.Ltext0
+	.8byte	.LVL132-1-.Ltext0
+	.2byte	0x1
+	.byte	0x53
 	.8byte	0
 	.8byte	0
 .LLST8:
diff --git a/kernel/drivers/gpu/drm/rockchip/inno_hdmi.c b/kernel/drivers/gpu/drm/rockchip/inno_hdmi.c
index c9a51ae..87eebd7 100644
--- a/kernel/drivers/gpu/drm/rockchip/inno_hdmi.c
+++ b/kernel/drivers/gpu/drm/rockchip/inno_hdmi.c
@@ -55,11 +55,28 @@
 	struct completion cmp;
 };
 
+enum inno_hdmi_dev_type {
+	RK3036_HDMI,
+	RK3128_HDMI,
+};
+
+struct inno_hdmi_phy_config {
+	unsigned long mpixelclock;
+	u8 pre_emphasis;	/* pre-emphasis value */
+	u8 vlev_ctr;		/* voltage level control */
+};
+
+struct inno_hdmi_plat_data {
+	enum inno_hdmi_dev_type dev_type;
+	struct inno_hdmi_phy_config *phy_config;
+};
+
 struct inno_hdmi {
 	struct device *dev;
 	struct drm_device *drm_dev;
 
 	int irq;
+	struct clk *aclk;
 	struct clk *pclk;
 	void __iomem *regs;
 
@@ -70,6 +87,7 @@
 	struct i2c_adapter *ddc;
 
 	unsigned int tmds_rate;
+	const struct inno_hdmi_plat_data *plat_data;
 
 	struct hdmi_data_info	hdmi_data;
 	struct drm_display_mode previous_mode;
@@ -197,12 +215,20 @@
 
 static void inno_hdmi_set_pwr_mode(struct inno_hdmi *hdmi, int mode)
 {
+	const struct inno_hdmi_phy_config *phy_config =
+						hdmi->plat_data->phy_config;
+
 	switch (mode) {
 	case NORMAL:
 		inno_hdmi_sys_power(hdmi, false);
-
-		hdmi_writeb(hdmi, HDMI_PHY_PRE_EMPHASIS, 0x6f);
-		hdmi_writeb(hdmi, HDMI_PHY_DRIVER, 0xbb);
+		for (; phy_config->mpixelclock != ~0UL; phy_config++)
+			if (hdmi->tmds_rate <= phy_config->mpixelclock)
+				break;
+		if (!phy_config->mpixelclock)
+			return;
+		hdmi_writeb(hdmi, HDMI_PHY_PRE_EMPHASIS,
+			    phy_config->pre_emphasis);
+		hdmi_writeb(hdmi, HDMI_PHY_DRIVER, phy_config->vlev_ctr);
 
 		hdmi_writeb(hdmi, HDMI_PHY_SYS_CTL, 0x15);
 		hdmi_writeb(hdmi, HDMI_PHY_SYS_CTL, 0x14);
@@ -389,6 +415,12 @@
 {
 	int value;
 
+	if (hdmi->plat_data->dev_type == RK3036_HDMI) {
+		value = BIT(20) | BIT(21);
+		value |= mode->flags & DRM_MODE_FLAG_PHSYNC ? BIT(4) : 0;
+		value |= mode->flags & DRM_MODE_FLAG_PVSYNC ? BIT(5) : 0;
+		hdmi_writeb(hdmi, 0x148, value);
+	}
 	/* Set detail external video timing polarity and interlace mode */
 	value = v_EXTERANL_VIDEO(1);
 	value |= mode->flags & DRM_MODE_FLAG_PHSYNC ?
@@ -823,6 +855,41 @@
 	return adap;
 }
 
+static struct inno_hdmi_phy_config rk3036_hdmi_phy_config[] = {
+	/* pixelclk pre-emp vlev */
+	{ 74250000,  0x3f, 0xbb },
+	{ 165000000, 0x6f, 0xbb },
+	{ ~0UL,	     0x00, 0x00 }
+};
+
+static struct inno_hdmi_phy_config rk3128_hdmi_phy_config[] = {
+	/* pixelclk pre-emp vlev */
+	{ 74250000,  0x3f, 0xaa },
+	{ 165000000, 0x5f, 0xaa },
+	{ ~0UL,	     0x00, 0x00 }
+};
+
+static const struct inno_hdmi_plat_data rk3036_hdmi_drv_data = {
+	.dev_type   = RK3036_HDMI,
+	.phy_config = rk3036_hdmi_phy_config,
+};
+
+static const struct inno_hdmi_plat_data rk3128_hdmi_drv_data = {
+	.dev_type   = RK3128_HDMI,
+	.phy_config = rk3128_hdmi_phy_config,
+};
+
+static const struct of_device_id inno_hdmi_dt_ids[] = {
+	{ .compatible = "rockchip,rk3036-inno-hdmi",
+	  .data = &rk3036_hdmi_drv_data,
+	},
+	{ .compatible = "rockchip,rk3128-inno-hdmi",
+	  .data = &rk3128_hdmi_drv_data,
+	},
+	{},
+};
+MODULE_DEVICE_TABLE(of, inno_hdmi_dt_ids);
+
 static int inno_hdmi_bind(struct device *dev, struct device *master,
 				 void *data)
 {
@@ -839,11 +906,22 @@
 
 	hdmi->dev = dev;
 	hdmi->drm_dev = drm;
+	hdmi->plat_data = device_get_match_data(hdmi->dev);
 
 	iores = platform_get_resource(pdev, IORESOURCE_MEM, 0);
 	hdmi->regs = devm_ioremap_resource(dev, iores);
 	if (IS_ERR(hdmi->regs))
 		return PTR_ERR(hdmi->regs);
+
+	irq = platform_get_irq(pdev, 0);
+	if (irq < 0)
+		return irq;
+
+	hdmi->aclk = devm_clk_get(hdmi->dev, "aclk");
+	if (IS_ERR(hdmi->aclk)) {
+		dev_err(hdmi->dev, "Unable to get HDMI aclk clk\n");
+		return PTR_ERR(hdmi->aclk);
+	}
 
 	hdmi->pclk = devm_clk_get(hdmi->dev, "pclk");
 	if (IS_ERR(hdmi->pclk)) {
@@ -851,17 +929,17 @@
 		return PTR_ERR(hdmi->pclk);
 	}
 
-	ret = clk_prepare_enable(hdmi->pclk);
+	ret = clk_prepare_enable(hdmi->aclk);
 	if (ret) {
 		DRM_DEV_ERROR(hdmi->dev,
-			      "Cannot enable HDMI pclk clock: %d\n", ret);
+			      "Cannot enable HDMI aclk clock: %d\n", ret);
 		return ret;
 	}
 
-	irq = platform_get_irq(pdev, 0);
-	if (irq < 0) {
-		ret = irq;
-		goto err_disable_clk;
+	ret = clk_prepare_enable(hdmi->pclk);
+	if (ret) {
+		dev_err(hdmi->dev, "Cannot enable HDMI pclk clock: %d\n", ret);
+		goto err_disable_aclk;
 	}
 
 	inno_hdmi_reset(hdmi);
@@ -870,7 +948,7 @@
 	if (IS_ERR(hdmi->ddc)) {
 		ret = PTR_ERR(hdmi->ddc);
 		hdmi->ddc = NULL;
-		goto err_disable_clk;
+		goto err_disable_pclk;
 	}
 
 	/*
@@ -894,17 +972,23 @@
 	ret = devm_request_threaded_irq(dev, irq, inno_hdmi_hardirq,
 					inno_hdmi_irq, IRQF_SHARED,
 					dev_name(dev), hdmi);
-	if (ret < 0)
+	if (ret) {
+		dev_err(hdmi->dev,
+			"failed to request hdmi irq: %d\n", ret);
 		goto err_cleanup_hdmi;
+	}
 
 	return 0;
+
 err_cleanup_hdmi:
 	hdmi->connector.funcs->destroy(&hdmi->connector);
 	hdmi->encoder.funcs->destroy(&hdmi->encoder);
 err_put_adapter:
 	i2c_put_adapter(hdmi->ddc);
-err_disable_clk:
+err_disable_pclk:
 	clk_disable_unprepare(hdmi->pclk);
+err_disable_aclk:
+	clk_disable_unprepare(hdmi->aclk);
 	return ret;
 }
 
@@ -918,6 +1002,7 @@
 
 	i2c_put_adapter(hdmi->ddc);
 	clk_disable_unprepare(hdmi->pclk);
+	clk_disable_unprepare(hdmi->aclk);
 }
 
 static const struct component_ops inno_hdmi_ops = {
@@ -936,13 +1021,6 @@
 
 	return 0;
 }
-
-static const struct of_device_id inno_hdmi_dt_ids[] = {
-	{ .compatible = "rockchip,rk3036-inno-hdmi",
-	},
-	{},
-};
-MODULE_DEVICE_TABLE(of, inno_hdmi_dt_ids);
 
 struct platform_driver inno_hdmi_driver = {
 	.probe  = inno_hdmi_probe,
diff --git a/kernel/drivers/gpu/drm/rockchip/rockchip_drm_drv.c b/kernel/drivers/gpu/drm/rockchip/rockchip_drm_drv.c
index 294547b..0ae26f7 100644
--- a/kernel/drivers/gpu/drm/rockchip/rockchip_drm_drv.c
+++ b/kernel/drivers/gpu/drm/rockchip/rockchip_drm_drv.c
@@ -63,6 +63,7 @@
 #else
 static bool is_support_iommu = true;
 #endif
+static bool iommu_reserve_map;
 static struct drm_driver rockchip_drm_driver;
 
 struct rockchip_drm_mode_set {
@@ -1320,6 +1321,7 @@
 	struct rockchip_drm_private *private = drm_dev->dev_private;
 	struct iommu_domain_geometry *geometry;
 	u64 start, end;
+	int ret = 0;
 
 	if (!is_support_iommu)
 		return 0;
@@ -1340,7 +1342,23 @@
 	iommu_set_fault_handler(private->domain, rockchip_drm_fault_handler,
 				drm_dev);
 
-	return 0;
+	if (iommu_reserve_map) {
+		/*
+		 * At 32 bit platform size_t maximum value is 0xffffffff, SZ_4G(0x100000000) will be
+		 * cliped to 0, so we split into two mapping
+		 */
+		ret = iommu_map(private->domain, 0, 0, (size_t)SZ_2G,
+				IOMMU_WRITE | IOMMU_READ | IOMMU_PRIV);
+		if (ret)
+			dev_err(drm_dev->dev, "failed to create 0-2G pre mapping\n");
+
+		ret = iommu_map(private->domain, SZ_2G, SZ_2G, (size_t)SZ_2G,
+				IOMMU_WRITE | IOMMU_READ | IOMMU_PRIV);
+		if (ret)
+			dev_err(drm_dev->dev, "failed to create 2G-4G pre mapping\n");
+	}
+
+	return ret;
 }
 
 static void rockchip_iommu_cleanup(struct drm_device *drm_dev)
@@ -1350,6 +1368,10 @@
 	if (!is_support_iommu)
 		return;
 
+	if (iommu_reserve_map) {
+		iommu_unmap(private->domain, 0, (size_t)SZ_2G);
+		iommu_unmap(private->domain, SZ_2G, (size_t)SZ_2G);
+	}
 	drm_mm_takedown(&private->mm);
 	iommu_domain_free(private->domain);
 }
@@ -1765,16 +1787,14 @@
 	if (ret)
 		goto err_kms_helper_poll_fini;
 
-	drm_for_each_crtc(crtc, drm_dev) {
-		struct drm_fb_helper *helper = private->fbdev_helper;
-		struct rockchip_crtc_state *s = NULL;
+	if (private->fbdev_helper && private->fbdev_helper->fb) {
+		drm_for_each_crtc(crtc, drm_dev) {
+			struct rockchip_crtc_state *s = NULL;
 
-		if (!helper)
-			break;
-
-		s = to_rockchip_crtc_state(crtc->state);
-		if (is_support_hotplug(s->output_type))
-			drm_framebuffer_get(helper->fb);
+			s = to_rockchip_crtc_state(crtc->state);
+			if (is_support_hotplug(s->output_type))
+				drm_framebuffer_get(private->fbdev_helper->fb);
+		}
 	}
 
 	drm_dev->mode_config.allow_fb_modifiers = true;
@@ -2303,6 +2323,7 @@
 		}
 
 		found = true;
+		iommu_reserve_map |= of_property_read_bool(iommu, "rockchip,reserve-map");
 
 		of_node_put(iommu);
 		of_node_put(port);
diff --git a/kernel/drivers/gpu/drm/rockchip/rockchip_drm_drv.h b/kernel/drivers/gpu/drm/rockchip/rockchip_drm_drv.h
index 4958885..cda2e5e 100644
--- a/kernel/drivers/gpu/drm/rockchip/rockchip_drm_drv.h
+++ b/kernel/drivers/gpu/drm/rockchip/rockchip_drm_drv.h
@@ -115,6 +115,37 @@
 	int cos_hue;
 };
 
+#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 post_acm {
+	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 post_csc {
+	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 VOP_OUTPUT_IF_RGB	BIT(0)
 #define VOP_OUTPUT_IF_BT1120	BIT(1)
 #define VOP_OUTPUT_IF_BT656	BIT(2)
@@ -128,6 +159,7 @@
 #define VOP_OUTPUT_IF_DP1	BIT(10)
 #define VOP_OUTPUT_IF_HDMI0	BIT(11)
 #define VOP_OUTPUT_IF_HDMI1	BIT(12)
+#define VOP_OUTPUT_IF_TV	BIT(13)
 
 struct rockchip_crtc_state {
 	struct drm_crtc_state base;
@@ -181,6 +213,9 @@
 	u32 line_flag;
 	u8 mode_update;
 	struct rockchip_hdr_state hdr;
+	struct drm_property_blob *hdr_ext_data;
+	struct drm_property_blob *acm_lut_data;
+	struct drm_property_blob *post_csc_data;
 };
 #define to_rockchip_crtc_state(s) \
 		container_of(s, struct rockchip_crtc_state, base)
diff --git a/kernel/drivers/gpu/drm/rockchip/rockchip_drm_fb.c b/kernel/drivers/gpu/drm/rockchip/rockchip_drm_fb.c
index c653900..5563d5e 100644
--- a/kernel/drivers/gpu/drm/rockchip/rockchip_drm_fb.c
+++ b/kernel/drivers/gpu/drm/rockchip/rockchip_drm_fb.c
@@ -114,8 +114,6 @@
 {
 	struct rockchip_drm_fb *rockchip_fb;
 	struct rockchip_gem_object *rk_obj;
-	struct rockchip_drm_private *private = dev->dev_private;
-	struct drm_fb_helper *fb_helper = private->fbdev_helper;
 	int ret = 0;
 	int i;
 
@@ -141,9 +139,6 @@
 			rk_obj = to_rockchip_obj(obj[i]);
 			rockchip_fb->dma_addr[i] = rk_obj->dma_addr;
 			rockchip_fb->kvaddr[i] = rk_obj->kvaddr;
-			private->fbdev_bo = &rk_obj->base;
-			if (fb_helper && fb_helper->fbdev && rk_obj->kvaddr)
-				fb_helper->fbdev->screen_base = rk_obj->kvaddr;
 		}
 #ifndef MODULE
 	} else if (logo) {
@@ -366,6 +361,24 @@
 	}
 }
 
+static void drm_atomic_helper_connector_commit(struct drm_device *dev,
+					       struct drm_atomic_state *old_state)
+{
+	struct drm_connector *connector;
+	struct drm_connector_state *new_conn_state;
+	int i;
+
+	for_each_new_connector_in_state(old_state, connector, new_conn_state, i) {
+		const struct drm_connector_helper_funcs *funcs;
+
+		funcs = connector->helper_private;
+		if (!funcs->atomic_commit)
+			continue;
+
+		funcs->atomic_commit(connector, new_conn_state);
+	}
+}
+
 static void
 rockchip_atomic_helper_commit_tail_rpm(struct drm_atomic_state *old_state)
 {
@@ -381,6 +394,8 @@
 					DRM_PLANE_COMMIT_ACTIVE_ONLY);
 
 	rockchip_drm_psr_inhibit_put_state(old_state);
+
+	drm_atomic_helper_connector_commit(dev, old_state);
 
 	drm_atomic_helper_commit_hw_done(old_state);
 
@@ -445,6 +460,8 @@
 
 	rockchip_drm_psr_inhibit_put_state(state);
 
+	drm_atomic_helper_connector_commit(dev, state);
+
 	drm_atomic_helper_commit_hw_done(state);
 
 	rockchip_drm_atomic_helper_wait_for_vblanks(dev, state);
diff --git a/kernel/drivers/gpu/drm/rockchip/rockchip_drm_fbdev.c b/kernel/drivers/gpu/drm/rockchip/rockchip_drm_fbdev.c
index 67a21fd1..e824264 100644
--- a/kernel/drivers/gpu/drm/rockchip/rockchip_drm_fbdev.c
+++ b/kernel/drivers/gpu/drm/rockchip/rockchip_drm_fbdev.c
@@ -56,8 +56,6 @@
 	.fb_fillrect	= drm_fb_helper_cfb_fillrect,
 	.fb_copyarea	= drm_fb_helper_cfb_copyarea,
 	.fb_imageblit	= drm_fb_helper_cfb_imageblit,
-	.fb_read	= drm_fb_helper_sys_read,
-	.fb_write	= drm_fb_helper_sys_write,
 	.fb_mmap		= rockchip_fbdev_mmap,
 	.fb_dmabuf_export	= rockchip_fbdev_get_dma_buf,
 };
diff --git a/kernel/drivers/gpu/drm/rockchip/rockchip_drm_gem.c b/kernel/drivers/gpu/drm/rockchip/rockchip_drm_gem.c
index 946d8e3..ce31e32 100644
--- a/kernel/drivers/gpu/drm/rockchip/rockchip_drm_gem.c
+++ b/kernel/drivers/gpu/drm/rockchip/rockchip_drm_gem.c
@@ -38,7 +38,7 @@
 {
 	struct drm_device *drm = rk_obj->base.dev;
 	struct rockchip_drm_private *private = drm->dev_private;
-	int prot = IOMMU_READ | IOMMU_WRITE | IOMMU_TLB_SHOT_ENTIRE;
+	int prot = IOMMU_READ | IOMMU_WRITE;
 	ssize_t ret;
 
 	mutex_lock(&private->mm_lock);
@@ -62,6 +62,11 @@
 		ret = -ENOMEM;
 		goto err_remove_node;
 	}
+
+#ifdef CONFIG_IOMMU_API
+	if (private->domain->ops->flush_iotlb_all)
+		private->domain->ops->flush_iotlb_all(private->domain);
+#endif
 
 	rk_obj->size = ret;
 
@@ -459,6 +464,11 @@
 		      rk_obj->base.size);
 }
 
+static inline bool is_vop_enabled(void)
+{
+	return (IS_ENABLED(CONFIG_ROCKCHIP_VOP) || IS_ENABLED(CONFIG_ROCKCHIP_VOP2));
+}
+
 static int rockchip_gem_alloc_buf(struct rockchip_gem_object *rk_obj,
 				  bool alloc_kmap)
 {
@@ -467,7 +477,7 @@
 	struct rockchip_drm_private *private = drm->dev_private;
 	int ret = 0;
 
-	if (!private->domain)
+	if (!private->domain && is_vop_enabled())
 		rk_obj->flags |= ROCKCHIP_BO_CONTIG;
 
 	if (rk_obj->flags & ROCKCHIP_BO_SECURE) {
@@ -507,7 +517,7 @@
 		ret = rockchip_gem_iommu_map(rk_obj);
 		if (ret < 0)
 			goto err_free;
-	} else {
+	} else if (is_vop_enabled()) {
 		WARN_ON(!rk_obj->dma_handle);
 		rk_obj->dma_addr = rk_obj->dma_handle;
 	}
@@ -819,7 +829,7 @@
 			     struct drm_mode_create_dumb *args)
 {
 	struct rockchip_gem_object *rk_obj;
-	int min_pitch = DIV_ROUND_UP(args->width * args->bpp, 8);
+	u32 min_pitch = args->width * DIV_ROUND_UP(args->bpp, 8);
 
 	/*
 	 * align to 64 bytes since Mali requires it.
diff --git a/kernel/drivers/gpu/drm/rockchip/rockchip_drm_tve.c b/kernel/drivers/gpu/drm/rockchip/rockchip_drm_tve.c
index 0a223dd..990b9cf 100644
--- a/kernel/drivers/gpu/drm/rockchip/rockchip_drm_tve.c
+++ b/kernel/drivers/gpu/drm/rockchip/rockchip_drm_tve.c
@@ -38,6 +38,76 @@
 		   .vrefresh = 60, 0, },
 };
 
+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_relaxed(v, tve->regbase + (offset))
 #define tve_readl(offset)		readl_relaxed(tve->regbase + (offset))
 
@@ -54,6 +124,14 @@
 	int input_format;
 	int soc_type;
 };
+
+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 int
 rockchip_tve_get_modes(struct drm_connector *connector)
@@ -107,61 +185,106 @@
 
 static void tve_set_mode(struct rockchip_tve *tve)
 {
+	struct env_config *bt656_cfg, *tve_cfg;
 	int mode = tve->tv_format;
 
-	dev_dbg(tve->dev, "tve set mode:%d\n", mode);
-	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));
+	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 {
+		dev_dbg(tve->dev, "tve set mode:%d\n", mode);
+		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);
+		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) {
 		dev_dbg(tve->dev, "NTSC MODE\n");
-		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));
+		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) {
 		dev_dbg(tve->dev, "PAL MODE\n");
-		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);
+		if (tve->soc_type == SOC_RK3528) {
+			bt656_cfg = pal_bt656_config;
+			tve_cfg = pal_tve_config;
 
-		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_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_ADJ_TIMING, tve->adjtiming);
-		tve_writel(TV_ACT_TIMING, 0x0694011D |
-			   (1 << 12) | (2 << 28));
+			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_dac_grf_writel(RK3528_VO_GRF_CVBS_CON, (mask << 16) | val);
 	}
 }
 
@@ -178,36 +301,57 @@
 	u32 mask = 0;
 	u32 val = 0;
 	u32 grfreg = 0;
+	u32 offset = 0;
 
 	if (enable) {
 		dev_dbg(tve->dev, "dac enable\n");
 
-		mask = m_VBG_EN | m_DAC_EN | m_DAC_GAIN;
 		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);
+			offset = VDAC_VDAC1;
+		} else if (tve->soc_type == SOC_RK3528) {
+			/*
+			 * Reset the vdac
+			 */
+			tve_dac_writel(VDAC_CLK_RST, v_ANALOG_RST(0) | v_DIGITAL_RST(0));
+			msleep(20);
+			tve_dac_writel(VDAC_CLK_RST, v_ANALOG_RST(1) | v_DIGITAL_RST(1));
+
+			tve_dac_writel(VDAC_CURRENT_CTRL, v_OUT_CURRENT(tve->vdac_out_current));
+
+			val = v_REF_VOLTAGE(7) | v_DAC_PWN(1) | v_BIAS_PWN(1);
+			offset = VDAC_PWM_REF_CTRL;
 		}
 	} else {
 		dev_dbg(tve->dev, "dac disable\n");
 
-		mask = m_VBG_EN | m_DAC_EN;
-		if (tve->soc_type == SOC_RK312X)
+		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)
+		} 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)
+		} 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_dac_grf_writel(grfreg, (mask << 16) | val);
 	else if (tve->vdacbase)
-		tve_dac_writel(VDAC_VDAC1, val);
+		tve_dac_writel(offset, val);
 }
 
 static int cvbs_set_disable(struct rockchip_tve *tve)
@@ -229,6 +373,18 @@
 	return 0;
 }
 
+/*
+ * RK3528 supports bt656 to cvbs, and the others support rgb to cvbs.
+ *
+ *  ┌──────────┐
+ *  │ rgb data ├─────────────────────────────────────┐
+ *  └──────────┘                                     │
+ *                                                   ▼
+ * ┌────────────┐    ┌───────────────┐    ┌───────────────────┐    ┌──────┐    ┌────────┐
+ * │ bt656 data ├───►│ bt656 decoder ├───►│ cvbs(tve) encoder ├───►│ vdac ├───►│ screen │
+ * └────────────┘    └───────────────┘    └───────────────────┘    └──────┘    └────────┘
+ *
+ */
 static int cvbs_set_enable(struct rockchip_tve *tve)
 {
 	int ret = 0;
@@ -242,8 +398,9 @@
 		dev_err(tve->dev, "failed to get pm runtime: %d\n", ret);
 		return ret;
 	}
-	dac_enable(tve, true);
 	tve_set_mode(tve);
+	msleep(1000);
+	dac_enable(tve, true);
 	tve->enable = 1;
 
 	return 0;
@@ -264,6 +421,8 @@
 static void rockchip_tve_encoder_disable(struct drm_encoder *encoder)
 {
 	struct rockchip_tve *tve = encoder_to_tve(encoder);
+	struct drm_crtc *crtc = encoder->crtc;
+	struct rockchip_crtc_state *s = to_rockchip_crtc_state(crtc->state);
 
 	mutex_lock(&tve->suspend_lock);
 
@@ -271,6 +430,8 @@
 	cvbs_set_disable(tve);
 
 	mutex_unlock(&tve->suspend_lock);
+
+	s->output_if &= ~VOP_OUTPUT_IF_TV;
 }
 
 static void rockchip_tve_encoder_mode_set(struct drm_encoder *encoder,
@@ -309,6 +470,7 @@
 				  struct drm_connector_state *conn_state)
 {
 	struct rockchip_crtc_state *s = to_rockchip_crtc_state(crtc_state);
+	struct rockchip_tve *tve = encoder_to_tve(encoder);
 	struct drm_connector *connector = conn_state->connector;
 	struct drm_display_info *info = &connector->display_info;
 
@@ -319,6 +481,14 @@
 	else
 		s->bus_format = MEDIA_BUS_FMT_YUV8_1X24;
 
+	/*
+	 * For RK3528:
+	 * VOP -> BT656 output -> BT656 decoder -> TVE encoder -> CVBS output
+	 */
+	if (tve->soc_type == SOC_RK3528)
+		s->output_if |= VOP_OUTPUT_IF_BT656;
+	else
+		s->output_if |= VOP_OUTPUT_IF_TV;
 	s->color_space = V4L2_COLORSPACE_SMPTE170M;
 	s->tv_state = &conn_state->tv;
 
@@ -354,8 +524,118 @@
 	.atomic_check = rockchip_tve_encoder_atomic_check,
 };
 
-static int tve_parse_dt(struct device_node *np,
-			struct rockchip_tve *tve)
+static int tve_read_otp_by_name(struct rockchip_tve *tve, char *name, u8 *val, u8 default_val)
+{
+	struct nvmem_cell *cell;
+	size_t len;
+	unsigned char *efuse_buf;
+	int ret = -EINVAL;
+
+	*val = default_val;
+	cell = nvmem_cell_get(tve->dev, name);
+	if (!IS_ERR(cell)) {
+		efuse_buf = nvmem_cell_read(cell, &len);
+		nvmem_cell_put(cell);
+		if (!IS_ERR(efuse_buf)) {
+			*val = efuse_buf[0];
+			kfree(efuse_buf);
+			return 0;
+		}
+	}
+
+	dev_err(tve->dev, "failed to read %s from otp, use default\n", name);
+
+	return ret;
+}
+
+static int tve_parse_dt(struct device_node *np, struct rockchip_tve *tve)
+{
+	int ret, val;
+	u8 out_current, version;
+
+	ret = of_property_read_u32(np, "rockchip,tvemode", &val);
+	if (ret < 0) {
+		tve->preferred_mode = 0;
+	} else if (val > 1) {
+		dev_err(tve->dev, "tve mode value invalid\n");
+		return -EINVAL;
+	}
+	tve->preferred_mode = val;
+
+	ret = of_property_read_u32(np, "rockchip,lumafilter0", &val);
+	if (val == 0 || ret < 0)
+		return -EINVAL;
+	tve->lumafilter0 = val;
+
+	ret = of_property_read_u32(np, "rockchip,lumafilter1", &val);
+	if (val == 0 || ret < 0)
+		return -EINVAL;
+	tve->lumafilter1 = val;
+
+	ret = of_property_read_u32(np, "rockchip,lumafilter2", &val);
+	if (val == 0 || ret < 0)
+		return -EINVAL;
+	tve->lumafilter2 = val;
+
+	ret = of_property_read_u32(np, "rockchip,lumafilter3", &val);
+	if (val == 0 || ret < 0)
+		return -EINVAL;
+	tve->lumafilter3 = val;
+
+	ret = of_property_read_u32(np, "rockchip,lumafilter4", &val);
+	if (val == 0 || ret < 0)
+		return -EINVAL;
+	tve->lumafilter4 = val;
+
+	ret = of_property_read_u32(np, "rockchip,lumafilter5", &val);
+	if (val == 0 || ret < 0)
+		return -EINVAL;
+	tve->lumafilter5 = val;
+
+	ret = of_property_read_u32(np, "rockchip,lumafilter6", &val);
+	if (val == 0 || ret < 0)
+		return -EINVAL;
+	tve->lumafilter6 = val;
+
+	ret = of_property_read_u32(np, "rockchip,lumafilter7", &val);
+	if (val == 0 || ret < 0)
+		return -EINVAL;
+	tve->lumafilter7 = val;
+
+	ret = of_property_read_u32(np, "rockchip,tve-upsample", &val);
+	if (val > DCLK_UPSAMPLEx4 || ret < 0)
+		return -EINVAL;
+	tve->upsample_mode = val;
+
+	/*
+	 * Read vdac output current from OTP if exists, and the default
+	 * current val is 0xd2.
+	 */
+	ret = tve_read_otp_by_name(tve, "out-current", &out_current, 0xd2);
+	if (!ret) {
+		if (out_current) {
+			/*
+			 * If test version is 0x0, the value of vdac out current
+			 * needs to be reduced by one.
+			 */
+			ret = tve_read_otp_by_name(tve, "version", &version, 0x0);
+			if (!ret) {
+				if (version == 0x0)
+					out_current -= 1;
+			}
+		} else {
+			/*
+			 * If the current value read from OTP is 0, set it to default.
+			 */
+			out_current = 0xd2;
+		}
+	}
+	tve->vdac_out_current = out_current;
+
+	return 0;
+}
+
+static int tve_parse_dt_legacy(struct device_node *np, struct rockchip_tve *tve)
 {
 	int ret, val;
 	u32 getdac = 0;
@@ -441,9 +721,52 @@
 	return 0;
 }
 
+static bool tve_check_lumafilter(struct rockchip_tve *tve)
+{
+	int lumafilter[8] = {INT_MAX};
+
+	/*
+	 * The default lumafilter value is 0. If lumafilter value
+	 * is equal to the dts value, uboot logo is enabled.
+	 */
+	if (tve->soc_type == SOC_RK3528) {
+		lumafilter[0] = tve_readl(TVE_LUMA_FILTER1);
+		lumafilter[1] = tve_readl(TVE_LUMA_FILTER2);
+		lumafilter[2] = tve_readl(TVE_LUMA_FILTER3);
+		lumafilter[3] = tve_readl(TVE_LUMA_FILTER4);
+		lumafilter[4] = tve_readl(TVE_LUMA_FILTER5);
+		lumafilter[5] = tve_readl(TVE_LUMA_FILTER6);
+		lumafilter[6] = tve_readl(TVE_LUMA_FILTER7);
+		lumafilter[7] = tve_readl(TVE_LUMA_FILTER8);
+
+		if (lumafilter[0] == tve->lumafilter0 &&
+		    lumafilter[1] == tve->lumafilter1 &&
+		    lumafilter[2] == tve->lumafilter2 &&
+		    lumafilter[3] == tve->lumafilter3 &&
+		    lumafilter[4] == tve->lumafilter4 &&
+		    lumafilter[5] == tve->lumafilter5 &&
+		    lumafilter[6] == tve->lumafilter6 &&
+		    lumafilter[7] == tve->lumafilter7) {
+			return true;
+		}
+	} else {
+		lumafilter[0] = tve_readl(TV_LUMA_FILTER0);
+		lumafilter[1] = tve_readl(TV_LUMA_FILTER1);
+		lumafilter[2] = tve_readl(TV_LUMA_FILTER2);
+
+		if (lumafilter[0] == tve->lumafilter0 &&
+		    lumafilter[1] == tve->lumafilter1 &&
+		    lumafilter[2] == tve->lumafilter2) {
+			return true;
+		}
+	}
+
+	return false;
+}
+
 static void check_uboot_logo(struct rockchip_tve *tve)
 {
-	int lumafilter0, lumafilter1, lumafilter2, vdac;
+	int vdac;
 
 	if (tve->soc_type == SOC_RK322X || tve->soc_type == SOC_RK3328) {
 		vdac = tve_dac_readl(VDAC_VDAC1);
@@ -454,17 +777,7 @@
 		}
 	}
 
-	lumafilter0 = tve_readl(TV_LUMA_FILTER0);
-	lumafilter1 = tve_readl(TV_LUMA_FILTER1);
-	lumafilter2 = tve_readl(TV_LUMA_FILTER2);
-
-	/*
-	 * The default lumafilter value is 0. If lumafilter value
-	 * is equal to the dts value, uboot logo is enabled.
-	 */
-	if (lumafilter0 == tve->lumafilter0 &&
-	    lumafilter1 == tve->lumafilter1 &&
-	    lumafilter2 == tve->lumafilter2) {
+	if (tve_check_lumafilter(tve)) {
 		tve->connector.dpms = DRM_MODE_DPMS_ON;
 		return;
 	}
@@ -495,11 +808,17 @@
 	.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 of_device_id rockchip_tve_dt_ids[] = {
 	{ .compatible = "rockchip,rk3036-tve", .data = &rk3036_tve },
 	{ .compatible = "rockchip,rk312x-tve", .data = &rk312x_tve },
 	{ .compatible = "rockchip,rk322x-tve", .data = &rk322x_tve },
 	{ .compatible = "rockchip,rk3328-tve", .data = &rk3328_tve },
+	{ .compatible = "rockchip,rk3528-tve", .data = &rk3528_tve },
 	{}
 };
 
@@ -536,14 +855,16 @@
 		tve->input_format = tve_data->input_format;
 	}
 
-	ret = tve_parse_dt(np, tve);
+	if (tve->soc_type == SOC_RK3528)
+		ret = tve_parse_dt(np, tve);
+	else
+		ret = tve_parse_dt_legacy(np, tve);
 	if (ret) {
 		dev_err(tve->dev, "TVE parse dts error!");
 		return -EINVAL;
 	}
 
 	tve->enable = 0;
-	platform_set_drvdata(pdev, tve);
 	tve->drm_dev = drm_dev;
 	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
 	tve->reg_phy_base = res->start;
@@ -555,7 +876,8 @@
 		return PTR_ERR(tve->regbase);
 	}
 
-	if (tve->soc_type == SOC_RK322X || tve->soc_type == SOC_RK3328) {
+	if (tve->soc_type == SOC_RK322X || tve->soc_type == SOC_RK3328 ||
+	    tve->soc_type == SOC_RK3528) {
 		res = platform_get_resource(pdev, IORESOURCE_MEM, 1);
 		tve->len = resource_size(res);
 		tve->vdacbase = devm_ioremap(tve->dev, res->start, tve->len);
@@ -576,6 +898,56 @@
 		if (ret) {
 			dev_err(tve->dev, "Cannot enable tve aclk: %d\n", ret);
 			return ret;
+		}
+	} else if (tve->soc_type == SOC_RK3528) {
+		tve->hclk = devm_clk_get(tve->dev, "hclk");
+		if (IS_ERR(tve->hclk)) {
+			dev_err(tve->dev, "Unable to get tve hclk\n");
+			return PTR_ERR(tve->hclk);
+		}
+
+		ret = clk_prepare_enable(tve->hclk);
+		if (ret) {
+			dev_err(tve->dev, "Cannot enable tve hclk: %d\n", ret);
+			return ret;
+		}
+
+		tve->pclk_vdac = devm_clk_get(tve->dev, "pclk_vdac");
+		if (IS_ERR(tve->pclk_vdac)) {
+			dev_err(tve->dev, "Unable to get vdac pclk\n");
+			return PTR_ERR(tve->pclk_vdac);
+		}
+
+		ret = clk_prepare_enable(tve->pclk_vdac);
+		if (ret) {
+			dev_err(tve->dev, "Cannot enable vdac pclk: %d\n", ret);
+			return ret;
+		}
+
+		tve->dclk = devm_clk_get(tve->dev, "dclk");
+		if (IS_ERR(tve->dclk)) {
+			dev_err(tve->dev, "Unable to get tve dclk\n");
+			return PTR_ERR(tve->dclk);
+		}
+
+		ret = clk_prepare_enable(tve->dclk);
+		if (ret) {
+			dev_err(tve->dev, "Cannot enable tve dclk: %d\n", ret);
+			return ret;
+		}
+
+		if (tve->upsample_mode == DCLK_UPSAMPLEx4) {
+			tve->dclk_4x = devm_clk_get(tve->dev, "dclk_4x");
+			if (IS_ERR(tve->dclk_4x)) {
+				dev_err(tve->dev, "Unable to get tve dclk_4x\n");
+				return PTR_ERR(tve->dclk_4x);
+			}
+
+			ret = clk_prepare_enable(tve->dclk_4x);
+			if (ret) {
+				dev_err(tve->dev, "Cannot enable tve dclk_4x: %d\n", ret);
+				return ret;
+			}
 		}
 	}
 
@@ -621,6 +993,7 @@
 	rockchip_drm_register_sub_dev(&tve->sub_dev);
 
 	pm_runtime_enable(dev);
+	dev_set_drvdata(dev, tve);
 	dev_dbg(tve->dev, "%s tv encoder probe ok\n", match->compatible);
 
 	return 0;
@@ -648,6 +1021,7 @@
 	drm_encoder_cleanup(&tve->encoder);
 
 	pm_runtime_disable(dev);
+	dev_set_drvdata(dev, NULL);
 }
 
 static const struct component_ops rockchip_tve_component_ops = {
@@ -666,6 +1040,9 @@
 {
 	struct rockchip_tve *tve = dev_get_drvdata(&pdev->dev);
 
+	if (!tve)
+		return;
+
 	mutex_lock(&tve->suspend_lock);
 
 	dev_dbg(tve->dev, "tve shutdown\n");
diff --git a/kernel/drivers/gpu/drm/rockchip/rockchip_drm_tve.h b/kernel/drivers/gpu/drm/rockchip/rockchip_drm_tve.h
index e7d3acc..376b2ff 100644
--- a/kernel/drivers/gpu/drm/rockchip/rockchip_drm_tve.h
+++ b/kernel/drivers/gpu/drm/rockchip/rockchip_drm_tve.h
@@ -17,6 +17,13 @@
 
 #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)
@@ -87,40 +94,123 @@
 
 #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 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_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_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_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)
 
-       #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_CVBS_CON	0x60010
+	#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_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 BT656
+#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)
+
+// RK3528 CVBS TVE
+#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,
@@ -136,7 +226,14 @@
 	SOC_RK3036 = 0,
 	SOC_RK312X,
 	SOC_RK322X,
-	SOC_RK3328
+	SOC_RK3328,
+	SOC_RK3528
+};
+
+enum {
+	DCLK_UPSAMPLEx1 = 0,
+	DCLK_UPSAMPLEx2,
+	DCLK_UPSAMPLEx4
 };
 
 #define grf_writel(offset, v)	do { \
@@ -154,12 +251,16 @@
 	void __iomem			*regbase;
 	void __iomem			*vdacbase;
 	struct clk			*aclk;
-	struct clk			*dac_clk;
+	struct clk			*hclk;
+	struct clk			*pclk_vdac;
+	struct clk			*dclk;
+	struct clk			*dclk_4x;
 	struct regmap			*dac_grf;
 	u32				reg_phy_base;
 	u32				len;
 	int				input_format;
 	int				soc_type;
+	int				upsample_mode;
 	bool				enable;
 	u32 test_mode;
 	u32 saturation;
@@ -168,9 +269,15 @@
 	u32 lumafilter0;
 	u32 lumafilter1;
 	u32 lumafilter2;
+	u32 lumafilter3;
+	u32 lumafilter4;
+	u32 lumafilter5;
+	u32 lumafilter6;
+	u32 lumafilter7;
 	u32 daclevel;
 	u32 dac1level;
 	u32 preferred_mode;
+	u8 vdac_out_current;
 	struct mutex suspend_lock;	/* mutex for tve resume operation*/
 	struct rockchip_drm_sub_dev sub_dev;
 };
diff --git a/kernel/drivers/gpu/drm/rockchip/rockchip_drm_vop.c b/kernel/drivers/gpu/drm/rockchip/rockchip_drm_vop.c
index 5eb9265..7bb333f 100644
--- a/kernel/drivers/gpu/drm/rockchip/rockchip_drm_vop.c
+++ b/kernel/drivers/gpu/drm/rockchip/rockchip_drm_vop.c
@@ -1670,6 +1670,12 @@
 	vop = to_vop(crtc);
 	vop_data = vop->data;
 
+	if (VOP_MAJOR(vop->version) == 2 && is_alpha_support(fb->format->format) &&
+	    vop_plane_state->global_alpha != 0xff) {
+		DRM_ERROR("Pixel alpha and global alpha can't be enabled at the same time\n");
+		return -EINVAL;
+	}
+
 	if (state->src_w >> 16 < 4 || state->src_h >> 16 < 4 ||
 	    state->crtc_w < 4 || state->crtc_h < 4) {
 		DRM_ERROR("Invalid size: %dx%d->%dx%d, min size is 4x4\n",
diff --git a/kernel/drivers/gpu/drm/rockchip/rockchip_drm_vop.h b/kernel/drivers/gpu/drm/rockchip/rockchip_drm_vop.h
index ae92b87..a0677dd 100644
--- a/kernel/drivers/gpu/drm/rockchip/rockchip_drm_vop.h
+++ b/kernel/drivers/gpu/drm/rockchip/rockchip_drm_vop.h
@@ -24,6 +24,7 @@
 #define VOP_MAJOR(version)		((version) >> 8)
 #define VOP_MINOR(version)		((version) & 0xff)
 
+#define VOP_VERSION_RK3528	VOP_VERSION(0x50, 0x17)
 #define VOP_VERSION_RK3568	VOP_VERSION(0x40, 0x15)
 #define VOP_VERSION_RK3588	VOP_VERSION(0x40, 0x17)
 
@@ -42,6 +43,9 @@
 /* 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)
@@ -92,10 +96,10 @@
 };
 
 enum vop3_esmart_lb_mode {
-	VOP3_ESMART_ONE_8K_MODE,
-	VOP3_ESMART_TWO_4K_MODE,
-	VOP3_ESMART_ONE_4K_AND_TWO_2K_MODE,
-	VOP3_ESMART_FOUR_2K_MODE,
+	VOP3_ESMART_8K_MODE,
+	VOP3_ESMART_4K_4K_MODE,
+	VOP3_ESMART_4K_2K_2K_MODE,
+	VOP3_ESMART_2K_2K_2K_2K_MODE,
 };
 
 #define DSP_BG_SWAP		0x1
@@ -439,6 +443,104 @@
 	const uint32_t *sdr2hdr_st2084oetf_xn;
 };
 
+#define RK_HDRVIVID_TONE_SCA_TAB_LENGTH		257
+#define RK_HDRVIVID_GAMMA_CURVE_LENGTH		81
+#define RK_HDRVIVID_GAMMA_MDFVALUE_LENGTH	9
+#define RK_SDR2HDR_INVGAMMA_CURVE_LENGTH	69
+#define RK_SDR2HDR_INVGAMMA_S_IDX_LENGTH	6
+#define RK_SDR2HDR_INVGAMMA_C_IDX_LENGTH	6
+#define RK_SDR2HDR_SMGAIN_LENGTH		64
+#define RK_HDRVIVID_TONE_SCA_AXI_TAB_LENGTH	264
+
+struct hdrvivid_regs {
+	uint32_t sdr2hdr_ctrl;
+	uint32_t sdr2hdr_coe0;
+	uint32_t sdr2hdr_coe1;
+	uint32_t sdr2hdr_csc_coe00_01;
+	uint32_t sdr2hdr_csc_coe02_10;
+	uint32_t sdr2hdr_csc_coe11_12;
+	uint32_t sdr2hdr_csc_coe20_21;
+	uint32_t sdr2hdr_csc_coe22;
+	uint32_t hdrvivid_ctrl;
+	uint32_t hdr_pq_gamma;
+	uint32_t hlg_rfix_scalefac;
+	uint32_t hlg_maxluma;
+	uint32_t hlg_r_tm_lin2non;
+	uint32_t hdr_csc_coe00_01;
+	uint32_t hdr_csc_coe02_10;
+	uint32_t hdr_csc_coe11_12;
+	uint32_t hdr_csc_coe20_21;
+	uint32_t hdr_csc_coe22;
+	uint32_t hdr_tone_sca[RK_HDRVIVID_TONE_SCA_TAB_LENGTH];
+	uint32_t hdrgamma_curve[RK_HDRVIVID_GAMMA_CURVE_LENGTH];
+	uint32_t hdrgamma_mdfvalue[RK_HDRVIVID_GAMMA_MDFVALUE_LENGTH];
+	uint32_t sdrinvgamma_curve[RK_SDR2HDR_INVGAMMA_CURVE_LENGTH];
+	uint32_t sdrinvgamma_startidx[RK_SDR2HDR_INVGAMMA_S_IDX_LENGTH];
+	uint32_t sdrinvgamma_changeidx[RK_SDR2HDR_INVGAMMA_C_IDX_LENGTH];
+	uint32_t sdr_smgain[RK_SDR2HDR_SMGAIN_LENGTH];
+	uint32_t hdr_mode;
+	uint32_t tone_sca_axi_tab[RK_HDRVIVID_TONE_SCA_AXI_TAB_LENGTH];
+};
+
+struct hdr_extend {
+	uint32_t hdr_type;
+	uint32_t length;
+	union {
+		struct hdrvivid_regs hdrvivid_data;
+	};
+};
+
+enum _vop_hdrvivid_mode {
+	PQHDR2HDR_WITH_DYNAMIC = 0,
+	PQHDR2SDR_WITH_DYNAMIC,
+	HLG2PQHDR_WITH_DYNAMIC,
+	HLG2SDR_WITH_DYNAMIC,
+	HLG2PQHDR_WITHOUT_DYNAMIC,
+	HLG2SDR_WITHOUT_DYNAMIC,
+	HDR_BYPASS,
+	HDR102SDR,
+	SDR2HDR10,
+	SDR2HLG,
+	SDR2HDR10_USERSPACE = 100,
+	SDR2HLG_USERSPACE = 101,
+};
+
+enum vop_hdr_format {
+	HDR_NONE = 0,
+	HDR_HDR10 = 1,
+	HDR_HLGSTATIC = 2,
+	RESERVED3 = 3,		/* reserved for more future static hdr format */
+	RESERVED4 = 4,		/* reserved for more future static hdr format */
+	HDR_HDRVIVID = 5,
+	RESERVED6 = 6,		/* reserved for hdr vivid */
+	RESERVED7 = 7,		/* reserved for hdr vivid */
+	HDR_HDR10PLUS = 8,
+	RESERVED9 = 9,		/* reserved for hdr hdr10+ */
+	RESERVED10 = 10,	/* reserved for hdr hdr10+ */
+	HDR_NEXT = 11,
+	RESERVED12 = 12,	/* reserved for other dynamic hdr format */
+	RESERVED13 = 13,	/* reserved for other dynamic hdr format */
+	HDR_FORMAT_MAX,
+};
+
+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;
+};
+
 enum {
 	VOP_CSC_Y2R_BT601,
 	VOP_CSC_Y2R_BT709,
@@ -509,6 +611,8 @@
 	struct vop_reg enable;
 	struct vop_reg afbc_enable;
 	struct vop_reg lb_mode;
+	struct vop_reg scl_lb_mode;
+	struct vop_reg frm_reset_en;
 
 	struct vop_reg src_color_ctrl;
 	struct vop_reg dst_color_ctrl;
@@ -626,6 +730,13 @@
 	struct vop_reg hdr_lut_update_en;
 	struct vop_reg hdr_lut_mode;
 	struct vop_reg hdr_lut_mst;
+	struct vop_reg hdr_lut_fetch_done;
+	struct vop_reg hdr_vivid_en;
+	struct vop_reg hdr_vivid_bypass_en;
+	struct vop_reg hdr_vivid_path_mode;
+	struct vop_reg hdr_vivid_dstgamut;
+	struct vop_reg sdr2hdr_en;
+	struct vop_reg sdr2hdr_dstmode;
 	struct vop_reg sdr2hdr_eotf_en;
 	struct vop_reg sdr2hdr_r2r_en;
 	struct vop_reg sdr2hdr_r2r_mode;
@@ -677,6 +788,25 @@
 	struct vop_reg edpi_wms_fs;
 	struct vop_reg gamma_update_en;
 	struct vop_reg lut_dma_rid;
+
+	/* CSC */
+	struct vop_reg acm_bypass_en;
+	struct vop_reg csc_en;
+	struct vop_reg acm_r2y_en;
+	struct vop_reg csc_mode;
+	struct vop_reg acm_r2y_mode;
+	struct vop_reg csc_coe00;
+	struct vop_reg csc_coe01;
+	struct vop_reg csc_coe02;
+	struct vop_reg csc_coe10;
+	struct vop_reg csc_coe11;
+	struct vop_reg csc_coe12;
+	struct vop_reg csc_coe20;
+	struct vop_reg csc_coe21;
+	struct vop_reg csc_coe22;
+	struct vop_reg csc_offset0;
+	struct vop_reg csc_offset1;
+	struct vop_reg csc_offset2;
 };
 
 struct vop2_wb_regs {
@@ -711,7 +841,6 @@
 	uint8_t axi_id;
 	uint8_t axi_yrgb_id;
 	uint8_t axi_uv_id;
-	uint8_t scale_engine_num;
 	uint8_t possible_crtcs;
 
 	uint32_t base;
@@ -775,6 +904,11 @@
 	uint16_t cubic_lut_len;
 	struct vop_rect max_output;
 	const u8 pre_scan_max_dly[4];
+	const u8 hdrvivid_dly[10];
+	const u8 sdr2hdr_dly;
+	const u8 layer_mix_dly;
+	const u8 hdr_mix_dly;
+	const u8 win_dly;
 	const struct vop_intr *intr;
 	const struct vop_hdr_table *hdr_table;
 	const struct vop2_video_port_regs *regs;
@@ -849,6 +983,7 @@
 	struct vop_reg version;
 	struct vop_reg standby;
 	struct vop_reg dma_stop;
+	struct vop_reg dsp_vs_t_sel;
 	struct vop_reg lut_dma_en;
 	struct vop_reg axi_outstanding_max_num;
 	struct vop_reg axi_max_outstanding_en;
diff --git a/kernel/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c b/kernel/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c
index 35128d4..7757b07 100644
--- a/kernel/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c
+++ b/kernel/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c
@@ -35,6 +35,8 @@
 #include <linux/swab.h>
 #include <linux/sort.h>
 #include <linux/rockchip/cpu.h>
+#include <linux/workqueue.h>
+#include <linux/types.h>
 #include <soc/rockchip/rockchip_dmc.h>
 #include <soc/rockchip/rockchip-system-status.h>
 #include <uapi/linux/videodev2.h>
@@ -47,6 +49,7 @@
 #include "rockchip_drm_psr.h"
 #include "rockchip_drm_vop.h"
 #include "rockchip_vop_reg.h"
+#include "rockchip_post_csc.h"
 
 #define _REG_SET(vop2, name, off, reg, mask, v, relaxed) \
 		vop2_mask_write(vop2, off + reg.offset, mask, reg.shift, v, reg.write_mask, relaxed)
@@ -78,6 +81,8 @@
 
 #define VOP_CTRL_SET(x, name, v) \
 		REG_SET(x, name, 0, (x)->data->ctrl->name, v, false)
+
+#define VOP_CTRL_GET(x, name) vop2_read_reg(x, 0, &(x)->data->ctrl->name)
 
 #define VOP_INTR_GET(vop2, name) \
 		vop2_read_reg(vop2, 0, &vop2->data->ctrl->name)
@@ -477,6 +482,8 @@
 	uint8_t id;
 	bool layer_sel_update;
 	bool xmirror_en;
+	bool need_reset_p2i_flag;
+	atomic_t post_buf_empty_flag;
 	const struct vop2_video_port_regs *regs;
 
 	struct completion dsp_hold_completion;
@@ -555,6 +562,11 @@
 	bool gamma_lut_active;
 
 	/**
+	 * @lut_dma_rid: lut dma id
+	 */
+	u16 lut_dma_rid;
+
+	/**
 	 * @gamma_lut: atomic gamma look up table
 	 */
 	struct drm_color_lut *gamma_lut;
@@ -568,6 +580,11 @@
 	 * @cubic_lut_gem_obj: gem obj to store cubic lut
 	 */
 	struct rockchip_gem_object *cubic_lut_gem_obj;
+
+	/**
+	 * @hdr_lut_gem_obj: gem obj to store hdr lut
+	 */
+	struct rockchip_gem_object *hdr_lut_gem_obj;
 
 	/**
 	 * @cubic_lut: cubic look up table
@@ -591,10 +608,29 @@
 	struct drm_property *plane_mask_prop;
 
 	/**
+	 * @hdr_ext_data_prop: hdr extend data interaction with userspace
+	 */
+	struct drm_property *hdr_ext_data_prop;
+
+	int hdrvivid_mode;
+
+	/**
+	 * @acm_lut_data_prop: acm lut data interaction with userspace
+	 */
+	struct drm_property *acm_lut_data_prop;
+	/**
+	 * @post_csc_data_prop: post csc data interaction with userspace
+	 */
+	struct drm_property *post_csc_data_prop;
+
+	/**
 	 * @primary_plane_phy_id: vp primary plane phy id, the primary plane
 	 * will be used to show uboot logo and kernel logo
 	 */
 	enum vop2_layer_phy_id primary_plane_phy_id;
+
+	struct post_acm acm_info;
+	struct post_csc csc_info;
 };
 
 struct vop2 {
@@ -652,6 +688,7 @@
 	 */
 	uint32_t registered_num_wins;
 	uint8_t used_mixers;
+	uint8_t esmart_lb_mode;
 	/**
 	 * @active_vp_mask: Bitmask of active video ports;
 	 */
@@ -684,6 +721,8 @@
 	unsigned int enable_count;
 	struct clk *hclk;
 	struct clk *aclk;
+	struct work_struct post_buf_empty_work;
+	struct workqueue_struct *workqueue;
 
 	struct vop2_layer layers[ROCKCHIP_MAX_LAYER];
 	/* must put at the end of the struct */
@@ -717,6 +756,7 @@
 	{ MEDIA_BUS_FMT_UYVY8_2X8, "UYVY8_2X8" },
 	{ MEDIA_BUS_FMT_YUYV8_1X16, "YUYV8_1X16" },
 	{ MEDIA_BUS_FMT_UYVY8_1X16, "UYVY8_1X16" },
+	{ MEDIA_BUS_FMT_RGB101010_1X30, "RGB101010_1x30" },
 };
 
 static DRM_ENUM_NAME_FN(drm_get_bus_format_name, drm_bus_format_enum_list)
@@ -991,8 +1031,23 @@
 static uint32_t vop2_read_vcnt(struct vop2_video_port *vp)
 {
 	uint32_t offset =  RK3568_SYS_STATUS0 + (vp->id << 2);
+	uint32_t vcnt0, vcnt1;
+	int i = 0;
 
-	return vop2_readl(vp->vop2, offset) >> 16;
+	for (i = 0; i < 10; i++) {
+		vcnt0 = vop2_readl(vp->vop2, offset) >> 16;
+		vcnt1 = vop2_readl(vp->vop2, offset) >> 16;
+
+		if ((vcnt1 - vcnt0) <= 1)
+			break;
+	}
+
+	if (i == 10) {
+		DRM_DEV_ERROR(vp->vop2->dev, "read VP%d vcnt error: %d %d\n", vp->id, vcnt0, vcnt1);
+		vcnt1 = vop2_readl(vp->vop2, offset) >> 16;
+	}
+
+	return vcnt1;
 }
 
 static void vop2_wait_for_irq_handler(struct drm_crtc *crtc)
@@ -1864,7 +1919,7 @@
 #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))
+					(fac * (dst - 1) >> 16 < (src - 1))
 
 static uint16_t vop2_scale_factor(enum scale_mode mode,
 				  int32_t filter_mode,
@@ -1983,12 +2038,30 @@
 		}
 	}
 
-	if (src_h >= (4 * dst_h)) {
-		ygt4 = 1;
-		src_h >>= 2;
-	} else if (src_h >= (2 * dst_h)) {
-		ygt2 = 1;
-		src_h >>= 1;
+	/**
+	 * The rk3528 is processed as 2 pixel/cycle,
+	 * so ygt2/ygt4 needs to be triggered in advance to improve performance
+	 * when src_w is bigger than 1920.
+	 * dst_h / src_h is at [1, 0.65)     ygt2=0; ygt4=0;
+	 * dst_h / src_h is at [0.65, 0.35)  ygt2=1; ygt4=0;
+	 * dst_h / src_h is at [0.35, 0)     ygt2=0; ygt4=1;
+	 */
+	if (vop2->version == VOP_VERSION_RK3528 && src_w > 1920) {
+		if (src_h >= (100 * dst_h / 35)) {
+			ygt4 = 1;
+			src_h >>= 2;
+		} else if ((src_h >= 100 * dst_h / 65) && (src_h < 100 * dst_h / 35)) {
+			ygt2 = 1;
+			src_h >>= 1;
+		}
+	} else {
+		if (src_h >= (4 * dst_h)) {
+			ygt4 = 1;
+			src_h >>= 2;
+		} else if (src_h >= (2 * dst_h)) {
+			ygt2 = 1;
+			src_h >>= 1;
+		}
 	}
 
 	yrgb_hor_scl_mode = scl_get_scl_mode(src_w, dst_w);
@@ -2065,10 +2138,17 @@
 		if (!is_vop3(vop2) ||
 		    (!vpstate->afbc_en && !vpstate->tiled_en) ||
 		    win_data->vsd_pre_filter_mode == VOP3_PRE_SCALE_DOWN_GT) {
-			if (cbcr_src_h >= (4 * dst_h))
-				ygt4 = 1;
-			else if (cbcr_src_h >= (2 * dst_h))
-				ygt2 = 1;
+			if (vop2->version == VOP_VERSION_RK3528 && src_w > 1920) {
+				if (cbcr_src_h >= (100 * dst_h / 35))
+					ygt4 = 1;
+				else if ((cbcr_src_h >= 100 * dst_h / 65) && (cbcr_src_h < 100 * dst_h / 35))
+					ygt2 = 1;
+			} else {
+				if (cbcr_src_h >= (4 * dst_h))
+					ygt4 = 1;
+				else if (cbcr_src_h >= (2 * dst_h))
+					ygt2 = 1;
+			}
 
 			if (ygt4)
 				cbcr_src_h >>= 2;
@@ -2230,29 +2310,49 @@
 	vpstate->r2y_en = 0;
 	vpstate->csc_mode = 0;
 
-	/* hdr2sdr and sdr2hdr will do csc itself */
-	if (vpstate->hdr2sdr_en) {
-		/*
-		 * This is hdr2sdr enabled plane
-		 * If it's RGB layer do hdr2sdr, we need to do r2y before send to hdr2sdr,
-		 * because hdr2sdr only support yuv input.
-		 */
-		if (!is_input_yuv) {
-			vpstate->r2y_en = 1;
-			vpstate->csc_mode = vop2_convert_csc_mode(output_csc, CSC_10BIT_DEPTH);
+	if (is_vop3(vp->vop2)) {
+		if (vpstate->hdr_in) {
+			if (is_input_yuv) {
+				vpstate->y2r_en = 1;
+				vpstate->csc_mode = vop2_convert_csc_mode(input_csc,
+									  CSC_13BIT_DEPTH);
+			}
+			return;
+		} else if (vp->sdr2hdr_en) {
+			if (is_input_yuv) {
+				vpstate->y2r_en = 1;
+				vpstate->csc_mode = vop2_convert_csc_mode(input_csc,
+									  csc_y2r_bit_depth);
+			}
+			return;
 		}
-		return;
-	} else if (!vpstate->hdr_in && vp->sdr2hdr_en) {
-		/*
-		 * This is sdr2hdr enabled plane
-		 * If it's YUV layer do sdr2hdr, we need to do y2r before send to sdr2hdr,
-		 * because sdr2hdr only support rgb input.
-		 */
-		if (is_input_yuv) {
-			vpstate->y2r_en = 1;
-			vpstate->csc_mode = vop2_convert_csc_mode(input_csc, csc_y2r_bit_depth);
+	} else {
+		/* hdr2sdr and sdr2hdr will do csc itself */
+		if (vpstate->hdr2sdr_en) {
+			/*
+			 * This is hdr2sdr enabled plane
+			 * If it's RGB layer do hdr2sdr, we need to do r2y before send to hdr2sdr,
+			 * because hdr2sdr only support yuv input.
+			 */
+			if (!is_input_yuv) {
+				vpstate->r2y_en = 1;
+				vpstate->csc_mode = vop2_convert_csc_mode(output_csc,
+									  CSC_10BIT_DEPTH);
+			}
+			return;
+		} else if (!vpstate->hdr_in && vp->sdr2hdr_en) {
+			/*
+			 * This is sdr2hdr enabled plane
+			 * If it's YUV layer do sdr2hdr, we need to do y2r before send to sdr2hdr,
+			 * because sdr2hdr only support rgb input.
+			 */
+			if (is_input_yuv) {
+				vpstate->y2r_en = 1;
+				vpstate->csc_mode = vop2_convert_csc_mode(input_csc,
+									  csc_y2r_bit_depth);
+			}
+			return;
 		}
-		return;
 	}
 
 	if (is_input_yuv && !is_output_yuv) {
@@ -2657,7 +2757,7 @@
 		fifo_throd = fb->pitches[0] >> 4;
 		if (fifo_throd >= vop2->data->wb->fifo_depth)
 			fifo_throd = vop2->data->wb->fifo_depth;
-		r2y = fb->format->is_yuv && (!is_yuv_output(vcstate->bus_format));
+		r2y = !vcstate->yuv_overlay && fb->format->is_yuv;
 
 		/*
 		 * the vp_id register config done immediately
@@ -2963,25 +3063,16 @@
  */
 static void vop3_layer_map_initial(struct vop2 *vop2, uint32_t current_vp_id)
 {
-	struct vop2_video_port *vp;
-	struct vop2_win *win;
-	unsigned long win_mask;
 	uint16_t vp_id;
-	int phys_id;
-	int i;
+	struct drm_plane *plane = NULL;
 
-	for (i = 0; i < vop2->data->nr_vps; i++) {
-		vp_id = i;
-		vp = &vop2->vps[vp_id];
-		vp->win_mask = vp->plane_mask;
-		win_mask = vp->win_mask;
-		for_each_set_bit(phys_id, &win_mask, ROCKCHIP_MAX_LAYER) {
-			win = vop2_find_win_by_phys_id(vop2, phys_id);
-			VOP_CTRL_SET(vop2, win_vp_id[phys_id], vp_id);
-			win->vp_mask = BIT(vp_id);
-			win->old_vp_mask = win->vp_mask;
-			DRM_DEV_DEBUG(vop2->dev, "%s attach to vp%d\n", win->name, vp_id);
-		}
+	drm_for_each_plane(plane, vop2->drm_dev) {
+		struct vop2_win *win = to_vop2_win(plane);
+
+		vp_id = VOP_CTRL_GET(vop2, win_vp_id[win->phys_id]);
+		win->vp_mask = BIT(vp_id);
+		win->old_vp_mask = win->vp_mask;
+		vop2->vps[vp_id].win_mask |= BIT(win->phys_id);
 	}
 }
 
@@ -3081,8 +3172,17 @@
 		VOP_MODULE_SET(vop2, wb, axi_uv_id, 0xe);
 		vop2_wb_cfg_done(vp);
 
-		if (is_vop3(vop2))
-			VOP_CTRL_SET(vop2, esmart_lb_mode, vop2->data->esmart_lb_mode);
+		if (is_vop3(vop2)) {
+			VOP_CTRL_SET(vop2, dsp_vs_t_sel, 0);
+			VOP_CTRL_SET(vop2, esmart_lb_mode, vop2->esmart_lb_mode);
+		}
+
+		/*
+		 * This is unused and error init value for rk3528 vp1, if less of this config,
+		 * vp1 can't display normally.
+		 */
+		if (vop2->version == VOP_VERSION_RK3528)
+			vop2_mask_write(vop2, 0x700, 0x3, 4, 0, 0, true);
 
 		VOP_CTRL_SET(vop2, cfg_done_en, 1);
 		/*
@@ -3151,6 +3251,7 @@
 {
 	struct vop2_video_port *vp = to_vop2_video_port(crtc);
 	struct vop2 *vop2 = vp->vop2;
+	const struct vop2_video_port_data *vp_data = &vop2->data->vp[vp->id];
 	int ret;
 
 	WARN_ON(vp->event);
@@ -3163,6 +3264,8 @@
 		VOP_MODULE_SET(vop2, vp, cubic_lut_en, 0);
 	}
 
+	if (vp_data->feature & VOP_FEATURE_VIVID_HDR)
+		VOP_MODULE_SET(vop2, vp, hdr_lut_update_en, 0);
 	vop2_disable_all_planes_for_crtc(crtc);
 
 	/*
@@ -3188,6 +3291,7 @@
 	vop2_dsp_hold_valid_irq_disable(crtc);
 
 	vop2_disable(crtc);
+	memset(&vp->active_tv_state, 0, sizeof(vp->active_tv_state));
 	vop2_unlock(vop2);
 
 	vop2->active_vp_mask &= ~BIT(vp->id);
@@ -3500,7 +3604,7 @@
 	uint32_t actual_w, actual_h, dsp_w, dsp_h;
 	uint32_t dsp_stx, dsp_sty;
 	uint32_t act_info, dsp_info, dsp_st;
-	uint32_t format;
+	uint32_t format, check_size;
 	uint32_t afbc_format;
 	uint32_t rb_swap;
 	uint32_t uv_swap;
@@ -3569,18 +3673,19 @@
 	actual_w = drm_rect_width(src) >> 16;
 	actual_h = drm_rect_height(src) >> 16;
 	dsp_w = drm_rect_width(dest);
-	if (dest->x1 + dsp_w > adjusted_mode->hdisplay) {
+	if (dest->x1 + dsp_w > adjusted_mode->crtc_hdisplay) {
 		DRM_ERROR("vp%d %s dest->x1[%d] + dsp_w[%d] exceed mode hdisplay[%d]\n",
-			  vp->id, win->name, dest->x1, dsp_w, adjusted_mode->hdisplay);
+			  vp->id, win->name, dest->x1, dsp_w, adjusted_mode->crtc_hdisplay);
 		dsp_w = adjusted_mode->hdisplay - dest->x1;
 		if (dsp_w < 4)
 			dsp_w = 4;
 		actual_w = dsp_w * actual_w / drm_rect_width(dest);
 	}
 	dsp_h = drm_rect_height(dest);
-	if (dest->y1 + dsp_h > adjusted_mode->vdisplay) {
+	check_size = adjusted_mode->flags & DRM_MODE_FLAG_INTERLACE ? adjusted_mode->vdisplay : adjusted_mode->crtc_vdisplay;
+	if (dest->y1 + dsp_h > check_size) {
 		DRM_ERROR("vp%d %s dest->y1[%d] + dsp_h[%d] exceed mode vdisplay[%d]\n",
-			  vp->id, win->name, dest->y1, dsp_h, adjusted_mode->vdisplay);
+			  vp->id, win->name, dest->y1, dsp_h, adjusted_mode->crtc_vdisplay);
 		dsp_h = adjusted_mode->vdisplay - dest->y1;
 		if (dsp_h < 4)
 			dsp_h = 4;
@@ -3588,20 +3693,25 @@
 	}
 
 	/*
-	 * This is workaround solution for IC design:
-	 * esmart can't support scale down when actual_w % 16 == 1.
+	 * Workaround only for rk3568 vop
 	 */
-	if (!(win->feature & WIN_FEATURE_AFBDC)) {
-		if (actual_w > dsp_w && (actual_w & 0xf) == 1) {
-			DRM_WARN("vp%d %s act_w[%d] MODE 16 == 1\n", vp->id, win->name, actual_w);
-			actual_w -= 1;
+	if (vop2->version == VOP_VERSION_RK3568) {
+		/*
+		 * This is workaround solution for IC design:
+		 * esmart can't support scale down when actual_w % 16 == 1.
+		 */
+		if (!(win->feature & WIN_FEATURE_AFBDC)) {
+			if (actual_w > dsp_w && (actual_w & 0xf) == 1) {
+				DRM_WARN("vp%d %s act_w[%d] MODE 16 == 1\n", vp->id, win->name, actual_w);
+				actual_w -= 1;
+			}
 		}
-	}
 
-	if (vpstate->afbc_en && actual_w % 4) {
-		DRM_ERROR("vp%d %s actual_w[%d] should align as 4 pixel when enable afbc\n",
-			  vp->id, win->name, actual_w);
-		actual_w = ALIGN_DOWN(actual_w, 4);
+		if (vpstate->afbc_en && actual_w % 4) {
+			DRM_ERROR("vp%d %s actual_w[%d] should align as 4 pixel when enable afbc\n",
+				  vp->id, win->name, actual_w);
+			actual_w = ALIGN_DOWN(actual_w, 4);
+		}
 	}
 
 	act_info = (actual_h - 1) << 16 | ((actual_w - 1) & 0xffff);
@@ -3633,7 +3743,7 @@
 	if (vop2->version != VOP_VERSION_RK3568)
 		rk3588_vop2_win_cfg_axi(win);
 
-	if (is_vop3(vop2) && !vop2_cluster_window(win))
+	if (is_vop3(vop2) && !vop2_cluster_window(win) && !win->parent)
 		VOP_WIN_SET(vop2, win, scale_engine_num, win->scale_engine_num);
 
 	if (vpstate->afbc_en) {
@@ -3765,7 +3875,9 @@
 	if (vop2_cluster_window(win)) {
 		lb_mode = vop2_get_cluster_lb_mode(win, vpstate);
 		VOP_CLUSTER_SET(vop2, win, lb_mode, lb_mode);
+		VOP_CLUSTER_SET(vop2, win, scl_lb_mode, lb_mode == 1 ? 3 : 0);
 		VOP_CLUSTER_SET(vop2, win, enable, 1);
+		VOP_CLUSTER_SET(vop2, win, frm_reset_en, 1);
 	}
 	if (vcstate->output_if & VOP_OUTPUT_IF_BT1120 ||
 	    vcstate->output_if & VOP_OUTPUT_IF_BT656)
@@ -4736,6 +4848,27 @@
 				 struct drm_display_mode *adj_mode)
 {
 	struct vop2_video_port *vp = to_vop2_video_port(crtc);
+	struct vop2 *vop2 = vp->vop2;
+
+	/*
+	 * For RK3568 and RK3588, the hactive of video timing must
+	 * be 4-pixel aligned.
+	 */
+	if (vop2->version == VOP_VERSION_RK3568 || vop2->version == VOP_VERSION_RK3588) {
+		if (adj_mode->hdisplay % 4) {
+			u16 old_hdisplay = adj_mode->hdisplay;
+			u16 align;
+
+			align = 4 - (adj_mode->hdisplay % 4);
+			adj_mode->hdisplay += align;
+			adj_mode->hsync_start += align;
+			adj_mode->hsync_end += align;
+			adj_mode->htotal += align;
+
+			DRM_WARN("VP%d: hactive need to be aligned with 4-pixel, %d -> %d\n",
+				 vp->id, old_hdisplay, adj_mode->hdisplay);
+		}
+	}
 
 	drm_mode_set_crtcinfo(adj_mode, CRTC_INTERLACE_HALVE_V | CRTC_STEREO_DOUBLE);
 
@@ -4799,6 +4932,8 @@
 			to_rockchip_crtc_state(crtc->state);
 	struct vop2_video_port *vp = to_vop2_video_port(crtc);
 	struct vop2 *vop2 = vp->vop2;
+	const struct vop2_data *vop2_data = vop2->data;
+	const struct vop2_video_port_data *vp_data = &vop2_data->vp[vp->id];
 	struct drm_display_mode *mode = &crtc->state->adjusted_mode;
 	u16 vtotal = mode->crtc_vtotal;
 	u16 hdisplay = mode->crtc_hdisplay;
@@ -4838,8 +4973,16 @@
 		val = vact_st_f1 << 16 | vact_end_f1;
 		VOP_MODULE_SET(vop2, vp, vpost_st_end_f1, val);
 	}
-	VOP_MODULE_SET(vop2, vp, post_dsp_out_r2y,
-		       is_yuv_output(vcstate->bus_format));
+
+	/*
+	 * BCSH[R2Y] -> POST Linebuffer[post scale] -> the background R2Y will be deal by post_dsp_out_r2y
+	 *
+	 * POST Linebuffer[post scale] -> ACM[R2Y] -> the background R2Y will be deal by ACM[R2Y]
+	 */
+	if (vp_data->feature & VOP_FEATURE_POST_ACM)
+		VOP_MODULE_SET(vop2, vp, post_dsp_out_r2y, vcstate->yuv_overlay);
+	else
+		VOP_MODULE_SET(vop2, vp, post_dsp_out_r2y, is_yuv_output(vcstate->bus_format));
 }
 
 /*
@@ -4880,6 +5023,107 @@
 	return false;
 }
 
+/*
+ * For vop3 video port0, if hdr_vivid is not enable, the pipe delay time as follow:
+ * win_dly + config_win_dly + layer_mix_dly + sdr2hdr_dly + * hdr_mix_dly = config_bg_dly
+ *
+ * if hdr_vivid is enable, the hdr layer's pipe delay time as follow:
+ * win_dly + config_win_dly +hdrvivid_dly + hdr_mix_dly = config_bg_dly
+ *
+ * If hdrvivid and sdr2hdr bot enable, the time arrivr hdr_mix should be the same:
+ * win_dly + config_win_dly0 + hdrvivid_dly = win_dly + config_win_dly1 + laer_mix_dly +
+ * sdr2hdr_dly
+ *
+ * For vop3 video port1, the pipe delay time as follow:
+ * win_dly + config_win_dly + layer_mix_dly = config_bg_dly
+ *
+ * Here, win_dly, layer_mix_dly, sdr2hdr_dly, hdr_mix_dly, hdrvivid_dly is the hardware
+ * delay cycles. Config_win_dly and config_bg_dly is the register value that we can config.
+ * Different hdr vivid mode have different hdrvivid_dly. For sdr2hdr_dly, only sde2hdr
+ * enable, it will delay, otherwise, the sdr2hdr_dly is 0.
+ *
+ * For default, the config_win_dly will be 0, it just user to make the pipe to arrive
+ * hdr_mix at the same time.
+ */
+static void vop3_setup_pipe_dly(struct vop2_video_port *vp, const struct vop2_zpos *vop2_zpos)
+{
+	struct vop2 *vop2 = vp->vop2;
+	struct drm_crtc *crtc = &vp->crtc;
+	const struct vop2_zpos *zpos;
+	struct drm_plane *plane;
+	struct vop2_plane_state *vpstate;
+	struct vop2_win *win;
+	const struct vop2_data *vop2_data = vop2->data;
+	const struct vop2_video_port_data *vp_data = &vop2_data->vp[vp->id];
+	struct drm_display_mode *adjusted_mode = &crtc->state->adjusted_mode;
+	u16 hsync_len = adjusted_mode->crtc_hsync_end - adjusted_mode->crtc_hsync_start;
+	u16 hdisplay = adjusted_mode->crtc_hdisplay;
+	int bg_dly = 0x0;
+	int dly = 0x0;
+	int hdr_win_dly;
+	int sdr_win_dly;
+	int sdr2hdr_dly;
+	int pre_scan_dly;
+	int i;
+
+	/**
+	 * config bg dly, select the max delay num of hdrvivid and sdr2hdr module
+	 * as the increase value of bg delay num. If hdrvivid and sdr2hdr is not
+	 * work, the default bg_dly is 0x10. and the default win delay num is 0.
+	 */
+	if ((vp->hdr_en || vp->sdr2hdr_en) &&
+	    (vp->hdrvivid_mode >= 0 && vp->hdrvivid_mode <= SDR2HLG)) {
+		/* set sdr2hdr_dly to 0 if sdr2hdr is disable */
+		sdr2hdr_dly = vp->sdr2hdr_en ? vp_data->sdr2hdr_dly : 0;
+
+		/* set the max delay pipe's config_win_dly as 0 */
+		if (vp_data->hdrvivid_dly[vp->hdrvivid_mode] >=
+		    sdr2hdr_dly + vp_data->layer_mix_dly) {
+			bg_dly = vp_data->win_dly + vp_data->hdrvivid_dly[vp->hdrvivid_mode] +
+				 vp_data->hdr_mix_dly;
+			hdr_win_dly = 0;
+			sdr_win_dly = vp_data->hdrvivid_dly[vp->hdrvivid_mode] -
+				      vp_data->layer_mix_dly - sdr2hdr_dly;
+		} else {
+			bg_dly = vp_data->win_dly + vp_data->layer_mix_dly + sdr2hdr_dly +
+				 vp_data->hdr_mix_dly;
+			hdr_win_dly = sdr2hdr_dly + vp_data->layer_mix_dly -
+				      vp_data->hdrvivid_dly[vp->hdrvivid_mode];
+			sdr_win_dly = 0;
+		}
+	} else {
+		bg_dly = vp_data->win_dly + vp_data->layer_mix_dly + vp_data->hdr_mix_dly;
+		sdr_win_dly = 0;
+	}
+
+	pre_scan_dly = bg_dly + (hdisplay >> 1) - 1;
+	pre_scan_dly = (pre_scan_dly << 16) | hsync_len;
+	VOP_MODULE_SET(vop2, vp, bg_dly, bg_dly);
+	VOP_MODULE_SET(vop2, vp, pre_scan_htiming, pre_scan_dly);
+
+	/**
+	 * config win dly
+	 */
+	if (!vop2_zpos)
+		return;
+
+	for (i = 0; i < vp->nr_layers; i++) {
+		zpos = &vop2_zpos[i];
+		win = vop2_find_win_by_phys_id(vop2, zpos->win_phys_id);
+		plane = &win->base;
+		vpstate = to_vop2_plane_state(plane->state);
+
+		if ((vp->hdr_en || vp->sdr2hdr_en) &&
+		    (vp->hdrvivid_mode >= 0 && vp->hdrvivid_mode <= SDR2HLG)) {
+			dly = vpstate->hdr_in ? hdr_win_dly : sdr_win_dly;
+		}
+		if (vop2_cluster_window(win))
+			dly |= dly << 8;
+
+		VOP_CTRL_SET(vop2, win_dly[win->phys_id], dly);
+	}
+}
+
 static void vop2_crtc_atomic_enable(struct drm_crtc *crtc, struct drm_crtc_state *old_state)
 {
 	struct vop2_video_port *vp = to_vop2_video_port(crtc);
@@ -4900,7 +5144,6 @@
 	u16 vact_st = adjusted_mode->crtc_vtotal - adjusted_mode->crtc_vsync_start;
 	u16 vact_end = vact_st + vdisplay;
 	bool interlaced = !!(adjusted_mode->flags & DRM_MODE_FLAG_INTERLACE);
-	uint8_t out_mode;
 	bool dclk_inv, yc_swap = false;
 	int act_end;
 	uint32_t val;
@@ -4925,6 +5168,7 @@
 	if (vcstate->output_if & VOP_OUTPUT_IF_RGB) {
 		VOP_CTRL_SET(vop2, rgb_en, 1);
 		VOP_CTRL_SET(vop2, rgb_mux, vp_data->id);
+		VOP_CTRL_SET(vop2, rgb_pin_pol, val);
 		VOP_GRF_SET(vop2, grf_dclk_inv, dclk_inv);
 	}
 
@@ -5038,21 +5282,6 @@
 		VOP_CTRL_SET(vop2, hdmi_dclk_pol, 1);
 	}
 
-	if ((vcstate->output_mode == ROCKCHIP_OUT_MODE_AAAA &&
-	     !(vp_data->feature & VOP_FEATURE_OUTPUT_10BIT)) ||
-	    vcstate->output_if & VOP_OUTPUT_IF_BT656)
-		out_mode = ROCKCHIP_OUT_MODE_P888;
-	else
-		out_mode = vcstate->output_mode;
-	VOP_MODULE_SET(vop2, vp, out_mode, out_mode);
-
-	if (vop2_output_uv_swap(vcstate->bus_format, vcstate->output_mode))
-		VOP_MODULE_SET(vop2, vp, dsp_data_swap, DSP_RB_SWAP);
-	else
-		VOP_MODULE_SET(vop2, vp, dsp_data_swap, 0);
-
-	vop2_dither_setup(crtc);
-
 	VOP_MODULE_SET(vop2, vp, htotal_pw, (htotal << 16) | hsync_len);
 	val = hact_st << 16;
 	val |= hact_end;
@@ -5105,9 +5334,20 @@
 		VOP_MODULE_SET(vop2, vp, dclk_div2_phase_lock, 0);
 	}
 
-	clk_set_rate(vp->dclk, adjusted_mode->crtc_clock * 1000);
+	/*
+	 * 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 && vcstate->output_if & VOP_OUTPUT_IF_BT656)
+		clk_set_rate(vp->dclk, 4 * adjusted_mode->crtc_clock * 1000);
+	else
+		clk_set_rate(vp->dclk, adjusted_mode->crtc_clock * 1000);
 
 	vop2_post_config(crtc);
+
+	if (is_vop3(vop2))
+		vop3_setup_pipe_dly(vp, NULL);
 
 	vop2_cfg_done(crtc);
 
@@ -5154,6 +5394,224 @@
 				  struct drm_crtc_state *crtc_state)
 {
 	return 0;
+}
+
+static void vop3_disable_dynamic_hdr(struct vop2_video_port *vp, uint8_t win_phys_id)
+{
+	struct vop2 *vop2 = vp->vop2;
+	struct vop2_win *win = vop2_find_win_by_phys_id(vop2, win_phys_id);
+	struct drm_plane *plane = &win->base;
+	struct drm_plane_state *pstate = plane->state;
+	struct vop2_plane_state *vpstate = to_vop2_plane_state(pstate);
+
+	VOP_MODULE_SET(vop2, vp, hdr10_en, 0);
+	VOP_MODULE_SET(vop2, vp, hdr_vivid_en, 0);
+	VOP_MODULE_SET(vop2, vp, hdr_vivid_bypass_en, 0);
+	VOP_MODULE_SET(vop2, vp, hdr_lut_update_en, 0);
+	VOP_MODULE_SET(vop2, vp, sdr2hdr_en, 0);
+	VOP_MODULE_SET(vop2, vp, sdr2hdr_path_en, 0);
+	VOP_MODULE_SET(vop2, vp, sdr2hdr_auto_gating_en, 1);
+
+	vp->hdr_en = false;
+	vp->hdr_in = false;
+	vp->hdr_out = false;
+	vp->sdr2hdr_en = false;
+	vpstate->hdr_in = false;
+	vpstate->hdr2sdr_en = false;
+}
+
+static void vop3_setup_hdrvivid(struct vop2_video_port *vp, uint8_t win_phys_id)
+{
+	struct vop2 *vop2 = vp->vop2;
+	struct vop2_win *win = vop2_find_win_by_phys_id(vop2, win_phys_id);
+	struct drm_plane *plane = &win->base;
+	struct drm_plane_state *pstate = plane->state;
+	struct vop2_plane_state *vpstate = to_vop2_plane_state(pstate);
+	struct drm_crtc_state *cstate = vp->crtc.state;
+	struct rockchip_crtc_state *vcstate = to_rockchip_crtc_state(cstate);
+	unsigned long win_mask = vp->win_mask;
+	int phys_id;
+	struct hdrvivid_regs *hdrvivid_data;
+	struct hdr_extend *hdr_data;
+	bool have_sdr_layer = false;
+	uint32_t hdr_mode;
+	int i;
+	u32 *tone_lut_kvaddr;
+	dma_addr_t tone_lut_mst;
+
+	vp->hdr_en = false;
+	vp->hdr_in = false;
+	vp->hdr_out = false;
+	vp->sdr2hdr_en = false;
+	vpstate->hdr_in = false;
+	vpstate->hdr2sdr_en = false;
+
+	hdr_data = (struct hdr_extend *)vcstate->hdr_ext_data->data;
+	hdrvivid_data = &hdr_data->hdrvivid_data;
+
+	hdr_mode = hdrvivid_data->hdr_mode;
+
+	if (hdr_mode > SDR2HLG && hdr_mode != SDR2HDR10_USERSPACE &&
+	    hdr_mode != SDR2HLG_USERSPACE) {
+		DRM_ERROR("Invalid HDR mode:%d, beyond the mode range\n", hdr_mode);
+		return;
+	}
+
+	/* adjust userspace hdr mode value to kernel value */
+	if (hdr_mode == SDR2HDR10_USERSPACE)
+		hdr_mode = SDR2HDR10;
+	if (hdr_mode == SDR2HLG_USERSPACE)
+		hdr_mode = SDR2HLG;
+
+	if (hdr_mode <= HDR102SDR && vpstate->eotf != SMPTE_ST2084 && vpstate->eotf != HLG) {
+		DRM_ERROR("Invalid HDR mode:%d, mismatch plane eotf:%d\n", hdr_mode,
+			  vpstate->eotf);
+		return;
+	}
+
+	vp->hdrvivid_mode = hdr_mode;
+	vcstate->yuv_overlay = false;
+
+	if (hdr_mode <= HDR102SDR) {
+		vp->hdr_en = true;
+		vp->hdr_in = true;
+		vpstate->hdr_in = true;
+	} else {
+		vp->sdr2hdr_en = true;
+	}
+
+	/*
+	 * To confirm whether need to enable sdr2hdr.
+	 */
+	for_each_set_bit(phys_id, &win_mask, ROCKCHIP_MAX_LAYER) {
+		win = vop2_find_win_by_phys_id(vop2, phys_id);
+		plane = &win->base;
+		pstate = plane->state;
+		vpstate = to_vop2_plane_state(pstate);
+
+		/* skip inactive plane */
+		if (!vop2_plane_active(pstate))
+			continue;
+
+		if (vpstate->eotf != SMPTE_ST2084 && vpstate->eotf != HLG) {
+			have_sdr_layer = true;
+			break;
+		}
+	}
+
+	if (hdr_mode == PQHDR2SDR_WITH_DYNAMIC || hdr_mode == HLG2SDR_WITH_DYNAMIC ||
+	    hdr_mode == HLG2SDR_WITHOUT_DYNAMIC || hdr_mode == HDR102SDR) {
+		vpstate->hdr2sdr_en = true;
+	} else {
+		vp->hdr_out = true;
+		if (have_sdr_layer)
+			vp->sdr2hdr_en = true;
+	}
+
+	/**
+	 * Config hdr ctrl registers
+	 */
+	vop2_writel(vop2, RK3528_SDR2HDR_CTRL, hdrvivid_data->sdr2hdr_ctrl);
+	vop2_writel(vop2, RK3528_HDRVIVID_CTRL, hdrvivid_data->hdrvivid_ctrl);
+
+	VOP_MODULE_SET(vop2, vp, hdr10_en, vp->hdr_en);
+	if (vp->hdr_en) {
+		VOP_MODULE_SET(vop2, vp, hdr_vivid_en, (hdr_mode == HDR_BYPASS) ? 0 : 1);
+		VOP_MODULE_SET(vop2, vp, hdr_vivid_path_mode,
+			       (hdr_mode == HDR102SDR) ? PQHDR2SDR_WITH_DYNAMIC : hdr_mode);
+		VOP_MODULE_SET(vop2, vp, hdr_vivid_bypass_en, (hdr_mode == HDR_BYPASS) ? 1 : 0);
+	} else {
+		VOP_MODULE_SET(vop2, vp, hdr_vivid_en, 0);
+	}
+	VOP_MODULE_SET(vop2, vp, sdr2hdr_en, vp->sdr2hdr_en);
+	VOP_MODULE_SET(vop2, vp, sdr2hdr_path_en, vp->sdr2hdr_en);
+	VOP_MODULE_SET(vop2, vp, sdr2hdr_auto_gating_en, vp->sdr2hdr_en ? 0 : 1);
+
+	vop2_writel(vop2, RK3528_SDR_CFG_COE0, hdrvivid_data->sdr2hdr_coe0);
+	vop2_writel(vop2, RK3528_SDR_CFG_COE1, hdrvivid_data->sdr2hdr_coe1);
+	vop2_writel(vop2, RK3528_SDR_CSC_COE00_01, hdrvivid_data->sdr2hdr_csc_coe00_01);
+	vop2_writel(vop2, RK3528_SDR_CSC_COE02_10, hdrvivid_data->sdr2hdr_csc_coe02_10);
+	vop2_writel(vop2, RK3528_SDR_CSC_COE11_12, hdrvivid_data->sdr2hdr_csc_coe11_12);
+	vop2_writel(vop2, RK3528_SDR_CSC_COE20_21, hdrvivid_data->sdr2hdr_csc_coe20_21);
+	vop2_writel(vop2, RK3528_SDR_CSC_COE22, hdrvivid_data->sdr2hdr_csc_coe22);
+
+	vop2_writel(vop2, RK3528_HDR_PQ_GAMMA, hdrvivid_data->hdr_pq_gamma);
+	vop2_writel(vop2, RK3528_HLG_RFIX_SCALEFAC, hdrvivid_data->hlg_rfix_scalefac);
+	vop2_writel(vop2, RK3528_HLG_MAXLUMA, hdrvivid_data->hlg_maxluma);
+	vop2_writel(vop2, RK3528_HLG_R_TM_LIN2NON, hdrvivid_data->hlg_r_tm_lin2non);
+
+	vop2_writel(vop2, RK3528_HDR_CSC_COE00_01, hdrvivid_data->hdr_csc_coe00_01);
+	vop2_writel(vop2, RK3528_HDR_CSC_COE02_10, hdrvivid_data->hdr_csc_coe02_10);
+	vop2_writel(vop2, RK3528_HDR_CSC_COE11_12, hdrvivid_data->hdr_csc_coe11_12);
+	vop2_writel(vop2, RK3528_HDR_CSC_COE20_21, hdrvivid_data->hdr_csc_coe20_21);
+	vop2_writel(vop2, RK3528_HDR_CSC_COE22, hdrvivid_data->hdr_csc_coe22);
+
+	tone_lut_kvaddr = (u32 *)vp->hdr_lut_gem_obj->kvaddr;
+	tone_lut_mst = vp->hdr_lut_gem_obj->dma_addr;
+
+	for (i = 0; i < RK_HDRVIVID_TONE_SCA_AXI_TAB_LENGTH; i++)
+		*tone_lut_kvaddr++ =  hdrvivid_data->tone_sca_axi_tab[i];
+
+	VOP_MODULE_SET(vop2, vp, lut_dma_rid, vp->lut_dma_rid - vp->id);
+	VOP_MODULE_SET(vop2, vp, hdr_lut_mode, 1);
+	VOP_MODULE_SET(vop2, vp, hdr_lut_mst, tone_lut_mst);
+	VOP_MODULE_SET(vop2, vp, hdr_lut_update_en, 1);
+	VOP_CTRL_SET(vop2, lut_dma_en, 1);
+
+	for (i = 0; i < RK_HDRVIVID_GAMMA_CURVE_LENGTH; i++)
+		vop2_writel(vop2, RK3528_HDRGAMMA_CURVE + i * 4, hdrvivid_data->hdrgamma_curve[i]);
+
+	for (i = 0; i < RK_HDRVIVID_GAMMA_MDFVALUE_LENGTH; i++)
+		vop2_writel(vop2, RK3528_HDRGAMMA_MDFVALUE + i * 4,
+			    hdrvivid_data->hdrgamma_mdfvalue[i]);
+
+	for (i = 0; i < RK_SDR2HDR_INVGAMMA_CURVE_LENGTH; i++)
+		vop2_writel(vop2, RK3528_SDRINVGAMMA_CURVE + i * 4,
+			    hdrvivid_data->sdrinvgamma_curve[i]);
+
+	for (i = 0; i < RK_SDR2HDR_INVGAMMA_S_IDX_LENGTH; i++)
+		vop2_writel(vop2, RK3528_SDRINVGAMMA_STARTIDX + i * 4,
+			    hdrvivid_data->sdrinvgamma_startidx[i]);
+
+	for (i = 0; i < RK_SDR2HDR_INVGAMMA_C_IDX_LENGTH; i++)
+		vop2_writel(vop2, RK3528_SDRINVGAMMA_CHANGEIDX + i * 4,
+			    hdrvivid_data->sdrinvgamma_changeidx[i]);
+
+	for (i = 0; i < RK_SDR2HDR_SMGAIN_LENGTH; i++)
+		vop2_writel(vop2, RK3528_SDR_SMGAIN + i * 4, hdrvivid_data->sdr_smgain[i]);
+}
+
+static void vop3_setup_dynamic_hdr(struct vop2_video_port *vp, uint8_t win_phys_id)
+{
+	struct drm_crtc_state *cstate = vp->crtc.state;
+	struct rockchip_crtc_state *vcstate = to_rockchip_crtc_state(cstate);
+	struct hdr_extend *hdr_data;
+	uint32_t hdr_format;
+
+	/* If hdr extend data is null, exit hdr mode */
+	if (!vcstate->hdr_ext_data) {
+		vop3_disable_dynamic_hdr(vp, win_phys_id);
+		return;
+	}
+
+	hdr_data = (struct hdr_extend *)vcstate->hdr_ext_data->data;
+	hdr_format = hdr_data->hdr_type;
+
+	switch (hdr_format) {
+	case HDR_NONE:
+	case HDR_HDR10:
+	case HDR_HLGSTATIC:
+	case HDR_HDRVIVID:
+		/*
+		 * hdr module support hdr10, hlg, vividhdr
+		 * sdr2hdr module support hdrnone for sdr2hdr
+		 */
+		vop3_setup_hdrvivid(vp, win_phys_id);
+		break;
+	default:
+		DRM_DEBUG("unsupprot hdr format:%u\n", hdr_format);
+		break;
+	}
 }
 
 static void vop2_setup_hdr10(struct vop2_video_port *vp, uint8_t win_phys_id)
@@ -5648,7 +6106,7 @@
 		vop2_writel(vop2, dst_alpha_ctrl_offset + offset, alpha.dst_alpha_ctrl.val);
 	}
 
-	if (vp_data->feature & VOP_FEATURE_HDR10) {
+	if (vp_data->feature & (VOP_FEATURE_HDR10 | VOP_FEATURE_VIVID_HDR)) {
 		src_color_ctrl_offset = ovl_regs->hdr_mix_regs->src_color_ctrl.offset;
 		dst_color_ctrl_offset = ovl_regs->hdr_mix_regs->dst_color_ctrl.offset;
 		src_alpha_ctrl_offset = ovl_regs->hdr_mix_regs->src_alpha_ctrl.offset;
@@ -5923,6 +6381,7 @@
 	struct vop2_cluster cluster;
 	uint8_t nr_layers = 0;
 	struct rockchip_crtc_state *vcstate = to_rockchip_crtc_state(crtc->state);
+	const struct vop2_video_port_data *vp_data = &vop2->data->vp[vp->id];
 
 	vcstate->yuv_overlay = is_yuv_output(vcstate->bus_format);
 	vop2_zpos = kmalloc_array(vop2->data->win_size, sizeof(*vop2_zpos), GFP_KERNEL);
@@ -5982,21 +6441,26 @@
 
 		sort(vop2_zpos, nr_layers, sizeof(vop2_zpos[0]), vop2_zpos_cmp, NULL);
 
-		if (is_vop3(vop2))
+		if (is_vop3(vop2)) {
 			vop3_setup_layer_sel_for_vp(vp, vop2_zpos);
-		else
-			vop2_setup_layer_mixer_for_vp(vp, vop2_zpos);
-		vop2_setup_hdr10(vp, vop2_zpos[0].win_phys_id);
-		if (is_vop3(vop2))
+			if (vp_data->feature & VOP_FEATURE_VIVID_HDR)
+				vop3_setup_dynamic_hdr(vp, vop2_zpos[0].win_phys_id);
 			vop3_setup_alpha(vp, vop2_zpos);
-		else
+			vop3_setup_pipe_dly(vp, vop2_zpos);
+		} else {
+			vop2_setup_layer_mixer_for_vp(vp, vop2_zpos);
+			vop2_setup_hdr10(vp, vop2_zpos[0].win_phys_id);
 			vop2_setup_alpha(vp, vop2_zpos);
-		vop2_setup_dly_for_vp(vp);
-		vop2_setup_dly_for_window(vp, vop2_zpos);
+			vop2_setup_dly_for_vp(vp);
+			vop2_setup_dly_for_window(vp, vop2_zpos);
+		}
 	} else {
-		if (!is_vop3(vop2))
+		if (!is_vop3(vop2)) {
 			vop2_calc_bg_ovl_and_port_mux(vp);
-		vop2_setup_dly_for_vp(vp);
+			vop2_setup_dly_for_vp(vp);
+		} else {
+			vop3_setup_pipe_dly(vp, NULL);
+		}
 	}
 
 	/* The pre alpha overlay of Cluster still need process in one win mode. */
@@ -6124,16 +6588,193 @@
 	vop2_bcsh_reg_update(vcstate, vp, &bcsh_state);
 }
 
+static void vop3_post_csc_config(struct drm_crtc *crtc, struct post_acm *acm, struct post_csc *csc)
+{
+	struct vop2_video_port *vp = to_vop2_video_port(crtc);
+	struct rockchip_crtc_state *vcstate = to_rockchip_crtc_state(crtc->state);
+	struct vop2 *vop2 = vp->vop2;
+	struct post_csc_coef csc_coef;
+	bool acm_enable;
+	bool is_input_yuv = false;
+	bool is_output_yuv = false;
+	bool post_r2y_en = false;
+	bool post_csc_en = false;
+	int range_type;
+
+	if (!acm)
+		acm_enable = false;
+	else
+		acm_enable = acm->acm_enable;
+
+	if (acm_enable) {
+		if (!vcstate->yuv_overlay)
+			post_r2y_en = true;
+
+		/* do y2r in csc module */
+		if (!is_yuv_output(vcstate->bus_format))
+			post_csc_en = true;
+	} else {
+		if (!vcstate->yuv_overlay && is_yuv_output(vcstate->bus_format))
+			post_r2y_en = true;
+
+		/* do y2r in csc module */
+		if (vcstate->yuv_overlay && !is_yuv_output(vcstate->bus_format))
+			post_csc_en = true;
+	}
+
+	if (csc && csc->csc_enable)
+		post_csc_en = true;
+
+	if (vcstate->yuv_overlay || post_r2y_en)
+		is_input_yuv = true;
+
+	if (is_yuv_output(vcstate->bus_format))
+		is_output_yuv = true;
+
+	vcstate->post_csc_mode = vop2_convert_csc_mode(vcstate->color_space, CSC_13BIT_DEPTH);
+
+	if (post_csc_en) {
+		rockchip_calc_post_csc(csc, &csc_coef, vcstate->post_csc_mode, is_input_yuv,
+				       is_output_yuv);
+
+		VOP_MODULE_SET(vop2, vp, csc_coe00, csc_coef.csc_coef00);
+		VOP_MODULE_SET(vop2, vp, csc_coe01, csc_coef.csc_coef01);
+		VOP_MODULE_SET(vop2, vp, csc_coe02, csc_coef.csc_coef02);
+		VOP_MODULE_SET(vop2, vp, csc_coe10, csc_coef.csc_coef10);
+		VOP_MODULE_SET(vop2, vp, csc_coe11, csc_coef.csc_coef11);
+		VOP_MODULE_SET(vop2, vp, csc_coe12, csc_coef.csc_coef12);
+		VOP_MODULE_SET(vop2, vp, csc_coe20, csc_coef.csc_coef20);
+		VOP_MODULE_SET(vop2, vp, csc_coe21, csc_coef.csc_coef21);
+		VOP_MODULE_SET(vop2, vp, csc_coe22, csc_coef.csc_coef22);
+		VOP_MODULE_SET(vop2, vp, csc_offset0, csc_coef.csc_dc0);
+		VOP_MODULE_SET(vop2, vp, csc_offset1, csc_coef.csc_dc1);
+		VOP_MODULE_SET(vop2, vp, csc_offset2, csc_coef.csc_dc2);
+
+		range_type = csc_coef.range_type ? 0 : 1;
+		range_type <<= is_input_yuv ? 0 : 1;
+		VOP_MODULE_SET(vop2, vp, csc_mode, range_type);
+	}
+
+	VOP_MODULE_SET(vop2, vp, acm_r2y_en, post_r2y_en ? 1 : 0);
+	VOP_MODULE_SET(vop2, vp, csc_en, post_csc_en ? 1 : 0);
+	VOP_MODULE_SET(vop2, vp, acm_r2y_mode, vcstate->post_csc_mode);
+}
+
+static void vop3_post_acm_config(struct drm_crtc *crtc, struct post_acm *acm)
+{
+	struct vop2_video_port *vp = to_vop2_video_port(crtc);
+	struct vop2 *vop2 = vp->vop2;
+	struct drm_display_mode *adjusted_mode = &crtc->state->adjusted_mode;
+	s16 *lut_y;
+	s16 *lut_h;
+	s16 *lut_s;
+	u32 value;
+	int i;
+
+	writel(0, vop2->acm_regs + RK3528_ACM_CTRL);
+	VOP_MODULE_SET(vop2, vp, acm_bypass_en, 0);
+
+	if (!acm || !acm->acm_enable)
+		return;
+
+	/*
+	 * If acm update parameters, it need disable acm in the first frame,
+	 * then update parameters and enable acm in second frame.
+	 */
+	vop2_cfg_done(crtc);
+	readx_poll_timeout(readl, vop2->acm_regs + RK3528_ACM_CTRL, value, !value, 200, 50000);
+
+	value = RK3528_ACM_ENABLE + ((adjusted_mode->hdisplay & 0xfff) << 8) +
+		((adjusted_mode->vdisplay & 0xfff) << 20);
+	writel(value, vop2->acm_regs + RK3528_ACM_CTRL);
+
+
+	writel(1, vop2->acm_regs + RK3528_ACM_FETCH_START);
+
+	value = (acm->y_gain & 0x3ff) + ((acm->h_gain << 10) & 0xffc00) +
+		((acm->s_gain << 20) & 0x3ff00000);
+	writel(value, vop2->acm_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->acm_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->acm_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->acm_regs + RK3528_ACM_YHS_DEL_HGAIN_SEG0 + (i << 2));
+	}
+
+	writel(1, vop2->acm_regs + RK3528_ACM_FETCH_DONE);
+}
+
+static void vop3_post_config(struct drm_crtc *crtc)
+{
+	struct rockchip_crtc_state *vcstate = to_rockchip_crtc_state(crtc->state);
+	struct vop2_video_port *vp = to_vop2_video_port(crtc);
+	struct post_acm *acm;
+	struct post_csc *csc;
+
+	csc = vcstate->post_csc_data ? (struct post_csc *)vcstate->post_csc_data->data : NULL;
+	if (csc && memcmp(&vp->csc_info, csc, sizeof(struct post_csc)))
+		memcpy(&vp->csc_info, csc, sizeof(struct post_csc));
+	vop3_post_csc_config(crtc, &vp->acm_info, &vp->csc_info);
+
+	acm = vcstate->acm_lut_data ? (struct post_acm *)vcstate->acm_lut_data->data : NULL;
+
+	if (acm && memcmp(&vp->acm_info, acm, sizeof(struct post_acm))) {
+		memcpy(&vp->acm_info, acm, sizeof(struct post_acm));
+		vop3_post_acm_config(crtc, &vp->acm_info);
+	} else if (crtc->state->active_changed) {
+		vop3_post_acm_config(crtc, &vp->acm_info);
+	}
+}
+
 static void vop2_cfg_update(struct drm_crtc *crtc,
 			    struct drm_crtc_state *old_crtc_state)
 {
 	struct vop2_video_port *vp = to_vop2_video_port(crtc);
 	struct rockchip_crtc_state *vcstate = to_rockchip_crtc_state(crtc->state);
 	struct vop2 *vop2 = vp->vop2;
+	const struct vop2_data *vop2_data = vop2->data;
+	const struct vop2_video_port_data *vp_data = &vop2_data->vp[vp->id];
 	uint32_t val;
 	uint32_t r, g, b;
+	uint8_t out_mode;
 
 	spin_lock(&vop2->reg_lock);
+
+	if ((vcstate->output_mode == ROCKCHIP_OUT_MODE_AAAA &&
+	     !(vp_data->feature & VOP_FEATURE_OUTPUT_10BIT)) ||
+	    vcstate->output_if & VOP_OUTPUT_IF_BT656)
+		out_mode = ROCKCHIP_OUT_MODE_P888;
+	else
+		out_mode = vcstate->output_mode;
+	VOP_MODULE_SET(vop2, vp, out_mode, out_mode);
+
+	if (vop2_output_uv_swap(vcstate->bus_format, vcstate->output_mode))
+		VOP_MODULE_SET(vop2, vp, dsp_data_swap, DSP_RB_SWAP);
+	else
+		VOP_MODULE_SET(vop2, vp, dsp_data_swap, 0);
+
+	vop2_dither_setup(crtc);
 
 	VOP_MODULE_SET(vop2, vp, overlay_mode, vcstate->yuv_overlay);
 
@@ -6162,6 +6803,9 @@
 	vop2_post_config(crtc);
 
 	spin_unlock(&vop2->reg_lock);
+
+	if (vp_data->feature & (VOP_FEATURE_POST_ACM | VOP_FEATURE_POST_CSC))
+		vop3_post_config(crtc);
 }
 
 static void vop2_crtc_atomic_flush(struct drm_crtc *crtc, struct drm_crtc_state *old_cstate)
@@ -6304,6 +6948,13 @@
 		return NULL;
 
 	vcstate->vp_id = vp->id;
+	if (vcstate->hdr_ext_data)
+		drm_property_blob_get(vcstate->hdr_ext_data);
+	if (vcstate->acm_lut_data)
+		drm_property_blob_get(vcstate->acm_lut_data);
+	if (vcstate->post_csc_data)
+		drm_property_blob_get(vcstate->post_csc_data);
+
 	__drm_atomic_helper_crtc_duplicate_state(crtc, &vcstate->base);
 	return &vcstate->base;
 }
@@ -6314,6 +6965,9 @@
 	struct rockchip_crtc_state *vcstate = to_rockchip_crtc_state(state);
 
 	__drm_atomic_helper_crtc_destroy_state(&vcstate->base);
+	drm_property_blob_put(vcstate->hdr_ext_data);
+	drm_property_blob_put(vcstate->acm_lut_data);
+	drm_property_blob_put(vcstate->post_csc_data);
 	kfree(vcstate);
 }
 
@@ -6436,9 +7090,52 @@
 		return 0;
 	}
 
+	if (property == vp->hdr_ext_data_prop)
+		return 0;
+
+	if (property == vp->acm_lut_data_prop)
+		return 0;
+
+	if (property == vp->post_csc_data_prop)
+		return 0;
+
 	DRM_ERROR("failed to get vop2 crtc property: %s\n", property->name);
 
 	return -EINVAL;
+}
+
+/* copied from drm_atomic.c */
+static int
+vop2_atomic_replace_property_blob_from_id(struct drm_device *dev,
+					 struct drm_property_blob **blob,
+					 uint64_t blob_id,
+					 ssize_t expected_size,
+					 ssize_t expected_elem_size,
+					 bool *replaced)
+{
+	struct drm_property_blob *new_blob = NULL;
+
+	if (blob_id != 0) {
+		new_blob = drm_property_lookup_blob(dev, blob_id);
+		if (new_blob == NULL)
+			return -EINVAL;
+
+		if (expected_size > 0 &&
+		    new_blob->length != expected_size) {
+			drm_property_blob_put(new_blob);
+			return -EINVAL;
+		}
+		if (expected_elem_size > 0 &&
+		    new_blob->length % expected_elem_size != 0) {
+			drm_property_blob_put(new_blob);
+			return -EINVAL;
+		}
+	}
+
+	*replaced |= drm_property_replace_blob(blob, new_blob);
+	drm_property_blob_put(new_blob);
+
+	return 0;
 }
 
 static int vop2_crtc_atomic_set_property(struct drm_crtc *crtc,
@@ -6451,6 +7148,8 @@
 	struct drm_mode_config *mode_config = &drm_dev->mode_config;
 	struct vop2_video_port *vp = to_vop2_video_port(crtc);
 	struct vop2 *vop2 = vp->vop2;
+	bool replaced = false;
+	int ret;
 
 	if (property == mode_config->tv_left_margin_property) {
 		vcstate->left_margin = val;
@@ -6481,6 +7180,33 @@
 	if (property == vop2->line_flag_prop) {
 		vcstate->line_flag = val;
 		return 0;
+	}
+
+	if (property == vp->hdr_ext_data_prop) {
+		ret = vop2_atomic_replace_property_blob_from_id(drm_dev,
+								&vcstate->hdr_ext_data,
+								val,
+								-1, -1,
+								&replaced);
+		return ret;
+	}
+
+	if (property == vp->acm_lut_data_prop) {
+		ret = vop2_atomic_replace_property_blob_from_id(drm_dev,
+								&vcstate->acm_lut_data,
+								val,
+								sizeof(struct post_acm), -1,
+								&replaced);
+		return ret;
+	}
+
+	if (property == vp->post_csc_data_prop) {
+		ret = vop2_atomic_replace_property_blob_from_id(drm_dev,
+								&vcstate->post_csc_data,
+								val,
+								sizeof(struct post_csc), -1,
+								&replaced);
+		return ret;
 	}
 
 	DRM_ERROR("failed to set vop2 crtc property %s\n", property->name);
@@ -6694,6 +7420,16 @@
 			ret = IRQ_HANDLED;
 		}
 
+		if (vop2->version == VOP_VERSION_RK3528 && vp->id == 1) {
+			if (active_irqs & POST_BUF_EMPTY_INTR)
+				atomic_inc(&vp->post_buf_empty_flag);
+
+			if (active_irqs & FS_FIELD_INTR &&
+			    (atomic_read(&vp->post_buf_empty_flag) > 0 ||
+			     vp->need_reset_p2i_flag == true))
+				queue_work(vop2->workqueue, &vop2->post_buf_empty_work);
+		}
+
 		if (active_irqs & FS_FIELD_INTR) {
 			vop2_wb_handler(vp);
 			if (likely(!vp->skip_vsync) || (vp->layer_sel_update == false)) {
@@ -6784,6 +7520,51 @@
 	return 0;
 }
 
+static bool vop3_ignore_plane(struct vop2 *vop2, struct vop2_win *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 u32 vop3_esmart_linebuffer_size(struct vop2 *vop2, struct vop2_win *win)
+{
+	if (!is_vop3(vop2) || vop2_cluster_window(win))
+		return vop2->data->max_output.width;
+
+	if (vop2->esmart_lb_mode == VOP3_ESMART_2K_2K_2K_2K_MODE ||
+	    (vop2->esmart_lb_mode == VOP3_ESMART_4K_2K_2K_MODE && win->phys_id != ROCKCHIP_VOP2_ESMART0))
+		return vop2->data->max_output.width / 2;
+	else
+		return vop2->data->max_output.width;
+}
+
+static void vop3_init_esmart_scale_engine(struct vop2 *vop2)
+{
+	u8 scale_engine_num = 0;
+	struct drm_plane *plane = NULL;
+
+	drm_for_each_plane(plane, vop2->drm_dev) {
+		struct vop2_win *win = to_vop2_win(plane);
+
+		if (win->parent || vop2_cluster_window(win))
+			continue;
+
+		win->scale_engine_num = scale_engine_num++;
+	}
+}
+
 static int vop2_plane_init(struct vop2 *vop2, struct vop2_win *win, unsigned long possible_crtcs)
 {
 	struct rockchip_drm_private *private = vop2->drm_dev->dev_private;
@@ -6807,6 +7588,10 @@
 		if (win->feature & WIN_FEATURE_CLUSTER_SUB)
 			return -EACCES;
 	}
+
+	/* ignore some plane register according vop3 esmart lb mode */
+	if (vop3_ignore_plane(vop2, win))
+		return -EACCES;
 
 	ret = drm_universal_plane_init(vop2->drm_dev, &win->base, possible_crtcs,
 				       &vop2_plane_funcs, win->formats, win->nformats,
@@ -6847,7 +7632,7 @@
 							  "INPUT_WIDTH", 0, max_width);
 	win->input_height_prop = drm_property_create_range(vop2->drm_dev, DRM_MODE_PROP_IMMUTABLE,
 							   "INPUT_HEIGHT", 0, max_height);
-	max_width = vop2->data->max_output.width;
+	max_width = vop3_esmart_linebuffer_size(vop2, win);
 	max_height = vop2->data->max_output.height;
 	if (win->feature & WIN_FEATURE_CLUSTER_SUB)
 		max_width >>= 1;
@@ -6883,15 +7668,27 @@
 	return 0;
 }
 
-static struct drm_plane *vop2_cursor_plane_init(struct vop2_video_port *vp,
-						unsigned long possible_crtcs)
+static struct drm_plane *vop2_cursor_plane_init(struct vop2_video_port *vp)
 {
 	struct vop2 *vop2 = vp->vop2;
 	struct drm_plane *cursor = NULL;
 	struct vop2_win *win;
+	unsigned long possible_crtcs = 0;
 
 	win = vop2_find_win_by_phys_id(vop2, vp->cursor_win_id);
 	if (win) {
+		if (vop2->disable_win_move) {
+			const struct vop2_data *vop2_data = vop2->data;
+			struct drm_crtc *crtc = vop2_find_crtc_by_plane_mask(vop2, win->phys_id);
+
+			if (crtc)
+				possible_crtcs = drm_crtc_mask(crtc);
+			else
+				possible_crtcs = (1 << vop2_data->nr_vps) - 1;
+		}
+
+		if (win->possible_crtcs)
+			possible_crtcs = win->possible_crtcs;
 		win->type = DRM_PLANE_TYPE_CURSOR;
 		win->zpos = vop2->registered_num_wins - 1;
 		if (!vop2_plane_init(vop2, win, possible_crtcs))
@@ -6925,6 +7722,7 @@
 		if (!lut_len)
 			continue;
 		vp->gamma_lut_len = vp_data->gamma_lut_len;
+		vp->lut_dma_rid = vp_data->lut_dma_rid;
 		vp->lut = devm_kmalloc_array(dev, lut_len, sizeof(*vp->lut),
 					     GFP_KERNEL);
 		if (!vp->lut)
@@ -7009,6 +7807,53 @@
 	return 0;
 }
 
+static int vop2_crtc_create_hdr_property(struct vop2 *vop2, struct drm_crtc *crtc)
+{
+	struct vop2_video_port *vp = to_vop2_video_port(crtc);
+	struct drm_property *prop;
+
+	prop = drm_property_create(vop2->drm_dev, DRM_MODE_PROP_BLOB, "HDR_EXT_DATA", 0);
+	if (!prop) {
+		DRM_DEV_ERROR(vop2->dev, "create hdr ext data prop for vp%d failed\n", vp->id);
+		return -ENOMEM;
+	}
+	vp->hdr_ext_data_prop = prop;
+	drm_object_attach_property(&crtc->base, vp->hdr_ext_data_prop, 0);
+
+	return 0;
+}
+
+static int vop2_crtc_create_post_acm_property(struct vop2 *vop2, struct drm_crtc *crtc)
+{
+	struct vop2_video_port *vp = to_vop2_video_port(crtc);
+	struct drm_property *prop;
+
+	prop = drm_property_create(vop2->drm_dev, DRM_MODE_PROP_BLOB, "ACM_LUT_DATA", 0);
+	if (!prop) {
+		DRM_DEV_ERROR(vop2->dev, "create acm lut data prop for vp%d failed\n", vp->id);
+		return -ENOMEM;
+	}
+	vp->acm_lut_data_prop = prop;
+	drm_object_attach_property(&crtc->base, vp->acm_lut_data_prop, 0);
+
+	return 0;
+}
+
+static int vop2_crtc_create_post_csc_property(struct vop2 *vop2, struct drm_crtc *crtc)
+{
+	struct vop2_video_port *vp = to_vop2_video_port(crtc);
+	struct drm_property *prop;
+
+	prop = drm_property_create(vop2->drm_dev, DRM_MODE_PROP_BLOB, "POST_CSC_DATA", 0);
+	if (!prop) {
+		DRM_DEV_ERROR(vop2->dev, "create post csc data prop for vp%d failed\n", vp->id);
+		return -ENOMEM;
+	}
+	vp->post_csc_data_prop = prop;
+	drm_object_attach_property(&crtc->base, vp->post_csc_data_prop, 0);
+
+	return 0;
+}
 #define RK3566_MIRROR_PLANE_MASK (BIT(ROCKCHIP_VOP2_CLUSTER1) | BIT(ROCKCHIP_VOP2_ESMART1) | \
 				  BIT(ROCKCHIP_VOP2_SMART1))
 
@@ -7021,7 +7866,7 @@
 	const struct vop2_data *vop2_data = vop2->data;
 	struct drm_device *drm_dev = vop2->drm_dev;
 	struct device *dev = vop2->dev;
-	struct drm_plane *plane;
+	struct drm_plane *primary;
 	struct drm_plane *cursor = NULL;
 	struct drm_crtc *crtc;
 	struct device_node *port;
@@ -7069,6 +7914,9 @@
 		vp->id = vp_data->id;
 		vp->regs = vp_data->regs;
 		vp->cursor_win_id = -1;
+		primary = NULL;
+		cursor = NULL;
+
 		if (vop2->disable_win_move)
 			possible_crtcs = BIT(registered_num_crtcs);
 
@@ -7116,6 +7964,7 @@
 				win->type = DRM_PLANE_TYPE_PRIMARY;
 			}
 		} else {
+			j = 0;
 			while (j < vop2->registered_num_wins) {
 				be_used_for_primary_plane = false;
 				win = &vop2->win[j];
@@ -7157,24 +8006,43 @@
 				DRM_DEV_ERROR(vop2->dev, "failed to init primary plane\n");
 				break;
 			}
-			plane = &win->base;
+			primary = &win->base;
 		}
 
 		/* some times we want a cursor window for some vp */
+		if (vp->cursor_win_id < 0) {
+			bool be_used_for_cursor_plane = false;
+
+			j = 0;
+			while (j < vop2->registered_num_wins) {
+				win = &vop2->win[j++];
+
+				if (win->parent || (win->feature & WIN_FEATURE_CLUSTER_SUB))
+					continue;
+
+				if (win->type != DRM_PLANE_TYPE_CURSOR)
+					continue;
+
+				for (k = 0; k < vop2_data->nr_vps; k++) {
+					if (vop2->vps[k].cursor_win_id == win->phys_id)
+						be_used_for_cursor_plane = true;
+				}
+				if (be_used_for_cursor_plane)
+					continue;
+				vp->cursor_win_id = win->phys_id;
+			}
+		}
+
 		if (vp->cursor_win_id >= 0) {
-			if (win->possible_crtcs)
-				possible_crtcs = win->possible_crtcs;
-			cursor = vop2_cursor_plane_init(vp, possible_crtcs);
+			cursor = vop2_cursor_plane_init(vp);
 			if (!cursor)
 				DRM_WARN("failed to init cursor plane for vp%d\n", vp->id);
 			else
 				DRM_DEV_INFO(vop2->dev, "%s as cursor plane for vp%d\n",
 					     cursor->name, vp->id);
-		} else {
-			cursor = NULL;
 		}
 
-		ret = drm_crtc_init_with_planes(drm_dev, crtc, plane, cursor, &vop2_crtc_funcs,
+		ret = drm_crtc_init_with_planes(drm_dev, crtc, primary, cursor, &vop2_crtc_funcs,
 						"video_port%d", vp->id);
 		if (ret) {
 			DRM_DEV_ERROR(vop2->dev, "crtc init for video_port%d failed\n", i);
@@ -7202,7 +8070,23 @@
 					   drm_dev->mode_config.tv_top_margin_property, 100);
 		drm_object_attach_property(&crtc->base,
 					   drm_dev->mode_config.tv_bottom_margin_property, 100);
-		vop2_crtc_create_plane_mask_property(vop2, crtc, plane_mask);
+		if (plane_mask)
+			vop2_crtc_create_plane_mask_property(vop2, crtc, plane_mask);
+
+		if (vp_data->feature & VOP_FEATURE_VIVID_HDR) {
+			vop2_crtc_create_hdr_property(vop2, crtc);
+			vp->hdr_lut_gem_obj = rockchip_gem_create_object(vop2->drm_dev,
+				RK_HDRVIVID_TONE_SCA_AXI_TAB_LENGTH * 4, true, 0);
+			if (IS_ERR(vp->hdr_lut_gem_obj)) {
+				DRM_ERROR("create hdr lut obj failed\n");
+				return -ENOMEM;
+			}
+		}
+		if (vp_data->feature & VOP_FEATURE_POST_ACM)
+			vop2_crtc_create_post_acm_property(vop2, crtc);
+		if (vp_data->feature & VOP_FEATURE_POST_CSC)
+			vop2_crtc_create_post_csc_property(vop2, crtc);
+
 		registered_num_crtcs++;
 	}
 
@@ -7260,12 +8144,18 @@
 			DRM_WARN("failed to init overlay plane %s, ret:%d\n", win->name, ret);
 	}
 
+	if (is_vop3(vop2))
+		vop3_init_esmart_scale_engine(vop2);
+
 	return registered_num_crtcs;
 }
 
 static void vop2_destroy_crtc(struct drm_crtc *crtc)
 {
 	struct vop2_video_port *vp = to_vop2_video_port(crtc);
+
+	if (vp->hdr_lut_gem_obj)
+		rockchip_gem_free_object(&vp->hdr_lut_gem_obj->base);
 
 	of_node_put(crtc->port);
 
@@ -7322,7 +8212,6 @@
 		win->axi_id = win_data->axi_id;
 		win->axi_yrgb_id = win_data->axi_yrgb_id;
 		win->axi_uv_id = win_data->axi_uv_id;
-		win->scale_engine_num = win_data->scale_engine_num;
 		win->possible_crtcs = win_data->possible_crtcs;
 
 		num_wins++;
@@ -7351,6 +8240,7 @@
 			area->vsd_filter_mode = win_data->vsd_filter_mode;
 			area->hsd_pre_filter_mode = win_data->hsd_pre_filter_mode;
 			area->vsd_pre_filter_mode = win_data->vsd_pre_filter_mode;
+			area->possible_crtcs = win->possible_crtcs;
 
 			area->vop2 = vop2;
 			area->win_id = i;
@@ -7414,6 +8304,43 @@
 	return 0;
 }
 
+static void post_buf_empty_work_event(struct work_struct *work)
+{
+	struct vop2 *vop2 = container_of(work, struct vop2, post_buf_empty_work);
+	struct rockchip_drm_private *private = vop2->drm_dev->dev_private;
+	struct vop2_video_port *vp = &vop2->vps[1];
+
+	/*
+	 * For RK3528, VP1 only supports NTSC and PAL mode(both interlace). If
+	 * POST_BUF_EMPTY_INTR comes, it is needed to reset the p2i_en bit, in
+	 * order to update the line parity flag, which ensures the correct order
+	 * of odd and even lines.
+	 */
+	if (vop2->version == VOP_VERSION_RK3528) {
+		if (atomic_read(&vp->post_buf_empty_flag) > 0) {
+			atomic_set(&vp->post_buf_empty_flag, 0);
+
+			mutex_lock(&private->ovl_lock);
+			vop2_wait_for_fs_by_done_bit_status(vp);
+			VOP_MODULE_SET(vop2, vp, p2i_en, 0);
+			vop2_cfg_done(&vp->crtc);
+			vop2_wait_for_fs_by_done_bit_status(vp);
+			mutex_unlock(&private->ovl_lock);
+
+			vp->need_reset_p2i_flag = true;
+		} else if (vp->need_reset_p2i_flag == true) {
+			mutex_lock(&private->ovl_lock);
+			vop2_wait_for_fs_by_done_bit_status(vp);
+			VOP_MODULE_SET(vop2, vp, p2i_en, 1);
+			vop2_cfg_done(&vp->crtc);
+			vop2_wait_for_fs_by_done_bit_status(vp);
+			mutex_unlock(&private->ovl_lock);
+
+			vp->need_reset_p2i_flag = false;
+		}
+	}
+}
+
 static int vop2_bind(struct device *dev, struct device *master, void *data)
 {
 	struct platform_device *pdev = to_platform_device(dev);
@@ -7454,6 +8381,23 @@
 	vop2->disable_afbc_win = of_property_read_bool(dev->of_node, "disable-afbc-win");
 	vop2->disable_win_move = of_property_read_bool(dev->of_node, "disable-win-move");
 	vop2->skip_ref_fb = of_property_read_bool(dev->of_node, "skip-ref-fb");
+
+	/*
+	 * esmart lb mode default config at vop2_reg.c vop2_data.esmart_lb_mode,
+	 * 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 = of_property_read_u8(dev->of_node, "esmart_lb_mode", &vop2->esmart_lb_mode);
+	if (ret < 0)
+		vop2->esmart_lb_mode = vop2->data->esmart_lb_mode;
 
 	ret = vop2_win_init(vop2);
 	if (ret)
@@ -7538,6 +8482,12 @@
 	spin_lock_init(&vop2->irq_lock);
 	mutex_init(&vop2->vop2_lock);
 
+	if (vop2->version == VOP_VERSION_RK3528) {
+		atomic_set(&vop2->vps[1].post_buf_empty_flag, 0);
+		vop2->workqueue = create_workqueue("post_buf_empty_wq");
+		INIT_WORK(&vop2->post_buf_empty_work, post_buf_empty_work_event);
+	}
+
 	ret = devm_request_irq(dev, vop2->irq, vop2_isr, IRQF_SHARED, dev_name(dev), vop2);
 	if (ret)
 		return ret;
diff --git a/kernel/drivers/gpu/drm/rockchip/rockchip_post_csc.c b/kernel/drivers/gpu/drm/rockchip/rockchip_post_csc.c
new file mode 100644
index 0000000..212a4b4
--- /dev/null
+++ b/kernel/drivers/gpu/drm/rockchip/rockchip_post_csc.c
@@ -0,0 +1,1573 @@
+// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
+/*
+ * Copyright (c) 2022 Rockchip Electronics Co., Ltd.
+ * Author: Zhang yubing <yubing.zhang@rock-chips.com>
+ */
+
+#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,
+};
+
+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 post_csc *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 post_csc *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) {
+		DRM_ERROR("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/kernel/drivers/gpu/drm/rockchip/rockchip_post_csc.h b/kernel/drivers/gpu/drm/rockchip/rockchip_post_csc.h
new file mode 100644
index 0000000..1215a5c
--- /dev/null
+++ b/kernel/drivers/gpu/drm/rockchip/rockchip_post_csc.h
@@ -0,0 +1,18 @@
+/* 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 <drm/drm_crtc.h>
+#include "rockchip_drm_drv.h"
+#include "rockchip_drm_vop.h"
+
+int rockchip_calc_post_csc(struct post_csc *csc, struct post_csc_coef *csc_coef,
+			   int csc_mode, bool is_input_yuv, bool is_output_yuv);
+
+#endif
diff --git a/kernel/drivers/gpu/drm/rockchip/rockchip_rgb.c b/kernel/drivers/gpu/drm/rockchip/rockchip_rgb.c
index 9ff3186..9a7b1a7 100644
--- a/kernel/drivers/gpu/drm/rockchip/rockchip_rgb.c
+++ b/kernel/drivers/gpu/drm/rockchip/rockchip_rgb.c
@@ -173,6 +173,8 @@
 static void rockchip_rgb_encoder_disable(struct drm_encoder *encoder)
 {
 	struct rockchip_rgb *rgb = encoder_to_rgb(encoder);
+	struct drm_crtc *crtc = encoder->crtc;
+	struct rockchip_crtc_state *s = to_rockchip_crtc_state(crtc->state);
 
 	if (rgb->panel) {
 		drm_panel_disable(rgb->panel);
@@ -186,6 +188,13 @@
 		rgb->funcs->disable(rgb);
 
 	pinctrl_pm_select_sleep_state(rgb->dev);
+
+	if (s->output_if & VOP_OUTPUT_IF_RGB)
+		s->output_if &= ~VOP_OUTPUT_IF_RGB;
+	else if (s->output_if & VOP_OUTPUT_IF_BT656)
+		s->output_if &= ~VOP_OUTPUT_IF_BT656;
+	else if (s->output_if & VOP_OUTPUT_IF_BT1120)
+		s->output_if &= ~VOP_OUTPUT_IF_BT1120;
 }
 
 static int
@@ -205,39 +214,39 @@
 	switch (s->bus_format) {
 	case MEDIA_BUS_FMT_RGB666_1X18:
 		s->output_mode = ROCKCHIP_OUT_MODE_P666;
-		s->output_if = VOP_OUTPUT_IF_RGB;
+		s->output_if |= VOP_OUTPUT_IF_RGB;
 		break;
 	case MEDIA_BUS_FMT_RGB565_1X16:
 		s->output_mode = ROCKCHIP_OUT_MODE_P565;
-		s->output_if = VOP_OUTPUT_IF_RGB;
+		s->output_if |= VOP_OUTPUT_IF_RGB;
 		break;
 	case MEDIA_BUS_FMT_SRGB888_3X8:
 		s->output_mode = ROCKCHIP_OUT_MODE_S888;
-		s->output_if = VOP_OUTPUT_IF_RGB;
+		s->output_if |= VOP_OUTPUT_IF_RGB;
 		break;
 	case MEDIA_BUS_FMT_SRGB888_DUMMY_4X8:
 		s->output_mode = ROCKCHIP_OUT_MODE_S888_DUMMY;
-		s->output_if = VOP_OUTPUT_IF_RGB;
+		s->output_if |= VOP_OUTPUT_IF_RGB;
 		break;
 	case MEDIA_BUS_FMT_YUYV8_2X8:
 	case MEDIA_BUS_FMT_YVYU8_2X8:
 	case MEDIA_BUS_FMT_UYVY8_2X8:
 	case MEDIA_BUS_FMT_VYUY8_2X8:
 		s->output_mode = ROCKCHIP_OUT_MODE_BT656;
-		s->output_if = VOP_OUTPUT_IF_BT656;
+		s->output_if |= VOP_OUTPUT_IF_BT656;
 		break;
 	case MEDIA_BUS_FMT_YUYV8_1X16:
 	case MEDIA_BUS_FMT_YVYU8_1X16:
 	case MEDIA_BUS_FMT_UYVY8_1X16:
 	case MEDIA_BUS_FMT_VYUY8_1X16:
 		s->output_mode = ROCKCHIP_OUT_MODE_BT1120;
-		s->output_if = VOP_OUTPUT_IF_BT1120;
+		s->output_if |= VOP_OUTPUT_IF_BT1120;
 		break;
 	case MEDIA_BUS_FMT_RGB888_1X24:
 	case MEDIA_BUS_FMT_RGB666_1X24_CPADHI:
 	default:
 		s->output_mode = ROCKCHIP_OUT_MODE_P888;
-		s->output_if = VOP_OUTPUT_IF_RGB;
+		s->output_if |= VOP_OUTPUT_IF_RGB;
 		break;
 	}
 
diff --git a/kernel/drivers/gpu/drm/rockchip/rockchip_vop2_reg.c b/kernel/drivers/gpu/drm/rockchip/rockchip_vop2_reg.c
index 4eddb18..5917a76 100644
--- a/kernel/drivers/gpu/drm/rockchip/rockchip_vop2_reg.c
+++ b/kernel/drivers/gpu/drm/rockchip/rockchip_vop2_reg.c
@@ -63,6 +63,27 @@
 	DRM_FORMAT_VYUY,
 };
 
+static const uint32_t formats_for_esmart[] = {
+	DRM_FORMAT_XRGB8888,
+	DRM_FORMAT_ARGB8888,
+	DRM_FORMAT_XBGR8888,
+	DRM_FORMAT_ABGR8888,
+	DRM_FORMAT_RGB888,
+	DRM_FORMAT_BGR888,
+	DRM_FORMAT_RGB565,
+	DRM_FORMAT_BGR565,
+	DRM_FORMAT_NV12,
+	DRM_FORMAT_NV16,
+	DRM_FORMAT_NV24,
+	DRM_FORMAT_NV12_10,
+	DRM_FORMAT_NV16_10,
+	DRM_FORMAT_NV24_10,
+	DRM_FORMAT_YVYU,
+	DRM_FORMAT_VYUY,
+	DRM_FORMAT_YUYV,
+	DRM_FORMAT_UYVY,
+};
+
 static const uint32_t formats_for_smart[] = {
 	DRM_FORMAT_XRGB8888,
 	DRM_FORMAT_ARGB8888,
@@ -120,6 +141,49 @@
 				AFBC_FORMAT_MOD_YTR |
 				AFBC_FORMAT_MOD_SPARSE |
 				AFBC_FORMAT_MOD_SPLIT),
+	DRM_FORMAT_MOD_INVALID,
+};
+
+static const uint64_t format_modifiers_afbc_tiled[] = {
+	DRM_FORMAT_MOD_ARM_AFBC(AFBC_FORMAT_MOD_BLOCK_SIZE_16x16),
+
+	DRM_FORMAT_MOD_ARM_AFBC(AFBC_FORMAT_MOD_BLOCK_SIZE_16x16 |
+				AFBC_FORMAT_MOD_SPARSE),
+
+	DRM_FORMAT_MOD_ARM_AFBC(AFBC_FORMAT_MOD_BLOCK_SIZE_16x16 |
+				AFBC_FORMAT_MOD_YTR),
+
+	DRM_FORMAT_MOD_ARM_AFBC(AFBC_FORMAT_MOD_BLOCK_SIZE_16x16 |
+				AFBC_FORMAT_MOD_CBR),
+
+	DRM_FORMAT_MOD_ARM_AFBC(AFBC_FORMAT_MOD_BLOCK_SIZE_16x16 |
+				AFBC_FORMAT_MOD_YTR |
+				AFBC_FORMAT_MOD_SPARSE),
+
+	DRM_FORMAT_MOD_ARM_AFBC(AFBC_FORMAT_MOD_BLOCK_SIZE_16x16 |
+				AFBC_FORMAT_MOD_CBR |
+				AFBC_FORMAT_MOD_SPARSE),
+
+	DRM_FORMAT_MOD_ARM_AFBC(AFBC_FORMAT_MOD_BLOCK_SIZE_16x16 |
+				AFBC_FORMAT_MOD_YTR |
+				AFBC_FORMAT_MOD_CBR),
+
+	DRM_FORMAT_MOD_ARM_AFBC(AFBC_FORMAT_MOD_BLOCK_SIZE_16x16 |
+				AFBC_FORMAT_MOD_YTR |
+				AFBC_FORMAT_MOD_CBR |
+				AFBC_FORMAT_MOD_SPARSE),
+
+	/* SPLIT mandates SPARSE, RGB modes mandates YTR */
+	DRM_FORMAT_MOD_ARM_AFBC(AFBC_FORMAT_MOD_BLOCK_SIZE_16x16 |
+				AFBC_FORMAT_MOD_YTR |
+				AFBC_FORMAT_MOD_SPARSE |
+				AFBC_FORMAT_MOD_SPLIT),
+
+	DRM_FORMAT_MOD_ROCKCHIP_TILED(ROCKCHIP_TILED_BLOCK_SIZE_8x8),
+	DRM_FORMAT_MOD_ROCKCHIP_TILED(ROCKCHIP_TILED_BLOCK_SIZE_4x4_MODE0),
+	DRM_FORMAT_MOD_ROCKCHIP_TILED(ROCKCHIP_TILED_BLOCK_SIZE_4x4_MODE1),
+
+	DRM_FORMAT_MOD_LINEAR,
 	DRM_FORMAT_MOD_INVALID,
 };
 
@@ -364,6 +428,16 @@
 
 };
 
+static const struct vop_intr rk3528_vop_axi_intr[] = {
+	{
+	  .intrs = rk3568_vop_axi_intrs,
+	  .nintrs = ARRAY_SIZE(rk3568_vop_axi_intrs),
+	  .status = VOP_REG(RK3568_SYS0_INT_STATUS, 0xfe, 0),
+	  .enable = VOP_REG_MASK(RK3568_SYS0_INT_EN, 0xfe, 0),
+	  .clear = VOP_REG_MASK(RK3568_SYS0_INT_CLR, 0xfe, 0),
+	},
+};
+
 static const struct vop_intr rk3568_vop_axi_intr[] = {
 	{
 	  .intrs = rk3568_vop_axi_intrs,
@@ -444,6 +518,191 @@
 	.max_output = { 1920, 1080 },
 	.fifo_depth =  1920 * 4 / 16,
 	.regs = &rk3568_vop_wb_regs,
+};
+
+static const struct vop2_video_port_regs rk3528_vop_vp0_regs = {
+	.cfg_done = VOP_REG(RK3568_REG_CFG_DONE, 0x1, 0),
+	.overlay_mode = VOP_REG(RK3528_OVL_PORT0_CTRL, 0x1, 0),
+	.dsp_background = VOP_REG(RK3568_VP0_DSP_BG, 0xffffffff, 0),
+	.out_mode = VOP_REG(RK3568_VP0_DSP_CTRL, 0xf, 0),
+	.core_dclk_div = VOP_REG(RK3568_VP0_DSP_CTRL, 0x1, 4),
+	.dclk_div2 = VOP_REG(RK3568_VP0_MIPI_CTRL, 0x1, 4),
+	.dclk_div2_phase_lock = VOP_REG(RK3568_VP0_MIPI_CTRL, 0x1, 5),
+	.p2i_en = VOP_REG(RK3568_VP0_DSP_CTRL, 0x1, 5),
+	.dsp_filed_pol = VOP_REG(RK3568_VP0_DSP_CTRL, 0x1, 6),
+	.dsp_interlace = VOP_REG(RK3568_VP0_DSP_CTRL, 0x1, 7),
+	.dsp_data_swap = VOP_REG(RK3568_VP0_DSP_CTRL, 0x1f, 8),
+	.post_dsp_out_r2y = VOP_REG(RK3568_VP0_DSP_CTRL, 0x1, 15),
+	.pre_dither_down_en = VOP_REG(RK3568_VP0_DSP_CTRL, 0x1, 16),
+	.dither_down_en = VOP_REG(RK3568_VP0_DSP_CTRL, 0x1, 17),
+	.dither_down_sel = VOP_REG(RK3568_VP0_DSP_CTRL, 0x3, 18),
+	.dither_down_mode = VOP_REG(RK3568_VP0_DSP_CTRL, 0x1, 20),
+	.gamma_update_en = VOP_REG(RK3568_VP0_DSP_CTRL, 0x1, 22),
+	.dsp_lut_en = VOP_REG(RK3568_VP0_DSP_CTRL, 0x1, 28),
+	.standby = VOP_REG(RK3568_VP0_DSP_CTRL, 0x1, 31),
+	.bg_mix_ctrl = VOP_REG(RK3528_OVL_PORT0_BG_MIX_CTRL, 0xffff, 0),
+	.bg_dly = VOP_REG(RK3528_OVL_PORT0_BG_MIX_CTRL, 0xff, 24),
+	.pre_scan_htiming = VOP_REG(RK3568_VP0_PRE_SCAN_HTIMING, 0x1fff1fff, 0),
+	.hpost_st_end = VOP_REG(RK3568_VP0_POST_DSP_HACT_INFO, 0x1fff1fff, 0),
+	.vpost_st_end = VOP_REG(RK3568_VP0_POST_DSP_VACT_INFO, 0x1fff1fff, 0),
+	.post_scl_factor = VOP_REG(RK3568_VP0_POST_SCL_FACTOR_YRGB, 0xffffffff, 0),
+	.post_scl_ctrl = VOP_REG(RK3568_VP0_POST_SCL_CTRL, 0x3, 0),
+	.htotal_pw = VOP_REG(RK3568_VP0_DSP_HTOTAL_HS_END, 0xffffffff, 0),
+	.hact_st_end = VOP_REG(RK3568_VP0_DSP_HACT_ST_END, 0xffffffff, 0),
+	.vtotal_pw = VOP_REG(RK3568_VP0_DSP_VTOTAL_VS_END, 0x1fff1fff, 0),
+	.vact_st_end = VOP_REG(RK3568_VP0_DSP_VACT_ST_END, 0x1fff1fff, 0),
+	.vact_st_end_f1 = VOP_REG(RK3568_VP0_DSP_VACT_ST_END_F1, 0x1fff1fff, 0),
+	.vs_st_end_f1 = VOP_REG(RK3568_VP0_DSP_VS_ST_END_F1, 0x1fff1fff, 0),
+	.vpost_st_end_f1 = VOP_REG(RK3568_VP0_POST_DSP_VACT_INFO_F1, 0x1fff1fff, 0),
+	.lut_dma_rid = VOP_REG(RK3568_SYS_AXI_LUT_CTRL, 0xf, 4),
+	.layer_sel = VOP_REG(RK3528_OVL_PORT0_LAYER_SEL, 0xffff, 0),
+	.hdr_src_color_ctrl = VOP_REG(RK3528_HDR_SRC_COLOR_CTRL, 0xffffffff, 0),
+	.hdr_dst_color_ctrl = VOP_REG(RK3528_HDR_DST_COLOR_CTRL, 0xffffffff, 0),
+	.hdr_src_alpha_ctrl = VOP_REG(RK3528_HDR_SRC_ALPHA_CTRL, 0xffffffff, 0),
+	.hdr_dst_alpha_ctrl = VOP_REG(RK3528_HDR_DST_ALPHA_CTRL, 0xffffffff, 0),
+	.hdr_lut_update_en = VOP_REG(RK3568_HDR_LUT_CTRL, 0x1, 0),
+	.hdr_lut_mode = VOP_REG(RK3568_HDR_LUT_CTRL, 0x1, 1),
+	.hdr_lut_mst = VOP_REG(RK3568_HDR_LUT_MST, 0xffffffff, 0),
+	.hdr_lut_fetch_done = VOP_REG(RK3528_HDR_LUT_STATUS, 0x1, 0),
+	.hdr10_en = VOP_REG(RK3568_OVL_CTRL, 0x1, 4),
+	.sdr2hdr_path_en = VOP_REG(RK3568_OVL_CTRL, 0x1, 5),
+	.sdr2hdr_en = VOP_REG(RK3568_SDR2HDR_CTRL, 0x1, 0),
+	.sdr2hdr_auto_gating_en = VOP_REG(RK3568_SDR2HDR_CTRL, 0x1, 1),
+	.sdr2hdr_bypass_en = VOP_REG(RK3568_SDR2HDR_CTRL, 0x1, 2),
+	.sdr2hdr_dstmode = VOP_REG(RK3568_SDR2HDR_CTRL, 0x1, 3),
+	.hdr_vivid_en = VOP_REG(RK3528_HDRVIVID_CTRL, 0x1, 0),
+	.hdr_vivid_bypass_en = VOP_REG(RK3528_HDRVIVID_CTRL, 0x1, 2),
+	.hdr_vivid_path_mode = VOP_REG(RK3528_HDRVIVID_CTRL, 0x7, 3),
+	.hdr_vivid_dstgamut = VOP_REG(RK3528_HDRVIVID_CTRL, 0x1, 6),
+	.acm_bypass_en = VOP_REG(RK3528_VP0_ACM_CTRL, 0x1, 0),
+	.csc_en = VOP_REG(RK3528_VP0_ACM_CTRL, 0x1, 1),
+	.acm_r2y_en = VOP_REG(RK3528_VP0_ACM_CTRL, 0x1, 2),
+	.csc_mode = VOP_REG(RK3528_VP0_ACM_CTRL, 0x7, 3),
+	.acm_r2y_mode = VOP_REG(RK3528_VP0_ACM_CTRL, 0x7, 8),
+	.csc_coe00 = VOP_REG(RK3528_VP0_ACM_CTRL, 0xffff, 16),
+	.csc_coe01 = VOP_REG(RK3528_VP0_CSC_COE01_02, 0xffff, 0),
+	.csc_coe02 = VOP_REG(RK3528_VP0_CSC_COE01_02, 0xffff, 16),
+	.csc_coe10 = VOP_REG(RK3528_VP0_CSC_COE10_11, 0xffff, 0),
+	.csc_coe11 = VOP_REG(RK3528_VP0_CSC_COE10_11, 0xffff, 16),
+	.csc_coe12 = VOP_REG(RK3528_VP0_CSC_COE12_20, 0xffff, 0),
+	.csc_coe20 = VOP_REG(RK3528_VP0_CSC_COE12_20, 0xffff, 16),
+	.csc_coe21 = VOP_REG(RK3528_VP0_CSC_COE21_22, 0xffff, 0),
+	.csc_coe22 = VOP_REG(RK3528_VP0_CSC_COE21_22, 0xffff, 16),
+	.csc_offset0 = VOP_REG(RK3528_VP0_CSC_OFFSET0, 0xffffffff, 0),
+	.csc_offset1 = VOP_REG(RK3528_VP0_CSC_OFFSET1, 0xffffffff, 0),
+	.csc_offset2 = VOP_REG(RK3528_VP0_CSC_OFFSET2, 0xffffffff, 0),
+};
+
+static const struct vop2_video_port_regs rk3528_vop_vp1_regs = {
+	.cfg_done = VOP_REG(RK3568_REG_CFG_DONE, 0x1, 1),
+	.overlay_mode = VOP_REG(RK3528_OVL_PORT1_CTRL, 0x1, 0),
+	.dsp_background = VOP_REG(RK3568_VP1_DSP_BG, 0xffffffff, 0),
+	.out_mode = VOP_REG(RK3568_VP1_DSP_CTRL, 0xf, 0),
+	.core_dclk_div = VOP_REG(RK3568_VP1_DSP_CTRL, 0x1, 4),
+	.p2i_en = VOP_REG(RK3568_VP1_DSP_CTRL, 0x1, 5),
+	.dsp_filed_pol = VOP_REG(RK3568_VP1_DSP_CTRL, 0x1, 6),
+	.dsp_interlace = VOP_REG(RK3568_VP1_DSP_CTRL, 0x1, 7),
+	.dsp_data_swap = VOP_REG(RK3568_VP1_DSP_CTRL, 0x1f, 8),
+	.post_dsp_out_r2y = VOP_REG(RK3568_VP1_DSP_CTRL, 0x1, 15),
+	.pre_dither_down_en = VOP_REG(RK3568_VP1_DSP_CTRL, 0x1, 16),
+	.dither_down_en = VOP_REG(RK3568_VP1_DSP_CTRL, 0x1, 17),
+	.dither_down_sel = VOP_REG(RK3568_VP1_DSP_CTRL, 0x3, 18),
+	.dither_down_mode = VOP_REG(RK3568_VP1_DSP_CTRL, 0x1, 20),
+	.gamma_update_en = VOP_REG(RK3568_VP1_DSP_CTRL, 0x1, 22),
+	.dsp_lut_en = VOP_REG(RK3568_VP1_DSP_CTRL, 0x1, 28),
+	.standby = VOP_REG(RK3568_VP1_DSP_CTRL, 0x1, 31),
+	.bg_mix_ctrl = VOP_REG(RK3528_OVL_PORT1_BG_MIX_CTRL, 0xffff, 0),
+	.bg_dly = VOP_REG(RK3528_OVL_PORT1_BG_MIX_CTRL, 0xff, 24),
+	.pre_scan_htiming = VOP_REG(RK3568_VP1_PRE_SCAN_HTIMING, 0x1fff1fff, 0),
+	.hpost_st_end = VOP_REG(RK3568_VP1_POST_DSP_HACT_INFO, 0x1fff1fff, 0),
+	.vpost_st_end = VOP_REG(RK3568_VP1_POST_DSP_VACT_INFO, 0x1fff1fff, 0),
+	.post_scl_factor = VOP_REG(RK3568_VP1_POST_SCL_FACTOR_YRGB, 0xffffffff, 0),
+	.post_scl_ctrl = VOP_REG(RK3568_VP1_POST_SCL_CTRL, 0x3, 0),
+	.htotal_pw = VOP_REG(RK3568_VP1_DSP_HTOTAL_HS_END, 0xffffffff, 0),
+	.hact_st_end = VOP_REG(RK3568_VP1_DSP_HACT_ST_END, 0xffffffff, 0),
+	.vtotal_pw = VOP_REG(RK3568_VP1_DSP_VTOTAL_VS_END, 0x1fff1fff, 0),
+	.vact_st_end = VOP_REG(RK3568_VP1_DSP_VACT_ST_END, 0x1fff1fff, 0),
+	.vact_st_end_f1 = VOP_REG(RK3568_VP1_DSP_VACT_ST_END_F1, 0x1fff1fff, 0),
+	.vs_st_end_f1 = VOP_REG(RK3568_VP1_DSP_VS_ST_END_F1, 0x1fff1fff, 0),
+	.vpost_st_end_f1 = VOP_REG(RK3568_VP1_POST_DSP_VACT_INFO_F1, 0x1fff1fff, 0),
+	.bcsh_brightness = VOP_REG(RK3568_VP1_BCSH_BCS, 0xff, 0),
+	.bcsh_contrast = VOP_REG(RK3568_VP1_BCSH_BCS, 0x1ff, 8),
+	.bcsh_sat_con = VOP_REG(RK3568_VP1_BCSH_BCS, 0x3ff, 20),
+	.bcsh_out_mode = VOP_REG(RK3568_VP1_BCSH_BCS, 0x3, 30),
+	.bcsh_sin_hue = VOP_REG(RK3568_VP1_BCSH_H, 0x1ff, 0),
+	.bcsh_cos_hue = VOP_REG(RK3568_VP1_BCSH_H, 0x1ff, 16),
+	.bcsh_r2y_csc_mode = VOP_REG(RK3568_VP1_BCSH_CTRL, 0x3, 6),
+	.bcsh_r2y_en = VOP_REG(RK3568_VP1_BCSH_CTRL, 0x1, 4),
+	.bcsh_y2r_csc_mode = VOP_REG(RK3568_VP1_BCSH_CTRL, 0x3, 2),
+	.bcsh_y2r_en = VOP_REG(RK3568_VP1_BCSH_CTRL, 0x1, 0),
+	.bcsh_en = VOP_REG(RK3568_VP1_BCSH_COLOR_BAR, 0x1, 31),
+	.lut_dma_rid = VOP_REG(RK3568_SYS_AXI_LUT_CTRL, 0xf, 4),
+	.layer_sel = VOP_REG(RK3528_OVL_PORT1_LAYER_SEL, 0xffff, 0),
+};
+
+static const struct vop3_ovl_mix_regs rk3528_vop_hdr_mix_regs = {
+	.src_color_ctrl = VOP_REG(RK3528_HDR_SRC_COLOR_CTRL, 0xffffffff, 0),
+	.dst_color_ctrl = VOP_REG(RK3528_HDR_DST_COLOR_CTRL, 0xffffffff, 0),
+	.src_alpha_ctrl = VOP_REG(RK3528_HDR_SRC_ALPHA_CTRL, 0xffffffff, 0),
+	.dst_alpha_ctrl = VOP_REG(RK3528_HDR_DST_ALPHA_CTRL, 0xffffffff, 0),
+};
+
+static const struct vop3_ovl_mix_regs rk3528_vop_vp0_layer_mix_regs = {
+	.src_color_ctrl = VOP_REG(RK3528_OVL_PORT0_MIX0_SRC_COLOR_CTRL, 0xffffffff, 0),
+	.dst_color_ctrl = VOP_REG(RK3528_OVL_PORT0_MIX0_DST_COLOR_CTRL, 0xffffffff, 0),
+	.src_alpha_ctrl = VOP_REG(RK3528_OVL_PORT0_MIX0_SRC_ALPHA_CTRL, 0xffffffff, 0),
+	.dst_alpha_ctrl = VOP_REG(RK3528_OVL_PORT0_MIX0_DST_ALPHA_CTRL, 0xffffffff, 0),
+};
+
+static const struct vop3_ovl_mix_regs rk3528_vop_vp1_layer_mix_regs = {
+	.src_color_ctrl = VOP_REG(RK3528_OVL_PORT1_MIX0_SRC_COLOR_CTRL, 0xffffffff, 0),
+	.dst_color_ctrl = VOP_REG(RK3528_OVL_PORT1_MIX0_DST_COLOR_CTRL, 0xffffffff, 0),
+	.src_alpha_ctrl = VOP_REG(RK3528_OVL_PORT1_MIX0_SRC_ALPHA_CTRL, 0xffffffff, 0),
+	.dst_alpha_ctrl = VOP_REG(RK3528_OVL_PORT1_MIX0_DST_ALPHA_CTRL, 0xffffffff, 0),
+};
+
+static const struct vop3_ovl_regs rk3528_vop_vp0_ovl_regs = {
+	.layer_mix_regs = &rk3528_vop_vp0_layer_mix_regs,
+	.hdr_mix_regs = &rk3528_vop_hdr_mix_regs,
+};
+
+static const struct vop3_ovl_regs rk3528_vop_vp1_ovl_regs = {
+	.layer_mix_regs = &rk3528_vop_vp1_layer_mix_regs,
+};
+
+static const struct vop2_video_port_data rk3528_vop_video_ports[] = {
+	{
+	 .id = 0,
+	 .soc_id = { 0x3528, 0x3528 },
+	 .lut_dma_rid = 14,
+	 .feature = VOP_FEATURE_ALPHA_SCALE | VOP_FEATURE_OVERSCAN | VOP_FEATURE_VIVID_HDR |
+		    VOP_FEATURE_POST_ACM | VOP_FEATURE_POST_CSC | VOP_FEATURE_OUTPUT_10BIT,
+	 .gamma_lut_len = 1024,
+	 .max_output = { 4096, 4096 },
+	 .hdrvivid_dly = {17, 29, 32, 44, 15, 38, 1, 29, 0, 0},
+	 .sdr2hdr_dly = 21,
+	 .layer_mix_dly = 6,
+	 .hdr_mix_dly = 2,
+	 .win_dly = 8,
+	 .intr = &rk3568_vp0_intr,
+	 .regs = &rk3528_vop_vp0_regs,
+	 .ovl_regs = &rk3528_vop_vp0_ovl_regs,
+	},
+	{
+	 .id = 1,
+	 .soc_id = { 0x3528, 0x3528 },
+	 .feature = VOP_FEATURE_ALPHA_SCALE | VOP_FEATURE_OVERSCAN,
+	 .max_output = { 720, 576 },
+	 .pre_scan_max_dly = { 37, 40, 40, 40 },
+	 .hdrvivid_dly = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+	 .sdr2hdr_dly = 0,
+	 .layer_mix_dly = 2,
+	 .hdr_mix_dly = 0,
+	 .win_dly = 8,
+	 .intr = &rk3568_vp1_intr,
+	 .regs = &rk3528_vop_vp1_regs,
+	 .ovl_regs = &rk3528_vop_vp1_ovl_regs,
+	},
 };
 
 static const struct vop2_video_port_regs rk3568_vop_vp0_regs = {
@@ -718,6 +977,18 @@
 	},
 };
 
+static const struct vop2_cluster_regs rk3528_vop_cluster0 = {
+	 .afbc_enable = VOP_REG(RK3568_CLUSTER0_CTRL, 0x1, 1),
+	 .enable = VOP_REG(RK3568_CLUSTER0_CTRL, 1, 0),
+	 .lb_mode = VOP_REG(RK3568_CLUSTER0_CTRL, 0xf, 4),
+	 .scl_lb_mode = VOP_REG(RK3568_CLUSTER0_CTRL, 0x3, 9),
+	 .frm_reset_en = VOP_REG(RK3568_CLUSTER0_CTRL, 1, 31),
+	 .src_color_ctrl = VOP_REG(RK3528_CLUSTER0_MIX_SRC_COLOR_CTRL, 0xffffffff, 0),
+	 .dst_color_ctrl = VOP_REG(RK3528_CLUSTER0_MIX_DST_COLOR_CTRL, 0xffffffff, 0),
+	 .src_alpha_ctrl = VOP_REG(RK3528_CLUSTER0_MIX_SRC_ALPHA_CTRL, 0xffffffff, 0),
+	 .dst_alpha_ctrl = VOP_REG(RK3528_CLUSTER0_MIX_DST_ALPHA_CTRL, 0xffffffff, 0),
+};
+
 static const struct vop2_cluster_regs rk3568_vop_cluster0 = {
 	.afbc_enable = VOP_REG(RK3568_CLUSTER0_CTRL, 0x1, 1),
 	.enable = VOP_REG(RK3568_CLUSTER0_CTRL, 1, 0),
@@ -758,12 +1029,32 @@
 	.ymirror = VOP_REG(RK3568_CLUSTER0_WIN0_AFBCD_ROTATE_MODE, 0x1, 3),
 };
 
+static const struct vop2_scl_regs rk3528_cluster0_win_scl = {
+	.scale_yrgb_x = VOP_REG(RK3568_CLUSTER0_WIN0_SCL_FACTOR_YRGB, 0xffff, 0x0),
+	.scale_yrgb_y = VOP_REG(RK3568_CLUSTER0_WIN0_SCL_FACTOR_YRGB, 0xffff, 16),
+	.yrgb_ver_scl_mode = VOP_REG(RK3528_CLUSTER0_WIN0_CTRL1, 0x3, 14),
+	.yrgb_hor_scl_mode = VOP_REG(RK3528_CLUSTER0_WIN0_CTRL1, 0x3, 22),
+
+	.yrgb_vscl_filter_mode = VOP_REG(RK3528_CLUSTER0_WIN0_CTRL1, 0x3, 12),/* supported from vop3 */
+	.yrgb_hscl_filter_mode = VOP_REG(RK3528_CLUSTER0_WIN0_CTRL1, 0x3, 20),/* supported from vop3 */
+
+	.vsd_yrgb_gt2 = VOP_REG(RK3568_CLUSTER0_WIN0_CTRL1, 0x1, 28),
+	.vsd_yrgb_gt4 = VOP_REG(RK3568_CLUSTER0_WIN0_CTRL1, 0x1, 29),
+	.vsd_cbcr_gt2 = VOP_REG(RK3568_CLUSTER0_WIN0_CTRL1, 0x1, 30),
+	.vsd_cbcr_gt4 = VOP_REG(RK3568_CLUSTER0_WIN0_CTRL1, 0x1, 31),
+
+	.vsd_avg2 = VOP_REG(RK3568_CLUSTER0_WIN0_CTRL1, 0x1, 18),/* supported from vop3 */
+	.vsd_avg4 = VOP_REG(RK3568_CLUSTER0_WIN0_CTRL1, 0x1, 19),
+	.xavg_en = VOP_REG(RK3568_CLUSTER0_WIN0_CTRL1, 0x1, 27),
+	.xgt_en = VOP_REG(RK3568_CLUSTER0_WIN0_CTRL1, 0x1, 24),
+	.xgt_mode = VOP_REG(RK3568_CLUSTER0_WIN0_CTRL1, 0x3, 25),
+};
+
 static const struct vop2_scl_regs rk3568_cluster0_win_scl = {
 	.scale_yrgb_x = VOP_REG(RK3568_CLUSTER0_WIN0_SCL_FACTOR_YRGB, 0xffff, 0x0),
 	.scale_yrgb_y = VOP_REG(RK3568_CLUSTER0_WIN0_SCL_FACTOR_YRGB, 0xffff, 16),
 	.yrgb_ver_scl_mode = VOP_REG(RK3568_CLUSTER0_WIN0_CTRL1, 0x3, 14),
 	.yrgb_hor_scl_mode = VOP_REG(RK3568_CLUSTER0_WIN0_CTRL1, 0x3, 12),
-	.bic_coe_sel = VOP_REG(RK3568_CLUSTER0_WIN0_CTRL1, 0x3, 2),
 	.vsd_yrgb_gt2 = VOP_REG(RK3568_CLUSTER0_WIN0_CTRL1, 0x1, 28),
 	.vsd_yrgb_gt4 = VOP_REG(RK3568_CLUSTER0_WIN0_CTRL1, 0x1, 29),
 };
@@ -817,6 +1108,9 @@
 	.vsd_yrgb_gt4 = VOP_REG(RK3568_ESMART0_REGION0_CTRL, 0x1, 9),
 	.vsd_cbcr_gt2 = VOP_REG(RK3568_ESMART0_REGION0_CTRL, 0x1, 10),
 	.vsd_cbcr_gt4 = VOP_REG(RK3568_ESMART0_REGION0_CTRL, 0x1, 11),
+	.xavg_en = VOP_REG(RK3568_ESMART0_REGION0_CTRL, 0x1, 20),/* supported from vop3 */
+	.xgt_en = VOP_REG(RK3568_ESMART0_REGION0_CTRL, 0x1, 21),
+	.xgt_mode = VOP_REG(RK3568_ESMART0_REGION0_CTRL, 0x3, 22),
 };
 
 static const struct vop2_scl_regs rk3568_area1_scl = {
@@ -837,6 +1131,9 @@
 	.vsd_yrgb_gt4 = VOP_REG(RK3568_ESMART0_REGION1_CTRL, 0x1, 9),
 	.vsd_cbcr_gt2 = VOP_REG(RK3568_ESMART0_REGION1_CTRL, 0x1, 10),
 	.vsd_cbcr_gt4 = VOP_REG(RK3568_ESMART0_REGION1_CTRL, 0x1, 11),
+	.xavg_en = VOP_REG(RK3568_ESMART0_REGION1_CTRL, 0x1, 20),/* supported from vop3 */
+	.xgt_en = VOP_REG(RK3568_ESMART0_REGION1_CTRL, 0x1, 21),
+	.xgt_mode = VOP_REG(RK3568_ESMART0_REGION1_CTRL, 0x3, 22),
 };
 
 static const struct vop2_scl_regs rk3568_area2_scl = {
@@ -857,6 +1154,9 @@
 	.vsd_yrgb_gt4 = VOP_REG(RK3568_ESMART0_REGION2_CTRL, 0x1, 9),
 	.vsd_cbcr_gt2 = VOP_REG(RK3568_ESMART0_REGION2_CTRL, 0x1, 10),
 	.vsd_cbcr_gt4 = VOP_REG(RK3568_ESMART0_REGION2_CTRL, 0x1, 11),
+	.xavg_en = VOP_REG(RK3568_ESMART0_REGION2_CTRL, 0x1, 20),/* supported from vop3 */
+	.xgt_en = VOP_REG(RK3568_ESMART0_REGION2_CTRL, 0x1, 21),
+	.xgt_mode = VOP_REG(RK3568_ESMART0_REGION2_CTRL, 0x3, 22),
 };
 
 static const struct vop2_scl_regs rk3568_area3_scl = {
@@ -877,6 +1177,9 @@
 	.vsd_yrgb_gt4 = VOP_REG(RK3568_ESMART0_REGION3_CTRL, 0x1, 9),
 	.vsd_cbcr_gt2 = VOP_REG(RK3568_ESMART0_REGION3_CTRL, 0x1, 10),
 	.vsd_cbcr_gt4 = VOP_REG(RK3568_ESMART0_REGION3_CTRL, 0x1, 11),
+	.xavg_en = VOP_REG(RK3568_ESMART0_REGION3_CTRL, 0x1, 20),/* supported from vop3 */
+	.xgt_en = VOP_REG(RK3568_ESMART0_REGION3_CTRL, 0x1, 21),
+	.xgt_mode = VOP_REG(RK3568_ESMART0_REGION3_CTRL, 0x3, 22),
 };
 
 static const struct vop2_win_regs rk3568_area1_data = {
@@ -933,6 +1236,31 @@
 	&rk3568_area3_data
 };
 
+static const struct vop2_win_regs rk3528_cluster0_win_data = {
+	.scl = &rk3528_cluster0_win_scl,
+	.afbc = &rk3568_cluster0_afbc,
+	.cluster = &rk3528_vop_cluster0,
+	.enable = VOP_REG(RK3568_CLUSTER0_WIN0_CTRL0, 0x1, 0),
+	.format = VOP_REG(RK3568_CLUSTER0_WIN0_CTRL0, 0x3f, 1),
+	.tile_mode = VOP_REG(RK3568_CLUSTER0_WIN0_CTRL0, 0x1, 7),
+	.rb_swap = VOP_REG(RK3568_CLUSTER0_WIN0_CTRL0, 0x1, 14),
+	.uv_swap = VOP_REG(RK3568_CLUSTER0_WIN0_CTRL0, 0x1, 17),
+	.dither_up = VOP_REG(RK3568_CLUSTER0_WIN0_CTRL0, 0x1, 18),
+	.act_info = VOP_REG(RK3568_CLUSTER0_WIN0_ACT_INFO, 0x1fff1fff, 0),
+	.dsp_info = VOP_REG(RK3568_CLUSTER0_WIN0_DSP_INFO, 0x0fff0fff, 0),
+	.dsp_st = VOP_REG(RK3568_CLUSTER0_WIN0_DSP_ST, 0x1fff1fff, 0),
+	.yrgb_mst = VOP_REG(RK3568_CLUSTER0_WIN0_YRGB_MST, 0xffffffff, 0),
+	.uv_mst = VOP_REG(RK3568_CLUSTER0_WIN0_CBR_MST, 0xffffffff, 0),
+	.yuv_clip = VOP_REG(RK3568_CLUSTER0_WIN0_CTRL0, 0x1, 19),
+	.yrgb_vir = VOP_REG(RK3568_CLUSTER0_WIN0_VIR, 0xffff, 0),
+	.uv_vir = VOP_REG(RK3568_CLUSTER0_WIN0_VIR, 0xffff, 16),
+	.y2r_en = VOP_REG(RK3568_CLUSTER0_WIN0_CTRL0, 0x1, 8),
+	.r2y_en = VOP_REG(RK3568_CLUSTER0_WIN0_CTRL0, 0x1, 9),
+	.csc_mode = VOP_REG(RK3568_CLUSTER0_WIN0_CTRL0, 0x7, 10),
+	.axi_yrgb_id = VOP_REG(RK3528_CLUSTER0_WIN0_CTRL2, 0x1f, 0),
+	.axi_uv_id = VOP_REG(RK3528_CLUSTER0_WIN0_CTRL2, 0x1f, 5),
+};
+
 static const struct vop2_win_regs rk3568_cluster0_win_data = {
 	.scl = &rk3568_cluster0_win_scl,
 	.afbc = &rk3568_cluster0_afbc,
@@ -977,6 +1305,9 @@
 
 static const struct vop2_win_regs rk3568_esmart_win_data = {
 	.scl = &rk3568_esmart_win_scl,
+	.axi_yrgb_id = VOP_REG(RK3568_ESMART0_CTRL1, 0x1f, 4),
+	.axi_uv_id = VOP_REG(RK3568_ESMART0_CTRL1, 0x1f, 12),
+	.axi_id = VOP_REG(RK3568_ESMART0_AXI_CTRL, 0x1, 1),
 	.enable = VOP_REG(RK3568_ESMART0_REGION0_CTRL, 0x1, 0),
 	.format = VOP_REG(RK3568_ESMART0_REGION0_CTRL, 0x1f, 1),
 	.dither_up = VOP_REG(RK3568_ESMART0_REGION0_CTRL, 0x1, 12),
@@ -993,9 +1324,204 @@
 	.y2r_en = VOP_REG(RK3568_ESMART0_CTRL0, 0x1, 0),
 	.r2y_en = VOP_REG(RK3568_ESMART0_CTRL0, 0x1, 1),
 	.csc_mode = VOP_REG(RK3568_ESMART0_CTRL0, 0x3, 2),
+	.csc_13bit_en = VOP_REG(RK3568_ESMART0_CTRL0, 0x1, 16),
 	.ymirror = VOP_REG(RK3568_ESMART0_CTRL1, 0x1, 31),
 	.color_key = VOP_REG(RK3568_ESMART0_COLOR_KEY_CTRL, 0x3fffffff, 0),
 	.color_key_en = VOP_REG(RK3568_ESMART0_COLOR_KEY_CTRL, 0x1, 31),
+	.scale_engine_num = VOP_REG(RK3568_ESMART0_CTRL0, 0x3, 12),/* supported from vop3 */
+};
+
+/*
+ * RK3528 VOP with 1 Cluster win and 4 Esmart win.
+ * Every Esmart win support 4 multi-region.
+ * VP0 can use Cluster win and Esmart0/1/2
+ * VP1 can use Esmart 2/3
+ *
+ * Scale filter mode:
+ *
+ * * Cluster:
+ * * Support prescale down:
+ * * H/V: gt2/avg2 or gt4/avg4
+ * * After prescale down:
+ *    * nearest-neighbor/bilinear/bicubic for scale up
+ *    * nearest-neighbor/bilinear for scale down
+ *
+ * * Esmart:
+ * * Support prescale down:
+ * * H: gt2/avg2 or gt4/avg4
+ * * V: gt2 or gt4
+ * * After prescale down:
+ *    * nearest-neighbor/bilinear/bicubic for scale up
+ *    * nearest-neighbor/bilinear/average for scale down
+ */
+static const struct vop2_win_data rk3528_vop_win_data[] = {
+	{
+	  .name = "Esmart0-win0",
+	  .phys_id = ROCKCHIP_VOP2_ESMART0,
+	  .formats = formats_for_esmart,
+	  .nformats = ARRAY_SIZE(formats_for_esmart),
+	  .format_modifiers = format_modifiers,
+	  .base = 0x0,
+	  .layer_sel_id = { 1, 0xff, 0xff, 0xff },
+	  .supported_rotations = DRM_MODE_REFLECT_Y,
+	  .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 */
+	  .regs = &rk3568_esmart_win_data,
+	  .area = rk3568_area_data,
+	  .area_size = ARRAY_SIZE(rk3568_area_data),
+	  .type = DRM_PLANE_TYPE_PRIMARY,
+	  .axi_id = 0,
+	  .axi_yrgb_id = 0x06,
+	  .axi_uv_id = 0x07,
+	  .possible_crtcs = 0x1,/* vp0 only */
+	  .max_upscale_factor = 8,
+	  .max_downscale_factor = 8,
+	  .dly = { 27, 45, 48 },
+	  .feature = WIN_FEATURE_MULTI_AREA | WIN_FEATURE_Y2R_13BIT_DEPTH,
+	},
+
+	{
+	  .name = "Esmart1-win0",
+	  .phys_id = ROCKCHIP_VOP2_ESMART1,
+	  .formats = formats_for_esmart,
+	  .nformats = ARRAY_SIZE(formats_for_esmart),
+	  .format_modifiers = format_modifiers,
+	  .base = 0x200,
+	  .layer_sel_id = { 2, 0xff, 0xff, 0xff },
+	  .supported_rotations = DRM_MODE_REFLECT_Y,
+	  .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 */
+	  .regs = &rk3568_esmart_win_data,
+	  .area = rk3568_area_data,
+	  .area_size = ARRAY_SIZE(rk3568_area_data),
+	  .type = DRM_PLANE_TYPE_OVERLAY,
+	  .axi_id = 0,
+	  .axi_yrgb_id = 0x08,
+	  .axi_uv_id = 0x09,
+	  .possible_crtcs = 0x1,/* vp0 only */
+	  .max_upscale_factor = 8,
+	  .max_downscale_factor = 8,
+	  .dly = { 27, 45, 48 },
+	  .feature = WIN_FEATURE_MULTI_AREA,
+	},
+
+	{
+	  .name = "Esmart2-win0",
+	  .phys_id = ROCKCHIP_VOP2_ESMART2,
+	  .base = 0x400,
+	  .formats = formats_for_esmart,
+	  .nformats = ARRAY_SIZE(formats_for_esmart),
+	  .format_modifiers = format_modifiers,
+	  .layer_sel_id = { 3, 0, 0xff, 0xff },
+	  .supported_rotations = DRM_MODE_REFLECT_Y,
+	  .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 */
+	  .regs = &rk3568_esmart_win_data,
+	  .area = rk3568_area_data,
+	  .area_size = ARRAY_SIZE(rk3568_area_data),
+	  .type = DRM_PLANE_TYPE_CURSOR,
+	  .axi_id = 0,
+	  .axi_yrgb_id = 0x0a,
+	  .axi_uv_id = 0x0b,
+	  .possible_crtcs = 0x3,/* vp0 or vp1 */
+	  .max_upscale_factor = 8,
+	  .max_downscale_factor = 8,
+	  .dly = { 27, 45, 48 },
+	  .feature = WIN_FEATURE_MULTI_AREA,
+	},
+
+	{
+	  .name = "Esmart3-win0",
+	  .phys_id = ROCKCHIP_VOP2_ESMART3,
+	  .formats = formats_for_esmart,
+	  .nformats = ARRAY_SIZE(formats_for_esmart),
+	  .format_modifiers = format_modifiers,
+	  .base = 0x600,
+	  .layer_sel_id = { 0xff, 1, 0xff, 0xff },
+	  .supported_rotations = DRM_MODE_REFLECT_Y,
+	  .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 */
+	  .regs = &rk3568_esmart_win_data,
+	  .area = rk3568_area_data,
+	  .area_size = ARRAY_SIZE(rk3568_area_data),
+	  .type = DRM_PLANE_TYPE_PRIMARY,
+	  .axi_id = 0,
+	  .axi_yrgb_id = 0x0c,
+	  .axi_uv_id = 0x0d,
+	  .possible_crtcs = 0x2,/* vp1 only */
+	  .max_upscale_factor = 8,
+	  .max_downscale_factor = 8,
+	  .dly = { 27, 45, 48 },
+	  .feature = WIN_FEATURE_MULTI_AREA,
+	},
+
+	{
+	  .name = "Cluster0-win0",
+	  .phys_id = ROCKCHIP_VOP2_CLUSTER0,
+	  .base = 0x00,
+	  .formats = formats_for_cluster,
+	  .nformats = ARRAY_SIZE(formats_for_cluster),
+	  .format_modifiers = format_modifiers_afbc_tiled,
+	  .layer_sel_id = { 0, 0xff, 0xff, 0xff },
+	  .supported_rotations = DRM_MODE_ROTATE_90 | DRM_MODE_ROTATE_270 |
+			   DRM_MODE_REFLECT_X | DRM_MODE_REFLECT_Y,
+	  .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 */
+	  .regs = &rk3528_cluster0_win_data,
+	  .axi_yrgb_id = 0x02,
+	  .axi_uv_id = 0x03,
+	  .possible_crtcs = 0x1,/* vp0 only */
+	  .max_upscale_factor = 8,
+	  .max_downscale_factor = 8,
+	  .dly = { 27, 27, 21 },
+	  .type = DRM_PLANE_TYPE_OVERLAY,
+	  .feature = WIN_FEATURE_AFBDC | WIN_FEATURE_CLUSTER_MAIN | WIN_FEATURE_Y2R_13BIT_DEPTH,
+	},
+
+	{
+	  .name = "Cluster0-win1",
+	  .phys_id = ROCKCHIP_VOP2_CLUSTER0,
+	  .base = 0x80,
+	  .layer_sel_id = { 0, 0xff, 0xff, 0xff },
+	  .formats = formats_for_cluster,
+	  .nformats = ARRAY_SIZE(formats_for_cluster),
+	  .format_modifiers = format_modifiers_afbc_tiled,
+	  .supported_rotations = DRM_MODE_REFLECT_X | DRM_MODE_REFLECT_Y,
+	  .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 */
+	  .regs = &rk3528_cluster0_win_data,
+	  .axi_yrgb_id = 0x04,
+	  .axi_uv_id = 0x05,
+	  .possible_crtcs = 0x1,/* vp0 only */
+	  .max_upscale_factor = 8,
+	  .max_downscale_factor = 8,
+	  .type = DRM_PLANE_TYPE_OVERLAY,
+	  .feature = WIN_FEATURE_AFBDC | WIN_FEATURE_CLUSTER_SUB,
+	},
 };
 
 /*
@@ -1193,6 +1719,37 @@
 	},
 };
 
+static const struct vop2_ctrl rk3528_vop_ctrl = {
+	.cfg_done_en = VOP_REG(RK3568_REG_CFG_DONE, 0x1, 15),
+	.wb_cfg_done = VOP_REG_MASK(RK3568_REG_CFG_DONE, 0x1, 14),
+	.auto_gating_en = VOP_REG(RK3568_SYS_AUTO_GATING_CTRL, 0x1, 31),
+	.aclk_pre_auto_gating_en = VOP_REG(RK3568_SYS_AUTO_GATING_CTRL, 0x1, 7),
+	.if_ctrl_cfg_done_imd = VOP_REG(RK3568_DSP_IF_POL, 0x1, 28),
+	.version = VOP_REG(RK3568_VERSION_INFO, 0xffff, 16),
+	.lut_dma_en = VOP_REG(RK3568_SYS_AXI_LUT_CTRL, 0x1, 0),
+	.dsp_vs_t_sel = VOP_REG(RK3568_SYS_AXI_LUT_CTRL, 0x1, 16),
+	.rgb_en = VOP_REG(RK3568_DSP_IF_EN, 0x1, 0),
+	.hdmi0_en = VOP_REG(RK3568_DSP_IF_EN, 0x1, 1),
+	.bt656_en = VOP_REG(RK3568_DSP_IF_EN, 0x1, 7),
+	.rgb_mux = VOP_REG(RK3568_DSP_IF_EN, 0x3, 8),
+	.hdmi0_mux = VOP_REG(RK3568_DSP_IF_EN, 0x3, 10),
+	.bt656_yc_swap = VOP_REG(RK3568_DSP_IF_CTRL, 0x1, 5),
+	.bt656_dclk_pol = VOP_REG(RK3568_DSP_IF_CTRL, 0x1, 6),
+	.hdmi_pin_pol = VOP_REG(RK3568_DSP_IF_POL, 0x7, 4),
+	.hdmi_dclk_pol = VOP_REG(RK3568_DSP_IF_POL, 0x1, 7),
+	.esmart_lb_mode = VOP_REG(RK3568_LUT_PORT_SEL, 0x3, 26),
+	.win_vp_id[ROCKCHIP_VOP2_CLUSTER0] = VOP_REG(RK3528_OVL_SYS_PORT_SEL_IMD, 0x3, 0),
+	.win_vp_id[ROCKCHIP_VOP2_ESMART0] = VOP_REG(RK3528_OVL_SYS_PORT_SEL_IMD, 0x3, 16),
+	.win_vp_id[ROCKCHIP_VOP2_ESMART1] = VOP_REG(RK3528_OVL_SYS_PORT_SEL_IMD, 0x3, 20),
+	.win_vp_id[ROCKCHIP_VOP2_ESMART2] = VOP_REG(RK3528_OVL_SYS_PORT_SEL_IMD, 0x3, 24),
+	.win_vp_id[ROCKCHIP_VOP2_ESMART3] = VOP_REG(RK3528_OVL_SYS_PORT_SEL_IMD, 0x3, 28),
+	.win_dly[ROCKCHIP_VOP2_CLUSTER0] = VOP_REG(RK3528_OVL_SYS_CLUSTER0_CTRL, 0xffff, 0),
+	.win_dly[ROCKCHIP_VOP2_ESMART0] = VOP_REG(RK3528_OVL_SYS_ESMART0_CTRL, 0xff, 0),
+	.win_dly[ROCKCHIP_VOP2_ESMART1] = VOP_REG(RK3528_OVL_SYS_ESMART1_CTRL, 0xff, 0),
+	.win_dly[ROCKCHIP_VOP2_ESMART2] = VOP_REG(RK3528_OVL_SYS_ESMART2_CTRL, 0xff, 0),
+	.win_dly[ROCKCHIP_VOP2_ESMART3] = VOP_REG(RK3528_OVL_SYS_ESMART3_CTRL, 0xff, 0),
+};
+
 static const struct vop_grf_ctrl rk3568_grf_ctrl = {
 	.grf_bt656_clk_inv = VOP_REG(RK3568_GRF_VO_CON1, 0x1, 1),
 	.grf_bt1120_clk_inv = VOP_REG(RK3568_GRF_VO_CON1, 0x1, 2),
@@ -1235,6 +1792,7 @@
 	.bt656_yc_swap = VOP_REG(RK3568_DSP_IF_CTRL, 0x1, 5),
 	.bt1120_yc_swap = VOP_REG(RK3568_DSP_IF_CTRL, 0x1, 9),
 	.gamma_port_sel = VOP_REG(RK3568_LUT_PORT_SEL, 0x3, 0),
+	.rgb_pin_pol = VOP_REG(RK3568_DSP_IF_POL, 0x7, 0),
 	.lvds_pin_pol = VOP_REG(RK3568_DSP_IF_POL, 0x7, 0),
 	.lvds_dclk_pol = VOP_REG(RK3568_DSP_IF_POL, 0x1, 3),
 	.hdmi_pin_pol = VOP_REG(RK3568_DSP_IF_POL, 0x7, 4),
@@ -1258,6 +1816,20 @@
 	.otp_en = VOP_REG(RK3568_OTP_WIN_EN, 0x1, 0),
 };
 
+static const struct vop_dump_regs rk3528_dump_regs[] = {
+	{ RK3568_REG_CFG_DONE, "SYS", {0}, 0 },
+	{ RK3528_OVL_SYS, "OVL_SYS", {0}, 0 },
+	{ RK3528_OVL_PORT0_CTRL, "OVL_VP0", VOP_REG(RK3568_VP0_DSP_CTRL, 0x1, 31), 0 },
+	{ RK3528_OVL_PORT1_CTRL, "OVL_VP1", VOP_REG(RK3568_VP1_DSP_CTRL, 0x1, 31), 0 },
+	{ RK3568_VP0_DSP_CTRL, "VP0", VOP_REG(RK3568_VP0_DSP_CTRL, 0x1, 31), 0 },
+	{ RK3568_VP1_DSP_CTRL, "VP1", VOP_REG(RK3568_VP1_DSP_CTRL, 0x1, 31), 0 },
+	{ RK3568_CLUSTER0_WIN0_CTRL0, "Cluster0", VOP_REG(RK3568_CLUSTER0_WIN0_CTRL0, 0x1, 0), 1 },
+	{ RK3568_ESMART0_CTRL0, "Esmart0", VOP_REG(RK3568_ESMART0_REGION0_CTRL, 0x1, 0), 1 },
+	{ RK3568_ESMART1_CTRL0, "Esmart1", VOP_REG(RK3568_ESMART1_REGION0_CTRL, 0x1, 0), 1 },
+	{ RK3568_SMART0_CTRL0, "Esmart2", VOP_REG(RK3568_SMART0_CTRL0, 0x1, 0), 1 },
+	{ RK3568_SMART1_CTRL0, "Esmart3", VOP_REG(RK3568_SMART1_CTRL0, 0x1, 0), 1 },
+};
+
 static const struct vop_dump_regs rk3568_dump_regs[] = {
 	{ RK3568_REG_CFG_DONE, "SYS", {0}, 0 },
 	{ RK3568_OVL_CTRL, "OVL", {0}, 0 },
@@ -1271,6 +1843,26 @@
 	{ RK3568_SMART0_CTRL0, "Smart0", VOP_REG(RK3568_SMART0_REGION0_CTRL, 0x1, 0), 1 },
 	{ RK3568_SMART1_CTRL0, "Smart1", VOP_REG(RK3568_SMART1_REGION0_CTRL, 0x1, 0), 1 },
 	{ RK3568_HDR_LUT_CTRL, "HDR", VOP_REG(RK3568_OVL_CTRL, 0x1, 4), 1 },
+};
+
+static const struct vop2_data rk3528_vop = {
+	.version = VOP_VERSION_RK3528,
+	.nr_vps = 2,
+	.nr_mixers = 3,
+	.nr_layers = 4,
+	.nr_gammas = 2,
+	.esmart_lb_mode = VOP3_ESMART_4K_2K_2K_MODE,
+	.max_input = { 4096, 4096 },
+	.max_output = { 4096, 4096 },
+	.ctrl = &rk3528_vop_ctrl,
+	.axi_intr = rk3528_vop_axi_intr,
+	.nr_axi_intr = ARRAY_SIZE(rk3528_vop_axi_intr),
+	.vp = rk3528_vop_video_ports,
+	.wb = &rk3568_vop_wb_data,
+	.win = rk3528_vop_win_data,
+	.win_size = ARRAY_SIZE(rk3528_vop_win_data),
+	.dump_regs = rk3528_dump_regs,
+	.dump_regs_size = ARRAY_SIZE(rk3528_dump_regs),
 };
 
 static const struct vop2_data rk3568_vop = {
@@ -1295,6 +1887,8 @@
 };
 
 static const struct of_device_id vop2_dt_match[] = {
+	{ .compatible = "rockchip,rk3528-vop",
+	  .data = &rk3528_vop },
 	{ .compatible = "rockchip,rk3568-vop",
 	  .data = &rk3568_vop },
 	{},
diff --git a/kernel/drivers/gpu/drm/rockchip/rockchip_vop_reg.h b/kernel/drivers/gpu/drm/rockchip/rockchip_vop_reg.h
index 7fb5abb..0681e3e 100644
--- a/kernel/drivers/gpu/drm/rockchip/rockchip_vop_reg.h
+++ b/kernel/drivers/gpu/drm/rockchip/rockchip_vop_reg.h
@@ -1091,6 +1091,7 @@
 #define RK3568_VP0_DSP_CTRL				0xC00
 #define RK3568_VP0_MIPI_CTRL				0xC04
 #define RK3568_VP0_COLOR_BAR_CTRL			0xC08
+#define RK3568_VP0_DCLK_SEL				0xC0C
 #define RK3568_VP0_3D_LUT_CTRL				0xC10
 #define RK3568_VP0_3D_LUT_MST				0xC20
 #define RK3568_VP0_DSP_BG				0xC2C
@@ -1110,6 +1111,16 @@
 #define RK3568_VP0_BCSH_BCS				0xC64
 #define RK3568_VP0_BCSH_H				0xC68
 #define RK3568_VP0_BCSH_COLOR_BAR			0xC6C
+#define RK3528_VP0_ACM_CTRL				0xCD0
+#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 RK3528_VP0_MCU_CTRL				0xCF8
+#define RK3528_VP0_MCU_RW_BYPASS_PORT			0xCFC
 
 #define RK3568_VP1_DSP_CTRL				0xD00
 #define RK3568_VP1_MIPI_CTRL				0xD04
@@ -1133,6 +1144,8 @@
 #define RK3568_VP1_BCSH_BCS				0xD64
 #define RK3568_VP1_BCSH_H				0xD68
 #define RK3568_VP1_BCSH_COLOR_BAR			0xD6C
+#define RK3528_VP1_MCU_CTRL				0xDF8
+#define RK3528_VP1_MCU_RW_BYPASS_PORT			0xDFC
 
 #define RK3568_VP2_DSP_CTRL				0xE00
 #define RK3568_VP2_MIPI_CTRL				0xE04
@@ -1157,7 +1170,76 @@
 #define RK3568_VP2_BCSH_H				0xE68
 #define RK3568_VP2_BCSH_COLOR_BAR			0xE6C
 
-/* Overlay registers definition    */
+#define RK3588_VP3_DSP_CTRL				0xF00
+#define RK3588_VP3_DUAL_CHANNEL_CTRL			0xF04
+#define RK3588_VP3_COLOR_BAR_CTRL			0xF08
+#define RK3568_VP3_CLK_CTRL				0xF0C
+#define RK3588_VP3_DSP_BG				0xF2C
+#define RK3588_VP3_PRE_SCAN_HTIMING			0xF30
+#define RK3588_VP3_POST_DSP_HACT_INFO			0xF34
+#define RK3588_VP3_POST_DSP_VACT_INFO			0xF38
+#define RK3588_VP3_POST_SCL_FACTOR_YRGB			0xF3C
+#define RK3588_VP3_POST_SCL_CTRL			0xF40
+#define RK3588_VP3_DSP_HACT_INFO			0xF34
+#define RK3588_VP3_DSP_VACT_INFO			0xF38
+#define RK3588_VP3_POST_DSP_VACT_INFO_F1		0xF44
+#define RK3588_VP3_DSP_HTOTAL_HS_END			0xF48
+#define RK3588_VP3_DSP_HACT_ST_END			0xF4C
+#define RK3588_VP3_DSP_VTOTAL_VS_END			0xF50
+#define RK3588_VP3_DSP_VACT_ST_END			0xF54
+#define RK3588_VP3_DSP_VS_ST_END_F1			0xF58
+#define RK3588_VP3_DSP_VACT_ST_END_F1			0xF5C
+#define RK3588_VP3_BCSH_CTRL				0xF60
+#define RK3588_VP3_BCSH_BCS				0xF64
+#define RK3588_VP3_BCSH_H				0xF68
+#define RK3588_VP3_BCSH_COLOR_BAR			0xF6C
+#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 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 RK3528_OVL_PORT0_LAYER_SEL			0x604
+#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 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 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
+
 #define RK3568_OVL_CTRL				0x600
 #define RK3568_OVL_LAYER_SEL			0x604
 #define RK3568_OVL_PORT_SEL			0x608
@@ -1186,6 +1268,8 @@
 /* Cluster0 register definition */
 #define RK3568_CLUSTER0_WIN0_CTRL0		0x1000
 #define RK3568_CLUSTER0_WIN0_CTRL1		0x1004
+#define RK3528_CLUSTER0_WIN0_CTRL1		0x1004
+#define RK3528_CLUSTER0_WIN0_CTRL2		0x1008
 #define RK3568_CLUSTER0_WIN0_YRGB_MST		0x1010
 #define RK3568_CLUSTER0_WIN0_CBR_MST		0x1014
 #define RK3568_CLUSTER0_WIN0_VIR		0x1018
@@ -1205,6 +1289,8 @@
 
 #define RK3568_CLUSTER0_WIN1_CTRL0		0x1080
 #define RK3568_CLUSTER0_WIN1_CTRL1		0x1084
+#define RK3528_CLUSTER0_WIN1_CTRL1		0x1084
+#define RK3528_CLUSTER0_WIN1_CTRL2		0x1088
 #define RK3568_CLUSTER0_WIN1_YRGB_MST		0x1090
 #define RK3568_CLUSTER0_WIN1_CBR_MST		0x1094
 #define RK3568_CLUSTER0_WIN1_VIR		0x1098
@@ -1265,6 +1351,7 @@
 /* Esmart register definition */
 #define RK3568_ESMART0_CTRL0			0x1800
 #define RK3568_ESMART0_CTRL1			0x1804
+#define RK3568_ESMART0_AXI_CTRL			0x1808
 #define RK3568_ESMART0_REGION0_CTRL		0x1810
 #define RK3568_ESMART0_REGION0_YRGB_MST		0x1814
 #define RK3568_ESMART0_REGION0_CBR_MST		0x1818
@@ -1466,4 +1553,83 @@
 #define RK3568_HDR_EOTF_OETF_Y0				0x20F0
 #define RK3568_HDR_OETF_DX_POW1				0x2200
 #define RK3568_HDR_OETF_XN1				0x2300
+
+/* RK3528 HDR register definition */
+#define RK3528_HDR_LUT_CTRL			0x2000
+#define RK3528_HDR_LUT_MST			0x2004
+#define RK3528_HDR_LUT_STATUS			0x2008
+#define RK3528_SDR2HDR_CTRL			0x2010
+#define RK3528_SDR_CFG_COE0			0x2014
+#define RK3528_SDR_CFG_COE1			0x2018
+#define RK3528_SDR_CSC_COE00_01			0x201C
+#define RK3528_SDR_CSC_COE02_10			0x2020
+#define RK3528_SDR_CSC_COE11_12			0x2024
+#define RK3528_SDR_CSC_COE20_21			0x2028
+#define RK3528_SDR_CSC_COE22			0x202C
+#define RK3528_HDRVIVID_CTRL			0x2040
+#define RK3528_HDR_PQ_GAMMA			0x2044
+#define RK3528_HLG_RFIX_SCALEFAC		0x2048
+#define RK3528_HLG_MAXLUMA			0x204C
+#define RK3528_HLG_R_TM_LIN2NON			0x2050
+#define RK3528_HDR_CSC_COE00_01			0x2054
+#define RK3528_HDR_CSC_COE02_10			0x2058
+#define RK3528_HDR_CSC_COE11_12			0x205C
+#define RK3528_HDR_CSC_COE20_21			0x2060
+#define RK3528_HDR_CSC_COE22			0x2064
+#define RK3528_INK_CFG				0x2080
+#define RK3528_INK_POINT0_CFG			0x2084
+#define RK3528_INK_POINT1_CFG			0x2088
+#define RK3528_INK_POINT0_R0			0x208C
+#define RK3528_INK_POINT0_G0			0x2090
+#define RK3528_INK_POINT0_B0			0x2094
+#define RK3528_INK_POINT0_R1			0x2098
+#define RK3528_INK_POINT0_G1			0x209C
+#define RK3528_INK_POINT0_B1			0x20A0
+#define RK3528_INK_POINT1_R0			0x20A4
+#define RK3528_INK_POINT1_G0			0x20A8
+#define RK3528_INK_POINT1_B0			0x20AC
+#define RK3528_INK_POINT1_R1			0x20B0
+#define RK3528_INK_POINT1_G1			0x20B4
+#define RK3528_INK_POINT1_B1			0x20B8
+#define RK3528_HDR_TONE_SCA			0x213C
+#define RK3528_HDRGAMMA_CURVE			0x2540
+#define RK3528_HDRGAMMA_MDFVALUE		0x2690
+#define RK3528_SDRINVGAMMA_CURVE		0x2700
+#define RK3528_SDRINVGAMMA_STARTIDX		0x2820
+#define RK3528_SDRINVGAMMA_CHANGEIDX		0x2840
+#define RK3528_SDR_SMGAIN			0x2900
+
+/* RK3588 ACM register definition */
+#define RK3528_ACM_CTRL				0x0000
+#define RK3528_ACM_ENABLE			BIT(0)
+#define RK3528_ACM_BYPASS			BIT(1)
+#define RK3528_ACM_DELTA_RANGE			0x0004
+#define RK3528_ACM_FETCH_START			0x0008
+#define RK3528_ACM_DEBUG_POINT0			0x0010
+#define RK3528_ACM_DEBUG_POINT1			0x0014
+#define RK3528_ACM_DEBUG_POINT2			0x0018
+#define RK3528_ACM_DEBUG_POINT3			0x001c
+#define RK3528_ACM_FETCH_DONE			0x0020
+#define RK3528_ACM_DEBUG0_DATA0			0x0030
+#define RK3528_ACM_DEBUG0_DATA1			0x0034
+#define RK3528_ACM_DEBUG0_DATA2			0x0038
+#define RK3528_ACM_DEBUG0_DATA3			0x003c
+#define RK3528_ACM_DEBUG1_DATA0			0x0040
+#define RK3528_ACM_DEBUG1_DATA1			0x0044
+#define RK3528_ACM_DEBUG1_DATA2			0x0048
+#define RK3528_ACM_DEBUG1_DATA3			0x004c
+#define RK3528_ACM_DEBUG2_DATA0			0x0050
+#define RK3528_ACM_DEBUG2_DATA1			0x0054
+#define RK3528_ACM_DEBUG2_DATA2			0x0058
+#define RK3528_ACM_DEBUG2_DATA3			0x005c
+#define RK3528_ACM_DEBUG3_DATA0			0x0060
+#define RK3528_ACM_DEBUG3_DATA1			0x0064
+#define RK3528_ACM_DEBUG3_DATA2			0x0068
+#define RK3528_ACM_DEBUG3_DATA3			0x006c
+#define RK3528_ACM_YHS_DEL_HY_SEG0		0x0100
+#define RK3528_ACM_YHS_DEL_HY_SEG152		0x0360
+#define RK3528_ACM_YHS_DEL_HS_SEG0		0x0364
+#define RK3528_ACM_YHS_DEL_HS_SEG220		0x06d4
+#define RK3528_ACM_YHS_DEL_HGAIN_SEG0		0x06d8
+#define RK3528_ACM_YHS_DEL_HGAIN_SEG64		0x07d8
 #endif /* _ROCKCHIP_VOP_REG_H */
diff --git a/kernel/drivers/gpu/drm/vmwgfx/vmwgfx_fifo.c b/kernel/drivers/gpu/drm/vmwgfx/vmwgfx_fifo.c
index d0fd147..fb5a346 100644
--- a/kernel/drivers/gpu/drm/vmwgfx/vmwgfx_fifo.c
+++ b/kernel/drivers/gpu/drm/vmwgfx/vmwgfx_fifo.c
@@ -167,10 +167,8 @@
 {
 	u32 *fifo_mem = dev_priv->mmio_virt;
 
-	preempt_disable();
 	if (cmpxchg(fifo_mem + SVGA_FIFO_BUSY, 0, 1) == 0)
 		vmw_write(dev_priv, SVGA_REG_SYNC, reason);
-	preempt_enable();
 }
 
 void vmw_fifo_release(struct vmw_private *dev_priv, struct vmw_fifo_state *fifo)
diff --git a/kernel/drivers/headset_observe/rk_headset.c b/kernel/drivers/headset_observe/rk_headset.c
index 54d4af1..5b16db7 100644
--- a/kernel/drivers/headset_observe/rk_headset.c
+++ b/kernel/drivers/headset_observe/rk_headset.c
@@ -153,7 +153,6 @@
 {
 	int level = 0;
 	int level2 = 0;
-	int ret;
 	struct rk_headset_pdata *pdata = headset_info->pdata;
 	static unsigned int old_status = 0;
 
@@ -183,11 +182,6 @@
 	    headset_info->headset_status ? "in" : "out");
 	if (headset_info->headset_status == HEADSET_IN) {
 		headset_info->cur_headset_status = BIT_HEADSET_NO_MIC;
-		ret = gpio_direction_output(pdata->spk_ctl_gpio,0);
-                if (ret < 0) {
-                        printk("spk_ctl_gpio set direction fail\n");
-                }
-
 		if (pdata->headset_insert_type == HEADSET_IN_HIGH)
 			irq_set_irq_type(headset_info->irq[HEADSET],
 					 IRQF_TRIGGER_FALLING);
@@ -202,10 +196,6 @@
 			goto out;
 		}
 	} else if (headset_info->headset_status == HEADSET_OUT) {
-		ret = gpio_direction_output(pdata->spk_ctl_gpio,1);
-                if (ret < 0) {
-                        printk("spk_ctl_gpio set direction fail\n");
-                }
 		headset_info->hook_status = HOOK_UP;
 		if (headset_info->isHook_irq == enable) {
 			DBG("disable headset_hook irq\n");
diff --git a/kernel/drivers/headset_observe/rk_headset.h b/kernel/drivers/headset_observe/rk_headset.h
index ffde994..c10961c 100644
--- a/kernel/drivers/headset_observe/rk_headset.h
+++ b/kernel/drivers/headset_observe/rk_headset.h
@@ -11,7 +11,6 @@
 struct rk_headset_pdata {
 	/* heaset about */
 	unsigned int headset_gpio;
-	unsigned int spk_ctl_gpio;
 	/* Headphones into the state level */
 	unsigned int headset_insert_type;
 	/* hook about */
diff --git a/kernel/drivers/headset_observe/rockchip_headset_core.c b/kernel/drivers/headset_observe/rockchip_headset_core.c
index de4f548..3c2eeb7 100644
--- a/kernel/drivers/headset_observe/rockchip_headset_core.c
+++ b/kernel/drivers/headset_observe/rockchip_headset_core.c
@@ -73,35 +73,6 @@
 						     HEADSET_IN_LOW :
 						     HEADSET_IN_HIGH;
 	}
-
-        /* spk-ctl */
-        ret = of_get_named_gpio_flags(node, "spk_ctl_gpio", 0, &flags);
-        if (ret < 0) {
-                dev_err(&pdev->dev, "Can not read property headset_gpio\n");
-                goto err;
-        } else {
-                pdata->spk_ctl_gpio = ret;
-                ret = devm_gpio_request(&pdev->dev, pdata->spk_ctl_gpio,
-                                        "spk_ctl_gpio");
-                if (ret < 0) {
-                        dev_err(&pdev->dev, "spk_ctl_gpio request fail\n");
-                        goto err;
-                }
-		
-		ret = gpio_get_value(pdata->headset_gpio);
-		printk(" headset_gpio value : %d\n",ret);
-		if (ret == 0)
-                	ret = gpio_direction_output(pdata->spk_ctl_gpio,0);
-		else 
-			ret = gpio_direction_output(pdata->spk_ctl_gpio,1);
-                if (ret < 0) {
-                        dev_err(&pdev->dev,
-                                "spk_ctl_gpio set direction fail\n");
-                        goto err;
-                }
-        }
-
-
 	/* hook */
 	ret = of_get_named_gpio_flags(node, "hook_gpio", 0, &pdata->hook_gpio);
 	if (ret < 0) {
diff --git a/kernel/drivers/hv/hv.c b/kernel/drivers/hv/hv.c
index 12bc9fa..278f03f 100644
--- a/kernel/drivers/hv/hv.c
+++ b/kernel/drivers/hv/hv.c
@@ -112,10 +112,12 @@
 static void hv_stimer0_isr(void)
 {
 	struct hv_per_cpu_context *hv_cpu;
+	struct pt_regs *regs = get_irq_regs();
+	u64 ip = regs ? instruction_pointer(regs) : 0;
 
 	hv_cpu = this_cpu_ptr(hv_context.cpu_context);
 	hv_cpu->clk_evt->event_handler(hv_cpu->clk_evt);
-	add_interrupt_randomness(stimer0_vector, 0);
+	add_interrupt_randomness(stimer0_vector, 0, ip);
 }
 
 static int hv_ce_set_next_event(unsigned long delta,
diff --git a/kernel/drivers/hv/hyperv_vmbus.h b/kernel/drivers/hv/hyperv_vmbus.h
index c4ad518..14af29c 100644
--- a/kernel/drivers/hv/hyperv_vmbus.h
+++ b/kernel/drivers/hv/hyperv_vmbus.h
@@ -32,6 +32,7 @@
 #include <linux/atomic.h>
 #include <linux/hyperv.h>
 #include <linux/interrupt.h>
+#include <linux/irq.h>
 
 #include "hv_trace.h"
 
diff --git a/kernel/drivers/hv/vmbus_drv.c b/kernel/drivers/hv/vmbus_drv.c
index 51fe219..0df4a07 100644
--- a/kernel/drivers/hv/vmbus_drv.c
+++ b/kernel/drivers/hv/vmbus_drv.c
@@ -1103,6 +1103,8 @@
 	void *page_addr = hv_cpu->synic_event_page;
 	struct hv_message *msg;
 	union hv_synic_event_flags *event;
+	struct pt_regs *regs = get_irq_regs();
+	u64 ip = regs ? instruction_pointer(regs) : 0;
 	bool handled = false;
 
 	if (unlikely(page_addr == NULL))
@@ -1146,7 +1148,7 @@
 			tasklet_schedule(&hv_cpu->msg_dpc);
 	}
 
-	add_interrupt_randomness(HYPERVISOR_CALLBACK_VECTOR, 0);
+	add_interrupt_randomness(HYPERVISOR_CALLBACK_VECTOR, 0, ip);
 }
 
 /*
diff --git a/kernel/drivers/i2c/busses/i2c-exynos5.c b/kernel/drivers/i2c/busses/i2c-exynos5.c
index c1ce229..5c57ecf 100644
--- a/kernel/drivers/i2c/busses/i2c-exynos5.c
+++ b/kernel/drivers/i2c/busses/i2c-exynos5.c
@@ -800,9 +800,7 @@
 	}
 
 	ret = devm_request_irq(&pdev->dev, i2c->irq, exynos5_i2c_irq,
-				IRQF_NO_SUSPEND | IRQF_ONESHOT,
-				dev_name(&pdev->dev), i2c);
-
+			       IRQF_NO_SUSPEND, dev_name(&pdev->dev), i2c);
 	if (ret != 0) {
 		dev_err(&pdev->dev, "cannot request HS-I2C IRQ %d\n", i2c->irq);
 		goto err_clk;
diff --git a/kernel/drivers/i2c/busses/i2c-hix5hd2.c b/kernel/drivers/i2c/busses/i2c-hix5hd2.c
index b5ad769..0f08ef1 100644
--- a/kernel/drivers/i2c/busses/i2c-hix5hd2.c
+++ b/kernel/drivers/i2c/busses/i2c-hix5hd2.c
@@ -449,8 +449,7 @@
 	hix5hd2_i2c_init(priv);
 
 	ret = devm_request_irq(&pdev->dev, irq, hix5hd2_i2c_irq,
-			       IRQF_NO_SUSPEND | IRQF_ONESHOT,
-			       dev_name(&pdev->dev), priv);
+			       IRQF_NO_SUSPEND, dev_name(&pdev->dev), priv);
 	if (ret != 0) {
 		dev_err(&pdev->dev, "cannot request HS-I2C IRQ %d\n", irq);
 		goto err_clk;
diff --git a/kernel/drivers/iio/adc/rockchip_saradc.c b/kernel/drivers/iio/adc/rockchip_saradc.c
index 6806017..c07b4c1 100644
--- a/kernel/drivers/iio/adc/rockchip_saradc.c
+++ b/kernel/drivers/iio/adc/rockchip_saradc.c
@@ -321,6 +321,21 @@
 	.power_down = rockchip_saradc_power_down_v1,
 };
 
+static const struct iio_chan_spec rockchip_rk3528_saradc_iio_channels[] = {
+	SARADC_CHANNEL(0, "adc0", 10),
+	SARADC_CHANNEL(1, "adc1", 10),
+	SARADC_CHANNEL(2, "adc2", 10),
+	SARADC_CHANNEL(3, "adc3", 10),
+};
+
+static const struct rockchip_saradc_data rk3528_saradc_data = {
+	.channels = rockchip_rk3528_saradc_iio_channels,
+	.num_channels = ARRAY_SIZE(rockchip_rk3528_saradc_iio_channels),
+	.clk_rate = 1000000,
+	.start = rockchip_saradc_start_v2,
+	.read = rockchip_saradc_read_v2,
+};
+
 static const struct iio_chan_spec rockchip_rk3568_saradc_iio_channels[] = {
 	SARADC_CHANNEL(0, "adc0", 10),
 	SARADC_CHANNEL(1, "adc1", 10),
@@ -384,6 +399,9 @@
 		.compatible = "rockchip,rk3399-saradc",
 		.data = &rk3399_saradc_data,
 	}, {
+		.compatible = "rockchip,rk3528-saradc",
+		.data = &rk3528_saradc_data,
+	}, {
 		.compatible = "rockchip,rk3568-saradc",
 		.data = &rk3568_saradc_data,
 	}, {
diff --git a/kernel/drivers/iio/imu/inv_icm40605/icm40605.h b/kernel/drivers/iio/imu/inv_icm40605/icm40605.h
index b3be8fb..10c01d1 100644
--- a/kernel/drivers/iio/imu/inv_icm40605/icm40605.h
+++ b/kernel/drivers/iio/imu/inv_icm40605/icm40605.h
@@ -361,6 +361,7 @@
 #define FIFO_FSYNC_BITS         0x0C
 #define HAVANA_MAX_PACKET_SIZE      20
 #define ICM40605_FIFO_COUNT_LIMIT         60
+#define ICM40605_DATA_BUFF_SIZE 960
 
 // BANK SEL
 enum icm40605_bank_index {
@@ -427,7 +428,7 @@
 	s64 period_max;
 	int period_divider;
 	int interrupt_regval;
-	u8  data_buff[ICM40605_FIFO_COUNT_LIMIT];
+	u8  data_buff[ICM40605_DATA_BUFF_SIZE];
 };
 
 /* scan indexes follow DATA register order */
diff --git a/kernel/drivers/iio/imu/inv_icm40605/icm40605_ring.c b/kernel/drivers/iio/imu/inv_icm40605/icm40605_ring.c
index 122b098..a76c274 100644
--- a/kernel/drivers/iio/imu/inv_icm40605/icm40605_ring.c
+++ b/kernel/drivers/iio/imu/inv_icm40605/icm40605_ring.c
@@ -224,8 +224,6 @@
 	icm40605_update_period(st, pf->timestamp, fifo_count);
 
 	data_len = bytes_per_datum * fifo_count;
-	if (data_len > ICM40605_FIFO_COUNT_LIMIT)
-		data_len = ICM40605_FIFO_COUNT_LIMIT;
 
 	result = regmap_bulk_read(st->regmap, MPUREG_FIFO_DATA_REG,
 				  st->data_buff, data_len);
diff --git a/kernel/drivers/infiniband/hw/hfi1/affinity.c b/kernel/drivers/infiniband/hw/hfi1/affinity.c
index 01ed0a6..2c62de6 100644
--- a/kernel/drivers/infiniband/hw/hfi1/affinity.c
+++ b/kernel/drivers/infiniband/hw/hfi1/affinity.c
@@ -1039,7 +1039,7 @@
 	struct hfi1_affinity_node *entry;
 	cpumask_var_t diff, hw_thread_mask, available_mask, intrs_mask;
 	const struct cpumask *node_mask,
-		*proc_mask = &current->cpus_allowed;
+		*proc_mask = current->cpus_ptr;
 	struct hfi1_affinity_node_list *affinity = &node_affinity;
 	struct cpu_mask_set *set = &affinity->proc;
 
@@ -1047,7 +1047,7 @@
 	 * check whether process/context affinity has already
 	 * been set
 	 */
-	if (cpumask_weight(proc_mask) == 1) {
+	if (current->nr_cpus_allowed == 1) {
 		hfi1_cdbg(PROC, "PID %u %s affinity set to CPU %*pbl",
 			  current->pid, current->comm,
 			  cpumask_pr_args(proc_mask));
@@ -1058,7 +1058,7 @@
 		cpu = cpumask_first(proc_mask);
 		cpumask_set_cpu(cpu, &set->used);
 		goto done;
-	} else if (cpumask_weight(proc_mask) < cpumask_weight(&set->mask)) {
+	} else if (current->nr_cpus_allowed < cpumask_weight(&set->mask)) {
 		hfi1_cdbg(PROC, "PID %u %s affinity set to CPU set(s) %*pbl",
 			  current->pid, current->comm,
 			  cpumask_pr_args(proc_mask));
diff --git a/kernel/drivers/infiniband/hw/hfi1/sdma.c b/kernel/drivers/infiniband/hw/hfi1/sdma.c
index 38258de..3ee680f 100644
--- a/kernel/drivers/infiniband/hw/hfi1/sdma.c
+++ b/kernel/drivers/infiniband/hw/hfi1/sdma.c
@@ -853,14 +853,13 @@
 {
 	struct sdma_rht_node *rht_node;
 	struct sdma_engine *sde = NULL;
-	const struct cpumask *current_mask = &current->cpus_allowed;
 	unsigned long cpu_id;
 
 	/*
 	 * To ensure that always the same sdma engine(s) will be
 	 * selected make sure the process is pinned to this CPU only.
 	 */
-	if (cpumask_weight(current_mask) != 1)
+	if (current->nr_cpus_allowed != 1)
 		goto out;
 
 	cpu_id = smp_processor_id();
diff --git a/kernel/drivers/infiniband/hw/qib/qib_file_ops.c b/kernel/drivers/infiniband/hw/qib/qib_file_ops.c
index 98e1ce1..5d38286 100644
--- a/kernel/drivers/infiniband/hw/qib/qib_file_ops.c
+++ b/kernel/drivers/infiniband/hw/qib/qib_file_ops.c
@@ -1142,7 +1142,7 @@
 static void assign_ctxt_affinity(struct file *fp, struct qib_devdata *dd)
 {
 	struct qib_filedata *fd = fp->private_data;
-	const unsigned int weight = cpumask_weight(&current->cpus_allowed);
+	const unsigned int weight = current->nr_cpus_allowed;
 	const struct cpumask *local_mask = cpumask_of_pcibus(dd->pcidev->bus);
 	int local_cpu;
 
@@ -1623,9 +1623,8 @@
 		ret = find_free_ctxt(i_minor - 1, fp, uinfo);
 	else {
 		int unit;
-		const unsigned int cpu = cpumask_first(&current->cpus_allowed);
-		const unsigned int weight =
-			cpumask_weight(&current->cpus_allowed);
+		const unsigned int cpu = cpumask_first(current->cpus_ptr);
+		const unsigned int weight = current->nr_cpus_allowed;
 
 		if (weight == 1 && !test_bit(cpu, qib_cpulist))
 			if (!find_hca(cpu, &unit) && unit >= 0)
diff --git a/kernel/drivers/input/remotectl/rockchip_pwm_remotectl.c b/kernel/drivers/input/remotectl/rockchip_pwm_remotectl.c
index 4392f57..cb11a10 100644
--- a/kernel/drivers/input/remotectl/rockchip_pwm_remotectl.c
+++ b/kernel/drivers/input/remotectl/rockchip_pwm_remotectl.c
@@ -335,9 +335,12 @@
 		return IRQ_NONE;
 	if ((val & PWM_CH_POL(id)) == 0) {
 		temp_hpr = readl_relaxed(ddata->base + PWM_REG_HPR);
-		DBG("hpr=%d\n", temp_hpr);
+		writel_relaxed(0, ddata->base + PWM_REG_HPR);
 		temp_lpr = readl_relaxed(ddata->base + PWM_REG_LPR);
+		writel_relaxed(0, ddata->base + PWM_REG_LPR);
+		DBG("hpr=%d\n", temp_hpr);
 		DBG("lpr=%d\n", temp_lpr);
+
 		temp_period = ddata->pwm_freq_nstime * temp_lpr / 1000;
 		if (temp_period > RK_PWM_TIME_BIT0_MIN) {
 			ddata->period = ddata->temp_period
diff --git a/kernel/drivers/iommu/iommu.c b/kernel/drivers/iommu/iommu.c
index 8f3c832..b9621b5 100644
--- a/kernel/drivers/iommu/iommu.c
+++ b/kernel/drivers/iommu/iommu.c
@@ -1762,9 +1762,6 @@
 		mapped += s->length;
 	}
 
-	if (domain->ops->flush_iotlb_all && (prot & IOMMU_TLB_SHOT_ENTIRE))
-		domain->ops->flush_iotlb_all(domain);
-
 	return mapped;
 
 out_err:
diff --git a/kernel/drivers/iommu/rockchip-iommu.c b/kernel/drivers/iommu/rockchip-iommu.c
index 38e70c1..4a8481a 100644
--- a/kernel/drivers/iommu/rockchip-iommu.c
+++ b/kernel/drivers/iommu/rockchip-iommu.c
@@ -114,6 +114,7 @@
 	dma_addr_t dt_dma;
 	spinlock_t iommus_lock; /* lock for iommus list */
 	spinlock_t dt_lock; /* lock for modifying page directory table */
+	bool shootdown_entire;
 
 	struct iommu_domain domain;
 };
@@ -132,11 +133,14 @@
 	bool skip_read;      /* rk3126/rk3128 can't read vop iommu registers */
 	bool dlr_disable; /* avoid access iommu when runtime ops called */
 	bool cmd_retry;
+	bool master_handle_irq;
 	struct iommu_device iommu;
 	struct list_head node; /* entry in rk_iommu_domain.iommus */
 	struct iommu_domain *domain; /* domain to which iommu is attached */
 	struct iommu_group *group;
 	u32 version;
+	bool shootdown_entire;
+	bool need_res_map;
 };
 
 struct rk_iommudata {
@@ -146,6 +150,9 @@
 };
 
 static struct device *dma_dev;
+static struct rk_iommu *rk_iommu_from_dev(struct device *dev);
+static char reserve_range[PAGE_SIZE] __aligned(PAGE_SIZE);
+static phys_addr_t res_page;
 
 static inline void rk_table_flush(struct rk_iommu_domain *dom, dma_addr_t dma,
 				  unsigned int count)
@@ -290,6 +297,8 @@
 #define RK_PTE_PAGE_READABLE_V2      BIT(2)
 #define RK_PTE_PAGE_WRITABLE_V2      BIT(1)
 
+#define RK_PTE_PAGE_REPRESENT  BIT(3)
+
 static inline phys_addr_t rk_pte_page_address(u32 pte)
 {
 	return (phys_addr_t)pte & RK_PTE_PAGE_ADDRESS_MASK;
@@ -311,6 +320,11 @@
 	return pte & RK_PTE_PAGE_VALID;
 }
 
+static inline bool rk_pte_is_page_represent(u32 pte)
+{
+	return pte & RK_PTE_PAGE_REPRESENT;
+}
+
 /* TODO: set cache flags per prot IOMMU_CACHE */
 static u32 rk_mk_pte(phys_addr_t page, int prot)
 {
@@ -318,6 +332,8 @@
 
 	flags |= (prot & IOMMU_READ) ? RK_PTE_PAGE_READABLE : 0;
 	flags |= (prot & IOMMU_WRITE) ? RK_PTE_PAGE_WRITABLE : 0;
+	flags |= (prot & IOMMU_PRIV) ? RK_PTE_PAGE_REPRESENT : 0;
+
 	page &= RK_PTE_PAGE_ADDRESS_MASK;
 	return page | flags | RK_PTE_PAGE_VALID;
 }
@@ -328,6 +344,12 @@
 
 	flags |= (prot & IOMMU_READ) ? RK_PTE_PAGE_READABLE_V2 : 0;
 	flags |= (prot & IOMMU_WRITE) ? RK_PTE_PAGE_WRITABLE_V2 : 0;
+	/* If BIT(3) set, don't break iommu_map if BIT(0) set.
+	 * Means we can reupdate a page that already presented. We can use
+	 * this bit to reupdate a pre-mapped 4G range.
+	 */
+	flags |= (prot & IOMMU_PRIV) ? RK_PTE_PAGE_REPRESENT : 0;
+
 	page = (page & PAGE_DESC_LO_MASK) |
 	       ((page & PAGE_DESC_HI_MASK1) >> PAGE_DESC_HI_SHIFT1) |
 	       (page & PAGE_DESC_HI_MASK2) >> PAGE_DESC_HI_SHIFT2;
@@ -337,7 +359,7 @@
 
 static u32 rk_mk_pte_invalid(u32 pte)
 {
-	return pte & ~RK_PTE_PAGE_VALID;
+	return pte & ~(RK_PTE_PAGE_VALID | RK_PTE_PAGE_REPRESENT);
 }
 
 /*
@@ -686,22 +708,14 @@
 		rk_pte_is_page_valid(pte), &page_addr_phys, page_flags);
 }
 
-static irqreturn_t rk_iommu_irq(int irq, void *dev_id)
+static int rk_pagefault_done(struct rk_iommu *iommu)
 {
-	struct rk_iommu *iommu = dev_id;
 	u32 status;
 	u32 int_status;
-	u32 int_mask;
 	dma_addr_t iova;
+	int i;
+	u32 int_mask;
 	irqreturn_t ret = IRQ_NONE;
-	int i, err;
-
-	err = pm_runtime_get_if_in_use(iommu->dev);
-	if (WARN_ON_ONCE(err <= 0))
-		return ret;
-
-	if (WARN_ON(clk_bulk_enable(iommu->num_clocks, iommu->clocks)))
-		goto out;
 
 	for (i = 0; i < iommu->num_mmu; i++) {
 		int_status = rk_iommu_read(iommu->bases[i], RK_MMU_INT_STATUS);
@@ -724,16 +738,18 @@
 
 			log_iova(iommu, i, iova);
 
-			/*
-			 * Report page fault to any installed handlers.
-			 * Ignore the return code, though, since we always zap cache
-			 * and clear the page fault anyway.
-			 */
-			if (iommu->domain)
-				report_iommu_fault(iommu->domain, iommu->dev, iova,
+			if (!iommu->master_handle_irq) {
+				/*
+				 * Report page fault to any installed handlers.
+				 * Ignore the return code, though, since we always zap cache
+				 * and clear the page fault anyway.
+				 */
+				if (iommu->domain)
+					report_iommu_fault(iommu->domain, iommu->dev, iova,
 						   status);
-			else
-				dev_err(iommu->dev, "Page fault while iommu not attached to domain?\n");
+				else
+					dev_err(iommu->dev, "Page fault while iommu not attached to domain?\n");
+			}
 
 			rk_iommu_base_command(iommu->bases[i], RK_MMU_CMD_ZAP_CACHE);
 
@@ -755,6 +771,46 @@
 				int_status);
 
 		rk_iommu_write(iommu->bases[i], RK_MMU_INT_CLEAR, int_status);
+	}
+
+	return ret;
+}
+
+int rockchip_pagefault_done(struct device *master_dev)
+{
+	struct rk_iommu *iommu = rk_iommu_from_dev(master_dev);
+
+	return rk_pagefault_done(iommu);
+}
+EXPORT_SYMBOL_GPL(rockchip_pagefault_done);
+
+void __iomem *rockchip_get_iommu_base(struct device *master_dev, int idx)
+{
+	struct rk_iommu *iommu = rk_iommu_from_dev(master_dev);
+
+	return iommu->bases[idx];
+}
+EXPORT_SYMBOL_GPL(rockchip_get_iommu_base);
+
+static irqreturn_t rk_iommu_irq(int irq, void *dev_id)
+{
+	struct rk_iommu *iommu = dev_id;
+	irqreturn_t ret = IRQ_NONE;
+	int err;
+
+	err = pm_runtime_get_if_in_use(iommu->dev);
+	if (WARN_ON_ONCE(err <= 0))
+		return ret;
+
+	if (WARN_ON(clk_bulk_enable(iommu->num_clocks, iommu->clocks)))
+		goto out;
+
+	/* Master must call rockchip_pagefault_done to handle pagefault */
+	if (iommu->master_handle_irq) {
+		if (iommu->domain)
+			ret = report_iommu_fault(iommu->domain, iommu->dev, -1, 0x0);
+	} else {
+		ret = rk_pagefault_done(iommu);
 	}
 
 	clk_bulk_disable(iommu->num_clocks, iommu->clocks);
@@ -825,6 +881,10 @@
 {
 	struct list_head *pos;
 	unsigned long flags;
+
+	/* Do not zap tlb cache line if shootdown_entire set */
+	if (rk_domain->shootdown_entire)
+		return;
 
 	/* shootdown these iova from all iommus using this domain */
 	spin_lock_irqsave(&rk_domain->iommus_lock, flags);
@@ -936,10 +996,11 @@
 
 static size_t rk_iommu_unmap_iova(struct rk_iommu_domain *rk_domain,
 				  u32 *pte_addr, dma_addr_t pte_dma,
-				  size_t size)
+				  size_t size, struct rk_iommu *iommu)
 {
 	unsigned int pte_count;
 	unsigned int pte_total = size / SPAGE_SIZE;
+	int prot = IOMMU_READ | IOMMU_WRITE | IOMMU_PRIV;
 
 	assert_spin_locked(&rk_domain->dt_lock);
 
@@ -948,12 +1009,36 @@
 		if (!rk_pte_is_page_valid(pte))
 			break;
 
-		pte_addr[pte_count] = rk_mk_pte_invalid(pte);
+		if (iommu && iommu->need_res_map) {
+			if (iommu->version >= 0x2)
+				pte_addr[pte_count] = rk_mk_pte_v2(res_page,
+								   prot);
+			else
+				pte_addr[pte_count] = rk_mk_pte(res_page, prot);
+		} else {
+			pte_addr[pte_count] = rk_mk_pte_invalid(pte);
+		}
 	}
 
 	rk_table_flush(rk_domain, pte_dma, pte_count);
 
 	return pte_count * SPAGE_SIZE;
+}
+
+static struct rk_iommu *rk_iommu_get(struct rk_iommu_domain *rk_domain)
+{
+	unsigned long flags;
+	struct list_head *pos;
+	struct rk_iommu *iommu = NULL;
+
+	spin_lock_irqsave(&rk_domain->iommus_lock, flags);
+	list_for_each(pos, &rk_domain->iommus) {
+		iommu = list_entry(pos, struct rk_iommu, node);
+		if (iommu->need_res_map)
+			break;
+	}
+	spin_unlock_irqrestore(&rk_domain->iommus_lock, flags);
+	return iommu;
 }
 
 static int rk_iommu_map_iova(struct rk_iommu_domain *rk_domain, u32 *pte_addr,
@@ -969,12 +1054,15 @@
 	for (pte_count = 0; pte_count < pte_total; pte_count++) {
 		u32 pte = pte_addr[pte_count];
 
-		if (rk_pte_is_page_valid(pte))
+		if (rk_pte_is_page_valid(pte) && !rk_pte_is_page_represent(pte))
 			goto unwind;
 
-		pte_addr[pte_count] = rk_mk_pte(paddr, prot);
-
-		paddr += SPAGE_SIZE;
+		if (prot & IOMMU_PRIV) {
+			pte_addr[pte_count] = rk_mk_pte(res_page, prot);
+		} else {
+			pte_addr[pte_count] = rk_mk_pte(paddr, prot);
+			paddr += SPAGE_SIZE;
+		}
 	}
 
 	rk_table_flush(rk_domain, pte_dma, pte_total);
@@ -985,16 +1073,13 @@
 	 * We only zap the first and last iova, since only they could have
 	 * dte or pte shared with an existing mapping.
 	 */
-
-	/* Do not zap tlb cache line if IOMMU_TLB_SHOT_ENTIRE set */
-	if (!(prot & IOMMU_TLB_SHOT_ENTIRE))
-		rk_iommu_zap_iova_first_last(rk_domain, iova, size);
+	rk_iommu_zap_iova_first_last(rk_domain, iova, size);
 
 	return 0;
 unwind:
 	/* Unmap the range of iovas that we just mapped */
 	rk_iommu_unmap_iova(rk_domain, pte_addr, pte_dma,
-			    pte_count * SPAGE_SIZE);
+			    pte_count * SPAGE_SIZE, NULL);
 
 	iova += pte_count * SPAGE_SIZE;
 	page_phys = rk_pte_page_address(pte_addr[pte_count]);
@@ -1017,12 +1102,15 @@
 	for (pte_count = 0; pte_count < pte_total; pte_count++) {
 		u32 pte = pte_addr[pte_count];
 
-		if (rk_pte_is_page_valid(pte))
+		if (rk_pte_is_page_valid(pte) && !rk_pte_is_page_represent(pte))
 			goto unwind;
 
-		pte_addr[pte_count] = rk_mk_pte_v2(paddr, prot);
-
-		paddr += SPAGE_SIZE;
+		if (prot & IOMMU_PRIV) {
+			pte_addr[pte_count] = rk_mk_pte_v2(res_page, prot);
+		} else {
+			pte_addr[pte_count] = rk_mk_pte_v2(paddr, prot);
+			paddr += SPAGE_SIZE;
+		}
 	}
 
 	rk_table_flush(rk_domain, pte_dma, pte_total);
@@ -1033,16 +1121,13 @@
 	 * We only zap the first and last iova, since only they could have
 	 * dte or pte shared with an existing mapping.
 	 */
-
-	/* Do not zap tlb cache line if IOMMU_TLB_SHOT_ENTIRE set */
-	if (!(prot & IOMMU_TLB_SHOT_ENTIRE))
-		rk_iommu_zap_iova_first_last(rk_domain, iova, size);
+	rk_iommu_zap_iova_first_last(rk_domain, iova, size);
 
 	return 0;
 unwind:
 	/* Unmap the range of iovas that we just mapped */
 	rk_iommu_unmap_iova(rk_domain, pte_addr, pte_dma,
-			    pte_count * SPAGE_SIZE);
+			    pte_count * SPAGE_SIZE, NULL);
 
 	iova += pte_count * SPAGE_SIZE;
 	page_phys = rk_pte_page_address_v2(pte_addr[pte_count]);
@@ -1136,6 +1221,7 @@
 	u32 dte;
 	u32 *pte_addr;
 	size_t unmap_size;
+	struct rk_iommu *iommu = rk_iommu_get(rk_domain);
 
 	spin_lock_irqsave(&rk_domain->dt_lock, flags);
 
@@ -1156,7 +1242,8 @@
 	pt_phys = rk_dte_pt_address(dte);
 	pte_addr = (u32 *)phys_to_virt(pt_phys) + rk_iova_pte_index(iova);
 	pte_dma = pt_phys + rk_iova_pte_index(iova) * sizeof(u32);
-	unmap_size = rk_iommu_unmap_iova(rk_domain, pte_addr, pte_dma, size);
+	unmap_size = rk_iommu_unmap_iova(rk_domain, pte_addr, pte_dma, size,
+					 iommu);
 
 	spin_unlock_irqrestore(&rk_domain->dt_lock, flags);
 
@@ -1176,6 +1263,7 @@
 	u32 dte;
 	u32 *pte_addr;
 	size_t unmap_size;
+	struct rk_iommu *iommu = rk_iommu_get(rk_domain);
 
 	spin_lock_irqsave(&rk_domain->dt_lock, flags);
 
@@ -1196,7 +1284,8 @@
 	pt_phys = rk_dte_pt_address_v2(dte);
 	pte_addr = (u32 *)phys_to_virt(pt_phys) + rk_iova_pte_index(iova);
 	pte_dma = pt_phys + rk_iova_pte_index(iova) * sizeof(u32);
-	unmap_size = rk_iommu_unmap_iova(rk_domain, pte_addr, pte_dma, size);
+	unmap_size = rk_iommu_unmap_iova(rk_domain, pte_addr, pte_dma, size,
+					 iommu);
 
 	spin_unlock_irqrestore(&rk_domain->dt_lock, flags);
 
@@ -1345,6 +1434,28 @@
 }
 EXPORT_SYMBOL(rockchip_iommu_is_enabled);
 
+int rockchip_iommu_force_reset(struct device *dev)
+{
+	struct rk_iommu *iommu;
+	int ret;
+
+	iommu = rk_iommu_from_dev(dev);
+	if (!iommu)
+		return -ENODEV;
+
+	ret = rk_iommu_enable_stall(iommu);
+	if (ret)
+		return ret;
+
+	ret = rk_iommu_force_reset(iommu);
+
+	rk_iommu_disable_stall(iommu);
+
+	return ret;
+
+}
+EXPORT_SYMBOL(rockchip_iommu_force_reset);
+
 static void rk_iommu_detach_device(struct iommu_domain *domain,
 				   struct device *dev)
 {
@@ -1413,6 +1524,7 @@
 	list_add_tail(&iommu->node, &rk_domain->iommus);
 	spin_unlock_irqrestore(&rk_domain->iommus_lock, flags);
 
+	rk_domain->shootdown_entire = iommu->shootdown_entire;
 	ret = pm_runtime_get_if_in_use(iommu->dev);
 	if (!ret || WARN_ON_ONCE(ret < 0))
 		return 0;
@@ -1764,11 +1876,16 @@
 					"rockchip,skip-mmu-read");
 	iommu->dlr_disable = device_property_read_bool(dev,
 					"rockchip,disable-device-link-resume");
-
+	iommu->shootdown_entire = device_property_read_bool(dev,
+					"rockchip,shootdown-entire");
+	iommu->master_handle_irq = device_property_read_bool(dev,
+					"rockchip,master-handle-irq");
 	if (of_machine_is_compatible("rockchip,rv1126") ||
 	    of_machine_is_compatible("rockchip,rv1109"))
 		iommu->cmd_retry = device_property_read_bool(dev,
 					"rockchip,enable-cmd-retry");
+	iommu->need_res_map = device_property_read_bool(dev,
+					"rockchip,reserve-map");
 
 	/*
 	 * iommu clocks should be present for all new devices and devicetrees
@@ -1839,6 +1956,10 @@
 	}
 
 skip_request_irq:
+	if (!res_page && iommu->need_res_map) {
+		res_page = __pa_symbol(reserve_range);
+		pr_info("%s,%d, res_page = 0x%pa\n", __func__, __LINE__, &res_page);
+	}
 	return 0;
 err_remove_sysfs:
 	iommu_device_sysfs_remove(&iommu->iommu);
@@ -1854,9 +1975,13 @@
 	struct rk_iommu *iommu = platform_get_drvdata(pdev);
 	int i = 0, irq;
 
+	if (iommu->skip_read)
+		goto skip_free_irq;
+
 	while ((irq = platform_get_irq(pdev, i++)) != -ENXIO)
 		devm_free_irq(iommu->dev, irq, iommu);
 
+skip_free_irq:
 	pm_runtime_force_suspend(&pdev->dev);
 }
 
diff --git a/kernel/drivers/irqchip/irq-gic-v3-its.c b/kernel/drivers/irqchip/irq-gic-v3-its.c
index c730208..2cd131d 100644
--- a/kernel/drivers/irqchip/irq-gic-v3-its.c
+++ b/kernel/drivers/irqchip/irq-gic-v3-its.c
@@ -179,6 +179,7 @@
 static DEFINE_IDA(its_vpeid_ida);
 
 #define gic_data_rdist()		(raw_cpu_ptr(gic_rdists->rdist))
+#define gic_data_rdist_cpu(cpu)		(per_cpu_ptr(gic_rdists->rdist, cpu))
 #define gic_data_rdist_rd_base()	(gic_data_rdist()->rd_base)
 #define gic_data_rdist_vlpi_base()	(gic_data_rdist_rd_base() + SZ_128K)
 
@@ -1661,7 +1662,7 @@
 		   get_order(LPI_PROPBASE_SZ));
 }
 
-static int __init its_alloc_lpi_tables(void)
+static int __init its_alloc_lpi_prop_table(void)
 {
 	phys_addr_t paddr;
 
@@ -2023,29 +2024,46 @@
 	return val;
 }
 
+static int __init allocate_lpi_tables(void)
+{
+	int err, cpu;
+
+	err = its_alloc_lpi_prop_table();
+	if (err)
+		return err;
+
+	/*
+	 * We allocate all the pending tables anyway, as we may have a
+	 * mix of RDs that have had LPIs enabled, and some that
+	 * don't. We'll free the unused ones as each CPU comes online.
+	 */
+	for_each_possible_cpu(cpu) {
+		struct page *pend_page;
+
+		pend_page = its_allocate_pending_table(GFP_NOWAIT);
+		if (!pend_page) {
+			pr_err("Failed to allocate PENDBASE for CPU%d\n", cpu);
+			return -ENOMEM;
+		}
+
+		gic_data_rdist_cpu(cpu)->pend_page = pend_page;
+	}
+
+	return 0;
+}
+
 static void its_cpu_init_lpis(void)
 {
 	void __iomem *rbase = gic_data_rdist_rd_base();
 	struct page *pend_page;
+	phys_addr_t paddr;
 	u64 val, tmp;
 
-	/* If we didn't allocate the pending table yet, do it now */
+	if (gic_data_rdist()->lpi_enabled)
+		return;
+
 	pend_page = gic_data_rdist()->pend_page;
-	if (!pend_page) {
-		phys_addr_t paddr;
-
-		pend_page = its_allocate_pending_table(GFP_NOWAIT);
-		if (!pend_page) {
-			pr_err("Failed to allocate PENDBASE for CPU%d\n",
-			       smp_processor_id());
-			return;
-		}
-
-		paddr = page_to_phys(pend_page);
-		pr_info("CPU%d: using LPI pending table @%pa\n",
-			smp_processor_id(), &paddr);
-		gic_data_rdist()->pend_page = pend_page;
-	}
+	paddr = page_to_phys(pend_page);
 
 	/* set PROPBASE */
 	val = (page_to_phys(gic_rdists->prop_page) |
@@ -2128,6 +2146,10 @@
 
 	/* Make sure the GIC has seen the above */
 	dsb(sy);
+	gic_data_rdist()->lpi_enabled = true;
+	pr_info("GICv3: CPU%d: using LPI pending table @%pa\n",
+		smp_processor_id(),
+		&paddr);
 }
 
 static void its_cpu_init_collection(struct its_node *its)
@@ -3623,16 +3645,6 @@
 	u64 timeout = USEC_PER_SEC;
 	u64 val;
 
-	/*
-	 * If coming via a CPU hotplug event, we don't need to disable
-	 * LPIs before trying to re-enable them. They are already
-	 * configured and all is well in the world. Detect this case
-	 * by checking the allocation of the pending table for the
-	 * current CPU.
-	 */
-	if (gic_data_rdist()->pend_page)
-		return 0;
-
 	if (!gic_rdists_supports_plpis()) {
 		pr_info("CPU%d: LPIs not supported\n", smp_processor_id());
 		return -ENXIO;
@@ -3642,7 +3654,18 @@
 	if (!(val & GICR_CTLR_ENABLE_LPIS))
 		return 0;
 
-	pr_warn("CPU%d: Booted with LPIs enabled, memory probably corrupted\n",
+	/*
+	 * If coming via a CPU hotplug event, we don't need to disable
+	 * LPIs before trying to re-enable them. They are already
+	 * configured and all is well in the world.
+	 */
+	if (gic_data_rdist()->lpi_enabled)
+		return 0;
+
+	/*
+	 * From that point on, we only try to do some damage control.
+	 */
+	pr_warn("GICv3: CPU%d: Booted with LPIs enabled, memory probably corrupted\n",
 		smp_processor_id());
 	add_taint(TAINT_CRAP, LOCKDEP_STILL_OK);
 
@@ -3898,7 +3921,8 @@
 	}
 
 	gic_rdists = rdists;
-	err = its_alloc_lpi_tables();
+
+	err = allocate_lpi_tables();
 	if (err)
 		return err;
 
diff --git a/kernel/drivers/leds/trigger/Kconfig b/kernel/drivers/leds/trigger/Kconfig
index 4018af76..b4ce8c1 100644
--- a/kernel/drivers/leds/trigger/Kconfig
+++ b/kernel/drivers/leds/trigger/Kconfig
@@ -63,6 +63,7 @@
 
 config LEDS_TRIGGER_CPU
 	bool "LED CPU Trigger"
+	depends on !PREEMPT_RT_BASE
 	help
 	  This allows LEDs to be controlled by active CPUs. This shows
 	  the active CPUs across an array of LEDs so you can see which
diff --git a/kernel/drivers/mailbox/rockchip-mailbox.c b/kernel/drivers/mailbox/rockchip-mailbox.c
index 4b8718e..b55c3a3 100644
--- a/kernel/drivers/mailbox/rockchip-mailbox.c
+++ b/kernel/drivers/mailbox/rockchip-mailbox.c
@@ -24,6 +24,8 @@
 #define MAILBOX_B2A_CMD(x)		(0x30 + (x) * 8)
 #define MAILBOX_B2A_DAT(x)		(0x34 + (x) * 8)
 
+#define MAILBOX_POLLING_MS		5 /* default polling interval 5ms */
+
 struct rockchip_mbox_data {
 	int num_chans;
 };
@@ -99,10 +101,21 @@
 	spin_unlock(&mb->cfg_lock);
 }
 
+static bool rockchip_mbox_last_tx_done(struct mbox_chan *chan)
+{
+	struct rockchip_mbox *mb = dev_get_drvdata(chan->mbox->dev);
+	struct rockchip_mbox_chan *chans = chan->con_priv;
+	u32 status;
+
+	status = readl_relaxed(mb->mbox_base + MAILBOX_A2B_STATUS);
+	return !(status & (1U << chans->idx));
+}
+
 static const struct mbox_chan_ops rockchip_mbox_chan_ops = {
 	.send_data	= rockchip_mbox_send_data,
 	.startup	= rockchip_mbox_startup,
 	.shutdown	= rockchip_mbox_shutdown,
+	.last_tx_done	= rockchip_mbox_last_tx_done,
 };
 
 int rockchip_mbox_read_msg(struct mbox_chan *chan,
@@ -172,6 +185,7 @@
 	const struct rockchip_mbox_data *drv_data;
 	struct resource *res;
 	int ret, irq, i;
+	u32 txpoll_period;
 
 	if (!pdev->dev.of_node)
 		return -ENODEV;
@@ -203,9 +217,12 @@
 	mb->mbox.dev = &pdev->dev;
 	mb->mbox.num_chans = drv_data->num_chans;
 	mb->mbox.ops = &rockchip_mbox_chan_ops;
-	mb->mbox.txdone_irq = true;
 	spin_lock_init(&mb->cfg_lock);
 
+	mb->mbox.txdone_poll = true;
+	ret = device_property_read_u32(&pdev->dev, "rockchip,txpoll-period-ms", &txpoll_period);
+	mb->mbox.txpoll_period = !ret ? txpoll_period : MAILBOX_POLLING_MS;
+
 	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
 	if (!res)
 		return -ENODEV;
diff --git a/kernel/drivers/md/bcache/Kconfig b/kernel/drivers/md/bcache/Kconfig
index f6e0a8b..18c03d7 100644
--- a/kernel/drivers/md/bcache/Kconfig
+++ b/kernel/drivers/md/bcache/Kconfig
@@ -1,6 +1,7 @@
 
 config BCACHE
 	tristate "Block device as cache"
+	depends on !PREEMPT_RT_FULL
 	select CRC64
 	help
 	Allows a block device to be used as cache for other devices; uses
diff --git a/kernel/drivers/md/dm-rq.c b/kernel/drivers/md/dm-rq.c
index 2957a37..bc8192b 100644
--- a/kernel/drivers/md/dm-rq.c
+++ b/kernel/drivers/md/dm-rq.c
@@ -689,7 +689,6 @@
 		/* Establish tio->ti before queuing work (map_tio_request) */
 		tio->ti = ti;
 		kthread_queue_work(&md->kworker, &tio->work);
-		BUG_ON(!irqs_disabled());
 	}
 }
 
diff --git a/kernel/drivers/md/raid5.c b/kernel/drivers/md/raid5.c
index c7bda4b..8eb2347 100644
--- a/kernel/drivers/md/raid5.c
+++ b/kernel/drivers/md/raid5.c
@@ -2069,8 +2069,9 @@
 	struct raid5_percpu *percpu;
 	unsigned long cpu;
 
-	cpu = get_cpu();
+	cpu = get_cpu_light();
 	percpu = per_cpu_ptr(conf->percpu, cpu);
+	spin_lock(&percpu->lock);
 	if (test_bit(STRIPE_OP_BIOFILL, &ops_request)) {
 		ops_run_biofill(sh);
 		overlap_clear++;
@@ -2129,7 +2130,8 @@
 			if (test_and_clear_bit(R5_Overlap, &dev->flags))
 				wake_up(&sh->raid_conf->wait_for_overlap);
 		}
-	put_cpu();
+	spin_unlock(&percpu->lock);
+	put_cpu_light();
 }
 
 static void free_stripe(struct kmem_cache *sc, struct stripe_head *sh)
@@ -6816,6 +6818,7 @@
 			__func__, cpu);
 		return -ENOMEM;
 	}
+	spin_lock_init(&per_cpu_ptr(conf->percpu, cpu)->lock);
 	return 0;
 }
 
@@ -6826,7 +6829,6 @@
 	conf->percpu = alloc_percpu(struct raid5_percpu);
 	if (!conf->percpu)
 		return -ENOMEM;
-
 	err = cpuhp_state_add_instance(CPUHP_MD_RAID5_PREPARE, &conf->node);
 	if (!err) {
 		conf->scribble_disks = max(conf->raid_disks,
diff --git a/kernel/drivers/md/raid5.h b/kernel/drivers/md/raid5.h
index 8474c22..a3bf907 100644
--- a/kernel/drivers/md/raid5.h
+++ b/kernel/drivers/md/raid5.h
@@ -637,6 +637,7 @@
 	int			recovery_disabled;
 	/* per cpu variables */
 	struct raid5_percpu {
+		spinlock_t	lock;		/* Protection for -RT */
 		struct page	*spare_page; /* Used when checking P/Q in raid6 */
 		struct flex_array *scribble;   /* space for constructing buffer
 					      * lists and performing address
diff --git a/kernel/drivers/media/cec/cec-adap.c b/kernel/drivers/media/cec/cec-adap.c
index a77f961..efb6dfd 100644
--- a/kernel/drivers/media/cec/cec-adap.c
+++ b/kernel/drivers/media/cec/cec-adap.c
@@ -4,7 +4,7 @@
  *
  * Copyright 2016 Cisco Systems, Inc. and/or its affiliates. All rights reserved.
  */
-
+#include <linux/delay.h>
 #include <linux/errno.h>
 #include <linux/init.h>
 #include <linux/module.h>
@@ -457,7 +457,12 @@
 
 		if (adap->transmit_in_progress) {
 			int err;
+			/* in rk platform 400ms is enough */
+			int time_out_ms = 400;
 
+			/* poll msg only need 100ms */
+			if (adap->transmitting && adap->transmitting->msg.len == 1)
+				time_out_ms = 100;
 			/*
 			 * We are transmitting a message, so add a timeout
 			 * to prevent the state machine to get stuck waiting
@@ -471,7 +476,7 @@
 				kthread_should_stop() ||
 				(!adap->transmit_in_progress &&
 				 !list_empty(&adap->transmit_queue)),
-				msecs_to_jiffies(CEC_XFER_TIMEOUT_MS));
+				msecs_to_jiffies(time_out_ms));
 			timeout = err == 0;
 		} else {
 			/* Otherwise we just wait for something to happen. */
@@ -532,19 +537,11 @@
 		adap->transmitting = data;
 
 		/*
-		 * Suggested number of attempts as per the CEC 2.0 spec:
-		 * 4 attempts is the default, except for 'secondary poll
-		 * messages', i.e. poll messages not sent during the adapter
-		 * configuration phase when it allocates logical addresses.
+		 * The number of retries is not set before the first sending,
+		 * but is set according to the actual sending result.
 		 */
-		if (data->msg.len == 1 && adap->is_configured)
-			attempts = 2;
-		else
-#ifdef CONFIG_ANDROID
-			attempts = 1;
-#else
-			attempts = 4;
-#endif
+		attempts = 0;
+
 		/* Set the suggested signal free time */
 		if (data->attempts) {
 			/* should be >= 3 data bit periods for a retry */
@@ -610,6 +607,28 @@
 		adap->transmit_in_progress = false;
 		goto wake_thread;
 	}
+
+	if (!(status & CEC_TX_STATUS_OK)) {
+		/* poll message is prefer to send twice */
+		if (nack_cnt && data->msg.len == 1) {
+			/* first send is successful or recover from bus busy */
+			if (!data->attempts || data->attempts > 2)
+				data->attempts = 2;
+			usleep_range(200, 300);
+		/*
+		 * If cec bus is busy, need retry.
+		 * Especially when TV wakes up STB, TV will
+		 * send cec messages then occupy cec bus.
+		 * The longest cec message takes more than 300 ms to send,
+		 * so retry in 400 ms.
+		 */
+		} else {
+			if (!data->attempts)
+				data->attempts = 200;
+			usleep_range(2000, 2200);
+		}
+	}
+
 	adap->transmit_in_progress = false;
 
 	msg = &data->msg;
@@ -1362,6 +1381,7 @@
 		unsigned int type = las->log_addr_type[i];
 		const u8 *la_list;
 		u8 last_la;
+		const u8 invalid_log_addrs[] = { CEC_LOG_ADDR_INVALID };
 
 		/*
 		 * The TV functionality can only map to physical address 0.
@@ -1386,6 +1406,8 @@
 		if (err < 0)
 			goto unconfigure;
 
+		la_list = invalid_log_addrs;
+
 		for (j = 0; la_list[j] != CEC_LOG_ADDR_INVALID; j++) {
 			/* Tried this one already, skip it */
 			if (la_list[j] == last_la)
diff --git a/kernel/drivers/media/i2c/Kconfig b/kernel/drivers/media/i2c/Kconfig
index b76e2db..a982b86 100644
--- a/kernel/drivers/media/i2c/Kconfig
+++ b/kernel/drivers/media/i2c/Kconfig
@@ -748,6 +748,17 @@
 	  To compile this driver as a module, choose M here: the
 	  module will be called imx219.
 
+config VIDEO_IMX241
+	tristate "Sony IMX241 sensor support"
+	depends on I2C && VIDEO_V4L2 && VIDEO_V4L2_SUBDEV_API
+	depends on MEDIA_CAMERA_SUPPORT
+	help
+	  This is a Video4Linux2 sensor driver for the Sony
+	  IMX241 camera.
+
+	  To compile this driver as a module, choose M here: the
+	  module will be called imx241.
+
 config VIDEO_IMX258
 	tristate "Sony IMX258 sensor support"
 	depends on I2C && VIDEO_V4L2 && VIDEO_V4L2_SUBDEV_API
diff --git a/kernel/drivers/media/i2c/Makefile b/kernel/drivers/media/i2c/Makefile
index 924215b..5b2057d 100644
--- a/kernel/drivers/media/i2c/Makefile
+++ b/kernel/drivers/media/i2c/Makefile
@@ -155,6 +155,7 @@
 obj-$(CONFIG_VIDEO_IMX214)	+= imx214.o
 obj-$(CONFIG_VIDEO_IMX214_EEPROM)	+= imx214_eeprom.o
 obj-$(CONFIG_VIDEO_IMX219)	+= imx219.o
+obj-$(CONFIG_VIDEO_IMX241)	+= imx241.o
 obj-$(CONFIG_VIDEO_IMX258)	+= imx258.o
 obj-$(CONFIG_VIDEO_IMX258_EEPROM)	+= imx258_eeprom.o
 obj-$(CONFIG_VIDEO_IMX274)	+= imx274.o
diff --git a/kernel/drivers/media/i2c/gc2145.c b/kernel/drivers/media/i2c/gc2145.c
index bb7388e..0ea0b91 100644
--- a/kernel/drivers/media/i2c/gc2145.c
+++ b/kernel/drivers/media/i2c/gc2145.c
@@ -2583,8 +2583,11 @@
 		}
 
 		ret = gc2145_ioctl(sd, cmd, inf);
-		if (!ret)
+		if (!ret) {
 			ret = copy_to_user(up, inf, sizeof(*inf));
+			if (ret)
+				ret = -EFAULT;
+		}
 		kfree(inf);
 		break;
 	case RKMODULE_AWB_CFG:
@@ -2597,12 +2600,16 @@
 		ret = copy_from_user(cfg, up, sizeof(*cfg));
 		if (!ret)
 			ret = gc2145_ioctl(sd, cmd, cfg);
+		else
+			ret = -EFAULT;
 		kfree(cfg);
 		break;
 	case RKMODULE_SET_QUICK_STREAM:
 		ret = copy_from_user(&stream, up, sizeof(u32));
 		if (!ret)
 			ret = gc2145_ioctl(sd, cmd, &stream);
+		else
+			ret = -EFAULT;
 		break;
 	default:
 		ret = -ENOIOCTLCMD;
@@ -2871,7 +2878,7 @@
 	if (ret)
 		dev_info(dev, "Failed to get power regulators\n");
 
-	return __gc2145_power_on(gc2145);
+	return ret;
 }
 
 static int gc2145_probe(struct i2c_client *client,
@@ -2915,11 +2922,6 @@
 
 	ret = gc2145_parse_of(gc2145);
 	if (ret != 0)
-		return -EINVAL;
-
-	gc2145->xvclk_frequency = clk_get_rate(gc2145->xvclk);
-	if (gc2145->xvclk_frequency < 6000000 ||
-	    gc2145->xvclk_frequency > 27000000)
 		return -EINVAL;
 
 	v4l2_ctrl_handler_init(&gc2145->ctrls, 3);
@@ -2972,6 +2974,12 @@
 	gc2145->fps = DIV_ROUND_CLOSEST(gc2145->framesize_cfg[0].max_fps.denominator,
 			gc2145->framesize_cfg[0].max_fps.numerator);
 
+	__gc2145_power_on(gc2145);
+	gc2145->xvclk_frequency = clk_get_rate(gc2145->xvclk);
+	if (gc2145->xvclk_frequency < 6000000 ||
+	    gc2145->xvclk_frequency > 27000000)
+		goto error;
+
 	ret = gc2145_detect(gc2145);
 	if (ret < 0) {
 		dev_info(&client->dev, "Check id  failed:\n"
diff --git a/kernel/drivers/media/i2c/imx241.c b/kernel/drivers/media/i2c/imx241.c
new file mode 100644
index 0000000..7889754
--- /dev/null
+++ b/kernel/drivers/media/i2c/imx241.c
@@ -0,0 +1,1356 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * imx241 camera driver
+ *
+ * Copyright (C) 2022 Rockchip Electronics Co., Ltd.
+ *
+ * V0.0X01.0X00 first version.
+ * V0.0X01.0X01 fix compile errors.
+ * V0.0X01.0X02 add 4lane mode support.
+ *
+ */
+
+#include <linux/clk.h>
+#include <linux/device.h>
+#include <linux/delay.h>
+#include <linux/gpio/consumer.h>
+#include <linux/i2c.h>
+#include <linux/module.h>
+#include <linux/pm_runtime.h>
+#include <linux/regulator/consumer.h>
+#include <linux/sysfs.h>
+#include <linux/slab.h>
+#include <linux/version.h>
+#include <linux/rk-camera-module.h>
+#include <media/media-entity.h>
+#include <media/v4l2-async.h>
+#include <media/v4l2-ctrls.h>
+#include <media/v4l2-subdev.h>
+#include <media/v4l2-fwnode.h>
+#include <media/v4l2-mediabus.h>
+#include <linux/pinctrl/consumer.h>
+#include <linux/rk-preisp.h>
+#include <linux/of_graph.h>
+
+#define DRIVER_VERSION			KERNEL_VERSION(0, 0x01, 0x02)
+
+#ifndef V4L2_CID_DIGITAL_GAIN
+#define V4L2_CID_DIGITAL_GAIN		V4L2_CID_GAIN
+#endif
+
+#define IMX241_LINK_FREQ_400MHZ		400000000U
+/* pixel rate = link frequency * 2 * lanes / BITS_PER_SAMPLE */
+#define IMX241_PIXEL_RATE		(IMX241_LINK_FREQ_400MHZ * 2LL * 2LL / 10LL)
+#define IMX241_XVCLK_FREQ		24000000
+
+#define CHIP_ID				0x40
+#define IMX241_REG_CHIP_ID		0x3032
+
+#define IMX241_REG_CTRL_MODE		0x0100
+#define IMX241_MODE_SW_STANDBY		0x0
+#define IMX241_MODE_STREAMING		BIT(0)
+
+#define IMX241_REG_EXPOSURE		0x0202
+#define	IMX241_EXPOSURE_MIN		1
+#define	IMX241_EXPOSURE_STEP		1
+#define IMX241_VTS_MAX			0xffff
+
+#define IMX241_REG_GAIN			0x0205
+#define IMX241_GAIN_MIN			0x100
+#define IMX241_GAIN_MAX			0x1000
+#define IMX241_GAIN_STEP		0x1
+#define IMX241_GAIN_DEFAULT		(8 * IMX241_GAIN_MIN)
+
+#define IMX241_REG_TEST_PATTERN		0x0600
+#define	IMX241_TEST_PATTERN_ENABLE	0x100
+#define	IMX241_TEST_PATTERN_DISABLE	0x0
+
+#define IMX241_REG_VTS			0x0340
+
+#define REG_NULL			0xFFFF
+
+#define IMX241_REG_VALUE_08BIT		1
+#define IMX241_REG_VALUE_16BIT		2
+#define IMX241_REG_VALUE_24BIT		3
+
+#define IMX241_BITS_PER_SAMPLE		10
+
+#define OF_CAMERA_PINCTRL_STATE_DEFAULT	"rockchip,camera_default"
+#define OF_CAMERA_PINCTRL_STATE_SLEEP	"rockchip,camera_sleep"
+
+#define IMX241_NAME			"imx241"
+#define IMX241_MEDIA_BUS_FMT		MEDIA_BUS_FMT_SRGGB10_1X10
+
+static const char * const imx241_supply_names[] = {
+	"avdd",		/* Analog power */
+	"dovdd",	/* Digital I/O power */
+	"dvdd",		/* Digital core power */
+};
+
+#define IMX241_NUM_SUPPLIES ARRAY_SIZE(imx241_supply_names)
+
+struct regval {
+	u16 addr;
+	u8 val;
+};
+
+struct imx241_mode {
+	u32 bus_fmt;
+	u32 width;
+	u32 height;
+	struct v4l2_fract max_fps;
+	u32 hts_def;
+	u32 vts_def;
+	u32 exp_def;
+	u32 link_freq_idx;
+	u32 bpp;
+	const struct regval *reg_list;
+};
+
+struct imx241 {
+	struct i2c_client	*client;
+	struct clk		*xvclk;
+	struct gpio_desc	*power_gpio;
+	struct gpio_desc	*reset_gpio;
+	struct gpio_desc	*pwdn_gpio;
+	struct regulator_bulk_data supplies[IMX241_NUM_SUPPLIES];
+
+	struct pinctrl		*pinctrl;
+	struct pinctrl_state	*pins_default;
+	struct pinctrl_state	*pins_sleep;
+
+	struct v4l2_subdev	subdev;
+	struct media_pad	pad;
+	struct v4l2_ctrl_handler ctrl_handler;
+	struct v4l2_ctrl	*exposure;
+	struct v4l2_ctrl	*anal_gain;
+	struct v4l2_ctrl	*digi_gain;
+	struct v4l2_ctrl	*hblank;
+	struct v4l2_ctrl	*vblank;
+	struct v4l2_ctrl	*pixel_rate;
+	struct v4l2_ctrl	*link_freq;
+	struct v4l2_ctrl	*test_pattern;
+	struct mutex		mutex;
+	struct v4l2_fwnode_endpoint bus_cfg;
+	bool			streaming;
+	bool			power_on;
+	const struct imx241_mode *support_modes;
+	const struct imx241_mode *cur_mode;
+	u32			module_index;
+	u32			cfg_num;
+	const char		*module_facing;
+	const char		*module_name;
+	const char		*len_name;
+	struct rkmodule_inf	module_inf;
+	struct rkmodule_awb_cfg	awb_cfg;
+	struct rkmodule_lsc_cfg	lsc_cfg;
+};
+
+#define to_imx241(sd) container_of(sd, struct imx241, subdev)
+
+static const struct regval imx241_2592x1944_30fps_regs_2lane[] = {
+	{0x0101, 0x00},
+	{0x303C, 0x4B}, // 24M MCLK
+	{0x303D, 0x00},
+	{0x3041, 0xD7},
+	{0x30E0, 0x00},
+	{0x30E1, 0x00},
+	{0x30F6, 0x00}, //Embedded Data Line output control
+	{0x34CE, 0xFF},
+
+	// Mode Setting
+	{0x0340, 0x08},
+	{0x0341, 0xF0}, // 2288, lines  vts
+	{0x0342, 0x05},
+	{0x0343, 0xB0}, // 1456, line length / 2,   hts / 2
+	{0x0344, 0x00}, // x_addr_start[12:8]
+	{0x0345, 0x00}, // x_addr_start[7:0]
+	{0x0346, 0x00}, // y_addr_start[11:8]
+	{0x0347, 0x00}, // y_addr_start[7:0]
+
+
+	{0x0348, 0x0A}, // x_addr_end[12:8]
+	{0x0349, 0x1F}, // x_addr_end[7:0], 2591
+	{0x034A, 0x07}, // y_addr_end[11:8]
+	{0x034B, 0x97}, // y_addr_end[7:0], 1943
+
+	/* binning setting */
+	{0x0381, 0x01}, // x_even_inc[3:0]
+	{0x0383, 0x01}, // x_odd_inc[3:0]
+	{0x0385, 0x01}, // y_even_inc[3:0]
+	{0x0387, 0x01}, // y_odd_inc[3:0]
+	{0x3048, 0x20},
+	{0x30D5, 0x00},
+	{0x3165, 0x20},
+	{0x30D1, 0x00},
+	{0x30D0, 0x2A},
+	{0x3102, 0x13},
+	{0x3103, 0x47},
+	{0x3049, 0x01},
+	{0x304D, 0x02},
+	{0x304C, 0xD7},
+	{0x0112, 0x0A},
+	{0x0113, 0x0A},
+
+	{0x034C, 0x0A}, // x_output_size[12:8]
+	{0x034D, 0x20}, // x_output_size[7:0], 2592
+	{0x034E, 0x07}, // y_output_size[11:8]
+	{0x034F, 0x98}, // y_output_size[7:0], 1944
+
+	/*
+	 * Frame Rate [frame/s] = Logic Clock/(frame_length_lines x line_length_pck)
+	 * Logic Clock
+	 *  = PLCK (PLL output clock frequency) x Logic clock division ratio
+	 *  = (INCK frequency x PreDivider ratio setting x PLL multiplier setting ) x
+	 *    Divider2 frequency division ratio x Divider4 frequency division ratio
+	 *
+	 * PLCK = 24M x (1/3) x 125 = 1000M
+	 * Logic Clock = 1000M x (1/5) x (1/2) = 100M
+	 * fps = 100M / 2288 / 1456 = 30fps
+	 */
+	{0x0305, 0x03}, // Pre Dividers setting, 1/3
+	{0x0307, 0x7D}, // PLL multiplication setting, 125
+
+	{0x3037, 0x0A}, // Divider2: Pre divider setting, 1/5
+	{0x3038, 0x01}, // Divider4: Logic Clock divider setting, 1/2
+	{0x303E, 0x01}, // Divider3: CK_PIXEL divider setting, 1/2
+	{0x30A2, 0x0E},
+	{0x30A5, 0x60},
+	{0x30A7, 0x40},
+	{0x31AA, 0x02},
+
+	{0x3301, 0x00},
+	{0x3318, 0x60}, // MIPI Global Timing
+
+
+	{0x0202, 0x08}, // coarse_integration_time
+	{0x0203, 0xEB},
+
+	{0x0204, 0x00},
+	{0x0205, 0x00}, // analogue_gain_code_global
+
+	{0x020E, 0x01}, // DIG_GAIN_GR [15:8]
+	{0x020F, 0x00}, // DIG_GAIN_GR [7:0]
+
+	{0x0210, 0x01}, // DIG_GAIN_R [15:8]
+	{0x0211, 0x00}, // DIG_GAIN_R [7:0]
+
+	{0x0212, 0x01}, // DIG_GAIN_B [15:8]
+	{0x0213, 0x00}, // DIG_GAIN_B [15:8]
+
+	{0x0215, 0x00}, // DIG_GAIN_B [7:0]
+
+	{0x0100, 0x00},
+
+	{0xFFFF, 0xFF},
+};
+
+static const struct imx241_mode supported_modes_2lane[] = {
+	{
+		.width = 2592,
+		.height = 1944,
+		.max_fps = {
+			.numerator = 10000,
+			.denominator = 300000,
+		},
+		.exp_def = 0x0630,
+		.hts_def = 0xBE0,
+		.vts_def = 0x08F0,
+		.bpp = 10,
+		.bus_fmt = IMX241_MEDIA_BUS_FMT,
+		.reg_list = imx241_2592x1944_30fps_regs_2lane,
+		.link_freq_idx = 0,
+	},
+};
+
+static const s64 link_freq_items[] = {
+	IMX241_LINK_FREQ_400MHZ,
+};
+
+static const char * const imx241_test_pattern_menu[] = {
+	"Disabled",
+	"Solid Clolor",
+	"100% Color Bar",
+	"Fade to grey Color Bar",
+	"PN9"
+};
+
+/* Write registers up to 4 at a time */
+static int imx241_write_reg(struct i2c_client *client, u16 reg,
+			    u32 len, u32 val)
+{
+	u32 buf_i, val_i;
+	u8 buf[6];
+	u8 *val_p;
+	__be32 val_be;
+
+	dev_dbg(&client->dev, "write reg(0x%x val:0x%x)!\n", reg, val);
+
+	if (len > 4)
+		return -EINVAL;
+
+	buf[0] = reg >> 8;
+	buf[1] = reg & 0xff;
+
+	val_be = cpu_to_be32(val);
+	val_p = (u8 *)&val_be;
+	buf_i = 2;
+	val_i = 4 - len;
+
+	while (val_i < 4)
+		buf[buf_i++] = val_p[val_i++];
+
+	if (i2c_master_send(client, buf, len + 2) != len + 2)
+		return -EIO;
+
+	return 0;
+}
+
+static int imx241_write_array(struct i2c_client *client,
+			      const struct regval *regs)
+{
+	u32 i;
+	int ret = 0;
+
+	for (i = 0; ret == 0 && regs[i].addr != REG_NULL; i++)
+		ret = imx241_write_reg(client, regs[i].addr,
+				       IMX241_REG_VALUE_08BIT,
+				       regs[i].val);
+
+	return ret;
+}
+
+/* Read registers up to 4 at a time */
+static int imx241_read_reg(struct i2c_client *client, u16 reg,
+			   unsigned int len, u32 *val)
+{
+	struct i2c_msg msgs[2];
+	u8 *data_be_p;
+	__be32 data_be = 0;
+	__be16 reg_addr_be = cpu_to_be16(reg);
+	int ret;
+
+	if (len > 4 || !len)
+		return -EINVAL;
+
+	data_be_p = (u8 *)&data_be;
+	/* Write register address */
+	msgs[0].addr  = client->addr;
+	msgs[0].flags = 0;
+	msgs[0].len   = 2;
+	msgs[0].buf   = (u8 *)&reg_addr_be;
+
+	/* Read data from register */
+	msgs[1].addr  = client->addr;
+	msgs[1].flags = I2C_M_RD;
+	msgs[1].len   = len;
+	msgs[1].buf   = &data_be_p[4 - len];
+
+	ret = i2c_transfer(client->adapter, msgs, ARRAY_SIZE(msgs));
+	if (ret != ARRAY_SIZE(msgs))
+		return -EIO;
+
+	*val = be32_to_cpu(data_be);
+
+	return 0;
+}
+
+static int imx241_get_reso_dist(const struct imx241_mode *mode,
+				struct v4l2_mbus_framefmt *framefmt)
+{
+	return abs(mode->width - framefmt->width) +
+	       abs(mode->height - framefmt->height);
+}
+
+static const struct imx241_mode *
+imx241_find_best_fit(struct imx241 *imx241, struct v4l2_subdev_format *fmt)
+{
+	struct v4l2_mbus_framefmt *framefmt = &fmt->format;
+	int dist;
+	int cur_best_fit = 0;
+	int cur_best_fit_dist = -1;
+	unsigned int i;
+
+	for (i = 0; i < imx241->cfg_num; i++) {
+		dist = imx241_get_reso_dist(&imx241->support_modes[i], framefmt);
+		if (cur_best_fit_dist == -1 || dist < cur_best_fit_dist) {
+			cur_best_fit_dist = dist;
+			cur_best_fit = i;
+		}
+	}
+
+	return &imx241->support_modes[cur_best_fit];
+}
+
+static int imx241_set_fmt(struct v4l2_subdev *sd,
+			  struct v4l2_subdev_pad_config *cfg,
+			  struct v4l2_subdev_format *fmt)
+{
+	struct imx241 *imx241 = to_imx241(sd);
+	const struct imx241_mode *mode;
+	s64 h_blank, vblank_def;
+	u64 pixel_rate = 0;
+	u32 lane_num = imx241->bus_cfg.bus.mipi_csi2.num_data_lanes;
+
+	mutex_lock(&imx241->mutex);
+
+	mode = imx241_find_best_fit(imx241, fmt);
+	fmt->format.code = IMX241_MEDIA_BUS_FMT;
+	fmt->format.width = mode->width;
+	fmt->format.height = mode->height;
+	fmt->format.field = V4L2_FIELD_NONE;
+	if (fmt->which == V4L2_SUBDEV_FORMAT_TRY) {
+#ifdef CONFIG_VIDEO_V4L2_SUBDEV_API
+		*v4l2_subdev_get_try_format(sd, cfg, fmt->pad) = fmt->format;
+#else
+		mutex_unlock(&imx241->mutex);
+		return -ENOTTY;
+#endif
+	} else {
+		imx241->cur_mode = mode;
+		h_blank = mode->hts_def - mode->width;
+		__v4l2_ctrl_modify_range(imx241->hblank, h_blank,
+					 h_blank, 1, h_blank);
+		vblank_def = mode->vts_def - mode->height;
+		__v4l2_ctrl_modify_range(imx241->vblank, vblank_def,
+					 IMX241_VTS_MAX - mode->height,
+					 1, vblank_def);
+		pixel_rate = (u32)link_freq_items[mode->link_freq_idx] / mode->bpp * 2 * lane_num;
+
+		__v4l2_ctrl_s_ctrl_int64(imx241->pixel_rate,
+					 pixel_rate);
+		__v4l2_ctrl_s_ctrl(imx241->link_freq,
+				   mode->link_freq_idx);
+	}
+
+	mutex_unlock(&imx241->mutex);
+
+	return 0;
+}
+
+static int imx241_get_fmt(struct v4l2_subdev *sd,
+			  struct v4l2_subdev_pad_config *cfg,
+			  struct v4l2_subdev_format *fmt)
+{
+	struct imx241 *imx241 = to_imx241(sd);
+	const struct imx241_mode *mode = imx241->cur_mode;
+
+	mutex_lock(&imx241->mutex);
+	if (fmt->which == V4L2_SUBDEV_FORMAT_TRY) {
+#ifdef CONFIG_VIDEO_V4L2_SUBDEV_API
+		fmt->format = *v4l2_subdev_get_try_format(sd, cfg, fmt->pad);
+#else
+		mutex_unlock(&imx241->mutex);
+		return -ENOTTY;
+#endif
+	} else {
+		fmt->format.width = mode->width;
+		fmt->format.height = mode->height;
+		fmt->format.code = IMX241_MEDIA_BUS_FMT;
+		fmt->format.field = V4L2_FIELD_NONE;
+	}
+	mutex_unlock(&imx241->mutex);
+
+	return 0;
+}
+
+static int imx241_enum_mbus_code(struct v4l2_subdev *sd,
+				 struct v4l2_subdev_pad_config *cfg,
+				 struct v4l2_subdev_mbus_code_enum *code)
+{
+	if (code->index != 0)
+		return -EINVAL;
+	code->code = IMX241_MEDIA_BUS_FMT;
+
+	return 0;
+}
+
+static int imx241_enum_frame_sizes(struct v4l2_subdev *sd,
+				   struct v4l2_subdev_pad_config *cfg,
+				   struct v4l2_subdev_frame_size_enum *fse)
+{
+	struct imx241 *imx241 = to_imx241(sd);
+
+	if (fse->index >= imx241->cfg_num)
+		return -EINVAL;
+
+	if (fse->code != IMX241_MEDIA_BUS_FMT)
+		return -EINVAL;
+
+	fse->min_width  = imx241->support_modes[fse->index].width;
+	fse->max_width  = imx241->support_modes[fse->index].width;
+	fse->max_height = imx241->support_modes[fse->index].height;
+	fse->min_height = imx241->support_modes[fse->index].height;
+
+	return 0;
+}
+
+static int imx241_enable_test_pattern(struct imx241 *imx241, u32 pattern)
+{
+	if (pattern == 0)
+		return 0;
+
+	dev_err(&imx241->client->dev, "test pattern %u not implement yet.\n", pattern);
+
+	return -EINVAL;
+}
+
+static int imx241_g_frame_interval(struct v4l2_subdev *sd,
+				   struct v4l2_subdev_frame_interval *fi)
+{
+	struct imx241 *imx241 = to_imx241(sd);
+	const struct imx241_mode *mode = imx241->cur_mode;
+
+	mutex_lock(&imx241->mutex);
+	fi->interval = mode->max_fps;
+	mutex_unlock(&imx241->mutex);
+
+	return 0;
+}
+
+static void imx241_get_module_inf(struct imx241 *imx241,
+				  struct rkmodule_inf *inf)
+{
+	memset(inf, 0, sizeof(*inf));
+	strscpy(inf->base.sensor, IMX241_NAME, sizeof(inf->base.sensor));
+	strscpy(inf->base.module, imx241->module_name,
+		sizeof(inf->base.module));
+	strscpy(inf->base.lens, imx241->len_name, sizeof(inf->base.lens));
+}
+
+static void imx241_set_awb_cfg(struct imx241 *imx241,
+			       struct rkmodule_awb_cfg *cfg)
+{
+	mutex_lock(&imx241->mutex);
+	memcpy(&imx241->awb_cfg, cfg, sizeof(*cfg));
+	mutex_unlock(&imx241->mutex);
+}
+
+static void imx241_set_lsc_cfg(struct imx241 *imx241,
+			       struct rkmodule_lsc_cfg *cfg)
+{
+	mutex_lock(&imx241->mutex);
+	memcpy(&imx241->lsc_cfg, cfg, sizeof(*cfg));
+	mutex_unlock(&imx241->mutex);
+}
+
+static long imx241_ioctl(struct v4l2_subdev *sd, unsigned int cmd, void *arg)
+{
+	struct imx241 *imx241 = to_imx241(sd);
+	struct rkmodule_hdr_cfg *hdr;
+	long ret = 0;
+	u32 stream = 0;
+
+	switch (cmd) {
+	case RKMODULE_GET_MODULE_INFO:
+		imx241_get_module_inf(imx241, (struct rkmodule_inf *)arg);
+		break;
+	case RKMODULE_AWB_CFG:
+		imx241_set_awb_cfg(imx241, (struct rkmodule_awb_cfg *)arg);
+		break;
+	case RKMODULE_LSC_CFG:
+		imx241_set_lsc_cfg(imx241, (struct rkmodule_lsc_cfg *)arg);
+		break;
+	case RKMODULE_SET_QUICK_STREAM:
+		stream = *((u32 *)arg);
+
+		if (stream)
+			ret = imx241_write_reg(imx241->client,
+				 IMX241_REG_CTRL_MODE,
+				 IMX241_REG_VALUE_08BIT,
+				 IMX241_MODE_STREAMING);
+		else
+			ret = imx241_write_reg(imx241->client,
+				 IMX241_REG_CTRL_MODE,
+				 IMX241_REG_VALUE_08BIT,
+				 IMX241_MODE_SW_STANDBY);
+		break;
+	case RKMODULE_GET_HDR_CFG:
+		hdr = (struct rkmodule_hdr_cfg *)arg;
+		hdr->esp.mode = HDR_NORMAL_VC;
+		hdr->hdr_mode = NO_HDR;
+		break;
+	case RKMODULE_SET_HDR_CFG:
+		ret = 0;
+		break;
+	default:
+		ret = -ENOIOCTLCMD;
+		break;
+	}
+
+	return ret;
+}
+
+#ifdef CONFIG_COMPAT
+static long imx241_compat_ioctl32(struct v4l2_subdev *sd,
+				  unsigned int cmd, unsigned long arg)
+{
+	void __user *up = compat_ptr(arg);
+	struct rkmodule_inf *inf;
+	struct rkmodule_awb_cfg *cfg;
+	struct rkmodule_lsc_cfg *lsc_cfg;
+	long ret = 0;
+	u32 stream = 0;
+
+	switch (cmd) {
+	case RKMODULE_GET_MODULE_INFO:
+		inf = kzalloc(sizeof(*inf), GFP_KERNEL);
+		if (!inf) {
+			ret = -ENOMEM;
+			return ret;
+		}
+
+		ret = imx241_ioctl(sd, cmd, inf);
+		if (!ret) {
+			ret = copy_to_user(up, inf, sizeof(*inf));
+			if (ret)
+				ret = -EFAULT;
+		}
+		kfree(inf);
+		break;
+	case RKMODULE_AWB_CFG:
+		cfg = kzalloc(sizeof(*cfg), GFP_KERNEL);
+		if (!cfg) {
+			ret = -ENOMEM;
+			return ret;
+		}
+
+		ret = copy_from_user(cfg, up, sizeof(*cfg));
+		if (!ret)
+			ret = imx241_ioctl(sd, cmd, cfg);
+		else
+			ret = -EFAULT;
+		kfree(cfg);
+		break;
+	case RKMODULE_LSC_CFG:
+		lsc_cfg = kzalloc(sizeof(*lsc_cfg), GFP_KERNEL);
+		if (!lsc_cfg) {
+			ret = -ENOMEM;
+			return ret;
+		}
+
+		ret = copy_from_user(lsc_cfg, up, sizeof(*lsc_cfg));
+		if (!ret)
+			ret = imx241_ioctl(sd, cmd, lsc_cfg);
+		else
+			ret = -EFAULT;
+		kfree(lsc_cfg);
+		break;
+	case RKMODULE_SET_QUICK_STREAM:
+		ret = copy_from_user(&stream, up, sizeof(u32));
+		if (!ret)
+			ret = imx241_ioctl(sd, cmd, &stream);
+		else
+			ret = -EFAULT;
+		break;
+	default:
+		ret = -ENOIOCTLCMD;
+		break;
+	}
+
+	return ret;
+}
+#endif
+
+static int __imx241_start_stream(struct imx241 *imx241)
+{
+	int ret;
+
+	ret = imx241_write_array(imx241->client, imx241->cur_mode->reg_list);
+	if (ret)
+		return ret;
+
+	/* In case these controls are set before streaming */
+	mutex_unlock(&imx241->mutex);
+	ret = v4l2_ctrl_handler_setup(&imx241->ctrl_handler);
+	mutex_lock(&imx241->mutex);
+	if (ret)
+		return ret;
+
+	return imx241_write_reg(imx241->client,
+				IMX241_REG_CTRL_MODE,
+				IMX241_REG_VALUE_08BIT,
+				IMX241_MODE_STREAMING);
+}
+
+static int __imx241_stop_stream(struct imx241 *imx241)
+{
+	return imx241_write_reg(imx241->client,
+				IMX241_REG_CTRL_MODE,
+				IMX241_REG_VALUE_08BIT,
+				IMX241_MODE_SW_STANDBY);
+}
+
+static int imx241_s_stream(struct v4l2_subdev *sd, int on)
+{
+	struct imx241 *imx241 = to_imx241(sd);
+	struct i2c_client *client = imx241->client;
+	int ret = 0;
+
+	dev_info(&client->dev, "%s: on: %d, %dx%d@%d\n", __func__, on,
+				imx241->cur_mode->width,
+				imx241->cur_mode->height,
+		DIV_ROUND_CLOSEST(imx241->cur_mode->max_fps.denominator,
+				  imx241->cur_mode->max_fps.numerator));
+
+
+	mutex_lock(&imx241->mutex);
+	on = !!on;
+	if (on == imx241->streaming)
+		goto unlock_and_return;
+
+	if (on) {
+		ret = pm_runtime_get_sync(&client->dev);
+		if (ret < 0) {
+			pm_runtime_put_noidle(&client->dev);
+			goto unlock_and_return;
+		}
+
+		ret = __imx241_start_stream(imx241);
+		if (ret) {
+			v4l2_err(sd, "start stream failed while write regs\n");
+			pm_runtime_put(&client->dev);
+			goto unlock_and_return;
+		}
+	} else {
+		__imx241_stop_stream(imx241);
+		pm_runtime_put(&client->dev);
+	}
+
+	imx241->streaming = on;
+
+unlock_and_return:
+	mutex_unlock(&imx241->mutex);
+
+	return ret;
+}
+
+static int imx241_s_power(struct v4l2_subdev *sd, int on)
+{
+	struct imx241 *imx241 = to_imx241(sd);
+	struct i2c_client *client = imx241->client;
+	int ret = 0;
+
+	mutex_lock(&imx241->mutex);
+
+	/* If the power state is not modified - no work to do. */
+	if (imx241->power_on == !!on)
+		goto unlock_and_return;
+
+	if (on) {
+		ret = pm_runtime_get_sync(&client->dev);
+		if (ret < 0) {
+			pm_runtime_put_noidle(&client->dev);
+			goto unlock_and_return;
+		}
+
+		imx241->power_on = true;
+	} else {
+		pm_runtime_put(&client->dev);
+		imx241->power_on = false;
+	}
+
+unlock_and_return:
+	mutex_unlock(&imx241->mutex);
+
+	return ret;
+}
+
+/* Calculate the delay in us by clock rate and clock cycles */
+static inline u32 imx241_cal_delay(u32 cycles)
+{
+	return DIV_ROUND_UP(cycles, IMX241_XVCLK_FREQ / 1000 / 1000);
+}
+
+static int __imx241_power_on(struct imx241 *imx241)
+{
+	int ret;
+	u32 delay_us;
+	struct device *dev = &imx241->client->dev;
+
+	if (!IS_ERR(imx241->power_gpio))
+		gpiod_set_value_cansleep(imx241->power_gpio, 1);
+
+	usleep_range(1000, 2000);
+
+	if (!IS_ERR_OR_NULL(imx241->pins_default)) {
+		ret = pinctrl_select_state(imx241->pinctrl,
+					   imx241->pins_default);
+		if (ret < 0)
+			dev_err(dev, "could not set pins\n");
+	}
+
+	ret = clk_set_rate(imx241->xvclk, IMX241_XVCLK_FREQ);
+	if (ret < 0)
+		dev_warn(dev, "Failed to set xvclk rate (24MHz)\n");
+
+	if (clk_get_rate(imx241->xvclk) != IMX241_XVCLK_FREQ)
+		dev_warn(dev, "xvclk mismatched, modes are based on 24MHz\n");
+
+	ret = clk_prepare_enable(imx241->xvclk);
+	if (ret < 0) {
+		dev_err(dev, "Failed to enable xvclk\n");
+		return ret;
+	}
+
+	if (!IS_ERR(imx241->reset_gpio))
+		gpiod_set_value_cansleep(imx241->reset_gpio, 0);
+
+	ret = regulator_bulk_enable(IMX241_NUM_SUPPLIES, imx241->supplies);
+	if (ret < 0) {
+		dev_err(dev, "Failed to enable regulators\n");
+		goto disable_clk;
+	}
+
+	if (!IS_ERR(imx241->reset_gpio))
+		gpiod_set_value_cansleep(imx241->reset_gpio, 1);
+
+	usleep_range(500, 1000);
+	if (!IS_ERR(imx241->pwdn_gpio))
+		gpiod_set_value_cansleep(imx241->pwdn_gpio, 1);
+
+	/* 8192 cycles prior to first SCCB transaction */
+	delay_us = imx241_cal_delay(8192);
+	usleep_range(delay_us, delay_us * 2);
+
+	return 0;
+
+disable_clk:
+	clk_disable_unprepare(imx241->xvclk);
+
+	return ret;
+}
+
+static void __imx241_power_off(struct imx241 *imx241)
+{
+	int ret;
+	struct device *dev = &imx241->client->dev;
+
+	if (!IS_ERR(imx241->pwdn_gpio))
+		gpiod_set_value_cansleep(imx241->pwdn_gpio, 0);
+	clk_disable_unprepare(imx241->xvclk);
+	if (!IS_ERR(imx241->reset_gpio))
+		gpiod_set_value_cansleep(imx241->reset_gpio, 0);
+
+	if (!IS_ERR_OR_NULL(imx241->pins_sleep)) {
+		ret = pinctrl_select_state(imx241->pinctrl,
+					   imx241->pins_sleep);
+		if (ret < 0)
+			dev_dbg(dev, "could not set pins\n");
+	}
+	if (!IS_ERR(imx241->power_gpio))
+		gpiod_set_value_cansleep(imx241->power_gpio, 0);
+
+	regulator_bulk_disable(IMX241_NUM_SUPPLIES, imx241->supplies);
+}
+
+static int imx241_runtime_resume(struct device *dev)
+{
+	struct i2c_client *client = to_i2c_client(dev);
+	struct v4l2_subdev *sd = i2c_get_clientdata(client);
+	struct imx241 *imx241 = to_imx241(sd);
+
+	return __imx241_power_on(imx241);
+}
+
+static int imx241_runtime_suspend(struct device *dev)
+{
+	struct i2c_client *client = to_i2c_client(dev);
+	struct v4l2_subdev *sd = i2c_get_clientdata(client);
+	struct imx241 *imx241 = to_imx241(sd);
+
+	__imx241_power_off(imx241);
+
+	return 0;
+}
+
+#ifdef CONFIG_VIDEO_V4L2_SUBDEV_API
+static int imx241_open(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh)
+{
+	struct imx241 *imx241 = to_imx241(sd);
+	struct v4l2_mbus_framefmt *try_fmt =
+				v4l2_subdev_get_try_format(sd, fh->pad, 0);
+	const struct imx241_mode *def_mode = &imx241->support_modes[0];
+
+	mutex_lock(&imx241->mutex);
+	/* Initialize try_fmt */
+	try_fmt->width = def_mode->width;
+	try_fmt->height = def_mode->height;
+	//try_fmt->code = def_mode->bus_fmt;
+	try_fmt->code = IMX241_MEDIA_BUS_FMT;
+	try_fmt->field = V4L2_FIELD_NONE;
+
+	mutex_unlock(&imx241->mutex);
+	/* No crop or compose */
+
+	return 0;
+}
+#endif
+
+static int imx241_enum_frame_interval(struct v4l2_subdev *sd,
+				      struct v4l2_subdev_pad_config *cfg,
+				      struct v4l2_subdev_frame_interval_enum *fie)
+{
+	struct imx241 *imx241 = to_imx241(sd);
+
+	if (fie->index >= imx241->cfg_num)
+		return -EINVAL;
+
+	fie->code = imx241->support_modes[fie->index].bus_fmt;
+	fie->width = imx241->support_modes[fie->index].width;
+	fie->height = imx241->support_modes[fie->index].height;
+	fie->interval = imx241->support_modes[fie->index].max_fps;
+
+	return 0;
+}
+
+static int imx241_g_mbus_config(struct v4l2_subdev *sd,
+				struct v4l2_mbus_config *config)
+{
+	struct imx241 *imx241 = to_imx241(sd);
+	u32 lane_num = imx241->bus_cfg.bus.mipi_csi2.num_data_lanes;
+	u32 val = 0;
+
+	val = 1 << (lane_num - 1) |
+		V4L2_MBUS_CSI2_CHANNEL_0 |
+		V4L2_MBUS_CSI2_CONTINUOUS_CLOCK;
+
+	config->type = V4L2_MBUS_CSI2;
+	config->flags = val;
+
+	return 0;
+}
+
+static const struct dev_pm_ops imx241_pm_ops = {
+	SET_RUNTIME_PM_OPS(imx241_runtime_suspend,
+			   imx241_runtime_resume, NULL)
+};
+
+#ifdef CONFIG_VIDEO_V4L2_SUBDEV_API
+static const struct v4l2_subdev_internal_ops imx241_internal_ops = {
+	.open = imx241_open,
+};
+#endif
+
+static const struct v4l2_subdev_core_ops imx241_core_ops = {
+	.s_power = imx241_s_power,
+	.ioctl = imx241_ioctl,
+#ifdef CONFIG_COMPAT
+	.compat_ioctl32 = imx241_compat_ioctl32,
+#endif
+};
+
+static const struct v4l2_subdev_video_ops imx241_video_ops = {
+	.s_stream = imx241_s_stream,
+	.g_frame_interval = imx241_g_frame_interval,
+	.g_mbus_config = imx241_g_mbus_config,
+};
+
+static const struct v4l2_subdev_pad_ops imx241_pad_ops = {
+	.enum_mbus_code = imx241_enum_mbus_code,
+	.enum_frame_size = imx241_enum_frame_sizes,
+	.enum_frame_interval = imx241_enum_frame_interval,
+	.get_fmt = imx241_get_fmt,
+	.set_fmt = imx241_set_fmt,
+};
+
+static const struct v4l2_subdev_ops imx241_subdev_ops = {
+	.core	= &imx241_core_ops,
+	.video	= &imx241_video_ops,
+	.pad	= &imx241_pad_ops,
+};
+
+static int imx241_set_gain_reg(struct imx241 *imx241, u32 a_gain)
+{
+	int ret = 0;
+	u32 gain_reg = 0;
+
+	gain_reg = (256 - (256 * 256 / a_gain));
+	if (gain_reg > 240)
+		gain_reg = 240;
+
+	ret |= imx241_write_reg(imx241->client,
+		IMX241_REG_GAIN,
+		IMX241_REG_VALUE_08BIT,
+		(gain_reg & 0xff));
+	return ret;
+}
+
+static int imx241_set_ctrl(struct v4l2_ctrl *ctrl)
+{
+	struct imx241 *imx241 = container_of(ctrl->handler,
+					     struct imx241, ctrl_handler);
+	struct i2c_client *client = imx241->client;
+	s64 max;
+	int ret = 0;
+
+	/* Propagate change of current control to all related controls */
+	switch (ctrl->id) {
+	case V4L2_CID_VBLANK:
+		/* Update max exposure while meeting expected vblanking */
+		max = imx241->cur_mode->height + ctrl->val - 4;
+		__v4l2_ctrl_modify_range(imx241->exposure,
+					 imx241->exposure->minimum, max,
+					 imx241->exposure->step,
+					 imx241->exposure->default_value);
+		break;
+	}
+
+	if (!pm_runtime_get_if_in_use(&client->dev))
+		return 0;
+
+	switch (ctrl->id) {
+	case V4L2_CID_EXPOSURE:
+		/* 4 least significant bits of expsoure are fractional part */
+		ret = imx241_write_reg(imx241->client,
+			IMX241_REG_EXPOSURE,
+			IMX241_REG_VALUE_16BIT,
+			ctrl->val);
+		break;
+	case V4L2_CID_ANALOGUE_GAIN:
+		ret = imx241_set_gain_reg(imx241, ctrl->val);
+		break;
+	case V4L2_CID_VBLANK:
+		ret = imx241_write_reg(imx241->client,
+			IMX241_REG_VTS,
+			IMX241_REG_VALUE_16BIT,
+			ctrl->val + imx241->cur_mode->height);
+		break;
+	case V4L2_CID_TEST_PATTERN:
+		ret = imx241_enable_test_pattern(imx241, ctrl->val);
+		break;
+	default:
+		dev_warn(&client->dev, "%s Unhandled id:0x%x, val:0x%x\n",
+			 __func__, ctrl->id, ctrl->val);
+		break;
+	}
+
+	pm_runtime_put(&client->dev);
+
+	return ret;
+}
+
+static const struct v4l2_ctrl_ops imx241_ctrl_ops = {
+	.s_ctrl = imx241_set_ctrl,
+};
+
+static int imx241_initialize_controls(struct imx241 *imx241)
+{
+	const struct imx241_mode *mode;
+	struct v4l2_ctrl_handler *handler;
+	s64 exposure_max, vblank_def;
+	u32 h_blank;
+	int ret;
+	u64 dst_pixel_rate = 0;
+	u32 lane_num = imx241->bus_cfg.bus.mipi_csi2.num_data_lanes;
+
+	handler = &imx241->ctrl_handler;
+	mode = imx241->cur_mode;
+	ret = v4l2_ctrl_handler_init(handler, 8);
+	if (ret)
+		return ret;
+	handler->lock = &imx241->mutex;
+
+	imx241->link_freq = v4l2_ctrl_new_int_menu(handler, NULL,
+			V4L2_CID_LINK_FREQ,
+			1, 0, link_freq_items);
+
+	dst_pixel_rate = (u32)link_freq_items[mode->link_freq_idx] / mode->bpp * 2 * lane_num;
+
+	imx241->pixel_rate = v4l2_ctrl_new_std(handler, NULL,
+			V4L2_CID_PIXEL_RATE,
+			0, IMX241_PIXEL_RATE,
+			1, dst_pixel_rate);
+
+	__v4l2_ctrl_s_ctrl(imx241->link_freq,
+			   mode->link_freq_idx);
+
+	h_blank = mode->hts_def - mode->width;
+	imx241->hblank = v4l2_ctrl_new_std(handler, NULL, V4L2_CID_HBLANK,
+				h_blank, h_blank, 1, h_blank);
+	if (imx241->hblank)
+		imx241->hblank->flags |= V4L2_CTRL_FLAG_READ_ONLY;
+
+	vblank_def = mode->vts_def - mode->height;
+	imx241->vblank = v4l2_ctrl_new_std(handler, &imx241_ctrl_ops,
+				V4L2_CID_VBLANK, vblank_def,
+				IMX241_VTS_MAX - mode->height,
+				1, vblank_def);
+
+	exposure_max = mode->vts_def - 5;
+	imx241->exposure = v4l2_ctrl_new_std(handler, &imx241_ctrl_ops,
+				V4L2_CID_EXPOSURE, IMX241_EXPOSURE_MIN,
+				exposure_max, IMX241_EXPOSURE_STEP,
+				mode->exp_def);
+
+	imx241->anal_gain = v4l2_ctrl_new_std(handler, &imx241_ctrl_ops,
+				V4L2_CID_ANALOGUE_GAIN, IMX241_GAIN_MIN,
+				IMX241_GAIN_MAX, IMX241_GAIN_STEP,
+				IMX241_GAIN_DEFAULT);
+
+	imx241->test_pattern = v4l2_ctrl_new_std_menu_items(handler,
+				&imx241_ctrl_ops, V4L2_CID_TEST_PATTERN,
+				ARRAY_SIZE(imx241_test_pattern_menu) - 1,
+				0, 0, imx241_test_pattern_menu);
+
+	if (handler->error) {
+		ret = handler->error;
+		dev_err(&imx241->client->dev,
+			"Failed to init controls(%d)\n", ret);
+		goto err_free_handler;
+	}
+
+	imx241->subdev.ctrl_handler = handler;
+
+	return 0;
+
+err_free_handler:
+	v4l2_ctrl_handler_free(handler);
+
+	return ret;
+}
+
+static int imx241_check_sensor_id(struct imx241 *imx241,
+				  struct i2c_client *client)
+{
+	struct device *dev = &imx241->client->dev;
+	u32 id = 0;
+	int ret;
+
+	ret = imx241_read_reg(client, IMX241_REG_CHIP_ID,
+			      IMX241_REG_VALUE_08BIT, &id);
+	if (id != CHIP_ID) {
+		dev_err(dev, "Unexpected sensor id(%04x), ret(%d)\n", id, ret);
+		return -ENODEV;
+	}
+
+	dev_info(dev, "Detected IMX241 sensor\n");
+
+	return 0;
+}
+
+static int imx241_configure_regulators(struct imx241 *imx241)
+{
+	unsigned int i;
+
+	for (i = 0; i < IMX241_NUM_SUPPLIES; i++)
+		imx241->supplies[i].supply = imx241_supply_names[i];
+
+	return devm_regulator_bulk_get(&imx241->client->dev,
+				       IMX241_NUM_SUPPLIES,
+				       imx241->supplies);
+}
+
+static int imx241_probe(struct i2c_client *client,
+			 const struct i2c_device_id *id)
+{
+	struct device *dev = &client->dev;
+	struct device_node *node = dev->of_node;
+	struct imx241 *imx241;
+	struct v4l2_subdev *sd;
+	struct device_node *endpoint;
+	char facing[2];
+	int ret;
+
+	dev_info(dev, "driver version: %02x.%02x.%02x",
+		 DRIVER_VERSION >> 16,
+		 (DRIVER_VERSION & 0xff00) >> 8,
+		 DRIVER_VERSION & 0x00ff);
+
+	imx241 = devm_kzalloc(dev, sizeof(*imx241), GFP_KERNEL);
+	if (!imx241)
+		return -ENOMEM;
+
+	ret = of_property_read_u32(node, RKMODULE_CAMERA_MODULE_INDEX,
+				   &imx241->module_index);
+	ret |= of_property_read_string(node, RKMODULE_CAMERA_MODULE_FACING,
+				       &imx241->module_facing);
+	ret |= of_property_read_string(node, RKMODULE_CAMERA_MODULE_NAME,
+				       &imx241->module_name);
+	ret |= of_property_read_string(node, RKMODULE_CAMERA_LENS_NAME,
+				       &imx241->len_name);
+	if (ret) {
+		dev_err(dev, "could not get module information!\n");
+		return -EINVAL;
+	}
+
+	imx241->client = client;
+	endpoint = of_graph_get_next_endpoint(dev->of_node, NULL);
+	if (!endpoint) {
+		dev_err(dev, "Failed to get endpoint\n");
+		return -EINVAL;
+	}
+	ret = v4l2_fwnode_endpoint_parse(of_fwnode_handle(endpoint),
+		&imx241->bus_cfg);
+	if (ret) {
+		dev_err(dev, "Failed to get bus cfg\n");
+		return ret;
+	}
+
+	imx241->support_modes = supported_modes_2lane;
+	imx241->cfg_num       = ARRAY_SIZE(supported_modes_2lane);
+	imx241->cur_mode      = &imx241->support_modes[0];
+
+	imx241->xvclk = devm_clk_get(dev, "xvclk");
+	if (IS_ERR(imx241->xvclk)) {
+		dev_err(dev, "Failed to get xvclk\n");
+		return -EINVAL;
+	}
+
+	imx241->power_gpio = devm_gpiod_get(dev, "power", GPIOD_OUT_LOW);
+	if (IS_ERR(imx241->power_gpio))
+		dev_warn(dev, "Failed to get power-gpios, maybe no use\n");
+
+	imx241->reset_gpio = devm_gpiod_get(dev, "reset", GPIOD_OUT_LOW);
+	if (IS_ERR(imx241->reset_gpio))
+		dev_warn(dev, "Failed to get reset-gpios\n");
+
+	imx241->pwdn_gpio = devm_gpiod_get(dev, "pwdn", GPIOD_OUT_LOW);
+	if (IS_ERR(imx241->pwdn_gpio))
+		dev_warn(dev, "Failed to get pwdn-gpios\n");
+
+	ret = imx241_configure_regulators(imx241);
+	if (ret) {
+		dev_err(dev, "Failed to get power regulators\n");
+		return ret;
+	}
+
+	imx241->pinctrl = devm_pinctrl_get(dev);
+	if (!IS_ERR(imx241->pinctrl)) {
+		imx241->pins_default =
+			pinctrl_lookup_state(imx241->pinctrl,
+					     OF_CAMERA_PINCTRL_STATE_DEFAULT);
+		if (IS_ERR(imx241->pins_default))
+			dev_err(dev, "could not get default pinstate\n");
+
+		imx241->pins_sleep =
+			pinctrl_lookup_state(imx241->pinctrl,
+					     OF_CAMERA_PINCTRL_STATE_SLEEP);
+		if (IS_ERR(imx241->pins_sleep))
+			dev_err(dev, "could not get sleep pinstate\n");
+	}
+
+	mutex_init(&imx241->mutex);
+
+	sd = &imx241->subdev;
+	v4l2_i2c_subdev_init(sd, client, &imx241_subdev_ops);
+	ret = imx241_initialize_controls(imx241);
+	if (ret)
+		goto err_destroy_mutex;
+
+	ret = __imx241_power_on(imx241);
+	if (ret)
+		goto err_free_handler;
+
+	ret = imx241_check_sensor_id(imx241, client);
+	if (ret)
+		goto err_power_off;
+
+#ifdef CONFIG_VIDEO_V4L2_SUBDEV_API
+	sd->internal_ops = &imx241_internal_ops;
+	sd->flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;
+#endif
+#if defined(CONFIG_MEDIA_CONTROLLER)
+	imx241->pad.flags = MEDIA_PAD_FL_SOURCE;
+	sd->entity.function = MEDIA_ENT_F_CAM_SENSOR;
+	ret = media_entity_pads_init(&sd->entity, 1, &imx241->pad);
+	if (ret < 0)
+		goto err_power_off;
+#endif
+
+	memset(facing, 0, sizeof(facing));
+	if (strcmp(imx241->module_facing, "back") == 0)
+		facing[0] = 'b';
+	else
+		facing[0] = 'f';
+
+	snprintf(sd->name, sizeof(sd->name), "m%02d_%s_%s %s",
+		 imx241->module_index, facing,
+		 IMX241_NAME, dev_name(sd->dev));
+	ret = v4l2_async_register_subdev_sensor_common(sd);
+	if (ret) {
+		dev_err(dev, "v4l2 async register subdev failed\n");
+		goto err_clean_entity;
+	}
+
+	pm_runtime_set_active(dev);
+	pm_runtime_enable(dev);
+	pm_runtime_idle(dev);
+
+	return 0;
+
+err_clean_entity:
+#if defined(CONFIG_MEDIA_CONTROLLER)
+	media_entity_cleanup(&sd->entity);
+#endif
+err_power_off:
+	__imx241_power_off(imx241);
+err_free_handler:
+	v4l2_ctrl_handler_free(&imx241->ctrl_handler);
+err_destroy_mutex:
+	mutex_destroy(&imx241->mutex);
+
+	return ret;
+}
+
+static int imx241_remove(struct i2c_client *client)
+{
+	struct v4l2_subdev *sd = i2c_get_clientdata(client);
+	struct imx241 *imx241 = to_imx241(sd);
+
+	v4l2_async_unregister_subdev(sd);
+#if defined(CONFIG_MEDIA_CONTROLLER)
+	media_entity_cleanup(&sd->entity);
+#endif
+	v4l2_ctrl_handler_free(&imx241->ctrl_handler);
+	mutex_destroy(&imx241->mutex);
+
+	pm_runtime_disable(&client->dev);
+
+	if (!pm_runtime_status_suspended(&client->dev))
+		__imx241_power_off(imx241);
+
+	pm_runtime_set_suspended(&client->dev);
+
+	return 0;
+}
+
+#if IS_ENABLED(CONFIG_OF)
+static const struct of_device_id imx241_of_match[] = {
+	{ .compatible = "sony,imx241" },
+	{},
+};
+MODULE_DEVICE_TABLE(of, imx241_of_match);
+#endif
+
+static const struct i2c_device_id imx241_match_id[] = {
+	{ "sony,imx241", 0 },
+	{},
+};
+
+static struct i2c_driver imx241_i2c_driver = {
+	.driver = {
+		.name = IMX241_NAME,
+		.pm = &imx241_pm_ops,
+		.of_match_table = of_match_ptr(imx241_of_match),
+	},
+	.probe    = &imx241_probe,
+	.remove   = &imx241_remove,
+	.id_table = imx241_match_id,
+};
+
+static int __init sensor_mod_init(void)
+{
+	return i2c_add_driver(&imx241_i2c_driver);
+}
+
+static void __exit sensor_mod_exit(void)
+{
+	i2c_del_driver(&imx241_i2c_driver);
+}
+
+device_initcall_sync(sensor_mod_init);
+module_exit(sensor_mod_exit);
+
+MODULE_DESCRIPTION("Sony imx241 sensor driver");
+MODULE_LICENSE("GPL");
diff --git a/kernel/drivers/media/i2c/imx464.c b/kernel/drivers/media/i2c/imx464.c
index 3458ff9..8d6c04b 100644
--- a/kernel/drivers/media/i2c/imx464.c
+++ b/kernel/drivers/media/i2c/imx464.c
@@ -10,6 +10,7 @@
  * V0.0X01.0X03 support enum sensor fmt
  */
 
+//#define DEBUG
 #include <linux/clk.h>
 #include <linux/device.h>
 #include <linux/delay.h>
@@ -26,8 +27,11 @@
 #include <media/v4l2-async.h>
 #include <media/v4l2-ctrls.h>
 #include <media/v4l2-subdev.h>
+#include <media/v4l2-fwnode.h>
+#include <media/v4l2-mediabus.h>
 #include <linux/pinctrl/consumer.h>
 #include <linux/rk-preisp.h>
+#include <linux/of_graph.h>
 
 #define DRIVER_VERSION			KERNEL_VERSION(0, 0x01, 0x03)
 
@@ -42,15 +46,12 @@
 #define OF_CAMERA_HDR_MODE		"rockchip,camera-hdr-mode"
 
 /* pixel rate = link frequency * 2 * lanes / BITS_PER_SAMPLE */
-#define IMX464_10BIT_LINEAR_PIXEL_RATE	(MIPI_FREQ_445M * 2 / 10 * 4)
 #define IMX464_10BIT_HDR2_PIXEL_RATE	(MIPI_FREQ_594M * 2 / 10 * 4)
-#define IMX464_10BIT_HDR3_PIXEL_RATE	(MIPI_FREQ_594M * 2 / 10 * 4)
-#define IMX464_12BIT_PIXEL_RATE		(MIPI_FREQ_360M * 2 / 12 * 4)
 #define IMX464_XVCLK_FREQ_37M		37125000
 #define IMX464_XVCLK_FREQ_24M		24000000
 
-#define CHIP_ID				0x00
-#define IMX464_REG_CHIP_ID		0x0000
+#define CHIP_ID				0x06
+#define IMX464_REG_CHIP_ID		0x3057
 
 #define IMX464_REG_CTRL_MODE		0x3000
 #define IMX464_MODE_SW_STANDBY		BIT(0)
@@ -133,8 +134,6 @@
 #define IMX464_REG_VALUE_16BIT		2
 #define IMX464_REG_VALUE_24BIT		3
 
-#define IMX464_2LANES			2
-#define IMX464_4LANES			4
 #define IMX464_BITS_PER_SAMPLE		10
 
 #define IMX464_VREVERSE_REG	0x304f
@@ -150,12 +149,10 @@
 
 #define USED_SYS_DEBUG
 
-static bool g_isHCG;
-
 #define OF_CAMERA_PINCTRL_STATE_DEFAULT	"rockchip,camera_default"
 #define OF_CAMERA_PINCTRL_STATE_SLEEP	"rockchip,camera_sleep"
 
-#define IMX464_NAME			"IMX464"
+#define IMX464_NAME			"imx464"
 
 static const char * const IMX464_supply_names[] = {
 	"avdd",		/* Analog power */
@@ -165,17 +162,17 @@
 
 #define IMX464_NUM_SUPPLIES ARRAY_SIZE(IMX464_supply_names)
 
+struct regval {
+	u16 addr;
+	u8 val;
+};
+
 enum IMX464_max_pad {
 	PAD0, /* link to isp */
 	PAD1, /* link to csi wr0 | hdr x2:L x3:M */
 	PAD2, /* link to csi wr1 | hdr      x3:L */
 	PAD3, /* link to csi wr2 | hdr x2:M x3:S */
 	PAD_MAX,
-};
-
-struct regval {
-	u16 addr;
-	u8 val;
 };
 
 struct IMX464_mode {
@@ -186,6 +183,9 @@
 	u32 hts_def;
 	u32 vts_def;
 	u32 exp_def;
+	u32 mipi_freq_idx;
+	u32 mclk;
+	u32 bpp;
 	const struct regval *reg_list;
 	u32 hdr_mode;
 	u32 vc[PAD_MAX];
@@ -213,19 +213,22 @@
 	struct v4l2_ctrl	*pixel_rate;
 	struct v4l2_ctrl	*link_freq;
 	struct mutex		mutex;
+	struct v4l2_fwnode_endpoint bus_cfg;
 	bool			streaming;
 	bool			power_on;
+	bool			has_init_exp;
+	const struct IMX464_mode *support_modes;
 	const struct IMX464_mode *cur_mode;
 	u32			module_index;
 	u32			cfg_num;
-	u32			cur_pixel_rate;
-	u32			cur_link_freq;
+	u32			cur_vts;
+	u32			cur_mclk;
 	const char		*module_facing;
 	const char		*module_name;
 	const char		*len_name;
-	u32			cur_vts;
-	bool			has_init_exp;
+	enum rkmodule_sync_mode	sync_mode;
 	struct preisp_hdrae_exp_s init_hdrae_exp;
+	bool			isHCG;
 };
 
 #define to_IMX464(sd) container_of(sd, struct IMX464, subdev)
@@ -237,16 +240,16 @@
 	{REG_NULL, 0x00},
 };
 
-static const struct regval IMX464_linear_10bit_2688x1520_regs[] = {
+static __maybe_unused const struct regval IMX464_linear_10bit_2688x1520_2lane_37m_regs[] = {
 	{0x3000, 0x01},
 	{0x3002, 0x01},
 	{0x300C, 0x5B},
 	{0x300D, 0x40},
-	{0x3030, 0xE4},
-	{0x3031, 0x0C},
+	{0x3034, 0xDC},
+	{0x3035, 0x05},
 	{0x3050, 0x00},
-	{0x3058, 0x06},
-	{0x3059, 0x09},
+	{0x3058, 0x83},
+	{0x3059, 0x04},
 	{0x30BE, 0x5E},
 	{0x30E8, 0x14},
 	{0x3110, 0x02},
@@ -256,6 +259,488 @@
 	{0x319D, 0x00},
 	{0x319E, 0x02},
 	{0x31A1, 0x00},
+	{0x3288, 0x22},
+	{0x328A, 0x02},
+	{0x328C, 0xA2},
+	{0x328E, 0x22},
+	{0x3415, 0x27},
+	{0x3418, 0x27},
+	{0x3428, 0xFE},
+	{0x349E, 0x6A},
+	{0x34A2, 0x9A},
+	{0x34A4, 0x8A},
+	{0x34A6, 0x8E},
+	{0x34AA, 0xD8},
+	{0x35BC, 0x00},
+	{0x35BE, 0xFF},
+	{0x35CC, 0x1B},
+	{0x35CD, 0x00},
+	{0x35CE, 0x2A},
+	{0x35CF, 0x00},
+	{0x35DC, 0x07},
+	{0x35DE, 0x1A},
+	{0x35DF, 0x00},
+	{0x35E4, 0x2B},
+	{0x35E5, 0x00},
+	{0x35E6, 0x07},
+	{0x35E7, 0x01},
+	{0x3648, 0x01},
+	{0x3678, 0x01},
+	{0x367C, 0x69},
+	{0x367E, 0x69},
+	{0x3680, 0x69},
+	{0x3682, 0x69},
+	{0x3718, 0x1C},
+	{0x371D, 0x05},
+	{0x375D, 0x11},
+	{0x375E, 0x43},
+	{0x375F, 0x76},
+	{0x3760, 0x07},
+	{0x3768, 0x1B},
+	{0x3769, 0x1B},
+	{0x376A, 0x1A},
+	{0x376B, 0x19},
+	{0x376C, 0x17},
+	{0x376D, 0x0F},
+	{0x376E, 0x0B},
+	{0x376F, 0x0B},
+	{0x3770, 0x0B},
+	{0x3776, 0x89},
+	{0x3777, 0x00},
+	{0x3778, 0xCA},
+	{0x3779, 0x00},
+	{0x377A, 0x45},
+	{0x377B, 0x01},
+	{0x377C, 0x56},
+	{0x377D, 0x02},
+	{0x377E, 0xFE},
+	{0x377F, 0x03},
+	{0x3780, 0xFE},
+	{0x3781, 0x05},
+	{0x3782, 0xFE},
+	{0x3783, 0x06},
+	{0x3784, 0x7F},
+	{0x3788, 0x1F},
+	{0x378A, 0xCA},
+	{0x378B, 0x00},
+	{0x378C, 0x45},
+	{0x378D, 0x01},
+	{0x378E, 0x56},
+	{0x378F, 0x02},
+	{0x3790, 0xFE},
+	{0x3791, 0x03},
+	{0x3792, 0xFE},
+	{0x3793, 0x05},
+	{0x3794, 0xFE},
+	{0x3795, 0x06},
+	{0x3796, 0x7F},
+	{0x3798, 0xBF},
+	{0x3A01, 0x01},
+	{0x3A18, 0x7F},
+	{0x3A1A, 0x37},
+	{0x3A1C, 0x37},
+	{0x3A1E, 0xF7},
+	{0x3A1F, 0x00},
+	{0x3A20, 0x3F},
+	{0x3A22, 0x6F},
+	{0x3A24, 0x3F},
+	{0x3A26, 0x5F},
+	{0x3A28, 0x2F},
+	{REG_NULL, 0x00},
+};
+
+static __maybe_unused const struct regval IMX464_hdr_2x_10bit_2688x1520_2lane_37m_regs[] = {
+	{0x3000, 0x01},
+	{0x3002, 0x01},
+	{0x300C, 0x5B},
+	{0x300D, 0x40},
+	{0x3034, 0xDC},
+	{0x3035, 0x05},
+	{0x3048, 0x01},
+	{0x3049, 0x01},
+	{0x304A, 0x01},
+	{0x304B, 0x01},
+	{0x304C, 0x13},
+	{0x304D, 0x00},
+	{0x3050, 0x00},
+	{0x3058, 0xF4},
+	{0x3059, 0x0A},
+	{0x3068, 0x3D},
+	{0x30BE, 0x5E},
+	{0x30E8, 0x0A},
+	{0x3110, 0x02},
+	{0x314C, 0x80},//
+	{0x315A, 0x02},
+	{0x316A, 0x7E},
+	{0x319D, 0x00},
+	{0x319E, 0x01},//1188M
+	{0x31A1, 0x00},
+	{0x31D7, 0x01},
+	{0x3200, 0x10},
+	{0x3288, 0x22},
+	{0x328A, 0x02},
+	{0x328C, 0xA2},
+	{0x328E, 0x22},
+	{0x3415, 0x27},
+	{0x3418, 0x27},
+	{0x3428, 0xFE},
+	{0x349E, 0x6A},
+	{0x34A2, 0x9A},
+	{0x34A4, 0x8A},
+	{0x34A6, 0x8E},
+	{0x34AA, 0xD8},
+	{0x35BC, 0x00},
+	{0x35BE, 0xFF},
+	{0x35CC, 0x1B},
+	{0x35CD, 0x00},
+	{0x35CE, 0x2A},
+	{0x35CF, 0x00},
+	{0x35DC, 0x07},
+	{0x35DE, 0x1A},
+	{0x35DF, 0x00},
+	{0x35E4, 0x2B},
+	{0x35E5, 0x00},
+	{0x35E6, 0x07},
+	{0x35E7, 0x01},
+	{0x3648, 0x01},
+	{0x3678, 0x01},
+	{0x367C, 0x69},
+	{0x367E, 0x69},
+	{0x3680, 0x69},
+	{0x3682, 0x69},
+	{0x3718, 0x1C},
+	{0x371D, 0x05},
+	{0x375D, 0x11},
+	{0x375E, 0x43},
+	{0x375F, 0x76},
+	{0x3760, 0x07},
+	{0x3768, 0x1B},
+	{0x3769, 0x1B},
+	{0x376A, 0x1A},
+	{0x376B, 0x19},
+	{0x376C, 0x17},
+	{0x376D, 0x0F},
+	{0x376E, 0x0B},
+	{0x376F, 0x0B},
+	{0x3770, 0x0B},
+	{0x3776, 0x89},
+	{0x3777, 0x00},
+	{0x3778, 0xCA},
+	{0x3779, 0x00},
+	{0x377A, 0x45},
+	{0x377B, 0x01},
+	{0x377C, 0x56},
+	{0x377D, 0x02},
+	{0x377E, 0xFE},
+	{0x377F, 0x03},
+	{0x3780, 0xFE},
+	{0x3781, 0x05},
+	{0x3782, 0xFE},
+	{0x3783, 0x06},
+	{0x3784, 0x7F},
+	{0x3788, 0x1F},
+	{0x378A, 0xCA},
+	{0x378B, 0x00},
+	{0x378C, 0x45},
+	{0x378D, 0x01},
+	{0x378E, 0x56},
+	{0x378F, 0x02},
+	{0x3790, 0xFE},
+	{0x3791, 0x03},
+	{0x3792, 0xFE},
+	{0x3793, 0x05},
+	{0x3794, 0xFE},
+	{0x3795, 0x06},
+	{0x3796, 0x7F},
+	{0x3798, 0xBF},
+	{0x3A01, 0x01},
+	{0x3A18, 0x8F},
+	{0x3A1A, 0x4F},
+	{0x3A1C, 0x47},
+	{0x3A1E, 0x37},
+	{0x3A1F, 0x01},
+	{0x3A20, 0x4F},
+	{0x3A22, 0x87},
+	{0x3A24, 0x4F},
+	{0x3A26, 0x7F},
+	{0x3A28, 0x3F},
+	{REG_NULL, 0x00},
+};
+
+static const struct regval IMX464_linear_10bit_2688x1520_2lane_regs[] = {
+	{0x3000, 0x01},
+	{0x3002, 0x01},
+	{0x300C, 0x3b},
+	{0x300D, 0x2a},
+	{0x3034, 0xDC},
+	{0x3035, 0x05},
+	{0x3048, 0x00},
+	{0x3049, 0x00},
+	{0x304A, 0x03},
+	{0x304B, 0x02},
+	{0x304C, 0x14},
+	{0x304D, 0x03},
+	{0x3050, 0x00},
+	{0x3058, 0x83},
+	{0x3059, 0x04},
+	{0x3068, 0xc9},
+	{0x30BE, 0x5E},
+	{0x30E8, 0x14},
+	{0x3110, 0x02},
+	{0x314C, 0x29},
+	{0x314D, 0x01},
+	{0x315A, 0x06},
+	{0x3168, 0xA0},
+	{0x316A, 0x7E},
+	{0x319D, 0x00},
+	{0x319E, 0x02},
+	{0x31A1, 0x00},
+	{0x31D7, 0x00},
+	{0x3200, 0x11},
+	{0x3288, 0x22},
+	{0x328A, 0x02},
+	{0x328C, 0xA2},
+	{0x328E, 0x22},
+	{0x3415, 0x27},
+	{0x3418, 0x27},
+	{0x3428, 0xFE},
+	{0x349E, 0x6A},
+	{0x34A2, 0x9A},
+	{0x34A4, 0x8A},
+	{0x34A6, 0x8E},
+	{0x34AA, 0xD8},
+	{0x35BC, 0x00},
+	{0x35BE, 0xFF},
+	{0x35CC, 0x1B},
+	{0x35CD, 0x00},
+	{0x35CE, 0x2A},
+	{0x35CF, 0x00},
+	{0x35DC, 0x07},
+	{0x35DE, 0x1A},
+	{0x35DF, 0x00},
+	{0x35E4, 0x2B},
+	{0x35E5, 0x00},
+	{0x35E6, 0x07},
+	{0x35E7, 0x01},
+	{0x3648, 0x01},
+	{0x3678, 0x01},
+	{0x367C, 0x69},
+	{0x367E, 0x69},
+	{0x3680, 0x69},
+	{0x3682, 0x69},
+	{0x3718, 0x1C},
+	{0x371D, 0x05},
+	{0x375D, 0x11},
+	{0x375E, 0x43},
+	{0x375F, 0x76},
+	{0x3760, 0x07},
+	{0x3768, 0x1B},
+	{0x3769, 0x1B},
+	{0x376A, 0x1A},
+	{0x376B, 0x19},
+	{0x376C, 0x17},
+	{0x376D, 0x0F},
+	{0x376E, 0x0B},
+	{0x376F, 0x0B},
+	{0x3770, 0x0B},
+	{0x3776, 0x89},
+	{0x3777, 0x00},
+	{0x3778, 0xCA},
+	{0x3779, 0x00},
+	{0x377A, 0x45},
+	{0x377B, 0x01},
+	{0x377C, 0x56},
+	{0x377D, 0x02},
+	{0x377E, 0xFE},
+	{0x377F, 0x03},
+	{0x3780, 0xFE},
+	{0x3781, 0x05},
+	{0x3782, 0xFE},
+	{0x3783, 0x06},
+	{0x3784, 0x7F},
+	{0x3788, 0x1F},
+	{0x378A, 0xCA},
+	{0x378B, 0x00},
+	{0x378C, 0x45},
+	{0x378D, 0x01},
+	{0x378E, 0x56},
+	{0x378F, 0x02},
+	{0x3790, 0xFE},
+	{0x3791, 0x03},
+	{0x3792, 0xFE},
+	{0x3793, 0x05},
+	{0x3794, 0xFE},
+	{0x3795, 0x06},
+	{0x3796, 0x7F},
+	{0x3798, 0xBF},
+	{0x3A01, 0x01},
+	{0x3A18, 0x7F},
+	{0x3A1A, 0x37},
+	{0x3A1C, 0x37},
+	{0x3A1E, 0xF7},
+	{0x3A1F, 0x00},
+	{0x3A20, 0x3F},
+	{0x3A22, 0x6F},
+	{0x3A24, 0x3F},
+	{0x3A26, 0x5F},
+	{0x3A28, 0x2F},
+	{REG_NULL, 0x00},
+};
+
+static const struct regval IMX464_hdr_2x_10bit_2688x1520_2lane_regs[] = {
+	{0x3000, 0x01},
+	{0x3002, 0x01},
+	{0x300C, 0x3B},
+	{0x300D, 0x2A},
+	{0x3034, 0xDC},
+	{0x3035, 0x05},
+	{0x3048, 0x01},
+	{0x3049, 0x01},
+	{0x304A, 0x04},
+	{0x304B, 0x04},
+	{0x304C, 0x13},
+	{0x304D, 0x00},
+	{0x3050, 0x00},
+	{0x3058, 0xF4},
+	{0x3059, 0x0A},
+	{0x3068, 0x3D},
+	{0x30BE, 0x5E},
+	{0x30E8, 0x14},
+	{0x3110, 0x02},
+	{0x314C, 0x29},//
+	{0x314D, 0x01},//
+	{0x315A, 0x06},
+	{0x3168, 0xA0},
+	{0x316A, 0x7E},
+	{0x319D, 0x00},
+	{0x319E, 0x02},//1188M
+	{0x31A1, 0x00},
+	{0x31D7, 0x01},
+	{0x3200, 0x10},
+	{0x3288, 0x22},
+	{0x328A, 0x02},
+	{0x328C, 0xA2},
+	{0x328E, 0x22},
+	{0x3415, 0x27},
+	{0x3418, 0x27},
+	{0x3428, 0xFE},
+	{0x349E, 0x6A},
+	{0x34A2, 0x9A},
+	{0x34A4, 0x8A},
+	{0x34A6, 0x8E},
+	{0x34AA, 0xD8},
+	{0x35BC, 0x00},
+	{0x35BE, 0xFF},
+	{0x35CC, 0x1B},
+	{0x35CD, 0x00},
+	{0x35CE, 0x2A},
+	{0x35CF, 0x00},
+	{0x35DC, 0x07},
+	{0x35DE, 0x1A},
+	{0x35DF, 0x00},
+	{0x35E4, 0x2B},
+	{0x35E5, 0x00},
+	{0x35E6, 0x07},
+	{0x35E7, 0x01},
+	{0x3648, 0x01},
+	{0x3678, 0x01},
+	{0x367C, 0x69},
+	{0x367E, 0x69},
+	{0x3680, 0x69},
+	{0x3682, 0x69},
+	{0x3718, 0x1C},
+	{0x371D, 0x05},
+	{0x375D, 0x11},
+	{0x375E, 0x43},
+	{0x375F, 0x76},
+	{0x3760, 0x07},
+	{0x3768, 0x1B},
+	{0x3769, 0x1B},
+	{0x376A, 0x1A},
+	{0x376B, 0x19},
+	{0x376C, 0x17},
+	{0x376D, 0x0F},
+	{0x376E, 0x0B},
+	{0x376F, 0x0B},
+	{0x3770, 0x0B},
+	{0x3776, 0x89},
+	{0x3777, 0x00},
+	{0x3778, 0xCA},
+	{0x3779, 0x00},
+	{0x377A, 0x45},
+	{0x377B, 0x01},
+	{0x377C, 0x56},
+	{0x377D, 0x02},
+	{0x377E, 0xFE},
+	{0x377F, 0x03},
+	{0x3780, 0xFE},
+	{0x3781, 0x05},
+	{0x3782, 0xFE},
+	{0x3783, 0x06},
+	{0x3784, 0x7F},
+	{0x3788, 0x1F},
+	{0x378A, 0xCA},
+	{0x378B, 0x00},
+	{0x378C, 0x45},
+	{0x378D, 0x01},
+	{0x378E, 0x56},
+	{0x378F, 0x02},
+	{0x3790, 0xFE},
+	{0x3791, 0x03},
+	{0x3792, 0xFE},
+	{0x3793, 0x05},
+	{0x3794, 0xFE},
+	{0x3795, 0x06},
+	{0x3796, 0x7F},
+	{0x3798, 0xBF},
+	{0x3A01, 0x01},
+	{0x3A18, 0x7F},
+	{0x3A1A, 0x37},
+	{0x3A1C, 0x37},
+	{0x3A1E, 0xF7},
+	{0x3A1F, 0x00},
+	{0x3A20, 0x3F},
+	{0x3A22, 0x6F},
+	{0x3A24, 0x3F},
+	{0x3A26, 0x5F},
+	{0x3A28, 0x2F},
+	{REG_NULL, 0x00},
+};
+
+static const struct regval IMX464_linear_10bit_2688x1520_regs[] = {
+	{0x3000, 0x01},
+	{0x3002, 0x01},
+	{0x300C, 0x5B},
+	{0x300D, 0x40},
+	{0x3030, 0xE4},
+	{0x3031, 0x0C},
+	{0x3034, 0xee},
+	{0x3035, 0x02},
+	{0x3048, 0x00},
+	{0x3049, 0x00},
+	{0x304A, 0x03},
+	{0x304B, 0x02},
+	{0x304C, 0x14},
+	{0x3050, 0x00},
+	{0x3058, 0x06},
+	{0x3059, 0x09},
+	{0x305C, 0x09},
+	{0x3060, 0x21},
+	{0x3061, 0x01},
+	{0x3068, 0xc9},
+	{0x306C, 0x56},
+	{0x306D, 0x09},
+	{0x30BE, 0x5E},
+	{0x30E8, 0x14},
+	{0x3110, 0x02},
+	{0x314C, 0xC0},
+	{0x315A, 0x06},
+	{0x316A, 0x7E},
+	{0x319D, 0x00},
+	{0x319E, 0x02},
+	{0x31A1, 0x00},
+	{0x31D7, 0x00},
+	{0x3200, 0x11},
 	{0x3288, 0x22},
 	{0x328A, 0x02},
 	{0x328C, 0xA2},
@@ -350,6 +835,10 @@
 	{0x3002, 0x01},
 	{0x300C, 0x5B},
 	{0x300D, 0x40},
+	{0x3030, 0x72},
+	{0x3031, 0x06},
+	{0x3034, 0xee},
+	{0x3035, 0x02},
 	{0x3048, 0x01},
 	{0x3049, 0x01},
 	{0x304A, 0x04},
@@ -358,7 +847,12 @@
 	{0x3050, 0x00},
 	{0x3058, 0x06},
 	{0x3059, 0x09},
+	{0x305C, 0x09},
+	{0x3060, 0x21},
+	{0x3061, 0x01},
 	{0x3068, 0x6D},
+	{0x306C, 0x56},
+	{0x306D, 0x09},
 	{0x30BE, 0x5E},
 	{0x30E8, 0x14},
 	{0x3110, 0x02},
@@ -498,6 +992,7 @@
 	{0x319E, 0x01},
 	{0x31A1, 0x00},
 	{0x31D7, 0x03},
+	{0x3200, 0x10},
 	{0x3288, 0x22},
 	{0x328A, 0x02},
 	{0x328C, 0xA2},
@@ -584,7 +1079,6 @@
 	{0x3A24, 0x4F},
 	{0x3A26, 0x5F},
 	{0x3A28, 0x3F},
-	{0x3200, 0x10},
 	{REG_NULL, 0x00},
 };
 
@@ -824,6 +1318,33 @@
 	{REG_NULL, 0x00},
 };
 
+static __maybe_unused const struct regval IMX464_interal_sync_master_start_regs[] = {
+	{0x3010, 0x07},
+	{0x31a1, 0x00},
+	{REG_NULL, 0x00},
+};
+static __maybe_unused const struct regval IMX464_interal_sync_master_stop_regs[] = {
+	{0x31a1, 0x0f},
+	{REG_NULL, 0x00},
+};
+
+static __maybe_unused const struct regval IMX464_external_sync_master_start_regs[] = {
+	{0x3010, 0x05},
+	{0x31a1, 0x03},
+	{0x31d9, 0x01},
+	{REG_NULL, 0x00},
+};
+static __maybe_unused const struct regval IMX464_external_sync_master_stop_regs[] = {
+	{0x31a1, 0x0f},
+	{REG_NULL, 0x00},
+};
+
+static __maybe_unused const struct regval IMX464_slave_start_regs[] = {
+	{0x3010, 0x05},
+	{0x31a1, 0x0f},
+	{REG_NULL, 0x00},
+};
+
 /*
  * The width and height must be configured to be
  * the same as the current output resolution of the sensor.
@@ -848,6 +1369,9 @@
 		.exp_def = 0x0906,
 		.hts_def = 0x05dc * 2,
 		.vts_def = 0x0ce4,
+		.mipi_freq_idx = 0,
+		.bpp = 10,
+		.mclk = 37125000,
 		.reg_list = IMX464_linear_10bit_2688x1520_regs,
 		.hdr_mode = NO_HDR,
 		.vc[PAD0] = V4L2_MBUS_CSI2_CHANNEL_0,
@@ -863,6 +1387,9 @@
 		.exp_def = 0x03de,
 		.hts_def = 0x02ee * 4,
 		.vts_def = 0x0672 * 2,
+		.mipi_freq_idx = 1,
+		.bpp = 10,
+		.mclk = 37125000,
 		.reg_list = IMX464_hdr_2x_10bit_2688x1520_regs,
 		.hdr_mode = HDR_X2,
 		.vc[PAD0] = V4L2_MBUS_CSI2_CHANNEL_1,
@@ -889,12 +1416,57 @@
 		#else
 		.vts_def = 0x04D1 * 4,
 		#endif
+		.mipi_freq_idx = 1,
+		.bpp = 10,
+		.mclk = 37125000,
 		.reg_list = IMX464_hdr_3x_10bit_2688x1520_regs,
 		.hdr_mode = HDR_X3,
 		.vc[PAD0] = V4L2_MBUS_CSI2_CHANNEL_2,
 		.vc[PAD1] = V4L2_MBUS_CSI2_CHANNEL_1,//M->csi wr0
 		.vc[PAD2] = V4L2_MBUS_CSI2_CHANNEL_0,//L->csi wr1
 		.vc[PAD3] = V4L2_MBUS_CSI2_CHANNEL_2,//S->csi wr2
+	},
+};
+
+static const struct IMX464_mode supported_modes_2lane[] = {
+	{
+		.bus_fmt = MEDIA_BUS_FMT_SRGGB10_1X10,
+		.width = 2712,
+		.height = 1538,
+		.max_fps = {
+			.numerator = 10000,
+			.denominator = 300000,
+		},
+		.exp_def = 0x0600,
+		.hts_def = 0x05dc * 2,
+		.vts_def = 0x672,
+		.mipi_freq_idx = 0,
+		.bpp = 10,
+		.mclk = 24000000,
+		.reg_list = IMX464_linear_10bit_2688x1520_2lane_regs,
+		.hdr_mode = NO_HDR,
+		.vc[PAD0] = V4L2_MBUS_CSI2_CHANNEL_0,
+	},
+	{
+		.bus_fmt = MEDIA_BUS_FMT_SRGGB10_1X10,
+		.width = 2712,
+		.height = 1538,
+		.max_fps = {
+			.numerator = 10000,
+			.denominator = 150000,
+		},
+		.exp_def = 0x0600,
+		.hts_def = 0x05dc * 4,
+		.vts_def = 0x0672 * 2,
+		.mipi_freq_idx = 0,
+		.bpp = 10,
+		.mclk = 24000000,
+		.reg_list = IMX464_hdr_2x_10bit_2688x1520_2lane_regs,
+		.hdr_mode = HDR_X2,
+		.vc[PAD0] = V4L2_MBUS_CSI2_CHANNEL_1,
+		.vc[PAD1] = V4L2_MBUS_CSI2_CHANNEL_0,//L->csi wr0
+		.vc[PAD2] = V4L2_MBUS_CSI2_CHANNEL_1,
+		.vc[PAD3] = V4L2_MBUS_CSI2_CHANNEL_1,//M->csi wr2
 	},
 };
 
@@ -997,15 +1569,15 @@
 	unsigned int i;
 
 	for (i = 0; i < IMX464->cfg_num; i++) {
-		dist = IMX464_get_reso_dist(&supported_modes[i], framefmt);
+		dist = IMX464_get_reso_dist(&IMX464->support_modes[i], framefmt);
 		if ((cur_best_fit_dist == -1 || dist <= cur_best_fit_dist) &&
-			supported_modes[i].bus_fmt == framefmt->code) {
+			IMX464->support_modes[i].bus_fmt == framefmt->code) {
 			cur_best_fit_dist = dist;
 			cur_best_fit = i;
 		}
 	}
 
-	return &supported_modes[cur_best_fit];
+	return &IMX464->support_modes[cur_best_fit];
 }
 
 static int IMX464_set_fmt(struct v4l2_subdev *sd,
@@ -1015,8 +1587,7 @@
 	struct IMX464 *IMX464 = to_IMX464(sd);
 	const struct IMX464_mode *mode;
 	s64 h_blank, vblank_def;
-	struct device *dev = &IMX464->client->dev;
-	int ret = 0;
+	u64 pixel_rate = 0;
 
 	mutex_lock(&IMX464->mutex);
 
@@ -1042,42 +1613,12 @@
 					 IMX464_VTS_MAX - mode->height,
 					 1, vblank_def);
 		IMX464->cur_vts = IMX464->cur_mode->vts_def;
-		if (mode->bus_fmt == MEDIA_BUS_FMT_SRGGB10_1X10) {
-			IMX464->cur_link_freq = 1;
-			if (mode->hdr_mode == NO_HDR) {
-				IMX464->cur_pixel_rate = IMX464_10BIT_LINEAR_PIXEL_RATE;
-				IMX464->cur_link_freq = 0;
-			} else if (mode->hdr_mode == HDR_X2)
-				IMX464->cur_pixel_rate = IMX464_10BIT_HDR2_PIXEL_RATE;
-			else if (mode->hdr_mode == HDR_X3)
-				IMX464->cur_pixel_rate = IMX464_10BIT_HDR3_PIXEL_RATE;
-
-			clk_disable_unprepare(IMX464->xvclk);
-			ret = clk_set_rate(IMX464->xvclk, IMX464_XVCLK_FREQ_37M);
-			if (ret < 0)
-				dev_err(dev, "Failed to set xvclk rate\n");
-			if (clk_get_rate(IMX464->xvclk) != IMX464_XVCLK_FREQ_37M)
-				dev_err(dev, "xvclk mismatched\n");
-			ret = clk_prepare_enable(IMX464->xvclk);
-			if (ret < 0)
-				dev_err(dev, "Failed to enable xvclk\n");
-		} else {
-			IMX464->cur_pixel_rate = IMX464_12BIT_PIXEL_RATE;
-			IMX464->cur_link_freq = 0;
-			clk_disable_unprepare(IMX464->xvclk);
-			ret = clk_set_rate(IMX464->xvclk, IMX464_XVCLK_FREQ_24M);
-			if (ret < 0)
-				dev_err(dev, "Failed to set xvclk rate\n");
-			if (clk_get_rate(IMX464->xvclk) != IMX464_XVCLK_FREQ_24M)
-				dev_err(dev, "xvclk mismatched\n");
-			ret = clk_prepare_enable(IMX464->xvclk);
-			if (ret < 0)
-				dev_err(dev, "Failed to enable xvclk\n");
-		}
+		pixel_rate = (u32)link_freq_menu_items[mode->mipi_freq_idx] / mode->bpp * 2 *
+			     IMX464->bus_cfg.bus.mipi_csi2.num_data_lanes;
 		__v4l2_ctrl_s_ctrl_int64(IMX464->pixel_rate,
-					 IMX464->cur_pixel_rate);
+					 pixel_rate);
 		__v4l2_ctrl_s_ctrl(IMX464->link_freq,
-				   IMX464->cur_link_freq);
+				   mode->mipi_freq_idx);
 	}
 
 	mutex_unlock(&IMX464->mutex);
@@ -1137,13 +1678,13 @@
 	if (fse->index >= IMX464->cfg_num)
 		return -EINVAL;
 
-	if (fse->code != supported_modes[fse->index].bus_fmt)
+	if (fse->code != IMX464->support_modes[fse->index].bus_fmt)
 		return -EINVAL;
 
-	fse->min_width  = supported_modes[fse->index].width;
-	fse->max_width  = supported_modes[fse->index].width;
-	fse->max_height = supported_modes[fse->index].height;
-	fse->min_height = supported_modes[fse->index].height;
+	fse->min_width  = IMX464->support_modes[fse->index].width;
+	fse->max_width  = IMX464->support_modes[fse->index].width;
+	fse->max_height = IMX464->support_modes[fse->index].height;
+	fse->min_height = IMX464->support_modes[fse->index].height;
 
 	return 0;
 }
@@ -1167,19 +1708,20 @@
 	struct IMX464 *IMX464 = to_IMX464(sd);
 	const struct IMX464_mode *mode = IMX464->cur_mode;
 	u32 val = 0;
+	u32 lane_num = IMX464->bus_cfg.bus.mipi_csi2.num_data_lanes;
 
 	if (mode->hdr_mode == NO_HDR) {
-		val = 1 << (IMX464_4LANES - 1) |
+		val = 1 << (lane_num - 1) |
 		V4L2_MBUS_CSI2_CHANNEL_0 |
 		V4L2_MBUS_CSI2_CONTINUOUS_CLOCK;
 	}
 	if (mode->hdr_mode == HDR_X2)
-		val = 1 << (IMX464_4LANES - 1) |
+		val = 1 << (lane_num - 1) |
 		V4L2_MBUS_CSI2_CHANNEL_0 |
 		V4L2_MBUS_CSI2_CONTINUOUS_CLOCK |
 		V4L2_MBUS_CSI2_CHANNEL_1;
 	if (mode->hdr_mode == HDR_X3)
-		val = 1 << (IMX464_4LANES - 1) |
+		val = 1 << (lane_num - 1) |
 		V4L2_MBUS_CSI2_CHANNEL_0 |
 		V4L2_MBUS_CSI2_CONTINUOUS_CLOCK |
 		V4L2_MBUS_CSI2_CHANNEL_1 |
@@ -1241,12 +1783,12 @@
 		l_exp_time = m_exp_time;
 		cg_mode = ae->middle_cg_mode;
 	}
-	if (!g_isHCG && cg_mode == GAIN_MODE_HCG) {
+	if (!IMX464->isHCG && cg_mode == GAIN_MODE_HCG) {
 		gain_switch = 0x01 | 0x100;
-		g_isHCG = true;
-	} else if (g_isHCG && cg_mode == GAIN_MODE_LCG) {
+		IMX464->isHCG = true;
+	} else if (IMX464->isHCG && cg_mode == GAIN_MODE_LCG) {
 		gain_switch = 0x00 | 0x100;
-		g_isHCG = false;
+		IMX464->isHCG = false;
 	}
 	ret = imx464_write_reg(client,
 		IMX464_GROUP_HOLD_REG,
@@ -1428,12 +1970,12 @@
 		//3 stagger
 		cg_mode = ae->long_cg_mode;
 	}
-	if (!g_isHCG && cg_mode == GAIN_MODE_HCG) {
+	if (!IMX464->isHCG && cg_mode == GAIN_MODE_HCG) {
 		gain_switch = 0x01 | 0x100;
-		g_isHCG = true;
-	} else if (g_isHCG && cg_mode == GAIN_MODE_LCG) {
+		IMX464->isHCG = true;
+	} else if (IMX464->isHCG && cg_mode == GAIN_MODE_LCG) {
 		gain_switch = 0x00 | 0x100;
-		g_isHCG = false;
+		IMX464->isHCG = false;
 	}
 
 	dev_dbg(&client->dev,
@@ -1670,12 +2212,12 @@
 	int cur_cg = *cg;
 	u32 gain_switch = 0;
 
-	if (g_isHCG && cur_cg == GAIN_MODE_LCG) {
+	if (IMX464->isHCG && cur_cg == GAIN_MODE_LCG) {
 		gain_switch = 0x00 | 0x100;
-		g_isHCG = false;
-	} else if (!g_isHCG && cur_cg == GAIN_MODE_HCG) {
+		IMX464->isHCG = false;
+	} else if (!IMX464->isHCG && cur_cg == GAIN_MODE_HCG) {
 		gain_switch = 0x01 | 0x100;
-		g_isHCG = true;
+		IMX464->isHCG = true;
 	}
 	ret = imx464_write_reg(client,
 			IMX464_GROUP_HOLD_REG,
@@ -1743,12 +2285,26 @@
 }
 #endif
 
+static int IMX464_get_channel_info(struct IMX464 *IMX464, struct rkmodule_channel_info *ch_info)
+{
+	if (ch_info->index >= PAD_MAX)
+		return -EINVAL;
+	ch_info->vc = IMX464->cur_mode->vc[ch_info->index];
+	ch_info->width = IMX464->cur_mode->width;
+	ch_info->height = IMX464->cur_mode->height;
+	ch_info->bus_fmt = IMX464->cur_mode->bus_fmt;
+	return 0;
+}
+
 static long IMX464_ioctl(struct v4l2_subdev *sd, unsigned int cmd, void *arg)
 {
 	struct IMX464 *IMX464 = to_IMX464(sd);
 	struct rkmodule_hdr_cfg *hdr;
+	struct rkmodule_channel_info *ch_info;
 	u32 i, h, w, stream;
 	long ret = 0;
+	u64 pixel_rate = 0;
+	u32 *sync_mode = NULL;
 
 	switch (cmd) {
 	case PREISP_CMD_SET_HDRAE_EXP:
@@ -1770,10 +2326,10 @@
 		w = IMX464->cur_mode->width;
 		h = IMX464->cur_mode->height;
 		for (i = 0; i < IMX464->cfg_num; i++) {
-			if (w == supported_modes[i].width &&
-			    h == supported_modes[i].height &&
-			    supported_modes[i].hdr_mode == hdr->hdr_mode) {
-				IMX464->cur_mode = &supported_modes[i];
+			if (w == IMX464->support_modes[i].width &&
+			    h == IMX464->support_modes[i].height &&
+			    IMX464->support_modes[i].hdr_mode == hdr->hdr_mode) {
+				IMX464->cur_mode = &IMX464->support_modes[i];
 				break;
 			}
 		}
@@ -1790,16 +2346,13 @@
 				IMX464_VTS_MAX - IMX464->cur_mode->height,
 				1, h);
 			IMX464->cur_vts = IMX464->cur_mode->vts_def;
-			if (IMX464->cur_mode->bus_fmt == MEDIA_BUS_FMT_SRGGB10_1X10) {
-				if (IMX464->cur_mode->hdr_mode == NO_HDR)
-					IMX464->cur_pixel_rate = IMX464_10BIT_LINEAR_PIXEL_RATE;
-				else if (IMX464->cur_mode->hdr_mode == HDR_X2)
-					IMX464->cur_pixel_rate = IMX464_10BIT_HDR2_PIXEL_RATE;
-				else if (IMX464->cur_mode->hdr_mode == HDR_X3)
-					IMX464->cur_pixel_rate = IMX464_10BIT_HDR3_PIXEL_RATE;
-				__v4l2_ctrl_s_ctrl_int64(IMX464->pixel_rate,
-							 IMX464->cur_pixel_rate);
-			}
+			pixel_rate = (u32)link_freq_menu_items[IMX464->cur_mode->mipi_freq_idx] /
+					 IMX464->cur_mode->bpp * 2 *
+				     IMX464->bus_cfg.bus.mipi_csi2.num_data_lanes;
+			__v4l2_ctrl_s_ctrl_int64(IMX464->pixel_rate,
+						 pixel_rate);
+			__v4l2_ctrl_s_ctrl(IMX464->link_freq,
+					   IMX464->cur_mode->mipi_freq_idx);
 		}
 		break;
 	case RKMODULE_SET_CONVERSION_GAIN:
@@ -1809,16 +2362,25 @@
 
 		stream = *((u32 *)arg);
 
-		if (stream) {
+		if (stream)
 			ret = imx464_write_reg(IMX464->client, IMX464_REG_CTRL_MODE,
 				IMX464_REG_VALUE_08BIT, IMX464_MODE_STREAMING);
-			usleep_range(30000, 40000);
-			imx464_write_reg(IMX464->client, IMX464_REG_MARSTER_MODE,
-				IMX464_REG_VALUE_08BIT, 0);
-		} else {
+		else
 			ret = imx464_write_reg(IMX464->client, IMX464_REG_CTRL_MODE,
 				IMX464_REG_VALUE_08BIT, IMX464_MODE_SW_STANDBY);
-		}
+
+		break;
+	case RKMODULE_GET_CHANNEL_INFO:
+		ch_info = (struct rkmodule_channel_info *)arg;
+		ret = IMX464_get_channel_info(IMX464, ch_info);
+		break;
+	case RKMODULE_GET_SYNC_MODE:
+		sync_mode = (u32 *)arg;
+		*sync_mode = IMX464->sync_mode;
+		break;
+	case RKMODULE_SET_SYNC_MODE:
+		sync_mode = (u32 *)arg;
+		IMX464->sync_mode = *sync_mode;
 		break;
 	default:
 		ret = -ENOIOCTLCMD;
@@ -1837,9 +2399,11 @@
 	struct rkmodule_awb_cfg *cfg;
 	struct rkmodule_hdr_cfg *hdr;
 	struct preisp_hdrae_exp_s *hdrae;
+	struct rkmodule_channel_info *ch_info;
 	long ret;
 	u32 cg = 0;
 	u32  stream;
+	u32 sync_mode;
 
 	switch (cmd) {
 	case RKMODULE_GET_MODULE_INFO:
@@ -1850,8 +2414,11 @@
 		}
 
 		ret = IMX464_ioctl(sd, cmd, inf);
-		if (!ret)
+		if (!ret) {
 			ret = copy_to_user(up, inf, sizeof(*inf));
+			if (ret)
+				ret = -EFAULT;
+		}
 		kfree(inf);
 		break;
 	case RKMODULE_AWB_CFG:
@@ -1864,6 +2431,8 @@
 		ret = copy_from_user(cfg, up, sizeof(*cfg));
 		if (!ret)
 			ret = IMX464_ioctl(sd, cmd, cfg);
+		else
+			ret = -EFAULT;
 		kfree(cfg);
 		break;
 	case RKMODULE_GET_HDR_CFG:
@@ -1874,8 +2443,11 @@
 		}
 
 		ret = IMX464_ioctl(sd, cmd, hdr);
-		if (!ret)
+		if (!ret) {
 			ret = copy_to_user(up, hdr, sizeof(*hdr));
+			if (ret)
+				ret = -EFAULT;
+		}
 		kfree(hdr);
 		break;
 	case RKMODULE_SET_HDR_CFG:
@@ -1888,6 +2460,8 @@
 		ret = copy_from_user(hdr, up, sizeof(*hdr));
 		if (!ret)
 			ret = IMX464_ioctl(sd, cmd, hdr);
+		else
+			ret = -EFAULT;
 		kfree(hdr);
 		break;
 	case PREISP_CMD_SET_HDRAE_EXP:
@@ -1900,18 +2474,54 @@
 		ret = copy_from_user(hdrae, up, sizeof(*hdrae));
 		if (!ret)
 			ret = IMX464_ioctl(sd, cmd, hdrae);
+		else
+			ret = -EFAULT;
 		kfree(hdrae);
 		break;
 	case RKMODULE_SET_CONVERSION_GAIN:
 		ret = copy_from_user(&cg, up, sizeof(cg));
 		if (!ret)
 			ret = IMX464_ioctl(sd, cmd, &cg);
+		else
+			ret = -EFAULT;
 		break;
 	case RKMODULE_SET_QUICK_STREAM:
 		ret = copy_from_user(&stream, up, sizeof(u32));
 		if (!ret)
 			ret = IMX464_ioctl(sd, cmd, &stream);
+		else
+			ret = -EFAULT;
 
+		break;
+	case RKMODULE_GET_CHANNEL_INFO:
+		ch_info = kzalloc(sizeof(*ch_info), GFP_KERNEL);
+		if (!ch_info) {
+			ret = -ENOMEM;
+			return ret;
+		}
+
+		ret = IMX464_ioctl(sd, cmd, ch_info);
+		if (!ret) {
+			ret = copy_to_user(up, ch_info, sizeof(*ch_info));
+			if (ret)
+				ret = -EFAULT;
+		}
+		kfree(ch_info);
+		break;
+	case RKMODULE_GET_SYNC_MODE:
+		ret = IMX464_ioctl(sd, cmd, &sync_mode);
+		if (!ret) {
+			ret = copy_to_user(up, &sync_mode, sizeof(u32));
+			if (ret)
+				ret = -EFAULT;
+		}
+		break;
+	case RKMODULE_SET_SYNC_MODE:
+		ret = copy_from_user(&sync_mode, up, sizeof(u32));
+		if (!ret)
+			ret = IMX464_ioctl(sd, cmd, &sync_mode);
+		else
+			ret = -EFAULT;
 		break;
 	default:
 		ret = -ENOIOCTLCMD;
@@ -1922,17 +2532,20 @@
 }
 #endif
 
-static int IMX464_init_conversion_gain(struct IMX464 *IMX464)
+static int IMX464_init_conversion_gain(struct IMX464 *IMX464, bool isHCG)
 {
-	int ret = 0;
 	struct i2c_client *client = IMX464->client;
+	int ret = 0;
+	u32 val = 0;
 
+	if (isHCG)
+		val = 0x01;
+	else
+		val = 0;
 	ret = imx464_write_reg(client,
 		IMX464_GAIN_SWITCH_REG,
 		IMX464_REG_VALUE_08BIT,
-		0X00);
-	if (!ret)
-		g_isHCG = false;
+		val);
 	return ret;
 }
 
@@ -1943,7 +2556,7 @@
 	ret = IMX464_write_array(IMX464->client, IMX464->cur_mode->reg_list);
 	if (ret)
 		return ret;
-	ret = IMX464_init_conversion_gain(IMX464);
+	ret = IMX464_init_conversion_gain(IMX464, IMX464->isHCG);
 	if (ret)
 		return ret;
 	/* In case these controls are set before streaming */
@@ -1959,18 +2572,43 @@
 			return ret;
 		}
 	}
-	imx464_write_reg(IMX464->client, IMX464_REG_CTRL_MODE,
-				IMX464_REG_VALUE_08BIT, IMX464_MODE_STREAMING);
-	usleep_range(30000, 40000);
-	return imx464_write_reg(IMX464->client, IMX464_REG_MARSTER_MODE,
-				IMX464_REG_VALUE_08BIT, 0);
+
+	if (IMX464->sync_mode == EXTERNAL_MASTER_MODE) {
+		ret |= IMX464_write_array(IMX464->client, IMX464_external_sync_master_start_regs);
+		v4l2_err(&IMX464->subdev, "cur externam master mode\n");
+	} else if (IMX464->sync_mode == INTERNAL_MASTER_MODE) {
+		ret |= IMX464_write_array(IMX464->client, IMX464_interal_sync_master_start_regs);
+		v4l2_err(&IMX464->subdev, "cur intertal master\n");
+	} else if (IMX464->sync_mode == SLAVE_MODE) {
+		ret |= IMX464_write_array(IMX464->client, IMX464_slave_start_regs);
+		v4l2_err(&IMX464->subdev, "cur slave mode\n");
+	}
+	if (IMX464->sync_mode == NO_SYNC_MODE) {
+		ret = imx464_write_reg(IMX464->client, IMX464_REG_CTRL_MODE,
+					IMX464_REG_VALUE_08BIT, IMX464_MODE_STREAMING);
+		usleep_range(30000, 40000);
+		ret |= imx464_write_reg(IMX464->client, IMX464_REG_MARSTER_MODE,
+					IMX464_REG_VALUE_08BIT, 0);
+	} else {
+		ret |= imx464_write_reg(IMX464->client, IMX464_REG_MARSTER_MODE,
+					IMX464_REG_VALUE_08BIT, 0);
+	}
+	return ret;
 }
 
 static int __IMX464_stop_stream(struct IMX464 *IMX464)
 {
+	int ret = 0;
+
 	IMX464->has_init_exp = false;
-	return imx464_write_reg(IMX464->client, IMX464_REG_CTRL_MODE,
-				IMX464_REG_VALUE_08BIT, IMX464_MODE_SW_STANDBY);
+	ret = imx464_write_reg(IMX464->client, IMX464_REG_CTRL_MODE,
+			IMX464_REG_VALUE_08BIT, IMX464_MODE_SW_STANDBY);
+
+	if (IMX464->sync_mode == EXTERNAL_MASTER_MODE)
+		ret |= IMX464_write_array(IMX464->client, IMX464_external_sync_master_stop_regs);
+	else if (IMX464->sync_mode == INTERNAL_MASTER_MODE)
+		ret |= IMX464_write_array(IMX464->client, IMX464_interal_sync_master_stop_regs);
+	return ret;
 }
 
 static int IMX464_s_stream(struct v4l2_subdev *sd, int on)
@@ -2059,7 +2697,6 @@
 	int ret;
 	u32 delay_us;
 	struct device *dev = &IMX464->client->dev;
-	unsigned long mclk = 0;
 
 	if (!IS_ERR_OR_NULL(IMX464->pins_default)) {
 		ret = pinctrl_select_state(IMX464->pinctrl,
@@ -2067,15 +2704,14 @@
 		if (ret < 0)
 			dev_err(dev, "could not set pins\n");
 	}
-	if (IMX464->cur_mode->bus_fmt == MEDIA_BUS_FMT_SRGGB10_1X10)
-		mclk = IMX464_XVCLK_FREQ_37M;
-	else
-		mclk = IMX464_XVCLK_FREQ_24M;
-	ret = clk_set_rate(IMX464->xvclk, mclk);
+
+	ret = clk_set_rate(IMX464->xvclk, IMX464->cur_mode->mclk);
 	if (ret < 0)
 		dev_warn(dev, "Failed to set xvclk rate\n");
-	if (clk_get_rate(IMX464->xvclk) != mclk)
-		dev_warn(dev, "xvclk mismatched\n");
+	if (clk_get_rate(IMX464->xvclk) != IMX464->cur_mode->mclk)
+		dev_warn(dev, "xvclk mismatched, %lu\n", clk_get_rate(IMX464->xvclk));
+	else
+		IMX464->cur_mclk = IMX464->cur_mode->mclk;
 	ret = clk_prepare_enable(IMX464->xvclk);
 	if (ret < 0) {
 		dev_err(dev, "Failed to enable xvclk\n");
@@ -2089,7 +2725,7 @@
 		dev_err(dev, "Failed to enable regulators\n");
 		goto disable_clk;
 	}
-
+	usleep_range(15000, 16000);
 	if (!IS_ERR(IMX464->reset_gpio))
 		gpiod_set_value_cansleep(IMX464->reset_gpio, 1);
 
@@ -2126,6 +2762,7 @@
 			dev_err(dev, "could not set pins\n");
 	}
 	regulator_bulk_disable(IMX464_NUM_SUPPLIES, IMX464->supplies);
+	usleep_range(15000, 16000);
 }
 
 static int IMX464_runtime_resume(struct device *dev)
@@ -2154,7 +2791,7 @@
 	struct IMX464 *IMX464 = to_IMX464(sd);
 	struct v4l2_mbus_framefmt *try_fmt =
 				v4l2_subdev_get_try_format(sd, fh->pad, 0);
-	const struct IMX464_mode *def_mode = &supported_modes[0];
+	const struct IMX464_mode *def_mode = &IMX464->support_modes[0];
 
 	mutex_lock(&IMX464->mutex);
 	/* Initialize try_fmt */
@@ -2179,16 +2816,16 @@
 	if (fie->index >= IMX464->cfg_num)
 		return -EINVAL;
 
-	fie->code = supported_modes[fie->index].bus_fmt;
-	fie->width = supported_modes[fie->index].width;
-	fie->height = supported_modes[fie->index].height;
-	fie->interval = supported_modes[fie->index].max_fps;
-	fie->reserved[0] = supported_modes[fie->index].hdr_mode;
+	fie->code = IMX464->support_modes[fie->index].bus_fmt;
+	fie->width = IMX464->support_modes[fie->index].width;
+	fie->height = IMX464->support_modes[fie->index].height;
+	fie->interval = IMX464->support_modes[fie->index].max_fps;
+	fie->reserved[0] = IMX464->support_modes[fie->index].hdr_mode;
 	return 0;
 }
 
 #define CROP_START(SRC, DST) (((SRC) - (DST)) / 2 / 4 * 4)
-#define DST_WIDTH 2688
+#define DST_WIDTH 2560
 #define DST_HEIGHT 1520
 
 /*
@@ -2266,7 +2903,7 @@
 	u32 vts = 0;
 	int ret = 0;
 	u32 shr0 = 0;
-	//u32 flip = 0;
+	u32 flip = 0;
 
 	/* Propagate change of current control to all related controls */
 	switch (ctrl->id) {
@@ -2298,7 +2935,7 @@
 			ret |= imx464_write_reg(IMX464->client, IMX464_LF_EXPO_REG_H,
 					IMX464_REG_VALUE_08BIT,
 					IMX464_FETCH_EXP_H(shr0));
-			dev_err(&client->dev, "set exposure 0x%x\n",
+			dev_dbg(&client->dev, "set exposure 0x%x\n",
 				ctrl->val);
 		}
 		break;
@@ -2310,7 +2947,7 @@
 			ret |= imx464_write_reg(IMX464->client, IMX464_LF_GAIN_REG_L,
 					IMX464_REG_VALUE_08BIT,
 					IMX464_FETCH_GAIN_L(ctrl->val));
-			dev_err(&client->dev, "set analog gain 0x%x\n",
+			dev_dbg(&client->dev, "set analog gain 0x%x\n",
 				ctrl->val);
 		}
 		break;
@@ -2338,12 +2975,67 @@
 				       IMX464_REG_VALUE_08BIT,
 				       IMX464_FETCH_VTS_H(vts));
 
-		dev_err(&client->dev, "set vts 0x%x\n",
-			vts);
+		dev_dbg(&client->dev, "set vts 0x%x\n", vts);
 		break;
 	case V4L2_CID_HFLIP:
+		ret = imx464_write_reg(client,
+				       IMX464_GROUP_HOLD_REG,
+				       IMX464_REG_VALUE_08BIT,
+				       IMX464_GROUP_HOLD_START);
+		ret |= imx464_write_reg(IMX464->client, IMX464_HREVERSE_REG,
+				       IMX464_REG_VALUE_08BIT, !!ctrl->val);
+		ret |= imx464_write_reg(client,
+					IMX464_GROUP_HOLD_REG,
+					IMX464_REG_VALUE_08BIT,
+					IMX464_GROUP_HOLD_END);
 		break;
 	case V4L2_CID_VFLIP:
+		flip = ctrl->val;
+		ret = imx464_write_reg(client,
+				       IMX464_GROUP_HOLD_REG,
+				       IMX464_REG_VALUE_08BIT,
+				       IMX464_GROUP_HOLD_START);
+		ret |= imx464_write_reg(IMX464->client, IMX464_VREVERSE_REG,
+				IMX464_REG_VALUE_08BIT, !!flip);
+		if (flip) {
+			ret |= imx464_write_reg(IMX464->client, 0x3074,
+				IMX464_REG_VALUE_08BIT, 0x40);
+			ret |= imx464_write_reg(IMX464->client, 0x3075,
+				IMX464_REG_VALUE_08BIT, 0x06);
+			ret |= imx464_write_reg(IMX464->client, 0x3080,
+				IMX464_REG_VALUE_08BIT, 0xff);
+			ret |= imx464_write_reg(IMX464->client, 0x30ad,
+				IMX464_REG_VALUE_08BIT, 0x7e);
+			ret |= imx464_write_reg(IMX464->client, 0x30b6,
+				IMX464_REG_VALUE_08BIT, 0xff);
+			ret |= imx464_write_reg(IMX464->client, 0x30b7,
+				IMX464_REG_VALUE_08BIT, 0x01);
+			ret |= imx464_write_reg(IMX464->client, 0x30d8,
+				IMX464_REG_VALUE_08BIT, 0x45);
+			ret |= imx464_write_reg(IMX464->client, 0x3114,
+				IMX464_REG_VALUE_08BIT, 0x01);
+		} else {
+			ret |= imx464_write_reg(IMX464->client, 0x3074,
+				IMX464_REG_VALUE_08BIT, 0x3c);
+			ret |= imx464_write_reg(IMX464->client, 0x3075,
+				IMX464_REG_VALUE_08BIT, 0x00);
+			ret |= imx464_write_reg(IMX464->client, 0x3080,
+				IMX464_REG_VALUE_08BIT, 0x01);
+			ret |= imx464_write_reg(IMX464->client, 0x30ad,
+				IMX464_REG_VALUE_08BIT, 0x02);
+			ret |= imx464_write_reg(IMX464->client, 0x30b6,
+				IMX464_REG_VALUE_08BIT, 0x00);
+			ret |= imx464_write_reg(IMX464->client, 0x30b7,
+				IMX464_REG_VALUE_08BIT, 0x00);
+			ret |= imx464_write_reg(IMX464->client, 0x30d8,
+				IMX464_REG_VALUE_08BIT, 0x44);
+			ret |= imx464_write_reg(IMX464->client, 0x3114,
+				IMX464_REG_VALUE_08BIT, 0x02);
+		}
+		ret |= imx464_write_reg(client,
+					IMX464_GROUP_HOLD_REG,
+					IMX464_REG_VALUE_08BIT,
+					IMX464_GROUP_HOLD_END);
 		break;
 	default:
 		dev_warn(&client->dev, "%s Unhandled id:0x%x, val:0x%x\n",
@@ -2366,6 +3058,7 @@
 	struct v4l2_ctrl_handler *handler;
 	s64 exposure_max, vblank_def;
 	u32 h_blank;
+	u64 pixel_rate = 0;
 	int ret;
 
 	handler = &IMX464->ctrl_handler;
@@ -2378,28 +3071,13 @@
 	IMX464->link_freq = v4l2_ctrl_new_int_menu(handler,
 				NULL, V4L2_CID_LINK_FREQ,
 				1, 0, link_freq_menu_items);
-	if (IMX464->cur_mode->bus_fmt == MEDIA_BUS_FMT_SRGGB10_1X10) {
-		IMX464->cur_link_freq = 1;
-		if (IMX464->cur_mode->hdr_mode == NO_HDR) {
-			IMX464->cur_pixel_rate =
-				IMX464_10BIT_LINEAR_PIXEL_RATE;
-			IMX464->cur_link_freq = 0;
-		} else if (IMX464->cur_mode->hdr_mode == HDR_X2)
-			IMX464->cur_pixel_rate =
-				IMX464_10BIT_HDR2_PIXEL_RATE;
-		else if (IMX464->cur_mode->hdr_mode == HDR_X3)
-			IMX464->cur_pixel_rate =
-				IMX464_10BIT_HDR3_PIXEL_RATE;
-	} else {
-		IMX464->cur_link_freq = 0;
-		IMX464->cur_pixel_rate =
-				IMX464_12BIT_PIXEL_RATE;
-	}
 	__v4l2_ctrl_s_ctrl(IMX464->link_freq,
-			 IMX464->cur_link_freq);
+			 IMX464->cur_mode->mipi_freq_idx);
+	pixel_rate = (u32)link_freq_menu_items[mode->mipi_freq_idx] / mode->bpp * 2 *
+		     IMX464->bus_cfg.bus.mipi_csi2.num_data_lanes;
 	IMX464->pixel_rate = v4l2_ctrl_new_std(handler, NULL,
 		V4L2_CID_PIXEL_RATE, 0, IMX464_10BIT_HDR2_PIXEL_RATE,
-		1, IMX464->cur_pixel_rate);
+		1, pixel_rate);
 
 	h_blank = mode->hts_def - mode->width;
 	IMX464->hblank = v4l2_ctrl_new_std(handler, NULL, V4L2_CID_HBLANK,
@@ -2436,6 +3114,7 @@
 
 	IMX464->subdev.ctrl_handler = handler;
 	IMX464->has_init_exp = false;
+	IMX464->isHCG = false;
 
 	return 0;
 
@@ -2483,9 +3162,12 @@
 	struct device_node *node = dev->of_node;
 	struct IMX464 *IMX464;
 	struct v4l2_subdev *sd;
+	struct device_node *endpoint;
 	char facing[2];
 	int ret;
 	u32 i, hdr_mode = 0;
+	const char *sync_mode_name = NULL;
+
 
 	dev_info(dev, "driver version: %02x.%02x.%02x",
 		DRIVER_VERSION >> 16,
@@ -2509,6 +3191,20 @@
 		return -EINVAL;
 	}
 
+	ret = of_property_read_string(node, RKMODULE_CAMERA_SYNC_MODE,
+				      &sync_mode_name);
+	if (ret) {
+		IMX464->sync_mode = NO_SYNC_MODE;
+		dev_err(dev, "could not get sync mode!\n");
+	} else {
+		if (strcmp(sync_mode_name, RKMODULE_EXTERNAL_MASTER_MODE) == 0)
+			IMX464->sync_mode = EXTERNAL_MASTER_MODE;
+		else if (strcmp(sync_mode_name, RKMODULE_INTERNAL_MASTER_MODE) == 0)
+			IMX464->sync_mode = INTERNAL_MASTER_MODE;
+		else if (strcmp(sync_mode_name, RKMODULE_SLAVE_MODE) == 0)
+			IMX464->sync_mode = SLAVE_MODE;
+	}
+
 	ret = of_property_read_u32(node, OF_CAMERA_HDR_MODE,
 			&hdr_mode);
 	if (ret) {
@@ -2516,15 +3212,32 @@
 		dev_warn(dev, " Get hdr mode failed! no hdr default\n");
 	}
 	IMX464->client = client;
+	endpoint = of_graph_get_next_endpoint(dev->of_node, NULL);
+	if (!endpoint) {
+		dev_err(dev, "Failed to get endpoint\n");
+		return -EINVAL;
+	}
+	ret = v4l2_fwnode_endpoint_parse(of_fwnode_handle(endpoint),
+		&IMX464->bus_cfg);
+	if (ret) {
+		dev_err(dev, "Failed to get bus cfg\n");
+		return ret;
+	}
+	if (IMX464->bus_cfg.bus.mipi_csi2.num_data_lanes == 4) {
+		IMX464->support_modes = supported_modes;
+		IMX464->cfg_num = ARRAY_SIZE(supported_modes);
+	} else {
+		IMX464->support_modes = supported_modes_2lane;
+		IMX464->cfg_num = ARRAY_SIZE(supported_modes_2lane);
+	}
 
-	IMX464->cfg_num = ARRAY_SIZE(supported_modes);
 	for (i = 0; i < IMX464->cfg_num; i++) {
-		if (hdr_mode == supported_modes[i].hdr_mode) {
-			IMX464->cur_mode = &supported_modes[i];
+		if (hdr_mode == IMX464->support_modes[i].hdr_mode) {
+			IMX464->cur_mode = &IMX464->support_modes[i];
 			break;
 		}
 	}
-	IMX464->cur_mode = &supported_modes[0];
+	IMX464->cur_mode = &IMX464->support_modes[0];
 	IMX464->xvclk = devm_clk_get(dev, "xvclk");
 	if (IS_ERR(IMX464->xvclk)) {
 		dev_err(dev, "Failed to get xvclk\n");
@@ -2610,7 +3323,6 @@
 	pm_runtime_enable(dev);
 	pm_runtime_idle(dev);
 
-	g_isHCG = false;
 #ifdef USED_SYS_DEBUG
 	add_sysfs_interfaces(dev);
 #endif
@@ -2655,6 +3367,7 @@
 #if IS_ENABLED(CONFIG_OF)
 static const struct of_device_id IMX464_of_match[] = {
 	{ .compatible = "sony,IMX464" },
+	{ .compatible = "sony,imx464" },
 	{},
 };
 MODULE_DEVICE_TABLE(of, IMX464_of_match);
@@ -2662,6 +3375,7 @@
 
 static const struct i2c_device_id IMX464_match_id[] = {
 	{ "sony,IMX464", 0 },
+	{ "sony,imx464", 0 },
 	{ },
 };
 
diff --git a/kernel/drivers/media/platform/rockchip/cif/capture.c b/kernel/drivers/media/platform/rockchip/cif/capture.c
index ac8b596..25c664d 100644
--- a/kernel/drivers/media/platform/rockchip/cif/capture.c
+++ b/kernel/drivers/media/platform/rockchip/cif/capture.c
@@ -553,18 +553,21 @@
 	case MEDIA_BUS_FMT_SGBRG8_1X8:
 	case MEDIA_BUS_FMT_SGRBG8_1X8:
 	case MEDIA_BUS_FMT_SRGGB8_1X8:
+	case MEDIA_BUS_FMT_Y8_1X8:
 		return 0x2a;
 	/* csi raw10 */
 	case MEDIA_BUS_FMT_SBGGR10_1X10:
 	case MEDIA_BUS_FMT_SGBRG10_1X10:
 	case MEDIA_BUS_FMT_SGRBG10_1X10:
 	case MEDIA_BUS_FMT_SRGGB10_1X10:
+	case MEDIA_BUS_FMT_Y10_1X10:
 		return 0x2b;
 	/* csi raw12 */
 	case MEDIA_BUS_FMT_SBGGR12_1X12:
 	case MEDIA_BUS_FMT_SGBRG12_1X12:
 	case MEDIA_BUS_FMT_SGRBG12_1X12:
 	case MEDIA_BUS_FMT_SRGGB12_1X12:
+	case MEDIA_BUS_FMT_Y12_1X12:
 		return 0x2c;
 	/* csi uyvy 422 */
 	case MEDIA_BUS_FMT_UYVY8_2X8:
@@ -2425,7 +2428,7 @@
 	int i;
 	unsigned long flags;
 
-	mutex_lock(&dev->stream_lock);
+	mutex_lock(&dev->hw_dev->dev_lock);
 
 	v4l2_info(&dev->v4l2_dev, "stream[%d] start stopping\n", stream->id);
 
@@ -2499,20 +2502,18 @@
 	if (dev->can_be_reset && can_reset) {
 		rkcif_do_cru_reset(dev);
 		dev->can_be_reset = false;
-		dev->reset_work_cancel = true;
+		hw_dev->reset_work_cancel = true;
 		hw_dev->hw_timer.is_running = false;
 		hw_dev->reset_info.is_need_reset = 0;
 	}
 	spin_unlock_irqrestore(&hw_dev->hw_timer.timer_lock, flags);
-
-	pm_runtime_put_sync(dev->dev);
 
 	if (!atomic_read(&dev->pipe.stream_cnt) && dev->dummy_buf.vaddr)
 		rkcif_destroy_dummy_buf(stream);
 
 	v4l2_info(&dev->v4l2_dev, "stream[%d] stopping finished\n", stream->id);
 
-	mutex_unlock(&dev->stream_lock);
+	mutex_unlock(&dev->hw_dev->dev_lock);
 }
 
 /*
@@ -3081,7 +3082,7 @@
 
 	v4l2_info(&dev->v4l2_dev, "stream[%d] start streaming\n", stream->id);
 
-	mutex_lock(&dev->stream_lock);
+	mutex_lock(&dev->hw_dev->dev_lock);
 
 	if (WARN_ON(stream->state != RKCIF_STATE_READY)) {
 		ret = -EBUSY;
@@ -3141,14 +3142,6 @@
 			v4l2_err(v4l2_dev, "Failed to create dummy_buf, %d\n", ret);
 			goto destroy_buf;
 		}
-	}
-
-	/* enable clocks/power-domains */
-	ret = pm_runtime_get_sync(dev->dev);
-	if (ret < 0) {
-		v4l2_err(v4l2_dev, "Failed to get runtime pm, %d\n",
-			 ret);
-		goto  destroy_buf;
 	}
 
 	ret = dev->pipe.open(&dev->pipe, &node->vdev.entity, true);
@@ -3218,7 +3211,8 @@
 		}
 	}
 
-	dev->reset_work_cancel = false;
+	if (dev->hw_dev->reset_work_cancel)
+		dev->hw_dev->reset_work_cancel = false;
 	if (dev->hdr.mode == NO_HDR)
 		stream->streamon_timestamp = ktime_get_ns();
 	goto out;
@@ -3246,7 +3240,7 @@
 	}
 
 out:
-	mutex_unlock(&dev->stream_lock);
+	mutex_unlock(&dev->hw_dev->dev_lock);
 	return ret;
 }
 
@@ -3524,6 +3518,13 @@
 		return ret;
 	}
 
+	/* enable clocks/power-domains */
+	ret = pm_runtime_get_sync(cifdev->dev);
+	if (ret < 0) {
+		v4l2_err(vdev, "Failed to get runtime pm, %d\n",
+			 ret);
+		return ret;
+	}
 	/*
 	 * Soft reset via CRU.
 	 * Because CRU would reset iommu too, so there's not chance
@@ -3574,6 +3575,7 @@
 	else if (atomic_read(&cifdev->fh_cnt) < 0)
 		atomic_set(&cifdev->fh_cnt, 0);
 	mutex_unlock(&cifdev->stream_lock);
+	pm_runtime_put_sync(cifdev->dev);
 
 	return ret;
 }
@@ -3584,6 +3586,9 @@
 	.unlocked_ioctl = video_ioctl2,
 	.poll = vb2_fop_poll,
 	.mmap = vb2_fop_mmap,
+#ifdef CONFIG_COMPAT
+	.compat_ioctl32 = video_ioctl2,
+#endif
 };
 
 static int rkcif_enum_input(struct file *file, void *priv,
@@ -3925,6 +3930,7 @@
 	int vc = 0;
 	struct rkcif_reset_info *reset_info;
 	int reset_src = 0;
+	unsigned long flags;
 
 	switch (cmd) {
 	case RKCIF_CMD_GET_CSI_MEMORY_MODE:
@@ -3967,12 +3973,16 @@
 		break;
 	case RKCIF_CMD_GET_RESET_INFO:
 		reset_info = (struct rkcif_reset_info *)arg;
+		spin_lock_irqsave(&dev->hw_dev->spin_lock, flags);
 		*reset_info = dev->hw_dev->reset_info;
-		if (dev->hw_dev->reset_info.is_need_reset)
-			dev->hw_dev->reset_info.is_need_reset = 0;
+		spin_unlock_irqrestore(&dev->hw_dev->spin_lock, flags);
 		break;
 	case RKCIF_CMD_SET_RESET:
 		reset_src = *(int *)arg;
+		spin_lock_irqsave(&dev->hw_dev->spin_lock, flags);
+		if (dev->hw_dev->reset_info.is_need_reset)
+			dev->hw_dev->reset_info.is_need_reset = 0;
+		spin_unlock_irqrestore(&dev->hw_dev->spin_lock, flags);
 		return rkcif_do_reset_work(dev, reset_src);
 	default:
 		return -EINVAL;
@@ -4789,6 +4799,7 @@
 	if (dev->irq_stats.csi_bwidth_lack_cnt) {
 		is_triggered = true;
 		dev->irq_stats.csi_bwidth_lack_cnt = 0;
+		v4l2_info(&dev->v4l2_dev, "reset for bandwidth lack\n");
 	}
 	if (dev->irq_stats.csi_overflow_cnt) {
 		is_triggered = true;
@@ -5402,7 +5413,6 @@
 
 	for (i = 0, j = 0; i < RKCIF_MAX_STREAM_MIPI; i++) {
 		stream = &cif_dev->stream[i];
-		mutex_lock(&cif_dev->stream_lock);
 		if (stream->state == RKCIF_STATE_STREAMING) {
 			stream_off_cnt++;
 
@@ -5422,9 +5432,7 @@
 					 stream->frame_idx,
 					 sof_cnt);
 
-				resume_info->frm_sync_seq = sof_cnt;
-				if (stream->frame_idx != sof_cnt)
-					stream->frame_idx = sof_cnt;
+				resume_info->frm_sync_seq = stream->frame_idx;
 			}
 
 			stream->state = RKCIF_STATE_RESET_IN_STREAMING;
@@ -5438,7 +5446,6 @@
 				 __func__, stream->id, stream->frame_idx, rkcif_csi2_get_sof());
 
 		}
-		mutex_unlock(&cif_dev->stream_lock);
 	}
 	if (!stream_off_cnt)
 		return 0;
@@ -5486,7 +5493,6 @@
 		stream = resume_stream[i];
 		if (stream == NULL || stream->state != RKCIF_STATE_RESET_IN_STREAMING)
 			break;
-		mutex_lock(&cif_dev->stream_lock);
 		stream_on_cnt++;
 		stream->fs_cnt_in_single_frame = 0;
 		if (stream->cif_fmt_in->field == V4L2_FIELD_INTERLACED) {
@@ -5514,7 +5520,6 @@
 		}
 		atomic_inc(&p->stream_cnt);
 		stream->streamon_timestamp = ktime_get_ns();
-		mutex_unlock(&cif_dev->stream_lock);
 		v4l2_dbg(1, rkcif_debug, &cif_dev->v4l2_dev,
 			 "resume stream[%d], frm_idx:%d, csi_sof:%d\n",
 			 stream->id, stream->frame_idx,
@@ -5552,11 +5557,9 @@
 
 	v4l2_dbg(1, rkcif_debug, &cif_dev->v4l2_dev, "do rkcif reset successfully!\n");
 
-	mutex_unlock(&cif_dev->stream_lock);
 	return 0;
 
 unlock_stream:
-	mutex_unlock(&cif_dev->stream_lock);
 	return ret;
 }
 
@@ -5570,8 +5573,13 @@
 	int i = 0;
 	int ret = 0;
 
-	v4l2_dbg(1, rkcif_debug, &cif_dev->v4l2_dev, "do rkcif reset\n");
+	v4l2_info(&cif_dev->v4l2_dev, "do rkcif reset\n");
 
+	mutex_lock(&cif_dev->hw_dev->dev_lock);
+	if (hw->reset_work_cancel) {
+		mutex_unlock(&hw->dev_lock);
+		return 0;
+	}
 	for (i = 0; i < hw->dev_num; i++) {
 		cifdev = hw->cif_dev[i];
 		resume_info[i] = &cifdev->reset_work.resume_info;
@@ -5585,13 +5593,7 @@
 
 	rkcif_do_cru_reset(cif_dev);
 
-	rkcif_disable_sys_clk(cif_dev->hw_dev);
-
-	udelay(5);
-
-	ret |= rkcif_enable_sys_clk(cif_dev->hw_dev);
-	if (ret < 0)
-		v4l2_err(&cif_dev->v4l2_dev, "%s:resume cif clk failed\n", __func__);
+	udelay(30);
 
 	for (i = 0; i < hw->dev_num; i++) {
 		cifdev = hw->cif_dev[i];
@@ -5607,8 +5609,8 @@
 	hw->hw_timer.is_running = false;
 	rkcif_monitor_reset_event(cif_dev->hw_dev);
 
-	v4l2_dbg(1, rkcif_debug, &cif_dev->v4l2_dev, "do rkcif reset successfully!\n");
-
+	v4l2_info(&cif_dev->v4l2_dev, "do rkcif reset successfully!\n");
+	mutex_unlock(&hw->dev_lock);
 	return ret;
 
 }
@@ -5710,8 +5712,10 @@
 		spin_unlock_irqrestore(&timer->csi2_err_lock, flags);
 	}
 	if (hw_timer->is_reset_by_user) {
+		spin_lock_irqsave(&hw->spin_lock, flags);
 		hw->reset_info.is_need_reset = 1;
 		hw->reset_info.reset_src = hw_timer->reset_src;
+		spin_unlock_irqrestore(&hw->spin_lock, flags);
 	} else {
 		dev->reset_work.reset_src = hw_timer->reset_src;
 		if (schedule_work(&dev->reset_work.work)) {
@@ -5762,8 +5766,10 @@
 			hw_timer->reset_src = RKCIF_RESET_SRC_ERR_HOTPLUG;
 			v4l2_subdev_call(terminal_sensor->sd, core, ioctl,
 					 RKMODULE_SET_VICAP_RST_INFO, &rst_info);
-			if (!is_reset && stream->cifdev->inf_id == RKCIF_MIPI_LVDS)
+			if (!is_reset && stream->cifdev->inf_id == RKCIF_MIPI_LVDS) {
+				hw_timer->reset_src = RKICF_RESET_SRC_ERR_CUTOFF;
 				is_reset = rkcif_is_csi2_err_trigger_reset(timer);
+			}
 		} else if (hw_timer->monitor_mode == RKCIF_MONITOR_MODE_CONTINUE) {
 			if (stream->cifdev->inf_id == RKCIF_MIPI_LVDS)
 				is_reset = rkcif_is_csi2_err_trigger_reset(timer);
@@ -5859,6 +5865,7 @@
 	int is_reset = 0;
 	int check_cnt = 0;
 	bool is_mod_timer = false;
+	struct rkmodule_vicap_reset_info rst_info;
 
 	for (i = 0; i < hw->dev_num; i++) {
 		dev = hw->cif_dev[i];
@@ -5867,7 +5874,16 @@
 							    &is_mod_timer);
 		if (is_reset)
 			break;
+	}
 
+	if (hw_timer->monitor_mode == RKCIF_MONITOR_MODE_HOTPLUG && is_reset) {
+		for (i = 0; i < hw->dev_num; i++) {
+			dev = hw->cif_dev[i];
+			rst_info.is_reset = 0;
+			if (dev->terminal_sensor.sd)
+				v4l2_subdev_call(dev->terminal_sensor.sd, core, ioctl,
+						 RKMODULE_SET_VICAP_RST_INFO, &rst_info);
+		}
 	}
 
 	if (!is_reset && is_mod_timer)
@@ -6069,6 +6085,7 @@
 	}
 }
 
+#define CSI_START_INTSTAT(id)		(0x3 << ((id) * 2))
 void rkcif_irq_pingpong(struct rkcif_device *cif_dev)
 {
 	struct rkcif_stream *stream;
@@ -6125,27 +6142,6 @@
 				 __func__);
 		}
 
-		if (intstat & CSI_FRAME0_START_ID0) {
-			if (mbus->type == V4L2_MBUS_CSI2)
-				rkcif_csi2_event_inc_sof();
-			else if (mbus->type == V4L2_MBUS_CCP2)
-				rkcif_lvds_event_inc_sof(cif_dev);
-			detect_stream->fs_cnt_in_single_frame++;
-			spin_lock_irqsave(&detect_stream->fps_lock, flags);
-			detect_stream->readout.fs_timestamp = ktime_get_ns();
-			spin_unlock_irqrestore(&detect_stream->fps_lock, flags);
-		}
-
-		if (intstat & CSI_FRAME1_START_ID0) {
-			if (mbus->type == V4L2_MBUS_CSI2)
-				rkcif_csi2_event_inc_sof();
-			else if (mbus->type == V4L2_MBUS_CCP2)
-				rkcif_lvds_event_inc_sof(cif_dev);
-			detect_stream->fs_cnt_in_single_frame++;
-			spin_lock_irqsave(&detect_stream->fps_lock, flags);
-			detect_stream->readout.fs_timestamp = ktime_get_ns();
-			spin_unlock_irqrestore(&detect_stream->fps_lock, flags);
-		}
 		for (i = 0; i < RKCIF_MAX_STREAM_MIPI; i++) {
 			if (intstat & CSI_LINE_INTSTAT(i)) {
 				stream = &cif_dev->stream[i];
@@ -6159,11 +6155,6 @@
 					 "%s: id0 cur line:%d\n", __func__, lastline & 0x3fff);
 			}
 		}
-
-		/* if do not reach frame dma end, return irq */
-		mipi_id = rkcif_csi_g_mipi_id(&cif_dev->v4l2_dev, intstat);
-		if (mipi_id < 0)
-			return;
 
 		for (i = 0; i < RKCIF_MAX_STREAM_MIPI; i++) {
 			mipi_id = rkcif_csi_g_mipi_id(&cif_dev->v4l2_dev,
@@ -6220,8 +6211,28 @@
 					detect_stream->fs_cnt_in_single_frame--;
 				}
 			}
+			cif_dev->irq_stats.all_frm_end_cnt++;
 		}
-		cif_dev->irq_stats.all_frm_end_cnt++;
+		for (i = 0; i < RKCIF_MAX_STREAM_MIPI; i++) {
+			if (intstat & CSI_START_INTSTAT(i)) {
+				stream = &cif_dev->stream[i];
+				if (i == 0) {
+					if (mbus->type == V4L2_MBUS_CSI2)
+						rkcif_csi2_event_inc_sof();
+					else if (mbus->type == V4L2_MBUS_CCP2)
+						rkcif_lvds_event_inc_sof(cif_dev);
+					stream->fs_cnt_in_single_frame++;
+					spin_lock_irqsave(&stream->fps_lock, flags);
+					stream->readout.fs_timestamp = ktime_get_ns();
+					spin_unlock_irqrestore(&stream->fps_lock, flags);
+				} else {
+					spin_lock_irqsave(&stream->fps_lock, flags);
+					stream->readout.fs_timestamp = ktime_get_ns();
+					spin_unlock_irqrestore(&stream->fps_lock, flags);
+				}
+			}
+		}
+
 	} else {
 		u32 lastline, lastpix, ctl;
 		u32 cif_frmst, frmid, int_en;
diff --git a/kernel/drivers/media/platform/rockchip/cif/dev.h b/kernel/drivers/media/platform/rockchip/cif/dev.h
index 1d84d1d..fa53396 100644
--- a/kernel/drivers/media/platform/rockchip/cif/dev.h
+++ b/kernel/drivers/media/platform/rockchip/cif/dev.h
@@ -524,7 +524,6 @@
 	unsigned int			wait_line_cache;
 	struct rkcif_dummy_buffer	dummy_buf;
 	bool				is_start_hdr;
-	bool				reset_work_cancel;
 	bool				iommu_en;
 	bool				is_use_dummybuf;
 };
diff --git a/kernel/drivers/media/platform/rockchip/cif/hw.c b/kernel/drivers/media/platform/rockchip/cif/hw.c
index a2bf0cb..328fb02 100644
--- a/kernel/drivers/media/platform/rockchip/cif/hw.c
+++ b/kernel/drivers/media/platform/rockchip/cif/hw.c
@@ -1039,6 +1039,7 @@
 	rkcif_hw_soft_reset(cif_hw, true);
 
 	mutex_init(&cif_hw->dev_lock);
+	spin_lock_init(&cif_hw->spin_lock);
 
 	pm_runtime_enable(&pdev->dev);
 	rkcif_init_reset_timer(cif_hw);
diff --git a/kernel/drivers/media/platform/rockchip/cif/hw.h b/kernel/drivers/media/platform/rockchip/cif/hw.h
index 18b663a..845545a 100644
--- a/kernel/drivers/media/platform/rockchip/cif/hw.h
+++ b/kernel/drivers/media/platform/rockchip/cif/hw.h
@@ -116,6 +116,8 @@
 	struct mutex			dev_lock;
 	struct rkcif_hw_timer		hw_timer;
 	struct rkcif_reset_info		reset_info;
+	spinlock_t			spin_lock;
+	bool				reset_work_cancel;
 };
 
 void rkcif_hw_soft_reset(struct rkcif_hw *cif_hw, bool is_rst_iommu);
diff --git a/kernel/drivers/media/platform/rockchip/isp/capture.c b/kernel/drivers/media/platform/rockchip/isp/capture.c
index 416d369..670acc1 100644
--- a/kernel/drivers/media/platform/rockchip/isp/capture.c
+++ b/kernel/drivers/media/platform/rockchip/isp/capture.c
@@ -364,9 +364,10 @@
 			continue;
 		for (j = RKISP_STREAM_DMATX0; j < RKISP_MAX_STREAM; j++) {
 			stream = &isp->cap_dev.stream[j];
-			if (!stream->linked || stream->u.dmatx.is_config)
+			if (!stream->linked || stream->curr_buf || stream->next_buf)
 				continue;
-			mi_set_y_addr(stream, hw->dummy_buf.dma_addr);
+			if (!rkisp_read(dev, stream->config->mi.y_base_ad_init, true))
+				mi_set_y_addr(stream, hw->dummy_buf.dma_addr);
 		}
 	}
 }
@@ -1082,6 +1083,9 @@
 	.unlocked_ioctl = video_ioctl2,
 	.poll = vb2_fop_poll,
 	.mmap = vb2_fop_mmap,
+#ifdef CONFIG_COMPAT
+	.compat_ioctl32 = video_ioctl2,
+#endif
 };
 
 /*
diff --git a/kernel/drivers/media/platform/rockchip/isp/capture_v21.c b/kernel/drivers/media/platform/rockchip/isp/capture_v21.c
index 79402c5..a243756 100644
--- a/kernel/drivers/media/platform/rockchip/isp/capture_v21.c
+++ b/kernel/drivers/media/platform/rockchip/isp/capture_v21.c
@@ -1046,14 +1046,7 @@
 {
 	void __iomem *base = stream->ispdev->base_addr;
 	struct rkisp_device *dev = stream->ispdev;
-	bool is_update = false;
 	int ret;
-
-	if (stream->id == RKISP_STREAM_MP || stream->id == RKISP_STREAM_SP) {
-		is_update = (stream->id == RKISP_STREAM_MP) ?
-			!dev->cap_dev.stream[RKISP_STREAM_SP].streaming :
-			!dev->cap_dev.stream[RKISP_STREAM_MP].streaming;
-	}
 
 	if (stream->ops->set_data_path)
 		stream->ops->set_data_path(base);
@@ -1064,9 +1057,6 @@
 	stream->ops->enable_mi(stream);
 	if (stream->id == RKISP_STREAM_MP || stream->id == RKISP_STREAM_SP)
 		hdr_config_dmatx(dev);
-	if (is_update)
-		dev->irq_ends_mask |=
-			(stream->id == RKISP_STREAM_MP) ? ISP_FRAME_MP : ISP_FRAME_SP;
 	stream->streaming = true;
 
 	return 0;
@@ -1217,6 +1207,22 @@
 	spin_unlock_irqrestore(&stream->vbq_lock, lock_flags);
 }
 
+static void rkisp_stop_streaming_tx(struct rkisp_stream *stream)
+{
+	struct rkisp_device *dev = stream->ispdev;
+
+	stream->stopping = true;
+	if (dev->isp_state & ISP_START &&
+	    !stream->ops->is_stream_stopped(dev->base_addr)) {
+		stream->ops->stop_mi(stream);
+		wait_event_timeout(stream->done, !stream->streaming,
+				   msecs_to_jiffies(300));
+	}
+	stream->stopping = false;
+	stream->streaming = false;
+	destroy_buf_queue(stream, VB2_BUF_STATE_ERROR);
+}
+
 static void rkisp_stop_streaming(struct vb2_queue *queue)
 {
 	struct rkisp_stream *stream = queue->drv_priv;
@@ -1225,24 +1231,23 @@
 	struct v4l2_device *v4l2_dev = &dev->v4l2_dev;
 	int ret;
 
-	mutex_lock(&dev->hw_dev->dev_lock);
-
 	v4l2_dbg(1, rkisp_debug, &dev->v4l2_dev,
 		 "%s %d\n", __func__, stream->id);
-
 	if (!stream->streaming)
-		goto end;
+		return;
+
+	if (stream->id != RKISP_STREAM_MP && stream->id != RKISP_STREAM_SP)
+		return rkisp_stop_streaming_tx(stream);
+
+	mutex_lock(&dev->hw_dev->dev_lock);
 
 	rkisp_stream_stop(stream);
-	if (stream->id == RKISP_STREAM_MP ||
-	    stream->id == RKISP_STREAM_SP) {
-		/* call to the other devices */
-		media_pipeline_stop(&node->vdev.entity);
-		ret = dev->pipe.set_stream(&dev->pipe, false);
-		if (ret < 0)
-			v4l2_err(v4l2_dev,
-				 "pipeline stream-off failed:%d\n", ret);
-	}
+	/* call to the other devices */
+	media_pipeline_stop(&node->vdev.entity);
+	ret = dev->pipe.set_stream(&dev->pipe, false);
+	if (ret < 0)
+		v4l2_err(v4l2_dev,
+			 "pipeline stream-off failed:%d\n", ret);
 
 	/* release buffers */
 	destroy_buf_queue(stream, VB2_BUF_STATE_ERROR);
@@ -1253,7 +1258,6 @@
 	rkisp_destroy_dummy_buf(stream);
 	atomic_dec(&dev->cap_dev.refcnt);
 
-end:
 	mutex_unlock(&dev->hw_dev->dev_lock);
 }
 
@@ -1296,6 +1300,25 @@
 }
 
 static int
+rkisp_start_streaming_tx(struct rkisp_stream *stream)
+{
+	struct rkisp_device *dev = stream->ispdev;
+	int ret = -1;
+
+	if (!dev->isp_inp || !stream->linked)
+		goto buffer_done;
+
+	ret = rkisp_stream_start(stream);
+	if (ret < 0)
+		goto buffer_done;
+	return 0;
+buffer_done:
+	destroy_buf_queue(stream, VB2_BUF_STATE_QUEUED);
+	stream->streaming = false;
+	return ret;
+}
+
+static int
 rkisp_start_streaming(struct vb2_queue *queue, unsigned int count)
 {
 	struct rkisp_stream *stream = queue->drv_priv;
@@ -1304,17 +1327,16 @@
 	struct v4l2_device *v4l2_dev = &dev->v4l2_dev;
 	int ret = -1;
 
-	mutex_lock(&dev->hw_dev->dev_lock);
-
 	v4l2_dbg(1, rkisp_debug, &dev->v4l2_dev,
 		 "%s %d\n", __func__, stream->id);
-
-	if (WARN_ON(stream->streaming)) {
-		mutex_unlock(&dev->hw_dev->dev_lock);
+	if (WARN_ON(stream->streaming))
 		return -EBUSY;
-	}
-
 	memset(&stream->dbg, 0, sizeof(stream->dbg));
+
+	if (stream->id != RKISP_STREAM_MP && stream->id != RKISP_STREAM_SP)
+		return rkisp_start_streaming_tx(stream);
+
+	mutex_lock(&dev->hw_dev->dev_lock);
 	atomic_inc(&dev->cap_dev.refcnt);
 	if (!dev->isp_inp || !stream->linked) {
 		v4l2_err(v4l2_dev, "check video link or isp input\n");
@@ -1364,19 +1386,16 @@
 		goto close_pipe;
 	}
 
-	if (stream->id == RKISP_STREAM_MP ||
-	    stream->id == RKISP_STREAM_SP) {
-		/* start sub-devices */
-		ret = dev->pipe.set_stream(&dev->pipe, true);
-		if (ret < 0)
-			goto stop_stream;
+	/* start sub-devices */
+	ret = dev->pipe.set_stream(&dev->pipe, true);
+	if (ret < 0)
+		goto stop_stream;
 
-		ret = media_pipeline_start(&node->vdev.entity, &dev->pipe.pipe);
-		if (ret < 0) {
-			v4l2_err(&dev->v4l2_dev,
-				 "start pipeline failed %d\n", ret);
-			goto pipe_stream_off;
-		}
+	ret = media_pipeline_start(&node->vdev.entity, &dev->pipe.pipe);
+	if (ret < 0) {
+		v4l2_err(&dev->v4l2_dev,
+			 "start pipeline failed %d\n", ret);
+		goto pipe_stream_off;
 	}
 
 	mutex_unlock(&dev->hw_dev->dev_lock);
@@ -1613,17 +1632,13 @@
 		stream = &dev->cap_dev.stream[RKISP_STREAM_MP];
 		if (!stream->streaming)
 			dev->irq_ends_mask &= ~ISP_FRAME_MP;
-		else
-			dev->irq_ends_mask |= ISP_FRAME_MP;
-		rkisp_check_idle(dev, ISP_FRAME_MP);
+		rkisp_check_idle(dev, ISP_FRAME_MP & dev->irq_ends_mask);
 	}
 	if (mis_val & CIF_MI_SP_FRAME) {
 		stream = &dev->cap_dev.stream[RKISP_STREAM_SP];
 		if (!stream->streaming)
 			dev->irq_ends_mask &= ~ISP_FRAME_SP;
-		else
-			dev->irq_ends_mask |= ISP_FRAME_SP;
-		rkisp_check_idle(dev, ISP_FRAME_SP);
+		rkisp_check_idle(dev, ISP_FRAME_SP & dev->irq_ends_mask);
 	}
 }
 
diff --git a/kernel/drivers/media/platform/rockchip/isp/dev.c b/kernel/drivers/media/platform/rockchip/isp/dev.c
index 64a4e74..0501a38 100644
--- a/kernel/drivers/media/platform/rockchip/isp/dev.c
+++ b/kernel/drivers/media/platform/rockchip/isp/dev.c
@@ -289,6 +289,12 @@
 				goto err_stream_off;
 		}
 	} else {
+		if (dev->hw_dev->monitor.is_en) {
+			dev->hw_dev->monitor.is_en = 0;
+			dev->hw_dev->monitor.state = ISP_STOP;
+			if (!completion_done(&dev->hw_dev->monitor.cmpl))
+				complete(&dev->hw_dev->monitor.cmpl);
+		}
 		/* sensor -> phy */
 		for (i = p->num_subdevs - 1; i >= 0; --i)
 			v4l2_subdev_call(p->subdevs[i], video, s_stream, on);
diff --git a/kernel/drivers/media/platform/rockchip/isp/dmarx.c b/kernel/drivers/media/platform/rockchip/isp/dmarx.c
index d65662b..4529eb1 100644
--- a/kernel/drivers/media/platform/rockchip/isp/dmarx.c
+++ b/kernel/drivers/media/platform/rockchip/isp/dmarx.c
@@ -443,8 +443,7 @@
 		list_del(&stream->curr_buf->queue);
 	}
 
-	if (stream->streaming)
-		stream->ops->update_mi(stream);
+	stream->ops->update_mi(stream);
 	spin_unlock_irqrestore(&stream->vbq_lock, lock_flags);
 	return 0;
 }
@@ -786,6 +785,9 @@
 	.unlocked_ioctl = video_ioctl2,
 	.poll = vb2_fop_poll,
 	.mmap = vb2_fop_mmap,
+#ifdef CONFIG_COMPAT
+	.compat_ioctl32 = video_ioctl2,
+#endif
 };
 
 static int rkisp_try_fmt_vid_out_mplane(struct file *file, void *fh,
diff --git a/kernel/drivers/media/platform/rockchip/isp/hw.c b/kernel/drivers/media/platform/rockchip/isp/hw.c
index 60aa895..5e17cee 100644
--- a/kernel/drivers/media/platform/rockchip/isp/hw.c
+++ b/kernel/drivers/media/platform/rockchip/isp/hw.c
@@ -551,6 +551,9 @@
 		rockchip_iommu_disable(dev->dev);
 		rockchip_iommu_enable(dev->dev);
 	}
+
+	if (dev->isp_ver == ISP_V21)
+		writel(readl(base + MI_RD_CTRL2) | BIT(30), base + MI_RD_CTRL2);
 }
 
 static void isp_config_clk(struct rkisp_hw_dev *dev, int on)
diff --git a/kernel/drivers/media/platform/rockchip/isp/isp_ispp.h b/kernel/drivers/media/platform/rockchip/isp/isp_ispp.h
index 6ebb89f..f39f177 100644
--- a/kernel/drivers/media/platform/rockchip/isp/isp_ispp.h
+++ b/kernel/drivers/media/platform/rockchip/isp/isp_ispp.h
@@ -40,6 +40,10 @@
 	DEV_ID1,
 	DEV_ID2,
 	DEV_ID3,
+	DEV_ID4,
+	DEV_ID5,
+	DEV_ID6,
+	DEV_ID7,
 	DEV_MAX,
 };
 
diff --git a/kernel/drivers/media/platform/rockchip/isp/isp_params.h b/kernel/drivers/media/platform/rockchip/isp/isp_params.h
index 89b3e78..2efa308 100644
--- a/kernel/drivers/media/platform/rockchip/isp/isp_params.h
+++ b/kernel/drivers/media/platform/rockchip/isp/isp_params.h
@@ -67,7 +67,7 @@
 	enum v4l2_quantization quantization;
 	enum rkisp_fmt_raw_pat_type raw_type;
 	u32 in_mbus_code;
-
+	u32 cur_frame_id;
 	struct preisp_hdrae_para_s hdrae_para;
 
 	struct rkisp_isp_params_ops *ops;
diff --git a/kernel/drivers/media/platform/rockchip/isp/isp_params_v21.c b/kernel/drivers/media/platform/rockchip/isp/isp_params_v21.c
index 4f43539..a1592d8 100644
--- a/kernel/drivers/media/platform/rockchip/isp/isp_params_v21.c
+++ b/kernel/drivers/media/platform/rockchip/isp/isp_params_v21.c
@@ -3649,6 +3649,7 @@
 		(struct rkisp_isp_params_v21_ops *)params_vdev->priv_ops;
 	u64 module_cfg_update = new_params->module_cfg_update;
 
+	params_vdev->cur_frame_id = new_params->frame_id;
 	if (type == RKISP_PARAMS_SHD)
 		return;
 
diff --git a/kernel/drivers/media/platform/rockchip/isp/isp_stats_v21.c b/kernel/drivers/media/platform/rockchip/isp/isp_stats_v21.c
index c51e823..98e27c6 100644
--- a/kernel/drivers/media/platform/rockchip/isp/isp_stats_v21.c
+++ b/kernel/drivers/media/platform/rockchip/isp/isp_stats_v21.c
@@ -940,6 +940,7 @@
 	struct rkisp_isp21_stat_buffer *cur_stat_buf = NULL;
 	struct rkisp_stats_v21_ops *ops =
 		(struct rkisp_stats_v21_ops *)stats_vdev->priv_ops;
+	struct rkisp_isp_params_vdev *params_vdev = &stats_vdev->dev->params_vdev;
 	int ret = 0;
 
 	cur_frame_id = meas_work->frame_id;
@@ -958,6 +959,7 @@
 		cur_stat_buf =
 			(struct rkisp_isp21_stat_buffer *)(cur_buf->vaddr[0]);
 		cur_stat_buf->frame_id = cur_frame_id;
+		cur_stat_buf->params_id = params_vdev->cur_frame_id;
 	}
 
 	if (meas_work->isp_ris & ISP2X_AFM_SUM_OF)
diff --git a/kernel/drivers/media/platform/rockchip/isp/regs_v2x.h b/kernel/drivers/media/platform/rockchip/isp/regs_v2x.h
index a2c8ef1..d6cf58e 100644
--- a/kernel/drivers/media/platform/rockchip/isp/regs_v2x.h
+++ b/kernel/drivers/media/platform/rockchip/isp/regs_v2x.h
@@ -2697,8 +2697,6 @@
 		is_direct = false;
 	rkisp_write(stream->ispdev, stream->config->mi.length,
 		    stream->out_fmt.plane_fmt[0].bytesperline, is_direct);
-	if (stream->ispdev->isp_ver == ISP_V21)
-		rkisp_set_bits(stream->ispdev, MI_RD_CTRL2, 0, BIT(30), false);
 }
 
 static inline void rx_force_upd(void __iomem *base)
diff --git a/kernel/drivers/media/platform/rockchip/isp/rkisp.c b/kernel/drivers/media/platform/rockchip/isp/rkisp.c
index 3350646..f65e7e7 100644
--- a/kernel/drivers/media/platform/rockchip/isp/rkisp.c
+++ b/kernel/drivers/media/platform/rockchip/isp/rkisp.c
@@ -608,6 +608,17 @@
 	if (is_3dlut_upd)
 		rkisp_write(dev, ISP_3DLUT_UPDATE, 1, true);
 
+	/* if output stream enable, wait it end */
+	val = rkisp_read(dev, CIF_MI_CTRL_SHD, true);
+	if (val & CIF_MI_CTRL_SHD_MP_OUT_ENABLED)
+		dev->irq_ends_mask |= ISP_FRAME_MP;
+	else
+		dev->irq_ends_mask &= ~ISP_FRAME_MP;
+	if (val & CIF_MI_CTRL_SHD_SP_OUT_ENABLED)
+		dev->irq_ends_mask |= ISP_FRAME_SP;
+	else
+		dev->irq_ends_mask &= ~ISP_FRAME_SP;
+
 	memset(dev->filt_state, 0, sizeof(dev->filt_state));
 	dev->filt_state[RDBK_F_VS] = dma2frm;
 
@@ -735,12 +746,27 @@
 		if (!completion_done(&dev->hw_dev->monitor.cmpl))
 			complete(&dev->hw_dev->monitor.cmpl);
 	}
-	if (dev->irq_ends != dev->irq_ends_mask || !IS_HDR_RDBK(dev->rd_mode))
+	if ((dev->irq_ends & dev->irq_ends_mask) != dev->irq_ends_mask ||
+	    !IS_HDR_RDBK(dev->rd_mode))
 		return;
 
-	if (!(dev->irq_ends_mask & (ISP_FRAME_MP | ISP_FRAME_SP | ISP_FRAME_MPFBC)))
-		dev->isp_state = ISP_STOP;
+	/* check output stream is off */
+	val = ISP_FRAME_MP | ISP_FRAME_SP | ISP_FRAME_MPFBC;
+	if (!(dev->irq_ends_mask & val)) {
+		u32 state = dev->isp_state;
+		struct rkisp_stream *s;
 
+		for (val = 0; val <= RKISP_STREAM_SP; val++) {
+			s = &dev->cap_dev.stream[val];
+			dev->isp_state = ISP_STOP;
+			if (s->streaming) {
+				dev->isp_state = state;
+				break;
+			}
+		}
+	}
+
+	val = 0;
 	dev->irq_ends = 0;
 	switch (dev->rd_mode) {
 	case HDR_RDBK_FRAME3://for rd1 rd0 rd2
@@ -754,8 +780,6 @@
 		/* FALLTHROUGH */
 	}
 	rkisp2_rawrd_isr(val, dev);
-	if (!(dev->irq_ends_mask & (ISP_FRAME_MP | ISP_FRAME_SP | ISP_FRAME_MPFBC)))
-		dev->isp_state = ISP_STOP;
 	if (dev->dmarx_dev.trigger == T_MANUAL)
 		rkisp_rdbk_trigger_event(dev, T_CMD_END, NULL);
 	if (dev->isp_state == ISP_STOP)
@@ -1382,6 +1406,10 @@
 		ret = -EINVAL;
 	}
 
+	/* fix 3a_wr no output with selfpath */
+	if (dev->isp_ver == ISP_V21)
+		dpcl |= CIF_VI_DPCL_CHAN_MODE_MP | CIF_VI_DPCL_MP_MUX_MRSZ_MI;
+
 	writel(dpcl, dev->base_addr + CIF_VI_DPCL);
 
 	return ret;
@@ -1483,13 +1511,6 @@
 
 	if (atomic_read(&dev->hw_dev->refcnt) > 1)
 		goto end;
-
-	if (dev->hw_dev->monitor.is_en) {
-		dev->hw_dev->monitor.is_en = 0;
-		dev->hw_dev->monitor.state = ISP_STOP;
-		if (!completion_done(&dev->hw_dev->monitor.cmpl))
-			complete(&dev->hw_dev->monitor.cmpl);
-	}
 	/*
 	 * ISP(mi) stop in mi frame end -> Stop ISP(mipi) ->
 	 * Stop ISP(isp) ->wait for ISP isp off
@@ -2241,7 +2262,7 @@
 	if (dev->hw_dev->is_single) {
 		for (i = 0; i < RKISP_MAX_STREAM; i++) {
 			stream = &dev->cap_dev.stream[i];
-			if (stream->streaming)
+			if (stream->streaming && !stream->next_buf)
 				stream->ops->frame_end(stream);
 		}
 	}
@@ -2252,7 +2273,6 @@
 	struct rkisp_device *isp_dev = sd_to_isp_dev(sd);
 
 	if (!on) {
-		rkisp_stop_3a_run(isp_dev);
 		wait_event_timeout(isp_dev->sync_onoff,
 			isp_dev->irq_ends_mask == (ISP_FRAME_END | ISP_FRAME_IN) &&
 			(!IS_HDR_RDBK(isp_dev->rd_mode) ||
@@ -2260,6 +2280,7 @@
 		rkisp_isp_stop(isp_dev);
 		atomic_dec(&isp_dev->hw_dev->refcnt);
 		rkisp_params_stream_stop(&isp_dev->params_vdev);
+		rkisp_stop_3a_run(isp_dev);
 		return 0;
 	}
 
diff --git a/kernel/drivers/media/platform/rockchip/isp1/rkisp1.c b/kernel/drivers/media/platform/rockchip/isp1/rkisp1.c
index 07246bc..f96fa83 100644
--- a/kernel/drivers/media/platform/rockchip/isp1/rkisp1.c
+++ b/kernel/drivers/media/platform/rockchip/isp1/rkisp1.c
@@ -1476,7 +1476,7 @@
 		}
 	} else {
 		rkisp1_config_clk(isp_dev, on);
-		ret = pm_runtime_put(isp_dev->dev);
+		ret = pm_runtime_put_sync(isp_dev->dev);
 		if (ret < 0)
 			return ret;
 	}
diff --git a/kernel/drivers/media/spi/ms41908.c b/kernel/drivers/media/spi/ms41908.c
index 93f452b..92598a1 100644
--- a/kernel/drivers/media/spi/ms41908.c
+++ b/kernel/drivers/media/spi/ms41908.c
@@ -289,6 +289,7 @@
 	}
 	ext_dev->is_running = true;
 	reinit_completion(&ext_dev->complete);
+	reinit_completion(&ext_dev->complete_out);
 
 	if (ext_dev->is_dir_opp) {
 		if (pos > ext_dev->last_pos) {
@@ -1239,7 +1240,6 @@
 	unsigned long ret = 0;
 
 	if (dev->is_running) {
-		reinit_completion(&dev->complete_out);
 		ret = wait_for_completion_timeout(&dev->complete_out, 10 * HZ);
 		if (ret == 0)
 			dev_info(&motor->spi->dev,
@@ -2560,8 +2560,9 @@
 					       (motor->piris->run_data.psum * 24);
 		motor->piris->is_running = false;
 		dev_info(&motor->spi->dev,
-			 "piris vd_fz_period_us %u, inict %d\n",
+			 "piris vd_fz_period_us %u, psum %d, inict %d\n",
 			 motor->vd_fz_period_us,
+			 motor->piris->run_data.psum,
 			 motor->piris->run_data.intct);
 	}
 	if (motor->is_use_focus) {
@@ -2580,8 +2581,9 @@
 		motor->focus->is_running = false;
 		motor->focus->reback_ctrl = false;
 		dev_info(&motor->spi->dev,
-			 "focus vd_fz_period_us %u, inict %d\n",
+			 "focus vd_fz_period_us %u, psum %d, inict %d\n",
 			 motor->vd_fz_period_us,
+			 motor->focus->run_data.psum,
 			 motor->focus->run_data.intct);
 		if (motor->focus->reback != 0) {
 			motor->focus->cur_back_delay = 0;
@@ -2619,7 +2621,6 @@
 		motor->zoom->mv_tim.vcm_end_t = ns_to_timeval(ktime_get_ns());
 		init_completion(&motor->zoom->complete);
 		init_completion(&motor->zoom->complete_out);
-		motor->vd_fz_period_us = VD_FZ_US;
 		motor->zoom->run_data.psum = motor->vd_fz_period_us *
 					     motor->zoom->start_up_speed * 8 / 1000000;
 		motor->zoom->run_data.intct = 27 * motor->vd_fz_period_us /
@@ -2653,8 +2654,9 @@
 			motor->zoom->reback_move_time_us = reback_vd_cnt * (motor->vd_fz_period_us + 500);
 		}
 		dev_info(&motor->spi->dev,
-			 "zoom vd_fz_period_us %u, inict %d\n",
+			 "zoom vd_fz_period_us %u, psum %d, inict %d\n",
 			 motor->vd_fz_period_us,
+			 motor->zoom->run_data.psum,
 			 motor->zoom->run_data.intct);
 	}
 	if (motor->is_use_zoom1) {
@@ -2666,7 +2668,6 @@
 		motor->zoom1->mv_tim.vcm_end_t = ns_to_timeval(ktime_get_ns());
 		init_completion(&motor->zoom1->complete);
 		init_completion(&motor->zoom1->complete_out);
-		motor->vd_fz_period_us = VD_FZ_US;
 		motor->zoom1->run_data.psum = motor->vd_fz_period_us *
 					      motor->zoom1->start_up_speed * 8 / 1000000;
 		motor->zoom1->run_data.intct = 27 * motor->vd_fz_period_us /
@@ -2674,8 +2675,9 @@
 		motor->zoom1->is_running = false;
 		motor->zoom1->reback_ctrl = false;
 		dev_info(&motor->spi->dev,
-			 "zoom1 vd_fz_period_us %u, inict %d\n",
+			 "zoom1 vd_fz_period_us %u, psum %d, inict %d\n",
 			 motor->vd_fz_period_us,
+			 motor->zoom1->run_data.psum,
 			 motor->zoom1->run_data.intct);
 	}
 
diff --git a/kernel/drivers/mfd/fusb302.c b/kernel/drivers/mfd/fusb302.c
index 205739f..1044b59 100644
--- a/kernel/drivers/mfd/fusb302.c
+++ b/kernel/drivers/mfd/fusb302.c
@@ -17,6 +17,8 @@
 #include <linux/of_gpio.h>
 #include <linux/regmap.h>
 #include <linux/power_supply.h>
+#include <linux/kthread.h>
+#include <uapi/linux/sched/types.h>
 
 #include "fusb302.h"
 
@@ -188,12 +190,12 @@
 			break;
 		case 1:
 			/* Battery */
-			if ((CAP_VPDO_VOLTAGE(chip->rec_load[i]) * 50) <=
+			if ((CAP_VPDO_MAX_VOLTAGE(chip->rec_load[i]) * 50) <=
 			    max_vol &&
 			    (CAP_VPDO_CURRENT(chip->rec_load[i]) * 10) <=
 			    max_cur) {
 				chip->pos_power = i + 1;
-				tmp = CAP_VPDO_VOLTAGE(chip->rec_load[i]);
+				tmp = CAP_VPDO_MAX_VOLTAGE(chip->rec_load[i]);
 				chip->pd_output_vol = tmp * 50;
 				tmp = CAP_VPDO_CURRENT(chip->rec_load[i]);
 				chip->pd_output_cur = tmp * 10;
@@ -929,6 +931,7 @@
 static void set_mesg(struct fusb30x_chip *chip, int cmd, int is_DMT)
 {
 	int i;
+	uint32_t rec_load;
 	struct PD_CAP_INFO *pd_cap_info = &chip->pd_cap_info;
 
 	chip->send_head = ((chip->msg_id & 0x7) << 9) |
@@ -962,23 +965,62 @@
 					    (0 << 25) |
 					    (0 << 24);
 
-			switch (CAP_POWER_TYPE(chip->rec_load[chip->pos_power - 1])) {
+			rec_load = chip->rec_load[chip->pos_power - 1];
+			switch (CAP_POWER_TYPE(rec_load)) {
 			case 0:
 				/* Fixed Supply */
-				chip->send_load[0] |= ((CAP_FPDO_VOLTAGE(chip->rec_load[chip->pos_power - 1]) << 10) & 0x3ff);
-				chip->send_load[0] |= (CAP_FPDO_CURRENT(chip->rec_load[chip->pos_power - 1]) & 0x3ff);
+				chip->sink_supply_type = 0;
+				chip->sink_volt = CAP_FPDO_VOLTAGE(rec_load);
+				chip->sink_opr_cur = CAP_FPDO_CURRENT(rec_load);
+				chip->send_load[0] |= chip->sink_volt << 10;
+				chip->send_load[0] |= chip->sink_opr_cur;
 				break;
 			case 1:
-				/* Battery */
-				chip->send_load[0] |= ((CAP_VPDO_VOLTAGE(chip->rec_load[chip->pos_power - 1]) << 10) & 0x3ff);
-				chip->send_load[0] |= (CAP_VPDO_CURRENT(chip->rec_load[chip->pos_power - 1]) & 0x3ff);
+				/* Battery Supply */
+				chip->sink_supply_type = 1;
+				chip->sink_max_volt =
+					CAP_VPDO_MAX_VOLTAGE(rec_load);
+				chip->sink_min_volt =
+					CAP_VPDO_MIN_VOLTAGE(rec_load);
+				chip->sink_opr_power =
+					CAP_VPDO_CURRENT(rec_load);
+				chip->send_load[0] |= chip->sink_max_volt << 20;
+				chip->send_load[0] |= chip->sink_min_volt << 10;
+				chip->send_load[0] |= chip->sink_opr_power;
 				break;
 			default:
-				/* not meet battery caps */
+				dev_warn(chip->dev, "No support supply req type %d\n",
+					 CAP_POWER_TYPE(rec_load));
 				break;
 			}
 			break;
 		case DMT_SINKCAPABILITIES:
+			chip->send_head |= (1 << 12) | (cmd & 0xf);
+			switch (chip->sink_supply_type) {
+			case 0:
+				/*
+				 * Fixed Supply
+				 * bit26 for 'USB Communiications Capable'
+				 */
+				chip->send_load[0] =
+					(chip->sink_supply_type << 30) |
+					(1 << 26) |
+					(chip->sink_volt << 10) |
+					(chip->sink_opr_cur);
+				break;
+			case 1:
+				/* Battery Supply */
+				chip->send_load[0] =
+					(chip->sink_supply_type << 30) |
+					(chip->sink_max_volt << 20) |
+					(chip->sink_min_volt << 10) |
+					(chip->sink_opr_cur);
+				break;
+			default:
+				dev_warn(chip->dev, "No support sink supply type %d\n",
+					 chip->sink_supply_type);
+				break;
+			}
 			break;
 		case DMT_VENDERDEFINED:
 			break;
@@ -2529,7 +2571,7 @@
 			break;
 		case 1:
 			/* Battery */
-			if (CAP_VPDO_VOLTAGE(chip->rec_load[tmp]) <= 100)
+			if (CAP_VPDO_MAX_VOLTAGE(chip->rec_load[tmp]) <= 100)
 				chip->pos_power = tmp + 1;
 			break;
 		default:
@@ -2620,6 +2662,14 @@
 			chip->notify.is_pd_connected = true;
 			dev_info(chip->dev,
 				 "PD connected as UFP, fetching 5V\n");
+			tcpm_get_message(chip);
+			if (PACKET_IS_CONTROL_MSG(chip->rec_head,
+						  CMT_GETSINKCAP)) {
+				set_mesg(chip, DMT_SINKCAPABILITIES,
+					 DATAMESSAGE);
+				chip->tx_state = tx_idle;
+				policy_send_data(chip);
+			}
 			set_state(chip, policy_snk_ready);
 		} else if (PACKET_IS_DATA_MSG(chip->rec_head,
 					      DMT_SOURCECAPABILITIES)) {
@@ -2671,7 +2721,12 @@
 static void fusb_state_snk_ready(struct fusb30x_chip *chip, u32 evt)
 {
 	if (evt & EVENT_RX) {
-		if (PACKET_IS_DATA_MSG(chip->rec_head, DMT_VENDERDEFINED)) {
+		if (PACKET_IS_CONTROL_MSG(chip->rec_head, CMT_GETSINKCAP)) {
+			set_mesg(chip, DMT_SINKCAPABILITIES, DATAMESSAGE);
+			chip->tx_state = tx_idle;
+			policy_send_data(chip);
+		} else if (PACKET_IS_DATA_MSG(chip->rec_head,
+					      DMT_VENDERDEFINED)) {
 			process_vdm_msg(chip);
 			chip->work_continue |= EVENT_WORK_CONTINUE;
 			chip->timer_state = T_DISABLED;
@@ -3189,22 +3244,22 @@
 
 BACK:
 	if (chip->work_continue) {
-		queue_work(chip->fusb30x_wq, &chip->work);
+		kthread_queue_work(chip->irq_worker, &chip->irq_work);
 		return;
 	}
 
 	if (!platform_get_device_irq_state(chip))
 		fusb_irq_enable(chip);
 	else
-		queue_work(chip->fusb30x_wq, &chip->work);
+		kthread_queue_work(chip->irq_worker, &chip->irq_work);
 }
 
 static irqreturn_t cc_interrupt_handler(int irq, void *dev_id)
 {
 	struct fusb30x_chip *chip = dev_id;
 
-	queue_work(chip->fusb30x_wq, &chip->work);
 	fusb_irq_disable(chip);
+	kthread_queue_work(chip->irq_worker, &chip->irq_work);
 	return IRQ_HANDLED;
 }
 
@@ -3266,8 +3321,8 @@
 	}
 
 	if (i != fusb30x_port_used)
-		queue_work(fusb30x_port_info[i]->fusb30x_wq,
-			   &fusb30x_port_info[i]->work);
+		kthread_queue_work(fusb30x_port_info[i]->irq_worker,
+				   &fusb30x_port_info[i]->irq_work);
 
 	return HRTIMER_NORESTART;
 }
@@ -3286,11 +3341,11 @@
 	chip->timer_mux = T_DISABLED;
 }
 
-static void fusb302_work_func(struct work_struct *work)
+static void fusb302_work_func(struct kthread_work *work)
 {
 	struct fusb30x_chip *chip;
 
-	chip = container_of(work, struct fusb30x_chip, work);
+	chip = container_of(work, struct fusb30x_chip, irq_work);
 	if (!chip->suspended)
 		state_machine_typec(chip);
 }
@@ -3300,6 +3355,7 @@
 {
 	struct fusb30x_chip *chip;
 	struct PD_CAP_INFO *pd_cap_info;
+	struct sched_param param = { .sched_priority = MAX_RT_PRIO - 1 };
 	int ret;
 	char *string[2];
 
@@ -3326,8 +3382,11 @@
 
 	fusb_initialize_timer(chip);
 
-	chip->fusb30x_wq = create_workqueue("fusb302_wq");
-	INIT_WORK(&chip->work, fusb302_work_func);
+	chip->irq_worker = kthread_create_worker(0, dev_name(chip->dev));
+	if (IS_ERR(chip->irq_worker))
+		return PTR_ERR(chip->irq_worker);
+	sched_setscheduler_nocheck(chip->irq_worker->task, SCHED_FIFO, &param);
+	kthread_init_work(&chip->irq_work, fusb302_work_func);
 
 	chip->role = ROLE_MODE_NONE;
 	chip->try_role = ROLE_MODE_NONE;
@@ -3368,6 +3427,8 @@
 	chip->n_caps_used = 1;
 	chip->source_power_supply[0] = 0x64;
 	chip->source_max_current[0] = 0x96;
+	chip->sink_volt = 100;
+	chip->sink_opr_cur = 200;
 
 	pd_cap_info = &chip->pd_cap_info;
 	pd_cap_info->dual_role_power = 1;
@@ -3468,13 +3529,8 @@
 		goto IRQ_ERR;
 	}
 
-	ret = devm_request_threaded_irq(&client->dev,
-					chip->gpio_int_irq,
-					NULL,
-					cc_interrupt_handler,
-					IRQF_ONESHOT | IRQF_TRIGGER_LOW,
-					client->name,
-					chip);
+	ret = request_irq(chip->gpio_int_irq, cc_interrupt_handler,
+			  IRQF_TRIGGER_LOW, "fsc_interrupt_int_n", chip);
 	if (ret) {
 		dev_err(&client->dev, "irq request failed\n");
 		goto IRQ_ERR;
@@ -3503,7 +3559,7 @@
 	}
 	return 0;
 IRQ_ERR:
-	destroy_workqueue(chip->fusb30x_wq);
+	kthread_destroy_worker(chip->irq_worker);
 	return ret;
 }
 
@@ -3511,7 +3567,8 @@
 {
 	struct fusb30x_chip *chip = i2c_get_clientdata(client);
 
-	destroy_workqueue(chip->fusb30x_wq);
+	free_irq(chip->gpio_int_irq, chip);
+	kthread_destroy_worker(chip->irq_worker);
 	return 0;
 }
 
@@ -3534,7 +3591,7 @@
 
 	fusb_irq_disable(chip);
 	chip->suspended = true;
-	cancel_work_sync(&chip->work);
+	kthread_cancel_work_sync(&chip->irq_work);
 
 	return 0;
 }
@@ -3545,7 +3602,7 @@
 
 	fusb_irq_enable(chip);
 	chip->suspended = false;
-	queue_work(chip->fusb30x_wq, &chip->work);
+	kthread_queue_work(chip->irq_worker, &chip->irq_work);
 
 	return 0;
 }
diff --git a/kernel/drivers/mfd/fusb302.h b/kernel/drivers/mfd/fusb302.h
index 749bff8..9b162f5 100644
--- a/kernel/drivers/mfd/fusb302.h
+++ b/kernel/drivers/mfd/fusb302.h
@@ -411,7 +411,8 @@
 
 #define CAP_POWER_TYPE(PDO)		((PDO >> 30) & 3)
 #define CAP_FPDO_VOLTAGE(PDO)		((PDO >> 10) & 0x3ff)
-#define CAP_VPDO_VOLTAGE(PDO)		((PDO >> 20) & 0x3ff)
+#define CAP_VPDO_MAX_VOLTAGE(PDO)	((PDO >> 20) & 0x3ff)
+#define CAP_VPDO_MIN_VOLTAGE(PDO)	((PDO >> 10) & 0x3ff)
 #define CAP_FPDO_CURRENT(PDO)		((PDO >> 0) & 0x3ff)
 #define CAP_VPDO_CURRENT(PDO)		((PDO >> 0) & 0x3ff)
 
@@ -481,8 +482,8 @@
 	struct i2c_client *client;
 	struct device *dev;
 	struct regmap *regmap;
-	struct work_struct work;
-	struct workqueue_struct *fusb30x_wq;
+	struct kthread_work irq_work;
+	struct kthread_worker *irq_worker;
 	struct hrtimer timer_state_machine;
 	struct hrtimer timer_mux_machine;
 	struct PD_CAP_INFO pd_cap_info;
@@ -524,10 +525,19 @@
 	int msg_id;
 	enum tx_state tx_state;
 	int hardrst_count;
-	u32 source_power_supply[7];
 	/* 50mv unit */
-	u32 source_max_current[7];
+	u32 source_power_supply[7];
 	/* 10ma uint*/
+	u32 source_max_current[7];
+	/* Fixed supply = 0, Battery supply = 1 */
+	u32 sink_supply_type;
+	/* Sink Fixed Supply */
+	u32 sink_volt;
+	u32 sink_opr_cur;
+	/* Sink Battery Supply */
+	u32 sink_max_volt;
+	u32 sink_min_volt;
+	u32 sink_opr_power;
 	int pos_power;
 	/*
 	 * if PartnerCap[0] == 0xffffffff
diff --git a/kernel/drivers/misc/Kconfig b/kernel/drivers/misc/Kconfig
index a575ad1..4bf0664 100644
--- a/kernel/drivers/misc/Kconfig
+++ b/kernel/drivers/misc/Kconfig
@@ -76,8 +76,7 @@
 	  are combined to make a single 32-bit timer.
 
 	  When GENERIC_CLOCKEVENTS is defined, the third timer channel
-	  may be used as a clock event device supporting oneshot mode
-	  (delays of up to two seconds) based on the 32 KiHz clock.
+	  may be used as a clock event device supporting oneshot mode.
 
 config ATMEL_TCB_CLKSRC_BLOCK
 	int
@@ -90,6 +89,15 @@
 	  TC can be used for other purposes, such as PWM generation and
 	  interval timing.
 
+config ATMEL_TCB_CLKSRC_USE_SLOW_CLOCK
+	bool "TC Block use 32 KiHz clock"
+	depends on ATMEL_TCB_CLKSRC
+	default y
+	help
+	  Select this to use 32 KiHz base clock rate as TC block clock
+	  source for clock events.
+
+
 config DUMMY_IRQ
 	tristate "Dummy IRQ handler"
 	default n
diff --git a/kernel/drivers/misc/Makefile b/kernel/drivers/misc/Makefile
index f516b9a..6f30411 100644
--- a/kernel/drivers/misc/Makefile
+++ b/kernel/drivers/misc/Makefile
@@ -62,5 +62,4 @@
 obj-$(CONFIG_UID_SYS_STATS)	+= uid_sys_stats.o
 obj-$(CONFIG_PIR_ASCHIP)	+= pir-aschip.o
 obj-$(CONFIG_RK803)		+= rk803.o
-obj-y += nkio/
-obj-y += nkmcu/
+obj-y				+= nkio/
diff --git a/kernel/drivers/misc/eeprom/at24.c b/kernel/drivers/misc/eeprom/at24.c
index dde0b45..dc35376 100644
--- a/kernel/drivers/misc/eeprom/at24.c
+++ b/kernel/drivers/misc/eeprom/at24.c
@@ -6,7 +6,6 @@
  * Copyright (C) 2008 Wolfram Sang, Pengutronix
  */
 
-#define DEBUG
 #include <linux/kernel.h>
 #include <linux/init.h>
 #include <linux/module.h>
@@ -107,8 +106,6 @@
 module_param_named(write_timeout, at24_write_timeout, uint, 0);
 MODULE_PARM_DESC(at24_write_timeout, "Time (in ms) to try writes (default 25)");
 
-//Ben
-struct at24_data *at24_private=NULL;
 struct at24_chip_data {
 	/*
 	 * these fields mirror their equivalents in
@@ -424,146 +421,6 @@
 	return 0;
 }
 
-//add ben
-static ssize_t at24_read_private(struct at24_data *at24,
-		char *buf, loff_t off, size_t count)
-{
-	ssize_t retval = 0;
-
-	if (unlikely(!count))
-		return count;
-
-	if (off + count > at24->byte_len)
-		return -EINVAL;
-	
-	/*
-	 * Read data from chip, protecting against concurrent updates
-	 * from this host, but not from other I2C masters.
-	 */
-	mutex_lock(&at24->lock);
-
-	while (count) {
-		ssize_t	status;
-
-		//status = at24_eeprom_read_i2c(at24, buf, off, count);
-		status = at24_regmap_read(at24, buf, off, count);
-		if (status <= 0) {
-			if (retval == 0)
-				retval = status;
-			break;
-		}
-		buf += status;
-		off += status;
-		count -= status;
-		retval += status;
-	}
-
-	mutex_unlock(&at24->lock);
-
-	return retval;
-}
-
-#if 0
-static unsigned char AscToHex(unsigned char aChar)
-{
-    if((aChar>=0x30)&&(aChar<=0x39))
-        aChar -= 0x30;
-    else if((aChar>=0x41)&&(aChar<=0x46))
-        aChar -= 0x37;
-    else if((aChar>=0x61)&&(aChar<=0x66))
-        aChar -= 0x57;
-    else aChar = 0xff;
-
-    return aChar; 
-}
-#endif
-
-#if 0
-ssize_t at24_mac_read(unsigned char* addr)
-{
-	char buf[20];
-	char buf_tmp[12];
-	int i;
-	ssize_t ret;	
-	if (at24_private == NULL)
-	{
-		printk("ben %s: at24_private==null error\n", __func__);
-		return 0;
-	}
-	memset(buf, 0x00, 20);
-	memset(buf_tmp, 0x00, 12);
-	ret = at24_read(at24_private, 0, buf, 12);
-	if (ret > 0)
-	{	
-		for(i=0; i<12; i++)
-		{
-			buf_tmp[i] = AscToHex(buf[i]);
-		}
-		addr[0] = (buf_tmp[0] << 4) | buf_tmp[1];
-		addr[1] = (buf_tmp[2] << 4) | buf_tmp[3];
-		addr[2] = (buf_tmp[4] << 4) | buf_tmp[5];
-		addr[3] = (buf_tmp[6] << 4) | buf_tmp[7];
-		addr[4] = (buf_tmp[8] << 4) | buf_tmp[9];
-		addr[5] = (buf_tmp[10] << 4) | buf_tmp[11]; 	
-	}
-	return ret;
-}
-#endif
-
-ssize_t at24_mac_read(unsigned char* addr)
-{
-	char buf[20];
-	char buf_tmp[12];
-	ssize_t ret;	
-	if (at24_private == NULL)
-	{
-		printk("ben: at24_mac_read at24_private==null error");
-		return 0;
-	}
-	memset(buf, 0x00, 20);
-	memset(buf_tmp, 0x00, 12);
-	ret = at24_read_private(at24_private, buf, 0, 6);
-	if (ret > 0)
-	{	
-		addr[0] = buf[0];
-		addr[1] = buf[1];
-		addr[2] = buf[2];
-		addr[3] = buf[3];
-		addr[4] = buf[4];
-		addr[5] = buf[5];	
-	}
-	printk("at24_mac_read ...............\n");
-	return ret;
-}
-EXPORT_SYMBOL(at24_mac_read);
-
-ssize_t at24_mac1_read(unsigned char* mac)
-{
-	char buf[20];
-	char buf_tmp[12];
-	ssize_t ret;
-	if (at24_private == NULL)
-	{
-		printk("zcl: at24_mac_read at24_private==null error");
-		return 0;
-	}
-	memset(buf, 0x00, 20);
-	memset(buf_tmp, 0x00, 12);
-	ret = at24_read_private(at24_private, buf, 0x10, 6);
-	if (ret > 0)
-	{
-		*mac = buf[0];
-		*(mac + 1) = buf[1];
-		*(mac + 2) = buf[2];
-		*(mac + 3) = buf[3];
-		*(mac + 4) = buf[4];
-		*(mac + 5) = buf[5];
-	}
-	printk("at24_mac1_read ...............\n");
-	return ret;
-}
-EXPORT_SYMBOL(at24_mac1_read);
-
 static int at24_write(void *priv, unsigned int off, void *val, size_t count)
 {
 	struct at24_data *at24;
@@ -773,7 +630,6 @@
 	u8 test_byte;
 	int err;
 
-	printk("ben %s ...\n", __func__);
 	i2c_fn_i2c = i2c_check_functionality(client->adapter, I2C_FUNC_I2C);
 	i2c_fn_block = i2c_check_functionality(client->adapter,
 					       I2C_FUNC_SMBUS_WRITE_I2C_BLOCK);
@@ -818,7 +674,6 @@
 	if (!at24)
 		return -ENOMEM;
 
-	at24_private = at24;
 	mutex_init(&at24->lock);
 	at24->byte_len = pdata.byte_len;
 	at24->page_size = pdata.page_size;
@@ -937,8 +792,7 @@
 	at24_io_limit = rounddown_pow_of_two(at24_io_limit);
 	return i2c_add_driver(&at24_driver);
 }
-//module_init(at24_init);
-postcore_initcall_sync(at24_init);
+module_init(at24_init);
 
 static void __exit at24_exit(void)
 {
diff --git a/kernel/drivers/misc/nkio/nk_io_core.c_bak b/kernel/drivers/misc/nkio/nk_io_core.c_bak
new file mode 100755
index 0000000..19f204b
--- /dev/null
+++ b/kernel/drivers/misc/nkio/nk_io_core.c_bak
@@ -0,0 +1,427 @@
+/* 
+ * Copyright (C) 2014 Rockchip Corporation.
+ *
+ * This software is licensed under the terms of the GNU General Public
+ * License version 2, as published by the Free Software Foundation, and
+ * may be copied, distributed, and modified under those terms.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ */
+#include <linux/module.h>
+#include <linux/moduleparam.h>
+#include <linux/init.h>
+#include <linux/delay.h>
+#include <linux/pm.h>
+#include <linux/i2c.h>
+#include <linux/spi/spi.h>
+#include <linux/platform_device.h>
+#include <linux/errno.h>
+#include <linux/err.h>
+#include <linux/debugfs.h>
+#include <linux/of_gpio.h>
+#include <linux/gpio.h>
+#include <linux/iio/consumer.h>
+#include <linux/of.h>
+#include "nkio.h"
+
+/* Debug */
+#if 1
+#define DBG(x...) printk(x)
+#else
+#define DBG(x...) do { } while (0)
+#endif
+
+struct ndj_io_pdata *NDJpdata_info;
+u32 op0_enable,op1_enable,op2_enable,op3_enable,op4_enable,op5_enable,mic_enable;
+u32 ip0_enable,ip1_enable,ip2_enable,ip3_enable,ip4_enable,ip5_enable;
+u32 module_enable;
+static struct class *ndj_class;
+
+  
+static int ndj_io_control_probe(struct platform_device *pdev)
+{
+	struct device_node *node = pdev->dev.of_node;
+	struct ndj_io_pdata *pdata;
+	int ret;
+	int i=0;
+	enum of_gpio_flags flags;
+	int ch342_reset, ch342_reset_2;
+	printk(" ####### NDJ_io_control_probe####### \n");
+	
+	pdata = kzalloc(sizeof(struct ndj_io_pdata), GFP_KERNEL);
+	if (pdata == NULL) {
+		printk("%s failed to allocate driver data\n",__FUNCTION__);
+		return -ENOMEM;
+	}
+	memset(pdata,0,sizeof(struct ndj_io_pdata));
+
+	
+	//mic_switch_gpio
+		ret = of_get_named_gpio_flags(node, "mic_switch_gpio", 0, &flags);
+		if (ret < 0) {
+				printk("%s() Can not read property mic_switch_gpio\n", __FUNCTION__);
+				goto err;
+		} else {
+				pdata->mic_switch_gpio = ret;
+				ret = devm_gpio_request(&pdev->dev, pdata->mic_switch_gpio, "mic_switch_gpio");
+				if(ret < 0){
+						printk("%s() devm_gpio_request mic_switch_gpio request ERROR\n", __FUNCTION__);
+						goto err;
+				}
+				ret = gpio_direction_output(pdata->mic_switch_gpio,0); 
+				mic_enable = 0;
+				if(ret < 0){
+				printk("%s() gpio_direction_input mic_switch_gpio set ERROR\n", __FUNCTION__);
+				goto err;
+		}
+				}
+
+	//vcc_5v_io
+	ret = of_get_named_gpio_flags(node, "vcc_5v_io", 0, &flags);
+	if (ret < 0) {
+		printk("%s() Can not read property vcc_5v_io\n", __FUNCTION__);
+		goto err;
+	} else {
+		pdata->vcc_5v_io = ret;
+		ret = devm_gpio_request(&pdev->dev, pdata->vcc_5v_io, "vcc_5v_io");
+		if(ret < 0){
+			printk("%s() devm_gpio_request vcc_5v_io request ERROR\n", __FUNCTION__);
+			goto err;
+		}
+
+		ret = gpio_direction_output(pdata->vcc_5v_io,1); 
+		if(ret < 0){
+			printk("%s() gpio_direction_output vcc_5v_io set ERROR\n", __FUNCTION__);
+			goto err;
+		}
+	}
+
+		//vcc_12v_io
+	ret = of_get_named_gpio_flags(node, "vcc_12v_io", 0, &flags);
+	if (ret < 0) {
+		printk("%s() Can not read property vcc_12v_io\n", __FUNCTION__);
+		goto err;
+	} else {
+		pdata->vcc_12v_io = ret;
+		ret = devm_gpio_request(&pdev->dev, pdata->vcc_12v_io, "vcc_12v_io");
+		if(ret < 0){
+			printk("%s() devm_gpio_request vcc_12v_io request ERROR\n", __FUNCTION__);
+			goto err;
+		}
+
+		ret = gpio_direction_output(pdata->vcc_12v_io,1); 
+		if(ret < 0){
+			printk("%s() gpio_direction_output vcc_12v_io set ERROR\n", __FUNCTION__);
+			goto err;
+		}
+	}
+#if 0
+		//hub_5V_gpio
+	ret = of_get_named_gpio_flags(node, "hub_5V_gpio", 0, &flags);
+	if (ret < 0) {
+		printk("%s() Can not read property hub_5V_gpio\n", __FUNCTION__);
+		goto err;
+	} else {
+		
+		pdata->hub_5V_gpio = ret;
+		gpio_free(ret);
+		ret = devm_gpio_request(&pdev->dev, pdata->hub_5V_gpio, "hub_5V_gpio");
+		if(ret < 0){
+			printk("%s() devm_gpio_request hub_5V_gpio request ERROR\n", __FUNCTION__);
+			goto err;
+		}
+
+		ret = gpio_direction_output(pdata->hub_5V_gpio,1); 
+		if(ret < 0){
+			printk("%s() gpio_direction_output hub_5V_gpio set ERROR\n", __FUNCTION__);
+			goto err;
+		}
+	}
+#endif
+
+	//hub_5V_rest_gpio
+	ret = of_get_named_gpio_flags(node, "hub_5V_rest_gpio", 0, &flags);
+	if (ret < 0) {
+		printk("%s() Can not read property hub_5V_rest_gpio\n", __FUNCTION__);
+		goto err;
+	} else {
+		pdata->hub_5V_rest_gpio = ret;
+		ret = devm_gpio_request(&pdev->dev, pdata->hub_5V_rest_gpio, "hub_5V_rest_gpio");
+		if(ret < 0){
+			printk("%s() devm_gpio_request hub_5V_rest_gpio request ERROR\n", __FUNCTION__);
+			goto err;
+		}
+
+		ret = gpio_direction_output(pdata->hub_5V_rest_gpio,0); 
+		if(ret < 0){
+			printk("%s() gpio_direction_output hub_5V_rest_gpio set ERROR\n", __FUNCTION__);
+			goto err;
+		}
+		msleep(800);
+		ret = gpio_direction_output(pdata->hub_5V_rest_gpio,1); 
+		if(ret < 0){
+			printk("%s() gpio_direction_output hub_5V_rest_gpio set ERROR\n", __FUNCTION__);
+			goto err;
+		}
+	}
+
+	   ret = of_get_named_gpio_flags(node, "ch342_power", 0, &flags);
+           if (ret < 0) {
+                   printk("%s() Can not read property ch342_power\n", __FUNCTION__);
+           } else {
+                   pdata->ch342_power = ret;
+
+                   ret = devm_gpio_request(&pdev->dev, pdata->ch342_power, "wch342_power");
+                   if(ret < 0){
+                           printk("%s() devm_gpio_request ch342_power request ERROR\n", __FUNCTION__);
+                   }
+                   ret = gpio_direction_output(pdata->ch342_power,1);
+                   if(ret < 0){
+                           printk("%s() gpio_direction_input wake_4g_gpio set ERROR\n", __FUNCTION__);
+                   }
+           }
+
+	#if 1
+         // ch342_reset
+           ret = of_get_named_gpio_flags(node, "ch342_reset", 0, &flags);
+           if (ret < 0) {
+                   printk("%s() Can not read property ch342_reset\n", __FUNCTION__);
+           } else {
+                   pdata->reset_ch342_gpio = ret;
+
+                   ret = devm_gpio_request(&pdev->dev, pdata->reset_ch342_gpio, "ch342_reset");
+                   if(ret < 0){
+                           printk("%s() devm_gpio_request ch342_reset request ERROR\n", __FUNCTION__);
+                   }
+		
+		    ret = gpio_direction_output(pdata->reset_ch342_gpio,0);
+                if(ret < 0){
+                        printk("%s() gpio_direction_output reset_ch342_gpio set ERROR\n", __FUNCTION__);
+                        goto err;
+                }
+                msleep(200);
+                ret = gpio_direction_output(pdata->reset_ch342_gpio,1);
+                if(ret < 0){
+                        printk("%s() gpio_direction_output reset_ch342_gpio set ERROR\n", __FUNCTION__);
+                        goto err;
+                }
+           }
+
+        ret = of_get_named_gpio_flags(node, "ch342_reset_2", 0, &flags);
+           if (ret < 0) {
+                   printk("%s() Can not read property ch342_reset_2\n", __FUNCTION__);
+           } else {
+                   pdata->reset_ch342_gpio_2 = ret;
+
+                   ret = devm_gpio_request(&pdev->dev, pdata->reset_ch342_gpio_2, "ch342_reset_2");
+                   if(ret < 0){
+                           printk("%s() devm_gpio_request ch342_reset request ERROR\n", __FUNCTION__);
+                   }
+		    ret = gpio_direction_output(pdata->reset_ch342_gpio_2,0);
+                if(ret < 0){
+                        printk("%s() gpio_direction_output reset_ch342_gpio_2 set ERROR\n", __FUNCTION__);
+                        goto err;
+                }
+                msleep(200);
+                ret = gpio_direction_output(pdata->reset_ch342_gpio_2,1);
+                if(ret < 0){
+                        printk("%s() gpio_direction_output reset_ch342_gpio_2 set ERROR\n", __FUNCTION__);
+                        goto err;
+                }
+           }
+#endif
+#if 1
+           //reset_4g_gpio
+           ret = of_get_named_gpio_flags(node, "reset_4g_gpio", 0, &flags);
+           if (ret < 0) {
+                   printk("%s() Can not read property reset_4g_gpio\n", __FUNCTION__);
+           } else {
+                   pdata->reset_4g_gpio = ret;
+
+                   ret = devm_gpio_request(&pdev->dev, pdata->reset_4g_gpio, "reset_4g_gpio");
+                   if(ret < 0){
+                           printk("%s() devm_gpio_request reset_4g_gpio request ERROR\n", __FUNCTION__);
+                   }
+                   ret = gpio_direction_output(pdata->reset_4g_gpio,1);
+                   if(ret < 0){
+                           printk("%s() gpio_direction_input reset_4g_gpio set ERROR\n", __FUNCTION__);
+                   }
+	           mdelay(300);
+                   ret = gpio_direction_output(pdata->reset_4g_gpio,0);
+                   if(ret < 0){
+                           printk("%s() gpio_direction_input reset_4g_gpio set ERROR\n", __FUNCTION__);
+                   }
+           }
+#endif
+
+	         //en_4g_gpio
+           ret = of_get_named_gpio_flags(node, "en_4g_gpio", 0, &flags);
+           if (ret < 0) {
+                   printk("%s() Can not read property en_4g_gpio\n", __FUNCTION__);
+           } else {
+                   pdata->en_4g_gpio = ret;
+
+                   ret = devm_gpio_request(&pdev->dev, pdata->en_4g_gpio, "en_4g_gpio");
+                   if(ret < 0){
+                           printk("%s() devm_gpio_request en_4g_gpio request ERROR\n", __FUNCTION__);
+                   }
+                   ret = gpio_direction_output(pdata->en_4g_gpio,1);
+                   if(ret < 0){
+                           printk("%s() gpio_direction_input en_4g_gpio set ERROR\n", __FUNCTION__);
+                   }
+           }
+
+
+           //air_mode_4g_gpio
+           ret = of_get_named_gpio_flags(node, "air_mode_4g_gpio", 0, &flags);
+           if (ret < 0) {
+                   printk("%s() Can not read property air_mode_4g_gpio\n", __FUNCTION__);
+           } else {
+                   pdata->air_mode_4g_gpio = ret;
+
+                   ret = devm_gpio_request(&pdev->dev, pdata->air_mode_4g_gpio, "air_mode_4g_gpio");
+                   if(ret < 0){
+                           printk("%s() devm_gpio_request air_mode_4g_gpio request ERROR\n", __FUNCTION__);
+                   }
+                   ret = gpio_direction_output(pdata->air_mode_4g_gpio,0);
+                   if(ret < 0){
+                           printk("%s() gpio_direction_input air_mode_4g_gpio set ERROR\n", __FUNCTION__);
+                   }
+           }
+
+
+	  //air_mode_4g_gpio
+           ret = of_get_named_gpio_flags(node, "wake_4g_gpio", 0, &flags);
+           if (ret < 0) {
+                   printk("%s() Can not read property wake_4g_gpio\n", __FUNCTION__);
+           } else {
+                   pdata->air_mode_4g_gpio = ret;
+
+                   ret = devm_gpio_request(&pdev->dev, pdata->air_mode_4g_gpio, "wake_4g_gpio");
+                   if(ret < 0){
+                           printk("%s() devm_gpio_request wake_4g_gpio request ERROR\n", __FUNCTION__);
+                   }
+                   ret = gpio_direction_output(pdata->wake_4g_gpio,0);
+                   if(ret < 0){
+                           printk("%s() gpio_direction_output wake_4g_gpio set ERROR\n", __FUNCTION__);
+                   }
+           }
+
+
+
+	#if 0
+		//audio_switch_gpio
+	ret = of_get_named_gpio_flags(node, "audio_switch_gpio", 0, &flags);
+	if (ret < 0) {
+		printk("%s() Can not read property audio_switch_gpio\n", __FUNCTION__);
+		goto err;
+	} else {
+		pdata->audio_switch_gpio = ret;
+		ret = devm_gpio_request(&pdev->dev, pdata->audio_switch_gpio, "audio_switch_gpio");
+		if(ret < 0){
+			printk("%s() devm_gpio_request audio_switch_gpio request ERROR\n", __FUNCTION__);
+			goto err;
+		}
+            ret = gpio_direction_output(pdata->audio_switch_gpio, !flags); 
+		if(ret < 0){
+		printk("%s() gpio_direction_input audio_switch_gpio set ERROR\n", __FUNCTION__);
+		goto err;
+	}
+		}
+		#endif
+
+//    printk("fan_io_en ....\r\n"); 
+    ret = of_get_named_gpio_flags(node, "fan_io_en", 0, &flags);
+    if (ret < 0) {
+        printk("%s() Can not read property fan_io_en\n", __FUNCTION__);
+        goto err;
+    } else {
+        int gpio = ret;
+        ret = devm_gpio_request(&pdev->dev, gpio, "fan_io_en");
+        if(ret < 0){
+            printk("%s() devm_gpio_request vcc_5v_io request ERROR\n", __FUNCTION__);
+            goto err;
+        }
+
+        ret = gpio_direction_output(gpio, !flags); 
+        if(ret < 0){
+            printk("%s() gpio_direction_input fan_io_en set ERROR\n", __FUNCTION__);
+            goto err;
+        }
+    }
+ //   printk("fan_io_en ....ok!\r\n"); 
+
+	
+	   
+	NDJpdata_info = pdata;
+
+	printk(" #######ndj_io_control_probe end####### \n");
+	return 0;
+err:
+	kfree(pdata);
+	return ret;
+}
+
+static int ndj_io_control_remove(struct platform_device *pdev)
+{
+	if(NDJpdata_info)
+		kfree(NDJpdata_info);
+	return 0;
+}
+
+static int ndj_io_control_suspend(struct platform_device *pdev, pm_message_t state)
+{
+	printk("LED_early_suspend LED_early_suspend LED_early_suspend !!!!\n");
+
+	//enable = 0;
+	//LED_SET(0);
+	return 0;
+}
+
+static int ndj_io_control_resume(struct platform_device *pdev)
+{
+	printk("LED_early_resume LED_early_resume LED_early_resume !!!!\n");
+
+	//enable = 1;
+    //LED_SET(11);
+	return 0;
+}
+
+static const struct of_device_id ndj_io_control_of_match[] = {
+        { .compatible = "ndj_io_control", },
+        {},
+};
+MODULE_DEVICE_TABLE(of, ndj_io_control_of_match);
+
+static struct platform_driver ndj_io_control_driver = {
+	.probe	= ndj_io_control_probe,
+	.remove = ndj_io_control_remove,
+	.resume = ndj_io_control_resume,	
+	.suspend = ndj_io_control_suspend,	
+	.driver	= {
+		.name	= "ndj_io_control",
+		.owner	= THIS_MODULE,
+		.of_match_table = of_match_ptr(ndj_io_control_of_match),		
+	},
+};
+
+static int __init ndj_io_control_init(void)
+{
+	platform_driver_register(&ndj_io_control_driver);
+	return 0;
+}
+
+static void __exit ndj_io_control_exit(void)
+{
+	platform_driver_unregister(&ndj_io_control_driver);
+}
+
+subsys_initcall(ndj_io_control_init);
+
+//late_initcall(ndj_io_control_init);
+MODULE_DESCRIPTION("ndj io Core Driver");
+MODULE_LICENSE("GPL");
diff --git a/kernel/drivers/misc/nkmcu/Makefile b/kernel/drivers/misc/nkmcu/Makefile
deleted file mode 100644
index aca06fb..0000000
--- a/kernel/drivers/misc/nkmcu/Makefile
+++ /dev/null
@@ -1 +0,0 @@
-obj-y += nk_mcu.o 
diff --git a/kernel/drivers/misc/nkmcu/nk_mcu.c b/kernel/drivers/misc/nkmcu/nk_mcu.c
deleted file mode 100755
index b0702be..0000000
--- a/kernel/drivers/misc/nkmcu/nk_mcu.c
+++ /dev/null
@@ -1,161 +0,0 @@
-#include <linux/module.h>
-#include <linux/clk-provider.h>
-#include <linux/i2c.h>
-#include <linux/delay.h>
-
-static struct i2c_client s_m_client;
-static struct i2c_client* m_client;
- 
-//写16位寄存器
-static inline int nkmcu_reg_write(struct i2c_client *client,int index,unsigned short reg, unsigned char val)
-{
-	unsigned char u8_buf[3] = { 0 };
-	unsigned int buf_len = 3;
-	int retry, timeout = 5;
-	int ret;
-
-	ret = 0;
-	u8_buf[0] = (reg >> 8) & 0xFF;//寄存器地址高位
-	u8_buf[1] = reg & 0xFF;  //寄存器地址低位
-	u8_buf[2] = val; //要发送的数据
-
-	//pdata->client->addr = ADDR + index;
-	for (retry = 0; retry < timeout; retry++) 
-    {
-		if (i2c_master_send(client, u8_buf, buf_len) < 0) 
-        {
-			pr_err("%s:write reg error: reg=0x%x, val=0x%x, retry = %d.\n", __func__, reg, val, retry);
-			ret = -1;
-			msleep(5);
-			continue;
-		}
-		else
-        {      
-			pr_err("%s:write reg ok: reg=0x%x, val=0x%x, retry = %d.\n", __func__, reg, val, retry);
-			ret = 0;
-            break;
-        }
-	}
-	return ret;
-}
-
-//16位读
-static inline int nkmcu_reg_read(struct i2c_client *client, int index, unsigned short reg)
-{
-	unsigned char u8_buf[2] = { 0 };
-	unsigned int buf_len = 2;
-	int retry, timeout = 5;
-	unsigned char u8_val = 0;
-
-	u8_buf[0] = (reg >> 8) & 0xFF;//寄存器地址高位
-	u8_buf[1] = reg & 0xFF;//寄存器地址低位
-
-	//pdata->client->addr = ADDR + index;
-	for (retry = 0; retry < timeout; retry++) 
-    {
-		if (i2c_master_send(client, u8_buf, buf_len) < 0) 
-        {
-			pr_err("%s:read reg error on send: reg=0x%x, retry = %d.\n", __func__, reg, retry);
-			msleep(5);
-			continue;
-		}
-		if (i2c_master_recv(client, &u8_val, 1) != 1) {
-			pr_err("%s:read reg error on recv: reg=0x%x, retry = %d.\n", __func__, reg, retry);
-			msleep(5);
-			continue;
-		}
-		break;
-	}
-
-	if (retry >= timeout) {
-		pr_err("%s:read reg error: reg=0x%x.\n", __func__, reg);
-		return -1;
-	}
-
-	return u8_val;
-}
-
-void nkmcu_device_shutdown(void)
-{
-	int ret;
-	
-	pr_err("nkmcu_device_shutdown.. \n");
-	
-	//powenoff
-	if (m_client != NULL)
-	{	
-		ret = nkmcu_reg_write(m_client, 0x00, 0x06, 0x01);
-		if (ret < 0)	
-			pr_err("nkmcu_device_shutdown..failed \n");	
-		else
-			pr_err("nkmcu_device_shutdown.. ok \n");
-	}	
-	
-}
-EXPORT_SYMBOL(nkmcu_device_shutdown);
-	
-static int  nk_mcu_probe(struct i2c_client *client, const struct i2c_device_id *id)
-{
-	struct device_node *np = client->dev.of_node;
-	int ret;
-	
-	printk("%s: probe\n", __FUNCTION__);
-	
-	/* check state of calendar information */
-	//device id
-	//i2c_smbus_read_word_data
-	msleep(100);
-	//ret = i2c_smbus_read_byte_data(client, 0x00);
-	ret = nkmcu_reg_read(client, 0x00, 0x00);
-	printk("device id:%x \n", ret);
-	if (ret != 0xaa)
-		goto error;
-	
-	//powenon
-	msleep(100);
-	//ret = i2c_smbus_write_word_data(client, 0x07, 0x01);
-	ret = nkmcu_reg_write(client, 0x00, 0x07, 0x01);
-	printk("poweron command:%x \n", ret);
-	if (ret < 0)
-		goto error;
-	
-	//m_client = client;
-	memcpy(&s_m_client, client, sizeof(struct i2c_client));
-	m_client = &s_m_client;
-	return 0;
-	
-error:
-	return -1;			
-}
-
-static const struct i2c_device_id nk_mcu_id[] = {
-        { "nk_mcu", 0 },
-        { }
-};
-
-static struct i2c_driver nk_mcu_driver = {
-        .driver         = {
-                .name   = "nk_mcu",
-                .owner  = THIS_MODULE,
-        },
-        .probe          = nk_mcu_probe,
-        .id_table       = nk_mcu_id,
-};
-
-static int __init nk_mcu_init(void)
-{
-        return i2c_add_driver(&nk_mcu_driver);
-}
-
-static void __exit nk_mcu_exit(void)
-{
-        i2c_del_driver(&nk_mcu_driver);
-}
-
-
-MODULE_AUTHOR("ben@hotmail.com");
-MODULE_DESCRIPTION("nodka mcu driver");
-MODULE_LICENSE("GPL");
-
-late_initcall(nk_mcu_init);
-module_exit(nk_mcu_exit);
diff --git a/kernel/drivers/mmc/core/core.c b/kernel/drivers/mmc/core/core.c
index b7d646a..c12ce9b 100644
--- a/kernel/drivers/mmc/core/core.c
+++ b/kernel/drivers/mmc/core/core.c
@@ -2432,7 +2432,7 @@
 }
 EXPORT_SYMBOL(mmc_set_blockcount);
 
-#ifndef CONFIG_ROCKCHIP_THUNDER_BOOT
+#ifndef CONFIG_ROCKCHIP_THUNDER_BOOT_MMC
 static void mmc_hw_reset_for_init(struct mmc_host *host)
 {
 	mmc_pwrseq_reset(host);
@@ -2504,7 +2504,7 @@
 	 * Some eMMCs (with VCCQ always on) may not be reset after power up, so
 	 * do a hardware reset if possible.
 	 */
-#ifndef CONFIG_ROCKCHIP_THUNDER_BOOT
+#ifndef CONFIG_ROCKCHIP_THUNDER_BOOT_MMC
 	mmc_hw_reset_for_init(host);
 #endif
 
diff --git a/kernel/drivers/mmc/core/mmc.c b/kernel/drivers/mmc/core/mmc.c
index 1315805..0d96658 100644
--- a/kernel/drivers/mmc/core/mmc.c
+++ b/kernel/drivers/mmc/core/mmc.c
@@ -70,7 +70,7 @@
 /*
  * Given the decoded CSD structure, decode the raw CID to our CID structure.
  */
-#ifndef CONFIG_ROCKCHIP_THUNDER_BOOT
+#ifndef CONFIG_ROCKCHIP_THUNDER_BOOT_MMC
 static int mmc_decode_cid(struct mmc_card *card)
 {
 	u32 *resp = card->raw_cid;
@@ -666,7 +666,7 @@
 	return err;
 }
 
-#ifdef CONFIG_ROCKCHIP_THUNDER_BOOT
+#ifdef CONFIG_ROCKCHIP_THUNDER_BOOT_MMC
 static void *mmc_tb_map_ecsd(phys_addr_t start, size_t len)
 {
 	int i;
@@ -696,7 +696,7 @@
 {
 	u8 *ext_csd;
 	int err;
-#ifdef CONFIG_ROCKCHIP_THUNDER_BOOT
+#ifdef CONFIG_ROCKCHIP_THUNDER_BOOT_MMC
 	void *ecsd = NULL;
 	bool valid_ecsd = false;
 	bool valid_reserved = false;
@@ -707,7 +707,7 @@
 	if (!mmc_can_ext_csd(card))
 		return 0;
 
-#ifdef CONFIG_ROCKCHIP_THUNDER_BOOT
+#ifdef CONFIG_ROCKCHIP_THUNDER_BOOT_MMC
 	mem = of_parse_phandle(dev->of_node, "memory-region-ecsd", 0);
 	if (mem) {
 		err = of_address_to_resource(mem, 0, &reg);
@@ -758,11 +758,11 @@
 
 		return err;
 	}
-#ifdef CONFIG_ROCKCHIP_THUNDER_BOOT
+#ifdef CONFIG_ROCKCHIP_THUNDER_BOOT_MMC
 decode:
 #endif
 	err = mmc_decode_ext_csd(card, ext_csd);
-#ifdef CONFIG_ROCKCHIP_THUNDER_BOOT
+#ifdef CONFIG_ROCKCHIP_THUNDER_BOOT_MMC
 	if (!valid_ecsd)
 		kfree(ext_csd);
 	else
@@ -777,7 +777,7 @@
 	return err;
 }
 
-#ifndef CONFIG_ROCKCHIP_THUNDER_BOOT
+#ifndef CONFIG_ROCKCHIP_THUNDER_BOOT_MMC
 static int mmc_compare_ext_csds(struct mmc_card *card, unsigned bus_width)
 {
 	u8 *bw_ext_csd;
@@ -1117,7 +1117,7 @@
 		 * compare ext_csd previously read in 1 bit mode
 		 * against ext_csd at new bus width
 		 */
-#ifndef CONFIG_ROCKCHIP_THUNDER_BOOT
+#ifndef CONFIG_ROCKCHIP_THUNDER_BOOT_MMC
 		if (!(host->caps & MMC_CAP_BUS_WIDTH_TEST))
 			err = mmc_compare_ext_csds(card, bus_width);
 		else
@@ -1495,6 +1495,9 @@
 	if (host->ops->hs400_enhanced_strobe)
 		host->ops->hs400_enhanced_strobe(host, &host->ios);
 
+	/* some emmc device need a delay before read status */
+	usleep_range(100, 200);
+
 	err = mmc_switch_status(card);
 	if (err)
 		goto out_err;
@@ -1653,7 +1656,7 @@
 	 * respond.
 	 * mmc_go_idle is needed for eMMC that are asleep
 	 */
-#ifndef CONFIG_ROCKCHIP_THUNDER_BOOT
+#ifndef CONFIG_ROCKCHIP_THUNDER_BOOT_MMC
 	mmc_go_idle(host);
 #endif
 
@@ -1698,7 +1701,7 @@
 		card->ocr = ocr;
 		card->type = MMC_TYPE_MMC;
 		card->rca = 1;
-#ifndef CONFIG_ROCKCHIP_THUNDER_BOOT
+#ifndef CONFIG_ROCKCHIP_THUNDER_BOOT_MMC
 		memcpy(card->raw_cid, cid, sizeof(card->raw_cid));
 #endif
 	}
@@ -1731,7 +1734,7 @@
 		err = mmc_decode_csd(card);
 		if (err)
 			goto free_card;
-#ifndef CONFIG_ROCKCHIP_THUNDER_BOOT
+#ifndef CONFIG_ROCKCHIP_THUNDER_BOOT_MMC
 		err = mmc_decode_cid(card);
 		if (err)
 			goto free_card;
@@ -1866,7 +1869,7 @@
 	/*
 	 * Enable HPI feature (if supported)
 	 */
-#ifndef CONFIG_ROCKCHIP_THUNDER_BOOT
+#ifndef CONFIG_ROCKCHIP_THUNDER_BOOT_MMC
 	if (card->ext_csd.hpi) {
 		err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL,
 				EXT_CSD_HPI_MGMT, 1,
diff --git a/kernel/drivers/mmc/core/mmc_ops.c b/kernel/drivers/mmc/core/mmc_ops.c
index 1b35251..8060fec 100644
--- a/kernel/drivers/mmc/core/mmc_ops.c
+++ b/kernel/drivers/mmc/core/mmc_ops.c
@@ -147,7 +147,7 @@
 	 * rules that must accommodate non-MMC slaves which this layer
 	 * won't even know about.
 	 */
-#ifndef CONFIG_ROCKCHIP_THUNDER_BOOT
+#ifndef CONFIG_ROCKCHIP_THUNDER_BOOT_MMC
 	if (!mmc_host_is_spi(host)) {
 		mmc_set_chip_select(host, MMC_CS_HIGH);
 		mmc_delay(1);
@@ -159,7 +159,7 @@
 
 	err = mmc_wait_for_cmd(host, &cmd, 0);
 
-#ifndef CONFIG_ROCKCHIP_THUNDER_BOOT
+#ifndef CONFIG_ROCKCHIP_THUNDER_BOOT_MMC
 	mmc_delay(1);
 	if (!mmc_host_is_spi(host)) {
 		mmc_set_chip_select(host, MMC_CS_DONTCARE);
@@ -199,7 +199,7 @@
 		}
 
 		err = -ETIMEDOUT;
-#ifndef CONFIG_ROCKCHIP_THUNDER_BOOT
+#ifndef CONFIG_ROCKCHIP_THUNDER_BOOT_MMC
 		mmc_delay(1);
 #else
 		udelay(1);
diff --git a/kernel/drivers/mmc/host/android-goldfish.c b/kernel/drivers/mmc/host/android-goldfish.c
index 61e4e2a..0840fed 100644
--- a/kernel/drivers/mmc/host/android-goldfish.c
+++ b/kernel/drivers/mmc/host/android-goldfish.c
@@ -549,6 +549,7 @@
 	.remove		= goldfish_mmc_remove,
 	.driver		= {
 		.name	= DRIVER_NAME,
+		.probe_type = PROBE_PREFER_ASYNCHRONOUS,
 	},
 };
 
diff --git a/kernel/drivers/mmc/host/atmel-mci.c b/kernel/drivers/mmc/host/atmel-mci.c
index fbc56ee..2d31aa9 100644
--- a/kernel/drivers/mmc/host/atmel-mci.c
+++ b/kernel/drivers/mmc/host/atmel-mci.c
@@ -2701,6 +2701,7 @@
 	.remove		= atmci_remove,
 	.driver		= {
 		.name		= "atmel_mci",
+		.probe_type	= PROBE_PREFER_ASYNCHRONOUS,
 		.of_match_table	= of_match_ptr(atmci_dt_ids),
 		.pm		= &atmci_dev_pm_ops,
 	},
diff --git a/kernel/drivers/mmc/host/au1xmmc.c b/kernel/drivers/mmc/host/au1xmmc.c
index 9b4be67..bfe3536 100644
--- a/kernel/drivers/mmc/host/au1xmmc.c
+++ b/kernel/drivers/mmc/host/au1xmmc.c
@@ -1210,6 +1210,7 @@
 	.resume        = au1xmmc_resume,
 	.driver        = {
 		.name  = DRIVER_NAME,
+		.probe_type = PROBE_PREFER_ASYNCHRONOUS,
 	},
 };
 
diff --git a/kernel/drivers/mmc/host/davinci_mmc.c b/kernel/drivers/mmc/host/davinci_mmc.c
index e6f1425..775afc85 100644
--- a/kernel/drivers/mmc/host/davinci_mmc.c
+++ b/kernel/drivers/mmc/host/davinci_mmc.c
@@ -1409,6 +1409,7 @@
 static struct platform_driver davinci_mmcsd_driver = {
 	.driver		= {
 		.name	= "davinci_mmc",
+		.probe_type = PROBE_PREFER_ASYNCHRONOUS,
 		.pm	= davinci_mmcsd_pm_ops,
 		.of_match_table = davinci_mmc_dt_ids,
 	},
diff --git a/kernel/drivers/mmc/host/dw_mmc-exynos.c b/kernel/drivers/mmc/host/dw_mmc-exynos.c
index d7915e5..6788b60 100644
--- a/kernel/drivers/mmc/host/dw_mmc-exynos.c
+++ b/kernel/drivers/mmc/host/dw_mmc-exynos.c
@@ -597,6 +597,7 @@
 	.remove		= dw_mci_exynos_remove,
 	.driver		= {
 		.name		= "dwmmc_exynos",
+		.probe_type	= PROBE_PREFER_ASYNCHRONOUS,
 		.of_match_table	= dw_mci_exynos_match,
 		.pm		= &dw_mci_exynos_pmops,
 	},
diff --git a/kernel/drivers/mmc/host/dw_mmc-k3.c b/kernel/drivers/mmc/host/dw_mmc-k3.c
index 89cdb3d..9c9762d 100644
--- a/kernel/drivers/mmc/host/dw_mmc-k3.c
+++ b/kernel/drivers/mmc/host/dw_mmc-k3.c
@@ -477,6 +477,7 @@
 	.remove		= dw_mci_pltfm_remove,
 	.driver		= {
 		.name		= "dwmmc_k3",
+		.probe_type	= PROBE_PREFER_ASYNCHRONOUS,
 		.of_match_table	= dw_mci_k3_match,
 		.pm		= &dw_mci_k3_dev_pm_ops,
 	},
diff --git a/kernel/drivers/mmc/host/dw_mmc-pltfm.c b/kernel/drivers/mmc/host/dw_mmc-pltfm.c
index 58c13e2..a7382ab 100644
--- a/kernel/drivers/mmc/host/dw_mmc-pltfm.c
+++ b/kernel/drivers/mmc/host/dw_mmc-pltfm.c
@@ -102,6 +102,7 @@
 	.remove		= dw_mci_pltfm_remove,
 	.driver		= {
 		.name		= "dw_mmc",
+		.probe_type	= PROBE_PREFER_ASYNCHRONOUS,
 		.of_match_table	= dw_mci_pltfm_match,
 		.pm		= &dw_mci_pltfm_pmops,
 	},
diff --git a/kernel/drivers/mmc/host/dw_mmc-rockchip.c b/kernel/drivers/mmc/host/dw_mmc-rockchip.c
index b63b157..947ab8f 100644
--- a/kernel/drivers/mmc/host/dw_mmc-rockchip.c
+++ b/kernel/drivers/mmc/host/dw_mmc-rockchip.c
@@ -438,8 +438,10 @@
 	if (!pdev->dev.of_node)
 		return -ENODEV;
 
-	if (!device_property_read_bool(&pdev->dev, "non-removable") &&
-	    !device_property_read_bool(&pdev->dev, "cd-gpios"))
+	if ((!device_property_read_bool(&pdev->dev, "non-removable") &&
+	     !device_property_read_bool(&pdev->dev, "cd-gpios")) ||
+	    (device_property_read_bool(&pdev->dev, "no-sd") &&
+	     device_property_read_bool(&pdev->dev, "no-mmc")))
 		use_rpm = false;
 
 	match = of_match_node(dw_mci_rockchip_match, pdev->dev.of_node);
@@ -496,6 +498,7 @@
 	.remove		= dw_mci_rockchip_remove,
 	.driver		= {
 		.name		= "dwmmc_rockchip",
+		.probe_type	= PROBE_PREFER_ASYNCHRONOUS,
 		.of_match_table	= dw_mci_rockchip_match,
 		.pm		= &dw_mci_rockchip_dev_pm_ops,
 	},
diff --git a/kernel/drivers/mmc/host/dw_mmc.c b/kernel/drivers/mmc/host/dw_mmc.c
index 51dee0a..954e932 100644
--- a/kernel/drivers/mmc/host/dw_mmc.c
+++ b/kernel/drivers/mmc/host/dw_mmc.c
@@ -246,7 +246,7 @@
 	 * ...also allow sending for SDMMC_CMD_VOLT_SWITCH where busy is
 	 * expected.
 	 */
-#ifdef CONFIG_ROCKCHIP_THUNDER_BOOT
+#ifdef CONFIG_ROCKCHIP_THUNDER_BOOT_MMC
 	if (host->slot->mmc->restrict_caps & RESTRICT_CARD_TYPE_EMMC)
 		delay = 0;
 #endif
@@ -1508,6 +1508,9 @@
 
 	switch (ios->power_mode) {
 	case MMC_POWER_UP:
+		if (!IS_ERR_OR_NULL(slot->host->pinctrl))
+			pinctrl_select_state(slot->host->pinctrl, slot->host->idle_state);
+
 		if (!IS_ERR(mmc->supply.vmmc)) {
 			ret = mmc_regulator_set_ocr(mmc, mmc->supply.vmmc,
 					ios->vdd);
@@ -1524,6 +1527,9 @@
 		mci_writel(slot->host, PWREN, regs);
 		break;
 	case MMC_POWER_ON:
+		if (!IS_ERR_OR_NULL(slot->host->pinctrl))
+			pinctrl_select_state(slot->host->pinctrl, slot->host->normal_state);
+
 		if (!slot->host->vqmmc_enabled) {
 			if (!IS_ERR(mmc->supply.vqmmc)) {
 				ret = regulator_enable(mmc->supply.vqmmc);
@@ -1548,6 +1554,9 @@
 
 		break;
 	case MMC_POWER_OFF:
+		if (!IS_ERR_OR_NULL(slot->host->pinctrl))
+			pinctrl_select_state(slot->host->pinctrl, slot->host->idle_state);
+
 		/* Turn clock off before power goes down */
 		dw_mci_setup_bus(slot, false);
 
@@ -3272,6 +3281,22 @@
 			return ERR_PTR(ret);
 	}
 
+	host->pinctrl = devm_pinctrl_get(host->dev);
+	if (!IS_ERR(host->pinctrl)) {
+		host->normal_state = pinctrl_lookup_state(host->pinctrl, "normal");
+		if (IS_ERR(host->normal_state))
+			dev_warn(dev, "No normal pinctrl state\n");
+
+		host->idle_state = pinctrl_lookup_state(host->pinctrl, "idle");
+		if (IS_ERR(host->idle_state))
+			dev_warn(dev, "No idle pinctrl state\n");
+
+		if (!IS_ERR(host->normal_state) && !IS_ERR(host->idle_state))
+			pinctrl_select_state(host->pinctrl, host->idle_state);
+		else
+			host->pinctrl = NULL;
+	}
+
 	return pdata;
 }
 
@@ -3329,7 +3354,7 @@
 			return ret;
 		}
 	}
-#ifdef CONFIG_ROCKCHIP_THUNDER_BOOT
+#ifdef CONFIG_ROCKCHIP_THUNDER_BOOT_MMC
 	if (device_property_read_bool(host->dev, "supports-emmc")) {
 		if (readl_poll_timeout(host->regs + SDMMC_STATUS,
 				fifo_size,
diff --git a/kernel/drivers/mmc/host/dw_mmc.h b/kernel/drivers/mmc/host/dw_mmc.h
index 18c0236..12539bc 100644
--- a/kernel/drivers/mmc/host/dw_mmc.h
+++ b/kernel/drivers/mmc/host/dw_mmc.h
@@ -236,6 +236,9 @@
 	struct timer_list       dto_timer;
 	bool			need_xfer_timer;
 	struct timer_list       xfer_timer;
+	struct pinctrl		*pinctrl;
+	struct pinctrl_state	*normal_state;
+	struct pinctrl_state	*idle_state;
 };
 
 /* DMA ops for Internal/External DMAC interface */
diff --git a/kernel/drivers/mmc/host/jz4740_mmc.c b/kernel/drivers/mmc/host/jz4740_mmc.c
index 864338e..9a7b9cc 100644
--- a/kernel/drivers/mmc/host/jz4740_mmc.c
+++ b/kernel/drivers/mmc/host/jz4740_mmc.c
@@ -1188,6 +1188,7 @@
 	.remove = jz4740_mmc_remove,
 	.driver = {
 		.name = "jz4740-mmc",
+		.probe_type = PROBE_PREFER_ASYNCHRONOUS,
 		.of_match_table = of_match_ptr(jz4740_mmc_of_match),
 		.pm = JZ4740_MMC_PM_OPS,
 	},
diff --git a/kernel/drivers/mmc/host/moxart-mmc.c b/kernel/drivers/mmc/host/moxart-mmc.c
index 5c81dc7..f2dfb39 100644
--- a/kernel/drivers/mmc/host/moxart-mmc.c
+++ b/kernel/drivers/mmc/host/moxart-mmc.c
@@ -718,6 +718,7 @@
 	.remove     = moxart_remove,
 	.driver     = {
 		.name		= "mmc-moxart",
+		.probe_type	= PROBE_PREFER_ASYNCHRONOUS,
 		.of_match_table	= moxart_mmc_match,
 	},
 };
diff --git a/kernel/drivers/mmc/host/mtk-sd.c b/kernel/drivers/mmc/host/mtk-sd.c
index 967e477..f0f6170 100644
--- a/kernel/drivers/mmc/host/mtk-sd.c
+++ b/kernel/drivers/mmc/host/mtk-sd.c
@@ -2115,6 +2115,7 @@
 	.remove = msdc_drv_remove,
 	.driver = {
 		.name = "mtk-msdc",
+		.probe_type = PROBE_PREFER_ASYNCHRONOUS,
 		.of_match_table = msdc_of_ids,
 		.pm = &msdc_dev_pm_ops,
 	},
diff --git a/kernel/drivers/mmc/host/mvsdio.c b/kernel/drivers/mmc/host/mvsdio.c
index e22bbff..baf7e3e 100644
--- a/kernel/drivers/mmc/host/mvsdio.c
+++ b/kernel/drivers/mmc/host/mvsdio.c
@@ -831,6 +831,7 @@
 	.remove		= mvsd_remove,
 	.driver		= {
 		.name	= DRIVER_NAME,
+		.probe_type = PROBE_PREFER_ASYNCHRONOUS,
 		.of_match_table = mvsdio_dt_ids,
 	},
 };
diff --git a/kernel/drivers/mmc/host/mxcmmc.c b/kernel/drivers/mmc/host/mxcmmc.c
index 2f604b3..24a01fd 100644
--- a/kernel/drivers/mmc/host/mxcmmc.c
+++ b/kernel/drivers/mmc/host/mxcmmc.c
@@ -1244,6 +1244,7 @@
 	.id_table	= mxcmci_devtype,
 	.driver		= {
 		.name		= DRIVER_NAME,
+		.probe_type	= PROBE_PREFER_ASYNCHRONOUS,
 		.pm	= &mxcmci_pm_ops,
 		.of_match_table	= mxcmci_of_match,
 	}
diff --git a/kernel/drivers/mmc/host/mxs-mmc.c b/kernel/drivers/mmc/host/mxs-mmc.c
index d7601dc..02cecad 100644
--- a/kernel/drivers/mmc/host/mxs-mmc.c
+++ b/kernel/drivers/mmc/host/mxs-mmc.c
@@ -752,6 +752,7 @@
 	.id_table	= mxs_ssp_ids,
 	.driver		= {
 		.name	= DRIVER_NAME,
+		.probe_type = PROBE_PREFER_ASYNCHRONOUS,
 		.pm	= &mxs_mmc_pm_ops,
 		.of_match_table = mxs_mmc_dt_ids,
 	},
diff --git a/kernel/drivers/mmc/host/omap.c b/kernel/drivers/mmc/host/omap.c
index b2873a2..7a8273c 100644
--- a/kernel/drivers/mmc/host/omap.c
+++ b/kernel/drivers/mmc/host/omap.c
@@ -1507,6 +1507,7 @@
 	.remove		= mmc_omap_remove,
 	.driver		= {
 		.name	= DRIVER_NAME,
+		.probe_type = PROBE_PREFER_ASYNCHRONOUS,
 		.of_match_table = of_match_ptr(mmc_omap_match),
 	},
 };
diff --git a/kernel/drivers/mmc/host/omap_hsmmc.c b/kernel/drivers/mmc/host/omap_hsmmc.c
index 0135693..1652832 100644
--- a/kernel/drivers/mmc/host/omap_hsmmc.c
+++ b/kernel/drivers/mmc/host/omap_hsmmc.c
@@ -2357,6 +2357,7 @@
 	.remove		= omap_hsmmc_remove,
 	.driver		= {
 		.name = DRIVER_NAME,
+		.probe_type = PROBE_PREFER_ASYNCHRONOUS,
 		.pm = &omap_hsmmc_dev_pm_ops,
 		.of_match_table = of_match_ptr(omap_mmc_of_match),
 	},
diff --git a/kernel/drivers/mmc/host/pxamci.c b/kernel/drivers/mmc/host/pxamci.c
index 00b5465..1db0d03 100644
--- a/kernel/drivers/mmc/host/pxamci.c
+++ b/kernel/drivers/mmc/host/pxamci.c
@@ -828,6 +828,7 @@
 	.remove		= pxamci_remove,
 	.driver		= {
 		.name	= DRIVER_NAME,
+		.probe_type = PROBE_PREFER_ASYNCHRONOUS,
 		.of_match_table = of_match_ptr(pxa_mmc_dt_ids),
 	},
 };
diff --git a/kernel/drivers/mmc/host/rtsx_pci_sdmmc.c b/kernel/drivers/mmc/host/rtsx_pci_sdmmc.c
index c1de8fa..6df6877 100644
--- a/kernel/drivers/mmc/host/rtsx_pci_sdmmc.c
+++ b/kernel/drivers/mmc/host/rtsx_pci_sdmmc.c
@@ -1491,6 +1491,7 @@
 	.id_table       = rtsx_pci_sdmmc_ids,
 	.driver		= {
 		.name	= DRV_NAME_RTSX_PCI_SDMMC,
+		.probe_type = PROBE_PREFER_ASYNCHRONOUS,
 	},
 };
 module_platform_driver(rtsx_pci_sdmmc_driver);
diff --git a/kernel/drivers/mmc/host/rtsx_usb_sdmmc.c b/kernel/drivers/mmc/host/rtsx_usb_sdmmc.c
index 9a3ff22..5aa69a4 100644
--- a/kernel/drivers/mmc/host/rtsx_usb_sdmmc.c
+++ b/kernel/drivers/mmc/host/rtsx_usb_sdmmc.c
@@ -1443,6 +1443,7 @@
 	.id_table       = rtsx_usb_sdmmc_ids,
 	.driver		= {
 		.name	= "rtsx_usb_sdmmc",
+		.probe_type = PROBE_PREFER_ASYNCHRONOUS,
 	},
 };
 module_platform_driver(rtsx_usb_sdmmc_driver);
diff --git a/kernel/drivers/mmc/host/s3cmci.c b/kernel/drivers/mmc/host/s3cmci.c
index f774936..b8ab04f 100644
--- a/kernel/drivers/mmc/host/s3cmci.c
+++ b/kernel/drivers/mmc/host/s3cmci.c
@@ -1864,6 +1864,7 @@
 static struct platform_driver s3cmci_driver = {
 	.driver	= {
 		.name	= "s3c-sdi",
+		.probe_type = PROBE_PREFER_ASYNCHRONOUS,
 		.of_match_table = s3cmci_dt_match,
 	},
 	.id_table	= s3cmci_driver_ids,
diff --git a/kernel/drivers/mmc/host/sdhci-acpi.c b/kernel/drivers/mmc/host/sdhci-acpi.c
index 6cc187c..ded5914 100644
--- a/kernel/drivers/mmc/host/sdhci-acpi.c
+++ b/kernel/drivers/mmc/host/sdhci-acpi.c
@@ -886,6 +886,7 @@
 static struct platform_driver sdhci_acpi_driver = {
 	.driver = {
 		.name			= "sdhci-acpi",
+		.probe_type		= PROBE_PREFER_ASYNCHRONOUS,
 		.acpi_match_table	= sdhci_acpi_ids,
 		.pm			= &sdhci_acpi_pm_ops,
 	},
diff --git a/kernel/drivers/mmc/host/sdhci-bcm-kona.c b/kernel/drivers/mmc/host/sdhci-bcm-kona.c
index bdbd489..769dd94 100644
--- a/kernel/drivers/mmc/host/sdhci-bcm-kona.c
+++ b/kernel/drivers/mmc/host/sdhci-bcm-kona.c
@@ -326,6 +326,7 @@
 static struct platform_driver sdhci_bcm_kona_driver = {
 	.driver		= {
 		.name	= "sdhci-kona",
+		.probe_type = PROBE_PREFER_ASYNCHRONOUS,
 		.pm	= &sdhci_pltfm_pmops,
 		.of_match_table = sdhci_bcm_kona_of_match,
 	},
diff --git a/kernel/drivers/mmc/host/sdhci-cns3xxx.c b/kernel/drivers/mmc/host/sdhci-cns3xxx.c
index bd286db..f704cd8 100644
--- a/kernel/drivers/mmc/host/sdhci-cns3xxx.c
+++ b/kernel/drivers/mmc/host/sdhci-cns3xxx.c
@@ -101,6 +101,7 @@
 static struct platform_driver sdhci_cns3xxx_driver = {
 	.driver		= {
 		.name	= "sdhci-cns3xxx",
+		.probe_type = PROBE_PREFER_ASYNCHRONOUS,
 		.pm	= &sdhci_pltfm_pmops,
 	},
 	.probe		= sdhci_cns3xxx_probe,
diff --git a/kernel/drivers/mmc/host/sdhci-dove.c b/kernel/drivers/mmc/host/sdhci-dove.c
index de9f960..60854d7 100644
--- a/kernel/drivers/mmc/host/sdhci-dove.c
+++ b/kernel/drivers/mmc/host/sdhci-dove.c
@@ -117,6 +117,7 @@
 static struct platform_driver sdhci_dove_driver = {
 	.driver		= {
 		.name	= "sdhci-dove",
+		.probe_type = PROBE_PREFER_ASYNCHRONOUS,
 		.pm	= &sdhci_pltfm_pmops,
 		.of_match_table = sdhci_dove_of_match_table,
 	},
diff --git a/kernel/drivers/mmc/host/sdhci-esdhc-imx.c b/kernel/drivers/mmc/host/sdhci-esdhc-imx.c
index f8a4791..c735685 100644
--- a/kernel/drivers/mmc/host/sdhci-esdhc-imx.c
+++ b/kernel/drivers/mmc/host/sdhci-esdhc-imx.c
@@ -1501,6 +1501,7 @@
 static struct platform_driver sdhci_esdhc_imx_driver = {
 	.driver		= {
 		.name	= "sdhci-esdhc-imx",
+		.probe_type = PROBE_PREFER_ASYNCHRONOUS,
 		.of_match_table = imx_esdhc_dt_ids,
 		.pm	= &sdhci_esdhc_pmops,
 	},
diff --git a/kernel/drivers/mmc/host/sdhci-iproc.c b/kernel/drivers/mmc/host/sdhci-iproc.c
index f903ab9..a533ba9 100644
--- a/kernel/drivers/mmc/host/sdhci-iproc.c
+++ b/kernel/drivers/mmc/host/sdhci-iproc.c
@@ -321,6 +321,7 @@
 static struct platform_driver sdhci_iproc_driver = {
 	.driver = {
 		.name = "sdhci-iproc",
+		.probe_type = PROBE_PREFER_ASYNCHRONOUS,
 		.of_match_table = sdhci_iproc_of_match,
 		.pm = &sdhci_pltfm_pmops,
 	},
diff --git a/kernel/drivers/mmc/host/sdhci-of-arasan.c b/kernel/drivers/mmc/host/sdhci-of-arasan.c
index e4fb3f6..1da1df8 100644
--- a/kernel/drivers/mmc/host/sdhci-of-arasan.c
+++ b/kernel/drivers/mmc/host/sdhci-of-arasan.c
@@ -884,6 +884,7 @@
 static struct platform_driver sdhci_arasan_driver = {
 	.driver = {
 		.name = "sdhci-arasan",
+		.probe_type = PROBE_PREFER_ASYNCHRONOUS,
 		.of_match_table = sdhci_arasan_of_match,
 		.pm = &sdhci_arasan_dev_pm_ops,
 	},
diff --git a/kernel/drivers/mmc/host/sdhci-of-at91.c b/kernel/drivers/mmc/host/sdhci-of-at91.c
index 8cd1794..05901da 100644
--- a/kernel/drivers/mmc/host/sdhci-of-at91.c
+++ b/kernel/drivers/mmc/host/sdhci-of-at91.c
@@ -455,6 +455,7 @@
 static struct platform_driver sdhci_at91_driver = {
 	.driver		= {
 		.name	= "sdhci-at91",
+		.probe_type = PROBE_PREFER_ASYNCHRONOUS,
 		.of_match_table = sdhci_at91_dt_match,
 		.pm	= &sdhci_at91_dev_pm_ops,
 	},
diff --git a/kernel/drivers/mmc/host/sdhci-of-dwcmshc.c b/kernel/drivers/mmc/host/sdhci-of-dwcmshc.c
index 54736dc..c1d95d7 100644
--- a/kernel/drivers/mmc/host/sdhci-of-dwcmshc.c
+++ b/kernel/drivers/mmc/host/sdhci-of-dwcmshc.c
@@ -39,6 +39,7 @@
 #define DWCMSHC_EMMC_DLL_STRBIN		0x80c
 #define DECMSHC_EMMC_DLL_CMDOUT		0x810
 #define DWCMSHC_EMMC_DLL_STATUS0	0x840
+#define DWCMSHC_EMMC_DLL_STATUS1	0x844
 
 #define DWCMSHC_EMMC_DLL_START		BIT(0)
 #define DWCMSHC_EMMC_DLL_LOCKED		BIT(8)
@@ -48,26 +49,26 @@
 #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	0x9
+#define DLL_TAP_VALUE_SEL		BIT(25)
+#define DLL_TAP_VALUE_OFFSET		8
+
 #define DLL_TXCLK_TAPNUM_FROM_SW	BIT(24)
 #define DLL_TXCLK_NO_INVERTER		BIT(29)
 
-#define DLL_STRBIN_TAPNUM_DEFAULT	0x4
 #define DLL_STRBIN_TAPNUM_FROM_SW	BIT(24)
 #define DLL_STRBIN_DELAY_NUM_SEL	BIT(26)
 #define DLL_STRBIN_DELAY_NUM_OFFSET	16
-#define DLL_STRBIN_DELAY_NUM_DEFAULT	0x10
 
 #define DLL_RXCLK_NO_INVERTER		BIT(29)
+#define DLL_RXCLK_ORI_GATE		BIT(31)
 
 #define DWCMSHC_CARD_IS_EMMC		BIT(0)
 #define DWCMSHC_ENHANCED_STROBE		BIT(8)
 
-#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 DLL_LOCK_WO_TMOUT(x) \
 	((((x) & DWCMSHC_EMMC_DLL_LOCKED) == DWCMSHC_EMMC_DLL_LOCKED) && \
@@ -77,6 +78,21 @@
 #define BOUNDARY_OK(addr, len) \
 	((addr | (SZ_128M - 1)) == ((addr + len - 1) | (SZ_128M - 1)))
 
+struct dwcmshc_driver_data {
+	const struct sdhci_pltfm_data *pdata;
+	u32 flags;
+#define RK_PLATFROM		BIT(0)
+#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 ddr50_strbin_delay_num;
+	u8 hs400_strbin_tap;
+};
+
 struct dwcmshc_priv {
 	struct clk	*bus_clk;
 	u32 cclk_rate;
@@ -84,17 +100,8 @@
 	/* Rockchip specified optional clocks */
 	struct clk_bulk_data rockchip_clks[ROCKCHIP_MAX_CLKS];
 	struct reset_control *reset;
-	int txclk_tapnum;
 	unsigned int actual_clk;
-	u32 flags;
-};
-
-struct dwcmshc_driver_data {
-	const struct sdhci_pltfm_data *pdata;
-	u32 flags;
-#define RK_PLATFROM		BIT(0)
-#define RK_DLL_CMD_OUT		BIT(1)
-#define RK_RXCLK_NO_INVERTER	BIT(2)
+	const struct dwcmshc_driver_data *drv_data;
 };
 
 /*
@@ -195,7 +202,8 @@
 {
 	struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
 	struct dwcmshc_priv *priv = sdhci_pltfm_priv(pltfm_host);
-	u32 txclk_tapnum, extra;
+	const struct dwcmshc_driver_data *drv_data = priv->drv_data;
+	u32 txclk_tapnum, extra, dll_lock_value;
 	int err;
 
 	host->mmc->actual_clock = 0;
@@ -221,13 +229,18 @@
 	extra &= ~BIT(0);
 	sdhci_writel(host, extra, DWCMSHC_HOST_CTRL3);
 
+	/* Disable output clock while config DLL */
+	sdhci_writew(host, 0, SDHCI_CLOCK_CONTROL);
+
 	if (clock <= 52000000) {
+		/* Disable DLL */
+		sdhci_writel(host, 0, DWCMSHC_EMMC_DLL_CTRL);
 		/*
-		 * Disable DLL and reset both of sample and drive clock.
+		 * Config DLL BYPASS and Reset both of sample and drive clock.
 		 * The bypass bit and start bit need to set if DLL is not locked.
 		 */
 		sdhci_writel(host, DWCMSHC_EMMC_DLL_BYPASS | DWCMSHC_EMMC_DLL_START, DWCMSHC_EMMC_DLL_CTRL);
-		sdhci_writel(host, 0, DWCMSHC_EMMC_DLL_RXCLK);
+		sdhci_writel(host, DLL_RXCLK_ORI_GATE, DWCMSHC_EMMC_DLL_RXCLK);
 		sdhci_writel(host, 0, DWCMSHC_EMMC_DLL_TXCLK);
 		sdhci_writel(host, 0, DECMSHC_EMMC_DLL_CMDOUT);
 		/*
@@ -237,24 +250,15 @@
 		 */
 		extra = DWCMSHC_EMMC_DLL_DLYENA |
 			DLL_STRBIN_DELAY_NUM_SEL |
-			DLL_STRBIN_DELAY_NUM_DEFAULT << DLL_STRBIN_DELAY_NUM_OFFSET;
+			drv_data->ddr50_strbin_delay_num << DLL_STRBIN_DELAY_NUM_OFFSET;
 		sdhci_writel(host, extra, DWCMSHC_EMMC_DLL_STRBIN);
-		return;
+		goto exit;
 	}
 
 	/* Reset DLL */
 	sdhci_writel(host, BIT(1), DWCMSHC_EMMC_DLL_CTRL);
 	udelay(1);
 	sdhci_writel(host, 0x0, DWCMSHC_EMMC_DLL_CTRL);
-
-	/*
-	 * We shouldn't set DLL_RXCLK_NO_INVERTER for identify mode but
-	 * we must set it in higher speed mode.
-	 */
-	extra = DWCMSHC_EMMC_DLL_DLYENA;
-	if (priv->flags & RK_RXCLK_NO_INVERTER)
-		extra |= DLL_RXCLK_NO_INVERTER;
-	sdhci_writel(host, extra, DWCMSHC_EMMC_DLL_RXCLK);
 
 	/* Init DLL settings, clean start bit before resetting */
 	sdhci_writel(host, 0, DWCMSHC_EMMC_DLL_CTRL);
@@ -267,38 +271,56 @@
 				 500 * USEC_PER_MSEC);
 	if (err) {
 		dev_err(mmc_dev(host->mmc), "DLL lock timeout!\n");
-		return;
+		goto exit;
 	}
 
+	dll_lock_value = ((sdhci_readl(host, DWCMSHC_EMMC_DLL_STATUS0) & 0xFF) * 2) & 0xFF;
+
 	extra = 0x1 << 16 | /* tune clock stop en */
-		0x2 << 17 | /* pre-change delay */
+		0x3 << 17 | /* pre-change delay */
 		0x3 << 19;  /* post-change delay */
 	sdhci_writel(host, extra, DWCMSHC_EMMC_ATCTRL);
 
-	txclk_tapnum = priv->txclk_tapnum;
+	extra = DWCMSHC_EMMC_DLL_DLYENA | DLL_RXCLK_ORI_GATE;
+	if (drv_data->flags & RK_RXCLK_NO_INVERTER)
+		extra |= DLL_RXCLK_NO_INVERTER;
+	if (drv_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);
 
-	if ((priv->flags & RK_DLL_CMD_OUT) &&
-	    host->mmc->ios.timing == MMC_TIMING_MMC_HS400) {
-		txclk_tapnum = DLL_TXCLK_TAPNUM_90_DEGREES;
+	txclk_tapnum = drv_data->hs200_tx_tap;
+	if (host->mmc->ios.timing == MMC_TIMING_MMC_HS400) {
+		txclk_tapnum = drv_data->hs400_tx_tap;
 
-		extra = DLL_CMDOUT_SRC_CLK_NEG |
-			DLL_CMDOUT_EN_SRC_CLK_NEG |
-			DWCMSHC_EMMC_DLL_DLYENA |
-			DLL_CMDOUT_TAPNUM_90_DEGREES |
-			DLL_CMDOUT_TAPNUM_FROM_SW;
-		sdhci_writel(host, extra, DECMSHC_EMMC_DLL_CMDOUT);
+		if (drv_data->flags & RK_DLL_CMD_OUT) {
+			extra = DLL_CMDOUT_SRC_CLK_NEG |
+				DLL_CMDOUT_BOTH_CLK_EDGE |
+				DWCMSHC_EMMC_DLL_DLYENA |
+				drv_data->hs400_cmd_tap |
+				DLL_CMDOUT_TAPNUM_FROM_SW;
+			if (drv_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_RXCLK_NO_INVERTER |
 		txclk_tapnum;
+	if (drv_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 |
+		drv_data->hs400_strbin_tap |
 		DLL_STRBIN_TAPNUM_FROM_SW;
+	if (drv_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);
+
+exit:
+	/* enable output clock */
+	sdhci_enable_clk(host, 0);
 }
 
 static void rockchip_sdhci_reset(struct sdhci_host *host, u8 mask)
@@ -367,11 +389,31 @@
 static const struct dwcmshc_driver_data rk3568_drvdata = {
 	.pdata = &sdhci_dwcmshc_rk_pdata,
 	.flags = RK_PLATFROM | RK_RXCLK_NO_INVERTER,
+	.hs200_tx_tap = 16,
+	.hs400_tx_tap = 8,
+	.hs400_cmd_tap = 8,
+	.hs400_strbin_tap = 4,
+	.ddr50_strbin_delay_num = 16,
 };
 
 static const struct dwcmshc_driver_data rk3588_drvdata = {
 	.pdata = &sdhci_dwcmshc_rk_pdata,
 	.flags = RK_PLATFROM | RK_DLL_CMD_OUT,
+	.hs200_tx_tap = 16,
+	.hs400_tx_tap = 9,
+	.hs400_cmd_tap = 8,
+	.hs400_strbin_tap = 4,
+	.ddr50_strbin_delay_num = 16,
+};
+
+static const struct dwcmshc_driver_data rk3528_drvdata = {
+	.pdata = &sdhci_dwcmshc_rk_pdata,
+	.flags = RK_PLATFROM | 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 int rockchip_pltf_init(struct sdhci_host *host, struct dwcmshc_priv *priv)
@@ -393,10 +435,6 @@
 		dev_err(mmc_dev(host->mmc), "failed to enable clocks %d\n", err);
 		return err;
 	}
-
-	if (of_property_read_u32(mmc_dev(host->mmc)->of_node, "rockchip,txclk-tapnum",
-				 &priv->txclk_tapnum))
-		priv->txclk_tapnum = DLL_TXCLK_TAPNUM_DEFAULT;
 
 	/* Disable cmd conflict check */
 	sdhci_writel(host, 0x0, DWCMSHC_HOST_CTRL3);
@@ -424,6 +462,10 @@
 	{
 		.compatible = "rockchip,dwcmshc-sdhci",
 		.data = &rk3568_drvdata,
+	},
+	{
+		.compatible = "rockchip,rk3528-dwcmshc",
+		.data = &rk3528_drvdata,
 	},
 	{
 		.compatible = "rockchip,rk3588-dwcmshc",
@@ -463,7 +505,7 @@
 
 	pltfm_host = sdhci_priv(host);
 	priv = sdhci_pltfm_priv(pltfm_host);
-
+	priv->drv_data = drv_data;
 	priv->reset = devm_reset_control_array_get_exclusive(&pdev->dev);
 	pltfm_host->clk = devm_clk_get(&pdev->dev, "core");
 	if (IS_ERR(pltfm_host->clk)) {
@@ -502,7 +544,6 @@
 	if (err)
 		goto err_clk;
 
-	priv->flags = drv_data->flags;
 	if (drv_data->flags & RK_PLATFROM) {
 		err = rockchip_pltf_init(host, priv);
 		if (err)
diff --git a/kernel/drivers/mmc/host/sdhci-of-esdhc.c b/kernel/drivers/mmc/host/sdhci-of-esdhc.c
index d6cb0f9..be26753 100644
--- a/kernel/drivers/mmc/host/sdhci-of-esdhc.c
+++ b/kernel/drivers/mmc/host/sdhci-of-esdhc.c
@@ -969,6 +969,7 @@
 static struct platform_driver sdhci_esdhc_driver = {
 	.driver = {
 		.name = "sdhci-esdhc",
+		.probe_type = PROBE_PREFER_ASYNCHRONOUS,
 		.of_match_table = sdhci_esdhc_of_match,
 		.pm = &esdhc_of_dev_pm_ops,
 	},
diff --git a/kernel/drivers/mmc/host/sdhci-of-hlwd.c b/kernel/drivers/mmc/host/sdhci-of-hlwd.c
index ac00c5e..fa83e0a 100644
--- a/kernel/drivers/mmc/host/sdhci-of-hlwd.c
+++ b/kernel/drivers/mmc/host/sdhci-of-hlwd.c
@@ -84,6 +84,7 @@
 static struct platform_driver sdhci_hlwd_driver = {
 	.driver = {
 		.name = "sdhci-hlwd",
+		.probe_type = PROBE_PREFER_ASYNCHRONOUS,
 		.of_match_table = sdhci_hlwd_of_match,
 		.pm = &sdhci_pltfm_pmops,
 	},
diff --git a/kernel/drivers/mmc/host/sdhci-pxav2.c b/kernel/drivers/mmc/host/sdhci-pxav2.c
index 2c3827f..608b84f 100644
--- a/kernel/drivers/mmc/host/sdhci-pxav2.c
+++ b/kernel/drivers/mmc/host/sdhci-pxav2.c
@@ -236,6 +236,7 @@
 static struct platform_driver sdhci_pxav2_driver = {
 	.driver		= {
 		.name	= "sdhci-pxav2",
+		.probe_type = PROBE_PREFER_ASYNCHRONOUS,
 		.of_match_table = of_match_ptr(sdhci_pxav2_of_match),
 		.pm	= &sdhci_pltfm_pmops,
 	},
diff --git a/kernel/drivers/mmc/host/sdhci-pxav3.c b/kernel/drivers/mmc/host/sdhci-pxav3.c
index b8e96f3..a572197 100644
--- a/kernel/drivers/mmc/host/sdhci-pxav3.c
+++ b/kernel/drivers/mmc/host/sdhci-pxav3.c
@@ -590,6 +590,7 @@
 static struct platform_driver sdhci_pxav3_driver = {
 	.driver		= {
 		.name	= "sdhci-pxav3",
+		.probe_type = PROBE_PREFER_ASYNCHRONOUS,
 		.of_match_table = of_match_ptr(sdhci_pxav3_of_match),
 		.pm	= &sdhci_pxav3_pmops,
 	},
diff --git a/kernel/drivers/mmc/host/sdhci-s3c.c b/kernel/drivers/mmc/host/sdhci-s3c.c
index 9ef89d0..a8b9929 100644
--- a/kernel/drivers/mmc/host/sdhci-s3c.c
+++ b/kernel/drivers/mmc/host/sdhci-s3c.c
@@ -788,6 +788,7 @@
 	.id_table	= sdhci_s3c_driver_ids,
 	.driver		= {
 		.name	= "s3c-sdhci",
+		.probe_type = PROBE_PREFER_ASYNCHRONOUS,
 		.of_match_table = of_match_ptr(sdhci_s3c_dt_match),
 		.pm	= &sdhci_s3c_pmops,
 	},
diff --git a/kernel/drivers/mmc/host/sdhci-sirf.c b/kernel/drivers/mmc/host/sdhci-sirf.c
index 391d52b..4ab4e82 100644
--- a/kernel/drivers/mmc/host/sdhci-sirf.c
+++ b/kernel/drivers/mmc/host/sdhci-sirf.c
@@ -239,6 +239,7 @@
 static struct platform_driver sdhci_sirf_driver = {
 	.driver		= {
 		.name	= "sdhci-sirf",
+		.probe_type = PROBE_PREFER_ASYNCHRONOUS,
 		.of_match_table = sdhci_sirf_of_match,
 		.pm	= &sdhci_pltfm_pmops,
 	},
diff --git a/kernel/drivers/mmc/host/sdhci-spear.c b/kernel/drivers/mmc/host/sdhci-spear.c
index 9247d51..ba99f1b 100644
--- a/kernel/drivers/mmc/host/sdhci-spear.c
+++ b/kernel/drivers/mmc/host/sdhci-spear.c
@@ -206,6 +206,7 @@
 static struct platform_driver sdhci_driver = {
 	.driver = {
 		.name	= "sdhci",
+		.probe_type = PROBE_PREFER_ASYNCHRONOUS,
 		.pm	= &sdhci_pm_ops,
 		.of_match_table = of_match_ptr(sdhci_spear_id_table),
 	},
diff --git a/kernel/drivers/mmc/host/sdhci-st.c b/kernel/drivers/mmc/host/sdhci-st.c
index 8f95647..96a4b6b 100644
--- a/kernel/drivers/mmc/host/sdhci-st.c
+++ b/kernel/drivers/mmc/host/sdhci-st.c
@@ -530,6 +530,7 @@
 	.remove = sdhci_st_remove,
 	.driver = {
 		   .name = "sdhci-st",
+		   .probe_type = PROBE_PREFER_ASYNCHRONOUS,
 		   .pm = &sdhci_st_pmops,
 		   .of_match_table = of_match_ptr(st_sdhci_match),
 		  },
diff --git a/kernel/drivers/mmc/host/sdhci-tegra.c b/kernel/drivers/mmc/host/sdhci-tegra.c
index 27bdf6d..b5ccd1c 100644
--- a/kernel/drivers/mmc/host/sdhci-tegra.c
+++ b/kernel/drivers/mmc/host/sdhci-tegra.c
@@ -578,6 +578,7 @@
 static struct platform_driver sdhci_tegra_driver = {
 	.driver		= {
 		.name	= "sdhci-tegra",
+		.probe_type = PROBE_PREFER_ASYNCHRONOUS,
 		.of_match_table = sdhci_tegra_dt_match,
 		.pm	= &sdhci_pltfm_pmops,
 	},
diff --git a/kernel/drivers/mmc/host/sdhci_f_sdh30.c b/kernel/drivers/mmc/host/sdhci_f_sdh30.c
index 485f759..55e2cd2 100644
--- a/kernel/drivers/mmc/host/sdhci_f_sdh30.c
+++ b/kernel/drivers/mmc/host/sdhci_f_sdh30.c
@@ -250,6 +250,7 @@
 static struct platform_driver sdhci_f_sdh30_driver = {
 	.driver = {
 		.name = "f_sdh30",
+		.probe_type = PROBE_PREFER_ASYNCHRONOUS,
 		.of_match_table = of_match_ptr(f_sdh30_dt_ids),
 		.acpi_match_table = ACPI_PTR(f_sdh30_acpi_ids),
 		.pm	= &sdhci_pltfm_pmops,
diff --git a/kernel/drivers/mmc/host/sh_mmcif.c b/kernel/drivers/mmc/host/sh_mmcif.c
index 4c2a1f8..3e39d4b 100644
--- a/kernel/drivers/mmc/host/sh_mmcif.c
+++ b/kernel/drivers/mmc/host/sh_mmcif.c
@@ -1565,6 +1565,7 @@
 	.remove		= sh_mmcif_remove,
 	.driver		= {
 		.name	= DRIVER_NAME,
+		.probe_type = PROBE_PREFER_ASYNCHRONOUS,
 		.pm	= &sh_mmcif_dev_pm_ops,
 		.of_match_table = sh_mmcif_of_match,
 	},
diff --git a/kernel/drivers/mmc/host/sunxi-mmc.c b/kernel/drivers/mmc/host/sunxi-mmc.c
index c458418..a7b6e4b 100644
--- a/kernel/drivers/mmc/host/sunxi-mmc.c
+++ b/kernel/drivers/mmc/host/sunxi-mmc.c
@@ -1496,6 +1496,7 @@
 static struct platform_driver sunxi_mmc_driver = {
 	.driver = {
 		.name	= "sunxi-mmc",
+		.probe_type = PROBE_PREFER_ASYNCHRONOUS,
 		.of_match_table = of_match_ptr(sunxi_mmc_of_match),
 		.pm = &sunxi_mmc_pm_ops,
 	},
diff --git a/kernel/drivers/mmc/host/tmio_mmc.c b/kernel/drivers/mmc/host/tmio_mmc.c
index 43a2ea5..81fc88c 100644
--- a/kernel/drivers/mmc/host/tmio_mmc.c
+++ b/kernel/drivers/mmc/host/tmio_mmc.c
@@ -153,6 +153,7 @@
 static struct platform_driver tmio_mmc_driver = {
 	.driver = {
 		.name = "tmio-mmc",
+		.probe_type = PROBE_PREFER_ASYNCHRONOUS,
 		.pm = &tmio_mmc_dev_pm_ops,
 	},
 	.probe = tmio_mmc_probe,
diff --git a/kernel/drivers/mmc/host/usdhi6rol0.c b/kernel/drivers/mmc/host/usdhi6rol0.c
index b88728b..bd45cb1 100644
--- a/kernel/drivers/mmc/host/usdhi6rol0.c
+++ b/kernel/drivers/mmc/host/usdhi6rol0.c
@@ -1901,6 +1901,7 @@
 	.remove		= usdhi6_remove,
 	.driver		= {
 		.name	= "usdhi6rol0",
+		.probe_type = PROBE_PREFER_ASYNCHRONOUS,
 		.of_match_table = usdhi6_of_match,
 	},
 };
diff --git a/kernel/drivers/mmc/host/wbsd.c b/kernel/drivers/mmc/host/wbsd.c
index 1e54bbf..71c0c66 100644
--- a/kernel/drivers/mmc/host/wbsd.c
+++ b/kernel/drivers/mmc/host/wbsd.c
@@ -1908,6 +1908,7 @@
 	.resume		= wbsd_platform_resume,
 	.driver		= {
 		.name	= DRIVER_NAME,
+		.probe_type = PROBE_PREFER_ASYNCHRONOUS,
 	},
 };
 
diff --git a/kernel/drivers/mmc/host/wmt-sdmmc.c b/kernel/drivers/mmc/host/wmt-sdmmc.c
index 3ba42f5..f5a692c 100644
--- a/kernel/drivers/mmc/host/wmt-sdmmc.c
+++ b/kernel/drivers/mmc/host/wmt-sdmmc.c
@@ -994,6 +994,7 @@
 	.remove = wmt_mci_remove,
 	.driver = {
 		.name = DRIVER_NAME,
+		.probe_type = PROBE_PREFER_ASYNCHRONOUS,
 		.pm = wmt_mci_pm_ops,
 		.of_match_table = wmt_mci_dt_ids,
 	},
diff --git a/kernel/drivers/mtd/nand/raw/rockchip_nand_v6.c b/kernel/drivers/mtd/nand/raw/rockchip_nand_v6.c
index 1405edb..a8ea5bf 100644
--- a/kernel/drivers/mtd/nand/raw/rockchip_nand_v6.c
+++ b/kernel/drivers/mtd/nand/raw/rockchip_nand_v6.c
@@ -149,6 +149,7 @@
 	int max_ecc_strength;
 	u32 *oob_buf;
 	u32 *page_buf;
+	struct mtd_info *mtd;
 };
 
 static inline struct rk_nfc *to_rk_nfc(struct nand_controller *ctrl)
@@ -348,7 +349,7 @@
 		if (bch_st & NANDC_V6_BCH0_ST_ERR ||
 		    bch_st & NANDC_V6_BCH1_ST_ERR) {
 			mtd->ecc_stats.failed++;
-			max_bitflips = -1;
+			max_bitflips = 0;
 		} else {
 			ret = NANDC_V6_ECC_ERR_CNT0(bch_st);
 			mtd->ecc_stats.corrected += ret;
@@ -599,15 +600,6 @@
 	if (max_strength > nfc->max_ecc_strength)
 		max_strength = nfc->max_ecc_strength;
 
-	nfc->page_buf = kmalloc(mtd->writesize, GFP_KERNEL | GFP_DMA);
-	if (!nfc->page_buf)
-		return -ENOMEM;
-	nfc->oob_buf = kmalloc(ecc->steps * 128, GFP_KERNEL | GFP_DMA);
-	if (!nfc->oob_buf) {
-		kfree(nfc->page_buf);
-		return -ENOMEM;
-	}
-
 	for (i = 0; i < ARRAY_SIZE(strengths); i++)
 		if (max_strength >= strengths[i])
 			break;
@@ -617,6 +609,15 @@
 		return -ENOTSUPP;
 	}
 
+	nfc->page_buf = (u32 *)__get_free_pages(GFP_KERNEL | GFP_DMA32, get_order(mtd->writesize));
+	if (!nfc->page_buf)
+		return -ENOMEM;
+	nfc->oob_buf = (u32 *)__get_free_pages(GFP_KERNEL | GFP_DMA32, get_order(ecc->steps * 128));
+	if (!nfc->oob_buf) {
+		free_pages((unsigned long)nfc->page_buf, get_order(mtd->writesize));
+		return -ENOMEM;
+	}
+	nfc->mtd = mtd;
 	nfc->ecc_mode = strengths[i];
 	rk_nfc_hw_ecc_setup(mtd, ecc, nfc->ecc_mode);
 
@@ -951,10 +952,11 @@
 static int rk_nfc_remove(struct platform_device *pdev)
 {
 	struct rk_nfc *nfc = platform_get_drvdata(pdev);
+	struct nand_chip *nand = mtd_to_nand(nfc->mtd);
 
 	rk_nand_chips_cleanup(nfc);
-	kfree(nfc->page_buf);
-	kfree(nfc->oob_buf);
+	free_pages((unsigned long)nfc->page_buf, get_order(nfc->mtd->writesize));
+	free_pages((unsigned long)nfc->oob_buf, get_order(nand->ecc.steps * 128));
 	clk_disable_unprepare(nfc->clk);
 	clk_disable_unprepare(nfc->hclk);
 	if (!(IS_ERR(nfc->gclk)))
diff --git a/kernel/drivers/mtd/nand/raw/rockchip_nand_v9.c b/kernel/drivers/mtd/nand/raw/rockchip_nand_v9.c
index f5ba7b4..7ef7529 100644
--- a/kernel/drivers/mtd/nand/raw/rockchip_nand_v9.c
+++ b/kernel/drivers/mtd/nand/raw/rockchip_nand_v9.c
@@ -144,6 +144,7 @@
 	int max_ecc_strength;
 	u32 *oob_buf;
 	u32 *page_buf;
+	struct mtd_info *mtd;
 };
 
 static inline struct rk_nfc *to_rk_nfc(struct nand_controller *ctrl)
@@ -338,7 +339,7 @@
 		if (bch_st & NANDC_V9_BCH0_ST_ERR ||
 		    bch_st & NANDC_V9_BCH1_ST_ERR) {
 			mtd->ecc_stats.failed++;
-			max_bitflips = -1;
+			max_bitflips = 0;
 		} else {
 			ret = NANDC_V9_ECC_ERR_CNT0(bch_st);
 			mtd->ecc_stats.corrected += ret;
@@ -584,15 +585,6 @@
 	if (max_strength > nfc->max_ecc_strength)
 		max_strength = nfc->max_ecc_strength;
 
-	nfc->page_buf = kmalloc(mtd->writesize, GFP_KERNEL | GFP_DMA);
-	if (!nfc->page_buf)
-		return -ENOMEM;
-	nfc->oob_buf = kmalloc(ecc->steps * 128, GFP_KERNEL | GFP_DMA);
-	if (!nfc->oob_buf) {
-		kfree(nfc->page_buf);
-		return -ENOMEM;
-	}
-
 	for (i = 0; i < ARRAY_SIZE(strengths); i++)
 		if (max_strength >= strengths[i])
 			break;
@@ -602,6 +594,15 @@
 		return -ENOTSUPP;
 	}
 
+	nfc->page_buf = (u32 *)__get_free_pages(GFP_KERNEL | GFP_DMA32, get_order(mtd->writesize));
+	if (!nfc->page_buf)
+		return -ENOMEM;
+	nfc->oob_buf =  (u32 *)__get_free_pages(GFP_KERNEL | GFP_DMA32, get_order(ecc->steps * 128));
+	if (!nfc->oob_buf) {
+		free_pages((unsigned long)nfc->page_buf, get_order(mtd->writesize));
+		return -ENOMEM;
+	}
+	nfc->mtd = mtd;
 	nfc->ecc_mode = strengths[i];
 	rk_nfc_hw_ecc_setup(mtd, ecc, nfc->ecc_mode);
 
@@ -936,10 +937,11 @@
 static int rk_nfc_remove(struct platform_device *pdev)
 {
 	struct rk_nfc *nfc = platform_get_drvdata(pdev);
+	struct nand_chip *nand = mtd_to_nand(nfc->mtd);
 
 	rk_nand_chips_cleanup(nfc);
-	kfree(nfc->page_buf);
-	kfree(nfc->oob_buf);
+	free_pages((unsigned long)nfc->page_buf, get_order(nfc->mtd->writesize));
+	free_pages((unsigned long)nfc->oob_buf, get_order(nand->ecc.steps * 128));
 	clk_disable_unprepare(nfc->clk);
 	clk_disable_unprepare(nfc->hclk);
 	if (!(IS_ERR(nfc->gclk)))
diff --git a/kernel/drivers/net/ethernet/stmicro/stmmac/Kconfig b/kernel/drivers/net/ethernet/stmicro/stmmac/Kconfig
index 324049e..7d1ae95 100644
--- a/kernel/drivers/net/ethernet/stmicro/stmmac/Kconfig
+++ b/kernel/drivers/net/ethernet/stmicro/stmmac/Kconfig
@@ -12,6 +12,32 @@
 
 if STMMAC_ETH
 
+config STMMAC_UIO
+	tristate "STMMAC_UIO ethernet controller"
+	default n
+	select UIO
+	help
+	  Say M here if you want to use the stmmac_uio.ko for DPDK.
+
+config STMMAC_ETHTOOL
+	bool "Ethtool feature for STMMAC"
+	default STMMAC_ETH
+	help
+	  This selects the ethtool function, default is Y.
+
+config STMMAC_FULL
+	bool "Support full driver for STMMAC"
+	default STMMAC_ETH
+	help
+	  This selects the full function, default is Y, full-featured version
+	  includes 4.10 and other versions, if it is N, only 4.10 core working.
+
+config STMMAC_PTP
+	bool "PTP feature for STMMAC"
+	default STMMAC_ETH
+	help
+	  This selects the ptp timestamp function, default is Y.
+
 config STMMAC_PLATFORM
 	tristate "STMMAC Platform bus support"
 	depends on STMMAC_ETH
@@ -108,6 +134,16 @@
 	  This selects the Rockchip RK3288 SoC glue layer support for
 	  the stmmac device driver.
 
+config DWMAC_ROCKCHIP_TOOL
+	bool "Rockchip dwmac tool support"
+	depends on DWMAC_ROCKCHIP
+	default DWMAC_ROCKCHIP
+	help
+	  Support for Ethernet functions on Rockchip SoCs.
+
+	  This selects the features for Rockchip's Ethernet, include PHY loopback,
+	  MAC loopback, and delayline scanning of RGMII mode.
+
 config DWMAC_SOCFPGA
 	tristate "SOCFPGA dwmac support"
 	default (ARCH_SOCFPGA || ARCH_STRATIX10)
diff --git a/kernel/drivers/net/ethernet/stmicro/stmmac/Makefile b/kernel/drivers/net/ethernet/stmicro/stmmac/Makefile
index 2a3afda..82adb5a 100644
--- a/kernel/drivers/net/ethernet/stmicro/stmmac/Makefile
+++ b/kernel/drivers/net/ethernet/stmicro/stmmac/Makefile
@@ -1,12 +1,19 @@
 # SPDX-License-Identifier: GPL-2.0
 obj-$(CONFIG_STMMAC_ETH) += stmmac.o
-stmmac-objs:= stmmac_main.o stmmac_ethtool.o stmmac_mdio.o ring_mode.o	\
-	      chain_mode.o dwmac_lib.o dwmac1000_core.o dwmac1000_dma.o	\
-	      dwmac100_core.o dwmac100_dma.o enh_desc.o norm_desc.o	\
-	      mmc_core.o stmmac_hwtstamp.o stmmac_ptp.o dwmac4_descs.o	\
-	      dwmac4_dma.o dwmac4_lib.o dwmac4_core.o dwmac5.o hwif.o \
-	      stmmac_tc.o dwxgmac2_core.o dwxgmac2_dma.o dwxgmac2_descs.o \
+
+stmmac-objs:= stmmac_main.o stmmac_mdio.o dwmac_lib.o	\
+	      mmc_core.o dwmac4_descs.o dwmac4_dma.o	\
+	      dwmac4_lib.o dwmac4_core.o hwif.o	\
 	      $(stmmac-y)
+
+stmmac-$(CONFIG_STMMAC_FULL) += ring_mode.o chain_mode.o dwmac1000_core.o	\
+				dwmac1000_dma.o dwmac100_core.o dwmac100_dma.o	\
+				enh_desc.o norm_desc.o dwmac5.o stmmac_tc.o	\
+				dwxgmac2_core.o dwxgmac2_dma.o dwxgmac2_descs.o
+
+stmmac-$(CONFIG_STMMAC_ETHTOOL) += stmmac_ethtool.o
+
+stmmac-$(CONFIG_STMMAC_PTP) += stmmac_hwtstamp.o stmmac_ptp.o
 
 # Ordering matters. Generic driver must be last.
 obj-$(CONFIG_STMMAC_PLATFORM)	+= stmmac-platform.o
@@ -16,7 +23,9 @@
 obj-$(CONFIG_DWMAC_MESON)	+= dwmac-meson.o dwmac-meson8b.o
 obj-$(CONFIG_DWMAC_OXNAS)	+= dwmac-oxnas.o
 obj-$(CONFIG_DWMAC_ROCKCHIP)	+= dwmac-rockchip.o
-dwmac-rockchip-objs := dwmac-rk.o dwmac-rk-tool.o
+dwmac-rockchip-objs := dwmac-rk.o
+dwmac-rockchip-$(CONFIG_DWMAC_ROCKCHIP_TOOL) += dwmac-rk-tool.o
+obj-$(CONFIG_STMMAC_UIO) += stmmac_uio.o
 obj-$(CONFIG_DWMAC_SOCFPGA)	+= dwmac-altr-socfpga.o
 obj-$(CONFIG_DWMAC_STI)		+= dwmac-sti.o
 obj-$(CONFIG_DWMAC_STM32)	+= dwmac-stm32.o
diff --git a/kernel/drivers/net/ethernet/stmicro/stmmac/common.h b/kernel/drivers/net/ethernet/stmicro/stmmac/common.h
index c3c0c8c..6bb4f4e 100644
--- a/kernel/drivers/net/ethernet/stmicro/stmmac/common.h
+++ b/kernel/drivers/net/ethernet/stmicro/stmmac/common.h
@@ -47,8 +47,13 @@
 #define STMMAC_CHAN0	0	/* Always supported and default for all chips */
 
 /* These need to be power of two, and >= 4 */
+#if IS_ENABLED(CONFIG_STMMAC_UIO)
+#define DMA_TX_SIZE 1024
+#define DMA_RX_SIZE 1024
+#else
 #define DMA_TX_SIZE 512
 #define DMA_RX_SIZE 512
+#endif
 #define STMMAC_GET_ENTRY(x, size)	((x + 1) & (size - 1))
 
 #undef FRAME_FILTER_DEBUG
@@ -261,7 +266,7 @@
 #define STMMAC_COAL_TX_TIMER	1000
 #define STMMAC_MAX_COAL_TX_TICK	100000
 #define STMMAC_TX_MAX_FRAMES	256
-#define STMMAC_TX_FRAMES	1
+#define STMMAC_TX_FRAMES	25
 
 /* Packets types */
 enum packets_types {
diff --git a/kernel/drivers/net/ethernet/stmicro/stmmac/dwmac-generic.c b/kernel/drivers/net/ethernet/stmicro/stmmac/dwmac-generic.c
index fad5038..b3365b3 100644
--- a/kernel/drivers/net/ethernet/stmicro/stmmac/dwmac-generic.c
+++ b/kernel/drivers/net/ethernet/stmicro/stmmac/dwmac-generic.c
@@ -71,6 +71,7 @@
 
 static const struct of_device_id dwmac_generic_match[] = {
 	{ .compatible = "st,spear600-gmac"},
+	{ .compatible = "snps,dwmac-3.40a"},
 	{ .compatible = "snps,dwmac-3.50a"},
 	{ .compatible = "snps,dwmac-3.610"},
 	{ .compatible = "snps,dwmac-3.70a"},
diff --git a/kernel/drivers/net/ethernet/stmicro/stmmac/dwmac-ipq806x.c b/kernel/drivers/net/ethernet/stmicro/stmmac/dwmac-ipq806x.c
index 826626e..03b11f1 100644
--- a/kernel/drivers/net/ethernet/stmicro/stmmac/dwmac-ipq806x.c
+++ b/kernel/drivers/net/ethernet/stmicro/stmmac/dwmac-ipq806x.c
@@ -288,10 +288,7 @@
 		val &= ~NSS_COMMON_GMAC_CTL_PHY_IFACE_SEL;
 		break;
 	default:
-		dev_err(&pdev->dev, "Unsupported PHY mode: \"%s\"\n",
-			phy_modes(gmac->phy_mode));
-		err = -EINVAL;
-		goto err_remove_config_dt;
+		goto err_unsupported_phy;
 	}
 	regmap_write(gmac->nss_common, NSS_COMMON_GMAC_CTL(gmac->id), val);
 
@@ -308,10 +305,7 @@
 			NSS_COMMON_CLK_SRC_CTRL_OFFSET(gmac->id);
 		break;
 	default:
-		dev_err(&pdev->dev, "Unsupported PHY mode: \"%s\"\n",
-			phy_modes(gmac->phy_mode));
-		err = -EINVAL;
-		goto err_remove_config_dt;
+		goto err_unsupported_phy;
 	}
 	regmap_write(gmac->nss_common, NSS_COMMON_CLK_SRC_CTRL, val);
 
@@ -328,8 +322,7 @@
 				NSS_COMMON_CLK_GATE_GMII_TX_EN(gmac->id);
 		break;
 	default:
-		/* We don't get here; the switch above will have errored out */
-		unreachable();
+		goto err_unsupported_phy;
 	}
 	regmap_write(gmac->nss_common, NSS_COMMON_CLK_GATE, val);
 
@@ -351,6 +344,8 @@
 	plat_dat->bsp_priv = gmac;
 	plat_dat->fix_mac_speed = ipq806x_gmac_fix_mac_speed;
 	plat_dat->multicast_filter_bins = 0;
+	plat_dat->tx_fifo_size = 8192;
+	plat_dat->rx_fifo_size = 8192;
 
 	err = stmmac_dvr_probe(&pdev->dev, plat_dat, &stmmac_res);
 	if (err)
@@ -358,6 +353,11 @@
 
 	return 0;
 
+err_unsupported_phy:
+	dev_err(&pdev->dev, "Unsupported PHY mode: \"%s\"\n",
+		phy_modes(gmac->phy_mode));
+	err = -EINVAL;
+
 err_remove_config_dt:
 	stmmac_remove_config_dt(pdev, plat_dat);
 
diff --git a/kernel/drivers/net/ethernet/stmicro/stmmac/dwmac-rk-tool.c b/kernel/drivers/net/ethernet/stmicro/stmmac/dwmac-rk-tool.c
index 46633a6..aea25b6 100644
--- a/kernel/drivers/net/ethernet/stmicro/stmmac/dwmac-rk-tool.c
+++ b/kernel/drivers/net/ethernet/stmicro/stmmac/dwmac-rk-tool.c
@@ -85,6 +85,7 @@
 	int rx;
 	int final_tx;
 	int final_rx;
+	int max_delay;
 };
 
 #define DMA_CONTROL_OSP		BIT(4)
@@ -545,15 +546,15 @@
 static void dwmac_rk_rx_clean(struct stmmac_priv *priv,
 			      struct dwmac_rk_lb_priv *lb_priv)
 {
-	struct sk_buff *skb;
-
-	skb = lb_priv->rx_skbuff;
-
-	if (likely(lb_priv->rx_skbuff)) {
+	if (likely(lb_priv->rx_skbuff_dma)) {
 		dma_unmap_single(priv->device,
 				 lb_priv->rx_skbuff_dma,
 				 lb_priv->dma_buf_sz, DMA_FROM_DEVICE);
-		dev_kfree_skb(skb);
+		lb_priv->rx_skbuff_dma = 0;
+	}
+
+	if (likely(lb_priv->rx_skbuff)) {
+		dev_consume_skb_any(lb_priv->rx_skbuff);
 		lb_priv->rx_skbuff = NULL;
 	}
 }
@@ -582,7 +583,12 @@
 	}
 
 	frame_len -= ETH_FCS_LEN;
+	prefetch(skb->data - NET_IP_ALIGN);
 	skb_put(skb, frame_len);
+	dma_unmap_single(priv->device,
+			 lb_priv->rx_skbuff_dma,
+			 lb_priv->dma_buf_sz,
+			 DMA_FROM_DEVICE);
 
 	return dwmac_rk_loopback_validate(priv, lb_priv, skb);
 }
@@ -616,10 +622,9 @@
 static void dwmac_rk_tx_clean(struct stmmac_priv *priv,
 			      struct dwmac_rk_lb_priv *lb_priv)
 {
-	struct sk_buff *skb;
+	struct sk_buff *skb = lb_priv->tx_skbuff;
 	struct dma_desc *p;
 
-	skb = lb_priv->tx_skbuff;
 	p = lb_priv->dma_tx;
 
 	if (likely(lb_priv->tx_skbuff_dma)) {
@@ -631,7 +636,7 @@
 	}
 
 	if (likely(skb)) {
-		dev_kfree_skb(skb);
+		dev_consume_skb_any(skb);
 		lb_priv->tx_skbuff = NULL;
 	}
 
@@ -655,9 +660,10 @@
 	lb_priv->tx_skbuff = skb;
 
 	des = dma_map_single(priv->device, skb->data,
-				    nopaged_len, DMA_TO_DEVICE);
+			     nopaged_len, DMA_TO_DEVICE);
 	if (dma_mapping_error(priv->device, des))
 		goto dma_map_err;
+	lb_priv->tx_skbuff_dma = des;
 
 	stmmac_set_desc_addr(priv, desc, des);
 	lb_priv->tx_skbuff_dma_len = nopaged_len;
@@ -771,9 +777,20 @@
 	return __dwmac_rk_loopback_run(priv, lb_priv);
 }
 
-static inline bool dwmac_rk_delayline_is_valid(int tx, int rx)
+static inline bool dwmac_rk_delayline_is_txvalid(struct dwmac_rk_lb_priv *lb_priv,
+						 int tx)
 {
-	if ((tx > 0 && tx < MAX_DELAYLINE) && (rx > 0 && rx < MAX_DELAYLINE))
+	if (tx > 0 && tx < lb_priv->max_delay)
+		return true;
+	else
+		return false;
+}
+
+static inline bool dwmac_rk_delayline_is_valid(struct dwmac_rk_lb_priv *lb_priv,
+					       int tx, int rx)
+{
+	if ((tx > 0 && tx < lb_priv->max_delay) &&
+	    (rx > 0 && rx < lb_priv->max_delay))
 		return true;
 	else
 		return false;
@@ -784,7 +801,7 @@
 {
 	int tx_left, tx_right, rx_up, rx_down;
 	int i, j, tx_index, rx_index;
-	int tx_mid, rx_mid;
+	int tx_mid = 0, rx_mid = 0;
 
 	/* initiation */
 	tx_index = SCAN_STEP;
@@ -792,12 +809,12 @@
 
 re_scan:
 	/* start from rx based on the experience */
-	for (i = rx_index; i <= (MAX_DELAYLINE - SCAN_STEP); i += SCAN_STEP) {
+	for (i = rx_index; i <= (lb_priv->max_delay - SCAN_STEP); i += SCAN_STEP) {
 		tx_left = 0;
 		tx_right = 0;
 		tx_mid = 0;
 
-		for (j = tx_index; j <= (MAX_DELAYLINE - SCAN_STEP);
+		for (j = tx_index; j <= (lb_priv->max_delay - SCAN_STEP);
 		     j += SCAN_STEP) {
 			if (!dwmac_rk_loopback_with_identify(priv,
 			    lb_priv, j, i)) {
@@ -815,14 +832,14 @@
 	}
 
 	/* Worst case: reach the end */
-	if (i >= (MAX_DELAYLINE - SCAN_STEP))
+	if (i >= (lb_priv->max_delay - SCAN_STEP))
 		goto end;
 
 	rx_up = 0;
 	rx_down = 0;
 
 	/* look for rx_mid base on the tx_mid */
-	for (i = SCAN_STEP; i <= (MAX_DELAYLINE - SCAN_STEP);
+	for (i = SCAN_STEP; i <= (lb_priv->max_delay - SCAN_STEP);
 	     i += SCAN_STEP) {
 		if (!dwmac_rk_loopback_with_identify(priv, lb_priv,
 		    tx_mid, i)) {
@@ -841,23 +858,24 @@
 		goto re_scan;
 	}
 
-	if (dwmac_rk_delayline_is_valid(tx_mid, rx_mid)) {
+	if (dwmac_rk_delayline_is_valid(lb_priv, tx_mid, rx_mid)) {
 		lb_priv->final_tx = tx_mid;
 		lb_priv->final_rx = rx_mid;
 
-		pr_info("Find suitable tx_delay = 0x%02x, rx_delay = 0x%02x\n",
+		pr_info("Find available tx_delay = 0x%02x, rx_delay = 0x%02x\n",
 			lb_priv->final_tx, lb_priv->final_rx);
 
 		return 0;
 	}
 end:
-	pr_err("Can't find suitable delayline\n");
+	pr_err("Can't find available delayline\n");
 	return -ENXIO;
 }
 
 static int dwmac_rk_delayline_scan(struct stmmac_priv *priv,
 				   struct dwmac_rk_lb_priv *lb_priv)
 {
+	int phy_iface = dwmac_rk_get_phy_interface(priv);
 	int tx, rx, tx_sum, rx_sum, count;
 	int tx_mid, rx_mid;
 	int ret = -ENXIO;
@@ -866,9 +884,11 @@
 	rx_sum = 0;
 	count = 0;
 
-	for (rx = 0x0; rx <= MAX_DELAYLINE; rx++) {
-		printk(KERN_CONT "RX(0x%02x):", rx);
-		for (tx = 0x0; tx <= MAX_DELAYLINE; tx++) {
+	for (rx = 0x0; rx <= lb_priv->max_delay; rx++) {
+		if (phy_iface == PHY_INTERFACE_MODE_RGMII_RXID)
+			rx = -1;
+		printk(KERN_CONT "RX(%03d):", rx);
+		for (tx = 0x0; tx <= lb_priv->max_delay; tx++) {
 			if (!dwmac_rk_loopback_with_identify(priv,
 			    lb_priv, tx, rx)) {
 				tx_sum += tx;
@@ -880,24 +900,40 @@
 			}
 		}
 		printk(KERN_CONT "\n");
+
+		if (phy_iface == PHY_INTERFACE_MODE_RGMII_RXID)
+			break;
 	}
 
 	if (tx_sum && rx_sum && count) {
 		tx_mid = tx_sum / count;
 		rx_mid = rx_sum / count;
 
-		if (dwmac_rk_delayline_is_valid(tx_mid, rx_mid)) {
-			lb_priv->final_tx = tx_mid;
-			lb_priv->final_rx = rx_mid;
-			ret = 0;
+		if (phy_iface == PHY_INTERFACE_MODE_RGMII_RXID) {
+			if (dwmac_rk_delayline_is_txvalid(lb_priv, tx_mid)) {
+				lb_priv->final_tx = tx_mid;
+				lb_priv->final_rx = -1;
+				ret = 0;
+			}
+		} else {
+			if (dwmac_rk_delayline_is_valid(lb_priv, tx_mid, rx_mid)) {
+				lb_priv->final_tx = tx_mid;
+				lb_priv->final_rx = rx_mid;
+				ret = 0;
+			}
 		}
 	}
 
-	if (ret)
+	if (ret) {
 		pr_err("\nCan't find suitable delayline\n");
-	else
-		pr_info("\nFind suitable tx_delay = 0x%02x, rx_delay = 0x%02x\n",
-			lb_priv->final_tx, lb_priv->final_rx);
+	} else {
+		if (phy_iface == PHY_INTERFACE_MODE_RGMII_RXID)
+			pr_info("Find available tx_delay = 0x%02x, rx_delay = disable\n",
+				lb_priv->final_tx);
+		else
+			pr_info("\nFind suitable tx_delay = 0x%02x, rx_delay = 0x%02x\n",
+				lb_priv->final_tx, lb_priv->final_rx);
+	}
 
 	return ret;
 }
@@ -1173,6 +1209,11 @@
 	dwmac_rk_free_dma_desc_resources(priv, lb_priv);
 }
 
+static int dwmac_rk_get_max_delayline(struct stmmac_priv *priv)
+{
+	return MAX_DELAYLINE;
+}
+
 static int dwmac_rk_loopback_run(struct stmmac_priv *priv,
 				 struct dwmac_rk_lb_priv *lb_priv)
 {
@@ -1183,6 +1224,8 @@
 
 	if (!ndev || !priv->mii)
 		return -EINVAL;
+
+	lb_priv->max_delay = dwmac_rk_get_max_delayline(priv);
 
 	rtnl_lock();
 	/* check the netdevice up or not */
@@ -1224,7 +1267,9 @@
 	if (lb_priv->scan) {
 		/* scan only support for rgmii mode */
 		if (phy_iface != PHY_INTERFACE_MODE_RGMII &&
-		    phy_iface != PHY_INTERFACE_MODE_RGMII_ID) {
+		    phy_iface != PHY_INTERFACE_MODE_RGMII_ID &&
+		    phy_iface != PHY_INTERFACE_MODE_RGMII_RXID &&
+		    phy_iface != PHY_INTERFACE_MODE_RGMII_TXID) {
 			ret = -EINVAL;
 			goto out;
 		}
@@ -1286,10 +1331,10 @@
 	*data = 0;
 	data++;
 
-	if (kstrtoint(tmp, 0, &tx) || tx > MAX_DELAYLINE)
+	if (kstrtoint(tmp, 0, &tx) || tx > dwmac_rk_get_max_delayline(priv))
 		goto out;
 
-	if (kstrtoint(data, 0, &rx) || rx > MAX_DELAYLINE)
+	if (kstrtoint(data, 0, &rx) || rx > dwmac_rk_get_max_delayline(priv))
 		goto out;
 
 	dwmac_rk_set_rgmii_delayline(priv, tx, rx);
diff --git a/kernel/drivers/net/ethernet/stmicro/stmmac/dwmac-rk-tool.h b/kernel/drivers/net/ethernet/stmicro/stmmac/dwmac-rk-tool.h
index d71989b..5fc7a1b 100644
--- a/kernel/drivers/net/ethernet/stmicro/stmmac/dwmac-rk-tool.h
+++ b/kernel/drivers/net/ethernet/stmicro/stmmac/dwmac-rk-tool.h
@@ -13,8 +13,20 @@
 void dwmac_rk_get_rgmii_delayline(struct stmmac_priv *priv, int *tx_delay, int *rx_delay);
 int dwmac_rk_get_phy_interface(struct stmmac_priv *priv);
 
+#ifdef CONFIG_DWMAC_ROCKCHIP_TOOL
 int dwmac_rk_create_loopback_sysfs(struct device *dev);
 int dwmac_rk_remove_loopback_sysfs(struct device *device);
+#else
+static inline int dwmac_rk_create_loopback_sysfs(struct device *dev)
+{
+	return 0;
+}
+
+static inline int dwmac_rk_remove_loopback_sysfs(struct device *device)
+{
+	return 0;
+}
+#endif
 
 #ifdef CONFIG_DWMAC_RK_AUTO_DELAYLINE
 int dwmac_rk_get_rgmii_delayline_from_vendor(struct stmmac_priv *priv);
@@ -22,4 +34,3 @@
 #endif
 
 #endif /* __DWMAC_RK_TOOL_H__ */
-
diff --git a/kernel/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c b/kernel/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c
index c6b6cae..d945d92 100644
--- a/kernel/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c
+++ b/kernel/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c
@@ -24,6 +24,7 @@
 #include <linux/of_net.h>
 #include <linux/gpio.h>
 #include <linux/module.h>
+#include <linux/nvmem-consumer.h>
 #include <linux/of_gpio.h>
 #include <linux/of_device.h>
 #include <linux/platform_device.h>
@@ -47,7 +48,10 @@
 	void (*set_to_qsgmii)(struct rk_priv_data *bsp_priv);
 	void (*set_rgmii_speed)(struct rk_priv_data *bsp_priv, int speed);
 	void (*set_rmii_speed)(struct rk_priv_data *bsp_priv, int speed);
-	void (*integrated_phy_powerup)(struct rk_priv_data *bsp_priv);
+	void (*set_sgmii_speed)(struct rk_priv_data *bsp_priv, int speed);
+	void (*set_clock_selection)(struct rk_priv_data *bsp_priv, bool input,
+				    bool enable);
+	void (*integrated_phy_power)(struct rk_priv_data *bsp_priv, bool up);
 };
 
 struct rk_priv_data {
@@ -61,6 +65,7 @@
 	bool clk_enabled;
 	bool clock_input;
 	bool integrated_phy;
+	struct phy *comphy;
 
 	struct clk *clk_mac;
 	struct clk *gmac_clkin;
@@ -73,6 +78,7 @@
 	struct clk *pclk_mac;
 	struct clk *clk_phy;
 	struct clk *pclk_xpcs;
+	struct clk *clk_xpcs_eee;
 
 	struct reset_control *phy_reset;
 
@@ -81,6 +87,8 @@
 
 	struct regmap *grf;
 	struct regmap *xpcs;
+
+	unsigned char otp_data;
 };
 
 /* XPCS */
@@ -165,10 +173,10 @@
 	int ret, i, id = bsp_priv->bus_id;
 	u32 val;
 
-	if (mode == PHY_INTERFACE_MODE_QSGMII && id > 0)
+	if (mode == PHY_INTERFACE_MODE_QSGMII && !id)
 		return 0;
 
-	ret = xpcs_soft_reset(bsp_priv, id);
+	ret = xpcs_soft_reset(bsp_priv, 0);
 	if (ret) {
 		dev_err(&bsp_priv->pdev->dev, "xpcs_soft_reset fail %d\n", ret);
 		return ret;
@@ -195,10 +203,10 @@
 				   SR_MII_CTRL_AN_ENABLE);
 		}
 	} else {
-		val = xpcs_read(bsp_priv, SR_MII_OFFSET(id) + VR_MII_DIG_CTRL1);
-		xpcs_write(bsp_priv, SR_MII_OFFSET(id) + VR_MII_DIG_CTRL1,
+		val = xpcs_read(bsp_priv, SR_MII_OFFSET(0) + VR_MII_DIG_CTRL1);
+		xpcs_write(bsp_priv, SR_MII_OFFSET(0) + VR_MII_DIG_CTRL1,
 			   val | MII_MAC_AUTO_SW);
-		xpcs_write(bsp_priv, SR_MII_OFFSET(id) + MII_BMCR,
+		xpcs_write(bsp_priv, SR_MII_OFFSET(0) + MII_BMCR,
 			   SR_MII_CTRL_AN_ENABLE);
 	}
 
@@ -212,8 +220,55 @@
 #define GRF_CLR_BIT(nr)	(BIT(nr+16))
 
 #define DELAY_ENABLE(soc, tx, rx) \
-	(((tx) ? soc##_GMAC_TXCLK_DLY_ENABLE : soc##_GMAC_TXCLK_DLY_DISABLE) | \
-	 ((rx) ? soc##_GMAC_RXCLK_DLY_ENABLE : soc##_GMAC_RXCLK_DLY_DISABLE))
+	((((tx) >= 0) ? soc##_GMAC_TXCLK_DLY_ENABLE : soc##_GMAC_TXCLK_DLY_DISABLE) | \
+	 (((rx) >= 0) ? soc##_GMAC_RXCLK_DLY_ENABLE : soc##_GMAC_RXCLK_DLY_DISABLE))
+
+#define DELAY_VALUE(soc, tx, rx) \
+	((((tx) >= 0) ? soc##_GMAC_CLK_TX_DL_CFG(tx) : 0) | \
+	 (((rx) >= 0) ? soc##_GMAC_CLK_RX_DL_CFG(rx) : 0))
+
+/* Integrated EPHY */
+
+#define RK_GRF_MACPHY_CON0		0xb00
+#define RK_GRF_MACPHY_CON1		0xb04
+#define RK_GRF_MACPHY_CON2		0xb08
+#define RK_GRF_MACPHY_CON3		0xb0c
+
+#define RK_MACPHY_ENABLE		GRF_BIT(0)
+#define RK_MACPHY_DISABLE		GRF_CLR_BIT(0)
+#define RK_MACPHY_CFG_CLK_50M		GRF_BIT(14)
+#define RK_GMAC2PHY_RMII_MODE		(GRF_BIT(6) | GRF_CLR_BIT(7))
+#define RK_GRF_CON2_MACPHY_ID		HIWORD_UPDATE(0x1234, 0xffff, 0)
+#define RK_GRF_CON3_MACPHY_ID		HIWORD_UPDATE(0x35, 0x3f, 0)
+
+static void rk_gmac_integrated_ephy_powerup(struct rk_priv_data *priv)
+{
+	regmap_write(priv->grf, RK_GRF_MACPHY_CON0, RK_MACPHY_CFG_CLK_50M);
+	regmap_write(priv->grf, RK_GRF_MACPHY_CON0, RK_GMAC2PHY_RMII_MODE);
+
+	regmap_write(priv->grf, RK_GRF_MACPHY_CON2, RK_GRF_CON2_MACPHY_ID);
+	regmap_write(priv->grf, RK_GRF_MACPHY_CON3, RK_GRF_CON3_MACPHY_ID);
+
+	if (priv->phy_reset) {
+		/* PHY needs to be disabled before trying to reset it */
+		regmap_write(priv->grf, RK_GRF_MACPHY_CON0, RK_MACPHY_DISABLE);
+		if (priv->phy_reset)
+			reset_control_assert(priv->phy_reset);
+		usleep_range(10, 20);
+		if (priv->phy_reset)
+			reset_control_deassert(priv->phy_reset);
+		usleep_range(10, 20);
+		regmap_write(priv->grf, RK_GRF_MACPHY_CON0, RK_MACPHY_ENABLE);
+		msleep(30);
+	}
+}
+
+static void rk_gmac_integrated_ephy_powerdown(struct rk_priv_data *priv)
+{
+	regmap_write(priv->grf, RK_GRF_MACPHY_CON0, RK_MACPHY_DISABLE);
+	if (priv->phy_reset)
+		reset_control_assert(priv->phy_reset);
+}
 
 #define PX30_GRF_GMAC_CON1		0x0904
 
@@ -306,12 +361,10 @@
 
 	regmap_write(bsp_priv->grf, RK1808_GRF_GMAC_CON1,
 		     RK1808_GMAC_PHY_INTF_SEL_RGMII |
-		     RK1808_GMAC_RXCLK_DLY_ENABLE |
-		     RK1808_GMAC_TXCLK_DLY_ENABLE);
+		     DELAY_ENABLE(RK1808, tx_delay, rx_delay));
 
 	regmap_write(bsp_priv->grf, RK1808_GRF_GMAC_CON0,
-		     RK1808_GMAC_CLK_RX_DL_CFG(rx_delay) |
-		     RK1808_GMAC_CLK_TX_DL_CFG(tx_delay));
+		     DELAY_VALUE(RK1808, tx_delay, rx_delay));
 }
 
 static void rk1808_set_to_rmii(struct rk_priv_data *bsp_priv)
@@ -439,8 +492,7 @@
 		     RK3128_GMAC_RMII_MODE_CLR);
 	regmap_write(bsp_priv->grf, RK3128_GRF_MAC_CON0,
 		     DELAY_ENABLE(RK3128, tx_delay, rx_delay) |
-		     RK3128_GMAC_CLK_RX_DL_CFG(rx_delay) |
-		     RK3128_GMAC_CLK_TX_DL_CFG(tx_delay));
+		     DELAY_VALUE(RK3128, tx_delay, rx_delay));
 }
 
 static void rk3128_set_to_rmii(struct rk_priv_data *bsp_priv)
@@ -556,8 +608,7 @@
 		     DELAY_ENABLE(RK3228, tx_delay, rx_delay));
 
 	regmap_write(bsp_priv->grf, RK3228_GRF_MAC_CON0,
-		     RK3228_GMAC_CLK_RX_DL_CFG(rx_delay) |
-		     RK3228_GMAC_CLK_TX_DL_CFG(tx_delay));
+		     DELAY_VALUE(RK3128, tx_delay, rx_delay));
 }
 
 static void rk3228_set_to_rmii(struct rk_priv_data *bsp_priv)
@@ -620,10 +671,16 @@
 		dev_err(dev, "unknown speed value for RMII! speed=%d", speed);
 }
 
-static void rk3228_integrated_phy_powerup(struct rk_priv_data *priv)
+static void rk3228_integrated_phy_power(struct rk_priv_data *priv, bool up)
 {
-	regmap_write(priv->grf, RK3228_GRF_CON_MUX,
-		     RK3228_GRF_CON_MUX_GMAC_INTEGRATED_PHY);
+	if (up) {
+		regmap_write(priv->grf, RK3228_GRF_CON_MUX,
+			     RK3228_GRF_CON_MUX_GMAC_INTEGRATED_PHY);
+
+		rk_gmac_integrated_ephy_powerup(priv);
+	} else {
+		rk_gmac_integrated_ephy_powerdown(priv);
+	}
 }
 
 static const struct rk_gmac_ops rk3228_ops = {
@@ -631,7 +688,7 @@
 	.set_to_rmii = rk3228_set_to_rmii,
 	.set_rgmii_speed = rk3228_set_rgmii_speed,
 	.set_rmii_speed = rk3228_set_rmii_speed,
-	.integrated_phy_powerup =  rk3228_integrated_phy_powerup,
+	.integrated_phy_power = rk3228_integrated_phy_power,
 };
 
 #define RK3288_GRF_SOC_CON1	0x0248
@@ -677,8 +734,7 @@
 		     RK3288_GMAC_RMII_MODE_CLR);
 	regmap_write(bsp_priv->grf, RK3288_GRF_SOC_CON3,
 		     DELAY_ENABLE(RK3288, tx_delay, rx_delay) |
-		     RK3288_GMAC_CLK_RX_DL_CFG(rx_delay) |
-		     RK3288_GMAC_CLK_TX_DL_CFG(tx_delay));
+		     DELAY_VALUE(RK3288, tx_delay, rx_delay));
 }
 
 static void rk3288_set_to_rmii(struct rk_priv_data *bsp_priv)
@@ -849,12 +905,10 @@
 	regmap_write(bsp_priv->grf, RK3328_GRF_MAC_CON1,
 		     RK3328_GMAC_PHY_INTF_SEL_RGMII |
 		     RK3328_GMAC_RMII_MODE_CLR |
-		     RK3328_GMAC_RXCLK_DLY_ENABLE |
-		     RK3328_GMAC_TXCLK_DLY_ENABLE);
+		     DELAY_ENABLE(RK3328, tx_delay, rx_delay));
 
 	regmap_write(bsp_priv->grf, RK3328_GRF_MAC_CON0,
-		     RK3328_GMAC_CLK_RX_DL_CFG(rx_delay) |
-		     RK3328_GMAC_CLK_TX_DL_CFG(tx_delay));
+		     DELAY_VALUE(RK3328, tx_delay, rx_delay));
 }
 
 static void rk3328_set_to_rmii(struct rk_priv_data *bsp_priv)
@@ -922,10 +976,16 @@
 		dev_err(dev, "unknown speed value for RMII! speed=%d", speed);
 }
 
-static void rk3328_integrated_phy_powerup(struct rk_priv_data *priv)
+static void rk3328_integrated_phy_power(struct rk_priv_data *priv, bool up)
 {
-	regmap_write(priv->grf, RK3328_GRF_MACPHY_CON1,
-		     RK3328_MACPHY_RMII_MODE);
+	if (up) {
+		regmap_write(priv->grf, RK3328_GRF_MACPHY_CON1,
+			     RK3328_MACPHY_RMII_MODE);
+
+		rk_gmac_integrated_ephy_powerup(priv);
+	} else {
+		rk_gmac_integrated_ephy_powerdown(priv);
+	}
 }
 
 static const struct rk_gmac_ops rk3328_ops = {
@@ -933,7 +993,7 @@
 	.set_to_rmii = rk3328_set_to_rmii,
 	.set_rgmii_speed = rk3328_set_rgmii_speed,
 	.set_rmii_speed = rk3328_set_rmii_speed,
-	.integrated_phy_powerup =  rk3328_integrated_phy_powerup,
+	.integrated_phy_power = rk3328_integrated_phy_power,
 };
 
 #define RK3366_GRF_SOC_CON6	0x0418
@@ -979,8 +1039,7 @@
 		     RK3366_GMAC_RMII_MODE_CLR);
 	regmap_write(bsp_priv->grf, RK3366_GRF_SOC_CON7,
 		     DELAY_ENABLE(RK3366, tx_delay, rx_delay) |
-		     RK3366_GMAC_CLK_RX_DL_CFG(rx_delay) |
-		     RK3366_GMAC_CLK_TX_DL_CFG(tx_delay));
+		     DELAY_VALUE(RK3366, tx_delay, rx_delay));
 }
 
 static void rk3366_set_to_rmii(struct rk_priv_data *bsp_priv)
@@ -1090,8 +1149,7 @@
 		     RK3368_GMAC_RMII_MODE_CLR);
 	regmap_write(bsp_priv->grf, RK3368_GRF_SOC_CON16,
 		     DELAY_ENABLE(RK3368, tx_delay, rx_delay) |
-		     RK3368_GMAC_CLK_RX_DL_CFG(rx_delay) |
-		     RK3368_GMAC_CLK_TX_DL_CFG(tx_delay));
+		     DELAY_VALUE(RK3368, tx_delay, rx_delay));
 }
 
 static void rk3368_set_to_rmii(struct rk_priv_data *bsp_priv)
@@ -1201,8 +1259,7 @@
 		     RK3399_GMAC_RMII_MODE_CLR);
 	regmap_write(bsp_priv->grf, RK3399_GRF_SOC_CON6,
 		     DELAY_ENABLE(RK3399, tx_delay, rx_delay) |
-		     RK3399_GMAC_CLK_RX_DL_CFG(rx_delay) |
-		     RK3399_GMAC_CLK_TX_DL_CFG(tx_delay));
+		     DELAY_VALUE(RK3399, tx_delay, rx_delay));
 }
 
 static void rk3399_set_to_rmii(struct rk_priv_data *bsp_priv)
@@ -1267,6 +1324,208 @@
 	.set_to_rmii = rk3399_set_to_rmii,
 	.set_rgmii_speed = rk3399_set_rgmii_speed,
 	.set_rmii_speed = rk3399_set_rmii_speed,
+};
+
+#define RK3528_VO_GRF_GMAC_CON		0X60018
+#define RK3528_VPU_GRF_GMAC_CON5	0X40018
+#define RK3528_VPU_GRF_GMAC_CON6	0X4001c
+
+#define RK3528_GMAC_RXCLK_DLY_ENABLE	GRF_BIT(15)
+#define RK3528_GMAC_RXCLK_DLY_DISABLE	GRF_CLR_BIT(15)
+#define RK3528_GMAC_TXCLK_DLY_ENABLE	GRF_BIT(14)
+#define RK3528_GMAC_TXCLK_DLY_DISABLE	GRF_CLR_BIT(14)
+
+#define RK3528_GMAC_CLK_RX_DL_CFG(val)	HIWORD_UPDATE(val, 0xFF, 8)
+#define RK3528_GMAC_CLK_TX_DL_CFG(val)	HIWORD_UPDATE(val, 0xFF, 0)
+
+#define RK3528_GMAC0_PHY_INTF_SEL_RMII	GRF_BIT(1)
+#define RK3528_GMAC1_PHY_INTF_SEL_RGMII	GRF_CLR_BIT(8)
+#define RK3528_GMAC1_PHY_INTF_SEL_RMII	GRF_BIT(8)
+
+#define RK3528_GMAC1_CLK_SELET_CRU	GRF_CLR_BIT(12)
+#define RK3528_GMAC1_CLK_SELET_IO	GRF_BIT(12)
+
+#define RK3528_GMAC0_CLK_RMII_DIV2	GRF_BIT(3)
+#define RK3528_GMAC0_CLK_RMII_DIV20	GRF_CLR_BIT(3)
+#define RK3528_GMAC1_CLK_RMII_DIV2	GRF_BIT(10)
+#define RK3528_GMAC1_CLK_RMII_DIV20	GRF_CLR_BIT(10)
+
+#define RK3528_GMAC1_CLK_RGMII_DIV1		\
+			(GRF_CLR_BIT(11) | GRF_CLR_BIT(10))
+#define RK3528_GMAC1_CLK_RGMII_DIV5		\
+			(GRF_BIT(11) | GRF_BIT(10))
+#define RK3528_GMAC1_CLK_RGMII_DIV50		\
+			(GRF_BIT(11) | GRF_CLR_BIT(10))
+
+#define RK3528_GMAC0_CLK_RMII_GATE	GRF_BIT(2)
+#define RK3528_GMAC0_CLK_RMII_NOGATE	GRF_CLR_BIT(2)
+#define RK3528_GMAC1_CLK_RMII_GATE	GRF_BIT(9)
+#define RK3528_GMAC1_CLK_RMII_NOGATE	GRF_CLR_BIT(9)
+
+#define RK3528_VO_GRF_MACPHY_CON0		0X6001c
+#define RK3528_VO_GRF_MACPHY_CON1		0X60020
+
+#define RK3528_VO_GRF_MACPHY_SHUTDOWN		GRF_BIT(1)
+#define RK3528_VO_GRF_MACPHY_POWERUP		GRF_CLR_BIT(1)
+#define RK3528_VO_GRF_MACPHY_INTERNAL_RMII_SEL	GRF_BIT(6)
+#define RK3528_VO_GRF_MACPHY_24M_CLK_SEL	(GRF_BIT(8) | GRF_BIT(9))
+#define RK3528_VO_GRF_MACPHY_PHY_ID		GRF_BIT(11)
+
+#define RK3528_VO_GRF_MACPHY_BGS		HIWORD_UPDATE(0x0, 0xf, 0)
+
+static void rk3528_set_to_rgmii(struct rk_priv_data *bsp_priv,
+				int tx_delay, int rx_delay)
+{
+	struct device *dev = &bsp_priv->pdev->dev;
+
+	if (IS_ERR(bsp_priv->grf)) {
+		dev_err(dev, "Missing rockchip,grf property\n");
+		return;
+	}
+
+	regmap_write(bsp_priv->grf, RK3528_VPU_GRF_GMAC_CON5,
+		     RK3528_GMAC1_PHY_INTF_SEL_RGMII);
+
+	regmap_write(bsp_priv->grf, RK3528_VPU_GRF_GMAC_CON5,
+		     DELAY_ENABLE(RK3528, tx_delay, rx_delay));
+
+	regmap_write(bsp_priv->grf, RK3528_VPU_GRF_GMAC_CON6,
+		     DELAY_VALUE(RK3528, tx_delay, rx_delay));
+}
+
+static void rk3528_set_to_rmii(struct rk_priv_data *bsp_priv)
+{
+	struct device *dev = &bsp_priv->pdev->dev;
+	unsigned int id = bsp_priv->bus_id;
+
+	if (IS_ERR(bsp_priv->grf)) {
+		dev_err(dev, "%s: Missing rockchip,grf property\n", __func__);
+		return;
+	}
+
+	if (id == 1)
+		regmap_write(bsp_priv->grf, RK3528_VPU_GRF_GMAC_CON5,
+			     RK3528_GMAC1_PHY_INTF_SEL_RMII);
+	else
+		regmap_write(bsp_priv->grf, RK3528_VO_GRF_GMAC_CON,
+			     RK3528_GMAC0_PHY_INTF_SEL_RMII);
+}
+
+static void rk3528_set_rgmii_speed(struct rk_priv_data *bsp_priv, int speed)
+{
+	struct device *dev = &bsp_priv->pdev->dev;
+	unsigned int val = 0;
+
+	switch (speed) {
+	case 10:
+		val = RK3528_GMAC1_CLK_RGMII_DIV50;
+		break;
+	case 100:
+		val = RK3528_GMAC1_CLK_RGMII_DIV5;
+		break;
+	case 1000:
+		val = RK3528_GMAC1_CLK_RGMII_DIV1;
+		break;
+	default:
+		goto err;
+	}
+
+	regmap_write(bsp_priv->grf, RK3528_VPU_GRF_GMAC_CON5, val);
+	return;
+err:
+	dev_err(dev, "unknown RGMII speed value for GMAC speed=%d", speed);
+}
+
+static void rk3528_set_rmii_speed(struct rk_priv_data *bsp_priv, int speed)
+{
+	struct device *dev = &bsp_priv->pdev->dev;
+	unsigned int val, offset, id = bsp_priv->bus_id;
+
+	switch (speed) {
+	case 10:
+		val = (id == 1) ? RK3528_GMAC1_CLK_RMII_DIV20 :
+				  RK3528_GMAC0_CLK_RMII_DIV20;
+		break;
+	case 100:
+		val = (id == 1) ? RK3528_GMAC1_CLK_RMII_DIV2 :
+				  RK3528_GMAC0_CLK_RMII_DIV2;
+		break;
+	default:
+		goto err;
+	}
+
+	offset = (id == 1) ? RK3528_VPU_GRF_GMAC_CON5 : RK3528_VO_GRF_GMAC_CON;
+	regmap_write(bsp_priv->grf, offset, val);
+
+	return;
+err:
+	dev_err(dev, "unknown RMII speed value for GMAC speed=%d", speed);
+}
+
+static void rk3528_set_clock_selection(struct rk_priv_data *bsp_priv,
+				       bool input, bool enable)
+{
+	unsigned int value, id = bsp_priv->bus_id;
+
+	if (id == 1) {
+		value = input ? RK3528_GMAC1_CLK_SELET_IO :
+				RK3528_GMAC1_CLK_SELET_CRU;
+		value |= enable ? RK3528_GMAC1_CLK_RMII_NOGATE :
+				  RK3528_GMAC1_CLK_RMII_GATE;
+		regmap_write(bsp_priv->grf, RK3528_VPU_GRF_GMAC_CON5, value);
+	} else {
+		value = enable ? RK3528_GMAC0_CLK_RMII_NOGATE :
+				 RK3528_GMAC0_CLK_RMII_GATE;
+		regmap_write(bsp_priv->grf, RK3528_VO_GRF_GMAC_CON, value);
+	}
+}
+
+static void rk3528_integrated_sphy_power(struct rk_priv_data *priv, bool up)
+{
+	struct device *dev = &priv->pdev->dev;
+	unsigned int id = priv->bus_id;
+
+	/* Only GMAC0 support integrated phy */
+	if (id > 0)
+		return;
+
+	if (IS_ERR(priv->grf) || !priv->phy_reset) {
+		dev_err(dev, "%s: Missing rockchip,grf or phy_reset property\n",
+			__func__);
+		return;
+	}
+
+	if (up) {
+		unsigned int bgs = RK3528_VO_GRF_MACPHY_BGS;
+
+		reset_control_assert(priv->phy_reset);
+		udelay(20);
+		regmap_write(priv->grf, RK3528_VO_GRF_MACPHY_CON0,
+			     RK3528_VO_GRF_MACPHY_POWERUP |
+			     RK3528_VO_GRF_MACPHY_INTERNAL_RMII_SEL |
+			     RK3528_VO_GRF_MACPHY_24M_CLK_SEL |
+			     RK3528_VO_GRF_MACPHY_PHY_ID);
+
+		if (priv->otp_data > 0)
+			bgs = HIWORD_UPDATE(priv->otp_data, 0xf, 0);
+
+		regmap_write(priv->grf, RK3528_VO_GRF_MACPHY_CON1, bgs);
+		usleep_range(10 * 1000, 12 * 1000);
+		reset_control_deassert(priv->phy_reset);
+		usleep_range(50 * 1000, 60 * 1000);
+	} else {
+		regmap_write(priv->grf, RK3528_VO_GRF_MACPHY_CON0,
+			     RK3528_VO_GRF_MACPHY_SHUTDOWN);
+	}
+}
+
+static const struct rk_gmac_ops rk3528_ops = {
+	.set_to_rgmii = rk3528_set_to_rgmii,
+	.set_to_rmii = rk3528_set_to_rmii,
+	.set_rgmii_speed = rk3528_set_rgmii_speed,
+	.set_rmii_speed = rk3528_set_rmii_speed,
+	.set_clock_selection = rk3528_set_clock_selection,
+	.integrated_phy_power = rk3528_integrated_sphy_power,
 };
 
 #define RK3568_GRF_GMAC0_CON0		0X0380
@@ -1349,12 +1608,10 @@
 
 	regmap_write(bsp_priv->grf, offset_con1,
 		     RK3568_GMAC_PHY_INTF_SEL_RGMII |
-		     RK3568_GMAC_RXCLK_DLY_ENABLE |
-		     RK3568_GMAC_TXCLK_DLY_ENABLE);
+		     DELAY_ENABLE(RK3568, tx_delay, rx_delay));
 
 	regmap_write(bsp_priv->grf, offset_con0,
-		     RK3568_GMAC_CLK_RX_DL_CFG(rx_delay) |
-		     RK3568_GMAC_CLK_TX_DL_CFG(tx_delay));
+		     DELAY_VALUE(RK3568, tx_delay, rx_delay));
 }
 
 static void rk3568_set_to_rmii(struct rk_priv_data *bsp_priv)
@@ -1400,6 +1657,34 @@
 			__func__, rate, ret);
 }
 
+static void rk3568_set_gmac_sgmii_speed(struct rk_priv_data *bsp_priv, int speed)
+{
+	struct device *dev = &bsp_priv->pdev->dev;
+	unsigned int ctrl;
+
+	/* Only gmac1 set the speed for port1 */
+	if (!bsp_priv->bus_id)
+		return;
+
+	switch (speed) {
+	case 10:
+		ctrl = BMCR_SPEED10;
+		break;
+	case 100:
+		ctrl = BMCR_SPEED100;
+		break;
+	case 1000:
+		ctrl = BMCR_SPEED1000;
+		break;
+	default:
+		dev_err(dev, "unknown speed value for GMAC speed=%d", speed);
+		return;
+	}
+
+	xpcs_write(bsp_priv, SR_MII_OFFSET(bsp_priv->bus_id) + MII_BMCR,
+		   ctrl | BMCR_FULLDPLX);
+}
+
 static const struct rk_gmac_ops rk3568_ops = {
 	.set_to_rgmii = rk3568_set_to_rgmii,
 	.set_to_rmii = rk3568_set_to_rmii,
@@ -1407,6 +1692,7 @@
 	.set_to_qsgmii = rk3568_set_to_qsgmii,
 	.set_rgmii_speed = rk3568_set_gmac_speed,
 	.set_rmii_speed = rk3568_set_gmac_speed,
+	.set_sgmii_speed = rk3568_set_gmac_sgmii_speed,
 };
 
 #define RV1108_GRF_GMAC_CON0		0X0900
@@ -1472,21 +1758,18 @@
 		(GRF_CLR_BIT(4) | GRF_CLR_BIT(5) | GRF_BIT(6))
 #define RV1126_GMAC_FLOW_CTRL			GRF_BIT(7)
 #define RV1126_GMAC_FLOW_CTRL_CLR		GRF_CLR_BIT(7)
-#define RV1126_GMAC_M0_RXCLK_DLY_ENABLE		GRF_BIT(1)
-#define RV1126_GMAC_M0_RXCLK_DLY_DISABLE	GRF_CLR_BIT(1)
-#define RV1126_GMAC_M0_TXCLK_DLY_ENABLE		GRF_BIT(0)
-#define RV1126_GMAC_M0_TXCLK_DLY_DISABLE	GRF_CLR_BIT(0)
-#define RV1126_GMAC_M1_RXCLK_DLY_ENABLE		GRF_BIT(3)
-#define RV1126_GMAC_M1_RXCLK_DLY_DISABLE	GRF_CLR_BIT(3)
-#define RV1126_GMAC_M1_TXCLK_DLY_ENABLE		GRF_BIT(2)
-#define RV1126_GMAC_M1_TXCLK_DLY_DISABLE	GRF_CLR_BIT(2)
+#define RV1126_M0_GMAC_RXCLK_DLY_ENABLE		GRF_BIT(1)
+#define RV1126_M0_GMAC_RXCLK_DLY_DISABLE	GRF_CLR_BIT(1)
+#define RV1126_M0_GMAC_TXCLK_DLY_ENABLE		GRF_BIT(0)
+#define RV1126_M0_GMAC_TXCLK_DLY_DISABLE	GRF_CLR_BIT(0)
+#define RV1126_M1_GMAC_RXCLK_DLY_ENABLE		GRF_BIT(3)
+#define RV1126_M1_GMAC_RXCLK_DLY_DISABLE	GRF_CLR_BIT(3)
+#define RV1126_M1_GMAC_TXCLK_DLY_ENABLE		GRF_BIT(2)
+#define RV1126_M1_GMAC_TXCLK_DLY_DISABLE	GRF_CLR_BIT(2)
 
-/* RV1126_GRF_GMAC_CON1 */
-#define RV1126_GMAC_M0_CLK_RX_DL_CFG(val)	HIWORD_UPDATE(val, 0x7F, 8)
-#define RV1126_GMAC_M0_CLK_TX_DL_CFG(val)	HIWORD_UPDATE(val, 0x7F, 0)
-/* RV1126_GRF_GMAC_CON2 */
-#define RV1126_GMAC_M1_CLK_RX_DL_CFG(val)	HIWORD_UPDATE(val, 0x7F, 8)
-#define RV1126_GMAC_M1_CLK_TX_DL_CFG(val)	HIWORD_UPDATE(val, 0x7F, 0)
+/* RV1126_GRF_GMAC_CON1 && RV1126_GRF_GMAC_CON2 */
+#define RV1126_GMAC_CLK_RX_DL_CFG(val)	HIWORD_UPDATE(val, 0x7F, 8)
+#define RV1126_GMAC_CLK_TX_DL_CFG(val)	HIWORD_UPDATE(val, 0x7F, 0)
 
 static void rv1126_set_to_rgmii(struct rk_priv_data *bsp_priv,
 				int tx_delay, int rx_delay)
@@ -1500,18 +1783,14 @@
 
 	regmap_write(bsp_priv->grf, RV1126_GRF_GMAC_CON0,
 		     RV1126_GMAC_PHY_INTF_SEL_RGMII |
-		     RV1126_GMAC_M0_RXCLK_DLY_ENABLE |
-		     RV1126_GMAC_M0_TXCLK_DLY_ENABLE |
-		     RV1126_GMAC_M1_RXCLK_DLY_ENABLE |
-		     RV1126_GMAC_M1_TXCLK_DLY_ENABLE);
+		     DELAY_ENABLE(RV1126_M0, tx_delay, rx_delay) |
+		     DELAY_ENABLE(RV1126_M1, tx_delay, rx_delay));
 
 	regmap_write(bsp_priv->grf, RV1126_GRF_GMAC_CON1,
-		     RV1126_GMAC_M0_CLK_RX_DL_CFG(rx_delay) |
-		     RV1126_GMAC_M0_CLK_TX_DL_CFG(tx_delay));
+		     DELAY_VALUE(RV1126, tx_delay, rx_delay));
 
 	regmap_write(bsp_priv->grf, RV1126_GRF_GMAC_CON2,
-		     RV1126_GMAC_M1_CLK_RX_DL_CFG(rx_delay) |
-		     RV1126_GMAC_M1_CLK_TX_DL_CFG(tx_delay));
+		     DELAY_VALUE(RV1126, tx_delay, rx_delay));
 }
 
 static void rv1126_set_to_rmii(struct rk_priv_data *bsp_priv)
@@ -1585,50 +1864,6 @@
 	.set_rmii_speed = rv1126_set_rmii_speed,
 };
 
-#define RK_GRF_MACPHY_CON0		0xb00
-#define RK_GRF_MACPHY_CON1		0xb04
-#define RK_GRF_MACPHY_CON2		0xb08
-#define RK_GRF_MACPHY_CON3		0xb0c
-
-#define RK_MACPHY_ENABLE		GRF_BIT(0)
-#define RK_MACPHY_DISABLE		GRF_CLR_BIT(0)
-#define RK_MACPHY_CFG_CLK_50M		GRF_BIT(14)
-#define RK_GMAC2PHY_RMII_MODE		(GRF_BIT(6) | GRF_CLR_BIT(7))
-#define RK_GRF_CON2_MACPHY_ID		HIWORD_UPDATE(0x1234, 0xffff, 0)
-#define RK_GRF_CON3_MACPHY_ID		HIWORD_UPDATE(0x35, 0x3f, 0)
-
-static void rk_gmac_integrated_phy_powerup(struct rk_priv_data *priv)
-{
-	if (priv->ops->integrated_phy_powerup)
-		priv->ops->integrated_phy_powerup(priv);
-
-	regmap_write(priv->grf, RK_GRF_MACPHY_CON0, RK_MACPHY_CFG_CLK_50M);
-	regmap_write(priv->grf, RK_GRF_MACPHY_CON0, RK_GMAC2PHY_RMII_MODE);
-
-	regmap_write(priv->grf, RK_GRF_MACPHY_CON2, RK_GRF_CON2_MACPHY_ID);
-	regmap_write(priv->grf, RK_GRF_MACPHY_CON3, RK_GRF_CON3_MACPHY_ID);
-
-	if (priv->phy_reset) {
-		/* PHY needs to be disabled before trying to reset it */
-		regmap_write(priv->grf, RK_GRF_MACPHY_CON0, RK_MACPHY_DISABLE);
-		if (priv->phy_reset)
-			reset_control_assert(priv->phy_reset);
-		usleep_range(10, 20);
-		if (priv->phy_reset)
-			reset_control_deassert(priv->phy_reset);
-		usleep_range(10, 20);
-		regmap_write(priv->grf, RK_GRF_MACPHY_CON0, RK_MACPHY_ENABLE);
-		msleep(30);
-	}
-}
-
-static void rk_gmac_integrated_phy_powerdown(struct rk_priv_data *priv)
-{
-	regmap_write(priv->grf, RK_GRF_MACPHY_CON0, RK_MACPHY_DISABLE);
-	if (priv->phy_reset)
-		reset_control_assert(priv->phy_reset);
-}
-
 static int rk_gmac_clk_init(struct plat_stmmacenet_data *plat)
 {
 	struct rk_priv_data *bsp_priv = plat->bsp_priv;
@@ -1679,8 +1914,10 @@
 		   bsp_priv->phy_iface == PHY_INTERFACE_MODE_QSGMII) {
 		bsp_priv->pclk_xpcs = devm_clk_get(dev, "pclk_xpcs");
 		if (IS_ERR(bsp_priv->pclk_xpcs))
-			dev_err(dev, "cannot get clock %s\n",
-				"pclk_xpcs");
+			dev_err(dev, "cannot get clock %s\n", "pclk_xpcs");
+		bsp_priv->clk_xpcs_eee = devm_clk_get(dev, "clk_xpcs_eee");
+		if (IS_ERR(bsp_priv->clk_xpcs_eee))
+			dev_err(dev, "cannot get clock %s\n", "clk_xpcs_eee");
 	}
 
 	bsp_priv->clk_mac_speed = devm_clk_get(dev, "clk_mac_speed");
@@ -1748,15 +1985,26 @@
 			if (!IS_ERR(bsp_priv->pclk_xpcs))
 				clk_prepare_enable(bsp_priv->pclk_xpcs);
 
+			if (!IS_ERR(bsp_priv->clk_xpcs_eee))
+				clk_prepare_enable(bsp_priv->clk_xpcs_eee);
+
+			if (bsp_priv->ops && bsp_priv->ops->set_clock_selection)
+				bsp_priv->ops->set_clock_selection(bsp_priv, bsp_priv->clock_input,
+								   true);
+
 			/**
 			 * if (!IS_ERR(bsp_priv->clk_mac))
 			 *	clk_prepare_enable(bsp_priv->clk_mac);
 			 */
-			mdelay(5);
+			usleep_range(100, 200);
 			bsp_priv->clk_enabled = true;
 		}
 	} else {
 		if (bsp_priv->clk_enabled) {
+			if (bsp_priv->ops && bsp_priv->ops->set_clock_selection)
+				bsp_priv->ops->set_clock_selection(bsp_priv, bsp_priv->clock_input,
+								   false);
+
 			if (phy_iface == PHY_INTERFACE_MODE_RMII) {
 				clk_disable_unprepare(bsp_priv->mac_clk_rx);
 
@@ -1776,6 +2024,8 @@
 			clk_disable_unprepare(bsp_priv->clk_mac_speed);
 
 			clk_disable_unprepare(bsp_priv->pclk_xpcs);
+
+			clk_disable_unprepare(bsp_priv->clk_xpcs_eee);
 
 			/**
 			 * if (!IS_ERR(bsp_priv->clk_mac))
@@ -1853,7 +2103,7 @@
 
 	ret = of_property_read_u32(dev->of_node, "tx_delay", &value);
 	if (ret) {
-		bsp_priv->tx_delay = 0x30;
+		bsp_priv->tx_delay = -1;
 		dev_err(dev, "Can not read property: tx_delay.");
 		dev_err(dev, "set tx_delay to 0x%x\n",
 			bsp_priv->tx_delay);
@@ -1864,7 +2114,7 @@
 
 	ret = of_property_read_u32(dev->of_node, "rx_delay", &value);
 	if (ret) {
-		bsp_priv->rx_delay = 0x10;
+		bsp_priv->rx_delay = -1;
 		dev_err(dev, "Can not read property: rx_delay.");
 		dev_err(dev, "set rx_delay to 0x%x\n",
 			bsp_priv->rx_delay);
@@ -1878,24 +2128,45 @@
 	bsp_priv->xpcs = syscon_regmap_lookup_by_phandle(dev->of_node,
 							 "rockchip,xpcs");
 	if (!IS_ERR(bsp_priv->xpcs)) {
-		struct phy *comphy;
-
-		comphy = devm_of_phy_get(&pdev->dev, dev->of_node, NULL);
-		if (IS_ERR(comphy))
+		bsp_priv->comphy = devm_of_phy_get(&pdev->dev, dev->of_node, NULL);
+		if (IS_ERR(bsp_priv->comphy)) {
+			bsp_priv->comphy = NULL;
 			dev_err(dev, "devm_of_phy_get error\n");
-		ret = phy_init(comphy);
-		if (ret)
-			dev_err(dev, "phy_init error\n");
+		}
 	}
 
 	if (plat->phy_node) {
 		bsp_priv->integrated_phy = of_property_read_bool(plat->phy_node,
 								 "phy-is-integrated");
 		if (bsp_priv->integrated_phy) {
+			unsigned char *efuse_buf;
+			struct nvmem_cell *cell;
+			size_t len;
+
 			bsp_priv->phy_reset = of_reset_control_get(plat->phy_node, NULL);
 			if (IS_ERR(bsp_priv->phy_reset)) {
 				dev_err(&pdev->dev, "No PHY reset control found.\n");
 				bsp_priv->phy_reset = NULL;
+			}
+
+			/* Read bgs from OTP if it exists */
+			cell = nvmem_cell_get(dev, "bgs");
+			if (IS_ERR(cell)) {
+				if (PTR_ERR(cell) != -EPROBE_DEFER)
+					dev_info(dev, "failed to get bgs cell: %ld, use default\n",
+						 PTR_ERR(cell));
+				else
+					return ERR_CAST(cell);
+			} else {
+				efuse_buf = nvmem_cell_read(cell, &len);
+				nvmem_cell_put(cell);
+				if (!IS_ERR(efuse_buf)) {
+					if (len == 1)
+						bsp_priv->otp_data = efuse_buf[0];
+					kfree(efuse_buf);
+				} else {
+					dev_err(dev, "failed to get efuse buf, use default\n");
+				}
 			}
 		}
 	}
@@ -1927,17 +2198,17 @@
 	case PHY_INTERFACE_MODE_RGMII_ID:
 		dev_info(dev, "init for RGMII_ID\n");
 		if (bsp_priv->ops && bsp_priv->ops->set_to_rgmii)
-			bsp_priv->ops->set_to_rgmii(bsp_priv, 0, 0);
+			bsp_priv->ops->set_to_rgmii(bsp_priv, -1, -1);
 		break;
 	case PHY_INTERFACE_MODE_RGMII_RXID:
 		dev_info(dev, "init for RGMII_RXID\n");
 		if (bsp_priv->ops && bsp_priv->ops->set_to_rgmii)
-			bsp_priv->ops->set_to_rgmii(bsp_priv, bsp_priv->tx_delay, 0);
+			bsp_priv->ops->set_to_rgmii(bsp_priv, bsp_priv->tx_delay, -1);
 		break;
 	case PHY_INTERFACE_MODE_RGMII_TXID:
 		dev_info(dev, "init for RGMII_TXID\n");
 		if (bsp_priv->ops && bsp_priv->ops->set_to_rgmii)
-			bsp_priv->ops->set_to_rgmii(bsp_priv, 0, bsp_priv->rx_delay);
+			bsp_priv->ops->set_to_rgmii(bsp_priv, -1, bsp_priv->rx_delay);
 		break;
 	case PHY_INTERFACE_MODE_RMII:
 		dev_info(dev, "init for RMII\n");
@@ -1946,11 +2217,23 @@
 		break;
 	case PHY_INTERFACE_MODE_SGMII:
 		dev_info(dev, "init for SGMII\n");
+		ret = phy_init(bsp_priv->comphy);
+		if (ret) {
+			dev_err(dev, "phy_init error: %d\n", ret);
+			return ret;
+		}
+
 		if (bsp_priv->ops && bsp_priv->ops->set_to_sgmii)
 			bsp_priv->ops->set_to_sgmii(bsp_priv);
 		break;
 	case PHY_INTERFACE_MODE_QSGMII:
 		dev_info(dev, "init for QSGMII\n");
+		ret = phy_init(bsp_priv->comphy);
+		if (ret) {
+			dev_err(dev, "phy_init error: %d\n", ret);
+			return ret;
+		}
+
 		if (bsp_priv->ops && bsp_priv->ops->set_to_qsgmii)
 			bsp_priv->ops->set_to_qsgmii(bsp_priv);
 		break;
@@ -1967,9 +2250,6 @@
 	pm_runtime_enable(dev);
 	pm_runtime_get_sync(dev);
 
-	if (bsp_priv->integrated_phy)
-		rk_gmac_integrated_phy_powerup(bsp_priv);
-
 	return 0;
 }
 
@@ -1977,8 +2257,9 @@
 {
 	struct device *dev = &gmac->pdev->dev;
 
-	if (gmac->integrated_phy)
-		rk_gmac_integrated_phy_powerdown(gmac);
+	if (gmac->phy_iface == PHY_INTERFACE_MODE_SGMII ||
+	    gmac->phy_iface == PHY_INTERFACE_MODE_QSGMII)
+		phy_exit(gmac->comphy);
 
 	pm_runtime_put_sync(dev);
 	pm_runtime_disable(dev);
@@ -2005,11 +2286,26 @@
 			bsp_priv->ops->set_rmii_speed(bsp_priv, speed);
 		break;
 	case PHY_INTERFACE_MODE_SGMII:
+		if (bsp_priv->ops && bsp_priv->ops->set_sgmii_speed)
+			bsp_priv->ops->set_sgmii_speed(bsp_priv, speed);
 	case PHY_INTERFACE_MODE_QSGMII:
 		break;
 	default:
 		dev_err(dev, "unsupported interface %d", bsp_priv->phy_iface);
 	}
+}
+
+static int rk_integrated_phy_power(void *priv, bool up)
+{
+	struct rk_priv_data *bsp_priv = priv;
+
+	if (!bsp_priv->integrated_phy || !bsp_priv->ops ||
+	    !bsp_priv->ops->integrated_phy_power)
+		return 0;
+
+	bsp_priv->ops->integrated_phy_power(bsp_priv, up);
+
+	return 0;
 }
 
 void dwmac_rk_set_rgmii_delayline(struct stmmac_priv *priv,
@@ -2050,24 +2346,17 @@
 {
 }
 
-static unsigned char macaddr[6];
-extern ssize_t at24_mac_read(unsigned char* addr);
 void rk_get_eth_addr(void *priv, unsigned char *addr)
 {
 	struct rk_priv_data *bsp_priv = priv;
 	struct device *dev = &bsp_priv->pdev->dev;
-	int i;
-	//unsigned char ethaddr[ETH_ALEN * MAX_ETH] = {0};
-	//int ret, id = bsp_priv->bus_id;
+	unsigned char ethaddr[ETH_ALEN * MAX_ETH] = {0};
+	int ret, id = bsp_priv->bus_id;
 
-	//ben
-	printk("nk-debug:enter rk_get_eth_addr.. \n");
-
-	#if 0
 	rk_devinfo_get_eth_mac(addr);
 	if (is_valid_ether_addr(addr))
 		goto out;
-		
+
 	if (id < 0 || id >= MAX_ETH) {
 		dev_err(dev, "%s: Invalid ethernet bus id %d\n", __func__, id);
 		return;
@@ -2094,35 +2383,7 @@
 	} else {
 		memcpy(addr, &ethaddr[id * ETH_ALEN], ETH_ALEN);
 	}
-	#endif
-	
-	#if 0
-	macaddr[0] = 0xee;
-	macaddr[1] = 0x31;
-	macaddr[2] = 0x32;
-	macaddr[3] = 0x33;
-	macaddr[4] = 0x34;
-	macaddr[5] = 0x35;
-	
-	memcpy(addr, macaddr, 6);
-	#endif
-	
-	#if 1
-	if (at24_mac_read(macaddr) > 0) {
-		printk("ben %s: at24_mac_read Success!! \n", __func__);
-		memcpy(addr, macaddr, 6);
 
-		printk("Read the Ethernet MAC address from :");
-		for (i = 0; i < 5; i++)
-			printk("%2.2x:", addr[i]);
- 
-		printk("%2.2x\n", addr[i]);	
-	} else {
-		printk("ben %s: at24_mac_read Failed!! \n", __func__);
-		goto out;
-	}
-	#endif
-	
 out:
 	dev_err(dev, "%s: mac address: %pM\n", __func__, addr);
 }
@@ -2134,7 +2395,6 @@
 	const struct rk_gmac_ops *data;
 	int ret;
 
-	printk("nk-debug:enter rk_gmac_probe 1.. \n");
 	data = of_device_get_match_data(&pdev->dev);
 	if (!data) {
 		dev_err(&pdev->dev, "no of match data provided\n");
@@ -2154,6 +2414,7 @@
 
 	plat_dat->fix_mac_speed = rk_fix_speed;
 	plat_dat->get_eth_addr = rk_get_eth_addr;
+	plat_dat->integrated_phy_power = rk_integrated_phy_power;
 
 	plat_dat->bsp_priv = rk_gmac_setup(pdev, plat_dat, data);
 	if (IS_ERR(plat_dat->bsp_priv)) {
@@ -2161,7 +2422,6 @@
 		goto err_remove_config_dt;
 	}
 
-	printk("nk-debug:enter rk_gmac_probe 2.. \n");
 	ret = rk_gmac_clk_init(plat_dat);
 	if (ret)
 		goto err_remove_config_dt;
@@ -2231,19 +2491,48 @@
 static SIMPLE_DEV_PM_OPS(rk_gmac_pm_ops, rk_gmac_suspend, rk_gmac_resume);
 
 static const struct of_device_id rk_gmac_dwmac_match[] = {
+#ifdef CONFIG_CPU_PX30
 	{ .compatible = "rockchip,px30-gmac",	.data = &px30_ops   },
+#endif
+#ifdef CONFIG_CPU_RK1808
 	{ .compatible = "rockchip,rk1808-gmac", .data = &rk1808_ops },
+#endif
+#ifdef CONFIG_CPU_RK312X
 	{ .compatible = "rockchip,rk3128-gmac", .data = &rk3128_ops },
+#endif
+#ifdef CONFIG_CPU_RK322X
 	{ .compatible = "rockchip,rk3228-gmac", .data = &rk3228_ops },
+#endif
+#ifdef CONFIG_CPU_RK3288
 	{ .compatible = "rockchip,rk3288-gmac", .data = &rk3288_ops },
+#endif
+#ifdef CONFIG_CPU_RK3308
 	{ .compatible = "rockchip,rk3308-mac",  .data = &rk3308_ops },
+#endif
+#ifdef CONFIG_CPU_RK3328
 	{ .compatible = "rockchip,rk3328-gmac", .data = &rk3328_ops },
+#endif
+#ifdef CONFIG_CPU_RK3366
 	{ .compatible = "rockchip,rk3366-gmac", .data = &rk3366_ops },
+#endif
+#ifdef CONFIG_CPU_RK3368
 	{ .compatible = "rockchip,rk3368-gmac", .data = &rk3368_ops },
+#endif
+#ifdef CONFIG_CPU_RK3399
 	{ .compatible = "rockchip,rk3399-gmac", .data = &rk3399_ops },
+#endif
+#ifdef CONFIG_CPU_RK3528
+	{ .compatible = "rockchip,rk3528-gmac", .data = &rk3528_ops },
+#endif
+#ifdef CONFIG_CPU_RK3568
 	{ .compatible = "rockchip,rk3568-gmac", .data = &rk3568_ops },
+#endif
+#ifdef CONFIG_CPU_RV110X
 	{ .compatible = "rockchip,rv1108-gmac", .data = &rv1108_ops },
+#endif
+#ifdef CONFIG_CPU_RV1126
 	{ .compatible = "rockchip,rv1126-gmac", .data = &rv1126_ops },
+#endif
 	{ }
 };
 MODULE_DEVICE_TABLE(of, rk_gmac_dwmac_match);
@@ -2257,8 +2546,7 @@
 		.of_match_table = rk_gmac_dwmac_match,
 	},
 };
-//module_platform_driver(rk_gmac_dwmac_driver);
- module_platform_driver1(rk_gmac_dwmac_driver);
+module_platform_driver(rk_gmac_dwmac_driver);
 
 MODULE_AUTHOR("Chen-Zhi (Roger Chen) <roger.chen@rock-chips.com>");
 MODULE_DESCRIPTION("Rockchip RK3288 DWMAC specific glue layer");
diff --git a/kernel/drivers/net/ethernet/stmicro/stmmac/dwmac1000.h b/kernel/drivers/net/ethernet/stmicro/stmmac/dwmac1000.h
index 184ca13..1a84cf4 100644
--- a/kernel/drivers/net/ethernet/stmicro/stmmac/dwmac1000.h
+++ b/kernel/drivers/net/ethernet/stmicro/stmmac/dwmac1000.h
@@ -86,10 +86,10 @@
 #define LPI_CTRL_STATUS_TLPIEN	0x00000001	/* Transmit LPI Entry */
 
 /* GMAC HW ADDR regs */
-#define GMAC_ADDR_HIGH(reg)	(((reg > 15) ? 0x00000800 : 0x00000040) + \
-				(reg * 8))
-#define GMAC_ADDR_LOW(reg)	(((reg > 15) ? 0x00000804 : 0x00000044) + \
-				(reg * 8))
+#define GMAC_ADDR_HIGH(reg)	((reg > 15) ? 0x00000800 + (reg - 16) * 8 : \
+				 0x00000040 + (reg * 8))
+#define GMAC_ADDR_LOW(reg)	((reg > 15) ? 0x00000804 + (reg - 16) * 8 : \
+				 0x00000044 + (reg * 8))
 #define GMAC_MAX_PERFECT_ADDRESSES	1
 
 #define GMAC_PCS_BASE		0x000000c0	/* PCS register base */
diff --git a/kernel/drivers/net/ethernet/stmicro/stmmac/dwmac4_core.c b/kernel/drivers/net/ethernet/stmicro/stmmac/dwmac4_core.c
index bc8871e..da5d9e5 100644
--- a/kernel/drivers/net/ethernet/stmicro/stmmac/dwmac4_core.c
+++ b/kernel/drivers/net/ethernet/stmicro/stmmac/dwmac4_core.c
@@ -715,6 +715,7 @@
 		x->mac_gmii_rx_proto_engine++;
 }
 
+#ifdef CONFIG_STMMAC_FULL
 const struct stmmac_ops dwmac4_ops = {
 	.core_init = dwmac4_core_init,
 	.set_mac = stmmac_set_mac,
@@ -745,6 +746,7 @@
 	.debug = dwmac4_debug,
 	.set_filter = dwmac4_set_filter,
 };
+#endif
 
 const struct stmmac_ops dwmac410_ops = {
 	.core_init = dwmac4_core_init,
@@ -777,6 +779,7 @@
 	.set_filter = dwmac4_set_filter,
 };
 
+#ifdef CONFIG_STMMAC_FULL
 const struct stmmac_ops dwmac510_ops = {
 	.core_init = dwmac4_core_init,
 	.set_mac = stmmac_dwmac4_set_mac,
@@ -812,6 +815,7 @@
 	.rxp_config = dwmac5_rxp_config,
 	.flex_pps_config = dwmac5_flex_pps_config,
 };
+#endif
 
 int dwmac4_setup(struct stmmac_priv *priv)
 {
diff --git a/kernel/drivers/net/ethernet/stmicro/stmmac/dwmac4_dma.c b/kernel/drivers/net/ethernet/stmicro/stmmac/dwmac4_dma.c
index edb6053..232efe1 100644
--- a/kernel/drivers/net/ethernet/stmicro/stmmac/dwmac4_dma.c
+++ b/kernel/drivers/net/ethernet/stmicro/stmmac/dwmac4_dma.c
@@ -119,6 +119,23 @@
 	       ioaddr + DMA_CHAN_INTR_ENA(chan));
 }
 
+static void dwmac410_dma_init_channel(void __iomem *ioaddr,
+				      struct stmmac_dma_cfg *dma_cfg, u32 chan)
+{
+	u32 value;
+
+	/* common channel control register config */
+	value = readl(ioaddr + DMA_CHAN_CONTROL(chan));
+	if (dma_cfg->pblx8)
+		value = value | DMA_BUS_MODE_PBL;
+
+	writel(value, ioaddr + DMA_CHAN_CONTROL(chan));
+
+	/* Mask interrupts by writing to CSR7 */
+	writel(DMA_CHAN_INTR_DEFAULT_MASK_4_10,
+	       ioaddr + DMA_CHAN_INTR_ENA(chan));
+}
+
 static void dwmac4_dma_init(void __iomem *ioaddr,
 			    struct stmmac_dma_cfg *dma_cfg, int atds)
 {
@@ -197,7 +214,7 @@
 				       u32 channel, int fifosz, u8 qmode)
 {
 	unsigned int rqs = fifosz / 256 - 1;
-	u32 mtl_rx_op, mtl_rx_int;
+	u32 mtl_rx_op;
 
 	mtl_rx_op = readl(ioaddr + MTL_CHAN_RX_OP_MODE(channel));
 
@@ -268,11 +285,6 @@
 	}
 
 	writel(mtl_rx_op, ioaddr + MTL_CHAN_RX_OP_MODE(channel));
-
-	/* Enable MTL RX overflow */
-	mtl_rx_int = readl(ioaddr + MTL_CHAN_INT_CTRL(channel));
-	writel(mtl_rx_int | MTL_RX_OVERFLOW_INT_EN,
-	       ioaddr + MTL_CHAN_INT_CTRL(channel));
 }
 
 static void dwmac4_dma_tx_chan_op_mode(void __iomem *ioaddr, int mode,
@@ -461,7 +473,7 @@
 const struct stmmac_dma_ops dwmac410_dma_ops = {
 	.reset = dwmac4_dma_reset,
 	.init = dwmac4_dma_init,
-	.init_chan = dwmac4_dma_init_channel,
+	.init_chan = dwmac410_dma_init_channel,
 	.init_rx_chan = dwmac4_dma_init_rx_chan,
 	.init_tx_chan = dwmac4_dma_init_tx_chan,
 	.axi = dwmac4_dma_axi,
diff --git a/kernel/drivers/net/ethernet/stmicro/stmmac/dwmac4_lib.c b/kernel/drivers/net/ethernet/stmicro/stmmac/dwmac4_lib.c
index 49f5687..3246190 100644
--- a/kernel/drivers/net/ethernet/stmicro/stmmac/dwmac4_lib.c
+++ b/kernel/drivers/net/ethernet/stmicro/stmmac/dwmac4_lib.c
@@ -63,10 +63,6 @@
 
 	value &= ~DMA_CONTROL_ST;
 	writel(value, ioaddr + DMA_CHAN_TX_CONTROL(chan));
-
-	value = readl(ioaddr + GMAC_CONFIG);
-	value &= ~GMAC_CONFIG_TE;
-	writel(value, ioaddr + GMAC_CONFIG);
 }
 
 void dwmac4_dma_start_rx(void __iomem *ioaddr, u32 chan)
diff --git a/kernel/drivers/net/ethernet/stmicro/stmmac/hwif.c b/kernel/drivers/net/ethernet/stmicro/stmmac/hwif.c
index 357309a..c6b88cd 100644
--- a/kernel/drivers/net/ethernet/stmicro/stmmac/hwif.c
+++ b/kernel/drivers/net/ethernet/stmicro/stmmac/hwif.c
@@ -23,6 +23,7 @@
 	return reg & GENMASK(7, 0);
 }
 
+#ifdef CONFIG_STMMAC_FULL
 static void stmmac_dwmac_mode_quirk(struct stmmac_priv *priv)
 {
 	struct mac_device_info *mac = priv->hw;
@@ -68,6 +69,7 @@
 	stmmac_dwmac_mode_quirk(priv);
 	return 0;
 }
+#endif
 
 static const struct stmmac_hwif_entry {
 	bool gmac;
@@ -78,13 +80,16 @@
 	const void *desc;
 	const void *dma;
 	const void *mac;
+#ifdef CONFIG_STMMAC_PTP
 	const void *hwtimestamp;
+#endif
 	const void *mode;
 	const void *tc;
 	int (*setup)(struct stmmac_priv *priv);
 	int (*quirks)(struct stmmac_priv *priv);
 } stmmac_hw[] = {
 	/* NOTE: New HW versions shall go to the end of this table */
+#ifdef CONFIG_STMMAC_FULL
 	{
 		.gmac = false,
 		.gmac4 = false,
@@ -97,7 +102,9 @@
 		.desc = NULL,
 		.dma = &dwmac100_dma_ops,
 		.mac = &dwmac100_ops,
+#ifdef CONFIG_STMMAC_PTP
 		.hwtimestamp = &stmmac_ptp,
+#endif
 		.mode = NULL,
 		.tc = NULL,
 		.setup = dwmac100_setup,
@@ -114,7 +121,9 @@
 		.desc = NULL,
 		.dma = &dwmac1000_dma_ops,
 		.mac = &dwmac1000_ops,
+#ifdef CONFIG_STMMAC_PTP
 		.hwtimestamp = &stmmac_ptp,
+#endif
 		.mode = NULL,
 		.tc = NULL,
 		.setup = dwmac1000_setup,
@@ -131,7 +140,9 @@
 		.desc = &dwmac4_desc_ops,
 		.dma = &dwmac4_dma_ops,
 		.mac = &dwmac4_ops,
+#ifdef CONFIG_STMMAC_PTP
 		.hwtimestamp = &stmmac_ptp,
+#endif
 		.mode = NULL,
 		.tc = NULL,
 		.setup = dwmac4_setup,
@@ -148,12 +159,16 @@
 		.desc = &dwmac4_desc_ops,
 		.dma = &dwmac4_dma_ops,
 		.mac = &dwmac410_ops,
+#ifdef CONFIG_STMMAC_PTP
 		.hwtimestamp = &stmmac_ptp,
+#endif
 		.mode = &dwmac4_ring_mode_ops,
 		.tc = NULL,
 		.setup = dwmac4_setup,
 		.quirks = NULL,
-	}, {
+	},
+#endif /* CONFIG_STMMAC_FULL */
+	{
 		.gmac = false,
 		.gmac4 = true,
 		.xgmac = false,
@@ -165,12 +180,16 @@
 		.desc = &dwmac4_desc_ops,
 		.dma = &dwmac410_dma_ops,
 		.mac = &dwmac410_ops,
+#ifdef CONFIG_STMMAC_PTP
 		.hwtimestamp = &stmmac_ptp,
+#endif
 		.mode = &dwmac4_ring_mode_ops,
 		.tc = NULL,
 		.setup = dwmac4_setup,
 		.quirks = NULL,
-	}, {
+	},
+#ifdef CONFIG_STMMAC_FULL
+	{
 		.gmac = false,
 		.gmac4 = true,
 		.xgmac = false,
@@ -182,7 +201,9 @@
 		.desc = &dwmac4_desc_ops,
 		.dma = &dwmac410_dma_ops,
 		.mac = &dwmac510_ops,
+#ifdef CONFIG_STMMAC_PTP
 		.hwtimestamp = &stmmac_ptp,
+#endif
 		.mode = &dwmac4_ring_mode_ops,
 		.tc = &dwmac510_tc_ops,
 		.setup = dwmac4_setup,
@@ -199,12 +220,15 @@
 		.desc = &dwxgmac210_desc_ops,
 		.dma = &dwxgmac210_dma_ops,
 		.mac = &dwxgmac210_ops,
+#ifdef CONFIG_STMMAC_PTP
 		.hwtimestamp = &stmmac_ptp,
+#endif
 		.mode = NULL,
 		.tc = NULL,
 		.setup = dwxgmac2_setup,
 		.quirks = NULL,
 	},
+#endif
 };
 
 int stmmac_hwif_init(struct stmmac_priv *priv)
@@ -264,7 +288,9 @@
 		mac->desc = mac->desc ? : entry->desc;
 		mac->dma = mac->dma ? : entry->dma;
 		mac->mac = mac->mac ? : entry->mac;
+#ifdef CONFIG_STMMAC_PTP
 		mac->ptp = mac->ptp ? : entry->hwtimestamp;
+#endif
 		mac->mode = mac->mode ? : entry->mode;
 		mac->tc = mac->tc ? : entry->tc;
 
diff --git a/kernel/drivers/net/ethernet/stmicro/stmmac/mmc_core.c b/kernel/drivers/net/ethernet/stmicro/stmmac/mmc_core.c
index e9b04c2..787f725 100644
--- a/kernel/drivers/net/ethernet/stmicro/stmmac/mmc_core.c
+++ b/kernel/drivers/net/ethernet/stmicro/stmmac/mmc_core.c
@@ -139,6 +139,7 @@
 	pr_debug("stmmac: MMC ctrl register (offset 0x%x): 0x%08x\n",
 		 MMC_CNTRL, value);
 }
+EXPORT_SYMBOL(dwmac_mmc_ctrl);
 
 /* To mask all all interrupts.*/
 void dwmac_mmc_intr_all_mask(void __iomem *mmcaddr)
@@ -147,6 +148,7 @@
 	writel(MMC_DEFAULT_MASK, mmcaddr + MMC_TX_INTR_MASK);
 	writel(MMC_DEFAULT_MASK, mmcaddr + MMC_RX_IPC_INTR_MASK);
 }
+EXPORT_SYMBOL(dwmac_mmc_intr_all_mask);
 
 /* This reads the MAC core counters (if actaully supported).
  * by default the MMC core is programmed to reset each
diff --git a/kernel/drivers/net/ethernet/stmicro/stmmac/stmmac.h b/kernel/drivers/net/ethernet/stmicro/stmmac/stmmac.h
index f9b42b0..1eaa1f8 100644
--- a/kernel/drivers/net/ethernet/stmicro/stmmac/stmmac.h
+++ b/kernel/drivers/net/ethernet/stmicro/stmmac/stmmac.h
@@ -217,10 +217,27 @@
 int stmmac_mdio_unregister(struct net_device *ndev);
 int stmmac_mdio_register(struct net_device *ndev);
 int stmmac_mdio_reset(struct mii_bus *mii);
-void stmmac_set_ethtool_ops(struct net_device *netdev);
 
+#ifdef CONFIG_STMMAC_ETHTOOL
+void stmmac_set_ethtool_ops(struct net_device *netdev);
+#else
+static inline void stmmac_set_ethtool_ops(struct net_device *netdev)
+{
+}
+#endif
+
+#ifdef CONFIG_STMMAC_PTP
 void stmmac_ptp_register(struct stmmac_priv *priv);
 void stmmac_ptp_unregister(struct stmmac_priv *priv);
+#else
+static inline void stmmac_ptp_register(struct stmmac_priv *priv)
+{
+}
+
+static inline void stmmac_ptp_unregister(struct stmmac_priv *priv)
+{
+}
+#endif
 int stmmac_resume(struct device *dev);
 int stmmac_suspend(struct device *dev);
 int stmmac_dvr_remove(struct device *dev);
diff --git a/kernel/drivers/net/ethernet/stmicro/stmmac/stmmac_hwtstamp.c b/kernel/drivers/net/ethernet/stmicro/stmmac/stmmac_hwtstamp.c
index e1fbd7c..08a058e 100644
--- a/kernel/drivers/net/ethernet/stmicro/stmmac/stmmac_hwtstamp.c
+++ b/kernel/drivers/net/ethernet/stmicro/stmmac/stmmac_hwtstamp.c
@@ -159,15 +159,20 @@
 
 static void get_systime(void __iomem *ioaddr, u64 *systime)
 {
-	u64 ns;
+	u64 ns, sec0, sec1;
 
-	/* Get the TSSS value */
-	ns = readl(ioaddr + PTP_STNSR);
-	/* Get the TSS and convert sec time value to nanosecond */
-	ns += readl(ioaddr + PTP_STSR) * 1000000000ULL;
+	/* Get the TSS value */
+	sec1 = readl_relaxed(ioaddr + PTP_STSR);
+	do {
+		sec0 = sec1;
+		/* Get the TSSS value */
+		ns = readl_relaxed(ioaddr + PTP_STNSR);
+		/* Get the TSS value */
+		sec1 = readl_relaxed(ioaddr + PTP_STSR);
+	} while (sec0 != sec1);
 
 	if (systime)
-		*systime = ns;
+		*systime = ns + (sec1 * 1000000000ULL);
 }
 
 const struct stmmac_hwtimestamp stmmac_ptp = {
diff --git a/kernel/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c b/kernel/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
index 29bffa7..0511062 100644
--- a/kernel/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
+++ b/kernel/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
@@ -228,7 +228,7 @@
 			priv->clk_csr = STMMAC_CSR_100_150M;
 		else if ((clk_rate >= CSR_F_150M) && (clk_rate < CSR_F_250M))
 			priv->clk_csr = STMMAC_CSR_150_250M;
-		else if ((clk_rate >= CSR_F_250M) && (clk_rate < CSR_F_300M))
+		else if ((clk_rate >= CSR_F_250M) && (clk_rate <= CSR_F_300M))
 			priv->clk_csr = STMMAC_CSR_250_300M;
 	}
 
@@ -508,6 +508,7 @@
 	}
 }
 
+#ifdef CONFIG_STMMAC_PTP
 /**
  *  stmmac_hwtstamp_set - control hardware timestamping.
  *  @dev: device pointer.
@@ -760,6 +761,7 @@
 	return copy_to_user(ifr->ifr_data, config,
 			    sizeof(*config)) ? -EFAULT : 0;
 }
+#endif /* CONFIG_STMMAC_PTP */
 
 /**
  * stmmac_init_ptp - init PTP
@@ -800,7 +802,7 @@
 
 static void stmmac_release_ptp(struct stmmac_priv *priv)
 {
-	if (priv->plat->clk_ptp_ref)
+	if (priv->plat->clk_ptp_ref && IS_ENABLED(CONFIG_STMMAC_PTP))
 		clk_disable_unprepare(priv->plat->clk_ptp_ref);
 	stmmac_ptp_unregister(priv);
 }
@@ -934,23 +936,6 @@
 	}
 }
 
-static void rtl8211F_led_control(struct phy_device *phydev)
-{
-	printk("ben debug:rtl8211F_led_control...1 \n");
-
-       	if(!phydev) return;
-       	if(phydev->phy_id!=0x001cc916) return; /* only for 8211E*/
-
-       	/*switch to extension page44*/
-	phy_write(phydev, 31, 0x0d04);
-//add hc 1000M --> orange   
-//	 100M  --> green
-	phy_write(phydev, 16, 0x6D02);  
-//add hc 1000M&100M  --> green
-//     	phy_write(phydev, 16, 0x6C0A); 
-	printk("ben debug:rtl8211F_led_control...2 \n");
-}
-
 /**
  * stmmac_init_phy - PHY initialization
  * @dev: net device structure
@@ -971,6 +956,9 @@
 	priv->oldlink = false;
 	priv->speed = SPEED_UNKNOWN;
 	priv->oldduplex = DUPLEX_UNKNOWN;
+
+	if (priv->plat->integrated_phy_power)
+		priv->plat->integrated_phy_power(priv->plat->bsp_priv, true);
 
 	if (priv->plat->phy_node) {
 		phydev = of_phy_connect(dev, priv->plat->phy_node,
@@ -1032,9 +1020,6 @@
 		phydev->irq = PHY_POLL;
 
 	phy_attached_info(phydev);
-
-	//add ben
-	rtl8211F_led_control(phydev);
 	return 0;
 }
 
@@ -2174,8 +2159,7 @@
  */
 static void stmmac_check_ether_addr(struct stmmac_priv *priv)
 {
-	//if (!is_valid_ether_addr(priv->dev->dev_addr)) {
-	if (1) {
+	if (!is_valid_ether_addr(priv->dev->dev_addr)) {
 		stmmac_get_umac_addr(priv, priv->hw, priv->dev->dev_addr, 0);
 		if (likely(priv->plat->get_eth_addr))
 			priv->plat->get_eth_addr(priv->plat->bsp_priv,
@@ -2568,7 +2552,7 @@
 
 	stmmac_mmc_setup(priv);
 
-	if (init_ptp) {
+	if (IS_ENABLED(CONFIG_STMMAC_PTP) && init_ptp) {
 		ret = clk_prepare_enable(priv->plat->clk_ptp_ref);
 		if (ret < 0)
 			netdev_warn(priv->dev, "failed to enable PTP reference clock: %d\n", ret);
@@ -2610,7 +2594,8 @@
 {
 	struct stmmac_priv *priv = netdev_priv(dev);
 
-	clk_disable_unprepare(priv->plat->clk_ptp_ref);
+	if (IS_ENABLED(CONFIG_STMMAC_PTP))
+		clk_disable_unprepare(priv->plat->clk_ptp_ref);
 }
 
 /**
@@ -2748,6 +2733,9 @@
 	if (dev->phydev) {
 		phy_stop(dev->phydev);
 		phy_disconnect(dev->phydev);
+		if (priv->plat->integrated_phy_power)
+			priv->plat->integrated_phy_power(priv->plat->bsp_priv,
+							 false);
 	}
 
 	stmmac_disable_all_queues(priv);
@@ -2778,7 +2766,8 @@
 
 	netif_carrier_off(dev);
 
-	stmmac_release_ptp(priv);
+	if (IS_ENABLED(CONFIG_STMMAC_PTP))
+		stmmac_release_ptp(priv);
 
 	return 0;
 }
@@ -3757,7 +3746,6 @@
 	/* To handle GMAC own interrupts */
 	if ((priv->plat->has_gmac) || xmac) {
 		int status = stmmac_host_irq_status(priv, priv->hw, &priv->xstats);
-		int mtl_status;
 
 		if (unlikely(status)) {
 			/* For LPI we need to save the tx status */
@@ -3768,17 +3756,8 @@
 		}
 
 		for (queue = 0; queue < queues_count; queue++) {
-			struct stmmac_rx_queue *rx_q = &priv->rx_queue[queue];
-
-			mtl_status = stmmac_host_mtl_irq_status(priv, priv->hw,
-								queue);
-			if (mtl_status != -EINVAL)
-				status |= mtl_status;
-
-			if (status & CORE_IRQ_MTL_RX_OVERFLOW)
-				stmmac_set_rx_tail_ptr(priv, priv->ioaddr,
-						       rx_q->rx_tail_addr,
-						       queue);
+			status = stmmac_host_mtl_irq_status(priv, priv->hw,
+							    queue);
 		}
 
 		/* PCS link status */
@@ -3832,12 +3811,14 @@
 			return -EINVAL;
 		ret = phy_mii_ioctl(dev->phydev, rq, cmd);
 		break;
+#ifdef CONFIG_STMMAC_PTP
 	case SIOCSHWTSTAMP:
 		ret = stmmac_hwtstamp_set(dev, rq);
 		break;
 	case SIOCGHWTSTAMP:
 		ret = stmmac_hwtstamp_get(dev, rq);
 		break;
+#endif
 	default:
 		break;
 	}
@@ -4584,10 +4565,13 @@
 		stmmac_pmt(priv, priv->hw, priv->wolopts);
 		priv->irq_wake = 1;
 	} else {
+		if (priv->plat->integrated_phy_power)
+			priv->plat->integrated_phy_power(priv->plat->bsp_priv,
+							 false);
 		stmmac_mac_set(priv, priv->ioaddr, false);
 		pinctrl_pm_select_sleep_state(priv->device);
 		/* Disable clock in case of PWM is off */
-		if (priv->plat->clk_ptp_ref)
+		if (priv->plat->clk_ptp_ref && IS_ENABLED(CONFIG_STMMAC_PTP))
 			clk_disable_unprepare(priv->plat->clk_ptp_ref);
 		clk_disable_unprepare(priv->plat->pclk);
 		clk_disable_unprepare(priv->plat->stmmac_clk);
@@ -4624,6 +4608,8 @@
 		tx_q->cur_tx = 0;
 		tx_q->dirty_tx = 0;
 		tx_q->mss = 0;
+
+		netdev_tx_reset_queue(netdev_get_tx_queue(priv->dev, queue));
 	}
 }
 
@@ -4641,7 +4627,6 @@
 	if (!netif_running(ndev))
 		return 0;
 
-	printk("troy test %s start .... \n",__func__);
 	/* Power Down bit, into the PM register, is cleared
 	 * automatically as soon as a magic packet or a Wake-up frame
 	 * is received. Anyway, it's better to manually clear
@@ -4658,11 +4643,14 @@
 		/* enable the clk previously disabled */
 		clk_prepare_enable(priv->plat->stmmac_clk);
 		clk_prepare_enable(priv->plat->pclk);
-		if (priv->plat->clk_ptp_ref)
+		if (priv->plat->clk_ptp_ref && IS_ENABLED(CONFIG_STMMAC_PTP))
 			clk_prepare_enable(priv->plat->clk_ptp_ref);
 		/* reset the phy so that it's ready */
 		if (priv->mii)
 			stmmac_mdio_reset(priv->mii);
+		if (priv->plat->integrated_phy_power)
+			priv->plat->integrated_phy_power(priv->plat->bsp_priv,
+							 true);
 	}
 
 	mutex_lock(&priv->lock);
@@ -4684,8 +4672,6 @@
 
 	if (ndev->phydev)
 		phy_start(ndev->phydev);
-	printk("troy test %s end .... \n",__func__);
-	rtl8211F_led_control(ndev->phydev);
 
 	return 0;
 }
diff --git a/kernel/drivers/net/ethernet/stmicro/stmmac/stmmac_mdio.c b/kernel/drivers/net/ethernet/stmicro/stmmac/stmmac_mdio.c
index 093a223..12a5f99 100644
--- a/kernel/drivers/net/ethernet/stmicro/stmmac/stmmac_mdio.c
+++ b/kernel/drivers/net/ethernet/stmicro/stmmac/stmmac_mdio.c
@@ -302,6 +302,7 @@
 #endif
 	return 0;
 }
+EXPORT_SYMBOL(stmmac_mdio_reset);
 
 /**
  * stmmac_mdio_register
diff --git a/kernel/drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c b/kernel/drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c
index 46f8754..9d47311 100644
--- a/kernel/drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c
+++ b/kernel/drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c
@@ -469,6 +469,14 @@
 		plat->pmt = 1;
 	}
 
+	if (of_device_is_compatible(np, "snps,dwmac-3.40a")) {
+		plat->has_gmac = 1;
+		plat->enh_desc = 1;
+		plat->tx_coe = 1;
+		plat->bugged_jumbo = 1;
+		plat->pmt = 1;
+	}
+
 	if (of_device_is_compatible(np, "snps,dwmac-4.00") ||
 	    of_device_is_compatible(np, "snps,dwmac-4.10a") ||
 	    of_device_is_compatible(np, "snps,dwmac-4.20a")) {
diff --git a/kernel/drivers/net/ethernet/stmicro/stmmac/stmmac_tc.c b/kernel/drivers/net/ethernet/stmicro/stmmac/stmmac_tc.c
index 37c0bc6..cc1895a 100644
--- a/kernel/drivers/net/ethernet/stmicro/stmmac/stmmac_tc.c
+++ b/kernel/drivers/net/ethernet/stmicro/stmmac/stmmac_tc.c
@@ -314,7 +314,12 @@
 
 		priv->plat->tx_queues_cfg[queue].mode_to_use = MTL_QUEUE_AVB;
 	} else if (!qopt->enable) {
-		return stmmac_dma_qmode(priv, priv->ioaddr, queue, MTL_QUEUE_DCB);
+		ret = stmmac_dma_qmode(priv, priv->ioaddr, queue,
+				       MTL_QUEUE_DCB);
+		if (ret)
+			return ret;
+
+		priv->plat->tx_queues_cfg[queue].mode_to_use = MTL_QUEUE_DCB;
 	}
 
 	/* Port Transmit Rate and Speed Divider */
diff --git a/kernel/drivers/net/ethernet/stmicro/stmmac/stmmac_uio.c b/kernel/drivers/net/ethernet/stmicro/stmmac/stmmac_uio.c
new file mode 100644
index 0000000..b241bd9
--- /dev/null
+++ b/kernel/drivers/net/ethernet/stmicro/stmmac/stmmac_uio.c
@@ -0,0 +1,1178 @@
+// SPDX-License-Identifier: GPL-2.0
+/**
+ * Copyright 2023 ROCKCHIP
+ */
+
+#include <linux/module.h>
+#include <linux/kernel.h>
+#include <linux/of_address.h>
+#include <linux/of_platform.h>
+#include <linux/of_net.h>
+#include <linux/uio_driver.h>
+#include <linux/list.h>
+
+#include <linux/clk.h>
+#include <linux/kernel.h>
+#include <linux/interrupt.h>
+#include <linux/ip.h>
+#include <linux/tcp.h>
+#include <linux/skbuff.h>
+#include <linux/ethtool.h>
+#include <linux/if_ether.h>
+#include <linux/crc32.h>
+#include <linux/mii.h>
+#include <linux/if.h>
+#include <linux/if_vlan.h>
+#include <linux/dma-mapping.h>
+#include <linux/slab.h>
+#include <linux/prefetch.h>
+#include <linux/pinctrl/consumer.h>
+#ifdef CONFIG_DEBUG_FS
+#include <linux/debugfs.h>
+#include <linux/seq_file.h>
+#endif /* CONFIG_DEBUG_FS */
+#include <linux/net_tstamp.h>
+#include <linux/udp.h>
+#include <net/pkt_cls.h>
+#include "stmmac_ptp.h"
+#include "stmmac.h"
+#include <linux/reset.h>
+#include <linux/of_mdio.h>
+#include "dwmac1000.h"
+#include "dwxgmac2.h"
+#include "hwif.h"
+#include "mmc.h"
+
+#define DRIVER_NAME	"rockchip_gmac_uio_drv"
+#define DRIVER_VERSION	"0.1"
+#define STMMAC_ALIGN(x) ALIGN(ALIGN(x, SMP_CACHE_BYTES), 16)
+
+#define TC_DEFAULT 64
+#define DEFAULT_BUFSIZE	1536
+#define STMMAC_RX_COPYBREAK	256
+
+static int buf_sz = DEFAULT_BUFSIZE;
+static int tc = TC_DEFAULT;
+
+/**
+ * rockchip_gmac_uio_pdev_info
+ * local information for uio module driver
+ *
+ * @dev:      device pointer
+ * @ndev:     network device pointer
+ * @name:     uio name
+ * @uio:      uio information
+ * @map_num:  number of uio memory regions
+ */
+struct rockchip_gmac_uio_pdev_info {
+	struct device *dev;
+	struct net_device *ndev;
+	char name[16];
+	struct uio_info uio;
+	int map_num;
+};
+
+static int rockchip_gmac_uio_open(struct uio_info *info, struct inode *inode)
+{
+	return 0;
+}
+
+static int rockchip_gmac_uio_release(struct uio_info *info,
+				     struct inode *inode)
+{
+	return 0;
+}
+
+static int rockchip_gmac_uio_mmap(struct uio_info *info,
+				  struct vm_area_struct *vma)
+{
+	u32 ret;
+	u32 pfn;
+
+	pfn = (info->mem[vma->vm_pgoff].addr) >> PAGE_SHIFT;
+
+	if (vma->vm_pgoff)
+		vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot);
+	else
+		vma->vm_page_prot = pgprot_device(vma->vm_page_prot);
+
+	ret = remap_pfn_range(vma, vma->vm_start, pfn,
+			      vma->vm_end - vma->vm_start, vma->vm_page_prot);
+	if (ret) {
+		/* Error Handle */
+		pr_err("remap_pfn_range failed");
+	}
+	return ret;
+}
+
+/**
+ * uio_free_dma_rx_desc_resources - free RX dma desc resources
+ * @priv: private structure
+ */
+static void uio_free_dma_rx_desc_resources(struct stmmac_priv *priv)
+{
+	u32 rx_count = priv->plat->rx_queues_to_use;
+	u32 queue;
+
+	/* Free RX queue resources */
+	for (queue = 0; queue < rx_count; queue++) {
+		struct stmmac_rx_queue *rx_q = &priv->rx_queue[queue];
+
+		/* Free DMA regions of consistent memory previously allocated */
+		if (!priv->extend_desc)
+			dma_free_coherent(priv->device,
+					  DMA_RX_SIZE * sizeof(struct dma_desc),
+					  rx_q->dma_rx, rx_q->dma_rx_phy);
+		else
+			dma_free_coherent(priv->device, DMA_RX_SIZE *
+					  sizeof(struct dma_extended_desc),
+					  rx_q->dma_erx, rx_q->dma_rx_phy);
+	}
+}
+
+/**
+ * uio_free_dma_tx_desc_resources - free TX dma desc resources
+ * @priv: private structure
+ */
+static void uio_free_dma_tx_desc_resources(struct stmmac_priv *priv)
+{
+	u32 tx_count = priv->plat->tx_queues_to_use;
+	u32 queue;
+
+	/* Free TX queue resources */
+	for (queue = 0; queue < tx_count; queue++) {
+		struct stmmac_tx_queue *tx_q = &priv->tx_queue[queue];
+
+		/* Free DMA regions of consistent memory previously allocated */
+		if (!priv->extend_desc)
+			dma_free_coherent(priv->device,
+					  DMA_TX_SIZE * sizeof(struct dma_desc),
+					  tx_q->dma_tx, tx_q->dma_tx_phy);
+		else
+			dma_free_coherent(priv->device, DMA_TX_SIZE *
+					  sizeof(struct dma_extended_desc),
+					  tx_q->dma_etx, tx_q->dma_tx_phy);
+	}
+}
+
+/**
+ * uio_alloc_dma_rx_desc_resources - alloc RX resources.
+ * @priv: private structure
+ * Description: according to which descriptor can be used (extend or basic)
+ * this function allocates the resources for TX and RX paths. In case of
+ * reception, for example, it pre-allocated the RX socket buffer in order to
+ * allow zero-copy mechanism.
+ */
+static int uio_alloc_dma_rx_desc_resources(struct stmmac_priv *priv)
+{
+	u32 rx_count = priv->plat->rx_queues_to_use;
+	int ret = -ENOMEM;
+	u32 queue;
+
+	/* RX queues buffers and DMA */
+	for (queue = 0; queue < rx_count; queue++) {
+		struct stmmac_rx_queue *rx_q = &priv->rx_queue[queue];
+
+		rx_q->queue_index = queue;
+		rx_q->priv_data = priv;
+
+		if (priv->extend_desc) {
+			rx_q->dma_erx = dma_zalloc_coherent(priv->device,
+							    DMA_RX_SIZE *
+							    sizeof(struct
+							    dma_extended_desc),
+							    &rx_q->dma_rx_phy,
+							    GFP_KERNEL);
+			if (!rx_q->dma_erx)
+				goto err_dma;
+
+		} else {
+			rx_q->dma_rx = dma_zalloc_coherent(priv->device,
+							   DMA_RX_SIZE *
+							   sizeof(struct
+							   dma_desc),
+							   &rx_q->dma_rx_phy,
+							   GFP_KERNEL);
+			if (!rx_q->dma_rx)
+				goto err_dma;
+		}
+	}
+
+	return 0;
+
+err_dma:
+	uio_free_dma_rx_desc_resources(priv);
+
+	return ret;
+}
+
+/**
+ * uio_alloc_dma_tx_desc_resources - alloc TX resources.
+ * @priv: private structure
+ * Description: according to which descriptor can be used (extend or basic)
+ * this function allocates the resources for TX and RX paths. In case of
+ * reception, for example, it pre-allocated the RX socket buffer in order to
+ * allow zero-copy mechanism.
+ */
+static int uio_alloc_dma_tx_desc_resources(struct stmmac_priv *priv)
+{
+	u32 tx_count = priv->plat->tx_queues_to_use;
+	int ret = -ENOMEM;
+	u32 queue;
+
+	/* TX queues buffers and DMA */
+	for (queue = 0; queue < tx_count; queue++) {
+		struct stmmac_tx_queue *tx_q = &priv->tx_queue[queue];
+
+		tx_q->queue_index = queue;
+		tx_q->priv_data = priv;
+
+		if (priv->extend_desc) {
+			tx_q->dma_etx = dma_zalloc_coherent(priv->device,
+							    DMA_TX_SIZE *
+							    sizeof(struct
+							    dma_extended_desc),
+							    &tx_q->dma_tx_phy,
+							    GFP_KERNEL);
+			if (!tx_q->dma_etx)
+				goto err_dma;
+		} else {
+			tx_q->dma_tx = dma_zalloc_coherent(priv->device,
+							   DMA_TX_SIZE *
+							   sizeof(struct
+								  dma_desc),
+							   &tx_q->dma_tx_phy,
+							   GFP_KERNEL);
+			if (!tx_q->dma_tx)
+				goto err_dma;
+		}
+	}
+
+	return 0;
+
+err_dma:
+	uio_free_dma_tx_desc_resources(priv);
+
+	return ret;
+}
+
+/**
+ * uio_alloc_dma_desc_resources - alloc TX/RX resources.
+ * @priv: private structure
+ * Description: according to which descriptor can be used (extend or basic)
+ * this function allocates the resources for TX and RX paths. In case of
+ * reception, for example, it pre-allocated the RX socket buffer in order to
+ * allow zero-copy mechanism.
+ */
+static int uio_alloc_dma_desc_resources(struct stmmac_priv *priv)
+{
+	/* RX Allocation */
+	int ret = uio_alloc_dma_rx_desc_resources(priv);
+
+	if (ret)
+		return ret;
+
+	ret = uio_alloc_dma_tx_desc_resources(priv);
+
+	return ret;
+}
+
+/**
+ * uio_free_dma_desc_resources - free dma desc resources
+ * @priv: private structure
+ */
+static void uio_free_dma_desc_resources(struct stmmac_priv *priv)
+{
+	/* Release the DMA RX socket buffers */
+	uio_free_dma_rx_desc_resources(priv);
+
+	/* Release the DMA TX socket buffers */
+	uio_free_dma_tx_desc_resources(priv);
+}
+
+/**
+ * uio_hw_fix_mac_speed - callback for speed selection
+ * @priv: driver private structure
+ * Description: on some platforms (e.g. ST), some HW system configuration
+ * registers have to be set according to the link speed negotiated.
+ */
+static inline void uio_hw_fix_mac_speed(struct stmmac_priv *priv)
+{
+	struct net_device *ndev = priv->dev;
+	struct phy_device *phydev = ndev->phydev;
+
+	if (likely(priv->plat->fix_mac_speed))
+		priv->plat->fix_mac_speed(priv->plat->bsp_priv, phydev->speed);
+}
+
+/**
+ *  uio_mac_flow_ctrl - Configure flow control in all queues
+ *  @priv: driver private structure
+ *  Description: It is used for configuring the flow control in all queues
+ */
+static void uio_mac_flow_ctrl(struct stmmac_priv *priv, u32 duplex)
+{
+	u32 tx_cnt = priv->plat->tx_queues_to_use;
+
+	stmmac_flow_ctrl(priv, priv->hw, duplex, priv->flow_ctrl,
+			 priv->pause, tx_cnt);
+}
+
+/**
+ * uio_adjust_link - adjusts the link parameters
+ * @dev: net device structure
+ * Description: this is the helper called by the physical abstraction layer
+ * drivers to communicate the phy link status. According the speed and duplex
+ * this driver can invoke registered glue-logic as well.
+ * It also invoke the eee initialization because it could happen when switch
+ * on different networks (that are eee capable).
+ */
+static void uio_adjust_link(struct net_device *dev)
+{
+	struct stmmac_priv *priv = netdev_priv(dev);
+	struct phy_device *phydev = dev->phydev;
+	bool new_state = false;
+
+	if (!phydev)
+		return;
+
+	mutex_lock(&priv->lock);
+
+	if (phydev->link) {
+		u32 ctrl = readl(priv->ioaddr + MAC_CTRL_REG);
+
+		/* Now we make sure that we can be in full duplex mode.
+		 * If not, we operate in half-duplex mode.
+		 */
+		if (phydev->duplex != priv->oldduplex) {
+			new_state = true;
+			if (!phydev->duplex)
+				ctrl &= ~priv->hw->link.duplex;
+			else
+				ctrl |= priv->hw->link.duplex;
+			priv->oldduplex = phydev->duplex;
+		}
+		/* Flow Control operation */
+		if (phydev->pause)
+			uio_mac_flow_ctrl(priv, phydev->duplex);
+
+		if (phydev->speed != priv->speed) {
+			new_state = true;
+			ctrl &= ~priv->hw->link.speed_mask;
+			switch (phydev->speed) {
+			case SPEED_1000:
+				ctrl |= priv->hw->link.speed1000;
+				break;
+			case SPEED_100:
+				ctrl |= priv->hw->link.speed100;
+				break;
+			case SPEED_10:
+				ctrl |= priv->hw->link.speed10;
+				break;
+			default:
+				netif_warn(priv, link, priv->dev,
+					   "broken speed: %d\n", phydev->speed);
+				phydev->speed = SPEED_UNKNOWN;
+				break;
+			}
+			if (phydev->speed != SPEED_UNKNOWN)
+				uio_hw_fix_mac_speed(priv);
+			priv->speed = phydev->speed;
+		}
+
+		writel(ctrl, priv->ioaddr + MAC_CTRL_REG);
+
+		if (!priv->oldlink) {
+			new_state = true;
+			priv->oldlink = true;
+		}
+	} else if (priv->oldlink) {
+		new_state = true;
+		priv->oldlink = false;
+		priv->speed = SPEED_UNKNOWN;
+		priv->oldduplex = DUPLEX_UNKNOWN;
+	}
+
+	if (new_state && netif_msg_link(priv))
+		phy_print_status(phydev);
+
+	mutex_unlock(&priv->lock);
+
+	if (phydev->is_pseudo_fixed_link)
+		/* Stop PHY layer to call the hook to adjust the link in case
+		 * of a switch is attached to the stmmac driver.
+		 */
+		phydev->irq = PHY_IGNORE_INTERRUPT;
+}
+
+/**
+ * rockchip_gmac_uio_init_phy - PHY initialization
+ * @dev: net device structure
+ * Description: it initializes the driver's PHY state, and attaches the PHY
+ * to the mac driver.
+ *  Return value:
+ *  0 on success
+ */
+static int rockchip_gmac_uio_init_phy(struct net_device *dev)
+{
+	struct stmmac_priv *priv = netdev_priv(dev);
+	u32 tx_cnt = priv->plat->tx_queues_to_use;
+	struct phy_device *phydev;
+	char phy_id_fmt[MII_BUS_ID_SIZE + 3];
+	char bus_id[MII_BUS_ID_SIZE];
+	int interface = priv->plat->interface;
+	int max_speed = priv->plat->max_speed;
+
+	priv->oldlink = false;
+	priv->speed = SPEED_UNKNOWN;
+	priv->oldduplex = DUPLEX_UNKNOWN;
+
+	if (priv->plat->integrated_phy_power)
+		priv->plat->integrated_phy_power(priv->plat->bsp_priv, true);
+
+	if (priv->mii)
+		stmmac_mdio_reset(priv->mii);
+
+	if (priv->plat->phy_node) {
+		phydev = of_phy_connect(dev, priv->plat->phy_node,
+					&uio_adjust_link, 0, interface);
+	} else {
+		snprintf(bus_id, MII_BUS_ID_SIZE, "stmmac-%x",
+			 priv->plat->bus_id);
+
+		snprintf(phy_id_fmt, MII_BUS_ID_SIZE + 3, PHY_ID_FMT, bus_id,
+			 priv->plat->phy_addr);
+		netdev_dbg(priv->dev, "%s: trying to attach to %s\n", __func__,
+			   phy_id_fmt);
+
+		phydev = phy_connect(dev, phy_id_fmt, &uio_adjust_link,
+				     interface);
+	}
+
+	if (IS_ERR_OR_NULL(phydev)) {
+		netdev_err(priv->dev, "Could not attach to PHY\n");
+		if (!phydev)
+			return -ENODEV;
+
+		return PTR_ERR(phydev);
+	}
+
+	/* Stop Advertising 1000BASE Capability if interface is not GMII */
+	if (interface == PHY_INTERFACE_MODE_MII ||
+	    interface == PHY_INTERFACE_MODE_RMII ||
+		(max_speed < 1000 && max_speed > 0))
+		phydev->advertising &= ~(SUPPORTED_1000baseT_Half |
+					 SUPPORTED_1000baseT_Full);
+
+	/* Half-duplex mode not supported with multiqueue
+	 * half-duplex can only works with single queue
+	 */
+	if (tx_cnt > 1)
+		phydev->supported &= ~(SUPPORTED_1000baseT_Half |
+				       SUPPORTED_100baseT_Half |
+				       SUPPORTED_10baseT_Half);
+
+	/* Broken HW is sometimes missing the pull-up resistor on the
+	 * MDIO line, which results in reads to non-existent devices returning
+	 * 0 rather than 0xffff. Catch this here and treat 0 as a non-existent
+	 * device as well.
+	 * Note: phydev->phy_id is the result of reading the UID PHY registers.
+	 */
+	if (!priv->plat->phy_node && phydev->phy_id == 0) {
+		phy_disconnect(phydev);
+		return -ENODEV;
+	}
+
+	/* uio_adjust_link will change this to PHY_IGNORE_INTERRUPT to avoid
+	 * subsequent PHY polling, make sure we force a link transition if
+	 * we have a UP/DOWN/UP transition
+	 */
+	if (phydev->is_pseudo_fixed_link)
+		phydev->irq = PHY_POLL;
+
+	phy_attached_info(phydev);
+	return 0;
+}
+
+/**
+ * rockchip_gmac_uio_init_dma_engine - DMA init.
+ * @priv: driver private structure
+ * Description:
+ * It inits the DMA invoking the specific MAC/GMAC callback.
+ * Some DMA parameters can be passed from the platform;
+ * in case of these are not passed a default is kept for the MAC or GMAC.
+ */
+static int rockchip_gmac_uio_init_dma_engine(struct stmmac_priv *priv)
+{
+	u32 rx_channels_count = priv->plat->rx_queues_to_use;
+	u32 tx_channels_count = priv->plat->tx_queues_to_use;
+	u32 dma_csr_ch = max(rx_channels_count, tx_channels_count);
+	struct stmmac_rx_queue *rx_q;
+	struct stmmac_tx_queue *tx_q;
+	u32 chan = 0;
+	int atds = 0;
+	int ret = 0;
+
+	if (!priv->plat->dma_cfg || !priv->plat->dma_cfg->pbl) {
+		dev_err(priv->device, "Invalid DMA configuration\n");
+		return -EINVAL;
+	}
+
+	if (priv->extend_desc && priv->mode == STMMAC_RING_MODE)
+		atds = 1;
+
+	ret = stmmac_reset(priv, priv->ioaddr);
+	if (ret) {
+		dev_err(priv->device, "Failed to reset the dma\n");
+		return ret;
+	}
+
+	/* DMA Configuration */
+	stmmac_dma_init(priv, priv->ioaddr, priv->plat->dma_cfg, atds);
+
+	if (priv->plat->axi)
+		stmmac_axi(priv, priv->ioaddr, priv->plat->axi);
+
+	/* DMA CSR Channel configuration */
+	for (chan = 0; chan < dma_csr_ch; chan++)
+		stmmac_init_chan(priv, priv->ioaddr, priv->plat->dma_cfg, chan);
+
+	/* DMA RX Channel Configuration */
+	for (chan = 0; chan < rx_channels_count; chan++) {
+		rx_q = &priv->rx_queue[chan];
+
+		stmmac_init_rx_chan(priv, priv->ioaddr, priv->plat->dma_cfg,
+				    rx_q->dma_rx_phy, chan);
+
+		rx_q->rx_tail_addr = rx_q->dma_rx_phy +
+			    (DMA_RX_SIZE * sizeof(struct dma_desc));
+		stmmac_set_rx_tail_ptr(priv, priv->ioaddr,
+				       rx_q->rx_tail_addr, chan);
+	}
+
+	/* DMA TX Channel Configuration */
+	for (chan = 0; chan < tx_channels_count; chan++) {
+		tx_q = &priv->tx_queue[chan];
+
+		stmmac_init_tx_chan(priv, priv->ioaddr, priv->plat->dma_cfg,
+				    tx_q->dma_tx_phy, chan);
+
+		tx_q->tx_tail_addr = tx_q->dma_tx_phy;
+		stmmac_set_tx_tail_ptr(priv, priv->ioaddr,
+				       tx_q->tx_tail_addr, chan);
+	}
+
+	return ret;
+}
+
+static void uio_set_rings_length(struct stmmac_priv *priv)
+{
+	u32 rx_channels_count = priv->plat->rx_queues_to_use;
+	u32 tx_channels_count = priv->plat->tx_queues_to_use;
+	u32 chan;
+
+	/* set TX ring length */
+	for (chan = 0; chan < tx_channels_count; chan++)
+		stmmac_set_tx_ring_len(priv, priv->ioaddr,
+				       (DMA_TX_SIZE - 1), chan);
+
+	/* set RX ring length */
+	for (chan = 0; chan < rx_channels_count; chan++)
+		stmmac_set_rx_ring_len(priv, priv->ioaddr,
+				       (DMA_RX_SIZE - 1), chan);
+}
+
+/**
+ *  uio_set_tx_queue_weight - Set TX queue weight
+ *  @priv: driver private structure
+ *  Description: It is used for setting TX queues weight
+ */
+static void uio_set_tx_queue_weight(struct stmmac_priv *priv)
+{
+	u32 tx_queues_count = priv->plat->tx_queues_to_use;
+	u32 weight;
+	u32 queue;
+
+	for (queue = 0; queue < tx_queues_count; queue++) {
+		weight = priv->plat->tx_queues_cfg[queue].weight;
+		stmmac_set_mtl_tx_queue_weight(priv, priv->hw, weight, queue);
+	}
+}
+
+/**
+ *  uio_configure_cbs - Configure CBS in TX queue
+ *  @priv: driver private structure
+ *  Description: It is used for configuring CBS in AVB TX queues
+ */
+static void uio_configure_cbs(struct stmmac_priv *priv)
+{
+	u32 tx_queues_count = priv->plat->tx_queues_to_use;
+	u32 mode_to_use;
+	u32 queue;
+
+	/* queue 0 is reserved for legacy traffic */
+	for (queue = 1; queue < tx_queues_count; queue++) {
+		mode_to_use = priv->plat->tx_queues_cfg[queue].mode_to_use;
+		if (mode_to_use == MTL_QUEUE_DCB)
+			continue;
+
+		stmmac_config_cbs(priv, priv->hw,
+				priv->plat->tx_queues_cfg[queue].send_slope,
+				priv->plat->tx_queues_cfg[queue].idle_slope,
+				priv->plat->tx_queues_cfg[queue].high_credit,
+				priv->plat->tx_queues_cfg[queue].low_credit,
+				queue);
+	}
+}
+
+/**
+ *  uio_rx_queue_dma_chan_map - Map RX queue to RX dma channel
+ *  @priv: driver private structure
+ *  Description: It is used for mapping RX queues to RX dma channels
+ */
+static void uio_rx_queue_dma_chan_map(struct stmmac_priv *priv)
+{
+	u32 rx_queues_count = priv->plat->rx_queues_to_use;
+	u32 queue;
+	u32 chan;
+
+	for (queue = 0; queue < rx_queues_count; queue++) {
+		chan = priv->plat->rx_queues_cfg[queue].chan;
+		stmmac_map_mtl_to_dma(priv, priv->hw, queue, chan);
+	}
+}
+
+/**
+ *  uio_mac_config_rx_queues_prio - Configure RX Queue priority
+ *  @priv: driver private structure
+ *  Description: It is used for configuring the RX Queue Priority
+ */
+static void uio_mac_config_rx_queues_prio(struct stmmac_priv *priv)
+{
+	u32 rx_queues_count = priv->plat->rx_queues_to_use;
+	u32 queue;
+	u32 prio;
+
+	for (queue = 0; queue < rx_queues_count; queue++) {
+		if (!priv->plat->rx_queues_cfg[queue].use_prio)
+			continue;
+
+		prio = priv->plat->rx_queues_cfg[queue].prio;
+		stmmac_rx_queue_prio(priv, priv->hw, prio, queue);
+	}
+}
+
+/**
+ *  uio_mac_config_tx_queues_prio - Configure TX Queue priority
+ *  @priv: driver private structure
+ *  Description: It is used for configuring the TX Queue Priority
+ */
+static void uio_mac_config_tx_queues_prio(struct stmmac_priv *priv)
+{
+	u32 tx_queues_count = priv->plat->tx_queues_to_use;
+	u32 queue;
+	u32 prio;
+
+	for (queue = 0; queue < tx_queues_count; queue++) {
+		if (!priv->plat->tx_queues_cfg[queue].use_prio)
+			continue;
+
+		prio = priv->plat->tx_queues_cfg[queue].prio;
+		stmmac_tx_queue_prio(priv, priv->hw, prio, queue);
+	}
+}
+
+/**
+ *  uio_mac_config_rx_queues_routing - Configure RX Queue Routing
+ *  @priv: driver private structure
+ *  Description: It is used for configuring the RX queue routing
+ */
+static void uio_mac_config_rx_queues_routing(struct stmmac_priv *priv)
+{
+	u32 rx_queues_count = priv->plat->rx_queues_to_use;
+	u32 queue;
+	u8 packet;
+
+	for (queue = 0; queue < rx_queues_count; queue++) {
+		/* no specific packet type routing specified for the queue */
+		if (priv->plat->rx_queues_cfg[queue].pkt_route == 0x0)
+			continue;
+
+		packet = priv->plat->rx_queues_cfg[queue].pkt_route;
+		stmmac_rx_queue_routing(priv, priv->hw, packet, queue);
+	}
+}
+
+/**
+ *  uio_mac_enable_rx_queues - Enable MAC rx queues
+ *  @priv: driver private structure
+ *  Description: It is used for enabling the rx queues in the MAC
+ */
+static void uio_mac_enable_rx_queues(struct stmmac_priv *priv)
+{
+	u32 rx_queues_count = priv->plat->rx_queues_to_use;
+	int queue;
+	u8 mode;
+
+	for (queue = 0; queue < rx_queues_count; queue++) {
+		mode = priv->plat->rx_queues_cfg[queue].mode_to_use;
+		stmmac_rx_queue_enable(priv, priv->hw, mode, queue);
+	}
+}
+
+/**
+ *  rockchip_gmac_uio_mtl_configuration - Configure MTL
+ *  @priv: driver private structure
+ *  Description: It is used for configuring MTL
+ */
+static void rockchip_gmac_uio_mtl_configuration(struct stmmac_priv *priv)
+{
+	u32 rx_queues_count = priv->plat->rx_queues_to_use;
+	u32 tx_queues_count = priv->plat->tx_queues_to_use;
+
+	if (tx_queues_count > 1)
+		uio_set_tx_queue_weight(priv);
+
+	/* Configure MTL RX algorithms */
+	if (rx_queues_count > 1)
+		stmmac_prog_mtl_rx_algorithms(priv, priv->hw,
+				priv->plat->rx_sched_algorithm);
+
+	/* Configure MTL TX algorithms */
+	if (tx_queues_count > 1)
+		stmmac_prog_mtl_tx_algorithms(priv, priv->hw,
+				priv->plat->tx_sched_algorithm);
+
+	/* Configure CBS in AVB TX queues */
+	if (tx_queues_count > 1)
+		uio_configure_cbs(priv);
+
+	/* Map RX MTL to DMA channels */
+	uio_rx_queue_dma_chan_map(priv);
+
+	/* Enable MAC RX Queues */
+	uio_mac_enable_rx_queues(priv);
+
+	/* Set RX priorities */
+	if (rx_queues_count > 1)
+		uio_mac_config_rx_queues_prio(priv);
+
+	/* Set TX priorities */
+	if (tx_queues_count > 1)
+		uio_mac_config_tx_queues_prio(priv);
+
+	/* Set RX routing */
+	if (rx_queues_count > 1)
+		uio_mac_config_rx_queues_routing(priv);
+}
+
+static void uio_safety_feat_configuration(struct stmmac_priv *priv)
+{
+	if (priv->dma_cap.asp) {
+		netdev_info(priv->dev, "Enabling Safety Features\n");
+		stmmac_safety_feat_config(priv, priv->ioaddr,
+					  priv->dma_cap.asp);
+	} else {
+		netdev_info(priv->dev, "No Safety Features support found\n");
+	}
+}
+
+/**
+ *  uio_dma_operation_mode - HW DMA operation mode
+ *  @priv: driver private structure
+ *  Description: it is used for configuring the DMA operation mode register in
+ *  order to program the tx/rx DMA thresholds or Store-And-Forward mode.
+ */
+static void uio_dma_operation_mode(struct stmmac_priv *priv)
+{
+	u32 rx_channels_count = priv->plat->rx_queues_to_use;
+	u32 tx_channels_count = priv->plat->tx_queues_to_use;
+	int rxfifosz = priv->plat->rx_fifo_size;
+	int txfifosz = priv->plat->tx_fifo_size;
+	u32 txmode = 0;
+	u32 rxmode = 0;
+	u32 chan = 0;
+	u8 qmode = 0;
+
+	if (rxfifosz == 0)
+		rxfifosz = priv->dma_cap.rx_fifo_size;
+	if (txfifosz == 0)
+		txfifosz = priv->dma_cap.tx_fifo_size;
+
+	/* Adjust for real per queue fifo size */
+	rxfifosz /= rx_channels_count;
+	txfifosz /= tx_channels_count;
+
+	if (priv->plat->force_thresh_dma_mode) {
+		txmode = tc;
+		rxmode = tc;
+	} else if (priv->plat->force_sf_dma_mode || priv->plat->tx_coe) {
+		/* In case of GMAC, SF mode can be enabled
+		 * to perform the TX COE in HW. This depends on:
+		 * 1) TX COE if actually supported
+		 * 2) There is no bugged Jumbo frame support
+		 *    that needs to not insert csum in the TDES.
+		 */
+		txmode = SF_DMA_MODE;
+		rxmode = SF_DMA_MODE;
+		priv->xstats.threshold = SF_DMA_MODE;
+	} else {
+		txmode = tc;
+		rxmode = SF_DMA_MODE;
+	}
+
+	/* configure all channels */
+	for (chan = 0; chan < rx_channels_count; chan++) {
+		qmode = priv->plat->rx_queues_cfg[chan].mode_to_use;
+
+		stmmac_dma_rx_mode(priv, priv->ioaddr, rxmode, chan,
+				   rxfifosz, qmode);
+		stmmac_set_dma_bfsize(priv, priv->ioaddr, priv->dma_buf_sz,
+				      chan);
+	}
+
+	for (chan = 0; chan < tx_channels_count; chan++) {
+		qmode = priv->plat->tx_queues_cfg[chan].mode_to_use;
+
+		stmmac_dma_tx_mode(priv, priv->ioaddr, txmode, chan,
+				   txfifosz, qmode);
+	}
+}
+
+/**
+ * rockchip_gmac_uio_mmc_setup: setup the Mac Management Counters (MMC)
+ * @priv: driver private structure
+ * Description: this masks the MMC irq, in fact, the counters are managed in SW.
+ */
+static void rockchip_gmac_uio_mmc_setup(struct stmmac_priv *priv)
+{
+	unsigned int mode = MMC_CNTRL_RESET_ON_READ | MMC_CNTRL_COUNTER_RESET |
+			    MMC_CNTRL_PRESET | MMC_CNTRL_FULL_HALF_PRESET;
+
+	dwmac_mmc_intr_all_mask(priv->mmcaddr);
+
+	if (priv->dma_cap.rmon) {
+		dwmac_mmc_ctrl(priv->mmcaddr, mode);
+		memset(&priv->mmc, 0, sizeof(struct stmmac_counters));
+	} else {
+		netdev_info(priv->dev, "No MAC Management Counters available\n");
+	}
+}
+
+/**
+ *  rockchip_gmac_uio_hw_setup - setup mac in a usable state.
+ *  @dev : pointer to the device structure.
+ *  @init_ptp: initialize PTP if set
+ *  Description:
+ *  this is the main function to setup the HW in a usable state because the
+ *  dma engine is reset, the core registers are configured (e.g. AXI,
+ *  Checksum features, timers). The DMA is ready to start receiving and
+ *  transmitting.
+ *  Return value:
+ *  0 on success and an appropriate (-)ve integer as defined in errno.h
+ *  file on failure.
+ */
+static int rockchip_gmac_uio_hw_setup(struct net_device *dev, bool init_ptp)
+{
+	struct stmmac_priv *priv = netdev_priv(dev);
+	int ret;
+
+	/* DMA initialization and SW reset */
+	ret = rockchip_gmac_uio_init_dma_engine(priv);
+	if (ret < 0) {
+		netdev_err(priv->dev, "%s: DMA engine initialization failed\n",
+			   __func__);
+		return ret;
+	}
+
+	/* Copy the MAC addr into the HW  */
+	stmmac_set_umac_addr(priv, priv->hw, dev->dev_addr, 0);
+
+	/* PS and related bits will be programmed according to the speed */
+	if (priv->hw->pcs) {
+		int speed = priv->plat->mac_port_sel_speed;
+
+		if (speed == SPEED_10 || speed == SPEED_100 ||
+		    speed == SPEED_1000) {
+			priv->hw->ps = speed;
+		} else {
+			dev_warn(priv->device, "invalid port speed\n");
+			priv->hw->ps = 0;
+		}
+	}
+
+	/* Initialize the MAC Core */
+	stmmac_core_init(priv, priv->hw, dev);
+
+	/* Initialize MTL*/
+	rockchip_gmac_uio_mtl_configuration(priv);
+
+	/* Initialize Safety Features */
+	uio_safety_feat_configuration(priv);
+
+	ret = stmmac_rx_ipc(priv, priv->hw);
+	if (!ret) {
+		netdev_warn(priv->dev, "RX IPC Checksum Offload disabled\n");
+		priv->plat->rx_coe = STMMAC_RX_COE_NONE;
+		priv->hw->rx_csum = 0;
+	}
+
+	/* Enable the MAC Rx/Tx */
+	stmmac_mac_set(priv, priv->ioaddr, true);
+
+	/* Set the HW DMA mode and the COE */
+	uio_dma_operation_mode(priv);
+
+	rockchip_gmac_uio_mmc_setup(priv);
+
+	if (priv->hw->pcs)
+		stmmac_pcs_ctrl_ane(priv, priv->hw, 1, priv->hw->ps, 0);
+
+	/* set TX and RX rings length */
+	uio_set_rings_length(priv);
+
+	return ret;
+}
+
+/**
+ *  uio_open - open entry point of the driver
+ *  @dev : pointer to the device structure.
+ *  Description:
+ *  This function is the open entry point of the driver.
+ *  Return value:
+ *  0 on success and an appropriate (-)ve integer as defined in errno.h
+ *  file on failure.
+ */
+static int uio_open(struct net_device *dev)
+{
+	struct stmmac_priv *priv = netdev_priv(dev);
+	int ret;
+
+	if (priv->hw->pcs != STMMAC_PCS_RGMII &&
+	    priv->hw->pcs != STMMAC_PCS_TBI &&
+	    priv->hw->pcs != STMMAC_PCS_RTBI) {
+		ret = rockchip_gmac_uio_init_phy(dev);
+		if (ret) {
+			netdev_err(priv->dev,
+				   "%s: Cannot attach to PHY (error: %d)\n",
+				   __func__, ret);
+			return ret;
+		}
+	}
+
+	/* Extra statistics */
+	memset(&priv->xstats, 0, sizeof(struct stmmac_extra_stats));
+	priv->xstats.threshold = tc;
+
+	priv->dma_buf_sz = STMMAC_ALIGN(buf_sz);
+	priv->rx_copybreak = STMMAC_RX_COPYBREAK;
+
+	ret = uio_alloc_dma_desc_resources(priv);
+	if (ret < 0) {
+		netdev_err(priv->dev, "%s: DMA descriptors allocation failed\n",
+			   __func__);
+		goto dma_desc_error;
+	}
+
+	ret = rockchip_gmac_uio_hw_setup(dev, true);
+	if (ret < 0) {
+		netdev_err(priv->dev, "%s: Hw setup failed\n", __func__);
+		goto init_error;
+	}
+
+	if (dev->phydev)
+		phy_start(dev->phydev);
+
+	return 0;
+
+init_error:
+	uio_free_dma_desc_resources(priv);
+dma_desc_error:
+	if (dev->phydev)
+		phy_disconnect(dev->phydev);
+	return ret;
+}
+
+/**
+ *  uio_release - close entry point of the driver
+ *  @dev : device pointer.
+ *  Description:
+ *  This is the stop entry point of the driver.
+ */
+static int uio_release(struct net_device *dev)
+{
+	struct stmmac_priv *priv = netdev_priv(dev);
+
+	/* Stop and disconnect the PHY */
+	if (dev->phydev) {
+		phy_stop(dev->phydev);
+		phy_disconnect(dev->phydev);
+		if (priv->plat->integrated_phy_power)
+			priv->plat->integrated_phy_power(priv->plat->bsp_priv,
+							 false);
+	}
+
+	/* Release and free the Rx/Tx resources */
+	uio_free_dma_desc_resources(priv);
+
+	/* Disable the MAC Rx/Tx */
+	stmmac_mac_set(priv, priv->ioaddr, false);
+
+	netif_carrier_off(dev);
+
+	return 0;
+}
+
+/**
+ * rockchip_gmac_uio_probe() platform driver probe routine
+ * - register uio devices filled with memory maps retrieved
+ * from device tree
+ */
+static int rockchip_gmac_uio_probe(struct platform_device *pdev)
+{
+	struct device *dev = &pdev->dev;
+	struct device_node *np = dev->of_node, *mac_node;
+	struct rockchip_gmac_uio_pdev_info *pdev_info;
+	struct net_device *netdev;
+	struct stmmac_priv *priv;
+	struct uio_info *uio;
+	struct resource *res;
+	int err = 0;
+
+	pdev_info = devm_kzalloc(dev, sizeof(struct rockchip_gmac_uio_pdev_info),
+				 GFP_KERNEL);
+	if (!pdev_info)
+		return -ENOMEM;
+
+	uio = &pdev_info->uio;
+	pdev_info->dev = dev;
+	mac_node = of_parse_phandle(np, "rockchip,ethernet", 0);
+	if (!mac_node)
+		return -ENODEV;
+
+	if (of_device_is_available(mac_node)) {
+		netdev = of_find_net_device_by_node(mac_node);
+		of_node_put(mac_node);
+		if (!netdev)
+			return -ENODEV;
+	} else {
+		of_node_put(mac_node);
+		return -EINVAL;
+	}
+
+	pdev_info->ndev = netdev;
+	rtnl_lock();
+	dev_close(netdev);
+	rtnl_unlock();
+
+	rtnl_lock();
+	err = uio_open(netdev);
+	if (err) {
+		rtnl_unlock();
+		dev_err(dev, "Failed to open stmmac resource: %d\n", err);
+		return err;
+	}
+	rtnl_unlock();
+
+	priv = netdev_priv(netdev);
+	snprintf(pdev_info->name, sizeof(pdev_info->name), "uio_%s",
+		 netdev->name);
+	uio->name = pdev_info->name;
+	uio->version = DRIVER_VERSION;
+
+	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+	if (!res)
+		return -ENODEV;
+
+	uio->mem[0].name = "eth_regs";
+	uio->mem[0].addr = res->start & PAGE_MASK;
+	uio->mem[0].size = PAGE_ALIGN(resource_size(res));
+	uio->mem[0].memtype = UIO_MEM_PHYS;
+
+	uio->mem[1].name = "eth_rx_bd";
+	uio->mem[1].addr = priv->rx_queue[0].dma_rx_phy;
+	uio->mem[1].size = DMA_RX_SIZE * sizeof(struct dma_desc);
+	uio->mem[1].memtype = UIO_MEM_PHYS;
+
+	uio->mem[2].name = "eth_tx_bd";
+	uio->mem[2].addr = priv->tx_queue[0].dma_tx_phy;
+	uio->mem[2].size = DMA_TX_SIZE * sizeof(struct dma_desc);
+	uio->mem[2].memtype = UIO_MEM_PHYS;
+
+	uio->open = rockchip_gmac_uio_open;
+	uio->release = rockchip_gmac_uio_release;
+	/* Custom mmap function. */
+	uio->mmap = rockchip_gmac_uio_mmap;
+	uio->priv = pdev_info;
+
+	err = uio_register_device(dev, uio);
+	if (err) {
+		dev_err(dev, "Failed to register uio device: %d\n", err);
+		return err;
+	}
+
+	pdev_info->map_num = 3;
+
+	dev_info(dev, "Registered %s uio devices, %d register maps attached\n",
+		 pdev_info->name, pdev_info->map_num);
+
+	platform_set_drvdata(pdev, pdev_info);
+
+	return 0;
+}
+
+/**
+ * rockchip_gmac_uio_remove() - ROCKCHIP ETH UIO platform driver release
+ * routine - unregister uio devices
+ */
+static int rockchip_gmac_uio_remove(struct platform_device *pdev)
+{
+	struct rockchip_gmac_uio_pdev_info *pdev_info =
+					platform_get_drvdata(pdev);
+	struct net_device *netdev;
+
+	if (!pdev_info)
+		return -EINVAL;
+
+	netdev = pdev_info->ndev;
+
+	uio_unregister_device(&pdev_info->uio);
+
+	if (netdev) {
+		rtnl_lock();
+		uio_release(netdev);
+		rtnl_unlock();
+	}
+
+	platform_set_drvdata(pdev, NULL);
+
+	if (netdev) {
+		rtnl_lock();
+		dev_open(netdev);
+		rtnl_unlock();
+	}
+
+	return 0;
+}
+
+static const struct of_device_id rockchip_gmac_uio_of_match[] = {
+	{ .compatible	= "rockchip,uio-gmac", },
+	{ }
+};
+
+static struct platform_driver rockchip_gmac_uio_driver = {
+	.driver = {
+		.owner		= THIS_MODULE,
+		.name		= DRIVER_NAME,
+		.of_match_table	= rockchip_gmac_uio_of_match,
+	},
+	.probe	= rockchip_gmac_uio_probe,
+	.remove	= rockchip_gmac_uio_remove,
+};
+
+module_platform_driver(rockchip_gmac_uio_driver);
+
+MODULE_LICENSE("GPL");
+MODULE_AUTHOR("ROCKCHIP");
+MODULE_DESCRIPTION("ROCKCHIP GMAC UIO Driver");
+
diff --git a/kernel/drivers/net/phy/fixed_phy.c b/kernel/drivers/net/phy/fixed_phy.c
index 5982016..953ff54 100644
--- a/kernel/drivers/net/phy/fixed_phy.c
+++ b/kernel/drivers/net/phy/fixed_phy.c
@@ -23,7 +23,6 @@
 #include <linux/slab.h>
 #include <linux/of.h>
 #include <linux/gpio.h>
-#include <linux/seqlock.h>
 #include <linux/idr.h>
 
 #include "swphy.h"
@@ -36,7 +35,6 @@
 struct fixed_phy {
 	int addr;
 	struct phy_device *phydev;
-	seqcount_t seqcount;
 	struct fixed_phy_status status;
 	int (*link_update)(struct net_device *, struct fixed_phy_status *);
 	struct list_head node;
@@ -62,18 +60,15 @@
 	list_for_each_entry(fp, &fmb->phys, node) {
 		if (fp->addr == phy_addr) {
 			struct fixed_phy_status state;
-			int s;
 
-			do {
-				s = read_seqcount_begin(&fp->seqcount);
-				/* Issue callback if user registered it. */
-				if (fp->link_update)
-					fp->link_update(fp->phydev->attached_dev,
-							&fp->status);
-				/* Check the GPIO for change in status */
-				fixed_phy_update(fp);
-				state = fp->status;
-			} while (read_seqcount_retry(&fp->seqcount, s));
+			/* Issue callback if user registered it. */
+			if (fp->link_update)
+				fp->link_update(fp->phydev->attached_dev,
+						&fp->status);
+
+			/* Check the GPIO for change in status */
+			fixed_phy_update(fp);
+			state = fp->status;
 
 			return swphy_read_reg(reg_num, &state);
 		}
@@ -130,8 +125,6 @@
 	fp = kzalloc(sizeof(*fp), GFP_KERNEL);
 	if (!fp)
 		return -ENOMEM;
-
-	seqcount_init(&fp->seqcount);
 
 	if (irq != PHY_POLL)
 		fmb->mii_bus->irq[phy_addr] = irq;
diff --git a/kernel/drivers/net/phy/motorcomm.c b/kernel/drivers/net/phy/motorcomm.c
index 2469a6a..5ec298a 100644
--- a/kernel/drivers/net/phy/motorcomm.c
+++ b/kernel/drivers/net/phy/motorcomm.c
@@ -573,7 +573,7 @@
 
 static int yt8531_config_init(struct phy_device *phydev)
 {
-	int ret = 0;
+	int ret = 0, val;
 
 #if (YTPHY8531A_XTAL_INIT)
 	ret = yt8531a_xtal_init(phydev);
@@ -591,10 +591,17 @@
 		return ret;
 
 	/* RXC, PHY_CLK_OUT and RXData Drive strength:
-	 * Drive strength of RXC = 4, PHY_CLK_OUT = 3, RXD0 = 4 (default)
-	 * If the io voltage is 3.3v, PHY_CLK_OUT = 2, set 0xa010 = 0x9acf
+	 * Drive strength of RXC = 6, PHY_CLK_OUT = 3, RXD0 = 4 (default 1.8v)
+	 * If the io voltage is 3.3v, PHY_CLK_OUT = 2, set 0xa010 = 0xdacf
 	 */
-	ret = ytphy_write_ext(phydev, 0xa010, 0x9bcf);
+	ret = ytphy_write_ext(phydev, 0xa010, 0xdbcf);
+	if (ret < 0)
+		return ret;
+
+	/* Change 100M default BGS voltage from 0x294c to 0x274c */
+	val = ytphy_read_ext(phydev, 0x57);
+	val = (val & ~(0xf << 8)) | (7 << 8);
+	ret = ytphy_write_ext(phydev, 0x57, val);
 	if (ret < 0)
 		return ret;
 
diff --git a/kernel/drivers/net/phy/phy_device.c b/kernel/drivers/net/phy/phy_device.c
index 6655447..47e80d8 100644
--- a/kernel/drivers/net/phy/phy_device.c
+++ b/kernel/drivers/net/phy/phy_device.c
@@ -505,6 +505,15 @@
 	INIT_DELAYED_WORK(&dev->state_queue, phy_state_machine);
 	INIT_WORK(&dev->phy_queue, phy_change_work);
 
+	/* Try to avoid __request_module warning */
+#define RK630_PHY_ID		0x00441400
+#define PHY_ID_YT8511		0x0000010a
+#define PHY_ID_YT8531S		0x4f51e91a
+#define PHY_ID_YT8531		0x4f51e91b
+	if ((IS_BUILTIN(CONFIG_RK630_PHY) && phy_id == RK630_PHY_ID) ||
+	    (IS_BUILTIN(CONFIG_MOTORCOMM_PHY) && (phy_id == PHY_ID_YT8511 || phy_id == PHY_ID_YT8531S || phy_id == PHY_ID_YT8531)))
+		goto skip_request_module;
+
 	/* Request the appropriate module unconditionally; don't
 	 * bother trying to do so only if it isn't already loaded,
 	 * because that gets complicated. A hotplug event would have
@@ -517,6 +526,7 @@
 	 */
 	request_module(MDIO_MODULE_PREFIX MDIO_ID_FMT, MDIO_ID_ARGS(phy_id));
 
+skip_request_module:
 	device_initialize(&mdiodev->dev);
 
 	return dev;
diff --git a/kernel/drivers/net/phy/rk630phy.c b/kernel/drivers/net/phy/rk630phy.c
index f0128a5..327301d 100644
--- a/kernel/drivers/net/phy/rk630phy.c
+++ b/kernel/drivers/net/phy/rk630phy.c
@@ -16,6 +16,7 @@
 #include <linux/mfd/core.h>
 #include <linux/mii.h>
 #include <linux/netdevice.h>
+#include <linux/nvmem-consumer.h>
 #include <linux/of_irq.h>
 #include <linux/phy.h>
 #include <linux/platform_device.h>
@@ -24,6 +25,8 @@
 #define RK630_PHY_ID				0x00441400
 
 /* PAGE 0 */
+#define REG_MMD_ACCESS_CONTROL			0x0d
+#define REG_MMD_ACCESS_DATA_ADDRESS		0x0e
 #define REG_INTERRUPT_STATUS			0X10
 #define REG_INTERRUPT_MASK			0X11
 #define REG_GLOBAL_CONFIGURATION		0X13
@@ -50,6 +53,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 */
@@ -61,15 +65,51 @@
  * Addr: 1 --- RK630@S40
  *       2 --- RV1106@T22
  */
-#define PHY_ADDR_S40 1
-#define PHY_ADDR_T22 2
+#define PHY_ADDR_S40				1
+#define PHY_ADDR_T22				2
+
+#define T22_TX_LEVEL_100M			0x2d
+#define T22_TX_LEVEL_10M			0x32
 
 struct rk630_phy_priv {
 	struct phy_device *phydev;
 	bool ieee;
 	int wol_irq;
 	struct wake_lock wol_wake_lock;
+	int tx_level_100M;
+	int tx_level_10M;
 };
+
+static void rk630_phy_t22_get_tx_level_from_efuse(struct phy_device *phydev)
+{
+	struct rk630_phy_priv *priv = phydev->priv;
+	unsigned int tx_level_100M = T22_TX_LEVEL_100M;
+	unsigned int tx_level_10M = T22_TX_LEVEL_10M;
+	unsigned char *efuse_buf;
+	struct nvmem_cell *cell;
+	size_t len;
+
+	cell = nvmem_cell_get(&phydev->mdio.dev, "txlevel");
+	if (IS_ERR(cell)) {
+		phydev_err(phydev, "failed to get txlevel cell: %ld, use default\n",
+			   PTR_ERR(cell));
+	} else {
+		efuse_buf = nvmem_cell_read(cell, &len);
+		nvmem_cell_put(cell);
+		if (!IS_ERR(efuse_buf)) {
+			if (len == 2 && efuse_buf[0] > 0 && efuse_buf[1] > 0) {
+				tx_level_100M = efuse_buf[1];
+				tx_level_10M = efuse_buf[0];
+			}
+			kfree(efuse_buf);
+		} else {
+			phydev_err(phydev, "failed to get efuse buf, use default\n");
+		}
+	}
+
+	priv->tx_level_100M = tx_level_100M;
+	priv->tx_level_10M = tx_level_10M;
+}
 
 static void rk630_phy_wol_enable(struct phy_device *phydev)
 {
@@ -164,6 +204,8 @@
 
 static void rk630_phy_t22_config_init(struct phy_device *phydev)
 {
+	struct rk630_phy_priv *priv = phydev->priv;
+
 	/* Switch to page 1 */
 	phy_write(phydev, REG_PAGE_SEL, 0x0100);
 	/* Disable APS */
@@ -180,8 +222,13 @@
 	phy_write(phydev, REG_PAGE6_GAIN_ANONTROL, 0x0400);
 	/* PHYAFE EQ optimization */
 	phy_write(phydev, REG_PAGE6_AFE_TX_CTRL, 0x1088);
+
+	if (priv->tx_level_100M <= 0 || priv->tx_level_10M <= 0)
+		rk630_phy_t22_get_tx_level_from_efuse(phydev);
+
 	/* PHYAFE TX optimization */
-	phy_write(phydev, REG_PAGE6_AFE_DRIVER2, 0x3030);
+	phy_write(phydev, REG_PAGE6_AFE_DRIVER2,
+		  (priv->tx_level_100M << 8) | priv->tx_level_10M);
 	/* PHYAFE CP current optimization */
 	phy_write(phydev, REG_PAGE6_CP_CURRENT, 0x0575);
 	/* ADC OP BIAS optimization */
@@ -190,6 +237,8 @@
 	phy_write(phydev, REG_PAGE6_RX_DECTOR, 0x0408);
 	/* PHYAFE PDCW optimization */
 	phy_write(phydev, REG_PAGE6_AFE_PDCW, 0x8880);
+	/* Add PHY Tx mos drive, reduce power noise/jitter */
+	phy_write(phydev, REG_PAGE6_TX_MOS_DRV, 0x888e);
 
 	/* Switch to page 8 */
 	phy_write(phydev, REG_PAGE_SEL, 0x0800);
@@ -198,6 +247,12 @@
 
 	/* Switch to page 0 */
 	phy_write(phydev, REG_PAGE_SEL, 0x0000);
+
+	/* Disable eee mode advertised */
+	phy_write(phydev, REG_MMD_ACCESS_CONTROL, 0x0007);
+	phy_write(phydev, REG_MMD_ACCESS_DATA_ADDRESS, 0x003c);
+	phy_write(phydev, REG_MMD_ACCESS_CONTROL, 0x4007);
+	phy_write(phydev, REG_MMD_ACCESS_DATA_ADDRESS, 0x0000);
 }
 
 static int rk630_phy_config_init(struct phy_device *phydev)
@@ -205,6 +260,11 @@
 	switch (phydev->mdio.addr) {
 	case PHY_ADDR_S40:
 		rk630_phy_s40_config_init(phydev);
+		/*
+		 * Ultra Auto-Power Saving Mode (UAPS) is designed to
+		 * save power when cable is not plugged into PHY.
+		 */
+		rk630_phy_set_uaps(phydev);
 		break;
 	case PHY_ADDR_T22:
 		rk630_phy_t22_config_init(phydev);
@@ -216,11 +276,6 @@
 	}
 
 	rk630_phy_ieee_set(phydev, true);
-	/*
-	 * Ultra Auto-Power Saving Mode (UAPS) is designed to
-	 * save power when cable is not plugged into PHY.
-	 */
-	rk630_phy_set_uaps(phydev);
 
 	return 0;
 }
diff --git a/kernel/drivers/net/wireless/intersil/orinoco/orinoco_usb.c b/kernel/drivers/net/wireless/intersil/orinoco/orinoco_usb.c
index a04d598..e0046c3 100644
--- a/kernel/drivers/net/wireless/intersil/orinoco/orinoco_usb.c
+++ b/kernel/drivers/net/wireless/intersil/orinoco/orinoco_usb.c
@@ -697,8 +697,8 @@
 			while (!ctx->done.done && msecs--)
 				udelay(1000);
 		} else {
-			wait_event_interruptible(ctx->done.wait,
-						 ctx->done.done);
+			swait_event_interruptible_exclusive(ctx->done.wait,
+							    ctx->done.done);
 		}
 		break;
 	default:
diff --git a/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/Makefile b/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/Makefile
index aecfc06..071b8d4 100644
--- a/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/Makefile
+++ b/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/Makefile
@@ -2,7 +2,7 @@
 # bcmdhd
 
 MODULE_NAME := bcmdhd
-CONFIG_BCMDHD ?= m
+CONFIG_AP6XXX ?= m
 
 CONFIG_BCMDHD_SDIO := y
 #CONFIG_BCMDHD_PCIE := y
@@ -44,7 +44,7 @@
 	-DDHD_DONOT_FORWARD_BCMEVENT_AS_NETWORK_PKT -DOEM_ANDROID             \
 	-DMULTIPLE_SUPPLICANT -DTSQ_MULTIPLIER -DMFP -DDHD_8021X_DUMP         \
 	-DPOWERUP_MAX_RETRY=0 -DIFACE_HANG_FORCE_DEV_CLOSE -DWAIT_DEQUEUE     \
-	-DUSE_NEW_RSPEC_DEFS -DBCM_USE_PLATFORM_STRLCPY                       \
+	-DUSE_NEW_RSPEC_DEFS                                                  \
 	-DWL_EXT_IAPSTA -DWL_ESCAN -DCCODE_LIST -DSUSPEND_EVENT               \
 	-DKEY_INSTALL_CHECK                                                   \
 	-DENABLE_INSMOD_NO_FW_LOAD
@@ -69,6 +69,7 @@
 	DHDOFILES += wl_linux_mon.o wl_cfg_btcoex.o wl_cfgvendor.o
 	DHDOFILES += dhd_cfg80211.o wl_cfgvif.o wl_roam.o
 	DHDCFLAGS += -DWL_CFG80211 -DWLP2P -DWL_CFG80211_STA_EVENT
+	DHDCFLAGS += -DWL_CAP_HE
 #	DHDCFLAGS += -DWL_IFACE_COMB_NUM_CHANNELS
 	DHDCFLAGS += -DCUSTOM_PNO_EVENT_LOCK_xTIME=10
 	DHDCFLAGS += -DWL_SUPPORT_AUTO_CHANNEL
@@ -76,13 +77,17 @@
 	DHDCFLAGS += -DESCAN_RESULT_PATCH -DESCAN_BUF_OVERFLOW_MGMT
 	DHDCFLAGS += -DVSDB -DWL_CFG80211_VSDB_PRIORITIZE_SCAN_REQUEST
 	DHDCFLAGS += -DWLTDLS -DMIRACAST_AMPDU_SIZE=8
+#    DHDCFLAGS += -DHOSTAPD_BW_SUPPORT
+#    DHDCFLAGS += -DHOSTAPD_EID_EXTENSION_SUPPORT
 	DHDCFLAGS += -DWL_VIRTUAL_APSTA -DSTA_MGMT
 	DHDCFLAGS += -DPNO_SUPPORT -DEXPLICIT_DISCIF_CLEANUP
 	DHDCFLAGS += -DDHD_USE_SCAN_WAKELOCK
 	DHDCFLAGS += -DSPECIFIC_MAC_GEN_SCHEME
 	DHDCFLAGS += -DWL_IFACE_MGMT
+	DHDCFLAGS += -DSUPPORT_RSSI_SUM_REPORT
 	DHDCFLAGS += -DWLFBT -DWL_GCMP_SUPPORT
 	DHDCFLAGS += -DROAM_CHANNEL_CACHE -DDHD_LOSSLESS_ROAMING -DWL_ROAM_WAR
+#	DHDCFLAGS += -DVNDR_IE_WAR -DGET_FW_IE_DATA
 	DHDCFLAGS += -DGTK_OFFLOAD_SUPPORT
 	DHDCFLAGS += -DRESTART_AP_WAR
 #	DHDCFLAGS += -DWL_STATIC_IF
@@ -92,7 +97,7 @@
 #BCMDHD_SDIO
 ifneq ($(CONFIG_BCMDHD_SDIO),)
 BUS_TYPE := sdio
-DHDCFLAGS += -DBCMSDIO -DMMC_SDIO_ABORT -DBCMLXSDMMC       \
+DHDCFLAGS += -DBCMSDIO -DMMC_SDIO_ABORT -DMMC_HW_RESET -DBCMLXSDMMC       \
 	-DUSE_SDIOFIFO_IOVAR -DSDTEST                                         \
 	-DBDC -DDHD_USE_IDLECOUNT -DCUSTOM_SDIO_F2_BLKSIZE=256                \
 	-DBCMSDIOH_TXGLOM -DBCMSDIOH_TXGLOM_EXT -DBCMSDIOH_STATIC_COPY_BUF    \
@@ -119,7 +124,8 @@
 DHDCFLAGS += -DDHD_LB -DDHD_LB_RXP -DDHD_LB_STATS -DDHD_LB_TXP
 DHDCFLAGS += -DDHD_PKTID_AUDIT_ENABLED
 DHDCFLAGS += -DINSMOD_FW_LOAD
-DHDCFLAGS += -DCONFIG_HAS_WAKELOCK
+DHDCFLAGS += -DCONFIG_HAS_WAKELOCK #-DDHD_DEBUG_WAKE_LOCK
+DHDCFLAGS += -DDHD_PACKET_TIMEOUT_MS=50 -DMAX_TX_TIMEOUT=50
 #DHDCFLAGS += -DDHD_PCIE_RUNTIMEPM -DMAX_IDLE_COUNT=11 -DCUSTOM_DHD_RUNTIME_MS=100
 ifeq ($(CONFIG_BCMDHD_OOB),y)
 	DHDCFLAGS += -DCUSTOMER_OOB -DBCMPCIE_OOB_HOST_WAKE -DHW_OOB
@@ -139,6 +145,7 @@
 DHDCFLAGS += -DINSMOD_FW_LOAD
 DHDCFLAGS += -DBCM_REQUEST_FW
 DHDCFLAGS += -DSHOW_LOGTRACE
+DHDCFLAGS += -DWL_EXT_WOWL
 ifneq ($(CONFIG_BCMDHD_REQUEST_FW),y)
 	DHDCFLAGS += -DEXTERNAL_FW_PATH
 endif
@@ -282,7 +289,7 @@
 ifneq ($(CONFIG_CFG80211),)
 	DHDCFLAGS += -DWL_EXT_RECONNECT -DWL_REASSOC_BCAST
 	DHDCFLAGS += -DWL_EXT_DISCONNECT_RECONNECT
-endif 
+endif
 endif
 
 # For TPUT_IMPROVE
@@ -339,7 +346,11 @@
 endif
 endif
 
-ifeq ($(CONFIG_BCMDHD),m)
+ifeq ($(CONFIG_AP6XXX),y)
+	DHDCFLAGS += -DUSE_LATE_INITCALL_SYNC
+	DHDCFLAGS += -DBCM_USE_PLATFORM_STRLCPY
+endif
+ifeq ($(CONFIG_AP6XXX),m)
 	DHDCFLAGS += -DBCMDHD_MODULAR
 endif
 
@@ -350,6 +361,14 @@
 endif
 	DHDCFLAGS += -DCUSTOMER_HW -DDHD_OF_SUPPORT
 	DHDCFLAGS += -DCUSTOMER_HW_ROCKCHIP
+#	DHDCFLAGS += -DCUSTOMER_HW_ROCKCHIP_RK3588
+	DHDCFLAGS += -DBCM_USE_PLATFORM_STRLCPY
+endif
+
+ifneq ($(CONFIG_BCMDHD_PCIE),)
+ifneq ($(filter -DCUSTOMER_HW_ROCKCHIP_RK3588, $(DHDCFLAGS)),)
+	DHDCFLAGS += -DDHD_CONTROL_PCIE_ASPM_WIFI_TURNON
+endif
 endif
 
 ifeq ($(CONFIG_BCMDHD_REQUEST_FW),y)
@@ -391,7 +410,7 @@
 EXTRA_CFLAGS = $(DHDCFLAGS)
 EXTRA_CFLAGS += -DDHD_COMPILED=\"$(BCMDHD_ROOT)\"
 EXTRA_CFLAGS += -I$(BCMDHD_ROOT)/include/ -I$(BCMDHD_ROOT)/
-ifeq ($(CONFIG_BCMDHD),m)
+ifeq ($(CONFIG_AP6XXX),m)
 EXTRA_LDFLAGS += --strip-debug
 endif
 
diff --git a/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/bcmsdh_sdmmc.c b/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/bcmsdh_sdmmc.c
index dc38371..ba31570 100644
--- a/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/bcmsdh_sdmmc.c
+++ b/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/bcmsdh_sdmmc.c
@@ -83,8 +83,18 @@
 #endif /* !defined(OOB_INTR_ONLY) */
 static int sdioh_sdmmc_get_cisaddr(sdioh_info_t *sd, uint32 regaddr);
 #if defined(ENABLE_INSMOD_NO_FW_LOAD) && !defined(BUS_POWER_RESTORE)
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 18, 0) && defined(MMC_SW_RESET)
+#if defined(MMC_SW_RESET) && LINUX_VERSION_CODE >= KERNEL_VERSION(4, 18, 0)
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 19, 0)
+extern int mmc_sw_reset(struct mmc_card *card);
+#else
 extern int mmc_sw_reset(struct mmc_host *host);
+#endif
+#elif defined(MMC_HW_RESET) && LINUX_VERSION_CODE >= KERNEL_VERSION(4, 2, 0)
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 18, 0)
+extern int mmc_hw_reset(struct mmc_card *card);
+#else
+extern int mmc_hw_reset(struct mmc_host *host);
+#endif
 #else
 extern int sdio_reset_comm(struct mmc_card *card);
 #endif
@@ -184,7 +194,7 @@
 	err_ret = sdio_enable_func(sd->func[1]);
 	sdio_release_host(sd->func[1]);
 	if (err_ret) {
-		sd_err(("bcmsdh_sdmmc: Failed to enable F1 Err: 0x%08x\n", err_ret));
+		sd_err(("bcmsdh_sdmmc: Failed to enable F1 Err: %d\n", err_ret));
 	}
 
 	return FALSE;
@@ -1222,7 +1232,7 @@
 		if (err_ret)
 #endif /* MMC_SDIO_ABORT */
 		{
-			sd_err(("bcmsdh_sdmmc: Failed to %s word F%d:@0x%05x=%02x, Err: 0x%08x\n",
+			sd_err(("bcmsdh_sdmmc: Failed to %s word F%d:@0x%05x=%02x, Err: %d\n",
 				rw ? "Write" : "Read", func, addr, *word, err_ret));
 		}
 	}
@@ -1772,18 +1782,37 @@
 #if defined(ENABLE_INSMOD_NO_FW_LOAD) && !defined(BUS_POWER_RESTORE)
 static int sdio_sw_reset(sdioh_info_t *sd)
 {
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 18, 0) && defined(MMC_SW_RESET)
-	struct mmc_host *host = sd->func[0]->card->host;
-#endif
+	struct mmc_card *card = sd->func[0]->card;
 	int err = 0;
 
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 18, 0) && defined(MMC_SW_RESET)
-	printf("%s: Enter\n", __FUNCTION__);
+#if defined(MMC_SW_RESET) && LINUX_VERSION_CODE >= KERNEL_VERSION(4, 18, 0)
+	/* MMC_SW_RESET */
+	printf("%s: call mmc_sw_reset\n", __FUNCTION__);
 	sdio_claim_host(sd->func[0]);
-	err = mmc_sw_reset(host);
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 19, 0)
+	err = mmc_sw_reset(card);
+#else
+	err = mmc_sw_reset(card->host);
+#endif
+	sdio_release_host(sd->func[0]);
+#elif defined(MMC_HW_RESET) && LINUX_VERSION_CODE >= KERNEL_VERSION(4, 2, 0)
+	/* MMC_HW_RESET */
+	printf("%s: call mmc_hw_reset\n", __FUNCTION__);
+	sdio_claim_host(sd->func[0]);
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 4, 0)
+	while (atomic_read(&card->sdio_funcs_probed) > 1) {
+		atomic_dec(&card->sdio_funcs_probed);
+	}
+#endif
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 18, 0)
+	err = mmc_hw_reset(card);
+#else
+	err = mmc_hw_reset(card->host);
+#endif
 	sdio_release_host(sd->func[0]);
 #else
-	err = sdio_reset_comm(sd->func[0]->card);
+	/* sdio_reset_comm */
+	err = sdio_reset_comm(card);
 #endif
 
 	if (err)
diff --git a/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dbus.c b/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dbus.c
index a3da591..d15b758 100644
--- a/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dbus.c
+++ b/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dbus.c
@@ -2452,14 +2452,19 @@
 	dhd_pub_t *dhd = (dhd_pub_t *)handle;
 	unsigned long flags;
 	wifi_adapter_info_t *adapter;
+	int wowl_dngldown = 0;
 
 	if (dhd == NULL) {
 		DBUSERR(("%s: dhd is NULL\n", __FUNCTION__));
 		return;
 	}
 	adapter = (wifi_adapter_info_t *)dhd->adapter;
+#ifdef WL_EXT_WOWL
+	wowl_dngldown = dhd_conf_wowl_dngldown(dhd);
+#endif
 
-	if (dhd->busstate == DHD_BUS_SUSPEND && state == DBUS_STATE_DOWN) {
+	if ((dhd->busstate == DHD_BUS_SUSPEND && state == DBUS_STATE_DOWN) ||
+			(dhd->hostsleep && wowl_dngldown)) {
 		DBUSERR(("%s: switch state %d to %d\n", __FUNCTION__, state, DBUS_STATE_SLEEP));
 		state = DBUS_STATE_SLEEP;
 	}
@@ -3059,6 +3064,7 @@
 	}
 
 	DBUSTRACE(("%s: Exit\n", __FUNCTION__));
+	wifi_clr_adapter_status(adapter, WIFI_STATUS_BUS_DISCONNECTED);
 	if (net_attached) {
 		wifi_set_adapter_status(adapter, WIFI_STATUS_NET_ATTACHED);
 		wake_up_interruptible(&adapter->status_event);
@@ -3112,6 +3118,7 @@
 		dhd_dbus_advertise_bus_remove(bus->dhd);
 		dbus_detach(pub->bus);
 		pub->bus = NULL;
+		wifi_set_adapter_status(adapter, WIFI_STATUS_BUS_DISCONNECTED);
 		wake_up_interruptible(&adapter->status_event);
 	} else {
 		osh = pub->osh;
@@ -3133,6 +3140,24 @@
 	DBUSTRACE(("%s: Exit\n", __FUNCTION__));
 }
 
+int
+dhd_bus_sleep(dhd_pub_t *dhdp, bool sleep, uint32 *intstatus)
+{
+	wifi_adapter_info_t *adapter = (wifi_adapter_info_t *)dhdp->adapter;
+	s32 timeout = -1;
+	int err = 0;
+
+	timeout = wait_event_interruptible_timeout(adapter->status_event,
+		wifi_get_adapter_status(adapter, WIFI_STATUS_BUS_DISCONNECTED),
+		msecs_to_jiffies(12000));
+	if (timeout <= 0) {
+		err = -1;
+		DBUSERR(("%s: bus disconnected timeout\n", __FUNCTION__));
+	}
+
+	return err;
+}
+
 #ifdef LINUX_EXTERNAL_MODULE_DBUS
 
 static int __init
diff --git a/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dbus_usb_linux.c b/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dbus_usb_linux.c
index 3630bfc..96a25ce 100644
--- a/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dbus_usb_linux.c
+++ b/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dbus_usb_linux.c
@@ -476,7 +476,7 @@
 
 /** functions called by the Linux kernel USB subsystem */
 static struct usb_driver dbus_usbdev = {
-	name:           "dbus_usbdev",
+	name:           "dbus_usbdev"BUS_TYPE,
 	probe:          dbus_usbos_probe,
 	disconnect:     dbus_usbos_disconnect,
 	id_table:       devid_table,
@@ -1332,6 +1332,7 @@
 		usb->portnum, WIFI_STATUS_POWER_ON);
 	if (adapter == NULL) {
 		DBUSERR(("%s: can't find adapter info for this chip\n", __FUNCTION__));
+		ret = -ENOMEM;
 		goto fail;
 	}
 
@@ -2648,8 +2649,13 @@
 	}
 
 	if (usbos_info->tx_pipe)
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 19, 0))
+		usbos_info->maxps = usb_maxpacket(usbos_info->usb,
+			usbos_info->tx_pipe);
+#else
 		usbos_info->maxps = usb_maxpacket(usbos_info->usb,
 			usbos_info->tx_pipe, usb_pipeout(usbos_info->tx_pipe));
+#endif  /* #if (LINUX_VERSION_CODE < KERNEL_VERSION(5, 19, 0)) */
 
 	INIT_LIST_HEAD(&usbos_info->req_rxfreeq);
 	INIT_LIST_HEAD(&usbos_info->req_txfreeq);
@@ -3452,4 +3458,4 @@
 {
 	return &g_probe_info.usb->dev;
 }
-#endif /* LINUX */
\ No newline at end of file
+#endif /* LINUX */
diff --git a/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dhd.h b/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dhd.h
index d51fe1a..8a42530 100644
--- a/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dhd.h
+++ b/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dhd.h
@@ -2213,7 +2213,7 @@
 	} while (0)
 #define DHD_TXFL_WAKE_LOCK_TIMEOUT(pub, val) \
 	do { \
-		printf("call pm_wake_timeout enable\n"); \
+		printf("call txfl_wake_timeout enable\n"); \
 		dhd_txfl_wake_lock_timeout(pub, val); \
 	} while (0)
 #define DHD_TXFL_WAKE_UNLOCK(pub) \
@@ -2366,10 +2366,14 @@
 #define DHD_OS_OOB_IRQ_WAKE_UNLOCK(pub)			dhd_os_oob_irq_wake_unlock(pub)
 #endif /* BCMPCIE_OOB_HOST_WAKE */
 
+#ifndef DHD_PACKET_TIMEOUT_MS
 #define DHD_PACKET_TIMEOUT_MS	500
+#endif
 #define DHD_EVENT_TIMEOUT_MS	1500
 #define SCAN_WAKE_LOCK_TIMEOUT	10000
+#ifndef MAX_TX_TIMEOUT
 #define MAX_TX_TIMEOUT			500
+#endif
 
 /* Enum for IOCTL recieved status */
 typedef enum dhd_ioctl_recieved_status
@@ -3703,8 +3707,8 @@
 
 #ifdef DBG_PKT_MON
 /* Enable DHD PKT MON spin lock/unlock */
-#define DHD_PKT_MON_LOCK(lock, flags)     (flags) = osl_mutex_lock(lock)
-#define DHD_PKT_MON_UNLOCK(lock, flags)   osl_mutex_unlock(lock, (flags))
+#define DHD_PKT_MON_LOCK(lock, flags)     (flags) = osl_spin_lock(lock)
+#define DHD_PKT_MON_UNLOCK(lock, flags)   osl_spin_unlock(lock, (flags))
 #endif /* DBG_PKT_MON */
 
 #ifdef DHD_PKT_LOGGING
@@ -4723,7 +4727,7 @@
 #define DHD_VFS_UNLINK(dir, b, c) 0
 
 static INLINE struct file *dhd_filp_open(const char *filename, int flags, int mode)
-	{ return NULL; }
+	{ printf("%s: DHD_SUPPORT_VFS_CALL not defined\n", __FUNCTION__); return NULL; }
 static INLINE int dhd_filp_close(void *image, void *id)
 	{ return 0; }
 static INLINE int dhd_i_size_read(const struct inode *inode)
diff --git a/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dhd_config.c b/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dhd_config.c
index 33307c8..f05a119 100644
--- a/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dhd_config.c
+++ b/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dhd_config.c
@@ -141,7 +141,7 @@
 	{BCM43751_CHIP_ID,	1,	DONT_CARE,	"bcm43751a1_pcie_ag",	""},
 	{BCM43751_CHIP_ID,	2,	DONT_CARE,	"bcm43751a2_pcie_ag",	""},
 	{BCM43752_CHIP_ID,	1,	DONT_CARE,	"bcm43752a1_pcie_ag",	""},
-	{BCM43752_CHIP_ID,	2,	DONT_CARE,	"bcm43752a2_pcie_ag",	"AP6275P"},
+	{BCM43752_CHIP_ID,	2,	DONT_CARE,	"bcm43752a2_pcie_ag",	"ap6275p"},
 	{BCM4375_CHIP_ID,	5,	DONT_CARE,	"bcm4375b4_pcie_ag",	""},
 #endif
 #ifdef BCMDBUS
@@ -271,7 +271,6 @@
 			chip == BCM4334_CHIP_ID || chip == BCM43340_CHIP_ID ||
 			chip == BCM43341_CHIP_ID || chip == BCM4324_CHIP_ID ||
 			chip == BCM4335_CHIP_ID || chip == BCM4339_CHIP_ID ||
-			chip == BCM4354_CHIP_ID || chip == BCM4356_CHIP_ID ||
 			chip == BCM43143_CHIP_ID || chip == BCM43242_CHIP_ID ||
 			chip == BCM43569_CHIP_ID) {
 		return false;
@@ -282,7 +281,7 @@
 #endif
 
 #ifdef BCMSDIO
-bool
+static void
 dhd_conf_disable_slpauto(dhd_pub_t *dhd)
 {
 	uint chip = dhd->conf->chip;
@@ -296,10 +295,9 @@
 			chip == BCM43430_CHIP_ID ||
 			chip == BCM4345_CHIP_ID || chip == BCM43454_CHIP_ID ||
 			chip == BCM4359_CHIP_ID) {
-		return false;
+		dhd_slpauto = FALSE;
 	}
-
-	return true;
+	CONFIG_MSG("dhd_slpauto = %d\n", dhd_slpauto);
 }
 #endif
 
@@ -1377,7 +1375,6 @@
 
 	return;
 }
-
 #endif /* DHD_LINUX_STD_FW_API */
 
 void
@@ -1415,7 +1412,6 @@
 #endif
 
 #ifdef DHD_LINUX_STD_FW_API
-	// preprocess the filename to only left 'name'
 	dhd_conf_add_filepath(dhd, fw_path);
 	dhd_conf_add_filepath(dhd, nv_path);
 	dhd_conf_add_filepath(dhd, dhd->clm_path);
@@ -2464,12 +2460,24 @@
 	int *hostsleep_set, int *hostsleep_val, int *ret)
 {
 	if (dhd->conf->insuspend & (NO_TXCTL_IN_SUSPEND | WOWL_IN_SUSPEND)) {
+		int wowl_dngldown = 0;
+#ifdef WL_EXT_WOWL
+		wowl_dngldown = dhd_conf_wowl_dngldown(dhd);
+#endif
 		if (cmd == WLC_SET_VAR) {
 			char *psleep = NULL;
-			psleep = strstr(buf, "hostsleep");
-			if (psleep) {
-				*hostsleep_set = 1;
-				memcpy(hostsleep_val, psleep+strlen("hostsleep")+1, sizeof(int));
+			if (wowl_dngldown) {
+				psleep = strstr(buf, "wowl_activate");
+				if (psleep) {
+					*hostsleep_set = 1;
+					memcpy(hostsleep_val, psleep+strlen("wowl_activate")+1, sizeof(int));
+				}
+			} else {
+				psleep = strstr(buf, "hostsleep");
+				if (psleep) {
+					*hostsleep_set = 1;
+					memcpy(hostsleep_val, psleep+strlen("hostsleep")+1, sizeof(int));
+				}
 			}
 		}
 		if (dhd->hostsleep && (!*hostsleep_set || *hostsleep_val)) {
@@ -2710,6 +2718,21 @@
 	}
 
 	return ret;
+}
+
+int
+dhd_conf_wowl_dngldown(dhd_pub_t *dhd)
+{
+	int wowl_dngldown = 0;
+#ifdef BCMDBUS
+	uint insuspend = 0;
+	insuspend = dhd_conf_get_insuspend(dhd, ALL_IN_SUSPEND);
+	if ((insuspend & WOWL_IN_SUSPEND) && dhd_master_mode) {
+		wowl_dngldown = dhd->conf->wowl_dngldown;
+	}
+#endif
+
+	return wowl_dngldown;
 }
 #endif
 
@@ -2971,8 +2994,12 @@
 			for(i=0; i<conf->pkt_filter_add.count; i++) {
 				dhd_conf_wowl_pattern(dhd, ifidx, TRUE, conf->pkt_filter_add.filter[i]);
 			}
+			CONFIG_MSG("wowl = 0x%x\n", conf->wowl);
 			dhd_conf_set_intiovar(dhd, ifidx, WLC_SET_VAR, "wowl", conf->wowl, 0, FALSE);
-			dhd_conf_set_intiovar(dhd, ifidx, WLC_SET_VAR, "wowl_activate", 1, 0, FALSE);
+#ifdef BCMDBUS
+			CONFIG_MSG("wowl_dngldown = %d\n", conf->wowl_dngldown);
+			dhd_conf_set_intiovar(dhd, ifidx, WLC_SET_VAR, "wowl_dngldown", conf->wowl_dngldown, 1, FALSE);
+#endif
 			dhd_conf_wowl_wakeind(dhd, ifidx, TRUE);
 		}
 #endif
@@ -2988,7 +3015,7 @@
 #ifdef WL_EXT_WOWL
 		if (insuspend & WOWL_IN_SUSPEND) {
 			dhd_conf_wowl_wakeind(dhd, ifidx, FALSE);
-			dhd_conf_set_intiovar(dhd, ifidx, WLC_SET_VAR, "wowl_activate", 0, 0, FALSE);
+//			dhd_conf_set_intiovar(dhd, ifidx, WLC_SET_VAR, "wowl_activate", 0, 0, FALSE);
 			dhd_conf_set_intiovar(dhd, ifidx, WLC_SET_VAR, "wowl", 0, 0, FALSE);
 			dhd_conf_wowl_pattern(dhd, ifidx, FALSE, "clr");
 		}
@@ -3038,19 +3065,32 @@
 
 	if (suspend) {
 		if (insuspend & (WOWL_IN_SUSPEND | NO_TXCTL_IN_SUSPEND)) {
-#ifdef BCMSDIO
 			uint32 intstatus = 0;
-			int ret = 0;
-#endif
-			int hostsleep = 2;
+			int ret = 0, hostsleep = 2, wowl_dngldown = 0;
 #ifdef WL_EXT_WOWL
 			hostsleep = 1;
+			if ((insuspend & WOWL_IN_SUSPEND) && dhd_master_mode) {
+				dhd_conf_set_intiovar(dhd, 0, WLC_SET_VAR, "wowl_activate", 1, 0, FALSE);
+#ifdef BCMDBUS
+				wowl_dngldown = dhd->conf->wowl_dngldown;
 #endif
-			dhd_conf_set_intiovar(dhd, 0, WLC_SET_VAR, "hostsleep", hostsleep, 0, FALSE);
+			}
+#endif
+			if (!wowl_dngldown) {
+				dhd_conf_set_intiovar(dhd, 0, WLC_SET_VAR, "hostsleep", hostsleep, 0, FALSE);
+			}
 #ifdef BCMSDIO
 			ret = dhd_bus_sleep(dhd, TRUE, &intstatus);
-			CONFIG_TRACE("ret = %d, intstatus = 0x%x\n", ret, intstatus);
 #endif
+#ifdef BCMPCIE
+			ret = dhd_bus_sleep(dhd, TRUE, NULL);
+#endif
+#ifdef BCMDBUS
+			if (wowl_dngldown) {
+				ret = dhd_bus_sleep(dhd, TRUE, NULL);
+			}
+#endif
+			CONFIG_MSG("ret = %d, intstatus = 0x%x\n", ret, intstatus);
 		}
 	} else {
 		if (insuspend & (WOWL_IN_SUSPEND | NO_TXCTL_IN_SUSPEND)) {
@@ -3976,9 +4016,9 @@
 		CONFIG_MSG("dhd_doflow = %d\n", dhd_doflow);
 	}
 	else if (!strncmp("dhd_slpauto=", full_param, len_param)) {
-		if (!strncmp(data, "0", 1))
-			dhd_slpauto = FALSE;
-		else if (dhd_conf_disable_slpauto(dhd))
+		if (!strncmp(data, "0", 1)) {
+			dhd_conf_disable_slpauto(dhd);
+		} else
 			dhd_slpauto = TRUE;
 		CONFIG_MSG("dhd_slpauto = %d\n", dhd_slpauto);
 	}
@@ -4150,6 +4190,14 @@
 		conf->enq_hdr_pkt = (int)simple_strtol(data, NULL, 0);
 		CONFIG_MSG("enq_hdr_pkt = 0x%x\n", conf->enq_hdr_pkt);
 	}
+	else if (!strncmp("aspm=", full_param, len_param)) {
+		conf->aspm = (int)simple_strtol(data, NULL, 0);
+		CONFIG_MSG("aspm = %d\n", conf->aspm);
+	}
+	else if (!strncmp("l1ss=", full_param, len_param)) {
+		conf->l1ss = (int)simple_strtol(data, NULL, 0);
+		CONFIG_MSG("l1ss = %d\n", conf->l1ss);
+	}
 	else
 		return false;
 
@@ -4208,6 +4256,12 @@
 		conf->wowl = (int)simple_strtol(data, NULL, 0);
 		CONFIG_MSG("wowl = 0x%x\n", conf->wowl);
 	}
+#ifdef BCMDBUS
+	else if (!strncmp("wowl_dngldown=", full_param, len_param)) {
+		conf->wowl_dngldown = (int)simple_strtol(data, NULL, 0);
+		CONFIG_MSG("wowl_dngldown = 0x%x\n", conf->wowl_dngldown);
+	}
+#endif
 #endif
 	else if (!strncmp("rekey_offload=", full_param, len_param)) {
 		if (!strncmp(data, "1", 1))
@@ -4819,7 +4873,108 @@
 	}
 
 }
+
+static void
+dhd_conf_set_ampdu_mpdu(dhd_pub_t *dhd)
+{
+	uint chip = dhd->conf->chip;
+	char ampdu_mpdu[32] = "ampdu_mpdu=";
+	int val = -1;
+
+	if (chip == BCM43362_CHIP_ID || chip == BCM4330_CHIP_ID ||
+			chip == BCM4334_CHIP_ID || chip == BCM43340_CHIP_ID ||
+			chip == BCM43341_CHIP_ID || chip == BCM4324_CHIP_ID ||
+			chip == BCM4335_CHIP_ID || chip == BCM4339_CHIP_ID ||
+			chip == BCM4354_CHIP_ID || chip == BCM4356_CHIP_ID ||
+			chip == BCM4371_CHIP_ID ||
+			chip == BCM43430_CHIP_ID ||
+			chip == BCM4345_CHIP_ID || chip == BCM43454_CHIP_ID ||
+			chip == BCM4359_CHIP_ID || chip == BCM43012_CHIP_ID) {
+		val = 16;
+	} else if (chip == BCM43751_CHIP_ID || chip == BCM43752_CHIP_ID) {
+		val = 32;
+	}
+
+	if (val > 0) {
+		snprintf(ampdu_mpdu+strlen(ampdu_mpdu), sizeof(ampdu_mpdu), "%d", val);
+		dhd_conf_set_wl_cmd(dhd, ampdu_mpdu, TRUE);
+	}
+}
+
+#if defined(SDIO_ISR_THREAD)
+static void
+dhd_conf_set_intr_extn(dhd_pub_t *dhd)
+{
+	uint chip = dhd->conf->chip;
+
+	if (chip == BCM43012_CHIP_ID ||
+			chip == BCM4335_CHIP_ID || chip == BCM4339_CHIP_ID ||
+			chip == BCM43454_CHIP_ID || chip == BCM4345_CHIP_ID ||
+			chip == BCM4354_CHIP_ID || chip == BCM4356_CHIP_ID ||
+			chip == BCM4345_CHIP_ID || chip == BCM4371_CHIP_ID ||
+			chip == BCM4359_CHIP_ID ||
+			chip == BCM43751_CHIP_ID || chip == BCM43752_CHIP_ID ||
+			chip == BCM4375_CHIP_ID) {
+		CONFIG_TRACE("enable intr_extn\n");
+		dhd->conf->intr_extn = TRUE;
+	}
+}
+#endif /* SDIO_ISR_THREAD */
 #endif
+
+static void
+dhd_conf_set_txbf(dhd_pub_t *dhd)
+{
+	uint chip = dhd->conf->chip;
+
+	if (chip == BCM4354_CHIP_ID || chip == BCM4356_CHIP_ID ||
+			chip == BCM4371_CHIP_ID || chip == BCM4359_CHIP_ID ||
+			chip == BCM43569_CHIP_ID ||
+			chip == BCM43751_CHIP_ID || chip == BCM43752_CHIP_ID ||
+			chip == BCM4375_CHIP_ID) {
+		CONFIG_TRACE("enable txbf\n");
+		dhd_conf_set_intiovar(dhd, 0, WLC_SET_VAR, "txbf", 1, 0, FALSE);
+	}
+}
+
+static void
+dhd_conf_tput_improve(dhd_pub_t *dhd)
+{
+	struct dhd_conf *conf = dhd->conf;
+	uint chip = conf->chip;
+	uint chiprev = conf->chiprev;
+
+	if ((chip == BCM43430_CHIP_ID && chiprev == 2) ||
+			chip == BCM43012_CHIP_ID ||
+			chip == BCM4335_CHIP_ID || chip == BCM4339_CHIP_ID ||
+			chip == BCM43454_CHIP_ID || chip == BCM4345_CHIP_ID ||
+			chip == BCM4354_CHIP_ID || chip == BCM4356_CHIP_ID ||
+			chip == BCM4345_CHIP_ID || chip == BCM4371_CHIP_ID ||
+			chip == BCM43569_CHIP_ID || chip == BCM4359_CHIP_ID ||
+			chip == BCM43751_CHIP_ID || chip == BCM43752_CHIP_ID ||
+			chip == BCM4375_CHIP_ID) {
+		CONFIG_TRACE("enable tput parameters\n");
+#ifdef DHDTCPACK_SUPPRESS
+#ifdef BCMSDIO
+		conf->tcpack_sup_mode = TCPACK_SUP_REPLACE;
+#endif
+#endif
+#if defined(BCMSDIO) || defined(BCMPCIE)
+		dhd_rxbound = 128;
+		dhd_txbound = 64;
+#endif
+		conf->frameburst = 1;
+#ifdef BCMSDIO
+		conf->dhd_txminmax = -1;
+		conf->txinrx_thres = 128;
+#endif
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 1, 0))
+		conf->orphan_move = 1;
+#else
+		conf->orphan_move = 0;
+#endif
+	}
+}
 
 #ifdef UPDATE_MODULE_NAME
 #if defined(BCMSDIO) || defined(BCMPCIE)
@@ -4915,26 +5070,14 @@
 	dhd_conf_preinit_ioctls_sta(dhd, 0);
 	dhd_conf_set_wl_cmd(dhd, wl_preinit, TRUE);
 #if defined(BCMSDIO)
-	if (conf->chip == BCM43751_CHIP_ID || conf->chip == BCM43752_CHIP_ID) {
-		char ampdu_mpdu[] = "ampdu_mpdu=32";
-		dhd_conf_set_wl_cmd(dhd, ampdu_mpdu, TRUE);
-	} else {
-		char ampdu_mpdu[] = "ampdu_mpdu=16";
-		dhd_conf_set_wl_cmd(dhd, ampdu_mpdu, TRUE);
-	}
+	dhd_conf_set_ampdu_mpdu(dhd);
 #endif
 
 #ifdef DHD_TPUT_PATCH
 	if (dhd->conf->mtu)
 		dhd_change_mtu(dhd, dhd->conf->mtu, 0);
 #endif
-	if (conf->chip == BCM4354_CHIP_ID || conf->chip == BCM4356_CHIP_ID ||
-			conf->chip == BCM4371_CHIP_ID || conf->chip == BCM4359_CHIP_ID ||
-			conf->chip == BCM43569_CHIP_ID ||
-			conf->chip == BCM43751_CHIP_ID || conf->chip == BCM43752_CHIP_ID ||
-			conf->chip == BCM4375_CHIP_ID) {
-		dhd_conf_set_intiovar(dhd, 0, WLC_SET_VAR, "txbf", 1, 0, FALSE);
-	}
+	dhd_conf_set_txbf(dhd);
 	if (conf->chip == BCM4375_CHIP_ID) {
 		char he_cmd[] = "110=1, nmode=1, vhtmode=1, he=enab 1";
 		dhd_conf_set_wl_cmd(dhd, he_cmd, TRUE);
@@ -5115,10 +5258,12 @@
 #endif
 #endif
 #ifdef BCMPCIE
-	conf->bus_deepsleep_disable = 1;
+	conf->bus_deepsleep_disable = -1;
 	conf->flow_ring_queue_threshold = FLOW_RING_QUEUE_THRESHOLD;
 	conf->d2h_intr_method = -1;
 	conf->d2h_intr_control = -1;
+	conf->aspm = -1;
+	conf->l1ss = -1;
 	conf->enq_hdr_pkt = 0;
 #endif
 	conf->dpc_cpucore = -1;
@@ -5135,6 +5280,9 @@
 #ifdef WL_EXT_WOWL
 	dhd_master_mode = TRUE;
 	conf->wowl = WL_WOWL_NET|WL_WOWL_DIS|WL_WOWL_BCN;
+#ifdef BCMDBUS
+	conf->wowl_dngldown = 0;
+#endif
 	conf->insuspend |= (WOWL_IN_SUSPEND | NO_TXDATA_IN_SUSPEND);
 #endif
 	if (conf->suspend_mode == PM_NOTIFIER || conf->suspend_mode == SUSPEND_MODE_2)
@@ -5226,46 +5374,9 @@
 	memset(conf->isam_enable, 0, sizeof(conf->isam_enable));
 #endif
 #if defined(SDIO_ISR_THREAD)
-	if (conf->chip == BCM43012_CHIP_ID ||
-			conf->chip == BCM4335_CHIP_ID || conf->chip == BCM4339_CHIP_ID ||
-			conf->chip == BCM43454_CHIP_ID || conf->chip == BCM4345_CHIP_ID ||
-			conf->chip == BCM4354_CHIP_ID || conf->chip == BCM4356_CHIP_ID ||
-			conf->chip == BCM4345_CHIP_ID || conf->chip == BCM4371_CHIP_ID ||
-			conf->chip == BCM4359_CHIP_ID ||
-			conf->chip == BCM43751_CHIP_ID || conf->chip == BCM43752_CHIP_ID ||
-			conf->chip == BCM4375_CHIP_ID) {
-		conf->intr_extn = TRUE;
-	}
+	dhd_conf_set_intr_extn(dhd);
 #endif
-	if ((conf->chip == BCM43430_CHIP_ID && conf->chiprev == 2) ||
-			conf->chip == BCM43012_CHIP_ID ||
-			conf->chip == BCM4335_CHIP_ID || conf->chip == BCM4339_CHIP_ID ||
-			conf->chip == BCM43454_CHIP_ID || conf->chip == BCM4345_CHIP_ID ||
-			conf->chip == BCM4354_CHIP_ID || conf->chip == BCM4356_CHIP_ID ||
-			conf->chip == BCM4345_CHIP_ID || conf->chip == BCM4371_CHIP_ID ||
-			conf->chip == BCM43569_CHIP_ID || conf->chip == BCM4359_CHIP_ID ||
-			conf->chip == BCM43751_CHIP_ID || conf->chip == BCM43752_CHIP_ID ||
-			conf->chip == BCM4375_CHIP_ID) {
-#ifdef DHDTCPACK_SUPPRESS
-#ifdef BCMSDIO
-		conf->tcpack_sup_mode = TCPACK_SUP_REPLACE;
-#endif
-#endif
-#if defined(BCMSDIO) || defined(BCMPCIE)
-		dhd_rxbound = 128;
-		dhd_txbound = 64;
-#endif
-		conf->frameburst = 1;
-#ifdef BCMSDIO
-		conf->dhd_txminmax = -1;
-		conf->txinrx_thres = 128;
-#endif
-#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 1, 0))
-		conf->orphan_move = 1;
-#else
-		conf->orphan_move = 0;
-#endif
-	}
+	dhd_conf_tput_improve(dhd);
 #ifdef DHD_TPUT_PATCH
 	if (conf->chip == BCM43751_CHIP_ID || conf->chip == BCM43752_CHIP_ID ||
 			conf->chip == BCM4375_CHIP_ID) {
diff --git a/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dhd_config.h b/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dhd_config.h
index 2ca7035..b33ba02 100644
--- a/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dhd_config.h
+++ b/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dhd_config.h
@@ -299,6 +299,8 @@
 	int d2h_intr_method;
 	int d2h_intr_control;
 	int enq_hdr_pkt;
+	int aspm;
+	int l1ss;
 #endif
 	int dpc_cpucore;
 	int rxf_cpucore;
@@ -347,6 +349,9 @@
 	uint war;
 #ifdef WL_EXT_WOWL
 	uint wowl;
+#ifdef BCMDBUS
+	uint wowl_dngldown;
+#endif
 #endif
 #ifdef GET_CUSTOM_MAC_FROM_CONFIG
 	char hw_ether[62];
@@ -458,7 +463,10 @@
 int dhd_conf_suspend_resume_sta(dhd_pub_t *dhd, int ifidx, int suspend);
 /* Add to adjust 802.1x priority */
 extern void pktset8021xprio(void *pkt, int prio);
-#ifdef BCMSDIO
+#if defined(BCMSDIO) || defined(BCMPCIE) || defined(BCMDBUS)
 extern int dhd_bus_sleep(dhd_pub_t *dhdp, bool sleep, uint32 *intstatus);
 #endif
+#ifdef WL_EXT_WOWL
+int dhd_conf_wowl_dngldown(dhd_pub_t *dhd);
+#endif
 #endif /* _dhd_config_ */
diff --git a/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dhd_debug.c b/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dhd_debug.c
index ac77b20..6381513 100644
--- a/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dhd_debug.c
+++ b/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dhd_debug.c
@@ -1259,7 +1259,7 @@
 
 	ret = dhd_wl_ioctl_cmd(dhdp, WLC_SET_VAR, iovbuf, sizeof(iovbuf), TRUE, 0);
 	if (ret) {
-		/* DHD_ERROR(("%s set log tag iovar failed %d\n", __FUNCTION__, ret)); */
+//		DHD_ERROR(("%s set log tag iovar failed %d\n", __FUNCTION__, ret));
 	}
 }
 
diff --git a/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dhd_gpio.c b/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dhd_gpio.c
index 714afe2..fe3ef3b 100644
--- a/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dhd_gpio.c
+++ b/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dhd_gpio.c
@@ -3,6 +3,12 @@
 #include <osl.h>
 #include <dhd_linux.h>
 #include <linux/gpio.h>
+#ifdef BCMDHD_DTS
+#include <linux/of_gpio.h>
+#endif
+#ifdef BCMDHD_PLATDEV
+#include <linux/platform_device.h>
+#endif
 #ifdef CUSTOMER_HW_ROCKCHIP
 #include <linux/rfkill-wlan.h>
 #endif
@@ -34,7 +40,7 @@
 
 #ifdef BCMDHD_DTS
 /* This is sample code in dts file.
-bcmdhd {
+bcmdhd_wlan {
 	compatible = "android,bcmdhd_wlan";
 	gpio_wl_reg_on = <&gpio GPIOH_4 GPIO_ACTIVE_HIGH>;
 	gpio_wl_host_wake = <&gpio GPIOZ_15 GPIO_ACTIVE_HIGH>;
@@ -159,7 +165,7 @@
 		err = sdhci_force_presence_change(&sdmmc_channel, 0);
 #endif /* CUSTOMER_HW_PLATFORM */
 #ifdef CUSTOMER_HW_ROCKCHIP
-	rockchip_wifi_set_carddetect(0);
+		rockchip_wifi_set_carddetect(0);
 #endif
 #elif defined(BCMPCIE)
 		printf("======== Card detection to remove PCIE card! ========\n");
@@ -277,9 +283,9 @@
 	struct device_node *root_node = NULL;
 #endif
 	int err = 0;
-	int gpio_wl_reg_on;
+	int gpio_wl_reg_on = -1;
 #ifdef CUSTOMER_OOB
-	int gpio_wl_host_wake;
+	int gpio_wl_host_wake = -1;
 	int host_oob_irq = -1;
 	uint host_oob_irq_flags = 0;
 #ifdef CUSTOMER_HW_ROCKCHIP
@@ -293,9 +299,19 @@
 	* WL_REG_ON and WL_HOST_WAKE.
 	*/
 #ifdef BCMDHD_DTS
+#ifdef BCMDHD_PLATDEV
+	if (adapter->pdev) {
+		root_node = adapter->pdev->dev.of_node;
+		strcpy(wlan_node, root_node->name);
+	} else {
+		printf("%s: adapter->pdev is NULL\n", __FUNCTION__);
+		return -1;
+	}
+#else
 	strcpy(wlan_node, DHD_DT_COMPAT_ENTRY);
-	printf("======== Get GPIO from DTS(%s) ========\n", wlan_node);
 	root_node = of_find_compatible_node(NULL, NULL, wlan_node);
+#endif
+	printf("======== Get GPIO from DTS(%s) ========\n", wlan_node);
 	if (root_node) {
 		gpio_wl_reg_on = of_get_named_gpio(root_node, GPIO_WL_REG_ON_PROPNAME, 0);
 #ifdef CUSTOMER_OOB
diff --git a/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dhd_linux.c b/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dhd_linux.c
index 4f86b66..57d93cf 100644
--- a/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dhd_linux.c
+++ b/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dhd_linux.c
@@ -65,6 +65,11 @@
 #include <asm/uaccess.h>
 #include <asm/unaligned.h>
 #include <dhd_linux_priv.h>
+#ifdef BCMPCIE
+#if defined(CUSTOMER_HW_ROCKCHIP) && defined(CUSTOMER_HW_ROCKCHIP_RK3588)
+#include <rk_dhd_pcie_linux.h>
+#endif /* CUSTOMER_HW_ROCKCHIP && CUSTOMER_HW_ROCKCHIP_RK3588 */
+#endif /* BCMPCIE */
 
 #include <epivers.h>
 #include <bcmutils.h>
@@ -1142,9 +1147,16 @@
 	dhd_pub_t *dhd = &dhdinfo->pub;
 	struct dhd_conf *conf = dhd->conf;
 	int suspend_mode = conf->suspend_mode;
+#if defined(BCMDBUS) && defined(WL_EXT_WOWL)
+	int wowl_dngldown = 0;
+#endif
 
 	BCM_REFERENCE(dhdinfo);
 	BCM_REFERENCE(suspend);
+
+#if defined(BCMDBUS) && defined(WL_EXT_WOWL)
+	wowl_dngldown = dhd_conf_wowl_dngldown(dhd);
+#endif
 
 	switch (action) {
 	case PM_HIBERNATION_PREPARE:
@@ -1189,7 +1201,16 @@
 			dhd_suspend_resume_helper(dhdinfo, suspend, 0);
 #ifdef BCMDBUS
 		} else {
-			printf("%s: skip resume since bus suspeneded\n", __FUNCTION__);
+#if defined(BCMDBUS) && defined(WL_EXT_WOWL)
+			if (wowl_dngldown) {
+				printf("%s: reset power\n", __FUNCTION__);
+				dhd_wifi_platform_set_power(dhd, FALSE);
+				dhd_wifi_platform_set_power(dhd, TRUE);
+			} else
+#endif
+			{
+				printf("%s: skip resume since bus suspeneded\n", __FUNCTION__);
+			}
 		}
 #endif
 	}
@@ -3545,6 +3566,9 @@
 		return;
 	}
 
+#ifdef DHD_NOTIFY_MAC_CHANGED
+	rtnl_lock();
+#endif /* DHD_NOTIFY_MAC_CHANGED */
 	dhd_net_if_lock_local(dhd);
 	DHD_OS_WAKE_LOCK(&dhd->pub);
 
@@ -3559,22 +3583,17 @@
 
 	ifp->set_macaddress = FALSE;
 
-#ifdef DHD_NOTIFY_MAC_CHANGED
-	rtnl_lock();
-#endif /* DHD_NOTIFY_MAC_CHANGED */
-
 	if (_dhd_set_mac_address(dhd, ifp->idx, ifp->mac_addr, TRUE) == 0)
 		DHD_INFO(("%s: MACID is overwritten\n",	__FUNCTION__));
 	else
 		DHD_ERROR(("%s: _dhd_set_mac_address() failed\n", __FUNCTION__));
 
-#ifdef DHD_NOTIFY_MAC_CHANGED
-	rtnl_unlock();
-#endif /* DHD_NOTIFY_MAC_CHANGED */
-
 done:
 	DHD_OS_WAKE_UNLOCK(&dhd->pub);
 	dhd_net_if_unlock_local(dhd);
+#ifdef DHD_NOTIFY_MAC_CHANGED
+	rtnl_unlock();
+#endif /* DHD_NOTIFY_MAC_CHANGED */
 }
 
 static void
@@ -4413,24 +4432,13 @@
 #endif
 	/* Make sure there's enough room for any header */
 #if !defined(BCM_ROUTER_DHD)
-	if (skb_headroom(skb) < dhd->pub.hdrlen + htsfdlystat_sz) {
-		struct sk_buff *skb2;
-
-		DHD_INFO(("%s: insufficient headroom\n",
-		          dhd_ifname(&dhd->pub, ifidx)));
-		dhd->pub.tx_realloc++;
-
+	if (skb_cow(skb, (dhd->pub.hdrlen + htsfdlystat_sz))) {
+		DHD_ERROR(("%s: skb_cow failed\n",
+		           dhd_ifname(&dhd->pub, ifidx)));
 		bcm_object_trace_opr(skb, BCM_OBJDBG_REMOVE, __FUNCTION__, __LINE__);
-		skb2 = skb_realloc_headroom(skb, dhd->pub.hdrlen + htsfdlystat_sz);
-
-		dev_kfree_skb(skb);
-		if ((skb = skb2) == NULL) {
-			DHD_ERROR(("%s: skb_realloc_headroom failed\n",
-			           dhd_ifname(&dhd->pub, ifidx)));
-			ret = -ENOMEM;
-			goto done;
-		}
-		bcm_object_trace_opr(skb, BCM_OBJDBG_ADD_PKT, __FUNCTION__, __LINE__);
+		dev_kfree_skb_any(skb);
+		ret = -ENOMEM;
+		goto done;
 	}
 #endif /* !BCM_ROUTER_DHD */
 
@@ -8705,16 +8713,6 @@
 }
 #endif /* DHD_PCIE_NATIVE_RUNTIMEPM */
 
-#ifdef CONFIG_HAS_WAKELOCK
-#define dhd_wake_lock_unlock_destroy(wlock) \
-{ \
-	if (dhd_wake_lock_active(wlock)) { \
-		dhd_wake_unlock(wlock); \
-	} \
-	dhd_wake_lock_destroy(wlock); \
-}
-#endif /* CONFIG_HAS_WAKELOCK */
-
 #if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 19, 0) && defined(DHD_TCP_LIMIT_OUTPUT)
 #define DHD_TCP_LIMIT_OUTPUT_BYTES (4 * 1024 * 1024)
 #ifndef TCP_DEFAULT_LIMIT_OUTPUT
@@ -8784,7 +8782,7 @@
 
 #if defined(WL_STATIC_IF) && defined(WL_CFG80211)
 	/* If static if is operational, don't reset the chip */
-	if (wl_cfg80211_static_if_active(cfg)) {
+	if ((!dhd->pub.hang_was_sent) && wl_cfg80211_static_if_active(cfg)) {
 		WL_MSG(net->name, "static if operational. skip chip reset.\n");
 		skip_reset = true;
 		wl_cfg80211_sta_ifdown(net);
@@ -8792,7 +8790,7 @@
 	}
 #endif /* WL_STATIC_IF && WL_CFG80211 */
 #ifdef DHD_NOTIFY_MAC_CHANGED
-	if (dhd->pub.skip_dhd_stop) {
+	if (!dhd->pub.hang_was_sent && dhd->pub.skip_dhd_stop) {
 		WL_MSG(net->name, "skip chip reset.\n");
 		skip_reset = true;
 #if defined(WL_CFG80211)
@@ -10448,8 +10446,13 @@
 #endif /* DHDTCPACK_SUPPRESS && BCMPCIE */
 				if (need_rtnl_lock)
 					unregister_netdev(ifp->net);
-				else
+				else {
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 12, 0)) && defined(WL_CFG80211)
+					cfg80211_unregister_netdevice(ifp->net);
+#else
 					unregister_netdevice(ifp->net);
+#endif
+				}
 #if defined(WLDWDS) && defined(WL_EXT_IAPSTA)
 				if (ifp->dwds) {
 					wl_ext_iapsta_dettach_dwds_netdev(ifp->net, ifidx, ifp->bssidx);
@@ -11649,9 +11652,7 @@
 	dhd->wakelock_counter = 0;
 	/* wakelocks prevent a system from going into a low power state */
 #ifdef CONFIG_HAS_WAKELOCK
-	// terence 20161023: can not destroy wl_wifi when wlan down, it will happen null pointer in dhd_ioctl_entry
-	dhd_wake_lock_init(&dhd->wl_wifi, WAKE_LOCK_SUSPEND, "wlan_wake");
-	dhd_wake_lock_init(&dhd->wl_wdwake, WAKE_LOCK_SUSPEND, "wlan_wd_wake");
+	dhd_wake_lock_init(dhd->wl_wdwake, dhd_bus_to_dev(bus), "wlan_wd_wake");
 #endif /* CONFIG_HAS_WAKELOCK */
 
 #if defined(OEM_ANDROID)
@@ -11757,11 +11758,7 @@
 	dhd_os_start_logging(&dhd->pub, BT_LOG_RING_NAME, 3, 0, 0, 0);
 #endif /* !OEM_ANDROID && BTLOG */
 #ifdef DBG_PKT_MON
-	dhd->pub.dbg->pkt_mon_lock = osl_mutex_lock_init(dhd->pub.osh);
-	if (!dhd->pub.dbg->pkt_mon_lock) {
-		DHD_ERROR(("%s: pkt_mon_lock init failed !\n", __FUNCTION__));
-		goto fail;
-	}
+	dhd->pub.dbg->pkt_mon_lock = osl_spin_lock_init(dhd->pub.osh);
 #ifdef DBG_PKT_MON_INIT_DEFAULT
 	dhd_os_dbg_attach_pkt_monitor(&dhd->pub);
 #endif /* DBG_PKT_MON_INIT_DEFAULT */
@@ -12790,6 +12787,13 @@
 	/* Enable L1SS of RC and EP */
 	dhd_bus_l1ss_enable_rc_ep(dhdp->bus, TRUE);
 #endif /* BT_OVER_PCIE */
+
+#ifdef BCMPCIE
+#if defined(CUSTOMER_HW_ROCKCHIP) && defined(CUSTOMER_HW_ROCKCHIP_RK3588)
+	if (IS_ENABLED(CONFIG_PCIEASPM_ROCKCHIP_WIFI_EXTENSION))
+		rk_dhd_bus_l1ss_enable_rc_ep(dhdp->bus, TRUE);
+#endif /* CUSTOMER_HW_ROCKCHIP && BCMPCIE */
+#endif /* BCMPCIE */
 
 #if defined(CONFIG_ARCH_EXYNOS) && defined(BCMPCIE)
 #if !defined(CONFIG_SOC_EXYNOS8890) && !defined(SUPPORT_EXYNOS7420)
@@ -17455,7 +17459,7 @@
 	if (dhdp->dbg) {
 #ifdef DBG_PKT_MON
 		dhd_os_dbg_detach_pkt_monitor(dhdp);
-		osl_mutex_lock_deinit(dhd->pub.osh, dhd->pub.dbg->pkt_mon_lock);
+		osl_spin_lock_deinit(dhd->pub.osh, dhd->pub.dbg->pkt_mon_lock);
 #endif /* DBG_PKT_MON */
 	}
 #endif /* DEBUGABILITY */
@@ -17541,9 +17545,7 @@
 	DHD_TRACE(("wd wakelock count:%d\n", dhd->wakelock_wd_counter));
 #ifdef CONFIG_HAS_WAKELOCK
 	dhd->wakelock_wd_counter = 0;
-	dhd_wake_lock_unlock_destroy(&dhd->wl_wdwake);
-	// terence 20161023: can not destroy wl_wifi when wlan down, it will happen null pointer in dhd_ioctl_entry
-	dhd_wake_lock_unlock_destroy(&dhd->wl_wifi);
+	dhd_wake_lock_destroy(dhd->wl_wdwake);
 #endif /* CONFIG_HAS_WAKELOCK */
 	if (dhd->dhd_state & DHD_ATTACH_STATE_WAKELOCKS_INIT) {
 		DHD_OS_WAKE_LOCK_DESTROY(dhd);
@@ -18423,7 +18425,7 @@
 		/* convert to BCME_NOTFOUND error for error handling */
 		ret = BCME_NOTFOUND;
 	} else
-		 DHD_ERROR(("%s: %s (%zu bytes) open success\n", __FUNCTION__, file_path, (*fw)->size));
+		DHD_ERROR(("%s: %s (%zu bytes) open success\n", __FUNCTION__, file_path, (*fw)->size));
 
 	return ret;
 }
@@ -21151,11 +21153,15 @@
 		ret = dhd->wakelock_rx_timeout_enable > dhd->wakelock_ctrl_timeout_enable ?
 			dhd->wakelock_rx_timeout_enable : dhd->wakelock_ctrl_timeout_enable;
 #ifdef CONFIG_HAS_WAKELOCK
+#ifdef DHD_DEBUG_WAKE_LOCK
+		printf("%s: rx_timeout=%dms, ctrl_timeout=%dms\n", __FUNCTION__,
+		dhd->wakelock_rx_timeout_enable, dhd->wakelock_ctrl_timeout_enable);
+#endif
 		if (dhd->wakelock_rx_timeout_enable)
-			dhd_wake_lock_timeout(&dhd->wl_rxwake,
+			dhd_wake_lock_timeout(dhd->wl_rxwake,
 				msecs_to_jiffies(dhd->wakelock_rx_timeout_enable));
 		if (dhd->wakelock_ctrl_timeout_enable)
-			dhd_wake_lock_timeout(&dhd->wl_ctrlwake,
+			dhd_wake_lock_timeout(dhd->wl_ctrlwake,
 				msecs_to_jiffies(dhd->wakelock_ctrl_timeout_enable));
 #endif
 		dhd->wakelock_rx_timeout_enable = 0;
@@ -21212,8 +21218,8 @@
 		DHD_WAKE_SPIN_LOCK(&dhd->wakelock_spinlock, flags);
 		dhd->wakelock_ctrl_timeout_enable = 0;
 #ifdef CONFIG_HAS_WAKELOCK
-		if (dhd_wake_lock_active(&dhd->wl_ctrlwake))
-			dhd_wake_unlock(&dhd->wl_ctrlwake);
+		if (dhd_wake_lock_active(dhd->wl_ctrlwake))
+			dhd_wake_unlock(dhd->wl_ctrlwake);
 #endif
 		DHD_WAKE_SPIN_UNLOCK(&dhd->wakelock_spinlock, flags);
 	}
@@ -21447,7 +21453,7 @@
 		DHD_WAKE_SPIN_LOCK(&dhd->wakelock_spinlock, flags);
 		if (dhd->wakelock_counter == 0 && !dhd->waive_wakelock) {
 #ifdef CONFIG_HAS_WAKELOCK
-			dhd_wake_lock(&dhd->wl_wifi);
+			dhd_wake_lock(dhd->wl_wifi);
 #elif defined(BCMSDIO)
 			dhd_bus_dev_pm_stay_awake(pub);
 #endif
@@ -21471,7 +21477,7 @@
 
 	if (dhd) {
 #ifdef CONFIG_HAS_WAKELOCK
-		dhd_wake_lock(&dhd->wl_evtwake);
+		dhd_wake_lock(dhd->wl_evtwake);
 #elif defined(BCMSDIO)
 		dhd_bus_dev_pm_stay_awake(pub);
 #endif
@@ -21485,7 +21491,7 @@
 	dhd_info_t *dhd = (dhd_info_t *)(pub->info);
 
 	if (dhd) {
-		dhd_wake_lock_timeout(&dhd->wl_pmwake, msecs_to_jiffies(val));
+		dhd_wake_lock_timeout(dhd->wl_pmwake, msecs_to_jiffies(val));
 	}
 #endif /* CONFIG_HAS_WAKE_LOCK */
 }
@@ -21497,7 +21503,7 @@
 	dhd_info_t *dhd = (dhd_info_t *)(pub->info);
 
 	if (dhd) {
-		dhd_wake_lock_timeout(&dhd->wl_txflwake, msecs_to_jiffies(val));
+		dhd_wake_lock_timeout(dhd->wl_txflwake, msecs_to_jiffies(val));
 	}
 #endif /* CONFIG_HAS_WAKE_LOCK */
 }
@@ -21509,7 +21515,7 @@
 	dhd_info_t *dhd = (dhd_info_t *)(pub->info);
 
 	if (dhd) {
-		dhd_wake_lock_timeout(&dhd->wl_nanwake, msecs_to_jiffies(val));
+		dhd_wake_lock_timeout(dhd->wl_nanwake, msecs_to_jiffies(val));
 	}
 #endif /* CONFIG_HAS_WAKE_LOCK */
 }
@@ -21543,7 +21549,7 @@
 #endif /* DHD_TRACE_WAKE_LOCK */
 			if (dhd->wakelock_counter == 0 && !dhd->waive_wakelock) {
 #ifdef CONFIG_HAS_WAKELOCK
-				dhd_wake_unlock(&dhd->wl_wifi);
+				dhd_wake_unlock(dhd->wl_wifi);
 #elif defined(BCMSDIO)
 				dhd_bus_dev_pm_relax(pub);
 #endif
@@ -21561,7 +21567,7 @@
 
 	if (dhd) {
 #ifdef CONFIG_HAS_WAKELOCK
-		dhd_wake_unlock(&dhd->wl_evtwake);
+		dhd_wake_unlock(dhd->wl_evtwake);
 #elif defined(BCMSDIO)
 		dhd_bus_dev_pm_relax(pub);
 #endif
@@ -21575,8 +21581,8 @@
 
 	if (dhd) {
 		/* if wl_pmwake is active, unlock it */
-		if (dhd_wake_lock_active(&dhd->wl_pmwake)) {
-			dhd_wake_unlock(&dhd->wl_pmwake);
+		if (dhd_wake_lock_active(dhd->wl_pmwake)) {
+			dhd_wake_unlock(dhd->wl_pmwake);
 		}
 	}
 #endif /* CONFIG_HAS_WAKELOCK */
@@ -21589,8 +21595,8 @@
 
 	if (dhd) {
 		/* if wl_txflwake is active, unlock it */
-		if (dhd_wake_lock_active(&dhd->wl_txflwake)) {
-			dhd_wake_unlock(&dhd->wl_txflwake);
+		if (dhd_wake_lock_active(dhd->wl_txflwake)) {
+			dhd_wake_unlock(dhd->wl_txflwake);
 		}
 	}
 #endif /* CONFIG_HAS_WAKELOCK */
@@ -21603,8 +21609,8 @@
 
 	if (dhd) {
 		/* if wl_nanwake is active, unlock it */
-		if (dhd_wake_lock_active(&dhd->wl_nanwake)) {
-			dhd_wake_unlock(&dhd->wl_nanwake);
+		if (dhd_wake_lock_active(dhd->wl_nanwake)) {
+			dhd_wake_unlock(dhd->wl_nanwake);
 		}
 	}
 #endif /* CONFIG_HAS_WAKELOCK */
@@ -21629,8 +21635,8 @@
 
 #ifdef CONFIG_HAS_WAKELOCK
 	c = dhd->wakelock_counter;
-	l1 = dhd_wake_lock_active(&dhd->wl_wifi);
-	l2 = dhd_wake_lock_active(&dhd->wl_wdwake);
+	l1 = dhd_wake_lock_active(dhd->wl_wifi);
+	l2 = dhd_wake_lock_active(dhd->wl_wdwake);
 	lock_active = (l1 || l2);
 	/* Indicate to the SD Host to avoid going to suspend if internal locks are up */
 	if (lock_active) {
@@ -21673,20 +21679,20 @@
 
 #ifdef CONFIG_HAS_WAKELOCK
 	c = dhd->wakelock_counter;
-	l1 = dhd_wake_lock_active(&dhd->wl_wifi);
-	l2 = dhd_wake_lock_active(&dhd->wl_wdwake);
-	l3 = dhd_wake_lock_active(&dhd->wl_rxwake);
-	l4 = dhd_wake_lock_active(&dhd->wl_ctrlwake);
-	l7 = dhd_wake_lock_active(&dhd->wl_evtwake);
+	l1 = dhd_wake_lock_active(dhd->wl_wifi);
+	l2 = dhd_wake_lock_active(dhd->wl_wdwake);
+	l3 = dhd_wake_lock_active(dhd->wl_rxwake);
+	l4 = dhd_wake_lock_active(dhd->wl_ctrlwake);
+	l7 = dhd_wake_lock_active(dhd->wl_evtwake);
 #ifdef BCMPCIE_OOB_HOST_WAKE
-	l5 = dhd_wake_lock_active(&dhd->wl_intrwake);
+	l5 = dhd_wake_lock_active(dhd->wl_intrwake);
 #endif /* BCMPCIE_OOB_HOST_WAKE */
 #ifdef DHD_USE_SCAN_WAKELOCK
-	l6 = dhd_wake_lock_active(&dhd->wl_scanwake);
+	l6 = dhd_wake_lock_active(dhd->wl_scanwake);
 #endif /* DHD_USE_SCAN_WAKELOCK */
-	l8 = dhd_wake_lock_active(&dhd->wl_pmwake);
-	l9 = dhd_wake_lock_active(&dhd->wl_txflwake);
-	l10 = dhd_wake_lock_active(&dhd->wl_nanwake);
+	l8 = dhd_wake_lock_active(dhd->wl_pmwake);
+	l9 = dhd_wake_lock_active(dhd->wl_txflwake);
+	l10 = dhd_wake_lock_active(dhd->wl_nanwake);
 	lock_active = (l1 || l2 || l3 || l4 || l5 || l6 || l7 || l8 || l9 || l10);
 
 	/* Indicate to the Host to avoid going to suspend if internal locks are up */
@@ -21726,7 +21732,7 @@
 		if (dhd->wakelock_wd_counter == 0 && !dhd->waive_wakelock) {
 #ifdef CONFIG_HAS_WAKELOCK
 			/* if wakelock_wd_counter was never used : lock it at once */
-			dhd_wake_lock(&dhd->wl_wdwake);
+			dhd_wake_lock(dhd->wl_wdwake);
 #endif
 		}
 		dhd->wakelock_wd_counter++;
@@ -21748,7 +21754,7 @@
 			dhd->wakelock_wd_counter = 0;
 			if (!dhd->waive_wakelock) {
 #ifdef CONFIG_HAS_WAKELOCK
-				dhd_wake_unlock(&dhd->wl_wdwake);
+				dhd_wake_unlock(dhd->wl_wdwake);
 #endif
 			}
 		}
@@ -21765,7 +21771,7 @@
 	dhd_info_t *dhd = (dhd_info_t *)(pub->info);
 
 	if (dhd) {
-		dhd_wake_lock_timeout(&dhd->wl_intrwake, msecs_to_jiffies(val));
+		dhd_wake_lock_timeout(dhd->wl_intrwake, msecs_to_jiffies(val));
 	}
 #endif /* CONFIG_HAS_WAKELOCK */
 }
@@ -21778,8 +21784,8 @@
 
 	if (dhd) {
 		/* if wl_intrwake is active, unlock it */
-		if (dhd_wake_lock_active(&dhd->wl_intrwake)) {
-			dhd_wake_unlock(&dhd->wl_intrwake);
+		if (dhd_wake_lock_active(dhd->wl_intrwake)) {
+			dhd_wake_unlock(dhd->wl_intrwake);
 		}
 	}
 #endif /* CONFIG_HAS_WAKELOCK */
@@ -21794,7 +21800,7 @@
 	dhd_info_t *dhd = (dhd_info_t *)(pub->info);
 
 	if (dhd) {
-		dhd_wake_lock_timeout(&dhd->wl_scanwake, msecs_to_jiffies(val));
+		dhd_wake_lock_timeout(dhd->wl_scanwake, msecs_to_jiffies(val));
 	}
 #endif /* CONFIG_HAS_WAKELOCK */
 }
@@ -21807,8 +21813,8 @@
 
 	if (dhd) {
 		/* if wl_scanwake is active, unlock it */
-		if (dhd_wake_lock_active(&dhd->wl_scanwake)) {
-			dhd_wake_unlock(&dhd->wl_scanwake);
+		if (dhd_wake_lock_active(dhd->wl_scanwake)) {
+			dhd_wake_unlock(dhd->wl_scanwake);
 		}
 	}
 #endif /* CONFIG_HAS_WAKELOCK */
@@ -21874,13 +21880,13 @@
 
 	if (dhd->wakelock_before_waive == 0 && dhd->wakelock_counter > 0) {
 #ifdef CONFIG_HAS_WAKELOCK
-		dhd_wake_lock(&dhd->wl_wifi);
+		dhd_wake_lock(dhd->wl_wifi);
 #elif defined(BCMSDIO)
 		dhd_bus_dev_pm_stay_awake(&dhd->pub);
 #endif
 	} else if (dhd->wakelock_before_waive > 0 && dhd->wakelock_counter == 0) {
 #ifdef CONFIG_HAS_WAKELOCK
-		dhd_wake_unlock(&dhd->wl_wifi);
+		dhd_wake_unlock(dhd->wl_wifi);
 #elif defined(BCMSDIO)
 		dhd_bus_dev_pm_relax(&dhd->pub);
 #endif
@@ -21900,19 +21906,19 @@
 	dhd->wakelock_ctrl_timeout_enable = 0;
 	/* wakelocks prevent a system from going into a low power state */
 #ifdef CONFIG_HAS_WAKELOCK
-	// terence 20161023: can not destroy wl_wifi when wlan down, it will happen null pointer in dhd_ioctl_entry
-	dhd_wake_lock_init(&dhd->wl_rxwake, WAKE_LOCK_SUSPEND, "wlan_rx_wake");
-	dhd_wake_lock_init(&dhd->wl_ctrlwake, WAKE_LOCK_SUSPEND, "wlan_ctrl_wake");
-	dhd_wake_lock_init(&dhd->wl_evtwake, WAKE_LOCK_SUSPEND, "wlan_evt_wake");
-	dhd_wake_lock_init(&dhd->wl_pmwake, WAKE_LOCK_SUSPEND, "wlan_pm_wake");
-	dhd_wake_lock_init(&dhd->wl_txflwake, WAKE_LOCK_SUSPEND, "wlan_txfl_wake");
+	dhd_wake_lock_init(dhd->wl_wifi, dhd_bus_to_dev(dhd->pub.bus), "wlan_wake");
+	dhd_wake_lock_init(dhd->wl_rxwake, dhd_bus_to_dev(dhd->pub.bus), "wlan_rx_wake");
+	dhd_wake_lock_init(dhd->wl_ctrlwake, dhd_bus_to_dev(dhd->pub.bus), "wlan_ctrl_wake");
+	dhd_wake_lock_init(dhd->wl_evtwake, dhd_bus_to_dev(dhd->pub.bus), "wlan_evt_wake");
+	dhd_wake_lock_init(dhd->wl_pmwake, dhd_bus_to_dev(dhd->pub.bus), "wlan_pm_wake");
+	dhd_wake_lock_init(dhd->wl_txflwake, dhd_bus_to_dev(dhd->pub.bus), "wlan_txfl_wake");
 #ifdef BCMPCIE_OOB_HOST_WAKE
-	dhd_wake_lock_init(&dhd->wl_intrwake, WAKE_LOCK_SUSPEND, "wlan_oob_irq_wake");
+	dhd_wake_lock_init(dhd->wl_intrwake, dhd_bus_to_dev(dhd->pub.bus), "wlan_oob_irq_wake");
 #endif /* BCMPCIE_OOB_HOST_WAKE */
 #ifdef DHD_USE_SCAN_WAKELOCK
-	dhd_wake_lock_init(&dhd->wl_scanwake, WAKE_LOCK_SUSPEND, "wlan_scan_wake");
+	dhd_wake_lock_init(dhd->wl_scanwake, dhd_bus_to_dev(dhd->pub.bus), "wlan_scan_wake");
 #endif /* DHD_USE_SCAN_WAKELOCK */
-	dhd_wake_lock_init(&dhd->wl_nanwake, WAKE_LOCK_SUSPEND, "wlan_nan_wake");
+	dhd_wake_lock_init(dhd->wl_nanwake, dhd_bus_to_dev(dhd->pub.bus), "wlan_nan_wake");
 #endif /* CONFIG_HAS_WAKELOCK */
 #ifdef DHD_TRACE_WAKE_LOCK
 	dhd_wk_lock_trace_init(dhd);
@@ -21926,19 +21932,19 @@
 	dhd->wakelock_counter = 0;
 	dhd->wakelock_rx_timeout_enable = 0;
 	dhd->wakelock_ctrl_timeout_enable = 0;
-	// terence 20161023: can not destroy wl_wifi when wlan down, it will happen null pointer in dhd_ioctl_entry
-	dhd_wake_lock_unlock_destroy(&dhd->wl_rxwake);
-	dhd_wake_lock_unlock_destroy(&dhd->wl_ctrlwake);
-	dhd_wake_lock_unlock_destroy(&dhd->wl_evtwake);
-	dhd_wake_lock_unlock_destroy(&dhd->wl_pmwake);
-	dhd_wake_lock_unlock_destroy(&dhd->wl_txflwake);
+	dhd_wake_lock_destroy(dhd->wl_wifi);
+	dhd_wake_lock_destroy(dhd->wl_rxwake);
+	dhd_wake_lock_destroy(dhd->wl_ctrlwake);
+	dhd_wake_lock_destroy(dhd->wl_evtwake);
+	dhd_wake_lock_destroy(dhd->wl_pmwake);
+	dhd_wake_lock_destroy(dhd->wl_txflwake);
 #ifdef BCMPCIE_OOB_HOST_WAKE
-	dhd_wake_lock_unlock_destroy(&dhd->wl_intrwake);
+	dhd_wake_lock_destroy(dhd->wl_intrwake);
 #endif /* BCMPCIE_OOB_HOST_WAKE */
 #ifdef DHD_USE_SCAN_WAKELOCK
-	dhd_wake_lock_unlock_destroy(&dhd->wl_scanwake);
+	dhd_wake_lock_destroy(dhd->wl_scanwake);
 #endif /* DHD_USE_SCAN_WAKELOCK */
-	dhd_wake_lock_unlock_destroy(&dhd->wl_nanwake);
+	dhd_wake_lock_destroy(dhd->wl_nanwake);
 #ifdef DHD_TRACE_WAKE_LOCK
 	dhd_wk_lock_trace_deinit(dhd);
 #endif /* DHD_TRACE_WAKE_LOCK */
@@ -27166,15 +27172,7 @@
 dhd_get_random_bytes(uint8 *buf, uint len)
 {
 #ifdef BCMPCIE
-#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 19, 0))
-	int rndlen = get_random_bytes_arch(buf, len);
-	if (rndlen != len) {
-		bzero(buf, len);
-		get_random_bytes(buf, len);
-	}
-#else
-	get_random_bytes_arch(buf, len);
-#endif
+	get_random_bytes(buf, len);
 #endif /* BCMPCIE */
 	return BCME_OK;
 }
diff --git a/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dhd_linux.h b/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dhd_linux.h
index 565b1a4..e94787d 100644
--- a/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dhd_linux.h
+++ b/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dhd_linux.h
@@ -68,7 +68,8 @@
 enum wifi_adapter_status {
 	WIFI_STATUS_POWER_ON = 0,
 	WIFI_STATUS_FW_READY,
-	WIFI_STATUS_NET_ATTACHED
+	WIFI_STATUS_NET_ATTACHED,
+	WIFI_STATUS_BUS_DISCONNECTED
 };
 #define wifi_chk_adapter_status(adapter, stat) (test_bit(stat, &(adapter)->status))
 #define wifi_get_adapter_status(adapter, stat) (test_bit(stat, &(adapter)->status))
@@ -108,6 +109,9 @@
 	struct pci_dev *pci_dev;
 	struct pci_saved_state *pci_saved_state;
 #endif /* BCMPCIE */
+#ifdef BCMDHD_PLATDEV
+	struct platform_device *pdev;
+#endif /* BCMDHD_PLATDEV */
 } wifi_adapter_info_t;
 
 #if defined(CONFIG_WIFI_CONTROL_FUNC) || defined(CUSTOMER_HW4)
diff --git a/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dhd_linux_exportfs.c b/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dhd_linux_exportfs.c
index 7377f4e..b74df3d 100644
--- a/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dhd_linux_exportfs.c
+++ b/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dhd_linux_exportfs.c
@@ -59,7 +59,9 @@
 {
 	int ret = BCME_ERROR;
 	if (inode) {
-#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 10, 0))
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 17, 0))
+		ret = single_open(file, 0, pde_data(inode));
+#elif (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 10, 0))
 		ret = single_open(file, 0, PDE_DATA(inode));
 #else
 		/* This feature is not supported for lower kernel versions */
diff --git a/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dhd_linux_platdev.c b/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dhd_linux_platdev.c
index 1f630ae..1de6616 100644
--- a/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dhd_linux_platdev.c
+++ b/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dhd_linux_platdev.c
@@ -47,7 +47,7 @@
 #include<linux/of_gpio.h>
 #endif /* CONFIG_DTS */
 
-#if defined(CUSTOMER_HW)
+#if defined(CUSTOMER_HW) || defined(BCMDHD_PLATDEV)
 extern int dhd_wlan_init_plat_data(wifi_adapter_info_t *adapter);
 extern void dhd_wlan_deinit_plat_data(wifi_adapter_info_t *adapter);
 #endif /* CUSTOMER_HW */
@@ -85,7 +85,7 @@
 #pragma GCC diagnostic ignored "-Wmissing-field-initializers"
 #endif
 struct resource dhd_wlan_resources = {0};
-struct wifi_platform_data dhd_wlan_control = {0};
+extern struct wifi_platform_data dhd_wlan_control;
 #if defined(STRICT_GCC_WARNINGS) && defined(__GNUC__)
 #pragma GCC diagnostic pop
 #endif
@@ -378,6 +378,14 @@
 	adapter->wifi_plat_data = (void *)&dhd_wlan_control;
 #endif
 
+#ifdef BCMDHD_PLATDEV
+	adapter->pdev = pdev;
+	wifi_plat_dev_probe_ret = dhd_wlan_init_plat_data(adapter);
+	if (!wifi_plat_dev_probe_ret)
+		wifi_plat_dev_probe_ret = dhd_wifi_platform_load();
+	return wifi_plat_dev_probe_ret;
+#endif
+
 	resource = platform_get_resource_byname(pdev, IORESOURCE_IRQ, "bcmdhd_wlan_irq");
 	if (resource == NULL)
 		resource = platform_get_resource_byname(pdev, IORESOURCE_IRQ, "bcm4329_wlan_irq");
@@ -449,6 +457,9 @@
 #ifdef CONFIG_DTS
 	regulator_put(wifi_regulator);
 #endif /* CONFIG_DTS */
+#ifdef BCMDHD_PLATDEV
+	dhd_wlan_deinit_plat_data(adapter);
+#endif
 	return 0;
 }
 
diff --git a/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dhd_linux_priv.h b/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dhd_linux_priv.h
index 1eeb27e..019884b 100644
--- a/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dhd_linux_priv.h
+++ b/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dhd_linux_priv.h
@@ -128,20 +128,20 @@
 
 	/* Wakelocks */
 #if defined(CONFIG_HAS_WAKELOCK)
-	struct wakeup_source wl_wifi;   /* Wifi wakelock */
-	struct wakeup_source wl_rxwake; /* Wifi rx wakelock */
-	struct wakeup_source wl_ctrlwake; /* Wifi ctrl wakelock */
-	struct wakeup_source wl_wdwake; /* Wifi wd wakelock */
-	struct wakeup_source wl_evtwake; /* Wifi event wakelock */
-	struct wakeup_source wl_pmwake;   /* Wifi pm handler wakelock */
-	struct wakeup_source wl_txflwake; /* Wifi tx flow wakelock */
+	struct wakeup_source *wl_wifi;   /* Wifi wakelock */
+	struct wakeup_source *wl_rxwake; /* Wifi rx wakelock */
+	struct wakeup_source *wl_ctrlwake; /* Wifi ctrl wakelock */
+	struct wakeup_source *wl_wdwake; /* Wifi wd wakelock */
+	struct wakeup_source *wl_evtwake; /* Wifi event wakelock */
+	struct wakeup_source *wl_pmwake;   /* Wifi pm handler wakelock */
+	struct wakeup_source *wl_txflwake; /* Wifi tx flow wakelock */
 #ifdef BCMPCIE_OOB_HOST_WAKE
-	struct wakeup_source wl_intrwake; /* Host wakeup wakelock */
+	struct wakeup_source *wl_intrwake; /* Host wakeup wakelock */
 #endif /* BCMPCIE_OOB_HOST_WAKE */
 #ifdef DHD_USE_SCAN_WAKELOCK
-	struct wakeup_source wl_scanwake;  /* Wifi scan wakelock */
+	struct wakeup_source *wl_scanwake;  /* Wifi scan wakelock */
 #endif /* DHD_USE_SCAN_WAKELOCK */
-	struct wakeup_source wl_nanwake; /* NAN wakelock */
+	struct wakeup_source *wl_nanwake; /* NAN wakelock */
 #endif /* CONFIG_HAS_WAKELOCK */
 
 #if defined(OEM_ANDROID)
@@ -501,16 +501,29 @@
 extern uint fis_enab;
 #endif /* DHD_SSSR_DUMP */
 
+#if defined(ANDROID_VERSION) && (LINUX_VERSION_CODE  >= KERNEL_VERSION(4, 19, 0))
+#define WAKELOCK_BACKPORT
+#endif
+
 #ifdef CONFIG_HAS_WAKELOCK
-enum {
-	WAKE_LOCK_SUSPEND, /* Prevent suspend */
-	WAKE_LOCK_TYPE_COUNT
-};
-#define dhd_wake_lock_init(wakeup_source, type, name)	wakeup_source_add(wakeup_source)
-#define dhd_wake_lock_destroy(wakeup_source)		wakeup_source_remove(wakeup_source)
+#if ((LINUX_VERSION_CODE  >= KERNEL_VERSION(5, 4, 0)) || defined(WAKELOCK_BACKPORT))
+#define dhd_wake_lock_init(wakeup_source, dev, name) \
+do { \
+	wakeup_source = wakeup_source_register(dev, name); \
+} while (0);
+#else
+#define dhd_wake_lock_init(wakeup_source, dev, name) \
+do { \
+	wakeup_source = wakeup_source_register(name); \
+} while (0);
+#endif /* LINUX_VERSION >= 5.4.0 */
+#define dhd_wake_lock_destroy(wakeup_source) \
+do { \
+	wakeup_source_unregister(wakeup_source); \
+} while (0);
 #define dhd_wake_lock(wakeup_source)			__pm_stay_awake(wakeup_source)
 #define dhd_wake_unlock(wakeup_source)			__pm_relax(wakeup_source)
-#define dhd_wake_lock_active(wakeup_source)		((wakeup_source)->active)
+#define dhd_wake_lock_active(wakeup_source)		((wakeup_source)?((wakeup_source)->active):0)
 #define dhd_wake_lock_timeout(wakeup_source, timeout)	\
 	__pm_wakeup_event(wakeup_source, jiffies_to_msecs(timeout))
 #endif /* CONFIG_HAS_WAKELOCK */
diff --git a/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dhd_pcie.c b/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dhd_pcie.c
index 96bc798..5c10144 100644
--- a/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dhd_pcie.c
+++ b/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dhd_pcie.c
@@ -3557,17 +3557,28 @@
 void
 dhd_set_bus_params(struct dhd_bus *bus)
 {
-	if (bus->dhd->conf->dhd_poll >= 0) {
-		bus->poll = bus->dhd->conf->dhd_poll;
+	struct dhd_conf *conf = bus->dhd->conf;
+
+	if (conf->dhd_poll >= 0) {
+		bus->poll = conf->dhd_poll;
 		if (!bus->pollrate)
 			bus->pollrate = 1;
-		printf("%s: set polling mode %d\n", __FUNCTION__, bus->dhd->conf->dhd_poll);
+		printf("%s: set polling mode %d\n", __FUNCTION__, conf->dhd_poll);
 	}
-	if (bus->dhd->conf->d2h_intr_control >= 0)
-		bus->d2h_intr_control = bus->dhd->conf->d2h_intr_control;
+	if (conf->d2h_intr_control >= 0)
+		bus->d2h_intr_control = conf->d2h_intr_control;
 	printf("d2h_intr_method -> %s(%d); d2h_intr_control -> %s(%d)\n",
 		bus->d2h_intr_method ? "PCIE_MSI" : "PCIE_INTX", bus->d2h_intr_method,
 		bus->d2h_intr_control ? "HOST_IRQ" : "D2H_INTMASK", bus->d2h_intr_control);
+
+	if (conf->aspm != -1) {
+		bool aspm = conf->aspm ? TRUE : FALSE;
+		dhd_bus_aspm_enable_rc_ep(bus, aspm);
+	}
+	if (conf->l1ss != -1) {
+		bool l1ss = conf->l1ss ? TRUE : FALSE;
+		dhd_bus_l1ss_enable_rc_ep(bus, l1ss);
+	}
 }
 
 /**
@@ -17803,3 +17814,25 @@
 	val = 1;
 	dhd_sbreg_op(dhd, addr, &val, FALSE);
 }
+
+#define BUS_SLEEP_WAIT_CNT	3
+#define BUS_SLEEP_WAIT_MS	20
+int
+dhd_bus_sleep(dhd_pub_t *dhdp, bool sleep, uint32 *intstatus)
+{
+	dhd_bus_t *bus = dhdp->bus;
+	int active, cnt = 0;
+
+	if (bus) {
+		while ((active = dhd_os_check_wakelock_all(bus->dhd)) &&
+				(cnt < BUS_SLEEP_WAIT_CNT)) {
+			OSL_SLEEP(BUS_SLEEP_WAIT_MS);
+			cnt++;
+		}
+	} else {
+		DHD_ERROR(("bus is NULL\n"));
+		active = -1;
+	}
+
+	return active;
+}
diff --git a/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dhd_pcie_linux.c b/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dhd_pcie_linux.c
index dbeab68..786e208 100644
--- a/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dhd_pcie_linux.c
+++ b/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dhd_pcie_linux.c
@@ -47,6 +47,9 @@
 #include <pcicfg.h>
 #include <dhd_pcie.h>
 #include <dhd_linux.h>
+#if defined(CUSTOMER_HW_ROCKCHIP) && defined(CUSTOMER_HW_ROCKCHIP_RK3588)
+#include <rk_dhd_pcie_linux.h>
+#endif /* CUSTOMER_HW_ROCKCHIP && CUSTOMER_HW_ROCKCHIP_RK3588 */
 #ifdef OEM_ANDROID
 #ifdef CONFIG_ARCH_MSM
 #if defined(CONFIG_PCI_MSM) || defined(CONFIG_ARCH_MSM8996)
@@ -616,6 +619,18 @@
 {
 	uint32 rc_l1ss_cap;
 	uint32 ep_l1ss_cap;
+
+#if defined(CUSTOMER_HW_ROCKCHIP) && defined(CUSTOMER_HW_ROCKCHIP_RK3588)
+	if (IS_ENABLED(CONFIG_PCIEASPM_ROCKCHIP_WIFI_EXTENSION)) {
+		if (rk_dhd_bus_is_rc_ep_l1ss_capable(bus)) {
+			DHD_ERROR(("%s L1ss is capable\n", __FUNCTION__));
+			return TRUE;
+		} else {
+			DHD_ERROR(("%s L1ss is not capable\n", __FUNCTION__));
+			return FALSE;
+		}
+	}
+#endif /* CUSTOMER_HW_ROCKCHIP && CUSTOMER_HW_ROCKCHIP_RK3588 */
 
 	/* RC Extendend Capacility */
 	rc_l1ss_cap = dhdpcie_access_cap(bus->rc_dev, PCIE_EXTCAP_ID_L1SS,
@@ -1576,7 +1591,7 @@
 		goto exit;
 	}
 
-	printf("PCI_PROBE:  bus %X, slot %X,vendor %X, device %X"
+	printf("PCI_PROBE:  bus 0x%X, slot 0x%X,vendor 0x%X, device 0x%X"
 		"(good PCI location)\n", pdev->bus->number,
 		PCI_SLOT(pdev->devfn), pdev->vendor, pdev->device);
 
diff --git a/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dhd_pno.c b/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dhd_pno.c
index e002405..5ba5df6 100644
--- a/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dhd_pno.c
+++ b/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dhd_pno.c
@@ -3472,7 +3472,7 @@
 		wake_up(&_pno_state->get_batch_done);
 	}
 #else
-	if (waitqueue_active(&_pno_state->get_batch_done.wait))
+	if (swait_active(&_pno_state->get_batch_done.wait))
 		complete(&_pno_state->get_batch_done);
 #endif
 	return err;
diff --git a/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dhd_sdio.c b/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dhd_sdio.c
index 1c46920..2bb49e0 100644
--- a/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dhd_sdio.c
+++ b/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dhd_sdio.c
@@ -2008,7 +2008,8 @@
 #if defined(WL_EXT_IAPSTA) && defined(DHD_LOSSLESS_ROAMING)
 		state = wl_ext_any_sta_handshaking(bus->dhd);
 		if (state) {
-			DHD_ERROR(("handshaking %d\n", state));
+			if (dump_msg_level & DUMP_EAPOL_VAL)
+				DHD_ERROR(("handshaking %d\n", state));
 			return BCME_BUSY;
 		}
 #endif /* WL_EXT_IAPSTA && DHD_LOSSLESS_ROAMING */
diff --git a/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dhd_static_buf.c b/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dhd_static_buf.c
index d288788..f1c44f0 100644
--- a/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dhd_static_buf.c
+++ b/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dhd_static_buf.c
@@ -7,7 +7,7 @@
 #include <linux/err.h>
 #include <linux/skbuff.h>
 
-#define	DHD_STATIC_VERSION_STR		"101.10.361.24 (wlan=r892223-20220916-1)"
+#define	DHD_STATIC_VERSION_STR		"101.10.361.26 (wlan=r892223-20221011-1)"
 #define STATIC_ERROR_LEVEL	BIT(0)
 #define STATIC_TRACE_LEVEL	BIT(1)
 #define STATIC_MSG_LEVEL	BIT(0)
@@ -32,12 +32,19 @@
 		} \
 	} while (0)
 
-#define BCMDHD_SDIO
-#define BCMDHD_PCIE
-//#define BCMDHD_USB
+#ifdef DHD_STATIC_IN_DRIVER
+#if ANDROID_VERSION > 0
+#define CONFIG_BCMDHD_VTS { : = y}
+#define CONFIG_BCMDHD_DEBUG { : = y}
+#endif
+#else
+#define BCMSDIO
+#define BCMPCIE
+//#define BCMDBUS
 #define CONFIG_BCMDHD_VTS { : = y}
 #define CONFIG_BCMDHD_DEBUG { : = y}
 //#define BCMDHD_UNUSE_MEM
+#endif
 
 #ifndef MAX_NUM_ADAPTERS
 #define MAX_NUM_ADAPTERS	1
@@ -45,28 +52,28 @@
 
 enum dhd_prealloc_index {
 	DHD_PREALLOC_PROT = 0,
-#if defined(BCMDHD_SDIO)
+#if defined(BCMSDIO)
 	DHD_PREALLOC_RXBUF = 1,
 	DHD_PREALLOC_DATABUF = 2,
-#endif /* BCMDHD_SDIO */
+#endif /* BCMSDIO */
 	DHD_PREALLOC_OSL_BUF = 3,
 	DHD_PREALLOC_SKB_BUF = 4,
 	DHD_PREALLOC_WIPHY_ESCAN0 = 5,
 	DHD_PREALLOC_WIPHY_ESCAN1 = 6,
 	DHD_PREALLOC_DHD_INFO = 7,
-#if defined(BCMDHD_SDIO) || defined(BCMDHD_USB)
+#if defined(BCMSDIO) || defined(BCMDBUS)
 	DHD_PREALLOC_DHD_WLFC_INFO = 8,
-#endif /* BCMDHD_SDIO | BCMDHD_USB */
-#ifdef BCMDHD_PCIE
+#endif /* BCMSDIO | BCMDBUS */
+#ifdef BCMPCIE
 	DHD_PREALLOC_IF_FLOW_LKUP = 9,
-#endif /* BCMDHD_PCIE */
+#endif /* BCMPCIE */
 	DHD_PREALLOC_MEMDUMP_BUF = 10,
 #if defined(CONFIG_BCMDHD_VTS) || defined(CONFIG_BCMDHD_DEBUG)
 	DHD_PREALLOC_MEMDUMP_RAM = 11,
 #endif /* CONFIG_BCMDHD_VTS | CONFIG_BCMDHD_DEBUG */
-#if defined(BCMDHD_SDIO) || defined(BCMDHD_USB)
+#if defined(BCMSDIO) || defined(BCMDBUS)
 	DHD_PREALLOC_DHD_WLFC_HANGER = 12,
-#endif /* BCMDHD_SDIO | BCMDHD_USB */
+#endif /* BCMSDIO | BCMDBUS */
 	DHD_PREALLOC_PKTID_MAP = 13,
 	DHD_PREALLOC_PKTID_MAP_IOCTL = 14,
 #if defined(CONFIG_BCMDHD_VTS) || defined(CONFIG_BCMDHD_DEBUG)
@@ -98,7 +105,7 @@
 #define DHD_PREALLOC_DATABUF_SIZE	(64 * 1024)
 #define DHD_PREALLOC_OSL_BUF_SIZE	(STATIC_BUF_MAX_NUM * STATIC_BUF_SIZE)
 #define DHD_PREALLOC_WIPHY_ESCAN0_SIZE	(64 * 1024)
-#define DHD_PREALLOC_DHD_INFO_SIZE	(42 * 1024)
+#define DHD_PREALLOC_DHD_INFO_SIZE	(43 * 1024)
 #if defined(CONFIG_BCMDHD_VTS) || defined(CONFIG_BCMDHD_DEBUG)
 #define DHD_PREALLOC_MEMDUMP_RAM_SIZE	(1290 * 1024)
 #endif /* CONFIG_BCMDHD_VTS | CONFIG_BCMDHD_DEBUG */
@@ -133,20 +140,20 @@
 #define DHD_SKB_2PAGE_BUFSIZE	(PAGE_SIZE * 2)
 #define DHD_SKB_4PAGE_BUFSIZE	(PAGE_SIZE * 4)
 
-#ifdef BCMDHD_PCIE
+#ifdef BCMPCIE
 #define DHD_SKB_1PAGE_BUF_NUM	0
 #define DHD_SKB_2PAGE_BUF_NUM	192
-#elif defined(BCMDHD_SDIO)
+#elif defined(BCMSDIO)
 #define DHD_SKB_1PAGE_BUF_NUM	8
 #define DHD_SKB_2PAGE_BUF_NUM	8
-#endif /* BCMDHD_PCIE */
+#endif /* BCMPCIE */
 #define DHD_SKB_4PAGE_BUF_NUM	1
 
 /* The number is defined in linux_osl.c
  * WLAN_SKB_1_2PAGE_BUF_NUM => STATIC_PKT_1_2PAGE_NUM
  * WLAN_SKB_BUF_NUM => STATIC_PKT_MAX_NUM
  */
-#if defined(BCMDHD_SDIO) || defined(BCMDHD_PCIE)
+#if defined(BCMSDIO) || defined(BCMPCIE)
 #define WLAN_SKB_1_2PAGE_BUF_NUM ((DHD_SKB_1PAGE_BUF_NUM) + \
 		(DHD_SKB_2PAGE_BUF_NUM))
 #define WLAN_SKB_BUF_NUM ((WLAN_SKB_1_2PAGE_BUF_NUM) + (DHD_SKB_4PAGE_BUF_NUM))
@@ -173,9 +180,9 @@
 void *wlan_static_dhd_event_ring_buf[MAX_NUM_ADAPTERS] = {};
 void *wlan_static_nan_event_ring_buf[MAX_NUM_ADAPTERS] = {};
 
-#if defined(BCMDHD_SDIO) || defined(BCMDHD_PCIE)
+#if defined(BCMSDIO) || defined(BCMPCIE)
 static struct sk_buff *wlan_static_skb[MAX_NUM_ADAPTERS][WLAN_SKB_BUF_NUM] = {};
-#endif /* BCMDHD_SDIO | BCMDHD_PCIE */
+#endif /* BCMSDIO | BCMPCIE */
 
 void *
 dhd_wlan_mem_prealloc(
@@ -198,18 +205,18 @@
 	if (section == DHD_PREALLOC_PROT)
 		return wlan_static_prot[index];
 
-#if defined(BCMDHD_SDIO)
+#if defined(BCMSDIO)
 	if (section == DHD_PREALLOC_RXBUF)
 		return wlan_static_rxbuf[index];
 
 	if (section == DHD_PREALLOC_DATABUF)
 		return wlan_static_databuf[index];
-#endif /* BCMDHD_SDIO */
+#endif /* BCMSDIO */
 
-#if defined(BCMDHD_SDIO) || defined(BCMDHD_PCIE)
+#if defined(BCMSDIO) || defined(BCMPCIE)
 	if (section == DHD_PREALLOC_SKB_BUF)
 		return wlan_static_skb[index];
-#endif /* BCMDHD_SDIO | BCMDHD_PCIE */
+#endif /* BCMSDIO | BCMPCIE */
 
 	if (section == DHD_PREALLOC_WIPHY_ESCAN0)
 		return wlan_static_scan_buf0[index];
@@ -234,7 +241,7 @@
 		}
 		return wlan_static_dhd_info_buf[index];
 	}
-#if defined(BCMDHD_SDIO) || defined(BCMDHD_USB)
+#if defined(BCMSDIO) || defined(BCMDBUS)
 	if (section == DHD_PREALLOC_DHD_WLFC_INFO) {
 		if (size > WLAN_DHD_WLFC_BUF_SIZE) {
 			DHD_STATIC_ERROR("request DHD_WLFC_INFO(%lu) > %d\n",
@@ -243,8 +250,8 @@
 		}
 		return wlan_static_dhd_wlfc_info_buf[index];
 	}
-#endif /* BCMDHD_SDIO | BCMDHD_USB */
-#ifdef BCMDHD_PCIE
+#endif /* BCMSDIO | BCMDBUS */
+#ifdef BCMPCIE
 	if (section == DHD_PREALLOC_IF_FLOW_LKUP)  {
 		if (size > DHD_PREALLOC_IF_FLOW_LKUP_SIZE) {
 			DHD_STATIC_ERROR("request DHD_IF_FLOW_LKUP(%lu) > %d\n",
@@ -253,7 +260,7 @@
 		}
 		return wlan_static_if_flow_lkup[index];
 	}
-#endif /* BCMDHD_PCIE */
+#endif /* BCMPCIE */
 #if defined(CONFIG_BCMDHD_VTS) || defined(CONFIG_BCMDHD_DEBUG)
 	if (section == DHD_PREALLOC_MEMDUMP_RAM) {
 		if (size > DHD_PREALLOC_MEMDUMP_RAM_SIZE) {
@@ -264,7 +271,7 @@
 		return wlan_static_dhd_memdump_ram_buf[index];
 	}
 #endif /* CONFIG_BCMDHD_VTS | CONFIG_BCMDHD_DEBUG */
-#if defined(BCMDHD_SDIO) || defined(BCMDHD_USB)
+#if defined(BCMSDIO) || defined(BCMDBUS)
 	if (section == DHD_PREALLOC_DHD_WLFC_HANGER) {
 		if (size > DHD_PREALLOC_DHD_WLFC_HANGER_SIZE) {
 			DHD_STATIC_ERROR("request DHD_WLFC_HANGER(%lu) > %d\n",
@@ -273,7 +280,7 @@
 		}
 		return wlan_static_dhd_wlfc_hanger_buf[index];
 	}
-#endif /* BCMDHD_SDIO | BCMDHD_USB */
+#endif /* BCMSDIO | BCMDBUS */
 #if defined(CONFIG_BCMDHD_VTS) || defined(CONFIG_BCMDHD_DEBUG)
 	if (section == DHD_PREALLOC_DHD_LOG_DUMP_BUF) {
 		if (size > DHD_PREALLOC_DHD_LOG_DUMP_BUF_SIZE) {
@@ -350,18 +357,18 @@
 static void
 dhd_deinit_wlan_mem(int index)
 {
-#if defined(BCMDHD_SDIO) || defined(BCMDHD_PCIE)
+#if defined(BCMSDIO) || defined(BCMPCIE)
 	int i;
-#endif /* BCMDHD_SDIO | BCMDHD_PCIE */
+#endif /* BCMSDIO | BCMPCIE */
 
 	if (wlan_static_prot[index])
 		kfree(wlan_static_prot[index]);
-#if defined(BCMDHD_SDIO)
+#if defined(BCMSDIO)
 	if (wlan_static_rxbuf[index])
 		kfree(wlan_static_rxbuf[index]);
 	if (wlan_static_databuf[index])
 		kfree(wlan_static_databuf[index]);
-#endif /* BCMDHD_SDIO */
+#endif /* BCMSDIO */
 	if (wlan_static_osl_buf[index])
 		kfree(wlan_static_osl_buf[index]);
 	if (wlan_static_scan_buf0[index])
@@ -370,22 +377,22 @@
 		kfree(wlan_static_scan_buf1[index]);
 	if (wlan_static_dhd_info_buf[index])
 		kfree(wlan_static_dhd_info_buf[index]);
-#if defined(BCMDHD_SDIO) || defined(BCMDHD_USB)
+#if defined(BCMSDIO) || defined(BCMDBUS)
 	if (wlan_static_dhd_wlfc_info_buf[index])
 		kfree(wlan_static_dhd_wlfc_info_buf[index]);
-#endif /* BCMDHD_SDIO | BCMDHD_USB */
-#ifdef BCMDHD_PCIE
+#endif /* BCMSDIO | BCMDBUS */
+#ifdef BCMPCIE
 	if (wlan_static_if_flow_lkup[index])
 		kfree(wlan_static_if_flow_lkup[index]);
-#endif /* BCMDHD_PCIE */
+#endif /* BCMPCIE */
 #if defined(CONFIG_BCMDHD_VTS) || defined(CONFIG_BCMDHD_DEBUG)
 	if (wlan_static_dhd_memdump_ram_buf[index])
 		kfree(wlan_static_dhd_memdump_ram_buf[index]);
 #endif /* CONFIG_BCMDHD_VTS | CONFIG_BCMDHD_DEBUG */
-#if defined(BCMDHD_SDIO) || defined(BCMDHD_USB)
+#if defined(BCMSDIO) || defined(BCMDBUS)
 	if (wlan_static_dhd_wlfc_hanger_buf[index])
 		kfree(wlan_static_dhd_wlfc_hanger_buf[index]);
-#endif /* BCMDHD_SDIO | BCMDHD_USB */
+#endif /* BCMSDIO | BCMDBUS */
 #if defined(CONFIG_BCMDHD_VTS) || defined(CONFIG_BCMDHD_DEBUG)
 	if (wlan_static_dhd_log_dump_buf[index])
 		kfree(wlan_static_dhd_log_dump_buf[index]);
@@ -405,12 +412,12 @@
 		kfree(wlan_static_nan_event_ring_buf[index]);
 #endif /* BCMDHD_UNUSE_MEM */
 
-#if defined(BCMDHD_SDIO) || defined(BCMDHD_PCIE)
+#if defined(BCMSDIO) || defined(BCMPCIE)
 	for (i=0; i<WLAN_SKB_BUF_NUM; i++) {
 		if (wlan_static_skb[index][i])
 			dev_kfree_skb(wlan_static_skb[index][i]);
 	}
-#endif /* BCMDHD_SDIO | BCMDHD_PCIE */
+#endif /* BCMSDIO | BCMPCIE */
 
 	return;
 }
@@ -418,12 +425,12 @@
 static int
 dhd_init_wlan_mem(int index)
 {
-#if defined(BCMDHD_SDIO) || defined(BCMDHD_PCIE)
+#if defined(BCMSDIO) || defined(BCMPCIE)
 	int i;
 #endif
 	unsigned long size = 0;
 
-#if defined(BCMDHD_SDIO) || defined(BCMDHD_PCIE)
+#if defined(BCMSDIO) || defined(BCMPCIE)
 	for (i = 0; i < WLAN_SKB_BUF_NUM; i++)
 		wlan_static_skb[index][i] = NULL;
 
@@ -444,16 +451,16 @@
 		DHD_STATIC_TRACE("section %d skb[%d], size=%ld\n",
 			DHD_PREALLOC_SKB_BUF, i, DHD_SKB_2PAGE_BUFSIZE);
 	}
-#endif /* BCMDHD_SDIO | BCMDHD_PCIE */
+#endif /* BCMSDIO | BCMPCIE */
 
-#if defined(BCMDHD_SDIO)
+#if defined(BCMSDIO)
 	wlan_static_skb[index][i] = dev_alloc_skb(DHD_SKB_4PAGE_BUFSIZE);
 	if (!wlan_static_skb[index][i])
 		goto err_mem_alloc;
 	size += DHD_SKB_4PAGE_BUFSIZE;
 	DHD_STATIC_TRACE("section %d skb[%d], size=%ld\n",
 		DHD_PREALLOC_SKB_BUF, i, DHD_SKB_4PAGE_BUFSIZE);
-#endif /* BCMDHD_SDIO */
+#endif /* BCMSDIO */
 
 	wlan_static_prot[index] = kmalloc(DHD_PREALLOC_PROT_SIZE, GFP_KERNEL);
 	if (!wlan_static_prot[index])
@@ -462,7 +469,7 @@
 	DHD_STATIC_TRACE("section %d, size=%d\n",
 		DHD_PREALLOC_PROT, DHD_PREALLOC_PROT_SIZE);
 
-#if defined(BCMDHD_SDIO)
+#if defined(BCMSDIO)
 	wlan_static_rxbuf[index] = kmalloc(DHD_PREALLOC_RXBUF_SIZE, GFP_KERNEL);
 	if (!wlan_static_rxbuf[index])
 		goto err_mem_alloc;
@@ -476,7 +483,7 @@
 	size += DHD_PREALLOC_DATABUF_SIZE;
 	DHD_STATIC_TRACE("section %d, size=%d\n",
 		DHD_PREALLOC_DATABUF, DHD_PREALLOC_DATABUF_SIZE);
-#endif /* BCMDHD_SDIO */
+#endif /* BCMSDIO */
 
 	wlan_static_osl_buf[index] = kmalloc(DHD_PREALLOC_OSL_BUF_SIZE, GFP_KERNEL);
 	if (!wlan_static_osl_buf[index])
@@ -499,23 +506,23 @@
 	DHD_STATIC_TRACE("section %d, size=%d\n",
 		DHD_PREALLOC_DHD_INFO, DHD_PREALLOC_DHD_INFO_SIZE);
 
-#if defined(BCMDHD_SDIO) || defined(BCMDHD_USB)
+#if defined(BCMSDIO) || defined(BCMDBUS)
 	wlan_static_dhd_wlfc_info_buf[index] = kmalloc(WLAN_DHD_WLFC_BUF_SIZE, GFP_KERNEL);
 	if (!wlan_static_dhd_wlfc_info_buf[index])
 		goto err_mem_alloc;
 	size += WLAN_DHD_WLFC_BUF_SIZE;
 	DHD_STATIC_TRACE("section %d, size=%d\n",
 		DHD_PREALLOC_DHD_WLFC_INFO, WLAN_DHD_WLFC_BUF_SIZE);
-#endif /* BCMDHD_SDIO | BCMDHD_USB */
+#endif /* BCMSDIO | BCMDBUS */
 
-#ifdef BCMDHD_PCIE
+#ifdef BCMPCIE
 	wlan_static_if_flow_lkup[index] = kmalloc(DHD_PREALLOC_IF_FLOW_LKUP_SIZE, GFP_KERNEL);
 	if (!wlan_static_if_flow_lkup[index])
 		goto err_mem_alloc;
 	size += DHD_PREALLOC_IF_FLOW_LKUP_SIZE;
 	DHD_STATIC_TRACE("section %d, size=%d\n",
 		DHD_PREALLOC_IF_FLOW_LKUP, DHD_PREALLOC_IF_FLOW_LKUP_SIZE);
-#endif /* BCMDHD_PCIE */
+#endif /* BCMPCIE */
 
 #if defined(CONFIG_BCMDHD_VTS) || defined(CONFIG_BCMDHD_DEBUG)
 	wlan_static_dhd_memdump_ram_buf[index] = kmalloc(DHD_PREALLOC_MEMDUMP_RAM_SIZE, GFP_KERNEL);
@@ -526,14 +533,14 @@
 		DHD_PREALLOC_MEMDUMP_RAM, DHD_PREALLOC_MEMDUMP_RAM_SIZE);
 #endif /* CONFIG_BCMDHD_VTS | CONFIG_BCMDHD_DEBUG */
 
-#if defined(BCMDHD_SDIO) || defined(BCMDHD_USB)
+#if defined(BCMSDIO) || defined(BCMDBUS)
 	wlan_static_dhd_wlfc_hanger_buf[index] = kmalloc(DHD_PREALLOC_DHD_WLFC_HANGER_SIZE, GFP_KERNEL);
 	if (!wlan_static_dhd_wlfc_hanger_buf[index])
 		goto err_mem_alloc;
 	size += DHD_PREALLOC_DHD_WLFC_HANGER_SIZE;
 	DHD_STATIC_TRACE("section %d, size=%d\n",
 		DHD_PREALLOC_DHD_WLFC_HANGER, DHD_PREALLOC_DHD_WLFC_HANGER_SIZE);
-#endif /* BCMDHD_SDIO | BCMDHD_USB */
+#endif /* BCMSDIO | BCMDBUS */
 
 #if defined(CONFIG_BCMDHD_VTS) || defined(CONFIG_BCMDHD_DEBUG)
 	wlan_static_dhd_log_dump_buf[index] = kmalloc(DHD_PREALLOC_DHD_LOG_DUMP_BUF_SIZE, GFP_KERNEL);
diff --git a/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/include/epivers.h b/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/include/epivers.h
index dd72dc3..3d26fc9 100644
--- a/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/include/epivers.h
+++ b/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/include/epivers.h
@@ -45,7 +45,7 @@
 #elif (defined (BCMDBG_ASSERT) && !defined (BCMDBG_ASSERT_DISABLED))
 #define EPI_VERSION_STR		"101.10.361 (wlan=r892223 ASSRT)"
 #else
-#define EPI_VERSION_STR		"101.10.361.24 (wlan=r892223-20220913-1)"
+#define EPI_VERSION_STR		"101.10.361.28 (wlan=r892223-20221116-5)"
 #endif /* BCMINTERNAL */
 
 #endif /* _epivers_h_ */
diff --git a/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/include/linux_osl.h b/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/include/linux_osl.h
index f9bd6c8..f81edab 100644
--- a/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/include/linux_osl.h
+++ b/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/include/linux_osl.h
@@ -280,7 +280,6 @@
 #define OSL_ENABLE_PREEMPTION(osh)	osl_preempt_enable(osh)
 
 #if (defined(BCMPCIE) && !defined(DHD_USE_COHERENT_MEM_FOR_RING) && defined(__ARM_ARCH_7A__))
-
 	extern void osl_cache_flush(void *va, uint size);
 	extern void osl_cache_inv(void *va, uint size);
 	extern void osl_prefetch(const void *ptr);
diff --git a/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/include/linuxver.h b/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/include/linuxver.h
index e697349..355eacc 100644
--- a/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/include/linuxver.h
+++ b/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/include/linuxver.h
@@ -886,7 +886,10 @@
 
 #define KMALLOC_FLAG (CAN_SLEEP() ? GFP_KERNEL: GFP_ATOMIC)
 
-#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 8, 0))
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 14, 170))
+#define RANDOM32	get_random_u32
+#define RANDOM_BYTES    get_random_bytes
+#elif (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 8, 0))
 #define RANDOM32	prandom_u32
 #define RANDOM_BYTES    prandom_bytes
 #else
diff --git a/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/rk_dhd_pcie_linux.h b/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/rk_dhd_pcie_linux.h
new file mode 100644
index 0000000..80501a3
--- /dev/null
+++ b/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/rk_dhd_pcie_linux.h
@@ -0,0 +1,37 @@
+/* SPDX-License-Identifier: GPL-2.0-only */
+/*
+ * Rockchip PCIe Apis For WIFI
+ *
+ * Copyright (c) 2022, Rockchip Electronics Co., Ltd.
+ */
+
+#ifndef __RK_DHD_PCIE_LINUX_H__
+#define __RK_DHD_PCIE_LINUX_H__
+
+#include <typedefs.h>
+#include <sbchipc.h>
+#include <pcie_core.h>
+#include <dhd_pcie.h>
+#include <linux/aspm_ext.h>
+
+static inline void
+rk_dhd_bus_l1ss_enable_rc_ep(dhd_bus_t *bus, bool enable)
+{
+	if (!bus->rc_ep_aspm_cap || !bus->rc_ep_l1ss_cap) {
+		pr_err("%s: NOT L1SS CAPABLE rc_ep_aspm_cap: %d rc_ep_l1ss_cap: %d\n",
+		       __func__, bus->rc_ep_aspm_cap, bus->rc_ep_l1ss_cap);
+		return;
+	}
+
+	/* Disable ASPM of RC and EP */
+	printf("%s: %s L1ss\n", __FUNCTION__, enable?"enable":"disable");
+	pcie_aspm_ext_l1ss_enable(bus->dev, bus->rc_dev, enable);
+}
+
+static inline bool
+rk_dhd_bus_is_rc_ep_l1ss_capable(dhd_bus_t *bus)
+{
+	return pcie_aspm_ext_is_rc_ep_l1ss_capable(bus->dev, bus->rc_dev);
+}
+
+#endif /* __RK_DHD_PCIE_LINUX_H__ */
diff --git a/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/wl_android.c b/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/wl_android.c
index 6fe9efb..ec37154 100644
--- a/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/wl_android.c
+++ b/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/wl_android.c
@@ -6840,7 +6840,8 @@
 		}
 	}
 
-	channel = wl_ext_autochannel(dev, ACS_DRV_BIT, band);
+	chosen = wl_ext_autochannel(dev, ACS_DRV_BIT, band);
+	channel = wf_chspec_ctlchan(chosen);
 	if (channel) {
 		acs_band = CHSPEC_BAND(channel);
 		goto done2;
diff --git a/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/wl_android_ext.c b/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/wl_android_ext.c
index 6005a44..18d7714 100644
--- a/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/wl_android_ext.c
+++ b/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/wl_android_ext.c
@@ -617,11 +617,11 @@
 	}
 
 	param.band = chan_info->band;
-	err = wl_ext_iovar_getbuf(dev, "bw_cap", &param, sizeof(param),
+	err = wldev_iovar_getbuf(dev, "bw_cap", &param, sizeof(param),
 		iovar_buf, WLC_IOCTL_SMLEN, NULL);
 	if (err) {
 		if (err != BCME_UNSUPPORTED) {
-			AEXT_ERROR(dev->name, "bw_cap failed, %d\n", err);
+			AEXT_TRACE(dev->name, "bw_cap failed, %d\n", err);
 			return err;
 		} else {
 			err = wl_ext_iovar_getint(dev, "mimo_bw_cap", &bw_cap);
@@ -681,48 +681,59 @@
 static int
 wl_ext_channel(struct net_device *dev, char* command, int total_len)
 {
+	struct dhd_pub *dhd = dhd_get_pub(dev);
 	struct wl_chan_info chan_info;
-	int ret;
-	char band[16]="";
-	int channel = 0;
-	channel_info_t ci;
-	int bytes_written = 0;
-	chanspec_t fw_chspec;
+	char chan[16]="";
+	int ret, bytes_written = 0;
+	chanspec_t chanspec;
+	u32 fw_chanspec = 0;
+
+	/* get: dhd_priv channel
+	  * set: dhd_priv channel [6|36|2g6|5g36|6g5]
+	*/
 
 	AEXT_TRACE(dev->name, "cmd %s", command);
 
-	sscanf(command, "%*s %d %s", &channel, band);
-	if (strnicmp(band, "band=auto", strlen("band=auto")) == 0) {
-		chan_info.band = WLC_BAND_AUTO;
+	sscanf(command, "%*s %s", chan);
+	memset(&chan_info, 0, sizeof(struct wl_chan_info));
+	if (strnicmp(chan, "2g", strlen("2g")) == 0) {
+		chan_info.band = WLC_BAND_2G;
+		chan_info.chan = (int)simple_strtol(chan+2, NULL, 10);
+	}
+	else if (strnicmp(chan, "5g", strlen("5g")) == 0) {
+		chan_info.band = WLC_BAND_5G;
+		chan_info.chan = (int)simple_strtol(chan+2, NULL, 10);
 	}
 #ifdef WL_6G_BAND
-	else if (strnicmp(band, "band=6g", strlen("band=6g")) == 0) {
+	else if (strnicmp(chan, "6g", strlen("6g")) == 0) {
 		chan_info.band = WLC_BAND_6G;
+		chan_info.chan = (int)simple_strtol(chan+2, NULL, 10);
 	}
 #endif /* WL_6G_BAND */
-	else if (strnicmp(band, "band=5g", strlen("band=5g")) == 0) {
-		chan_info.band = WLC_BAND_5G;
+	else if (strlen(chan)) {
+		chan_info.chan = (int)simple_strtol(chan, NULL, 10);
+		if (chan_info.chan <= CH_MAX_2G_CHANNEL)
+			chan_info.band = WLC_BAND_2G;
+		else
+			chan_info.band = WLC_BAND_5G;
 	}
-	else if (strnicmp(band, "band=2g", strlen("band=2g")) == 0) {
-		chan_info.band = WLC_BAND_2G;
-	}
-	else if (channel <= CH_MAX_2G_CHANNEL)
-		chan_info.band = WLC_BAND_2G;
-	else
-		chan_info.band = WLC_BAND_5G;
 
-	if (channel > 0) {
-		chan_info.chan = channel;
-		ret = wl_ext_set_chanspec(dev, &chan_info, &fw_chspec);
+	if (chan_info.chan > 0) {
+		ret = wl_ext_set_chanspec(dev, &chan_info, &chanspec);
 	} else {
-		if (!(ret = wl_ext_ioctl(dev, WLC_GET_CHANNEL, &ci,
-				sizeof(channel_info_t), FALSE))) {
-			AEXT_TRACE(dev->name, "hw_channel %d\n", ci.hw_channel);
-			AEXT_TRACE(dev->name, "target_channel %d\n", ci.target_channel);
-			AEXT_TRACE(dev->name, "scan_channel %d\n", ci.scan_channel);
-			bytes_written = snprintf(command, sizeof(channel_info_t)+2,
-				"channel %d", ci.hw_channel);
-			AEXT_TRACE(dev->name, "command result is %s\n", command);
+		ret = wl_ext_iovar_getint(dev, "chanspec", (s32 *)&fw_chanspec);
+		if (ret == BCME_OK) {
+			chanspec = fw_chanspec;
+			chanspec = wl_ext_chspec_driver_to_host(dhd, chanspec);
+			chan_info.band = CHSPEC2WLC_BAND(chanspec);
+			chan_info.chan = wf_chspec_ctlchan(chanspec);
+			if (chan_info.band == WLC_BAND_6G) {
+				bytes_written = snprintf(command, total_len,
+					"channel 6g%d", chan_info.chan);
+			} else {
+				bytes_written = snprintf(command, total_len,
+					"channel %d", chan_info.chan);
+			}
 			ret = bytes_written;
 		}
 	}
@@ -735,28 +746,47 @@
 {
 	int ret, i;
 	int bytes_written = -1;
-	u8 valid_chan_list[sizeof(u32)*(WL_NUMCHANNELS + 1)];
-	wl_uint32_list_t *list;
+	wl_uint32_list_t *list = NULL;
+	chanspec_t chspec;
+	u32 channel;
 
 	AEXT_TRACE(dev->name, "cmd %s", command);
 
-	memset(valid_chan_list, 0, sizeof(valid_chan_list));
-	list = (wl_uint32_list_t *)(void *) valid_chan_list;
-	list->count = htod32(WL_NUMCHANNELS);
-	ret = wl_ext_ioctl(dev, WLC_GET_VALID_CHANNELS, valid_chan_list,
-		sizeof(valid_chan_list), 0);
-	if (ret<0) {
+	list = kzalloc(sizeof(u32)*(MAX_CTRL_CHANSPECS + 1), GFP_KERNEL);
+	if (list == NULL) {
+		AEXT_ERROR(dev->name, "kzalloc failed\n");
+		ret = -ENOMEM;
+		goto exit;
+	}
+
+	ret = wl_construct_ctl_chanspec_list(dev, list);
+	if (ret < 0) {
 		AEXT_ERROR(dev->name, "get channels failed with %d\n", ret);
+		goto exit;
 	} else {
-		bytes_written = snprintf(command, total_len, "channels");
-		for (i = 0; i < dtoh32(list->count); i++) {
-			bytes_written += snprintf(command+bytes_written, total_len, " %d",
-				dtoh32(list->element[i]));
+		bytes_written = 0;
+		for (i = 0; i < list->count; i++) {
+			chspec = list->element[i];
+			channel = wf_chspec_ctlchan(chspec);
+#ifdef WL_6G_BAND
+			if (CHSPEC_IS6G(chspec) && (channel >= CH_MIN_6G_CHANNEL) &&
+					(channel <= CH_MAX_6G_CHANNEL)) {
+				bytes_written += snprintf(command+bytes_written, total_len, "6g%d ",
+					channel);
+			} else
+#endif
+			{
+				bytes_written += snprintf(command+bytes_written, total_len, "%d ",
+					channel);
+			}
 		}
 		AEXT_TRACE(dev->name, "command result is %s\n", command);
 		ret = bytes_written;
 	}
 
+exit:
+	if (list)
+		kfree(list);
 	return ret;
 }
 
@@ -3011,11 +3041,11 @@
 	s32 err = BCME_OK;
 
 	param.band = band;
-	err = wl_ext_iovar_getbuf(net, "bw_cap", &param, sizeof(param), buf,
+	err = wldev_iovar_getbuf(net, "bw_cap", &param, sizeof(param), buf,
 		sizeof(buf), NULL);
 	if (err) {
 		if (err != BCME_UNSUPPORTED) {
-			AEXT_ERROR(net->name, "bw_cap failed, %d\n", err);
+			AEXT_TRACE(net->name, "bw_cap failed, %d\n", err);
 			return err;
 		} else {
 			err = wl_ext_iovar_getint(net, "mimo_bw_cap", &bw_cap);
@@ -3066,8 +3096,7 @@
 	s32 distance_6g;
 #endif /* WL_6G_BAND */
 	s32 cen_ch, distance, distance_2g, distance_5g, chanspec, min_ap=999;
-	u8 valid_chan_list[sizeof(u32)*(MAX_CTRL_CHANSPECS + 1)];
-	wl_uint32_list_t *list;
+	wl_uint32_list_t *list = NULL;
 	int ret;
 	chanspec_t chspec;
 	u32 channel;
@@ -3082,13 +3111,17 @@
 	memset(six_g_band8, -1, sizeof(six_g_band8));
 #endif /* WL_6G_BAND */
 
-	memset(valid_chan_list, 0, sizeof(valid_chan_list));
-	list = (wl_uint32_list_t *)(void *) valid_chan_list;
+	list = kzalloc(sizeof(u32)*(MAX_CTRL_CHANSPECS + 1), GFP_KERNEL);
+	if (list == NULL) {
+		AEXT_ERROR(net->name, "kzalloc failed\n");
+		ret = -ENOMEM;
+		goto exit;
+	}
 
 	ret = wl_construct_ctl_chanspec_list(net, list);
 	if (ret < 0) {
 		AEXT_ERROR(net->name, "get channels failed with %d\n", ret);
-		return 0;
+		goto exit;
 	} else {
 		for (i = 0; i < list->count; i++) {
 			chspec = list->element[i];
@@ -3313,7 +3346,9 @@
 	}
 
 exit:
-	return 0;
+	if (list)
+		kfree(list);
+	return ret;
 }
 #endif /* WL_CFG80211 || WL_ESCAN */
 
@@ -3414,7 +3449,7 @@
 		kfree(reqbuf);
 	}
 
-	return channel;
+	return chosen;
 }
 #endif /* WL_CFG80211 */
 
@@ -3424,29 +3459,36 @@
 {
 	int ret = -1, i, cnt = 0;
 	int retry = 0, retry_max, retry_interval = 250, up = 1;
-	wl_scan_info_t scan_info;
+	wl_scan_info_t *scan_info = NULL;
+
+	scan_info = kmalloc(sizeof(wl_scan_info_t), GFP_KERNEL);
+	if (scan_info == NULL) {
+		AEXT_ERROR(dev->name, "kzalloc failed\n");
+		ret = -ENOMEM;
+		goto exit;
+	}
 
 	retry_max = WL_ESCAN_TIMER_INTERVAL_MS/retry_interval;
 	ret = wldev_ioctl_get(dev, WLC_GET_UP, &up, sizeof(s32));
 	if (ret < 0 || up == 0) {
 		ret = wldev_ioctl_set(dev, WLC_UP, &up, sizeof(s32));
 	}
-	memset(&scan_info, 0, sizeof(wl_scan_info_t));
+	memset(scan_info, 0, sizeof(wl_scan_info_t));
 	if (band == WLC_BAND_2G || band == WLC_BAND_AUTO) {
 		for (i=0; i<13; i++) {
-			scan_info.channels.channel[i+cnt] = wf_create_chspec_from_primary(i+1,
+			scan_info->channels.channel[i+cnt] = wf_create_chspec_from_primary(i+1,
 				WL_CHANSPEC_BW_20, WL_CHANSPEC_BAND_2G);
 		}
 		cnt += 13;
 	}
 	if (band == WLC_BAND_5G || band == WLC_BAND_AUTO) {
 		for (i=0; i<4; i++) {
-			scan_info.channels.channel[i+cnt] = wf_create_chspec_from_primary(36+i*4,
+			scan_info->channels.channel[i+cnt] = wf_create_chspec_from_primary(36+i*4,
 				WL_CHANSPEC_BW_20, WL_CHANSPEC_BAND_5G);
 		}
 		cnt += 4;
 		for (i=0; i<4; i++) {
-			scan_info.channels.channel[i+cnt] = wf_create_chspec_from_primary(149+i*4,
+			scan_info->channels.channel[i+cnt] = wf_create_chspec_from_primary(149+i*4,
 				WL_CHANSPEC_BW_20, WL_CHANSPEC_BAND_5G);
 		}
 		cnt += 4;
@@ -3454,7 +3496,7 @@
 #ifdef WL_6G_BAND
 	if (band == WLC_BAND_6G || band == WLC_BAND_AUTO) {
 		for (i=0; i<59; i++) {
-			scan_info.channels.channel[i+cnt] = wf_create_chspec_from_primary(1+i*4,
+			scan_info->channels.channel[i+cnt] = wf_create_chspec_from_primary(1+i*4,
 				WL_CHANSPEC_BW_20, WL_CHANSPEC_BAND_6G);
 		}
 		cnt += 59;
@@ -3462,13 +3504,13 @@
 #endif /* WL_6G_BAND */
 	if (band == WLC_BAND_2G)
 		fast_scan = FALSE;
-	scan_info.channels.count = cnt;
+	scan_info->channels.count = cnt;
 	if (fast_scan)
-		scan_info.scan_time = 40;
-	scan_info.bcast_ssid = TRUE;
+		scan_info->scan_time = 40;
+	scan_info->bcast_ssid = TRUE;
 	retry = retry_max;
 	while (retry--) {
-		ret = wl_escan_set_scan(dev, &scan_info);
+		ret = wl_escan_set_scan(dev, scan_info);
 		if (!ret)
 			break;
 		OSL_SLEEP(retry_interval);
@@ -3478,13 +3520,16 @@
 		ret = -1;
 	}
 
+exit:
+	if (scan_info)
+		kfree(scan_info);
 	return ret;
 }
 
-int
+static int
 wl_ext_drv_apcs(struct net_device *dev, uint32 band)
 {
-	int ret = 0, channel = 0;
+	int ret = 0, chanspec = 0;
 	struct dhd_pub *dhd = dhd_get_pub(dev);
 	struct wl_escan_info *escan = NULL;
 	int retry = 0, retry_max, retry_interval = 250;
@@ -3499,15 +3544,22 @@
 	retry = retry_max;
 	while (retry--) {
 		if (escan->escan_state == ESCAN_STATE_IDLE) {
-			if (band == WLC_BAND_5G)
-				channel = escan->best_5g_ch;
+			if (band == WLC_BAND_5G) {
+				chanspec = wf_create_chspec_from_primary(wf_chspec_primary20_chan(escan->best_5g_ch),
+					WL_CHANSPEC_BW_20, WL_CHANSPEC_BAND_5G);
+			}
 #ifdef WL_6G_BAND
-			else if (band == WLC_BAND_6G)
-				channel = escan->best_6g_ch;
+			else if (band == WLC_BAND_6G) {
+				chanspec = wf_create_chspec_from_primary(wf_chspec_primary20_chan(escan->best_6g_ch),
+					WL_CHANSPEC_BW_20, WL_CHANSPEC_BAND_6G);
+			}
 #endif /* WL_6G_BAND */
-			else
-				channel = escan->best_2g_ch;
-			WL_MSG(dev->name, "selected channel = %d\n", channel);
+			else {
+				chanspec = wf_create_chspec_from_primary(wf_chspec_primary20_chan(escan->best_2g_ch),
+					WL_CHANSPEC_BW_20, WL_CHANSPEC_BAND_2G);
+			}
+			WL_MSG(dev->name, "selected channel = %d(0x%x)\n",
+				wf_chspec_ctlchan(chanspec), chanspec);
 			goto done;
 		}
 		AEXT_INFO(dev->name, "escan_state=%d, %d tried, ret = %d\n",
@@ -3518,46 +3570,51 @@
 done:
 	escan->autochannel = 0;
 
-	return channel;
+	return chanspec;
 }
 #endif /* WL_ESCAN */
 
 int
 wl_ext_autochannel(struct net_device *dev, uint acs, uint32 band)
 {
-	int channel = 0;
-	uint16 chan_2g, chan_5g;
+	int chosen = 0;
+	uint16 chan_2g, chan_5g, channel;
 
-	AEXT_INFO(dev->name, "acs=0x%x, band=%d \n", acs, band);
+	AEXT_INFO(dev->name, "acs=0x%x, band=%s\n", acs, WLCBAND2STR(band));
 
 #ifdef WL_CFG80211
 	if (acs & ACS_FW_BIT) {
 		int ret = 0;
 		ret = wldev_ioctl_get(dev, WLC_GET_CHANNEL_SEL, &channel, sizeof(channel));
-		channel = 0;
+		chosen = 0;
 		if (ret != BCME_UNSUPPORTED)
-			channel = wl_ext_fw_apcs(dev, band);
-		if (channel)
-			return channel;
+			chosen = wl_ext_fw_apcs(dev, band);
+		if (chosen)
+			return chosen;
 	}
 #endif
 
 #ifdef WL_ESCAN
 	if (acs & ACS_DRV_BIT)
-		channel = wl_ext_drv_apcs(dev, band);
+		chosen = wl_ext_drv_apcs(dev, band);
 #endif /* WL_ESCAN */
 
-	if (channel == 0) {
+	if (chosen == 0) {
 		wl_ext_get_default_chan(dev, &chan_2g, &chan_5g, TRUE);
 		if (band == WLC_BAND_5G) {
+			chosen = wf_create_chspec_from_primary(wf_chspec_primary20_chan(chan_5g),
+				WL_CHANSPEC_BW_20, WL_CHANSPEC_BAND_5G);
 			channel = chan_5g;
 		} else {
+			chosen = wf_create_chspec_from_primary(wf_chspec_primary20_chan(chan_2g),
+				WL_CHANSPEC_BW_20, WL_CHANSPEC_BAND_2G);
 			channel = chan_2g;
 		}
-		AEXT_ERROR(dev->name, "ACS failed. Fall back to default channel (%d) \n", channel);
+		AEXT_ERROR(dev->name, "ACS failed. Fall back to default channel (%s-%d) \n",
+			CHSPEC2BANDSTR(chosen), channel);
 	}
 
-	return channel;
+	return chosen;
 }
 
 #if defined(RSSIAVG)
diff --git a/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/wl_android_ext.h b/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/wl_android_ext.h
index 78ce56d..f14e24f 100644
--- a/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/wl_android_ext.h
+++ b/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/wl_android_ext.h
@@ -189,4 +189,6 @@
 #define WLCBAND2STR(band) ((band == WLC_BAND_2G) ? "2g" : (band == WLC_BAND_5G) ? \
 	"5g" : "0g")
 #endif /* WL_6G_BAND */
+#define WLCWIDTH2STR(width) ((width == WL_CHANSPEC_BW_20) ? "20" : (width == WL_CHANSPEC_BW_40) ? \
+	"40" : (width == WL_CHANSPEC_BW_80) ? "80" : (width == WL_CHANSPEC_BW_160) ? "160" : "0")
 #endif
diff --git a/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/wl_cfg80211.c b/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/wl_cfg80211.c
index 21d3846..69c8dc3 100644
--- a/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/wl_cfg80211.c
+++ b/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/wl_cfg80211.c
@@ -241,9 +241,9 @@
 		 */
 		REG_RULE(2484-10, 2484+10, 20, 6, 20, 0),
 		/* IEEE 802.11a, channel 36..64 */
-		REG_RULE(5150-10, 5350+10, 40, 6, 20, 0),
+		REG_RULE(5150-10, 5350+10, 80, 6, 20, 0),
 		/* IEEE 802.11a, channel 100..165 */
-		REG_RULE(5470-10, 5850+10, 40, 6, 20, 0),
+		REG_RULE(5470-10, 5850+10, 80, 6, 20, 0),
 #ifdef WL_6G_BAND
 		REG_RULE(6025-80, 6985+80, 160, 6, 20, 0),
 		REG_RULE(5935-10, 7115+10, 20, 6, 20, 0),
@@ -1089,12 +1089,86 @@
 };
 #endif /* CFG80211_6G_SUPPORT */
 
+#ifdef WL_CAP_HE
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 19, 0)) || defined(CONFIG_6GHZ_BKPORT)
+static struct ieee80211_sband_iftype_data __wl_he_cap = {
+	.types_mask = BIT(NL80211_IFTYPE_STATION) | BIT(NL80211_IFTYPE_AP),
+	.he_cap = {
+		.has_he = true,
+		.he_cap_elem = {
+			.mac_cap_info[0] = (IEEE80211_HE_MAC_CAP0_HTC_HE |
+			IEEE80211_HE_MAC_CAP0_TWT_REQ),
+			.mac_cap_info[1] = IEEE80211_HE_MAC_CAP1_TF_MAC_PAD_DUR_16US,
+			.mac_cap_info[2] = IEEE80211_HE_MAC_CAP2_BSR,
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 1, 0))
+			.mac_cap_info[5] = IEEE80211_HE_MAC_CAP5_HT_VHT_TRIG_FRAME_RX,
+#endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(5, 1, 0) */
+
+			.phy_cap_info[0] =
+			IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_40MHZ_80MHZ_IN_5G |
+			IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G,
+			.phy_cap_info[1] =
+			IEEE80211_HE_PHY_CAP1_DEVICE_CLASS_A |
+			IEEE80211_HE_PHY_CAP1_LDPC_CODING_IN_PAYLOAD,
+			.phy_cap_info[2] =
+			IEEE80211_HE_PHY_CAP2_NDP_4x_LTF_AND_3_2US,
+			.phy_cap_info[3] =
+			IEEE80211_HE_PHY_CAP3_SU_BEAMFORMER,
+			.phy_cap_info[4] =
+			IEEE80211_HE_PHY_CAP4_SU_BEAMFORMEE |
+			IEEE80211_HE_PHY_CAP4_BEAMFORMEE_MAX_STS_UNDER_80MHZ_MASK |
+			IEEE80211_HE_PHY_CAP4_BEAMFORMEE_MAX_STS_ABOVE_80MHZ_4,
+			.phy_cap_info[5] =
+			IEEE80211_HE_PHY_CAP5_BEAMFORMEE_NUM_SND_DIM_UNDER_80MHZ_2,
+			.phy_cap_info[6] =
+			IEEE80211_HE_PHY_CAP6_CODEBOOK_SIZE_42_SU |
+			IEEE80211_HE_PHY_CAP6_CODEBOOK_SIZE_75_MU |
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 13, 0))
+			IEEE80211_HE_PHY_CAP6_TRIG_SU_BEAMFORMING_FB |
+			IEEE80211_HE_PHY_CAP6_TRIG_MU_BEAMFORMING_PARTIAL_BW_FB |
+#else
+			IEEE80211_HE_PHY_CAP6_TRIG_SU_BEAMFORMER_FB |
+			IEEE80211_HE_PHY_CAP6_TRIG_MU_BEAMFORMER_FB |
+#endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(5, 13, 0) */
+			IEEE80211_HE_PHY_CAP6_TRIG_CQI_FB |
+			IEEE80211_HE_PHY_CAP6_PPE_THRESHOLD_PRESENT,
+			.phy_cap_info[7] =
+			IEEE80211_HE_PHY_CAP7_MAX_NC_1,
+			.phy_cap_info[8] =
+			IEEE80211_HE_PHY_CAP8_20MHZ_IN_160MHZ_HE_PPDU |
+			IEEE80211_HE_PHY_CAP8_80MHZ_IN_160MHZ_HE_PPDU,
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 20, 0))
+			.phy_cap_info[9] =
+			IEEE80211_HE_PHY_CAP9_TX_1024_QAM_LESS_THAN_242_TONE_RU |
+			IEEE80211_HE_PHY_CAP9_RX_1024_QAM_LESS_THAN_242_TONE_RU,
+#endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(4, 20, 0) */
+			},
+			.he_mcs_nss_supp = {
+			.rx_mcs_80 = cpu_to_le16(0xfffa),
+			.tx_mcs_80 = cpu_to_le16(0xfffa),
+			.rx_mcs_160 = cpu_to_le16((0xfffa)),
+			.tx_mcs_160 = cpu_to_le16((0xfffa)),
+			}
+	},
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 8, 0))
+	.he_6ghz_capa = {.capa = cpu_to_le16(0x3038)},
+#endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(5, 8, 0) */
+};
+#endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(4, 19, 0) */
+#endif /* WL_CAP_HE */
+
 static struct ieee80211_supported_band __wl_band_2ghz = {
 	.band = IEEE80211_BAND_2GHZ,
 	.channels = __wl_2ghz_channels,
 	.n_channels = ARRAY_SIZE(__wl_2ghz_channels),
 	.bitrates = wl_g_rates,
-	.n_bitrates = wl_g_rates_size
+	.n_bitrates = wl_g_rates_size,
+#ifdef WL_CAP_HE
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 19, 0)) || defined(CONFIG_6GHZ_BKPORT)
+	.iftype_data = &__wl_he_cap,
+	.n_iftype_data = 1
+#endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(4, 19, 0) */
+#endif /* WL_CAP_HE */
 };
 
 static struct ieee80211_supported_band __wl_band_5ghz_a = {
@@ -1102,7 +1176,13 @@
 	.channels = __wl_5ghz_a_channels,
 	.n_channels = ARRAY_SIZE(__wl_5ghz_a_channels),
 	.bitrates = wl_a_rates,
-	.n_bitrates = wl_a_rates_size
+	.n_bitrates = wl_a_rates_size,
+#ifdef WL_CAP_HE
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 19, 0)) || defined(CONFIG_6GHZ_BKPORT)
+	.iftype_data = &__wl_he_cap,
+	.n_iftype_data = 1
+#endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(4, 19, 0) */
+#endif /* WL_CAP_HE */
 };
 
 #ifdef CFG80211_6G_SUPPORT
@@ -1111,7 +1191,13 @@
 	.channels = __wl_6ghz_channels,
 	.n_channels = ARRAY_SIZE(__wl_6ghz_channels),
 	.bitrates = wl_a_rates,
-	.n_bitrates = wl_a_rates_size
+	.n_bitrates = wl_a_rates_size,
+#ifdef WL_CAP_HE
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 19, 0)) || defined(CONFIG_6GHZ_BKPORT)
+	.iftype_data = &__wl_he_cap,
+	.n_iftype_data = 1
+#endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(4, 19, 0) */
+#endif /* WL_CAP_HE */
 };
 #endif /* CFG80211_6G_SUPPORT */
 
@@ -6556,11 +6642,11 @@
 		}
 		if (conn_in_progress || connected ||
 #if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 19, 2) || defined(CFG80211_BKPORT_MLO)
-				wdev->u.client.ssid_len
+			wdev->u.client.ssid_len)
 #else
-				wdev->ssid_len
-#endif
-		) {
+			wdev->ssid_len)
+#endif /* CFG80211_BKPORT_MLO */
+		{
 #ifdef WL_EXT_IAPSTA
 				wl_ext_in4way_sync(dev, 0, WL_EXT_STATUS_PRE_DISCONNECTING, NULL);
 #endif
@@ -6607,13 +6693,11 @@
 		 * disassoc indicates state mismatch with upper layer. Check for state
 		 * and issue disconnect indication if required.
 		 */
-
 #if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 19, 2) || defined(CFG80211_BKPORT_MLO)
-		// terence 20220911: fix me
-		if (wdev->links[0].client.current_bss || wdev->u.client.ssid_len)
+		if (wdev->connected || wdev->u.client.ssid_len)
 #else
 		if (wdev->current_bss || wdev->ssid_len)
-#endif
+#endif /* CFG80211_BKPORT_MLO */
 		{
 			WL_INFORM_MEM(("report disconnect event\n"));
 			CFG80211_DISCONNECTED(dev, 0, NULL, 0, false, GFP_KERNEL);
@@ -10183,7 +10267,7 @@
 	chan = &band->channels[idx];
 	/* Setting current channel to the requested channel */
 	if ((err = wl_cfg80211_set_channel(wiphy, ndev, chan,
-		NL80211_CHAN_HT20) < 0)) {
+			NL80211_CHAN_WIDTH_20) < 0)) {
 		/*
 		 * FIXME:
 		 *
@@ -13033,8 +13117,14 @@
 			ndev = cfgdev_to_wlc_ndev(cfgdev, cfg);
 			if (ndev) {
 				wdev = ndev->ieee80211_ptr;
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 19, 2) || defined(CFG80211_BKPORT_MLO)
+				wdev->u.client.ssid_len =
+					min(ssid->SSID_len, (uint32)DOT11_MAX_SSID_LEN);
+				memcpy(wdev->u.client.ssid, ssid->SSID, wdev->u.client.ssid_len);
+#else
 				wdev->ssid_len = min(ssid->SSID_len, (uint32)DOT11_MAX_SSID_LEN);
 				memcpy(wdev->ssid, ssid->SSID, wdev->ssid_len);
+#endif /* CFG80211_BKPORT_MLO */
 				WL_ERR(("SSID is %s\n", ssid->SSID));
 				wl_update_prof(cfg, ndev, NULL, ssid, WL_PROF_SSID);
 			} else {
@@ -13732,13 +13822,13 @@
 	(LINUX_VERSION_CODE >= KERNEL_VERSION(4, 12, 0)) || \
 	defined(WL_FILS_ROAM_OFFLD) || defined(CFG80211_ROAM_API_GE_4_12)
 	memset(&roam_info, 0, sizeof(struct cfg80211_roam_info));
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 19, 2) || defined(CFG80211_BKPORT_MLO)
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 0, 0) || defined(CFG80211_BKPORT_MLO)
 	roam_info.links[0].channel = notify_channel;
 	roam_info.links[0].bssid = curbssid;
 #else
 	roam_info.channel = notify_channel;
 	roam_info.bssid = curbssid;
-#endif
+#endif /* CFG80211_BKPORT_MLO */
 	roam_info.req_ie = conn_info->req_ie;
 	roam_info.req_ie_len = conn_info->req_ie_len;
 	roam_info.resp_ie = conn_info->resp_ie;
@@ -13935,7 +14025,7 @@
 
 	resp_params = (struct cfg80211_connect_resp_params *)params;
 	resp_params->status = status;
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 19, 2) || defined(CFG80211_BKPORT_MLO)
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 0, 0) || defined(CFG80211_BKPORT_MLO)
 	resp_params->links[0].bssid = curbssid;
 	resp_params->links[0].bss = CFG80211_GET_BSS(wiphy, NULL, curbssid,
 		ssid->SSID, ssid->SSID_len);
@@ -13944,11 +14034,11 @@
 	resp_params->bss = CFG80211_GET_BSS(wiphy, NULL, curbssid,
 		ssid->SSID, ssid->SSID_len);
 #endif
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 19, 2) || defined(CFG80211_BKPORT_MLO)
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 0, 0) || defined(CFG80211_BKPORT_MLO)
 	if (!resp_params->links[0].bss)
 #else
 	if (!resp_params->bss)
-#endif
+#endif /* CFG80211_BKPORT_MLO */
 	{
 		WL_ERR(("null bss\n"));
 		return BCME_ERROR;
@@ -14063,7 +14153,7 @@
 		if (!ndev->ieee80211_ptr->u.client.ssid_len)
 #else
 		if (!ndev->ieee80211_ptr->ssid_len)
-#endif
+#endif /* CFG80211_BKPORT_MLO */
 		{
 			/* In certain cases, the delayed cfg80211 work from
 				* disconnect context will induce race conditions in
@@ -16730,7 +16820,8 @@
 	return err;
 }
 
-static int wl_construct_reginfo(struct bcm_cfg80211 *cfg, s32 bw_cap)
+static int wl_construct_reginfo(struct bcm_cfg80211 *cfg, s32 bw_cap_2g,
+	s32 bw_cap_5g, s32 bw_cap_6g)
 {
 	struct net_device *dev = bcmcfg_to_prmry_ndev(cfg);
 	struct ieee80211_channel *band_chan_arr = NULL;
@@ -16798,14 +16889,13 @@
 			(channel <= CH_MAX_2G_CHANNEL)) {
 			band_chan_arr = __wl_2ghz_channels;
 			array_size = ARRAYSIZE(__wl_2ghz_channels);
-			ht40_allowed = (bw_cap  == WLC_N_BW_40ALL)? true : false;
 		}
 #ifdef CFG80211_6G_SUPPORT
 		else if (CHSPEC_IS6G(chspec) && (channel >= CH_MIN_6G_CHANNEL) &&
 			(channel <= CH_MAX_6G_CHANNEL)) {
 			band_chan_arr = __wl_6ghz_channels;
 			array_size = ARRAYSIZE(__wl_6ghz_channels);
-			ht40_allowed = (bw_cap  == WLC_N_BW_20ALL)? false : true;
+			ht40_allowed = WL_BW_CAP_40MHZ(bw_cap_6g);
 		}
 #endif /* CFG80211_6G_SUPPORT */
 		else if (
@@ -16819,7 +16909,7 @@
 			(CHSPEC_IS5G(chspec) && channel >= CH_MIN_5G_CHANNEL)) {
 				band_chan_arr = __wl_5ghz_a_channels;
 				array_size = ARRAYSIZE(__wl_5ghz_a_channels);
-			ht40_allowed = (bw_cap  == WLC_N_BW_20ALL)? false : true;
+			ht40_allowed = WL_BW_CAP_40MHZ(bw_cap_5g);
 		} else {
 			WL_ERR(("Invalid channel Sepc. 0x%x.\n", chspec));
 			continue;
@@ -16827,7 +16917,7 @@
 		if (!ht40_allowed && CHSPEC_IS40(chspec))
 			continue;
 		for (j = 0; j < array_size; j++) {
-			if (band_chan_arr[j].hw_value == chspec) {
+			if (band_chan_arr[j].hw_value == wf_chspec_primary20_chspec(chspec)) {
 				break;
 			}
 		}
@@ -16842,7 +16932,7 @@
 			band_chan_arr[index].center_freq =
 				wl_channel_to_frequency(channel, CHSPEC_BAND(chspec));
 #endif
-			band_chan_arr[index].hw_value = chspec;
+			band_chan_arr[index].hw_value = wf_chspec_primary20_chspec(chspec);
 			band_chan_arr[index].beacon_found = false;
 			band_chan_arr[index].flags &= ~IEEE80211_CHAN_DISABLED;
 
@@ -16850,12 +16940,14 @@
 				/* assuming the order is HT20, HT40 Upper,
 				 *  HT40 lower from chanspecs
 				 */
-				u32 ht40_flag = band_chan_arr[index].flags & IEEE80211_CHAN_NO_HT40;
+				u32 ht40_flag =
+					band_chan_arr[index].flags & IEEE80211_CHAN_NO_HT40;
 				if (CHSPEC_SB_UPPER(chspec)) {
 					if (ht40_flag == IEEE80211_CHAN_NO_HT40)
 						band_chan_arr[index].flags &=
 							~IEEE80211_CHAN_NO_HT40;
-					band_chan_arr[index].flags |= IEEE80211_CHAN_NO_HT40PLUS;
+					band_chan_arr[index].flags |=
+						IEEE80211_CHAN_NO_HT40PLUS;
 				} else {
 					/* It should be one of
 					 * IEEE80211_CHAN_NO_HT40 or IEEE80211_CHAN_NO_HT40PLUS
@@ -16880,6 +16972,12 @@
 		}
 
 	}
+
+	WL_CHANNEL_COPY_FLAG(__wl_2ghz_channels);
+	WL_CHANNEL_COPY_FLAG(__wl_5ghz_a_channels);
+#ifdef CFG80211_6G_SUPPORT
+	WL_CHANNEL_COPY_FLAG(__wl_6ghz_channels);
+#endif /* CFG80211_6G_SUPPORT */
 
 	__wl_band_2ghz.n_channels = ARRAYSIZE(__wl_2ghz_channels);
 	__wl_band_5ghz_a.n_channels = ARRAYSIZE(__wl_5ghz_a_channels);
@@ -16919,8 +17017,8 @@
 	s32 err = 0;
 	s32 index = 0;
 	s32 nmode = 0;
-#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 6, 0)) || defined(CUSTOMER_HW5)
 	u32 j = 0;
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 6, 0))
 	s32 vhtmode = 0;
 	s32 txstreams = 0;
 	s32 rxstreams = 0;
@@ -16929,11 +17027,14 @@
 	s32 stbc_tx = 0;
 	s32 txbf_bfe_cap = 0;
 	s32 txbf_bfr_cap = 0;
-#endif /* KERNEL >= 3.6 || CUSTOMER_HW5 */
-	s32 bw_cap = 0;
+#endif
+	s32 txchain = 0;
+	s32 rxchain = 0;
+	s32 bw_cap_2g = 0, bw_cap_5g = 0, bw_cap_6g = 0;
 	s32 cur_band = -1;
 	struct ieee80211_supported_band *bands[IEEE80211_NUM_BANDS] = {NULL, };
 
+	WL_INFORM(("%s: Enter\n", __FUNCTION__));
 	bzero(bandlist, sizeof(bandlist));
 	err = wldev_ioctl_get(dev, WLC_GET_BANDLIST, bandlist,
 		sizeof(bandlist));
@@ -16953,7 +17054,7 @@
 		WL_ERR(("error reading nmode (%d)\n", err));
 	}
 
-#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 6, 0)) || defined(CUSTOMER_HW5)
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 6, 0))
 	err = wldev_iovar_getint(dev, "vhtmode", &vhtmode);
 	if (unlikely(err)) {
 		WL_ERR(("error reading vhtmode (%d)\n", err));
@@ -16995,25 +17096,58 @@
 			WL_ERR(("error reading txbf_bfr_cap (%d)\n", err));
 		}
 	}
-#endif /* KERNEL >= 3.6 || CUSTOMER_HW5 */
+#endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(3, 6, 0) */
+
+	err = wldev_iovar_getint(dev, "txchain", &txchain);
+	if (unlikely(err)) {
+		WL_ERR(("error reading txchain (%d)\n", err));
+	} else if (txchain == 0x03) {
+		txchain = 2;
+	} else {
+		txchain = 1;
+	}
+	err = wldev_iovar_getint(dev, "rxchain", &rxchain);
+	if (unlikely(err)) {
+		WL_ERR(("error reading rxchain (%d)\n", err));
+	} else if (rxchain == 0x03) {
+		rxchain = 2;
+	} else {
+		rxchain = 1;
+	}
 
 	/* For nmode and vhtmode   check bw cap */
 	if (nmode ||
-#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 6, 0)) || defined(CUSTOMER_HW5)
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 6, 0))
 		vhtmode ||
-#endif /* KERNEL >= 3.6 || CUSTOMER_HW5 */
+#endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(3, 6, 0) */
 		0) {
-		err = wldev_iovar_getint(dev, "mimo_bw_cap", &bw_cap);
+		uint32 value;
+
+		value = WLC_BAND_2G;
+		err = wldev_iovar_getint(dev, "bw_cap", &value);
 		if (unlikely(err)) {
-			WL_ERR(("error get mimo_bw_cap (%d)\n", err));
+			WL_ERR(("error get bw_cap 2g (%d)\n", err));
 		}
+		bw_cap_2g = dtoh32(value);
+		value = WLC_BAND_5G;
+		err = wldev_iovar_getint(dev, "bw_cap", &value);
+		if (unlikely(err)) {
+			WL_ERR(("error get bw_cap 5g (%d)\n", err));
+		}
+		bw_cap_5g = dtoh32(value);
+		value = WLC_BAND_6G;
+		err = wldev_iovar_getint(dev, "bw_cap", &value);
+		if (unlikely(err)) {
+			WL_ERR(("error get bw_cap 6g (%d)\n", err));
+		}
+		bw_cap_6g = dtoh32(value);
 	}
 
 #ifdef WL_6G_BAND
 	wl_is_6g_supported(cfg, bandlist, bandlist[0]);
 #endif /* WL_6G_BAND */
 
-	err = wl_construct_reginfo(cfg, bw_cap);
+	err = wl_construct_reginfo(cfg, bw_cap_2g, bw_cap_5g, bw_cap_6g);
 	if (err) {
 		WL_ERR(("wl_construct_reginfo() fails err=%d\n", err));
 		if (err != BCME_UNSUPPORTED)
@@ -17023,6 +17157,9 @@
 	wiphy = bcmcfg_to_wiphy(cfg);
 	nband = bandlist[0];
 
+	wiphy->available_antennas_tx = txchain;
+	wiphy->available_antennas_rx = rxchain;
+
 	for (i = 1; i <= nband && i < ARRAYSIZE(bandlist); i++) {
 		index = -1;
 
@@ -17030,8 +17167,18 @@
 			bands[IEEE80211_BAND_2GHZ] =
 				&__wl_band_2ghz;
 			index = IEEE80211_BAND_2GHZ;
-			if (bw_cap == WLC_N_BW_40ALL)
-				bands[index]->ht_cap.cap |= IEEE80211_HT_CAP_SGI_40;
+			(void)memset_s(bands[index]->ht_cap.mcs.rx_mask, IEEE80211_HT_MCS_MASK_LEN,
+				0, IEEE80211_HT_MCS_MASK_LEN);
+			if (nmode && (WL_BW_CAP_40MHZ(bw_cap_2g))) {
+				bands[index]->ht_cap.cap |= IEEE80211_HT_CAP_SUP_WIDTH_20_40 |
+					IEEE80211_HT_CAP_SGI_40;
+				bands[index]->ht_cap.mcs.rx_mask[4] = 0x01;
+				bands[index]->ht_cap.mcs.rx_highest =
+					cpu_to_le16(150 * rxchain); /* Mbps */
+			} else {
+				bands[index]->ht_cap.mcs.rx_highest =
+					cpu_to_le16(72 * rxchain); /* Mbps */
+			}
 		} else {
 			if (bandlist[i] == WLC_BAND_6G) {
 #ifdef CFG80211_6G_SUPPORT
@@ -17062,14 +17209,26 @@
 				continue;
 			}
 
-			if (nmode && (bw_cap == WLC_N_BW_40ALL || bw_cap == WLC_N_BW_20IN2G_40IN5G))
-				bands[index]->ht_cap.cap |= IEEE80211_HT_CAP_SGI_40;
+			(void)memset_s(bands[index]->ht_cap.mcs.rx_mask, IEEE80211_HT_MCS_MASK_LEN,
+				0, IEEE80211_HT_MCS_MASK_LEN);
+			if (nmode && (WL_BW_CAP_40MHZ(bw_cap_5g))) {
+				bands[index]->ht_cap.cap |= IEEE80211_HT_CAP_SUP_WIDTH_20_40 |
+					IEEE80211_HT_CAP_SGI_40;
+				bands[index]->ht_cap.mcs.rx_mask[4] = 0x01;
+				bands[index]->ht_cap.mcs.rx_highest = cpu_to_le16(150 * rxchain);
+			} else {
+				bands[index]->ht_cap.mcs.rx_highest = cpu_to_le16(72 * rxchain);
+			}
 
-#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 6, 0)) || defined(CUSTOMER_HW5)
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 6, 0))
 			/* VHT capabilities. */
 			if (vhtmode) {
 				/* Supported */
 				bands[index]->vht_cap.vht_supported = TRUE;
+				bands[index]->vht_cap.vht_mcs.tx_highest =
+					cpu_to_le16(433 * txstreams); /* Mbps */
+				bands[index]->vht_cap.vht_mcs.rx_highest =
+					cpu_to_le16(433 * txstreams); /* Mbps */
 
 				for (j = 1; j <= VHT_CAP_MCS_MAP_NSS_MAX; j++) {
 					/* TX stream rates. */
@@ -17092,11 +17251,13 @@
 				}
 
 				/* Capabilities */
+				bands[index]->vht_cap.cap |=   IEEE80211_VHT_CAP_RX_ANTENNA_PATTERN
+				                             | IEEE80211_VHT_CAP_TX_ANTENNA_PATTERN;
 				/* 80 MHz is mandatory */
 				bands[index]->vht_cap.cap |=
 					IEEE80211_VHT_CAP_SHORT_GI_80;
 
-				if (WL_BW_CAP_160MHZ(bw_cap)) {
+				if (WL_BW_CAP_160MHZ(bw_cap_5g)) {
 					bands[index]->vht_cap.cap |=
 						IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160MHZ;
 					bands[index]->vht_cap.cap |=
@@ -17148,7 +17309,7 @@
 					bands[index]->vht_cap.vht_mcs.rx_mcs_map,
 					bands[index]->vht_cap.vht_mcs.tx_mcs_map));
 			}
-#endif /* KERNEL >= 3.6 || CUSTOMER_HW5 */
+#endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(3, 6, 0) */
 		}
 
 		if ((index >= 0) && nmode) {
@@ -17158,7 +17319,10 @@
 			bands[index]->ht_cap.ampdu_factor = IEEE80211_HT_MAX_AMPDU_64K;
 			bands[index]->ht_cap.ampdu_density = IEEE80211_HT_MPDU_DENSITY_16;
 			/* An HT shall support all EQM rates for one spatial stream */
-			bands[index]->ht_cap.mcs.rx_mask[0] = 0xff;
+			for (j = 0; j < rxchain; j++) {
+				bands[index]->ht_cap.mcs.rx_mask[j] = 0xff;
+			}
+			bands[index]->ht_cap.mcs.tx_params = IEEE80211_HT_MCS_TX_DEFINED;
 		}
 
 	}
@@ -17623,11 +17787,10 @@
 			struct wireless_dev *wdev = ndev->ieee80211_ptr;
 			struct cfg80211_bss *bss = CFG80211_GET_BSS(wiphy, NULL, latest_bssid,
 #if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 19, 2) || defined(CFG80211_BKPORT_MLO)
-				wdev->u.client.ssid, wdev->u.client.ssid_len
+				wdev->u.client.ssid, wdev->u.client.ssid_len);
 #else
-				wdev->ssid, wdev->ssid_len
-#endif
-			);
+				wdev->ssid, wdev->ssid_len);
+#endif /* CFG80211_BKPORT_MLO */
 
 			BCM_REFERENCE(bss);
 
@@ -19536,7 +19699,12 @@
 	while (ie) {
 		if (count >= MAX_VNDR_IE_NUMBER)
 			break;
-		if (ie->id == DOT11_MNG_VS_ID || (ie->id == DOT11_MNG_ID_EXT_ID)) {
+#ifdef HOSTAPD_EID_EXTENSION_SUPPORT
+		if (ie->id == DOT11_MNG_VS_ID || (ie->id == DOT11_MNG_ID_EXT_ID))
+#else
+		if (ie->id == DOT11_MNG_VS_ID)
+#endif
+		{
 			vndrie = (const vndr_ie_t *) ie;
 			if (ie->id == DOT11_MNG_ID_EXT_ID) {
 				/* len should be bigger than sizeof ID extn field at least */
@@ -19876,6 +20044,40 @@
 	return 0;
 }
 
+#ifdef GET_FW_IE_DATA
+static void
+wl_dump_ie_buf(vndr_ie_buf_t *ie_getbuf)
+{
+	uchar *iebuf;
+	uchar *data;
+	int tot_ie, pktflag, iecount, datalen;
+	vndr_ie_info_t *ie_info;
+	vndr_ie_t *ie;
+
+	memcpy(&tot_ie, (void *)&ie_getbuf->iecount, sizeof(int));
+	tot_ie = dtoh32(tot_ie);
+	iebuf = (uchar *)&ie_getbuf->vndr_ie_list[0];
+
+	printf("-----------------\n");
+	printf("Total IEs %d\n", tot_ie);
+	for (iecount = 0; iecount < tot_ie; iecount++) {
+		ie_info = (vndr_ie_info_t *) iebuf;
+		memcpy(&pktflag, (void *)&ie_info->pktflag, sizeof(uint32));
+		pktflag = dtoh32(pktflag);
+		iebuf += sizeof(uint32);
+		ie = &ie_info->vndr_ie_data;
+		data = &ie->data[0];
+		datalen = ie->len - VNDR_IE_MIN_LEN;
+		printf("index=%d, pktflag=0x%x\n", iecount, pktflag);
+		prhex("IE", (u8 *)ie, ie->len+VNDR_IE_HDR_LEN);
+
+		iebuf += ie->len + VNDR_IE_HDR_LEN;
+	}
+	printf("-----------------\n");
+	printf("\n");
+}
+#endif /* GET_FW_IE_DATA */
+
 static void
 wl_print_fw_ie_data(struct bcm_cfg80211 *cfg, struct net_device *ndev, s32 bssidx)
 {
@@ -19887,18 +20089,10 @@
 		bssidx, &cfg->ioctl_buf_sync);
 	if (ret == BCME_OK) {
 		ies = (vndr_ie_buf_t *)cfg->ioctl_buf;
-		WL_INFORM_MEM(("FW IE count:%d\n", ies->iecount));
 #ifdef GET_FW_IE_DATA
-		if (wl_dbg_level & WL_DBG_DBG) {
-			int i = 0;
-			/* If debug enabled, print each IE */
-			for (i = 0; i < ies->iecount; i++) {
-				vndr_ie_info_t *info = &ies->vndr_ie_list[i];
-				WL_DBG_MEM(("pktflag:0x%x\n", info->pktflag));
-					prhex("IE:", (u8 *)&info->vndr_ie_data,
-						info->vndr_ie_data.len + TLV_HDR_LEN);
-			}
-		}
+		wl_dump_ie_buf((vndr_ie_buf_t *)cfg->ioctl_buf);
+#else
+		WL_MSG(ndev->name, "FW IE count:%d\n", ies->iecount);
 #endif /* GET_FW_IE_DATA */
 	} else {
 		WL_ERR(("IE retrieval failed! ret:%d\n", ret));
@@ -19922,6 +20116,7 @@
 	u32 parsed_ie_buf_len = 0;
 	struct parsed_vndr_ies old_vndr_ies;
 	struct parsed_vndr_ies new_vndr_ies;
+	int del_add_cnt = 0;
 	s32 i;
 	u8 *ptr;
 	s32 remained_buf_len;
@@ -20065,6 +20260,7 @@
 
 				curr_ie_buf += del_add_ie_buf_len;
 				total_ie_buf_len += del_add_ie_buf_len;
+				del_add_cnt++;
 			}
 		}
 
@@ -20114,13 +20310,32 @@
 				*mgmt_ie_len += vndrie_info->ie_len;
 				curr_ie_buf += del_add_ie_buf_len;
 				total_ie_buf_len += del_add_ie_buf_len;
+				del_add_cnt++;
 			}
 		}
 
 		if (total_ie_buf_len && cfg->ioctl_buf != NULL) {
-			ret  = wldev_iovar_setbuf_bsscfg(ndev, "vndr_ie", g_mgmt_ie_buf,
+#ifdef VNDR_IE_WAR
+			curr_ie_buf = g_mgmt_ie_buf;
+			for (i=0; i<del_add_cnt; i++) {
+				vndr_ie_setbuf_t *vndr_ie_setbuf = (vndr_ie_setbuf_t *)curr_ie_buf;
+				u32 curr_ie_buf_len;
+				curr_ie_buf_len =
+					(u8*)&vndr_ie_setbuf->vndr_ie_buffer.vndr_ie_list[0].vndr_ie_data.oui[0] -
+					(u8*)vndr_ie_setbuf;
+				curr_ie_buf_len += vndr_ie_setbuf->vndr_ie_buffer.vndr_ie_list[0].vndr_ie_data.len;
+				ret = wldev_iovar_setbuf_bsscfg(ndev, "vndr_ie", curr_ie_buf,
+					curr_ie_buf_len, cfg->ioctl_buf, WLC_IOCTL_MAXLEN,
+					bssidx, &cfg->ioctl_buf_sync);
+				if (ret)
+					break;
+				curr_ie_buf += curr_ie_buf_len;
+			}
+#else
+			ret = wldev_iovar_setbuf_bsscfg(ndev, "vndr_ie", g_mgmt_ie_buf,
 				total_ie_buf_len, cfg->ioctl_buf, WLC_IOCTL_MAXLEN,
 				bssidx, &cfg->ioctl_buf_sync);
+#endif
 			if (ret) {
 				WL_ERR(("vndr_ie set error :%d\n", ret));
 				if (ret == BCME_NOTFOUND) {
diff --git a/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/wl_cfg80211.h b/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/wl_cfg80211.h
index 626fdc8..35ab3af 100644
--- a/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/wl_cfg80211.h
+++ b/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/wl_cfg80211.h
@@ -3045,6 +3045,15 @@
 	}	\
 } while (0)
 
+#define WL_CHANNEL_COPY_FLAG(band_chan_arr)    \
+do {   \
+	u32 arr_size, k;        \
+	arr_size = ARRAYSIZE(band_chan_arr);    \
+	for (k = 0; k < arr_size; k++) {        \
+		band_chan_arr[k].orig_flags = band_chan_arr[k].flags;   \
+	}       \
+} while (0)
+
 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 9, 0))
 #define CFG80211_PUT_BSS(wiphy, bss) cfg80211_put_bss(wiphy, bss);
 #else
diff --git a/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/wl_cfgvendor.c b/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/wl_cfgvendor.c
index ab7e073..480dc1f 100644
--- a/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/wl_cfgvendor.c
+++ b/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/wl_cfgvendor.c
@@ -6860,11 +6860,13 @@
 	cca_congest_ext_channel_req_v2_t *per_chspec_stats = NULL;
 	uint per_chspec_stats_size = 0;
 	cca_congest_ext_channel_req_v3_t *all_chan_results;
-	cca_congest_ext_channel_req_v3_t all_chan_req;
+	cca_congest_ext_channel_req_v3_t *all_chan_req = NULL;
+	uint all_chan_req_size = sizeof(cca_congest_ext_channel_req_v3_t);
 #else
 	/* cca_get_stats_ext iovar for Wifi channel statics */
 	struct cca_congest_ext_channel_req_v2 *cca_v2_results;
-	struct cca_congest_ext_channel_req_v2 cca_v2_req;
+	struct cca_congest_ext_channel_req_v2 *cca_v2_req = NULL;
+	uint cca_v2_req_size = sizeof(cca_congest_ext_channel_req_v2_t);
 #endif /* CHAN_STATS_SUPPORT  */
 	const wl_cnt_wlc_t *wlc_cnt;
 	scb_val_t scbval;
@@ -7025,10 +7027,16 @@
 
 #ifdef CHAN_STATS_SUPPORT
 	/* Option to get all channel statistics */
-	all_chan_req.num_of_entries = 0;
-	all_chan_req.ver = WL_CCA_EXT_REQ_VER_V3;
+	all_chan_req = (void *)MALLOCZ(cfg->osh, all_chan_req_size);
+	if (all_chan_req == NULL) {
+		err = BCME_NOMEM;
+		WL_ERR(("all_chan_req alloc failed\n"));
+		goto exit;
+	}
+	all_chan_req->num_of_entries = 0;
+	all_chan_req->ver = WL_CCA_EXT_REQ_VER_V3;
 	err = wldev_iovar_getbuf(bcmcfg_to_prmry_ndev(cfg), "cca_get_stats_ext",
-		&all_chan_req, sizeof(all_chan_req), iovar_buf, WLC_IOCTL_MAXLEN, NULL);
+		all_chan_req, all_chan_req_size, iovar_buf, WLC_IOCTL_MAXLEN, NULL);
 
 	if (err != BCME_OK && err != BCME_UNSUPPORTED) {
 		WL_ERR(("cca_get_stats_ext iovar err = %d\n", err));
@@ -7089,12 +7097,18 @@
 		}
 	}
 #else
-	cca_v2_req.ver = WL_CCA_EXT_REQ_VER_V2;
-	cca_v2_req.chanspec =
+	cca_v2_req = (void *)MALLOCZ(cfg->osh, cca_v2_req_size);
+	if (cca_v2_req == NULL) {
+		err = BCME_NOMEM;
+		WL_ERR(("cca_v2_req alloc failed\n"));
+		goto exit;
+	}
+	cca_v2_req->ver = WL_CCA_EXT_REQ_VER_V2;
+	cca_v2_req->chanspec =
 		wl_chspec_host_to_driver(wf_chspec_primary20_chspec(cur_chanspec));
 
-	err = wldev_iovar_getbuf(bcmcfg_to_prmry_ndev(cfg), "cca_get_stats_ext", &cca_v2_req,
-		sizeof(cca_v2_req), iovar_buf, WLC_IOCTL_MAXLEN, NULL);
+	err = wldev_iovar_getbuf(bcmcfg_to_prmry_ndev(cfg), "cca_get_stats_ext", cca_v2_req,
+		cca_v2_req_size, iovar_buf, WLC_IOCTL_MAXLEN, NULL);
 
 	if (err != BCME_OK && err != BCME_UNSUPPORTED) {
 		WL_ERR(("cca_get_stats_ext iovar err = %d\n", err));
@@ -7300,6 +7314,15 @@
 		WL_ERR(("Vendor Command reply failed ret:%d \n", err));
 
 exit:
+#ifdef CHAN_STATS_SUPPORT
+	if (all_chan_req) {
+		MFREE(cfg->osh, all_chan_req, all_chan_req_size);
+	}
+#else
+	if (cca_v2_req) {
+		MFREE(cfg->osh, cca_v2_req, cca_v2_req_size);
+	}
+#endif /* CHAN_STATS_SUPPORT */
 	if (outdata) {
 		MFREE(cfg->osh, outdata, WLC_IOCTL_MAXLEN);
 	}
diff --git a/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/wl_cfgvif.c b/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/wl_cfgvif.c
index f5d6910..4980e82 100644
--- a/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/wl_cfgvif.c
+++ b/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/wl_cfgvif.c
@@ -519,7 +519,7 @@
 		 * role to station type while bringing down the interface
 		 */
 		if (p2p_ndev->ieee80211_ptr->iftype == NL80211_IFTYPE_STATION) {
-			WL_DBG_MEM(("%s, Change to GC base role\n", __FUNCTION__));
+			WL_DBG_MEM(("%s, Change to GC base role\n", p2p_ndev->name));
 			return WL_IF_TYPE_P2P_GC;
 		}
 
@@ -888,6 +888,7 @@
 	WL_DBG(("%s:Mac addr" MACDBG "\n",
 			__FUNCTION__, MAC2STRDBG(mac_addr)));
 
+#if defined(SPECIFIC_MAC_GEN_SCHEME)
 	if ((wl_iftype == WL_IF_TYPE_P2P_DISC) || (wl_iftype == WL_IF_TYPE_AP) ||
 		(wl_iftype == WL_IF_TYPE_P2P_GO) || (wl_iftype == WL_IF_TYPE_P2P_GC)) {
 		/* Avoid invoking release mac addr code for interfaces using
@@ -895,6 +896,11 @@
 		 */
 		return BCME_OK;
 	}
+#else
+	if (wl_iftype == WL_IF_TYPE_P2P_DISC) {
+		return BCME_OK;
+	}
+#endif /* SPECIFIC_MAC_GEN_SCHEME */
 
 	/* Fetch last two bytes of mac address */
 	org_toggle_bytes = ntoh16(*((u16 *)&ndev->dev_addr[4]));
@@ -951,7 +957,7 @@
  * released. Ensure to call wl_release_vif_macaddress to free up
  * the mac address.
  */
-#if defined (SPECIFIC_MAC_GEN_SCHEME)
+#if defined(SPECIFIC_MAC_GEN_SCHEME)
 	if (wl_iftype == WL_IF_TYPE_P2P_DISC ||	wl_iftype == WL_IF_TYPE_AP) {
 		mac_addr[0] |= 0x02;
 	} else if ((wl_iftype == WL_IF_TYPE_P2P_GO) || (wl_iftype == WL_IF_TYPE_P2P_GC)) {
@@ -962,7 +968,7 @@
 	if (wl_iftype == WL_IF_TYPE_P2P_DISC) {
 		mac_addr[0] |= 0x02;
 	}
-#endif /* SEPCIFIC_MAC_GEN_SCHEME */
+#endif /* SPECIFIC_MAC_GEN_SCHEME */
 	else {
 		/* For locally administered mac addresses, we keep the
 		 * OUI part constant and just work on the last two bytes.
@@ -1331,9 +1337,9 @@
 	if (is_p2p_group_iface(ndev->ieee80211_ptr) && (type == NL80211_IFTYPE_STATION)) {
 		/* For role downgrade cases, we keep interface role as GC */
 		netinfo->iftype = WL_IF_TYPE_P2P_GC;
-		WL_DBG_MEM(("[%s] Set  base role to GC, current role"
+		WL_DBG_MEM(("[%s] Set base role to GC, current role"
 			"ndev->ieee80211_ptr->iftype = %d\n",
-			__FUNCTION__, ndev->ieee80211_ptr->iftype));
+			ndev->name, ndev->ieee80211_ptr->iftype));
 	} else {
 		netinfo->iftype = wl_iftype;
 	}
@@ -1538,11 +1544,16 @@
 s32
 wl_cfg80211_set_channel(struct wiphy *wiphy, struct net_device *dev,
 	struct ieee80211_channel *chan,
-	enum nl80211_channel_type channel_type)
+#if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 6, 0))
+	enum nl80211_channel_type channel_type
+#else
+	enum nl80211_chan_width width
+#endif
+)
 {
 	chanspec_t chspec = INVCHANSPEC;
 	chanspec_t cur_chspec = INVCHANSPEC;
-	u32 bw = WL_CHANSPEC_BW_20;
+	u32 band_width = WL_CHANSPEC_BW_20, bw = WL_CHANSPEC_BW_20;
 	s32 err = BCME_OK;
 	struct bcm_cfg80211 *cfg = wiphy_priv(wiphy);
 #if defined(CUSTOM_SET_CPUCORE) || defined(APSTA_RESTRICTED_CHANNEL)
@@ -1551,6 +1562,39 @@
 	u16 center_freq = chan->center_freq;
 
 	dev = ndev_to_wlc_ndev(dev, cfg);
+
+#if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 6, 0))
+	switch (channel_type) {
+		case NL80211_CHAN_HT40MINUS:
+			/* secondary channel is below the control channel */
+			band_width = WL_CHANSPEC_BW_40;
+			break;
+		case NL80211_CHAN_HT40PLUS:
+			/* secondary channel is above the control channel */
+			band_width = WL_CHANSPEC_BW_40;
+			break;
+		default:
+			band_width = WL_CHANSPEC_BW_20;
+	}
+#else
+	switch (width)
+	{
+		case NL80211_CHAN_WIDTH_160:
+			band_width = WL_CHANSPEC_BW_160;
+			break;
+		case NL80211_CHAN_WIDTH_80P80:
+		case NL80211_CHAN_WIDTH_80:
+			band_width = WL_CHANSPEC_BW_80;
+			break;
+		case NL80211_CHAN_WIDTH_40:
+			band_width = WL_CHANSPEC_BW_40;
+			break;
+		default:
+			band_width = WL_CHANSPEC_BW_20;
+			break;
+	}
+#endif
+
 #ifdef WL_EXT_IAPSTA
 	if (dev->ieee80211_ptr->iftype == NL80211_IFTYPE_AP ||
 			dev->ieee80211_ptr->iftype == NL80211_IFTYPE_P2P_GO) {
@@ -1571,9 +1615,9 @@
 #endif
 	chspec = wl_freq_to_chanspec(center_freq);
 
-	WL_MSG(dev->name, "netdev_ifidx(%d) chan_type(%d) target channel(%s-%d %sMHz)\n",
-		dev->ifindex, channel_type, CHSPEC2BANDSTR(chspec),
-		CHSPEC_CHANNEL(chspec), wf_chspec_to_bw_str(chspec));
+	WL_MSG(dev->name, "netdev_ifidx(%d) chan_width(%d) target channel(%s-%d %sMHz)\n",
+		dev->ifindex, width, CHSPEC2BANDSTR(chspec),
+		CHSPEC_CHANNEL(chspec), WLCWIDTH2STR(band_width));
 
 #ifdef WL_P2P_6G
 	if (!(cfg->p2p_6g_enabled)) {
@@ -1585,22 +1629,6 @@
 #ifdef WL_P2P_6G
 	}
 #endif /* WL_P2P_6G */
-
-#ifdef NOT_YET
-	switch (channel_type) {
-		case NL80211_CHAN_HT40MINUS:
-			/* secondary channel is below the control channel */
-			chspec = CH40MHZ_CHSPEC(CHSPEC_CHANNEL(chspec), WL_CHANSPEC_CTL_SB_UPPER);
-			break;
-		case NL80211_CHAN_HT40PLUS:
-			/* secondary channel is above the control channel */
-			chspec = CH40MHZ_CHSPEC(CHSPEC_CHANNEL(chspec), WL_CHANSPEC_CTL_SB_LOWER);
-			break;
-		default:
-			chspec = CH20MHZ_CHSPEC(CHSPEC_CHANNEL(chspec));
-
-	}
-#endif /* NOT_YET */
 
 #if defined(APSTA_RESTRICTED_CHANNEL)
 	/* Some customer platform used limited number of channels
@@ -1643,7 +1671,18 @@
 	if (err < 0) {
 		WL_ERR(("Failed to get bandwidth information, err=%d\n", err));
 		return err;
+	}  else if (bw < band_width) {
+		WL_ERR(("capability force band_width=0x%X to be 0x%X\n", band_width, bw));
+		band_width = bw;
 	}
+#ifdef HOSTAPD_BW_SUPPORT
+	WL_MSG(dev->name, "hostapd bw(%sMHz) <= chip bw(%sMHz)\n",
+		wf_chspec_to_bw_str(band_width), wf_chspec_to_bw_str(bw));
+#else
+	WL_MSG(dev->name, "hostapd bw(%sMHz) => chip bw(%sMHz)\n",
+		wf_chspec_to_bw_str(band_width), wf_chspec_to_bw_str(bw));
+	band_width = bw;
+#endif
 
 	/* In case of 5G downgrade BW to 80MHz as 160MHz channels falls in DFS */
 	if (CHSPEC_IS5G(chspec) && (bw == WL_CHANSPEC_BW_160)) {
@@ -1651,7 +1690,7 @@
 	}
 set_channel:
 	cur_chspec = wf_create_chspec_from_primary(wf_chspec_primary20_chan(chspec),
-		bw, CHSPEC_BAND(chspec));
+		band_width, CHSPEC_BAND(chspec));
 #ifdef WL_6G_BAND
 	if (cfg->acs_chspec &&
 		CHSPEC_IS6G(cfg->acs_chspec) &&
@@ -3694,8 +3733,8 @@
 			dev->ieee80211_ptr->u.ap.preset_chandef.chan,
 #else
 			dev->ieee80211_ptr->preset_chandef.chan,
-#endif
-			NL80211_CHAN_HT20) < 0)) {
+#endif /* CFG80211_BKPORT_MLO */
+			info->chandef.width) < 0)) {
 		WL_ERR(("Set channel failed \n"));
 		goto fail;
 	}
@@ -3793,7 +3832,7 @@
 		wl_cfg80211_stop_ap(wiphy, dev, 0);
 #else
 		wl_cfg80211_stop_ap(wiphy, dev);
-#endif
+#endif /* CFG80211_BKPORT_MLO */
 		if (dev_role == NL80211_IFTYPE_AP) {
 #ifdef WL_EXT_IAPSTA
 		if (!wl_ext_iapsta_iftype_enabled(dev, WL_IF_TYPE_AP)) {
@@ -3837,7 +3876,7 @@
 	struct net_device *dev
 #if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 19, 2) || defined(CFG80211_BKPORT_MLO)
 	, unsigned int link_id
-#endif
+#endif /* CFG80211_BKPORT_MLO */
 	)
 {
 	int err = 0;
@@ -5246,7 +5285,7 @@
 	cfg80211_ch_switch_notify(dev, &chandef, 0);
 #else
 	cfg80211_ch_switch_notify(dev, &chandef);
-#endif
+#endif /* CFG80211_BKPORT_MLO */
 #elif (LINUX_VERSION_CODE >= KERNEL_VERSION (3, 5, 0) && (LINUX_VERSION_CODE <= (3, 7, 0)))
 	freq = chandef.freq;
 	cfg80211_ch_switch_notify(dev, freq, chandef.chan_type);
diff --git a/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/wl_cfgvif.h b/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/wl_cfgvif.h
index e7daeec..a988547 100644
--- a/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/wl_cfgvif.h
+++ b/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/wl_cfgvif.h
@@ -189,7 +189,12 @@
 s32
 wl_cfg80211_set_channel(struct wiphy *wiphy, struct net_device *dev,
 	struct ieee80211_channel *chan,
-	enum nl80211_channel_type channel_type);
+#if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 6, 0))
+	enum nl80211_channel_type channel_type
+#else
+	enum nl80211_chan_width width
+#endif
+);
 #endif /* ((LINUX_VERSION < VERSION(3, 6, 0)) || WL_COMPAT_WIRELESS */
 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 4, 0)) || \
 	defined(WL_COMPAT_WIRELESS)
@@ -200,7 +205,7 @@
 	unsigned int link_id);
 #else
 extern s32 wl_cfg80211_stop_ap(struct wiphy *wiphy, struct net_device *dev);
-#endif
+#endif /* CFG80211_BKPORT_MLO */
 extern s32 wl_cfg80211_change_beacon(struct wiphy *wiphy, struct net_device *dev,
 	struct cfg80211_beacon_data *info);
 #else
diff --git a/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/wl_escan.c b/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/wl_escan.c
index 01a9e02..6b6b389 100644
--- a/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/wl_escan.c
+++ b/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/wl_escan.c
@@ -886,8 +886,7 @@
 	u8 *scan_params = NULL, *params = NULL;
 	s32 params_size;
 	u32 n_channels = 0;
-	wl_uint32_list_t *list;
-	u8 valid_chan_list[sizeof(u32)*(MAX_CTRL_CHANSPECS + 1)];
+	wl_uint32_list_t *list = NULL;
 
 	mutex_lock(&escan->usr_sync);
 	if (escan->escan_state == ESCAN_STATE_DOWN) {
@@ -920,8 +919,12 @@
 	}
 
 	/* if scan request is not empty parse scan request paramters */
-	memset(valid_chan_list, 0, sizeof(valid_chan_list));
-	list = (wl_uint32_list_t *)(void *) valid_chan_list;
+	list = kzalloc(sizeof(u32)*(MAX_CTRL_CHANSPECS + 1), GFP_KERNEL);
+	if (list == NULL) {
+		ESCAN_ERROR(dev->name, "kzalloc failed\n");
+		err = -ENOMEM;
+		goto exit;
+	}
 
 	if (scan_info->channels.count) {
 		memcpy(list, &scan_info->channels, sizeof(wl_channel_list_t));
@@ -984,6 +987,8 @@
 	}
 	kfree(params);
 exit:
+	if (list)
+		kfree(list);
 	if (unlikely(err)) {
 		wl_escan_reset(escan);
 	}
diff --git a/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/wl_iapsta.c b/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/wl_iapsta.c
index 2afa1c5..c03b497 100644
--- a/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/wl_iapsta.c
+++ b/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/wl_iapsta.c
@@ -154,6 +154,12 @@
 	ENC_TKIPAES
 } encmode_t;
 
+typedef enum MAPSTA_MODE {
+	MCHAN_APSTA_NOT_ALLOW = 0,
+	MCHAN_APSTA_SBSC,
+	MCHAN_APSTA_NO_RESTRICT
+} mapsta_mode_t;
+
 #ifdef STA_MGMT
 typedef struct wl_sta_info {
 	int ifidx;
@@ -270,12 +276,13 @@
 #endif /* WL_EXT_RECONNECT && WL_CFG80211 */
 } wl_if_info_t;
 
+u8 *g_ioctl_buf = NULL;
+
 typedef struct wl_apsta_params {
 	struct wl_if_info if_info[MAX_IF_NUM];
 #ifdef WLDWDS
 	struct wl_dwds_info dwds_info[MAX_DWDS_IF_NUM];
 #endif /* WLDWDS */
-	u8 *ioctl_buf;
 	bool init;
 	int rsdb;
 	bool vsdb;
@@ -1933,6 +1940,7 @@
 			if (!auto_chan) {
 				auto_chan = wl_ext_autochannel(cur_if->dev, ACS_FW_BIT|ACS_DRV_BIT,
 					cur_chan_info->band);
+				auto_chan = wf_chspec_ctlchan(auto_chan);
 			}
 			if (auto_chan)
 				cur_chan_info->chan = auto_chan;
@@ -1954,6 +1962,7 @@
 			if (!auto_chan) {
 				auto_chan = wl_ext_autochannel(cur_if->dev, ACS_FW_BIT|ACS_DRV_BIT,
 					cur_chan_info->band);
+				auto_chan = wf_chspec_ctlchan(auto_chan);
 			}
 			if (auto_chan) {
 				cur_chan_info->chan = auto_chan;
@@ -1967,6 +1976,7 @@
 			} else {
 				auto_chan = wl_ext_autochannel(cur_if->dev, ACS_FW_BIT|ACS_DRV_BIT,
 					cur_chan_info->band);
+				auto_chan = wf_chspec_ctlchan(auto_chan);
 				if (auto_chan) {
 					cur_chan_info->chan = auto_chan;
 				}
@@ -2005,6 +2015,7 @@
 			if (!auto_chan) {
 				auto_chan = wl_ext_autochannel(tgt_if->dev, ACS_FW_BIT|ACS_DRV_BIT,
 					tgt_chan_info->band);
+				auto_chan = wf_chspec_ctlchan(auto_chan);
 			}
 			if (auto_chan) {
 				tgt_chan_info->chan = auto_chan;
@@ -2017,6 +2028,7 @@
 				if (!auto_chan) {
 					auto_chan = wl_ext_autochannel(tgt_if->dev, ACS_FW_BIT|ACS_DRV_BIT,
 						tgt_chan_info->band);
+					auto_chan = wf_chspec_ctlchan(auto_chan);
 				}
 			} else {
 				tgt_chan_info->chan = 0;
@@ -2488,6 +2500,7 @@
 		if (wl_ext_master_if(cur_if) && apsta_params->acs) {
 			chan_info->chan = wl_ext_autochannel(cur_if->dev, apsta_params->acs,
 				chan_info->band);
+			chan_info->chan = wf_chspec_ctlchan(chan_info->chan);
 		}
 		chan_info->chan = wl_ext_move_cur_channel(apsta_params, cur_if);
 		if (chan_info->chan) {
@@ -4289,7 +4302,8 @@
 			}
 		}
 	} else {
-		WL_ERR(("Unknown auth_alg=%d or auth_seq=%d\n", auth_alg, auth_seq));
+		IAPSTA_ERROR(dev->name, "Unknown auth_alg=%d or auth_seq=%d\n",
+			auth_alg, auth_seq);
 	}
 
 	return;
@@ -4395,16 +4409,11 @@
 static void
 wl_ampdu_dump(struct net_device *dev)
 {
-	struct dhd_pub *dhd = dhd_get_pub(dev);
-	struct wl_apsta_params *apsta_params = dhd->iapsta_params;
-	char *ioctl_buf = apsta_params->ioctl_buf, *buf = NULL;
+	char *ioctl_buf = g_ioctl_buf, *buf = NULL;
 	char *tx_pch_start, *tx_pch_end, *rx_pch_start, *rx_pch_end;
 	int ret = 0, max_len, tx_len, rx_len;
 
 	if (!(android_msg_level & ANDROID_AMPDU_LEVEL))
-		return;
-
-	if (!ioctl_buf)
 		return;
 
 	memset(ioctl_buf, 0, WL_DUMP_BUF_LEN);
@@ -4470,11 +4479,9 @@
 static void
 wl_tvpm_dump(struct net_device *dev)
 {
-	struct dhd_pub *dhd = dhd_get_pub(dev);
-	struct wl_apsta_params *apsta_params = dhd->iapsta_params;
 	wl_tvpm_req_t* tvpm_req = NULL;
 	size_t reqlen = sizeof(wl_tvpm_req_t) + sizeof(wl_tvpm_status_t);
-	uint8 *outbuf = apsta_params->ioctl_buf;
+	uint8 *outbuf = g_ioctl_buf;
 	size_t outlen = WLC_IOCTL_MEDLEN;
 	wl_tvpm_status_t* status;
 	int ret, phy_temp = 0;
@@ -4545,6 +4552,8 @@
 			wldev_ioctl(dev, WLC_GET_RSSI, &scb_val, sizeof(scb_val_t), 0);
 			rssi_ant_p->count = 1;
 			rssi_ant_p->rssi_ant[0] = dtoh32(scb_val.val);
+		} else {
+			rssi_ant_p->count = 0;
 		}
 	}
 	for (i=0; i<rssi_ant_p->count && rssi_ant_p->rssi_ant[i]; i++) {
@@ -4570,9 +4579,7 @@
 static void
 wl_sta_info_dump(struct net_device *dev, struct ether_addr *mac)
 {
-	struct dhd_pub *dhd = dhd_get_pub(dev);
-	struct wl_apsta_params *apsta_params = dhd->iapsta_params;
-	void *buf = apsta_params->ioctl_buf;
+	void *buf = g_ioctl_buf;
 	sta_info_v4_t *sta = NULL;
 	char rssi_buf[16];
 	int ret;
@@ -4723,7 +4730,7 @@
 			tmp_if = &apsta_params->if_info[i];
 			if (tmp_if->dev &&
 					(tmp_if->ifmode == ISTA_MODE || tmp_if->ifmode == IGC_MODE) &&
-					wl_ext_associated(tmp_if->dev)) {
+					wl_get_isam_status(tmp_if, STA_CONNECTED)) {
 				wl_tput_monitor(dhd, tmp_if->ifidx, &tmp_if->tput_info);
 				monitor_if[i] = TRUE;
 			}
@@ -5112,7 +5119,7 @@
 {
 	struct dhd_pub *dhd = dhd_get_pub(cur_if->dev);
 	struct wl_apsta_params *apsta_params = dhd->iapsta_params;
-	char *iovar_buf = apsta_params->ioctl_buf;
+	char *iovar_buf = g_ioctl_buf;
 	uint32 corerev = 0;
 	wl_cnt_info_t *cntinfo;
 	uint16 ver;
@@ -5971,6 +5978,7 @@
 				(chan_5g && cur_if->chan_info.band == WLC_BAND_5G)) {
 			cur_if->chan_info.chan = wl_ext_autochannel(cur_if->dev, apsta_params->acs,
 				cur_if->chan_info.band);
+			cur_if->chan_info.chan = wf_chspec_ctlchan(cur_if->chan_info.chan);
 		} else {
 			IAPSTA_ERROR(ifname, "invalid channel\n");
 			ret = -1;
@@ -6688,6 +6696,28 @@
 }
 
 static void
+wl_ext_iapsta_get_mapsta_mode(struct net_device *net)
+{
+	struct dhd_pub *dhd = dhd_get_pub(net);
+	struct wl_apsta_params *apsta_params = dhd->iapsta_params;
+	int ret, mapsta_mode;
+
+	ret = wldev_iovar_getint(net, "mapsta_mode", &mapsta_mode);
+	if (ret) {
+		IAPSTA_INFO(net->name, "not supported %d\n", ret);
+		mapsta_mode = MCHAN_APSTA_NOT_ALLOW;
+	}
+
+	if (mapsta_mode == MCHAN_APSTA_SBSC)
+		apsta_params->rsdb = 1;
+	else if (mapsta_mode == MCHAN_APSTA_NO_RESTRICT)
+		apsta_params->vsdb = TRUE;
+
+	IAPSTA_INFO(net->name, "mapsta_mode=%d(rsdb=%d, vsdb=%d)\n",
+		mapsta_mode, apsta_params->rsdb, apsta_params->vsdb);
+}
+
+static void
 wl_ext_iapsta_postinit(struct net_device *net, struct wl_if_info *cur_if)
 {
 	struct dhd_pub *dhd = dhd_get_pub(net);
@@ -6698,6 +6728,7 @@
 	if (cur_if->ifidx == 0) {
 		apsta_params->rsdb = wl_ext_iapsta_get_rsdb(net, dhd);
 		apsta_params->vsdb = FALSE;
+		wl_ext_iapsta_get_mapsta_mode(net);
 		apsta_params->csa = 0;
 		apsta_params->acs = 0;
 		apsta_params->radar = wl_ext_radar_detect(net);
@@ -6873,12 +6904,6 @@
 	struct dhd_pub *dhd = dhd_get_pub(net);
 	struct wl_apsta_params *apsta_params = dhd->iapsta_params;
 
-	if (!apsta_params->ioctl_buf) {
-		apsta_params->ioctl_buf = kmalloc(WL_DUMP_BUF_LEN, GFP_KERNEL);
-		if (unlikely(!apsta_params->ioctl_buf)) {
-			IAPSTA_ERROR(net->name, "Can not allocate ioctl_buf\n");
-		}
-	}
 	init_waitqueue_head(&apsta_params->netif_change_event);
 	mutex_init(&apsta_params->usr_sync);
 	mutex_init(&apsta_params->in4way_sync);
@@ -6896,10 +6921,6 @@
 	struct dhd_pub *dhd = dhd_get_pub(net);
 	struct wl_apsta_params *apsta_params = dhd->iapsta_params;
 
-	if (apsta_params->ioctl_buf) {
-		kfree(apsta_params->ioctl_buf);
-		apsta_params->ioctl_buf = NULL;
-	}
 	memset(apsta_params, 0, sizeof(struct wl_apsta_params));
 }
 
@@ -7028,24 +7049,6 @@
 	return 0;
 }
 
-int
-wl_ext_iapsta_attach(struct net_device *net)
-{
-	struct dhd_pub *dhd = dhd_get_pub(net);
-	struct wl_apsta_params *iapsta_params;
-
-	IAPSTA_TRACE(net->name, "Enter\n");
-
-	iapsta_params = kzalloc(sizeof(struct wl_apsta_params), GFP_KERNEL);
-	if (unlikely(!iapsta_params)) {
-		IAPSTA_ERROR(net->name, "Can not allocate apsta_params\n");
-		return -ENOMEM;
-	}
-	dhd->iapsta_params = (void *)iapsta_params;
-
-	return 0;
-}
-
 void
 wl_ext_iapsta_dettach(struct net_device *net)
 {
@@ -7053,10 +7056,47 @@
 
 	IAPSTA_TRACE(net->name, "Enter\n");
 
+	if (g_ioctl_buf) {
+		kfree(g_ioctl_buf);
+		g_ioctl_buf = NULL;
+	}
+
 	if (dhd->iapsta_params) {
 		wl_ext_iapsta_deinit_priv(net);
 		kfree(dhd->iapsta_params);
 		dhd->iapsta_params = NULL;
 	}
 }
+
+int
+wl_ext_iapsta_attach(struct net_device *net)
+{
+	struct dhd_pub *dhd = dhd_get_pub(net);
+	struct wl_apsta_params *iapsta_params;
+	int ret = 0;
+
+	IAPSTA_TRACE(net->name, "Enter\n");
+
+	iapsta_params = kzalloc(sizeof(struct wl_apsta_params), GFP_KERNEL);
+	if (unlikely(!iapsta_params)) {
+		IAPSTA_ERROR(net->name, "Can not allocate apsta_params\n");
+		ret = -ENOMEM;
+		goto exit;
+	}
+	dhd->iapsta_params = (void *)iapsta_params;
+
+	if (!g_ioctl_buf) {
+		g_ioctl_buf = kmalloc(WL_DUMP_BUF_LEN, GFP_KERNEL);
+		if (unlikely(!g_ioctl_buf)) {
+			IAPSTA_ERROR(net->name, "Can not allocate g_ioctl_buf\n");
+			ret = -ENOMEM;
+			goto exit;
+		}
+	}
+
+exit:
+	if (ret)
+		wl_ext_iapsta_dettach(net);
+	return ret;
+}
 #endif /* WL_EXT_IAPSTA */
diff --git a/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/wl_iw.c b/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/wl_iw.c
index 10e4f34..2497c1f 100644
--- a/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/wl_iw.c
+++ b/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/wl_iw.c
@@ -678,14 +678,16 @@
 	struct dhd_pub *dhd = dhd_get_pub(dev);
 	struct iw_freq *fwrq = &wrqu->freq;
 	int error;
+	u32 val;
 	chanspec_t chanspec = 0;
 	int ctl_chan;
 
 	WL_TRACE(("%s: SIOCGIWFREQ\n", dev->name));
 
 	DHD_CHECK(dhd, dev);
-	if ((error = dev_wlc_intvar_get(dev, "chanspec", (s32 *)&chanspec)))
+	if ((error = dev_wlc_intvar_get(dev, "chanspec", &val)))
 		return error;
+	chanspec = val;
 	chanspec = wl_ext_chspec_driver_to_host(dhd, chanspec);
 	ctl_chan = wf_chspec_ctlchan(chanspec);
 
@@ -1379,7 +1381,8 @@
 	struct dhd_pub *dhd = dhd_get_pub(dev);
 	wlc_ssid_t ssid;
 #ifdef WL_ESCAN
-	wl_scan_info_t scan_info;
+	wl_scan_info_t *scan_info = NULL;
+	int err;
 #else
 	wl_wext_info_t *wext_info = NULL;
 	iscan_info_t *iscan;
@@ -1403,11 +1406,18 @@
 		}
 	}
 #endif
-	memset(&scan_info, 0, sizeof(wl_scan_info_t));
-	scan_info.bcast_ssid = TRUE;
-	memcpy(scan_info.ssid.SSID, ssid.SSID, ssid.SSID_len);
-	scan_info.ssid.SSID_len = ssid.SSID_len;
-	return wl_escan_set_scan(dev, &scan_info);
+	scan_info = kmalloc(sizeof(wl_scan_info_t), GFP_KERNEL);
+	if (scan_info == NULL) {
+		WL_ERROR(("kzalloc failed\n"));
+		return -ENOMEM;
+	}
+	memset(scan_info, 0, sizeof(wl_scan_info_t));
+	scan_info->bcast_ssid = TRUE;
+	memcpy(scan_info->ssid.SSID, ssid.SSID, ssid.SSID_len);
+	scan_info->ssid.SSID_len = ssid.SSID_len;
+	err = wl_escan_set_scan(dev, scan_info);
+	kfree(scan_info);
+	return err;
 #else
 	wext_info = dhd->wext_info;
 	iscan = &wext_info->iscan;
diff --git a/kernel/drivers/net/wireless/rockchip_wlan/uwe5621ds/unisocwcn/platform/wcn_boot.c b/kernel/drivers/net/wireless/rockchip_wlan/uwe5621ds/unisocwcn/platform/wcn_boot.c
index 54f8312..67d3ebc 100644
--- a/kernel/drivers/net/wireless/rockchip_wlan/uwe5621ds/unisocwcn/platform/wcn_boot.c
+++ b/kernel/drivers/net/wireless/rockchip_wlan/uwe5621ds/unisocwcn/platform/wcn_boot.c
@@ -17,11 +17,13 @@
 #include <linux/firmware.h>
 #include <linux/file.h>
 #include <linux/kernel.h>
+#include <linux/input.h>
 #include <linux/module.h>
 #include <linux/mfd/syscon.h>
 #include <linux/of_gpio.h>
 #include <linux/of_device.h>
 #include <linux/platform_device.h>
+#include <linux/proc_fs.h>
 #include <linux/regulator/consumer.h>
 #include <linux/regmap.h>
 #include <linux/slab.h>
@@ -430,6 +432,14 @@
  * 0x5663000x: Marlin3E series
  * 0: read chipid fail or not unisoc module
  */
+
+#ifdef CONFIG_RK_BOARD
+#define PROC_DIR "bluetooth/sleep"
+static struct proc_dir_entry *bluetooth_dir, *sleep_dir;
+static struct input_dev *power_key_dev;
+static unsigned char enable_power_key = 0;
+#endif
+
 #define WCN_CHIPID_MASK (0xFFFFF000)
 unsigned int marlin_get_wcn_chipid(void)
 {
@@ -1418,12 +1428,111 @@
 	disable_irq(marlin_dev->bt_wake_host_int_num);
 }
 
+#if defined CONFIG_RK_BOARD
+static int rkbt_power_key_up(void)
+{
+	if (!power_key_dev)
+		return -ENODEV;
+	input_report_key(power_key_dev, KEY_POWER, 1);
+	input_sync(power_key_dev);
+	msleep(20);
+	input_report_key(power_key_dev, KEY_POWER, 0);
+	input_sync(power_key_dev);
+
+	return 0;
+}
+
+static irqreturn_t rkbt_wake_host_irq_thread(int irq, void *dev)
+{
+	rkbt_power_key_up();
+
+	return IRQ_HANDLED;
+}
+
+static ssize_t bluesleep_read_proc_powerupkey(struct file *file,
+					      char __user *buffer, size_t count,
+					      loff_t *data)
+{
+	char src[2];
+
+	if (*data >= 1)
+		return 0;
+
+	src[0] = enable_power_key ? '1' : '0';
+	src[1] = '\n';
+	if (copy_to_user(buffer, src, 2))
+		return -EFAULT;
+	*data = 1;
+
+	return 2;
+}
+
+static ssize_t bluesleep_write_proc_powerupkey(struct file *file,
+					       const char __user *buffer,
+					       size_t count, loff_t *data)
+{
+	char b;
+
+	if (count < 1)
+		return -EINVAL;
+
+	if (copy_from_user(&b, buffer, 1))
+		return -EFAULT;
+
+	if (b != '0')
+		enable_power_key = 1;
+	else
+		enable_power_key = 0;
+
+	return count;
+}
+
+static const struct file_operations bluesleep_powerupkey = {
+	.owner = THIS_MODULE,
+	.read = bluesleep_read_proc_powerupkey,
+	.write = bluesleep_write_proc_powerupkey,
+};
+
+static int rkbt_register_power_key(void)
+{
+	int ret = 0;
+
+	/* register input device */
+	power_key_dev = input_allocate_device();
+	if (!power_key_dev) {
+		WCN_ERR("ir_dev: not enough memory for input device\n");
+		return -ENOMEM;
+	}
+
+	power_key_dev->name = "bt-powerkey";
+	power_key_dev->id.bustype = BUS_HOST;
+
+	power_key_dev->evbit[0] = BIT_MASK(EV_KEY);
+	set_bit(KEY_POWER, power_key_dev->keybit);
+
+	ret = input_register_device(power_key_dev);
+	if (ret) {
+		input_free_device(power_key_dev);
+		WCN_ERR("ir_rx_init: register input device exception, exit\n");
+		return -EBUSY;
+	}
+
+	return ret;
+}
+#endif
+
 static irqreturn_t marlin_bt_wake_int_isr(int irq, void *para)
 {
 	static int bt_wake_cnt;
 
 	bt_wake_cnt++;
 	WCN_DEBUG("bt_wake_irq_cnt %d\n", bt_wake_cnt);
+
+	#if defined CONFIG_RK_BOARD
+	if (enable_power_key)
+		return IRQ_WAKE_THREAD;
+	#endif
+
 	return IRQ_HANDLED;
 }
 
@@ -1466,12 +1575,22 @@
 		return ret;
 	}
 
+	#if defined CONFIG_RK_BOARD
+	ret = request_threaded_irq(marlin_dev->bt_wake_host_int_num,
+			  marlin_bt_wake_int_isr,
+			  rkbt_wake_host_irq_thread,
+			  IRQF_ONESHOT | IRQF_TRIGGER_RISING |
+			  IRQF_NO_SUSPEND,
+			  "bt_wake_isr",
+			  NULL);
+	#else
 	ret = request_irq(marlin_dev->bt_wake_host_int_num,
 			  marlin_bt_wake_int_isr,
 			  IRQF_TRIGGER_RISING |
 			  IRQF_NO_SUSPEND,
 			  "bt_wake_isr",
 			  NULL);
+	#endif
 	if (ret != 0) {
 		WCN_ERR("req bt_hostwake irq-%d err! ret=%d",
 			marlin_dev->bt_wake_host_int_num, ret);
@@ -3971,6 +4090,9 @@
 static void marlin_reset_notify_init(void);
 static int marlin_probe(struct platform_device *pdev)
 {
+#if defined CONFIG_RK_BOARD
+	struct proc_dir_entry *ent;
+#endif
 #ifdef CONFIG_WCN_PMIC
 	struct device_node *regmap_np;
 	struct platform_device *pdev_regmap = NULL;
@@ -4074,13 +4196,44 @@
 	marlin_dev->marlin_probe_status = 1;
 #endif
 
-	WCN_INFO("marlin_probe ok!\n");
+#if defined CONFIG_RK_BOARD
+	bluetooth_dir = proc_mkdir("bluetooth", NULL);
+	if (!bluetooth_dir) {
+		WCN_ERR("Unable to create /proc/bluetooth directory");
+		return -ENOMEM;
+	}
 
+	sleep_dir = proc_mkdir("sleep", bluetooth_dir);
+	if (!sleep_dir) {
+		WCN_ERR("Unable to create /proc/%s directory", PROC_DIR);
+		return -ENOMEM;
+	}
+
+	/* read/write proc entries */
+	ent = proc_create("powerupkey", 0, sleep_dir, &bluesleep_powerupkey);
+	if (!ent) {
+		WCN_ERR("Unable to create /proc/%s/powerupkey entry", PROC_DIR);
+		remove_proc_entry("powerupkey", sleep_dir);
+		return -ENOMEM;
+	}
+
+	if (rkbt_register_power_key() != 0) {
+		WCN_ERR("Unable to register power_key");
+		return -EBUSY;
+	}
+#endif
+
+	WCN_INFO("marlin_probe ok!\n");
 	return 0;
 }
 
 static int  marlin_remove(struct platform_device *pdev)
 {
+#if defined CONFIG_RK_BOARD
+	input_unregister_device(power_key_dev);
+	remove_proc_entry("powerupkey", sleep_dir);
+#endif
+
 #if (defined(CONFIG_BT_WAKE_HOST_EN) && defined(CONFIG_AW_BOARD)) \
 	|| defined(CONFIG_RK_BOARD)
 	marlin_unregistsr_bt_wake();
diff --git a/kernel/drivers/net/wireless/rockchip_wlan/uwe5621ds/unisocwifi/Makefile b/kernel/drivers/net/wireless/rockchip_wlan/uwe5621ds/unisocwifi/Makefile
index a19f92b..8f703ec 100644
--- a/kernel/drivers/net/wireless/rockchip_wlan/uwe5621ds/unisocwifi/Makefile
+++ b/kernel/drivers/net/wireless/rockchip_wlan/uwe5621ds/unisocwifi/Makefile
@@ -53,7 +53,7 @@
 #ccflags-y += -DTCP_ACK_DROP_SUPPORT
 ccflags-y += -DWOW_SUPPORT
 #ccflags-y += -DCPUFREQ_UPDATE_SUPPORT
-#ccflags-y += -DCUSTOM_REGDOMAIN
+ccflags-y += -DCUSTOM_REGDOMAIN
 #####module name ###
 obj-m += $(MODULE_NAME).o
 
diff --git a/kernel/drivers/net/wireless/rockchip_wlan/uwe5621ds/unisocwifi/vendor.c b/kernel/drivers/net/wireless/rockchip_wlan/uwe5621ds/unisocwifi/vendor.c
index a1f6f16..0fdd7fe 100644
--- a/kernel/drivers/net/wireless/rockchip_wlan/uwe5621ds/unisocwifi/vendor.c
+++ b/kernel/drivers/net/wireless/rockchip_wlan/uwe5621ds/unisocwifi/vendor.c
@@ -26,7 +26,7 @@
 #endif /* RTT_SUPPORT */
 
 #define VENDOR_SCAN_RESULT_EXPIRE	(7 * HZ)
-#define WIFI_SUBCMD_SET_COUNTRY_CODE  0x0006
+#define WIFI_SUBCMD_SET_COUNTRY_CODE  0x100E
 
 #if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 14, 0)
 static const u8 *wpa_scan_get_ie(u8 *res, u8 ie_len, u8 ie)
@@ -874,7 +874,7 @@
 static int sprdwl_vendor_set_country(struct wiphy *wiphy,
 	struct wireless_dev *wdev, const void  *data, int len)
 {
-#define ANDR_WIFI_ATTRIBUTE_COUNTRY 8
+#define ANDR_WIFI_ATTRIBUTE_COUNTRY 4
 	int err = 0, rem, type;
 	char country_code[2] = {0};
 	const struct nlattr *iter;
diff --git a/kernel/drivers/nvmem/rockchip-otp.c b/kernel/drivers/nvmem/rockchip-otp.c
index f6ad074..c7ac716 100644
--- a/kernel/drivers/nvmem/rockchip-otp.c
+++ b/kernel/drivers/nvmem/rockchip-otp.c
@@ -675,6 +675,17 @@
 	.reg_read = px30s_otp_read,
 };
 
+static const char * const rk3528_otp_clocks[] = {
+	"usr", "sbpi", "apb",
+};
+
+static const struct rockchip_data rk3528_data = {
+	.size = 0x80,
+	.clocks = rk3528_otp_clocks,
+	.num_clks = ARRAY_SIZE(rk3528_otp_clocks),
+	.reg_read = rk3568_otp_read,
+};
+
 static const char * const rk3568_otp_clocks[] = {
 	"usr", "sbpi", "apb", "phy",
 };
@@ -716,6 +727,12 @@
 		.data = (void *)&px30_data,
 	},
 #endif
+#ifdef CONFIG_CPU_RK3528
+	{
+		.compatible = "rockchip,rk3528-otp",
+		.data = (void *)&rk3528_data,
+	},
+#endif
 #ifdef CONFIG_CPU_RK3568
 	{
 		.compatible = "rockchip,rk3568-otp",
diff --git a/kernel/drivers/of/base.c b/kernel/drivers/of/base.c
index b28dee2..9a4af2e 100644
--- a/kernel/drivers/of/base.c
+++ b/kernel/drivers/of/base.c
@@ -130,31 +130,34 @@
 /*
  * Caller must hold devtree_lock.
  */
-static void __of_free_phandle_cache(void)
+static struct device_node** __of_free_phandle_cache(void)
 {
 	u32 cache_entries = phandle_cache_mask + 1;
 	u32 k;
+	struct device_node **shadow;
 
 	if (!phandle_cache)
-		return;
+		return NULL;
 
 	for (k = 0; k < cache_entries; k++)
 		of_node_put(phandle_cache[k]);
 
-	kfree(phandle_cache);
+	shadow = phandle_cache;
 	phandle_cache = NULL;
+	return shadow;
 }
 
 int of_free_phandle_cache(void)
 {
 	unsigned long flags;
+	struct device_node **shadow;
 
 	raw_spin_lock_irqsave(&devtree_lock, flags);
 
-	__of_free_phandle_cache();
+	shadow = __of_free_phandle_cache();
 
 	raw_spin_unlock_irqrestore(&devtree_lock, flags);
-
+	kfree(shadow);
 	return 0;
 }
 #if !defined(CONFIG_MODULES)
@@ -189,10 +192,11 @@
 	u32 cache_entries;
 	struct device_node *np;
 	u32 phandles = 0;
+	struct device_node **shadow;
 
 	raw_spin_lock_irqsave(&devtree_lock, flags);
 
-	__of_free_phandle_cache();
+	shadow = __of_free_phandle_cache();
 
 	for_each_of_allnodes(np)
 		if (np->phandle && np->phandle != OF_PHANDLE_ILLEGAL)
@@ -200,12 +204,14 @@
 
 	if (!phandles)
 		goto out;
+	raw_spin_unlock_irqrestore(&devtree_lock, flags);
 
 	cache_entries = roundup_pow_of_two(phandles);
 	phandle_cache_mask = cache_entries - 1;
 
 	phandle_cache = kcalloc(cache_entries, sizeof(*phandle_cache),
 				GFP_ATOMIC);
+	raw_spin_lock_irqsave(&devtree_lock, flags);
 	if (!phandle_cache)
 		goto out;
 
@@ -217,6 +223,7 @@
 
 out:
 	raw_spin_unlock_irqrestore(&devtree_lock, flags);
+	kfree(shadow);
 }
 
 void __init of_core_init(void)
diff --git a/kernel/drivers/pci/controller/dwc/Kconfig b/kernel/drivers/pci/controller/dwc/Kconfig
index d568d06..e7b6441 100644
--- a/kernel/drivers/pci/controller/dwc/Kconfig
+++ b/kernel/drivers/pci/controller/dwc/Kconfig
@@ -106,6 +106,13 @@
 	help
 	  Enables support for the DW PCIe controller in the Rockchip SoC.
 
+config PCIE_RK_THREADED_INIT
+	bool "Threaded initialize Rockchip DW based PCIe controller"
+	depends on PCIE_DW_ROCKCHIP
+	default y
+	help
+	  Enables threaded initialize Rockchip DW based PCIe controller.
+
 config PCI_EXYNOS
 	bool "Samsung Exynos PCIe controller"
 	depends on SOC_EXYNOS5440 || COMPILE_TEST
diff --git a/kernel/drivers/pci/controller/dwc/pcie-designware-host.c b/kernel/drivers/pci/controller/dwc/pcie-designware-host.c
index 0b61d3b..395d72e 100644
--- a/kernel/drivers/pci/controller/dwc/pcie-designware-host.c
+++ b/kernel/drivers/pci/controller/dwc/pcie-designware-host.c
@@ -82,7 +82,7 @@
 	u32 status, num_ctrls;
 	irqreturn_t ret = IRQ_NONE;
 
-	num_ctrls = pp->num_vectors / MAX_MSI_IRQS_PER_CTRL;
+	num_ctrls = DIV_ROUND_UP(pp->num_vectors, MAX_MSI_IRQS_PER_CTRL);
 
 	for (i = 0; i < num_ctrls; i++) {
 		dw_pcie_rd_own_conf(pp, PCIE_MSI_INTR0_STATUS +
@@ -679,7 +679,7 @@
 
 	dw_pcie_setup(pci);
 
-	num_ctrls = pp->num_vectors / MAX_MSI_IRQS_PER_CTRL;
+	num_ctrls = DIV_ROUND_UP(pp->num_vectors, MAX_MSI_IRQS_PER_CTRL);
 
 	/* Initialize IRQ Status array */
 	for (ctrl = 0; ctrl < num_ctrls; ctrl++) {
diff --git a/kernel/drivers/pci/controller/dwc/pcie-dw-dmatest.c b/kernel/drivers/pci/controller/dwc/pcie-dw-dmatest.c
index 79af779..4b0d4d3 100644
--- a/kernel/drivers/pci/controller/dwc/pcie-dw-dmatest.c
+++ b/kernel/drivers/pci/controller/dwc/pcie-dw-dmatest.c
@@ -47,46 +47,16 @@
 module_param(test_dev, uint, 0644);
 MODULE_PARM_DESC(test_dev, "Choose dma_obj device,(default 0)");
 
+static bool is_rc = true;
+module_param_named(is_rc, is_rc, bool, 0644);
+MODULE_PARM_DESC(is_rc, "Test port is rc(default true)");
+
 #define PCIE_DW_MISC_DMATEST_DEV_MAX 5
-
-#define PCIE_DMA_OFFSET			0x380000
-
-#define PCIE_DMA_CTRL_OFF		0x8
-#define PCIE_DMA_WR_ENB			0xc
-#define PCIE_DMA_WR_CTRL_LO		0x200
-#define PCIE_DMA_WR_CTRL_HI		0x204
-#define PCIE_DMA_WR_XFERSIZE		0x208
-#define PCIE_DMA_WR_SAR_PTR_LO		0x20c
-#define PCIE_DMA_WR_SAR_PTR_HI		0x210
-#define PCIE_DMA_WR_DAR_PTR_LO		0x214
-#define PCIE_DMA_WR_DAR_PTR_HI		0x218
-#define PCIE_DMA_WR_WEILO		0x18
-#define PCIE_DMA_WR_WEIHI		0x1c
-#define PCIE_DMA_WR_DOORBELL		0x10
-#define PCIE_DMA_WR_INT_STATUS		0x4c
-#define PCIE_DMA_WR_INT_MASK		0x54
-#define PCIE_DMA_WR_INT_CLEAR		0x58
-
-#define PCIE_DMA_RD_ENB			0x2c
-#define PCIE_DMA_RD_CTRL_LO		0x300
-#define PCIE_DMA_RD_CTRL_HI		0x304
-#define PCIE_DMA_RD_XFERSIZE		0x308
-#define PCIE_DMA_RD_SAR_PTR_LO		0x30c
-#define PCIE_DMA_RD_SAR_PTR_HI		0x310
-#define PCIE_DMA_RD_DAR_PTR_LO		0x314
-#define PCIE_DMA_RD_DAR_PTR_HI		0x318
-#define PCIE_DMA_RD_WEILO		0x38
-#define PCIE_DMA_RD_WEIHI		0x3c
-#define PCIE_DMA_RD_DOORBELL		0x30
-#define PCIE_DMA_RD_INT_STATUS		0xa0
-#define PCIE_DMA_RD_INT_MASK		0xa8
-#define PCIE_DMA_RD_INT_CLEAR		0xac
 
 #define PCIE_DMA_CHANEL_MAX_NUM		2
 
 struct pcie_dw_dmatest_dev {
 	struct dma_trx_obj *obj;
-	struct dw_pcie *pci;
 
 	bool irq_en;
 	struct completion rd_done[PCIE_DMA_CHANEL_MAX_NUM];
@@ -113,66 +83,22 @@
 	dev_info(s_dmatest_dev[test_dev].obj->dev, " is current test_dev\n");
 }
 
-static int rk_pcie_get_dma_status(struct dw_pcie *pci, u8 chn, enum dma_dir dir)
-{
-	union int_status status;
-	union int_clear clears;
-	int ret = 0;
-
-	dev_dbg(pci->dev, "%s %x %x\n", __func__, dw_pcie_readl_dbi(pci, PCIE_DMA_OFFSET + PCIE_DMA_WR_INT_STATUS),
-		dw_pcie_readl_dbi(pci, PCIE_DMA_OFFSET + PCIE_DMA_RD_INT_STATUS));
-
-	if (dir == DMA_TO_BUS) {
-		status.asdword = dw_pcie_readl_dbi(pci, PCIE_DMA_OFFSET + PCIE_DMA_WR_INT_STATUS);
-		if (status.donesta & BIT(chn)) {
-			clears.doneclr = 0x1 << chn;
-			dw_pcie_writel_dbi(pci, PCIE_DMA_OFFSET + PCIE_DMA_WR_INT_CLEAR, clears.asdword);
-			ret = 1;
-		}
-
-		if (status.abortsta & BIT(chn)) {
-			dev_err(pci->dev, "%s, write abort\n", __func__);
-			clears.abortclr = 0x1 << chn;
-			dw_pcie_writel_dbi(pci, PCIE_DMA_OFFSET + PCIE_DMA_WR_INT_CLEAR, clears.asdword);
-			ret = -1;
-		}
-	} else {
-		status.asdword = dw_pcie_readl_dbi(pci, PCIE_DMA_OFFSET + PCIE_DMA_RD_INT_STATUS);
-
-		if (status.donesta & BIT(chn)) {
-			clears.doneclr = 0x1 << chn;
-			dw_pcie_writel_dbi(pci, PCIE_DMA_OFFSET + PCIE_DMA_RD_INT_CLEAR, clears.asdword);
-			ret = 1;
-		}
-
-		if (status.abortsta & BIT(chn)) {
-			dev_err(pci->dev, "%s, read abort %x\n", __func__, status.asdword);
-			clears.abortclr = 0x1 << chn;
-			dw_pcie_writel_dbi(pci, PCIE_DMA_OFFSET + PCIE_DMA_RD_INT_CLEAR, clears.asdword);
-			ret = -1;
-		}
-	}
-
-	return ret;
-}
-
-static int rk_pcie_dma_wait_for_finised(struct dma_trx_obj *obj, struct dw_pcie *pci, struct dma_table *table)
+static int rk_pcie_dma_wait_for_finised(struct dma_trx_obj *obj, struct dma_table *table)
 {
 	int ret;
 
 	do {
-		ret = rk_pcie_get_dma_status(pci, table->chn, table->dir);
+		ret = obj->get_dma_status(obj, table->chn, table->dir);
 	} while (!ret);
 
 	return ret;
 }
 
-static int rk_pcie_dma_frombus(struct pcie_dw_dmatest_dev *dmatest_dev, u32 chn,
-			       u32 local_paddr, u32 bus_paddr, u32 size)
+static int rk_pcie_ep_dma_frombus(struct pcie_dw_dmatest_dev *dmatest_dev, u32 chn,
+				  u32 local_paddr, u32 bus_paddr, u32 size)
 {
 	struct dma_table *table;
 	struct dma_trx_obj *obj = dmatest_dev->obj;
-	struct dw_pcie *pci = dmatest_dev->pci;
 	int ret;
 
 	if (chn >= PCIE_DMA_CHANEL_MAX_NUM)
@@ -202,7 +128,7 @@
 		else if (ret == 0)
 			dev_err(obj->dev, "%s timed out\n", __func__);
 	} else {
-		ret = rk_pcie_dma_wait_for_finised(obj, pci, table);
+		ret = rk_pcie_dma_wait_for_finised(obj, table);
 	}
 	mutex_unlock(&dmatest_dev->rd_lock[chn]);
 
@@ -211,12 +137,11 @@
 	return ret;
 }
 
-static int rk_pcie_dma_tobus(struct pcie_dw_dmatest_dev *dmatest_dev, u32 chn,
-			     u32 bus_paddr, u32 local_paddr, u32 size)
+static int rk_pcie_ep_dma_tobus(struct pcie_dw_dmatest_dev *dmatest_dev, u32 chn,
+				u32 bus_paddr, u32 local_paddr, u32 size)
 {
 	struct dma_table *table;
 	struct dma_trx_obj *obj = dmatest_dev->obj;
-	struct dw_pcie *pci = dmatest_dev->pci;
 	int ret;
 
 	if (chn >= PCIE_DMA_CHANEL_MAX_NUM)
@@ -246,13 +171,25 @@
 		else if (ret == 0)
 			dev_err(obj->dev, "%s timed out\n", __func__);
 	} else {
-		ret = rk_pcie_dma_wait_for_finised(obj, pci, table);
+		ret = rk_pcie_dma_wait_for_finised(obj, table);
 	}
 	mutex_unlock(&dmatest_dev->wr_lock[chn]);
 
 	kfree(table);
 
 	return ret;
+}
+
+static int rk_pcie_rc_dma_frombus(struct pcie_dw_dmatest_dev *dmatest_dev, u32 chn,
+				  u32 local_paddr, u32 bus_paddr, u32 size)
+{
+	return rk_pcie_ep_dma_tobus(dmatest_dev, chn, local_paddr, bus_paddr, size);
+}
+
+static int rk_pcie_rc_dma_tobus(struct pcie_dw_dmatest_dev *dmatest_dev, u32 chn,
+				u32 bus_paddr, u32 local_paddr, u32 size)
+{
+	return rk_pcie_ep_dma_frombus(dmatest_dev, chn, bus_paddr, local_paddr, size);
 }
 
 static int rk_pcie_dma_interrupt_handler_call_back(struct dma_trx_obj *obj, u32 chn, enum dma_dir dir)
@@ -270,23 +207,22 @@
 	return 0;
 }
 
-struct dma_trx_obj *pcie_dw_dmatest_register(struct dw_pcie *pci, bool irq_en)
+struct dma_trx_obj *pcie_dw_dmatest_register(struct device *dev, bool irq_en)
 {
 	struct dma_trx_obj *obj;
 	struct pcie_dw_dmatest_dev *dmatest_dev = &s_dmatest_dev[cur_dmatest_dev];
 	int i;
 
-	obj = devm_kzalloc(pci->dev, sizeof(struct dma_trx_obj), GFP_KERNEL);
+	obj = devm_kzalloc(dev, sizeof(struct dma_trx_obj), GFP_KERNEL);
 	if (!obj)
 		return ERR_PTR(-ENOMEM);
 
-	obj->dev = pci->dev;
+	obj->dev = dev;
 	obj->priv = dmatest_dev;
 	obj->cb = rk_pcie_dma_interrupt_handler_call_back;
 
 	/* Save for dmatest */
 	dmatest_dev->obj = obj;
-	dmatest_dev->pci = pci;
 	for (i = 0; i < PCIE_DMA_CHANEL_MAX_NUM; i++) {
 		init_completion(&dmatest_dev->rd_done[i]);
 		init_completion(&dmatest_dev->wr_done[i]);
@@ -323,13 +259,19 @@
 	start_time = ktime_get();
 	for (i = 0; i < loop; i++) {
 		if (rd_en) {
-			rk_pcie_dma_frombus(dmatest_dev, chn, local_paddr, bus_paddr, size);
+			if (is_rc)
+				rk_pcie_rc_dma_frombus(dmatest_dev, chn, local_paddr, bus_paddr, size);
+			else
+				rk_pcie_ep_dma_frombus(dmatest_dev, chn, local_paddr, bus_paddr, size);
 			dma_sync_single_for_cpu(obj->dev, local_paddr, size, DMA_FROM_DEVICE);
 		}
 
 		if (wr_en) {
 			dma_sync_single_for_device(obj->dev, local_paddr, size, DMA_TO_DEVICE);
-			rk_pcie_dma_tobus(dmatest_dev, chn, bus_paddr, local_paddr, size);
+			if (is_rc)
+				rk_pcie_rc_dma_tobus(dmatest_dev, chn, bus_paddr, local_paddr, size);
+			else
+				rk_pcie_ep_dma_tobus(dmatest_dev, chn, bus_paddr, local_paddr, size);
 		}
 	}
 	end_time = ktime_get();
diff --git a/kernel/drivers/pci/controller/dwc/pcie-dw-dmatest.h b/kernel/drivers/pci/controller/dwc/pcie-dw-dmatest.h
index 524f5b5..cfed7aa 100644
--- a/kernel/drivers/pci/controller/dwc/pcie-dw-dmatest.h
+++ b/kernel/drivers/pci/controller/dwc/pcie-dw-dmatest.h
@@ -5,10 +5,13 @@
 #ifndef __PCIE_DW_DMATEST_H
 #define __PCIE_DW_DMATEST_H
 
+struct dma_trx_obj;
+struct device;
+
 #if IS_ENABLED(CONFIG_PCIE_DW_DMATEST)
-struct dma_trx_obj *pcie_dw_dmatest_register(struct dw_pcie *pci, bool irq_en);
+struct dma_trx_obj *pcie_dw_dmatest_register(struct device *dev, bool irq_en);
 #else
-static inline struct dma_trx_obj *pcie_dw_dmatest_register(struct dw_pcie *pci, bool irq_en)
+static inline struct dma_trx_obj *pcie_dw_dmatest_register(struct device *dev, bool irq_en)
 {
 	return NULL;
 }
diff --git a/kernel/drivers/pci/controller/dwc/pcie-dw-ep-rockchip.c b/kernel/drivers/pci/controller/dwc/pcie-dw-ep-rockchip.c
index 9c6966f..09a5dc9 100644
--- a/kernel/drivers/pci/controller/dwc/pcie-dw-ep-rockchip.c
+++ b/kernel/drivers/pci/controller/dwc/pcie-dw-ep-rockchip.c
@@ -10,6 +10,7 @@
 
 #include <linux/clk.h>
 #include <linux/gpio/consumer.h>
+#include <linux/iopoll.h>
 #include <linux/miscdevice.h>
 #include <linux/mfd/syscon.h>
 #include <linux/module.h>
@@ -81,7 +82,15 @@
 #define PCIE_CLIENT_HOT_RESET_CTRL      0x180
 #define PCIE_CLIENT_LTSSM_STATUS	0x300
 #define PCIE_CLIENT_INTR_MASK		0x24
+#define PCIE_LTSSM_APP_DLY1_EN		BIT(0)
+#define PCIE_LTSSM_APP_DLY2_EN		BIT(1)
+#define PCIE_LTSSM_APP_DLY1_DONE	BIT(2)
+#define PCIE_LTSSM_APP_DLY2_DONE	BIT(3)
 #define PCIE_LTSSM_ENABLE_ENHANCE       BIT(4)
+#define PCIE_CLIENT_MSI_GEN_CON		0x38
+
+#define PCIe_CLIENT_MSI_OBJ_IRQ		0	/* rockchip ep object special irq */
+
 #define PCIE_ELBI_REG_NUM		0x2
 #define PCIE_ELBI_LOCAL_BASE		0x200e00
 
@@ -99,6 +108,11 @@
 
 #define PCIE_DBI_SIZE			0x400000
 
+#define PCIE_EP_OBJ_INFO_DRV_VERSION	0x00000001
+
+#define PCIE_BAR_MAX_NUM		6
+#define PCIE_HOTRESET_TMOUT_US		10000
+
 struct rockchip_pcie {
 	struct dw_pcie			pci;
 	void __iomem			*apb_base;
@@ -113,13 +127,17 @@
 	u32				num_ib_windows;
 	u32				num_ob_windows;
 	phys_addr_t			*outbound_addr;
-	u8				bar_to_atu[6];
-	dma_addr_t			ib_target_address;
-	u32				ib_target_size;
-	void				*ib_target_base;
+	u8				bar_to_atu[PCIE_BAR_MAX_NUM];
+	dma_addr_t			ib_target_address[PCIE_BAR_MAX_NUM];
+	u32				ib_target_size[PCIE_BAR_MAX_NUM];
+	void				*ib_target_base[PCIE_BAR_MAX_NUM];
 	struct dma_trx_obj		*dma_obj;
 	struct fasync_struct		*async;
 	phys_addr_t			dbi_base_physical;
+	struct pcie_ep_obj_info		*obj_info;
+	enum pcie_ep_mmap_resource	cur_mmap_res;
+	struct workqueue_struct		*hot_rst_wq;
+	struct work_struct		hot_rst_work;
 };
 
 struct rockchip_pcie_misc_dev {
@@ -138,6 +156,12 @@
 };
 
 MODULE_DEVICE_TABLE(of, rockchip_pcie_ep_of_match);
+
+static void rockchip_pcie_devmode_update(struct rockchip_pcie *rockchip, int mode, int submode)
+{
+	rockchip->obj_info->devmode.mode = mode;
+	rockchip->obj_info->devmode.submode = submode;
+}
 
 static int rockchip_pcie_readl_apb(struct rockchip_pcie *rockchip, u32 reg)
 {
@@ -186,6 +210,8 @@
 	struct resource *apb_base;
 	struct device_node *mem;
 	struct resource reg;
+	char name[8];
+	int i, idx;
 
 	dbi_base = platform_get_resource_byname(pdev, IORESOURCE_MEM,
 						"pcie-dbi");
@@ -255,22 +281,42 @@
 
 	rockchip->outbound_addr = addr;
 
-	mem = of_parse_phandle(np, "memory-region", 0);
-	if (!mem) {
-		dev_err(dev, "missing \"memory-region\" property\n");
-		return -ENODEV;
+	for (i = 0; i < PCIE_BAR_MAX_NUM; i++) {
+		snprintf(name, sizeof(name), "bar%d", i);
+		idx = of_property_match_string(np, "memory-region-names", name);
+		if (idx < 0)
+			continue;
+
+		mem = of_parse_phandle(np, "memory-region", idx);
+		if (!mem) {
+			dev_err(dev, "missing \"memory-region\" %s property\n", name);
+			return -ENODEV;
+		}
+
+		ret = of_address_to_resource(mem, 0, &reg);
+		if (ret < 0) {
+			dev_err(dev, "missing \"reg\" %s property\n", name);
+			return -ENODEV;
+		}
+
+		rockchip->ib_target_address[i] = reg.start;
+		rockchip->ib_target_size[i] = resource_size(&reg);
+		rockchip->ib_target_base[i] = rockchip_pcie_map_kernel(reg.start,
+							resource_size(&reg));
+		dev_info(dev, "%s: assigned [0x%llx-%llx]\n", name, rockchip->ib_target_address[i],
+			rockchip->ib_target_address[i] + rockchip->ib_target_size[i] - 1);
 	}
 
-	ret = of_address_to_resource(mem, 0, &reg);
-	if (ret < 0) {
-		dev_err(dev, "missing \"reg\" property\n");
+	if (rockchip->ib_target_size[0]) {
+		rockchip->obj_info = (struct pcie_ep_obj_info *)rockchip->ib_target_base[0];
+		memset_io(rockchip->obj_info, 0, sizeof(struct pcie_ep_obj_info));
+		rockchip->obj_info->magic = PCIE_EP_OBJ_INFO_MAGIC;
+		rockchip->obj_info->version = PCIE_EP_OBJ_INFO_DRV_VERSION;
+		rockchip_pcie_devmode_update(rockchip, RKEP_MODE_KERNEL, RKEP_SMODE_INIT);
+	} else {
+		dev_err(dev, "missing bar0 memory region\n");
 		return -ENODEV;
 	}
-
-	rockchip->ib_target_address = reg.start;
-	rockchip->ib_target_size = resource_size(&reg);
-	rockchip->ib_target_base = rockchip_pcie_map_kernel(reg.start,
-						resource_size(&reg));
 
 	return 0;
 }
@@ -485,24 +531,27 @@
 
 	resbar_base = rockchip_pci_find_resbar_capability(rockchip);
 
-	/* Resize BAR0 4M 32bits, BAR2 64M 64bits-pref */
-	bar = 0;
+	/* Resize BAR0 4M 32bits, BAR2 64M 64bits-pref, BAR4 1MB 32bits */
+	bar = BAR_0;
 	dw_pcie_writel_dbi(pci, resbar_base + 0x4 + bar * 0x8, 0xfffff0);
 	dw_pcie_writel_dbi(pci, resbar_base + 0x8 + bar * 0x8, 0x2c0);
-	rockchip_pcie_ep_set_bar_flag(rockchip, BAR_0, PCI_BASE_ADDRESS_MEM_TYPE_32);
+	rockchip_pcie_ep_set_bar_flag(rockchip, bar, PCI_BASE_ADDRESS_MEM_TYPE_32);
 
-	bar = 2;
+	bar = BAR_2;
 	dw_pcie_writel_dbi(pci, resbar_base + 0x4 + bar * 0x8, 0xfffff0);
 	dw_pcie_writel_dbi(pci, resbar_base + 0x8 + bar * 0x8, 0x6c0);
-	rockchip_pcie_ep_set_bar_flag(rockchip, BAR_2,
+	rockchip_pcie_ep_set_bar_flag(rockchip, bar,
 				      PCI_BASE_ADDRESS_MEM_PREFETCH | PCI_BASE_ADDRESS_MEM_TYPE_64);
 
-	/* Disable BAR1 BAR4 BAR5*/
-	bar = 1;
+	bar = BAR_4;
+	dw_pcie_writel_dbi(pci, resbar_base + 0x4 + bar * 0x8, 0xfffff0);
+	dw_pcie_writel_dbi(pci, resbar_base + 0x8 + bar * 0x8, 0xc0);
+	rockchip_pcie_ep_set_bar_flag(rockchip, bar, PCI_BASE_ADDRESS_MEM_TYPE_32);
+
+	/* Disable BAR1 BAR5*/
+	bar = BAR_1;
 	dw_pcie_writel_dbi(pci, PCIE_TYPE0_HDR_DBI2_OFFSET + 0x10 + bar * 4, 0);
-	bar = 4;
-	dw_pcie_writel_dbi(pci, PCIE_TYPE0_HDR_DBI2_OFFSET + 0x10 + bar * 4, 0);
-	bar = 5;
+	bar = BAR_5;
 	dw_pcie_writel_dbi(pci, PCIE_TYPE0_HDR_DBI2_OFFSET + 0x10 + bar * 4, 0);
 }
 
@@ -514,14 +563,13 @@
 	dw_pcie_writew_dbi(pci, PCI_CLASS_DEVICE, 0x0580);
 }
 
-static int rockchip_pcie_ep_set_bar(struct rockchip_pcie *rockchip)
+static int rockchip_pcie_ep_set_bar(struct rockchip_pcie *rockchip, enum pci_barno bar,
+				    dma_addr_t cpu_addr)
 {
 	int ret;
 	u32 free_win;
 	struct dw_pcie *pci = &rockchip->pci;
-	enum pci_barno bar;
 	enum dw_pcie_as_type as_type;
-	dma_addr_t cpu_addr;
 
 	free_win = find_first_zero_bit(rockchip->ib_window_map,
 				       rockchip->num_ib_windows);
@@ -531,8 +579,6 @@
 	}
 
 	as_type = DW_PCIE_AS_MEM;
-	bar = BAR_0;
-	cpu_addr = rockchip->ib_target_address;
 
 	ret = dw_pcie_prog_inbound_atu(pci, free_win, bar, cpu_addr, as_type);
 	if (ret < 0) {
@@ -544,7 +590,6 @@
 	set_bit(free_win, rockchip->ib_window_map);
 
 	return 0;
-
 }
 
 static void rockchip_pcie_fast_link_setup(struct rockchip_pcie *rockchip)
@@ -553,7 +598,8 @@
 
 	/* LTSSM EN ctrl mode */
 	val = rockchip_pcie_readl_apb(rockchip, PCIE_CLIENT_HOT_RESET_CTRL);
-	val |= PCIE_LTSSM_ENABLE_ENHANCE | (PCIE_LTSSM_ENABLE_ENHANCE << 16);
+	val |= (PCIE_LTSSM_ENABLE_ENHANCE | PCIE_LTSSM_APP_DLY2_EN) |
+		((PCIE_LTSSM_ENABLE_ENHANCE | PCIE_LTSSM_APP_DLY2_EN) << 16);
 	rockchip_pcie_writel_apb(rockchip, val, PCIE_CLIENT_HOT_RESET_CTRL);
 }
 
@@ -571,98 +617,117 @@
 static void rockchip_pcie_local_elbi_enable(struct rockchip_pcie *rockchip)
 {
 	int i;
-	u32 dlbi_reg;
+	u32 elbi_reg;
 	struct dw_pcie *pci = &rockchip->pci;
 
 	for (i = 0; i < PCIE_ELBI_REG_NUM; i++) {
-		dlbi_reg = PCIE_ELBI_LOCAL_BASE + PCIE_ELBI_LOCAL_ENABLE_OFF +
+		elbi_reg = PCIE_ELBI_LOCAL_BASE + PCIE_ELBI_LOCAL_ENABLE_OFF +
 			   i * 4;
-		dw_pcie_writel_dbi(pci, dlbi_reg, 0xffff0000);
+		dw_pcie_writel_dbi(pci, elbi_reg, 0xffff0000);
 	}
 }
 
 static void rockchip_pcie_elbi_clear(struct rockchip_pcie *rockchip)
 {
 	int i;
-	u32 dlbi_reg;
+	u32 elbi_reg;
 	struct dw_pcie *pci = &rockchip->pci;
 	u32 val;
 
 	for (i = 0; i < PCIE_ELBI_REG_NUM; i++) {
-		dlbi_reg = PCIE_ELBI_LOCAL_BASE + i * 4;
-		val = dw_pcie_readl_dbi(pci, dlbi_reg);
+		elbi_reg = PCIE_ELBI_LOCAL_BASE + i * 4;
+		val = dw_pcie_readl_dbi(pci, elbi_reg);
 		val <<= 16;
-		dw_pcie_writel_dbi(pci, dlbi_reg, val);
+		dw_pcie_writel_dbi(pci, elbi_reg, val);
 	}
+}
+
+static void rockchip_pcie_raise_msi_irq(struct rockchip_pcie *rockchip, u8 interrupt_num)
+{
+	rockchip_pcie_writel_apb(rockchip, BIT(interrupt_num), PCIE_CLIENT_MSI_GEN_CON);
 }
 
 static irqreturn_t rockchip_pcie_sys_irq_handler(int irq, void *arg)
 {
 	struct rockchip_pcie *rockchip = arg;
 	struct dw_pcie *pci = &rockchip->pci;
-	u32 dlbi_reg;
+	u32 elbi_reg;
 	u32 chn;
-	union int_status status;
+	union int_status wr_status, rd_status;
 	union int_clear clears;
-	u32 reg, val;
+	u32 reg, mask;
+	bool sigio = false;
 
 	/* ELBI helper, only check the valid bits, and discard the rest interrupts */
-	dlbi_reg = dw_pcie_readl_dbi(pci, PCIE_ELBI_LOCAL_BASE + PCIE_ELBI_APP_ELBI_INT_GEN0);
-	if (dlbi_reg & PCIE_ELBI_APP_ELBI_INT_GEN0_SIGIO) {
-		dev_dbg(rockchip->pci.dev, "SIGIO\n");
-		kill_fasync(&rockchip->async, SIGIO, POLL_IN);
+	elbi_reg = dw_pcie_readl_dbi(pci, PCIE_ELBI_LOCAL_BASE + PCIE_ELBI_APP_ELBI_INT_GEN0);
+	if (elbi_reg & PCIE_ELBI_APP_ELBI_INT_GEN0_SIGIO) {
+		sigio = true;
+		rockchip->obj_info->irq_type_ep = OBJ_IRQ_ELBI;
+		rockchip_pcie_elbi_clear(rockchip);
+		goto out;
 	}
 
-	rockchip_pcie_elbi_clear(rockchip);
-
 	/* DMA helper */
-	status.asdword = dw_pcie_readl_dbi(pci, PCIE_DMA_OFFSET +
-					   PCIE_DMA_WR_INT_STATUS);
+	mask = dw_pcie_readl_dbi(pci, PCIE_DMA_OFFSET + PCIE_DMA_WR_INT_MASK);
+	wr_status.asdword = dw_pcie_readl_dbi(pci, PCIE_DMA_OFFSET + PCIE_DMA_WR_INT_STATUS) & (~mask);
+	mask = dw_pcie_readl_dbi(pci, PCIE_DMA_OFFSET + PCIE_DMA_RD_INT_MASK);
+	rd_status.asdword = dw_pcie_readl_dbi(pci, PCIE_DMA_OFFSET + PCIE_DMA_RD_INT_STATUS) & (~mask);
+
 	for (chn = 0; chn < PCIE_DMA_CHANEL_MAX_NUM; chn++) {
-		if (status.donesta & BIT(chn)) {
-			clears.doneclr = 0x1 << chn;
+		if (wr_status.donesta & BIT(chn)) {
+			clears.doneclr = BIT(chn);
 			dw_pcie_writel_dbi(pci, PCIE_DMA_OFFSET +
 					PCIE_DMA_WR_INT_CLEAR, clears.asdword);
 			if (rockchip->dma_obj && rockchip->dma_obj->cb)
 				rockchip->dma_obj->cb(rockchip->dma_obj, chn, DMA_TO_BUS);
 		}
 
-		if (status.abortsta & BIT(chn)) {
+		if (wr_status.abortsta & BIT(chn)) {
 			dev_err(pci->dev, "%s, abort\n", __func__);
-			clears.abortclr = 0x1 << chn;
+			clears.abortclr = BIT(chn);
 			dw_pcie_writel_dbi(pci, PCIE_DMA_OFFSET +
 					PCIE_DMA_WR_INT_CLEAR, clears.asdword);
 		}
 	}
 
-	status.asdword = dw_pcie_readl_dbi(pci, PCIE_DMA_OFFSET +
-					   PCIE_DMA_RD_INT_STATUS);
 	for (chn = 0; chn < PCIE_DMA_CHANEL_MAX_NUM; chn++) {
-		if (status.donesta & BIT(chn)) {
-			clears.doneclr = 0x1 << chn;
+		if (rd_status.donesta & BIT(chn)) {
+			clears.doneclr = BIT(chn);
 			dw_pcie_writel_dbi(pci, PCIE_DMA_OFFSET +
 					PCIE_DMA_RD_INT_CLEAR, clears.asdword);
 			if (rockchip->dma_obj && rockchip->dma_obj->cb)
 				rockchip->dma_obj->cb(rockchip->dma_obj, chn, DMA_FROM_BUS);
 		}
 
-		if (status.abortsta & BIT(chn)) {
+		if (rd_status.abortsta & BIT(chn)) {
 			dev_err(pci->dev, "%s, abort\n", __func__);
-			clears.abortclr = 0x1 << chn;
+			clears.abortclr = BIT(chn);
 			dw_pcie_writel_dbi(pci, PCIE_DMA_OFFSET +
 					PCIE_DMA_RD_INT_CLEAR, clears.asdword);
 		}
 	}
 
-	reg = rockchip_pcie_readl_apb(rockchip, PCIE_CLIENT_INTR_STATUS_MISC);
-	if (reg & BIT(2)) {
-		/* Setup command register */
-		val = dw_pcie_readl_dbi(pci, PCI_COMMAND);
-		val &= 0xffff0000;
-		val |= PCI_COMMAND_IO | PCI_COMMAND_MEMORY |
-		       PCI_COMMAND_MASTER | PCI_COMMAND_SERR;
-		dw_pcie_writel_dbi(pci, PCI_COMMAND, val);
+	if (wr_status.asdword || rd_status.asdword) {
+		rockchip->obj_info->irq_type_rc = OBJ_IRQ_DMA;
+		rockchip->obj_info->dma_status_rc.wr |= wr_status.asdword;
+		rockchip->obj_info->dma_status_rc.rd |= rd_status.asdword;
+		rockchip_pcie_raise_msi_irq(rockchip, PCIe_CLIENT_MSI_OBJ_IRQ);
+
+		rockchip->obj_info->irq_type_ep = OBJ_IRQ_DMA;
+		rockchip->obj_info->dma_status_ep.wr |= wr_status.asdword;
+		rockchip->obj_info->dma_status_ep.rd |= rd_status.asdword;
+		sigio = true;
 	}
+
+out:
+	if (sigio) {
+		dev_dbg(rockchip->pci.dev, "SIGIO\n");
+		kill_fasync(&rockchip->async, SIGIO, POLL_IN);
+	}
+
+	reg = rockchip_pcie_readl_apb(rockchip, PCIE_CLIENT_INTR_STATUS_MISC);
+	if (reg & BIT(2))
+		queue_work(rockchip->hot_rst_wq, &rockchip->hot_rst_work);
 
 	rockchip_pcie_writel_apb(rockchip, reg, PCIE_CLIENT_INTR_STATUS_MISC);
 
@@ -706,7 +771,7 @@
 	if (!rockchip_pcie_udma_enabled(rockchip))
 		return 0;
 
-	rockchip->dma_obj = pcie_dw_dmatest_register(pci, true);
+	rockchip->dma_obj = pcie_dw_dmatest_register(pci->dev, true);
 	if (IS_ERR(rockchip->dma_obj)) {
 		dev_err(rockchip->pci.dev, "failed to prepare dmatest\n");
 		return -EINVAL;
@@ -812,6 +877,73 @@
 	table->start.chnl = table->chn;
 }
 
+static void rockchip_pcie_hot_rst_work(struct work_struct *work)
+{
+	struct rockchip_pcie *rockchip = container_of(work, struct rockchip_pcie, hot_rst_work);
+	u32 status;
+	int ret;
+
+	if (rockchip_pcie_readl_apb(rockchip, PCIE_CLIENT_HOT_RESET_CTRL) & PCIE_LTSSM_APP_DLY2_EN) {
+		ret = readl_poll_timeout(rockchip->apb_base + PCIE_CLIENT_LTSSM_STATUS,
+			 status, ((status & 0x3F) == 0), 100, PCIE_HOTRESET_TMOUT_US);
+		if (ret)
+			dev_err(rockchip->pci.dev, "wait for detect quiet failed!\n");
+
+		rockchip_pcie_writel_apb(rockchip, (PCIE_LTSSM_APP_DLY2_DONE) | ((PCIE_LTSSM_APP_DLY2_DONE) << 16),
+					PCIE_CLIENT_HOT_RESET_CTRL);
+	}
+}
+
+static int rockchip_pcie_get_dma_status(struct dma_trx_obj *obj, u8 chn, enum dma_dir dir)
+{
+	struct rockchip_pcie *rockchip = dev_get_drvdata(obj->dev);
+	struct dw_pcie *pci = &rockchip->pci;
+	union int_status status;
+	union int_clear clears;
+	int ret = 0;
+
+	dev_dbg(pci->dev, "%s %x %x\n", __func__,
+		dw_pcie_readl_dbi(pci, PCIE_DMA_OFFSET + PCIE_DMA_WR_INT_STATUS),
+		dw_pcie_readl_dbi(pci, PCIE_DMA_OFFSET + PCIE_DMA_RD_INT_STATUS));
+
+	if (dir == DMA_TO_BUS) {
+		status.asdword = dw_pcie_readl_dbi(pci, PCIE_DMA_OFFSET + PCIE_DMA_WR_INT_STATUS);
+		if (status.donesta & BIT(chn)) {
+			clears.doneclr = BIT(chn);
+			dw_pcie_writel_dbi(pci, PCIE_DMA_OFFSET +
+					   PCIE_DMA_WR_INT_CLEAR, clears.asdword);
+			ret = 1;
+		}
+
+		if (status.abortsta & BIT(chn)) {
+			dev_err(pci->dev, "%s, write abort\n", __func__);
+			clears.abortclr = BIT(chn);
+			dw_pcie_writel_dbi(pci, PCIE_DMA_OFFSET +
+					   PCIE_DMA_WR_INT_CLEAR, clears.asdword);
+			ret = -1;
+		}
+	} else {
+		status.asdword = dw_pcie_readl_dbi(pci, PCIE_DMA_OFFSET + PCIE_DMA_RD_INT_STATUS);
+
+		if (status.donesta & BIT(chn)) {
+			clears.doneclr = BIT(chn);
+			dw_pcie_writel_dbi(pci, PCIE_DMA_OFFSET +
+					   PCIE_DMA_RD_INT_CLEAR, clears.asdword);
+			ret = 1;
+		}
+
+		if (status.abortsta & BIT(chn)) {
+			dev_err(pci->dev, "%s, read abort %x\n", __func__, status.asdword);
+			clears.abortclr = BIT(chn);
+			dw_pcie_writel_dbi(pci, PCIE_DMA_OFFSET +
+					   PCIE_DMA_RD_INT_CLEAR, clears.asdword);
+			ret = -1;
+		}
+	}
+
+	return ret;
+}
+
 static const struct dw_pcie_ops dw_pcie_ops = {
 	.start_link = rockchip_pcie_start_link,
 	.link_up = rockchip_pcie_link_up,
@@ -847,6 +979,7 @@
 	struct pcie_ep_dma_cache_cfg cfg;
 	void __user *uarg = (void __user *)arg;
 	int i, ret;
+	enum pcie_ep_mmap_resource mmap_res;
 
 	switch (cmd) {
 	case PCIE_DMA_GET_ELBI_DATA:
@@ -885,6 +1018,33 @@
 		dw_pcie_writel_dbi(&rockchip->pci, PCIE_DMA_OFFSET + PCIE_DMA_RD_INT_MASK,
 				   0xffffffff);
 		break;
+	case PCIE_DMA_RAISE_MSI_OBJ_IRQ_USER:
+		rockchip->obj_info->irq_type_rc = OBJ_IRQ_USER;
+		rockchip_pcie_raise_msi_irq(rockchip, PCIe_CLIENT_MSI_OBJ_IRQ);
+		break;
+	case PCIE_EP_GET_USER_INFO:
+		msg.bar0_phys_addr = rockchip->ib_target_address[0];
+
+		ret = copy_to_user(uarg, &msg, sizeof(msg));
+		if (ret) {
+			dev_err(rockchip->pci.dev, "failed to get elbi data\n");
+			return -EFAULT;
+		}
+		break;
+	case PCIE_EP_SET_MMAP_RESOURCE:
+		ret = copy_from_user(&mmap_res, uarg, sizeof(mmap_res));
+		if (ret) {
+			dev_err(rockchip->pci.dev, "failed to get copy from\n");
+			return -EFAULT;
+		}
+
+		if (mmap_res >= PCIE_EP_MMAP_RESOURCE_MAX) {
+			dev_err(rockchip->pci.dev, "mmap index %d is out of number\n", mmap_res);
+			return -EINVAL;
+		}
+
+		rockchip->cur_mmap_res = mmap_res;
+		break;
 	default:
 		break;
 	}
@@ -896,18 +1056,45 @@
 	struct rockchip_pcie *rockchip = (struct rockchip_pcie *)file->private_data;
 	size_t size = vma->vm_end - vma->vm_start;
 	int err;
+	unsigned long addr;
 
-	if (size > PCIE_DBI_SIZE) {
-		dev_warn(rockchip->pci.dev, "mmap size is out of limitation\n");
+	switch (rockchip->cur_mmap_res) {
+	case PCIE_EP_MMAP_RESOURCE_DBI:
+		if (size > PCIE_DBI_SIZE) {
+			dev_warn(rockchip->pci.dev, "dbi mmap size is out of limitation\n");
+			return -EINVAL;
+		}
+		addr = rockchip->dbi_base_physical;
+		break;
+	case PCIE_EP_MMAP_RESOURCE_BAR0:
+		if (size > rockchip->ib_target_size[0]) {
+			dev_warn(rockchip->pci.dev, "bar0 mmap size is out of limitation\n");
+			return -EINVAL;
+		}
+		addr = rockchip->ib_target_address[0];
+		break;
+	case PCIE_EP_MMAP_RESOURCE_BAR2:
+		if (size > rockchip->ib_target_size[2]) {
+			dev_warn(rockchip->pci.dev, "bar2 mmap size is out of limitation\n");
+			return -EINVAL;
+		}
+		addr = rockchip->ib_target_address[2];
+		break;
+	default:
+		dev_err(rockchip->pci.dev, "cur mmap_res %d is unsurreport\n", rockchip->cur_mmap_res);
 		return -EINVAL;
 	}
 
 	vma->vm_flags |= VM_IO;
 	vma->vm_flags |= (VM_DONTEXPAND | VM_DONTDUMP);
-	vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot);
+
+	if (rockchip->cur_mmap_res == PCIE_EP_MMAP_RESOURCE_BAR2)
+		vma->vm_page_prot = pgprot_writecombine(vma->vm_page_prot);
+	else
+		vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot);
 
 	err = remap_pfn_range(vma, vma->vm_start,
-			      __phys_to_pfn(rockchip->dbi_base_physical),
+			      __phys_to_pfn(addr),
 			      size, vma->vm_page_prot);
 	if (err)
 		return -EAGAIN;
@@ -941,13 +1128,13 @@
 
 	ret = misc_register(&pcie_dev->dev);
 	if (ret) {
-		pr_err("pcie: failed to register misc device.\n");
+		dev_err(rockchip->pci.dev, "pcie: failed to register misc device.\n");
 		return ret;
 	}
 
 	pcie_dev->pcie = rockchip;
 
-	pr_info("register misc device pcie-dev\n");
+	dev_info(rockchip->pci.dev, "register misc device pcie_ep\n");
 
 	return 0;
 }
@@ -957,7 +1144,8 @@
 	struct device *dev = &pdev->dev;
 	struct rockchip_pcie *rockchip;
 	int ret;
-	int retry;
+	int retry, i;
+	u32 reg;
 
 	rockchip = devm_kzalloc(dev, sizeof(*rockchip), GFP_KERNEL);
 	if (!rockchip)
@@ -993,8 +1181,10 @@
 		goto disable_regulator;
 
 	if (dw_pcie_link_up(&rockchip->pci)) {
-		pr_info("%s, %d, already linkup\n", __func__, __LINE__);
+		dev_info(dev, "already linkup\n");
 		goto already_linkup;
+	} else {
+		dev_info(dev, "initial\n");
 	}
 
 	ret = rockchip_pcie_phy_init(rockchip);
@@ -1015,6 +1205,27 @@
 	rockchip_pcie_fast_link_setup(rockchip);
 
 	rockchip_pcie_start_link(&rockchip->pci);
+	rockchip_pcie_devmode_update(rockchip, RKEP_MODE_KERNEL, RKEP_SMODE_LNKRDY);
+
+	rockchip->hot_rst_wq = create_singlethread_workqueue("rkep_hot_rst_wq");
+	if (!rockchip->hot_rst_wq) {
+		dev_err(dev, "failed to create hot_rst workqueue\n");
+		ret = -ENOMEM;
+		goto deinit_phy;
+	}
+	INIT_WORK(&rockchip->hot_rst_work, rockchip_pcie_hot_rst_work);
+
+	reg = rockchip_pcie_readl_apb(rockchip, PCIE_CLIENT_INTR_STATUS_MISC);
+	if ((reg & BIT(2)) &&
+	    (rockchip_pcie_readl_apb(rockchip, PCIE_CLIENT_HOT_RESET_CTRL) & PCIE_LTSSM_APP_DLY2_EN)) {
+		rockchip_pcie_writel_apb(rockchip, PCIE_LTSSM_APP_DLY2_DONE | (PCIE_LTSSM_APP_DLY2_DONE << 16),
+					 PCIE_CLIENT_HOT_RESET_CTRL);
+		dev_info(dev, "hot reset ever\n");
+	}
+	rockchip_pcie_writel_apb(rockchip, reg, PCIE_CLIENT_INTR_STATUS_MISC);
+
+	/* Enable client reset or link down interrupt */
+	rockchip_pcie_writel_apb(rockchip, 0x40000, PCIE_CLIENT_INTR_MASK);
 
 	for (retry = 0; retry < 10000; retry++) {
 		if (dw_pcie_link_up(&rockchip->pci)) {
@@ -1042,8 +1253,11 @@
 	}
 
 already_linkup:
+	rockchip_pcie_devmode_update(rockchip, RKEP_MODE_KERNEL, RKEP_SMODE_LNKUP);
 	rockchip->pci.iatu_unroll_enabled = rockchip_pcie_iatu_unroll_enabled(&rockchip->pci);
-	rockchip_pcie_ep_set_bar(rockchip);
+	for (i = 0; i < PCIE_BAR_MAX_NUM; i++)
+		if (rockchip->ib_target_size[i])
+			rockchip_pcie_ep_set_bar(rockchip, i, rockchip->ib_target_address[i]);
 
 	ret = rockchip_pcie_init_dma_trx(rockchip);
 	if (ret) {
@@ -1054,6 +1268,7 @@
 	if (rockchip->dma_obj) {
 		rockchip->dma_obj->start_dma_func = rockchip_pcie_start_dma_dwc;
 		rockchip->dma_obj->config_dma_func = rockchip_pcie_config_dma_dwc;
+		rockchip->dma_obj->get_dma_status = rockchip_pcie_get_dma_status;
 	}
 
 	/* Enable client ELBI interrupt */
@@ -1086,9 +1301,10 @@
 		.of_match_table = rockchip_pcie_ep_of_match,
 		.suppress_bind_attrs = true,
 	},
+	.probe = rockchip_pcie_ep_probe,
 };
 
-module_platform_driver_probe(rk_plat_pcie_driver, rockchip_pcie_ep_probe);
+module_platform_driver(rk_plat_pcie_driver);
 
 MODULE_AUTHOR("Simon Xue <xxm@rock-chips.com>");
 MODULE_DESCRIPTION("RockChip PCIe Controller EP driver");
diff --git a/kernel/drivers/pci/controller/dwc/pcie-dw-rockchip.c b/kernel/drivers/pci/controller/dwc/pcie-dw-rockchip.c
index 0dce4b6..33b6dc3 100644
--- a/kernel/drivers/pci/controller/dwc/pcie-dw-rockchip.c
+++ b/kernel/drivers/pci/controller/dwc/pcie-dw-rockchip.c
@@ -34,6 +34,7 @@
 #include <linux/regmap.h>
 #include <linux/reset.h>
 #include <linux/resource.h>
+#include <linux/rfkill-wlan.h>
 #include <linux/signal.h>
 #include <linux/types.h>
 #include <linux/uaccess.h>
@@ -53,6 +54,8 @@
 	const char *id;
 	struct reset_control *rst;
 };
+
+#define RK_PCIE_DBG			0
 
 #define PCIE_DMA_OFFSET			0x380000
 
@@ -120,7 +123,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
 
 #define PCIE_PHY_LINKUP			BIT(0)
 #define PCIE_DATA_LINKUP		BIT(1)
@@ -147,6 +149,7 @@
 	unsigned int			clk_cnt;
 	struct reset_bulk_data		*rsts;
 	struct gpio_desc		*rst_gpio;
+	struct gpio_desc		*prsnt_gpio;
 	phys_addr_t			mem_start;
 	size_t				mem_size;
 	struct pcie_port		pp;
@@ -154,6 +157,7 @@
 	struct regmap			*pmu_grf;
 	struct dma_trx_obj		*dma_obj;
 	bool				in_suspend;
+	bool                            skip_scan_in_resume;
 	bool				is_rk1808;
 	bool				is_signal_test;
 	bool				bifurcation;
@@ -161,10 +165,12 @@
 	struct irq_domain		*irq_domain;
 	raw_spinlock_t			intx_lock;
 	struct dentry			*debugfs;
+	u32				msi_vector_num;
 };
 
 struct rk_pcie_of_data {
 	enum rk_pcie_device_mode	mode;
+	u32 msi_vector_num;
 };
 
 #define to_rk_pcie(x)	dev_get_drvdata((x)->dev)
@@ -410,8 +416,7 @@
 			return 1;
 	} else {
 		val = rk_pcie_readl_apb(rk_pcie, PCIE_CLIENT_LTSSM_STATUS);
-		if ((val & (RDLH_LINKUP | SMLH_LINKUP)) == 0x30000 &&
-		    (val & GENMASK(5, 0)) == 0x11)
+		if ((val & (RDLH_LINKUP | SMLH_LINKUP)) == 0x30000)
 			return 1;
 	}
 
@@ -453,10 +458,16 @@
 
 static int rk_pcie_establish_link(struct dw_pcie *pci)
 {
-	int retries;
+	int retries, power;
 	struct rk_pcie *rk_pcie = to_rk_pcie(pci);
+	bool std_rc = rk_pcie->mode == RK_PCIE_RC_TYPE && !rk_pcie->dma_obj;
 
-	if (dw_pcie_link_up(pci)) {
+	/*
+	 * For standard RC, even if the link has been setup by firmware,
+	 * we still need to reset link as we need to remove all resource info
+	 * from devices, for instance BAR, as it wasn't assigned by kernel.
+	 */
+	if (dw_pcie_link_up(pci) && !std_rc) {
 		dev_err(pci->dev, "link is already up\n");
 		return 0;
 	}
@@ -472,6 +483,21 @@
 	rk_pcie_enable_ltssm(rk_pcie);
 
 	/*
+	 * In resume routine, function devices' resume function must be late after
+	 * controllers'. Some devices, such as Wi-Fi, need special IO setting before
+	 * finishing training. So there must be timeout here. These kinds of devices
+	 * need rescan devices by its driver when used. So no need to waste time waiting
+	 * for training pass.
+	 */
+	if (rk_pcie->in_suspend && rk_pcie->skip_scan_in_resume) {
+		rfkill_get_wifi_power_state(&power);
+		if (!power) {
+			gpiod_set_value_cansleep(rk_pcie->rst_gpio, 1);
+			return 0;
+		}
+	}
+
+	/*
 	 * PCIe requires the refclk to be stable for 100µs prior to releasing
 	 * PERST and T_PVPERL (Power stable to PERST# inactive) should be a
 	 * minimum of 100ms.  See table 2-4 in section 2.6.2 AC, the PCI Express
@@ -480,6 +506,12 @@
 	 */
 	msleep(1000);
 	gpiod_set_value_cansleep(rk_pcie->rst_gpio, 1);
+
+	/*
+	 * Add this 1ms delay because we observe link is always up stably after it and
+	 * could help us save 20ms for scanning devices.
+	 */
+	 usleep_range(1000, 1100);
 
 	for (retries = 0; retries < 10; retries++) {
 		if (dw_pcie_link_up(pci)) {
@@ -516,7 +548,7 @@
 		return -EINVAL;
 	}
 
-	rk_pcie->dma_obj = pcie_dw_dmatest_register(rk_pcie->pci, true);
+	rk_pcie->dma_obj = pcie_dw_dmatest_register(rk_pcie->pci->dev, true);
 	if (IS_ERR(rk_pcie->dma_obj)) {
 		dev_err(rk_pcie->pci->dev, "failed to prepare dmatest\n");
 		return -EINVAL;
@@ -675,6 +707,14 @@
 	return 0;
 }
 
+static void rk_pcie_msi_set_num_vectors(struct pcie_port *pp)
+{
+	struct dw_pcie *pci = to_dw_pcie_from_pp(pp);
+	struct rk_pcie *rk_pcie = to_rk_pcie(pci);
+
+	pp->num_vectors = rk_pcie->msi_vector_num;
+}
+
 static int rk_pcie_host_init(struct pcie_port *pp)
 {
 	int ret;
@@ -707,6 +747,9 @@
 		if (pp->msi_irq < 0) {
 			dev_info(dev, "use outband MSI support");
 			rk_pcie_host_ops.msi_host_init = rk_pcie_msi_host_init;
+		} else {
+			dev_info(dev, "max MSI vector is %d\n", rk_pcie->msi_vector_num);
+			rk_pcie_host_ops.set_num_vectors = rk_pcie_msi_set_num_vectors;
 		}
 	}
 
@@ -864,6 +907,10 @@
 		dev_err(&pdev->dev, "invalid reset-gpios property in node\n");
 		return PTR_ERR(rk_pcie->rst_gpio);
 	}
+
+	rk_pcie->prsnt_gpio = devm_gpiod_get_optional(&pdev->dev, "prsnt", GPIOD_IN);
+	if (IS_ERR_OR_NULL(rk_pcie->prsnt_gpio))
+		dev_info(&pdev->dev, "invalid prsnt-gpios property in node\n");
 
 	return 0;
 }
@@ -1149,6 +1196,11 @@
 	.mode = RK_PCIE_EP_TYPE,
 };
 
+static const struct rk_pcie_of_data rk3528_pcie_rc_of_data = {
+	.mode = RK_PCIE_RC_TYPE,
+	.msi_vector_num = 8,
+};
+
 static const struct of_device_id rk_pcie_of_match[] = {
 	{
 		.compatible = "rockchip,rk1808-pcie",
@@ -1157,6 +1209,10 @@
 	{
 		.compatible = "rockchip,rk1808-pcie-ep",
 		.data = &rk_pcie_ep_of_data,
+	},
+	{
+		.compatible = "rockchip,rk3528-pcie",
+		.data = &rk3528_pcie_rc_of_data,
 	},
 	{
 		.compatible = "rockchip,rk3568-pcie",
@@ -1529,28 +1585,35 @@
 	enum rk_pcie_device_mode mode;
 	struct device_node *np = pdev->dev.of_node;
 	struct platform_driver *drv = to_platform_driver(dev->driver);
-	u32 val;
+	u32 val = 0;
 	int irq;
 
 	match = of_match_device(rk_pcie_of_match, dev);
-	if (!match)
-		return -EINVAL;
+	if (!match) {
+		ret = -EINVAL;
+		goto release_driver;
+	}
 
 	data = (struct rk_pcie_of_data *)match->data;
 	mode = (enum rk_pcie_device_mode)data->mode;
 
 	rk_pcie = devm_kzalloc(dev, sizeof(*rk_pcie), GFP_KERNEL);
-	if (!rk_pcie)
-		return -ENOMEM;
+	if (!rk_pcie) {
+		ret = -ENOMEM;
+		goto release_driver;
+	}
 
 	pci = devm_kzalloc(dev, sizeof(*pci), GFP_KERNEL);
-	if (!pci)
-		return -ENOMEM;
+	if (!pci) {
+		ret = -ENOMEM;
+		goto release_driver;
+	}
 
 	pci->dev = dev;
 	pci->ops = &dw_pcie_ops;
 
 	rk_pcie->mode = mode;
+	rk_pcie->msi_vector_num = data->msi_vector_num;
 	rk_pcie->pci = pci;
 
 	if (of_device_is_compatible(np, "rockchip,rk1808-pcie") ||
@@ -1565,20 +1628,38 @@
 	ret = rk_pcie_resource_get(pdev, rk_pcie);
 	if (ret) {
 		dev_err(dev, "resource init failed\n");
-		return ret;
+		goto release_driver;
 	}
 
+	if (!IS_ERR_OR_NULL(rk_pcie->prsnt_gpio)) {
+		if (!gpiod_get_value(rk_pcie->prsnt_gpio)) {
+			ret = -ENODEV;
+			goto release_driver;
+		}
+	}
+
+retry_regulator:
 	/* DON'T MOVE ME: must be enable before phy init */
 	rk_pcie->vpcie3v3 = devm_regulator_get_optional(dev, "vpcie3v3");
 	if (IS_ERR(rk_pcie->vpcie3v3)) {
-		if (PTR_ERR(rk_pcie->vpcie3v3) != -ENODEV)
-			return PTR_ERR(rk_pcie->vpcie3v3);
+		if (PTR_ERR(rk_pcie->vpcie3v3) != -ENODEV) {
+			if (IS_ENABLED(CONFIG_PCIE_RK_THREADED_INIT)) {
+				/* Deferred but in threaded context for most 10s */
+				msleep(20);
+				if (++val < 500)
+					goto retry_regulator;
+			}
+
+			ret = PTR_ERR(rk_pcie->vpcie3v3);
+			goto release_driver;
+		}
+
 		dev_info(dev, "no vpcie3v3 regulator found\n");
 	}
 
 	ret = rk_pcie_enable_power(rk_pcie);
 	if (ret)
-		return ret;
+		goto release_driver;
 
 	ret = rk_pcie_phy_init(rk_pcie);
 	if (ret) {
@@ -1589,13 +1670,13 @@
 	ret = rk_pcie_reset_control_release(rk_pcie);
 	if (ret) {
 		dev_err(dev, "reset control init failed\n");
-		goto disable_vpcie3v3;
+		goto disable_phy;
 	}
 
 	ret = rk_pcie_request_sys_irq(rk_pcie, pdev);
 	if (ret) {
 		dev_err(dev, "pcie irq init failed\n");
-		goto disable_vpcie3v3;
+		goto disable_phy;
 	}
 
 	platform_set_drvdata(pdev, rk_pcie);
@@ -1603,7 +1684,7 @@
 	ret = rk_pcie_clk_init(rk_pcie);
 	if (ret) {
 		dev_err(dev, "clock init failed\n");
-		goto disable_vpcie3v3;
+		goto disable_phy;
 	}
 
 	dw_pcie_dbi_ro_wr_en(pci);
@@ -1626,9 +1707,9 @@
 			/* Unmask all legacy interrupt from INTA~INTD  */
 			rk_pcie_writel_apb(rk_pcie, PCIE_CLIENT_INTR_MASK_LEGACY,
 					   UNMASK_ALL_LEGACY_INT);
+		} else {
+			dev_info(dev, "missing legacy IRQ resource\n");
 		}
-
-		dev_info(dev, "missing legacy IRQ resource\n");
 	}
 
 	/* Set PCIe mode */
@@ -1649,6 +1730,10 @@
 		dw_pcie_writel_dbi(pci, PCIE_CAP_LINK_CONTROL2_LINK_STATUS, val);
 		rk_pcie->is_signal_test = true;
 	}
+
+	/* Skip waiting for training to pass in system PM routine */
+	if (device_property_read_bool(dev, "rockchip,skip-scan-in-resume"))
+		rk_pcie->skip_scan_in_resume = true;
 
 	switch (rk_pcie->mode) {
 	case RK_PCIE_RC_TYPE:
@@ -1709,24 +1794,36 @@
 remove_irq_domain:
 	if (rk_pcie->irq_domain)
 		irq_domain_remove(rk_pcie->irq_domain);
+disable_phy:
+	phy_power_off(rk_pcie->phy);
+	phy_exit(rk_pcie->phy);
 deinit_clk:
 	rk_pcie_clk_deinit(rk_pcie);
 disable_vpcie3v3:
 	rk_pcie_disable_power(rk_pcie);
+
+release_driver:
+	if (IS_ENABLED(CONFIG_PCIE_RK_THREADED_INIT))
+		device_release_driver(dev);
 
 	return ret;
 }
 
 static int rk_pcie_probe(struct platform_device *pdev)
 {
-	struct task_struct *tsk;
+	if (IS_ENABLED(CONFIG_PCIE_RK_THREADED_INIT)) {
+		struct task_struct *tsk;
 
-	tsk = kthread_run(rk_pcie_really_probe, pdev, "rk-pcie");
-	if (IS_ERR(tsk)) {
-		dev_err(&pdev->dev, "start rk-pcie thread failed\n");
-		return PTR_ERR(tsk);
+		tsk = kthread_run(rk_pcie_really_probe, pdev, "rk-pcie");
+		if (IS_ERR(tsk)) {
+			dev_err(&pdev->dev, "start rk-pcie thread failed\n");
+			return PTR_ERR(tsk);
+		}
+
+		return 0;
 	}
-	return 0;
+
+	return rk_pcie_really_probe(pdev);
 }
 
 static int __maybe_unused rockchip_dw_pcie_suspend(struct device *dev)
@@ -1749,9 +1846,6 @@
 
 	gpiod_set_value_cansleep(rk_pcie->rst_gpio, 0);
 	ret = rk_pcie_disable_power(rk_pcie);
-
-	if (rk_pcie->pci->pp.msi_irq > 0)
-		dw_pcie_free_msi(&rk_pcie->pci->pp);
 
 	return ret;
 }
@@ -1811,9 +1905,6 @@
 		goto err;
 	}
 
-	if (rk_pcie->pci->pp.msi_irq > 0)
-		dw_pcie_msi_init(&rk_pcie->pci->pp);
-
 	if (std_rc)
 		goto std_rc_done;
 
@@ -1836,6 +1927,9 @@
 			goto err;
 	}
 
+	if (rk_pcie->pci->pp.msi_irq > 0)
+		dw_pcie_msi_init(&rk_pcie->pci->pp);
+
 	return 0;
 err:
 	rk_pcie_disable_power(rk_pcie);
diff --git a/kernel/drivers/pci/controller/rockchip-pcie-dma.h b/kernel/drivers/pci/controller/rockchip-pcie-dma.h
index 8ac55f0..e9da2d0 100644
--- a/kernel/drivers/pci/controller/rockchip-pcie-dma.h
+++ b/kernel/drivers/pci/controller/rockchip-pcie-dma.h
@@ -190,6 +190,7 @@
 	struct pcie_misc_dev		*pcie_dev;
 	void				(*start_dma_func)(struct dma_trx_obj *obj, struct dma_table *table);
 	void				(*config_dma_func)(struct dma_table *table);
+	int				(*get_dma_status)(struct dma_trx_obj *obj, u8 chn, enum dma_dir dir);
 	int				(*cb)(struct dma_trx_obj *obj, u32 chn, enum dma_dir dir);
 	ktime_t				begin;
 	ktime_t				end;
diff --git a/kernel/drivers/pci/switch/switchtec.c b/kernel/drivers/pci/switch/switchtec.c
index 291c007..25d1f96 100644
--- a/kernel/drivers/pci/switch/switchtec.c
+++ b/kernel/drivers/pci/switch/switchtec.c
@@ -43,10 +43,11 @@
 
 	enum mrpc_state state;
 
-	struct completion comp;
+	wait_queue_head_t cmd_comp;
 	struct kref kref;
 	struct list_head list;
 
+	bool cmd_done;
 	u32 cmd;
 	u32 status;
 	u32 return_code;
@@ -68,7 +69,7 @@
 	stuser->stdev = stdev;
 	kref_init(&stuser->kref);
 	INIT_LIST_HEAD(&stuser->list);
-	init_completion(&stuser->comp);
+	init_waitqueue_head(&stuser->cmd_comp);
 	stuser->event_cnt = atomic_read(&stdev->event_cnt);
 
 	dev_dbg(&stdev->dev, "%s: %p\n", __func__, stuser);
@@ -147,7 +148,7 @@
 	kref_get(&stuser->kref);
 	stuser->read_len = sizeof(stuser->data);
 	stuser_set_state(stuser, MRPC_QUEUED);
-	reinit_completion(&stuser->comp);
+	stuser->cmd_done = false;
 	list_add_tail(&stuser->list, &stdev->mrpc_queue);
 
 	mrpc_cmd_submit(stdev);
@@ -184,7 +185,8 @@
 		      stuser->read_len);
 
 out:
-	complete_all(&stuser->comp);
+	stuser->cmd_done = true;
+	wake_up_interruptible(&stuser->cmd_comp);
 	list_del_init(&stuser->list);
 	stuser_put(stuser);
 	stdev->mrpc_busy = 0;
@@ -354,7 +356,7 @@
 		return PTR_ERR(stuser);
 
 	filp->private_data = stuser;
-	nonseekable_open(inode, filp);
+	stream_open(inode, filp);
 
 	dev_dbg(&stdev->dev, "%s: %p\n", __func__, stuser);
 
@@ -454,10 +456,11 @@
 	mutex_unlock(&stdev->mrpc_mutex);
 
 	if (filp->f_flags & O_NONBLOCK) {
-		if (!try_wait_for_completion(&stuser->comp))
+		if (!READ_ONCE(stuser->cmd_done))
 			return -EAGAIN;
 	} else {
-		rc = wait_for_completion_interruptible(&stuser->comp);
+		rc = wait_event_interruptible(stuser->cmd_comp,
+					      stuser->cmd_done);
 		if (rc < 0)
 			return rc;
 	}
@@ -505,7 +508,7 @@
 	struct switchtec_dev *stdev = stuser->stdev;
 	__poll_t ret = 0;
 
-	poll_wait(filp, &stuser->comp.wait, wait);
+	poll_wait(filp, &stuser->cmd_comp, wait);
 	poll_wait(filp, &stdev->event_wq, wait);
 
 	if (lock_mutex_and_test_alive(stdev))
@@ -513,7 +516,7 @@
 
 	mutex_unlock(&stdev->mrpc_mutex);
 
-	if (try_wait_for_completion(&stuser->comp))
+	if (READ_ONCE(stuser->cmd_done))
 		ret |= EPOLLIN | EPOLLRDNORM;
 
 	if (stuser->event_cnt != atomic_read(&stdev->event_cnt))
@@ -1037,7 +1040,8 @@
 
 	/* Wake up and kill any users waiting on an MRPC request */
 	list_for_each_entry_safe(stuser, tmpuser, &stdev->mrpc_queue, list) {
-		complete_all(&stuser->comp);
+		stuser->cmd_done = true;
+		wake_up_interruptible(&stuser->cmd_comp);
 		list_del_init(&stuser->list);
 		stuser_put(stuser);
 	}
diff --git a/kernel/drivers/phy/rockchip/phy-rockchip-inno-hdmi-phy.c b/kernel/drivers/phy/rockchip/phy-rockchip-inno-hdmi-phy.c
index 4bbdc15..23f1e5d 100644
--- a/kernel/drivers/phy/rockchip/phy-rockchip-inno-hdmi-phy.c
+++ b/kernel/drivers/phy/rockchip/phy-rockchip-inno-hdmi-phy.c
@@ -153,7 +153,8 @@
 
 enum inno_hdmi_phy_type {
 	INNO_HDMI_PHY_RK3228,
-	INNO_HDMI_PHY_RK3328
+	INNO_HDMI_PHY_RK3328,
+	INNO_HDMI_PHY_RK3528
 };
 
 struct phy_config {
@@ -287,9 +288,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}
 };
 
@@ -330,6 +335,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, {
@@ -462,6 +491,8 @@
 	else if (inno->plat_data->dev_type == INNO_HDMI_PHY_RK3228 &&
 		 tmdsclock <= 33750000 && inno->efuse_flag)
 		chipversion = 4;
+	else if (inno->plat_data->dev_type == INNO_HDMI_PHY_RK3528)
+		chipversion = 8;
 
 	for (; cfg->tmdsclock != ~0UL; cfg++)
 		if (tmdsclock <= cfg->tmdsclock &&
@@ -631,10 +662,17 @@
 {
 	struct device *dev = inno->dev;
 	struct device_node *np = dev->of_node;
+	struct device_node *clk_np = NULL;
 	struct clk_init_data init = {};
 	struct clk *refclk;
 	const char *parent_name;
 	int ret;
+
+	if (inno->plat_data->dev_type == INNO_HDMI_PHY_RK3528)
+		clk_np = of_get_child_by_name(np, "clk-port");
+
+	if (!clk_np)
+		clk_np = np;
 
 	refclk = devm_clk_get(dev, "refclk");
 	if (IS_ERR(refclk)) {
@@ -651,7 +689,7 @@
 	init.ops = &inno_hdmi_phy_clk_ops;
 
 	/* optional override of the clock name */
-	of_property_read_string(np, "clock-output-names", &init.name);
+	of_property_read_string(clk_np, "clock-output-names", &init.name);
 
 	inno->hw.init = &init;
 
@@ -662,7 +700,7 @@
 		return ret;
 	}
 
-	ret = of_clk_add_provider(np, of_clk_src_simple_get, inno->pclk);
+	ret = of_clk_add_provider(clk_np, of_clk_src_simple_get, inno->pclk);
 	if (ret) {
 		dev_err(dev, "failed to register OF clock provider: %d\n", ret);
 		return ret;
@@ -1078,6 +1116,245 @@
 	return frac;
 }
 
+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;
+
+	/* 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 = 47520000000;
+	do_div(temp, inno->tmdsclock);
+	inno_write(inno, 0xd8, (temp >> 8) & 0xff);
+	inno_write(inno, 0xd9, temp & 0xff);
+
+	/* Power up post PLL */
+	inno_update_bits(inno, 0xaa, 1, 0);
+	/* Power up tmds driver */
+	inno_update_bits(inno, 0xb0, 4, 4);
+	inno_write(inno, 0xb2, 0x0f);
+
+	if (phy_cfg->tmdsclock > 340000000)
+		msleep(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 serializer */
+	inno_write(inno, 0xbe, 0);
+	/* Power off post pll */
+	inno_update_bits(inno, 0xaa, 1, 1);
+	/* Power off rxsense detection circuit */
+	inno_write(inno, 0xcc, 0);
+	/* Power off band gap */
+	inno_update_bits(inno, 0xb0, 4, 0);
+	/* 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);
+
+	/* if phy had been set in uboot, pll is locked */
+	if (inno_read(inno, 0xa9) & BIT(0)) {
+		dev_info(inno->dev, "phy had been powered up\n");
+		inno->phy->power_count = 1;
+	} else {
+		/* manual power down post-PLL */
+		inno_hdmi_phy_rk3528_power_off(inno);
+	}
+}
+
+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;
+		usleep_range(1000, 2000);
+	}
+	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;
+}
+
 static unsigned long
 inno_hdmi_rk3228_phy_pll_recalc_rate(struct inno_hdmi_phy *inno,
 				     unsigned long parent_rate)
@@ -1128,6 +1405,14 @@
 	.recalc_rate = inno_hdmi_rk3328_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,
@@ -1140,12 +1425,21 @@
 	.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 of_device_id inno_hdmi_phy_of_match[] = {
 	{ .compatible = "rockchip,rk3228-hdmi-phy",
 	  .data = &rk3228_hdmi_phy_drv_data
 	},
 	{ .compatible = "rockchip,rk3328-hdmi-phy",
 	  .data = &rk3328_hdmi_phy_drv_data
+	},
+	{ .compatible = "rockchip,rk3528-hdmi-phy",
+	  .data = &rk3528_hdmi_phy_drv_data
 	},
 	{}
 };
@@ -1244,13 +1538,15 @@
 	if (of_get_property(np, "rockchip,phy-table", &val)) {
 		if (val % PHY_TAB_LEN || !val) {
 			dev_err(dev, "Invalid phy cfg table format!\n");
-			return -EINVAL;
+			ret = -EINVAL;
+			goto err_regsmap;
 		}
 
 		phy_config = kmalloc(val, GFP_KERNEL);
 		if (!phy_config) {
 			dev_err(dev, "kmalloc phy table failed\n");
-			return -ENOMEM;
+			ret = -ENOMEM;
+			goto err_regsmap;
 		}
 
 		phy_table_size = val / PHY_TAB_LEN;
@@ -1259,7 +1555,8 @@
 					     GFP_KERNEL);
 		if (!inno->phy_cfg) {
 			kfree(phy_config);
-			return -ENOMEM;
+			ret = -ENOMEM;
+			goto err_regsmap;
 		}
 		of_property_read_u32_array(np, "rockchip,phy-table",
 					   phy_config, val / sizeof(u32));
@@ -1268,7 +1565,7 @@
 						 phy_table_size);
 		if (ret) {
 			kfree(phy_config);
-			return ret;
+			goto err_regsmap;
 		}
 		kfree(phy_config);
 	} else {
diff --git a/kernel/drivers/phy/rockchip/phy-rockchip-inno-usb2.c b/kernel/drivers/phy/rockchip/phy-rockchip-inno-usb2.c
index 207e314..9d6dbbf 100644
--- a/kernel/drivers/phy/rockchip/phy-rockchip-inno-usb2.c
+++ b/kernel/drivers/phy/rockchip/phy-rockchip-inno-usb2.c
@@ -59,6 +59,7 @@
 	PHY_STATE_DISCONNECT	= 1,
 	PHY_STATE_CONNECT	= 2,
 	PHY_STATE_FS_LS_ONLINE	= 4,
+	PHY_STATE_SE1		= 6,
 };
 
 /**
@@ -158,6 +159,7 @@
  * @utmi_ls: utmi linestate state register.
  * @utmi_hstdet: utmi host disconnect register.
  * @vbus_det_en: vbus detect function power down register.
+ * @port_ls_filter_con: set linestate filter time for otg port or host port.
  */
 struct rockchip_usb2phy_port_cfg {
 	struct usb2phy_reg	phy_sus;
@@ -188,6 +190,7 @@
 	struct usb2phy_reg	utmi_ls;
 	struct usb2phy_reg	utmi_hstdet;
 	struct usb2phy_reg	vbus_det_en;
+	struct usb2phy_reg	port_ls_filter_con;
 };
 
 /**
@@ -196,7 +199,9 @@
  * @num_ports: specify how many ports that the phy has.
  * @phy_tuning: phy default parameters tunning.
  * @vbus_detect: vbus voltage level detection function.
- * @clkout_ctl: keep on/turn off output clk of phy.
+ * @clkout_ctl: keep on/turn off output clk of phy via commonon bit.
+ * @clkout_ctl_phy: keep on/turn off output clk of phy via phy inner
+ *		    debug register.
  * @ls_filter_con: set linestate filter time.
  * @chg_det: charger detection registers.
  */
@@ -204,8 +209,11 @@
 	unsigned int	reg;
 	unsigned int	num_ports;
 	int (*phy_tuning)(struct rockchip_usb2phy *);
-	int (*vbus_detect)(struct rockchip_usb2phy *rphy, bool en);
+	int (*vbus_detect)(struct rockchip_usb2phy *rphy,
+			   const struct usb2phy_reg *vbus_det_en,
+			   bool en);
 	struct usb2phy_reg	clkout_ctl;
+	struct usb2phy_reg	clkout_ctl_phy;
 	struct usb2phy_reg	ls_filter_con;
 	const struct rockchip_usb2phy_port_cfg	port_cfgs[USB2PHY_NUM_PORTS];
 	const struct rockchip_chg_det_reg	chg_det;
@@ -253,6 +261,7 @@
 	bool		vbus_always_on;
 	bool		vbus_enabled;
 	bool		bypass_uart_en;
+	bool		dis_u2_susphy;
 	int		bvalid_irq;
 	int		ls_irq;
 	int             id_irq;
@@ -275,9 +284,10 @@
  * @grf: General Register Files regmap.
  * @usbgrf: USB General Register Files regmap.
  * *phy_base: the base address of USB PHY.
- * @clk: clock struct of phy input clk.
+ * @clks: array of phy input clocks.
  * @clk480m: clock struct of phy output clk.
  * @clk_hw: clock struct of phy output clk management.
+ * @num_clks: number of phy input clocks.
  * @chg_state: states involved in USB charger detection.
  * @chg_type: USB charger types.
  * @dcd_retries: The retry count used to track Data contact
@@ -297,9 +307,10 @@
 	struct regmap	*grf;
 	struct regmap	*usbgrf;
 	void __iomem	*phy_base;
-	struct clk	*clk;
+	struct clk_bulk_data	*clks;
 	struct clk	*clk480m;
 	struct clk_hw	clk480m_hw;
+	int		num_clks;
 	enum usb_chg_state	chg_state;
 	enum power_supply_type	chg_type;
 	u8			dcd_retries;
@@ -344,6 +355,29 @@
 	return tmp == reg->enable;
 }
 
+static inline void phy_property_enable(void __iomem *base,
+				    const struct usb2phy_reg *reg, bool en)
+{
+	unsigned int val, tmp;
+
+	val = readl(base + reg->offset);
+	tmp = en ? reg->enable : reg->disable;
+	val &= ~GENMASK(reg->bitend, reg->bitstart);
+	val |= tmp << reg->bitstart;
+	writel(val, base + reg->offset);
+}
+
+static inline bool phy_property_enabled(void __iomem *base,
+				    const struct usb2phy_reg *reg)
+{
+	unsigned int orig, tmp;
+	unsigned int mask = GENMASK(reg->bitend, reg->bitstart);
+
+	orig = readl(base + reg->offset);
+	tmp = (orig & mask) >> reg->bitstart;
+	return tmp == reg->enable;
+}
+
 static int rockchip_usb2phy_clk480m_prepare(struct clk_hw *hw)
 {
 	struct rockchip_usb2phy *rphy =
@@ -352,7 +386,14 @@
 	int ret;
 
 	/* turn on 480m clk output if it is off */
-	if (!property_enabled(base, &rphy->phy_cfg->clkout_ctl)) {
+	if (rphy->phy_cfg->clkout_ctl_phy.enable) {
+		if (!phy_property_enabled(rphy->phy_base, &rphy->phy_cfg->clkout_ctl_phy)) {
+			phy_property_enable(rphy->phy_base, &rphy->phy_cfg->clkout_ctl_phy, true);
+
+			/* waiting for the clk become stable */
+			usleep_range(1200, 1300);
+		}
+	} else if (!property_enabled(base, &rphy->phy_cfg->clkout_ctl)) {
 		ret = property_enable(base, &rphy->phy_cfg->clkout_ctl, true);
 		if (ret)
 			return ret;
@@ -371,7 +412,10 @@
 	struct regmap *base = get_reg_base(rphy);
 
 	/* turn off 480m clk output */
-	property_enable(base, &rphy->phy_cfg->clkout_ctl, false);
+	if (rphy->phy_cfg->clkout_ctl_phy.enable)
+		phy_property_enable(rphy->phy_base, &rphy->phy_cfg->clkout_ctl_phy, false);
+	else
+		property_enable(base, &rphy->phy_cfg->clkout_ctl, false);
 }
 
 static int rockchip_usb2phy_clk480m_prepared(struct clk_hw *hw)
@@ -380,7 +424,10 @@
 		container_of(hw, struct rockchip_usb2phy, clk480m_hw);
 	struct regmap *base = get_reg_base(rphy);
 
-	return property_enabled(base, &rphy->phy_cfg->clkout_ctl);
+	if (rphy->phy_cfg->clkout_ctl_phy.enable)
+		return phy_property_enabled(rphy->phy_base, &rphy->phy_cfg->clkout_ctl_phy);
+	else
+		return property_enabled(base, &rphy->phy_cfg->clkout_ctl);
 }
 
 static unsigned long
@@ -410,6 +457,7 @@
 {
 	struct device_node *node = rphy->dev->of_node;
 	struct clk_init_data init = {};
+	struct clk *refclk = of_clk_get_by_name(node, "phyclk");
 	const char *clk_name;
 	int ret;
 
@@ -420,8 +468,8 @@
 	/* optional override of the clockname */
 	of_property_read_string(node, "clock-output-names", &init.name);
 
-	if (rphy->clk) {
-		clk_name = __clk_get_name(rphy->clk);
+	if (!IS_ERR(refclk)) {
+		clk_name = __clk_get_name(refclk);
 		init.parent_names = &clk_name;
 		init.num_parents = 1;
 	} else {
@@ -855,7 +903,8 @@
 	}
 
 	if (rphy->phy_cfg->vbus_detect)
-		rphy->phy_cfg->vbus_detect(rphy, vbus_det_en);
+		rphy->phy_cfg->vbus_detect(rphy, &rport->port_cfg->vbus_det_en,
+					   vbus_det_en);
 	else
 		ret = property_enable(rphy->grf, &rport->port_cfg->vbus_det_en,
 				      vbus_det_en);
@@ -1029,7 +1078,8 @@
 		rport->state = OTG_STATE_B_IDLE;
 		if (!rport->vbus_attached) {
 			mutex_unlock(&rport->mutex);
-			rockchip_usb2phy_power_off(rport->phy);
+			if (!rport->dis_u2_susphy)
+				rockchip_usb2phy_power_off(rport->phy);
 			mutex_lock(&rport->mutex);
 		}
 		/* fall through */
@@ -1090,7 +1140,8 @@
 			rphy->chg_state = USB_CHG_STATE_UNDEFINED;
 			rphy->chg_type = POWER_SUPPLY_TYPE_UNKNOWN;
 			mutex_unlock(&rport->mutex);
-			rockchip_usb2phy_power_off(rport->phy);
+			if (!rport->dis_u2_susphy)
+				rockchip_usb2phy_power_off(rport->phy);
 			mutex_lock(&rport->mutex);
 		}
 		break;
@@ -1434,6 +1485,15 @@
 			dev_dbg(&rport->phy->dev, "FS/LS online\n");
 		}
 		break;
+	case PHY_STATE_SE1:
+		if (rport->suspended) {
+			dev_dbg(&rport->phy->dev, "linestate is SE1, power on phy\n");
+			mutex_unlock(&rport->mutex);
+			rockchip_usb2phy_power_on(rport->phy);
+			mutex_lock(&rport->mutex);
+			rport->suspended = false;
+		}
+		break;
 	case PHY_STATE_DISCONNECT:
 		if (!rport->suspended) {
 			dev_dbg(&rport->phy->dev, "Disconnected\n");
@@ -1764,6 +1824,11 @@
 	return NOTIFY_DONE;
 }
 
+static void rockchip_otg_wake_lock_destroy(void *data)
+{
+	wake_lock_destroy((struct wake_lock *)(data));
+}
+
 static int rockchip_usb2phy_otg_port_init(struct rockchip_usb2phy *rphy,
 					  struct rockchip_usb2phy_port *rport,
 					  struct device_node *child_np)
@@ -1789,6 +1854,8 @@
 		of_property_read_bool(child_np, "rockchip,vbus-always-on");
 	rport->utmi_avalid =
 		of_property_read_bool(child_np, "rockchip,utmi-avalid");
+	rport->dis_u2_susphy =
+		of_property_read_bool(child_np, "rockchip,dis-u2-susphy");
 
 	/* enter lower power state when suspend */
 	rport->low_power_en =
@@ -1833,6 +1900,11 @@
 		property_enable(base, &rport->port_cfg->bvalid_set, false);
 
 	wake_lock_init(&rport->wakelock, WAKE_LOCK_SUSPEND, "rockchip_otg");
+	ret = devm_add_action_or_reset(rphy->dev, rockchip_otg_wake_lock_destroy,
+				       &rport->wakelock);
+	if (ret)
+		return ret;
+
 	INIT_DELAYED_WORK(&rport->bypass_uart_work,
 			  rockchip_usb_bypass_uart_work);
 	INIT_DELAYED_WORK(&rport->chg_work, rockchip_chg_detect_work);
@@ -1845,7 +1917,7 @@
 					EXTCON_USB_HOST, &rport->event_nb);
 		if (ret) {
 			dev_err(rphy->dev, "register USB HOST notifier failed\n");
-			goto err;
+			return ret;
 		}
 	}
 
@@ -1861,10 +1933,6 @@
 	rport->suspended = true;
 
 	return 0;
-
-err:
-	wake_lock_destroy(&rport->wakelock);
-	return ret;
 }
 
 static int rockchip_usb2phy_probe(struct platform_device *pdev)
@@ -1963,13 +2031,19 @@
 	pm_runtime_enable(dev);
 	pm_runtime_get_sync(dev);
 
-	rphy->clk = of_clk_get_by_name(np, "phyclk");
-	if (!IS_ERR(rphy->clk)) {
-		clk_prepare_enable(rphy->clk);
-	} else {
-		dev_info(&pdev->dev, "no phyclk specified\n");
-		rphy->clk = NULL;
-	}
+	ret = devm_clk_bulk_get_all(dev, &rphy->clks);
+	if (ret == -EPROBE_DEFER)
+		return ret;
+
+	/* Clocks are optional */
+	if (ret < 0)
+		rphy->num_clks = 0;
+	else
+		rphy->num_clks = ret;
+
+	ret = clk_bulk_prepare_enable(rphy->num_clks, rphy->clks);
+	if (ret)
+		return ret;
 
 	if (rphy->phy_cfg->phy_tuning) {
 		ret = rphy->phy_cfg->phy_tuning(rphy);
@@ -2061,10 +2135,8 @@
 disable_clks:
 	pm_runtime_put_sync(dev);
 	pm_runtime_disable(dev);
-	if (rphy->clk) {
-		clk_disable_unprepare(rphy->clk);
-		clk_put(rphy->clk);
-	}
+	clk_bulk_disable_unprepare(rphy->num_clks, rphy->clks);
+
 	return ret;
 }
 
@@ -2305,6 +2377,43 @@
 	return ret;
 }
 
+static int rk3528_usb2phy_tuning(struct rockchip_usb2phy *rphy)
+{
+	u32 reg;
+	int ret = 0;
+
+	/* 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);
+
+	/* Enable otg and host ports phy irq to pmu wakeup source */
+	ret |= regmap_write(rphy->grf, 0x80004, 0x00030003);
+
+	return ret;
+}
+
 static int rk3568_usb2phy_tuning(struct rockchip_usb2phy *rphy)
 {
 	u32 reg;
@@ -2352,18 +2461,20 @@
 	return ret;
 }
 
-static int rk3568_vbus_detect_control(struct rockchip_usb2phy *rphy, bool en)
+static int rockchip_usb2phy_vbus_det_control(struct rockchip_usb2phy *rphy,
+					     const struct usb2phy_reg *vbus_det_en,
+					     bool en)
 {
 	u32 reg;
 
 	if (en) {
-		reg = readl(rphy->phy_base + 0x3c);
+		reg = readl(rphy->phy_base + vbus_det_en->offset);
 		/* Enable vbus voltage level detection function */
-		writel(reg & ~BIT(7), rphy->phy_base + 0x3c);
+		writel(reg & ~BIT(7), rphy->phy_base + vbus_det_en->offset);
 	} else {
-		reg = readl(rphy->phy_base + 0x3c);
+		reg = readl(rphy->phy_base + vbus_det_en->offset);
 		/* Disable vbus voltage level detection function */
-		writel(reg | BIT(7), rphy->phy_base + 0x3c);
+		writel(reg | BIT(7), rphy->phy_base + vbus_det_en->offset);
 	}
 
 	return 0;
@@ -2397,6 +2508,14 @@
 		rport = &rphy->ports[index];
 		if (!rport->phy)
 			continue;
+
+		if (rport->port_cfg->port_ls_filter_con.enable) {
+			ret = regmap_write(rphy->grf,
+					   rport->port_cfg->port_ls_filter_con.offset,
+					   rport->port_cfg->port_ls_filter_con.enable);
+			if (ret)
+				dev_err(rphy->dev, "failed to set port ls filter %d\n", ret);
+		}
 
 		if (rport->port_id == USB2PHY_PORT_OTG &&
 		    (rport->id_irq > 0 || rphy->irq > 0)) {
@@ -2466,6 +2585,14 @@
 		rport = &rphy->ports[index];
 		if (!rport->phy)
 			continue;
+
+		if (rport->port_cfg->port_ls_filter_con.disable) {
+			ret = regmap_write(rphy->grf,
+					   rport->port_cfg->port_ls_filter_con.offset,
+					   rport->port_cfg->port_ls_filter_con.disable);
+			if (ret)
+				dev_err(rphy->dev, "failed to set port ls filter %d\n", ret);
+		}
 
 		if (rport->port_id == USB2PHY_PORT_OTG &&
 		    (rport->id_irq > 0 || rphy->irq > 0)) {
@@ -2988,12 +3115,69 @@
 	{ /* sentinel */ }
 };
 
+static const struct rockchip_usb2phy_cfg rk3528_phy_cfgs[] = {
+	{
+		.reg = 0xffdf0000,
+		.num_ports	= 2,
+		.phy_tuning	= rk3528_usb2phy_tuning,
+		.vbus_detect	= rockchip_usb2phy_vbus_det_control,
+		.clkout_ctl_phy	= { 0x041c, 7, 2, 0, 0x27 },
+		.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 },
+				.bvalid_set	= { 0x6004c, 15, 14, 0, 3 },
+				.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 },
+				.vbus_det_en	= { 0x003c, 7, 7, 0, 1 },
+				.port_ls_filter_con = { 0x60080, 19, 0, 0x30100, 0x20 },
+			},
+			[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 },
+				.port_ls_filter_con = { 0x6009c, 19, 0, 0x30100, 0x20 },
+			}
+		},
+		.chg_det = {
+			.chg_mode	= { 0x6004c, 8, 0, 0, 0x1d7 },
+			.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 rk3568_phy_cfgs[] = {
 	{
 		.reg = 0xfe8a0000,
 		.num_ports	= 2,
 		.phy_tuning	= rk3568_usb2phy_tuning,
-		.vbus_detect	= rk3568_vbus_detect_control,
+		.vbus_detect	= rockchip_usb2phy_vbus_det_control,
 		.clkout_ctl	= { 0x0008, 4, 4, 1, 0 },
 		.ls_filter_con	= { 0x0040, 19, 0, 0x30100, 0x00020 },
 		.port_cfgs	= {
@@ -3020,6 +3204,7 @@
 				.utmi_bvalid	= { 0x00c0, 9, 9, 0, 1 },
 				.utmi_iddig	= { 0x00c0, 6, 6, 0, 1 },
 				.utmi_ls	= { 0x00c0, 5, 4, 0, 1 },
+				.vbus_det_en	= { 0x003c, 7, 7, 0, 1 },
 			},
 			[USB2PHY_PORT_HOST] = {
 				/* Select suspend control from controller */
@@ -3123,6 +3308,7 @@
 	{ .compatible = "rockchip,rk3366-usb2phy", .data = &rk3366_phy_cfgs },
 	{ .compatible = "rockchip,rk3368-usb2phy", .data = &rk3368_phy_cfgs },
 	{ .compatible = "rockchip,rk3399-usb2phy", .data = &rk3399_phy_cfgs },
+	{ .compatible = "rockchip,rk3528-usb2phy", .data = &rk3528_phy_cfgs },
 	{ .compatible = "rockchip,rk3568-usb2phy", .data = &rk3568_phy_cfgs },
 	{ .compatible = "rockchip,rv1108-usb2phy", .data = &rv1108_phy_cfgs },
 	{}
diff --git a/kernel/drivers/phy/rockchip/phy-rockchip-naneng-combphy.c b/kernel/drivers/phy/rockchip/phy-rockchip-naneng-combphy.c
index 0964d3c..d18a886 100644
--- a/kernel/drivers/phy/rockchip/phy-rockchip-naneng-combphy.c
+++ b/kernel/drivers/phy/rockchip/phy-rockchip-naneng-combphy.c
@@ -23,7 +23,7 @@
 struct rockchip_combphy_priv;
 
 struct combphy_reg {
-	u16 offset;
+	u32 offset;
 	u16 bitend;
 	u16 bitstart;
 	u16 disable;
@@ -38,6 +38,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;
@@ -152,7 +153,18 @@
 
 static int rockchip_combphy_usb3_init(struct rockchip_combphy_priv *priv)
 {
+	const struct rockchip_combphy_cfg *phy_cfg = priv->cfg;
 	int ret = 0;
+
+	if (device_property_present(priv->dev, "rockchip,dis-u3otg0-port")) {
+		ret = param_write(priv->pipe_grf, &phy_cfg->grfcfg->u3otg0_port_en,
+				  false);
+		return ret;
+	} else if (device_property_present(priv->dev, "rockchip,dis-u3otg1-port")) {
+		ret = param_write(priv->pipe_grf, &phy_cfg->grfcfg->u3otg1_port_en,
+				  false);
+		return ret;
+	}
 
 	if (priv->cfg->combphy_cfg) {
 		ret = priv->cfg->combphy_cfg(priv);
@@ -409,6 +421,175 @@
 	return PTR_ERR_OR_ZERO(phy_provider);
 }
 
+static int rk3528_combphy_cfg(struct rockchip_combphy_priv *priv)
+{
+	const struct rockchip_combphy_grfcfg *cfg = priv->cfg->grfcfg;
+	struct clk *refclk = NULL;
+	unsigned long rate;
+	int i;
+	u32 val;
+
+	/* Configure PHY reference clock frequency */
+	for (i = 0; i < priv->num_clks; i++) {
+		if (!strncmp(priv->clks[i].id, "refclk", 6)) {
+			refclk = priv->clks[i].clk;
+			break;
+		}
+	}
+
+	if (!refclk) {
+		dev_err(priv->dev, "No refclk found\n");
+		return -EINVAL;
+	}
+
+	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 << 17;
+		writel(val, priv->mmio + 0x200);
+
+		/* Set Rx squelch input filler bandwidth */
+		val = readl(priv->mmio + 0x20c);
+		val &= ~GENMASK(2, 0);
+		val |= 0x06;
+		writel(val, priv->mmio + 0x20c);
+
+		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;
+	}
+
+	rate = clk_get_rate(refclk);
+
+	switch (rate) {
+	case 24000000:
+		param_write(priv->phy_grf, &cfg->pipe_clk_24m, true);
+		if (priv->mode == PHY_TYPE_USB3) {
+			/* Set ssc_cnt[10:0]=00101111101 & 31.5KHz */
+			val = readl(priv->mmio + 0x100);
+			val &= ~GENMASK(10, 0);
+			val |= 0x17d;
+			writel(val, priv->mmio + 0x100);
+		} else if (priv->mode == PHY_TYPE_PCIE) {
+			/* Set ssc_cnt[10:0]=00101111101 & 31.5KHz */
+			val = readl(priv->mmio + 0x100);
+			val &= ~GENMASK(10, 0);
+			val |= 0x17d;
+			writel(val, priv->mmio + 0x100);
+
+			/* tx_trim[14]=1, Enable the counting clock of the rterm detect */
+			val = readl(priv->mmio + 0x218);
+			val |= (1 << 14);
+			writel(val, priv->mmio + 0x218);
+
+			/* 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);
+		}
+		break;
+	case 100000000:
+		param_write(priv->phy_grf, &cfg->pipe_clk_100m, true);
+		if (priv->mode == PHY_TYPE_PCIE) {
+			/* Set ssc_cnt[10:0]=11000110011 & 31.5KHz */
+			val = readl(priv->mmio + 0x100);
+			val &= ~GENMASK(10, 0);
+			val |= 0x633;
+			writel(val, priv->mmio + 0x100);
+
+			/* 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, swing 650mv */
+			val = 0x570804f0;
+			writel(val, priv->mmio + 0x108);
+		}
+		break;
+	default:
+		dev_err(priv->dev, "Unsupported rate: %lu\n", rate);
+		return -EINVAL;
+	}
+
+	if (priv->mode == PHY_TYPE_PCIE) {
+		if (device_property_read_bool(priv->dev, "rockchip,enable-ssc")) {
+			val = readl(priv->mmio + 0x100);
+			val |= BIT(20);
+			writel(val, priv->mmio + 0x100);
+		}
+	}
+
+	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 clk_bulk_data rk3528_clks[] = {
+	{ .id = "refclk" },
+	{ .id = "apbclk" },
+	{ .id = "pipe_clk" },
+};
+
+static const struct rockchip_combphy_cfg rk3528_combphy_cfgs = {
+	.num_clks	= ARRAY_SIZE(rk3528_clks),
+	.clks		= rk3528_clks,
+	.grfcfg		= &rk3528_combphy_grfcfgs,
+	.combphy_cfg	= rk3528_combphy_cfg,
+};
+
 static int rk3568_combphy_cfg(struct rockchip_combphy_priv *priv)
 {
 	const struct rockchip_combphy_grfcfg *cfg = priv->cfg->grfcfg;
@@ -476,6 +657,9 @@
 
 		/* Set PLL KVCO to min and set PLL charge pump current to max */
 		writel(0xf0, priv->mmio + (0xa << 2));
+
+		/* Set Rx squelch input filler bandwidth */
+		writel(0x0e, priv->mmio + (0x14 << 2));
 
 		param_write(priv->phy_grf, &cfg->pipe_sel_usb, true);
 		param_write(priv->phy_grf, &cfg->pipe_txcomp_sel, false);
@@ -635,6 +819,10 @@
 
 static const struct of_device_id rockchip_combphy_of_match[] = {
 	{
+		.compatible = "rockchip,rk3528-naneng-combphy",
+		.data = &rk3528_combphy_cfgs,
+	},
+	{
 		.compatible = "rockchip,rk3568-naneng-combphy",
 		.data = &rk3568_combphy_cfgs,
 	},
diff --git a/kernel/drivers/pinctrl/pinctrl-rockchip.c b/kernel/drivers/pinctrl/pinctrl-rockchip.c
index c742901..939a29c 100644
--- a/kernel/drivers/pinctrl/pinctrl-rockchip.c
+++ b/kernel/drivers/pinctrl/pinctrl-rockchip.c
@@ -725,15 +725,17 @@
 };
 
 static struct rockchip_mux_route_data rv1126_mux_route_data[] = {
-	RK_MUXROUTE_GRF(3, RK_PD2, 1, 0x10260, WRITE_MASK_VAL(0, 0, 0)), /* I2S0_MCLK_M0 */
-	RK_MUXROUTE_GRF(3, RK_PB0, 3, 0x10260, WRITE_MASK_VAL(0, 0, 1)), /* I2S0_MCLK_M1 */
+	RK_MUXROUTE_GRF(3, RK_PD1, 1, 0x10260, WRITE_MASK_VAL(0, 0, 0)), /* I2S0_SCLK_RX_M0 */
+	RK_MUXROUTE_GRF(3, RK_PD0, 1, 0x10260, WRITE_MASK_VAL(0, 0, 0)), /* I2S0_SCLK_TX_M0 */
+	RK_MUXROUTE_GRF(3, RK_PB1, 3, 0x10260, WRITE_MASK_VAL(0, 0, 1)), /* I2S0_SCLK_RX_M1 */
+	RK_MUXROUTE_GRF(3, RK_PA4, 3, 0x10260, WRITE_MASK_VAL(0, 0, 1)), /* I2S0_SCLK_TX_M1 */
 
-	RK_MUXROUTE_GRF(0, RK_PD4, 4, 0x10260, WRITE_MASK_VAL(3, 2, 0)), /* I2S1_MCLK_M0 */
-	RK_MUXROUTE_GRF(1, RK_PD5, 2, 0x10260, WRITE_MASK_VAL(3, 2, 1)), /* I2S1_MCLK_M1 */
-	RK_MUXROUTE_GRF(2, RK_PC7, 6, 0x10260, WRITE_MASK_VAL(3, 2, 2)), /* I2S1_MCLK_M2 */
+	RK_MUXROUTE_GRF(1, RK_PA1, 4, 0x10260, WRITE_MASK_VAL(3, 2, 0)), /* I2S1_SCLK_M0 */
+	RK_MUXROUTE_GRF(1, RK_PD6, 2, 0x10260, WRITE_MASK_VAL(3, 2, 1)), /* I2S1_SCLK_M1 */
+	RK_MUXROUTE_GRF(2, RK_PD1, 6, 0x10260, WRITE_MASK_VAL(3, 2, 2)), /* I2S1_SCLK_M2 */
 
-	RK_MUXROUTE_GRF(1, RK_PD0, 1, 0x10260, WRITE_MASK_VAL(4, 4, 0)), /* I2S2_MCLK_M0 */
-	RK_MUXROUTE_GRF(2, RK_PB3, 2, 0x10260, WRITE_MASK_VAL(4, 4, 1)), /* I2S2_MCLK_M1 */
+	RK_MUXROUTE_GRF(1, RK_PC6, 1, 0x10260, WRITE_MASK_VAL(4, 4, 0)), /* I2S2_SCLK_M0 */
+	RK_MUXROUTE_GRF(2, RK_PB1, 2, 0x10260, WRITE_MASK_VAL(4, 4, 1)), /* I2S2_SCLK_M1 */
 
 	RK_MUXROUTE_GRF(3, RK_PD4, 2, 0x10260, WRITE_MASK_VAL(12, 12, 0)), /* PDM_CLK0_M0 */
 	RK_MUXROUTE_GRF(3, RK_PC0, 3, 0x10260, WRITE_MASK_VAL(12, 12, 1)), /* PDM_CLK0_M1 */
@@ -2010,6 +2012,146 @@
 		*bit = (pin_num % 8) * 2;
 }
 
+#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 *info = bank->drvdata;
+
+	*regmap = info->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:
+		dev_err(info->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;
+}
+
+#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 *info = bank->drvdata;
+
+	*regmap = info->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:
+		dev_err(info->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;
+}
+
+#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 *info = bank->drvdata;
+
+	*regmap = info->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:
+		dev_err(info->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;
+}
+
 #define RK3568_SR_PMU_OFFSET		0x60
 #define RK3568_SR_GRF_OFFSET		0x0180
 #define RK3568_SR_BANK_STRIDE		0x10
@@ -2226,7 +2368,7 @@
 		rmask_bits = RV1126_DRV_BITS_PER_PIN;
 		ret = strength;
 		goto config;
-	} else if (ctrl->type == RK3568) {
+	} else if (ctrl->type == RK3568 || ctrl->type == RK3528) {
 		rmask_bits = RK3568_DRV_BITS_PER_PIN;
 		ret = (1 << (strength + 1)) - 1;
 		goto config;
@@ -2396,6 +2538,7 @@
 	case RK3308:
 	case RK3368:
 	case RK3399:
+	case RK3528:
 	case RK3568:
 		pull_type = bank->pull_type[pin_num / 8];
 		data >>= bit;
@@ -2444,6 +2587,7 @@
 	case RK3308:
 	case RK3368:
 	case RK3399:
+	case RK3528:
 	case RK3568:
 		pull_type = bank->pull_type[pin_num / 8];
 		ret = -EINVAL;
@@ -2796,6 +2940,7 @@
 	case RK3308:
 	case RK3368:
 	case RK3399:
+	case RK3528:
 	case RK3568:
 		return (pull != PIN_CONFIG_BIAS_PULL_PIN_DEFAULT);
 	}
@@ -4025,6 +4170,49 @@
 		.drv_calc_reg		= rk3399_calc_drv_reg_and_bit,
 };
 
+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 struct rockchip_pin_ctrl rk3528_pin_ctrl __maybe_unused = {
+	.pin_banks		= rk3528_pin_banks,
+	.nr_banks		= ARRAY_SIZE(rk3528_pin_banks),
+	.label			= "RK3528-GPIO",
+	.type			= RK3528,
+	.pull_calc_reg		= rk3528_calc_pull_reg_and_bit,
+	.drv_calc_reg		= rk3528_calc_drv_reg_and_bit,
+	.schmitt_calc_reg	= rk3528_calc_schmitt_reg_and_bit,
+};
+
 static struct rockchip_pin_bank rk3568_pin_banks[] = {
 	PIN_BANK_IOMUX_FLAGS(0, 32, "gpio0", IOMUX_SOURCE_PMU | IOMUX_WIDTH_4BIT,
 					     IOMUX_SOURCE_PMU | IOMUX_WIDTH_4BIT,
@@ -4128,6 +4316,10 @@
 	{ .compatible = "rockchip,rk3399-pinctrl",
 		.data = &rk3399_pin_ctrl },
 #endif
+#ifdef CONFIG_CPU_RK3528
+	{ .compatible = "rockchip,rk3528-pinctrl",
+		.data = &rk3528_pin_ctrl },
+#endif
 #ifdef CONFIG_CPU_RK3568
 	{ .compatible = "rockchip,rk3568-pinctrl",
 		.data = &rk3568_pin_ctrl },
diff --git a/kernel/drivers/pinctrl/pinctrl-rockchip.h b/kernel/drivers/pinctrl/pinctrl-rockchip.h
index a6e7862..6f7a627 100644
--- a/kernel/drivers/pinctrl/pinctrl-rockchip.h
+++ b/kernel/drivers/pinctrl/pinctrl-rockchip.h
@@ -19,6 +19,7 @@
 	RK3308,
 	RK3368,
 	RK3399,
+	RK3528,
 	RK3568,
 };
 
diff --git a/kernel/drivers/pwm/pwm-rockchip.c b/kernel/drivers/pwm/pwm-rockchip.c
index e505d58..b37ad84 100644
--- a/kernel/drivers/pwm/pwm-rockchip.c
+++ b/kernel/drivers/pwm/pwm-rockchip.c
@@ -411,13 +411,15 @@
 	pc->pinctrl = devm_pinctrl_get(&pdev->dev);
 	if (IS_ERR(pc->pinctrl)) {
 		dev_err(&pdev->dev, "Get pinctrl failed!\n");
-		return PTR_ERR(pc->pinctrl);
+		ret = PTR_ERR(pc->pinctrl);
+		goto err_pclk;
 	}
 
 	pc->active_state = pinctrl_lookup_state(pc->pinctrl, "active");
 	if (IS_ERR(pc->active_state)) {
 		dev_err(&pdev->dev, "No active pinctrl state\n");
-		return PTR_ERR(pc->active_state);
+		ret = PTR_ERR(pc->active_state);
+		goto err_pclk;
 	}
 
 	platform_set_drvdata(pdev, pc);
diff --git a/kernel/drivers/rkflash/sfc.c b/kernel/drivers/rkflash/sfc.c
index 8237e76..bec4e06 100644
--- a/kernel/drivers/rkflash/sfc.c
+++ b/kernel/drivers/rkflash/sfc.c
@@ -42,7 +42,9 @@
 
 u32 sfc_get_max_dll_cells(void)
 {
-	if (sfc_get_version() == SFC_VER_5)
+	if (sfc_get_version() == SFC_VER_8)
+		return SCLK_SMP_SEL_MAX_V5;
+	else if (sfc_get_version() == SFC_VER_5)
 		return SCLK_SMP_SEL_MAX_V5;
 	else if (sfc_get_version() == SFC_VER_4)
 		return SCLK_SMP_SEL_MAX_V4;
diff --git a/kernel/drivers/rkflash/sfc.h b/kernel/drivers/rkflash/sfc.h
index 703072d..7ca37df 100644
--- a/kernel/drivers/rkflash/sfc.h
+++ b/kernel/drivers/rkflash/sfc.h
@@ -8,6 +8,7 @@
 #define SFC_VER_3		0x3
 #define SFC_VER_4		0x4
 #define SFC_VER_5		0x5
+#define SFC_VER_8		0x8
 
 #define SFC_EN_INT		(0)         /* enable interrupt */
 #define SFC_EN_DMA		(1)         /* enable dma */
@@ -68,8 +69,8 @@
 
 /* SFC_DLL_CTRL Register */
 #define SCLK_SMP_SEL_EN		BIT(15)	/* SCLK Sampling Selection */
-#define SCLK_SMP_SEL_MAX_V4	0x1FF
-#define SCLK_SMP_SEL_MAX_V5	0xFF
+#define SCLK_SMP_SEL_MAX_V4	0xFF
+#define SCLK_SMP_SEL_MAX_V5	0x1FF
 
 #define SFC_DLL_TRANING_STEP		10	/* Training step */
 #define SFC_DLL_TRANING_VALID_WINDOW	80	/* Valid DLL winbow */
diff --git a/kernel/drivers/rkflash/sfc_nand.c b/kernel/drivers/rkflash/sfc_nand.c
index 085267a..81f58c9 100644
--- a/kernel/drivers/rkflash/sfc_nand.c
+++ b/kernel/drivers/rkflash/sfc_nand.c
@@ -52,6 +52,8 @@
 	{ 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 },
@@ -110,7 +112,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 },
@@ -129,7 +135,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 },
@@ -147,6 +153,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 },
@@ -204,8 +214,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;
@@ -928,6 +946,9 @@
 		sfc_nand_rw_preset();
 
 	sfc_nand_wait_busy(&status, 1000 * 1000);
+	if (sfc_nand_dev.manufacturer == 0x01 && status)
+		sfc_nand_wait_busy(&status, 1000 * 1000);
+
 	ecc_result = p_nand_info->ecc_status();
 
 	op.sfcmd.d32 = 0;
diff --git a/kernel/drivers/rkflash/sfc_nor.c b/kernel/drivers/rkflash/sfc_nor.c
index 7cbb400..feec84c 100644
--- a/kernel/drivers/rkflash/sfc_nor.c
+++ b/kernel/drivers/rkflash/sfc_nor.c
@@ -37,6 +37,8 @@
 	{ 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 },
+	/* GD55B01GE */
+	{ 0xc8471B, 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 },
@@ -113,6 +115,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 },
@@ -125,7 +131,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 },
@@ -135,8 +145,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 },
@@ -154,6 +168,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 },
@@ -175,6 +191,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/kernel/drivers/rknpu/rknpu_debugger.c b/kernel/drivers/rknpu/rknpu_debugger.c
index 4d5bebd..146aa7d 100644
--- a/kernel/drivers/rknpu/rknpu_debugger.c
+++ b/kernel/drivers/rknpu/rknpu_debugger.c
@@ -14,7 +14,9 @@
 #include <asm/div64.h>
 
 #ifndef FPGA_PLATFORM
+#ifdef CONFIG_PM_DEVFREQ
 #include <../drivers/devfreq/governor.h>
+#endif
 #endif
 
 #include "rknpu_drv.h"
@@ -191,6 +193,7 @@
 	return 0;
 }
 
+#ifdef CONFIG_PM_DEVFREQ
 static ssize_t rknpu_freq_set(struct file *file, const char __user *ubuf,
 			      size_t len, loff_t *offp)
 {
@@ -233,6 +236,13 @@
 
 	return len;
 }
+#else
+static ssize_t rknpu_freq_set(struct file *file, const char __user *ubuf,
+			      size_t len, loff_t *offp)
+{
+	return -EFAULT;
+}
+#endif
 
 static int rknpu_volt_show(struct seq_file *m, void *data)
 {
diff --git a/kernel/drivers/rknpu/rknpu_drv.c b/kernel/drivers/rknpu/rknpu_drv.c
index a153ec3..30dfc38 100644
--- a/kernel/drivers/rknpu/rknpu_drv.c
+++ b/kernel/drivers/rknpu/rknpu_drv.c
@@ -41,7 +41,9 @@
 #include <soc/rockchip/rockchip_opp_select.h>
 #include <soc/rockchip/rockchip_system_monitor.h>
 #include <soc/rockchip/rockchip_ipa.h>
+#ifdef CONFIG_PM_DEVFREQ
 #include <../drivers/devfreq/governor.h>
+#endif
 #endif
 
 #include "rknpu_ioctl.h"
@@ -1062,6 +1064,7 @@
 	.get_cur_freq = npu_devfreq_get_cur_freq,
 };
 
+#ifdef CONFIG_PM_DEVFREQ
 static int devfreq_rknpu_ondemand_func(struct devfreq *df, unsigned long *freq)
 {
 	struct rknpu_device *rknpu_dev = df->data;
@@ -1085,6 +1088,7 @@
 	.get_target_freq = devfreq_rknpu_ondemand_func,
 	.event_handler = devfreq_rknpu_ondemand_handler,
 };
+#endif
 
 static unsigned long npu_get_static_power(struct devfreq *devfreq,
 					  unsigned long voltage)
@@ -1191,11 +1195,13 @@
 	dev_pm_opp_put(opp);
 	dp->initial_freq = rknpu_dev->current_freq;
 
+#ifdef CONFIG_PM_DEVFREQ
 	ret = devfreq_add_governor(&devfreq_rknpu_ondemand);
 	if (ret) {
 		LOG_DEV_ERROR(dev, "failed to add rknpu_ondemand governor\n");
 		goto err_remove_table;
 	}
+#endif
 
 	rknpu_dev->devfreq = devm_devfreq_add_device(dev, dp, "rknpu_ondemand",
 						     (void *)rknpu_dev);
@@ -1247,7 +1253,9 @@
 	return 0;
 
 err_remove_governor:
+#ifdef CONFIG_PM_DEVFREQ
 	devfreq_remove_governor(&devfreq_rknpu_ondemand);
+#endif
 err_remove_table:
 	dev_pm_opp_of_remove_table(dev);
 
@@ -1325,11 +1333,13 @@
 	}
 	dp->initial_freq = rknpu_dev->current_freq;
 
+#ifdef CONFIG_PM_DEVFREQ
 	ret = devfreq_add_governor(&devfreq_rknpu_ondemand);
 	if (ret) {
 		LOG_DEV_ERROR(dev, "failed to add rknpu_ondemand governor\n");
 		goto err_remove_table;
 	}
+#endif
 
 	rknpu_dev->devfreq = devm_devfreq_add_device(dev, dp, "rknpu_ondemand",
 						     (void *)rknpu_dev);
@@ -1380,7 +1390,9 @@
 	return 0;
 
 err_remove_governor:
+#ifdef CONFIG_PM_DEVFREQ
 	devfreq_remove_governor(&devfreq_rknpu_ondemand);
+#endif
 err_remove_table:
 	dev_pm_opp_of_remove_table(dev);
 
@@ -1396,7 +1408,9 @@
 		devfreq_unregister_opp_notifier(rknpu_dev->dev,
 						rknpu_dev->devfreq);
 		dev_pm_opp_of_remove_table(rknpu_dev->dev);
+#ifdef CONFIG_PM_DEVFREQ
 		devfreq_remove_governor(&devfreq_rknpu_ondemand);
+#endif
 	}
 
 	return 0;
diff --git a/kernel/drivers/rknpu/rknpu_job.c b/kernel/drivers/rknpu/rknpu_job.c
index 6f601ab..9e50467 100644
--- a/kernel/drivers/rknpu/rknpu_job.c
+++ b/kernel/drivers/rknpu/rknpu_job.c
@@ -166,10 +166,10 @@
 	subcore_data = &rknpu_dev->subcore_datas[core_index];
 
 	do {
-		ret = wait_event_interruptible_timeout(
-			subcore_data->job_done_wq,
-			job->flags & RKNPU_JOB_DONE || rknpu_dev->soft_reseting,
-			msecs_to_jiffies(args->timeout));
+		ret = wait_event_timeout(subcore_data->job_done_wq,
+					 job->flags & RKNPU_JOB_DONE ||
+						 rknpu_dev->soft_reseting,
+					 msecs_to_jiffies(args->timeout));
 		if (++wait_count >= 3)
 			break;
 	} while (ret == 0 && job->in_queue[core_index]);
diff --git a/kernel/drivers/rtc/rtc-rk808.c b/kernel/drivers/rtc/rtc-rk808.c
index 67e5a94..142118d 100644
--- a/kernel/drivers/rtc/rtc-rk808.c
+++ b/kernel/drivers/rtc/rtc-rk808.c
@@ -36,6 +36,7 @@
 #define BIT_RTC_CTRL_REG_RTC_READSEL_M		BIT(7)
 #define BIT_RTC_INTERRUPTS_REG_IT_ALARM_M	BIT(3)
 #define RTC_STATUS_MASK		0xFE
+#define RTC_ALARM_STATUS			BIT(6)
 
 #define SECONDS_REG_MSK		0x7F
 #define MINUTES_REG_MAK		0x7F
@@ -258,6 +259,12 @@
 	ret = regmap_update_bits(rk808->regmap, rk808_rtc->creg->int_reg,
 				 BIT_RTC_INTERRUPTS_REG_IT_ALARM_M, 0);
 
+	/*
+	 * The rtc alarm status(BIT(6)) must be cleared after alarm 1s or
+	 * after the alarm is disabled.
+	 */
+	ret = regmap_write(rk808->regmap, rk808_rtc->creg->status_reg,
+			   RTC_ALARM_STATUS);
 	return ret;
 }
 
diff --git a/kernel/drivers/scsi/fcoe/fcoe.c b/kernel/drivers/scsi/fcoe/fcoe.c
index 6768b2e..c20f51a 100644
--- a/kernel/drivers/scsi/fcoe/fcoe.c
+++ b/kernel/drivers/scsi/fcoe/fcoe.c
@@ -1459,11 +1459,11 @@
 static int fcoe_alloc_paged_crc_eof(struct sk_buff *skb, int tlen)
 {
 	struct fcoe_percpu_s *fps;
-	int rc;
+	int rc, cpu = get_cpu_light();
 
-	fps = &get_cpu_var(fcoe_percpu);
+	fps = &per_cpu(fcoe_percpu, cpu);
 	rc = fcoe_get_paged_crc_eof(skb, tlen, fps);
-	put_cpu_var(fcoe_percpu);
+	put_cpu_light();
 
 	return rc;
 }
@@ -1650,11 +1650,11 @@
 		return 0;
 	}
 
-	stats = per_cpu_ptr(lport->stats, get_cpu());
+	stats = per_cpu_ptr(lport->stats, get_cpu_light());
 	stats->InvalidCRCCount++;
 	if (stats->InvalidCRCCount < 5)
 		printk(KERN_WARNING "fcoe: dropping frame with CRC error\n");
-	put_cpu();
+	put_cpu_light();
 	return -EINVAL;
 }
 
@@ -1697,7 +1697,7 @@
 	 */
 	hp = (struct fcoe_hdr *) skb_network_header(skb);
 
-	stats = per_cpu_ptr(lport->stats, get_cpu());
+	stats = per_cpu_ptr(lport->stats, get_cpu_light());
 	if (unlikely(FC_FCOE_DECAPS_VER(hp) != FC_FCOE_VER)) {
 		if (stats->ErrorFrames < 5)
 			printk(KERN_WARNING "fcoe: FCoE version "
@@ -1729,13 +1729,13 @@
 		goto drop;
 
 	if (!fcoe_filter_frames(lport, fp)) {
-		put_cpu();
+		put_cpu_light();
 		fc_exch_recv(lport, fp);
 		return;
 	}
 drop:
 	stats->ErrorFrames++;
-	put_cpu();
+	put_cpu_light();
 	kfree_skb(skb);
 }
 
diff --git a/kernel/drivers/scsi/fcoe/fcoe_ctlr.c b/kernel/drivers/scsi/fcoe/fcoe_ctlr.c
index 658c072..bceab74 100644
--- a/kernel/drivers/scsi/fcoe/fcoe_ctlr.c
+++ b/kernel/drivers/scsi/fcoe/fcoe_ctlr.c
@@ -838,7 +838,7 @@
 
 	INIT_LIST_HEAD(&del_list);
 
-	stats = per_cpu_ptr(fip->lp->stats, get_cpu());
+	stats = per_cpu_ptr(fip->lp->stats, get_cpu_light());
 
 	list_for_each_entry_safe(fcf, next, &fip->fcfs, list) {
 		deadline = fcf->time + fcf->fka_period + fcf->fka_period / 2;
@@ -874,7 +874,7 @@
 				sel_time = fcf->time;
 		}
 	}
-	put_cpu();
+	put_cpu_light();
 
 	list_for_each_entry_safe(fcf, next, &del_list, list) {
 		/* Removes fcf from current list */
diff --git a/kernel/drivers/scsi/libfc/fc_exch.c b/kernel/drivers/scsi/libfc/fc_exch.c
index 384458d..0271115 100644
--- a/kernel/drivers/scsi/libfc/fc_exch.c
+++ b/kernel/drivers/scsi/libfc/fc_exch.c
@@ -833,10 +833,10 @@
 	}
 	memset(ep, 0, sizeof(*ep));
 
-	cpu = get_cpu();
+	cpu = get_cpu_light();
 	pool = per_cpu_ptr(mp->pool, cpu);
 	spin_lock_bh(&pool->lock);
-	put_cpu();
+	put_cpu_light();
 
 	/* peek cache of free slot */
 	if (pool->left != FC_XID_UNKNOWN) {
diff --git a/kernel/drivers/soc/rockchip/Kconfig b/kernel/drivers/soc/rockchip/Kconfig
index 2b07177..1c8d89a 100644
--- a/kernel/drivers/soc/rockchip/Kconfig
+++ b/kernel/drivers/soc/rockchip/Kconfig
@@ -3,6 +3,19 @@
 source "drivers/soc/rockchip/Kconfig.cpu"
 
 #
+# Rockchip Android Features
+#
+
+config NO_GKI
+	bool "Disable Android GKI support"
+	default y if !GKI_HACKS_TO_FIX
+	help
+	  Say y here to disable Android GKI support. Then
+	  all the ABI compatibilities are not applicable.
+
+	  If unsure, say Y.
+
+#
 # Rockchip Soc drivers
 #
 
diff --git a/kernel/drivers/soc/rockchip/Kconfig.cpu b/kernel/drivers/soc/rockchip/Kconfig.cpu
index 027a87e..f7e97c1 100644
--- a/kernel/drivers/soc/rockchip/Kconfig.cpu
+++ b/kernel/drivers/soc/rockchip/Kconfig.cpu
@@ -53,6 +53,9 @@
 config CPU_RK3399
 	bool "RK3399"
 
+config CPU_RK3528
+	bool "RK3528"
+
 config CPU_RK3568
 	bool "RK3566/8"
 
diff --git a/kernel/drivers/soc/rockchip/flash_vendor_storage.c b/kernel/drivers/soc/rockchip/flash_vendor_storage.c
index 831f7b0..51b83b8 100644
--- a/kernel/drivers/soc/rockchip/flash_vendor_storage.c
+++ b/kernel/drivers/soc/rockchip/flash_vendor_storage.c
@@ -23,34 +23,13 @@
 #define DLOG(x...)
 #endif
 
-struct vendor_item {
-	u16  id;
-	u16  offset;
-	u16  size;
-	u16  flag;
-};
-
 #define FLASH_VENDOR_PART_START		8
-#define FLASH_VENDOR_PART_SIZE		8
 #define FLASH_VENDOR_PART_NUM		4
-#define FLASH_VENDOR_TAG		0x524B5644
-
-struct tag_vendor_info {
-	u32	tag;
-	u32	version;
-	u16	next_index;
-	u16	item_num;
-	u16	free_offset;
-	u16	free_size;
-	struct vendor_item item[62]; /* 62 * 8 */
-	u8	data[FLASH_VENDOR_PART_SIZE * 512 - 512 - 8];
-	u32	hash;
-	u32	version2;
-};
+#define FLASH_VENDOR_TAG		VENDOR_HEAD_TAG
 
 static int (*_flash_read)(u32 sec, u32 n_sec, void *p_data);
 static int (*_flash_write)(u32 sec, u32 n_sec, void *p_data);
-static struct tag_vendor_info *g_vendor;
+static struct flash_vendor_info *g_vendor;
 
 int flash_vendor_dev_ops_register(int (*read)(u32 sec,
 					      u32 n_sec,
diff --git a/kernel/drivers/soc/rockchip/mtd_vendor_storage.c b/kernel/drivers/soc/rockchip/mtd_vendor_storage.c
index c840ead..970db37 100644
--- a/kernel/drivers/soc/rockchip/mtd_vendor_storage.c
+++ b/kernel/drivers/soc/rockchip/mtd_vendor_storage.c
@@ -16,38 +16,13 @@
 #include <linux/soc/rockchip/rk_vendor_storage.h>
 #include <linux/uaccess.h>
 #include <linux/vmalloc.h>
+#include <misc/rkflash_vendor_storage.h>
 
 #define MTD_VENDOR_PART_START		0
-#define MTD_VENDOR_PART_SIZE		8
+#define MTD_VENDOR_PART_SIZE		FLASH_VENDOR_PART_SIZE
+#define MTD_VENDOR_NOR_BLOCK_SIZE	128
 #define MTD_VENDOR_PART_NUM		1
-#define MTD_VENDOR_TAG			0x524B5644
-
-struct rk_vendor_req {
-	u32 tag;
-	u16 id;
-	u16 len;
-	u8 data[1024];
-};
-
-struct vendor_item {
-	u16  id;
-	u16  offset;
-	u16  size;
-	u16  flag;
-};
-
-struct vendor_info {
-	u32	tag;
-	u32	version;
-	u16	next_index;
-	u16	item_num;
-	u16	free_offset;
-	u16	free_size;
-	struct	vendor_item item[62];
-	u8	data[MTD_VENDOR_PART_SIZE * 512 - 512 - 8];
-	u32	hash;
-	u32	version2;
-};
+#define MTD_VENDOR_TAG			VENDOR_HEAD_TAG
 
 struct mtd_nand_info {
 	u32 blk_offset;
@@ -65,14 +40,11 @@
 #define GET_LOCK_FLAG_IO	_IOW('r', 0x53, unsigned int)
 #endif
 
-#define VENDOR_REQ_TAG		0x56524551
-#define VENDOR_READ_IO		_IOW('v', 0x01, unsigned int)
-#define VENDOR_WRITE_IO		_IOW('v', 0x02, unsigned int)
-
 static u8 *g_idb_buffer;
-static struct vendor_info *g_vendor;
+static struct flash_vendor_info *g_vendor;
 static DEFINE_MUTEX(vendor_ops_mutex);
 static struct mtd_info *mtd;
+static u32 mtd_erase_size;
 static const char *vendor_mtd_name = "vnvm";
 static struct mtd_nand_info nand_info;
 
@@ -83,8 +55,8 @@
 	struct erase_info ei;
 
 re_write:
-	if (nand_info.page_offset >= mtd->erasesize) {
-		nand_info.blk_offset += mtd->erasesize;
+	if (nand_info.page_offset >= mtd_erase_size) {
+		nand_info.blk_offset += mtd_erase_size;
 		if (nand_info.blk_offset >= mtd->size)
 			nand_info.blk_offset = 0;
 		if (mtd_block_isbad(mtd, nand_info.blk_offset))
@@ -92,7 +64,7 @@
 
 		memset(&ei, 0, sizeof(struct erase_info));
 		ei.addr = nand_info.blk_offset;
-		ei.len	= mtd->erasesize;
+		ei.len	= mtd_erase_size;
 		if (mtd_erase(mtd, &ei))
 			goto re_write;
 
@@ -129,7 +101,15 @@
 	nand_info.ops_size = (sizeof(*g_vendor) + mtd->writesize - 1) / mtd->writesize;
 	nand_info.ops_size *= mtd->writesize;
 
-	for (offset = 0; offset < mtd->size; offset += mtd->erasesize) {
+	/*
+	 * The NOR FLASH erase size maybe config as 4KB, need to re-define
+	 * and maintain consistency with uboot.
+	 */
+	mtd_erase_size = mtd->erasesize;
+	if (mtd_erase_size <= MTD_VENDOR_NOR_BLOCK_SIZE * 512)
+		mtd_erase_size = MTD_VENDOR_NOR_BLOCK_SIZE * 512;
+
+	for (offset = 0; offset < mtd->size; offset += mtd_erase_size) {
 		if (!mtd_block_isbad(mtd, offset)) {
 			err = mtd_read(mtd, offset, sizeof(*g_vendor),
 				       &bytes_read, (u8 *)g_vendor);
@@ -144,11 +124,11 @@
 				}
 			}
 		} else if (nand_info.blk_offset == offset)
-			nand_info.blk_offset += mtd->erasesize;
+			nand_info.blk_offset += mtd_erase_size;
 	}
 
 	if (nand_info.version) {
-		for (offset = mtd->erasesize - nand_info.ops_size;
+		for (offset = mtd_erase_size - nand_info.ops_size;
 		     offset >= 0;
 		     offset -= nand_info.ops_size) {
 			err = mtd_read(mtd, nand_info.blk_offset + offset,
@@ -174,7 +154,10 @@
 			if (bytes_read == sizeof(*g_vendor) &&
 			    g_vendor->tag == MTD_VENDOR_TAG &&
 			    g_vendor->version == g_vendor->version2) {
-				nand_info.version = g_vendor->version;
+				if (nand_info.version > g_vendor->version)
+					g_vendor->version = nand_info.version;
+				else
+					nand_info.version = g_vendor->version;
 				break;
 			}
 		}
@@ -184,11 +167,11 @@
 		g_vendor->tag = MTD_VENDOR_TAG;
 		g_vendor->free_size = sizeof(g_vendor->data);
 		g_vendor->version2 = g_vendor->version;
-		for (offset = 0; offset < mtd->size; offset += mtd->erasesize) {
+		for (offset = 0; offset < mtd->size; offset += mtd_erase_size) {
 			if (!mtd_block_isbad(mtd, offset)) {
 				memset(&ei, 0, sizeof(struct erase_info));
 				ei.addr = nand_info.blk_offset + offset;
-				ei.len  = mtd->erasesize;
+				ei.len  = mtd_erase_size;
 				mtd_erase(mtd, &ei);
 			}
 		}
@@ -305,7 +288,7 @@
 {
 	long ret = -1;
 	int size;
-	struct rk_vendor_req *v_req;
+	struct RK_VENDOR_REQ *v_req;
 	u32 *page_buf;
 
 	page_buf = kmalloc(4096, GFP_KERNEL);
@@ -314,7 +297,7 @@
 
 	mutex_lock(&vendor_ops_mutex);
 
-	v_req = (struct rk_vendor_req *)page_buf;
+	v_req = (struct RK_VENDOR_REQ *)page_buf;
 
 	switch (cmd) {
 	case VENDOR_READ_IO:
diff --git a/kernel/drivers/soc/rockchip/pm_domains.c b/kernel/drivers/soc/rockchip/pm_domains.c
index 6c5aa46..d5cc4f0 100644
--- a/kernel/drivers/soc/rockchip/pm_domains.c
+++ b/kernel/drivers/soc/rockchip/pm_domains.c
@@ -37,6 +37,7 @@
 #include <dt-bindings/power/rk3366-power.h>
 #include <dt-bindings/power/rk3368-power.h>
 #include <dt-bindings/power/rk3399-power.h>
+#include <dt-bindings/power/rk3528-power.h>
 #include <dt-bindings/power/rk3568-power.h>
 
 struct rockchip_domain_info {
@@ -146,6 +147,20 @@
 	.keepon_startup = keepon,			\
 }
 
+#define DOMAIN_M_A(pwr, status, req, idle, ack, always, wakeup, keepon)	\
+{							\
+	.pwr_w_mask = (pwr) << 16,			\
+	.pwr_mask = (pwr),				\
+	.status_mask = (status),			\
+	.req_w_mask = (req) << 16,			\
+	.req_mask = (req),				\
+	.idle_mask = (idle),				\
+	.ack_mask = (ack),				\
+	.always_on = always,				\
+	.active_wakeup = wakeup,			\
+	.keepon_startup = keepon,			\
+}
+
 #define DOMAIN_M_O(pwr, status, p_offset, req, idle, ack, r_offset, wakeup, keepon)	\
 {							\
 	.pwr_w_mask = (pwr) << 16,			\
@@ -205,6 +220,9 @@
 
 #define DOMAIN_RK3399_PROTECT(pwr, status, req, wakeup)	\
 	DOMAIN(pwr, status, req, req, req, wakeup, true)
+
+#define DOMAIN_RK3528(pwr, req, always, wakeup) \
+	DOMAIN_M_A(pwr, pwr, req, req, req, always, wakeup, false)
 
 #define DOMAIN_RK3568(pwr, req, wakeup)		\
 	DOMAIN_M(pwr, pwr, req, req, req, wakeup, false)
@@ -1357,6 +1375,18 @@
 	[RK3399_PD_SDIOAUDIO]	= DOMAIN_RK3399(BIT(31), BIT(31), BIT(29), true),
 };
 
+static const struct rockchip_domain_info rk3528_pm_domains[] = {
+	[RK3528_PD_PMU]		= DOMAIN_RK3528(0, BIT(0), true, false),
+	[RK3528_PD_BUS]		= DOMAIN_RK3528(0, BIT(1), true, false),
+	[RK3528_PD_DDR]		= DOMAIN_RK3528(0, BIT(2), true, false),
+	[RK3528_PD_MSCH]	= DOMAIN_RK3528(0, BIT(3), true, false),
+	[RK3528_PD_GPU]		= DOMAIN_RK3528(BIT(0), BIT(4), true, false),
+	[RK3528_PD_RKVDEC]	= DOMAIN_RK3528(0, BIT(5), true, false),
+	[RK3528_PD_RKVENC]	= DOMAIN_RK3528(0, BIT(6), true, false),
+	[RK3528_PD_VO]		= DOMAIN_RK3528(0,  BIT(7), true, false),
+	[RK3528_PD_VPU]		= DOMAIN_RK3528(0, BIT(8), true, false),
+};
+
 static const struct rockchip_domain_info rk3568_pm_domains[] = {
 	[RK3568_PD_NPU]		= DOMAIN_RK3568(BIT(1), BIT(2), false),
 	[RK3568_PD_GPU]		= DOMAIN_RK3568(BIT(0), BIT(1), false),
@@ -1508,6 +1538,17 @@
 	.domain_info = rk3399_pm_domains,
 };
 
+static const struct rockchip_pmu_info rk3528_pmu = {
+	.pwr_offset = 0x1210,
+	.status_offset = 0x1230,
+	.req_offset = 0x1110,
+	.idle_offset = 0x1128,
+	.ack_offset = 0x1120,
+
+	.num_domains = ARRAY_SIZE(rk3528_pm_domains),
+	.domain_info = rk3528_pm_domains,
+};
+
 static const struct rockchip_pmu_info rk3568_pmu = {
 	.pwr_offset = 0xa0,
 	.status_offset = 0x98,
@@ -1586,6 +1627,12 @@
 		.data = (void *)&rk3399_pmu,
 	},
 #endif
+#ifdef CONFIG_CPU_RK3528
+	{
+		.compatible = "rockchip,rk3528-power-controller",
+		.data = (void *)&rk3528_pmu,
+	},
+#endif
 #ifdef CONFIG_CPU_RK3568
 	{
 		.compatible = "rockchip,rk3568-power-controller",
diff --git a/kernel/drivers/soc/rockchip/rk_fiq_debugger.c b/kernel/drivers/soc/rockchip/rk_fiq_debugger.c
index 375375c..7cd77c3 100644
--- a/kernel/drivers/soc/rockchip/rk_fiq_debugger.c
+++ b/kernel/drivers/soc/rockchip/rk_fiq_debugger.c
@@ -45,14 +45,14 @@
 #ifdef CONFIG_FIQ_DEBUGGER_TRUST_ZONE
 #include <linux/rockchip/rockchip_sip.h>
 #endif
-
-#define UART_USR	0x1f	/* In: UART Status Register */
+#define UART_USR			0x1f /* In: UART Status Register */
 #define UART_USR_RX_FIFO_FULL		0x10 /* Receive FIFO full */
 #define UART_USR_RX_FIFO_NOT_EMPTY	0x08 /* Receive FIFO not empty */
 #define UART_USR_TX_FIFO_EMPTY		0x04 /* Transmit FIFO empty */
 #define UART_USR_TX_FIFO_NOT_FULL	0x02 /* Transmit FIFO not full */
 #define UART_USR_BUSY			0x01 /* UART busy indicator */
 #define UART_SRR			0x22 /* software reset register */
+#define RK_UART_RFL			0x21 /* UART Receive Fifo Level Register */
 
 struct rk_fiq_debugger {
 	int irq;
@@ -150,7 +150,7 @@
 
 static int debug_getc(struct platform_device *pdev)
 {
-	unsigned int lsr;
+	unsigned int lsr, usr, rfl, iir;
 	struct rk_fiq_debugger *t;
 	unsigned int temp;
 	static unsigned int n;
@@ -160,8 +160,22 @@
 	/*
 	 * Clear uart interrupt status
 	 */
-	rk_fiq_read(t, UART_USR);
+	iir = rk_fiq_read(t, UART_IIR);
+	usr = rk_fiq_read(t, UART_USR);
 	lsr = rk_fiq_read_lsr(t);
+
+	/*
+	 * There are ways to get Designware-based UARTs into a state where
+	 * they are asserting UART_IIR_RX_TIMEOUT but there is no actual
+	 * data available.  If we see such a case then we'll do a bogus
+	 * read.  If we don't do this then the "RX TIMEOUT" interrupt will
+	 * fire forever.
+	 */
+	if ((iir & 0x3f) == UART_IIR_RX_TIMEOUT) {
+		rfl = rk_fiq_read(t, RK_UART_RFL);
+		if (!(lsr & (UART_LSR_DR | UART_LSR_BI)) && !(usr & 0x1) && (rfl == 0))
+			rk_fiq_read(t, UART_RX);
+	}
 
 	if (lsr & UART_LSR_DR) {
 		temp = rk_fiq_read(t, UART_RX);
@@ -215,22 +229,32 @@
 
 #ifdef CONFIG_RK_CONSOLE_THREAD
 #define FIFO_SIZE SZ_64K
-#define LINE_MAX 1024
+#define TTY_FIFO_SIZE SZ_64K
 static DEFINE_KFIFO(fifo, unsigned char, FIFO_SIZE);
-static char console_buf[LINE_MAX]; /* avoid FRAME WARN */
-static bool console_thread_stop;
+static DEFINE_KFIFO(tty_fifo, unsigned char, TTY_FIFO_SIZE);
+static bool console_thread_stop; /* write on console_write */
+static bool console_thread_running; /* write on console_thread */
 static unsigned int console_dropped_messages;
+
+static int write_room(struct platform_device *pdev)
+{
+	return (TTY_FIFO_SIZE - kfifo_len(&tty_fifo));
+}
 
 static void console_putc(struct platform_device *pdev, unsigned int c)
 {
 	struct rk_fiq_debugger *t;
-	unsigned int count = 500;
+	unsigned int count = 2;		/* loop 2 times is enough */
+	unsigned long us = 400;		/* the time to send 60 byte for baudrate 1500000 */
 
 	t = container_of(dev_get_platdata(&pdev->dev), typeof(*t), pdata);
 
+	if (t->baudrate == 115200)
+		us = 5160;	/* the time to send 60 byte for baudrate 115200 */
+
 	while (!(rk_fiq_read(t, UART_USR) & UART_USR_TX_FIFO_NOT_FULL) &&
 	       count--)
-		usleep_range(200, 210);
+		usleep_range(us, us + us / 20);
 
 	rk_fiq_write(t, c, UART_TX);
 }
@@ -238,12 +262,16 @@
 static void console_flush(struct platform_device *pdev)
 {
 	struct rk_fiq_debugger *t;
-	unsigned int count = 500;
+	unsigned int count = 2;		/* loop 2 times is enough */
+	unsigned long us = 428;		/* the time to send 64 byte for baudrate 1500000 */
 
 	t = container_of(dev_get_platdata(&pdev->dev), typeof(*t), pdata);
 
+	if (t->baudrate == 115200)
+		us = 5500;	/* the time to send 64 byte for baudrate 115200 */
+
 	while (!(rk_fiq_read_lsr(t) & UART_LSR_TEMT) && count--)
-		usleep_range(200, 210);
+		usleep_range(us, us + us / 20);
 }
 
 static void console_put(struct platform_device *pdev,
@@ -266,33 +294,79 @@
 	}
 }
 
+static void wake_up_console_thread(struct task_struct *console_task)
+{
+	/*
+	 * Avoid dead lock on console_task->pi_lock and console_lock
+	 * when call printk() in try_to_wake_up().
+	 *
+	 * cpu0 hold console_lock, then try lock pi_lock fail:
+	 *   printk()->vprintk_emit()->console_unlock()->try_to_wake_up()
+	 *   ->lock(pi_lock)->deadlock
+	 *
+	 * cpu1 hold pi_lock, then try lock console_lock fail:
+	 *   console_thread()->console_put()->usleep_range()->run_hrtimer()
+	 *   ->hrtimer_wakeup()->try_to_wake_up()[hold_pi_lock]->printk()
+	 *   ->vprintk_emit()->console_trylock_spining()->cpu_relax()->deadlock
+	 *
+	 * if cpu0 does not hold console_lock, cpu1 also deadlock on pi_lock:
+	 *   ...->hrtimer_wakeup()->try_to_wake_up()[hold_pi_lock]->printk()
+	 *   ->vprintk_emit()->console_unlock()->try_to_wake_up()
+	 *   ->lock(pi_lock)->deadlock
+	 *
+	 * so when console_task is running on usleep_range(), printk()
+	 * should not wakeup console_task to avoid lock(pi_lock) again,
+	 * as run_hrtimer() will wakeup console_task later.
+	 * console_thread_running==false guarantee that console_task
+	 * is not running on usleep_range().
+	 */
+	if (!READ_ONCE(console_thread_running))
+		wake_up_process(console_task);
+}
+
 static int console_thread(void *data)
 {
 	struct platform_device *pdev = data;
-	char *buf = console_buf;
-	unsigned int len;
+	char buf[64], c = 0;
+	unsigned int len = 0, len_tty = 0;
 
 	while (1) {
 		unsigned int dropped;
 
 		set_current_state(TASK_INTERRUPTIBLE);
-		if (kfifo_is_empty(&fifo))
+		if (console_thread_stop || (kfifo_is_empty(&fifo) && kfifo_is_empty(&tty_fifo))) {
+			smp_store_mb(console_thread_running, false);
 			schedule();
+			smp_store_mb(console_thread_running, true);
+		}
 		if (kthread_should_stop())
 			break;
 		set_current_state(TASK_RUNNING);
-		while (!console_thread_stop) {
-			len = kfifo_out(&fifo, buf, LINE_MAX);
-			if (!len)
-				break;
-			console_put(pdev, buf, len);
+
+		while (!console_thread_stop && (!kfifo_is_empty(&fifo) || !kfifo_is_empty(&tty_fifo))) {
+			while (!console_thread_stop && kfifo_get(&fifo, &c)) {
+				console_put(pdev, &c, 1);
+				if (c == '\n')
+					break;
+			}
+
+			while (!console_thread_stop && kfifo_get(&tty_fifo, &c)) {
+				console_putc(pdev, c);
+				len_tty++;
+				if (c == '\n')
+					break;
+			}
 		}
+
+		if (len_tty > 0)
+			fiq_tty_wake_up(pdev);
+		len_tty = 0;
+
 		dropped = console_dropped_messages;
 		if (dropped && !console_thread_stop) {
 			console_dropped_messages = 0;
 			smp_wmb();
-			len = snprintf(buf, LINE_MAX,
-				       "** %u console messages dropped **\n",
+			len = sprintf(buf, "** %u console messages dropped **\n",
 				       dropped);
 			console_put(pdev, buf, len);
 		}
@@ -328,18 +402,37 @@
 	} else if (count) {
 		unsigned int ret = 0;
 
-		if (kfifo_len(&fifo) + count < FIFO_SIZE)
+		if (kfifo_len(&fifo) + count <= FIFO_SIZE)
 			ret = kfifo_in(&fifo, s, count);
 		if (!ret) {
 			console_dropped_messages++;
 			smp_wmb();
 		} else {
-			wake_up_process(t->console_task);
+			wake_up_console_thread(t->console_task);
 		}
 	}
 }
-#endif
 
+static int tty_write(struct platform_device *pdev, const char *s, int count)
+{
+	unsigned int ret = 0;
+	struct rk_fiq_debugger *t;
+
+	if (console_thread_stop)
+		return count;
+	t = container_of(dev_get_platdata(&pdev->dev), typeof(*t), pdata);
+
+	if (count > 0) {
+		if (kfifo_len(&tty_fifo) + count <= TTY_FIFO_SIZE)
+			ret = kfifo_in(&tty_fifo, s, count);
+
+		if (ret <= 0)
+			return 0;
+		wake_up_console_thread(t->console_task);
+	}
+	return count;
+}
+#endif
 
 static void fiq_enable(struct platform_device *pdev, unsigned int irq, bool on)
 {
@@ -371,7 +464,7 @@
 	return rk_fiq_sdei.fiq_en;
 }
 
-int fiq_sdei_event_callback(u32 event, struct pt_regs *regs, void *arg)
+static int fiq_sdei_event_callback(u32 event, struct pt_regs *regs, void *arg)
 {
 	int cpu_id = get_logical_index(read_cpuid_mpidr() &
 				       MPIDR_HWID_BITMASK);
@@ -380,7 +473,7 @@
 	return 0;
 }
 
-void rk_fiq_sdei_event_sw_cpu(int wait_disable)
+static void rk_fiq_sdei_event_sw_cpu(int wait_disable)
 {
 	unsigned long affinity;
 	int cnt = 100000;
@@ -402,7 +495,7 @@
 	rk_fiq_sdei.cur_cpu = rk_fiq_sdei.sw_cpu;
 }
 
-int fiq_sdei_sw_cpu_event_callback(u32 event, struct pt_regs *regs, void *arg)
+static int fiq_sdei_sw_cpu_event_callback(u32 event, struct pt_regs *regs, void *arg)
 {
 	int cnt = 10000;
 	int ret = 0;
@@ -454,7 +547,7 @@
 	int cnt = 10000;
 
 	if (rk_fiq_sdei.cur_cpu == cpu) {
-		target_cpu = cpumask_first(cpu_online_mask);
+		target_cpu = cpumask_any_but(cpu_online_mask, cpu);
 		_rk_fiq_dbg_sdei_switch_cpu(target_cpu, 1);
 
 		while (rk_fiq_sdei.cur_cpu == cpu && cnt) {
@@ -495,6 +588,7 @@
 static int fiq_debugger_sdei_enable(struct rk_fiq_debugger *t)
 {
 	int ret, cpu, i;
+	int is_dyn_event = false;
 
 	ret = sip_fiq_debugger_sdei_get_event_id(&rk_fiq_sdei.event_id,
 						 &rk_fiq_sdei.cpu_sw_event_id,
@@ -503,6 +597,17 @@
 	if (ret) {
 		pr_err("%s: get event id error!\n", __func__);
 		return ret;
+	}
+
+	/* If we can't get a valid fiq event, use dynamic event instead */
+	if (rk_fiq_sdei.event_id == 0) {
+		ret = sdei_interrupt_bind(serial_hwirq, &rk_fiq_sdei.event_id);
+		if (ret) {
+			pr_err("%s: bind intr:%d error!\n", __func__, serial_hwirq);
+			return ret;
+		}
+
+		is_dyn_event = true;
 	}
 
 	ret = cpuhp_setup_state_nocalls(CPUHP_AP_ONLINE_DYN,
@@ -583,6 +688,9 @@
 	unregister_pm_notifier(&fiq_dbg_sdei_pm_nb);
 	sdei_event_unregister(rk_fiq_sdei.event_id);
 
+	if (is_dyn_event)
+		sdei_interrupt_release(rk_fiq_sdei.event_id);
+
 	return ret;
 }
 
@@ -604,7 +712,7 @@
 	sip_fiq_debugger_enable_debug(val);
 }
 
-static void fiq_debugger_uart_irq_tf(struct pt_regs *_pt_regs, uint32_t cpu)
+static void fiq_debugger_uart_irq_tf(struct pt_regs *_pt_regs, unsigned long cpu)
 {
 	fiq_debugger_fiq(_pt_regs, cpu);
 }
@@ -652,7 +760,7 @@
 
 	if ((sip_fiq_debugger_is_enabled()) &&
 	    (sip_fiq_debugger_get_target_cpu() == cpu)) {
-		target_cpu = cpumask_first(cpu_online_mask);
+		target_cpu = cpumask_any_but(cpu_online_mask, cpu);
 		sip_fiq_debugger_switch_cpu(target_cpu);
 	}
 
@@ -730,9 +838,9 @@
 }
 #endif
 
-void rk_serial_debug_init(void __iomem *base, phys_addr_t phy_base,
-			  int irq, int signal_irq,
-			  int wakeup_irq, unsigned int baudrate)
+static void rk_serial_debug_init(void __iomem *base, phys_addr_t phy_base,
+				 int irq, int signal_irq,
+				 int wakeup_irq, unsigned int baudrate)
 {
 	struct rk_fiq_debugger *t = NULL;
 	struct platform_device *pdev = NULL;
@@ -831,8 +939,11 @@
 
 #ifdef CONFIG_RK_CONSOLE_THREAD
 	t->console_task = kthread_run(console_thread, pdev, "kconsole");
-	if (!IS_ERR(t->console_task))
+	if (!IS_ERR(t->console_task)) {
 		t->pdata.console_write = console_write;
+		t->pdata.tty_write = tty_write;
+		t->pdata.write_room = write_room;
+	}
 #endif
 
 	pdev->name = "fiq_debugger";
@@ -854,7 +965,7 @@
 	kfree(t);
 }
 
-void rk_serial_debug_init_dummy(void)
+static void rk_serial_debug_init_dummy(void)
 {
 	struct rk_fiq_debugger *t = NULL;
 	struct platform_device *pdev = NULL;
diff --git a/kernel/drivers/soc/rockchip/rockchip-cpuinfo.c b/kernel/drivers/soc/rockchip/rockchip-cpuinfo.c
index eae9cb5..69c2077 100644
--- a/kernel/drivers/soc/rockchip/rockchip-cpuinfo.c
+++ b/kernel/drivers/soc/rockchip/rockchip-cpuinfo.c
@@ -182,6 +182,11 @@
 	}
 }
 
+static void rk3528_init(void)
+{
+	rockchip_soc_id = ROCKCHIP_SOC_RK3528;
+}
+
 #define RK356X_PMU_GRF_PHYS		0xfdc20000
 #define RK356X_PMU_GRF_SOC_CON0		0x00000100
 #define RK356X_CHIP_VERSION_MASK	0x00008000
@@ -227,7 +232,9 @@
 		rv1109_init();
 	} else if (cpu_is_rv1126()) {
 		rv1126_init();
-	} else if (cpu_is_rk3566()) {
+	} else if (cpu_is_rk3528()) {
+		rk3528_init();
+	}  else if (cpu_is_rk3566()) {
 		rk3566_init();
 	} else if (cpu_is_rk3568()) {
 		rk3568_init();
diff --git a/kernel/drivers/soc/rockchip/rockchip_debug.c b/kernel/drivers/soc/rockchip/rockchip_debug.c
index f6777de..97002bc 100644
--- a/kernel/drivers/soc/rockchip/rockchip_debug.c
+++ b/kernel/drivers/soc/rockchip/rockchip_debug.c
@@ -425,7 +425,7 @@
 	struct irq_desc *desc;
 
 	if (i > nr_irqs)
-		return 0;
+		return -EINVAL;
 
 	/* print header and calculate the width of the first column */
 	if (i == 0) {
@@ -433,24 +433,24 @@
 			j *= 10;
 
 		buf += sprintf(buf, "%*s", prec + 8, "");
-		for_each_online_cpu(j)
+		for_each_possible_cpu(j)
 			buf += sprintf(buf, "CPU%-8d", j);
 		buf += sprintf(buf, "\n");
 	}
 
 	desc = irq_to_desc(i);
 	if (!desc)
-		goto outsparse;
+		return -EINVAL;
 
 	if (desc->kstat_irqs)
-		for_each_online_cpu(j)
+		for_each_possible_cpu(j)
 			any_count |= *per_cpu_ptr(desc->kstat_irqs, j);
 
 	if ((!desc->action || (desc->action && desc->action == &chained_action)) && !any_count)
-		goto outsparse;
+		return -EINVAL;
 
 	buf += sprintf(buf, "%*d: ", prec, i);
-	for_each_online_cpu(j)
+	for_each_possible_cpu(j)
 		buf += sprintf(buf, "%10u ", desc->kstat_irqs ?
 					*per_cpu_ptr(desc->kstat_irqs, j) : 0);
 
@@ -480,7 +480,6 @@
 	}
 
 	sprintf(buf, "\n");
-outsparse:
 	return 0;
 }
 
diff --git a/kernel/drivers/soc/rockchip/rockchip_opp_select.c b/kernel/drivers/soc/rockchip/rockchip_opp_select.c
index 1520e2f..02bcf82 100644
--- a/kernel/drivers/soc/rockchip/rockchip_opp_select.c
+++ b/kernel/drivers/soc/rockchip/rockchip_opp_select.c
@@ -6,8 +6,10 @@
 #include <linux/clk.h>
 #include <linux/cpufreq.h>
 #include <linux/devfreq.h>
+#include <linux/mfd/syscon.h>
 #include <linux/module.h>
 #include <linux/nvmem-consumer.h>
+#include <linux/regmap.h>
 #include <linux/regulator/consumer.h>
 #include <linux/slab.h>
 #include <linux/soc/rockchip/pvtm.h>
@@ -51,15 +53,24 @@
 	unsigned int num;
 	unsigned int err;
 	unsigned int ref_temp;
+	unsigned int offset;
 	int temp_prop[2];
 	const char *tz_name;
 	struct thermal_zone_device *tz;
+	struct regmap *grf;
 };
 
 struct lkg_conversion_table {
 	int temp;
 	int conv;
 };
+
+struct otp_opp_info {
+	u16 min_freq;
+	u16 max_freq;
+	u8 volt;
+	u8 length;
+} __packed;
 
 #define PVTM_CH_MAX	8
 #define PVTM_SUB_CH_MAX	8
@@ -298,16 +309,8 @@
 		return -EINVAL;
 	if (of_property_read_u32(np, "rockchip,pvtm-volt", &pvtm->volt))
 		return -EINVAL;
-	if (of_property_read_u32_array(np, "rockchip,pvtm-ch", pvtm->ch, 2))
-		return -EINVAL;
-	if (pvtm->ch[0] >= PVTM_CH_MAX || pvtm->ch[1] >= PVTM_SUB_CH_MAX)
-		return -EINVAL;
 	if (of_property_read_u32(np, "rockchip,pvtm-sample-time",
 				 &pvtm->sample_time))
-		return -EINVAL;
-	if (of_property_read_u32(np, "rockchip,pvtm-number", &pvtm->num))
-		return -EINVAL;
-	if (of_property_read_u32(np, "rockchip,pvtm-error", &pvtm->err))
 		return -EINVAL;
 	if (of_property_read_u32(np, "rockchip,pvtm-ref-temp", &pvtm->ref_temp))
 		return -EINVAL;
@@ -324,6 +327,23 @@
 	if (IS_ERR(pvtm->tz))
 		return -EINVAL;
 	if (!pvtm->tz->ops->get_temp)
+		return -EINVAL;
+	if (of_property_read_bool(np, "rockchip,pvtm-pvtpll")) {
+		if (of_property_read_u32(np, "rockchip,pvtm-offset",
+					 &pvtm->offset))
+			return -EINVAL;
+		pvtm->grf = syscon_regmap_lookup_by_phandle(np, "rockchip,grf");
+		if (IS_ERR(pvtm->grf))
+			return -EINVAL;
+		return 0;
+	}
+	if (of_property_read_u32_array(np, "rockchip,pvtm-ch", pvtm->ch, 2))
+		return -EINVAL;
+	if (pvtm->ch[0] >= PVTM_CH_MAX || pvtm->ch[1] >= PVTM_SUB_CH_MAX)
+		return -EINVAL;
+	if (of_property_read_u32(np, "rockchip,pvtm-number", &pvtm->num))
+		return -EINVAL;
+	if (of_property_read_u32(np, "rockchip,pvtm-error", &pvtm->err))
 		return -EINVAL;
 
 	return 0;
@@ -415,7 +435,7 @@
 		 cur_temp, *target_value, avg_value, diff_value);
 
 resetore_volt:
-	regulator_set_voltage(reg, old_volt, old_volt);
+	regulator_set_voltage(reg, old_volt, INT_MAX);
 restore_clk:
 	clk_set_rate(clk, old_freq);
 pvtm_value_out:
@@ -694,6 +714,81 @@
 }
 EXPORT_SYMBOL(rockchip_of_get_lkg_sel);
 
+static int rockchip_get_pvtm_pvtpll(struct device *dev, struct device_node *np,
+				    char *reg_name)
+{
+	struct regulator *reg;
+	struct clk *clk;
+	struct pvtm_config *pvtm;
+	unsigned long old_freq;
+	unsigned int old_volt;
+	int cur_temp, diff_temp, prop_temp, diff_value;
+	int pvtm_value = 0;
+	int ret = 0;
+
+	pvtm = kzalloc(sizeof(*pvtm), GFP_KERNEL);
+	if (!pvtm)
+		return -ENOMEM;
+
+	ret = rockchip_parse_pvtm_config(np, pvtm);
+	if (ret)
+		goto out;
+
+	clk = clk_get(dev, NULL);
+	if (IS_ERR_OR_NULL(clk)) {
+		dev_warn(dev, "Failed to get clk\n");
+		goto out;
+	}
+
+	reg = regulator_get_optional(dev, reg_name);
+	if (IS_ERR_OR_NULL(reg)) {
+		dev_warn(dev, "Failed to get reg\n");
+		clk_put(clk);
+		goto out;
+	}
+	old_freq = clk_get_rate(clk);
+	old_volt = regulator_get_voltage(reg);
+
+	ret = clk_set_rate(clk, pvtm->freq * 1000);
+	if (ret) {
+		dev_err(dev, "Failed to set pvtm freq\n");
+		goto put_reg;
+	}
+	ret = regulator_set_voltage(reg, pvtm->volt, INT_MAX);
+	if (ret) {
+		dev_err(dev, "Failed to set pvtm_volt\n");
+		goto restore_clk;
+	}
+	usleep_range(pvtm->sample_time, pvtm->sample_time + 100);
+
+	ret = regmap_read(pvtm->grf, pvtm->offset, &pvtm_value);
+	if (ret < 0) {
+		dev_err(dev, "failed to get pvtm from 0x%x\n", pvtm->offset);
+		goto resetore_volt;
+	}
+	pvtm->tz->ops->get_temp(pvtm->tz, &cur_temp);
+	diff_temp = (cur_temp / 1000 - pvtm->ref_temp);
+	if (diff_temp < 0)
+		prop_temp = pvtm->temp_prop[0];
+	else
+		prop_temp = pvtm->temp_prop[1];
+	diff_value = diff_temp * prop_temp / 1000;
+	pvtm_value += diff_value;
+
+	dev_info(dev, "pvtm=%d\n", pvtm_value);
+
+resetore_volt:
+	regulator_set_voltage(reg, old_volt, INT_MAX);
+restore_clk:
+	clk_set_rate(clk, old_freq);
+put_reg:
+	regulator_put(reg);
+	clk_put(clk);
+out:
+	kfree(pvtm);
+
+	return pvtm_value;
+}
 
 static int rockchip_get_pvtm(struct device *dev, struct device_node *np,
 			     char *reg_name)
@@ -750,7 +845,10 @@
 	char name[NAME_MAX];
 	int pvtm, ret;
 
-	pvtm = rockchip_get_pvtm(dev, np, reg_name);
+	if (of_property_read_bool(np, "rockchip,pvtm-pvtpll"))
+		pvtm = rockchip_get_pvtm_pvtpll(dev, np, reg_name);
+	else
+		pvtm = rockchip_get_pvtm(dev, np, reg_name);
 	if (pvtm <= 0)
 		return;
 
@@ -910,8 +1008,9 @@
 	struct sel_table *irdrop_table = NULL;
 	struct opp_table *opp_table;
 	struct dev_pm_opp *opp;
+	unsigned long tmp_safe_rate = 0;
 	int evb_irdrop = 0, board_irdrop, delta_irdrop;
-	int tmp_safe_rate = 0, opp_rate, i, ret = 0;
+	int opp_rate, i, ret = 0;
 	u32 max_volt = UINT_MAX;
 	bool reach_max_volt = false;
 
@@ -1003,6 +1102,44 @@
 	mutex_unlock(&opp_table->lock);
 }
 
+static void rockchip_adjust_opp_by_otp(struct device *dev,
+				       struct device_node *np)
+{
+	struct dev_pm_opp *opp;
+	struct opp_table *opp_table;
+	struct otp_opp_info opp_info = {};
+	int ret;
+
+	ret = rockchip_nvmem_cell_read_common(np, "opp-info", &opp_info,
+					      sizeof(opp_info));
+	if (ret || !opp_info.volt)
+		return;
+
+	dev_info(dev, "adjust opp-table by otp: min=%uM, max=%uM, volt=%umV\n",
+		 opp_info.min_freq, opp_info.max_freq, opp_info.volt);
+
+	opp_table = dev_pm_opp_get_opp_table(dev);
+	if (!opp_table)
+		return;
+
+	mutex_lock(&opp_table->lock);
+	list_for_each_entry(opp, &opp_table->opp_list, node) {
+		if (!opp->available)
+			continue;
+		if (opp->rate < opp_info.min_freq * 1000000)
+			continue;
+		if (opp->rate > opp_info.max_freq * 1000000)
+			continue;
+
+		opp->supplies->u_volt += opp_info.volt * 1000;
+		if (opp->supplies->u_volt > opp->supplies->u_volt_max)
+			opp->supplies->u_volt = opp->supplies->u_volt_max;
+	}
+	mutex_unlock(&opp_table->lock);
+
+	dev_pm_opp_put_opp_table(opp_table);
+}
+
 static int rockchip_adjust_opp_table(struct device *dev,
 				     unsigned long scale_rate)
 {
@@ -1049,6 +1186,7 @@
 	of_property_read_u32(np, "rockchip,avs-enable", &avs);
 	of_property_read_u32(np, "rockchip,avs", &avs);
 	of_property_read_u32(np, "rockchip,avs-scale", &avs_scale);
+	rockchip_adjust_opp_by_otp(dev, np);
 	rockchip_adjust_opp_by_mbist_vmin(dev, np);
 	rockchip_adjust_opp_by_irdrop(dev, np, &safe_rate, &max_rate);
 
diff --git a/kernel/drivers/soc/rockchip/rockchip_pm_config.c b/kernel/drivers/soc/rockchip/rockchip_pm_config.c
index 659bab2..6c12ef8 100644
--- a/kernel/drivers/soc/rockchip/rockchip_pm_config.c
+++ b/kernel/drivers/soc/rockchip/rockchip_pm_config.c
@@ -59,6 +59,7 @@
 	{ .compatible = "rockchip,pm-rk3328",},
 	{ .compatible = "rockchip,pm-rk3368",},
 	{ .compatible = "rockchip,pm-rk3399",},
+	{ .compatible = "rockchip,pm-rk3528",},
 	{ .compatible = "rockchip,pm-rk3568",},
 	{ .compatible = "rockchip,pm-rv1126",},
 	{ },
diff --git a/kernel/drivers/soc/rockchip/rockchip_system_monitor.c b/kernel/drivers/soc/rockchip/rockchip_system_monitor.c
index 8a84d02..ffb95c0 100644
--- a/kernel/drivers/soc/rockchip/rockchip_system_monitor.c
+++ b/kernel/drivers/soc/rockchip/rockchip_system_monitor.c
@@ -68,6 +68,7 @@
 	int temp_hysteresis;
 	unsigned int delay;
 	bool is_temp_offline;
+	bool boosted;
 };
 
 static unsigned long system_status;
@@ -288,6 +289,7 @@
 {
 	struct video_info *video_info;
 	unsigned int max_res = 0, max_stream_bitrate = 0, res = 0;
+	unsigned int max_video_framerate = 0;
 
 	mutex_lock(&video_info_mutex);
 	if (list_empty(&video_info_list)) {
@@ -302,6 +304,8 @@
 			max_res = res;
 		if (video_info->streamBitrate > max_stream_bitrate)
 			max_stream_bitrate = video_info->streamBitrate;
+		if (video_info->videoFramerate > max_video_framerate)
+			max_video_framerate = video_info->videoFramerate;
 	}
 	mutex_unlock(&video_info_mutex);
 
@@ -310,8 +314,9 @@
 	} else {
 		if (max_stream_bitrate == 10)
 			rockchip_set_system_status(SYS_STATUS_VIDEO_4K_10B);
-		else
-			rockchip_set_system_status(SYS_STATUS_VIDEO_4K);
+		if (max_video_framerate == 60)
+			rockchip_set_system_status(SYS_STATUS_VIDEO_4K_60P);
+		rockchip_set_system_status(SYS_STATUS_VIDEO_4K);
 	}
 }
 
@@ -737,6 +742,20 @@
 }
 EXPORT_SYMBOL(rockchip_monitor_cpu_high_temp_adjust);
 
+void rockchip_monitor_set_boosted(void)
+{
+	if (system_monitor)
+		system_monitor->boosted = true;
+}
+EXPORT_SYMBOL(rockchip_monitor_set_boosted);
+
+void rockchip_monitor_clear_boosted(void)
+{
+	if (system_monitor)
+		system_monitor->boosted = false;
+}
+EXPORT_SYMBOL(rockchip_monitor_clear_boosted);
+
 static int rockchip_monitor_update_devfreq(struct devfreq *df)
 {
 	int ret = 0;
@@ -764,6 +783,8 @@
 	if (info->devp && info->devp->data) {
 		df = (struct devfreq *)info->devp->data;
 		rockchip_monitor_update_devfreq(df);
+	} else if (info->devp && info->devp->low_temp_adjust_volt) {
+		info->devp->low_temp_adjust_volt(info);
 	}
 
 	return 0;
@@ -1120,7 +1141,7 @@
 
 	monitor_set_freq_table(dev, info);
 
-	if (info->devp->type == MONITOR_TPYE_DEV) {
+	if (info->devp->type == MONITOR_TPYE_DEV && info->devp->data) {
 		info->devfreq_nb.notifier_call =
 			system_monitor_devfreq_notifier_call;
 		devfreq = (struct devfreq *)info->devp->data;
@@ -1154,11 +1175,12 @@
 	list_del(&info->node);
 	up_write(&mdev_list_sem);
 
-	devfreq = (struct devfreq *)info->devp->data;
-	if (info->devp->type == MONITOR_TPYE_DEV)
+	if (info->devp->type == MONITOR_TPYE_DEV && info->devp->data) {
+		devfreq = (struct devfreq *)info->devp->data;
 		devm_devfreq_unregister_notifier(info->dev, devfreq,
 						 &info->devfreq_nb,
 						 DEVFREQ_TRANSITION_NOTIFIER);
+	}
 
 	kfree(info->low_temp_adjust_table);
 	kfree(info->opp_table);
@@ -1413,7 +1435,8 @@
 			if (limit_freq > info->wide_temp_limit / 1000)
 				limit_freq = info->wide_temp_limit / 1000;
 		}
-		if (info->status_max_limit &&
+		if (!system_monitor->boosted &&
+		    info->status_max_limit &&
 		    limit_freq > info->status_max_limit)
 			limit_freq = info->status_max_limit;
 
diff --git a/kernel/drivers/soc/rockchip/rockchip_thunderboot_mmc.c b/kernel/drivers/soc/rockchip/rockchip_thunderboot_mmc.c
index ba16186..1061881 100644
--- a/kernel/drivers/soc/rockchip/rockchip_thunderboot_mmc.c
+++ b/kernel/drivers/soc/rockchip/rockchip_thunderboot_mmc.c
@@ -2,6 +2,7 @@
 /*
  * Copyright (C) 2020 Rockchip Electronics Co., Ltd.
  */
+#include <linux/clk.h>
 #include <linux/iopoll.h>
 #include <linux/kernel.h>
 #include <linux/kthread.h>
@@ -27,6 +28,8 @@
 	struct resource *res;
 	struct device_node *rds, *rdd, *dma;
 	struct device *dev = &pdev->dev;
+	struct clk_bulk_data *clk_bulks;
+	int clk_num;
 	u32 status;
 
 	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
@@ -39,6 +42,18 @@
 	rds = of_parse_phandle(dev->of_node, "memory-region-src", 0);
 	rdd = of_parse_phandle(dev->of_node, "memory-region-dst", 0);
 	dma = of_parse_phandle(dev->of_node, "memory-region-idmac", 0);
+
+	clk_num = clk_bulk_get_all(&pdev->dev, &clk_bulks);
+	if (clk_num >= 0) {
+		ret = clk_bulk_prepare_enable(clk_num, clk_bulks);
+		if (ret) {
+			dev_err(&pdev->dev, "failed to enable clocks\n");
+			return ret;
+		}
+	} else {
+		dev_err(&pdev->dev, "failed to get clks property\\n");
+		return clk_num;
+	}
 
 	if (readl_poll_timeout(regs + SDMMC_STATUS, status,
 			       !(status & (BIT(10) | GENMASK(7, 4))), 100,
@@ -95,6 +110,8 @@
 	}
 
 out:
+	clk_bulk_disable_unprepare(clk_num, clk_bulks);
+	clk_bulk_put_all(clk_num, clk_bulks);
 	of_node_put(rds);
 	of_node_put(rdd);
 	of_node_put(dma);
diff --git a/kernel/drivers/soc/rockchip/sdmmc_vendor_storage.c b/kernel/drivers/soc/rockchip/sdmmc_vendor_storage.c
index f2d6067..412bc59 100644
--- a/kernel/drivers/soc/rockchip/sdmmc_vendor_storage.c
+++ b/kernel/drivers/soc/rockchip/sdmmc_vendor_storage.c
@@ -23,41 +23,15 @@
 #include <linux/soc/rockchip/rk_vendor_storage.h>
 #include <linux/kthread.h>
 #include <linux/delay.h>
+#include <misc/rkflash_vendor_storage.h>
 
 #define EMMC_IDB_PART_OFFSET		64
 #define EMMC_SYS_PART_OFFSET		8064
 #define EMMC_BOOT_PART_SIZE		1024
 #define EMMC_VENDOR_PART_START		(1024 * 7)
-#define EMMC_VENDOR_PART_SIZE		128
+#define EMMC_VENDOR_PART_SIZE		VENDOR_PART_SIZE
 #define EMMC_VENDOR_PART_NUM		4
-#define EMMC_VENDOR_TAG			0x524B5644
-
-struct rk_vendor_req {
-	u32 tag;
-	u16 id;
-	u16 len;
-	u8 data[1024];
-};
-
-struct vendor_item {
-	u16  id;
-	u16  offset;
-	u16  size;
-	u16  flag;
-};
-
-struct vendor_info {
-	u32	tag;
-	u32	version;
-	u16	next_index;
-	u16	item_num;
-	u16	free_offset;
-	u16	free_size;
-	struct	vendor_item item[126]; /* 126 * 8*/
-	u8	data[EMMC_VENDOR_PART_SIZE * 512 - 1024 - 8];
-	u32	hash;
-	u32	version2;
-};
+#define EMMC_VENDOR_TAG			VENDOR_HEAD_TAG
 
 #ifdef CONFIG_ROCKCHIP_VENDOR_STORAGE_UPDATE_LOADER
 #define READ_SECTOR_IO		_IOW('r', 0x04, unsigned int)
@@ -67,10 +41,6 @@
 #define GET_BAD_BLOCK_IO	_IOW('r', 0x03, unsigned int)
 #define GET_LOCK_FLAG_IO	_IOW('r', 0x53, unsigned int)
 #endif
-
-#define VENDOR_REQ_TAG		0x56524551
-#define VENDOR_READ_IO		_IOW('v', 0x01, unsigned int)
-#define VENDOR_WRITE_IO		_IOW('v', 0x02, unsigned int)
 
 static u8 *g_idb_buffer;
 static struct vendor_info *g_vendor;
@@ -406,7 +376,7 @@
 {
 	long ret = -1;
 	int size;
-	struct rk_vendor_req *v_req;
+	struct RK_VENDOR_REQ *v_req;
 	u32 *page_buf;
 
 	page_buf = kmalloc(4096, GFP_KERNEL);
@@ -415,7 +385,7 @@
 
 	mutex_lock(&vendor_ops_mutex);
 
-	v_req = (struct rk_vendor_req *)page_buf;
+	v_req = (struct RK_VENDOR_REQ *)page_buf;
 
 	switch (cmd) {
 	case VENDOR_READ_IO:
@@ -574,7 +544,7 @@
 	return ret;
 }
 
-const struct file_operations vendor_storage_fops = {
+static const struct file_operations vendor_storage_fops = {
 	.open = vendor_storage_open,
 	.compat_ioctl	= vendor_storage_ioctl,
 	.unlocked_ioctl = vendor_storage_ioctl,
diff --git a/kernel/drivers/spi/spi-rockchip-test.c b/kernel/drivers/spi/spi-rockchip-test.c
index 1d4e9af..d97a5c4 100644
--- a/kernel/drivers/spi/spi-rockchip-test.c
+++ b/kernel/drivers/spi/spi-rockchip-test.c
@@ -102,7 +102,11 @@
 
 	spi_message_init(&m);
 	spi_message_add_tail(&t, &m);
-	return spi_sync(spi, &m);
+	ret = spi_sync(spi, &m);
+	if (m.actual_length && m.actual_length != n)
+		pr_err("%s len=%d actual_length=%d\n", __func__, n, m.actual_length);
+
+	return ret;
 }
 
 int spi_read_slt(int id, void *rxbuf, size_t n)
@@ -127,7 +131,11 @@
 
 	spi_message_init(&m);
 	spi_message_add_tail(&t, &m);
-	return spi_sync(spi, &m);
+	ret = spi_sync(spi, &m);
+	if (m.actual_length && m.actual_length != n)
+		pr_err("%s len=%d actual_length=%d\n", __func__, n, m.actual_length);
+
+	return ret;
 }
 
 int spi_write_then_read_slt(int id, const void *txbuf, unsigned n_tx,
diff --git a/kernel/drivers/spi/spi-rockchip.c b/kernel/drivers/spi/spi-rockchip.c
index 8604291..e55c5c6 100644
--- a/kernel/drivers/spi/spi-rockchip.c
+++ b/kernel/drivers/spi/spi-rockchip.c
@@ -14,6 +14,7 @@
  */
 
 #include <linux/clk.h>
+#include <linux/delay.h>
 #include <linux/dmaengine.h>
 #include <linux/gpio.h>
 #include <linux/interrupt.h>
@@ -181,6 +182,12 @@
 
 #define ROCKCHIP_SPI_REGISTER_SIZE		0x1000
 
+enum rockchip_spi_xfer_mode {
+	ROCKCHIP_SPI_DMA,
+	ROCKCHIP_SPI_IRQ,
+	ROCKCHIP_SPI_POLL,
+};
+
 struct rockchip_spi_quirks {
 	u32 max_baud_div_in_cpha;
 };
@@ -201,7 +208,9 @@
 	unsigned int rx_left;
 
 	atomic_t state;
+	struct completion xfer_done;
 
+	u32 version;
 	/*depth of the FIFO buffer */
 	u32 fifo_len;
 	/* frequency of spiclk */
@@ -211,11 +220,13 @@
 
 	u8 n_bytes;
 	u8 rsd;
+	u8 csm;
+	bool poll; /* only support transfer data by cpu polling */
 
 	bool cs_asserted[ROCKCHIP_SPI_MAX_CS_NUM];
 
 	struct pinctrl_state *high_speed_state;
-	bool slave_abort;
+	bool slave_aborted;
 	bool gpio_requested;
 	bool cs_inactive; /* spi slave tansmition stop when cs inactive */
 	struct spi_transfer *xfer; /* Store xfer temporarily */
@@ -231,17 +242,29 @@
 	writel_relaxed((enable ? 1U : 0U), rs->regs + ROCKCHIP_SPI_SSIENR);
 }
 
-static inline void wait_for_idle(struct rockchip_spi *rs, bool slave_mode)
+static inline void wait_for_tx_idle(struct rockchip_spi *rs, bool slave_mode)
 {
 	unsigned long timeout = jiffies + msecs_to_jiffies(5);
+	u32 bit_filed = SR_BUSY;
+	u32 idle_val = 0;
+	uint32_t speed, us;
+
+	if (slave_mode && rs->version == ROCKCHIP_SPI_VER2_TYPE2) {
+		bit_filed = SR_SLAVE_TX_BUSY;
+		idle_val = 0;
+	} else if (slave_mode) {
+		bit_filed = SR_TF_EMPTY;
+		idle_val = 1;
+	}
 
 	do {
-		if (slave_mode) {
-			if (!(readl_relaxed(rs->regs + ROCKCHIP_SPI_SR) & SR_SLAVE_TX_BUSY))
-				return;
-		} else {
-			if (!(readl_relaxed(rs->regs + ROCKCHIP_SPI_SR) & SR_BUSY))
-				return;
+		if ((readl_relaxed(rs->regs + ROCKCHIP_SPI_SR) & bit_filed) == idle_val) {
+			if (bit_filed == SR_TF_EMPTY) {
+				speed = rs->speed_hz;
+				us = (8 * 1000000 / speed) * 2;
+				udelay(us);
+			}
+			return;
 		}
 	} while (!time_after(jiffies, timeout));
 
@@ -250,11 +273,7 @@
 
 static u32 get_fifo_len(struct rockchip_spi *rs)
 {
-	u32 ver;
-
-	ver = readl_relaxed(rs->regs + ROCKCHIP_SPI_VERSION);
-
-	switch (ver) {
+	switch (rs->version) {
 	case ROCKCHIP_SPI_VER2_TYPE1:
 	case ROCKCHIP_SPI_VER2_TYPE2:
 		return 64;
@@ -299,6 +318,11 @@
 {
 	struct rockchip_spi *rs = spi_controller_get_devdata(ctlr);
 
+	dev_err(rs->dev, "state=%x\n", atomic_read(&rs->state));
+	dev_err(rs->dev, "tx_left=%x\n", rs->tx_left);
+	dev_err(rs->dev, "rx_left=%x\n", rs->rx_left);
+	print_hex_dump(KERN_ERR, "regs ", DUMP_PREFIX_OFFSET, 4, 4, rs->regs, 0x4c, 0);
+
 	/* stop running spi transfer
 	 * this also flushes both rx and tx fifos
 	 */
@@ -313,6 +337,7 @@
 
 	if (atomic_read(&rs->state) & RXDMA)
 		dmaengine_terminate_async(ctlr->dma_rx);
+	atomic_set(&rs->state, 0);
 }
 
 static void rockchip_spi_pio_writer(struct rockchip_spi *rs)
@@ -374,7 +399,7 @@
 	struct rockchip_spi *rs = spi_controller_get_devdata(ctlr);
 
 	/* When int_cs_inactive comes, spi slave abort */
-	if (readl_relaxed(rs->regs + ROCKCHIP_SPI_IMR) & INT_CS_INACTIVE) {
+	if (rs->cs_inactive && readl_relaxed(rs->regs + ROCKCHIP_SPI_ISR) & INT_CS_INACTIVE) {
 		ctlr->slave_abort(ctlr);
 		writel_relaxed(0, rs->regs + ROCKCHIP_SPI_IMR);
 		writel_relaxed(0xffffffff, rs->regs + ROCKCHIP_SPI_ICR);
@@ -390,7 +415,7 @@
 		spi_enable_chip(rs, false);
 		writel_relaxed(0, rs->regs + ROCKCHIP_SPI_IMR);
 		writel_relaxed(0xffffffff, rs->regs + ROCKCHIP_SPI_ICR);
-		spi_finalize_current_transfer(ctlr);
+		complete(&rs->xfer_done);
 	}
 
 	return IRQ_HANDLED;
@@ -400,8 +425,6 @@
 				    struct spi_controller *ctlr,
 				    struct spi_transfer *xfer)
 {
-	rs->tx = xfer->tx_buf;
-	rs->rx = xfer->rx_buf;
 	rs->tx_left = rs->tx ? xfer->len / rs->n_bytes : 0;
 	rs->rx_left = xfer->len / rs->n_bytes;
 
@@ -427,14 +450,16 @@
 	struct rockchip_spi *rs = spi_controller_get_devdata(ctlr);
 	int state = atomic_fetch_andnot(RXDMA, &rs->state);
 
-	if (state & TXDMA && !rs->slave_abort)
+	if (state & TXDMA && !rs->slave_aborted)
 		return;
 
 	if (rs->cs_inactive)
 		writel_relaxed(0, rs->regs + ROCKCHIP_SPI_IMR);
 
 	spi_enable_chip(rs, false);
-	spi_finalize_current_transfer(ctlr);
+	writel_relaxed(0, rs->regs + ROCKCHIP_SPI_IMR);
+	writel_relaxed(0xffffffff, rs->regs + ROCKCHIP_SPI_ICR);
+	complete(&rs->xfer_done);
 }
 
 static void rockchip_spi_dma_txcb(void *data)
@@ -443,14 +468,16 @@
 	struct rockchip_spi *rs = spi_controller_get_devdata(ctlr);
 	int state = atomic_fetch_andnot(TXDMA, &rs->state);
 
-	if (state & RXDMA && !rs->slave_abort)
+	if (state & RXDMA && !rs->slave_aborted)
 		return;
 
 	/* Wait until the FIFO data completely. */
-	wait_for_idle(rs, ctlr->slave);
+	wait_for_tx_idle(rs, ctlr->slave);
 
 	spi_enable_chip(rs, false);
-	spi_finalize_current_transfer(ctlr);
+	writel_relaxed(0, rs->regs + ROCKCHIP_SPI_IMR);
+	writel_relaxed(0xffffffff, rs->regs + ROCKCHIP_SPI_ICR);
+	complete(&rs->xfer_done);
 }
 
 static u32 rockchip_spi_calc_burst_size(u32 data_len)
@@ -472,9 +499,6 @@
 	struct dma_async_tx_descriptor *rxdesc, *txdesc;
 
 	atomic_set(&rs->state, 0);
-
-	rs->tx = xfer->tx_buf;
-	rs->rx = xfer->rx_buf;
 
 	rxdesc = NULL;
 	if (xfer->rx_buf) {
@@ -545,9 +569,59 @@
 	return 1;
 }
 
-static void rockchip_spi_config(struct rockchip_spi *rs,
+static int rockchip_spi_pio_transfer(struct rockchip_spi *rs,
+		struct spi_controller *ctlr, struct spi_transfer *xfer)
+{
+	unsigned long time, timeout;
+	u32 speed_hz = xfer->speed_hz;
+	unsigned long long ms;
+	int ret = 0;
+
+	if (!speed_hz)
+		speed_hz = 100000;
+
+	ms = 8LL * 1000LL * xfer->len;
+	do_div(ms, speed_hz);
+	ms += ms + 200; /* some tolerance */
+
+	if (ms > UINT_MAX || ctlr->slave)
+		ms = UINT_MAX;
+
+	timeout = jiffies + msecs_to_jiffies(ms);
+	time = jiffies;
+	rs->tx_left = rs->tx ? xfer->len / rs->n_bytes : 0;
+	rs->rx_left = rs->rx ? xfer->len / rs->n_bytes : 0;
+
+	spi_enable_chip(rs, true);
+
+	while (rs->tx_left || rs->rx_left) {
+		if (rs->tx)
+			rockchip_spi_pio_writer(rs);
+
+		if (rs->rx)
+			rockchip_spi_pio_reader(rs);
+
+		cpu_relax();
+
+		if (time_after(time, timeout)) {
+			ret = -EIO;
+			goto out;
+		}
+	};
+
+	/* If tx, wait until the FIFO data completely. */
+	if (rs->tx)
+		wait_for_tx_idle(rs, ctlr->slave);
+
+out:
+	spi_enable_chip(rs, false);
+
+	return ret;
+}
+
+static int rockchip_spi_config(struct rockchip_spi *rs,
 		struct spi_device *spi, struct spi_transfer *xfer,
-		bool use_dma, bool slave_mode)
+		enum rockchip_spi_xfer_mode xfer_mode, bool slave_mode)
 {
 	u32 cr0 = CR0_FRF_SPI  << CR0_FRF_OFFSET
 		| CR0_BHT_8BIT << CR0_BHT_OFFSET
@@ -558,21 +632,33 @@
 
 	if (slave_mode)
 		cr0 |= CR0_OPM_SLAVE << CR0_OPM_OFFSET;
-	rs->slave_abort = false;
+	rs->slave_aborted = false;
 
 	cr0 |= rs->rsd << CR0_RSD_OFFSET;
+	cr0 |= rs->csm << CR0_CSM_OFFSET;
 	cr0 |= (spi->mode & 0x3U) << CR0_SCPH_OFFSET;
 	if (spi->mode & SPI_LSB_FIRST)
 		cr0 |= CR0_FBM_LSB << CR0_FBM_OFFSET;
 	if (spi->mode & SPI_CS_HIGH)
 		cr0 |= BIT(spi->chip_select) << CR0_SOI_OFFSET;
 
-	if (xfer->rx_buf && xfer->tx_buf)
+	if (xfer->rx_buf && xfer->tx_buf) {
 		cr0 |= CR0_XFM_TR << CR0_XFM_OFFSET;
-	else if (xfer->rx_buf)
+	} else if (xfer->rx_buf) {
 		cr0 |= CR0_XFM_RO << CR0_XFM_OFFSET;
-	else if (use_dma)
-		cr0 |= CR0_XFM_TO << CR0_XFM_OFFSET;
+	} else if (xfer->tx_buf) {
+		/*
+		 * Use the water line of rx fifo in full duplex mode to trigger
+		 * the interruption of tx irq transmission completion.
+		 */
+		if (xfer_mode == ROCKCHIP_SPI_IRQ)
+			cr0 |= CR0_XFM_TR << CR0_XFM_OFFSET;
+		else
+			cr0 |= CR0_XFM_TO << CR0_XFM_OFFSET;
+	} else {
+		dev_err(rs->dev, "no transmission buffer\n");
+		return -EINVAL;
+	}
 
 	switch (xfer->bits_per_word) {
 	case 4:
@@ -595,7 +681,7 @@
 		unreachable();
 	}
 
-	if (use_dma) {
+	if (xfer_mode == ROCKCHIP_SPI_DMA) {
 		if (xfer->tx_buf)
 			dmacr |= TF_DMA_EN;
 		if (xfer->rx_buf)
@@ -652,6 +738,8 @@
 	writel_relaxed(2 * DIV_ROUND_UP(rs->freq, 2 * xfer->speed_hz),
 			rs->regs + ROCKCHIP_SPI_BAUDR);
 	rs->speed_hz = xfer->speed_hz;
+
+	return 0;
 }
 
 static size_t rockchip_spi_max_transfer_size(struct spi_device *spi)
@@ -663,50 +751,54 @@
 {
 	struct rockchip_spi *rs = spi_controller_get_devdata(ctlr);
 	u32 rx_fifo_left;
-	struct dma_tx_state state;
-	enum dma_status status;
 
-	/* Get current dma rx point */
-	if (atomic_read(&rs->state) & RXDMA) {
-		dmaengine_pause(ctlr->dma_rx);
-		status = dmaengine_tx_status(ctlr->dma_rx, ctlr->dma_rx->cookie, &state);
-		if (status == DMA_ERROR) {
-			rs->rx = rs->xfer->rx_buf;
-			rs->xfer->len = 0;
-			rx_fifo_left = readl_relaxed(rs->regs + ROCKCHIP_SPI_RXFLR);
-			for (; rx_fifo_left; rx_fifo_left--)
-				readl_relaxed(rs->regs + ROCKCHIP_SPI_RXDR);
-			goto out;
-		} else {
-			rs->rx += rs->xfer->len - rs->n_bytes * state.residue;
-		}
-	}
+	/* Flush rx fifo */
+	rx_fifo_left = readl_relaxed(rs->regs + ROCKCHIP_SPI_RXFLR);
+	for (; rx_fifo_left; rx_fifo_left--)
+		readl_relaxed(rs->regs + ROCKCHIP_SPI_RXDR);
 
-	/* Get the valid data left in rx fifo and set rs->xfer->len real rx size */
-	if (rs->rx) {
-		rx_fifo_left = readl_relaxed(rs->regs + ROCKCHIP_SPI_RXFLR);
-		for (; rx_fifo_left; rx_fifo_left--) {
-			u32 rxw = readl_relaxed(rs->regs + ROCKCHIP_SPI_RXDR);
+	rs->slave_aborted = true;
+	complete(&rs->xfer_done);
 
-			if (rs->n_bytes == 1)
-				*(u8 *)rs->rx = (u8)rxw;
-			else
-				*(u16 *)rs->rx = (u16)rxw;
-			rs->rx += rs->n_bytes;
+	return 0;
+}
+
+static int rockchip_spi_transfer_wait(struct spi_controller *ctlr,
+				      struct spi_transfer *xfer)
+{
+	struct rockchip_spi *rs = spi_controller_get_devdata(ctlr);
+	u32 speed_hz = xfer->speed_hz;
+	unsigned long long ms;
+
+	if (spi_controller_is_slave(ctlr)) {
+		if (wait_for_completion_interruptible(&rs->xfer_done)) {
+			dev_dbg(rs->dev, "RK SPI transfer interrupted\n");
+			return -EINTR;
 		}
 
-		rs->xfer->len = (unsigned int)(rs->rx - rs->xfer->rx_buf);
-	}
+		if (rs->slave_aborted) {
+			dev_err(rs->dev, "RK SPI transfer slave abort\n");
+			return -EIO;
+		}
+	} else {
+		if (!speed_hz)
+			speed_hz = 100000;
 
-out:
-	if (atomic_read(&rs->state) & RXDMA)
-		dmaengine_terminate_sync(ctlr->dma_rx);
-	if (atomic_read(&rs->state) & TXDMA)
-		dmaengine_terminate_sync(ctlr->dma_tx);
-	atomic_set(&rs->state, 0);
-	spi_enable_chip(rs, false);
-	rs->slave_abort = true;
-	complete(&ctlr->xfer_completion);
+		ms = 8LL * 1000LL * xfer->len;
+		do_div(ms, speed_hz);
+		ms += ms + 200; /* some tolerance */
+
+		if (ms > UINT_MAX)
+			ms = UINT_MAX;
+
+		ms = wait_for_completion_timeout(&rs->xfer_done,
+						 msecs_to_jiffies(ms));
+
+		if (ms == 0) {
+			dev_err(rs->dev, "RK SPI transfer timed out\n");
+			return -ETIMEDOUT;
+		}
+	}
 
 	return 0;
 }
@@ -717,11 +809,13 @@
 		struct spi_transfer *xfer)
 {
 	struct rockchip_spi *rs = spi_controller_get_devdata(ctlr);
+	int ret;
 	bool use_dma;
+	enum rockchip_spi_xfer_mode xfer_mode;
 
 	/* Zero length transfers won't trigger an interrupt on completion */
 	if (!xfer->len) {
-		spi_finalize_current_transfer(ctlr);
+		complete(&rs->xfer_done);
 		return 1;
 	}
 
@@ -740,14 +834,40 @@
 
 	rs->n_bytes = xfer->bits_per_word <= 8 ? 1 : 2;
 	rs->xfer = xfer;
-	use_dma = ctlr->can_dma ? ctlr->can_dma(ctlr, spi, xfer) : false;
+	if (rs->poll) {
+		xfer_mode = ROCKCHIP_SPI_POLL;
+	} else {
+		use_dma = ctlr->can_dma ? ctlr->can_dma(ctlr, spi, xfer) : false;
+		if (use_dma)
+			xfer_mode = ROCKCHIP_SPI_DMA;
+		else
+			xfer_mode = ROCKCHIP_SPI_IRQ;
+	}
 
-	rockchip_spi_config(rs, spi, xfer, use_dma, ctlr->slave);
+	ret = rockchip_spi_config(rs, spi, xfer, xfer_mode, ctlr->slave);
+	if (ret)
+		return ret;
 
-	if (use_dma)
-		return rockchip_spi_prepare_dma(rs, ctlr, xfer);
+	rs->tx = xfer->tx_buf;
+	rs->rx = xfer->rx_buf;
 
-	return rockchip_spi_prepare_irq(rs, ctlr, xfer);
+	reinit_completion(&rs->xfer_done);
+
+	switch (xfer_mode) {
+	case ROCKCHIP_SPI_POLL:
+		ret = rockchip_spi_pio_transfer(rs, ctlr, xfer);
+		break;
+	case ROCKCHIP_SPI_DMA:
+		ret = rockchip_spi_prepare_dma(rs, ctlr, xfer);
+		break;
+	default:
+		ret = rockchip_spi_prepare_irq(rs, ctlr, xfer);
+	}
+
+	if (ret > 0)
+		ret = rockchip_spi_transfer_wait(ctlr, xfer);
+
+	return ret;
 }
 
 static bool rockchip_spi_can_dma(struct spi_controller *ctlr,
@@ -879,7 +999,7 @@
 	struct spi_controller *ctlr;
 	struct resource *mem;
 	struct device_node *np = pdev->dev.of_node;
-	u32 rsd_nsecs;
+	u32 rsd_nsecs, csm;
 	bool slave_mode;
 	struct pinctrl *pinctrl = NULL;
 	const struct rockchip_spi_quirks *quirks_cfg;
@@ -968,6 +1088,16 @@
 		rs->rsd = rsd;
 	}
 
+	if (!device_property_read_u32(&pdev->dev, "csm", &csm)) {
+		if (csm > CR0_CSM_ONE)	{
+			dev_warn(rs->dev, "The csm value %u exceeds the limit, clamping at %u\n",
+				 csm, CR0_CSM_ONE);
+			csm = CR0_CSM_ONE;
+		}
+		rs->csm = csm;
+	}
+
+	rs->version = readl_relaxed(rs->regs + ROCKCHIP_SPI_VERSION);
 	rs->fifo_len = get_fifo_len(rs);
 	if (!rs->fifo_len) {
 		dev_err(&pdev->dev, "Failed to get fifo length\n");
@@ -1030,10 +1160,18 @@
 		ctlr->can_dma = rockchip_spi_can_dma;
 	}
 
-	switch (readl_relaxed(rs->regs + ROCKCHIP_SPI_VERSION)) {
+	rs->poll = device_property_read_bool(&pdev->dev, "rockchip,poll-only");
+	init_completion(&rs->xfer_done);
+	if (rs->poll && slave_mode) {
+		dev_err(rs->dev, "only support rockchip,poll-only property in master mode\n");
+		ret = -EINVAL;
+		goto err_free_dma_rx;
+	}
+
+	switch (rs->version) {
 	case ROCKCHIP_SPI_VER2_TYPE1:
 	case ROCKCHIP_SPI_VER2_TYPE2:
-		if (ctlr->can_dma && slave_mode)
+		if (slave_mode)
 			rs->cs_inactive = true;
 		else
 			rs->cs_inactive = false;
@@ -1041,7 +1179,6 @@
 	default:
 		rs->cs_inactive = false;
 	}
-
 	pinctrl = devm_pinctrl_get(&pdev->dev);
 	if (!IS_ERR(pinctrl)) {
 		rs->high_speed_state = pinctrl_lookup_state(pinctrl, "high_speed");
@@ -1072,6 +1209,8 @@
 		else
 			dev_info(&pdev->dev, "register misc device %s\n", misc_name);
 	}
+
+	dev_info(rs->dev, "probed, poll=%d, rsd=%d\n", rs->poll, rs->rsd);
 
 	return 0;
 
@@ -1120,51 +1259,6 @@
 	return 0;
 }
 
-#ifdef CONFIG_PM_SLEEP
-static int rockchip_spi_suspend(struct device *dev)
-{
-	int ret;
-	struct spi_controller *ctlr = dev_get_drvdata(dev);
-	struct rockchip_spi *rs = spi_controller_get_devdata(ctlr);
-
-	ret = spi_controller_suspend(ctlr);
-	if (ret < 0)
-		return ret;
-
-	clk_disable_unprepare(rs->spiclk);
-	clk_disable_unprepare(rs->apb_pclk);
-
-	pinctrl_pm_select_sleep_state(dev);
-
-	return 0;
-}
-
-static int rockchip_spi_resume(struct device *dev)
-{
-	int ret;
-	struct spi_controller *ctlr = dev_get_drvdata(dev);
-	struct rockchip_spi *rs = spi_controller_get_devdata(ctlr);
-
-	pinctrl_pm_select_default_state(dev);
-
-	ret = clk_prepare_enable(rs->apb_pclk);
-	if (ret < 0)
-		return ret;
-
-	ret = clk_prepare_enable(rs->spiclk);
-	if (ret < 0)
-		clk_disable_unprepare(rs->apb_pclk);
-
-	ret = spi_controller_resume(ctlr);
-	if (ret < 0) {
-		clk_disable_unprepare(rs->spiclk);
-		clk_disable_unprepare(rs->apb_pclk);
-	}
-
-	return 0;
-}
-#endif /* CONFIG_PM_SLEEP */
-
 #ifdef CONFIG_PM
 static int rockchip_spi_runtime_suspend(struct device *dev)
 {
@@ -1195,6 +1289,46 @@
 }
 #endif /* CONFIG_PM */
 
+#ifdef CONFIG_PM_SLEEP
+static int rockchip_spi_suspend(struct device *dev)
+{
+	int ret;
+	struct spi_controller *ctlr = dev_get_drvdata(dev);
+
+	ret = spi_controller_suspend(ctlr);
+	if (ret < 0)
+		return ret;
+
+	/* Avoid redundant clock disable */
+	if (!pm_runtime_status_suspended(dev))
+		rockchip_spi_runtime_suspend(dev);
+
+	pinctrl_pm_select_sleep_state(dev);
+
+	return 0;
+}
+
+static int rockchip_spi_resume(struct device *dev)
+{
+	int ret;
+	struct spi_controller *ctlr = dev_get_drvdata(dev);
+
+	pinctrl_pm_select_default_state(dev);
+
+	if (!pm_runtime_status_suspended(dev)) {
+		ret = rockchip_spi_runtime_resume(dev);
+		if (ret < 0)
+			return ret;
+	}
+
+	ret = spi_controller_resume(ctlr);
+	if (ret < 0)
+		rockchip_spi_runtime_suspend(dev);
+
+	return 0;
+}
+#endif /* CONFIG_PM_SLEEP */
+
 static const struct dev_pm_ops rockchip_spi_pm = {
 	SET_NOIRQ_SYSTEM_SLEEP_PM_OPS(rockchip_spi_suspend, rockchip_spi_resume)
 	SET_RUNTIME_PM_OPS(rockchip_spi_runtime_suspend,
diff --git a/kernel/drivers/staging/android/fiq_debugger/fiq_debugger.c b/kernel/drivers/staging/android/fiq_debugger/fiq_debugger.c
index 05823a1..73d29bb 100644
--- a/kernel/drivers/staging/android/fiq_debugger/fiq_debugger.c
+++ b/kernel/drivers/staging/android/fiq_debugger/fiq_debugger.c
@@ -1164,6 +1164,15 @@
 	tty_port_close(tty->port, tty, filp);
 }
 
+void fiq_tty_wake_up(struct platform_device *pdev)
+{
+	struct fiq_debugger_state *state = platform_get_drvdata(pdev);
+
+	if (tty_port_initialized(&state->tty_port))
+		tty_port_tty_wakeup(&state->tty_port);
+}
+EXPORT_SYMBOL_GPL(fiq_tty_wake_up);
+
 int  fiq_tty_write(struct tty_struct *tty, const unsigned char *buf, int count)
 {
 	int i;
@@ -1173,6 +1182,11 @@
 
 	if (!state->console_enable)
 		return count;
+
+#ifdef CONFIG_RK_CONSOLE_THREAD
+	if (state->pdata->tty_write)
+		return state->pdata->tty_write(state->pdev, buf, count);
+#endif
 
 	fiq_debugger_uart_enable(state);
 	spin_lock_irq(&state->console_lock);
@@ -1186,7 +1200,15 @@
 
 int  fiq_tty_write_room(struct tty_struct *tty)
 {
-	return 16;
+#ifdef CONFIG_RK_CONSOLE_THREAD
+	int line = tty->index;
+	struct fiq_debugger_state **states = tty->driver->driver_state;
+	struct fiq_debugger_state *state = states[line];
+
+	if (state->pdata->write_room)
+		return state->pdata->write_room(state->pdev);
+#endif
+	return 2048;
 }
 
 #ifdef CONFIG_CONSOLE_POLL
diff --git a/kernel/drivers/staging/android/fiq_debugger/fiq_debugger.h b/kernel/drivers/staging/android/fiq_debugger/fiq_debugger.h
index 2e7e33e..1b9f28b 100644
--- a/kernel/drivers/staging/android/fiq_debugger/fiq_debugger.h
+++ b/kernel/drivers/staging/android/fiq_debugger/fiq_debugger.h
@@ -63,6 +63,8 @@
 #ifdef CONFIG_RK_CONSOLE_THREAD
 	void (*console_write)(struct platform_device *pdev, const char *s,
 			      unsigned int count);
+	int (*tty_write)(struct platform_device *pdev, const char *s, int count);
+	int (*write_room)(struct platform_device *pdev);
 #endif
 #ifdef CONFIG_FIQ_DEBUGGER_TRUST_ZONE
 	void (*switch_cpu)(struct platform_device *pdev, u32 cpu);
@@ -70,4 +72,5 @@
 #endif
 };
 
+void fiq_tty_wake_up(struct platform_device *pdev);
 #endif
diff --git a/kernel/drivers/staging/android/ion/ion_trace.h b/kernel/drivers/staging/android/ion/ion_trace.h
index 8233691..3b1a8b3 100644
--- a/kernel/drivers/staging/android/ion/ion_trace.h
+++ b/kernel/drivers/staging/android/ion/ion_trace.h
@@ -14,7 +14,7 @@
 #include <linux/tracepoint.h>
 
 #ifndef __ION_PTR_TO_HASHVAL
-static unsigned int __ion_ptr_to_hash(const void *ptr)
+static inline unsigned int __ion_ptr_to_hash(const void *ptr)
 {
 	unsigned long hashval;
 
diff --git a/kernel/drivers/staging/android/vsoc.c b/kernel/drivers/staging/android/vsoc.c
index 034d868..d089b2c 100644
--- a/kernel/drivers/staging/android/vsoc.c
+++ b/kernel/drivers/staging/android/vsoc.c
@@ -438,12 +438,10 @@
 			return -EINVAL;
 		wake_time = ktime_set(arg->wake_time_sec, arg->wake_time_nsec);
 
-		hrtimer_init_on_stack(&to->timer, CLOCK_MONOTONIC,
-				      HRTIMER_MODE_ABS);
+		hrtimer_init_sleeper_on_stack(to, CLOCK_MONOTONIC,
+					      HRTIMER_MODE_ABS, current);
 		hrtimer_set_expires_range_ns(&to->timer, wake_time,
 					     current->timer_slack_ns);
-
-		hrtimer_init_sleeper(to, current);
 	}
 
 	while (1) {
diff --git a/kernel/drivers/tee/optee/supp.c b/kernel/drivers/tee/optee/supp.c
index 43626e1..3e644a1 100644
--- a/kernel/drivers/tee/optee/supp.c
+++ b/kernel/drivers/tee/optee/supp.c
@@ -91,6 +91,9 @@
 	struct optee_supp_req *req = kzalloc(sizeof(*req), GFP_KERNEL);
 	bool interruptable;
 	u32 ret;
+	unsigned long timeleft;
+	int id;
+	struct optee_supp_req *get_req;
 
 	if (!req)
 		return TEEC_ERROR_OUT_OF_MEMORY;
@@ -115,8 +118,17 @@
 	 * exclusive access again.
 	 */
 	while (wait_for_completion_interruptible(&req->c)) {
+		pr_err("Warning, Interrupting an RPC to supplicant!\n");
+		timeleft = wait_for_completion_timeout(&req->c, msecs_to_jiffies(2000));
+		if (timeleft) {
+			/* get completion, it means tee-supplicant is alive. */
+			break;
+		} else {
+			/* timeout, it means tee-supplicant is dead, interrupting an RPC. */
+			interruptable = true;
+		}
+
 		mutex_lock(&supp->mutex);
-		interruptable = !supp->ctx;
 		if (interruptable) {
 			/*
 			 * There's no supplicant available and since the
@@ -135,6 +147,14 @@
 				list_del(&req->link);
 				req->in_queue = false;
 			}
+
+			idr_for_each_entry(&supp->idr, get_req, id) {
+				if (get_req == req) {
+					idr_remove(&supp->idr, id);
+					supp->req_id = -1;
+					break;
+				}
+			}
 		}
 		mutex_unlock(&supp->mutex);
 
diff --git a/kernel/drivers/thermal/cpu_cooling.c b/kernel/drivers/thermal/cpu_cooling.c
index c1888d0..4032f9d 100644
--- a/kernel/drivers/thermal/cpu_cooling.c
+++ b/kernel/drivers/thermal/cpu_cooling.c
@@ -195,7 +195,7 @@
 {
 	int i;
 
-	for (i = cpufreq_cdev->max_level; i >= 0; i--) {
+	for (i = cpufreq_cdev->max_level; i > 0; i--) {
 		if (power >= cpufreq_cdev->em->table[i].power)
 			break;
 	}
diff --git a/kernel/drivers/thermal/rockchip_thermal.c b/kernel/drivers/thermal/rockchip_thermal.c
index 7d2ad2e..01ad033 100644
--- a/kernel/drivers/thermal/rockchip_thermal.c
+++ b/kernel/drivers/thermal/rockchip_thermal.c
@@ -230,6 +230,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)
@@ -240,6 +241,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))
@@ -253,6 +255,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
@@ -264,6 +267,9 @@
 #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 TSADCV2_USER_INTER_PD_SOC		0x340 /* 13 clocks */
 #define TSADCV5_USER_INTER_PD_SOC		0xfc0 /* 97us, at least 90us */
@@ -278,6 +284,7 @@
 #define RK1808_BUS_GRF_SOC_CON0			0x0400
 
 #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)
@@ -299,9 +306,11 @@
 #define PX30S_TSADC_TDC_MODE			(0x10001 << 4)
 #define PX30S_TSADC_TRIM			(0xf0007 << 0)
 
-#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)
@@ -325,9 +334,9 @@
 	int temp;
 };
 
-
 static const struct tsadc_table rv1108_table[] = {
-	{0, -40000},
+	{0, MIN_TEMP},
+	{342, MIN_TEMP},
 	{374, -40000},
 	{382, -35000},
 	{389, -30000},
@@ -362,11 +371,13 @@
 	{618, 115000},
 	{626, 120000},
 	{634, 125000},
-	{TSADCV2_DATA_MASK, 125000},
+	{722, MAX_TEMP},
+	{TSADCV2_DATA_MASK, MAX_TEMP},
 };
 
 static const struct tsadc_table rk1808_code_table[] = {
-	{0, -40000},
+	{0, MIN_TEMP},
+	{3423, MIN_TEMP},
 	{3455, -40000},
 	{3463, -35000},
 	{3471, -30000},
@@ -401,11 +412,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},
@@ -440,11 +453,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},
@@ -479,11 +494,15 @@
 	{3452, 115000},
 	{3437, 120000},
 	{3421, 125000},
-	{0, 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},
@@ -517,11 +536,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},
@@ -556,11 +579,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},
@@ -595,11 +620,54 @@
 	{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 rk3568_code_table[] = {
-	{0, -40000},
+	{0, MIN_TEMP},
+	{1448, MIN_TEMP},
 	{1584, -40000},
 	{1620, -35000},
 	{1652, -30000},
@@ -634,16 +702,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},
 };
 
 static u32 rk_tsadcv2_temp_to_code(const struct chip_tsadc_table *table,
@@ -968,6 +1039,37 @@
 	if (!IS_ERR(grf)) {
 		regmap_write(grf, PX30_GRF_SOC_CON0, PX30S_TSADC_TDC_MODE);
 		regmap_write(grf, PX30_GRF_SOC_CON0, PX30S_TSADC_TRIM);
+	}
+}
+
+static void rk_tsadcv11_initialize(struct regmap *grf, void __iomem *regs,
+				  enum tshut_polarity tshut_polarity)
+{
+	writel_relaxed(TSADCV7_AUTO_PERIOD_TIME, regs + TSADCV3_AUTO_PERIOD);
+	writel_relaxed(TSADCV7_AUTO_PERIOD_HT_TIME,
+		       regs + TSADCV3_AUTO_PERIOD_HT);
+	writel_relaxed(TSADCV2_HIGHT_INT_DEBOUNCE_COUNT,
+		       regs + TSADCV3_HIGHT_INT_DEBOUNCE);
+	writel_relaxed(TSADCV2_HIGHT_TSHUT_DEBOUNCE_COUNT,
+		       regs + TSADCV3_HIGHT_TSHUT_DEBOUNCE);
+	writel_relaxed(TSADCV3_Q_MAX_VAL, regs + TSADCV3_Q_MAX);
+	writel_relaxed(TSADCV3_AUTO_Q_SEL_EN | TSADCV3_AUTO_Q_SEL_EN_MASK,
+		       regs + TSADCV2_AUTO_CON);
+	if (tshut_polarity == TSHUT_HIGH_ACTIVE)
+		writel_relaxed(TSADCV2_AUTO_TSHUT_POLARITY_HIGH |
+			       TSADCV2_AUTO_TSHUT_POLARITY_MASK,
+			       regs + TSADCV2_AUTO_CON);
+	else
+		writel_relaxed(TSADCV2_AUTO_TSHUT_POLARITY_MASK,
+			       regs + TSADCV2_AUTO_CON);
+
+	if (!IS_ERR(grf)) {
+		regmap_write(grf, RK3528_GRF_TSADC_CON, RK3568_GRF_TSADC_TSEN);
+		udelay(15);
+		regmap_write(grf, RK3528_GRF_TSADC_CON, RK3568_GRF_TSADC_ANA_REG0);
+		regmap_write(grf, RK3528_GRF_TSADC_CON, RK3568_GRF_TSADC_ANA_REG1);
+		regmap_write(grf, RK3528_GRF_TSADC_CON, RK3568_GRF_TSADC_ANA_REG2);
+		usleep_range(100, 200);
 	}
 }
 
@@ -1639,6 +1741,30 @@
 	},
 };
 
+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_OTP, /* default TSHUT via GPIO give PMIC */
+	.tshut_polarity = TSHUT_LOW_ACTIVE, /* default TSHUT LOW ACTIVE */
+	.tshut_temp = 95000,
+
+	.initialize = rk_tsadcv11_initialize,
+	.irq_ack = rk_tsadcv4_irq_ack,
+	.control = rk_tsadcv4_control,
+	.get_temp = rk_tsadcv4_get_temp,
+	.set_alarm_temp = rk_tsadcv3_alarm_temp,
+	.set_tshut_temp = rk_tsadcv3_tshut_temp,
+	.set_tshut_mode = rk_tsadcv4_tshut_mode,
+
+	.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 rk3568_tsadc_data = {
 	.chn_id[SENSOR_CPU] = 0, /* cpu sensor is channel 0 */
 	.chn_id[SENSOR_GPU] = 1, /* gpu sensor is channel 1 */
@@ -1757,6 +1883,12 @@
 		.data = (void *)&rk3399_tsadc_data,
 	},
 #endif
+#ifdef CONFIG_CPU_RK3528
+	{
+		.compatible = "rockchip,rk3528-tsadc",
+		.data = (void *)&rk3528_tsadc_data,
+	},
+#endif
 #ifdef CONFIG_CPU_RK3568
 	{
 		.compatible = "rockchip,rk3568-tsadc",
diff --git a/kernel/drivers/thermal/x86_pkg_temp_thermal.c b/kernel/drivers/thermal/x86_pkg_temp_thermal.c
index 1ef937d..540becb 100644
--- a/kernel/drivers/thermal/x86_pkg_temp_thermal.c
+++ b/kernel/drivers/thermal/x86_pkg_temp_thermal.c
@@ -75,7 +75,7 @@
 /* Array of package pointers */
 static struct pkg_device **packages;
 /* Serializes interrupt notification, work and hotplug */
-static DEFINE_SPINLOCK(pkg_temp_lock);
+static DEFINE_RAW_SPINLOCK(pkg_temp_lock);
 /* Protects zone operation in the work function against hotplug removal */
 static DEFINE_MUTEX(thermal_zone_mutex);
 
@@ -291,12 +291,12 @@
 	u64 msr_val, wr_val;
 
 	mutex_lock(&thermal_zone_mutex);
-	spin_lock_irq(&pkg_temp_lock);
+	raw_spin_lock_irq(&pkg_temp_lock);
 	++pkg_work_cnt;
 
 	pkgdev = pkg_temp_thermal_get_dev(cpu);
 	if (!pkgdev) {
-		spin_unlock_irq(&pkg_temp_lock);
+		raw_spin_unlock_irq(&pkg_temp_lock);
 		mutex_unlock(&thermal_zone_mutex);
 		return;
 	}
@@ -310,7 +310,7 @@
 	}
 
 	enable_pkg_thres_interrupt();
-	spin_unlock_irq(&pkg_temp_lock);
+	raw_spin_unlock_irq(&pkg_temp_lock);
 
 	/*
 	 * If tzone is not NULL, then thermal_zone_mutex will prevent the
@@ -335,7 +335,7 @@
 	struct pkg_device *pkgdev;
 	unsigned long flags;
 
-	spin_lock_irqsave(&pkg_temp_lock, flags);
+	raw_spin_lock_irqsave(&pkg_temp_lock, flags);
 	++pkg_interrupt_cnt;
 
 	disable_pkg_thres_interrupt();
@@ -347,7 +347,7 @@
 		pkg_thermal_schedule_work(pkgdev->cpu, &pkgdev->work);
 	}
 
-	spin_unlock_irqrestore(&pkg_temp_lock, flags);
+	raw_spin_unlock_irqrestore(&pkg_temp_lock, flags);
 	return 0;
 }
 
@@ -393,9 +393,9 @@
 	      pkgdev->msr_pkg_therm_high);
 
 	cpumask_set_cpu(cpu, &pkgdev->cpumask);
-	spin_lock_irq(&pkg_temp_lock);
+	raw_spin_lock_irq(&pkg_temp_lock);
 	packages[pkgid] = pkgdev;
-	spin_unlock_irq(&pkg_temp_lock);
+	raw_spin_unlock_irq(&pkg_temp_lock);
 	return 0;
 }
 
@@ -432,7 +432,7 @@
 	}
 
 	/* Protect against work and interrupts */
-	spin_lock_irq(&pkg_temp_lock);
+	raw_spin_lock_irq(&pkg_temp_lock);
 
 	/*
 	 * Check whether this cpu was the current target and store the new
@@ -464,9 +464,9 @@
 		 * To cancel the work we need to drop the lock, otherwise
 		 * we might deadlock if the work needs to be flushed.
 		 */
-		spin_unlock_irq(&pkg_temp_lock);
+		raw_spin_unlock_irq(&pkg_temp_lock);
 		cancel_delayed_work_sync(&pkgdev->work);
-		spin_lock_irq(&pkg_temp_lock);
+		raw_spin_lock_irq(&pkg_temp_lock);
 		/*
 		 * If this is not the last cpu in the package and the work
 		 * did not run after we dropped the lock above, then we
@@ -477,7 +477,7 @@
 			pkg_thermal_schedule_work(target, &pkgdev->work);
 	}
 
-	spin_unlock_irq(&pkg_temp_lock);
+	raw_spin_unlock_irq(&pkg_temp_lock);
 
 	/* Final cleanup if this is the last cpu */
 	if (lastcpu)
diff --git a/kernel/drivers/tty/serial/8250/8250_core.c b/kernel/drivers/tty/serial/8250/8250_core.c
index 4e1d450..eb408cb 100644
--- a/kernel/drivers/tty/serial/8250/8250_core.c
+++ b/kernel/drivers/tty/serial/8250/8250_core.c
@@ -54,7 +54,16 @@
 
 static unsigned int skip_txen_test; /* force skip of txen test at init time */
 
-#define PASS_LIMIT	512
+/*
+ * On -rt we can have a more delays, and legitimately
+ * so - so don't drop work spuriously and spam the
+ * syslog:
+ */
+#ifdef CONFIG_PREEMPT_RT_FULL
+# define PASS_LIMIT	1000000
+#else
+# define PASS_LIMIT	512
+#endif
 
 #include <asm/serial.h>
 /*
diff --git a/kernel/drivers/tty/serial/8250/8250_port.c b/kernel/drivers/tty/serial/8250/8250_port.c
index 39156ec..ad452d6 100644
--- a/kernel/drivers/tty/serial/8250/8250_port.c
+++ b/kernel/drivers/tty/serial/8250/8250_port.c
@@ -31,6 +31,7 @@
 #include <linux/nmi.h>
 #include <linux/mutex.h>
 #include <linux/slab.h>
+#include <linux/kdb.h>
 #include <linux/uaccess.h>
 #include <linux/pm_runtime.h>
 #include <linux/ktime.h>
@@ -3380,9 +3381,9 @@
 
 	serial8250_rpm_get(up);
 
-	if (port->sysrq)
+	if (port->sysrq || oops_in_progress)
 		locked = 0;
-	else if (oops_in_progress)
+	else if (in_kdb_printk())
 		locked = spin_trylock_irqsave(&port->lock, flags);
 	else
 		spin_lock_irqsave(&port->lock, flags);
diff --git a/kernel/drivers/tty/serial/amba-pl011.c b/kernel/drivers/tty/serial/amba-pl011.c
index 5edc381..9666a20 100644
--- a/kernel/drivers/tty/serial/amba-pl011.c
+++ b/kernel/drivers/tty/serial/amba-pl011.c
@@ -2191,18 +2191,24 @@
 {
 	struct uart_amba_port *uap = amba_ports[co->index];
 	unsigned int old_cr = 0, new_cr;
-	unsigned long flags;
+	unsigned long flags = 0;
 	int locked = 1;
 
 	clk_enable(uap->clk);
 
-	local_irq_save(flags);
+	/*
+	 * local_irq_save(flags);
+	 *
+	 * This local_irq_save() is nonsense. If we come in via sysrq
+	 * handling then interrupts are already disabled. Aside of
+	 * that the port.sysrq check is racy on SMP regardless.
+	*/
 	if (uap->port.sysrq)
 		locked = 0;
 	else if (oops_in_progress)
-		locked = spin_trylock(&uap->port.lock);
+		locked = spin_trylock_irqsave(&uap->port.lock, flags);
 	else
-		spin_lock(&uap->port.lock);
+		spin_lock_irqsave(&uap->port.lock, flags);
 
 	/*
 	 *	First save the CR then disable the interrupts
@@ -2228,8 +2234,7 @@
 		pl011_write(old_cr, uap, REG_CR);
 
 	if (locked)
-		spin_unlock(&uap->port.lock);
-	local_irq_restore(flags);
+		spin_unlock_irqrestore(&uap->port.lock, flags);
 
 	clk_disable(uap->clk);
 }
diff --git a/kernel/drivers/tty/serial/omap-serial.c b/kernel/drivers/tty/serial/omap-serial.c
index 6420ae5..0f4f41e 100644
--- a/kernel/drivers/tty/serial/omap-serial.c
+++ b/kernel/drivers/tty/serial/omap-serial.c
@@ -1307,13 +1307,10 @@
 
 	pm_runtime_get_sync(up->dev);
 
-	local_irq_save(flags);
-	if (up->port.sysrq)
-		locked = 0;
-	else if (oops_in_progress)
-		locked = spin_trylock(&up->port.lock);
+	if (up->port.sysrq || oops_in_progress)
+		locked = spin_trylock_irqsave(&up->port.lock, flags);
 	else
-		spin_lock(&up->port.lock);
+		spin_lock_irqsave(&up->port.lock, flags);
 
 	/*
 	 * First save the IER then disable the interrupts
@@ -1342,8 +1339,7 @@
 	pm_runtime_mark_last_busy(up->dev);
 	pm_runtime_put_autosuspend(up->dev);
 	if (locked)
-		spin_unlock(&up->port.lock);
-	local_irq_restore(flags);
+		spin_unlock_irqrestore(&up->port.lock, flags);
 }
 
 static int __init
diff --git a/kernel/drivers/tty/sysrq.c b/kernel/drivers/tty/sysrq.c
index 8b4a46a..baaa438 100644
--- a/kernel/drivers/tty/sysrq.c
+++ b/kernel/drivers/tty/sysrq.c
@@ -208,7 +208,7 @@
 #endif
 
 #ifdef CONFIG_SMP
-static DEFINE_SPINLOCK(show_lock);
+static DEFINE_RAW_SPINLOCK(show_lock);
 
 static void showacpu(void *dummy)
 {
@@ -218,10 +218,10 @@
 	if (idle_cpu(smp_processor_id()))
 		return;
 
-	spin_lock_irqsave(&show_lock, flags);
+	raw_spin_lock_irqsave(&show_lock, flags);
 	pr_info("CPU%d:\n", smp_processor_id());
 	show_stack(NULL, NULL);
-	spin_unlock_irqrestore(&show_lock, flags);
+	raw_spin_unlock_irqrestore(&show_lock, flags);
 }
 
 static void sysrq_showregs_othercpus(struct work_struct *dummy)
diff --git a/kernel/drivers/usb/core/hcd.c b/kernel/drivers/usb/core/hcd.c
index 7de2794..767ef76 100644
--- a/kernel/drivers/usb/core/hcd.c
+++ b/kernel/drivers/usb/core/hcd.c
@@ -1752,7 +1752,6 @@
 	struct usb_hcd *hcd = bus_to_hcd(urb->dev->bus);
 	struct usb_anchor *anchor = urb->anchor;
 	int status = urb->unlinked;
-	unsigned long flags;
 
 	urb->hcpriv = NULL;
 	if (unlikely((urb->transfer_flags & URB_SHORT_NOT_OK) &&
@@ -1780,9 +1779,7 @@
 	 * and no one may trigger the above deadlock situation when
 	 * running complete() in tasklet.
 	 */
-	local_irq_save(flags);
 	urb->complete(urb);
-	local_irq_restore(flags);
 
 	usb_anchor_resume_wakeups(anchor);
 	atomic_dec(&urb->use_count);
diff --git a/kernel/drivers/usb/core/hub.c b/kernel/drivers/usb/core/hub.c
index 581bd13..4227272 100644
--- a/kernel/drivers/usb/core/hub.c
+++ b/kernel/drivers/usb/core/hub.c
@@ -5188,6 +5188,7 @@
 			dev_info(&port_dev->dev, "attempt power cycle\n");
 			usb_hub_set_port_power(hdev, hub, port1, false);
 			msleep(2 * hub_power_on_good_delay(hub));
+			set_bit(HCD_FLAG_POWER_ON, &hcd->flags);
 			usb_hub_set_port_power(hdev, hub, port1, true);
 			msleep(hub_power_on_good_delay(hub));
 		}
diff --git a/kernel/drivers/usb/gadget/configfs.c b/kernel/drivers/usb/gadget/configfs.c
index cc168fb..f0d8dc1 100644
--- a/kernel/drivers/usb/gadget/configfs.c
+++ b/kernel/drivers/usb/gadget/configfs.c
@@ -1599,19 +1599,29 @@
 static int android_setup(struct usb_gadget *gadget,
 			const struct usb_ctrlrequest *c)
 {
-	struct usb_composite_dev *cdev = get_gadget_data(gadget);
+	struct usb_composite_dev *cdev;
 	unsigned long flags;
-	struct gadget_info *gi = container_of(cdev, struct gadget_info, cdev);
+	struct gadget_info *gi;
 	int value = -EOPNOTSUPP;
 	struct usb_function_instance *fi;
 
-	spin_lock_irqsave(&cdev->lock, flags);
+	if (!android_device)
+		return 0;
+
+	gi = dev_get_drvdata(android_device);
+	spin_lock_irqsave(&gi->spinlock, flags);
+	cdev = get_gadget_data(gadget);
+	if (!cdev || gi->unbind) {
+		spin_unlock_irqrestore(&gi->spinlock, flags);
+		return 0;
+	};
+
 	if (c->bRequest == USB_REQ_GET_DESCRIPTOR &&
 	    (c->wValue >> 8) == USB_DT_CONFIG && !gi->connected) {
 		gi->connected = 1;
 		schedule_work(&gi->work);
 	}
-	spin_unlock_irqrestore(&cdev->lock, flags);
+
 	list_for_each_entry(fi, &gi->available_func, cfs_list) {
 		if (fi != NULL && fi->f != NULL && fi->f->setup != NULL) {
 			value = fi->f->setup(fi->f, c);
@@ -1628,12 +1638,11 @@
 	if (value < 0)
 		value = composite_setup(gadget, c);
 
-	spin_lock_irqsave(&cdev->lock, flags);
 	if (c->bRequest == USB_REQ_SET_CONFIGURATION &&
 						cdev->config) {
 		schedule_work(&gi->work);
 	}
-	spin_unlock_irqrestore(&cdev->lock, flags);
+	spin_unlock_irqrestore(&gi->spinlock, flags);
 
 	return value;
 }
diff --git a/kernel/drivers/usb/gadget/function/f_fs.c b/kernel/drivers/usb/gadget/function/f_fs.c
index 996be7e..6634dd6 100644
--- a/kernel/drivers/usb/gadget/function/f_fs.c
+++ b/kernel/drivers/usb/gadget/function/f_fs.c
@@ -1626,7 +1626,7 @@
 		ffs_data_clear(ffs);
 		ffs_release_dev(ffs->private_data);
 		BUG_ON(waitqueue_active(&ffs->ev.waitq) ||
-		       waitqueue_active(&ffs->ep0req_completion.wait) ||
+		       swait_active(&ffs->ep0req_completion.wait) ||
 		       waitqueue_active(&ffs->wait));
 		destroy_workqueue(ffs->io_completion_wq);
 		kfree(ffs->dev_name);
diff --git a/kernel/drivers/usb/gadget/function/f_uac1.c b/kernel/drivers/usb/gadget/function/f_uac1.c
index acd976b..14451f9 100644
--- a/kernel/drivers/usb/gadget/function/f_uac1.c
+++ b/kernel/drivers/usb/gadget/function/f_uac1.c
@@ -481,10 +481,10 @@
 
 	val = buf[0] | (buf[1] << 8) | (buf[2] << 16);
 
-	if (uac1->ctl_id == agdev->in_ep->address) {
+	if (EPIN_EN(opts) && uac1->ctl_id == agdev->in_ep->address) {
 		opts->p_srate_active = val;
 		u_audio_set_playback_srate(agdev, opts->p_srate_active);
-	} else if (uac1->ctl_id == agdev->out_ep->address) {
+	} else if (EPOUT_EN(opts) && uac1->ctl_id == agdev->out_ep->address) {
 		opts->c_srate_active = val;
 		u_audio_set_capture_srate(agdev, opts->c_srate_active);
 	}
@@ -629,9 +629,9 @@
 	switch (ctrl->bRequest) {
 	case UAC_GET_CUR: {
 		if (cs == UAC_EP_CS_ATTR_SAMPLE_RATE) {
-			if (ep == agdev->in_ep->address)
+			if (EPIN_EN(opts) && ep == agdev->in_ep->address)
 				val = opts->p_srate_active;
-			else if (ep == agdev->out_ep->address)
+			else if (EPOUT_EN(opts) && ep == agdev->out_ep->address)
 				val = opts->c_srate_active;
 			buf[2] = (val >> 16) & 0xff;
 			buf[1] = (val >> 8) & 0xff;
diff --git a/kernel/drivers/usb/gadget/function/u_serial.c b/kernel/drivers/usb/gadget/function/u_serial.c
index 38afe96..9c6731b 100644
--- a/kernel/drivers/usb/gadget/function/u_serial.c
+++ b/kernel/drivers/usb/gadget/function/u_serial.c
@@ -102,7 +102,6 @@
 
 	struct gserial		*port_usb;
 
-	bool			openclose;	/* open/close in progress */
 	u8			port_num;
 
 	struct list_head	read_pool;
@@ -595,81 +594,44 @@
 {
 	int		port_num = tty->index;
 	struct gs_port	*port;
-	int		status;
+	int		status = 0;
 
-	do {
-		mutex_lock(&ports[port_num].lock);
-		port = ports[port_num].port;
-		if (!port)
-			status = -ENODEV;
-		else {
-			spin_lock_irq(&port->port_lock);
+	mutex_lock(&ports[port_num].lock);
+	port = ports[port_num].port;
+	if (!port) {
+		status = -ENODEV;
+		goto out;
+	}
 
-			/* already open?  Great. */
-			if (port->port.count) {
-				status = 0;
-				port->port.count++;
-
-			/* currently opening/closing? wait ... */
-			} else if (port->openclose) {
-				status = -EBUSY;
-
-			/* ... else we do the work */
-			} else {
-				status = -EAGAIN;
-				port->openclose = true;
-			}
-			spin_unlock_irq(&port->port_lock);
-		}
-		mutex_unlock(&ports[port_num].lock);
-
-		switch (status) {
-		default:
-			/* fully handled */
-			return status;
-		case -EAGAIN:
-			/* must do the work */
-			break;
-		case -EBUSY:
-			/* wait for EAGAIN task to finish */
-			msleep(1);
-			/* REVISIT could have a waitchannel here, if
-			 * concurrent open performance is important
-			 */
-			break;
-		}
-	} while (status != -EAGAIN);
-
-	/* Do the "real open" */
 	spin_lock_irq(&port->port_lock);
 
 	/* allocate circular buffer on first open */
 	if (!kfifo_initialized(&port->port_write_buf)) {
 
 		spin_unlock_irq(&port->port_lock);
+
+		/*
+		 * portmaster's mutex still protects from simultaneous open(),
+		 * and close() can't happen, yet.
+		 */
+
 		status = kfifo_alloc(&port->port_write_buf,
 				     WRITE_BUF_SIZE, GFP_KERNEL);
-		spin_lock_irq(&port->port_lock);
-
 		if (status) {
 			pr_debug("gs_open: ttyGS%d (%p,%p) no buffer\n",
-				port->port_num, tty, file);
-			port->openclose = false;
-			goto exit_unlock_port;
+				 port_num, tty, file);
+			goto out;
 		}
+
+		spin_lock_irq(&port->port_lock);
 	}
 
-	/* REVISIT if REMOVED (ports[].port NULL), abort the open
-	 * to let rmmod work faster (but this way isn't wrong).
-	 */
-
-	/* REVISIT maybe wait for "carrier detect" */
+	/* already open?  Great. */
+	if (port->port.count++)
+		goto exit_unlock_port;
 
 	tty->driver_data = port;
 	port->port.tty = tty;
-
-	port->port.count = 1;
-	port->openclose = false;
 
 	/* if connected, start the I/O stream */
 	if (port->port_usb) {
@@ -684,20 +646,21 @@
 
 	pr_debug("gs_open: ttyGS%d (%p,%p)\n", port->port_num, tty, file);
 
-	status = 0;
-
 exit_unlock_port:
 	spin_unlock_irq(&port->port_lock);
+out:
+	mutex_unlock(&ports[port_num].lock);
 	return status;
 }
 
-static int gs_writes_finished(struct gs_port *p)
+static int gs_close_flush_done(struct gs_port *p)
 {
 	int cond;
 
-	/* return true on disconnect or empty buffer */
+	/* return true on disconnect or empty buffer or if raced with open() */
 	spin_lock_irq(&p->port_lock);
-	cond = (p->port_usb == NULL) || !kfifo_len(&p->port_write_buf);
+	cond = p->port_usb == NULL || !kfifo_len(&p->port_write_buf) ||
+		p->port.count > 1;
 	spin_unlock_irq(&p->port_lock);
 
 	return cond;
@@ -711,6 +674,7 @@
 	spin_lock_irq(&port->port_lock);
 
 	if (port->port.count != 1) {
+raced_with_open:
 		if (port->port.count == 0)
 			WARN_ON(1);
 		else
@@ -719,12 +683,6 @@
 	}
 
 	pr_debug("gs_close: ttyGS%d (%p,%p) ...\n", port->port_num, tty, file);
-
-	/* mark port as closing but in use; we can drop port lock
-	 * and sleep if necessary
-	 */
-	port->openclose = true;
-	port->port.count = 0;
 
 	gser = port->port_usb;
 	if (gser && gser->disconnect)
@@ -736,9 +694,13 @@
 	if (kfifo_len(&port->port_write_buf) > 0 && gser) {
 		spin_unlock_irq(&port->port_lock);
 		wait_event_interruptible_timeout(port->drain_wait,
-					gs_writes_finished(port),
+					gs_close_flush_done(port),
 					GS_CLOSE_TIMEOUT * HZ);
 		spin_lock_irq(&port->port_lock);
+
+		if (port->port.count != 1)
+			goto raced_with_open;
+
 		gser = port->port_usb;
 	}
 
@@ -751,9 +713,8 @@
 	else
 		kfifo_reset(&port->port_write_buf);
 
+	port->port.count = 0;
 	port->port.tty = NULL;
-
-	port->openclose = false;
 
 	pr_debug("gs_close: ttyGS%d (%p,%p) done!\n",
 			port->port_num, tty, file);
@@ -1181,8 +1142,9 @@
 	int cond;
 
 	spin_lock_irq(&port->port_lock);
-	cond = (port->port.count == 0) && !port->openclose;
+	cond = port->port.count == 0;
 	spin_unlock_irq(&port->port_lock);
+
 	return cond;
 }
 
@@ -1375,7 +1337,7 @@
 
 	port->port_usb = NULL;
 	gser->ioport = NULL;
-	if (port->port.count > 0 || port->openclose) {
+	if (port->port.count > 0) {
 		wake_up_interruptible(&port->drain_wait);
 		if (port->port.tty)
 			tty_hangup(port->port.tty);
@@ -1388,7 +1350,7 @@
 
 	/* finally, free any unused/unusable I/O buffers */
 	spin_lock_irqsave(&port->port_lock, flags);
-	if (port->port.count == 0 && !port->openclose)
+	if (port->port.count == 0)
 		kfifo_free(&port->port_write_buf);
 	gs_free_requests(gser->out, &port->read_pool, NULL);
 	gs_free_requests(gser->out, &port->read_queue, NULL);
diff --git a/kernel/drivers/usb/gadget/function/uvc_v4l2.c b/kernel/drivers/usb/gadget/function/uvc_v4l2.c
index 9d2356e..d822456 100644
--- a/kernel/drivers/usb/gadget/function/uvc_v4l2.c
+++ b/kernel/drivers/usb/gadget/function/uvc_v4l2.c
@@ -203,7 +203,7 @@
 	if (type != video->queue.queue.type)
 		return -EINVAL;
 
-	if (uvc->state != UVC_STATE_CONNECTED)
+	if (uvc->state == UVC_STATE_DISCONNECTED)
 		return -ENODEV;
 
 	/* Enable UVC video. */
diff --git a/kernel/drivers/usb/gadget/legacy/inode.c b/kernel/drivers/usb/gadget/legacy/inode.c
index a456267..adb84b0 100644
--- a/kernel/drivers/usb/gadget/legacy/inode.c
+++ b/kernel/drivers/usb/gadget/legacy/inode.c
@@ -345,7 +345,7 @@
 	spin_unlock_irq (&epdata->dev->lock);
 
 	if (likely (value == 0)) {
-		value = wait_event_interruptible (done.wait, done.done);
+		value = swait_event_interruptible_exclusive(done.wait, done.done);
 		if (value != 0) {
 			spin_lock_irq (&epdata->dev->lock);
 			if (likely (epdata->ep != NULL)) {
@@ -354,7 +354,7 @@
 				usb_ep_dequeue (epdata->ep, epdata->req);
 				spin_unlock_irq (&epdata->dev->lock);
 
-				wait_event (done.wait, done.done);
+				swait_event_exclusive(done.wait, done.done);
 				if (epdata->status == -ECONNRESET)
 					epdata->status = -EINTR;
 			} else {
diff --git a/kernel/drivers/usb/host/ehci-hub.c b/kernel/drivers/usb/host/ehci-hub.c
index 9f9ab5c..2134ff0 100644
--- a/kernel/drivers/usb/host/ehci-hub.c
+++ b/kernel/drivers/usb/host/ehci-hub.c
@@ -1174,7 +1174,7 @@
 			goto error;
 		wIndex--;
 		temp = ehci_readl(ehci, status_reg);
-		if (temp & PORT_OWNER)
+		if ((temp & PORT_OWNER) && (!HCD_POWER_ON(hcd)))
 			break;
 
 		temp &= ~PORT_RWC_BITS;
@@ -1217,6 +1217,7 @@
 			if (HCS_PPC(ehci->hcs_params)) {
 				spin_unlock_irqrestore(&ehci->lock, flags);
 				ehci_port_power(ehci, wIndex, true);
+				clear_bit(HCD_FLAG_POWER_ON, &hcd->flags);
 				spin_lock_irqsave(&ehci->lock, flags);
 			}
 			break;
diff --git a/kernel/drivers/usb/host/xhci-ring.c b/kernel/drivers/usb/host/xhci-ring.c
index 66d6709..666748a 100644
--- a/kernel/drivers/usb/host/xhci-ring.c
+++ b/kernel/drivers/usb/host/xhci-ring.c
@@ -689,7 +689,7 @@
 static void xhci_unmap_td_bounce_buffer(struct xhci_hcd *xhci,
 		struct xhci_ring *ring, struct xhci_td *td)
 {
-	struct device *dev = xhci_to_hcd(xhci)->self.controller;
+	struct device *dev = xhci_to_hcd(xhci)->self.sysdev;
 	struct xhci_segment *seg = td->bounce_seg;
 	struct urb *urb = td->urb;
 	size_t len;
@@ -3194,7 +3194,7 @@
 static int xhci_align_td(struct xhci_hcd *xhci, struct urb *urb, u32 enqd_len,
 			 u32 *trb_buff_len, struct xhci_segment *seg)
 {
-	struct device *dev = xhci_to_hcd(xhci)->self.controller;
+	struct device *dev = xhci_to_hcd(xhci)->self.sysdev;
 	unsigned int unalign;
 	unsigned int max_pkt;
 	u32 new_buff_len;
diff --git a/kernel/drivers/usb/serial/Makefile b/kernel/drivers/usb/serial/Makefile
index dc48ca8..2d491e4 100644
--- a/kernel/drivers/usb/serial/Makefile
+++ b/kernel/drivers/usb/serial/Makefile
@@ -15,7 +15,6 @@
 obj-$(CONFIG_USB_SERIAL_ARK3116)		+= ark3116.o
 obj-$(CONFIG_USB_SERIAL_BELKIN)			+= belkin_sa.o
 obj-$(CONFIG_USB_SERIAL_CH341)			+= ch341.o
-obj-y						+= ch343.o
 obj-$(CONFIG_USB_SERIAL_CP210X)			+= cp210x.o
 obj-$(CONFIG_USB_SERIAL_CYBERJACK)		+= cyberjack.o
 obj-$(CONFIG_USB_SERIAL_CYPRESS_M8)		+= cypress_m8.o
diff --git a/kernel/drivers/usb/serial/ch343.c b/kernel/drivers/usb/serial/ch343.c
deleted file mode 100644
index f5535b7..0000000
--- a/kernel/drivers/usb/serial/ch343.c
+++ /dev/null
@@ -1,2000 +0,0 @@
-/*
- * USB serial driver for USB to UART(s) chip ch342/ch343/ch344/ch347/ch9101/ch9102/ch9103/ch9104, etc.
- *
- * Copyright (C) 2022 Nanjing Qinheng Microelectronics Co., Ltd.
- * Web: http://wch.cn
- * Author: WCH <tech@wch.cn>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * System required:
- * Kernel version beyond 3.4.x
- * Update Log:
- * V1.0 - initial version
- * V1.1 - added support of chip ch344, ch9101 and ch9103
- * V1.2 - added gpio support of chip ch344
- * V1.3 - added support of chip ch347
- * V1.4 - added support of chip ch9104
- * V1.5 - added gpio character device
- *      - added supports for kernel version beyond 5.14.x
- *      - removed the gpio ioctl commands
- */
-
-#define DEBUG
-#define VERBOSE_DEBUG
-
-#undef DEBUG
-#undef VERBOSE_DEBUG
-
-#include <asm/byteorder.h>
-#include <asm/unaligned.h>
-#include <linux/errno.h>
-#include <linux/idr.h>
-#include <linux/init.h>
-#include <linux/kernel.h>
-#include <linux/list.h>
-#include <linux/module.h>
-#include <linux/mutex.h>
-#include <linux/serial.h>
-#include <linux/slab.h>
-#include <linux/tty.h>
-#include <linux/tty_driver.h>
-#include <linux/tty_flip.h>
-#include <linux/uaccess.h>
-#include <linux/usb.h>
-#include <linux/usb/cdc.h>
-#include <linux/version.h>
-
-#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 11, 0))
-#include <linux/sched/signal.h>
-#endif
-
-#include "ch343.h"
-
-#define DRIVER_AUTHOR "WCH"
-#define DRIVER_DESC   "USB serial driver for ch342/ch343/ch344/ch347/ch9101/ch9102/ch9103/ch9104, etc."
-#define VERSION_DESC  "V1.5 On 2022.12"
-
-#define IOCTL_MAGIC           'W'
-#define IOCTL_CMD_GETCHIPTYPE _IOR(IOCTL_MAGIC, 0x84, u16)
-#define IOCTL_CMD_CTRLIN      _IOWR(IOCTL_MAGIC, 0x90, u16)
-#define IOCTL_CMD_CTRLOUT     _IOW(IOCTL_MAGIC, 0x91, u16)
-#define IOCTL_CMD_GICOUNT     _IOR(IOCTL_MAGIC, 0x92, u16)
-
-static struct usb_driver ch343_driver;
-static struct tty_driver *ch343_tty_driver;
-static struct usb_interface *g_intf;
-
-static DEFINE_IDR(ch343_minors);
-static DEFINE_MUTEX(ch343_minors_lock);
-
-static void ch343_tty_set_termios(struct tty_struct *tty, struct ktermios *termios_old);
-
-/*
- * Look up an ch343 structure by minor. If found and not disconnected, increment
- * its refcount and return it with its mutex held.
- */
-static struct ch343 *ch343_get_by_minor(unsigned int minor)
-{
-    struct ch343 *ch343;
-
-    mutex_lock(&ch343_minors_lock);
-    ch343 = idr_find(&ch343_minors, minor);
-    if (ch343) {
-        mutex_lock(&ch343->mutex);
-        if (ch343->disconnected) {
-            mutex_unlock(&ch343->mutex);
-            ch343 = NULL;
-        } else {
-            tty_port_get(&ch343->port);
-            mutex_unlock(&ch343->mutex);
-        }
-    }
-    mutex_unlock(&ch343_minors_lock);
-    return ch343;
-}
-
-/*
- * Try to find an available minor number and if found, associate it with 'ch343'.
- */
-static int ch343_alloc_minor(struct ch343 *ch343)
-{
-    int minor;
-
-    mutex_lock(&ch343_minors_lock);
-    minor = idr_alloc(&ch343_minors, ch343, 0, CH343_TTY_MINORS, GFP_KERNEL);
-    mutex_unlock(&ch343_minors_lock);
-
-    return minor;
-}
-
-/* Release the minor number associated with 'ch343'. */
-static void ch343_release_minor(struct ch343 *ch343)
-{
-    mutex_lock(&ch343_minors_lock);
-    idr_remove(&ch343_minors, ch343->minor);
-    mutex_unlock(&ch343_minors_lock);
-}
-
-/*
- * Functions for CH343 control messages.
- */
-static int ch343_control_out(struct ch343 *ch343, u8 request, u16 value, u16 index)
-{
-    int retval;
-
-    retval = usb_autopm_get_interface(ch343->control);
-    if (retval)
-        return retval;
-
-    retval = usb_control_msg(ch343->dev, usb_sndctrlpipe(ch343->dev, 0), request,
-                             USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_DIR_OUT, value, index, NULL, 0, DEFAULT_TIMEOUT);
-
-    usb_autopm_put_interface(ch343->control);
-
-    return retval;
-}
-
-static int ch343_control_in(struct ch343 *ch343, u8 request, u16 value, u16 index, char *buf, unsigned bufsize)
-{
-    int retval;
-
-    retval = usb_autopm_get_interface(ch343->control);
-    if (retval)
-        return retval;
-
-    retval =
-        usb_control_msg(ch343->dev, usb_rcvctrlpipe(ch343->dev, 0), request,
-                        USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_DIR_IN, value, index, buf, bufsize, DEFAULT_TIMEOUT);
-
-    usb_autopm_put_interface(ch343->control);
-
-    return retval;
-}
-
-static int ch343_control_msg_out(struct ch343 *ch343, u8 request, u8 requesttype, u16 value, u16 index, void *buf,
-                                 unsigned bufsize)
-{
-    int retval;
-    char *buffer;
-
-    buffer = kmalloc(bufsize, GFP_KERNEL);
-    if (!buffer)
-        return -ENOMEM;
-
-    retval = copy_from_user(buffer, (char __user *)buf, bufsize);
-    if (retval)
-        goto out;
-
-    retval = usb_autopm_get_interface(ch343->control);
-    if (retval)
-        goto out;
-
-    retval = usb_control_msg(ch343->dev, usb_sndctrlpipe(ch343->dev, 0), request, requesttype, value, index, buf,
-                             bufsize, DEFAULT_TIMEOUT);
-
-    usb_autopm_put_interface(ch343->control);
-
-out:
-    kfree(buffer);
-    return retval;
-}
-
-static int ch343_control_msg_in(struct ch343 *ch343, u8 request, u8 requesttype, u16 value, u16 index, void *buf,
-                                unsigned bufsize)
-{
-    int retval;
-    char *buffer;
-
-    buffer = kmalloc(bufsize, GFP_KERNEL);
-    if (!buffer)
-        return -ENOMEM;
-
-    retval = usb_autopm_get_interface(ch343->control);
-    if (retval)
-        goto out;
-
-    retval = usb_control_msg(ch343->dev, usb_rcvctrlpipe(ch343->dev, 0), request, requesttype, value, index, buffer,
-                             bufsize, DEFAULT_TIMEOUT);
-    if (retval > 0) {
-        if (copy_to_user((char __user *)buf, buffer, retval)) {
-            retval = -EFAULT;
-        }
-    }
-
-    usb_autopm_put_interface(ch343->control);
-
-out:
-    kfree(buffer);
-    return retval;
-}
-
-static inline int ch343_set_control(struct ch343 *ch343, int control)
-{
-    if (ch343->iface <= 1)
-        return ch343_control_out(ch343, CMD_C2 + ch343->iface, ~control, 0x0000);
-    else if (ch343->iface <= 3)
-        return ch343_control_out(ch343, CMD_C2 + 0x10 + (ch343->iface - 2), ~control, 0x0000);
-    else
-        return -1;
-}
-
-static inline int ch343_set_line(struct ch343 *ch343, struct usb_cdc_line_coding *line)
-{
-    return 0;
-}
-
-static int ch343_get_status(struct ch343 *ch343)
-{
-    char *buffer;
-    int retval;
-    const unsigned size = 2;
-    unsigned long flags;
-
-    buffer = kmalloc(size, GFP_KERNEL);
-    if (!buffer)
-        return -ENOMEM;
-
-    retval = ch343_control_in(ch343, CMD_R, CMD_C3 + ch343->iface, 0, buffer, size);
-    if (retval != size)
-        goto out;
-
-    /* setup the private status if available */
-    spin_lock_irqsave(&ch343->read_lock, flags);
-    ch343->ctrlin = (~(*buffer)) & CH343_CTI_ST;
-    spin_unlock_irqrestore(&ch343->read_lock, flags);
-
-out:
-    kfree(buffer);
-    return retval;
-}
-
-/* -------------------------------------------------------------------------- */
-
-static int ch343_configure(struct ch343 *ch343)
-{
-    char *buffer;
-    int r;
-    const unsigned size = 2;
-    u8 chiptype;
-
-    buffer = kmalloc(size, GFP_KERNEL);
-    if (!buffer)
-        return -ENOMEM;
-
-    r = ch343_control_in(ch343, CMD_C6, 0, 0, buffer, size);
-    if (r != size)
-        goto out;
-
-    chiptype = buffer[1];
-
-    switch (ch343->idProduct) {
-    case 0x55D2:
-        if (chiptype == 0x48)
-            ch343->chiptype = CHIP_CH342F;
-        else if (chiptype == 0x41)
-            ch343->chiptype = CHIP_CH342K;
-        break;
-    case 0x55D3:
-        if (chiptype == 0x08)
-            ch343->chiptype = CHIP_CH343GP;
-        else if (chiptype == 0x02)
-            ch343->chiptype = CHIP_CH343J;
-        else if (chiptype == 0x01)
-            ch343->chiptype = CHIP_CH343K;
-        else if (chiptype == 0x18)
-            ch343->chiptype = CHIP_CH343G_AUTOBAUD;
-        break;
-    case 0x55D4:
-        if (chiptype == 0x08)
-            ch343->chiptype = CHIP_CH9102F;
-        else if (chiptype == 0x09)
-            ch343->chiptype = CHIP_CH9102X;
-        break;
-    case 0x55D5:
-        if (chiptype == 0xC0) {
-            if ((buffer[0] & 0xF0) == 0x40)
-                ch343->chiptype = CHIP_CH344L;
-            else
-                ch343->chiptype = CHIP_CH344L_V2;
-        } else
-            ch343->chiptype = CHIP_CH344Q;
-        break;
-    case 0x55D7:
-        if (chiptype == 0x4B)
-            ch343->chiptype = CHIP_CH9103M;
-        break;
-    case 0x55D8:
-        if (chiptype == 0x08)
-            ch343->chiptype = CHIP_CH9101UH;
-        else if (chiptype == 0x0A)
-            ch343->chiptype = CHIP_CH9101RY;
-        break;
-    case 0x55DA:
-    case 0x55DB:
-    case 0x55DD:
-        ch343->chiptype = CHIP_CH347T;
-        break;
-    case 0x55DF:
-        ch343->chiptype = CHIP_CH9104L;
-        break;
-    default:
-        break;
-    }
-
-    if (ch343->chiptype != CHIP_CH344L && ch343->chiptype != CHIP_CH344L_V2 && ch343->chiptype != CHIP_CH9104L) {
-        r = ch343_get_status(ch343);
-        if (r < 0)
-            goto out;
-    }
-
-    dev_dbg(&ch343->data->dev, "%s - chip hver : 0x%2x, sver : 0x%2x, chip : %d\n", __func__, buffer[0], buffer[1],
-            ch343->chiptype);
-out:
-    kfree(buffer);
-    return r < 0 ? r : 0;
-}
-
-/*
- * Write buffer management.
- * All of these assume proper locks taken by the caller.
- */
-static int ch343_wb_alloc(struct ch343 *ch343)
-{
-    int i, wbn;
-    struct ch343_wb *wb;
-
-    wbn = 0;
-    i = 0;
-    for (;;) {
-        wb = &ch343->wb[wbn];
-        if (!wb->use) {
-            wb->use = 1;
-            return wbn;
-        }
-        wbn = (wbn + 1) % CH343_NW;
-        if (++i >= CH343_NW)
-            return -1;
-    }
-}
-
-static int ch343_wb_is_avail(struct ch343 *ch343)
-{
-    int i, n;
-    unsigned long flags;
-
-    n = CH343_NW;
-    spin_lock_irqsave(&ch343->write_lock, flags);
-    for (i = 0; i < CH343_NW; i++)
-        n -= ch343->wb[i].use;
-    spin_unlock_irqrestore(&ch343->write_lock, flags);
-    return n;
-}
-
-/*
- * Finish write. Caller must hold ch343->write_lock
- */
-static void ch343_write_done(struct ch343 *ch343, struct ch343_wb *wb)
-{
-    wb->use = 0;
-    ch343->transmitting--;
-    usb_autopm_put_interface_async(ch343->control);
-}
-
-/*
- * Poke write.
- *
- * the caller is responsible for locking
- */
-static int ch343_start_wb(struct ch343 *ch343, struct ch343_wb *wb)
-{
-    int rc;
-
-    ch343->transmitting++;
-
-    wb->urb->transfer_buffer = wb->buf;
-    wb->urb->transfer_dma = wb->dmah;
-    wb->urb->transfer_buffer_length = wb->len;
-    wb->urb->dev = ch343->dev;
-
-    rc = usb_submit_urb(wb->urb, GFP_ATOMIC);
-    if (rc < 0) {
-        dev_err(&ch343->data->dev, "%s - usb_submit_urb(write bulk) failed: %d\n", __func__, rc);
-        ch343_write_done(ch343, wb);
-    }
-    return rc;
-}
-
-static void ch343_update_status(struct ch343 *ch343, unsigned char *data, size_t len)
-{
-    unsigned long flags;
-    u8 status;
-    u8 difference;
-    u8 type = data[0];
-    u8 handled = 0;
-
-    if (len < 4)
-        return;
-
-    if (ch343->chiptype == CHIP_CH344L) {
-        if (data[0] != 0x00)
-            return;
-        type = data[1];
-    } else if (ch343->chiptype == CHIP_CH344Q || ch343->chiptype == CHIP_CH344L_V2 || ch343->chiptype == CHIP_CH9104L) {
-        type = data[1];
-    }
-
-    if (type & CH343_CTT_M) {
-        status = ~data[len - 1] & CH343_CTI_ST;
-        if (ch343->chiptype == CHIP_CH344L || ch343->chiptype == CHIP_CH344L_V2)
-            status &= CH343_CTI_C;
-
-        if (!ch343->clocal && (ch343->ctrlin & status & CH343_CTI_DC)) {
-            tty_port_tty_hangup(&ch343->port, false);
-        }
-
-        spin_lock_irqsave(&ch343->read_lock, flags);
-        difference = status ^ ch343->ctrlin;
-        ch343->ctrlin = status;
-        ch343->oldcount = ch343->iocount;
-
-        if (difference) {
-            if (difference & CH343_CTI_C) {
-                ch343->iocount.cts++;
-            }
-            if (difference & CH343_CTI_DS) {
-                ch343->iocount.dsr++;
-            }
-            if (difference & CH343_CTI_R) {
-                ch343->iocount.rng++;
-            }
-            if (difference & CH343_CTI_DC) {
-                ch343->iocount.dcd++;
-            }
-            spin_unlock_irqrestore(&ch343->read_lock, flags);
-            wake_up_interruptible(&ch343->wioctl);
-        } else
-            spin_unlock_irqrestore(&ch343->read_lock, flags);
-        handled = 1;
-    }
-    if (type & CH343_CTT_O) {
-        spin_lock_irqsave(&ch343->read_lock, flags);
-        ch343->oldcount = ch343->iocount;
-        ch343->iocount.overrun++;
-        spin_unlock_irqrestore(&ch343->read_lock, flags);
-        handled = 1;
-    }
-    if ((type & CH343_CTT_F) == CH343_CTT_F) {
-        spin_lock_irqsave(&ch343->read_lock, flags);
-        ch343->oldcount = ch343->iocount;
-        ch343->iocount.frame++;
-        spin_unlock_irqrestore(&ch343->read_lock, flags);
-        handled = 1;
-    } else if (type & CH343_CTT_P) {
-        spin_lock_irqsave(&ch343->read_lock, flags);
-        ch343->oldcount = ch343->iocount;
-        ch343->iocount.parity++;
-        spin_unlock_irqrestore(&ch343->read_lock, flags);
-        handled = 1;
-    }
-    if (!handled)
-        dev_err(&ch343->control->dev,
-                "%s - unknown status received:"
-                "len:%d, data0:0x%x, data1:0x%x\n",
-                __func__, (int)len, data[0], data[1]);
-}
-
-/* Reports status changes with "interrupt" transfers */
-static void ch343_ctrl_irq(struct urb *urb)
-{
-    struct ch343 *ch343 = urb->context;
-    unsigned char *data = urb->transfer_buffer;
-    unsigned int len = urb->actual_length;
-    int status = urb->status;
-    int retval;
-
-    switch (status) {
-    case 0:
-        /* success */
-        break;
-    case -ECONNRESET:
-    case -ENOENT:
-    case -ESHUTDOWN:
-        /* this urb is terminated, clean up */
-        dev_dbg(&ch343->control->dev, "%s - urb shutting down with status: %d\n", __func__, status);
-        return;
-    default:
-        dev_dbg(&ch343->control->dev, "%s - nonzero urb status received: %d\n", __func__, status);
-        goto exit;
-    }
-
-    usb_mark_last_busy(ch343->dev);
-    ch343_update_status(ch343, data, len);
-exit:
-    retval = usb_submit_urb(urb, GFP_ATOMIC);
-    if (retval && retval != -EPERM)
-        dev_err(&ch343->control->dev, "%s - usb_submit_urb failed: %d\n", __func__, retval);
-}
-
-static int ch343_submit_read_urb(struct ch343 *ch343, int index, gfp_t mem_flags)
-{
-    int res;
-
-    if (!test_and_clear_bit(index, &ch343->read_urbs_free))
-        return 0;
-
-    dev_vdbg(&ch343->data->dev, "%s - urb %d\n", __func__, index);
-
-    res = usb_submit_urb(ch343->read_urbs[index], mem_flags);
-    if (res) {
-        if (res != -EPERM) {
-            dev_err(&ch343->data->dev, "%s - usb_submit_urb failed: %d\n", __func__, res);
-        }
-        set_bit(index, &ch343->read_urbs_free);
-        return res;
-    }
-
-    return 0;
-}
-
-static int ch343_submit_read_urbs(struct ch343 *ch343, gfp_t mem_flags)
-{
-    int res;
-    int i;
-
-    for (i = 0; i < ch343->rx_buflimit; ++i) {
-        res = ch343_submit_read_urb(ch343, i, mem_flags);
-        if (res)
-            return res;
-    }
-
-    return 0;
-}
-
-static void ch343_process_read_urb(struct ch343 *ch343, struct urb *urb)
-{
-    if (!urb->actual_length)
-        return;
-
-    tty_insert_flip_string(&ch343->port, urb->transfer_buffer, urb->actual_length);
-    tty_flip_buffer_push(&ch343->port);
-}
-
-static void ch343_read_bulk_callback(struct urb *urb)
-{
-    struct ch343_rb *rb = urb->context;
-    struct ch343 *ch343 = rb->instance;
-    int status = urb->status;
-
-    dev_vdbg(&ch343->data->dev, "%s - urb %d, len %d\n", __func__, rb->index, urb->actual_length);
-
-    if (!ch343->dev) {
-        set_bit(rb->index, &ch343->read_urbs_free);
-        dev_dbg(&ch343->data->dev, "%s - disconnected\n", __func__);
-        return;
-    }
-
-    if (status) {
-        set_bit(rb->index, &ch343->read_urbs_free);
-        dev_dbg(&ch343->data->dev, "%s - non-zero urb status: %d\n", __func__, status);
-        return;
-    }
-
-    usb_mark_last_busy(ch343->dev);
-    ch343_process_read_urb(ch343, urb);
-    set_bit(rb->index, &ch343->read_urbs_free);
-    ch343_submit_read_urb(ch343, rb->index, GFP_ATOMIC);
-}
-
-/* data interface wrote those outgoing bytes */
-static void ch343_write_bulk(struct urb *urb)
-{
-    struct ch343_wb *wb = urb->context;
-    struct ch343 *ch343 = wb->instance;
-    unsigned long flags;
-    int status = urb->status;
-
-    dev_vdbg(&ch343->data->dev, "%s, len %d\n", __func__, urb->actual_length);
-    if (status || (urb->actual_length != urb->transfer_buffer_length))
-        dev_vdbg(&ch343->data->dev, "%s - len %d/%d, status %d\n", __func__, urb->actual_length,
-                 urb->transfer_buffer_length, status);
-
-    spin_lock_irqsave(&ch343->write_lock, flags);
-    ch343_write_done(ch343, wb);
-    spin_unlock_irqrestore(&ch343->write_lock, flags);
-    schedule_work(&ch343->work);
-}
-
-static void ch343_softint(struct work_struct *work)
-{
-    struct ch343 *ch343 = container_of(work, struct ch343, work);
-
-    dev_dbg(&ch343->data->dev, "%s\n", __func__);
-
-    tty_port_tty_wakeup(&ch343->port);
-}
-
-/*
- * TTY handlers
- */
-static int ch343_tty_install(struct tty_driver *driver, struct tty_struct *tty)
-{
-    struct ch343 *ch343;
-    int retval;
-
-    dev_dbg(tty->dev, "%s\n", __func__);
-
-    ch343 = ch343_get_by_minor(tty->index);
-    if (!ch343)
-        return -ENODEV;
-
-    retval = tty_standard_install(driver, tty);
-    if (retval)
-        goto error_init_termios;
-
-    tty->driver_data = ch343;
-
-    return 0;
-
-error_init_termios:
-    tty_port_put(&ch343->port);
-    return retval;
-}
-
-static int ch343_tty_open(struct tty_struct *tty, struct file *filp)
-{
-    struct ch343 *ch343 = tty->driver_data;
-
-    dev_dbg(tty->dev, "%s\n", __func__);
-
-    return tty_port_open(&ch343->port, tty, filp);
-}
-
-static void ch343_port_dtr_rts(struct tty_port *port, int raise)
-{
-    struct ch343 *ch343 = container_of(port, struct ch343, port);
-    int res;
-
-    dev_dbg(&ch343->data->dev, "%s, raise:%d\n", __func__, raise);
-
-    if (raise)
-        ch343->ctrlout |= CH343_CTO_D | CH343_CTO_R;
-    else
-        ch343->ctrlout &= ~(CH343_CTO_D | CH343_CTO_R);
-
-    res = ch343_set_control(ch343, ch343->ctrlout);
-    if (res)
-        dev_err(&ch343->control->dev, "failed to set dtr/rts\n");
-}
-
-static int ch343_port_activate(struct tty_port *port, struct tty_struct *tty)
-{
-    struct ch343 *ch343 = container_of(port, struct ch343, port);
-    int retval = -ENODEV;
-    int i;
-
-    dev_dbg(&ch343->control->dev, "%s\n", __func__);
-
-    mutex_lock(&ch343->mutex);
-    if (ch343->disconnected)
-        goto disconnected;
-
-    retval = usb_autopm_get_interface(ch343->control);
-    if (retval)
-        goto error_get_interface;
-
-    /*
-     * FIXME: Why do we need this? Allocating 64K of physically contiguous
-     * memory is really nasty...
-     */
-    set_bit(TTY_NO_WRITE_SPLIT, &tty->flags);
-    ch343->control->needs_remote_wakeup = 1;
-
-    // retval = ch343_configure(ch343);
-    // if (retval)
-    //     goto error_configure;
-
-    ch343_tty_set_termios(tty, NULL);
-
-    retval = usb_submit_urb(ch343->ctrlurb, GFP_KERNEL);
-    if (retval) {
-        dev_err(&ch343->control->dev, "%s - usb_submit_urb(ctrl cmd) failed\n", __func__);
-        goto error_submit_urb;
-    }
-
-    retval = ch343_submit_read_urbs(ch343, GFP_KERNEL);
-    if (retval)
-        goto error_submit_read_urbs;
-    usb_autopm_put_interface(ch343->control);
-
-    mutex_unlock(&ch343->mutex);
-
-    return 0;
-
-error_submit_read_urbs:
-    for (i = 0; i < ch343->rx_buflimit; i++)
-        usb_kill_urb(ch343->read_urbs[i]);
-error_submit_urb:
-    usb_kill_urb(ch343->ctrlurb);
-    // error_configure:
-    usb_autopm_put_interface(ch343->control);
-error_get_interface:
-disconnected:
-    mutex_unlock(&ch343->mutex);
-
-    return usb_translate_errors(retval);
-}
-
-static void ch343_port_destruct(struct tty_port *port)
-{
-    struct ch343 *ch343 = container_of(port, struct ch343, port);
-
-    dev_dbg(&ch343->control->dev, "%s\n", __func__);
-
-    ch343_release_minor(ch343);
-    usb_put_intf(ch343->control);
-    kfree(ch343);
-}
-
-static void ch343_port_shutdown(struct tty_port *port)
-{
-    struct ch343 *ch343 = container_of(port, struct ch343, port);
-    struct urb *urb;
-    struct ch343_wb *wb;
-    int i;
-
-    dev_dbg(&ch343->control->dev, "%s\n", __func__);
-
-    usb_autopm_get_interface_no_resume(ch343->control);
-    ch343->control->needs_remote_wakeup = 0;
-    usb_autopm_put_interface(ch343->control);
-
-    for (;;) {
-        urb = usb_get_from_anchor(&ch343->delayed);
-        if (!urb)
-            break;
-        wb = urb->context;
-        wb->use = 0;
-        usb_autopm_put_interface_async(ch343->control);
-    }
-
-    usb_kill_urb(ch343->ctrlurb);
-    for (i = 0; i < CH343_NW; i++)
-        usb_kill_urb(ch343->wb[i].urb);
-    for (i = 0; i < ch343->rx_buflimit; i++)
-        usb_kill_urb(ch343->read_urbs[i]);
-}
-
-static void ch343_tty_cleanup(struct tty_struct *tty)
-{
-    struct ch343 *ch343 = tty->driver_data;
-    dev_dbg(&ch343->control->dev, "%s\n", __func__);
-    tty_port_put(&ch343->port);
-}
-
-static void ch343_tty_hangup(struct tty_struct *tty)
-{
-    struct ch343 *ch343 = tty->driver_data;
-    dev_dbg(&ch343->control->dev, "%s\n", __func__);
-    tty_port_hangup(&ch343->port);
-}
-
-static void ch343_tty_close(struct tty_struct *tty, struct file *filp)
-{
-    struct ch343 *ch343 = tty->driver_data;
-    dev_dbg(&ch343->control->dev, "%s\n", __func__);
-    tty_port_close(&ch343->port, tty, filp);
-}
-
-static int ch343_tty_write(struct tty_struct *tty, const unsigned char *buf, int count)
-{
-    struct ch343 *ch343 = tty->driver_data;
-    int stat;
-    unsigned long flags;
-    int wbn;
-    struct ch343_wb *wb;
-
-    if (!count)
-        return 0;
-
-    dev_vdbg(&ch343->data->dev, "%s - count %d\n", __func__, count);
-
-    spin_lock_irqsave(&ch343->write_lock, flags);
-    wbn = ch343_wb_alloc(ch343);
-    if (wbn < 0) {
-        spin_unlock_irqrestore(&ch343->write_lock, flags);
-        return 0;
-    }
-    wb = &ch343->wb[wbn];
-
-    if (!ch343->dev) {
-        wb->use = 0;
-        spin_unlock_irqrestore(&ch343->write_lock, flags);
-        return -ENODEV;
-    }
-
-    count = (count > ch343->writesize) ? ch343->writesize : count;
-
-    memcpy(wb->buf, buf, count);
-    wb->len = count;
-
-    stat = usb_autopm_get_interface_async(ch343->control);
-    if (stat) {
-        wb->use = 0;
-        spin_unlock_irqrestore(&ch343->write_lock, flags);
-        return stat;
-    }
-
-    if (ch343->susp_count) {
-        usb_anchor_urb(wb->urb, &ch343->delayed);
-        spin_unlock_irqrestore(&ch343->write_lock, flags);
-        return count;
-    }
-
-    stat = ch343_start_wb(ch343, wb);
-    spin_unlock_irqrestore(&ch343->write_lock, flags);
-
-    if (stat < 0)
-        return stat;
-    return count;
-}
-
-#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 15, 0))
-static unsigned int ch343_tty_write_room(struct tty_struct *tty)
-#else
-static int ch343_tty_write_room(struct tty_struct *tty)
-#endif
-{
-    struct ch343 *ch343 = tty->driver_data;
-    /*
-     * Do not let the line discipline to know that we have a reserve,
-     * or it might get too enthusiastic.
-     */
-    return ch343_wb_is_avail(ch343) ? ch343->writesize : 0;
-}
-
-#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 15, 0))
-static unsigned int ch343_tty_chars_in_buffer(struct tty_struct *tty)
-#else
-static int ch343_tty_chars_in_buffer(struct tty_struct *tty)
-#endif
-{
-    struct ch343 *ch343 = tty->driver_data;
-    /*
-     * if the device was unplugged then any remaining characters fell out
-     * of the connector ;)
-     */
-    if (ch343->disconnected)
-        return 0;
-    /*
-     * This is inaccurate (overcounts), but it works.
-     */
-    return (CH343_NW - ch343_wb_is_avail(ch343)) * ch343->writesize;
-}
-
-static int ch343_tty_break_ctl(struct tty_struct *tty, int state)
-{
-    struct ch343 *ch343 = tty->driver_data;
-    int retval;
-    uint16_t reg_contents;
-    uint8_t *regbuf;
-
-    dev_dbg(&ch343->control->dev, "%s\n", __func__);
-
-    regbuf = kmalloc(2, GFP_KERNEL);
-    if (!regbuf)
-        return -1;
-
-    if (state != 0) {
-        if ((ch343->chiptype == CHIP_CH344L) || (ch343->chiptype == CHIP_CH344Q) ||
-            (ch343->chiptype == CHIP_CH344L_V2) || (ch343->chiptype == CHIP_CH9104L)) {
-            regbuf[0] = ch343->iface;
-            regbuf[1] = 0x01;
-        } else {
-            regbuf[0] = CH343_N_B;
-            regbuf[1] = 0x00;
-        }
-    } else {
-        if ((ch343->chiptype == CHIP_CH344L) || (ch343->chiptype == CHIP_CH344Q) ||
-            (ch343->chiptype == CHIP_CH344L_V2) || (ch343->chiptype == CHIP_CH9104L)) {
-            regbuf[0] = ch343->iface;
-            regbuf[1] = 0x00;
-        } else {
-            regbuf[0] = CH343_N_B | CH343_N_AB;
-            regbuf[1] = 0x00;
-        }
-    }
-    reg_contents = get_unaligned_le16(regbuf);
-
-    if ((ch343->chiptype == CHIP_CH344L) || (ch343->chiptype == CHIP_CH344Q) || (ch343->chiptype == CHIP_CH344L_V2) ||
-        (ch343->chiptype == CHIP_CH9104L)) {
-        retval = ch343_control_out(ch343, CMD_C4, reg_contents, 0x00);
-    } else {
-        if (ch343->iface)
-            retval = ch343_control_out(ch343, CMD_C4, 0x00, reg_contents);
-        else
-            retval = ch343_control_out(ch343, CMD_C4, reg_contents, 0x00);
-    }
-
-    if (retval < 0)
-        dev_err(&ch343->control->dev, "%s - USB control write error (%d)\n", __func__, retval);
-
-    kfree(regbuf);
-
-    return retval;
-}
-
-static int ch343_tty_tiocmget(struct tty_struct *tty)
-{
-    struct ch343 *ch343 = tty->driver_data;
-    unsigned long flags;
-    unsigned int result;
-
-    dev_dbg(&ch343->control->dev, "%s\n", __func__);
-
-    spin_lock_irqsave(&ch343->read_lock, flags);
-    result = (ch343->ctrlout & CH343_CTO_D ? TIOCM_DTR : 0) | (ch343->ctrlout & CH343_CTO_R ? TIOCM_RTS : 0) |
-             (ch343->ctrlin & CH343_CTI_C ? TIOCM_CTS : 0) | (ch343->ctrlin & CH343_CTI_DS ? TIOCM_DSR : 0) |
-             (ch343->ctrlin & CH343_CTI_R ? TIOCM_RI : 0) | (ch343->ctrlin & CH343_CTI_DC ? TIOCM_CD : 0);
-    spin_unlock_irqrestore(&ch343->read_lock, flags);
-
-    return result;
-}
-
-static int ch343_tty_tiocmset(struct tty_struct *tty, unsigned int set, unsigned int clear)
-{
-    struct ch343 *ch343 = tty->driver_data;
-    unsigned int newctrl;
-
-    dev_dbg(&ch343->control->dev, "%s\n", __func__);
-
-    newctrl = ch343->ctrlout;
-    set = (set & TIOCM_DTR ? CH343_CTO_D : 0) | (set & TIOCM_RTS ? CH343_CTO_R : 0);
-    clear = (clear & TIOCM_DTR ? CH343_CTO_D : 0) | (clear & TIOCM_RTS ? CH343_CTO_R : 0);
-
-    newctrl = (newctrl & ~clear) | set;
-
-    if (ch343->ctrlout == newctrl) {
-        return 0;
-    }
-
-    return ch343_set_control(ch343, ch343->ctrlout = newctrl);
-}
-
-static int ch343_get_serial_info(struct ch343 *ch343, struct serial_struct __user *info)
-{
-    struct serial_struct tmp;
-
-    if (!info)
-        return -EINVAL;
-
-    memset(&tmp, 0, sizeof(tmp));
-    tmp.flags = ASYNC_LOW_LATENCY;
-    tmp.xmit_fifo_size = ch343->writesize;
-    tmp.baud_base = le32_to_cpu(ch343->line.dwDTERate);
-    tmp.close_delay = ch343->port.close_delay / 10;
-    tmp.closing_wait =
-        ch343->port.closing_wait == ASYNC_CLOSING_WAIT_NONE ? ASYNC_CLOSING_WAIT_NONE : ch343->port.closing_wait / 10;
-
-    if (copy_to_user(info, &tmp, sizeof(tmp)))
-        return -EFAULT;
-    else
-        return 0;
-}
-
-static int ch343_set_serial_info(struct ch343 *ch343, struct serial_struct __user *newinfo)
-{
-    struct serial_struct new_serial;
-    unsigned int closing_wait, close_delay;
-    int retval = 0;
-
-    if (copy_from_user(&new_serial, newinfo, sizeof(new_serial)))
-        return -EFAULT;
-
-    close_delay = new_serial.close_delay * 10;
-    closing_wait =
-        new_serial.closing_wait == ASYNC_CLOSING_WAIT_NONE ? ASYNC_CLOSING_WAIT_NONE : new_serial.closing_wait * 10;
-
-    mutex_lock(&ch343->port.mutex);
-
-    if (!capable(CAP_SYS_ADMIN)) {
-        if ((close_delay != ch343->port.close_delay) || (closing_wait != ch343->port.closing_wait))
-            retval = -EPERM;
-        else
-            retval = -EOPNOTSUPP;
-    } else {
-        ch343->port.close_delay = close_delay;
-        ch343->port.closing_wait = closing_wait;
-    }
-
-    mutex_unlock(&ch343->port.mutex);
-    return retval;
-}
-
-static int ch343_wait_serial_change(struct ch343 *ch343, unsigned long arg)
-{
-    int rv = 0;
-    DECLARE_WAITQUEUE(wait, current);
-    struct async_icount old, new;
-
-    do {
-        spin_lock_irq(&ch343->read_lock);
-        old = ch343->oldcount;
-        new = ch343->iocount;
-        ch343->oldcount = new;
-        spin_unlock_irq(&ch343->read_lock);
-
-        if ((arg & TIOCM_CTS) && old.cts != new.cts)
-            break;
-        if ((arg & TIOCM_DSR) && old.dsr != new.dsr)
-            break;
-        if ((arg & TIOCM_RI) && old.rng != new.rng)
-            break;
-        if ((arg & TIOCM_CD) && old.dcd != new.dcd)
-            break;
-
-        add_wait_queue(&ch343->wioctl, &wait);
-        set_current_state(TASK_INTERRUPTIBLE);
-        schedule();
-        remove_wait_queue(&ch343->wioctl, &wait);
-        if (ch343->disconnected) {
-            if (arg & TIOCM_CD)
-                break;
-            else
-                rv = -ENODEV;
-        } else {
-            if (signal_pending(current))
-                rv = -ERESTARTSYS;
-        }
-    } while (!rv);
-
-    return rv;
-}
-
-static int ch343_get_serial_usage(struct ch343 *ch343, struct serial_icounter_struct __user *count)
-{
-    struct serial_icounter_struct icount;
-    int rv = 0;
-
-    memset(&icount, 0, sizeof(icount));
-    icount.cts = ch343->iocount.cts;
-    icount.dsr = ch343->iocount.dsr;
-    icount.rng = ch343->iocount.rng;
-    icount.dcd = ch343->iocount.dcd;
-    icount.frame = ch343->iocount.frame;
-    icount.overrun = ch343->iocount.overrun;
-    icount.parity = ch343->iocount.parity;
-    icount.brk = ch343->iocount.brk;
-
-    if (copy_to_user(count, &icount, sizeof(icount)) > 0)
-        rv = -EFAULT;
-
-    return rv;
-}
-
-static int ch343_tty_ioctl(struct tty_struct *tty, unsigned int cmd, unsigned long arg)
-{
-    struct ch343 *ch343 = tty->driver_data;
-    int rv = 0;
-    unsigned long arg1, arg2, arg3, arg4, arg5, arg6;
-    u32 __user *argval = (u32 __user *)arg;
-    u8 *buffer;
-
-    dev_dbg(&ch343->control->dev, "%s\n", __func__);
-
-    buffer = kmalloc(512, GFP_KERNEL);
-    if (!buffer)
-        return -ENOMEM;
-
-    switch (cmd) {
-    case TIOCGSERIAL: /* gets serial port data */
-        rv = ch343_get_serial_info(ch343, (struct serial_struct __user *)arg);
-        break;
-    case TIOCSSERIAL:
-        rv = ch343_set_serial_info(ch343, (struct serial_struct __user *)arg);
-        break;
-    case TIOCMIWAIT:
-        rv = usb_autopm_get_interface(ch343->control);
-        if (rv < 0) {
-            rv = -EIO;
-            break;
-        }
-        rv = ch343_wait_serial_change(ch343, arg);
-        usb_autopm_put_interface(ch343->control);
-        break;
-    case IOCTL_CMD_GICOUNT:
-    case TIOCGICOUNT:
-        rv = ch343_get_serial_usage(ch343, (struct serial_icounter_struct __user *)arg);
-        break;
-    case IOCTL_CMD_GETCHIPTYPE:
-        if (put_user(ch343->chiptype, argval)) {
-            rv = -EFAULT;
-            goto out;
-        }
-        break;
-    case IOCTL_CMD_CTRLIN:
-        get_user(arg1, (u8 __user *)arg);
-        get_user(arg2, ((u8 __user *)arg + 1));
-        get_user(arg3, (u16 __user *)((u8 *)arg + 2));
-        get_user(arg4, (u16 __user *)((u8 *)arg + 4));
-        get_user(arg5, (u16 __user *)((u8 *)arg + 6));
-        arg6 = (unsigned long)((u8 __user *)arg + 8);
-        rv = ch343_control_msg_in(ch343, (u8)arg1, (u8)arg2, (u16)arg3, (u16)arg4, (u8 __user *)arg6, (u16)arg5);
-        break;
-    case IOCTL_CMD_CTRLOUT:
-        get_user(arg1, (u8 __user *)arg);
-        get_user(arg2, ((u8 __user *)arg + 1));
-        get_user(arg3, (u16 __user *)((u8 *)arg + 2));
-        get_user(arg4, (u16 __user *)((u8 *)arg + 4));
-        get_user(arg5, (u16 __user *)((u8 *)arg + 6));
-        arg6 = (unsigned long)((u8 __user *)arg + 8);
-        rv = ch343_control_msg_out(ch343, (u8)arg1, (u8)arg2, (u16)arg3, (u16)arg4, (u8 __user *)arg6, (u16)arg5);
-        if (rv != (u16)arg5) {
-            rv = -EINVAL;
-            goto out;
-        }
-        break;
-    default:
-        rv = -ENOIOCTLCMD;
-        break;
-    }
-
-out:
-    kfree(buffer);
-    return rv < 0 ? rv : 0;
-}
-
-static int ch343_get(CHIPTYPE chiptype, unsigned int bval, unsigned char *fct, unsigned char *dvs)
-{
-    unsigned char a;
-    unsigned char b;
-    unsigned long c;
-
-    if (((chiptype == CHIP_CH347T) || (chiptype == CHIP_CH344Q) || (chiptype == CHIP_CH9104L)) && bval >= 2000000) {
-        *fct = (unsigned char)(bval / 200);
-        *dvs = (unsigned char)((bval / 200) >> 8);
-    }
-
-    switch (bval) {
-    case 6000000:
-    case 4000000:
-    case 2400000:
-    case 921600:
-    case 307200:
-    case 256000:
-        b = 7;
-        c = 12000000;
-        break;
-    default:
-        if (bval > 6000000 / 255) {
-            b = 3;
-            c = 6000000;
-        } else if (bval > 750000 / 255) {
-            b = 2;
-            c = 750000;
-        } else if (bval > 93750 / 255) {
-            b = 1;
-            c = 93750;
-        } else {
-            b = 0;
-            c = 11719;
-        }
-        break;
-    }
-    a = (unsigned char)(c / bval);
-    if (a == 0 || a == 0xFF)
-        return -EINVAL;
-    if ((c / a - bval) > (bval - c / (a + 1)))
-        a++;
-    a = 256 - a;
-
-    *fct = a;
-    *dvs = b;
-
-    return 0;
-}
-
-static void ch343_tty_set_termios(struct tty_struct *tty, struct ktermios *termios_old)
-{
-    struct ch343 *ch343 = tty->driver_data;
-    struct ktermios *termios = &tty->termios;
-    struct usb_ch343_line_coding newline;
-    int newctrl = ch343->ctrlout;
-
-    unsigned char dvs = 0;
-    unsigned char reg_count = 0;
-    unsigned char fct = 0;
-    unsigned char reg_value = 0;
-    unsigned short value = 0;
-    unsigned short index = 0;
-
-    dev_dbg(tty->dev, "%s\n", __func__);
-
-    if (termios_old && !tty_termios_hw_change(&tty->termios, termios_old)) {
-        return;
-    }
-
-    newline.dwDTERate = tty_get_baud_rate(tty);
-
-    if (newline.dwDTERate == 0)
-        newline.dwDTERate = 9600;
-    ch343_get(ch343->chiptype, newline.dwDTERate, &fct, &dvs);
-
-    newline.bCharFormat = termios->c_cflag & CSTOPB ? 2 : 1;
-    if (newline.bCharFormat == 2)
-        reg_value |= CH343_L_SB;
-
-    newline.bParityType =
-        termios->c_cflag & PARENB ? (termios->c_cflag & PARODD ? 1 : 2) + (termios->c_cflag & CMSPAR ? 2 : 0) : 0;
-
-    switch (newline.bParityType) {
-    case 0x01:
-        reg_value |= CH343_L_P_O;
-        break;
-    case 0x02:
-        reg_value |= CH343_L_P_E;
-        break;
-    case 0x03:
-        reg_value |= CH343_L_P_M;
-        break;
-    case 0x04:
-        reg_value |= CH343_L_P_S;
-        break;
-    default:
-        break;
-    }
-
-    switch (termios->c_cflag & CSIZE) {
-    case CS5:
-        newline.bDataBits = 5;
-        reg_value |= CH343_L_C5;
-        break;
-    case CS6:
-        newline.bDataBits = 6;
-        reg_value |= CH343_L_C6;
-        break;
-    case CS7:
-        newline.bDataBits = 7;
-        reg_value |= CH343_L_C7;
-        break;
-    case CS8:
-    default:
-        newline.bDataBits = 8;
-        reg_value |= CH343_L_C8;
-        break;
-    }
-
-    /* FIXME: Needs to clear unsupported bits in the termios */
-    ch343->clocal = ((termios->c_cflag & CLOCAL) != 0);
-
-    if (C_BAUD(tty) == B0) {
-        newline.dwDTERate = ch343->line.dwDTERate;
-        newctrl &= ~CH343_CTO_D;
-    } else if (termios_old && (termios_old->c_cflag & CBAUD) == B0) {
-        newctrl |= CH343_CTO_D;
-    }
-
-    reg_value |= CH343_L_E_R | CH343_L_E_T;
-    reg_count |= CH343_L_R_CT | CH343_L_R_CL | CH343_L_R_T;
-
-    value |= reg_count;
-    value |= (unsigned short)reg_value << 8;
-
-    index |= 0x00 | dvs;
-    index |= (unsigned short)fct << 8;
-    if (ch343->iface <= 1)
-        ch343_control_out(ch343, CMD_C1 + ch343->iface, value, index);
-    else if (ch343->iface <= 3)
-        ch343_control_out(ch343, CMD_C1 + 0x10 + (ch343->iface - 2), value, index);
-
-    if (memcmp(&ch343->line, &newline, sizeof newline)) {
-        memcpy(&ch343->line, &newline, sizeof newline);
-        dev_dbg(&ch343->control->dev, "%s - set line: %d %d %d %d\n", __func__, newline.dwDTERate, newline.bCharFormat,
-                newline.bParityType, newline.bDataBits);
-    }
-
-    if (C_CRTSCTS(tty)) {
-        newctrl |= CH343_CTO_A | CH343_CTO_R;
-    } else
-        newctrl &= ~CH343_CTO_A;
-
-    if (newctrl != ch343->ctrlout)
-        ch343_set_control(ch343, ch343->ctrlout = newctrl);
-}
-
-static const struct tty_port_operations ch343_port_ops = {
-    .dtr_rts = ch343_port_dtr_rts,
-    .shutdown = ch343_port_shutdown,
-    .activate = ch343_port_activate,
-    .destruct = ch343_port_destruct,
-};
-
-/* Little helpers: write/read buffers free */
-static void ch343_write_buffers_free(struct ch343 *ch343)
-{
-    int i;
-    struct ch343_wb *wb;
-    struct usb_device *usb_dev = interface_to_usbdev(ch343->control);
-
-    for (wb = &ch343->wb[0], i = 0; i < CH343_NW; i++, wb++)
-        usb_free_coherent(usb_dev, ch343->writesize, wb->buf, wb->dmah);
-}
-
-static void ch343_read_buffers_free(struct ch343 *ch343)
-{
-    struct usb_device *usb_dev = interface_to_usbdev(ch343->control);
-    int i;
-
-    for (i = 0; i < ch343->rx_buflimit; i++)
-        usb_free_coherent(usb_dev, ch343->readsize, ch343->read_buffers[i].base, ch343->read_buffers[i].dma);
-}
-
-/* Little helper: write buffers allocate */
-static int ch343_write_buffers_alloc(struct ch343 *ch343)
-{
-    int i;
-    struct ch343_wb *wb;
-
-    for (wb = &ch343->wb[0], i = 0; i < CH343_NW; i++, wb++) {
-        wb->buf = usb_alloc_coherent(ch343->dev, ch343->writesize, GFP_KERNEL, &wb->dmah);
-        if (!wb->buf) {
-            while (i != 0) {
-                --i;
-                --wb;
-                usb_free_coherent(ch343->dev, ch343->writesize, wb->buf, wb->dmah);
-            }
-            return -ENOMEM;
-        }
-    }
-    return 0;
-}
-
-static int ch343_open(struct inode *inode, struct file *file)
-{
-    struct ch343 *ch343;
-    struct usb_interface *interface;
-    int subminor;
-    int retval = 0;
-
-    subminor = iminor(inode);
-
-    interface = usb_find_interface(&ch343_driver, subminor);
-    if (!interface) {
-        pr_err("%s - error, can't find device for minor %d\n", __func__, subminor);
-        retval = -ENODEV;
-        goto exit;
-    }
-
-    ch343 = usb_get_intfdata(interface);
-    if (!ch343) {
-        retval = -ENODEV;
-        goto exit;
-    }
-
-    /* save our object in the file's private structure */
-    file->private_data = ch343;
-
-exit:
-    return retval;
-}
-
-static int ch343_release(struct inode *inode, struct file *file)
-{
-    struct ch343 *ch343;
-
-    ch343 = file->private_data;
-    if (ch343 == NULL)
-        return -ENODEV;
-
-    return 0;
-}
-
-static long ch343_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
-{
-    struct ch343 *ch343;
-    int rv = 0;
-    u8 *buffer;
-    unsigned long arg1, arg2, arg3, arg4, arg5, arg6;
-    u32 __user *argval = (u32 __user *)arg;
-
-    ch343 = file->private_data;
-    if (ch343 == NULL)
-        return -ENODEV;
-
-    buffer = kmalloc(512, GFP_KERNEL);
-    if (!buffer)
-        return -ENOMEM;
-
-    switch (cmd) {
-    case IOCTL_CMD_GETCHIPTYPE:
-        if (put_user(ch343->chiptype, argval)) {
-            rv = -EFAULT;
-            goto out;
-        }
-        break;
-    case IOCTL_CMD_CTRLIN:
-        get_user(arg1, (u8 __user *)arg);
-        get_user(arg2, ((u8 __user *)arg + 1));
-        get_user(arg3, (u16 __user *)((u8 *)arg + 2));
-        get_user(arg4, (u16 __user *)((u8 *)arg + 4));
-        get_user(arg5, (u16 __user *)((u8 *)arg + 6));
-        arg6 = (unsigned long)((u8 __user *)arg + 8);
-        rv = ch343_control_msg_in(ch343, (u8)arg1, (u8)arg2, (u16)arg3, (u16)arg4, (u8 __user *)arg6, (u16)arg5);
-        break;
-    case IOCTL_CMD_CTRLOUT:
-        get_user(arg1, (u8 __user *)arg);
-        get_user(arg2, ((u8 __user *)arg + 1));
-        get_user(arg3, (u16 __user *)((u8 *)arg + 2));
-        get_user(arg4, (u16 __user *)((u8 *)arg + 4));
-        get_user(arg5, (u16 __user *)((u8 *)arg + 6));
-        arg6 = (unsigned long)((u8 __user *)arg + 8);
-        rv = ch343_control_msg_out(ch343, (u8)arg1, (u8)arg2, (u16)arg3, (u16)arg4, (u8 __user *)arg6, (u16)arg5);
-        if (rv != (u16)arg5) {
-            rv = -EINVAL;
-            goto out;
-        }
-        break;
-    default:
-        rv = -ENOIOCTLCMD;
-        break;
-    }
-
-out:
-    kfree(buffer);
-    return rv;
-}
-
-static const struct file_operations ch343_fops = {
-    .owner = THIS_MODULE,
-    .open = ch343_open,
-    .unlocked_ioctl = ch343_ioctl,
-    .release = ch343_release,
-};
-
-/*
- * usb class driver info in order to get a minor number from the usb core,
- * and to have the device registered with the driver core
- */
-static struct usb_class_driver ch343_class = {
-    .name = "ch343_iodev%d",
-    .fops = &ch343_fops,
-    .minor_base = USB_MINOR_BASE,
-};
-
-/*
- * USB probe and disconnect routines.
- */
-static int ch343_probe(struct usb_interface *intf, const struct usb_device_id *id)
-{
-    struct usb_cdc_union_desc *union_header = NULL;
-    unsigned char *buffer = intf->altsetting->extra;
-    int buflen = intf->altsetting->extralen;
-    struct usb_interface *control_interface;
-    struct usb_interface *data_interface;
-    struct usb_endpoint_descriptor *epctrl = NULL;
-    struct usb_endpoint_descriptor *epread = NULL;
-    struct usb_endpoint_descriptor *epwrite = NULL;
-    struct usb_device *usb_dev = interface_to_usbdev(intf);
-    struct ch343 *ch343;
-    int minor;
-    int ctrlsize, readsize;
-    u8 *buf;
-    unsigned long quirks;
-    int num_rx_buf = CH343_NR;
-    int i;
-    unsigned int elength = 0;
-    struct device *tty_dev;
-    int rv = -ENOMEM;
-
-    /* normal quirks */
-    quirks = (unsigned long)id->driver_info;
-    if (!buffer) {
-        dev_err(&intf->dev, "Weird descriptor references\n");
-        return -EINVAL;
-    }
-
-    while (buflen > 0) {
-        elength = buffer[0];
-        if (!elength) {
-            dev_err(&intf->dev, "skipping garbage byte\n");
-            elength = 1;
-            goto next_desc;
-        }
-        if (buffer[1] != USB_DT_CS_INTERFACE) {
-            dev_err(&intf->dev, "skipping garbage\n");
-            goto next_desc;
-        }
-
-        switch (buffer[2]) {
-        case USB_CDC_UNION_TYPE: /* we've found it */
-            if (elength < sizeof(struct usb_cdc_union_desc))
-                goto next_desc;
-            if (union_header) {
-                dev_err(&intf->dev,
-                        "More than one "
-                        "union descriptor, skipping ...\n");
-                goto next_desc;
-            }
-            union_header = (struct usb_cdc_union_desc *)buffer;
-            break;
-        default:
-            /*
-             * there are LOTS more CDC descriptors that
-             * could legitimately be found here.
-             */
-            break;
-        }
-    next_desc:
-        buflen -= elength;
-        buffer += elength;
-    }
-
-    control_interface = usb_ifnum_to_if(usb_dev, union_header->bMasterInterface0);
-    data_interface = usb_ifnum_to_if(usb_dev, union_header->bSlaveInterface0);
-
-    if (intf != control_interface)
-        return -ENODEV;
-
-    if (usb_interface_claimed(data_interface)) {
-        dev_dbg(&intf->dev, "The data interface isn't available\n");
-        return -EBUSY;
-    }
-
-    if (data_interface->cur_altsetting->desc.bNumEndpoints < 2 ||
-        control_interface->cur_altsetting->desc.bNumEndpoints == 0)
-        return -EINVAL;
-
-    epctrl = &control_interface->cur_altsetting->endpoint[0].desc;
-    epwrite = &data_interface->cur_altsetting->endpoint[0].desc;
-    epread = &data_interface->cur_altsetting->endpoint[1].desc;
-
-    /* workaround for switched endpoints */
-    if (!usb_endpoint_dir_in(epread)) {
-        /* descriptors are swapped */
-        dev_dbg(&intf->dev, "The data interface has switched endpoints\n");
-        swap(epread, epwrite);
-    }
-
-    ch343 = kzalloc(sizeof(struct ch343), GFP_KERNEL);
-    if (ch343 == NULL)
-        goto alloc_fail;
-
-    ch343->idVendor = id->idVendor;
-    ch343->idProduct = id->idProduct;
-    ch343->iface = control_interface->cur_altsetting->desc.bInterfaceNumber / 2;
-
-    minor = ch343_alloc_minor(ch343);
-    if (minor < 0) {
-        dev_err(&intf->dev, "no more free ch343 devices\n");
-        kfree(ch343);
-        return -ENODEV;
-    }
-
-    ctrlsize = usb_endpoint_maxp(epctrl);
-    readsize = usb_endpoint_maxp(epread);
-    ch343->writesize = usb_endpoint_maxp(epwrite) * 20;
-    ch343->control = control_interface;
-    ch343->data = data_interface;
-    ch343->minor = minor;
-    ch343->dev = usb_dev;
-    ch343->ctrlsize = ctrlsize;
-    ch343->readsize = readsize;
-    ch343->rx_buflimit = num_rx_buf;
-
-    dev_dbg(&intf->dev, "ep%d ctrl: %d, ep%d read: %d, ep%d write: %d\n", usb_endpoint_num(epctrl),
-            usb_endpoint_maxp(epctrl), usb_endpoint_num(epread), usb_endpoint_maxp(epread), usb_endpoint_num(epwrite),
-            usb_endpoint_maxp(epwrite));
-
-    INIT_WORK(&ch343->work, ch343_softint);
-    init_waitqueue_head(&ch343->wioctl);
-    spin_lock_init(&ch343->write_lock);
-    spin_lock_init(&ch343->read_lock);
-    mutex_init(&ch343->mutex);
-    ch343->rx_endpoint = usb_rcvbulkpipe(usb_dev, epread->bEndpointAddress);
-    tty_port_init(&ch343->port);
-    ch343->port.ops = &ch343_port_ops;
-    init_usb_anchor(&ch343->delayed);
-    ch343->quirks = quirks;
-
-    buf = usb_alloc_coherent(usb_dev, ctrlsize, GFP_KERNEL, &ch343->ctrl_dma);
-    if (!buf)
-        goto alloc_fail2;
-    ch343->ctrl_buffer = buf;
-
-    if (ch343_write_buffers_alloc(ch343) < 0)
-        goto alloc_fail4;
-
-    ch343->ctrlurb = usb_alloc_urb(0, GFP_KERNEL);
-    if (!ch343->ctrlurb)
-        goto alloc_fail5;
-
-    for (i = 0; i < num_rx_buf; i++) {
-        struct ch343_rb *rb = &(ch343->read_buffers[i]);
-        struct urb *urb;
-
-        rb->base = usb_alloc_coherent(ch343->dev, readsize, GFP_KERNEL, &rb->dma);
-        if (!rb->base)
-            goto alloc_fail6;
-        rb->index = i;
-        rb->instance = ch343;
-
-        urb = usb_alloc_urb(0, GFP_KERNEL);
-        if (!urb)
-            goto alloc_fail6;
-
-        urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
-        urb->transfer_dma = rb->dma;
-        usb_fill_bulk_urb(urb, ch343->dev, ch343->rx_endpoint, rb->base, ch343->readsize, ch343_read_bulk_callback, rb);
-
-        ch343->read_urbs[i] = urb;
-        __set_bit(i, &ch343->read_urbs_free);
-    }
-    for (i = 0; i < CH343_NW; i++) {
-        struct ch343_wb *snd = &(ch343->wb[i]);
-
-        snd->urb = usb_alloc_urb(0, GFP_KERNEL);
-        if (snd->urb == NULL)
-            goto alloc_fail7;
-
-        usb_fill_bulk_urb(snd->urb, usb_dev, usb_sndbulkpipe(usb_dev, epwrite->bEndpointAddress), NULL,
-                          ch343->writesize, ch343_write_bulk, snd);
-        snd->urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
-        snd->instance = ch343;
-    }
-
-    usb_set_intfdata(intf, ch343);
-
-    usb_fill_int_urb(ch343->ctrlurb, usb_dev, usb_rcvintpipe(usb_dev, epctrl->bEndpointAddress), ch343->ctrl_buffer,
-                     ctrlsize, ch343_ctrl_irq, ch343, epctrl->bInterval ? epctrl->bInterval : 16);
-    ch343->ctrlurb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
-    ch343->ctrlurb->transfer_dma = ch343->ctrl_dma;
-
-    dev_info(&intf->dev, "ttyXRUSB%d: usb to uart device\n", minor);
-
-    usb_driver_claim_interface(&ch343_driver, data_interface, ch343);
-    usb_set_intfdata(data_interface, ch343);
-    usb_get_intf(control_interface);
-
-    rv = ch343_configure(ch343);
-    if (rv)
-        goto alloc_fail7;
-
-    if (ch343->iface == 0) {
-        /* register the device now, as it is ready */
-        rv = usb_register_dev(intf, &ch343_class);
-        if (rv) {
-            /* error when registering this driver */
-            dev_err(&intf->dev, "Not able to get a minor for this device.\n");
-        } else {
-            g_intf = intf;
-        }
-    }
-
-    tty_dev = tty_port_register_device(&ch343->port, ch343_tty_driver, minor, &control_interface->dev);
-    if (IS_ERR(tty_dev)) {
-        rv = PTR_ERR(tty_dev);
-        goto alloc_fail7;
-    }
-
-    return 0;
-
-alloc_fail7:
-    usb_set_intfdata(intf, NULL);
-    for (i = 0; i < CH343_NW; i++)
-        usb_free_urb(ch343->wb[i].urb);
-alloc_fail6:
-    for (i = 0; i < num_rx_buf; i++)
-        usb_free_urb(ch343->read_urbs[i]);
-    ch343_read_buffers_free(ch343);
-    usb_free_urb(ch343->ctrlurb);
-alloc_fail5:
-    ch343_write_buffers_free(ch343);
-alloc_fail4:
-    usb_free_coherent(usb_dev, ctrlsize, ch343->ctrl_buffer, ch343->ctrl_dma);
-alloc_fail2:
-    ch343_release_minor(ch343);
-    kfree(ch343);
-alloc_fail:
-    return rv;
-}
-
-static void stop_data_traffic(struct ch343 *ch343)
-{
-    int i;
-
-    usb_kill_urb(ch343->ctrlurb);
-    for (i = 0; i < CH343_NW; i++)
-        usb_kill_urb(ch343->wb[i].urb);
-    for (i = 0; i < ch343->rx_buflimit; i++)
-        usb_kill_urb(ch343->read_urbs[i]);
-    cancel_work_sync(&ch343->work);
-}
-
-static void ch343_disconnect(struct usb_interface *intf)
-{
-    struct ch343 *ch343 = usb_get_intfdata(intf);
-    struct usb_device *usb_dev = interface_to_usbdev(intf);
-    struct tty_struct *tty;
-    int i;
-
-    dev_dbg(&intf->dev, "%s\n", __func__);
-
-    /* sibling interface is already cleaning up */
-    if (!ch343)
-        return;
-
-    /* give back minor */
-    if ((ch343->iface == 0) && (g_intf != NULL)) {
-        usb_deregister_dev(g_intf, &ch343_class);
-    }
-
-    mutex_lock(&ch343->mutex);
-    ch343->disconnected = true;
-    wake_up_all(&ch343->wioctl);
-    usb_set_intfdata(ch343->control, NULL);
-    usb_set_intfdata(ch343->data, NULL);
-    mutex_unlock(&ch343->mutex);
-
-    tty = tty_port_tty_get(&ch343->port);
-    if (tty) {
-        tty_vhangup(tty);
-        tty_kref_put(tty);
-    }
-
-    stop_data_traffic(ch343);
-
-    tty_unregister_device(ch343_tty_driver, ch343->minor);
-
-    usb_free_urb(ch343->ctrlurb);
-    for (i = 0; i < CH343_NW; i++)
-        usb_free_urb(ch343->wb[i].urb);
-    for (i = 0; i < ch343->rx_buflimit; i++)
-        usb_free_urb(ch343->read_urbs[i]);
-    ch343_write_buffers_free(ch343);
-    usb_free_coherent(usb_dev, ch343->ctrlsize, ch343->ctrl_buffer, ch343->ctrl_dma);
-    ch343_read_buffers_free(ch343);
-
-    usb_driver_release_interface(&ch343_driver, intf == ch343->control ? ch343->data : ch343->control);
-
-    tty_port_put(&ch343->port);
-    dev_info(&intf->dev, "%s\n", "ch343 usb device disconnect.");
-}
-
-#ifdef CONFIG_PM
-static int ch343_suspend(struct usb_interface *intf, pm_message_t message)
-{
-    struct ch343 *ch343 = usb_get_intfdata(intf);
-    int cnt;
-
-    dev_dbg(&intf->dev, "%s\n", __func__);
-
-    spin_lock_irq(&ch343->write_lock);
-    if (PMSG_IS_AUTO(message)) {
-        if (ch343->transmitting) {
-            spin_unlock_irq(&ch343->write_lock);
-            return -EBUSY;
-        }
-    }
-    cnt = ch343->susp_count++;
-    spin_unlock_irq(&ch343->write_lock);
-
-    if (cnt)
-        return 0;
-
-    stop_data_traffic(ch343);
-
-    return 0;
-}
-
-static int ch343_resume(struct usb_interface *intf)
-{
-    struct ch343 *ch343 = usb_get_intfdata(intf);
-    struct urb *urb;
-    int rv = 0;
-
-    dev_dbg(&intf->dev, "%s\n", __func__);
-
-    spin_lock_irq(&ch343->write_lock);
-
-    if (--ch343->susp_count)
-        goto out;
-
-#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 7, 0))
-    if (tty_port_initialized(&ch343->port)) {
-#else
-    if (test_bit(ASYNCB_INITIALIZED, &ch343->port.flags)) {
-#endif
-        rv = usb_submit_urb(ch343->ctrlurb, GFP_ATOMIC);
-
-        for (;;) {
-            urb = usb_get_from_anchor(&ch343->delayed);
-            if (!urb)
-                break;
-
-            ch343_start_wb(ch343, urb->context);
-        }
-
-        /*
-         * delayed error checking because we must
-         * do the write path at all cost
-         */
-        if (rv < 0)
-            goto out;
-
-        rv = ch343_submit_read_urbs(ch343, GFP_ATOMIC);
-    }
-out:
-    spin_unlock_irq(&ch343->write_lock);
-
-    return rv;
-}
-
-static int ch343_reset_resume(struct usb_interface *intf)
-{
-    struct ch343 *ch343 = usb_get_intfdata(intf);
-
-    dev_dbg(&intf->dev, "%s\n", __func__);
-
-#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 7, 0))
-    if (tty_port_initialized(&ch343->port))
-#else
-    if (test_bit(ASYNCB_INITIALIZED, &ch343->port.flags))
-#endif
-        tty_port_tty_hangup(&ch343->port, false);
-
-    return ch343_resume(intf);
-}
-
-#endif /* CONFIG_PM */
-
-/*
- * USB driver structure.
- */
-
-static const struct usb_device_id ch343_ids[] = {{USB_DEVICE_INTERFACE_PROTOCOL(0x1a86, 0x55D2, /* ch342 chip */
-                                                                                USB_CDC_ACM_PROTO_AT_V25TER)},
-
-                                                 {USB_DEVICE_INTERFACE_PROTOCOL(0x1a86, 0x55D3, /* ch343 chip */
-                                                                                USB_CDC_ACM_PROTO_AT_V25TER)},
-
-                                                 {USB_DEVICE_INTERFACE_PROTOCOL(0x1a86, 0x55D5, /* ch344 chip */
-                                                                                USB_CDC_ACM_PROTO_AT_V25TER)},
-
-                                                 {USB_DEVICE_INTERFACE_PROTOCOL(0x1a86, 0x55DA, /* ch347 chip mode0*/
-                                                                                USB_CDC_ACM_PROTO_AT_V25TER)},
-
-                                                 {USB_DEVICE_INTERFACE_PROTOCOL(0x1a86, 0x55DB, /* ch347 chip mode1*/
-                                                                                USB_CDC_ACM_PROTO_AT_V25TER)},
-
-                                                 {USB_DEVICE_INTERFACE_PROTOCOL(0x1a86, 0x55DD, /* ch347 chip mode3*/
-                                                                                USB_CDC_ACM_PROTO_AT_V25TER)},
-
-                                                 {USB_DEVICE_INTERFACE_PROTOCOL(0x1a86, 0x55D8, /* ch9101 chip */
-                                                                                USB_CDC_ACM_PROTO_AT_V25TER)},
-
-                                                 {USB_DEVICE_INTERFACE_PROTOCOL(0x1a86, 0x55D4, /* ch9102 chip */
-                                                                                USB_CDC_ACM_PROTO_AT_V25TER)},
-
-                                                 {USB_DEVICE_INTERFACE_PROTOCOL(0x1a86, 0x55D7, /* ch9103 chip */
-                                                                                USB_CDC_ACM_PROTO_AT_V25TER)},
-
-                                                 {USB_DEVICE_INTERFACE_PROTOCOL(0x1a86, 0x55DF, /* ch9104 chip */
-                                                                                USB_CDC_ACM_PROTO_AT_V25TER)},
-
-                                                 {}};
-
-MODULE_DEVICE_TABLE(usb, ch343_ids);
-
-static struct usb_driver ch343_driver = {
-    .name = "usb_ch343",
-    .probe = ch343_probe,
-    .disconnect = ch343_disconnect,
-#ifdef CONFIG_PM
-    .suspend = ch343_suspend,
-    .resume = ch343_resume,
-    .reset_resume = ch343_reset_resume,
-#endif
-    .id_table = ch343_ids,
-#ifdef CONFIG_PM
-    .supports_autosuspend = 1,
-#endif
-    .disable_hub_initiated_lpm = 1,
-};
-
-/*
- * TTY driver structures.
- */
-static const struct tty_operations ch343_ops = {
-    .install = ch343_tty_install,
-    .open = ch343_tty_open,
-    .close = ch343_tty_close,
-    .cleanup = ch343_tty_cleanup,
-    .hangup = ch343_tty_hangup,
-    .write = ch343_tty_write,
-    .write_room = ch343_tty_write_room,
-    .ioctl = ch343_tty_ioctl,
-    .chars_in_buffer = ch343_tty_chars_in_buffer,
-    .break_ctl = ch343_tty_break_ctl,
-    .set_termios = ch343_tty_set_termios,
-    .tiocmget = ch343_tty_tiocmget,
-    .tiocmset = ch343_tty_tiocmset,
-};
-
-/*
- * Init / exit.
- */
-static int __init ch343_init(void)
-{
-    int retval;
-#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 15, 0))
-    ch343_tty_driver = tty_alloc_driver(CH343_TTY_MINORS, TTY_DRIVER_REAL_RAW | TTY_DRIVER_DYNAMIC_DEV);
-    if (IS_ERR(ch343_tty_driver))
-        return PTR_ERR(ch343_tty_driver);
-#else
-    ch343_tty_driver = alloc_tty_driver(CH343_TTY_MINORS);
-    if (!ch343_tty_driver)
-        return -ENOMEM;
-#endif
-    ch343_tty_driver->driver_name = "usbch343", ch343_tty_driver->name = "ttyXRUSB",
-    ch343_tty_driver->major = CH343_TTY_MAJOR, ch343_tty_driver->minor_start = 0,
-    ch343_tty_driver->type = TTY_DRIVER_TYPE_SERIAL, ch343_tty_driver->subtype = SERIAL_TYPE_NORMAL,
-#if (LINUX_VERSION_CODE < KERNEL_VERSION(5, 15, 0))
-    ch343_tty_driver->flags = TTY_DRIVER_REAL_RAW | TTY_DRIVER_DYNAMIC_DEV;
-#endif
-    ch343_tty_driver->init_termios = tty_std_termios;
-    ch343_tty_driver->init_termios.c_cflag = B9600 | CS8 | CREAD | HUPCL | CLOCAL;
-    tty_set_operations(ch343_tty_driver, &ch343_ops);
-
-    retval = tty_register_driver(ch343_tty_driver);
-    if (retval) {
-#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 15, 0))
-        tty_driver_kref_put(ch343_tty_driver);
-#else
-        put_tty_driver(ch343_tty_driver);
-#endif
-        return retval;
-    }
-
-    retval = usb_register(&ch343_driver);
-    if (retval) {
-        tty_unregister_driver(ch343_tty_driver);
-#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 15, 0))
-        tty_driver_kref_put(ch343_tty_driver);
-#else
-        put_tty_driver(ch343_tty_driver);
-#endif
-        return retval;
-    }
-
-    printk(KERN_INFO KBUILD_MODNAME ": " DRIVER_DESC "\n");
-    printk(KERN_INFO KBUILD_MODNAME ": " VERSION_DESC "\n");
-
-    return 0;
-}
-
-static void __exit ch343_exit(void)
-{
-    usb_deregister(&ch343_driver);
-    tty_unregister_driver(ch343_tty_driver);
-#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 15, 0))
-    tty_driver_kref_put(ch343_tty_driver);
-#else
-    put_tty_driver(ch343_tty_driver);
-#endif
-    idr_destroy(&ch343_minors);
-    printk(KERN_INFO KBUILD_MODNAME
-           ": "
-           "ch343 driver exit.\n");
-}
-
-module_init(ch343_init);
-module_exit(ch343_exit);
-
-MODULE_AUTHOR(DRIVER_AUTHOR);
-MODULE_DESCRIPTION(DRIVER_DESC);
-MODULE_VERSION(VERSION_DESC);
-MODULE_LICENSE("GPL");
-MODULE_ALIAS_CHARDEV_MAJOR(CH343_TTY_MAJOR);
diff --git a/kernel/drivers/usb/serial/ch343.h b/kernel/drivers/usb/serial/ch343.h
deleted file mode 100644
index c53a875..0000000
--- a/kernel/drivers/usb/serial/ch343.h
+++ /dev/null
@@ -1,243 +0,0 @@
-#ifndef _CH343_H
-#define _CH343_H
-
-/*
- * Baud rate and default timeout
- */
-#define DEFAULT_BAUD_RATE 9600
-#define DEFAULT_TIMEOUT   2000
-
-/*
- * CMSPAR, some architectures can't have space and mark parity.
- */
-
-#ifndef CMSPAR
-#define CMSPAR 0
-#endif
-
-/*
- * Major and minor numbers.
- */
-
-#define CH343_TTY_MAJOR  170
-#define CH343_TTY_MINORS 256
-
-#define USB_MINOR_BASE 70
-
-/*
- * Requests.
- */
-
-#define USB_RT_CH343 (USB_TYPE_CLASS | USB_RECIP_INTERFACE)
-
-#define CMD_R  0x95
-#define CMD_W  0x9A
-#define CMD_C1 0xA1
-#define CMD_C2 0xA4
-#define CMD_C3 0x05
-#define CMD_C4 0xA8
-#define CMD_C5 0x5E
-#define CMD_C6 0x5F
-
-#define CH343_CTO_O  0x10
-#define CH343_CTO_D  0x20
-#define CH343_CTO_R  0x40
-#define CH343_CTO_A  0x80
-#define CH343_CTI_C  0x01
-#define CH343_CTI_DS 0x02
-#define CH343_CTI_R  0x04
-#define CH343_CTI_DC 0x08
-#define CH343_CTI_ST 0x0f
-
-#define CH343_CTT_M 0x08
-#define CH343_CTT_F 0x44
-#define CH343_CTT_P 0x04
-#define CH343_CTT_O 0x02
-
-#define CH343_LO 0x02
-#define CH343_LE 0x04
-#define CH343_LB
-#define CH343_LP 0x00
-#define CH343_LF 0x40
-#define CH343_LM 0x08
-
-#define CH343_L_R_CT 0x80
-#define CH343_L_R_CL 0x04
-#define CH343_L_R_T  0x08
-
-#define CH343_L_E_R 0x80
-#define CH343_L_E_T 0x40
-#define CH343_L_P_S 0x38
-#define CH343_L_P_M 0x28
-#define CH343_L_P_E 0x18
-#define CH343_L_P_O 0x08
-#define CH343_L_SB  0x04
-#define CH343_L_C8  0x03
-#define CH343_L_C7  0x02
-#define CH343_L_C6  0x01
-#define CH343_L_C5  0x00
-
-#define CH343_N_B  0x80
-#define CH343_N_AB 0x10
-
-/*
- * Internal driver structures.
- */
-
-/*
- * The only reason to have several buffers is to accommodate assumptions
- * in line disciplines. They ask for empty space amount, receive our URB size,
- * and proceed to issue several 1-character writes, assuming they will fit.
- * The very first write takes a complete URB. Fortunately, this only happens
- * when processing onlcr, so we only need 2 buffers. These values must be
- * powers of 2.
- */
-#define CH343_NW 16
-#define CH343_NR 16
-
-struct ch343_wb {
-    unsigned char *buf;
-    dma_addr_t dmah;
-    int len;
-    int use;
-    struct urb *urb;
-    struct ch343 *instance;
-};
-
-struct ch343_rb {
-    int size;
-    unsigned char *base;
-    dma_addr_t dma;
-    int index;
-    struct ch343 *instance;
-};
-
-struct usb_ch343_line_coding {
-    __u32 dwDTERate;
-    __u8 bCharFormat;
-#define USB_CH343_1_STOP_BITS   0
-#define USB_CH343_1_5_STOP_BITS 1
-#define USB_CH343_2_STOP_BITS   2
-
-    __u8 bParityType;
-#define USB_CH343_NO_PARITY    0
-#define USB_CH343_ODD_PARITY   1
-#define USB_CH343_EVEN_PARITY  2
-#define USB_CH343_MARK_PARITY  3
-#define USB_CH343_SPACE_PARITY 4
-
-    __u8 bDataBits;
-} __attribute__((packed));
-
-typedef enum {
-    CHIP_CH342F = 0x00,
-    CHIP_CH342K,
-    CHIP_CH343GP,
-    CHIP_CH343G_AUTOBAUD,
-    CHIP_CH343K,
-    CHIP_CH343J,
-    CHIP_CH344L,
-    CHIP_CH344L_V2,
-    CHIP_CH344Q,
-    CHIP_CH347T,
-    CHIP_CH9101UH,
-    CHIP_CH9101RY,
-    CHIP_CH9102F,
-    CHIP_CH9102X,
-    CHIP_CH9103M,
-    CHIP_CH9104L,
-} CHIPTYPE;
-
-struct gpioinfo {
-    int group;
-    int pin;
-};
-
-struct ch343_gpio {
-    int gpiocount;
-    struct gpioinfo io[64];
-};
-
-struct ch343_gpio ch343_gpios[] = {
-    { 0,                                                                                               {}},
-    { 0,                                                                                               {}},
-    { 0,                                                                                               {}},
-    { 0,                                                                                               {}},
-    { 0,                                                                                               {}},
-    { 0,                                                                                               {}},
- /* CH344L */
-    { 8,                                                                                               {}},
- /* CH344L-V2 */
-    { 8,                                                                                               {}},
- /* CH344Q */
-    { 8,                                                                                               {}},
- /* CH347T */
-    { 4,                                                                                               {}},
- /* CH9101UH */
-    { 5,                                                 {{3, 2}, {3, 3}, {1, 3}, {1, 2}, {1, 5}, {2, 4}}},
- /* CH9101RY */
-    { 4,                                                                 {{1, 3}, {3, 3}, {3, 2}, {2, 4}}},
- /* CH9102F */
-    { 5,                                                         {{2, 1}, {2, 7}, {2, 4}, {2, 6}, {2, 3}}},
- /* CH9102X */
-    { 6,                                                 {{2, 3}, {2, 5}, {2, 1}, {2, 7}, {3, 0}, {2, 2}}},
- /* CH9103M */
-    {12, {{1, 3}, {1, 2}, {3, 2}, {2, 6}, {1, 0}, {1, 6}, {2, 3}, {2, 5}, {3, 0}, {2, 2}, {1, 5}, {2, 4}}},
- /* CH9104L */
-    {24,                                                                                               {}},
-};
-
-struct ch343 {
-    struct usb_device *dev;        /* the corresponding usb device */
-    struct usb_interface *control; /* control interface */
-    struct usb_interface *data;    /* data interface */
-    struct tty_port port;          /* our tty port data */
-    struct urb *ctrlurb;           /* urbs */
-    u8 *ctrl_buffer;               /* buffers of urbs */
-    dma_addr_t ctrl_dma;           /* dma handles of buffers */
-    struct ch343_wb wb[CH343_NW];
-    unsigned long read_urbs_free;
-    struct urb *read_urbs[CH343_NR];
-    struct ch343_rb read_buffers[CH343_NR];
-    int rx_buflimit;
-    int rx_endpoint;
-    spinlock_t read_lock;
-    int write_used; /* number of non-empty write buffers */
-    int transmitting;
-    spinlock_t write_lock;
-    struct mutex mutex;
-    bool disconnected;
-    struct usb_ch343_line_coding line; /* bits, stop, parity */
-    struct work_struct work;           /* work queue entry for line discipline waking up */
-    unsigned int ctrlin;               /* input control lines (DCD, DSR, RI, break, overruns) */
-    unsigned int ctrlout;              /* output control lines (DTR, RTS) */
-    struct async_icount iocount;       /* counters for control line changes */
-    struct async_icount oldcount;      /* for comparison of counter */
-    wait_queue_head_t wioctl;          /* for ioctl */
-    unsigned int writesize;            /* max packet size for the output bulk endpoint */
-    unsigned int readsize, ctrlsize;   /* buffer sizes for freeing */
-    unsigned int minor;                /* ch343 minor number */
-    unsigned char clocal;              /* termios CLOCAL */
-    unsigned int susp_count;           /* number of suspended interfaces */
-    u8 bInterval;
-    struct usb_anchor delayed; /* writes queued for a device about to be woken */
-    unsigned long quirks;
-    u8 iface;
-    CHIPTYPE chiptype;
-    u16 idVendor;
-    u16 idProduct;
-    u8 gpio5dir;
-};
-
-#define CDC_DATA_INTERFACE_TYPE 0x0a
-
-/* constants describing various quirks and errors */
-#define NO_UNION_NORMAL          BIT(0)
-#define SINGLE_RX_URB            BIT(1)
-#define NO_CAP_LINE              BIT(2)
-#define NO_DATA_INTERFACE        BIT(4)
-#define IGNORE_DEVICE            BIT(5)
-#define QUIRK_CONTROL_LINE_STATE BIT(6)
-#define CLEAR_HALT_CONDITIONS    BIT(7)
-
-#endif
diff --git a/kernel/drivers/usb/serial/option.c b/kernel/drivers/usb/serial/option.c
index 50441e5..ff67562 100644
--- a/kernel/drivers/usb/serial/option.c
+++ b/kernel/drivers/usb/serial/option.c
@@ -198,6 +198,8 @@
 
 #define DELL_PRODUCT_5821E			0x81d7
 #define DELL_PRODUCT_5821E_ESIM			0x81e0
+#define DELL_PRODUCT_5829E_ESIM			0x81e4
+#define DELL_PRODUCT_5829E			0x81e6
 
 #define KYOCERA_VENDOR_ID			0x0c88
 #define KYOCERA_PRODUCT_KPC650			0x17da
@@ -238,6 +240,7 @@
 #define QUECTEL_PRODUCT_UC15			0x9090
 /* These u-blox products use Qualcomm's vendor ID */
 #define UBLOX_PRODUCT_R410M			0x90b2
+#define UBLOX_PRODUCT_R6XX			0x90fa
 /* These Yuga products use Qualcomm's vendor ID */
 #define YUGA_PRODUCT_CLM920_NC5			0x9625
 
@@ -245,11 +248,13 @@
 /* These Quectel products use Quectel's vendor ID */
 #define QUECTEL_PRODUCT_EC21			0x0121
 #define QUECTEL_PRODUCT_EC25			0x0125
+#define QUECTEL_PRODUCT_EG91			0x0191
 #define QUECTEL_PRODUCT_EG95			0x0195
 #define QUECTEL_PRODUCT_BG96			0x0296
 #define QUECTEL_PRODUCT_EP06			0x0306
 #define QUECTEL_PRODUCT_EM12			0x0512
 #define QUECTEL_PRODUCT_RM500Q			0x0800
+#define QUECTEL_PRODUCT_EC200S_CN		0x6002
 #define QUECTEL_PRODUCT_EC200T			0x6026
 
 #define CMOTECH_VENDOR_ID			0x16d8
@@ -425,6 +430,8 @@
 #define CINTERION_PRODUCT_AHXX_2RMNET		0x0084
 #define CINTERION_PRODUCT_AHXX_AUDIO		0x0085
 #define CINTERION_PRODUCT_CLS8			0x00b0
+#define CINTERION_PRODUCT_MV31_MBIM		0x00b3
+#define CINTERION_PRODUCT_MV31_RMNET		0x00b7
 
 /* Olivetti products */
 #define OLIVETTI_VENDOR_ID			0x0b3c
@@ -580,39 +587,6 @@
 
 
 static const struct usb_device_id option_ids[] = {
-#if 1
-        { USB_DEVICE( 0x2cb7, 0x0a04 ) }, /* Fibocom FG650 ECM */
-        { USB_DEVICE( 0x2cb7, 0x0a05 ) }, /* Fibocom FG650 NCM */
-        { USB_DEVICE( 0x2cb7, 0x0a06 ) }, /* Fibocom FG650 RNDIS*/
-#endif
-
-#if 1 //Added by Quectel
-	{ USB_DEVICE(0x05C6, 0x9090) }, /* Quectel UC15 */
-	{ USB_DEVICE(0x05C6, 0x9003) }, /* Quectel UC20 */
-	{ USB_DEVICE(0x05C6, 0x9215) }, /* Quectel EC20(MDM9215) */
-	{ USB_DEVICE(0x2C7C, 0x0125) }, /* Quectel EC20(MDM9x07)/EC25/EG25 */
-	{ USB_DEVICE(0x2C7C, 0x0121) }, /* Quectel EC21 */
-	{ USB_DEVICE(0x2C7C, 0x0191) }, /* Quectel EG91 */
-	{ USB_DEVICE(0x2C7C, 0x0195) }, /* Quectel EG95 */
-	{ USB_DEVICE(0x2C7C, 0x0306) }, /* Quectel EG06/EP06/EM06 */
-	{ USB_DEVICE(0x2C7C, 0x0512) }, /* Quectel EG12/EP12/EM12/EG16/EG18 */
-	{ USB_DEVICE(0x2C7C, 0x0296) }, /* Quectel BG96 */
-	{ USB_DEVICE(0x2C7C, 0x0700) }, /* Quectel BG95/BG77/BG600L-M3/BC69 */
-	{ USB_DEVICE(0x2C7C, 0x0435) }, /* Quectel AG35 */
-	{ USB_DEVICE(0x2C7C, 0x0415) }, /* Quectel AG15 */
-	{ USB_DEVICE(0x2C7C, 0x0520) }, /* Quectel AG520 */
-	{ USB_DEVICE(0x2C7C, 0x0550) }, /* Quectel AG550 */
-	{ USB_DEVICE(0x2C7C, 0x0620) }, /* Quectel EG20 */
-	{ USB_DEVICE(0x2C7C, 0x0800) }, /* Quectel RG500/RM500/RG510/RM510 */
-	{ USB_DEVICE(0x2C7C, 0x6026) }, /* Quectel EC200 */
-	{ USB_DEVICE(0x2C7C, 0x6120) }, /* Quectel UC200 */
-	{ USB_DEVICE(0x2C7C, 0x6000) }, /* Quectel EC200/UC200 */
-	{ USB_DEVICE(0x2C7C, 0x6002) }, /* Quectel EC200/UC200 */
-#endif
-	{ USB_DEVICE(0x19d2, 0x0199) }, /* ZTE ME3860 ME3760_V2*/
-        { USB_DEVICE(0x19d2, 0x1476) }, /* ZTE ME3620*/
-	{ USB_DEVICE(0x19d2, 0x0117) },
-
 	{ USB_DEVICE(0x1286, 0x4e3c) },
 	{ USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_COLT) },
 	{ USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_RICOLA) },
@@ -1092,6 +1066,10 @@
 	  .driver_info = RSVD(0) | RSVD(1) | RSVD(6) },
 	{ USB_DEVICE(DELL_VENDOR_ID, DELL_PRODUCT_5821E_ESIM),
 	  .driver_info = RSVD(0) | RSVD(1) | RSVD(6) },
+	{ USB_DEVICE(DELL_VENDOR_ID, DELL_PRODUCT_5829E),
+	  .driver_info = RSVD(0) | RSVD(6) },
+	{ USB_DEVICE(DELL_VENDOR_ID, DELL_PRODUCT_5829E_ESIM),
+	  .driver_info = RSVD(0) | RSVD(6) },
 	{ USB_DEVICE(ANYDATA_VENDOR_ID, ANYDATA_PRODUCT_ADU_E100A) },	/* ADU-E100, ADU-310 */
 	{ USB_DEVICE(ANYDATA_VENDOR_ID, ANYDATA_PRODUCT_ADU_500A) },
 	{ USB_DEVICE(ANYDATA_VENDOR_ID, ANYDATA_PRODUCT_ADU_620UW) },
@@ -1133,6 +1111,8 @@
 	/* u-blox products using Qualcomm vendor ID */
 	{ USB_DEVICE(QUALCOMM_VENDOR_ID, UBLOX_PRODUCT_R410M),
 	  .driver_info = RSVD(1) | RSVD(3) },
+	{ USB_DEVICE(QUALCOMM_VENDOR_ID, UBLOX_PRODUCT_R6XX),
+	  .driver_info = RSVD(3) },
 	/* Quectel products using Quectel vendor ID */
 	{ USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EC21, 0xff, 0xff, 0xff),
 	  .driver_info = NUMEP2 },
@@ -1140,6 +1120,9 @@
 	{ USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EC25, 0xff, 0xff, 0xff),
 	  .driver_info = NUMEP2 },
 	{ USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EC25, 0xff, 0, 0) },
+	{ USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EG91, 0xff, 0xff, 0xff),
+	  .driver_info = NUMEP2 },
+	{ USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EG91, 0xff, 0, 0) },
 	{ USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EG95, 0xff, 0xff, 0xff),
 	  .driver_info = NUMEP2 },
 	{ USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EG95, 0xff, 0, 0) },
@@ -1157,6 +1140,7 @@
 	{ USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_RM500Q, 0xff, 0, 0) },
 	{ USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_RM500Q, 0xff, 0xff, 0x10),
 	  .driver_info = ZLP },
+	{ USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EC200S_CN, 0xff, 0, 0) },
 	{ USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EC200T, 0xff, 0, 0) },
 
 	{ USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_6001) },
@@ -1232,6 +1216,24 @@
 	  .driver_info = NCTRL(2) | RSVD(3) },
 	{ USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x1055, 0xff),	/* Telit FN980 (PCIe) */
 	  .driver_info = NCTRL(0) | RSVD(1) },
+	{ USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x1056, 0xff),	/* Telit FD980 */
+	  .driver_info = NCTRL(2) | RSVD(3) },
+	{ USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x1060, 0xff),	/* Telit LN920 (rmnet) */
+	  .driver_info = NCTRL(0) | RSVD(1) | RSVD(2) },
+	{ USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x1061, 0xff),	/* Telit LN920 (MBIM) */
+	  .driver_info = NCTRL(0) | RSVD(1) },
+	{ USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x1062, 0xff),	/* Telit LN920 (RNDIS) */
+	  .driver_info = NCTRL(2) | RSVD(3) },
+	{ USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x1063, 0xff),	/* Telit LN920 (ECM) */
+	  .driver_info = NCTRL(0) | RSVD(1) },
+	{ USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x1070, 0xff),	/* Telit FN990 (rmnet) */
+	  .driver_info = NCTRL(0) | RSVD(1) | RSVD(2) },
+	{ USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x1071, 0xff),	/* Telit FN990 (MBIM) */
+	  .driver_info = NCTRL(0) | RSVD(1) },
+	{ USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x1072, 0xff),	/* Telit FN990 (RNDIS) */
+	  .driver_info = NCTRL(2) | RSVD(3) },
+	{ USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x1073, 0xff),	/* Telit FN990 (ECM) */
+	  .driver_info = NCTRL(0) | RSVD(1) },
 	{ USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_ME910),
 	  .driver_info = NCTRL(0) | RSVD(1) | RSVD(3) },
 	{ USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_ME910_DUAL_MODEM),
@@ -1246,6 +1248,8 @@
 	  .driver_info = NCTRL(0) | RSVD(1) | RSVD(2) },
 	{ USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x1203, 0xff),	/* Telit LE910Cx (RNDIS) */
 	  .driver_info = NCTRL(2) | RSVD(3) },
+	{ USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x1204, 0xff),	/* Telit LE910Cx (MBIM) */
+	  .driver_info = NCTRL(0) | RSVD(1) },
 	{ USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_LE910_USBCFG4),
 	  .driver_info = NCTRL(0) | RSVD(1) | RSVD(2) | RSVD(3) },
 	{ USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_LE920),
@@ -1272,7 +1276,19 @@
 	  .driver_info = NCTRL(0) | RSVD(1) },
 	{ USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x1901, 0xff),	/* Telit LN940 (MBIM) */
 	  .driver_info = NCTRL(0) },
+	{ USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x7010, 0xff),	/* Telit LE910-S1 (RNDIS) */
+	  .driver_info = NCTRL(2) },
+	{ USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x7011, 0xff),	/* Telit LE910-S1 (ECM) */
+	  .driver_info = NCTRL(2) },
+	{ USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x701a, 0xff),	/* Telit LE910R1 (RNDIS) */
+	  .driver_info = NCTRL(2) },
+	{ USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x701b, 0xff),	/* Telit LE910R1 (ECM) */
+	  .driver_info = NCTRL(2) },
 	{ USB_DEVICE(TELIT_VENDOR_ID, 0x9010),				/* Telit SBL FN980 flashing device */
+	  .driver_info = NCTRL(0) | ZLP },
+	{ USB_DEVICE(TELIT_VENDOR_ID, 0x9200),				/* Telit LE910S1 flashing device */
+	  .driver_info = NCTRL(0) | ZLP },
+	{ USB_DEVICE(TELIT_VENDOR_ID, 0x9201),				/* Telit LE910R1 flashing device */
 	  .driver_info = NCTRL(0) | ZLP },
 	{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, ZTE_PRODUCT_MF622, 0xff, 0xff, 0xff) }, /* ZTE WCDMA products */
 	{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0002, 0xff, 0xff, 0xff),
@@ -1601,7 +1617,8 @@
 	{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1272, 0xff, 0xff, 0xff) },
 	{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1273, 0xff, 0xff, 0xff) },
 	{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1274, 0xff, 0xff, 0xff) },
-	{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1275, 0xff, 0xff, 0xff) },
+	{ USB_DEVICE(ZTE_VENDOR_ID, 0x1275),	/* ZTE P685M */
+	  .driver_info = RSVD(3) | RSVD(4) },
 	{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1276, 0xff, 0xff, 0xff) },
 	{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1277, 0xff, 0xff, 0xff) },
 	{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1278, 0xff, 0xff, 0xff) },
@@ -1645,6 +1662,8 @@
 	  .driver_info = RSVD(2) },
 	{ USB_DEVICE_INTERFACE_CLASS(ZTE_VENDOR_ID, 0x1476, 0xff) },	/* GosunCn ZTE WeLink ME3630 (ECM/NCM mode) */
 	{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1481, 0xff, 0x00, 0x00) }, /* ZTE MF871A */
+	{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1485, 0xff, 0xff, 0xff),  /* ZTE MF286D */
+	  .driver_info = RSVD(5) },
 	{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1533, 0xff, 0xff, 0xff) },
 	{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1534, 0xff, 0xff, 0xff) },
 	{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1535, 0xff, 0xff, 0xff) },
@@ -1672,7 +1691,6 @@
 	{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0060, 0xff, 0xff, 0xff) },
 	{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0070, 0xff, 0xff, 0xff) },
 	{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0073, 0xff, 0xff, 0xff) },
-	{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0094, 0xff, 0xff, 0xff) },
 	{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0130, 0xff, 0xff, 0xff),
 	  .driver_info = RSVD(1) },
 	{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0133, 0xff, 0xff, 0xff),
@@ -1948,6 +1966,10 @@
 	{ USB_DEVICE(SIEMENS_VENDOR_ID, CINTERION_PRODUCT_HC25_MDMNET) },
 	{ USB_DEVICE(SIEMENS_VENDOR_ID, CINTERION_PRODUCT_HC28_MDM) }, /* HC28 enumerates with Siemens or Cinterion VID depending on FW revision */
 	{ USB_DEVICE(SIEMENS_VENDOR_ID, CINTERION_PRODUCT_HC28_MDMNET) },
+	{ USB_DEVICE_INTERFACE_CLASS(CINTERION_VENDOR_ID, CINTERION_PRODUCT_MV31_MBIM, 0xff),
+	  .driver_info = RSVD(3)},
+	{ USB_DEVICE_INTERFACE_CLASS(CINTERION_VENDOR_ID, CINTERION_PRODUCT_MV31_RMNET, 0xff),
+	  .driver_info = RSVD(0)},
 	{ USB_DEVICE(OLIVETTI_VENDOR_ID, OLIVETTI_PRODUCT_OLICARD100),
 	  .driver_info = RSVD(4) },
 	{ USB_DEVICE(OLIVETTI_VENDOR_ID, OLIVETTI_PRODUCT_OLICARD120),
@@ -2086,13 +2108,20 @@
 	  .driver_info = RSVD(0) | RSVD(1) | RSVD(6) },
 	{ USB_DEVICE(0x0489, 0xe0b5),						/* Foxconn T77W968 ESIM */
 	  .driver_info = RSVD(0) | RSVD(1) | RSVD(6) },
+	{ USB_DEVICE_INTERFACE_CLASS(0x0489, 0xe0db, 0xff),			/* Foxconn T99W265 MBIM */
+	  .driver_info = RSVD(3) },
 	{ USB_DEVICE(0x1508, 0x1001),						/* Fibocom NL668 (IOT version) */
 	  .driver_info = RSVD(4) | RSVD(5) | RSVD(6) },
 	{ USB_DEVICE(0x2cb7, 0x0104),						/* Fibocom NL678 series */
 	  .driver_info = RSVD(4) | RSVD(5) },
 	{ USB_DEVICE_INTERFACE_CLASS(0x2cb7, 0x0105, 0xff),			/* Fibocom NL678 series */
 	  .driver_info = RSVD(6) },
+	{ USB_DEVICE_AND_INTERFACE_INFO(0x2cb7, 0x010b, 0xff, 0xff, 0x30) },	/* Fibocom FG150 Diag */
+	{ USB_DEVICE_AND_INTERFACE_INFO(0x2cb7, 0x010b, 0xff, 0, 0) },		/* Fibocom FG150 AT */
 	{ USB_DEVICE_INTERFACE_CLASS(0x2cb7, 0x01a0, 0xff) },			/* Fibocom NL668-AM/NL652-EU (laptop MBIM) */
+	{ USB_DEVICE_INTERFACE_CLASS(0x2cb7, 0x01a2, 0xff) },			/* Fibocom FM101-GL (laptop MBIM) */
+	{ USB_DEVICE_INTERFACE_CLASS(0x2cb7, 0x01a4, 0xff),			/* Fibocom FM101-GL (laptop MBIM) */
+	  .driver_info = RSVD(4) },
 	{ USB_DEVICE_INTERFACE_CLASS(0x2df3, 0x9d03, 0xff) },			/* LongSung M5710 */
 	{ USB_DEVICE_INTERFACE_CLASS(0x305a, 0x1404, 0xff) },			/* GosunCn GM500 RNDIS */
 	{ USB_DEVICE_INTERFACE_CLASS(0x305a, 0x1405, 0xff) },			/* GosunCn GM500 MBIM */
@@ -2131,9 +2160,6 @@
 #ifdef CONFIG_PM
 	.suspend           = usb_wwan_suspend,
 	.resume            = usb_wwan_resume,
-#if 1 //Added by Quectel
-	.reset_resume = usb_wwan_resume,
-#endif
 #endif
 };
 
@@ -2157,101 +2183,6 @@
 	struct usb_interface_descriptor *iface_desc =
 				&serial->interface->cur_altsetting->desc;
 	unsigned long device_flags = id->driver_info;
-
-#if 1
-       /*ZTE ME3860 ME3760_V2 ME3620*/
-       printk("idVendor=%x, idProduct=%x, bInterfaceNumber =%d\r\n",
-                       serial->dev->descriptor.idVendor,
-                       serial->dev->descriptor.idProduct,
-                       serial->interface->cur_altsetting->desc. bInterfaceNumber);
-
-       if (serial->dev->descriptor.idVendor == 0x19d2 &&
-                       serial->dev->descriptor.idProduct == 0x1476 &&
-                       serial->interface->cur_altsetting->desc. bInterfaceNumber == 3)
-               return -ENODEV;
-       if (serial->dev->descriptor.idVendor == 0x19d2 &&
-                       serial->dev->descriptor.idProduct == 0x1476 &&
-                       serial->interface->cur_altsetting->desc. bInterfaceNumber == 4)
-               return -ENODEV;
-       if (serial->dev->descriptor.idVendor == 0x19d2 &&
-                       serial->dev->descriptor.idProduct == 0x0199 &&
-                       serial->interface->cur_altsetting->desc. bInterfaceNumber == 0)
-               return -ENODEV;
-       if (serial->dev->descriptor.idVendor == 0x19d2 &&
-                       serial->dev->descriptor.idProduct == 0x0199 &&
-                       serial->interface->cur_altsetting->desc. bInterfaceNumber == 1)
-               return -ENODEV;
-#endif
-
-#if 1 //Added by FG650
-     if (serial->dev->descriptor.idVendor == cpu_to_le16(0x2cb7) && 
-     serial->dev->descriptor.idProduct == cpu_to_le16(0x0a04) && 
-     serial->interface->cur_altsetting->desc.bInterfaceNumber <= 1) { 
-     printk("Discover the 4th interface for fibocom\n"); 
-     return -ENODEV; 
-     }
- 
-     if (serial->dev->descriptor.idVendor == cpu_to_le16(0x2cb7) && 
-     serial->dev->descriptor.idProduct == cpu_to_le16(0x0a05) && 
-     serial->interface->cur_altsetting->desc.bInterfaceNumber <= 1) { 
-     printk("Discover the 4th interface for fibocom\n"); 
-     return -ENODEV; 
-        }
-
-         if (serial->dev->descriptor.idVendor == cpu_to_le16(0x2cb7) && 
-     serial->dev->descriptor.idProduct == cpu_to_le16(0x0a06) && 
-     serial->interface->cur_altsetting->desc.bInterfaceNumber <= 1) { 
-     printk("Discover the 4th interface for fibocom\n");  
-     return -ENODEV;
-        }
-#endif
-
-
-
-if (serial->dev->descriptor.idVendor == 0x19d2 &&
-	serial->dev->descriptor.idProduct == 0x1476 &&
-	serial->interface->cur_altsetting->desc. bInterfaceNumber == 3)
-	return -ENODEV;
-
-if (serial->dev->descriptor.idVendor == 0x19d2 &&
-	serial->dev->descriptor.idProduct == 0x1476 &&
-	serial->interface->cur_altsetting->desc. bInterfaceNumber == 4)
-	return -ENODEV;
-
-if (serial->dev->descriptor.idVendor == 0x19d2 &&
-	serial->dev->descriptor.idProduct == 0x1509 &&
-	serial->interface->cur_altsetting->desc. bInterfaceNumber == 4)
-	return -ENODEV;
-
-if (serial->dev->descriptor.idVendor == 0x19d2 &&
-	serial->dev->descriptor.idProduct == 0x1509 &&
-	serial->interface->cur_altsetting->desc. bInterfaceNumber == 5)
-	return -ENODEV;
-
-
-#if 1 //Added by Quectel
-	//Quectel UC20's interface 4 can be used as USB Network device
-	if (serial->dev->descriptor.idVendor == cpu_to_le16(0x05C6) && serial->dev->descriptor.idProduct == cpu_to_le16(0x9003)
-		&& serial->interface->cur_altsetting->desc.bInterfaceNumber >= 4)
-		return -ENODEV;
-
-	//Quectel EC20(MDM9215)'s interface 4 can be used as USB Network device
-	if (serial->dev->descriptor.idVendor == cpu_to_le16(0x05C6) && serial->dev->descriptor.idProduct == cpu_to_le16(0x9215)
-		&& serial->interface->cur_altsetting->desc.bInterfaceNumber >= 4)
-		return -ENODEV;
-
-	if (serial->dev->descriptor.idVendor == cpu_to_le16(0x2C7C)) {
-		__u16 idProduct = le16_to_cpu(serial->dev->descriptor.idProduct);
-
-		//Quectel module's some interfaces can be used as USB Network device (ecm, rndis, mbim)
-		if (serial->interface->cur_altsetting->desc.bInterfaceClass != 0xFF)
-			return -ENODEV;
-
-		//Quectel EC25&EC20's interface 4 can be used as USB network device (qmi)
-		if ((idProduct != 0x6026 && idProduct != 0x6120) && serial->interface->cur_altsetting->desc.bInterfaceNumber >= 4)
-			return -ENODEV;
-	}
-#endif
 
 	/* Never bind to the CD-Rom emulation interface	*/
 	if (iface_desc->bInterfaceClass == USB_CLASS_MASS_STORAGE)
diff --git a/kernel/drivers/usb/typec/tcpm/tcpm.c b/kernel/drivers/usb/typec/tcpm/tcpm.c
index af0660d..deac55e 100644
--- a/kernel/drivers/usb/typec/tcpm/tcpm.c
+++ b/kernel/drivers/usb/typec/tcpm/tcpm.c
@@ -4383,7 +4383,7 @@
 		break;
 	case PORT_RESET:
 		tcpm_reset_port(port);
-		tcpm_set_cc(port, TYPEC_CC_OPEN);
+		tcpm_set_cc(port, TYPEC_CC_RD);
 		tcpm_set_state(port, PORT_RESET_WAIT_OFF,
 			       PD_T_ERROR_RECOVERY);
 		break;
diff --git a/kernel/drivers/video/rockchip/mpp/mpp_common.c b/kernel/drivers/video/rockchip/mpp/mpp_common.c
index 728704a..3b3d02a 100644
--- a/kernel/drivers/video/rockchip/mpp/mpp_common.c
+++ b/kernel/drivers/video/rockchip/mpp/mpp_common.c
@@ -36,7 +36,6 @@
 #include "mpp_common.h"
 #include "mpp_iommu.h"
 
-#define MPP_WORK_TIMEOUT_DELAY		(200)
 #define MPP_WAIT_TIMEOUT_DELAY		(2000)
 
 /* Use 'v' as magic number */
@@ -231,20 +230,9 @@
 	return 0;
 }
 
-static int mpp_session_clear(struct mpp_dev *mpp,
-			     struct mpp_session *session)
+static int mpp_session_clear_pending(struct mpp_session *session)
 {
 	struct mpp_task *task = NULL, *n;
-
-	/* clear session done list */
-	mutex_lock(&session->done_lock);
-	list_for_each_entry_safe(task, n,
-				 &session->done_list,
-				 done_link) {
-		list_del_init(&task->done_link);
-		kref_put(&task->ref, mpp_free_task);
-	}
-	mutex_unlock(&session->done_lock);
 
 	/* clear session pending list */
 	mutex_lock(&session->pending_lock);
@@ -261,6 +249,49 @@
 	return 0;
 }
 
+void mpp_session_cleanup_detach(struct mpp_taskqueue *queue, struct kthread_work *work)
+{
+	struct mpp_session *session, *n;
+
+	if (!atomic_read(&queue->detach_count))
+		return;
+
+	mutex_lock(&queue->session_lock);
+	list_for_each_entry_safe(session, n, &queue->session_detach, session_link) {
+		s32 task_count = atomic_read(&session->task_count);
+
+		if (!task_count) {
+			list_del_init(&session->session_link);
+			atomic_dec(&queue->detach_count);
+		}
+
+		mutex_unlock(&queue->session_lock);
+
+		if (task_count) {
+			mpp_dbg_session("session %d:%d task not finished %d\n",
+					session->pid, session->index,
+					atomic_read(&queue->detach_count));
+
+			mpp_session_clear_pending(session);
+		} else {
+			mpp_dbg_session("queue detach %d\n",
+					atomic_read(&queue->detach_count));
+
+			mpp_session_deinit(session);
+		}
+
+		mutex_lock(&queue->session_lock);
+	}
+	mutex_unlock(&queue->session_lock);
+
+	if (atomic_read(&queue->detach_count)) {
+		mpp_dbg_session("queue detach %d again\n",
+				atomic_read(&queue->detach_count));
+
+		kthread_queue_work(&queue->worker, work);
+	}
+}
+
 static struct mpp_session *mpp_session_init(void)
 {
 	struct mpp_session *session = kzalloc(sizeof(*session), GFP_KERNEL);
@@ -271,13 +302,10 @@
 	session->pid = current->pid;
 
 	mutex_init(&session->pending_lock);
-	mutex_init(&session->done_lock);
 	INIT_LIST_HEAD(&session->pending_list);
-	INIT_LIST_HEAD(&session->done_list);
 	INIT_LIST_HEAD(&session->service_link);
 	INIT_LIST_HEAD(&session->session_link);
 
-	init_waitqueue_head(&session->wait);
 	atomic_set(&session->task_count, 0);
 	atomic_set(&session->release_request, 0);
 
@@ -293,7 +321,7 @@
 		if (mpp->dev_ops->free_session)
 			mpp->dev_ops->free_session(session);
 
-		mpp_session_clear(mpp, session);
+		mpp_session_clear_pending(session);
 
 		if (session->dma) {
 			mpp_iommu_down_read(mpp->iommu_info);
@@ -314,14 +342,10 @@
 	list_del_init(&session->session_link);
 }
 
-int mpp_session_deinit(struct mpp_session *session)
+void mpp_session_deinit(struct mpp_session *session)
 {
-	u32 task_count = atomic_read(&session->task_count);
-
-	mpp_dbg_session("session %p:%d task %d release\n",
-			session, session->index, task_count);
-	if (task_count)
-		return -1;
+	mpp_dbg_session("session %d:%d task %d deinit\n", session->pid,
+			session->index, atomic_read(&session->task_count));
 
 	if (likely(session->deinit))
 		session->deinit(session);
@@ -331,13 +355,12 @@
 	mpp_dbg_session("session %p:%d deinit\n", session, session->index);
 
 	kfree(session);
-	return 0;
 }
 
 static void mpp_session_attach_workqueue(struct mpp_session *session,
 					 struct mpp_taskqueue *queue)
 {
-	mpp_dbg_session("session %p:%d attach\n", session, session->index);
+	mpp_dbg_session("session %d:%d attach\n", session->pid, session->index);
 	mutex_lock(&queue->session_lock);
 	list_add_tail(&session->session_link, &queue->session_attach);
 	mutex_unlock(&queue->session_lock);
@@ -351,14 +374,14 @@
 	if (!session->mpp || !session->mpp->queue)
 		return;
 
-	mpp_dbg_session("session %p:%d detach\n", session, session->index);
+	mpp_dbg_session("session %d:%d detach\n", session->pid, session->index);
 	mpp = session->mpp;
 	queue = mpp->queue;
 
 	mutex_lock(&queue->session_lock);
 	list_del_init(&session->session_link);
 	list_add_tail(&session->session_link, &queue->session_detach);
-	queue->detach_count++;
+	atomic_inc(&queue->detach_count);
 	mutex_unlock(&queue->session_lock);
 
 	mpp_taskqueue_trigger_work(mpp);
@@ -370,6 +393,10 @@
 {
 	kref_get(&task->ref);
 	mutex_lock(&session->pending_lock);
+	if (session->srv->timing_en) {
+		task->on_pending = ktime_get();
+		set_bit(TASK_TIMING_PENDING, &task->state);
+	}
 	list_add_tail(&task->pending_link, &session->pending_list);
 	mutex_unlock(&session->pending_lock);
 
@@ -402,29 +429,6 @@
 	return task;
 }
 
-static int mpp_session_push_done(struct mpp_session *session,
-				 struct mpp_task *task)
-{
-	kref_get(&task->ref);
-	mutex_lock(&session->done_lock);
-	list_add_tail(&task->done_link, &session->done_list);
-	mutex_unlock(&session->done_lock);
-
-	return 0;
-}
-
-static int mpp_session_pop_done(struct mpp_session *session,
-				struct mpp_task *task)
-{
-	mutex_lock(&session->done_lock);
-	list_del_init(&task->done_link);
-	mutex_unlock(&session->done_lock);
-	set_bit(TASK_STATE_DONE, &task->state);
-	kref_put(&task->ref, mpp_free_task);
-
-	return 0;
-}
-
 static void mpp_free_task(struct kref *ref)
 {
 	struct mpp_dev *mpp;
@@ -438,9 +442,9 @@
 	session = task->session;
 
 	mpp_debug_func(DEBUG_TASK_INFO,
-		       "session=%p, task=%p, state=0x%lx, abort_request=%d\n",
-		       session, task, task->state,
-		       atomic_read(&task->abort_request));
+		       "session %d:%d task %d state 0x%lx abort_request %d\n",
+		       session->device_type, session->index, task->task_index,
+		       task->state, atomic_read(&task->abort_request));
 	if (!session->mpp) {
 		mpp_err("session %p, session->mpp is null.\n", session);
 		return;
@@ -469,19 +473,21 @@
 		return;
 	}
 
-	mpp_err("task %p processing time out!\n", task);
 	if (!task->session) {
 		mpp_err("task %p, task->session is null.\n", task);
 		return;
 	}
+
 	session = task->session;
 
 	if (!session->mpp) {
-		mpp_err("session %p, session->mpp is null.\n", session);
+		mpp_err("session %d:%d, session mpp is null.\n", session->pid,
+			session->index);
 		return;
 	}
 	mpp = session->mpp;
-
+	dev_err(mpp->dev, "session %d:%d task %d state %lx processing time out!\n",
+		session->device_type, session->index, task->task_index, task->state);
 	synchronize_hardirq(mpp->irq);
 
 	if (test_and_set_bit(TASK_STATE_HANDLE, &task->state)) {
@@ -489,18 +495,32 @@
 		return;
 	}
 
+	mpp_task_dump_timing(task, ktime_us_delta(ktime_get(), task->on_create));
+
+	/* disable core irq */
+	disable_irq(mpp->irq);
+	/* disable mmu irq */
+	mpp_iommu_disable_irq(mpp->iommu_info);
+
 	/* hardware maybe dead, reset it */
 	mpp_reset_up_read(mpp->reset_group);
 	mpp_dev_reset(mpp);
 	mpp_power_off(mpp);
 
-	mpp_session_push_done(session, task);
+	set_bit(TASK_STATE_TIMEOUT, &task->state);
+	set_bit(TASK_STATE_DONE, &task->state);
 	/* Wake up the GET thread */
-	wake_up(&session->wait);
+	wake_up(&task->wait);
 
 	/* remove task from taskqueue running list */
-	set_bit(TASK_STATE_TIMEOUT, &task->state);
 	mpp_taskqueue_pop_running(mpp->queue, task);
+
+	/* enable core irq */
+	enable_irq(mpp->irq);
+	/* enable mmu irq */
+	mpp_iommu_enable_irq(mpp->iommu_info);
+
+	mpp_taskqueue_trigger_work(mpp);
 }
 
 static int mpp_process_task_default(struct mpp_session *session,
@@ -508,6 +528,8 @@
 {
 	struct mpp_task *task = NULL;
 	struct mpp_dev *mpp = session->mpp;
+	u32 timing_en;
+	ktime_t on_create;
 
 	if (unlikely(!mpp)) {
 		mpp_err("pid %d clinet %d found invalid process function\n",
@@ -515,13 +537,26 @@
 		return -EINVAL;
 	}
 
+	timing_en = session->srv->timing_en;
+	if (timing_en)
+		on_create = ktime_get();
+
 	if (mpp->dev_ops->alloc_task)
 		task = mpp->dev_ops->alloc_task(session, msgs);
 	if (!task) {
 		mpp_err("alloc_task failed.\n");
 		return -ENOMEM;
 	}
+
+	if (timing_en) {
+		task->on_create_end = ktime_get();
+		task->on_create = on_create;
+		set_bit(TASK_TIMING_CREATE_END, &task->state);
+		set_bit(TASK_TIMING_CREATE, &task->state);
+	}
+
 	kref_init(&task->ref);
+	init_waitqueue_head(&task->wait);
 	atomic_set(&task->abort_request, 0);
 	task->task_index = atomic_fetch_inc(&mpp->task_index);
 	INIT_DELAYED_WORK(&task->timeout_work, mpp_task_timeout_work);
@@ -544,7 +579,10 @@
 	/* trigger current queue to run task */
 	mpp_taskqueue_trigger_work(mpp);
 	kref_put(&task->ref, mpp_free_task);
-
+	mpp_debug_func(DEBUG_TASK_INFO,
+		       "session %d:%d task %d state 0x%lx\n",
+		       session->device_type, session->index,
+		       task->task_index, task->state);
 	return 0;
 }
 
@@ -599,10 +637,6 @@
 		group->resets[type] = rst;
 		group->queue = mpp->queue;
 	}
-	/* if reset not in the same queue, it means different device
-	 * may reset in the same time, then rw_sem_on should set true.
-	 */
-	group->rw_sem_on |= (group->queue != mpp->queue) ? true : false;
 	dev_info(mpp->dev, "reset_group->rw_sem_on=%d\n", group->rw_sem_on);
 	up_write(&group->rw_sem);
 
@@ -647,12 +681,49 @@
 	return 0;
 }
 
+void mpp_task_run_begin(struct mpp_task *task, u32 timing_en, u32 timeout)
+{
+	preempt_disable();
+
+	set_bit(TASK_STATE_START, &task->state);
+
+	mpp_time_record(task);
+	schedule_delayed_work(&task->timeout_work, msecs_to_jiffies(timeout));
+
+	if (timing_en) {
+		task->on_sched_timeout = ktime_get();
+		set_bit(TASK_TIMING_TO_SCHED, &task->state);
+	}
+}
+
+void mpp_task_run_end(struct mpp_task *task, u32 timing_en)
+{
+	if (timing_en) {
+		task->on_run_end = ktime_get();
+		set_bit(TASK_TIMING_RUN_END, &task->state);
+	}
+
+#ifdef MODULE
+	preempt_enable();
+#else
+	preempt_enable_no_resched();
+#endif
+}
+
 static int mpp_task_run(struct mpp_dev *mpp,
 			struct mpp_task *task)
 {
 	int ret;
+	struct mpp_session *session = task->session;
+	u32 timing_en;
 
 	mpp_debug_enter();
+
+	timing_en = mpp->srv->timing_en;
+	if (timing_en) {
+		task->on_run = ktime_get();
+		set_bit(TASK_TIMING_RUN, &task->state);
+	}
 
 	/*
 	 * before running, we have to switch grf ctrl bit to ensure
@@ -679,8 +750,10 @@
 
 	mpp_power_on(mpp);
 	mpp_time_record(task);
-	mpp_debug(DEBUG_TASK_INFO, "pid %d, start hw %s\n",
-		  task->session->pid, dev_name(mpp->dev));
+	mpp_debug_func(DEBUG_TASK_INFO,
+		       "%s session %d:%d task=%d state=0x%lx\n",
+		       dev_name(mpp->dev), session->device_type,
+		       session->index, task->task_index, task->state);
 
 	if (mpp->auto_freq_en && mpp->hw_ops->set_freq)
 		mpp->hw_ops->set_freq(mpp, task);
@@ -690,8 +763,6 @@
 	 */
 	mpp_reset_down_read(mpp->reset_group);
 
-	schedule_delayed_work(&task->timeout_work,
-			      msecs_to_jiffies(MPP_WORK_TIMEOUT_DELAY));
 	if (mpp->dev_ops->run)
 		mpp->dev_ops->run(mpp, task);
 	set_bit(TASK_STATE_START, &task->state);
@@ -709,6 +780,7 @@
 
 	mpp_debug_enter();
 
+get_task:
 	task = mpp_taskqueue_get_pending_task(queue);
 	if (!task)
 		goto done;
@@ -716,7 +788,7 @@
 	/* if task timeout and aborted, remove it */
 	if (atomic_read(&task->abort_request) > 0) {
 		mpp_taskqueue_pop_pending(queue, task);
-		goto done;
+		goto get_task;
 	}
 
 	/* get device for current task */
@@ -748,28 +820,7 @@
 	}
 
 done:
-	mutex_lock(&queue->session_lock);
-	while (queue->detach_count) {
-		struct mpp_session *session = NULL;
-
-		session = list_first_entry_or_null(&queue->session_detach, struct mpp_session,
-				session_link);
-		if (session) {
-			list_del_init(&session->session_link);
-			queue->detach_count--;
-		}
-
-		mutex_unlock(&queue->session_lock);
-
-		if (session) {
-			mpp_dbg_session("%s detach count %d\n", dev_name(mpp->dev),
-					queue->detach_count);
-			mpp_session_deinit(session);
-		}
-
-		mutex_lock(&queue->session_lock);
-	}
-	mutex_unlock(&queue->session_lock);
+	mpp_session_cleanup_detach(queue, work_s);
 }
 
 static int mpp_wait_result_default(struct mpp_session *session,
@@ -785,62 +836,32 @@
 		return -EINVAL;
 	}
 
-	ret = wait_event_timeout(session->wait,
-				 !list_empty(&session->done_list),
-				 msecs_to_jiffies(MPP_WAIT_TIMEOUT_DELAY));
-
 	task = mpp_session_get_pending_task(session);
 	if (!task) {
-		mpp_err("session %p pending list is empty!\n", session);
+		mpp_err("session %d:%d pending list is empty!\n",
+			session->pid, session->index);
 		return -EIO;
 	}
 
+	ret = wait_event_timeout(task->wait,
+				 test_bit(TASK_STATE_DONE, &task->state),
+				 msecs_to_jiffies(MPP_WAIT_TIMEOUT_DELAY));
 	if (ret > 0) {
-		u32 task_found = 0;
-		struct mpp_task *loop = NULL, *n;
-
-		/* find task in session done list */
-		mutex_lock(&session->done_lock);
-		list_for_each_entry_safe(loop, n,
-					 &session->done_list,
-					 done_link) {
-			if (loop == task) {
-				task_found = 1;
-				break;
-			}
-		}
-		mutex_unlock(&session->done_lock);
-		if (task_found) {
-			if (mpp->dev_ops->result)
-				ret = mpp->dev_ops->result(mpp, task, msgs);
-			mpp_session_pop_done(session, task);
-
-			if (test_bit(TASK_STATE_TIMEOUT, &task->state))
-				ret = -ETIMEDOUT;
-		} else {
-			mpp_err("session %p task %p, not found in done list!\n",
-				session, task);
-			ret = -EIO;
-		}
+		if (mpp->dev_ops->result)
+			ret = mpp->dev_ops->result(mpp, task, msgs);
 	} else {
 		atomic_inc(&task->abort_request);
-		mpp_err("timeout, pid %d session %p:%d count %d cur_task %p index %d.\n",
-			session->pid, session, session->index,
-			atomic_read(&session->task_count), task,
-			task->task_index);
-		/* if twice and return timeout, otherwise, re-wait */
-		if (atomic_read(&task->abort_request) > 1) {
-			mpp_err("session %p:%d, task %p index %d abort wait twice!\n",
-				session, session->index,
-				task, task->task_index);
-			ret = -ETIMEDOUT;
-		} else {
-			return mpp_wait_result_default(session, msgs);
-		}
+		set_bit(TASK_STATE_ABORT, &task->state);
+		mpp_err("timeout, pid %d session %d:%d count %d cur_task %d state %lx\n",
+			session->pid, session->device_type, session->index,
+			atomic_read(&session->task_count), task->task_index, task->state);
 	}
 
 	mpp_debug_func(DEBUG_TASK_INFO,
-		       "kref_read=%d, ret=%d\n", kref_read(&task->ref), ret);
+		       "session %d:%d task %d state 0x%lx kref_read %d ret %d\n",
+		       session->device_type,
+		       session->index, task->task_index, task->state,
+		       kref_read(&task->ref), ret);
 	mpp_session_pop_pending(session, task);
 
 	return ret;
@@ -919,6 +940,10 @@
 			goto err_put_pdev;
 		} else {
 			mpp->reset_group = mpp->srv->reset_groups[reset_group_node];
+			if (!mpp->reset_group->queue)
+				mpp->reset_group->queue = queue;
+			if (mpp->reset_group->queue != mpp->queue)
+				mpp->reset_group->rw_sem_on = true;
 		}
 	}
 
@@ -951,6 +976,10 @@
 
 	/* default taskqueue has max 16 task capacity */
 	queue->task_capacity = MPP_MAX_TASK_CAPACITY;
+
+	mutex_init(&queue->ref_lock);
+	atomic_set(&queue->runtime_cnt, 0);
+	atomic_set(&queue->detach_count, 0);
 
 	return queue;
 }
@@ -1197,7 +1226,7 @@
 			if (!mpp)
 				return -EINVAL;
 
-			mpp_session_clear(mpp, session);
+			mpp_session_clear_pending(session);
 			mpp_iommu_down_write(mpp->iommu_info);
 			ret = mpp_dma_session_destroy(session->dma);
 			mpp_iommu_up_write(mpp->iommu_info);
@@ -1410,7 +1439,7 @@
 	/* wait for task all done */
 	atomic_inc(&session->release_request);
 
-	if (session->mpp)
+	if (session->mpp || atomic_read(&session->task_count))
 		mpp_session_detach_workqueue(session);
 	else
 		mpp_session_deinit(session);
@@ -1421,24 +1450,9 @@
 	return 0;
 }
 
-static unsigned int
-mpp_dev_poll(struct file *filp, poll_table *wait)
-{
-	unsigned int mask = 0;
-	struct mpp_session *session =
-		(struct mpp_session *)filp->private_data;
-
-	poll_wait(filp, &session->wait, wait);
-	if (!list_empty(&session->done_list))
-		mask |= POLLIN | POLLRDNORM;
-
-	return mask;
-}
-
 const struct file_operations rockchip_mpp_fops = {
 	.open		= mpp_dev_open,
 	.release	= mpp_dev_release,
-	.poll		= mpp_dev_poll,
 	.unlocked_ioctl = mpp_dev_ioctl,
 #ifdef CONFIG_COMPAT
 	.compat_ioctl   = mpp_dev_ioctl,
@@ -1673,12 +1687,23 @@
 		mpp_dev_reset(mpp);
 	mpp_power_off(mpp);
 
-	if (!atomic_read(&task->abort_request)) {
-		mpp_session_push_done(session, task);
-		/* Wake up the GET thread */
-		wake_up(&session->wait);
-	}
 	set_bit(TASK_STATE_FINISH, &task->state);
+	set_bit(TASK_STATE_DONE, &task->state);
+
+	if (session->srv->timing_en) {
+		s64 time_diff;
+
+		task->on_finish = ktime_get();
+		set_bit(TASK_TIMING_FINISH, &task->state);
+
+		time_diff = ktime_us_delta(task->on_finish, task->on_create);
+
+		if (mpp->timing_check && time_diff > (s64)mpp->timing_check)
+			mpp_task_dump_timing(task, time_diff);
+	}
+
+	/* Wake up the GET thread */
+	wake_up(&task->wait);
 	mpp_taskqueue_pop_running(mpp->queue, task);
 
 	return 0;
@@ -1780,9 +1805,9 @@
 			    unsigned long iova,
 			    int status, void *arg)
 {
-	struct mpp_taskqueue *queue = (struct mpp_taskqueue *)arg;
+	struct mpp_dev *mpp = (struct mpp_dev *)arg;
+	struct mpp_taskqueue *queue = mpp->queue;
 	struct mpp_task *task = mpp_taskqueue_get_running_task(queue);
-	struct mpp_dev *mpp;
 
 	/*
 	 * NOTE: In link mode, this task may not be the task of the current
@@ -1798,7 +1823,7 @@
 	mpp_task_dump_hw_reg(mpp, task);
 
 	if (mpp->iommu_info->hdl)
-		mpp->iommu_info->hdl(iommu, iommu_dev, iova, status, arg);
+		mpp->iommu_info->hdl(iommu, iommu_dev, iova, status, mpp);
 
 	return 0;
 }
@@ -1815,6 +1840,8 @@
 
 	/* Get disable auto frequent flag from dtsi */
 	mpp->auto_freq_en = !device_property_read_bool(dev, "rockchip,disable-auto-freq");
+	/* read flag for pum idle request */
+	mpp->skip_idle = device_property_read_bool(dev, "rockchip,skip-pmu-idle-request");
 
 	/* Get and attach to service */
 	ret = mpp_attach_service(mpp, dev);
@@ -1897,7 +1924,7 @@
 	/* set iommu fault handler */
 	if (!IS_ERR(mpp->iommu_info))
 		iommu_set_fault_handler(mpp->iommu_info->domain,
-					mpp_iommu_handle, mpp->queue);
+					mpp_iommu_handle, mpp);
 
 	/* read hardware id */
 	if (hw_info->reg_id >= 0) {
@@ -1951,6 +1978,12 @@
 	struct mpp_dev *mpp = param;
 	struct mpp_task *task = mpp->cur_task;
 	irqreturn_t irq_ret = IRQ_NONE;
+	u32 timing_en = mpp->srv->timing_en;
+
+	if (task && timing_en) {
+		task->on_irq = ktime_get();
+		set_bit(TASK_TIMING_IRQ, &task->state);
+	}
 
 	if (mpp->dev_ops->irq)
 		irq_ret = mpp->dev_ops->irq(mpp);
@@ -1965,6 +1998,10 @@
 					mpp->irq_status);
 				irq_ret = IRQ_HANDLED;
 				goto done;
+			}
+			if (timing_en) {
+				task->on_cancel_timeout = ktime_get();
+				set_bit(TASK_TIMING_TO_CANCEL, &task->state);
 			}
 			cancel_delayed_work(&task->timeout_work);
 			/* normal condition, set state and wake up isr thread */
@@ -1981,6 +2018,12 @@
 {
 	irqreturn_t ret = IRQ_NONE;
 	struct mpp_dev *mpp = param;
+	struct mpp_task *task = mpp->cur_task;
+
+	if (task && mpp->srv->timing_en) {
+		task->on_isr = ktime_get();
+		set_bit(TASK_TIMING_ISR, &task->state);
+	}
 
 	if (mpp->auto_freq_en &&
 	    mpp->hw_ops->reduce_freq &&
@@ -2030,24 +2073,88 @@
 
 int mpp_time_record(struct mpp_task *task)
 {
-	if (mpp_debug_unlikely(DEBUG_TIMING) && task)
-		do_gettimeofday(&task->start);
+	if (mpp_debug_unlikely(DEBUG_TIMING) && task) {
+		task->start = ktime_get();
+		task->part = task->start;
+	}
+
+	return 0;
+}
+
+int mpp_time_part_diff(struct mpp_task *task)
+{
+	ktime_t end;
+	struct mpp_dev *mpp = task->session->mpp;
+
+	end = ktime_get();
+	mpp_debug(DEBUG_PART_TIMING, "%s: session %d:%d part time: %lld us\n",
+		  dev_name(mpp->dev), task->session->pid, task->session->index,
+		  ktime_us_delta(end, task->part));
+	task->part = end;
 
 	return 0;
 }
 
 int mpp_time_diff(struct mpp_task *task)
 {
-	struct timeval end;
+	ktime_t end;
 	struct mpp_dev *mpp = task->session->mpp;
 
-	do_gettimeofday(&end);
-	mpp_debug(DEBUG_TIMING, "%s: pid: %d, session: %p, time: %ld us\n",
-		  dev_name(mpp->dev), task->session->pid, task->session,
-		  (end.tv_sec  - task->start.tv_sec)  * 1000000 +
-		  (end.tv_usec - task->start.tv_usec));
+	end = ktime_get();
+	mpp_debug(DEBUG_TIMING, "%s: session %d:%d task time: %lld us\n",
+		  dev_name(mpp->dev), task->session->pid, task->session->index,
+		  ktime_us_delta(end, task->start));
 
 	return 0;
+}
+
+int mpp_time_diff_with_hw_time(struct mpp_task *task, u32 clk_hz)
+{
+	if (mpp_debug_unlikely(DEBUG_TIMING)) {
+		ktime_t end;
+		struct mpp_dev *mpp = task->session->mpp;
+
+		end = ktime_get();
+
+		if (clk_hz)
+			mpp_debug(DEBUG_TIMING, "%s: session %d time: %lld us hw %d us\n",
+				dev_name(mpp->dev), task->session->index,
+				ktime_us_delta(end, task->start),
+				task->hw_cycles / (clk_hz / 1000000));
+		else
+			mpp_debug(DEBUG_TIMING, "%s: session %d time: %lld us\n",
+				  dev_name(mpp->dev), task->session->index,
+				  ktime_us_delta(end, task->start));
+	}
+
+	return 0;
+}
+
+#define LOG_TIMING(state, id, stage, time, base) \
+	do { \
+		if (test_bit(id, &state)) \
+			pr_info("timing: %-14s : %lld us\n", stage, ktime_us_delta(time, base)); \
+		else \
+			pr_info("timing: %-14s : invalid\n", stage); \
+	} while (0)
+
+void mpp_task_dump_timing(struct mpp_task *task, s64 time_diff)
+{
+	ktime_t s = task->on_create;
+	unsigned long state = task->state;
+
+	pr_info("task %d dump timing at %lld us:", task->task_index, time_diff);
+
+	pr_info("timing: %-14s : %lld us\n", "create", ktime_to_us(s));
+	LOG_TIMING(state, TASK_TIMING_CREATE_END, "create end",     task->on_create_end, s);
+	LOG_TIMING(state, TASK_TIMING_PENDING,    "pending",        task->on_pending, s);
+	LOG_TIMING(state, TASK_TIMING_RUN,        "run",            task->on_run, s);
+	LOG_TIMING(state, TASK_TIMING_TO_SCHED,   "timeout start",  task->on_sched_timeout, s);
+	LOG_TIMING(state, TASK_TIMING_RUN_END,    "run end",        task->on_run_end, s);
+	LOG_TIMING(state, TASK_TIMING_IRQ,        "irq",            task->on_irq, s);
+	LOG_TIMING(state, TASK_TIMING_TO_CANCEL,  "timeout cancel", task->on_cancel_timeout, s);
+	LOG_TIMING(state, TASK_TIMING_ISR,        "isr",            task->on_isr, s);
+	LOG_TIMING(state, TASK_TIMING_FINISH,     "finish",         task->on_finish, s);
 }
 
 int mpp_write_req(struct mpp_dev *mpp, u32 *regs,
@@ -2184,6 +2291,7 @@
 	if (clk_rate_hz) {
 		clk_info->used_rate_hz = clk_rate_hz;
 		clk_set_rate(clk_info->clk, clk_rate_hz);
+		clk_info->real_rate_hz = clk_get_rate(clk_info->clk);
 	}
 
 	return 0;
@@ -2230,4 +2338,9 @@
 {
 	return proc_create_data(name, mode, parent, &procfs_fops_u32, data);
 }
+
+void mpp_procfs_create_common(struct proc_dir_entry *parent, struct mpp_dev *mpp)
+{
+	mpp_procfs_create_u32("timing_check", 0644, parent, &mpp->timing_check);
+}
 #endif
diff --git a/kernel/drivers/video/rockchip/mpp/mpp_common.h b/kernel/drivers/video/rockchip/mpp/mpp_common.h
index bf39983..04bb908 100644
--- a/kernel/drivers/video/rockchip/mpp/mpp_common.h
+++ b/kernel/drivers/video/rockchip/mpp/mpp_common.h
@@ -22,8 +22,10 @@
 #include <linux/reset.h>
 #include <linux/irqreturn.h>
 #include <linux/poll.h>
+#include <soc/rockchip/pm_domains.h>
 
-#define MHZ			(1000 * 1000)
+#define MHZ				(1000 * 1000)
+#define MPP_WORK_TIMEOUT_DELAY		(500)
 
 #define MPP_MAX_MSG_NUM			(16)
 #define MPP_MAX_REG_TRANS_NUM		(60)
@@ -116,6 +118,7 @@
 	MPP_CMD_TRANS_FD_TO_IOVA	= MPP_CMD_CONTROL_BASE + 1,
 	MPP_CMD_RELEASE_FD		= MPP_CMD_CONTROL_BASE + 2,
 	MPP_CMD_SEND_CODEC_INFO		= MPP_CMD_CONTROL_BASE + 3,
+	MPP_CMD_SET_ERR_REF_HACK	= MPP_CMD_CONTROL_BASE + 4,
 	MPP_CMD_CONTROL_BUTT,
 
 	MPP_CMD_BUTT,
@@ -199,6 +202,12 @@
 struct mpp_grf_info {
 	u32 offset;
 	u32 val;
+
+	/* close mem when module is not working*/
+	u32 mem_offset;
+	u32 val_mem_on;
+	u32 val_mem_off;
+
 	struct regmap *grf;
 };
 
@@ -255,6 +264,7 @@
 	u32 reduce_rate_hz;
 	/* record last used rate */
 	u32 used_rate_hz;
+	u32 real_rate_hz;
 };
 
 struct mpp_dev_var {
@@ -293,6 +303,8 @@
 	struct kthread_work work;
 	/* the flag for get/get/reduce freq */
 	bool auto_freq_en;
+	/* the flag for pmu idle request before device reset */
+	bool skip_idle;
 
 	/*
 	 * The task capacity is the task queue length that hardware can accept.
@@ -322,6 +334,9 @@
 	struct mpp_service *srv;
 
 	struct list_head queue_link;
+
+	/* common per-device procfs */
+	u32 timing_check;
 };
 
 struct mpp_task;
@@ -338,13 +353,7 @@
 	struct mutex pending_lock;
 	/* task pending list in session */
 	struct list_head pending_list;
-	/* lock for session task done list */
-	struct mutex done_lock;
-	/* task done list in session */
-	struct list_head done_list;
 
-	/* event for session wait thread */
-	wait_queue_head_t wait;
 	pid_t pid;
 	atomic_t task_count;
 	atomic_t release_request;
@@ -387,6 +396,18 @@
 	TASK_STATE_ABORT	= 9,
 	TASK_STATE_ABORT_READY	= 10,
 	TASK_STATE_PROC_DONE	= 11,
+
+	/* timing debug state */
+	TASK_TIMING_CREATE	= 16,
+	TASK_TIMING_CREATE_END	= 17,
+	TASK_TIMING_PENDING	= 18,
+	TASK_TIMING_RUN		= 19,
+	TASK_TIMING_TO_SCHED	= 20,
+	TASK_TIMING_RUN_END	= 21,
+	TASK_TIMING_IRQ		= 22,
+	TASK_TIMING_TO_CANCEL	= 23,
+	TASK_TIMING_ISR		= 24,
+	TASK_TIMING_FINISH	= 25,
 };
 
 /* The context for the a task */
@@ -413,11 +434,29 @@
 	struct kref ref;
 
 	/* record context running start time */
-	struct timeval start;
+	ktime_t start;
+	ktime_t part;
+
+	/* debug timing */
+	ktime_t on_create;
+	ktime_t on_create_end;
+	ktime_t on_pending;
+	ktime_t on_run;
+	ktime_t on_sched_timeout;
+	ktime_t on_run_end;
+	ktime_t on_irq;
+	ktime_t on_cancel_timeout;
+	ktime_t on_isr;
+	ktime_t on_finish;
+
 	/* hardware info for current task */
 	struct mpp_hw_info *hw_info;
 	u32 task_index;
 	u32 *reg;
+	/* hw cycles */
+	u32 hw_cycles;
+	/* event for session wait thread */
+	wait_queue_head_t wait;
 };
 
 struct mpp_taskqueue {
@@ -432,7 +471,7 @@
 	struct list_head session_attach;
 	/* link to session session_link for detached sessions */
 	struct list_head session_detach;
-	u32 detach_count;
+	atomic_t detach_count;
 
 	/* lock for pending list */
 	struct mutex pending_lock;
@@ -454,6 +493,15 @@
 	 * device task capacity which is attached to the taskqueue
 	 */
 	u32 task_capacity;
+
+	/*
+	 * when we need to set grf_mem config to close mem shared by combo modules,
+	 * use runtime_cnt to make sure every combo module are not working
+	 */
+	/* lock for runtime counting */
+	struct mutex ref_lock;
+	atomic_t runtime_cnt;
+
 };
 
 struct mpp_reset_group {
@@ -490,6 +538,9 @@
 	struct mutex session_lock;
 	struct list_head session_list;
 	u32 session_count;
+
+	/* global timing record flag */
+	u32 timing_en;
 };
 
 /*
@@ -580,6 +631,8 @@
 		  struct mpp_task *task);
 int mpp_task_finish(struct mpp_session *session,
 		    struct mpp_task *task);
+void mpp_task_run_begin(struct mpp_task *task, u32 timing_en, u32 timeout);
+void mpp_task_run_end(struct mpp_task *task, u32 timing_en);
 int mpp_task_finalize(struct mpp_session *session,
 		      struct mpp_task *task);
 int mpp_task_dump_mem_region(struct mpp_dev *mpp,
@@ -588,8 +641,12 @@
 		      struct mpp_task *task);
 int mpp_task_dump_hw_reg(struct mpp_dev *mpp,
 			 struct mpp_task *task);
+void mpp_task_dump_timing(struct mpp_task *task, s64 time_diff);
+void mpp_reg_show(struct mpp_dev *mpp, u32 offset);
 
-int mpp_session_deinit(struct mpp_session *session);
+void mpp_session_deinit(struct mpp_session *session);
+void mpp_session_cleanup_detach(struct mpp_taskqueue *queue,
+				struct kthread_work *work);
 
 int mpp_dev_probe(struct mpp_dev *mpp,
 		  struct platform_device *pdev);
@@ -613,6 +670,8 @@
 
 int mpp_time_record(struct mpp_task *task);
 int mpp_time_diff(struct mpp_task *task);
+int mpp_time_diff_with_hw_time(struct mpp_task *task, u32 clk_hz);
+int mpp_time_part_diff(struct mpp_task *task);
 
 int mpp_write_req(struct mpp_dev *mpp, u32 *regs,
 		  u32 start_idx, u32 end_idx, u32 en_idx);
@@ -740,10 +799,19 @@
 	return 0;
 }
 
+static inline int mpp_pmu_idle_request(struct mpp_dev *mpp, bool idle)
+{
+	if (mpp->skip_idle)
+		return 0;
+
+	return rockchip_pmu_idle_request(mpp->dev, idle);
+}
+
 #ifdef CONFIG_ROCKCHIP_MPP_PROC_FS
 struct proc_dir_entry *
 mpp_procfs_create_u32(const char *name, umode_t mode,
 		      struct proc_dir_entry *parent, void *data);
+void mpp_procfs_create_common(struct proc_dir_entry *parent, struct mpp_dev *mpp);
 #else
 static inline struct proc_dir_entry *
 mpp_procfs_create_u32(const char *name, umode_t mode,
@@ -751,6 +819,9 @@
 {
 	return 0;
 }
+void mpp_procfs_create_common(struct proc_dir_entry *parent, struct mpp_dev *mpp)
+{
+}
 #endif
 
 #ifdef CONFIG_ROCKCHIP_MPP_PROC_FS
diff --git a/kernel/drivers/video/rockchip/mpp/mpp_debug.h b/kernel/drivers/video/rockchip/mpp/mpp_debug.h
index 6d49fb7..acd75dd 100644
--- a/kernel/drivers/video/rockchip/mpp/mpp_debug.h
+++ b/kernel/drivers/video/rockchip/mpp/mpp_debug.h
@@ -53,6 +53,9 @@
 #define PRINT_FUNCTION				0x80000000
 #define PRINT_LINE				0x40000000
 
+/* reuse old debug bit flag */
+#define DEBUG_PART_TIMING			0x00000080
+
 extern unsigned int mpp_dev_debug;
 
 #define mpp_debug_unlikely(type)				\
diff --git a/kernel/drivers/video/rockchip/mpp/mpp_iep2.c b/kernel/drivers/video/rockchip/mpp/mpp_iep2.c
index 92ec40e..e8e2183 100644
--- a/kernel/drivers/video/rockchip/mpp/mpp_iep2.c
+++ b/kernel/drivers/video/rockchip/mpp/mpp_iep2.c
@@ -20,6 +20,8 @@
 #include <linux/regmap.h>
 #include <linux/pm_runtime.h>
 #include <linux/proc_fs.h>
+#include <linux/mfd/syscon.h>
+#include <linux/rockchip/cpu.h>
 #include <soc/rockchip/pm_domains.h>
 
 #include "rockchip_iep2_regs.h"
@@ -389,12 +391,13 @@
 		| IEP2_REG_DIL_OSD_EN
 		| IEP2_REG_DIL_PD_EN
 		| IEP2_REG_DIL_FF_EN
-		| IEP2_REG_DIL_MD_PRE_EN
 		| IEP2_REG_DIL_FIELD_ORDER(cfg->dil_field_order)
 		| IEP2_REG_DIL_OUT_MODE(cfg->dil_out_mode)
 		| IEP2_REG_DIL_MODE(cfg->dil_mode);
 	if (cfg->roi_en)
 		reg |= IEP2_REG_DIL_ROI_EN;
+	if (cfg->md_lambda < 8)
+		reg |= IEP2_REG_DIL_MD_PRE_EN;
 	mpp_write_relaxed(mpp, IEP2_REG_DIL_CONFIG0, reg);
 
 	if (cfg->dil_mode != ROCKCHIP_IEP2_DIL_MODE_PD) {
@@ -437,6 +440,9 @@
 		mpp_write_relaxed(mpp, IEP2_REG_SRC_ADDR_NXTUV, bot->cbcr);
 		mpp_write_relaxed(mpp, IEP2_REG_SRC_ADDR_NXTV, bot->cr);
 	}
+
+	reg = IEP2_REG_TIMEOUT_CFG_EN | 0x3ffffff;
+	mpp_write_relaxed(mpp, IEP2_REG_TIMEOUT_CFG, reg);
 
 	mpp_write_relaxed(mpp, IEP2_REG_SRC_ADDR_PREY, cfg->src[2].y);
 	mpp_write_relaxed(mpp, IEP2_REG_SRC_ADDR_PREUV, cfg->src[2].cbcr);
@@ -580,6 +586,7 @@
 		    struct mpp_task *mpp_task)
 {
 	struct iep_task *task = NULL;
+	u32 timing_en = mpp->srv->timing_en;
 
 	mpp_debug_enter();
 
@@ -598,12 +605,20 @@
 	mpp_write_relaxed(mpp, IEP2_REG_INT_EN,
 			  IEP2_REG_FRM_DONE_EN
 			  | IEP2_REG_OSD_MAX_EN
-			  | IEP2_REG_BUS_ERROR_EN);
+			  | IEP2_REG_BUS_ERROR_EN
+			  | IEP2_REG_TIMEOUT_EN);
+
+	/* flush tlb before starting hardware */
+	mpp_iommu_flush_tlb(mpp->iommu_info);
+
+	mpp_task_run_begin(mpp_task, timing_en, MPP_WORK_TIMEOUT_DELAY);
 
 	/* Last, flush the registers */
 	wmb();
 	/* start iep2 */
 	mpp_write(mpp, IEP2_REG_FRM_START, 1);
+
+	mpp_task_run_end(mpp_task, timing_en);
 
 	mpp_debug_leave();
 
@@ -612,6 +627,10 @@
 
 static int iep2_irq(struct mpp_dev *mpp)
 {
+	u32 work_mode = mpp_read(mpp, IEP2_REG_WORK_MODE);
+
+	if (work_mode && !(work_mode & IEP2_REG_IEP2_MODE))
+		return IRQ_NONE;
 	mpp->irq_status = mpp_read(mpp, IEP2_REG_INT_STS);
 	mpp_write(mpp, IEP2_REG_INT_CLR, 0xffffffff);
 
@@ -640,7 +659,8 @@
 	mpp_debug(DEBUG_IRQ_STATUS, "irq_status: %08x\n",
 		  task->irq_status);
 
-	if (IEP2_REG_RO_BUS_ERROR_STS(task->irq_status))
+	if (IEP2_REG_RO_BUS_ERROR_STS(task->irq_status) ||
+	    IEP2_REG_RO_TIMEOUT_STS(task->irq_status))
 		atomic_inc(&mpp->reset_request);
 
 	mpp_task_finish(mpp_task->session, mpp_task);
@@ -769,6 +789,10 @@
 		iep->procfs = NULL;
 		return -EIO;
 	}
+
+	/* for common mpp_dev options */
+	mpp_procfs_create_common(iep->procfs, mpp);
+
 	mpp_procfs_create_u32("aclk", 0644,
 			      iep->procfs, &iep->aclk_info.debug_rate_hz);
 	mpp_procfs_create_u32("session_buffers", 0644,
@@ -870,17 +894,29 @@
 {
 	struct iep2_dev *iep = to_iep2_dev(mpp);
 
-	if (iep->rst_a && iep->rst_h && iep->rst_s) {
-		/* Don't skip this or iommu won't work after reset */
-		rockchip_pmu_idle_request(mpp->dev, true);
-		mpp_safe_reset(iep->rst_a);
-		mpp_safe_reset(iep->rst_h);
-		mpp_safe_reset(iep->rst_s);
-		udelay(5);
-		mpp_safe_unreset(iep->rst_a);
-		mpp_safe_unreset(iep->rst_h);
-		mpp_safe_unreset(iep->rst_s);
-		rockchip_pmu_idle_request(mpp->dev, false);
+	int ret = 0;
+	u32 rst_status = 0;
+
+	/* soft rest first */
+	mpp_write(mpp, IEP2_REG_IEP_CONFIG0, IEP2_REG_ACLK_SRESET_P);
+	ret = readl_relaxed_poll_timeout(mpp->reg_base + IEP2_REG_STATUS,
+					 rst_status,
+					 rst_status & IEP2_REG_ARST_FINISH_DONE,
+					 0, 5);
+	if (ret) {
+		mpp_err("soft reset timeout, use cru reset\n");
+		if (iep->rst_a && iep->rst_h && iep->rst_s) {
+			/* Don't skip this or iommu won't work after reset */
+			mpp_pmu_idle_request(mpp, true);
+			mpp_safe_reset(iep->rst_a);
+			mpp_safe_reset(iep->rst_h);
+			mpp_safe_reset(iep->rst_s);
+			udelay(5);
+			mpp_safe_unreset(iep->rst_a);
+			mpp_safe_unreset(iep->rst_h);
+			mpp_safe_unreset(iep->rst_s);
+			mpp_pmu_idle_request(mpp, false);
+		}
 	}
 
 	return 0;
@@ -1008,12 +1044,53 @@
 		dev_err(dev, "wait total running time out\n");
 }
 
+static int iep2_runtime_suspend(struct device *dev)
+{
+	struct mpp_dev *mpp = dev_get_drvdata(dev);
+	struct mpp_grf_info *info = mpp->grf_info;
+	struct mpp_taskqueue *queue = mpp->queue;
+
+	if (cpu_is_rk3528() && info && info->mem_offset) {
+		mutex_lock(&queue->ref_lock);
+		if (!atomic_dec_if_positive(&queue->runtime_cnt)) {
+			regmap_write(info->grf, info->mem_offset,
+				     info->val_mem_off);
+		}
+		mutex_unlock(&queue->ref_lock);
+	}
+
+	return 0;
+}
+
+static int iep2_runtime_resume(struct device *dev)
+{
+	struct mpp_dev *mpp = dev_get_drvdata(dev);
+	struct mpp_grf_info *info = mpp->grf_info;
+	struct mpp_taskqueue *queue = mpp->queue;
+
+	if (cpu_is_rk3528() && info && info->mem_offset) {
+		mutex_lock(&queue->ref_lock);
+		regmap_write(info->grf, info->mem_offset,
+			     info->val_mem_on);
+		atomic_inc(&queue->runtime_cnt);
+		mutex_unlock(&queue->ref_lock);
+	}
+
+	return 0;
+}
+
+static const struct dev_pm_ops iep2_pm_ops = {
+	.runtime_suspend		= iep2_runtime_suspend,
+	.runtime_resume			= iep2_runtime_resume,
+};
+
 struct platform_driver rockchip_iep2_driver = {
 	.probe = iep2_probe,
 	.remove = iep2_remove,
 	.shutdown = iep2_shutdown,
 	.driver = {
 		.name = IEP2_DRIVER_NAME,
+		.pm = &iep2_pm_ops,
 		.of_match_table = of_match_ptr(mpp_iep2_match),
 	},
 };
diff --git a/kernel/drivers/video/rockchip/mpp/mpp_iommu.c b/kernel/drivers/video/rockchip/mpp/mpp_iommu.c
index d99ff20..504c7934 100644
--- a/kernel/drivers/video/rockchip/mpp/mpp_iommu.c
+++ b/kernel/drivers/video/rockchip/mpp/mpp_iommu.c
@@ -87,7 +87,7 @@
 				oldest = buffer;
 			}
 		}
-		if (oldest && kref_read(&oldest->ref) <= 1)
+		if (oldest && kref_read(&oldest->ref) == 1)
 			kref_put(&oldest->ref, mpp_dma_release_buffer);
 		mutex_unlock(&dma->list_mutex);
 	}
@@ -179,7 +179,8 @@
 	}
 
 	/* remove the oldest before add buffer */
-	mpp_dma_remove_extra_buffer(dma);
+	if (!IS_ENABLED(CONFIG_DMABUF_CACHE))
+		mpp_dma_remove_extra_buffer(dma);
 
 	/* Check whether in dma session */
 	buffer = mpp_dma_find_buffer_fd(dma, fd);
@@ -233,6 +234,8 @@
 	buffer->dma = dma;
 
 	kref_init(&buffer->ref);
+	if (!IS_ENABLED(CONFIG_DMABUF_CACHE))
+		kref_get(&buffer->ref);
 
 	mutex_lock(&dma->list_mutex);
 	dma->buffer_count++;
@@ -437,6 +440,8 @@
 	info->dev = dev;
 	info->pdev = pdev;
 	init_rwsem(&info->rw_sem);
+	info->irq = platform_get_irq(pdev, 0);
+	info->got_irq = (info->irq < 0) ? false : true;
 
 	return info;
 
diff --git a/kernel/drivers/video/rockchip/mpp/mpp_iommu.h b/kernel/drivers/video/rockchip/mpp/mpp_iommu.h
index 9ae1b6b..6410445 100644
--- a/kernel/drivers/video/rockchip/mpp/mpp_iommu.h
+++ b/kernel/drivers/video/rockchip/mpp/mpp_iommu.h
@@ -13,6 +13,7 @@
 
 #include <linux/iommu.h>
 #include <linux/dma-mapping.h>
+#include <linux/interrupt.h>
 
 struct mpp_dma_buffer {
 	/* link to dma session buffer list */
@@ -73,6 +74,8 @@
 	struct iommu_group *group;
 	struct mpp_rk_iommu *iommu;
 	iommu_fault_handler_t hdl;
+	int irq;
+	int got_irq;
 };
 
 struct mpp_dma_session *
@@ -137,4 +140,16 @@
 	return 0;
 }
 
+static inline void mpp_iommu_enable_irq(struct mpp_iommu_info *info)
+{
+	if (info && info->got_irq)
+		enable_irq(info->irq);
+}
+
+static inline void mpp_iommu_disable_irq(struct mpp_iommu_info *info)
+{
+	if (info && info->got_irq)
+		disable_irq(info->irq);
+}
+
 #endif
diff --git a/kernel/drivers/video/rockchip/mpp/mpp_jpgdec.c b/kernel/drivers/video/rockchip/mpp/mpp_jpgdec.c
index 3e94cee..c361c66 100644
--- a/kernel/drivers/video/rockchip/mpp/mpp_jpgdec.c
+++ b/kernel/drivers/video/rockchip/mpp/mpp_jpgdec.c
@@ -251,6 +251,7 @@
 	u32 i;
 	u32 reg_en;
 	struct jpgdec_task *task = to_jpgdec_task(mpp_task);
+	u32 timing_en = mpp->srv->timing_en;
 
 	mpp_debug_enter();
 
@@ -263,12 +264,21 @@
 
 		mpp_write_req(mpp, task->reg, s, e, reg_en);
 	}
+
+	/* flush tlb before starting hardware */
+	mpp_iommu_flush_tlb(mpp->iommu_info);
+
 	/* init current task */
 	mpp->cur_task = mpp_task;
+
+	mpp_task_run_begin(mpp_task, timing_en, MPP_WORK_TIMEOUT_DELAY);
+
 	/* Flush the register before the start the device */
 	wmb();
 	mpp_write(mpp, JPGDEC_REG_INT_EN_BASE,
 		  task->reg[reg_en] | JPGDEC_START_EN);
+
+	mpp_task_run_end(mpp_task, timing_en);
 
 	mpp_debug_leave();
 
@@ -374,6 +384,10 @@
 		dec->procfs = NULL;
 		return -EIO;
 	}
+
+	/* for common mpp_dev options */
+	mpp_procfs_create_common(dec->procfs, mpp);
+
 	mpp_procfs_create_u32("aclk", 0644,
 			      dec->procfs, &dec->aclk_info.debug_rate_hz);
 	mpp_procfs_create_u32("session_buffers", 0644,
@@ -510,13 +524,13 @@
 		mpp_debug(DEBUG_RESET, "reset in\n");
 
 		/* Don't skip this or iommu won't work after reset */
-		rockchip_pmu_idle_request(mpp->dev, true);
+		mpp_pmu_idle_request(mpp, true);
 		mpp_safe_reset(dec->rst_a);
 		mpp_safe_reset(dec->rst_h);
 		udelay(5);
 		mpp_safe_unreset(dec->rst_a);
 		mpp_safe_unreset(dec->rst_h);
-		rockchip_pmu_idle_request(mpp->dev, false);
+		mpp_pmu_idle_request(mpp, false);
 
 		mpp_debug(DEBUG_RESET, "reset out\n");
 	}
diff --git a/kernel/drivers/video/rockchip/mpp/mpp_rkvdec.c b/kernel/drivers/video/rockchip/mpp/mpp_rkvdec.c
index 09bea1e..89ec8a9 100644
--- a/kernel/drivers/video/rockchip/mpp/mpp_rkvdec.c
+++ b/kernel/drivers/video/rockchip/mpp/mpp_rkvdec.c
@@ -944,11 +944,11 @@
 	task = to_rkvdec_task(mpp_task);
 
 	/*
-	 * HW defeat workaround: VP9 power save optimization cause decoding
+	 * HW defeat workaround: VP9 and H.265 power save optimization cause decoding
 	 * corruption, disable optimization here.
 	 */
 	fmt = RKVDEC_GET_FORMAT(task->reg[RKVDEC_REG_SYS_CTRL_INDEX]);
-	if (fmt == RKVDEC_FMT_VP9D) {
+	if (fmt == RKVDEC_FMT_VP9D || fmt == RKVDEC_FMT_H265D) {
 		cfg = task->reg[RKVDEC_POWER_CTL_INDEX] | 0xFFFF;
 		task->reg[RKVDEC_POWER_CTL_INDEX] = cfg & (~(1 << 12));
 		mpp_write_relaxed(mpp, RKVDEC_POWER_CTL_BASE,
@@ -1171,6 +1171,10 @@
 		dec->procfs = NULL;
 		return -EIO;
 	}
+
+	/* for common mpp_dev options */
+	mpp_procfs_create_common(dec->procfs, mpp);
+
 	mpp_procfs_create_u32("aclk", 0644,
 			      dec->procfs, &dec->aclk_info.debug_rate_hz);
 	mpp_procfs_create_u32("clk_core", 0644,
@@ -1629,7 +1633,7 @@
 
 	mpp_debug_enter();
 	if (dec->rst_a && dec->rst_h) {
-		rockchip_pmu_idle_request(mpp->dev, true);
+		mpp_pmu_idle_request(mpp, true);
 		mpp_safe_reset(dec->rst_niu_a);
 		mpp_safe_reset(dec->rst_niu_h);
 		mpp_safe_reset(dec->rst_a);
@@ -1645,7 +1649,7 @@
 		mpp_safe_unreset(dec->rst_core);
 		mpp_safe_unreset(dec->rst_cabac);
 		mpp_safe_unreset(dec->rst_hevc_cabac);
-		rockchip_pmu_idle_request(mpp->dev, false);
+		mpp_pmu_idle_request(mpp, false);
 	}
 	mpp_debug_leave();
 
diff --git a/kernel/drivers/video/rockchip/mpp/mpp_rkvdec2.c b/kernel/drivers/video/rockchip/mpp/mpp_rkvdec2.c
index f6d605d..61364f2 100644
--- a/kernel/drivers/video/rockchip/mpp/mpp_rkvdec2.c
+++ b/kernel/drivers/video/rockchip/mpp/mpp_rkvdec2.c
@@ -17,8 +17,10 @@
 
 #include <linux/devfreq_cooling.h>
 #include <soc/rockchip/rockchip_ipa.h>
+#include <soc/rockchip/rockchip_dmc.h>
 #include <soc/rockchip/rockchip_opp_select.h>
 #include <soc/rockchip/rockchip_system_monitor.h>
+#include <soc/rockchip/rockchip_iommu.h>
 
 #ifdef CONFIG_PM_DEVFREQ
 #include "../../../devfreq/governor.h"
@@ -304,6 +306,7 @@
 static int rkvdec2_run(struct mpp_dev *mpp, struct mpp_task *mpp_task)
 {
 	struct rkvdec2_task *task = to_rkvdec2_task(mpp_task);
+	u32 timing_en = mpp->srv->timing_en;
 	u32 reg_en = mpp_task->hw_info->reg_en;
 	/* set cache size */
 	u32 reg = RKVDEC_CACHE_PERMIT_CACHEABLE_ACCESS |
@@ -332,12 +335,20 @@
 		e = s + req->size / sizeof(u32);
 		mpp_write_req(mpp, task->reg, s, e, reg_en);
 	}
+
+	/* flush tlb before starting hardware */
+	mpp_iommu_flush_tlb(mpp->iommu_info);
+
 	/* init current task */
 	mpp->cur_task = mpp_task;
-	mpp_time_record(mpp_task);
+
+	mpp_task_run_begin(mpp_task, timing_en, MPP_WORK_TIMEOUT_DELAY);
+
 	/* Flush the register before the start the device */
 	wmb();
 	mpp_write(mpp, RKVDEC_REG_START_EN_BASE, task->reg[reg_en] | RKVDEC_START_EN);
+
+	mpp_task_run_end(mpp_task, timing_en);
 
 	mpp_debug_leave();
 
@@ -381,13 +392,15 @@
 	u32 err_mask;
 	struct rkvdec2_task *task = NULL;
 	struct mpp_task *mpp_task = mpp->cur_task;
+	struct rkvdec2_dev *dec = to_rkvdec2_dev(mpp);
 
 	/* FIXME use a spin lock here */
 	if (!mpp_task) {
 		dev_err(mpp->dev, "no current task\n");
 		return IRQ_HANDLED;
 	}
-	mpp_time_diff(mpp_task);
+	mpp_task->hw_cycles = mpp_read(mpp, RKVDEC_PERF_WORKING_CNT);
+	mpp_time_diff_with_hw_time(mpp_task, dec->core_clk_info.real_rate_hz);
 	mpp->cur_task = NULL;
 	task = to_rkvdec2_task(mpp_task);
 	task->irq_status = mpp->irq_status;
@@ -552,6 +565,16 @@
 			}
 		}
 	} break;
+	case MPP_CMD_SET_ERR_REF_HACK: {
+		struct rkvdec2_dev *dec = to_rkvdec2_dev(session->mpp);
+		u32 err_ref_hack_en = 0;
+
+		if (copy_from_user(&err_ref_hack_en, req->data, sizeof(u32))) {
+			mpp_err("copy_from_user failed\n");
+			return -EINVAL;
+		}
+		dec->err_ref_hack = err_ref_hack_en;
+	} break;
 	default: {
 		mpp_err("unknown mpp ioctl cmd %x\n", req->cmd);
 	} break;
@@ -617,6 +640,10 @@
 		dec->procfs = NULL;
 		return -EIO;
 	}
+
+	/* for common mpp_dev options */
+	mpp_procfs_create_common(dec->procfs, mpp);
+
 	mpp_procfs_create_u32("aclk", 0644,
 			      dec->procfs, &dec->aclk_info.debug_rate_hz);
 	mpp_procfs_create_u32("clk_core", 0644,
@@ -1067,17 +1094,41 @@
 	return 0;
 }
 
+static int rkvdec2_soft_reset(struct mpp_dev *mpp)
+{
+	int ret = 0;
+
+	/*
+	 * for rk3528 and rk3562
+	 * use mmu reset instead of rkvdec soft reset
+	 * rkvdec will reset together when rkvdec_mmu force reset
+	 */
+	ret = rockchip_iommu_force_reset(mpp->dev);
+	if (ret)
+		mpp_err("soft mmu reset fail, ret %d\n", ret);
+	mpp_write(mpp, RKVDEC_REG_INT_EN, 0);
+
+	return ret;
+
+}
+
 static int rkvdec2_reset(struct mpp_dev *mpp)
 {
 	struct rkvdec2_dev *dec = to_rkvdec2_dev(mpp);
+	int ret = 0;
 
 	mpp_debug_enter();
 #ifdef CONFIG_PM_DEVFREQ
 	if (dec->devfreq)
 		mutex_lock(&dec->devfreq->lock);
 #endif
-	if (dec->rst_a && dec->rst_h) {
-		rockchip_pmu_idle_request(mpp->dev, true);
+	/* safe reset first*/
+	ret = rkvdec2_soft_reset(mpp);
+
+	/* cru reset */
+	if (ret && dec->rst_a && dec->rst_h) {
+		mpp_err("soft reset timeout, use cru reset\n");
+		mpp_pmu_idle_request(mpp, true);
 		mpp_safe_reset(dec->rst_niu_a);
 		mpp_safe_reset(dec->rst_niu_h);
 		mpp_safe_reset(dec->rst_a);
@@ -1093,12 +1144,30 @@
 		mpp_safe_unreset(dec->rst_core);
 		mpp_safe_unreset(dec->rst_cabac);
 		mpp_safe_unreset(dec->rst_hevc_cabac);
-		rockchip_pmu_idle_request(mpp->dev, false);
+		mpp_pmu_idle_request(mpp, false);
 	}
 #ifdef CONFIG_PM_DEVFREQ
 	if (dec->devfreq)
 		mutex_unlock(&dec->devfreq->lock);
 #endif
+	mpp_debug_leave();
+
+	return 0;
+}
+
+static int rkvdec2_sip_reset(struct mpp_dev *mpp)
+{
+	mpp_debug_enter();
+
+	if (IS_REACHABLE(CONFIG_ROCKCHIP_SIP)) {
+		/* sip reset */
+		rockchip_dmcfreq_lock();
+		sip_smc_vpu_reset(0, 0, 0);
+		rockchip_dmcfreq_unlock();
+	} else {
+		rkvdec2_reset(mpp);
+	}
+
 	mpp_debug_leave();
 
 	return 0;
@@ -1120,7 +1189,7 @@
 	.clk_off = rkvdec2_clk_off,
 	.get_freq = rkvdec2_get_freq,
 	.set_freq = rkvdec2_set_freq,
-	.reset = rkvdec2_reset,
+	.reset = rkvdec2_sip_reset,
 };
 
 static struct mpp_dev_ops rkvdec_v2_dev_ops = {
diff --git a/kernel/drivers/video/rockchip/mpp/mpp_rkvdec2.h b/kernel/drivers/video/rockchip/mpp/mpp_rkvdec2.h
index 0056bb6..e97b6ac 100644
--- a/kernel/drivers/video/rockchip/mpp/mpp_rkvdec2.h
+++ b/kernel/drivers/video/rockchip/mpp/mpp_rkvdec2.h
@@ -33,6 +33,10 @@
 
 #define RKVDEC_DRIVER_NAME		"mpp_rkvdec2"
 
+#define RKVDEC_REG_IMPORTANT_BASE	0x2c
+#define RKVDEC_REG_IMPORTANT_INDEX	11
+#define RKVDEC_SOFTREST_EN		BIT(20)
+
 #define	RKVDEC_SESSION_MAX_BUFFERS	40
 /* The maximum registers number of all the version */
 #define RKVDEC_REG_NUM			279
@@ -71,6 +75,7 @@
 					RKVDEC_BUF_EMPTY_STA |\
 					RKVDEC_TIMEOUT_STA |\
 					RKVDEC_ERROR_STA)
+#define RKVDEC_PERF_WORKING_CNT		0x41c
 
 /* perf sel reference register */
 #define RKVDEC_PERF_SEL_OFFSET		0x20000
@@ -202,6 +207,8 @@
 	/* for link mode */
 	struct rkvdec_link_dev *link_dec;
 	struct mpp_dma_buffer *fix;
+
+	u32 err_ref_hack;
 };
 
 void *rkvdec2_alloc_task(struct mpp_session *session,
diff --git a/kernel/drivers/video/rockchip/mpp/mpp_rkvdec2_link.c b/kernel/drivers/video/rockchip/mpp/mpp_rkvdec2_link.c
index dfe74e0..d4a4fdb 100644
--- a/kernel/drivers/video/rockchip/mpp/mpp_rkvdec2_link.c
+++ b/kernel/drivers/video/rockchip/mpp/mpp_rkvdec2_link.c
@@ -60,6 +60,10 @@
 	/* interrupt read back in table buffer */
 	u32 tb_reg_int;
 	bool hack_setup;
+	u32 tb_reg_cycle;
+	u32 tb_reg_out;
+	u32 tb_reg_ref_s;
+	u32 tb_reg_ref_e;
 	struct rkvdec_link_status reg_status;
 };
 
@@ -113,6 +117,7 @@
 	},
 	.tb_reg_int = 164,
 	.hack_setup = 1,
+	.tb_reg_cycle = 179,
 	.reg_status = {
 		.dec_num_mask = 0x3fffffff,
 		.err_flag_base = 0x010,
@@ -122,7 +127,7 @@
 
 /* vdpu382 link hw info */
 struct rkvdec_link_info rkvdec_link_v2_hw_info = {
-	.tb_reg_num = 218,
+	.tb_reg_num = 222,
 	.tb_reg_next = 0,
 	.tb_reg_r = 1,
 	.tb_reg_second_en = 8,
@@ -162,21 +167,27 @@
 	.part_r[0] = {
 		.tb_reg_off = 180,
 		.reg_start = 224,
-		.reg_num = 10,
+		.reg_num = 12,
 	},
 	.part_r[1] = {
-		.tb_reg_off = 190,
+		.tb_reg_off = 192,
 		.reg_start = 258,
-		.reg_num = 28,
+		.reg_num = 30,
 	},
-	.tb_reg_int = 180,
-	.hack_setup = 0,
+	.tb_reg_int	= 180,
+	.hack_setup	= 0,
+	.tb_reg_cycle	= 197,
+	.tb_reg_out	= 86,
+	.tb_reg_ref_s	= 104,
+	.tb_reg_ref_e	= 119,
 	.reg_status = {
 		.dec_num_mask = 0x000fffff,
 		.err_flag_base = 0x024,
 		.err_flag_bit = BIT(8),
 	},
 };
+
+static void rkvdec2_link_free_task(struct kref *ref);
 
 static void rkvdec_link_status_update(struct rkvdec_link_dev *dev)
 {
@@ -426,8 +437,6 @@
 		memcpy(&tb_reg[off], &task->reg[s], n * sizeof(u32));
 	}
 
-	/* setup error mode flag */
-	tb_reg[9] |= BIT(18) | BIT(9);
 	tb_reg[info->tb_reg_second_en] |= RKVDEC_WAIT_RESET_EN;
 
 	/* memset read registers */
@@ -514,6 +523,7 @@
 	}
 
 	if (!resend) {
+		u32 timing_en = dev->mpp->srv->timing_en;
 		u32 i;
 
 		for (i = 0; i < task_to_run; i++) {
@@ -523,10 +533,8 @@
 			if (!task_ddr)
 				continue;
 
-			set_bit(TASK_STATE_START, &task_ddr->state);
-			schedule_delayed_work(&task_ddr->timeout_work,
-					      msecs_to_jiffies(200));
-			mpp_time_record(task_ddr);
+			mpp_task_run_begin(task_ddr, timing_en, MPP_WORK_TIMEOUT_DELAY);
+			mpp_task_run_end(task_ddr, timing_en);
 		}
 	} else {
 		if (task_total)
@@ -538,6 +546,8 @@
 
 	/* start config before all registers are set */
 	wmb();
+
+	mpp_iommu_flush_tlb(dev->mpp->iommu_info);
 
 	/* configure done */
 	writel(RKVDEC_LINK_BIT_CFG_DONE, reg_base + RKVDEC_LINK_CFG_CTRL_BASE);
@@ -591,6 +601,7 @@
 	struct rkvdec_link_info *info = link_dec->info;
 	u32 *table_base = (u32 *)link_dec->table->vaddr;
 	int i;
+	struct rkvdec2_dev *dec = to_rkvdec2_dev(mpp);
 
 	for (i = 0; i < count; i++) {
 		int idx = rkvdec_link_get_task_read(link_dec);
@@ -599,15 +610,15 @@
 		u32 *regs = NULL;
 		u32 irq_status = 0;
 
-		if (!mpp_task) {
+		if (!mpp_task && info->hack_setup) {
 			regs = table_base + idx * link_dec->link_reg_count;
 			mpp_dbg_link_flow("slot %d read  task stuff\n", idx);
 
 			link_dec->stuff_total++;
 			if (link_dec->statistic_count &&
-			    regs[RKVDEC_LINK_REG_CYCLE_CNT]) {
+			    regs[info->tb_reg_cycle]) {
 				link_dec->stuff_cycle_sum +=
-					regs[RKVDEC_LINK_REG_CYCLE_CNT];
+					regs[info->tb_reg_cycle];
 				link_dec->stuff_cnt++;
 				if (link_dec->stuff_cnt >=
 				    link_dec->statistic_count) {
@@ -648,22 +659,27 @@
 			continue;
 		}
 
-		mpp_time_diff(mpp_task);
+		if (!mpp_task)
+			return 0;
+
 		task = to_rkvdec2_task(mpp_task);
 		regs = table_base + idx * link_dec->link_reg_count;
+		link_dec->error_iova = regs[info->tb_reg_out];
 		irq_status = regs[info->tb_reg_int];
+		mpp_task->hw_cycles = regs[info->tb_reg_cycle];
+		mpp_time_diff_with_hw_time(mpp_task, dec->aclk_info.real_rate_hz);
 		mpp_dbg_link_flow("slot %d rd task %d\n", idx,
 				  mpp_task->task_index);
 
 		task->irq_status = irq_status ? irq_status : mpp->irq_status;
-
+		mpp_debug(DEBUG_IRQ_STATUS, "irq_status: %08x\n", task->irq_status);
 		cancel_delayed_work_sync(&mpp_task->timeout_work);
 		set_bit(TASK_STATE_HANDLE, &mpp_task->state);
 
 		if (link_dec->statistic_count &&
-		    regs[RKVDEC_LINK_REG_CYCLE_CNT]) {
+		    regs[info->tb_reg_cycle]) {
 			link_dec->task_cycle_sum +=
-				regs[RKVDEC_LINK_REG_CYCLE_CNT];
+				regs[info->tb_reg_cycle];
 			link_dec->task_cnt++;
 			if (link_dec->task_cnt >= link_dec->statistic_count) {
 				dev_info(link_dec->dev, "hw cycle %u\n",
@@ -691,6 +707,8 @@
 		set_bit(TASK_STATE_PROC_DONE, &mpp_task->state);
 		/* Wake up the GET thread */
 		wake_up(&task->wait);
+		kref_put(&mpp_task->ref, rkvdec2_link_free_task);
+		link_dec->tasks_hw[idx] = NULL;
 	}
 
 	return 0;
@@ -729,7 +747,6 @@
 
 static int rkvdec2_link_reset(struct mpp_dev *mpp)
 {
-	struct rkvdec2_dev *dec = to_rkvdec2_dev(mpp);
 
 	dev_info(mpp->dev, "resetting...\n");
 
@@ -740,11 +757,8 @@
 
 	rockchip_save_qos(mpp->dev);
 
-	mutex_lock(&dec->sip_reset_lock);
-	rockchip_dmcfreq_lock();
-	sip_smc_vpu_reset(0, 0, 0);
-	rockchip_dmcfreq_unlock();
-	mutex_unlock(&dec->sip_reset_lock);
+	if (mpp->hw_ops->reset)
+		mpp->hw_ops->reset(mpp);
 
 	rockchip_restore_qos(mpp->dev);
 
@@ -762,6 +776,49 @@
 	return 0;
 }
 
+static void rkvdec2_check_err_ref(struct mpp_dev *mpp)
+{
+	struct rkvdec2_dev *dec = to_rkvdec2_dev(mpp);
+	struct rkvdec_link_dev *link_dec = dec->link_dec;
+	struct rkvdec_link_info *link_info = link_dec->info;
+	struct mpp_taskqueue *queue = mpp->queue;
+	struct mpp_task *mpp_task = NULL, *n;
+	struct rkvdec2_task *task;
+	int i;
+
+	if (!link_dec->error_iova || !dec->err_ref_hack)
+		return;
+
+	dev_err(mpp->dev, "err task iova %#08x\n", link_dec->error_iova);
+	list_for_each_entry_safe(mpp_task, n, &queue->running_list, queue_link) {
+		if (mpp_task) {
+			u32 *regs = NULL;
+			u32 *table_base = (u32 *)link_dec->table->vaddr;
+
+			task = to_rkvdec2_task(mpp_task);
+			regs = table_base + task->slot_idx * link_dec->link_reg_count;
+
+			for (i = link_info->tb_reg_ref_s; i <= link_info->tb_reg_ref_e; i++) {
+				if (regs[i] == link_dec->error_iova)
+					regs[i] = 0;
+			}
+		}
+	}
+
+	mutex_lock(&queue->pending_lock);
+	list_for_each_entry_safe(mpp_task, n, &queue->pending_list, queue_link) {
+		task = to_rkvdec2_task(mpp_task);
+
+		/* ref frame reg index start - end */
+		for (i = 164; i <= 179; i++) {
+			if (task->reg[i] == link_dec->error_iova)
+				task->reg[i] = 0;
+		}
+	}
+	mutex_unlock(&queue->pending_lock);
+	link_dec->error_iova = 0;
+}
+
 static int rkvdec2_link_irq(struct mpp_dev *mpp)
 {
 	struct rkvdec2_dev *dec = to_rkvdec2_dev(mpp);
@@ -774,9 +831,6 @@
 	}
 
 	irq_status = readl(link_dec->reg_base + RKVDEC_LINK_IRQ_BASE);
-
-	mpp_debug(DEBUG_IRQ_STATUS, "irq_status: %08x\n", irq_status);
-	mpp_dbg_link_flow("link irq %08x\n", irq_status);
 
 	if (irq_status & RKVDEC_LINK_BIT_IRQ_RAW) {
 		u32 enabled = readl(link_dec->reg_base + RKVDEC_LINK_EN_BASE);
@@ -795,7 +849,8 @@
 
 		writel_relaxed(0, link_dec->reg_base + RKVDEC_LINK_IRQ_BASE);
 	}
-
+	mpp_debug((DEBUG_IRQ_STATUS | DEBUG_LINK_TABLE), "irq_status: %08x : %08x\n",
+		  irq_status, mpp->irq_status);
 	return 0;
 }
 
@@ -815,6 +870,7 @@
 	mpp_debug_enter();
 
 	disable_irq(mpp->irq);
+	mpp_iommu_disable_irq(mpp->iommu_info);
 	rkvdec_link_status_update(link_dec);
 	link_dec->irq_status = irq_status;
 	prev_dec_num = link_dec->task_decoded;
@@ -822,8 +878,10 @@
 	if (!link_dec->enabled || task_timeout) {
 		u32 val;
 
-		if (task_timeout)
+		if (task_timeout) {
 			rkvdec_link_reg_dump("timeout", link_dec);
+			link_dec->decoded += task_timeout;
+		}
 
 		val = mpp_read(mpp, 224 * 4);
 		if (link_info->hack_setup && !(val & BIT(2))) {
@@ -838,6 +896,7 @@
 	if (link_dec->enabled && !count && !need_reset) {
 		/* process extra isr when task is processed */
 		enable_irq(mpp->irq);
+		mpp_iommu_enable_irq(mpp->iommu_info);
 		goto done;
 	}
 
@@ -851,15 +910,18 @@
 		goto do_reset;
 
 	enable_irq(mpp->irq);
+	mpp_iommu_enable_irq(mpp->iommu_info);
 	goto done;
 
 do_reset:
+	rkvdec2_check_err_ref(mpp);
 	/* NOTE: irq may run with reset */
 	atomic_inc(&mpp->reset_request);
 	rkvdec2_link_reset(mpp);
 	link_dec->task_decoded = 0;
 	link_dec->task_total = 0;
 	enable_irq(mpp->irq);
+	mpp_iommu_enable_irq(mpp->iommu_info);
 
 	if (link_dec->total == link_dec->decoded)
 		goto done;
@@ -881,6 +943,26 @@
 	mpp_debug_leave();
 
 	return IRQ_HANDLED;
+}
+
+static int rkvdec2_link_iommu_handle(struct iommu_domain *iommu,
+			    struct device *iommu_dev,
+			    unsigned long iova,
+			    int status, void *arg)
+{
+	struct mpp_dev *mpp = (struct mpp_dev *)arg;
+
+	dev_err(iommu_dev, "fault addr 0x%08lx status %x arg %p\n",
+		iova, status, arg);
+
+	if (!mpp) {
+		dev_err(iommu_dev, "pagefault without device to handle\n");
+		return 0;
+	}
+
+	rk_iommu_mask_irq(mpp->dev);
+
+	return 0;
 }
 
 int rkvdec2_link_remove(struct mpp_dev *mpp, struct rkvdec_link_dev *link_dec)
@@ -1016,7 +1098,8 @@
 
 	if (link_dec->info->hack_setup)
 		rkvdec2_link_hack_data_setup(dec->fix);
-
+	iommu_set_fault_handler(mpp->iommu_info->domain,
+				rkvdec2_link_iommu_handle, mpp);
 	link_dec->mpp = mpp;
 	link_dec->dev = dev;
 	atomic_set(&link_dec->task_timeout, 0);
@@ -1060,8 +1143,10 @@
 	}
 	session = task->session;
 
-	mpp_debug_func(DEBUG_TASK_INFO, "task %d:%d state 0x%lx\n",
-		       session->index, task->task_index, task->state);
+	mpp_debug_func(DEBUG_TASK_INFO,
+		       "session %d:%d task %d state 0x%lx abort_request %d\n",
+		       session->device_type, session->index, task->task_index,
+		       task->state, atomic_read(&task->abort_request));
 	if (!session->mpp) {
 		mpp_err("session %d session->mpp is null.\n", session->index);
 		return;
@@ -1112,6 +1197,7 @@
 
 		if (!link_dec->irq_enabled) {
 			enable_irq(mpp->irq);
+			mpp_iommu_enable_irq(mpp->iommu_info);
 			link_dec->irq_enabled = 1;
 		}
 
@@ -1146,6 +1232,7 @@
 
 	if (atomic_xchg(&link_dec->power_enabled, 0)) {
 		disable_irq(mpp->irq);
+		mpp_iommu_disable_irq(mpp->iommu_info);
 		link_dec->irq_enabled = 0;
 
 		if (mpp->hw_ops->clk_off)
@@ -1287,6 +1374,7 @@
 	u32 task_to_run = 0;
 	int slot_idx = 0;
 	int ret;
+	struct mpp_session *session = task->session;
 
 	mpp_debug_enter();
 
@@ -1301,8 +1389,10 @@
 	}
 
 	rkvdec2_link_power_on(mpp);
-	mpp_debug(DEBUG_TASK_INFO, "pid %d, start hw %s\n",
-		  task->session->pid, dev_name(mpp->dev));
+	mpp_debug_func(DEBUG_TASK_INFO,
+		       "%s session %d:%d task=%d state=0x%lx\n",
+		       dev_name(mpp->dev), session->device_type,
+		       session->index, task->task_index, task->state);
 
 	/* prepare the task for running */
 	if (test_and_set_bit(TASK_STATE_PREPARE, &task->state))
@@ -1372,7 +1462,6 @@
 				struct mpp_task *task)
 {
 	set_bit(TASK_STATE_DONE, &task->state);
-	kref_put(&task->ref, rkvdec2_link_free_task);
 
 	return 0;
 }
@@ -1479,10 +1568,12 @@
 			goto done;
 
 		disable_irq(mpp->irq);
+		mpp_iommu_disable_irq(mpp->iommu_info);
 		rkvdec2_link_reset(mpp);
 		link_dec->task_decoded = 0;
 		link_dec->task_total = 0;
 		enable_irq(mpp->irq);
+		mpp_iommu_enable_irq(mpp->iommu_info);
 	}
 	/*
 	 * process pending queue to find the task to accept.
@@ -1500,7 +1591,6 @@
 		mutex_lock(&queue->pending_lock);
 		list_del_init(&task->queue_link);
 
-		kref_get(&task->ref);
 		set_bit(TASK_STATE_ABORT_READY, &task->state);
 		set_bit(TASK_STATE_PROC_DONE, &task->state);
 
@@ -1546,28 +1636,7 @@
 			rkvdec2_link_power_off(mpp);
 	}
 
-	mutex_lock(&queue->session_lock);
-	while (queue->detach_count) {
-		struct mpp_session *session = NULL;
-
-		session = list_first_entry_or_null(&queue->session_detach, struct mpp_session,
-				session_link);
-		if (session) {
-			list_del_init(&session->session_link);
-			queue->detach_count--;
-		}
-
-		mutex_unlock(&queue->session_lock);
-
-		if (session) {
-			mpp_dbg_session("%s detach count %d\n", dev_name(mpp->dev),
-					queue->detach_count);
-			mpp_session_deinit(session);
-		}
-
-		mutex_lock(&queue->session_lock);
-	}
-	mutex_unlock(&queue->session_lock);
+	mpp_session_cleanup_detach(queue, work_s);
 }
 
 void rkvdec2_link_session_deinit(struct mpp_session *session)
@@ -1580,9 +1649,9 @@
 
 	if (session->dma) {
 		mpp_dbg_session("session %d destroy dma\n", session->index);
-		mpp_iommu_down_read(mpp->iommu_info);
+		mpp_iommu_down_write(mpp->iommu_info);
 		mpp_dma_session_destroy(session->dma);
-		mpp_iommu_up_read(mpp->iommu_info);
+		mpp_iommu_up_write(mpp->iommu_info);
 		session->dma = NULL;
 	}
 	if (session->srv) {
diff --git a/kernel/drivers/video/rockchip/mpp/mpp_rkvdec2_link.h b/kernel/drivers/video/rockchip/mpp/mpp_rkvdec2_link.h
index c7b2ab6..2035610 100644
--- a/kernel/drivers/video/rockchip/mpp/mpp_rkvdec2_link.h
+++ b/kernel/drivers/video/rockchip/mpp/mpp_rkvdec2_link.h
@@ -41,8 +41,6 @@
 
 #define RKVDEC_LINK_STA_BASE		0x024
 
-#define RKVDEC_LINK_REG_CYCLE_CNT	179
-
 struct rkvdec_link_dev {
 	struct device *dev;
 	struct mpp_dev *mpp;
@@ -99,6 +97,8 @@
 	u32 task_cnt;
 	u64 stuff_cycle_sum;
 	u32 stuff_cnt;
+
+	u32 error_iova;
 };
 
 extern struct rkvdec_link_info rkvdec_link_rk3568_hw_info;
diff --git a/kernel/drivers/video/rockchip/mpp/mpp_rkvenc.c b/kernel/drivers/video/rockchip/mpp/mpp_rkvenc.c
index 5bc2449..4a3c7d7 100644
--- a/kernel/drivers/video/rockchip/mpp/mpp_rkvenc.c
+++ b/kernel/drivers/video/rockchip/mpp/mpp_rkvenc.c
@@ -439,6 +439,7 @@
 		int i;
 		struct mpp_request *req;
 		u32 reg_en = mpp_task->hw_info->reg_en;
+		u32 timing_en = mpp->srv->timing_en;
 
 		/*
 		 * Tips: ensure osd plt clock is 0 before setting register,
@@ -466,11 +467,20 @@
 				rkvenc_write_req_backward(mpp, task->reg, s, e, reg_en);
 			}
 		}
+
+		/* flush tlb before starting hardware */
+		mpp_iommu_flush_tlb(mpp->iommu_info);
+
 		/* init current task */
 		mpp->cur_task = mpp_task;
+
+		mpp_task_run_begin(mpp_task, timing_en, MPP_WORK_TIMEOUT_DELAY);
+
 		/* Flush the register before the start the device */
 		wmb();
 		mpp_write(mpp, RKVENC_ENC_START_BASE, task->reg[reg_en]);
+
+		mpp_task_run_end(mpp_task, timing_en);
 	} break;
 	case RKVENC_MODE_LINKTABLE_FIX:
 	case RKVENC_MODE_LINKTABLE_UPDATE:
@@ -802,6 +812,10 @@
 		enc->procfs = NULL;
 		return -EIO;
 	}
+
+	/* for common mpp_dev options */
+	mpp_procfs_create_common(enc->procfs, mpp);
+
 	/* for debug */
 	mpp_procfs_create_u32("aclk", 0644,
 			      enc->procfs, &enc->aclk_info.debug_rate_hz);
@@ -1264,7 +1278,7 @@
 	mpp_write(mpp, RKVENC_INT_STATUS_BASE, 0);
 	/* cru reset */
 	if (enc->rst_a && enc->rst_h && enc->rst_core) {
-		rockchip_pmu_idle_request(mpp->dev, true);
+		mpp_pmu_idle_request(mpp, true);
 		mpp_safe_reset(enc->rst_a);
 		mpp_safe_reset(enc->rst_h);
 		mpp_safe_reset(enc->rst_core);
@@ -1272,7 +1286,7 @@
 		mpp_safe_unreset(enc->rst_a);
 		mpp_safe_unreset(enc->rst_h);
 		mpp_safe_unreset(enc->rst_core);
-		rockchip_pmu_idle_request(mpp->dev, false);
+		mpp_pmu_idle_request(mpp, false);
 	}
 #ifdef CONFIG_PM_DEVFREQ
 	if (enc->devfreq)
diff --git a/kernel/drivers/video/rockchip/mpp/mpp_rkvenc2.c b/kernel/drivers/video/rockchip/mpp/mpp_rkvenc2.c
index 90cdc13..7d2d7ae 100644
--- a/kernel/drivers/video/rockchip/mpp/mpp_rkvenc2.c
+++ b/kernel/drivers/video/rockchip/mpp/mpp_rkvenc2.c
@@ -28,6 +28,8 @@
 #include <linux/nospec.h>
 #include <linux/workqueue.h>
 #include <linux/dma-iommu.h>
+#include <linux/mfd/syscon.h>
+#include <linux/rockchip/cpu.h>
 #include <soc/rockchip/pm_domains.h>
 #include <soc/rockchip/rockchip_ipa.h>
 #include <soc/rockchip/rockchip_opp_select.h>
@@ -41,6 +43,7 @@
 
 #define	RKVENC_SESSION_MAX_BUFFERS		40
 #define RKVENC_MAX_CORE_NUM			4
+#define RKVENC_SCLR_DONE_STA			BIT(2)
 
 #define to_rkvenc_info(info)		\
 		container_of(info, struct rkvenc_hw_info, hw)
@@ -187,6 +190,7 @@
 	dma_addr_t sram_iova;
 	u32 sram_enabled;
 	struct page *rcb_page;
+	struct regmap *grf;
 };
 
 
@@ -699,6 +703,7 @@
 	struct rkvenc_dev *enc = to_rkvenc_dev(mpp);
 	struct rkvenc_task *task = to_rkvenc_task(mpp_task);
 	struct rkvenc_hw_info *hw = enc->hw_info;
+	u32 timing_en = mpp->srv->timing_en;
 
 	mpp_debug_enter();
 
@@ -735,11 +740,20 @@
 		}
 	}
 
+	/* flush tlb before starting hardware */
+	mpp_iommu_flush_tlb(mpp->iommu_info);
+
 	/* init current task */
 	mpp->cur_task = mpp_task;
+
+	mpp_task_run_begin(mpp_task, timing_en, MPP_WORK_TIMEOUT_DELAY);
+
 	/* Flush the register before the start the device */
 	wmb();
+
 	mpp_write(mpp, enc->hw_info->enc_start_base, start_val);
+
+	mpp_task_run_end(mpp_task, timing_en);
 
 	mpp_debug_leave();
 
@@ -793,6 +807,7 @@
 		if (mpp_debug_unlikely(DEBUG_DUMP_ERR_REG))
 			mpp_task_dump_hw_reg(mpp, mpp_task);
 	}
+
 	mpp_task_finish(mpp_task->session, mpp_task);
 
 	mpp_debug_leave();
@@ -1031,6 +1046,10 @@
 		enc->procfs = NULL;
 		return -EIO;
 	}
+
+	/* for common mpp_dev options */
+	mpp_procfs_create_common(enc->procfs, mpp);
+
 	/* for debug */
 	mpp_procfs_create_u32("aclk", 0644,
 			      enc->procfs, &enc->aclk_info.debug_rate_hz);
@@ -1063,7 +1082,7 @@
 	struct rkvenc_dev *enc = to_rkvenc_dev(mpp);
 	int ret = 0;
 
-	mpp->grf_info = &mpp->srv->grf_infos[MPP_DRIVER_RKVENC];
+	mpp->grf_info = &mpp->srv->grf_infos[MPP_DRIVER_RKVENC2];
 
 	/* Get clock info from dtsi */
 	ret = mpp_get_clk_info(mpp, &enc->aclk_info, "aclk_vcodec");
@@ -1097,23 +1116,41 @@
 	return 0;
 }
 
-static int rkvenc_reset(struct mpp_dev *mpp)
+static int rkvenc_soft_reset(struct mpp_dev *mpp)
 {
 	struct rkvenc_dev *enc = to_rkvenc_dev(mpp);
 	struct rkvenc_hw_info *hw = enc->hw_info;
-
-	mpp_debug_enter();
+	u32 rst_status = 0;
+	int ret = 0;
 
 	/* safe reset */
 	mpp_write(mpp, hw->int_mask_base, 0x3FF);
 	mpp_write(mpp, hw->enc_clr_base, 0x1);
-	udelay(5);
+	ret = readl_relaxed_poll_timeout(mpp->reg_base + hw->int_sta_base,
+					 rst_status,
+					 rst_status & RKVENC_SCLR_DONE_STA,
+					 0, 5);
 	mpp_write(mpp, hw->int_clr_base, 0xffffffff);
 	mpp_write(mpp, hw->int_sta_base, 0);
 
+	return ret;
+
+}
+
+static int rkvenc_reset(struct mpp_dev *mpp)
+{
+	struct rkvenc_dev *enc = to_rkvenc_dev(mpp);
+	int ret = 0;
+
+	mpp_debug_enter();
+
+	/* safe reset first*/
+	ret = rkvenc_soft_reset(mpp);
+
 	/* cru reset */
-	if (enc->rst_a && enc->rst_h && enc->rst_core) {
-		rockchip_pmu_idle_request(mpp->dev, true);
+	if (ret && enc->rst_a && enc->rst_h && enc->rst_core) {
+		mpp_err("soft reset timeout, use cru reset\n");
+		mpp_pmu_idle_request(mpp, true);
 		mpp_safe_reset(enc->rst_a);
 		mpp_safe_reset(enc->rst_h);
 		mpp_safe_reset(enc->rst_core);
@@ -1121,7 +1158,7 @@
 		mpp_safe_unreset(enc->rst_a);
 		mpp_safe_unreset(enc->rst_h);
 		mpp_safe_unreset(enc->rst_core);
-		rockchip_pmu_idle_request(mpp->dev, false);
+		mpp_pmu_idle_request(mpp, false);
 	}
 
 	mpp_debug_leave();
@@ -1338,6 +1375,7 @@
 	}
 	mpp->session_max_buffers = RKVENC_SESSION_MAX_BUFFERS;
 	enc->hw_info = to_rkvenc_info(mpp->var->hw_info);
+
 	rkvenc_procfs_init(mpp);
 	mpp_dev_register_srv(mpp, mpp->srv);
 
@@ -1416,12 +1454,44 @@
 	dev_info(dev, "shutdown success\n");
 }
 
+static int rkvenc_runtime_suspend(struct device *dev)
+{
+	struct mpp_dev *mpp = dev_get_drvdata(dev);
+	struct mpp_grf_info *info = mpp->grf_info;
+
+	if (cpu_is_rk3528() && info && info->mem_offset)
+		regmap_write(info->grf,
+			     info->mem_offset,
+			     info->val_mem_off);
+
+	return 0;
+}
+
+static int rkvenc_runtime_resume(struct device *dev)
+{
+	struct mpp_dev *mpp = dev_get_drvdata(dev);
+	struct mpp_grf_info *info = mpp->grf_info;
+
+	if (cpu_is_rk3528() && info && info->mem_offset)
+		regmap_write(info->grf,
+			     info->mem_offset,
+			     info->val_mem_on);
+
+	return 0;
+}
+
+static const struct dev_pm_ops rkvenc_pm_ops = {
+	.runtime_suspend		= rkvenc_runtime_suspend,
+	.runtime_resume			= rkvenc_runtime_resume,
+};
+
 struct platform_driver rockchip_rkvenc2_driver = {
 	.probe = rkvenc_probe,
 	.remove = rkvenc_remove,
 	.shutdown = rkvenc_shutdown,
 	.driver = {
 		.name = RKVENC_DRIVER_NAME,
+		.pm = &rkvenc_pm_ops,
 		.of_match_table = of_match_ptr(mpp_rkvenc_dt_match),
 	},
 };
diff --git a/kernel/drivers/video/rockchip/mpp/mpp_service.c b/kernel/drivers/video/rockchip/mpp/mpp_service.c
index 375f550..67ef213 100644
--- a/kernel/drivers/video/rockchip/mpp/mpp_service.c
+++ b/kernel/drivers/video/rockchip/mpp/mpp_service.c
@@ -19,6 +19,7 @@
 #include <linux/slab.h>
 #include <linux/nospec.h>
 #include <linux/mfd/syscon.h>
+#include <linux/regmap.h>
 
 #include "mpp_debug.h"
 #include "mpp_common.h"
@@ -42,34 +43,47 @@
 			struct mpp_grf_info *grf_info,
 			const char *grf_name)
 {
-	int ret;
 	int index;
 	u32 grf_offset = 0;
 	u32 grf_value = 0;
+	u32 mem_offset = 0;
+	u32 val_mem_on = 0;
+	u32 val_mem_off = 0;
 	struct regmap *grf;
 
 	grf = syscon_regmap_lookup_by_phandle(np, "rockchip,grf");
 	if (IS_ERR_OR_NULL(grf))
 		return -EINVAL;
 
-	ret = of_property_read_u32(np, "rockchip,grf-offset", &grf_offset);
-	if (ret)
-		return -ENODATA;
-
 	index = of_property_match_string(np, "rockchip,grf-names", grf_name);
 	if (index < 0)
 		return -ENODATA;
 
-	ret = of_property_read_u32_index(np, "rockchip,grf-values",
-					 index, &grf_value);
-	if (ret)
-		return -ENODATA;
+	of_property_read_u32(np, "rockchip,grf-offset", &grf_offset);
+	of_property_read_u32_index(np, "rockchip,grf-values",
+				   index, &grf_value);
+	of_property_read_u32_index(np, "rockchip,grf-mem-offset",
+				   index, &mem_offset);
+	of_property_read_u32_index(np, "rockchip,grf-mem-on-values",
+				   index, &val_mem_on);
+	of_property_read_u32_index(np, "rockchip,grf-mem-off-values",
+				   index, &val_mem_off);
+
 
 	grf_info->grf = grf;
 	grf_info->offset = grf_offset;
 	grf_info->val = grf_value;
 
-	mpp_set_grf(grf_info);
+	grf_info->mem_offset = mem_offset;
+	grf_info->val_mem_on = val_mem_on;
+	grf_info->val_mem_off = val_mem_off;
+
+	if (grf_info->offset && grf_info->val)
+		mpp_set_grf(grf_info);
+
+	if (grf_info->mem_offset && grf_info->val_mem_off)
+		regmap_write(grf_info->grf, grf_info->mem_offset,
+			     grf_info->val_mem_off);
 
 	return 0;
 }
@@ -261,6 +275,7 @@
 	/* show support devices */
 	proc_create_single_data("supports-device", 0444,
 				srv->procfs, mpp_show_support_device, srv);
+	mpp_procfs_create_u32("timing_en", 0644, srv->procfs, &srv->timing_en);
 
 	return 0;
 }
diff --git a/kernel/drivers/video/rockchip/mpp/mpp_vdpp.c b/kernel/drivers/video/rockchip/mpp/mpp_vdpp.c
index 9369615..43a7cb0 100644
--- a/kernel/drivers/video/rockchip/mpp/mpp_vdpp.c
+++ b/kernel/drivers/video/rockchip/mpp/mpp_vdpp.c
@@ -18,6 +18,8 @@
 #include <linux/uaccess.h>
 #include <linux/regmap.h>
 #include <linux/proc_fs.h>
+#include <linux/mfd/syscon.h>
+#include <linux/rockchip/cpu.h>
 #include <soc/rockchip/pm_domains.h>
 
 #include "mpp_debug.h"
@@ -27,6 +29,8 @@
 #define VDPP_DRIVER_NAME		"mpp_vdpp"
 
 #define	VDPP_SESSION_MAX_BUFFERS	15
+#define VDPP_REG_WORK_MODE			0x0008
+#define VDPP_REG_VDPP_MODE			BIT(1)
 
 #define to_vdpp_info(info)	\
 		container_of(info, struct vdpp_hw_info, hw)
@@ -87,6 +91,7 @@
 	struct reset_control *rst_s;
 	/* for zme */
 	void __iomem *zme_base;
+	struct regmap *grf;
 };
 
 static struct vdpp_hw_info vdpp_v1_hw_info = {
@@ -332,6 +337,9 @@
 		}
 	}
 
+	/* flush tlb before starting hardware */
+	mpp_iommu_flush_tlb(mpp->iommu_info);
+
 	/* init current task */
 	mpp->cur_task = mpp_task;
 	/* Flush the register before the start the device */
@@ -474,6 +482,8 @@
 	int ret;
 	struct vdpp_dev *vdpp = to_vdpp_dev(mpp);
 
+	mpp->grf_info = &mpp->srv->grf_infos[MPP_DRIVER_VDPP];
+
 	/* Get clock info from dtsi */
 	ret = mpp_get_clk_info(mpp, &vdpp->aclk_info, "aclk");
 	if (ret)
@@ -546,12 +556,18 @@
 {
 	struct vdpp_dev *vdpp = to_vdpp_dev(mpp);
 	struct vdpp_hw_info *hw_info = vdpp->hw_info;
+	u32 work_mode = mpp_read(mpp, VDPP_REG_WORK_MODE);
 
+	if (!(work_mode & VDPP_REG_VDPP_MODE))
+		return IRQ_NONE;
 	mpp->irq_status = mpp_read(mpp, hw_info->int_sta_base);
 	if (!(mpp->irq_status & hw_info->int_mask))
 		return IRQ_NONE;
 	mpp_write(mpp, hw_info->int_en_base, 0);
 	mpp_write(mpp, hw_info->int_clr_base, mpp->irq_status);
+
+	/* ensure hardware is being off status */
+	mpp_write(mpp, hw_info->start_base, 0);
 
 	return IRQ_WAKE_THREAD;
 }
@@ -590,7 +606,7 @@
 		mpp_debug(DEBUG_RESET, "reset in\n");
 
 		/* Don't skip this or iommu won't work after reset */
-		rockchip_pmu_idle_request(mpp->dev, true);
+		mpp_pmu_idle_request(mpp, true);
 		mpp_safe_reset(vdpp->rst_a);
 		mpp_safe_reset(vdpp->rst_h);
 		mpp_safe_reset(vdpp->rst_s);
@@ -598,7 +614,7 @@
 		mpp_safe_unreset(vdpp->rst_a);
 		mpp_safe_unreset(vdpp->rst_h);
 		mpp_safe_unreset(vdpp->rst_s);
-		rockchip_pmu_idle_request(mpp->dev, false);
+		mpp_pmu_idle_request(mpp, false);
 
 		mpp_debug(DEBUG_RESET, "reset out\n");
 	}
@@ -617,14 +633,18 @@
 	mpp_write(mpp, hw_info->cfg_base, hw_info->bit_rst_en);
 	ret = readl_relaxed_poll_timeout(mpp->reg_base + hw_info->rst_sta_base,
 					 rst_status,
-					 !(rst_status & hw_info->bit_rst_done),
-					 0, 2);
+					 rst_status & hw_info->bit_rst_done,
+					 0, 5);
 	if (ret) {
 		mpp_err("soft reset timeout, use cru reset\n");
 		return _vdpp_reset(mpp, vdpp);
 	}
 
 	mpp_write(mpp, hw_info->rst_sta_base, 0);
+
+	/* ensure hardware is being off status */
+	mpp_write(mpp, hw_info->start_base, 0);
+
 
 	return 0;
 }
@@ -710,6 +730,7 @@
 		dev_err(dev, "register interrupter runtime failed\n");
 		return -EINVAL;
 	}
+
 	mpp->session_max_buffers = VDPP_SESSION_MAX_BUFFERS;
 	vdpp->hw_info = to_vdpp_info(mpp->var->hw_info);
 	vdpp_procfs_init(mpp);
@@ -751,12 +772,53 @@
 		dev_err(dev, "wait total running time out\n");
 }
 
+static int vdpp_runtime_suspend(struct device *dev)
+{
+	struct mpp_dev *mpp = dev_get_drvdata(dev);
+	struct mpp_grf_info *info = mpp->grf_info;
+	struct mpp_taskqueue *queue = mpp->queue;
+
+	if (cpu_is_rk3528() && info && info->mem_offset) {
+		mutex_lock(&queue->ref_lock);
+		if (!atomic_dec_if_positive(&queue->runtime_cnt)) {
+			regmap_write(info->grf, info->mem_offset,
+				     info->val_mem_off);
+		}
+		mutex_unlock(&queue->ref_lock);
+	}
+
+	return 0;
+}
+
+static int vdpp_runtime_resume(struct device *dev)
+{
+	struct mpp_dev *mpp = dev_get_drvdata(dev);
+	struct mpp_grf_info *info = mpp->grf_info;
+	struct mpp_taskqueue *queue = mpp->queue;
+
+	if (cpu_is_rk3528() && info && info->mem_offset) {
+		mutex_lock(&queue->ref_lock);
+		regmap_write(info->grf, info->mem_offset,
+			     info->val_mem_on);
+		atomic_inc(&queue->runtime_cnt);
+		mutex_unlock(&queue->ref_lock);
+	}
+
+	return 0;
+}
+
+static const struct dev_pm_ops vdpp_pm_ops = {
+	.runtime_suspend		= vdpp_runtime_suspend,
+	.runtime_resume			= vdpp_runtime_resume,
+};
+
 struct platform_driver rockchip_vdpp_driver = {
 	.probe = vdpp_probe,
 	.remove = vdpp_remove,
 	.shutdown = vdpp_shutdown,
 	.driver = {
 		.name = VDPP_DRIVER_NAME,
+		.pm = &vdpp_pm_ops,
 		.of_match_table = of_match_ptr(mpp_vdpp_dt_match),
 	},
 };
diff --git a/kernel/drivers/video/rockchip/mpp/mpp_vdpu1.c b/kernel/drivers/video/rockchip/mpp/mpp_vdpu1.c
index a14f102..537c6a2 100644
--- a/kernel/drivers/video/rockchip/mpp/mpp_vdpu1.c
+++ b/kernel/drivers/video/rockchip/mpp/mpp_vdpu1.c
@@ -20,6 +20,8 @@
 #include <linux/uaccess.h>
 #include <linux/regmap.h>
 #include <linux/proc_fs.h>
+#include <linux/mfd/syscon.h>
+#include <linux/rockchip/cpu.h>
 #include <soc/rockchip/pm_domains.h>
 
 #include "mpp_debug.h"
@@ -57,6 +59,9 @@
 /* NOTE: Don't enable it or decoding AVC would meet problem at rk3288 */
 #define VDPU1_REG_DEC_EN		0x008
 #define	VDPU1_CLOCK_GATE_EN		BIT(10)
+
+#define VDPU1_REG_SOFT_RESET		0x194
+#define VDPU1_REG_SOFT_RESET_INDEX	(101)
 
 #define VDPU1_REG_SYS_CTRL		0x00c
 #define VDPU1_REG_SYS_CTRL_INDEX	(3)
@@ -387,6 +392,7 @@
 	u32 i;
 	u32 reg_en;
 	struct vdpu_task *task = to_vdpu_task(mpp_task);
+	u32 timing_en = mpp->srv->timing_en;
 
 	mpp_debug_enter();
 
@@ -401,12 +407,21 @@
 
 		mpp_write_req(mpp, task->reg, s, e, reg_en);
 	}
+
+	/* flush tlb before starting hardware */
+	mpp_iommu_flush_tlb(mpp->iommu_info);
+
 	/* init current task */
 	mpp->cur_task = mpp_task;
+
+	mpp_task_run_begin(mpp_task, timing_en, MPP_WORK_TIMEOUT_DELAY);
+
 	/* Flush the register before the start the device */
 	wmb();
 	mpp_write(mpp, VDPU1_REG_DEC_INT_EN,
 		  task->reg[reg_en] | VDPU1_DEC_START);
+
+	mpp_task_run_end(mpp_task, timing_en);
 
 	mpp_debug_leave();
 
@@ -503,6 +518,10 @@
 		dec->procfs = NULL;
 		return -EIO;
 	}
+
+	/* for common mpp_dev options */
+	mpp_procfs_create_common(dec->procfs, mpp);
+
 	mpp_procfs_create_u32("aclk", 0644,
 			      dec->procfs, &dec->aclk_info.debug_rate_hz);
 	mpp_procfs_create_u32("session_buffers", 0644,
@@ -663,21 +682,35 @@
 	return IRQ_HANDLED;
 }
 
+static int vdpu_soft_reset(struct mpp_dev *mpp)
+{
+	u32 val;
+
+	mpp_write(mpp, VDPU1_REG_SOFT_RESET, 1);
+	udelay(2);
+	val = mpp_read(mpp, VDPU1_REG_SOFT_RESET);
+
+	return val;
+}
+
 static int vdpu_reset(struct mpp_dev *mpp)
 {
 	struct vdpu_dev *dec = to_vdpu_dev(mpp);
+	u32 ret = 0;
 
-	if (dec->rst_a && dec->rst_h) {
+	/* soft reset first */
+	ret = vdpu_soft_reset(mpp);
+	if (ret && dec->rst_a && dec->rst_h) {
 		mpp_debug(DEBUG_RESET, "reset in\n");
 
 		/* Don't skip this or iommu won't work after reset */
-		rockchip_pmu_idle_request(mpp->dev, true);
+		mpp_pmu_idle_request(mpp, true);
 		mpp_safe_reset(dec->rst_a);
 		mpp_safe_reset(dec->rst_h);
 		udelay(5);
 		mpp_safe_unreset(dec->rst_a);
 		mpp_safe_unreset(dec->rst_h);
-		rockchip_pmu_idle_request(mpp->dev, false);
+		mpp_pmu_idle_request(mpp, false);
 
 		mpp_debug(DEBUG_RESET, "reset out\n");
 	}
@@ -774,12 +807,10 @@
 		.data = &vdpu_3368_data,
 	},
 #endif
-#ifdef CONFIG_CPU_RK3328
 	{
 		.compatible = "rockchip,avs-plus-decoder",
 		.data = &avsd_plus_data,
 	},
-#endif
 	{},
 };
 
@@ -864,12 +895,53 @@
 		dev_err(dev, "wait total running time out\n");
 }
 
+static int vdpu_runtime_suspend(struct device *dev)
+{
+	struct mpp_dev *mpp = dev_get_drvdata(dev);
+	struct mpp_grf_info *info = mpp->grf_info;
+	struct mpp_taskqueue *queue = mpp->queue;
+
+	if (cpu_is_rk3528() && info && info->mem_offset) {
+		mutex_lock(&queue->ref_lock);
+		if (!atomic_dec_if_positive(&queue->runtime_cnt)) {
+			regmap_write(info->grf, info->mem_offset,
+				     info->val_mem_off);
+		}
+		mutex_unlock(&queue->ref_lock);
+	}
+
+	return 0;
+}
+
+static int vdpu_runtime_resume(struct device *dev)
+{
+	struct mpp_dev *mpp = dev_get_drvdata(dev);
+	struct mpp_grf_info *info = mpp->grf_info;
+	struct mpp_taskqueue *queue = mpp->queue;
+
+	if (cpu_is_rk3528() && info && info->mem_offset) {
+		mutex_lock(&queue->ref_lock);
+		regmap_write(info->grf, info->mem_offset,
+			     info->val_mem_on);
+		atomic_inc(&queue->runtime_cnt);
+		mutex_unlock(&queue->ref_lock);
+	}
+
+	return 0;
+}
+
+static const struct dev_pm_ops vdpu_pm_ops = {
+	.runtime_suspend		= vdpu_runtime_suspend,
+	.runtime_resume			= vdpu_runtime_resume,
+};
+
 struct platform_driver rockchip_vdpu1_driver = {
 	.probe = vdpu_probe,
 	.remove = vdpu_remove,
 	.shutdown = vdpu_shutdown,
 	.driver = {
 		.name = VDPU1_DRIVER_NAME,
+		.pm = &vdpu_pm_ops,
 		.of_match_table = of_match_ptr(mpp_vdpu1_dt_match),
 	},
 };
diff --git a/kernel/drivers/video/rockchip/mpp/mpp_vdpu2.c b/kernel/drivers/video/rockchip/mpp/mpp_vdpu2.c
index f697033..1e58094 100644
--- a/kernel/drivers/video/rockchip/mpp/mpp_vdpu2.c
+++ b/kernel/drivers/video/rockchip/mpp/mpp_vdpu2.c
@@ -20,6 +20,8 @@
 #include <linux/uaccess.h>
 #include <linux/regmap.h>
 #include <linux/proc_fs.h>
+#include <linux/mfd/syscon.h>
+#include <linux/rockchip/cpu.h>
 #include <soc/rockchip/pm_domains.h>
 
 #include "mpp_debug.h"
@@ -69,6 +71,9 @@
 #define VDPU2_DEC_CLOCK_GATE_EN			BIT(4)
 #define VDPU2_DEC_START				BIT(0)
 
+#define VDPU2_REG_SOFT_RESET			0x0e8
+#define VDPU2_REG_SOFT_RESET_INDEX		(58)
+
 #define VDPU2_REG_DIR_MV_BASE			0x0f8
 #define VDPU2_REG_DIR_MV_BASE_INDEX		(62)
 
@@ -108,6 +113,7 @@
 #endif
 	struct reset_control *rst_a;
 	struct reset_control *rst_h;
+	struct regmap *grf;
 };
 
 static struct mpp_hw_info vdpu_v2_hw_info = {
@@ -340,6 +346,7 @@
 	u32 i;
 	u32 reg_en;
 	struct vdpu_task *task = to_vdpu_task(mpp_task);
+	u32 timing_en = mpp->srv->timing_en;
 
 	mpp_debug_enter();
 
@@ -354,12 +361,21 @@
 
 		mpp_write_req(mpp, task->reg, s, e, reg_en);
 	}
+
+	/* flush tlb before starting hardware */
+	mpp_iommu_flush_tlb(mpp->iommu_info);
+
 	/* init current task */
 	mpp->cur_task = mpp_task;
+
+	mpp_task_run_begin(mpp_task, timing_en, MPP_WORK_TIMEOUT_DELAY);
+
 	/* Flush the registers */
 	wmb();
 	mpp_write(mpp, VDPU2_REG_DEC_EN,
 		  task->reg[reg_en] | VDPU2_DEC_START);
+
+	mpp_task_run_end(mpp_task, timing_en);
 
 	mpp_debug_leave();
 
@@ -456,6 +472,10 @@
 		dec->procfs = NULL;
 		return -EIO;
 	}
+
+	/* for common mpp_dev options */
+	mpp_procfs_create_common(dec->procfs, mpp);
+
 	mpp_procfs_create_u32("aclk", 0644,
 			      dec->procfs, &dec->aclk_info.debug_rate_hz);
 	mpp_procfs_create_u32("session_buffers", 0644,
@@ -596,21 +616,38 @@
 	return IRQ_HANDLED;
 }
 
+static int vdpu_soft_reset(struct mpp_dev *mpp)
+{
+	u32 val;
+
+	mpp_write(mpp, VDPU2_REG_SOFT_RESET, 1);
+	udelay(2);
+	val = mpp_read(mpp, VDPU2_REG_SOFT_RESET);
+
+	return val;
+}
+
 static int vdpu_reset(struct mpp_dev *mpp)
 {
 	struct vdpu_dev *dec = to_vdpu_dev(mpp);
+	u32 ret = 0;
 
 	mpp_write(mpp, VDPU2_REG_DEC_EN, 0);
 	mpp_write(mpp, VDPU2_REG_DEC_INT, 0);
-	if (dec->rst_a && dec->rst_h) {
+
+	/* soft reset first */
+	ret = vdpu_soft_reset(mpp);
+	if (ret && dec->rst_a && dec->rst_h) {
 		/* Don't skip this or iommu won't work after reset */
-		rockchip_pmu_idle_request(mpp->dev, true);
+		mpp_debug(DEBUG_RESET, "reset in\n");
+		mpp_pmu_idle_request(mpp, true);
 		mpp_safe_reset(dec->rst_a);
 		mpp_safe_reset(dec->rst_h);
 		udelay(5);
 		mpp_safe_unreset(dec->rst_a);
 		mpp_safe_unreset(dec->rst_h);
-		rockchip_pmu_idle_request(mpp->dev, false);
+		mpp_pmu_idle_request(mpp, false);
+		mpp_debug(DEBUG_RESET, "reset out\n");
 	}
 
 	return 0;
@@ -758,12 +795,53 @@
 		dev_err(dev, "wait total running time out\n");
 }
 
+static int vdpu_runtime_suspend(struct device *dev)
+{
+	struct mpp_dev *mpp = dev_get_drvdata(dev);
+	struct mpp_grf_info *info = mpp->grf_info;
+	struct mpp_taskqueue *queue = mpp->queue;
+
+	if (cpu_is_rk3528() && info && info->mem_offset) {
+		mutex_lock(&queue->ref_lock);
+		if (!atomic_dec_if_positive(&queue->runtime_cnt)) {
+			regmap_write(info->grf, info->mem_offset,
+				     info->val_mem_off);
+		}
+		mutex_unlock(&queue->ref_lock);
+	}
+
+	return 0;
+}
+
+static int vdpu_runtime_resume(struct device *dev)
+{
+	struct mpp_dev *mpp = dev_get_drvdata(dev);
+	struct mpp_grf_info *info = mpp->grf_info;
+	struct mpp_taskqueue *queue = mpp->queue;
+
+	if (cpu_is_rk3528() && info && info->mem_offset) {
+		mutex_lock(&queue->ref_lock);
+		regmap_write(info->grf, info->mem_offset,
+			     info->val_mem_on);
+		atomic_inc(&queue->runtime_cnt);
+		mutex_unlock(&queue->ref_lock);
+	}
+
+	return 0;
+}
+
+static const struct dev_pm_ops vdpu_pm_ops = {
+	.runtime_suspend		= vdpu_runtime_suspend,
+	.runtime_resume			= vdpu_runtime_resume,
+};
+
 struct platform_driver rockchip_vdpu2_driver = {
 	.probe = vdpu_probe,
 	.remove = vdpu_remove,
 	.shutdown = vdpu_shutdown,
 	.driver = {
 		.name = VDPU2_DRIVER_NAME,
+		.pm = &vdpu_pm_ops,
 		.of_match_table = of_match_ptr(mpp_vdpu2_dt_match),
 	},
 };
diff --git a/kernel/drivers/video/rockchip/mpp/mpp_vepu1.c b/kernel/drivers/video/rockchip/mpp/mpp_vepu1.c
index aef0ad7..13eb0cb 100644
--- a/kernel/drivers/video/rockchip/mpp/mpp_vepu1.c
+++ b/kernel/drivers/video/rockchip/mpp/mpp_vepu1.c
@@ -264,6 +264,7 @@
 	u32 i;
 	u32 reg_en;
 	struct vepu_task *task = to_vepu_task(mpp_task);
+	u32 timing_en = mpp->srv->timing_en;
 
 	mpp_debug_enter();
 
@@ -282,12 +283,21 @@
 
 		mpp_write_req(mpp, task->reg, s, e, reg_en);
 	}
+
+	/* flush tlb before starting hardware */
+	mpp_iommu_flush_tlb(mpp->iommu_info);
+
 	/* init current task */
 	mpp->cur_task = mpp_task;
+
+	mpp_task_run_begin(mpp_task, timing_en, MPP_WORK_TIMEOUT_DELAY);
+
 	/* Last, flush start registers */
 	wmb();
 	mpp_write(mpp, VEPU1_REG_ENC_EN,
 		  task->reg[reg_en] | VEPU1_ENC_START);
+
+	mpp_task_run_end(mpp_task, timing_en);
 
 	mpp_debug_leave();
 
@@ -555,6 +565,10 @@
 		enc->procfs = NULL;
 		return -EIO;
 	}
+
+	/* for common mpp_dev options */
+	mpp_procfs_create_common(enc->procfs, mpp);
+
 	mpp_procfs_create_u32("aclk", 0644,
 			      enc->procfs, &enc->aclk_info.debug_rate_hz);
 	mpp_procfs_create_u32("session_buffers", 0644,
@@ -656,13 +670,13 @@
 
 	if (enc->rst_a && enc->rst_h) {
 		/* Don't skip this or iommu won't work after reset */
-		rockchip_pmu_idle_request(mpp->dev, true);
+		mpp_pmu_idle_request(mpp, true);
 		mpp_safe_reset(enc->rst_a);
 		mpp_safe_reset(enc->rst_h);
 		udelay(5);
 		mpp_safe_unreset(enc->rst_a);
 		mpp_safe_unreset(enc->rst_h);
-		rockchip_pmu_idle_request(mpp->dev, false);
+		mpp_pmu_idle_request(mpp, false);
 	}
 	mpp_write(mpp, VEPU1_REG_ENC_EN, 0);
 
diff --git a/kernel/drivers/video/rockchip/mpp/mpp_vepu2.c b/kernel/drivers/video/rockchip/mpp/mpp_vepu2.c
index 75188f2..d7dd2c1 100644
--- a/kernel/drivers/video/rockchip/mpp/mpp_vepu2.c
+++ b/kernel/drivers/video/rockchip/mpp/mpp_vepu2.c
@@ -287,6 +287,7 @@
 	u32 i;
 	u32 reg_en;
 	struct vepu_task *task = to_vepu_task(mpp_task);
+	u32 timing_en = mpp->srv->timing_en;
 
 	mpp_debug_enter();
 
@@ -305,12 +306,21 @@
 
 		mpp_write_req(mpp, task->reg, s, e, reg_en);
 	}
+
+	/* flush tlb before starting hardware */
+	mpp_iommu_flush_tlb(mpp->iommu_info);
+
 	/* init current task */
 	mpp->cur_task = mpp_task;
+
+	mpp_task_run_begin(mpp_task, timing_en, MPP_WORK_TIMEOUT_DELAY);
+
 	/* Last, flush the registers */
 	wmb();
 	mpp_write(mpp, VEPU2_REG_ENC_EN,
 		  task->reg[reg_en] | VEPU2_ENC_START);
+
+	mpp_task_run_end(mpp_task, timing_en);
 
 	mpp_debug_leave();
 
@@ -578,6 +588,10 @@
 		enc->procfs = NULL;
 		return -EIO;
 	}
+
+	/* for common mpp_dev options */
+	mpp_procfs_create_common(enc->procfs, mpp);
+
 	mpp_procfs_create_u32("aclk", 0644,
 			      enc->procfs, &enc->aclk_info.debug_rate_hz);
 	mpp_procfs_create_u32("session_buffers", 0644,
@@ -722,15 +736,17 @@
 {
 	struct vepu_dev *enc = to_vepu_dev(mpp);
 
+	mpp_write(mpp, VEPU2_REG_ENC_EN, 0);
+	udelay(5);
 	if (enc->rst_a && enc->rst_h) {
 		/* Don't skip this or iommu won't work after reset */
-		rockchip_pmu_idle_request(mpp->dev, true);
+		mpp_pmu_idle_request(mpp, true);
 		mpp_safe_reset(enc->rst_a);
 		mpp_safe_reset(enc->rst_h);
 		udelay(5);
 		mpp_safe_unreset(enc->rst_a);
 		mpp_safe_unreset(enc->rst_h);
-		rockchip_pmu_idle_request(mpp->dev, false);
+		mpp_pmu_idle_request(mpp, false);
 	}
 	mpp_write(mpp, VEPU2_REG_INT, VEPU2_INT_CLEAR);
 
diff --git a/kernel/drivers/video/rockchip/mpp/rockchip_iep2_regs.h b/kernel/drivers/video/rockchip/mpp/rockchip_iep2_regs.h
index 4c7b878..d85a30d 100644
--- a/kernel/drivers/video/rockchip/mpp/rockchip_iep2_regs.h
+++ b/kernel/drivers/video/rockchip/mpp/rockchip_iep2_regs.h
@@ -11,6 +11,7 @@
 #define __ROCKCHIP_IEP2_REGS_H__
 
 #define IEP2_REG_FRM_START			0x0000
+#define     IEP2_REG_FRM_EN                             BIT(0)
 #define IEP2_REG_IEP_CONFIG0			0x0004
 #define     IEP2_REG_CCLK_SRESET_P			BIT(22)
 #define     IEP2_REG_ACLK_SRESET_P			BIT(21)
@@ -37,15 +38,19 @@
 #define     IEP2_REG_MD_CLK_ON				BIT(1)
 #define     IEP2_REG_CLK_ON				BIT(0)
 #define IEP2_REG_STATUS				0x0014
+#define     IEP2_REG_ARST_FINISH_DONE                   BIT(0)
 #define IEP2_REG_INT_EN				0x0020
+#define     IEP2_REG_TIMEOUT_EN			        BIT(5)
 #define     IEP2_REG_BUS_ERROR_EN			BIT(4)
 #define     IEP2_REG_OSD_MAX_EN				BIT(1)
 #define     IEP2_REG_FRM_DONE_EN			BIT(0)
 #define IEP2_REG_INT_CLR			0x0024
+#define     IEP2_REG_TIMEOUT_CLR			BIT(5)
 #define     IEP2_REG_BUS_ERROR_CLR			BIT(4)
 #define     IEP2_REG_OSD_MAX_CLR			BIT(1)
 #define     IEP2_REG_FRM_DONE_CLR			BIT(0)
 #define IEP2_REG_INT_STS			0x0028
+#define     IEP2_REG_RO_TIMEOUT_STS(x)		        ((x) & BIT(5))
 #define     IEP2_REG_RO_BUS_ERROR_STS(x)		((x) & BIT(4))
 #define     IEP2_REG_RO_OSD_MAX_STS(x)			((x) & BIT(1))
 #define     IEP2_REG_RO_FRM_DONE_STS(x)			((x) & BIT(0))
@@ -73,6 +78,8 @@
 #define     IEP2_REG_DIL_FIELD_ORDER(x)			(((x) & 1) << 5)
 #define     IEP2_REG_DIL_OUT_MODE(x)			(((x) & 1) << 4)
 #define     IEP2_REG_DIL_MODE(x)			((x) & 0xf)
+#define IEP2_REG_TIMEOUT_CFG                    0x0050
+#define     IEP2_REG_TIMEOUT_CFG_EN			BIT(31)
 #define IEP2_REG_DBG_FRM_CNT			0x0058
 #define IEP2_REG_DBG_TIMEOUT_CNT		0x005c
 #define IEP2_REG_SRC_ADDR_CURY			0x0060
diff --git a/kernel/drivers/video/rockchip/rga3/include/rga2_reg_info.h b/kernel/drivers/video/rockchip/rga3/include/rga2_reg_info.h
index cd84951..6a5601b 100644
--- a/kernel/drivers/video/rockchip/rga3/include/rga2_reg_info.h
+++ b/kernel/drivers/video/rockchip/rga3/include/rga2_reg_info.h
@@ -4,38 +4,122 @@
 
 #include "rga_drv.h"
 
-#define RGA2_USE_MASTER_MODE		1
+#define RGA2_SYS_REG_BASE			0x000
+#define RGA2_CSC_REG_BASE			0x060
+#define RGA2_CMD_REG_BASE			0x100
 
-/* General Registers */
-#define RGA2_SYS_CTRL			0x000
-#define RGA2_CMD_CTRL			0x004
-#define RGA2_CMD_BASE			0x008
-#define RGA2_STATUS			0x00c
-#define RGA2_INT			0x010
-#define RGA2_MMU_CTRL0			0x018
-#define RGA2_MMU_CMD_BASE		0x01c
-#define RGA2_VERSION_NUM		0x028
+/* sys reg */
+#define RGA2_SYS_CTRL				0x000
+#define RGA2_CMD_CTRL				0x004
+#define RGA2_CMD_BASE				0x008
+#define RGA2_STATUS1				0x00c
+#define RGA2_INT				0x010
+#define RGA2_MMU_CTRL0				0x014
+#define RGA2_MMU_CMD_BASE			0x018
+#define RGA2_STATUS2				0x01c
+#define RGA2_VERSION_NUM			0x028
+#define RGA2_READ_LINE_CNT			0x030
+#define RGA2_WRITE_LINE_CNT			0x034
+#define RGA2_LINE_CNT				0x038
+#define RGA2_PERF_CTRL0				0x040
 
-#define rRGA_SYS_CTRL		(*(volatile u32 *)(RGA2_BASE + RGA2_SYS_CTRL_OFFSET))
-#define rRGA_CMD_CTRL		(*(volatile u32 *)(RGA2_BASE + RGA2_CMD_CTRL_OFFSET))
-#define rRGA_CMD_BASE		(*(volatile u32 *)(RGA2_BASE + RGA2_CMD_BASE_OFFSET))
-#define rRGA_STATUS		(*(volatile u32 *)(RGA2_BASE + RGA2_STATUS_OFFSET))
-#define rRGA_INT		(*(volatile u32 *)(RGA2_BASE + RGA2_INT_OFFSET))
-#define rRGA_MMU_CTRL0		(*(volatile u32 *)(RGA2_BASE + RGA2_MMU_CTRL0_OFFSET))
-#define rRGA_MMU_CMD_BASE	(*(volatile u32 *)(RGA2_BASE + RGA2_MMU_CMD_BASE_OFFSET))
-#define rRGA_CMD_ADDR		(*(volatile u32 *)(RGA2_BASE + RGA2_CMD_ADDR))
-#define rRGA_READ_LINE_CNT_TH	(*(volatile u32 *)(RGA2_BASE + RGA2_READ_LINE_CNT_OFFSET))
-#define rRGA_WRITE_LINE_CNT_TH	(*(volatile u32 *)(RGA2_BASE + RGA2_WRITE_LINE_CNT_OFFSET))
-#define rRGA_INT_LINE_CNT	(*(volatile u32 *)(RGA2_BASE + RGA2_LINE_CNT_OFFSET))
-#define rRGA_PERF_CTRL0		(*(volatile u32 *)(RGA2_BASE + RGA2_PERF_CTRL0_OFFSET))
-#define rRGA_OSD_CUR_FLAGS0	(*(volatile u32 *)(RGA2_BASE + RGA2_OSD_CUR_FLAGS0))
-#define rRGA_OSD_CUR_FLAGS1	(*(volatile u32 *)(RGA2_BASE + RGA2_OSD_CUR_FLAGS1))
+/* full csc reg */
+#define RGA2_DST_CSC_00				0x060
+#define RGA2_DST_CSC_01				0x064
+#define RGA2_DST_CSC_02				0x068
+#define RGA2_DST_CSC_OFF0			0x06c
+#define RGA2_DST_CSC_10				0x070
+#define RGA2_DST_CSC_11				0x074
+#define RGA2_DST_CSC_12				0x078
+#define RGA2_DST_CSC_OFF1			0x07c
+#define RGA2_DST_CSC_20				0x080
+#define RGA2_DST_CSC_21				0x084
+#define RGA2_DST_CSC_22				0x088
+#define RGA2_DST_CSC_OFF2			0x08c
+
+/* osd read-back reg */
+#define RGA2_OSD_CUR_FLAGS0			0x090
+#define RGA2_OSD_CUR_FLAGS1			0x09c
+
+/* mode ctrl */
+#define RGA2_MODE_CTRL_OFFSET			0x000
+#define RGA2_SRC_INFO_OFFSET			0x004
+#define RGA2_SRC_BASE0_OFFSET			0x008
+#define RGA2_SRC_BASE1_OFFSET			0x00c
+#define RGA2_SRC_BASE2_OFFSET			0x010
+#define RGA2_SRC_BASE3_OFFSET			0x014
+#define RGA2_SRC_VIR_INFO_OFFSET		0x018
+#define RGA2_SRC_ACT_INFO_OFFSET		0x01c
+#define RGA2_SRC_X_FACTOR_OFFSET		0x020
+#define RGA2_OSD_CTRL0_OFFSET			0x020 // repeat
+#define RGA2_SRC_Y_FACTOR_OFFSET		0x024
+#define RGA2_OSD_CTRL1_OFFSET			0x024 // repeat
+#define RGA2_SRC_BG_COLOR_OFFSET		0x028
+#define RGA2_OSD_COLOR0_OFFSET			0x028 // repeat
+#define RGA2_SRC_FG_COLOR_OFFSET		0x02c
+#define RGA2_OSD_COLOR1_OFFSET			0x02c // repeat
+#define RGA2_SRC_TR_COLOR0_OFFSET		0x030
+#define RGA2_CF_GR_A_OFFSET			0x030 // repeat
+#define RGA2_OSD_LAST_FLAGS0_OFFSET		0x030 // repeat
+#define RGA2_MOSAIC_MODE_OFFSET			0x030 // repeat
+#define RGA2_SRC_TR_COLOR1_OFFSET		0x034
+#define RGA2_CF_GR_B_OFFSET			0x034 // repeat
+#define RGA2_OSD_LAST_FLAGS1_OFFSET		0x034 // repeat
+#define RGA2_DST_INFO_OFFSET			0x038
+#define RGA2_DST_BASE0_OFFSET			0x03c
+#define RGA2_DST_BASE1_OFFSET			0x040
+#define RGA2_DST_BASE2_OFFSET			0x044
+#define RGA2_DST_VIR_INFO_OFFSET		0x048
+#define RGA2_DST_ACT_INFO_OFFSET		0x04c
+#define RGA2_ALPHA_CTRL0_OFFSET			0x050
+#define RGA2_ALPHA_CTRL1_OFFSET			0x054
+#define RGA2_FADING_CTRL_OFFSET			0x058
+#define RGA2_PAT_CON_OFFSET			0x05c
+#define RGA2_ROP_CTRL0_OFFSET			0x060
+#define RGA2_CF_GR_G_OFFSET			0x060 // repeat
+#define RGA2_DST_Y4MAP_LUT0_OFFSET		0x060 // repeat
+#define RGA2_DST_QUANTIZE_SCALE_OFFSET		0x060 // repeat
+#define RGA2_OSD_INVERTSION_CAL0_OFFSET		0x060 // repeat
+#define RGA2_ROP_CTRL1_OFFSET			0x064
+#define RGA2_CF_GR_R_OFFSET			0x064 // repeat
+#define RGA2_DST_Y4MAP_LUT1_OFFSET		0x064 // repeat
+#define RGA2_DST_QUANTIZE_OFFSET_OFFSET		0x064 // repeat
+#define RGA2_OSD_INVERTSION_CAL1_OFFSET		0x064 // repeat
+#define RGA2_MASK_BASE_OFFSET			0x068
+#define RGA2_MMU_CTRL1_OFFSET			0x06c
+#define RGA2_MMU_SRC_BASE_OFFSET		0x070
+#define RGA2_MMU_SRC1_BASE_OFFSET		0x074
+#define RGA2_MMU_DST_BASE_OFFSET		0x078
+#define RGA2_MMU_ELS_BASE_OFFSET		0x07c
 
 /*RGA_SYS*/
-#define m_RGA2_SYS_HOLD_MODE_EN				(1 << 9)
+#define m_RGA2_SYS_CTRL_SRC0YUV420SP_RD_OPT_DIS		(0x1 << 12)
+#define m_RGA2_SYS_CTRL_DST_WR_OPT_DIS			(0x1 << 11)
+#define m_RGA2_SYS_CTRL_CMD_CONTINUE_P			(0x1 << 10)
+#define m_RGA2_SYS_CTRL_HOLD_MODE_EN			(0x1 << 9)
+#define m_RGA2_SYS_CTRL_RST_HANDSAVE_P			(0x1 << 7)
+#define m_RGA2_SYS_CTRL_RST_PROTECT_P			(0x1 << 6)
+#define m_RGA2_SYS_CTRL_AUTO_RST			(0x1 << 5)
+#define m_RGA2_SYS_CTRL_CCLK_SRESET_P			(0x1 << 4)
+#define m_RGA2_SYS_CTRL_ACLK_SRESET_P			(0x1 << 3)
+#define m_RGA2_SYS_CTRL_AUTO_CKG			(0x1 << 2)
+#define m_RGA2_SYS_CTRL_CMD_MODE			(0x1 << 1)
+#define m_RGA2_SYS_CTRL_CMD_OP_ST_P			(0x1 << 0)
 
-#define s_RGA2_SYS_HOLD_MODE_EN(x)			((x & 0x1) << 9)
-#define s_RGA2_SYS_CMD_CONTINUE(x)			((x & 0x1) << 10)
+#define s_RGA2_SYS_CTRL_CMD_CONTINUE(x)			((x & 0x1) << 10)
+#define s_RGA2_SYS_CTRL_HOLD_MODE_EN(x)			((x & 0x1) << 9)
+#define s_RGA2_SYS_CTRL_CMD_MODE(x)			((x & 0x1) << 1)
+
+/* RGA_CMD_CTRL */
+#define m_RGA2_CMD_CTRL_INCR_NUM			(0x3ff << 3)
+#define m_RGA2_CMD_CTRL_STOP				(0x1 << 2)
+#define m_RGA2_CMD_CTRL_INCR_VALID_P			(0x1 << 1)
+#define m_RGA2_CMD_CTRL_CMD_LINE_ST_P			(0x1 << 0)
+
+/* RGA_STATUS1 */
+#define m_RGA2_STATUS1_SW_CMD_TOTAL_NUM			(0xfff << 8)
+#define m_RGA2_STATUS1_SW_CMD_CUR_NUM			(0xfff << 8)
+#define m_RGA2_STATUS1_SW_RGA_STA			(0x1 << 0)
 
 /*RGA_INT*/
 #define m_RGA2_INT_LINE_WR_CLEAR			(1 << 16)
@@ -56,6 +140,22 @@
 #define m_RGA2_INT_MMU_INT_FLAG				(1 << 1)
 #define m_RGA2_INT_ERROR_INT_FLAG			(1 << 0)
 
+#define m_RGA2_INT_ERROR_FLAG_MASK \
+	( \
+		m_RGA2_INT_MMU_INT_FLAG | \
+		m_RGA2_INT_ERROR_INT_FLAG \
+	)
+#define m_RGA2_INT_ERROR_CLEAR_MASK \
+	( \
+	m_RGA2_INT_MMU_INT_CLEAR | \
+	m_RGA2_INT_ERROR_INT_CLEAR \
+)
+#define m_RGA2_INT_ERROR_ENABLE_MASK \
+	( \
+		m_RGA2_INT_MMU_INT_EN | \
+		m_RGA2_INT_ERROR_INT_EN \
+	)
+
 #define s_RGA2_INT_LINE_WR_CLEAR(x)			((x & 0x1) << 16)
 #define s_RGA2_INT_LINE_RD_CLEAR(x)			((x & 0x1) << 15)
 #define s_RGA2_INT_LINE_WR_EN(x)			((x & 0x1) << 14)
@@ -67,6 +167,13 @@
 #define s_RGA2_INT_ALL_CMD_DONE_INT_CLEAR(x)		((x & 0x1) << 6)
 #define s_RGA2_INT_MMU_INT_CLEAR(x)			((x & 0x1) << 5)
 #define s_RGA2_INT_ERROR_INT_CLEAR(x)			((x & 0x1) << 4)
+
+/* RGA_STATUS2 hardware status */
+#define m_RGA2_STATUS2_RPP_MKRAM_RREADY			(0x2 << 11)
+#define m_RGA2_STATUS2_DSTRPP_OUTBUF_RREADY		(0x1f << 6)
+#define m_RGA2_STATUS2_SRCRPP_OUTBUF_RREADY		(0xf << 2)
+#define m_RGA2_STATUS2_BUS_ERROR			(0x1 << 1)
+#define m_RGA2_STATUS2_RPP_ERROR			(0x1 << 0)
 
 /* RGA_READ_LINE_CNT_TH */
 #define m_RGA2_READ_LINE_SW_INTR_LINE_RD_TH		(0x1fff << 0)
@@ -325,95 +432,9 @@
 #define s_RGA2_MMU_CTRL1_SW_ELS_MMU_EN(x)		((x & 0x1) << 12)
 #define s_RGA2_MMU_CTRL1_SW_ELS_MMU_FLUSH(x)		((x & 0x1) << 13)
 
-/* sys ctrl */
-#define RGA2_SYS_CTRL_OFFSET				0x0
-#define RGA2_CMD_CTRL_OFFSET				0x4
-#define RGA2_CMD_BASE_OFFSET				0x8
-#define RGA2_STATUS_OFFSET				0xc
-#define RGA2_INT_OFFSET					0x10
-#define RGA2_MMU_CTRL0_OFFSET				0x14
-#define RGA2_MMU_CMD_BASE_OFFSET			0x18
-#define RGA2_READ_LINE_CNT_OFFSET			0x30
-#define RGA2_WRITE_LINE_CNT_OFFSET			0x34
-#define RGA2_LINE_CNT_OFFSET				0x38
-#define RGA2_PERF_CTRL0_OFFSET				0x40
-#define RGA2_DST_CSC_00_OFFSET				0x60
-#define RGA2_DST_CSC_01_OFFSET				0x64
-#define RGA2_DST_CSC_02_OFFSET				0x68
-#define RGA2_DST_CSC_OFF0_OFFSET			0x6c
-#define RGA2_DST_CSC_10_OFFSET				0x70
-#define RGA2_DST_CSC_11_OFFSET				0x74
-#define RGA2_DST_CSC_12_OFFSET				0x78
-#define RGA2_DST_CSC_OFF1_OFFSET			0x7c
-#define RGA2_DST_CSC_20_OFFSET				0x80
-#define RGA2_DST_CSC_21_OFFSET				0x84
-#define RGA2_DST_CSC_22_OFFSET				0x88
-#define RGA2_DST_CSC_OFF2_OFFSET			0x8c
-#define RGA2_OSD_CUR_FLAGS0_OFFSET			0x90
-#define RGA2_OSD_CUR_FLAGS1_OFFSET			0x9c
+#define RGA2_VSP_BICUBIC_LIMIT				1996
 
-/* mode ctrl */
-#define RGA2_MODE_CTRL_OFFSET				0x00
-#define RGA2_SRC_INFO_OFFSET				0x04
-#define RGA2_SRC_BASE0_OFFSET				0x08
-#define RGA2_SRC_BASE1_OFFSET				0x0c
-#define RGA2_SRC_BASE2_OFFSET				0x10
-#define RGA2_SRC_BASE3_OFFSET				0x14
-#define RGA2_SRC_VIR_INFO_OFFSET			0x18
-#define RGA2_SRC_ACT_INFO_OFFSET			0x1c
-#define RGA2_SRC_X_FACTOR_OFFSET			0x20
-#define RGA2_OSD_CTRL0_OFFSET				0x20 // repeat
-#define RGA2_SRC_Y_FACTOR_OFFSET			0x24
-#define RGA2_OSD_CTRL1_OFFSET				0x24 // repeat
-#define RGA2_SRC_BG_COLOR_OFFSET			0x28
-#define RGA2_OSD_COLOR0_OFFSET				0x28 // repeat
-#define RGA2_SRC_FG_COLOR_OFFSET			0x2c
-#define RGA2_OSD_COLOR1_OFFSET				0x2c // repeat
-#define RGA2_SRC_TR_COLOR0_OFFSET			0x30
-#define RGA2_CF_GR_A_OFFSET				0x30 // repeat
-#define RGA2_OSD_LAST_FLAGS0_OFFSET			0x30 // repeat
-#define RGA2_MOSAIC_MODE_OFFSET				0x30 // repeat
-#define RGA2_SRC_TR_COLOR1_OFFSET			0x34
-#define RGA2_CF_GR_B_OFFSET				0x34 // repeat
-#define RGA2_OSD_LAST_FLAGS1_OFFSET			0x34 // repeat
-#define RGA2_DST_INFO_OFFSET				0x38
-#define RGA2_DST_BASE0_OFFSET				0x3c
-#define RGA2_DST_BASE1_OFFSET				0x40
-#define RGA2_DST_BASE2_OFFSET				0x44
-#define RGA2_DST_VIR_INFO_OFFSET			0x48
-#define RGA2_DST_ACT_INFO_OFFSET			0x4c
-#define RGA2_ALPHA_CTRL0_OFFSET				0x50
-#define RGA2_ALPHA_CTRL1_OFFSET				0x54
-#define RGA2_FADING_CTRL_OFFSET				0x58
-#define RGA2_PAT_CON_OFFSET				0x5c
-#define RGA2_ROP_CTRL0_OFFSET				0x60
-#define RGA2_CF_GR_G_OFFSET				0x60 // repeat
-#define RGA2_DST_Y4MAP_LUT0_OFFSET			0x60 // repeat
-#define RGA2_DST_QUANTIZE_SCALE_OFFSET			0x60 // repeat
-#define RGA2_OSD_INVERTSION_CAL0_OFFSET			0x60 // repeat
-#define RGA2_ROP_CTRL1_OFFSET				0x64
-#define RGA2_CF_GR_R_OFFSET				0x64 // repeat
-#define RGA2_DST_Y4MAP_LUT1_OFFSET			0x64 // repeat
-#define RGA2_DST_QUANTIZE_OFFSET_OFFSET			0x64 // repeat
-#define RGA2_OSD_INVERTSION_CAL1_OFFSET			0x64 // repeat
-#define RGA2_MASK_BASE_OFFSET				0x68
-#define RGA2_MMU_CTRL1_OFFSET				0x6c
-#define RGA2_MMU_SRC_BASE_OFFSET			0x70
-#define RGA2_MMU_SRC1_BASE_OFFSET			0x74
-#define RGA2_MMU_DST_BASE_OFFSET			0x78
-#define RGA2_MMU_ELS_BASE_OFFSET			0x7c
-
-#define RGA2_SYS_REG_BASE				0x0
-#define RGA2_CSC_REG_BASE				0x60
-#define RGA2_CMD_REG_BASE				0x100
-
-int rga2_gen_reg_info(unsigned char *base, struct rga2_req *msg);
-
-void rga2_soft_reset(struct rga_scheduler_t *scheduler);
-int rga2_set_reg(struct rga_job *job, struct rga_scheduler_t *scheduler);
-int rga2_init_reg(struct rga_job *job);
-int rga2_get_version(struct rga_scheduler_t *scheduler);
-void rga2_dump_read_back_reg(struct rga_scheduler_t *scheduler);
+extern const struct rga_backend_ops rga2_ops;
 
 #endif
 
diff --git a/kernel/drivers/video/rockchip/rga3/include/rga3_reg_info.h b/kernel/drivers/video/rockchip/rga3/include/rga3_reg_info.h
index d8eba9f..88d05a5 100644
--- a/kernel/drivers/video/rockchip/rga3/include/rga3_reg_info.h
+++ b/kernel/drivers/video/rockchip/rga3/include/rga3_reg_info.h
@@ -4,451 +4,492 @@
 
 #include "rga_drv.h"
 
-//General Registers
-/* yqw: status和int寄存器尚不明了,无法进行修改。 */
-//#define RGA2_STATUS			 0x00c
-//#define RGA2_INT				 0x010
+/* sys reg */
+#define RGA3_SYS_CTRL				0x000
+#define RGA3_CMD_CTRL				0x004
+#define RGA3_CMD_ADDR				0x008
+#define RGA3_MI_GROUP_CTRL			0x00c
+#define RGA3_ARQOS_CTRL				0x010
+#define RGA3_VERSION_NUM			0x018
+#define RGA3_VERSION_TIM			0x01c
+#define RGA3_INT_EN				0x020
+#define RGA3_INT_RAW				0x024
+#define RGA3_INT_MSK				0x028
+#define RGA3_INT_CLR				0x02c
+#define RGA3_RO_SRST				0x030
+#define RGA3_STATUS0				0x034
+#define RGA3_SCAN_CNT				0x038
+#define RGA3_CMD_STATE				0x040
 
-#define RGA3_SYS_CTRL			 0x000
-#define RGA3_CMD_CTRL			 0x004
-#define RGA3_CMD_ADDR			 0x008
-#define RGA3_MI_GROUP_CTRL		0x00c
-#define RGA3_ARQOS_CTRL		 0x010
-#define RGA3_VERSION_NUM		 0x018
-#define RGA3_VERSION_TIM		 0x01c
-#define RGA3_INT_EN			 0x020
-#define RGA3_INT_RAW			 0x024
-#define RGA3_INT_MSK			 0x028
-#define RGA3_INT_CLR			 0x02c
-#define RGA3_RO_SRST			 0x030
-#define RGA3_STATUS0			 0x034
-#define RGA3_SCAN_CNT			 0x038
-#define RGA3_STATUS1			 0x03c
-#define RGA3_CMD_STATE			0x040
+/* cmd reg */
+#define RGA3_WIN0_RD_CTRL_OFFSET		0x000
+#define RGA3_WIN0_Y_BASE_OFFSET			0x010
+#define RGA3_WIN0_U_BASE_OFFSET			0x014
+#define RGA3_WIN0_V_BASE_OFFSET			0x018
+#define RGA3_WIN0_VIR_STRIDE_OFFSET		0x01c
+#define RGA3_WIN0_FBC_OFF_OFFSET		0x020
+#define RGA3_WIN0_SRC_SIZE_OFFSET		0x024
+#define RGA3_WIN0_ACT_OFF_OFFSET		0x028
+#define RGA3_WIN0_ACT_SIZE_OFFSET		0x02c
+#define RGA3_WIN0_DST_SIZE_OFFSET		0x030
+#define RGA3_WIN0_SCL_FAC_OFFSET		0x034
+#define RGA3_WIN0_UV_VIR_STRIDE_OFFSET		0x038
+#define RGA3_WIN1_RD_CTRL_OFFSET		0x040
+#define RGA3_WIN1_Y_BASE_OFFSET			0x050
+#define RGA3_WIN1_U_BASE_OFFSET			0x054
+#define RGA3_WIN1_V_BASE_OFFSET			0x058
+#define RGA3_WIN1_VIR_STRIDE_OFFSET		0x05c
+#define RGA3_WIN1_FBC_OFF_OFFSET		0x060
+#define RGA3_WIN1_SRC_SIZE_OFFSET		0x064
+#define RGA3_WIN1_ACT_OFF_OFFSET		0x068
+#define RGA3_WIN1_ACT_SIZE_OFFSET		0x06c
+#define RGA3_WIN1_DST_SIZE_OFFSET		0x070
+#define RGA3_WIN1_SCL_FAC_OFFSET		0x074
+#define RGA3_WIN1_UV_VIR_STRIDE_OFFSET		0x078
+#define RGA3_OVLP_CTRL_OFFSET			0x080
+#define RGA3_OVLP_OFF_OFFSET			0x084
+#define RGA3_OVLP_TOP_KEY_MIN_OFFSET		0x088
+#define RGA3_OVLP_TOP_KEY_MAX_OFFSET		0x08c
+#define RGA3_OVLP_TOP_CTRL_OFFSET		0x090
+#define RGA3_OVLP_BOT_CTRL_OFFSET		0x094
+#define RGA3_OVLP_TOP_ALPHA_OFFSET		0x098
+#define RGA3_OVLP_BOT_ALPHA_OFFSET		0x09c
+#define RGA3_WR_CTRL_OFFSET			0x0a0
+#define RGA3_WR_FBCE_CTRL_OFFSET		0x0a4
+#define RGA3_WR_VIR_STRIDE_OFFSET		0x0a8
+#define RGA3_WR_PL_VIR_STRIDE_OFFSET		0x0ac
+#define RGA3_WR_Y_BASE_OFFSET			0x0b0
+#define RGA3_WR_U_BASE_OFFSET			0x0b4
+#define RGA3_WR_V_BASE_OFFSET			0x0b8
 
-/* TODO: RGA_INT */
+/* RGA3_SYS_CTRL */
+#define m_RGA3_SYS_CTRL_FRMEND_AUTO_RSTN_EN			(0x1 << 11)
+#define m_RGA3_SYS_CTRL_RGA_BIC_MODE				(0x3 << 9)
+#define m_RGA3_SYS_CTRL_RGA_RAM_CLK_ON				(0x1 << 8)
+#define m_RGA3_SYS_CTRL_CCLK_SRESET				(0x1 << 4)
+#define m_RGA3_SYS_CTRL_ACLK_SRESET				(0x1 << 3)
+#define m_RGA3_SYS_CTRL_RGA_LGC_CLK_ON				(0x1 << 2)
+#define m_RGA3_SYS_CTRL_CMD_MODE				(0x1 << 1)
+#define m_RGA3_SYS_CTRL_RGA_SART				(0x1 << 0)
+
+#define s_RGA3_SYS_CTRL_RGA_BIC_MODE(x)				((x & 0x3) << 9)
+#define s_RGA3_SYS_CTRL_CCLK_SRESET(x)				((x & 0x1) << 4)
+#define s_RGA3_SYS_CTRL_ACLK_SRESET(x)				((x & 0x1) << 3)
+#define s_RGA3_SYS_CTRL_CMD_MODE(x)				((x & 0x1) << 1)
+
+/* TODO: RGA3_INT_EN/RGA3_INT_RAW/RGA3_INT_MSK/RGA3_INT_CLR */
+#define m_RGA3_INT_WIN1_VOR_FIFO_REN_ERR			(0x1 << 29)
+#define m_RGA3_INT_WIN1_VOR_FIFO_WEN_ERR			(0x1 << 28)
+#define m_RGA3_INT_WIN1_HOR_FIFO_REN_ERR			(0x1 << 27)
+#define m_RGA3_INT_WIN1_HOR_FIFO_WEN_ERR			(0x1 << 26)
+#define m_RGA3_INT_WIN1_IN_FIFO_REB_ERR				(0x1 << 25)
+#define m_RGA3_INT_WIN1_IN_FIFO_WEN_ERR				(0x1 << 24)
+#define m_RGA3_INT_WIN0_VOR_FIFO_REN_ERR			(0x1 << 21)
+#define m_RGA3_INT_WIN0_VOR_FIFO_WEN_ERR			(0x1 << 20)
+#define m_RGA3_INT_WIN0_HOR_FIFO_REN_ERR			(0x1 << 19)
+#define m_RGA3_INT_WIN0_HOR_FIFO_WEN_ERR			(0x1 << 18)
+#define m_RGA3_INT_WIN0_IN_FIFO_REB_ERR				(0x1 << 17)
+#define m_RGA3_INT_WIN0_IN_FIFO_WEN_ERR				(0x1 << 16)
+#define m_RGA3_INT_RGA_MI_WR_BUS_ERR				(0x1 << 15)
+#define m_RGA3_INT_RGA_MI_WR_IN_HERR				(0x1 << 14)
+//The signal is invalid, it will be pulled up every time, no need to care.
+// #define m_RGA3_INT_RGA_MI_WR_IN_VERR				(0x1 << 13)
+#define m_RGA3_INT_WIN1_V_ERR					(0x1 << 11)
+#define m_RGA3_INT_WIN1_H_ERR					(0x1 << 10)
+#define m_RGA3_INT_WIN1_FBCD_DEC_ERR				(0x1 << 9)
+#define m_RGA3_INT_WIN1_RD_FRM_END				(0x1 << 8) //not error
+#define m_RGA3_INT_WIN0_V_ERR					(0x1 << 7)
+#define m_RGA3_INT_WIN0_H_ERR					(0x1 << 6)
+#define m_RGA3_INT_WIN0_FBCD_DEC_ERR				(0x1 << 5)
+#define m_RGA3_INT_WIN0_RD_FRM_END				(0x1 << 4) //not error
+#define m_RGA3_INT_CMD_LINE_FINISH				(0x1 << 3) //not error
+#define m_RGA3_INT_RAG_MI_RD_BUS_ERR				(0x1 << 2)
+#define m_RGA3_INT_RGA_MMU_INTR					(0x1 << 1)
+#define m_RGA3_INT_FRM_DONE					(0x1 << 0) //not error
+
+#define m_RGA3_INT_ERROR_MASK \
+	( \
+		m_RGA3_INT_RGA_MMU_INTR | \
+		m_RGA3_INT_RAG_MI_RD_BUS_ERR | \
+		m_RGA3_INT_WIN0_FBCD_DEC_ERR | \
+		m_RGA3_INT_WIN0_H_ERR | \
+		m_RGA3_INT_WIN0_V_ERR | \
+		m_RGA3_INT_WIN1_FBCD_DEC_ERR | \
+		m_RGA3_INT_WIN1_H_ERR | \
+		m_RGA3_INT_WIN1_V_ERR | \
+		m_RGA3_INT_RGA_MI_WR_IN_HERR | \
+		m_RGA3_INT_RGA_MI_WR_BUS_ERR | \
+		m_RGA3_INT_WIN0_IN_FIFO_WEN_ERR | \
+		m_RGA3_INT_WIN0_IN_FIFO_REB_ERR | \
+		m_RGA3_INT_WIN0_HOR_FIFO_WEN_ERR | \
+		m_RGA3_INT_WIN0_HOR_FIFO_REN_ERR| \
+		m_RGA3_INT_WIN0_VOR_FIFO_WEN_ERR | \
+		m_RGA3_INT_WIN0_VOR_FIFO_REN_ERR | \
+		m_RGA3_INT_WIN1_IN_FIFO_WEN_ERR | \
+		m_RGA3_INT_WIN1_IN_FIFO_REB_ERR | \
+		m_RGA3_INT_WIN1_HOR_FIFO_WEN_ERR | \
+		m_RGA3_INT_WIN1_HOR_FIFO_REN_ERR| \
+		m_RGA3_INT_WIN1_VOR_FIFO_WEN_ERR | \
+		m_RGA3_INT_WIN1_VOR_FIFO_REN_ERR \
+	)
+
+/* RGA3_CMD_CTRL */
+#define m_RGA3_CMD_CTRL_CMD_INCR_NUM				(0x3ff << 3)
+#define m_RGA3_CMD_CTRL_CMD_STOP_MODE				(0x1 << 2)
+#define m_RGA3_CMD_CTRL_CMD_INCR_VALID_P			(0x1 << 1)
+#define m_RGA3_CMD_CTRL_CMD_LINE_ST_P				(0x1 << 0)
+
+/* RGA3_RO_SRST */
+#define m_RGA3_RO_SRST_RO_RST_DONE				(0x3f << 0)
+
+/* RGA3_CMD_STATE */
+#define m_RGA3_CMD_STATE_CMD_CNT_CUR				(0xfff << 16)
+#define m_RGA3_CMD_STATE_CMD_WORKING				(0x1 << 0)
 
 /* RGA3_WIN0_RD_CTRL */
-#define m_RGA3_WIN0_RD_CTRL_SW_WIN0_ENABLE			 (0x1 << 0)
-#define m_RGA3_WIN0_RD_CTRL_SW_WIN0_RD_MODE			 (0x3 << 1)
-#define m_RGA3_WIN0_RD_CTRL_SW_WIN0_PIC_FORMAT		 (0xf << 4)
-#define m_RGA3_WIN0_RD_CTRL_SW_WIN0_RD_FORMAT		 (0x3 << 8)
-#define m_RGA3_WIN0_RD_CTRL_SW_WIN0_YUV10B_COMPACT	 (0x1 << 10)
-#define m_RGA3_WIN0_RD_CTRL_SW_WIN0_ENDIAN_MODE		 (0x1 << 11)
+#define m_RGA3_WIN0_RD_CTRL_SW_WIN0_ENABLE			(0x1 << 0)
+#define m_RGA3_WIN0_RD_CTRL_SW_WIN0_RD_MODE			(0x3 << 1)
+#define m_RGA3_WIN0_RD_CTRL_SW_WIN0_PIC_FORMAT			(0xf << 4)
+#define m_RGA3_WIN0_RD_CTRL_SW_WIN0_RD_FORMAT			(0x3 << 8)
+#define m_RGA3_WIN0_RD_CTRL_SW_WIN0_YUV10B_COMPACT		(0x1 << 10)
+#define m_RGA3_WIN0_RD_CTRL_SW_WIN0_ENDIAN_MODE			(0x1 << 11)
 #define m_RGA3_WIN0_RD_CTRL_SW_WIN0_PIX_SWAP			(0x1 << 12)
-#define m_RGA3_WIN0_RD_CTRL_SW_WIN0_YC_SWAP			 (0x1 << 13)
-#define m_RGA3_WIN0_RD_CTRL_SW_WIN0_ROT				 (0x1 << 16)
-#define m_RGA3_WIN0_RD_CTRL_SW_WIN0_XMIRROR			 (0x1 << 17)
-#define m_RGA3_WIN0_RD_CTRL_SW_WIN0_YMIRROR			 (0x1 << 18)
-#define m_RGA3_WIN0_RD_CTRL_SW_WIN0_HOR_BY			 (0x1 << 20)
-#define m_RGA3_WIN0_RD_CTRL_SW_WIN0_HOR_UP			 (0x1 << 21)
-#define m_RGA3_WIN0_RD_CTRL_SW_WIN0_VER_BY			 (0x1 << 22)
-#define m_RGA3_WIN0_RD_CTRL_SW_WIN0_VER_UP			 (0x1 << 23)
-#define m_RGA3_WIN0_RD_CTRL_SW_WIN0_Y2R_EN			 (0x1 << 24)
-#define m_RGA3_WIN0_RD_CTRL_SW_WIN0_R2Y_EN			 (0x1 << 25)
+#define m_RGA3_WIN0_RD_CTRL_SW_WIN0_YC_SWAP			(0x1 << 13)
+#define m_RGA3_WIN0_RD_CTRL_SW_WIN0_ROT				(0x1 << 16)
+#define m_RGA3_WIN0_RD_CTRL_SW_WIN0_XMIRROR			(0x1 << 17)
+#define m_RGA3_WIN0_RD_CTRL_SW_WIN0_YMIRROR			(0x1 << 18)
+#define m_RGA3_WIN0_RD_CTRL_SW_WIN0_HOR_BY			(0x1 << 20)
+#define m_RGA3_WIN0_RD_CTRL_SW_WIN0_HOR_UP			(0x1 << 21)
+#define m_RGA3_WIN0_RD_CTRL_SW_WIN0_VER_BY			(0x1 << 22)
+#define m_RGA3_WIN0_RD_CTRL_SW_WIN0_VER_UP			(0x1 << 23)
+#define m_RGA3_WIN0_RD_CTRL_SW_WIN0_Y2R_EN			(0x1 << 24)
+#define m_RGA3_WIN0_RD_CTRL_SW_WIN0_R2Y_EN			(0x1 << 25)
 #define m_RGA3_WIN0_RD_CTRL_SW_WIN0_CSC_MODE			(0x3 << 26)
 #define m_RGA3_WIN0_RD_CTRL_SW_WIN0_PERF_OPT_DIS		(0x1 << 29)
 #define m_RGA3_WIN0_RD_CTRL_SW_WIN0_RD_ALIGN_DIS		(0x1 << 30)
 
-#define s_RGA3_WIN0_RD_CTRL_SW_WIN0_ENABLE(x)		 ((x & 0x1) << 0)
-#define s_RGA3_WIN0_RD_CTRL_SW_WIN0_RD_MODE(x)		 ((x & 0x3) << 1)
-#define s_RGA3_WIN0_RD_CTRL_SW_WIN0_PIC_FORMAT(x)	 ((x & 0xf) << 4)
+#define s_RGA3_WIN0_RD_CTRL_SW_WIN0_ENABLE(x)			((x & 0x1) << 0)
+#define s_RGA3_WIN0_RD_CTRL_SW_WIN0_RD_MODE(x)			((x & 0x3) << 1)
+#define s_RGA3_WIN0_RD_CTRL_SW_WIN0_PIC_FORMAT(x)		((x & 0xf) << 4)
 #define s_RGA3_WIN0_RD_CTRL_SW_WIN0_RD_FORMAT(x)		((x & 0x3) << 8)
-#define s_RGA3_WIN0_RD_CTRL_SW_WIN0_YUV10B_COMPACT(x) ((x & 0x1) << 10)
-#define s_RGA3_WIN0_RD_CTRL_SW_WIN0_ENDIAN_MODE(x)	 ((x & 0x1) << 11)
-#define s_RGA3_WIN0_RD_CTRL_SW_WIN0_PIX_SWAP(x)		 ((x & 0x1) << 12)
-#define s_RGA3_WIN0_RD_CTRL_SW_WIN0_YC_SWAP(x)		 ((x & 0x1) << 13)
-#define s_RGA3_WIN0_RD_CTRL_SW_WIN0_ROT(x)		((x & 0x1) << 16)
-#define s_RGA3_WIN0_RD_CTRL_SW_WIN0_XMIRROR(x)		 ((x & 0x1) << 17)
-#define s_RGA3_WIN0_RD_CTRL_SW_WIN0_YMIRROR(x)		 ((x & 0x1) << 18)
-#define s_RGA3_WIN0_RD_CTRL_SW_WIN0_HOR_BY(x)		 ((x & 0x1) << 20)
-#define s_RGA3_WIN0_RD_CTRL_SW_WIN0_HOR_UP(x)		 ((x & 0x1) << 21)
-#define s_RGA3_WIN0_RD_CTRL_SW_WIN0_VER_BY(x)		 ((x & 0x1) << 22)
-#define s_RGA3_WIN0_RD_CTRL_SW_WIN0_VER_UP(x)		 ((x & 0x1) << 23)
-#define s_RGA3_WIN0_RD_CTRL_SW_WIN0_Y2R_EN(x)		 ((x & 0x1) << 24)
-#define s_RGA3_WIN0_RD_CTRL_SW_WIN0_R2Y_EN(x)		 ((x & 0x1) << 25)
-#define s_RGA3_WIN0_RD_CTRL_SW_WIN0_CSC_MODE(x)		 ((x & 0x3) << 26)
-#define s_RGA3_WIN0_RD_CTRL_SW_WIN0_PERF_OPT_DIS(x)	 ((x & 0x1) << 29)
-#define s_RGA3_WIN0_RD_CTRL_SW_WIN0_RD_ALIGN_DIS(x)	 ((x & 0x1) << 30)
+#define s_RGA3_WIN0_RD_CTRL_SW_WIN0_YUV10B_COMPACT(x)		((x & 0x1) << 10)
+#define s_RGA3_WIN0_RD_CTRL_SW_WIN0_ENDIAN_MODE(x)		((x & 0x1) << 11)
+#define s_RGA3_WIN0_RD_CTRL_SW_WIN0_PIX_SWAP(x)			((x & 0x1) << 12)
+#define s_RGA3_WIN0_RD_CTRL_SW_WIN0_YC_SWAP(x)			((x & 0x1) << 13)
+#define s_RGA3_WIN0_RD_CTRL_SW_WIN0_ROT(x)			((x & 0x1) << 16)
+#define s_RGA3_WIN0_RD_CTRL_SW_WIN0_XMIRROR(x)			((x & 0x1) << 17)
+#define s_RGA3_WIN0_RD_CTRL_SW_WIN0_YMIRROR(x)			((x & 0x1) << 18)
+#define s_RGA3_WIN0_RD_CTRL_SW_WIN0_HOR_BY(x)			((x & 0x1) << 20)
+#define s_RGA3_WIN0_RD_CTRL_SW_WIN0_HOR_UP(x)			((x & 0x1) << 21)
+#define s_RGA3_WIN0_RD_CTRL_SW_WIN0_VER_BY(x)			((x & 0x1) << 22)
+#define s_RGA3_WIN0_RD_CTRL_SW_WIN0_VER_UP(x)			((x & 0x1) << 23)
+#define s_RGA3_WIN0_RD_CTRL_SW_WIN0_Y2R_EN(x)			((x & 0x1) << 24)
+#define s_RGA3_WIN0_RD_CTRL_SW_WIN0_R2Y_EN(x)			((x & 0x1) << 25)
+#define s_RGA3_WIN0_RD_CTRL_SW_WIN0_CSC_MODE(x)			((x & 0x3) << 26)
+#define s_RGA3_WIN0_RD_CTRL_SW_WIN0_PERF_OPT_DIS(x)		((x & 0x1) << 29)
+#define s_RGA3_WIN0_RD_CTRL_SW_WIN0_RD_ALIGN_DIS(x)		((x & 0x1) << 30)
 
 /* RGA3_WIN0_FBC_OFF */
 #define m_RGA3_WIN0_FBC_OFF_SW_WIN0_FBC_XOFF			(0x1fff << 0)
 #define m_RGA3_WIN0_FBC_OFF_SW_WIN0_FBC_YOFF			(0x1fff << 16)
 
-#define s_RGA3_WIN0_FBC_OFF_SW_WIN0_FBC_XOFF(x)		 ((x & 0x1fff) << 0)
-#define s_RGA3_WIN0_FBC_OFF_SW_WIN0_FBC_YOFF(x)		 ((x & 0x1fff) << 16)
+#define s_RGA3_WIN0_FBC_OFF_SW_WIN0_FBC_XOFF(x)			((x & 0x1fff) << 0)
+#define s_RGA3_WIN0_FBC_OFF_SW_WIN0_FBC_YOFF(x)			((x & 0x1fff) << 16)
 
 /* RGA3_WIN0_SRC_SIZE */
-#define m_RGA3_WIN0_SRC_SIZE_SW_WIN0_SRC_WIDTH		 (0x1fff << 0)
-#define m_RGA3_WIN0_SRC_SIZE_SW_WIN0_SRC_HEIGHT		 (0x1fff << 16)
+#define m_RGA3_WIN0_SRC_SIZE_SW_WIN0_SRC_WIDTH			(0x1fff << 0)
+#define m_RGA3_WIN0_SRC_SIZE_SW_WIN0_SRC_HEIGHT			(0x1fff << 16)
 
-#define s_RGA3_WIN0_SRC_OFF_SW_WIN0_SRC_WIDTH(x)	((x & 0x1fff) << 0)
-#define s_RGA3_WIN0_SRC_OFF_SW_WIN0_SRC_HEIGHT(x)	 ((x & 0x1fff) << 16)
+#define s_RGA3_WIN0_SRC_OFF_SW_WIN0_SRC_WIDTH(x)		((x & 0x1fff) << 0)
+#define s_RGA3_WIN0_SRC_OFF_SW_WIN0_SRC_HEIGHT(x)		((x & 0x1fff) << 16)
 
 /* RGA3_WIN0_ACT_OFF */
 #define m_RGA3_WIN0_ACT_OFF_SW_WIN0_ACT_XOFF			(0x1fff << 0)
 #define m_RGA3_WIN0_ACT_OFF_SW_WIN0_ACT_YOFF			(0x1fff << 16)
 
-#define s_RGA3_WIN0_ACT_OFF_SW_WIN0_ACT_XOFF(x)		 ((x & 0x1fff) << 0)
-#define s_RGA3_WIN0_ACT_OFF_SW_WIN0_ACT_YOFF(x)		 ((x & 0x1fff) << 16)
+#define s_RGA3_WIN0_ACT_OFF_SW_WIN0_ACT_XOFF(x)			((x & 0x1fff) << 0)
+#define s_RGA3_WIN0_ACT_OFF_SW_WIN0_ACT_YOFF(x)			((x & 0x1fff) << 16)
 
 /* RGA3_WIN0_ACT_SIZE */
-#define m_RGA3_WIN0_ACT_SIZE_SW_WIN0_ACT_WIDTH		 (0x1fff << 0)
-#define m_RGA3_WIN0_ACT_SIZE_SW_WIN0_ACT_HEIGHT		 (0x1fff << 16)
+#define m_RGA3_WIN0_ACT_SIZE_SW_WIN0_ACT_WIDTH			(0x1fff << 0)
+#define m_RGA3_WIN0_ACT_SIZE_SW_WIN0_ACT_HEIGHT			(0x1fff << 16)
 
-#define s_RGA3_WIN0_ACT_SIZE_SW_WIN0_ACT_WIDTH(x)	 ((x & 0x1fff) << 0)
-#define s_RGA3_WIN0_ACT_SIZE_SW_WIN0_ACT_HEIGHT(x)	 ((x & 0x1fff) << 16)
+#define s_RGA3_WIN0_ACT_SIZE_SW_WIN0_ACT_WIDTH(x)		((x & 0x1fff) << 0)
+#define s_RGA3_WIN0_ACT_SIZE_SW_WIN0_ACT_HEIGHT(x)		((x & 0x1fff) << 16)
 
 /* RGA3_WIN0_DST_SIZE */
-#define m_RGA3_WIN0_DST_SIZE_SW_WIN0_DST_WIDTH		 (0x1fff << 0)
-#define m_RGA3_WIN0_DST_SIZE_SW_WIN0_DST_HEIGHT		 (0x1fff << 16)
+#define m_RGA3_WIN0_DST_SIZE_SW_WIN0_DST_WIDTH			(0x1fff << 0)
+#define m_RGA3_WIN0_DST_SIZE_SW_WIN0_DST_HEIGHT			(0x1fff << 16)
 
-#define s_RGA3_WIN0_DST_SIZE_SW_WIN0_DST_WIDTH(x)	 ((x & 0x1fff) << 0)
-#define s_RGA3_WIN0_DST_SIZE_SW_WIN0_DST_HEIGHT(x)	 ((x & 0x1fff) << 16)
+#define s_RGA3_WIN0_DST_SIZE_SW_WIN0_DST_WIDTH(x)		((x & 0x1fff) << 0)
+#define s_RGA3_WIN0_DST_SIZE_SW_WIN0_DST_HEIGHT(x)		((x & 0x1fff) << 16)
 
 /* RGA3_WIN0_SCL_FAC */
-#define m_RGA3_WIN0_SCL_FAC_SW_WIN0_VER_FAC			 (0xffff << 0)
-#define m_RGA3_WIN0_SCL_FAC_SW_WIN0_HOR_FAC			 (0xffff << 16)
+#define m_RGA3_WIN0_SCL_FAC_SW_WIN0_VER_FAC			(0xffff << 0)
+#define m_RGA3_WIN0_SCL_FAC_SW_WIN0_HOR_FAC			(0xffff << 16)
 
-#define s_RGA3_WIN0_SCL_FAC_SW_WIN0_VER_FAC(x)		 ((x & 0xffff) << 0)
-#define s_RGA3_WIN0_SCL_FAC_SW_WIN0_HOR_FAC(x)		 ((x & 0xffff) << 16)
+#define s_RGA3_WIN0_SCL_FAC_SW_WIN0_VER_FAC(x)			((x & 0xffff) << 0)
+#define s_RGA3_WIN0_SCL_FAC_SW_WIN0_HOR_FAC(x)			((x & 0xffff) << 16)
 
 /* RGA3_WIN1_RD_CTRL */
-#define m_RGA3_WIN1_RD_CTRL_SW_WIN1_ENABLE			 (0x1 << 0)
-#define m_RGA3_WIN1_RD_CTRL_SW_WIN1_RD_MODE			 (0x3 << 1)
-#define m_RGA3_WIN1_RD_CTRL_SW_WIN1_PIC_FORMAT		 (0xf << 4)
-#define m_RGA3_WIN1_RD_CTRL_SW_WIN1_RD_FORMAT		 (0x3 << 8)
-#define m_RGA3_WIN1_RD_CTRL_SW_WIN1_YUV10B_COMPACT	 (0x1 << 10)
-#define m_RGA3_WIN1_RD_CTRL_SW_WIN1_ENDIAN_MODE		 (0x1 << 11)
+#define m_RGA3_WIN1_RD_CTRL_SW_WIN1_ENABLE			(0x1 << 0)
+#define m_RGA3_WIN1_RD_CTRL_SW_WIN1_RD_MODE			(0x3 << 1)
+#define m_RGA3_WIN1_RD_CTRL_SW_WIN1_PIC_FORMAT			(0xf << 4)
+#define m_RGA3_WIN1_RD_CTRL_SW_WIN1_RD_FORMAT			(0x3 << 8)
+#define m_RGA3_WIN1_RD_CTRL_SW_WIN1_YUV10B_COMPACT		(0x1 << 10)
+#define m_RGA3_WIN1_RD_CTRL_SW_WIN1_ENDIAN_MODE			(0x1 << 11)
 #define m_RGA3_WIN1_RD_CTRL_SW_WIN1_PIX_SWAP			(0x1 << 12)
-#define m_RGA3_WIN1_RD_CTRL_SW_WIN1_YC_SWAP			 (0x1 << 13)
-#define m_RGA3_WIN1_RD_CTRL_SW_WIN1_ROT				 (0x1 << 16)
-#define m_RGA3_WIN1_RD_CTRL_SW_WIN1_XMIRROR			 (0x1 << 17)
-#define m_RGA3_WIN1_RD_CTRL_SW_WIN1_YMIRROR			 (0x1 << 18)
-#define m_RGA3_WIN1_RD_CTRL_SW_WIN1_HOR_BY			 (0x1 << 20)
-#define m_RGA3_WIN1_RD_CTRL_SW_WIN1_HOR_UP			 (0x1 << 21)
-#define m_RGA3_WIN1_RD_CTRL_SW_WIN1_VER_BY			 (0x1 << 22)
-#define m_RGA3_WIN1_RD_CTRL_SW_WIN1_VER_UP			 (0x1 << 23)
-#define m_RGA3_WIN1_RD_CTRL_SW_WIN1_Y2R_EN			 (0x1 << 24)
-#define m_RGA3_WIN1_RD_CTRL_SW_WIN1_R2Y_EN			 (0x1 << 25)
+#define m_RGA3_WIN1_RD_CTRL_SW_WIN1_YC_SWAP			(0x1 << 13)
+#define m_RGA3_WIN1_RD_CTRL_SW_WIN1_ROT				(0x1 << 16)
+#define m_RGA3_WIN1_RD_CTRL_SW_WIN1_XMIRROR			(0x1 << 17)
+#define m_RGA3_WIN1_RD_CTRL_SW_WIN1_YMIRROR			(0x1 << 18)
+#define m_RGA3_WIN1_RD_CTRL_SW_WIN1_HOR_BY			(0x1 << 20)
+#define m_RGA3_WIN1_RD_CTRL_SW_WIN1_HOR_UP			(0x1 << 21)
+#define m_RGA3_WIN1_RD_CTRL_SW_WIN1_VER_BY			(0x1 << 22)
+#define m_RGA3_WIN1_RD_CTRL_SW_WIN1_VER_UP			(0x1 << 23)
+#define m_RGA3_WIN1_RD_CTRL_SW_WIN1_Y2R_EN			(0x1 << 24)
+#define m_RGA3_WIN1_RD_CTRL_SW_WIN1_R2Y_EN			(0x1 << 25)
 #define m_RGA3_WIN1_RD_CTRL_SW_WIN1_CSC_MODE			(0x3 << 26)
 #define m_RGA3_WIN1_RD_CTRL_SW_WIN1_PERF_OPT_DIS		(0x1 << 29)
 #define m_RGA3_WIN1_RD_CTRL_SW_WIN1_RD_ALIGN_DIS		(0x1 << 30)
 
-#define s_RGA3_WIN1_RD_CTRL_SW_WIN1_ENABLE(x)		 ((x & 0x1) << 0)
-#define s_RGA3_WIN1_RD_CTRL_SW_WIN1_RD_MODE(x)		 ((x & 0x3) << 1)
-#define s_RGA3_WIN1_RD_CTRL_SW_WIN1_PIC_FORMAT(x)	 ((x & 0xf) << 4)
+#define s_RGA3_WIN1_RD_CTRL_SW_WIN1_ENABLE(x)			((x & 0x1) << 0)
+#define s_RGA3_WIN1_RD_CTRL_SW_WIN1_RD_MODE(x)			((x & 0x3) << 1)
+#define s_RGA3_WIN1_RD_CTRL_SW_WIN1_PIC_FORMAT(x)		((x & 0xf) << 4)
 #define s_RGA3_WIN1_RD_CTRL_SW_WIN1_RD_FORMAT(x)		((x & 0x3) << 8)
-#define s_RGA3_WIN1_RD_CTRL_SW_WIN1_YUV10B_COMPACT(x) ((x & 0x1) << 10)
-#define s_RGA3_WIN1_RD_CTRL_SW_WIN1_ENDIAN_MODE(x)	 ((x & 0x1) << 11)
-#define s_RGA3_WIN1_RD_CTRL_SW_WIN1_PIX_SWAP(x)		 ((x & 0x1) << 12)
-#define s_RGA3_WIN1_RD_CTRL_SW_WIN1_YC_SWAP(x)		 ((x & 0x1) << 13)
-#define s_RGA3_WIN1_RD_CTRL_SW_WIN1_ROT(x)		((x & 0x1) << 16)
-#define s_RGA3_WIN1_RD_CTRL_SW_WIN1_XMIRROR(x)		 ((x & 0x1) << 17)
-#define s_RGA3_WIN1_RD_CTRL_SW_WIN1_YMIRROR(x)		 ((x & 0x1) << 18)
-#define s_RGA3_WIN1_RD_CTRL_SW_WIN1_HOR_BY(x)		 ((x & 0x1) << 20)
-#define s_RGA3_WIN1_RD_CTRL_SW_WIN1_HOR_UP(x)		 ((x & 0x1) << 21)
-#define s_RGA3_WIN1_RD_CTRL_SW_WIN1_VER_BY(x)		 ((x & 0x1) << 22)
-#define s_RGA3_WIN1_RD_CTRL_SW_WIN1_VER_UP(x)		 ((x & 0x1) << 23)
-#define s_RGA3_WIN1_RD_CTRL_SW_WIN1_Y2R_EN(x)		 ((x & 0x1) << 24)
-#define s_RGA3_WIN1_RD_CTRL_SW_WIN1_R2Y_EN(x)		 ((x & 0x1) << 25)
-#define s_RGA3_WIN1_RD_CTRL_SW_WIN1_CSC_MODE(x)		 ((x & 0x3) << 26)
-#define s_RGA3_WIN1_RD_CTRL_SW_WIN1_PERF_OPT_DIS(x)	 ((x & 0x1) << 29)
-#define s_RGA3_WIN1_RD_CTRL_SW_WIN1_RD_ALIGN_DIS(x)	 ((x & 0x1) << 30)
+#define s_RGA3_WIN1_RD_CTRL_SW_WIN1_YUV10B_COMPACT(x)		((x & 0x1) << 10)
+#define s_RGA3_WIN1_RD_CTRL_SW_WIN1_ENDIAN_MODE(x)		((x & 0x1) << 11)
+#define s_RGA3_WIN1_RD_CTRL_SW_WIN1_PIX_SWAP(x)			((x & 0x1) << 12)
+#define s_RGA3_WIN1_RD_CTRL_SW_WIN1_YC_SWAP(x)			((x & 0x1) << 13)
+#define s_RGA3_WIN1_RD_CTRL_SW_WIN1_ROT(x)			((x & 0x1) << 16)
+#define s_RGA3_WIN1_RD_CTRL_SW_WIN1_XMIRROR(x)			((x & 0x1) << 17)
+#define s_RGA3_WIN1_RD_CTRL_SW_WIN1_YMIRROR(x)			((x & 0x1) << 18)
+#define s_RGA3_WIN1_RD_CTRL_SW_WIN1_HOR_BY(x)			((x & 0x1) << 20)
+#define s_RGA3_WIN1_RD_CTRL_SW_WIN1_HOR_UP(x)			((x & 0x1) << 21)
+#define s_RGA3_WIN1_RD_CTRL_SW_WIN1_VER_BY(x)			((x & 0x1) << 22)
+#define s_RGA3_WIN1_RD_CTRL_SW_WIN1_VER_UP(x)			((x & 0x1) << 23)
+#define s_RGA3_WIN1_RD_CTRL_SW_WIN1_Y2R_EN(x)			((x & 0x1) << 24)
+#define s_RGA3_WIN1_RD_CTRL_SW_WIN1_R2Y_EN(x)			((x & 0x1) << 25)
+#define s_RGA3_WIN1_RD_CTRL_SW_WIN1_CSC_MODE(x)			((x & 0x3) << 26)
+#define s_RGA3_WIN1_RD_CTRL_SW_WIN1_PERF_OPT_DIS(x)		((x & 0x1) << 29)
+#define s_RGA3_WIN1_RD_CTRL_SW_WIN1_RD_ALIGN_DIS(x)		((x & 0x1) << 30)
 
 /* RGA3_WIN1_FBC_OFF */
 #define m_RGA3_WIN1_FBC_OFF_SW_WIN1_FBC_XOFF			(0x1fff << 0)
 #define m_RGA3_WIN1_FBC_OFF_SW_WIN1_FBC_YOFF			(0x1fff << 16)
 
-#define s_RGA3_WIN1_FBC_OFF_SW_WIN1_FBC_XOFF(x)		 ((x & 0x1fff) << 0)
-#define s_RGA3_WIN1_FBC_OFF_SW_WIN1_FBC_YOFF(x)		 ((x & 0x1fff) << 16)
+#define s_RGA3_WIN1_FBC_OFF_SW_WIN1_FBC_XOFF(x)			((x & 0x1fff) << 0)
+#define s_RGA3_WIN1_FBC_OFF_SW_WIN1_FBC_YOFF(x)			((x & 0x1fff) << 16)
 
 /* RGA3_WIN1_SRC_SIZE */
-#define m_RGA3_WIN1_SRC_SIZE_SW_WIN1_SRC_WIDTH		 (0x1fff << 0)
-#define m_RGA3_WIN1_SRC_SIZE_SW_WIN1_SRC_HEIGHT		 (0x1fff << 16)
+#define m_RGA3_WIN1_SRC_SIZE_SW_WIN1_SRC_WIDTH			(0x1fff << 0)
+#define m_RGA3_WIN1_SRC_SIZE_SW_WIN1_SRC_HEIGHT			(0x1fff << 16)
 
-#define s_RGA3_WIN1_SRC_OFF_SW_WIN1_SRC_WIDTH(x)	((x & 0x1fff) << 0)
-#define s_RGA3_WIN1_SRC_OFF_SW_WIN1_SRC_HEIGHT(x)	 ((x & 0x1fff) << 16)
+#define s_RGA3_WIN1_SRC_OFF_SW_WIN1_SRC_WIDTH(x)		((x & 0x1fff) << 0)
+#define s_RGA3_WIN1_SRC_OFF_SW_WIN1_SRC_HEIGHT(x)		((x & 0x1fff) << 16)
 
 /* RGA3_WIN1_ACT_OFF */
 #define m_RGA3_WIN1_ACT_OFF_SW_WIN1_ACT_XOFF			(0x1fff << 0)
 #define m_RGA3_WIN1_ACT_OFF_SW_WIN1_ACT_YOFF			(0x1fff << 16)
 
-#define s_RGA3_WIN1_ACT_OFF_SW_WIN1_ACT_XOFF(x)		 ((x & 0x1fff) << 0)
-#define s_RGA3_WIN1_ACT_OFF_SW_WIN1_ACT_YOFF(x)		 ((x & 0x1fff) << 16)
+#define s_RGA3_WIN1_ACT_OFF_SW_WIN1_ACT_XOFF(x)			((x & 0x1fff) << 0)
+#define s_RGA3_WIN1_ACT_OFF_SW_WIN1_ACT_YOFF(x)			((x & 0x1fff) << 16)
 
 /* RGA3_WIN1_ACT_SIZE */
-#define m_RGA3_WIN1_ACT_SIZE_SW_WIN1_ACT_WIDTH		 (0x1fff << 0)
-#define m_RGA3_WIN1_ACT_SIZE_SW_WIN1_ACT_HEIGHT		 (0x1fff << 16)
+#define m_RGA3_WIN1_ACT_SIZE_SW_WIN1_ACT_WIDTH			(0x1fff << 0)
+#define m_RGA3_WIN1_ACT_SIZE_SW_WIN1_ACT_HEIGHT			(0x1fff << 16)
 
-#define s_RGA3_WIN1_ACT_SIZE_SW_WIN1_ACT_WIDTH(x)	 ((x & 0x1fff) << 0)
-#define s_RGA3_WIN1_ACT_SIZE_SW_WIN1_ACT_HEIGHT(x)	 ((x & 0x1fff) << 16)
+#define s_RGA3_WIN1_ACT_SIZE_SW_WIN1_ACT_WIDTH(x)		((x & 0x1fff) << 0)
+#define s_RGA3_WIN1_ACT_SIZE_SW_WIN1_ACT_HEIGHT(x)		((x & 0x1fff) << 16)
 
 /* RGA3_WIN1_DST_SIZE */
-#define m_RGA3_WIN1_DST_SIZE_SW_WIN1_DST_WIDTH		 (0x1fff << 0)
-#define m_RGA3_WIN1_DST_SIZE_SW_WIN1_DST_HEIGHT		 (0x1fff << 16)
+#define m_RGA3_WIN1_DST_SIZE_SW_WIN1_DST_WIDTH			(0x1fff << 0)
+#define m_RGA3_WIN1_DST_SIZE_SW_WIN1_DST_HEIGHT			(0x1fff << 16)
 
-#define s_RGA3_WIN1_DST_SIZE_SW_WIN1_DST_WIDTH(x)	 ((x & 0x1fff) << 0)
-#define s_RGA3_WIN1_DST_SIZE_SW_WIN1_DST_HEIGHT(x)	 ((x & 0x1fff) << 16)
+#define s_RGA3_WIN1_DST_SIZE_SW_WIN1_DST_WIDTH(x)		((x & 0x1fff) << 0)
+#define s_RGA3_WIN1_DST_SIZE_SW_WIN1_DST_HEIGHT(x)		((x & 0x1fff) << 16)
 
 /* RGA3_WIN1_SCL_FAC */
-#define m_RGA3_WIN1_SCL_FAC_SW_WIN1_VER_FAC			 (0xffff << 0)
-#define m_RGA3_WIN1_SCL_FAC_SW_WIN1_HOR_FAC			 (0xffff << 16)
+#define m_RGA3_WIN1_SCL_FAC_SW_WIN1_VER_FAC			(0xffff << 0)
+#define m_RGA3_WIN1_SCL_FAC_SW_WIN1_HOR_FAC			(0xffff << 16)
 
-#define s_RGA3_WIN1_SCL_FAC_SW_WIN1_VER_FAC(x)		 ((x & 0xffff) << 0)
-#define s_RGA3_WIN1_SCL_FAC_SW_WIN1_HOR_FAC(x)		 ((x & 0xffff) << 16)
+#define s_RGA3_WIN1_SCL_FAC_SW_WIN1_VER_FAC(x)			((x & 0xffff) << 0)
+#define s_RGA3_WIN1_SCL_FAC_SW_WIN1_HOR_FAC(x)			((x & 0xffff) << 16)
 
 /* RGA3_OVLP_CTRL */
-#define m_RGA3_OVLP_CTRL_SW_OVLP_MODE				 (0x3 << 0)
-#define m_RGA3_OVLP_CTRL_SW_OVLP_FIELD				 (0x1 << 2)
-#define m_RGA3_OVLP_CTRL_SW_TOP_SWAP			(0x1 << 3)
-#define m_RGA3_OVLP_CTRL_SW_TOP_ALPHA_EN		(0x1 << 4)
-#define m_RGA3_OVLP_CTRL_SW_TOP_KEY_EN				 (0x7FFF << 5)
-#define m_RGA3_OVLP_CTRL_SW_OVLP_Y2R_EN				 (0x1 << 20)
-#define m_RGA3_OVLP_CTRL_SW_OVLP_R2Y_EN				 (0x1 << 21)
-#define m_RGA3_OVLP_CTRL_SW_OVLP_CSC_MODE			 (0x3 << 22)
+#define m_RGA3_OVLP_CTRL_SW_OVLP_MODE				(0x3 << 0)
+#define m_RGA3_OVLP_CTRL_SW_OVLP_FIELD				(0x1 << 2)
+#define m_RGA3_OVLP_CTRL_SW_TOP_SWAP				(0x1 << 3)
+#define m_RGA3_OVLP_CTRL_SW_TOP_ALPHA_EN			(0x1 << 4)
+#define m_RGA3_OVLP_CTRL_SW_TOP_KEY_EN				(0x7FFF << 5)
+#define m_RGA3_OVLP_CTRL_SW_OVLP_Y2R_EN				(0x1 << 20)
+#define m_RGA3_OVLP_CTRL_SW_OVLP_R2Y_EN				(0x1 << 21)
+#define m_RGA3_OVLP_CTRL_SW_OVLP_CSC_MODE			(0x3 << 22)
 
-#define s_RGA3_OVLP_CTRL_SW_OVLP_MODE(x)		((x & 0x3) << 0)
-#define s_RGA3_OVLP_CTRL_SW_OVLP_FIELD(x)		((x & 0x1) << 2)
-#define s_RGA3_OVLP_CTRL_SW_TOP_SWAP(x)			((x & 0x1) << 3)
-#define s_RGA3_OVLP_CTRL_SW_TOP_ALPHA_EN(x)		((x & 0x1) << 4)
-#define s_RGA3_OVLP_CTRL_SW_TOP_KEY_EN(x)		((x & 0x7FFF) << 5)
-#define s_RGA3_OVLP_CTRL_SW_OVLP_Y2R_EN(x)		((x & 0x1) << 20)
-#define s_RGA3_OVLP_CTRL_SW_OVLP_R2Y_EN(x)		((x & 0x1) << 21)
-#define s_RGA3_OVLP_CTRL_SW_OVLP_CSC_MODE(x)	((x & 0x3) << 22)
+#define s_RGA3_OVLP_CTRL_SW_OVLP_MODE(x)			((x & 0x3) << 0)
+#define s_RGA3_OVLP_CTRL_SW_OVLP_FIELD(x)			((x & 0x1) << 2)
+#define s_RGA3_OVLP_CTRL_SW_TOP_SWAP(x)				((x & 0x1) << 3)
+#define s_RGA3_OVLP_CTRL_SW_TOP_ALPHA_EN(x)			((x & 0x1) << 4)
+#define s_RGA3_OVLP_CTRL_SW_TOP_KEY_EN(x)			((x & 0x7FFF) << 5)
+#define s_RGA3_OVLP_CTRL_SW_OVLP_Y2R_EN(x)			((x & 0x1) << 20)
+#define s_RGA3_OVLP_CTRL_SW_OVLP_R2Y_EN(x)			((x & 0x1) << 21)
+#define s_RGA3_OVLP_CTRL_SW_OVLP_CSC_MODE(x)			((x & 0x3) << 22)
 
 /* RGA3_OVLP_OFF */
-#define m_RGA3_OVLP_OFF_SW_OVLP_XOFF		(0x1fff << 0)
-#define m_RGA3_OVLP_OFF_SW_OVLP_YOFF		(0x1fff << 16)
+#define m_RGA3_OVLP_OFF_SW_OVLP_XOFF				(0x1fff << 0)
+#define m_RGA3_OVLP_OFF_SW_OVLP_YOFF				(0x1fff << 16)
 
-#define s_RGA3_OVLP_OFF_SW_OVLP_XOFF(x)		((x & 0x1fff) << 0)
-#define s_RGA3_OVLP_OFF_SW_OVLP_YOFF(x)		((x & 0x1fff) << 16)
+#define s_RGA3_OVLP_OFF_SW_OVLP_XOFF(x)				((x & 0x1fff) << 0)
+#define s_RGA3_OVLP_OFF_SW_OVLP_YOFF(x)				((x & 0x1fff) << 16)
 
 /* RGA3_OVLP_TOP_KEY_MIN */
-#define m_RGA3_OVLP_TOP_KEY_MIN_SW_TOP_KEY_YG_MIN	 (0x3ff << 0)
-#define m_RGA3_OVLP_TOP_KEY_MIN_SW_TOP_KEY_UB_MIN	 (0x3ff << 10)
-#define m_RGA3_OVLP_TOP_KEY_MIN_SW_TOP_KEY_VR_MIN	 (0x3ff << 20)
+#define m_RGA3_OVLP_TOP_KEY_MIN_SW_TOP_KEY_YG_MIN		(0x3ff << 0)
+#define m_RGA3_OVLP_TOP_KEY_MIN_SW_TOP_KEY_UB_MIN		(0x3ff << 10)
+#define m_RGA3_OVLP_TOP_KEY_MIN_SW_TOP_KEY_VR_MIN		(0x3ff << 20)
 
-#define s_RGA3_OVLP_TOP_KEY_MIN_SW_TOP_KEY_YG_MIN(x)	((x & 0x3f)f << 0)
-#define s_RGA3_OVLP_TOP_KEY_MIN_SW_TOP_KEY_UB_MIN(x)	((x & 0x3ff) << 10)
-#define s_RGA3_OVLP_TOP_KEY_MIN_SW_TOP_KEY_VR_MIN(x)	((x & 0x3ff) << 20)
+#define s_RGA3_OVLP_TOP_KEY_MIN_SW_TOP_KEY_YG_MIN(x)		((x & 0x3f)f << 0)
+#define s_RGA3_OVLP_TOP_KEY_MIN_SW_TOP_KEY_UB_MIN(x)		((x & 0x3ff) << 10)
+#define s_RGA3_OVLP_TOP_KEY_MIN_SW_TOP_KEY_VR_MIN(x)		((x & 0x3ff) << 20)
 
 /* RGA3_OVLP_TOP_KEY_MAX */
-#define m_RGA3_OVLP_TOP_KEY_MAX_SW_TOP_KEY_YG_MAX	 (0x3ff << 0)
-#define m_RGA3_OVLP_TOP_KEY_MAX_SW_TOP_KEY_UB_MAX	 (0x3ff << 10)
-#define m_RGA3_OVLP_TOP_KEY_MAX_SW_TOP_KEY_VR_MAX	 (0x3ff << 20)
+#define m_RGA3_OVLP_TOP_KEY_MAX_SW_TOP_KEY_YG_MAX		(0x3ff << 0)
+#define m_RGA3_OVLP_TOP_KEY_MAX_SW_TOP_KEY_UB_MAX		(0x3ff << 10)
+#define m_RGA3_OVLP_TOP_KEY_MAX_SW_TOP_KEY_VR_MAX		(0x3ff << 20)
 
-#define s_RGA3_OVLP_TOP_KEY_MAX_SW_TOP_KEY_YG_MAX(x)	((x & 0x3ff) << 0)
-#define s_RGA3_OVLP_TOP_KEY_MAX_SW_TOP_KEY_UB_MAX(x)	((x & 0x3ff) << 10)
-#define s_RGA3_OVLP_TOP_KEY_MAX_SW_TOP_KEY_VR_MAX(x)	((x & 0x3ff) << 20)
+#define s_RGA3_OVLP_TOP_KEY_MAX_SW_TOP_KEY_YG_MAX(x)		((x & 0x3ff) << 0)
+#define s_RGA3_OVLP_TOP_KEY_MAX_SW_TOP_KEY_UB_MAX(x)		((x & 0x3ff) << 10)
+#define s_RGA3_OVLP_TOP_KEY_MAX_SW_TOP_KEY_VR_MAX(x)		((x & 0x3ff) << 20)
 
 /* RGA3_OVLP_TOP_CTRL */
 #define m_RGA3_OVLP_TOP_CTRL_SW_TOP_COLOR_M0			(0x1 << 0)
 #define m_RGA3_OVLP_TOP_CTRL_SW_TOP_ALPHA_M0			(0x1 << 1)
 #define m_RGA3_OVLP_TOP_CTRL_SW_TOP_BLEND_M0			(0x3 << 2)
 #define m_RGA3_OVLP_TOP_CTRL_SW_TOP_ALPHA_CAL_M0		(0x1 << 4)
-#define m_RGA3_OVLP_TOP_CTRL_SW_TOP_FACTOR_M0		 (0x7 << 5)
+#define m_RGA3_OVLP_TOP_CTRL_SW_TOP_FACTOR_M0			(0x7 << 5)
 #define m_RGA3_OVLP_TOP_CTRL_SW_TOP_GLOBAL_ALPHA		(0xff << 16)
 
-#define s_RGA3_OVLP_TOP_CTRL_SW_TOP_COLOR_M0(x)		 ((x & 0x1) << 0)
-#define s_RGA3_OVLP_TOP_CTRL_SW_TOP_ALPHA_M0(x)		 ((x & 0x1) << 1)
-#define s_RGA3_OVLP_TOP_CTRL_SW_TOP_BLEND_M0(x)		 ((x & 0x3) << 2)
-#define s_RGA3_OVLP_TOP_CTRL_SW_TOP_ALPHA_CAL_M0(x)	 ((x & 0x1) << 4)
+#define s_RGA3_OVLP_TOP_CTRL_SW_TOP_COLOR_M0(x)			((x & 0x1) << 0)
+#define s_RGA3_OVLP_TOP_CTRL_SW_TOP_ALPHA_M0(x)			((x & 0x1) << 1)
+#define s_RGA3_OVLP_TOP_CTRL_SW_TOP_BLEND_M0(x)			((x & 0x3) << 2)
+#define s_RGA3_OVLP_TOP_CTRL_SW_TOP_ALPHA_CAL_M0(x)		((x & 0x1) << 4)
 #define s_RGA3_OVLP_TOP_CTRL_SW_TOP_FACTOR_M0(x)		((x & 0x7) << 5)
-#define s_RGA3_OVLP_TOP_CTRL_SW_TOP_GLOBAL_ALPHA(x)	 ((x & 0xff) << 16)
+#define s_RGA3_OVLP_TOP_CTRL_SW_TOP_GLOBAL_ALPHA(x)		((x & 0xff) << 16)
 
 /* RGA3_OVLP_BOT_CTRL */
 #define m_RGA3_OVLP_BOT_CTRL_SW_BOT_COLOR_M0			(0x1 << 0)
 #define m_RGA3_OVLP_BOT_CTRL_SW_BOT_ALPHA_M0			(0x1 << 1)
 #define m_RGA3_OVLP_BOT_CTRL_SW_BOT_BLEND_M0			(0x3 << 2)
 #define m_RGA3_OVLP_BOT_CTRL_SW_BOT_ALPHA_CAL_M0		(0x1 << 4)
-#define m_RGA3_OVLP_BOT_CTRL_SW_BOT_FACTOR_M0		 (0x7 << 5)
+#define m_RGA3_OVLP_BOT_CTRL_SW_BOT_FACTOR_M0			(0x7 << 5)
 #define m_RGA3_OVLP_BOT_CTRL_SW_BOT_GLOBAL_ALPHA		(0xff << 16)
 
-#define s_RGA3_OVLP_BOT_CTRL_SW_BOT_COLOR_M0(x)		 ((x & 0x1) << 0)
-#define s_RGA3_OVLP_BOT_CTRL_SW_BOT_ALPHA_M0(x)		 ((x & 0x1) << 1)
-#define s_RGA3_OVLP_BOT_CTRL_SW_BOT_BLEND_M0(x)		 ((x & 0x3) << 2)
-#define s_RGA3_OVLP_BOT_CTRL_SW_BOT_ALPHA_CAL_M0(x)	 ((x & 0x1) << 4)
+#define s_RGA3_OVLP_BOT_CTRL_SW_BOT_COLOR_M0(x)			((x & 0x1) << 0)
+#define s_RGA3_OVLP_BOT_CTRL_SW_BOT_ALPHA_M0(x)			((x & 0x1) << 1)
+#define s_RGA3_OVLP_BOT_CTRL_SW_BOT_BLEND_M0(x)			((x & 0x3) << 2)
+#define s_RGA3_OVLP_BOT_CTRL_SW_BOT_ALPHA_CAL_M0(x)		((x & 0x1) << 4)
 #define s_RGA3_OVLP_BOT_CTRL_SW_BOT_FACTOR_M0(x)		((x & 0x7) << 5)
-#define s_RGA3_OVLP_BOT_CTRL_SW_BOT_GLOBAL_ALPHA(x)	 ((x & 0xff) << 16)
+#define s_RGA3_OVLP_BOT_CTRL_SW_BOT_GLOBAL_ALPHA(x)		((x & 0xff) << 16)
 
 /* RGA3_OVLP_TOP_ALPHA */
-#define m_RGA3_OVLP_TOP_ALPHA_SW_TOP_ALPHA_M1		 (0x1 << 1)
-#define m_RGA3_OVLP_TOP_ALPHA_SW_TOP_BLEND_M1		 (0x3 << 2)
-#define m_RGA3_OVLP_TOP_ALPHA_SW_TOP_ALPHA_CAL_M1	 (0x1 << 4)
-#define m_RGA3_OVLP_TOP_ALPHA_SW_TOP_FACTOR_M1		 (0x7 << 5)
+#define m_RGA3_OVLP_TOP_ALPHA_SW_TOP_ALPHA_M1			(0x1 << 1)
+#define m_RGA3_OVLP_TOP_ALPHA_SW_TOP_BLEND_M1			(0x3 << 2)
+#define m_RGA3_OVLP_TOP_ALPHA_SW_TOP_ALPHA_CAL_M1		(0x1 << 4)
+#define m_RGA3_OVLP_TOP_ALPHA_SW_TOP_FACTOR_M1			(0x7 << 5)
 
 #define s_RGA3_OVLP_TOP_ALPHA_SW_TOP_ALPHA_M1(x)		((x & 0x1) << 1)
 #define s_RGA3_OVLP_TOP_ALPHA_SW_TOP_BLEND_M1(x)		((x & 0x3) << 2)
-#define s_RGA3_OVLP_TOP_ALPHA_SW_TOP_ALPHA_CAL_M1(x)	((x & 0x1) << 4)
-#define s_RGA3_OVLP_TOP_ALPHA_SW_TOP_FACTOR_M1(x)	 ((x & 0x7) << 5)
+#define s_RGA3_OVLP_TOP_ALPHA_SW_TOP_ALPHA_CAL_M1(x)		((x & 0x1) << 4)
+#define s_RGA3_OVLP_TOP_ALPHA_SW_TOP_FACTOR_M1(x)		((x & 0x7) << 5)
 
 /* RGA3_OVLP_BOT_ALPHA */
-#define m_RGA3_OVLP_BOT_ALPHA_SW_BOT_ALPHA_M1		 (0x1 << 1)
-#define m_RGA3_OVLP_BOT_ALPHA_SW_BOT_BLEND_M1		 (0x3 << 2)
-#define m_RGA3_OVLP_BOT_ALPHA_SW_BOT_ALPHA_CAL_M1	 (0x1 << 4)
-#define m_RGA3_OVLP_BOT_ALPHA_SW_BOT_FACTOR_M1		 (0x7 << 5)
+#define m_RGA3_OVLP_BOT_ALPHA_SW_BOT_ALPHA_M1			(0x1 << 1)
+#define m_RGA3_OVLP_BOT_ALPHA_SW_BOT_BLEND_M1			(0x3 << 2)
+#define m_RGA3_OVLP_BOT_ALPHA_SW_BOT_ALPHA_CAL_M1		(0x1 << 4)
+#define m_RGA3_OVLP_BOT_ALPHA_SW_BOT_FACTOR_M1			(0x7 << 5)
 
 #define s_RGA3_OVLP_BOT_ALPHA_SW_BOT_ALPHA_M1(x)		((x & 0x1) << 1)
 #define s_RGA3_OVLP_BOT_ALPHA_SW_BOT_BLEND_M1(x)		((x & 0x3) << 2)
-#define s_RGA3_OVLP_BOT_ALPHA_SW_BOT_ALPHA_CAL_M1(x)	((x & 0x1) << 4)
-#define s_RGA3_OVLP_BOT_ALPHA_SW_BOT_FACTOR_M1(x)	 ((x & 0x7) << 5)
+#define s_RGA3_OVLP_BOT_ALPHA_SW_BOT_ALPHA_CAL_M1(x)		((x & 0x1) << 4)
+#define s_RGA3_OVLP_BOT_ALPHA_SW_BOT_FACTOR_M1(x)		((x & 0x7) << 5)
 
 /* RGA3_WR_CTRL */
-#define m_RGA3_WR_CTRL_SW_WR_MODE			(0x3 << 0)
-#define m_RGA3_WR_CTRL_SW_WR_FBCE_SPARSE_EN			 (0x1 << 2)
-#define m_RGA3_WR_CTRL_SW_WR_PIC_FORMAT				 (0xf << 4)
+#define m_RGA3_WR_CTRL_SW_WR_MODE				(0x3 << 0)
+#define m_RGA3_WR_CTRL_SW_WR_FBCE_SPARSE_EN			(0x1 << 2)
+#define m_RGA3_WR_CTRL_SW_WR_PIC_FORMAT				(0xf << 4)
 #define m_RGA3_WR_CTRL_SW_WR_FORMAT				(0x3 << 8)
-#define m_RGA3_WR_CTRL_SW_WR_YUV10B_COMPACT			 (0x1 << 10)
-#define m_RGA3_WR_CTRL_SW_WR_ENDIAN_MODE		(0x1 << 11)
-#define m_RGA3_WR_CTRL_SW_WR_PIX_SWAP				 (0x1 << 12)
-#define m_RGA3_WR_CTRL_SW_OUTSTANDING_MAX			 (0x3f << 13)
-#define m_RGA3_WR_CTRL_SW_WR_YC_SWAP			(0x1 << 20)
+#define m_RGA3_WR_CTRL_SW_WR_YUV10B_COMPACT			(0x1 << 10)
+#define m_RGA3_WR_CTRL_SW_WR_ENDIAN_MODE			(0x1 << 11)
+#define m_RGA3_WR_CTRL_SW_WR_PIX_SWAP				(0x1 << 12)
+#define m_RGA3_WR_CTRL_SW_OUTSTANDING_MAX			(0x3f << 13)
+#define m_RGA3_WR_CTRL_SW_WR_YC_SWAP				(0x1 << 20)
 
-#define s_RGA3_WR_CTRL_SW_WR_MODE(x)			((x & 0x3) << 0)
-#define s_RGA3_WR_CTRL_SW_WR_FBCE_SPARSE_EN(x)		 ((x & 0x1) << 2)
-#define s_RGA3_WR_CTRL_SW_WR_PIC_FORMAT(x)		((x & 0xf) << 4)
-#define s_RGA3_WR_CTRL_SW_WR_FORMAT(x)			((x & 0x3) << 8)
-#define s_RGA3_WR_CTRL_SW_WR_YUV10B_COMPACT(x)		 ((x & 0x1) << 10)
-#define s_RGA3_WR_CTRL_SW_WR_ENDIAN_MODE(x)		((x & 0x1) << 11)
-#define s_RGA3_WR_CTRL_SW_WR_PIX_SWAP(x)		((x & 0x1) << 12)
-#define s_RGA3_WR_CTRL_SW_OUTSTANDING_MAX(x)	((x & 0x3f) << 13)
-#define s_RGA3_WR_CTRL_SW_WR_YC_SWAP(x)			((x & 0x1) << 20)
+#define s_RGA3_WR_CTRL_SW_WR_MODE(x)				((x & 0x3) << 0)
+#define s_RGA3_WR_CTRL_SW_WR_FBCE_SPARSE_EN(x)			((x & 0x1) << 2)
+#define s_RGA3_WR_CTRL_SW_WR_PIC_FORMAT(x)			((x & 0xf) << 4)
+#define s_RGA3_WR_CTRL_SW_WR_FORMAT(x)				((x & 0x3) << 8)
+#define s_RGA3_WR_CTRL_SW_WR_YUV10B_COMPACT(x)			((x & 0x1) << 10)
+#define s_RGA3_WR_CTRL_SW_WR_ENDIAN_MODE(x)			((x & 0x1) << 11)
+#define s_RGA3_WR_CTRL_SW_WR_PIX_SWAP(x)			((x & 0x1) << 12)
+#define s_RGA3_WR_CTRL_SW_OUTSTANDING_MAX(x)			((x & 0x3f) << 13)
+#define s_RGA3_WR_CTRL_SW_WR_YC_SWAP(x)				((x & 0x1) << 20)
 
 /* RGA3_WR_FBCE_CTRL */
-#define m_RGA3_WR_FBCE_CTRL_SW_WR_FBCE_BLKBD_OPT_DIS	(0x1 << 0)
+#define m_RGA3_WR_FBCE_CTRL_SW_WR_FBCE_BLKBD_OPT_DIS		(0x1 << 0)
 #define m_RGA3_WR_FBCE_CTRL_SW_WR_FBCE_HOFF_DISS		(0x1 << 1)
-#define m_RGA3_WR_FBCE_CTRL_SW_WR_FBCE_PL_FIFO0_WATERMARK	 (0x3f << 2)
-#define m_RGA3_WR_FBCE_CTRL_SW_WR_FBCE_PL_FIFO1_WATERMARK	 (0x3f << 8)
-#define m_RGA3_WR_FBCE_CTRL_SW_WR_FBCE_SIZE_ALIGN_DIS		 (0x1 << 31)
+#define m_RGA3_WR_FBCE_CTRL_SW_WR_FBCE_PL_FIFO0_WATERMARK	(0x3f << 2)
+#define m_RGA3_WR_FBCE_CTRL_SW_WR_FBCE_PL_FIFO1_WATERMARK	(0x3f << 8)
+#define m_RGA3_WR_FBCE_CTRL_SW_WR_FBCE_SIZE_ALIGN_DIS		(0x1 << 31)
 
-#define s_RGA3_WR_FBCE_CTRL_SW_WR_FBCE_BLKBD_OPT_DIS(x)	((x & 0x1) << 0)
+#define s_RGA3_WR_FBCE_CTRL_SW_WR_FBCE_BLKBD_OPT_DIS(x)		((x & 0x1) << 0)
 #define s_RGA3_WR_FBCE_CTRL_SW_WR_FBCE_HOFF_DISS(x)		((x & 0x1) << 1)
-#define s_RGA3_WR_FBCE_CTRL_SW_WR_FBCE_PL_FIFO0_WATERMARK(x) ((x & 0x3f) << 2)
-#define s_RGA3_WR_FBCE_CTRL_SW_WR_FBCE_PL_FIFO1_WATERMARK(x) ((x & 0x3f) << 8)
-#define s_RGA3_WR_FBCE_CTRL_SW_WR_FBCE_SIZE_ALIGN_DIS(x) ((x & 0x1) << 31)
+#define s_RGA3_WR_FBCE_CTRL_SW_WR_FBCE_PL_FIFO0_WATERMARK(x)	((x & 0x3f) << 2)
+#define s_RGA3_WR_FBCE_CTRL_SW_WR_FBCE_PL_FIFO1_WATERMARK(x)	((x & 0x3f) << 8)
+#define s_RGA3_WR_FBCE_CTRL_SW_WR_FBCE_SIZE_ALIGN_DIS(x)	((x & 0x1) << 31)
 
 /* RGA3_MMU_STATUS read_only */
-#define m_RGA3_MMU_STATUS_PAGING_ENABLED		(0x1 << 0)
-#define m_RGA3_MMU_STATUS_PAGE_FAULT_ACTIVE			 (0x1 << 1)
-#define m_RGA3_MMU_STATUS_STAIL_ACTIVE				 (0x1 << 2)
-#define m_RGA3_MMU_STATUS_MMU_IDLE			(0x1 << 3)
-#define m_RGA3_MMU_STATUS_REPLAY_BUFFER_EMPTY		 (0x1 << 4)
-#define m_RGA3_MMU_STATUS_PAGE_FAULT_IS_WRITE		 (0x1 << 5)
-#define m_RGA3_MMU_STATUS_PAGE_FAULT_BUS_ID			 (0x1f << 6)
+#define m_RGA3_MMU_STATUS_PAGING_ENABLED			(0x1 << 0)
+#define m_RGA3_MMU_STATUS_PAGE_FAULT_ACTIVE			(0x1 << 1)
+#define m_RGA3_MMU_STATUS_STAIL_ACTIVE				(0x1 << 2)
+#define m_RGA3_MMU_STATUS_MMU_IDLE				(0x1 << 3)
+#define m_RGA3_MMU_STATUS_REPLAY_BUFFER_EMPTY			(0x1 << 4)
+#define m_RGA3_MMU_STATUS_PAGE_FAULT_IS_WRITE			(0x1 << 5)
+#define m_RGA3_MMU_STATUS_PAGE_FAULT_BUS_ID			(0x1f << 6)
 
 /* RGA3_MMU_INT_RAWSTAT read_only */
-#define m_RGA3_MMU_INT_RAWSTAT_READ_BUS_ERROR		 (0x1 << 0)
-#define m_RGA3_MMU_INT_RAWSTAT_PAGE_FAULT			 (0x1 << 1)
+#define m_RGA3_MMU_INT_RAWSTAT_READ_BUS_ERROR			(0x1 << 0)
+#define m_RGA3_MMU_INT_RAWSTAT_PAGE_FAULT			(0x1 << 1)
 
 /* RGA3_MMU_INT_CLEAR write_only */
-#define m_RGA3_MMU_INT_CLEAR_READ_BUS_ERROR			 (0x1 << 0)
-#define m_RGA3_MMU_INT_CLEAR_PAGE_FAULT				 (0x1 << 1)
+#define m_RGA3_MMU_INT_CLEAR_READ_BUS_ERROR			(0x1 << 0)
+#define m_RGA3_MMU_INT_CLEAR_PAGE_FAULT				(0x1 << 1)
 
-#define s_RGA3_MMU_INT_CLEAR_READ_BUS_ERROR(x)		 ((x & 0x1) << 0)
-#define s_RGA3_MMU_INT_CLEAR_PAGE_FAULT(x)		((x & 0x1) << 1)
+#define s_RGA3_MMU_INT_CLEAR_READ_BUS_ERROR(x)			((x & 0x1) << 0)
+#define s_RGA3_MMU_INT_CLEAR_PAGE_FAULT(x)			((x & 0x1) << 1)
 
 /* RGA3_MMU_INT_MASK */
-#define m_RGA3_MMU_INT_MASK_READ_BUS_ERROR			 (0x1 << 0)
-#define m_RGA3_MMU_INT_MASK_PAGE_FAULT				 (0x1 << 1)
+#define m_RGA3_MMU_INT_MASK_READ_BUS_ERROR			(0x1 << 0)
+#define m_RGA3_MMU_INT_MASK_PAGE_FAULT				(0x1 << 1)
 
-#define s_RGA3_MMU_INT_MASK_READ_BUS_ERROR(x)		 ((x & 0x1) << 0)
-#define s_RGA3_MMU_INT_MASK_PAGE_FAULT(x)		((x & 0x1) << 1)
+#define s_RGA3_MMU_INT_MASK_READ_BUS_ERROR(x)			((x & 0x1) << 0)
+#define s_RGA3_MMU_INT_MASK_PAGE_FAULT(x)			((x & 0x1) << 1)
 
 /* RGA3_MMU_INT_STATUS read_only */
-#define m_RGA3_MMU_INT_STATUS_READ_BUS_ERROR		(0x1 << 0)
+#define m_RGA3_MMU_INT_STATUS_READ_BUS_ERROR			(0x1 << 0)
 #define m_RGA3_MMU_INT_STATUS_PAGE_FAULT			(0x1 << 1)
 
 /* RGA3_MMU_AUTO_GATING */
-#define m_RGA3_MMU_AUTO_GATING_MMU_AUTO_GATING		 (0x1 << 1)
-#define m_RGA3_MMU_AUTO_GATING_MMU_CFG_MODE		(0x1 << 1)
-#define m_RGA3_MMU_AUTO_GATING_MMU_BUG_FIXED_DISABLE	(0x1 << 31)
+#define m_RGA3_MMU_AUTO_GATING_MMU_AUTO_GATING			(0x1 << 1)
+#define m_RGA3_MMU_AUTO_GATING_MMU_CFG_MODE			(0x1 << 1)
+#define m_RGA3_MMU_AUTO_GATING_MMU_BUG_FIXED_DISABLE		(0x1 << 31)
 
-#define s_RGA3_MMU_AUTO_GATING_MMU_AUTO_GATING(x)	 ((x & 0x1) << 1)
-#define s_RGA3_MMU_AUTO_GATING_MMU_BUG_FIXED_DISABLE(x) ((x & 0x1) << 31)
+#define s_RGA3_MMU_AUTO_GATING_MMU_AUTO_GATING(x)		((x & 0x1) << 1)
+#define s_RGA3_MMU_AUTO_GATING_MMU_BUG_FIXED_DISABLE(x)		((x & 0x1) << 31)
 
-/* sys_reg */
-#define RGA3_SYS_CTRL_OFFSET			 0x000
-#define RGA3_CMD_CTRL_OFFSET			 0x004
-#define RGA3_CMD_ADDR_OFFSET			 0x008
-#define RGA3_MI_GROUP_CTRL_OFFSET		 0x00c
-#define RGA3_ARQOS_CTRL_OFFSET			 0x010
-#define RGA3_VERSION_NUM_OFFSET			 0x018
-#define RGA3_VERSION_TIM_OFFSET			 0x01c
-#define RGA3_INT_EN_OFFSET				 0x020
-#define RGA3_INT_RAW_OFFSET				 0x024
-#define RGA3_INT_MSK_OFFSET				 0x028
-#define RGA3_INT_CLR_OFFSET				 0x02c
-#define RGA3_RO_SRST_OFFSET				 0x030
-#define RGA3_STATUS0_OFFSET				 0x034
-#define RGA3_SCAN_CNT_OFFSET			 0x038
-#define RGA3_STATUS1_OFFSET				 0x03c
-#define RGA3_CMD_STATE_OFFSET			 0x040
+#define RGA3_ROT_BIT_ROT_90			BIT(0)
+#define RGA3_ROT_BIT_X_MIRROR			BIT(1)
+#define RGA3_ROT_BIT_Y_MIRROR			BIT(2)
 
-/* op_reg */
-#define RGA3_WIN0_RD_CTRL_OFFSET		 0x000
-#define RGA3_WIN0_Y_BASE_OFFSET			 0x010
-#define RGA3_WIN0_U_BASE_OFFSET			 0x014
-#define RGA3_WIN0_V_BASE_OFFSET			 0x018
-#define RGA3_WIN0_VIR_STRIDE_OFFSET		 0x01c
-#define RGA3_WIN0_FBC_OFF_OFFSET		 0x020
-#define RGA3_WIN0_SRC_SIZE_OFFSET		 0x024
-#define RGA3_WIN0_ACT_OFF_OFFSET		 0x028
-#define RGA3_WIN0_ACT_SIZE_OFFSET		 0x02c
-#define RGA3_WIN0_DST_SIZE_OFFSET		 0x030
-#define RGA3_WIN0_SCL_FAC_OFFSET		 0x034
-#define RGA3_WIN0_UV_VIR_STRIDE_OFFSET	 0x038
-#define RGA3_WIN1_RD_CTRL_OFFSET		 0x040
-#define RGA3_WIN1_Y_BASE_OFFSET			 0x050
-#define RGA3_WIN1_U_BASE_OFFSET			 0x054
-#define RGA3_WIN1_V_BASE_OFFSET			 0x058
-#define RGA3_WIN1_VIR_STRIDE_OFFSET		 0x05c
-#define RGA3_WIN1_FBC_OFF_OFFSET		 0x060
-#define RGA3_WIN1_SRC_SIZE_OFFSET		 0x064
-#define RGA3_WIN1_ACT_OFF_OFFSET		 0x068
-#define RGA3_WIN1_ACT_SIZE_OFFSET		 0x06c
-#define RGA3_WIN1_DST_SIZE_OFFSET		 0x070
-#define RGA3_WIN1_SCL_FAC_OFFSET		 0x074
-#define RGA3_WIN1_UV_VIR_STRIDE_OFFSET	 0x078
-#define RGA3_OVLP_CTRL_OFFSET			 0x080
-#define RGA3_OVLP_OFF_OFFSET			 0x084
-#define RGA3_OVLP_TOP_KEY_MIN_OFFSET	 0x088
-#define RGA3_OVLP_TOP_KEY_MAX_OFFSET	 0x08c
-#define RGA3_OVLP_TOP_CTRL_OFFSET		 0x090
-#define RGA3_OVLP_BOT_CTRL_OFFSET		 0x094
-#define RGA3_OVLP_TOP_ALPHA_OFFSET		 0x098
-#define RGA3_OVLP_BOT_ALPHA_OFFSET		 0x09c
-#define RGA3_WR_CTRL_OFFSET				 0x0a0
-#define RGA3_WR_FBCE_CTRL_OFFSET		 0x0a4
-#define RGA3_WR_VIR_STRIDE_OFFSET		 0x0a8
-#define RGA3_WR_PL_VIR_STRIDE_OFFSET	 0x0ac
-#define RGA3_WR_Y_BASE_OFFSET			 0x0b0
-#define RGA3_WR_U_BASE_OFFSET			 0x0b4
-#define RGA3_WR_V_BASE_OFFSET			 0x0b8
-#define RGA3_MMU_DTE_ADDR_OFFSET		 0x0f00
-#define RGA3_MMU_STATUS_OFFSET			 0x0f04
-#define RGA3_MMU_COMMAND_OFFSET			 0x0f08
-#define RGA3_MMU_PAGE_FAULT_ADDR_OFFSET	 0x0f0c
-#define RGA3_MMU_ZAP_ONE_LINE_OFFSET	 0x0f10
-#define RGA3_MMU_INT_RAWSTAT_OFFSET		 0x0f14
-#define RGA3_MMU_INT_CLEAR_OFFSET		 0x0f18
-#define RGA3_MMU_INT_MASK_OFFSET		 0x0f1c
-#define RGA3_MMU_INT_STATUS_OFFSET		 0x0f20
-#define RGA3_MMU_AUTO_GATING_OFFSET		 0x0f24
-#define RGA3_MMU_REG_LOAD_EN_OFFSET		 0x0f28
-
-#define RGA3_ROT_BIT_ROT_90	BIT(0)
-#define RGA3_ROT_BIT_X_MIRROR	BIT(1)
-#define RGA3_ROT_BIT_Y_MIRROR	BIT(2)
-
-int rga3_gen_reg_info(unsigned char *base, struct rga3_req *msg);
-void rga_cmd_to_rga3_cmd(struct rga_req *req_rga, struct rga3_req *req);
-//void RGA_MSG_2_RGA3_MSG_32(struct rga_req_32 *req_rga, struct rga3_req *req);
-
-void rga3_soft_reset(struct rga_scheduler_t *scheduler);
-int rga3_set_reg(struct rga_job *job, struct rga_scheduler_t *scheduler);
-int rga3_init_reg(struct rga_job *job);
-int rga3_get_version(struct rga_scheduler_t *scheduler);
+extern const struct rga_backend_ops rga3_ops;
 
 #endif
 
diff --git a/kernel/drivers/video/rockchip/rga3/include/rga_common.h b/kernel/drivers/video/rockchip/rga3/include/rga_common.h
index addd4cb..0b2ad9e 100644
--- a/kernel/drivers/video/rockchip/rga3/include/rga_common.h
+++ b/kernel/drivers/video/rockchip/rga3/include/rga_common.h
@@ -18,7 +18,11 @@
 bool rga_is_yuv_format(uint32_t format);
 bool rga_is_alpha_format(uint32_t format);
 bool rga_is_yuv420_packed_format(uint32_t format);
+bool rga_is_yuv420_planar_format(uint32_t format);
+bool rga_is_yuv420_semi_planar_format(uint32_t format);
 bool rga_is_yuv422_packed_format(uint32_t format);
+bool rga_is_yuv422_planar_format(uint32_t format);
+bool rga_is_yuv422_semi_planar_format(uint32_t format);
 bool rga_is_yuv8bit_format(uint32_t format);
 bool rga_is_yuv10bit_format(uint32_t format);
 bool rga_is_yuv422p_format(uint32_t format);
@@ -40,5 +44,7 @@
 void rga_swap_pd_mode(struct rga_req *req_rga);
 int rga_image_size_cal(int w, int h, int format,
 		       int *yrgb_size, int *uv_size, int *v_size);
+void rga_dump_memory_parm(struct rga_memory_parm *parm);
+void rga_dump_external_buffer(struct rga_external_buffer *buffer);
 
 #endif
diff --git a/kernel/drivers/video/rockchip/rga3/include/rga_debugger.h b/kernel/drivers/video/rockchip/rga3/include/rga_debugger.h
index 05d5f69..c274fe8 100644
--- a/kernel/drivers/video/rockchip/rga3/include/rga_debugger.h
+++ b/kernel/drivers/video/rockchip/rga3/include/rga_debugger.h
@@ -133,7 +133,6 @@
 
 void rga_cmd_print_debug_info(struct rga_req *req);
 void rga_request_task_debug_info(struct seq_file *m, struct rga_req *req);
-void rga_dump_external_buffer(struct rga_external_buffer *buffer);
 #ifdef CONFIG_NO_GKI
 void rga_dump_job_image(struct rga_job *dump_job);
 #else
diff --git a/kernel/drivers/video/rockchip/rga3/include/rga_drv.h b/kernel/drivers/video/rockchip/rga3/include/rga_drv.h
index 7f94456..29a64a6 100644
--- a/kernel/drivers/video/rockchip/rga3/include/rga_drv.h
+++ b/kernel/drivers/video/rockchip/rga3/include/rga_drv.h
@@ -16,6 +16,7 @@
 #include <linux/dma-mapping.h>
 #include <linux/err.h>
 #include <linux/fb.h>
+#include <linux/fdtable.h>
 #include <linux/fs.h>
 #include <linux/init.h>
 #include <linux/interrupt.h>
@@ -48,7 +49,6 @@
 
 #include <linux/iommu.h>
 #include <linux/iova.h>
-#include <linux/dma-iommu.h>
 #include <linux/pagemap.h>
 
 #ifdef CONFIG_DMABUF_CACHE
@@ -87,7 +87,7 @@
 
 #define DRIVER_MAJOR_VERISON		1
 #define DRIVER_MINOR_VERSION		2
-#define DRIVER_REVISION_VERSION		20
+#define DRIVER_REVISION_VERSION		26
 #define DRIVER_PATCH_VERSION
 
 #define DRIVER_VERSION (STR(DRIVER_MAJOR_VERISON) "." STR(DRIVER_MINOR_VERSION) \
@@ -135,6 +135,17 @@
 	RGA_SCHEDULER_IDLE = 0,
 	RGA_SCHEDULER_WORKING,
 	RGA_SCHEDULER_ABORT,
+};
+
+enum rga_job_state {
+	RGA_JOB_STATE_PENDING = 0,
+	RGA_JOB_STATE_PREPARE,
+	RGA_JOB_STATE_RUNNING,
+	RGA_JOB_STATE_FINISH,
+	RGA_JOB_STATE_DONE,
+	RGA_JOB_STATE_INTR_ERR,
+	RGA_JOB_STATE_HW_TIMEOUT,
+	RGA_JOB_STATE_ABORT,
 };
 
 struct rga_iommu_dma_cookie {
@@ -285,6 +296,12 @@
 	int ret;
 	pid_t pid;
 	bool use_batch_mode;
+
+	struct kref refcount;
+	unsigned long state;
+	uint32_t intr_status;
+	uint32_t hw_status;
+	uint32_t cmd_status;
 };
 
 struct rga_backend_ops {
@@ -292,6 +309,9 @@
 	int (*set_reg)(struct rga_job *job, struct rga_scheduler_t *scheduler);
 	int (*init_reg)(struct rga_job *job);
 	void (*soft_reset)(struct rga_scheduler_t *scheduler);
+	int (*read_back_reg)(struct rga_job *job, struct rga_scheduler_t *scheduler);
+	int (*irq)(struct rga_scheduler_t *scheduler);
+	int (*isr_thread)(struct rga_job *job, struct rga_scheduler_t *scheduler);
 };
 
 struct rga_timer {
@@ -421,8 +441,6 @@
 struct rga_match_data_t {
 	const char * const *clks;
 	int num_clks;
-	const struct rga_irqs_data_t *irqs;
-	int num_irqs;
 };
 
 static inline int rga_read(int offset, struct rga_scheduler_t *scheduler)
diff --git a/kernel/drivers/video/rockchip/rga3/include/rga_iommu.h b/kernel/drivers/video/rockchip/rga3/include/rga_iommu.h
index fd37377..b80a1f4 100644
--- a/kernel/drivers/video/rockchip/rga3/include/rga_iommu.h
+++ b/kernel/drivers/video/rockchip/rga3/include/rga_iommu.h
@@ -4,6 +4,42 @@
 
 #include "rga_drv.h"
 
+/* RGA_IOMMU register offsets */
+#define RGA_IOMMU_BASE				0xf00
+#define RGA_IOMMU_DTE_ADDR			(RGA_IOMMU_BASE + 0x00) /* Directory table address */
+#define RGA_IOMMU_STATUS			(RGA_IOMMU_BASE + 0x04)
+#define RGA_IOMMU_COMMAND			(RGA_IOMMU_BASE + 0x08)
+#define RGA_IOMMU_PAGE_FAULT_ADDR		(RGA_IOMMU_BASE + 0x0C) /* IOVA of last page fault */
+#define RGA_IOMMU_ZAP_ONE_LINE			(RGA_IOMMU_BASE + 0x10) /* Shootdown one IOTLB entry */
+#define RGA_IOMMU_INT_RAWSTAT			(RGA_IOMMU_BASE + 0x14) /* IRQ status ignoring mask */
+#define RGA_IOMMU_INT_CLEAR			(RGA_IOMMU_BASE + 0x18) /* Acknowledge and re-arm irq */
+#define RGA_IOMMU_INT_MASK			(RGA_IOMMU_BASE + 0x1C) /* IRQ enable */
+#define RGA_IOMMU_INT_STATUS			(RGA_IOMMU_BASE + 0x20) /* IRQ status after masking */
+#define RGA_IOMMU_AUTO_GATING			(RGA_IOMMU_BASE + 0x24)
+
+/* RGA_IOMMU_STATUS fields */
+#define RGA_IOMMU_STATUS_PAGING_ENABLED		BIT(0)
+#define RGA_IOMMU_STATUS_PAGE_FAULT_ACTIVE	BIT(1)
+#define RGA_IOMMU_STATUS_STALL_ACTIVE		BIT(2)
+#define RGA_IOMMU_STATUS_IDLE			BIT(3)
+#define RGA_IOMMU_STATUS_REPLAY_BUFFER_EMPTY	BIT(4)
+#define RGA_IOMMU_STATUS_PAGE_FAULT_IS_WRITE	BIT(5)
+#define RGA_IOMMU_STATUS_STALL_NOT_ACTIVE	BIT(31)
+
+/* RGA_IOMMU_COMMAND command values */
+#define RGA_IOMMU_CMD_ENABLE_PAGING		0 /* Enable memory translation */
+#define RGA_IOMMU_CMD_DISABLE_PAGING		1 /* Disable memory translation */
+#define RGA_IOMMU_CMD_ENABLE_STALL		2 /* Stall paging to allow other cmds */
+#define RGA_IOMMU_CMD_DISABLE_STALL		3 /* Stop stall re-enables paging */
+#define RGA_IOMMU_CMD_ZAP_CACHE			4 /* Shoot down entire IOTLB */
+#define RGA_IOMMU_CMD_PAGE_FAULT_DONE		5 /* Clear page fault */
+#define RGA_IOMMU_CMD_FORCE_RESET		6 /* Reset all registers */
+
+/* RGA_IOMMU_INT_* register fields */
+#define RGA_IOMMU_IRQ_PAGE_FAULT		0x01 /* page fault */
+#define RGA_IOMMU_IRQ_BUS_ERROR			0x02 /* bus read error */
+#define RGA_IOMMU_IRQ_MASK			(RGA_IOMMU_IRQ_PAGE_FAULT | RGA_IOMMU_IRQ_BUS_ERROR)
+
 /*
  * The maximum input is 8192*8192, the maximum output is 4096*4096
  * The size of physical pages requested is:
diff --git a/kernel/drivers/video/rockchip/rga3/include/rga_job.h b/kernel/drivers/video/rockchip/rga3/include/rga_job.h
index 214472e..0fc7761 100644
--- a/kernel/drivers/video/rockchip/rga3/include/rga_job.h
+++ b/kernel/drivers/video/rockchip/rga3/include/rga_job.h
@@ -21,12 +21,9 @@
 	RGA_JOB_UNSUPPORT_RGA_MMU	= 1 << 4,
 };
 
-struct rga_scheduler_t *rga_job_get_scheduler(struct rga_job *job);
-
-void rga_job_session_destroy(struct rga_session *session);
-
 void rga_job_scheduler_dump_info(struct rga_scheduler_t *scheduler);
-void rga_job_done(struct rga_scheduler_t *scheduler, int ret);
+void rga_job_next(struct rga_scheduler_t *scheduler);
+struct rga_job *rga_job_done(struct rga_scheduler_t *scheduler);
 struct rga_job *rga_job_commit(struct rga_req *rga_command_base, struct rga_request *request);
 int rga_job_mpi_commit(struct rga_req *rga_command_base, struct rga_request *request);
 
@@ -38,6 +35,7 @@
 				       uint32_t id);
 
 int rga_request_commit(struct rga_request *user_request);
+void rga_request_session_destroy_abort(struct rga_session *session);
 int rga_request_put(struct rga_request *request);
 void rga_request_get(struct rga_request *request);
 int rga_request_free(struct rga_request *request);
@@ -51,11 +49,5 @@
 
 int rga_request_manager_init(struct rga_pending_request_manager **request_manager_session);
 int rga_request_manager_remove(struct rga_pending_request_manager **request_manager_session);
-
-struct rga_job *
-rga_scheduler_get_pending_job_list(struct rga_scheduler_t *scheduler);
-
-struct rga_job *
-rga_scheduler_get_running_job(struct rga_scheduler_t *scheduler);
 
 #endif /* __LINUX_RKRGA_JOB_H_ */
diff --git a/kernel/drivers/video/rockchip/rga3/rga2_reg_info.c b/kernel/drivers/video/rockchip/rga3/rga2_reg_info.c
index 923c1f3..a624778 100644
--- a/kernel/drivers/video/rockchip/rga3/rga2_reg_info.c
+++ b/kernel/drivers/video/rockchip/rga3/rga2_reg_info.c
@@ -7,7 +7,6 @@
 
 #define pr_fmt(fmt) "rga2_reg: " fmt
 
-#include "rga_job.h"
 #include "rga2_reg_info.h"
 #include "rga_dma_buf.h"
 #include "rga_iommu.h"
@@ -165,12 +164,8 @@
 
 	bRGA_MODE_CTL = (u32 *) (base + RGA2_MODE_CTRL_OFFSET);
 
-	if (msg->render_mode == 4)
-		render_mode = 3;
-
-	/* In slave mode, the current frame completion interrupt must be enabled. */
-	if (!RGA2_USE_MASTER_MODE)
-		msg->CMD_fin_int_enable = 1;
+	if (msg->render_mode == UPDATE_PALETTE_TABLE_MODE)
+		render_mode = 0x3;
 
 	reg =
 		((reg & (~m_RGA2_MODE_CTRL_SW_RENDER_MODE)) |
@@ -231,6 +226,7 @@
 	u32 sw, sh;
 	u32 dw, dh;
 	u8 rotate_mode;
+	u8 vsp_scale_mode = 0;
 	u8 scale_w_flag, scale_h_flag;
 
 	bRGA_SRC_INFO = (u32 *) (base + RGA2_SRC_INFO_OFFSET);
@@ -292,6 +288,18 @@
 		/* uvvds need to force tile mode. */
 		if (msg->uvvds_mode && scale_w_flag == 0)
 			scale_w_flag = 3;
+	}
+
+	/* VSP scale mode select, HSD > VSD > VSP > HSP */
+	if (scale_h_flag == 0x2) {
+		/* After HSD, VSP needs to check dst_width */
+		if ((scale_w_flag == 0x1) && (dw < RGA2_VSP_BICUBIC_LIMIT))
+			vsp_scale_mode = 0x0;
+		else if (sw < RGA2_VSP_BICUBIC_LIMIT)
+			vsp_scale_mode = 0x0;
+		else
+			/* default select bilinear */
+			vsp_scale_mode = 0x1;
 	}
 
 	switch (msg->src.format) {
@@ -564,8 +572,7 @@
 		 ((msg->alpha_rop_flag >> 4) & 0x1)));
 	reg =
 		((reg & (~m_RGA2_SRC_INFO_SW_SW_VSP_MODE_SEL)) |
-		 (s_RGA2_SRC_INFO_SW_SW_VSP_MODE_SEL((
-			 msg->scale_bicu_mode >> 4))));
+		 (s_RGA2_SRC_INFO_SW_SW_VSP_MODE_SEL((vsp_scale_mode))));
 	reg =
 		((reg & (~m_RGA2_SRC_INFO_SW_SW_YUV10_E)) |
 		 (s_RGA2_SRC_INFO_SW_SW_YUV10_E((yuv10))));
@@ -1715,7 +1722,7 @@
 	*bRGA_MMU_ELS_BASE = (u32) (msg->mmu_info.els_base_addr) >> 4;
 }
 
-int rga2_gen_reg_info(u8 *base, struct rga2_req *msg)
+static int rga2_gen_reg_info(u8 *base, struct rga2_req *msg)
 {
 	u8 dst_nn_quantize_en = 0;
 
@@ -1847,9 +1854,6 @@
 		req->rotate_mode |= (3 << 4);
 		break;
 	}
-
-	if ((req->dst.act_w > 2048) && (req->src.act_h < req->dst.act_h))
-		req->scale_bicu_mode |= (1 << 4);
 
 	req->LUT_addr = req_rga->LUT_addr;
 	req->rop_mask_addr = req_rga->rop_mask_addr;
@@ -2060,16 +2064,18 @@
 	}
 }
 
-void rga2_soft_reset(struct rga_scheduler_t *scheduler)
+static void rga2_soft_reset(struct rga_scheduler_t *scheduler)
 {
 	u32 i;
 	u32 reg;
-	u32 iommu_dte_addr;
+	u32 iommu_dte_addr = 0;
 
 	if (scheduler->data->mmu == RGA_IOMMU)
-		iommu_dte_addr = rga_read(0xf00, scheduler);
+		iommu_dte_addr = rga_read(RGA_IOMMU_DTE_ADDR, scheduler);
 
-	rga_write((1 << 3) | (1 << 4) | (1 << 6), RGA2_SYS_CTRL, scheduler);
+	rga_write(m_RGA2_SYS_CTRL_ACLK_SRESET_P | m_RGA2_SYS_CTRL_CCLK_SRESET_P |
+		  m_RGA2_SYS_CTRL_RST_PROTECT_P,
+		  RGA2_SYS_CTRL, scheduler);
 
 	for (i = 0; i < RGA_RESET_TIMEOUT; i++) {
 		/* RGA_SYS_CTRL */
@@ -2082,13 +2088,16 @@
 	}
 
 	if (scheduler->data->mmu == RGA_IOMMU) {
-		rga_write(iommu_dte_addr, 0xf00, scheduler);
+		rga_write(iommu_dte_addr, RGA_IOMMU_DTE_ADDR, scheduler);
 		/* enable iommu */
-		rga_write(0, 0xf08, scheduler);
+		rga_write(RGA_IOMMU_CMD_ENABLE_PAGING, RGA_IOMMU_COMMAND, scheduler);
 	}
 
 	if (i == RGA_RESET_TIMEOUT)
-		pr_err("soft reset timeout.\n");
+		pr_err("RAG2 soft reset timeout.\n");
+	else
+		pr_info("RGA2 soft reset complete.\n");
+
 }
 
 static int rga2_check_param(const struct rga_hw_data *data, const struct rga2_req *req)
@@ -2215,7 +2224,7 @@
 	pr_info("yuv2rgb mode is %x\n", req->yuv2rgb_mode);
 }
 
-int rga2_init_reg(struct rga_job *job)
+static int rga2_init_reg(struct rga_job *job)
 {
 	struct rga2_req req;
 	int ret = 0;
@@ -2266,6 +2275,10 @@
 			return -EFAULT;
 		}
 	}
+
+	/* In slave mode, the current frame completion interrupt must be enabled. */
+	if (scheduler->data->mmu == RGA_IOMMU)
+		req.CMD_fin_int_enable = 1;
 
 	if (rga2_gen_reg_info((uint8_t *)job->cmd_reg, &req) == -1) {
 		pr_err("gen reg info error\n");
@@ -2338,7 +2351,7 @@
 			cmd_reg[2 + i * 4], cmd_reg[3 + i * 4]);
 }
 
-void rga2_dump_read_back_reg(struct rga_scheduler_t *scheduler)
+static void rga2_dump_read_back_reg(struct rga_scheduler_t *scheduler)
 {
 	rga2_dump_read_back_sys_reg(scheduler);
 	rga2_dump_read_back_csc_reg(scheduler);
@@ -2351,28 +2364,28 @@
 
 	if (job->pre_intr_info.read_intr_en) {
 		reg = s_RGA2_READ_LINE_SW_INTR_LINE_RD_TH(job->pre_intr_info.read_threshold);
-		rga_write(reg, RGA2_READ_LINE_CNT_OFFSET, scheduler);
+		rga_write(reg, RGA2_READ_LINE_CNT, scheduler);
 	}
 
 	if (job->pre_intr_info.write_intr_en) {
 		reg = s_RGA2_WRITE_LINE_SW_INTR_LINE_WR_START(job->pre_intr_info.write_start);
 		reg = ((reg & (~m_RGA2_WRITE_LINE_SW_INTR_LINE_WR_STEP)) |
 		       (s_RGA2_WRITE_LINE_SW_INTR_LINE_WR_STEP(job->pre_intr_info.write_step)));
-		rga_write(reg, RGA2_WRITE_LINE_CNT_OFFSET, scheduler);
+		rga_write(reg, RGA2_WRITE_LINE_CNT, scheduler);
 	}
 
-	reg = rga_read(RGA2_SYS_CTRL_OFFSET, scheduler);
-	reg = ((reg & (~m_RGA2_SYS_HOLD_MODE_EN)) |
-	       (s_RGA2_SYS_HOLD_MODE_EN(job->pre_intr_info.read_hold_en)));
-	rga_write(reg, RGA2_SYS_CTRL_OFFSET, scheduler);
+	reg = rga_read(RGA2_SYS_CTRL, scheduler);
+	reg = ((reg & (~m_RGA2_SYS_CTRL_HOLD_MODE_EN)) |
+	       (s_RGA2_SYS_CTRL_HOLD_MODE_EN(job->pre_intr_info.read_hold_en)));
+	rga_write(reg, RGA2_SYS_CTRL, scheduler);
 
-	reg = rga_read(RGA2_INT_OFFSET, scheduler);
+	reg = rga_read(RGA2_INT, scheduler);
 	reg = (reg | s_RGA2_INT_LINE_RD_CLEAR(0x1) | s_RGA2_INT_LINE_WR_CLEAR(0x1));
 	reg = ((reg & (~m_RGA2_INT_LINE_RD_EN)) |
 	       (s_RGA2_INT_LINE_RD_EN(job->pre_intr_info.read_intr_en)));
 	reg = ((reg & (~m_RGA2_INT_LINE_WR_EN)) |
 	       (s_RGA2_INT_LINE_WR_EN(job->pre_intr_info.write_intr_en)));
-	rga_write(reg, RGA2_INT_OFFSET, scheduler);
+	rga_write(reg, RGA2_INT, scheduler);
 }
 
 static void rga2_set_reg_full_csc(struct rga_job *job, struct rga_scheduler_t *scheduler)
@@ -2388,29 +2401,40 @@
 	/* full csc coefficient */
 	/* Y coefficient */
 	rga_write(job->full_csc.coe_y.r_v | (clip_y_max << 16) | (clip_y_min << 24),
-		  RGA2_DST_CSC_00_OFFSET, scheduler);
+		  RGA2_DST_CSC_00, scheduler);
 	rga_write(job->full_csc.coe_y.g_y | (clip_uv_max << 16) | (clip_uv_min << 24),
-		  RGA2_DST_CSC_01_OFFSET, scheduler);
-	rga_write(job->full_csc.coe_y.b_u, RGA2_DST_CSC_02_OFFSET, scheduler);
-	rga_write(job->full_csc.coe_y.off, RGA2_DST_CSC_OFF0_OFFSET, scheduler);
+		  RGA2_DST_CSC_01, scheduler);
+	rga_write(job->full_csc.coe_y.b_u, RGA2_DST_CSC_02, scheduler);
+	rga_write(job->full_csc.coe_y.off, RGA2_DST_CSC_OFF0, scheduler);
 
 	/* U coefficient */
-	rga_write(job->full_csc.coe_u.r_v, RGA2_DST_CSC_10_OFFSET, scheduler);
-	rga_write(job->full_csc.coe_u.g_y, RGA2_DST_CSC_11_OFFSET, scheduler);
-	rga_write(job->full_csc.coe_u.b_u, RGA2_DST_CSC_12_OFFSET, scheduler);
-	rga_write(job->full_csc.coe_u.off, RGA2_DST_CSC_OFF1_OFFSET, scheduler);
+	rga_write(job->full_csc.coe_u.r_v, RGA2_DST_CSC_10, scheduler);
+	rga_write(job->full_csc.coe_u.g_y, RGA2_DST_CSC_11, scheduler);
+	rga_write(job->full_csc.coe_u.b_u, RGA2_DST_CSC_12, scheduler);
+	rga_write(job->full_csc.coe_u.off, RGA2_DST_CSC_OFF1, scheduler);
 
 	/* V coefficient */
-	rga_write(job->full_csc.coe_v.r_v, RGA2_DST_CSC_20_OFFSET, scheduler);
-	rga_write(job->full_csc.coe_v.g_y, RGA2_DST_CSC_21_OFFSET, scheduler);
-	rga_write(job->full_csc.coe_v.b_u, RGA2_DST_CSC_22_OFFSET, scheduler);
-	rga_write(job->full_csc.coe_v.off, RGA2_DST_CSC_OFF2_OFFSET, scheduler);
+	rga_write(job->full_csc.coe_v.r_v, RGA2_DST_CSC_20, scheduler);
+	rga_write(job->full_csc.coe_v.g_y, RGA2_DST_CSC_21, scheduler);
+	rga_write(job->full_csc.coe_v.b_u, RGA2_DST_CSC_22, scheduler);
+	rga_write(job->full_csc.coe_v.off, RGA2_DST_CSC_OFF2, scheduler);
 }
 
-int rga2_set_reg(struct rga_job *job, struct rga_scheduler_t *scheduler)
+static int rga2_set_reg(struct rga_job *job, struct rga_scheduler_t *scheduler)
 {
-	ktime_t now = ktime_get();
 	int i;
+	bool master_mode_en;
+	uint32_t sys_ctrl;
+	ktime_t now = ktime_get();
+
+	/*
+	 * Currently there is no iova allocated for storing cmd for the IOMMU device,
+	 * so the iommu device needs to use the slave mode.
+	 */
+	if (scheduler->data->mmu != RGA_IOMMU)
+		master_mode_en = true;
+	else
+		master_mode_en = false;
 
 	if (job->pre_intr_info.enable)
 		rga2_set_pre_intr_reg(job, scheduler);
@@ -2419,7 +2443,7 @@
 		rga2_set_reg_full_csc(job, scheduler);
 
 	if (DEBUGGER_EN(REG)) {
-		int32_t *p;
+		uint32_t *p;
 
 		rga2_dump_read_back_sys_reg(scheduler);
 		rga2_dump_read_back_csc_reg(scheduler);
@@ -2434,42 +2458,44 @@
 
 	/* All CMD finish int */
 	rga_write(rga_read(RGA2_INT, scheduler) |
-		  (0x1 << 10) | (0x1 << 9) | (0x1 << 8), RGA2_INT, scheduler);
+		  m_RGA2_INT_ERROR_ENABLE_MASK | m_RGA2_INT_ALL_CMD_DONE_INT_EN,
+		  RGA2_INT, scheduler);
 
 	/* sys_reg init */
-	rga_write((0x1 << 2) | (0x1 << 5) | (0x1 << 6) | (0x1 << 11) | (0x1 << 12),
-		  RGA2_SYS_CTRL, scheduler);
+	sys_ctrl = m_RGA2_SYS_CTRL_AUTO_CKG | m_RGA2_SYS_CTRL_AUTO_RST |
+		   m_RGA2_SYS_CTRL_RST_PROTECT_P | m_RGA2_SYS_CTRL_DST_WR_OPT_DIS |
+		   m_RGA2_SYS_CTRL_SRC0YUV420SP_RD_OPT_DIS;
 
-	if (RGA2_USE_MASTER_MODE) {
+	if (master_mode_en) {
 		/* master mode */
-		rga_write(rga_read(RGA2_SYS_CTRL, scheduler) | (0x1 << 1),
-			  RGA2_SYS_CTRL, scheduler);
+		sys_ctrl |= s_RGA2_SYS_CTRL_CMD_MODE(1);
 
 		/* cmd buffer flush cache to ddr */
 		rga_dma_sync_flush_range(&job->cmd_reg[0], &job->cmd_reg[32], scheduler);
 
 		/* set cmd_addr */
 		rga_write(virt_to_phys(job->cmd_reg), RGA2_CMD_BASE, scheduler);
-
-		rga_write(1, RGA2_CMD_CTRL, scheduler);
+		rga_write(sys_ctrl, RGA2_SYS_CTRL, scheduler);
+		rga_write(m_RGA2_CMD_CTRL_CMD_LINE_ST_P, RGA2_CMD_CTRL, scheduler);
 	} else {
 		/* slave mode */
-		rga_write(rga_read(RGA2_SYS_CTRL, scheduler) | (0x0 << 1),
-			  RGA2_SYS_CTRL, scheduler);
+		sys_ctrl |= s_RGA2_SYS_CTRL_CMD_MODE(0) | m_RGA2_SYS_CTRL_CMD_OP_ST_P;
 
 		/* set cmd_reg */
 		for (i = 0; i <= 32; i++)
 			rga_write(job->cmd_reg[i], 0x100 + i * 4, scheduler);
 
-		rga_write(rga_read(RGA2_SYS_CTRL, scheduler) | 0x1, RGA2_SYS_CTRL, scheduler);
+		rga_write(sys_ctrl, RGA2_SYS_CTRL, scheduler);
 	}
 
-	if (DEBUGGER_EN(TIME)) {
-		pr_info("sys_ctrl = %x, int = %x, set cmd use time = %lld\n",
+	if (DEBUGGER_EN(REG))
+		pr_info("sys_ctrl = %x, int = %x\n",
 			rga_read(RGA2_SYS_CTRL, scheduler),
-			rga_read(RGA2_INT, scheduler),
+			rga_read(RGA2_INT, scheduler));
+
+	if (DEBUGGER_EN(TIME))
+		pr_info("set cmd use time = %lld\n",
 			ktime_us_delta(now, job->timestamp));
-	}
 
 	job->hw_running_time = now;
 	job->hw_recoder_time = now;
@@ -2480,7 +2506,7 @@
 	return 0;
 }
 
-int rga2_get_version(struct rga_scheduler_t *scheduler)
+static int rga2_get_version(struct rga_scheduler_t *scheduler)
 {
 	u32 major_version, minor_version, svn_version;
 	u32 reg_version;
@@ -2511,3 +2537,96 @@
 
 	return 0;
 }
+
+static int rga2_read_back_reg(struct rga_job *job, struct rga_scheduler_t *scheduler)
+{
+	if (job->rga_command_base.osd_info.enable) {
+		job->rga_command_base.osd_info.cur_flags0 = rga_read(RGA2_OSD_CUR_FLAGS0,
+								     scheduler);
+		job->rga_command_base.osd_info.cur_flags1 = rga_read(RGA2_OSD_CUR_FLAGS1,
+								     scheduler);
+	}
+
+	return 0;
+}
+
+static int rga2_irq(struct rga_scheduler_t *scheduler)
+{
+	struct rga_job *job = scheduler->running_job;
+
+	/* The hardware interrupt top-half don't need to lock the scheduler. */
+	if (job == NULL)
+		return IRQ_HANDLED;
+
+	if (test_bit(RGA_JOB_STATE_INTR_ERR, &job->state))
+		return IRQ_WAKE_THREAD;
+
+	job->intr_status = rga_read(RGA2_INT, scheduler);
+	job->hw_status = rga_read(RGA2_STATUS2, scheduler);
+	job->cmd_status = rga_read(RGA2_STATUS1, scheduler);
+
+	if (DEBUGGER_EN(INT_FLAG))
+		pr_info("irq handler, INTR[0x%x], HW_STATUS[0x%x], CMD_STATUS[0x%x]\n",
+			job->intr_status, job->hw_status, job->cmd_status);
+
+	if (job->intr_status &
+	    (m_RGA2_INT_CUR_CMD_DONE_INT_FLAG | m_RGA2_INT_ALL_CMD_DONE_INT_FLAG)) {
+		set_bit(RGA_JOB_STATE_FINISH, &job->state);
+	} else if (job->intr_status & m_RGA2_INT_ERROR_FLAG_MASK) {
+		set_bit(RGA_JOB_STATE_INTR_ERR, &job->state);
+
+		pr_err("irq handler err! INTR[0x%x], HW_STATUS[0x%x], CMD_STATUS[0x%x]\n",
+		       job->intr_status, job->hw_status, job->cmd_status);
+		scheduler->ops->soft_reset(scheduler);
+	}
+
+	/*clear INTR */
+	rga_write(rga_read(RGA2_INT, scheduler) |
+		  (m_RGA2_INT_ERROR_CLEAR_MASK |
+		   m_RGA2_INT_ALL_CMD_DONE_INT_CLEAR | m_RGA2_INT_NOW_CMD_DONE_INT_CLEAR |
+		   m_RGA2_INT_LINE_RD_CLEAR | m_RGA2_INT_LINE_WR_CLEAR),
+		  RGA2_INT, scheduler);
+
+	return IRQ_WAKE_THREAD;
+}
+
+static int rga2_isr_thread(struct rga_job *job, struct rga_scheduler_t *scheduler)
+{
+	if (DEBUGGER_EN(INT_FLAG))
+		pr_info("isr thread, INTR[0x%x], HW_STATUS[0x%x], CMD_STATUS[0x%x]\n",
+			rga_read(RGA2_INT, scheduler),
+			rga_read(RGA2_STATUS2, scheduler),
+			rga_read(RGA2_STATUS1, scheduler));
+
+	if (test_bit(RGA_JOB_STATE_INTR_ERR, &job->state)) {
+		if (job->hw_status & m_RGA2_STATUS2_RPP_ERROR)
+			pr_err("RGA current status: rpp error!\n");
+		if (job->hw_status & m_RGA2_STATUS2_BUS_ERROR)
+			pr_err("RGA current status: bus error!\n");
+
+		if (job->intr_status & m_RGA2_INT_ERROR_INT_FLAG) {
+			pr_err("RGA bus error intr, please check your configuration and buffer.\n");
+			job->ret = -EFAULT;
+		} else if (job->intr_status & m_RGA2_INT_MMU_INT_FLAG) {
+			pr_err("mmu failed, please check size of the buffer or whether the buffer has been freed.\n");
+			job->ret = -EACCES;
+		}
+
+		if (job->ret == 0) {
+			pr_err("rga intr error[0x%x]!\n", job->intr_status);
+			job->ret = -EFAULT;
+		}
+	}
+
+	return IRQ_HANDLED;
+}
+
+const struct rga_backend_ops rga2_ops = {
+	.get_version = rga2_get_version,
+	.set_reg = rga2_set_reg,
+	.init_reg = rga2_init_reg,
+	.soft_reset = rga2_soft_reset,
+	.read_back_reg = rga2_read_back_reg,
+	.irq = rga2_irq,
+	.isr_thread = rga2_isr_thread,
+};
diff --git a/kernel/drivers/video/rockchip/rga3/rga3_reg_info.c b/kernel/drivers/video/rockchip/rga3/rga3_reg_info.c
index e065b82..d462f98 100644
--- a/kernel/drivers/video/rockchip/rga3/rga3_reg_info.c
+++ b/kernel/drivers/video/rockchip/rga3/rga3_reg_info.c
@@ -8,6 +8,8 @@
 #define pr_fmt(fmt) "rga3_reg: " fmt
 
 #include "rga3_reg_info.h"
+#include "rga_dma_buf.h"
+#include "rga_iommu.h"
 #include "rga_common.h"
 #include "rga_debugger.h"
 #include "rga_hw_config.h"
@@ -91,14 +93,12 @@
 	dw = msg->win0.dst_act_w;
 	dh = msg->win0.dst_act_h;
 
-	if (msg->win0.rotate_mode != 0) {
-		if (rotate_mode) {
-			sh = msg->win0.src_act_w;
-			sw = msg->win0.src_act_h;
-		} else {
-			sw = msg->win0.src_act_w;
-			sh = msg->win0.src_act_h;
-		}
+	if (rotate_mode) {
+		sh = msg->win0.src_act_w;
+		sw = msg->win0.src_act_h;
+	} else {
+		sw = msg->win0.src_act_w;
+		sh = msg->win0.src_act_h;
 	}
 
 	if (sw > dw) {
@@ -289,7 +289,7 @@
 	}
 
 	/* rotate & mirror */
-	if (msg->win1.yrgb_addr == 0) {
+	if (msg->win0.rotate_mode == 1) {
 		reg =
 			((reg & (~m_RGA3_WIN0_RD_CTRL_SW_WIN0_ROT)) |
 			 (s_RGA3_WIN0_RD_CTRL_SW_WIN0_ROT(rotate_mode)));
@@ -299,36 +299,23 @@
 		reg =
 			((reg & (~m_RGA3_WIN0_RD_CTRL_SW_WIN0_YMIRROR)) |
 			 (s_RGA3_WIN0_RD_CTRL_SW_WIN0_YMIRROR(ymirror)));
-
-		/* scale */
-		*bRGA3_WIN0_SCL_FAC = param_x | param_y << 16;
-
-		reg =
-			((reg & (~m_RGA3_WIN0_RD_CTRL_SW_WIN0_HOR_BY)) |
-			 (s_RGA3_WIN0_RD_CTRL_SW_WIN0_HOR_BY(x_by)));
-		reg =
-			((reg & (~m_RGA3_WIN0_RD_CTRL_SW_WIN0_HOR_UP)) |
-			 (s_RGA3_WIN0_RD_CTRL_SW_WIN0_HOR_UP(x_up)));
-		reg =
-			((reg & (~m_RGA3_WIN0_RD_CTRL_SW_WIN0_VER_BY)) |
-			 (s_RGA3_WIN0_RD_CTRL_SW_WIN0_VER_BY(y_by)));
-		reg =
-			((reg & (~m_RGA3_WIN0_RD_CTRL_SW_WIN0_VER_UP)) |
-			 (s_RGA3_WIN0_RD_CTRL_SW_WIN0_VER_UP(y_up)));
-	} else {
-		reg =
-			((reg & (~m_RGA3_WIN0_RD_CTRL_SW_WIN0_HOR_BY)) |
-			 (s_RGA3_WIN0_RD_CTRL_SW_WIN0_HOR_BY(1)));
-		reg =
-			((reg & (~m_RGA3_WIN0_RD_CTRL_SW_WIN0_HOR_UP)) |
-			 (s_RGA3_WIN0_RD_CTRL_SW_WIN0_HOR_UP(0)));
-		reg =
-			((reg & (~m_RGA3_WIN0_RD_CTRL_SW_WIN0_VER_BY)) |
-			 (s_RGA3_WIN0_RD_CTRL_SW_WIN0_VER_BY(1)));
-		reg =
-			((reg & (~m_RGA3_WIN0_RD_CTRL_SW_WIN0_VER_UP)) |
-			 (s_RGA3_WIN0_RD_CTRL_SW_WIN0_VER_UP(0)));
 	}
+
+	/* scale */
+	*bRGA3_WIN0_SCL_FAC = param_x | param_y << 16;
+
+	reg =
+		((reg & (~m_RGA3_WIN0_RD_CTRL_SW_WIN0_HOR_BY)) |
+			(s_RGA3_WIN0_RD_CTRL_SW_WIN0_HOR_BY(x_by)));
+	reg =
+		((reg & (~m_RGA3_WIN0_RD_CTRL_SW_WIN0_HOR_UP)) |
+			(s_RGA3_WIN0_RD_CTRL_SW_WIN0_HOR_UP(x_up)));
+	reg =
+		((reg & (~m_RGA3_WIN0_RD_CTRL_SW_WIN0_VER_BY)) |
+			(s_RGA3_WIN0_RD_CTRL_SW_WIN0_VER_BY(y_by)));
+	reg =
+		((reg & (~m_RGA3_WIN0_RD_CTRL_SW_WIN0_VER_UP)) |
+			(s_RGA3_WIN0_RD_CTRL_SW_WIN0_VER_UP(y_up)));
 
 	/* rd_mode */
 	reg =
@@ -357,19 +344,36 @@
 
 	*bRGA3_WIN0_RD_CTRL = reg;
 
-	/* stride need align to 16 */
-	if (msg->win0.rd_mode != 1)
+	switch (msg->win0.rd_mode) {
+	case 0: /* raster */
 		stride = (((msg->win0.vir_w * pixel_width) + 15) & ~15) >> 2;
-	else
-		stride = ((msg->win0.vir_w + 15) & ~15) >> 2;
+		if (rga_is_yuv420_semi_planar_format(msg->win0.format))
+			uv_stride = ((msg->win0.vir_w + 15) & ~15) >> 2;
+		else
+			uv_stride = stride;
+		break;
 
-	if (msg->win0.format == RGA_FORMAT_YCbCr_420_SP
-		|| msg->win0.format == RGA_FORMAT_YCrCb_420_SP
-		|| msg->win0.format == RGA_FORMAT_YCbCr_420_SP_10B
-		|| msg->win0.format == RGA_FORMAT_YCrCb_420_SP_10B)
-		uv_stride = ((msg->win0.vir_w + 15) & ~15) >> 2;
-	else
-		uv_stride = stride;
+	case 1: /* fbc */
+		stride = ((msg->win0.vir_w + 15) & ~15) >> 2;
+		if (rga_is_yuv420_semi_planar_format(msg->win0.format))
+			uv_stride = ((msg->win0.vir_w + 15) & ~15) >> 2;
+		else
+			uv_stride = stride;
+		break;
+
+	case 2: /* tile 8*8 */
+		/*
+		 * tile 8*8 mode 8 lines of data are read/written at one time,
+		 * so stride needs * 8. YUV420 only has 4 lines of UV data, so
+		 * it needs to >>1.
+		 */
+		stride = (((msg->win0.vir_w * pixel_width * 8) + 15) & ~15) >> 2;
+		if (rga_is_yuv420_semi_planar_format(msg->win0.format))
+			uv_stride = ((((msg->win0.vir_w * 8) + 15) & ~15) >> 1) >> 2;
+		else
+			uv_stride = stride;
+		break;
+	}
 
 	*bRGA3_WIN0_Y_BASE = (u32) msg->win0.yrgb_addr;
 	*bRGA3_WIN0_U_BASE = (u32) msg->win0.uv_addr;
@@ -386,9 +390,9 @@
 	 */
 
 	/* do not use win0 src size except fbcd */
-	*bRGA3_WIN0_SRC_SIZE = (msg->win0.src_act_w +
-		msg->win0.x_offset) | ((msg->win0.y_offset +
-		msg->win0.src_act_h) << 16);
+	/* in FBCD, src_width needs to be aligned at 16 */
+	*bRGA3_WIN0_SRC_SIZE = ALIGN(msg->win0.src_act_w + msg->win0.x_offset, 16) |
+			       (ALIGN(msg->win0.y_offset + msg->win0.src_act_h, 16) << 16);
 	*bRGA3_WIN0_ACT_SIZE =
 		msg->win0.src_act_w | (msg->win0.src_act_h << 16);
 	*bRGA3_WIN0_DST_SIZE =
@@ -721,19 +725,31 @@
 
 	*bRGA3_WIN1_RD_CTRL = reg;
 
-	/* stride need align to 16 */
-	if (msg->win1.rd_mode != 1)
+	switch (msg->win1.rd_mode) {
+	case 0: /* raster */
 		stride = (((msg->win1.vir_w * pixel_width) + 15) & ~15) >> 2;
-	else
-		stride = ((msg->win1.vir_w + 15) & ~15) >> 2;
+		if (rga_is_yuv420_semi_planar_format(msg->win1.format))
+			uv_stride = ((msg->win1.vir_w + 15) & ~15) >> 2;
+		else
+			uv_stride = stride;
+		break;
 
-	if (msg->win1.format == RGA_FORMAT_YCbCr_420_SP
-		|| msg->win1.format == RGA_FORMAT_YCrCb_420_SP
-		|| msg->win1.format == RGA_FORMAT_YCbCr_420_SP_10B
-		|| msg->win1.format == RGA_FORMAT_YCrCb_420_SP_10B)
-		uv_stride = ((msg->win1.vir_w + 15) & ~15) >> 2;
-	else
-		uv_stride = stride;
+	case 1: /* fbc */
+		stride = ((msg->win1.vir_w + 15) & ~15) >> 2;
+		if (rga_is_yuv420_semi_planar_format(msg->win1.format))
+			uv_stride = ((msg->win1.vir_w + 15) & ~15) >> 2;
+		else
+			uv_stride = stride;
+		break;
+
+	case 2: /* tile 8*8 */
+		stride = (((msg->win1.vir_w * pixel_width * 8) + 15) & ~15) >> 2;
+		if (rga_is_yuv420_semi_planar_format(msg->win1.format))
+			uv_stride = ((((msg->win1.vir_w * 8) + 15) & ~15) >> 1) >> 2;
+		else
+			uv_stride = stride;
+		break;
+	}
 
 	*bRGA3_WIN1_Y_BASE = (u32) msg->win1.yrgb_addr;
 	*bRGA3_WIN1_U_BASE = (u32) msg->win1.uv_addr;
@@ -947,16 +963,20 @@
 	*bRGA3_WR_RD_CTRL = reg;
 	*bRGA3_WR_FBCD_CTRL = fbcd_reg;
 
-	/* stride need align to 16 */
-	if (msg->wr.rd_mode != 1) {
+	switch (msg->wr.rd_mode) {
+	case 0: /* raster */
 		stride = (((msg->wr.vir_w * pixel_width) + 15) & ~15) >> 2;
-		*bRGA3_WR_U_BASE = (u32) msg->wr.uv_addr;
 		uv_stride = ((msg->wr.vir_w + 15) & ~15) >> 2;
-	} else {
+
+		*bRGA3_WR_U_BASE = (u32) msg->wr.uv_addr;
+
+		break;
+
+	case 1: /* fbc */
 		stride = ((msg->wr.vir_w + 15) & ~15) >> 2;
 		/* need to calculate fbcd header size */
 		vir_h = ((msg->wr.vir_h + 15) & ~15);
-		*bRGA3_WR_U_BASE = (u32) (msg->wr.uv_addr + ((stride * vir_h)>>2));
+
 		/* RGBA8888 */
 		if (wr_format == 0x6)
 			uv_stride = ((msg->wr.vir_w + 15) & ~15);
@@ -972,6 +992,20 @@
 		/* yuv422 10bit */
 		else if (wr_format == 0x3)
 			uv_stride = (((msg->wr.vir_w + 15) & ~15) >> 3) * 5;
+
+		*bRGA3_WR_U_BASE = (u32) (msg->wr.uv_addr + ((stride * vir_h)>>2));
+
+		break;
+
+	case 2: /* tile 8*8 */
+		stride = (((msg->wr.vir_w * pixel_width * 8) + 15) & ~15) >> 2;
+		if (rga_is_yuv420_semi_planar_format(msg->win0.format))
+			uv_stride = ((((msg->wr.vir_w * 8) + 15) & ~15) >> 1) >> 2;
+		else
+			uv_stride = stride;
+
+		*bRGA3_WR_U_BASE = (u32) msg->wr.uv_addr;
+		break;
 	}
 
 	*bRGA3_WR_Y_BASE = (u32) msg->wr.yrgb_addr;
@@ -1141,7 +1175,7 @@
 	*bRGA3_OVLP_OFF = msg->wr.x_offset | (msg->wr.y_offset << 16);
 }
 
-int rga3_gen_reg_info(u8 *base, struct rga3_req *msg)
+static int rga3_gen_reg_info(u8 *base, struct rga3_req *msg)
 {
 	switch (msg->render_mode) {
 	case BITBLT_MODE:
@@ -1225,7 +1259,7 @@
 }
 
 /* TODO: common part */
-void rga_cmd_to_rga3_cmd(struct rga_req *req_rga, struct rga3_req *req)
+static void rga_cmd_to_rga3_cmd(struct rga_req *req_rga, struct rga3_req *req)
 {
 	u16 alpha_mode_0, alpha_mode_1;
 	struct rga_img_info_t tmp;
@@ -1385,18 +1419,18 @@
 			if (req->win0.x_offset || req->win0.y_offset) {
 				req->win0.src_act_w = req->win0.src_act_w + req->win0.x_offset;
 				req->win0.src_act_h = req->win0.src_act_h + req->win0.y_offset;
-				req->win0.dst_act_w = req_rga->pat.act_w + req->win0.x_offset;
-				req->win0.dst_act_h = req_rga->pat.act_h + req->win0.y_offset;
+				req->win0.dst_act_w = req_rga->dst.act_w + req->win0.x_offset;
+				req->win0.dst_act_h = req_rga->dst.act_h + req->win0.y_offset;
 
 				req->win0.x_offset = 0;
 				req->win0.y_offset = 0;
 			} else {
-				req->win0.dst_act_w = req_rga->pat.act_w;
-				req->win0.dst_act_h = req_rga->pat.act_h;
+				req->win0.dst_act_w = req_rga->dst.act_w;
+				req->win0.dst_act_h = req_rga->dst.act_h;
 			}
 			/* set win1 dst size */
-			req->win1.dst_act_w = req_rga->pat.act_w;
-			req->win1.dst_act_h = req_rga->pat.act_h;
+			req->win1.dst_act_w = req_rga->dst.act_w;
+			req->win1.dst_act_h = req_rga->dst.act_h;
 		} else {
 			/* A+B->B mode */
 			set_win_info(&req->win0, &req_rga->dst);
@@ -1589,54 +1623,38 @@
 	}
 }
 
-void rga3_soft_reset(struct rga_scheduler_t *scheduler)
+static void rga3_soft_reset(struct rga_scheduler_t *scheduler)
 {
 	u32 i;
-	u32 reg;
-	u32 mmu_addr;
+	u32 iommu_dte_addr = 0;
 
-	mmu_addr = rga_read(0xf00, scheduler);
+	if (scheduler->data->mmu == RGA_IOMMU)
+		iommu_dte_addr = rga_read(RGA_IOMMU_DTE_ADDR, scheduler);
 
-	rga_write((1 << 3) | (1 << 4), RGA3_SYS_CTRL, scheduler);
-
-	pr_err("soft reset sys_ctrl = %x, ro_rest = %x",
-		rga_read(RGA3_SYS_CTRL, scheduler),
-		rga_read(RGA3_RO_SRST, scheduler));
-
-	mdelay(20);
-
-	pr_err("soft reset sys_ctrl = %x, ro_rest = %x",
-		rga_read(RGA3_SYS_CTRL, scheduler),
-		rga_read(RGA3_RO_SRST, scheduler));
-
-	rga_write((0 << 3) | (0 << 4), RGA3_SYS_CTRL, scheduler);
-
-	pr_err("soft after reset sys_ctrl = %x, ro_rest = %x",
-		rga_read(RGA3_SYS_CTRL, scheduler),
-		rga_read(RGA3_RO_SRST, scheduler));
-
-	rga_write(1, RGA3_INT_CLR, scheduler);
-
-	rga_write(mmu_addr, 0xf00, scheduler);
-	rga_write(0, 0xf08, scheduler);
-
-	if (DEBUGGER_EN(INT_FLAG))
-		pr_info("irq INT[%x], STATS0[%x], STATS1[%x]\n",
-			rga_read(RGA3_INT_RAW, scheduler),
-			rga_read(RGA3_STATUS0, scheduler),
-			rga_read(RGA3_STATUS1, scheduler));
+	rga_write(s_RGA3_SYS_CTRL_CCLK_SRESET(1) | s_RGA3_SYS_CTRL_ACLK_SRESET(1),
+		  RGA3_SYS_CTRL, scheduler);
 
 	for (i = 0; i < RGA_RESET_TIMEOUT; i++) {
-		reg = rga_read(RGA3_SYS_CTRL, scheduler) & 1;
-
-		if (reg == 0)
+		if (rga_read(RGA3_RO_SRST, scheduler) & m_RGA3_RO_SRST_RO_RST_DONE)
 			break;
 
 		udelay(1);
 	}
 
+	rga_write(s_RGA3_SYS_CTRL_CCLK_SRESET(0) | s_RGA3_SYS_CTRL_ACLK_SRESET(0),
+		  RGA3_SYS_CTRL, scheduler);
+
+	if (scheduler->data->mmu == RGA_IOMMU) {
+		rga_write(iommu_dte_addr, RGA_IOMMU_DTE_ADDR, scheduler);
+		/* enable iommu */
+		rga_write(RGA_IOMMU_CMD_ENABLE_PAGING, RGA_IOMMU_COMMAND, scheduler);
+	}
+
 	if (i == RGA_RESET_TIMEOUT)
-		pr_err("soft reset timeout.\n");
+		pr_err("RGA3 soft reset timeout. SYS_CTRL[0x%x], RO_SRST[0x%x]\n",
+		       rga_read(RGA3_SYS_CTRL, scheduler), rga_read(RGA3_RO_SRST, scheduler));
+	else
+		pr_info("RGA3 soft reset complete.\n");
 }
 
 static int rga3_scale_check(const struct rga3_req *req)
@@ -1836,7 +1854,7 @@
 	return 0;
 }
 
-int rga3_init_reg(struct rga_job *job)
+static int rga3_init_reg(struct rga_job *job)
 {
 	struct rga3_req req;
 	int ret = 0;
@@ -1893,29 +1911,24 @@
 			cmd_reg[2 + i * 4], cmd_reg[3 + i * 4]);
 }
 
-int rga3_set_reg(struct rga_job *job, struct rga_scheduler_t *scheduler)
+static int rga3_set_reg(struct rga_job *job, struct rga_scheduler_t *scheduler)
 {
+	int i;
+	bool master_mode_en;
+	uint32_t sys_ctrl;
 	ktime_t now = ktime_get();
 
-	//rga_dma_flush_range(&job->cmd_reg[0], &job->cmd_reg[50], scheduler);
-
-	rga_write(0x0, RGA3_SYS_CTRL, scheduler);
-
-#if 0
-	/* CMD buff */
-	rga_write(virt_to_phys(job->cmd_reg), RGA3_CMD_ADDR, scheduler);
-#else
-	{
-		int32_t m, *cmd;
-
-		cmd = job->cmd_reg;
-		for (m = 0; m <= 50; m++)
-			rga_write(cmd[m], 0x100 + m * 4, scheduler);
-	}
-#endif
+	/*
+	 * Currently there is no iova allocated for storing cmd for the IOMMU device,
+	 * so the iommu device needs to use the slave mode.
+	 */
+	if (scheduler->data->mmu != RGA_IOMMU)
+		master_mode_en = true;
+	else
+		master_mode_en = false;
 
 	if (DEBUGGER_EN(REG)) {
-		int32_t i, *p;
+		uint32_t *p;
 
 		p = job->cmd_reg;
 		pr_info("CMD_REG\n");
@@ -1925,27 +1938,39 @@
 				p[2 + i * 4], p[3 + i * 4]);
 	}
 
-#if 0
-	/* master mode */
-	rga_write((0x1 << 1) | (0x1 << 2) | (0x1 << 5) | (0x1 << 6),
-		 RGA3_SYS_CTRL, scheduler);
-#else
-	/* slave mode */
-	//rga_write(1, 0xf08, scheduler);
-#endif
-
 	/* All CMD finish int */
-	rga_write(1, RGA3_INT_EN, scheduler);
+	rga_write(m_RGA3_INT_FRM_DONE | m_RGA3_INT_CMD_LINE_FINISH | m_RGA3_INT_ERROR_MASK,
+		  RGA3_INT_EN, scheduler);
 
-	if (DEBUGGER_EN(MSG)) {
-		pr_info("sys_ctrl = %x, int_en = %x, int_raw = %x\n",
+	if (master_mode_en) {
+		/* master mode */
+		sys_ctrl = s_RGA3_SYS_CTRL_CMD_MODE(1);
+
+		/* cmd buffer flush cache to ddr */
+		rga_dma_sync_flush_range(&job->cmd_reg[0], &job->cmd_reg[50], scheduler);
+
+		rga_write(virt_to_phys(job->cmd_reg), RGA3_CMD_ADDR, scheduler);
+		rga_write(sys_ctrl, RGA3_SYS_CTRL, scheduler);
+		rga_write(m_RGA3_CMD_CTRL_CMD_LINE_ST_P, RGA3_CMD_CTRL, scheduler);
+	} else {
+		/* slave mode */
+		sys_ctrl = s_RGA3_SYS_CTRL_CMD_MODE(0) | m_RGA3_SYS_CTRL_RGA_SART;
+
+		for (i = 0; i <= 50; i++)
+			rga_write(job->cmd_reg[i], 0x100 + i * 4, scheduler);
+
+		rga_write(sys_ctrl, RGA3_SYS_CTRL, scheduler);
+	}
+
+	if (DEBUGGER_EN(REG)) {
+		pr_info("sys_ctrl = 0x%x, int_en = 0x%x, int_raw = 0x%x\n",
 			rga_read(RGA3_SYS_CTRL, scheduler),
 			rga_read(RGA3_INT_EN, scheduler),
 			rga_read(RGA3_INT_RAW, scheduler));
 
-		pr_info("status0 = %x, status1 = %x\n",
+		pr_info("hw_status = 0x%x, cmd_status = 0x%x\n",
 			rga_read(RGA3_STATUS0, scheduler),
-			rga_read(RGA3_STATUS1, scheduler));
+			rga_read(RGA3_CMD_STATE, scheduler));
 	}
 
 	if (DEBUGGER_EN(TIME))
@@ -1954,15 +1979,13 @@
 	job->hw_running_time = now;
 	job->hw_recoder_time = now;
 
-	rga_write(1, RGA3_SYS_CTRL, scheduler);
-
 	if (DEBUGGER_EN(REG))
 		rga3_dump_read_back_reg(scheduler);
 
 	return 0;
 }
 
-int rga3_get_version(struct rga_scheduler_t *scheduler)
+static int rga3_get_version(struct rga_scheduler_t *scheduler)
 {
 	u32 major_version, minor_version, svn_version;
 	u32 reg_version;
@@ -1987,3 +2010,80 @@
 
 	return 0;
 }
+
+static int rga3_irq(struct rga_scheduler_t *scheduler)
+{
+	struct rga_job *job = scheduler->running_job;
+
+	if (job == NULL)
+		return IRQ_HANDLED;
+
+	if (test_bit(RGA_JOB_STATE_INTR_ERR, &job->state))
+		return IRQ_WAKE_THREAD;
+
+	job->intr_status = rga_read(RGA3_INT_RAW, scheduler);
+	job->hw_status = rga_read(RGA3_STATUS0, scheduler);
+	job->cmd_status = rga_read(RGA3_CMD_STATE, scheduler);
+
+	if (DEBUGGER_EN(INT_FLAG))
+		pr_info("irq handler, INTR[0x%x], HW_STATUS[0x%x], CMD_STATUS[0x%x]\n",
+			job->intr_status, job->hw_status, job->cmd_status);
+
+	if (job->intr_status & (m_RGA3_INT_FRM_DONE | m_RGA3_INT_CMD_LINE_FINISH)) {
+		set_bit(RGA_JOB_STATE_FINISH, &job->state);
+	} else if (job->intr_status & m_RGA3_INT_ERROR_MASK) {
+		set_bit(RGA_JOB_STATE_INTR_ERR, &job->state);
+
+		pr_err("irq handler err! INTR[0x%x], HW_STATUS[0x%x], CMD_STATUS[0x%x]\n",
+		       job->intr_status, job->hw_status, job->cmd_status);
+		scheduler->ops->soft_reset(scheduler);
+	}
+
+	/*clear INTR */
+	rga_write(m_RGA3_INT_FRM_DONE | m_RGA3_INT_CMD_LINE_FINISH | m_RGA3_INT_ERROR_MASK,
+		  RGA3_INT_CLR, scheduler);
+
+	return IRQ_WAKE_THREAD;
+}
+
+static int rga3_isr_thread(struct rga_job *job, struct rga_scheduler_t *scheduler)
+{
+	if (DEBUGGER_EN(INT_FLAG))
+		pr_info("isr thread, INTR[0x%x], HW_STATUS[0x%x], CMD_STATUS[0x%x]\n",
+			rga_read(RGA3_INT_RAW, scheduler),
+			rga_read(RGA3_STATUS0, scheduler),
+			rga_read(RGA3_CMD_STATE, scheduler));
+
+	if (test_bit(RGA_JOB_STATE_INTR_ERR, &job->state)) {
+		if (job->intr_status & m_RGA3_INT_RAG_MI_RD_BUS_ERR) {
+			pr_err("DMA read bus error, please check size of the input_buffer or whether the buffer has been freed.\n");
+			job->ret = -EFAULT;
+		} else if (job->intr_status & m_RGA3_INT_WIN0_FBCD_DEC_ERR) {
+			pr_err("win0 FBC decoder error, please check the fbc image of the source.\n");
+			job->ret = -EFAULT;
+		} else if (job->intr_status & m_RGA3_INT_WIN1_FBCD_DEC_ERR) {
+			pr_err("win1 FBC decoder error, please check the fbc image of the source.\n");
+			job->ret = -EFAULT;
+		} else if (job->intr_status & m_RGA3_INT_RGA_MI_WR_BUS_ERR) {
+			pr_err("wr buss error, please check size of the output_buffer or whether the buffer has been freed.\n");
+			job->ret = -EFAULT;
+		}
+
+		if (job->ret == 0) {
+			pr_err("rga intr error[0x%x]!\n", job->intr_status);
+			job->ret = -EFAULT;
+		}
+	}
+
+	return IRQ_HANDLED;
+}
+
+const struct rga_backend_ops rga3_ops = {
+	.get_version = rga3_get_version,
+	.set_reg = rga3_set_reg,
+	.init_reg = rga3_init_reg,
+	.soft_reset = rga3_soft_reset,
+	.read_back_reg = NULL,
+	.irq = rga3_irq,
+	.isr_thread = rga3_isr_thread,
+};
diff --git a/kernel/drivers/video/rockchip/rga3/rga_common.c b/kernel/drivers/video/rockchip/rga3/rga_common.c
index 0e21326..dfe1103 100644
--- a/kernel/drivers/video/rockchip/rga3/rga_common.c
+++ b/kernel/drivers/video/rockchip/rga3/rga_common.c
@@ -107,6 +107,30 @@
 	}
 }
 
+bool rga_is_yuv420_planar_format(uint32_t format)
+{
+	switch (format) {
+	case RGA_FORMAT_YCbCr_420_P:
+	case RGA_FORMAT_YCrCb_420_P:
+		return true;
+	default:
+		return false;
+	}
+}
+
+bool rga_is_yuv420_semi_planar_format(uint32_t format)
+{
+	switch (format) {
+	case RGA_FORMAT_YCbCr_420_SP:
+	case RGA_FORMAT_YCrCb_420_SP:
+	case RGA_FORMAT_YCbCr_420_SP_10B:
+	case RGA_FORMAT_YCrCb_420_SP_10B:
+		return true;
+	default:
+		return false;
+	}
+}
+
 bool rga_is_yuv422_packed_format(uint32_t format)
 {
 	switch (format) {
@@ -114,6 +138,30 @@
 	case RGA_FORMAT_VYUY_422:
 	case RGA_FORMAT_YUYV_422:
 	case RGA_FORMAT_UYVY_422:
+		return true;
+	default:
+		return false;
+	}
+}
+
+bool rga_is_yuv422_planar_format(uint32_t format)
+{
+	switch (format) {
+	case RGA_FORMAT_YCbCr_422_P:
+	case RGA_FORMAT_YCrCb_422_P:
+		return true;
+	default:
+		return false;
+	}
+}
+
+bool rga_is_yuv422_semi_planar_format(uint32_t format)
+{
+	switch (format) {
+	case RGA_FORMAT_YCbCr_422_SP:
+	case RGA_FORMAT_YCrCb_422_SP:
+	case RGA_FORMAT_YCbCr_422_SP_10B:
+	case RGA_FORMAT_YCrCb_422_SP_10B:
 		return true;
 	default:
 		return false;
@@ -665,3 +713,17 @@
 
 	return (yrgb + uv + v);
 }
+
+void rga_dump_memory_parm(struct rga_memory_parm *parm)
+{
+	pr_info("memory param: w = %d, h = %d, f = %s(0x%x), size = %d\n",
+		parm->width, parm->height, rga_get_format_name(parm->format),
+		parm->format, parm->size);
+}
+
+void rga_dump_external_buffer(struct rga_external_buffer *buffer)
+{
+	pr_info("external: memory = 0x%lx, type = %s\n",
+		(unsigned long)buffer->memory, rga_get_memory_type_str(buffer->type));
+	rga_dump_memory_parm(&buffer->memory_parm);
+}
diff --git a/kernel/drivers/video/rockchip/rga3/rga_debugger.c b/kernel/drivers/video/rockchip/rga3/rga_debugger.c
index 068e0cc..fe21031 100644
--- a/kernel/drivers/video/rockchip/rga3/rga_debugger.c
+++ b/kernel/drivers/video/rockchip/rga3/rga_debugger.c
@@ -621,7 +621,11 @@
 #ifdef CONFIG_ROCKCHIP_RGA_PROC_FS
 static int rga_procfs_open(struct inode *inode, struct file *file)
 {
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 1, 0)
+	struct rga_debugger_node *node = pde_data(inode);
+#else
 	struct rga_debugger_node *node = PDE_DATA(inode);
+#endif
 
 	return single_open(file, node->info_ent->show, node);
 }
@@ -826,16 +830,6 @@
 		req->core, req->priority, req->in_fence_fd);
 }
 
-void rga_dump_external_buffer(struct rga_external_buffer *buffer)
-{
-	pr_info("external: memory = 0x%lx, type = %s\n",
-		(unsigned long)buffer->memory, rga_get_memory_type_str(buffer->type));
-	pr_info("param: w = %d, h = %d, f = %s, size = %d\n",
-		buffer->memory_parm.width, buffer->memory_parm.height,
-		rga_get_format_name(buffer->memory_parm.format),
-		buffer->memory_parm.size);
-}
-
 #ifdef CONFIG_NO_GKI
 static int rga_dump_image_to_file(struct rga_internal_buffer *dump_buffer,
 				  const char *channel_name,
@@ -846,6 +840,10 @@
 	struct file *file;
 	size_t size = 0;
 	loff_t pos = 0;
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 1, 0)
+	int ret;
+	struct iosys_map map;
+#endif
 	void *kvaddr = NULL;
 	void *kvaddr_origin = NULL;
 
@@ -858,7 +856,12 @@
 			return -EINVAL;
 		}
 
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 1, 0)
+		ret = dma_buf_vmap(dump_buffer->dma_buffer->dma_buf, &map);
+		kvaddr = ret ? NULL : map.vaddr;
+#else
 		kvaddr = dma_buf_vmap(dump_buffer->dma_buffer->dma_buf);
+#endif
 		if (!kvaddr) {
 			pr_err("can't vmap the dma buffer!\n");
 			return -EINVAL;
@@ -928,7 +931,11 @@
 	switch (dump_buffer->type) {
 	case RGA_DMA_BUFFER:
 	case RGA_DMA_BUFFER_PTR:
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 1, 0)
+		dma_buf_vunmap(dump_buffer->dma_buffer->dma_buf, &map);
+#else
 		dma_buf_vunmap(dump_buffer->dma_buffer->dma_buf, kvaddr_origin);
+#endif
 		break;
 	case RGA_VIRTUAL_ADDRESS:
 		vunmap(kvaddr_origin);
diff --git a/kernel/drivers/video/rockchip/rga3/rga_dma_buf.c b/kernel/drivers/video/rockchip/rga3/rga_dma_buf.c
index b5b0dd0..db34db5 100644
--- a/kernel/drivers/video/rockchip/rga3/rga_dma_buf.c
+++ b/kernel/drivers/video/rockchip/rga3/rga_dma_buf.c
@@ -203,15 +203,14 @@
 					    size_t size, u64 dma_limit,
 					    struct device *dev)
 {
-	struct rga_iommu_dma_cookie *cookie = domain->iova_cookie;
+	struct rga_iommu_dma_cookie *cookie = (void *)domain->iova_cookie;
 	struct iova_domain *iovad = &cookie->iovad;
 	unsigned long shift, iova_len, iova = 0;
-#if (LINUX_VERSION_CODE < KERNEL_VERSION(5, 4, 0))
-	dma_addr_t limit;
-#endif
 
 	shift = iova_shift(iovad);
 	iova_len = size >> shift;
+
+#if (LINUX_VERSION_CODE < KERNEL_VERSION(6, 1, 0))
 	/*
 	 * Freeing non-power-of-two-sized allocations back into the IOVA caches
 	 * will come back to bite us badly, so we have to waste a bit of space
@@ -220,6 +219,7 @@
 	 */
 	if (iova_len < (1 << (IOVA_RANGE_CACHE_MAX_SIZE - 1)))
 		iova_len = roundup_pow_of_two(iova_len);
+#endif
 
 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 10, 0))
 	dma_limit = min_not_zero(dma_limit, dev->bus_dma_limit);
@@ -231,12 +231,13 @@
 	if (domain->geometry.force_aperture)
 		dma_limit = min(dma_limit, (u64)domain->geometry.aperture_end);
 
-#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 4, 0))
-	iova = alloc_iova_fast(iovad, iova_len, dma_limit >> shift, true);
+#if (LINUX_VERSION_CODE > KERNEL_VERSION(4, 19, 111) && \
+     LINUX_VERSION_CODE < KERNEL_VERSION(5, 4, 0))
+	iova = alloc_iova_fast(iovad, iova_len,
+			       min_t(dma_addr_t, dma_limit >> shift, iovad->end_pfn),
+			       true);
 #else
-	limit = min_t(dma_addr_t, dma_limit >> shift, iovad->end_pfn);
-
-	iova = alloc_iova_fast(iovad, iova_len, limit, true);
+	iova = alloc_iova_fast(iovad, iova_len, dma_limit >> shift, true);
 #endif
 
 	return (dma_addr_t)iova << shift;
@@ -245,7 +246,7 @@
 static void rga_iommu_dma_free_iova(struct iommu_domain *domain,
 				    dma_addr_t iova, size_t size)
 {
-	struct rga_iommu_dma_cookie *cookie = domain->iova_cookie;
+	struct rga_iommu_dma_cookie *cookie = (void *)domain->iova_cookie;
 	struct iova_domain *iovad = &cookie->iovad;
 
 	free_iova_fast(iovad, iova_pfn(iovad, iova), size >> iova_shift(iovad));
@@ -284,7 +285,7 @@
 	}
 
 	domain = rga_iommu_get_dma_domain(rga_dev);
-	cookie = domain->iova_cookie;
+	cookie = (void *)domain->iova_cookie;
 	iovad = &cookie->iovad;
 	align_size = iova_align(iovad, size);
 
@@ -329,7 +330,7 @@
 	}
 
 	domain = rga_iommu_get_dma_domain(rga_dev);
-	cookie = domain->iova_cookie;
+	cookie = (void *)domain->iova_cookie;
 	iovad = &cookie->iovad;
 	align_size = iova_align(iovad, size);
 
@@ -393,12 +394,20 @@
 {
 	int ret = 0;
 	void *vaddr;
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 1, 0)
+	struct iosys_map map;
+#endif
 	struct dma_buf *dma_buf;
 
 	dma_buf = rga_dma_buffer->dma_buf;
 
 	if (!IS_ERR_OR_NULL(dma_buf)) {
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 1, 0)
+		ret = dma_buf_vmap(dma_buf, &map);
+		vaddr = ret ? NULL : map.vaddr;
+#else
 		vaddr = dma_buf_vmap(dma_buf);
+#endif
 		if (vaddr) {
 			ret = rga_virtual_memory_check(vaddr, img->vir_w,
 				img->vir_h, img->format, img->yrgb_addr);
@@ -406,8 +415,11 @@
 			pr_err("can't vmap the dma buffer!\n");
 			return -EINVAL;
 		}
-
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 1, 0)
+		dma_buf_vunmap(dma_buf, &map);
+#else
 		dma_buf_vunmap(dma_buf, vaddr);
+#endif
 	}
 
 	return ret;
@@ -424,21 +436,21 @@
 	if (dma_buf != NULL) {
 		get_dma_buf(dma_buf);
 	} else {
-		pr_err("dma_buf is Invalid[%p]\n", dma_buf);
+		pr_err("dma_buf is invalid[%p]\n", dma_buf);
 		return -EINVAL;
 	}
 
 	attach = dma_buf_attach(dma_buf, rga_dev);
 	if (IS_ERR(attach)) {
-		pr_err("Failed to attach dma_buf\n");
-		ret = -EINVAL;
+		ret = PTR_ERR(attach);
+		pr_err("Failed to attach dma_buf, ret[%d]\n", ret);
 		goto err_get_attach;
 	}
 
 	sgt = dma_buf_map_attachment(attach, dir);
 	if (IS_ERR(sgt)) {
-		pr_err("Failed to map src attachment\n");
-		ret = -EINVAL;
+		ret = PTR_ERR(sgt);
+		pr_err("Failed to map attachment, ret[%d]\n", ret);
 		goto err_get_sgt;
 	}
 
@@ -474,22 +486,22 @@
 
 	dma_buf = dma_buf_get(fd);
 	if (IS_ERR(dma_buf)) {
-		pr_err("dma_buf_get fail fd[%d]\n", fd);
-		ret = -EINVAL;
+		ret = PTR_ERR(dma_buf);
+		pr_err("Fail to get dma_buf from fd[%d], ret[%d]\n", fd, ret);
 		return ret;
 	}
 
 	attach = dma_buf_attach(dma_buf, rga_dev);
 	if (IS_ERR(attach)) {
-		pr_err("Failed to attach dma_buf\n");
-		ret = -EINVAL;
+		ret = PTR_ERR(attach);
+		pr_err("Failed to attach dma_buf, ret[%d]\n", ret);
 		goto err_get_attach;
 	}
 
 	sgt = dma_buf_map_attachment(attach, dir);
 	if (IS_ERR(sgt)) {
-		pr_err("Failed to map src attachment\n");
-		ret = -EINVAL;
+		ret = PTR_ERR(sgt);
+		pr_err("Failed to map attachment, ret[%d]\n", ret);
 		goto err_get_sgt;
 	}
 
diff --git a/kernel/drivers/video/rockchip/rga3/rga_drv.c b/kernel/drivers/video/rockchip/rga3/rga_drv.c
index 576b460..226fb77 100644
--- a/kernel/drivers/video/rockchip/rga3/rga_drv.c
+++ b/kernel/drivers/video/rockchip/rga3/rga_drv.c
@@ -26,20 +26,6 @@
 static struct hrtimer timer;
 static ktime_t kt;
 
-static const struct rga_backend_ops rga3_ops = {
-	.get_version = rga3_get_version,
-	.set_reg = rga3_set_reg,
-	.init_reg = rga3_init_reg,
-	.soft_reset = rga3_soft_reset
-};
-
-static const struct rga_backend_ops rga2_ops = {
-	.get_version = rga2_get_version,
-	.set_reg = rga2_set_reg,
-	.init_reg = rga2_init_reg,
-	.soft_reset = rga2_soft_reset
-};
-
 static struct rga_session *rga_session_init(void);
 static int rga_session_deinit(struct rga_session *session);
 
@@ -49,6 +35,7 @@
 {
 	struct rga_external_buffer buffer;
 
+	memset(&buffer, 0x0, sizeof(buffer));
 	buffer.memory = (unsigned long)dma_buf;
 	buffer.type = RGA_DMA_BUFFER_PTR;
 	buffer.memory_parm.width = channel_info->vir_w;
@@ -270,8 +257,8 @@
 	struct rga_pending_request_manager *request_manager = rga_drvdata->pend_request_manager;
 
 	session = rga_session_init();
-	if (!session)
-		return -ENOMEM;
+	if (IS_ERR(session))
+		return PTR_ERR(session);
 
 	request_id = rga_request_alloc(0, session);
 	if (request_id < 0) {
@@ -561,22 +548,38 @@
 
 static struct rga_session *rga_session_init(void)
 {
+	int new_id;
+
 	struct rga_session_manager *session_manager = NULL;
-	struct rga_session *session = kzalloc(sizeof(*session), GFP_KERNEL);
+	struct rga_session *session = NULL;
 
 	session_manager = rga_drvdata->session_manager;
 	if (session_manager == NULL) {
 		pr_err("rga_session_manager is null!\n");
-		kfree(session);
-		return NULL;
+		return ERR_PTR(-EFAULT);
+	}
+
+	session = kzalloc(sizeof(*session), GFP_KERNEL);
+	if (!session) {
+		pr_err("rga_session alloc failed\n");
+		return ERR_PTR(-ENOMEM);
 	}
 
 	mutex_lock(&session_manager->lock);
 
 	idr_preload(GFP_KERNEL);
-	session->id = idr_alloc(&session_manager->ctx_id_idr, session, 1, 0, GFP_ATOMIC);
-	session_manager->session_cnt++;
+	new_id = idr_alloc_cyclic(&session_manager->ctx_id_idr, session, 1, 0, GFP_NOWAIT);
 	idr_preload_end();
+	if (new_id < 0) {
+		mutex_unlock(&session_manager->lock);
+
+		pr_err("rga_session alloc id failed!\n");
+		kfree(session);
+		return ERR_PTR(new_id);
+	}
+
+	session->id = new_id;
+	session_manager->session_cnt++;
 
 	mutex_unlock(&session_manager->lock);
 
@@ -588,29 +591,7 @@
 
 static int rga_session_deinit(struct rga_session *session)
 {
-	pid_t pid;
-	int request_id;
-	struct rga_pending_request_manager *request_manager;
-	struct rga_request *request;
-
-	pid = current->pid;
-
-	request_manager = rga_drvdata->pend_request_manager;
-
-	mutex_lock(&request_manager->lock);
-
-	idr_for_each_entry(&request_manager->request_idr, request, request_id) {
-
-		if (session == request->session) {
-			pr_err("[pid:%d] destroy request[%d] when the user exits",
-			       pid, request->id);
-			rga_request_put(request);
-		}
-	}
-
-	mutex_unlock(&request_manager->lock);
-
-	rga_job_session_destroy(session);
+	rga_request_session_destroy_abort(session);
 	rga_mm_session_release_buffer(session);
 
 	rga_session_free_remove_idr(session);
@@ -670,8 +651,9 @@
 
 		ret = rga_mm_import_buffer(&external_buffer[i], session);
 		if (ret == 0) {
-			pr_err("buffer[%d] mm import buffer failed! memory = 0x%lx, type = 0x%x\n",
+			pr_err("buffer[%d] mm import buffer failed! memory = 0x%lx, type = %s(0x%x)\n",
 			       i, (unsigned long)external_buffer[i].memory,
+			       rga_get_memory_type_str(external_buffer[i].type),
 			       external_buffer[i].type);
 
 			goto err_free_external_buffer;
@@ -741,7 +723,8 @@
 
 		ret = rga_mm_release_buffer(external_buffer[i].handle);
 		if (ret < 0) {
-			pr_err("buffer[%d] mm release buffer failed!\n", i);
+			pr_err("buffer[%d] mm release buffer failed! handle = %d\n",
+			       i, external_buffer[i].handle);
 
 			goto err_free_external_buffer;
 		}
@@ -1140,8 +1123,8 @@
 	struct rga_session *session = NULL;
 
 	session = rga_session_init();
-	if (!session)
-		return -ENOMEM;
+	if (IS_ERR(session))
+		return PTR_ERR(session);
 
 	file->private_data = (void *)session;
 
@@ -1157,97 +1140,39 @@
 	return 0;
 }
 
-static irqreturn_t rga3_irq_handler(int irq, void *data)
+static irqreturn_t rga_irq_handler(int irq, void *data)
 {
+	irqreturn_t irq_ret = IRQ_NONE;
 	struct rga_scheduler_t *scheduler = data;
 
-	if (DEBUGGER_EN(INT_FLAG))
-		pr_info("irqthread INT[%x],STATS0[%x], STATS1[%x]\n",
-			rga_read(RGA3_INT_RAW, scheduler),
-			rga_read(RGA3_STATUS0, scheduler),
-			rga_read(RGA3_STATUS1, scheduler));
+	if (scheduler->ops->irq)
+		irq_ret = scheduler->ops->irq(scheduler);
 
-	/* TODO: if error interrupt then soft reset hardware */
-	//scheduler->ops->soft_reset(job->core);
-
-	/*clear INT */
-	rga_write(1, RGA3_INT_CLR, scheduler);
-
-	return IRQ_WAKE_THREAD;
+	return irq_ret;
 }
 
-static irqreturn_t rga3_irq_thread(int irq, void *data)
+static irqreturn_t rga_isr_thread(int irq, void *data)
 {
+	irqreturn_t irq_ret = IRQ_NONE;
 	struct rga_scheduler_t *scheduler = data;
 	struct rga_job *job;
 
-	job = scheduler->running_job;
-
-	if (!job) {
-		pr_err("running job is invaild on irq thread\n");
+	job = rga_job_done(scheduler);
+	if (job == NULL) {
+		pr_err("isr thread invalid job!\n");
 		return IRQ_HANDLED;
 	}
 
-	if (DEBUGGER_EN(INT_FLAG))
-		pr_info("irq INT[%x], STATS0[%x], STATS1[%x]\n",
-			rga_read(RGA3_INT_RAW, scheduler),
-			rga_read(RGA3_STATUS0, scheduler),
-			rga_read(RGA3_STATUS1, scheduler));
+	if (scheduler->ops->isr_thread)
+		irq_ret = scheduler->ops->isr_thread(job, scheduler);
 
-	rga_job_done(scheduler, 0);
+	rga_request_release_signal(scheduler, job);
 
-	return IRQ_HANDLED;
-}
+	rga_job_next(scheduler);
 
-static irqreturn_t rga2_irq_handler(int irq, void *data)
-{
-	struct rga_scheduler_t *scheduler = data;
+	rga_power_disable(scheduler);
 
-	if (DEBUGGER_EN(INT_FLAG))
-		pr_info("irqthread INT[%x],STATS0[%x]\n",
-			rga_read(RGA2_INT, scheduler), rga_read(RGA2_STATUS,
-								 scheduler));
-
-	/*if error interrupt then soft reset hardware */
-	//warning
-	if (rga_read(RGA2_INT, scheduler) & 0x01) {
-		pr_err("err irq! INT[%x],STATS0[%x]\n",
-			 rga_read(RGA2_INT, scheduler),
-			 rga_read(RGA2_STATUS, scheduler));
-		scheduler->ops->soft_reset(scheduler);
-	}
-
-	/*clear INT */
-	rga_write(rga_read(RGA2_INT, scheduler) |
-		  (0x1 << 4) | (0x1 << 5) | (0x1 << 6) | (0x1 << 7) |
-		  (0x1 << 15) | (0x1 << 16), RGA2_INT, scheduler);
-
-	return IRQ_WAKE_THREAD;
-}
-
-static irqreturn_t rga2_irq_thread(int irq, void *data)
-{
-	struct rga_scheduler_t *scheduler = data;
-	struct rga_job *job;
-
-	job = scheduler->running_job;
-
-	if (!job)
-		return IRQ_HANDLED;
-
-	if (DEBUGGER_EN(INT_FLAG))
-		pr_info("irq INT[%x], STATS0[%x]\n",
-			rga_read(RGA2_INT, scheduler), rga_read(RGA2_STATUS,
-								 scheduler));
-
-	job->rga_command_base.osd_info.cur_flags0 = rga_read(RGA2_OSD_CUR_FLAGS0_OFFSET,
-							     scheduler);
-	job->rga_command_base.osd_info.cur_flags1 = rga_read(RGA2_OSD_CUR_FLAGS1_OFFSET,
-							     scheduler);
-
-	rga_job_done(scheduler, 0);
-
-	return IRQ_HANDLED;
+	return irq_ret;
 }
 
 const struct file_operations rga_fops = {
@@ -1290,44 +1215,24 @@
 	"clk_rga3_1",
 };
 
-static const struct rga_irqs_data_t single_rga2_irqs[] = {
-	{"rga2_irq", rga2_irq_handler, rga2_irq_thread}
-};
-
-static const struct rga_irqs_data_t rga3_core0_irqs[] = {
-	{"rga3_core0_irq", rga3_irq_handler, rga3_irq_thread}
-};
-
-static const struct rga_irqs_data_t rga3_core1_irqs[] = {
-	{"rga3_core1_irq", rga3_irq_handler, rga3_irq_thread}
-};
-
 static const struct rga_match_data_t old_rga2_match_data = {
 	.clks = old_rga2_clks,
 	.num_clks = ARRAY_SIZE(old_rga2_clks),
-	.irqs = single_rga2_irqs,
-	.num_irqs = ARRAY_SIZE(single_rga2_irqs)
 };
 
 static const struct rga_match_data_t rk3588_rga2_match_data = {
 	.clks = rk3588_rga2_clks,
 	.num_clks = ARRAY_SIZE(rk3588_rga2_clks),
-	.irqs = single_rga2_irqs,
-	.num_irqs = ARRAY_SIZE(single_rga2_irqs)
 };
 
 static const struct rga_match_data_t rga3_core0_match_data = {
 	.clks = rga3_core_0_clks,
 	.num_clks = ARRAY_SIZE(rga3_core_0_clks),
-	.irqs = rga3_core0_irqs,
-	.num_irqs = ARRAY_SIZE(rga3_core0_irqs)
 };
 
 static const struct rga_match_data_t rga3_core1_match_data = {
 	.clks = rga3_core_1_clks,
 	.num_clks = ARRAY_SIZE(rga3_core_1_clks),
-	.irqs = rga3_core1_irqs,
-	.num_irqs = ARRAY_SIZE(rga3_core1_irqs)
 };
 
 static const struct of_device_id rga3_core0_dt_ids[] = {
@@ -1439,21 +1344,21 @@
 	/* there are irq names in dts */
 	irq = platform_get_irq(pdev, 0);
 	if (irq < 0) {
-		dev_err(dev, "no irq %s in dts\n", match_data->irqs[0].name);
+		dev_err(dev, "no irq %s in dts\n", dev_driver_string(dev));
 		return irq;
 	}
 
 	scheduler->irq = irq;
 
-	pr_info("%s, irq = %d, match scheduler\n", match_data->irqs[0].name, irq);
+	pr_info("%s, irq = %d, match scheduler\n", dev_driver_string(dev), irq);
 
 	ret = devm_request_threaded_irq(dev, irq,
-					match_data->irqs[0].irq_hdl,
-					match_data->irqs[0].irq_thread,
+					rga_irq_handler,
+					rga_isr_thread,
 					IRQF_SHARED,
 					dev_driver_string(dev), scheduler);
 	if (ret < 0) {
-		pr_err("request irq name: %s failed: %d\n", match_data->irqs[0].name, ret);
+		pr_err("request irq name: %s failed: %d\n", dev_driver_string(dev), ret);
 		return ret;
 	}
 
@@ -1695,6 +1600,8 @@
 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 4, 0))
 #ifdef CONFIG_ROCKCHIP_THUNDER_BOOT
 module_init(rga_init);
+#elif defined CONFIG_VIDEO_REVERSE_IMAGE
+fs_initcall(rga_init);
 #else
 late_initcall(rga_init);
 #endif
diff --git a/kernel/drivers/video/rockchip/rga3/rga_fence.c b/kernel/drivers/video/rockchip/rga3/rga_fence.c
index 0e1f58f..7d831d5 100644
--- a/kernel/drivers/video/rockchip/rga3/rga_fence.c
+++ b/kernel/drivers/video/rockchip/rga3/rga_fence.c
@@ -84,8 +84,10 @@
 		return fence_fd;
 
 	sync_file = sync_file_create(fence);
-	if (!sync_file)
+	if (!sync_file) {
+		put_unused_fd(fence_fd);
 		return -ENOMEM;
+	}
 
 	fd_install(fence_fd, sync_file->file);
 
diff --git a/kernel/drivers/video/rockchip/rga3/rga_iommu.c b/kernel/drivers/video/rockchip/rga3/rga_iommu.c
index 3b7a4ef..6ef9cbc 100644
--- a/kernel/drivers/video/rockchip/rga3/rga_iommu.c
+++ b/kernel/drivers/video/rockchip/rga3/rga_iommu.c
@@ -5,7 +5,7 @@
  * Author: Huang Lee <Putin.li@rock-chips.com>
  */
 
-#define pr_fmt(fmt) "rga2_mmu: " fmt
+#define pr_fmt(fmt) "rga_iommu: " fmt
 
 #include "rga_iommu.h"
 #include "rga_dma_buf.h"
@@ -170,6 +170,12 @@
 	 * size * channel_num * address_size
 	 */
 	order = get_order(size * 3 * sizeof(*mmu_base->buf_virtual));
+	if (order >= MAX_ORDER) {
+		pr_err("Can not alloc pages with order[%d] for mmu_page_table, max_order = %d\n",
+		       order, MAX_ORDER);
+		goto err_free_mmu_base;
+	}
+
 	mmu_base->buf_virtual = (uint32_t *) __get_free_pages(GFP_KERNEL | GFP_DMA32, order);
 	if (mmu_base->buf_virtual == NULL) {
 		pr_err("Can not alloc pages for mmu_page_table\n");
@@ -178,6 +184,12 @@
 	mmu_base->buf_order = order;
 
 	order = get_order(size * sizeof(*mmu_base->pages));
+	if (order >= MAX_ORDER) {
+		pr_err("Can not alloc pages with order[%d] for mmu_base->pages, max_order = %d\n",
+		       order, MAX_ORDER);
+		goto err_free_buf_virtual;
+	}
+
 	mmu_base->pages = (struct page **)__get_free_pages(GFP_KERNEL | GFP_DMA32, order);
 	if (mmu_base->pages == NULL) {
 		pr_err("Can not alloc pages for mmu_base->pages\n");
@@ -219,6 +231,38 @@
 
 	kfree(base);
 	*mmu_base = NULL;
+}
+
+static int rga_iommu_intr_fault_handler(struct iommu_domain *iommu, struct device *iommu_dev,
+					unsigned long iova, int status, void *arg)
+{
+	struct rga_scheduler_t *scheduler = (struct rga_scheduler_t *)arg;
+	struct rga_job *job = scheduler->running_job;
+
+	if (job == NULL)
+		return 0;
+
+	pr_err("IOMMU intr fault, IOVA[0x%lx], STATUS[0x%x]\n", iova, status);
+	if (scheduler->ops->irq)
+		scheduler->ops->irq(scheduler);
+
+	/* iommu interrupts on rga2 do not affect rga2 itself. */
+	if (!test_bit(RGA_JOB_STATE_INTR_ERR, &job->state)) {
+		set_bit(RGA_JOB_STATE_INTR_ERR, &job->state);
+		scheduler->ops->soft_reset(scheduler);
+	}
+
+	if (status & RGA_IOMMU_IRQ_PAGE_FAULT) {
+		pr_err("RGA IOMMU: page fault! Please check the memory size.\n");
+		job->ret = -EACCES;
+	} else if (status & RGA_IOMMU_IRQ_BUS_ERROR) {
+		pr_err("RGA IOMMU: bus error! Please check if the memory is invalid or has been freed.\n");
+		job->ret = -EACCES;
+	} else {
+		pr_err("RGA IOMMU: Wrong IOMMU interrupt signal!\n");
+	}
+
+	return 0;
 }
 
 int rga_iommu_detach(struct rga_iommu_info *info)
@@ -306,6 +350,9 @@
 			if (main_iommu == NULL) {
 				main_iommu = scheduler->iommu_info;
 				main_iommu_index = i;
+				iommu_set_fault_handler(main_iommu->domain,
+							rga_iommu_intr_fault_handler,
+							(void *)scheduler);
 			} else {
 				scheduler->iommu_info->domain = main_iommu->domain;
 				scheduler->iommu_info->default_dev = main_iommu->default_dev;
diff --git a/kernel/drivers/video/rockchip/rga3/rga_job.c b/kernel/drivers/video/rockchip/rga3/rga_job.c
index 47bb908..bbe6fa8 100644
--- a/kernel/drivers/video/rockchip/rga3/rga_job.c
+++ b/kernel/drivers/video/rockchip/rga3/rga_job.c
@@ -14,74 +14,28 @@
 #include "rga_iommu.h"
 #include "rga_debugger.h"
 
-struct rga_job *
-rga_scheduler_get_pending_job_list(struct rga_scheduler_t *scheduler)
-{
-	unsigned long flags;
-	struct rga_job *job;
-
-	spin_lock_irqsave(&scheduler->irq_lock, flags);
-
-	job = list_first_entry_or_null(&scheduler->todo_list,
-		struct rga_job, head);
-
-	spin_unlock_irqrestore(&scheduler->irq_lock, flags);
-
-	return job;
-}
-
-struct rga_job *
-rga_scheduler_get_running_job(struct rga_scheduler_t *scheduler)
-{
-	unsigned long flags;
-	struct rga_job *job;
-
-	spin_lock_irqsave(&scheduler->irq_lock, flags);
-
-	job = scheduler->running_job;
-
-	spin_unlock_irqrestore(&scheduler->irq_lock, flags);
-
-	return job;
-}
-
-struct rga_scheduler_t *rga_job_get_scheduler(struct rga_job *job)
-{
-	return job->scheduler;
-}
-
 static void rga_job_free(struct rga_job *job)
 {
 	free_page((unsigned long)job);
 }
 
-void rga_job_session_destroy(struct rga_session *session)
+static void rga_job_kref_release(struct kref *ref)
 {
-	struct rga_scheduler_t *scheduler = NULL;
-	struct rga_job *job_pos, *job_q;
-	int i;
+	struct rga_job *job;
 
-	unsigned long flags;
+	job = container_of(ref, struct rga_job, refcount);
 
-	for (i = 0; i < rga_drvdata->num_of_scheduler; i++) {
-		scheduler = rga_drvdata->scheduler[i];
+	rga_job_free(job);
+}
 
-		spin_lock_irqsave(&scheduler->irq_lock, flags);
+static int rga_job_put(struct rga_job *job)
+{
+	return kref_put(&job->refcount, rga_job_kref_release);
+}
 
-		list_for_each_entry_safe(job_pos, job_q, &scheduler->todo_list, head) {
-			if (session == job_pos->session) {
-				list_del(&job_pos->head);
-
-				spin_unlock_irqrestore(&scheduler->irq_lock, flags);
-
-				rga_job_free(job_pos);
-
-				spin_lock_irqsave(&scheduler->irq_lock, flags);
-			}
-		}
-
-		spin_unlock_irqrestore(&scheduler->irq_lock, flags);
-	}
+static void rga_job_get(struct rga_job *job)
+{
+	kref_get(&job->refcount);
 }
 
 static int rga_job_cleanup(struct rga_job *job)
@@ -90,7 +44,7 @@
 		pr_err("(pid:%d) job clean use time = %lld\n", job->pid,
 			ktime_us_delta(ktime_get(), job->timestamp));
 
-	rga_job_free(job);
+	rga_job_put(job);
 
 	return 0;
 }
@@ -165,6 +119,7 @@
 		return NULL;
 
 	INIT_LIST_HEAD(&job->head);
+	kref_init(&job->refcount);
 
 	job->timestamp = ktime_get();
 	job->pid = current->pid;
@@ -232,16 +187,18 @@
 		return ret;
 	}
 
+	set_bit(RGA_JOB_STATE_RUNNING, &job->state);
+
 	/* for debug */
 	if (DEBUGGER_EN(MSG))
 		rga_job_dump_info(job);
 
 	return ret;
-
 }
 
-static void rga_job_next(struct rga_scheduler_t *scheduler)
+void rga_job_next(struct rga_scheduler_t *scheduler)
 {
+	int ret;
 	struct rga_job *job = NULL;
 	unsigned long flags;
 
@@ -261,51 +218,33 @@
 	scheduler->job_count--;
 
 	scheduler->running_job = job;
+	set_bit(RGA_JOB_STATE_PREPARE, &job->state);
+	rga_job_get(job);
 
 	spin_unlock_irqrestore(&scheduler->irq_lock, flags);
 
-	job->ret = rga_job_run(job, scheduler);
+	ret = rga_job_run(job, scheduler);
 	/* If some error before hw run */
-	if (job->ret < 0) {
-		pr_err("some error on rga_job_run before hw start, %s(%d)\n",
-			__func__, __LINE__);
+	if (ret < 0) {
+		pr_err("some error on rga_job_run before hw start, %s(%d)\n", __func__, __LINE__);
 
 		spin_lock_irqsave(&scheduler->irq_lock, flags);
 
 		scheduler->running_job = NULL;
+		rga_job_put(job);
 
 		spin_unlock_irqrestore(&scheduler->irq_lock, flags);
 
+		job->ret = ret;
 		rga_request_release_signal(scheduler, job);
 
 		goto next_job;
 	}
+
+	rga_job_put(job);
 }
 
-static void rga_job_finish_and_next(struct rga_scheduler_t *scheduler,
-		struct rga_job *job, int ret)
-{
-	ktime_t now;
-
-	job->ret = ret;
-
-	if (DEBUGGER_EN(TIME)) {
-		now = ktime_get();
-		pr_info("hw use time = %lld\n", ktime_us_delta(now, job->hw_running_time));
-		pr_info("(pid:%d) job done use time = %lld\n", job->pid,
-			ktime_us_delta(now, job->timestamp));
-	}
-
-	rga_mm_unmap_job_info(job);
-
-	rga_request_release_signal(scheduler, job);
-
-	rga_job_next(scheduler);
-
-	rga_power_disable(scheduler);
-}
-
-void rga_job_done(struct rga_scheduler_t *scheduler, int ret)
+struct rga_job *rga_job_done(struct rga_scheduler_t *scheduler)
 {
 	struct rga_job *job;
 	unsigned long flags;
@@ -314,16 +253,34 @@
 	spin_lock_irqsave(&scheduler->irq_lock, flags);
 
 	job = scheduler->running_job;
+	if (job == NULL) {
+		pr_err("core[0x%x] running job has been cleanup.\n", scheduler->core);
+
+		spin_unlock_irqrestore(&scheduler->irq_lock, flags);
+		return NULL;
+	}
 	scheduler->running_job = NULL;
 
 	scheduler->timer.busy_time += ktime_us_delta(now, job->hw_recoder_time);
+	set_bit(RGA_JOB_STATE_DONE, &job->state);
 
 	spin_unlock_irqrestore(&scheduler->irq_lock, flags);
+
+	if (scheduler->ops->read_back_reg)
+		scheduler->ops->read_back_reg(job, scheduler);
 
 	if (DEBUGGER_EN(DUMP_IMAGE))
 		rga_dump_job_image(job);
 
-	rga_job_finish_and_next(scheduler, job, ret);
+	if (DEBUGGER_EN(TIME)) {
+		pr_info("hw use time = %lld\n", ktime_us_delta(now, job->hw_running_time));
+		pr_info("(pid:%d) job done use time = %lld\n", job->pid,
+			ktime_us_delta(now, job->timestamp));
+	}
+
+	rga_mm_unmap_job_info(job);
+
+	return job;
 }
 
 static void rga_job_scheduler_timeout_clean(struct rga_scheduler_t *scheduler)
@@ -391,13 +348,20 @@
 	}
 
 	scheduler->job_count++;
+	set_bit(RGA_JOB_STATE_PENDING, &job->state);
 
 	spin_unlock_irqrestore(&scheduler->irq_lock, flags);
 }
 
 static struct rga_scheduler_t *rga_job_schedule(struct rga_job *job)
 {
+	int i;
 	struct rga_scheduler_t *scheduler = NULL;
+
+	for (i = 0; i < rga_drvdata->num_of_scheduler; i++) {
+		scheduler = rga_drvdata->scheduler[i];
+		rga_job_scheduler_timeout_clean(scheduler);
+	}
 
 	if (rga_drvdata->num_of_scheduler > 1) {
 		job->core = rga_job_assign(job);
@@ -411,14 +375,12 @@
 		job->scheduler = rga_drvdata->scheduler[0];
 	}
 
-	scheduler = rga_job_get_scheduler(job);
+	scheduler = job->scheduler;
 	if (scheduler == NULL) {
 		pr_err("failed to get scheduler, %s(%d)\n", __func__, __LINE__);
 		job->ret = -EFAULT;
 		return NULL;
 	}
-
-	rga_job_scheduler_timeout_clean(scheduler);
 
 	return scheduler;
 }
@@ -557,26 +519,13 @@
 	request->current_mm = NULL;
 }
 
-static int rga_request_alloc_release_fence(struct dma_fence **release_fence)
-{
-	struct dma_fence *fence;
-
-	fence = rga_dma_fence_alloc();
-	if (IS_ERR(fence)) {
-		pr_err("Can not alloc release fence!\n");
-		return IS_ERR(fence);
-	}
-
-	*release_fence = fence;
-
-	return rga_dma_fence_get_fd(fence);
-}
-
-static int rga_request_add_acquire_fence_callback(int acquire_fence_fd, void *private,
+static int rga_request_add_acquire_fence_callback(int acquire_fence_fd,
+						  struct rga_request *request,
 						  dma_fence_func_t cb_func)
 {
 	int ret;
 	struct dma_fence *acquire_fence = NULL;
+	struct rga_pending_request_manager *request_manager = rga_drvdata->pend_request_manager;
 
 	if (DEBUGGER_EN(MSG))
 		pr_info("acquire_fence_fd = %d", acquire_fence_fd);
@@ -588,19 +537,38 @@
 		return -EINVAL;
 	}
 	/* close acquire fence fd */
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 1, 0)
+	close_fd(acquire_fence_fd);
+#else
 	ksys_close(acquire_fence_fd);
+#endif
 
 	ret = rga_dma_fence_get_status(acquire_fence);
-	if (ret == 0) {
-		ret = rga_dma_fence_add_callback(acquire_fence, cb_func, private);
-		if (ret < 0) {
-			if (ret == -ENOENT)
-				return 1;
+	if (ret < 0) {
+		pr_err("%s: Current acquire fence unexpectedly has error status before signal\n",
+		       __func__);
+		return ret;
+	} else if (ret > 0) {
+		/* has been signaled */
+		return ret;
+	}
 
+	/*
+	 * Ensure that the request will not be free early when
+	 * the callback is called.
+	 */
+	mutex_lock(&request_manager->lock);
+	rga_request_get(request);
+	mutex_unlock(&request_manager->lock);
+
+	ret = rga_dma_fence_add_callback(acquire_fence, cb_func, (void *)request);
+	if (ret < 0) {
+		if (ret != -ENOENT)
 			pr_err("%s: failed to add fence callback\n", __func__);
-			return ret;
-		}
-	} else {
+
+		mutex_lock(&request_manager->lock);
+		rga_request_put(request);
+		mutex_unlock(&request_manager->lock);
 		return ret;
 	}
 
@@ -742,6 +710,70 @@
 	mutex_unlock(&request_manager->lock);
 }
 
+void rga_request_session_destroy_abort(struct rga_session *session)
+{
+	int request_id;
+	struct rga_request *request;
+	struct rga_pending_request_manager *request_manager;
+
+	request_manager = rga_drvdata->pend_request_manager;
+	if (request_manager == NULL) {
+		pr_err("rga_pending_request_manager is null!\n");
+		return;
+	}
+
+	mutex_lock(&request_manager->lock);
+
+	idr_for_each_entry(&request_manager->request_idr, request, request_id) {
+		if (session == request->session) {
+			pr_err("[tgid:%d pid:%d] destroy request[%d] when the user exits",
+			       session->tgid, current->pid, request->id);
+			rga_request_put(request);
+		}
+	}
+
+	mutex_unlock(&request_manager->lock);
+}
+
+static int rga_request_timeout_query_state(struct rga_request *request)
+{
+	int i;
+	unsigned long flags;
+	struct rga_scheduler_t *scheduler = NULL;
+	struct rga_job *job = NULL;
+
+	for (i = 0; i < rga_drvdata->num_of_scheduler; i++) {
+		scheduler = rga_drvdata->scheduler[i];
+
+		spin_lock_irqsave(&scheduler->irq_lock, flags);
+
+		if (scheduler->running_job) {
+			job = scheduler->running_job;
+			if (request->id == job->request_id) {
+				if (test_bit(RGA_JOB_STATE_DONE, &job->state) &&
+				    test_bit(RGA_JOB_STATE_FINISH, &job->state)) {
+					spin_unlock_irqrestore(&scheduler->irq_lock, flags);
+					return request->ret;
+				} else if (!test_bit(RGA_JOB_STATE_DONE, &job->state) &&
+					   test_bit(RGA_JOB_STATE_FINISH, &job->state)) {
+					spin_unlock_irqrestore(&scheduler->irq_lock, flags);
+					pr_err("hardware has finished, but the software has timeout!\n");
+					return -EBUSY;
+				} else if (!test_bit(RGA_JOB_STATE_DONE, &job->state) &&
+					   !test_bit(RGA_JOB_STATE_FINISH, &job->state)) {
+					spin_unlock_irqrestore(&scheduler->irq_lock, flags);
+					pr_err("hardware has timeout.\n");
+					return -EBUSY;
+				}
+			}
+		}
+
+		spin_unlock_irqrestore(&scheduler->irq_lock, flags);
+	}
+
+	return request->ret;
+}
+
 static int rga_request_wait(struct rga_request *request)
 {
 	int left_time;
@@ -752,8 +784,7 @@
 
 	switch (left_time) {
 	case 0:
-		pr_err("%s timeout", __func__);
-		ret = -EBUSY;
+		ret = rga_request_timeout_query_state(request);
 		goto err_request_abort;
 	case -ERESTARTSYS:
 		ret = -ERESTARTSYS;
@@ -800,9 +831,15 @@
 						  struct dma_fence_cb *_waiter)
 {
 	struct rga_fence_waiter *waiter = (struct rga_fence_waiter *)_waiter;
+	struct rga_request *request = (struct rga_request *)waiter->private;
+	struct rga_pending_request_manager *request_manager = rga_drvdata->pend_request_manager;
 
-	if (rga_request_commit((struct rga_request *)waiter->private))
+	if (rga_request_commit(request))
 		pr_err("rga request commit failed!\n");
+
+	mutex_lock(&request_manager->lock);
+	rga_request_put(request);
+	mutex_unlock(&request_manager->lock);
 
 	kfree(waiter);
 }
@@ -832,8 +869,6 @@
 	rga_request_get(request);
 	mutex_unlock(&request_manager->lock);
 
-	rga_job_cleanup(job);
-
 	spin_lock_irqsave(&request->lock, flags);
 
 	if (job->ret < 0) {
@@ -847,6 +882,8 @@
 	finished_count = request->finished_task_count;
 
 	spin_unlock_irqrestore(&request->lock, flags);
+
+	rga_job_cleanup(job);
 
 	if ((failed_count + finished_count) >= request->task_count) {
 		spin_lock_irqsave(&request->lock, flags);
@@ -1003,18 +1040,21 @@
 {
 	int ret = 0;
 	unsigned long flags;
+	struct dma_fence *release_fence;
 
 	spin_lock_irqsave(&request->lock, flags);
 
 	if (request->is_running) {
-		pr_err("can not re-config when request is running");
 		spin_unlock_irqrestore(&request->lock, flags);
+
+		pr_err("can not re-config when request is running\n");
 		return -EFAULT;
 	}
 
 	if (request->task_list == NULL) {
-		pr_err("can not find task list from id[%d]", request->id);
 		spin_unlock_irqrestore(&request->lock, flags);
+
+		pr_err("can not find task list from id[%d]\n", request->id);
 		return -EINVAL;
 	}
 
@@ -1026,46 +1066,71 @@
 
 	rga_request_get_current_mm(request);
 
+	/* Unlock after ensuring that the current request will not be resubmitted. */
 	spin_unlock_irqrestore(&request->lock, flags);
 
 	if (request->sync_mode == RGA_BLIT_ASYNC) {
-		ret = rga_request_alloc_release_fence(&request->release_fence);
-		if (ret < 0) {
-			pr_err("Failed to alloc release fence fd!\n");
-			return ret;
+		release_fence = rga_dma_fence_alloc();
+		if (IS_ERR(release_fence)) {
+			pr_err("Can not alloc release fence!\n");
+			ret = IS_ERR(release_fence);
+			goto error_put_current_mm;
 		}
-		request->release_fence_fd = ret;
+		request->release_fence = release_fence;
 
 		if (request->acquire_fence_fd > 0) {
 			ret = rga_request_add_acquire_fence_callback(
-				request->acquire_fence_fd,
-				(void *)request,
+				request->acquire_fence_fd, request,
 				rga_request_acquire_fence_signaled_cb);
 			if (ret == 0) {
-				return ret;
-			} else if (ret == 1) {
+				/* acquire fence active */
+				goto export_release_fence_fd;
+			} else if (ret > 0) {
+				/* acquire fence has been signaled */
 				goto request_commit;
 			} else {
 				pr_err("Failed to add callback with acquire fence fd[%d]!\n",
 				       request->acquire_fence_fd);
-				goto error_release_fence_put;
+				goto err_put_release_fence;
 			}
 		}
-
 	}
 
 request_commit:
 	ret = rga_request_commit(request);
 	if (ret < 0) {
 		pr_err("rga request commit failed!\n");
-		goto error_release_fence_put;
+		goto err_put_release_fence;
+	}
+
+export_release_fence_fd:
+	if (request->release_fence != NULL) {
+		ret = rga_dma_fence_get_fd(request->release_fence);
+		if (ret < 0) {
+			pr_err("Failed to alloc release fence fd!\n");
+			rga_request_release_abort(request, ret);
+			return ret;
+		}
+
+		request->release_fence_fd = ret;
 	}
 
 	return 0;
 
-error_release_fence_put:
-	rga_dma_fence_put(request->release_fence);
-	request->release_fence = NULL;
+err_put_release_fence:
+	if (request->release_fence != NULL) {
+		rga_dma_fence_put(request->release_fence);
+		request->release_fence = NULL;
+	}
+
+error_put_current_mm:
+	spin_lock_irqsave(&request->lock, flags);
+
+	rga_request_put_current_mm(request);
+	request->is_running = false;
+
+	spin_unlock_irqrestore(&request->lock, flags);
+
 	return ret;
 }
 
@@ -1159,10 +1224,11 @@
 	request = container_of(ref, struct rga_request, refcount);
 
 	if (rga_dma_fence_get_status(request->release_fence) == 0)
-		rga_dma_fence_signal(request->release_fence, -EEXIST);
+		rga_dma_fence_signal(request->release_fence, -EFAULT);
 
 	spin_lock_irqsave(&request->lock, flags);
 
+	rga_request_put_current_mm(request);
 	rga_dma_fence_put(request->release_fence);
 
 	if (!request->is_running || request->is_done) {
@@ -1188,6 +1254,7 @@
 
 int rga_request_alloc(uint32_t flags, struct rga_session *session)
 {
+	int new_id;
 	struct rga_pending_request_manager *request_manager;
 	struct rga_request *request;
 
@@ -1218,17 +1285,17 @@
 	mutex_lock(&request_manager->lock);
 
 	idr_preload(GFP_KERNEL);
-	request->id = idr_alloc(&request_manager->request_idr, request, 1, 0, GFP_KERNEL);
+	new_id = idr_alloc_cyclic(&request_manager->request_idr, request, 1, 0, GFP_NOWAIT);
 	idr_preload_end();
-
-	if (request->id <= 0) {
-		pr_err("alloc request_id failed!\n");
+	if (new_id < 0) {
+		pr_err("request alloc id failed!\n");
 
 		mutex_unlock(&request_manager->lock);
 		kfree(request);
-		return -EFAULT;
+		return new_id;
 	}
 
+	request->id = new_id;
 	request_manager->request_count++;
 
 	mutex_unlock(&request_manager->lock);
diff --git a/kernel/drivers/video/rockchip/rga3/rga_mm.c b/kernel/drivers/video/rockchip/rga3/rga_mm.c
index 7d59472..cd461b5 100644
--- a/kernel/drivers/video/rockchip/rga3/rga_mm.c
+++ b/kernel/drivers/video/rockchip/rga3/rga_mm.c
@@ -53,14 +53,14 @@
 	for (i = 0; i < pageCount; i++) {
 		vma = find_vma(current_mm, (Memory + i) << PAGE_SHIFT);
 		if (!vma) {
-			pr_err("failed to get vma\n");
+			pr_err("page[%d] failed to get vma\n", i);
 			ret = RGA_OUT_OF_RESOURCES;
 			break;
 		}
 
 		pgd = pgd_offset(current_mm, (Memory + i) << PAGE_SHIFT);
 		if (pgd_none(*pgd) || unlikely(pgd_bad(*pgd))) {
-			pr_err("failed to get pgd\n");
+			pr_err("page[%d] failed to get pgd\n", i);
 			ret = RGA_OUT_OF_RESOURCES;
 			break;
 		}
@@ -71,7 +71,7 @@
 		 */
 		p4d = p4d_offset(pgd, (Memory + i) << PAGE_SHIFT);
 		if (p4d_none(*p4d) || unlikely(p4d_bad(*p4d))) {
-			pr_err("failed to get p4d\n");
+			pr_err("page[%d] failed to get p4d\n", i);
 			ret = RGA_OUT_OF_RESOURCES;
 			break;
 		}
@@ -82,20 +82,20 @@
 #endif
 
 		if (pud_none(*pud) || unlikely(pud_bad(*pud))) {
-			pr_err("failed to get pud\n");
+			pr_err("page[%d] failed to get pud\n", i);
 			ret = RGA_OUT_OF_RESOURCES;
 			break;
 		}
 		pmd = pmd_offset(pud, (Memory + i) << PAGE_SHIFT);
 		if (pmd_none(*pmd) || unlikely(pmd_bad(*pmd))) {
-			pr_err("failed to get pmd\n");
+			pr_err("page[%d] failed to get pmd\n", i);
 			ret = RGA_OUT_OF_RESOURCES;
 			break;
 		}
 		pte = pte_offset_map_lock(current_mm, pmd,
 					  (Memory + i) << PAGE_SHIFT, &ptl);
 		if (pte_none(*pte)) {
-			pr_err("failed to get pte\n");
+			pr_err("page[%d] failed to get pte\n", i);
 			pte_unmap_unlock(pte, ptl);
 			ret = RGA_OUT_OF_RESOURCES;
 			break;
@@ -105,6 +105,10 @@
 		pages[i] = pfn_to_page(pfn);
 		pte_unmap_unlock(pte, ptl);
 	}
+
+	if (ret == RGA_OUT_OF_RESOURCES && i > 0)
+		pr_err("Only get buffer %d byte from vma, but current image required %d byte",
+		       (int)(i * PAGE_SIZE), (int)(pageCount * PAGE_SIZE));
 
 	return ret;
 }
@@ -144,9 +148,9 @@
 				put_page(pages[i]);
 
 		ret = rga_get_user_pages_from_vma(pages, Memory, pageCount, current_mm);
-		if (ret < 0) {
-			pr_err("Can not get user pages from vma, result = %d, pagecount = %d\n",
-			       result, pageCount);
+		if (ret < 0 && result > 0) {
+			pr_err("Only get buffer %d byte from user pages, but current image required %d byte\n",
+			       (int)(result * PAGE_SIZE), (int)(pageCount * PAGE_SIZE));
 		}
 	}
 
@@ -177,9 +181,12 @@
 	}
 
 	/* get sg form pages. */
-	ret = sg_alloc_table_from_pages(sgt, virt_addr->pages,
+	/* iova requires minimum page alignment, so sgt cannot have offset */
+	ret = sg_alloc_table_from_pages(sgt,
+					virt_addr->pages,
 					virt_addr->page_count,
-					0, virt_addr->size,
+					0,
+					virt_addr->size,
 					GFP_KERNEL);
 	if (ret) {
 		pr_err("sg_alloc_table_from_pages failed");
@@ -245,21 +252,29 @@
 	if (!size) {
 		pr_err("failed to calculating buffer size! size = %ld, count = %d, offset = %ld\n",
 		       size, count, (unsigned long)offset);
+		rga_dump_memory_parm(memory_parm);
 		return -EFAULT;
 	}
 
 	/* alloc pages and page_table */
 	order = get_order(count * sizeof(struct page *));
+	if (order >= MAX_ORDER) {
+		pr_err("Can not alloc pages with order[%d] for viraddr pages, max_order = %d\n",
+		       order, MAX_ORDER);
+		return -ENOMEM;
+	}
+
 	pages = (struct page **)__get_free_pages(GFP_KERNEL, order);
 	if (pages == NULL) {
-		pr_err("%s can not alloc pages for pages\n", __func__);
+		pr_err("%s can not alloc pages for viraddr pages\n", __func__);
 		return -ENOMEM;
 	}
 
 	/* get pages from virtual address. */
 	ret = rga_get_user_pages(pages, viraddr >> PAGE_SHIFT, count, writeFlag, mm);
 	if (ret < 0) {
-		pr_err("failed to get pages");
+		pr_err("failed to get pages from virtual adrees: 0x%lx\n",
+		       (unsigned long)viraddr);
 		ret = -EINVAL;
 		goto out_free_pages;
 	} else if (ret > 0) {
@@ -301,7 +316,7 @@
 
 	if (scheduler->data->mmu == RGA_MMU &&
 	    !(mm_flag & RGA_MEM_UNDER_4G)) {
-		pr_err("%s unsupported Memory larger than 4G!\n",
+		pr_err("%s unsupported memory larger than 4G!\n",
 		       rga_get_mmu_type_str(scheduler->data->mmu));
 		return false;
 	}
@@ -358,6 +373,7 @@
 				 struct rga_job *job)
 {
 	int ret;
+	int ex_buffer_size;
 	uint32_t mm_flag = 0;
 	phys_addr_t phys_addr = 0;
 	struct rga_dma_buffer *buffer;
@@ -369,6 +385,19 @@
 	if (scheduler == NULL) {
 		pr_err("Invalid scheduler device!\n");
 		return -EINVAL;
+	}
+
+	if (external_buffer->memory_parm.size)
+		ex_buffer_size = external_buffer->memory_parm.size;
+	else
+		ex_buffer_size = rga_image_size_cal(external_buffer->memory_parm.width,
+						    external_buffer->memory_parm.height,
+						    external_buffer->memory_parm.format,
+						    NULL, NULL, NULL);
+	if (ex_buffer_size <= 0) {
+		pr_err("failed to calculating buffer size!\n");
+		rga_dump_memory_parm(&external_buffer->memory_parm);
+		return ex_buffer_size == 0 ? -EINVAL : ex_buffer_size;
 	}
 
 	/*
@@ -402,6 +431,15 @@
 		pr_err("%s core[%d] map dma buffer error!\n",
 		       __func__, scheduler->core);
 		goto free_buffer;
+	}
+
+	if (buffer->size < ex_buffer_size) {
+		pr_err("Only get buffer %ld byte from %s = 0x%lx, but current image required %d byte\n",
+		       buffer->size, rga_get_memory_type_str(external_buffer->type),
+		       (unsigned long)external_buffer->memory, ex_buffer_size);
+		rga_dump_memory_parm(&external_buffer->memory_parm);
+		ret = -EINVAL;
+		goto unmap_buffer;
 	}
 
 	buffer->scheduler = scheduler;
@@ -576,8 +614,8 @@
 		if (mm_flag & RGA_MEM_PHYSICAL_CONTIGUOUS)
 			break;
 
-		pr_err("Current RGA mmu[%d] cannot support virtual address!\n",
-		       scheduler->data->mmu);
+		pr_err("Current %s[%d] cannot support virtual address!\n",
+		       rga_get_mmu_type_str(scheduler->data->mmu), scheduler->data->mmu);
 		goto free_dma_buffer;
 	}
 
@@ -589,7 +627,7 @@
 	internal_buffer->virt_addr = virt_addr;
 	internal_buffer->dma_buffer = buffer;
 	internal_buffer->mm_flag = mm_flag;
-	internal_buffer->phys_addr = phys_addr ? phys_addr : 0;
+	internal_buffer->phys_addr = phys_addr ? phys_addr + virt_addr->offset : 0;
 
 	return 0;
 
@@ -649,7 +687,8 @@
 						 internal_buffer->memory_parm.format,
 						 NULL, NULL, NULL);
 	if (buffer_size <= 0) {
-		pr_err("Fault to get phys addr size!\n");
+		pr_err("Failed to get phys addr size!\n");
+		rga_dump_memory_parm(&internal_buffer->memory_parm);
 		return buffer_size == 0 ? -EINVAL : buffer_size;
 	}
 
@@ -674,7 +713,7 @@
 		ret = rga_iommu_map(phys_addr, buffer_size, buffer, scheduler->dev);
 		if (ret < 0) {
 			pr_err("%s core[%d] map phys_addr error!\n", __func__, scheduler->core);
-			return ret;
+			goto free_dma_buffer;
 		}
 	}
 
@@ -686,6 +725,11 @@
 	internal_buffer->dma_buffer = buffer;
 
 	return 0;
+
+free_dma_buffer:
+	kfree(buffer);
+
+	return ret;
 }
 
 static int rga_mm_unmap_buffer(struct rga_internal_buffer *internal_buffer)
@@ -738,7 +782,7 @@
 
 		ret = rga_mm_map_virt_addr(external_buffer, internal_buffer, job, write_flag);
 		if (ret < 0) {
-			pr_err("%s iommu_map virtual address error!\n", __func__);
+			pr_err("%s map virtual address error!\n", __func__);
 			return ret;
 		}
 
@@ -751,7 +795,7 @@
 
 		ret = rga_mm_map_phys_addr(external_buffer, internal_buffer, job);
 		if (ret < 0) {
-			pr_err("%s iommu_map physical address error!\n", __func__);
+			pr_err("%s map physical address error!\n", __func__);
 			return ret;
 		}
 
@@ -1130,9 +1174,15 @@
 
 		if (job->flags & RGA_JOB_USE_HANDLE) {
 			order = get_order(page_count * sizeof(uint32_t *));
+			if (order >= MAX_ORDER) {
+				pr_err("Can not alloc pages with order[%d] for page_table, max_order = %d\n",
+				       order, MAX_ORDER);
+				return -ENOMEM;
+			}
+
 			page_table = (uint32_t *)__get_free_pages(GFP_KERNEL | GFP_DMA32, order);
 			if (page_table == NULL) {
-				pr_err("%s can not alloc pages for pages, order = %d\n",
+				pr_err("%s can not alloc pages for page_table, order = %d\n",
 				       __func__, order);
 				return -ENOMEM;
 			}
@@ -1189,9 +1239,15 @@
 
 		if (job->flags & RGA_JOB_USE_HANDLE) {
 			order = get_order(page_count * sizeof(uint32_t *));
+			if (order >= MAX_ORDER) {
+				pr_err("Can not alloc pages with order[%d] for page_table, max_order = %d\n",
+				       order, MAX_ORDER);
+				return -ENOMEM;
+			}
+
 			page_table = (uint32_t *)__get_free_pages(GFP_KERNEL | GFP_DMA32, order);
 			if (page_table == NULL) {
-				pr_err("%s can not alloc pages for pages, order = %d\n",
+				pr_err("%s can not alloc pages for page_table, order = %d\n",
 				       __func__, order);
 				return -ENOMEM;
 			}
@@ -1334,6 +1390,7 @@
 			     uint64_t handle,
 			     uint64_t *channel_addr,
 			     struct rga_internal_buffer **buf,
+			     int require_size,
 			     enum dma_data_direction dir)
 {
 	int ret = 0;
@@ -1369,6 +1426,14 @@
 		return ret;
 	}
 
+	if (internal_buffer->size < require_size) {
+		ret = -EINVAL;
+		pr_err("Only get buffer %ld byte from handle[%ld], but current required %d byte\n",
+		       internal_buffer->size, (unsigned long)handle, require_size);
+
+		goto put_internal_buffer;
+	}
+
 	if (internal_buffer->type == RGA_VIRTUAL_ADDRESS) {
 		/*
 		 * Some userspace virtual addresses do not have an
@@ -1378,11 +1443,19 @@
 		ret = rga_mm_sync_dma_sg_for_device(internal_buffer, job, dir);
 		if (ret < 0) {
 			pr_err("sync sgt for device error!\n");
-			return ret;
+			goto put_internal_buffer;
 		}
 	}
 
 	return 0;
+
+put_internal_buffer:
+	mutex_lock(&mm->lock);
+	kref_put(&internal_buffer->refcount, rga_mm_kref_release_buffer);
+	mutex_unlock(&mm->lock);
+
+	return ret;
+
 }
 
 static void rga_mm_put_buffer(struct rga_mm *mm,
@@ -1397,72 +1470,6 @@
 	mutex_lock(&mm->lock);
 	kref_put(&internal_buffer->refcount, rga_mm_kref_release_buffer);
 	mutex_unlock(&mm->lock);
-}
-
-static int rga_mm_get_channel_handle_info(struct rga_mm *mm,
-					  struct rga_job *job,
-					  struct rga_img_info_t *img,
-					  struct rga_job_buffer *job_buf,
-					  enum dma_data_direction dir)
-{
-	int ret = 0;
-	int handle = 0;
-
-	/* using third-address */
-	if (img->uv_addr > 0) {
-		handle = img->yrgb_addr;
-		if (handle > 0) {
-			ret = rga_mm_get_buffer(mm, job, handle, &img->yrgb_addr,
-						&job_buf->y_addr, dir);
-			if (ret < 0) {
-				pr_err("handle[%d] Can't get src y/rgb address info!\n", handle);
-				return ret;
-			}
-		}
-
-		handle = img->uv_addr;
-		if (handle > 0) {
-			ret = rga_mm_get_buffer(mm, job, handle, &img->uv_addr,
-						&job_buf->uv_addr, dir);
-			if (ret < 0) {
-				pr_err("handle[%d] Can't get src uv address info!\n", handle);
-				return ret;
-			}
-		}
-
-		handle = img->v_addr;
-		if (handle > 0) {
-			ret = rga_mm_get_buffer(mm, job, handle, &img->v_addr,
-						&job_buf->v_addr, dir);
-			if (ret < 0) {
-				pr_err("handle[%d] Can't get src uv address info!\n", handle);
-				return ret;
-			}
-		}
-	} else {
-		handle = img->yrgb_addr;
-		if (handle > 0) {
-			ret = rga_mm_get_buffer(mm, job, handle, &img->yrgb_addr,
-						&job_buf->addr, dir);
-			if (ret < 0) {
-				pr_err("handle[%d] Can't get src y/rgb address info!\n", handle);
-				return ret;
-			}
-		}
-
-		rga_convert_addr(img, false);
-	}
-
-	if (job->scheduler->data->mmu == RGA_MMU &&
-	    rga_mm_is_need_mmu(job, job_buf->addr)) {
-		ret = rga_mm_set_mmu_base(job, img, job_buf);
-		if (ret < 0) {
-			pr_err("Can't set RGA2 MMU_BASE from handle!\n");
-			return ret;
-		}
-	}
-
-	return 0;
 }
 
 static void rga_mm_put_channel_handle_info(struct rga_mm *mm,
@@ -1481,6 +1488,83 @@
 		free_pages((unsigned long)job_buf->page_table, job_buf->order);
 }
 
+static int rga_mm_get_channel_handle_info(struct rga_mm *mm,
+					  struct rga_job *job,
+					  struct rga_img_info_t *img,
+					  struct rga_job_buffer *job_buf,
+					  enum dma_data_direction dir)
+{
+	int ret = 0;
+	int handle = 0;
+	int img_size, yrgb_size, uv_size, v_size;
+
+	img_size = rga_image_size_cal(img->vir_w, img->vir_h, img->format,
+				      &yrgb_size, &uv_size, &v_size);
+	if (img_size <= 0) {
+		pr_err("Image size cal error! width = %d, height = %d, format = %s\n",
+		       img->vir_w, img->vir_h, rga_get_format_name(img->format));
+		return -EINVAL;
+	}
+
+	/* using third-address */
+	if (img->uv_addr > 0) {
+		handle = img->yrgb_addr;
+		if (handle > 0) {
+			ret = rga_mm_get_buffer(mm, job, handle, &img->yrgb_addr,
+						&job_buf->y_addr, yrgb_size, dir);
+			if (ret < 0) {
+				pr_err("handle[%d] Can't get y/rgb address info!\n", handle);
+				return ret;
+			}
+		}
+
+		handle = img->uv_addr;
+		if (handle > 0) {
+			ret = rga_mm_get_buffer(mm, job, handle, &img->uv_addr,
+						&job_buf->uv_addr, uv_size, dir);
+			if (ret < 0) {
+				pr_err("handle[%d] Can't get uv address info!\n", handle);
+				return ret;
+			}
+		}
+
+		handle = img->v_addr;
+		if (handle > 0) {
+			ret = rga_mm_get_buffer(mm, job, handle, &img->v_addr,
+						&job_buf->v_addr, v_size, dir);
+			if (ret < 0) {
+				pr_err("handle[%d] Can't get uv address info!\n", handle);
+				return ret;
+			}
+		}
+	} else {
+		handle = img->yrgb_addr;
+		if (handle > 0) {
+			ret = rga_mm_get_buffer(mm, job, handle, &img->yrgb_addr,
+						&job_buf->addr, img_size, dir);
+			if (ret < 0) {
+				pr_err("handle[%d] Can't get y/rgb address info!\n", handle);
+				return ret;
+			}
+		}
+
+		rga_convert_addr(img, false);
+	}
+
+	if (job->scheduler->data->mmu == RGA_MMU &&
+	    rga_mm_is_need_mmu(job, job_buf->addr)) {
+		ret = rga_mm_set_mmu_base(job, img, job_buf);
+		if (ret < 0) {
+			pr_err("Can't set RGA2 MMU_BASE from handle!\n");
+
+			rga_mm_put_channel_handle_info(mm, job, job_buf, dir);
+			return ret;
+		}
+	}
+
+	return 0;
+}
+
 static int rga_mm_get_handle_info(struct rga_job *job)
 {
 	int ret = 0;
@@ -1496,7 +1580,7 @@
 						     &job->src_buffer,
 						     DMA_TO_DEVICE);
 		if (ret < 0) {
-			pr_err("Can't get src buffer third info!\n");
+			pr_err("Can't get src buffer info from handle!\n");
 			return ret;
 		}
 	}
@@ -1506,7 +1590,7 @@
 						     &job->dst_buffer,
 						     DMA_TO_DEVICE);
 		if (ret < 0) {
-			pr_err("Can't get dst buffer third info!\n");
+			pr_err("Can't get dst buffer info from handle!\n");
 			return ret;
 		}
 	}
@@ -1528,7 +1612,7 @@
 							     DMA_BIDIRECTIONAL);
 		}
 		if (ret < 0) {
-			pr_err("Can't get pat buffer third info!\n");
+			pr_err("Can't get pat buffer info from handle!\n");
 			return ret;
 		}
 	}
@@ -1869,7 +1953,7 @@
 uint32_t rga_mm_import_buffer(struct rga_external_buffer *external_buffer,
 			      struct rga_session *session)
 {
-	int ret = 0;
+	int ret = 0, new_id;
 	struct rga_mm *mm;
 	struct rga_internal_buffer *internal_buffer;
 
@@ -1911,9 +1995,14 @@
 	 * allocation under our spinlock.
 	 */
 	idr_preload(GFP_KERNEL);
-	internal_buffer->handle = idr_alloc(&mm->memory_idr, internal_buffer, 1, 0, GFP_KERNEL);
+	new_id = idr_alloc_cyclic(&mm->memory_idr, internal_buffer, 1, 0, GFP_NOWAIT);
 	idr_preload_end();
+	if (new_id < 0) {
+		pr_err("internal_buffer alloc id failed!\n");
+		goto FREE_INTERNAL_BUFFER;
+	}
 
+	internal_buffer->handle = new_id;
 	mm->buffer_count++;
 
 	if (DEBUGGER_EN(MM)) {
diff --git a/kernel/drivers/video/rockchip/rga3/rga_policy.c b/kernel/drivers/video/rockchip/rga3/rga_policy.c
index 4e26797..9801e6d 100644
--- a/kernel/drivers/video/rockchip/rga3/rga_policy.c
+++ b/kernel/drivers/video/rockchip/rga3/rga_policy.c
@@ -118,6 +118,12 @@
 	if (!rga_check_resolution(&data->input_range, src0->act_w, src0->act_h))
 		return false;
 
+	if (data == &rga3_data &&
+	    !rga_check_resolution(&data->input_range,
+				  src0->act_w + src0->x_offset,
+				  src0->act_h + src0->y_offset))
+		return false;
+
 	if (!rga_check_format(data, src0->rd_mode, src0->format, 0))
 		return false;
 
@@ -133,6 +139,12 @@
 	if (!rga_check_resolution(&data->input_range, src1->act_w, src1->act_h))
 		return false;
 
+	if (data == &rga3_data &&
+	    !rga_check_resolution(&data->input_range,
+				  src1->act_w + src1->x_offset,
+				  src1->act_h + src1->y_offset))
+		return false;
+
 	if (!rga_check_format(data, src1->rd_mode, src1->format, 1))
 		return false;
 
@@ -148,6 +160,12 @@
 	if (!rga_check_resolution(&data->output_range, dst->act_w, dst->act_h))
 		return false;
 
+	if (data == &rga3_data &&
+	    !rga_check_resolution(&data->output_range,
+				  dst->act_w + dst->x_offset,
+				  dst->act_h + dst->y_offset))
+		return false;
+
 	if (!rga_check_format(data, dst->rd_mode, dst->format, 2))
 		return false;
 
diff --git a/kernel/drivers/watchdog/watchdog_dev.c b/kernel/drivers/watchdog/watchdog_dev.c
index 8fe59b7..516782c 100644
--- a/kernel/drivers/watchdog/watchdog_dev.c
+++ b/kernel/drivers/watchdog/watchdog_dev.c
@@ -145,7 +145,7 @@
 		ktime_t t = watchdog_next_keepalive(wdd);
 
 		if (t > 0)
-			hrtimer_start(&wd_data->timer, t, HRTIMER_MODE_REL);
+			hrtimer_start(&wd_data->timer, t, HRTIMER_MODE_REL_HARD);
 	} else {
 		hrtimer_cancel(&wd_data->timer);
 	}
@@ -164,7 +164,7 @@
 	if (ktime_after(earliest_keepalive, now)) {
 		hrtimer_start(&wd_data->timer,
 			      ktime_sub(earliest_keepalive, now),
-			      HRTIMER_MODE_REL);
+			      HRTIMER_MODE_REL_HARD);
 		return 0;
 	}
 
@@ -959,7 +959,7 @@
 	dev_set_name(&wd_data->dev, "watchdog%d", wdd->id);
 
 	kthread_init_work(&wd_data->work, watchdog_ping_work);
-	hrtimer_init(&wd_data->timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
+	hrtimer_init(&wd_data->timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL_HARD);
 	wd_data->timer.function = watchdog_timer_expired;
 
 	if (wdd->id == 0) {
@@ -1007,7 +1007,7 @@
 		__module_get(wdd->ops->owner);
 		get_device(&wd_data->dev);
 		if (handle_boot_enabled)
-			hrtimer_start(&wd_data->timer, 0, HRTIMER_MODE_REL);
+			hrtimer_start(&wd_data->timer, 0, HRTIMER_MODE_REL_HARD);
 		else
 			pr_info("watchdog%d running and kernel based pre-userspace handler disabled\n",
 				wdd->id);
diff --git a/kernel/fs/aio.c b/kernel/fs/aio.c
index 9635c29..6deff68 100644
--- a/kernel/fs/aio.c
+++ b/kernel/fs/aio.c
@@ -121,6 +121,7 @@
 	long			nr_pages;
 
 	struct rcu_work		free_rwork;	/* see free_ioctx() */
+	struct work_struct	free_work;	/* see free_ioctx() */
 
 	/*
 	 * signals when all in-flight requests are done
@@ -608,9 +609,9 @@
  * and ctx->users has dropped to 0, so we know no more kiocbs can be submitted -
  * now it's safe to cancel any that need to be.
  */
-static void free_ioctx_users(struct percpu_ref *ref)
+static void free_ioctx_users_work(struct work_struct *work)
 {
-	struct kioctx *ctx = container_of(ref, struct kioctx, users);
+	struct kioctx *ctx = container_of(work, struct kioctx, free_work);
 	struct aio_kiocb *req;
 
 	spin_lock_irq(&ctx->ctx_lock);
@@ -628,6 +629,14 @@
 	percpu_ref_put(&ctx->reqs);
 }
 
+static void free_ioctx_users(struct percpu_ref *ref)
+{
+	struct kioctx *ctx = container_of(ref, struct kioctx, users);
+
+	INIT_WORK(&ctx->free_work, free_ioctx_users_work);
+	schedule_work(&ctx->free_work);
+}
+
 static int ioctx_add_table(struct kioctx *ctx, struct mm_struct *mm)
 {
 	unsigned i, new_nr;
diff --git a/kernel/fs/autofs/expire.c b/kernel/fs/autofs/expire.c
index 70e9afe..1a6b88a 100644
--- a/kernel/fs/autofs/expire.c
+++ b/kernel/fs/autofs/expire.c
@@ -8,6 +8,7 @@
  * option, any later version, incorporated herein by reference.
  */
 
+#include <linux/delay.h>
 #include "autofs_i.h"
 
 /* Check if a dentry can be expired */
@@ -153,7 +154,7 @@
 			parent = p->d_parent;
 			if (!spin_trylock(&parent->d_lock)) {
 				spin_unlock(&p->d_lock);
-				cpu_relax();
+				cpu_chill();
 				goto relock;
 			}
 			spin_unlock(&p->d_lock);
diff --git a/kernel/fs/buffer.c b/kernel/fs/buffer.c
index 2fa1ad5..b9164e5 100644
--- a/kernel/fs/buffer.c
+++ b/kernel/fs/buffer.c
@@ -275,8 +275,7 @@
 	 * decide that the page is now completely done.
 	 */
 	first = page_buffers(page);
-	local_irq_save(flags);
-	bit_spin_lock(BH_Uptodate_Lock, &first->b_state);
+	flags = bh_uptodate_lock_irqsave(first);
 	clear_buffer_async_read(bh);
 	unlock_buffer(bh);
 	tmp = bh;
@@ -289,8 +288,7 @@
 		}
 		tmp = tmp->b_this_page;
 	} while (tmp != bh);
-	bit_spin_unlock(BH_Uptodate_Lock, &first->b_state);
-	local_irq_restore(flags);
+	bh_uptodate_unlock_irqrestore(first, flags);
 
 	/*
 	 * If none of the buffers had errors and they are all
@@ -302,9 +300,7 @@
 	return;
 
 still_busy:
-	bit_spin_unlock(BH_Uptodate_Lock, &first->b_state);
-	local_irq_restore(flags);
-	return;
+	bh_uptodate_unlock_irqrestore(first, flags);
 }
 
 /*
@@ -331,8 +327,7 @@
 	}
 
 	first = page_buffers(page);
-	local_irq_save(flags);
-	bit_spin_lock(BH_Uptodate_Lock, &first->b_state);
+	flags = bh_uptodate_lock_irqsave(first);
 
 	clear_buffer_async_write(bh);
 	unlock_buffer(bh);
@@ -344,15 +339,12 @@
 		}
 		tmp = tmp->b_this_page;
 	}
-	bit_spin_unlock(BH_Uptodate_Lock, &first->b_state);
-	local_irq_restore(flags);
+	bh_uptodate_unlock_irqrestore(first, flags);
 	end_page_writeback(page);
 	return;
 
 still_busy:
-	bit_spin_unlock(BH_Uptodate_Lock, &first->b_state);
-	local_irq_restore(flags);
-	return;
+	bh_uptodate_unlock_irqrestore(first, flags);
 }
 EXPORT_SYMBOL(end_buffer_async_write);
 
@@ -3375,6 +3367,7 @@
 	struct buffer_head *ret = kmem_cache_zalloc(bh_cachep, gfp_flags);
 	if (ret) {
 		INIT_LIST_HEAD(&ret->b_assoc_buffers);
+		buffer_head_init_locks(ret);
 		preempt_disable();
 		__this_cpu_inc(bh_accounting.nr);
 		recalc_bh_state();
diff --git a/kernel/fs/cifs/readdir.c b/kernel/fs/cifs/readdir.c
index 3925a7b..33f7723 100644
--- a/kernel/fs/cifs/readdir.c
+++ b/kernel/fs/cifs/readdir.c
@@ -80,7 +80,7 @@
 	struct inode *inode;
 	struct super_block *sb = parent->d_sb;
 	struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
-	DECLARE_WAIT_QUEUE_HEAD_ONSTACK(wq);
+	DECLARE_SWAIT_QUEUE_HEAD_ONSTACK(wq);
 
 	cifs_dbg(FYI, "%s: for %s\n", __func__, name->name);
 
diff --git a/kernel/fs/dcache.c b/kernel/fs/dcache.c
index d3553ca..7893359 100644
--- a/kernel/fs/dcache.c
+++ b/kernel/fs/dcache.c
@@ -2387,9 +2387,10 @@
 static inline unsigned start_dir_add(struct inode *dir)
 {
 
+	preempt_disable_rt();
 	for (;;) {
-		unsigned n = dir->i_dir_seq;
-		if (!(n & 1) && cmpxchg(&dir->i_dir_seq, n, n + 1) == n)
+		unsigned n = dir->__i_dir_seq;
+		if (!(n & 1) && cmpxchg(&dir->__i_dir_seq, n, n + 1) == n)
 			return n;
 		cpu_relax();
 	}
@@ -2397,26 +2398,30 @@
 
 static inline void end_dir_add(struct inode *dir, unsigned n)
 {
-	smp_store_release(&dir->i_dir_seq, n + 2);
+	smp_store_release(&dir->__i_dir_seq, n + 2);
+	preempt_enable_rt();
 }
 
 static void d_wait_lookup(struct dentry *dentry)
 {
-	if (d_in_lookup(dentry)) {
-		DECLARE_WAITQUEUE(wait, current);
-		add_wait_queue(dentry->d_wait, &wait);
-		do {
-			set_current_state(TASK_UNINTERRUPTIBLE);
-			spin_unlock(&dentry->d_lock);
-			schedule();
-			spin_lock(&dentry->d_lock);
-		} while (d_in_lookup(dentry));
-	}
+	struct swait_queue __wait;
+
+	if (!d_in_lookup(dentry))
+		return;
+
+	INIT_LIST_HEAD(&__wait.task_list);
+	do {
+		prepare_to_swait_exclusive(dentry->d_wait, &__wait, TASK_UNINTERRUPTIBLE);
+		spin_unlock(&dentry->d_lock);
+		schedule();
+		spin_lock(&dentry->d_lock);
+	} while (d_in_lookup(dentry));
+	finish_swait(dentry->d_wait, &__wait);
 }
 
 struct dentry *d_alloc_parallel(struct dentry *parent,
 				const struct qstr *name,
-				wait_queue_head_t *wq)
+				struct swait_queue_head *wq)
 {
 	unsigned int hash = name->hash;
 	struct hlist_bl_head *b = in_lookup_hash(parent, hash);
@@ -2430,7 +2435,7 @@
 
 retry:
 	rcu_read_lock();
-	seq = smp_load_acquire(&parent->d_inode->i_dir_seq);
+	seq = smp_load_acquire(&parent->d_inode->__i_dir_seq);
 	r_seq = read_seqbegin(&rename_lock);
 	dentry = __d_lookup_rcu(parent, name, &d_seq);
 	if (unlikely(dentry)) {
@@ -2458,7 +2463,7 @@
 	}
 
 	hlist_bl_lock(b);
-	if (unlikely(READ_ONCE(parent->d_inode->i_dir_seq) != seq)) {
+	if (unlikely(READ_ONCE(parent->d_inode->__i_dir_seq) != seq)) {
 		hlist_bl_unlock(b);
 		rcu_read_unlock();
 		goto retry;
@@ -2531,7 +2536,7 @@
 	hlist_bl_lock(b);
 	dentry->d_flags &= ~DCACHE_PAR_LOOKUP;
 	__hlist_bl_del(&dentry->d_u.d_in_lookup_hash);
-	wake_up_all(dentry->d_wait);
+	swake_up_all(dentry->d_wait);
 	dentry->d_wait = NULL;
 	hlist_bl_unlock(b);
 	INIT_HLIST_NODE(&dentry->d_u.d_alias);
@@ -3044,6 +3049,8 @@
 
 static void __init dcache_init_early(void)
 {
+	unsigned int loop;
+
 	/* If hashes are distributed across NUMA nodes, defer
 	 * hash allocation until vmalloc space is available.
 	 */
@@ -3060,11 +3067,16 @@
 					NULL,
 					0,
 					0);
+
+	for (loop = 0; loop < (1U << d_hash_shift); loop++)
+		INIT_HLIST_BL_HEAD(dentry_hashtable + loop);
+
 	d_hash_shift = 32 - d_hash_shift;
 }
 
 static void __init dcache_init(void)
 {
+	unsigned int loop;
 	/*
 	 * A constructor could be added for stable state like the lists,
 	 * but it is probably not worth it because of the cache nature
@@ -3088,6 +3100,10 @@
 					NULL,
 					0,
 					0);
+
+	for (loop = 0; loop < (1U << d_hash_shift); loop++)
+		INIT_HLIST_BL_HEAD(dentry_hashtable + loop);
+
 	d_hash_shift = 32 - d_hash_shift;
 }
 
diff --git a/kernel/fs/eventpoll.c b/kernel/fs/eventpoll.c
index 9a81b56..f080c7b 100644
--- a/kernel/fs/eventpoll.c
+++ b/kernel/fs/eventpoll.c
@@ -570,12 +570,12 @@
 
 static void ep_poll_safewake(wait_queue_head_t *wq)
 {
-	int this_cpu = get_cpu();
+	int this_cpu = get_cpu_light();
 
 	ep_call_nested(&poll_safewake_ncalls, EP_MAX_NESTS,
 		       ep_poll_wakeup_proc, NULL, wq, (void *) (long) this_cpu);
 
-	put_cpu();
+	put_cpu_light();
 }
 
 #else
diff --git a/kernel/fs/exec.c b/kernel/fs/exec.c
index f1d7ee6..bbeec1f 100644
--- a/kernel/fs/exec.c
+++ b/kernel/fs/exec.c
@@ -1028,6 +1028,7 @@
 		}
 	}
 	task_lock(tsk);
+	preempt_disable_rt();
 
 	local_irq_disable();
 	active_mm = tsk->active_mm;
@@ -1047,6 +1048,7 @@
 		local_irq_enable();
 	tsk->mm->vmacache_seqnum = 0;
 	vmacache_flush(tsk);
+	preempt_enable_rt();
 	task_unlock(tsk);
 	if (old_mm) {
 		up_read(&old_mm->mmap_sem);
diff --git a/kernel/fs/ext4/page-io.c b/kernel/fs/ext4/page-io.c
index e2fad25..9dcc036 100644
--- a/kernel/fs/ext4/page-io.c
+++ b/kernel/fs/ext4/page-io.c
@@ -90,8 +90,7 @@
 		 * We check all buffers in the page under BH_Uptodate_Lock
 		 * to avoid races with other end io clearing async_write flags
 		 */
-		local_irq_save(flags);
-		bit_spin_lock(BH_Uptodate_Lock, &head->b_state);
+		flags = bh_uptodate_lock_irqsave(head);
 		do {
 			if (bh_offset(bh) < bio_start ||
 			    bh_offset(bh) + bh->b_size > bio_end) {
@@ -103,8 +102,7 @@
 			if (bio->bi_status)
 				buffer_io_error(bh);
 		} while ((bh = bh->b_this_page) != head);
-		bit_spin_unlock(BH_Uptodate_Lock, &head->b_state);
-		local_irq_restore(flags);
+		bh_uptodate_unlock_irqrestore(head, flags);
 		if (!under_io) {
 			fscrypt_free_bounce_page(bounce_page);
 			end_page_writeback(page);
diff --git a/kernel/fs/fscache/cookie.c b/kernel/fs/fscache/cookie.c
index 2ff05ad..84e5719 100644
--- a/kernel/fs/fscache/cookie.c
+++ b/kernel/fs/fscache/cookie.c
@@ -950,3 +950,11 @@
 	return -ESTALE;
 }
 EXPORT_SYMBOL(__fscache_check_consistency);
+
+void __init fscache_cookie_init(void)
+{
+	int i;
+
+	for (i = 0; i < ARRAY_SIZE(fscache_cookie_hash); i++)
+		INIT_HLIST_BL_HEAD(&fscache_cookie_hash[i]);
+}
diff --git a/kernel/fs/fscache/main.c b/kernel/fs/fscache/main.c
index aa49234..95a0798 100644
--- a/kernel/fs/fscache/main.c
+++ b/kernel/fs/fscache/main.c
@@ -188,6 +188,7 @@
 		ret = -ENOMEM;
 		goto error_cookie_jar;
 	}
+	fscache_cookie_init();
 
 	fscache_root = kobject_create_and_add("fscache", kernel_kobj);
 	if (!fscache_root)
diff --git a/kernel/fs/fuse/dir.c b/kernel/fs/fuse/dir.c
index ace6002..2bc20cd 100644
--- a/kernel/fs/fuse/dir.c
+++ b/kernel/fs/fuse/dir.c
@@ -1273,7 +1273,7 @@
 	struct inode *dir = d_inode(parent);
 	struct fuse_conn *fc;
 	struct inode *inode;
-	DECLARE_WAIT_QUEUE_HEAD_ONSTACK(wq);
+	DECLARE_SWAIT_QUEUE_HEAD_ONSTACK(wq);
 
 	if (!o->nodeid) {
 		/*
diff --git a/kernel/fs/inode.c b/kernel/fs/inode.c
index 9e46350..3317c75 100644
--- a/kernel/fs/inode.c
+++ b/kernel/fs/inode.c
@@ -157,7 +157,7 @@
 	inode->i_bdev = NULL;
 	inode->i_cdev = NULL;
 	inode->i_link = NULL;
-	inode->i_dir_seq = 0;
+	inode->__i_dir_seq = 0;
 	inode->i_rdev = 0;
 	inode->dirtied_when = 0;
 
diff --git a/kernel/fs/locks.c b/kernel/fs/locks.c
index 28270e7..552476d 100644
--- a/kernel/fs/locks.c
+++ b/kernel/fs/locks.c
@@ -936,7 +936,7 @@
 			return -ENOMEM;
 	}
 
-	percpu_down_read_preempt_disable(&file_rwsem);
+	percpu_down_read(&file_rwsem);
 	spin_lock(&ctx->flc_lock);
 	if (request->fl_flags & FL_ACCESS)
 		goto find_conflict;
@@ -977,7 +977,7 @@
 
 out:
 	spin_unlock(&ctx->flc_lock);
-	percpu_up_read_preempt_enable(&file_rwsem);
+	percpu_up_read(&file_rwsem);
 	if (new_fl)
 		locks_free_lock(new_fl);
 	locks_dispose_list(&dispose);
@@ -1015,7 +1015,7 @@
 		new_fl2 = locks_alloc_lock();
 	}
 
-	percpu_down_read_preempt_disable(&file_rwsem);
+	percpu_down_read(&file_rwsem);
 	spin_lock(&ctx->flc_lock);
 	/*
 	 * New lock request. Walk all POSIX locks and look for conflicts. If
@@ -1187,7 +1187,7 @@
 	}
  out:
 	spin_unlock(&ctx->flc_lock);
-	percpu_up_read_preempt_enable(&file_rwsem);
+	percpu_up_read(&file_rwsem);
 	/*
 	 * Free any unused locks.
 	 */
@@ -1462,7 +1462,7 @@
 		return error;
 	}
 
-	percpu_down_read_preempt_disable(&file_rwsem);
+	percpu_down_read(&file_rwsem);
 	spin_lock(&ctx->flc_lock);
 
 	time_out_leases(inode, &dispose);
@@ -1514,13 +1514,13 @@
 	locks_insert_block(fl, new_fl);
 	trace_break_lease_block(inode, new_fl);
 	spin_unlock(&ctx->flc_lock);
-	percpu_up_read_preempt_enable(&file_rwsem);
+	percpu_up_read(&file_rwsem);
 
 	locks_dispose_list(&dispose);
 	error = wait_event_interruptible_timeout(new_fl->fl_wait,
 						!new_fl->fl_next, break_time);
 
-	percpu_down_read_preempt_disable(&file_rwsem);
+	percpu_down_read(&file_rwsem);
 	spin_lock(&ctx->flc_lock);
 	trace_break_lease_unblock(inode, new_fl);
 	locks_delete_block(new_fl);
@@ -1537,7 +1537,7 @@
 	}
 out:
 	spin_unlock(&ctx->flc_lock);
-	percpu_up_read_preempt_enable(&file_rwsem);
+	percpu_up_read(&file_rwsem);
 	locks_dispose_list(&dispose);
 	locks_free_lock(new_fl);
 	return error;
@@ -1609,7 +1609,7 @@
 
 	ctx = smp_load_acquire(&inode->i_flctx);
 	if (ctx && !list_empty_careful(&ctx->flc_lease)) {
-		percpu_down_read_preempt_disable(&file_rwsem);
+		percpu_down_read(&file_rwsem);
 		spin_lock(&ctx->flc_lock);
 		time_out_leases(inode, &dispose);
 		list_for_each_entry(fl, &ctx->flc_lease, fl_list) {
@@ -1619,7 +1619,7 @@
 			break;
 		}
 		spin_unlock(&ctx->flc_lock);
-		percpu_up_read_preempt_enable(&file_rwsem);
+		percpu_up_read(&file_rwsem);
 
 		locks_dispose_list(&dispose);
 	}
@@ -1693,7 +1693,7 @@
 		return -EINVAL;
 	}
 
-	percpu_down_read_preempt_disable(&file_rwsem);
+	percpu_down_read(&file_rwsem);
 	spin_lock(&ctx->flc_lock);
 	time_out_leases(inode, &dispose);
 	error = check_conflicting_open(dentry, arg, lease->fl_flags);
@@ -1764,7 +1764,7 @@
 		lease->fl_lmops->lm_setup(lease, priv);
 out:
 	spin_unlock(&ctx->flc_lock);
-	percpu_up_read_preempt_enable(&file_rwsem);
+	percpu_up_read(&file_rwsem);
 	locks_dispose_list(&dispose);
 	if (is_deleg)
 		inode_unlock(inode);
@@ -1787,7 +1787,7 @@
 		return error;
 	}
 
-	percpu_down_read_preempt_disable(&file_rwsem);
+	percpu_down_read(&file_rwsem);
 	spin_lock(&ctx->flc_lock);
 	list_for_each_entry(fl, &ctx->flc_lease, fl_list) {
 		if (fl->fl_file == filp &&
@@ -1800,7 +1800,7 @@
 	if (victim)
 		error = fl->fl_lmops->lm_change(victim, F_UNLCK, &dispose);
 	spin_unlock(&ctx->flc_lock);
-	percpu_up_read_preempt_enable(&file_rwsem);
+	percpu_up_read(&file_rwsem);
 	locks_dispose_list(&dispose);
 	return error;
 }
@@ -2531,13 +2531,13 @@
 	if (list_empty(&ctx->flc_lease))
 		return;
 
-	percpu_down_read_preempt_disable(&file_rwsem);
+	percpu_down_read(&file_rwsem);
 	spin_lock(&ctx->flc_lock);
 	list_for_each_entry_safe(fl, tmp, &ctx->flc_lease, fl_list)
 		if (filp == fl->fl_file)
 			lease_modify(fl, F_UNLCK, &dispose);
 	spin_unlock(&ctx->flc_lock);
-	percpu_up_read_preempt_enable(&file_rwsem);
+	percpu_up_read(&file_rwsem);
 
 	locks_dispose_list(&dispose);
 }
diff --git a/kernel/fs/namei.c b/kernel/fs/namei.c
index 8492dc6..1eab029 100644
--- a/kernel/fs/namei.c
+++ b/kernel/fs/namei.c
@@ -1740,7 +1740,7 @@
 {
 	struct dentry *dentry, *old;
 	struct inode *inode = dir->d_inode;
-	DECLARE_WAIT_QUEUE_HEAD_ONSTACK(wq);
+	DECLARE_SWAIT_QUEUE_HEAD_ONSTACK(wq);
 
 	/* Don't go there if it's already dead */
 	if (unlikely(IS_DEADDIR(inode)))
@@ -3253,7 +3253,7 @@
 	struct dentry *dentry;
 	int error, create_error = 0;
 	umode_t mode = op->mode;
-	DECLARE_WAIT_QUEUE_HEAD_ONSTACK(wq);
+	DECLARE_SWAIT_QUEUE_HEAD_ONSTACK(wq);
 
 	if (unlikely(IS_DEADDIR(dir_inode)))
 		return -ENOENT;
diff --git a/kernel/fs/namespace.c b/kernel/fs/namespace.c
index 8775302..db572d7 100644
--- a/kernel/fs/namespace.c
+++ b/kernel/fs/namespace.c
@@ -14,6 +14,7 @@
 #include <linux/mnt_namespace.h>
 #include <linux/user_namespace.h>
 #include <linux/namei.h>
+#include <linux/delay.h>
 #include <linux/security.h>
 #include <linux/cred.h>
 #include <linux/idr.h>
@@ -328,8 +329,11 @@
 	 * incremented count after it has set MNT_WRITE_HOLD.
 	 */
 	smp_mb();
-	while (READ_ONCE(mnt->mnt.mnt_flags) & MNT_WRITE_HOLD)
-		cpu_relax();
+	while (READ_ONCE(mnt->mnt.mnt_flags) & MNT_WRITE_HOLD) {
+		preempt_enable();
+		cpu_chill();
+		preempt_disable();
+	}
 	/*
 	 * After the slowpath clears MNT_WRITE_HOLD, mnt_is_readonly will
 	 * be set to match its requirements. So we must not load that until
diff --git a/kernel/fs/nfs/delegation.c b/kernel/fs/nfs/delegation.c
index b0c0c2f..26565ba 100644
--- a/kernel/fs/nfs/delegation.c
+++ b/kernel/fs/nfs/delegation.c
@@ -162,11 +162,11 @@
 		sp = state->owner;
 		/* Block nfs4_proc_unlck */
 		mutex_lock(&sp->so_delegreturn_mutex);
-		seq = raw_seqcount_begin(&sp->so_reclaim_seqcount);
+		seq = read_seqbegin(&sp->so_reclaim_seqlock);
 		err = nfs4_open_delegation_recall(ctx, state, stateid);
 		if (!err)
 			err = nfs_delegation_claim_locks(state, stateid);
-		if (!err && read_seqcount_retry(&sp->so_reclaim_seqcount, seq))
+		if (!err && read_seqretry(&sp->so_reclaim_seqlock, seq))
 			err = -EAGAIN;
 		mutex_unlock(&sp->so_delegreturn_mutex);
 		put_nfs_open_context(ctx);
diff --git a/kernel/fs/nfs/dir.c b/kernel/fs/nfs/dir.c
index d06f7cd..2ba4d6e 100644
--- a/kernel/fs/nfs/dir.c
+++ b/kernel/fs/nfs/dir.c
@@ -457,7 +457,7 @@
 void nfs_prime_dcache(struct dentry *parent, struct nfs_entry *entry)
 {
 	struct qstr filename = QSTR_INIT(entry->name, entry->len);
-	DECLARE_WAIT_QUEUE_HEAD_ONSTACK(wq);
+	DECLARE_SWAIT_QUEUE_HEAD_ONSTACK(wq);
 	struct dentry *dentry;
 	struct dentry *alias;
 	struct inode *dir = d_inode(parent);
@@ -1520,7 +1520,7 @@
 		    struct file *file, unsigned open_flags,
 		    umode_t mode)
 {
-	DECLARE_WAIT_QUEUE_HEAD_ONSTACK(wq);
+	DECLARE_SWAIT_QUEUE_HEAD_ONSTACK(wq);
 	struct nfs_open_context *ctx;
 	struct dentry *res;
 	struct iattr attr = { .ia_valid = ATTR_OPEN };
@@ -1858,7 +1858,11 @@
 
 	trace_nfs_rmdir_enter(dir, dentry);
 	if (d_really_is_positive(dentry)) {
+#ifdef CONFIG_PREEMPT_RT_BASE
+		down(&NFS_I(d_inode(dentry))->rmdir_sem);
+#else
 		down_write(&NFS_I(d_inode(dentry))->rmdir_sem);
+#endif
 		error = NFS_PROTO(dir)->rmdir(dir, &dentry->d_name);
 		/* Ensure the VFS deletes this inode */
 		switch (error) {
@@ -1868,7 +1872,11 @@
 		case -ENOENT:
 			nfs_dentry_handle_enoent(dentry);
 		}
+#ifdef CONFIG_PREEMPT_RT_BASE
+		up(&NFS_I(d_inode(dentry))->rmdir_sem);
+#else
 		up_write(&NFS_I(d_inode(dentry))->rmdir_sem);
+#endif
 	} else
 		error = NFS_PROTO(dir)->rmdir(dir, &dentry->d_name);
 	trace_nfs_rmdir_exit(dir, dentry, error);
diff --git a/kernel/fs/nfs/inode.c b/kernel/fs/nfs/inode.c
index 592b95a..4fc14fb 100644
--- a/kernel/fs/nfs/inode.c
+++ b/kernel/fs/nfs/inode.c
@@ -2105,7 +2105,11 @@
 	atomic_long_set(&nfsi->nrequests, 0);
 	atomic_long_set(&nfsi->commit_info.ncommit, 0);
 	atomic_set(&nfsi->commit_info.rpcs_out, 0);
+#ifdef CONFIG_PREEMPT_RT_BASE
+	sema_init(&nfsi->rmdir_sem, 1);
+#else
 	init_rwsem(&nfsi->rmdir_sem);
+#endif
 	mutex_init(&nfsi->commit_mutex);
 	nfs4_init_once(nfsi);
 }
diff --git a/kernel/fs/nfs/nfs4_fs.h b/kernel/fs/nfs/nfs4_fs.h
index 5ac7bf2..b15a7a2 100644
--- a/kernel/fs/nfs/nfs4_fs.h
+++ b/kernel/fs/nfs/nfs4_fs.h
@@ -114,7 +114,7 @@
 	unsigned long	     so_flags;
 	struct list_head     so_states;
 	struct nfs_seqid_counter so_seqid;
-	seqcount_t	     so_reclaim_seqcount;
+	seqlock_t	     so_reclaim_seqlock;
 	struct mutex	     so_delegreturn_mutex;
 };
 
diff --git a/kernel/fs/nfs/nfs4proc.c b/kernel/fs/nfs/nfs4proc.c
index 759c834..256a4b0 100644
--- a/kernel/fs/nfs/nfs4proc.c
+++ b/kernel/fs/nfs/nfs4proc.c
@@ -2874,7 +2874,7 @@
 	unsigned int seq;
 	int ret;
 
-	seq = raw_seqcount_begin(&sp->so_reclaim_seqcount);
+	seq = raw_seqcount_begin(&sp->so_reclaim_seqlock.seqcount);
 
 	ret = _nfs4_proc_open(opendata, ctx);
 	if (ret != 0)
@@ -2915,7 +2915,7 @@
 
 	if (d_inode(dentry) == state->inode) {
 		nfs_inode_attach_open_context(ctx);
-		if (read_seqcount_retry(&sp->so_reclaim_seqcount, seq))
+		if (read_seqretry(&sp->so_reclaim_seqlock, seq))
 			nfs4_schedule_stateid_recovery(server, state);
 	}
 
diff --git a/kernel/fs/nfs/nfs4state.c b/kernel/fs/nfs/nfs4state.c
index 9c98547..184b549 100644
--- a/kernel/fs/nfs/nfs4state.c
+++ b/kernel/fs/nfs/nfs4state.c
@@ -515,7 +515,7 @@
 	nfs4_init_seqid_counter(&sp->so_seqid);
 	atomic_set(&sp->so_count, 1);
 	INIT_LIST_HEAD(&sp->so_lru);
-	seqcount_init(&sp->so_reclaim_seqcount);
+	seqlock_init(&sp->so_reclaim_seqlock);
 	mutex_init(&sp->so_delegreturn_mutex);
 	return sp;
 }
@@ -1583,8 +1583,12 @@
 	 * recovering after a network partition or a reboot from a
 	 * server that doesn't support a grace period.
 	 */
+#ifdef CONFIG_PREEMPT_RT_FULL
+	write_seqlock(&sp->so_reclaim_seqlock);
+#else
+	write_seqcount_begin(&sp->so_reclaim_seqlock.seqcount);
+#endif
 	spin_lock(&sp->so_lock);
-	raw_write_seqcount_begin(&sp->so_reclaim_seqcount);
 restart:
 	list_for_each_entry(state, &sp->so_states, open_states) {
 		if (!test_and_clear_bit(ops->state_flag_bit, &state->flags))
@@ -1671,14 +1675,20 @@
 		spin_lock(&sp->so_lock);
 		goto restart;
 	}
-	raw_write_seqcount_end(&sp->so_reclaim_seqcount);
 	spin_unlock(&sp->so_lock);
+#ifdef CONFIG_PREEMPT_RT_FULL
+	write_sequnlock(&sp->so_reclaim_seqlock);
+#else
+	write_seqcount_end(&sp->so_reclaim_seqlock.seqcount);
+#endif
 	return 0;
 out_err:
 	nfs4_put_open_state(state);
-	spin_lock(&sp->so_lock);
-	raw_write_seqcount_end(&sp->so_reclaim_seqcount);
-	spin_unlock(&sp->so_lock);
+#ifdef CONFIG_PREEMPT_RT_FULL
+	write_sequnlock(&sp->so_reclaim_seqlock);
+#else
+	write_seqcount_end(&sp->so_reclaim_seqlock.seqcount);
+#endif
 	return status;
 }
 
diff --git a/kernel/fs/nfs/unlink.c b/kernel/fs/nfs/unlink.c
index fd61bf0..839bfa7 100644
--- a/kernel/fs/nfs/unlink.c
+++ b/kernel/fs/nfs/unlink.c
@@ -13,7 +13,7 @@
 #include <linux/sunrpc/clnt.h>
 #include <linux/nfs_fs.h>
 #include <linux/sched.h>
-#include <linux/wait.h>
+#include <linux/swait.h>
 #include <linux/namei.h>
 #include <linux/fsnotify.h>
 
@@ -52,6 +52,29 @@
 		rpc_restart_call_prepare(task);
 }
 
+#ifdef CONFIG_PREEMPT_RT_BASE
+static void nfs_down_anon(struct semaphore *sema)
+{
+	down(sema);
+}
+
+static void nfs_up_anon(struct semaphore *sema)
+{
+	up(sema);
+}
+
+#else
+static void nfs_down_anon(struct rw_semaphore *rwsem)
+{
+	down_read_non_owner(rwsem);
+}
+
+static void nfs_up_anon(struct rw_semaphore *rwsem)
+{
+	up_read_non_owner(rwsem);
+}
+#endif
+
 /**
  * nfs_async_unlink_release - Release the sillydelete data.
  * @task: rpc_task of the sillydelete
@@ -65,7 +88,7 @@
 	struct dentry *dentry = data->dentry;
 	struct super_block *sb = dentry->d_sb;
 
-	up_read_non_owner(&NFS_I(d_inode(dentry->d_parent))->rmdir_sem);
+	nfs_up_anon(&NFS_I(d_inode(dentry->d_parent))->rmdir_sem);
 	d_lookup_done(dentry);
 	nfs_free_unlinkdata(data);
 	dput(dentry);
@@ -118,10 +141,10 @@
 	struct inode *dir = d_inode(dentry->d_parent);
 	struct dentry *alias;
 
-	down_read_non_owner(&NFS_I(dir)->rmdir_sem);
+	nfs_down_anon(&NFS_I(dir)->rmdir_sem);
 	alias = d_alloc_parallel(dentry->d_parent, &data->args.name, &data->wq);
 	if (IS_ERR(alias)) {
-		up_read_non_owner(&NFS_I(dir)->rmdir_sem);
+		nfs_up_anon(&NFS_I(dir)->rmdir_sem);
 		return 0;
 	}
 	if (!d_in_lookup(alias)) {
@@ -143,7 +166,7 @@
 			ret = 0;
 		spin_unlock(&alias->d_lock);
 		dput(alias);
-		up_read_non_owner(&NFS_I(dir)->rmdir_sem);
+		nfs_up_anon(&NFS_I(dir)->rmdir_sem);
 		/*
 		 * If we'd displaced old cached devname, free it.  At that
 		 * point dentry is definitely not a root, so we won't need
@@ -183,7 +206,7 @@
 		goto out_free_name;
 	}
 	data->res.dir_attr = &data->dir_attr;
-	init_waitqueue_head(&data->wq);
+	init_swait_queue_head(&data->wq);
 
 	status = -EBUSY;
 	spin_lock(&dentry->d_lock);
diff --git a/kernel/fs/ntfs/aops.c b/kernel/fs/ntfs/aops.c
index 8946130..71d0b3b 100644
--- a/kernel/fs/ntfs/aops.c
+++ b/kernel/fs/ntfs/aops.c
@@ -106,8 +106,7 @@
 				"0x%llx.", (unsigned long long)bh->b_blocknr);
 	}
 	first = page_buffers(page);
-	local_irq_save(flags);
-	bit_spin_lock(BH_Uptodate_Lock, &first->b_state);
+	flags = bh_uptodate_lock_irqsave(first);
 	clear_buffer_async_read(bh);
 	unlock_buffer(bh);
 	tmp = bh;
@@ -122,8 +121,7 @@
 		}
 		tmp = tmp->b_this_page;
 	} while (tmp != bh);
-	bit_spin_unlock(BH_Uptodate_Lock, &first->b_state);
-	local_irq_restore(flags);
+	bh_uptodate_unlock_irqrestore(first, flags);
 	/*
 	 * If none of the buffers had errors then we can set the page uptodate,
 	 * but we first have to perform the post read mst fixups, if the
@@ -156,9 +154,7 @@
 	unlock_page(page);
 	return;
 still_busy:
-	bit_spin_unlock(BH_Uptodate_Lock, &first->b_state);
-	local_irq_restore(flags);
-	return;
+	bh_uptodate_unlock_irqrestore(first, flags);
 }
 
 /**
diff --git a/kernel/fs/proc/array.c b/kernel/fs/proc/array.c
index 9eb99a4..e4d0cfe 100644
--- a/kernel/fs/proc/array.c
+++ b/kernel/fs/proc/array.c
@@ -381,9 +381,9 @@
 static void task_cpus_allowed(struct seq_file *m, struct task_struct *task)
 {
 	seq_printf(m, "Cpus_allowed:\t%*pb\n",
-		   cpumask_pr_args(&task->cpus_allowed));
+		   cpumask_pr_args(task->cpus_ptr));
 	seq_printf(m, "Cpus_allowed_list:\t%*pbl\n",
-		   cpumask_pr_args(&task->cpus_allowed));
+		   cpumask_pr_args(task->cpus_ptr));
 }
 
 static inline void task_core_dumping(struct seq_file *m, struct mm_struct *mm)
diff --git a/kernel/fs/proc/base.c b/kernel/fs/proc/base.c
index 0dd4439..a5aa2f0 100644
--- a/kernel/fs/proc/base.c
+++ b/kernel/fs/proc/base.c
@@ -96,6 +96,7 @@
 #include <linux/posix-timers.h>
 #include <linux/cpufreq_times.h>
 #include <trace/events/oom.h>
+#include <linux/swait.h>
 #include "internal.h"
 #include "fd.h"
 
@@ -1890,7 +1891,7 @@
 
 	child = d_hash_and_lookup(dir, &qname);
 	if (!child) {
-		DECLARE_WAIT_QUEUE_HEAD_ONSTACK(wq);
+		DECLARE_SWAIT_QUEUE_HEAD_ONSTACK(wq);
 		child = d_alloc_parallel(dir, &qname, &wq);
 		if (IS_ERR(child))
 			goto end_instantiate;
diff --git a/kernel/fs/proc/proc_sysctl.c b/kernel/fs/proc/proc_sysctl.c
index c95f32b..75f500c 100644
--- a/kernel/fs/proc/proc_sysctl.c
+++ b/kernel/fs/proc/proc_sysctl.c
@@ -681,7 +681,7 @@
 
 	child = d_lookup(dir, &qname);
 	if (!child) {
-		DECLARE_WAIT_QUEUE_HEAD_ONSTACK(wq);
+		DECLARE_SWAIT_QUEUE_HEAD_ONSTACK(wq);
 		child = d_alloc_parallel(dir, &qname, &wq);
 		if (IS_ERR(child))
 			return false;
diff --git a/kernel/fs/pstore/Kconfig b/kernel/fs/pstore/Kconfig
index af8a858..e4599c5 100644
--- a/kernel/fs/pstore/Kconfig
+++ b/kernel/fs/pstore/Kconfig
@@ -166,10 +166,10 @@
 
 	  For more information, see Documentation/admin-guide/ramoops.rst.
 
-config PSTORE_MCU_LOG
-	bool "Print mcu log by linux"
+config PSTORE_BOOT_LOG
+	bool "Print boot log by linux"
 	depends on PSTORE
 	help
-	  When your soc has several mcu, you can get their log by cat command
+	  Collect log from loader,uboot,ATF and so on, you can get their log by cat command
 	  through linux shell
 	  If unsure, say N.
diff --git a/kernel/fs/pstore/inode.c b/kernel/fs/pstore/inode.c
index 39926e5..c82db67 100644
--- a/kernel/fs/pstore/inode.c
+++ b/kernel/fs/pstore/inode.c
@@ -37,7 +37,7 @@
 #include <linux/spinlock.h>
 #include <linux/uaccess.h>
 
-#ifdef CONFIG_PSTORE_MCU_LOG
+#ifdef CONFIG_PSTORE_BOOT_LOG
 #include <linux/pstore_ram.h>
 #include <linux/io.h>
 #endif
@@ -144,7 +144,7 @@
 {
 	struct seq_file *sf = file->private_data;
 	struct pstore_private *ps = sf->private;
-#ifdef CONFIG_PSTORE_MCU_LOG
+#ifdef CONFIG_PSTORE_BOOT_LOG
 	struct pstore_record *record = ps->record;
 	struct ramoops_context *cxt = record->psi->data;
 	struct persistent_ram_zone *prz;
@@ -152,12 +152,12 @@
 	char *log_tmp;
 	size_t size, start, n;
 
-	if (ps->record->type == PSTORE_TYPE_MCU_LOG) {
+	if (ps->record->type == PSTORE_TYPE_BOOT_LOG) {
 
 		if (!cxt)
 			return count;
 
-		prz = cxt->mcu_przs[record->id];
+		prz = cxt->boot_przs[record->id];
 
 		if (!prz)
 			return count;
@@ -412,9 +412,9 @@
 		scnprintf(name, sizeof(name), "powerpc-opal-%s-%llu",
 			  record->psi->name, record->id);
 		break;
-#ifdef CONFIG_PSTORE_MCU_LOG
-	case PSTORE_TYPE_MCU_LOG:
-		scnprintf(name, sizeof(name), "mcu-log-%llu", record->id);
+#ifdef CONFIG_PSTORE_BOOT_LOG
+	case PSTORE_TYPE_BOOT_LOG:
+		scnprintf(name, sizeof(name), "boot-log-%llu", record->id);
 		break;
 #endif
 	case PSTORE_TYPE_UNKNOWN:
diff --git a/kernel/fs/pstore/ram.c b/kernel/fs/pstore/ram.c
index 86b61bd..e531c04 100644
--- a/kernel/fs/pstore/ram.c
+++ b/kernel/fs/pstore/ram.c
@@ -301,13 +301,13 @@
 		}
 	}
 
-#ifdef CONFIG_PSTORE_MCU_LOG
+#ifdef CONFIG_PSTORE_BOOT_LOG
 	if (!prz_ok(prz)) {
-		while (cxt->mcu_log_read_cnt < cxt->max_mcu_log_cnt && !prz) {
-			prz = ramoops_get_next_prz(cxt->mcu_przs, &cxt->mcu_log_read_cnt,
-						cxt->max_mcu_log_cnt, &record->id,
+		while (cxt->boot_log_read_cnt < cxt->max_boot_log_cnt && !prz) {
+			prz = ramoops_get_next_prz(cxt->boot_przs, &cxt->boot_log_read_cnt,
+						cxt->max_boot_log_cnt, &record->id,
 						&record->type,
-						PSTORE_TYPE_MCU_LOG, 0);
+						PSTORE_TYPE_BOOT_LOG, 0);
 			if (!prz_ok(prz))
 				continue;
 		}
@@ -320,9 +320,9 @@
 	}
 
 	size = persistent_ram_old_size(prz) - header_length;
-#ifdef CONFIG_PSTORE_MCU_LOG
-	/* don't copy mcu log */
-	if (record->type == PSTORE_TYPE_MCU_LOG)
+#ifdef CONFIG_PSTORE_BOOT_LOG
+	/* don't copy boot log */
+	if (record->type == PSTORE_TYPE_BOOT_LOG)
 		goto out;
 #endif
 	/* ECC correction notice */
@@ -529,13 +529,13 @@
 		kfree(cxt->fprzs);
 		cxt->max_ftrace_cnt = 0;
 	}
-#ifdef CONFIG_PSTORE_MCU_LOG
-	/* Free mcu log PRZs */
-	if (cxt->mcu_przs) {
-		for (i = 0; i < cxt->max_mcu_log_cnt; i++)
-			persistent_ram_free(cxt->mcu_przs[i]);
-		kfree(cxt->mcu_przs);
-		cxt->max_mcu_log_cnt = 0;
+#ifdef CONFIG_PSTORE_BOOT_LOG
+	/* Free boot log PRZs */
+	if (cxt->boot_przs) {
+		for (i = 0; i < cxt->max_boot_log_cnt; i++)
+			persistent_ram_free(cxt->boot_przs[i]);
+		kfree(cxt->boot_przs);
+		cxt->max_boot_log_cnt = 0;
 	}
 #endif
 }
@@ -716,9 +716,9 @@
 	parse_size("pmsg-size", pdata->pmsg_size);
 	parse_size("ecc-size", pdata->ecc_info.ecc_size);
 	parse_size("flags", pdata->flags);
-#ifdef CONFIG_PSTORE_MCU_LOG
-	parse_size("mcu-log-size", pdata->mcu_log_size);
-	parse_size("mcu-log-count", pdata->max_mcu_log_cnt);
+#ifdef CONFIG_PSTORE_BOOT_LOG
+	parse_size("boot-log-size", pdata->boot_log_size);
+	parse_size("boot-log-count", pdata->max_boot_log_cnt);
 #endif
 #undef parse_size
 
@@ -760,9 +760,9 @@
 		goto fail_out;
 	}
 
-#ifdef CONFIG_PSTORE_MCU_LOG
+#ifdef CONFIG_PSTORE_BOOT_LOG
 	if (!pdata->mem_size || (!pdata->record_size && !pdata->console_size &&
-			!pdata->ftrace_size && !pdata->pmsg_size && !pdata->mcu_log_size)) {
+			!pdata->ftrace_size && !pdata->pmsg_size && !pdata->boot_log_size)) {
 		pr_err("The memory size and the record/console size must be "
 			"non-zero\n");
 		goto fail_out;
@@ -797,17 +797,28 @@
 	cxt->dump_oops = pdata->dump_oops;
 	cxt->flags = pdata->flags;
 	cxt->ecc_info = pdata->ecc_info;
-#ifdef CONFIG_PSTORE_MCU_LOG
-	cxt->mcu_log_size = pdata->mcu_log_size;
-	cxt->max_mcu_log_cnt = pdata->max_mcu_log_cnt;
+#ifdef CONFIG_PSTORE_BOOT_LOG
+	cxt->boot_log_size = pdata->boot_log_size;
+	cxt->max_boot_log_cnt = pdata->max_boot_log_cnt;
 #endif
 
 	paddr = cxt->phys_addr;
 
 	dump_mem_sz = cxt->size - cxt->console_size - cxt->ftrace_size
 			- cxt->pmsg_size;
-#ifdef CONFIG_PSTORE_MCU_LOG
-	dump_mem_sz -= cxt->mcu_log_size;
+#ifdef CONFIG_PSTORE_BOOT_LOG
+	dump_mem_sz -= cxt->boot_log_size;
+#endif
+
+#ifdef CONFIG_PSTORE_BOOT_LOG
+	err = ramoops_init_przs("boot_log", dev, cxt, &cxt->boot_przs, &paddr,
+				cxt->boot_log_size, -1,
+				&cxt->max_boot_log_cnt, 0, 0);
+	if (err)
+		goto fail_clear;
+	if (cxt->boot_log_size > 0)
+		for (i = 0; i < cxt->max_boot_log_cnt; i++)
+			pr_info("boot-log-%d\t0x%zx@%pa\n", i, cxt->boot_przs[i]->size, &cxt->boot_przs[i]->paddr);
 #endif
 
 	err = ramoops_init_przs("dump", dev, cxt, &cxt->dprzs, &paddr,
@@ -848,17 +859,6 @@
 	if (cxt->pmsg_size > 0)
 		pr_info("pmsg\t0x%zx@%pa\n", cxt->mprz->size, &cxt->mprz->paddr);
 
-#ifdef CONFIG_PSTORE_MCU_LOG
-	err = ramoops_init_przs("mcu_log", dev, cxt, &cxt->mcu_przs, &paddr,
-				cxt->mcu_log_size, -1,
-				&cxt->max_mcu_log_cnt, 0, 0);
-	if (err)
-		goto fail_clear;
-	if (cxt->mcu_log_size > 0)
-		for (i = 0; i < cxt->max_mcu_log_cnt; i++)
-			pr_info("mcu-log-%d\t0x%zx@%pa\n", i, cxt->mcu_przs[i]->size, &cxt->mcu_przs[i]->paddr);
-#endif
-
 	cxt->pstore.data = cxt;
 	/*
 	 * Prepare frontend flags based on which areas are initialized.
@@ -875,9 +875,9 @@
 		cxt->pstore.flags |= PSTORE_FLAGS_FTRACE;
 	if (cxt->pmsg_size)
 		cxt->pstore.flags |= PSTORE_FLAGS_PMSG;
-#ifdef CONFIG_PSTORE_MCU_LOG
-	if (cxt->mcu_log_size)
-		cxt->pstore.flags |= PSTORE_FLAGS_MCU_LOG;
+#ifdef CONFIG_PSTORE_BOOT_LOG
+	if (cxt->boot_log_size)
+		cxt->pstore.flags |= PSTORE_FLAGS_BOOT_LOG;
 #endif
 
 	/*
diff --git a/kernel/fs/squashfs/decompressor_multi_percpu.c b/kernel/fs/squashfs/decompressor_multi_percpu.c
index 23a9c28..6a73c4f 100644
--- a/kernel/fs/squashfs/decompressor_multi_percpu.c
+++ b/kernel/fs/squashfs/decompressor_multi_percpu.c
@@ -10,6 +10,7 @@
 #include <linux/slab.h>
 #include <linux/percpu.h>
 #include <linux/buffer_head.h>
+#include <linux/locallock.h>
 
 #include "squashfs_fs.h"
 #include "squashfs_fs_sb.h"
@@ -24,6 +25,8 @@
 struct squashfs_stream {
 	void		*stream;
 };
+
+static DEFINE_LOCAL_IRQ_LOCK(stream_lock);
 
 void *squashfs_decompressor_create(struct squashfs_sb_info *msblk,
 						void *comp_opts)
@@ -79,10 +82,15 @@
 {
 	struct squashfs_stream __percpu *percpu =
 			(struct squashfs_stream __percpu *) msblk->stream;
-	struct squashfs_stream *stream = get_cpu_ptr(percpu);
-	int res = msblk->decompressor->decompress(msblk, stream->stream, bh, b,
-		offset, length, output);
-	put_cpu_ptr(stream);
+	struct squashfs_stream *stream;
+	int res;
+
+	stream = get_locked_ptr(stream_lock, percpu);
+
+	res = msblk->decompressor->decompress(msblk, stream->stream, bh, b,
+			offset, length, output);
+
+	put_locked_ptr(stream_lock, stream);
 
 	if (res < 0)
 		ERROR("%s decompression failed, data probably corrupt\n",
diff --git a/kernel/fs/timerfd.c b/kernel/fs/timerfd.c
index d69ad80..f845093 100644
--- a/kernel/fs/timerfd.c
+++ b/kernel/fs/timerfd.c
@@ -471,7 +471,11 @@
 				break;
 		}
 		spin_unlock_irq(&ctx->wqh.lock);
-		cpu_relax();
+
+		if (isalarm(ctx))
+			hrtimer_grab_expiry_lock(&ctx->t.alarm.timer);
+		else
+			hrtimer_grab_expiry_lock(&ctx->t.tmr);
 	}
 
 	/*
diff --git a/kernel/fs/userfaultfd.c b/kernel/fs/userfaultfd.c
index 0c6e16e..c927ade 100644
--- a/kernel/fs/userfaultfd.c
+++ b/kernel/fs/userfaultfd.c
@@ -56,7 +56,7 @@
 	/* waitqueue head for events */
 	wait_queue_head_t event_wqh;
 	/* a refile sequence protected by fault_pending_wqh lock */
-	struct seqcount refile_seq;
+	seqlock_t refile_seq;
 	/* pseudo fd refcounting */
 	atomic_t refcount;
 	/* userfaultfd syscall flags */
@@ -1060,7 +1060,7 @@
 			 * waitqueue could become empty if this is the
 			 * only userfault.
 			 */
-			write_seqcount_begin(&ctx->refile_seq);
+			write_seqlock(&ctx->refile_seq);
 
 			/*
 			 * The fault_pending_wqh.lock prevents the uwq
@@ -1086,7 +1086,7 @@
 			list_del(&uwq->wq.entry);
 			add_wait_queue(&ctx->fault_wqh, &uwq->wq);
 
-			write_seqcount_end(&ctx->refile_seq);
+			write_sequnlock(&ctx->refile_seq);
 
 			/* careful to always initialize msg if ret == 0 */
 			*msg = uwq->msg;
@@ -1259,11 +1259,11 @@
 	 * sure we've userfaults to wake.
 	 */
 	do {
-		seq = read_seqcount_begin(&ctx->refile_seq);
+		seq = read_seqbegin(&ctx->refile_seq);
 		need_wakeup = waitqueue_active(&ctx->fault_pending_wqh) ||
 			waitqueue_active(&ctx->fault_wqh);
 		cond_resched();
-	} while (read_seqcount_retry(&ctx->refile_seq, seq));
+	} while (read_seqretry(&ctx->refile_seq, seq));
 	if (need_wakeup)
 		__wake_userfault(ctx, range);
 }
@@ -1941,7 +1941,7 @@
 	init_waitqueue_head(&ctx->fault_wqh);
 	init_waitqueue_head(&ctx->event_wqh);
 	init_waitqueue_head(&ctx->fd_wqh);
-	seqcount_init(&ctx->refile_seq);
+	seqlock_init(&ctx->refile_seq);
 }
 
 SYSCALL_DEFINE1(userfaultfd, int, flags)
diff --git a/kernel/include/asm-generic/percpu.h b/kernel/include/asm-generic/percpu.h
index 1817a84..942d64c 100644
--- a/kernel/include/asm-generic/percpu.h
+++ b/kernel/include/asm-generic/percpu.h
@@ -5,6 +5,7 @@
 #include <linux/compiler.h>
 #include <linux/threads.h>
 #include <linux/percpu-defs.h>
+#include <linux/irqflags.h>
 
 #ifdef CONFIG_SMP
 
diff --git a/kernel/include/drm/bridge/dw_hdmi.h b/kernel/include/drm/bridge/dw_hdmi.h
index ad0b749..bd59595 100644
--- a/kernel/include/drm/bridge/dw_hdmi.h
+++ b/kernel/include/drm/bridge/dw_hdmi.h
@@ -180,6 +180,11 @@
 	struct drm_property *(*get_hdr_property)(void *data);
 	struct drm_property_blob *(*get_hdr_blob)(void *data);
 	bool (*get_color_changed)(void *data);
+	void (*update_color_format)(struct drm_connector_state *conn_state, void *data);
+	bool (*check_hdr_color_change)(struct drm_connector_state *conn_state, void *data);
+	void (*set_prev_bus_format)(void *data, unsigned long bus_format);
+	void (*set_ddc_io)(void *data, bool enable);
+	int (*dclk_set)(void *data, bool enable, int vp_id);
 
 	/* Vendor Property support */
 	const struct dw_hdmi_property_ops *property_ops;
@@ -223,5 +228,6 @@
 void dw_hdmi_set_output_type(struct dw_hdmi *hdmi, u64 val);
 bool dw_hdmi_get_output_whether_hdmi(struct dw_hdmi *hdmi);
 int dw_hdmi_get_output_type_cap(struct dw_hdmi *hdmi);
+void dw_hdmi_set_hpd_wake(struct dw_hdmi *hdmi);
 
 #endif /* __IMX_HDMI_H__ */
diff --git a/kernel/include/dt-bindings/clock/rk3528-cru.h b/kernel/include/dt-bindings/clock/rk3528-cru.h
new file mode 100644
index 0000000..7cfbc8c
--- /dev/null
+++ b/kernel/include/dt-bindings/clock/rk3528-cru.h
@@ -0,0 +1,747 @@
+/* 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 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 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/kernel/include/dt-bindings/display/rockchip-tve.h b/kernel/include/dt-bindings/display/rockchip-tve.h
new file mode 100644
index 0000000..d72d692
--- /dev/null
+++ b/kernel/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/kernel/include/dt-bindings/input/rk-ir.h b/kernel/include/dt-bindings/input/rk-ir.h
new file mode 100644
index 0000000..cc646e3
--- /dev/null
+++ b/kernel/include/dt-bindings/input/rk-ir.h
@@ -0,0 +1,34 @@
+/* SPDX-License-Identifier: (GPL-2.0+ OR MIT) */
+/*
+ * Copyright (c) 2022 Rockchip Electronics Co., Ltd.
+ */
+#ifndef _DT_BINDINGS_RK_IR_H
+#define _DT_BINDINGS_RK_IR_H
+
+/* STB KEYS */
+#define KEY_CHANNEL_UP          249
+#define KEY_CHANNEL_DN          250
+#define KEY_HOME_PAGE           251
+#define KEY_CH_CUT_BACK         252
+#define KEY_DIRECT_SEEDING      253
+#define KEY_REVIEW              254
+#define KEY_ON_DEMAND           255
+#define KEY_INFO1               256
+#define KEY_SOUND1              257
+#define KEY_X1                  258
+#define KEY_X2                  259
+#define KEY_LOCAL               260
+#define KEY_APPLICATION         261
+#define KEY_POS                 262
+#define KEY_GO_BEGINNING        263
+#define KEY_INTERX              264
+#define KEY_FAVORITE            265
+#define KEY_CHANNEL_POS         266
+#define KEY_EVENT               267
+#define KEY_COMM                268
+#define KEY_LAUNCH              269
+#define KEY_TRACK               270
+#define KEY_PORTAL              271
+#define KEY_AUTOPAIR            703//0x2BF
+
+#endif
diff --git a/kernel/include/dt-bindings/power/rk3528-power.h b/kernel/include/dt-bindings/power/rk3528-power.h
new file mode 100644
index 0000000..4f7c978
--- /dev/null
+++ b/kernel/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/kernel/include/dt-bindings/soc/rockchip-system-status.h b/kernel/include/dt-bindings/soc/rockchip-system-status.h
index 837a1a9..54e6206 100644
--- a/kernel/include/dt-bindings/soc/rockchip-system-status.h
+++ b/kernel/include/dt-bindings/soc/rockchip-system-status.h
@@ -34,10 +34,12 @@
 #define SYS_STATUS_HDMI		(1 << 15)
 #define SYS_STATUS_VIDEO_4K_10B	(1 << 16)
 #define SYS_STATUS_LOW_POWER	(1 << 17)
+#define SYS_STATUS_VIDEO_4K_60P	(1 << 20)
 
 #define SYS_STATUS_VIDEO	(SYS_STATUS_VIDEO_4K | \
 				 SYS_STATUS_VIDEO_1080P | \
-				 SYS_STATUS_VIDEO_4K_10B)
+				 SYS_STATUS_VIDEO_4K_10B | \
+				 SYS_STATUS_VIDEO_4K_60P)
 #define SYS_STATUS_DUALVIEW	(SYS_STATUS_LCDC0 | SYS_STATUS_LCDC1)
 
 #define DMC_FREQ_LEVEL_LOW	(0x1 << 0)
diff --git a/kernel/include/dt-bindings/suspend/rockchip-rk3528.h b/kernel/include/dt-bindings/suspend/rockchip-rk3528.h
new file mode 100644
index 0000000..7f81bf8
--- /dev/null
+++ b/kernel/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/kernel/include/linux/arm_sdei.h b/kernel/include/linux/arm_sdei.h
index d3f1d27..d8bd2a1 100644
--- a/kernel/include/linux/arm_sdei.h
+++ b/kernel/include/linux/arm_sdei.h
@@ -40,13 +40,51 @@
 int sdei_event_disable(u32 event_num);
 
 #ifdef CONFIG_FIQ_DEBUGGER_TRUST_ZONE
+#ifdef CONFIG_ARM_SDE_INTERFACE
 int sdei_event_enable_nolock(u32 event_num);
 int sdei_event_disable_nolock(u32 event_num);
 int sdei_event_routing_set_nolock(u32 event_num, unsigned long flags,
 				  unsigned long affinity);
 int sdei_event_routing_set(u32 event_num, unsigned long flags,
 			   unsigned long affinity);
-#endif
+int sdei_interrupt_bind(u32 intr_num, u32 *event_num);
+int sdei_interrupt_release(u32 event_num);
+#else
+static inline int sdei_event_enable_nolock(u32 event_num)
+{
+	return SDEI_NOT_SUPPORTED;
+}
+
+static inline int sdei_event_disable_nolock(u32 event_num)
+{
+	return SDEI_NOT_SUPPORTED;
+}
+
+static inline int sdei_event_routing_set_nolock(u32 event_num,
+						unsigned long flags,
+						unsigned long affinity)
+{
+	return SDEI_NOT_SUPPORTED;
+}
+
+static inline int sdei_event_routing_set(u32 event_num,
+					 unsigned long flags,
+					 unsigned long affinity)
+{
+	return SDEI_NOT_SUPPORTED;
+}
+
+static inline int sdei_interrupt_bind(u32 intr_num, u32 *event_num)
+{
+	return SDEI_NOT_SUPPORTED;
+}
+
+static inline int sdei_interrupt_release(u32 event_num)
+{
+	return SDEI_NOT_SUPPORTED;
+}
+#endif /* CONFIG_ARM_SDE_INTERFACE */
+#endif /* CONFIG_FIQ_DEBUGGER_TRUST_ZONE */
 
 #ifdef CONFIG_ARM_SDE_INTERFACE
 /* For use by arch code when CPU hotplug notifiers are not appropriate. */
diff --git a/kernel/include/linux/blk-cgroup.h b/kernel/include/linux/blk-cgroup.h
index 6d766a1..da587e6 100644
--- a/kernel/include/linux/blk-cgroup.h
+++ b/kernel/include/linux/blk-cgroup.h
@@ -14,7 +14,7 @@
  * 	              Nauman Rafique <nauman@google.com>
  */
 
-#include <linux/cgroup.h>
+#include <linux/kthread.h>
 #include <linux/percpu_counter.h>
 #include <linux/seq_file.h>
 #include <linux/radix-tree.h>
diff --git a/kernel/include/linux/blk-mq.h b/kernel/include/linux/blk-mq.h
index 2885dce..8dbb9ec 100644
--- a/kernel/include/linux/blk-mq.h
+++ b/kernel/include/linux/blk-mq.h
@@ -256,7 +256,7 @@
 	return unique_tag & BLK_MQ_UNIQUE_TAG_MASK;
 }
 
-
+void __blk_mq_complete_request_remote_work(struct work_struct *work);
 int blk_mq_request_started(struct request *rq);
 void blk_mq_start_request(struct request *rq);
 void blk_mq_end_request(struct request *rq, blk_status_t error);
diff --git a/kernel/include/linux/blkdev.h b/kernel/include/linux/blkdev.h
index b587a3b..cfe14fc 100644
--- a/kernel/include/linux/blkdev.h
+++ b/kernel/include/linux/blkdev.h
@@ -13,6 +13,7 @@
 #include <linux/llist.h>
 #include <linux/timer.h>
 #include <linux/workqueue.h>
+#include <linux/kthread.h>
 #include <linux/pagemap.h>
 #include <linux/backing-dev-defs.h>
 #include <linux/wait.h>
@@ -150,6 +151,9 @@
  */
 struct request {
 	struct request_queue *q;
+#ifdef CONFIG_PREEMPT_RT_FULL
+	struct work_struct work;
+#endif
 	struct blk_mq_ctx *mq_ctx;
 
 	int cpu;
@@ -655,6 +659,7 @@
 #endif
 	struct rcu_head		rcu_head;
 	wait_queue_head_t	mq_freeze_wq;
+	struct work_struct	mq_pcpu_wake;
 	struct percpu_ref	q_usage_counter;
 	struct list_head	all_q_node;
 
diff --git a/kernel/include/linux/bottom_half.h b/kernel/include/linux/bottom_half.h
index a19519f..40dd5ef 100644
--- a/kernel/include/linux/bottom_half.h
+++ b/kernel/include/linux/bottom_half.h
@@ -4,6 +4,39 @@
 
 #include <linux/preempt.h>
 
+#ifdef CONFIG_PREEMPT_RT_FULL
+
+extern void __local_bh_disable(void);
+extern void _local_bh_enable(void);
+extern void __local_bh_enable(void);
+
+static inline void local_bh_disable(void)
+{
+	__local_bh_disable();
+}
+
+static inline void __local_bh_disable_ip(unsigned long ip, unsigned int cnt)
+{
+	__local_bh_disable();
+}
+
+static inline void local_bh_enable(void)
+{
+	__local_bh_enable();
+}
+
+static inline void __local_bh_enable_ip(unsigned long ip, unsigned int cnt)
+{
+	__local_bh_enable();
+}
+
+static inline void local_bh_enable_ip(unsigned long ip)
+{
+	__local_bh_enable();
+}
+
+#else
+
 #ifdef CONFIG_TRACE_IRQFLAGS
 extern void __local_bh_disable_ip(unsigned long ip, unsigned int cnt);
 #else
@@ -31,5 +64,6 @@
 {
 	__local_bh_enable_ip(_THIS_IP_, SOFTIRQ_DISABLE_OFFSET);
 }
+#endif
 
 #endif /* _LINUX_BH_H */
diff --git a/kernel/include/linux/buffer_head.h b/kernel/include/linux/buffer_head.h
index 9168fc3..703bf33 100644
--- a/kernel/include/linux/buffer_head.h
+++ b/kernel/include/linux/buffer_head.h
@@ -76,8 +76,50 @@
 	struct address_space *b_assoc_map;	/* mapping this buffer is
 						   associated with */
 	atomic_t b_count;		/* users using this buffer_head */
+#ifdef CONFIG_PREEMPT_RT_BASE
+	spinlock_t b_uptodate_lock;
+#if IS_ENABLED(CONFIG_JBD2)
+	spinlock_t b_state_lock;
+	spinlock_t b_journal_head_lock;
+#endif
+#endif
 };
 
+static inline unsigned long bh_uptodate_lock_irqsave(struct buffer_head *bh)
+{
+	unsigned long flags;
+
+#ifndef CONFIG_PREEMPT_RT_BASE
+	local_irq_save(flags);
+	bit_spin_lock(BH_Uptodate_Lock, &bh->b_state);
+#else
+	spin_lock_irqsave(&bh->b_uptodate_lock, flags);
+#endif
+	return flags;
+}
+
+static inline void
+bh_uptodate_unlock_irqrestore(struct buffer_head *bh, unsigned long flags)
+{
+#ifndef CONFIG_PREEMPT_RT_BASE
+	bit_spin_unlock(BH_Uptodate_Lock, &bh->b_state);
+	local_irq_restore(flags);
+#else
+	spin_unlock_irqrestore(&bh->b_uptodate_lock, flags);
+#endif
+}
+
+static inline void buffer_head_init_locks(struct buffer_head *bh)
+{
+#ifdef CONFIG_PREEMPT_RT_BASE
+	spin_lock_init(&bh->b_uptodate_lock);
+#if IS_ENABLED(CONFIG_JBD2)
+	spin_lock_init(&bh->b_state_lock);
+	spin_lock_init(&bh->b_journal_head_lock);
+#endif
+#endif
+}
+
 /*
  * macro tricks to expand the set_buffer_foo(), clear_buffer_foo()
  * and buffer_foo() functions.
diff --git a/kernel/include/linux/cgroup-defs.h b/kernel/include/linux/cgroup-defs.h
index 57ce109..eb77eb7 100644
--- a/kernel/include/linux/cgroup-defs.h
+++ b/kernel/include/linux/cgroup-defs.h
@@ -21,6 +21,7 @@
 #include <linux/workqueue.h>
 #include <linux/bpf-cgroup.h>
 #include <linux/psi_types.h>
+#include <linux/swork.h>
 
 #ifdef CONFIG_CGROUPS
 
@@ -166,6 +167,7 @@
 
 	/* percpu_ref killing and RCU release */
 	struct work_struct destroy_work;
+	struct swork_event destroy_swork;
 	struct rcu_work destroy_rwork;
 
 	/*
diff --git a/kernel/include/linux/completion.h b/kernel/include/linux/completion.h
index 519e949..bf8e770 100644
--- a/kernel/include/linux/completion.h
+++ b/kernel/include/linux/completion.h
@@ -9,7 +9,7 @@
  * See kernel/sched/completion.c for details.
  */
 
-#include <linux/wait.h>
+#include <linux/swait.h>
 
 /*
  * struct completion - structure used to maintain state for a "completion"
@@ -25,7 +25,7 @@
  */
 struct completion {
 	unsigned int done;
-	wait_queue_head_t wait;
+	struct swait_queue_head wait;
 };
 
 #define init_completion_map(x, m) __init_completion(x)
@@ -34,7 +34,7 @@
 static inline void complete_release(struct completion *x) {}
 
 #define COMPLETION_INITIALIZER(work) \
-	{ 0, __WAIT_QUEUE_HEAD_INITIALIZER((work).wait) }
+	{ 0, __SWAIT_QUEUE_HEAD_INITIALIZER((work).wait) }
 
 #define COMPLETION_INITIALIZER_ONSTACK_MAP(work, map) \
 	(*({ init_completion_map(&(work), &(map)); &(work); }))
@@ -85,7 +85,7 @@
 static inline void __init_completion(struct completion *x)
 {
 	x->done = 0;
-	init_waitqueue_head(&x->wait);
+	init_swait_queue_head(&x->wait);
 }
 
 /**
diff --git a/kernel/include/linux/cpu.h b/kernel/include/linux/cpu.h
index 26c5087..6440b89 100644
--- a/kernel/include/linux/cpu.h
+++ b/kernel/include/linux/cpu.h
@@ -129,6 +129,7 @@
 static inline void lockdep_assert_cpus_held(void) { }
 static inline void cpu_hotplug_disable(void) { }
 static inline void cpu_hotplug_enable(void) { }
+
 #endif	/* !CONFIG_HOTPLUG_CPU */
 
 /* Wrappers which go away once all code is converted */
diff --git a/kernel/include/linux/dcache.h b/kernel/include/linux/dcache.h
index ee2d177..668d880 100644
--- a/kernel/include/linux/dcache.h
+++ b/kernel/include/linux/dcache.h
@@ -106,7 +106,7 @@
 
 	union {
 		struct list_head d_lru;		/* LRU list */
-		wait_queue_head_t *d_wait;	/* in-lookup ones only */
+		struct swait_queue_head *d_wait;	/* in-lookup ones only */
 	};
 	struct list_head d_child;	/* child of parent list */
 	struct list_head d_subdirs;	/* our children */
@@ -246,7 +246,7 @@
 extern struct dentry * d_alloc_anon(struct super_block *);
 extern struct dentry * d_alloc_pseudo(struct super_block *, const struct qstr *);
 extern struct dentry * d_alloc_parallel(struct dentry *, const struct qstr *,
-					wait_queue_head_t *);
+					struct swait_queue_head *);
 extern struct dentry * d_splice_alias(struct inode *, struct dentry *);
 extern struct dentry * d_add_ci(struct dentry *, struct inode *, struct qstr *);
 extern struct dentry * d_exact_alias(struct dentry *, struct inode *);
diff --git a/kernel/include/linux/delay.h b/kernel/include/linux/delay.h
index b78bab4..7c4bc41 100644
--- a/kernel/include/linux/delay.h
+++ b/kernel/include/linux/delay.h
@@ -64,4 +64,10 @@
 	msleep(seconds * 1000);
 }
 
+#ifdef CONFIG_PREEMPT_RT_FULL
+extern void cpu_chill(void);
+#else
+# define cpu_chill()	cpu_relax()
+#endif
+
 #endif /* defined(_LINUX_DELAY_H) */
diff --git a/kernel/include/linux/device.h b/kernel/include/linux/device.h
index 6a7b0c5..d91fe50 100644
--- a/kernel/include/linux/device.h
+++ b/kernel/include/linux/device.h
@@ -1711,17 +1711,6 @@
 } \
 module_exit(__driver##_exit);
 
-#define module_driver1(__driver, __register, __unregister, ...) \
-static int __init __driver##_init(void) \
-{ \
-        return __register(&(__driver) , ##__VA_ARGS__); \
-} \
-arch_initcall(__driver##_init); \
-static void __exit __driver##_exit(void) \
-{ \
-        __unregister(&(__driver) , ##__VA_ARGS__); \
-} \
-module_exit(__driver##_exit);
 /**
  * builtin_driver() - Helper macro for drivers that don't do anything
  * special in init and have no exit. This eliminates some boilerplate.
diff --git a/kernel/include/linux/extcon.h b/kernel/include/linux/extcon.h
index dfe0b89..9ffa1a6 100644
--- a/kernel/include/linux/extcon.h
+++ b/kernel/include/linux/extcon.h
@@ -85,6 +85,7 @@
 #define EXTCON_DISP_VGA		43	/* Video Graphics Array */
 #define EXTCON_DISP_DP		44	/* Display Port */
 #define EXTCON_DISP_HMD		45	/* Head-Mounted Display */
+#define EXTCON_DISP_HDMI_AUDIO	46	/* High-Definition Multimedia Interface Audio */
 
 /* Miscellaneous external connector */
 #define EXTCON_DOCK		60
diff --git a/kernel/include/linux/fs.h b/kernel/include/linux/fs.h
index 1e76576..2d44116 100644
--- a/kernel/include/linux/fs.h
+++ b/kernel/include/linux/fs.h
@@ -697,7 +697,7 @@
 		struct block_device	*i_bdev;
 		struct cdev		*i_cdev;
 		char			*i_link;
-		unsigned		i_dir_seq;
+		unsigned		__i_dir_seq;
 	};
 
 	__u32			i_generation;
diff --git a/kernel/include/linux/fscache.h b/kernel/include/linux/fscache.h
index 84b90a7..87a9330 100644
--- a/kernel/include/linux/fscache.h
+++ b/kernel/include/linux/fscache.h
@@ -230,6 +230,7 @@
 extern void __fscache_disable_cookie(struct fscache_cookie *, const void *, bool);
 extern void __fscache_enable_cookie(struct fscache_cookie *, const void *, loff_t,
 				    bool (*)(void *), void *);
+extern void fscache_cookie_init(void);
 
 /**
  * fscache_register_netfs - Register a filesystem as desiring caching services
diff --git a/kernel/include/linux/highmem.h b/kernel/include/linux/highmem.h
index e80602e..d6c89c3 100644
--- a/kernel/include/linux/highmem.h
+++ b/kernel/include/linux/highmem.h
@@ -8,6 +8,7 @@
 #include <linux/mm.h>
 #include <linux/uaccess.h>
 #include <linux/hardirq.h>
+#include <linux/sched.h>
 
 #include <asm/cacheflush.h>
 
@@ -66,7 +67,7 @@
 
 static inline void *kmap_atomic(struct page *page)
 {
-	preempt_disable();
+	preempt_disable_nort();
 	pagefault_disable();
 	return page_address(page);
 }
@@ -75,7 +76,7 @@
 static inline void __kunmap_atomic(void *addr)
 {
 	pagefault_enable();
-	preempt_enable();
+	preempt_enable_nort();
 }
 
 #define kmap_atomic_pfn(pfn)	kmap_atomic(pfn_to_page(pfn))
@@ -87,32 +88,51 @@
 
 #if defined(CONFIG_HIGHMEM) || defined(CONFIG_X86_32)
 
+#ifndef CONFIG_PREEMPT_RT_FULL
 DECLARE_PER_CPU(int, __kmap_atomic_idx);
+#endif
 
 static inline int kmap_atomic_idx_push(void)
 {
+#ifndef CONFIG_PREEMPT_RT_FULL
 	int idx = __this_cpu_inc_return(__kmap_atomic_idx) - 1;
 
-#ifdef CONFIG_DEBUG_HIGHMEM
+# ifdef CONFIG_DEBUG_HIGHMEM
 	WARN_ON_ONCE(in_irq() && !irqs_disabled());
 	BUG_ON(idx >= KM_TYPE_NR);
-#endif
+# endif
 	return idx;
+#else
+	current->kmap_idx++;
+	BUG_ON(current->kmap_idx > KM_TYPE_NR);
+	return current->kmap_idx - 1;
+#endif
 }
 
 static inline int kmap_atomic_idx(void)
 {
+#ifndef CONFIG_PREEMPT_RT_FULL
 	return __this_cpu_read(__kmap_atomic_idx) - 1;
+#else
+	return current->kmap_idx - 1;
+#endif
 }
 
 static inline void kmap_atomic_idx_pop(void)
 {
-#ifdef CONFIG_DEBUG_HIGHMEM
+#ifndef CONFIG_PREEMPT_RT_FULL
+# ifdef CONFIG_DEBUG_HIGHMEM
 	int idx = __this_cpu_dec_return(__kmap_atomic_idx);
 
 	BUG_ON(idx < 0);
-#else
+# else
 	__this_cpu_dec(__kmap_atomic_idx);
+# endif
+#else
+	current->kmap_idx--;
+# ifdef CONFIG_DEBUG_HIGHMEM
+	BUG_ON(current->kmap_idx < 0);
+# endif
 #endif
 }
 
diff --git a/kernel/include/linux/hrtimer.h b/kernel/include/linux/hrtimer.h
index 1e9e5b1..f7c86b6 100644
--- a/kernel/include/linux/hrtimer.h
+++ b/kernel/include/linux/hrtimer.h
@@ -42,6 +42,7 @@
 	HRTIMER_MODE_REL	= 0x01,
 	HRTIMER_MODE_PINNED	= 0x02,
 	HRTIMER_MODE_SOFT	= 0x04,
+	HRTIMER_MODE_HARD	= 0x08,
 
 	HRTIMER_MODE_ABS_PINNED = HRTIMER_MODE_ABS | HRTIMER_MODE_PINNED,
 	HRTIMER_MODE_REL_PINNED = HRTIMER_MODE_REL | HRTIMER_MODE_PINNED,
@@ -52,6 +53,11 @@
 	HRTIMER_MODE_ABS_PINNED_SOFT = HRTIMER_MODE_ABS_PINNED | HRTIMER_MODE_SOFT,
 	HRTIMER_MODE_REL_PINNED_SOFT = HRTIMER_MODE_REL_PINNED | HRTIMER_MODE_SOFT,
 
+	HRTIMER_MODE_ABS_HARD	= HRTIMER_MODE_ABS | HRTIMER_MODE_HARD,
+	HRTIMER_MODE_REL_HARD	= HRTIMER_MODE_REL | HRTIMER_MODE_HARD,
+
+	HRTIMER_MODE_ABS_PINNED_HARD = HRTIMER_MODE_ABS_PINNED | HRTIMER_MODE_HARD,
+	HRTIMER_MODE_REL_PINNED_HARD = HRTIMER_MODE_REL_PINNED | HRTIMER_MODE_HARD,
 };
 
 /*
@@ -189,6 +195,8 @@
  * @nr_retries:		Total number of hrtimer interrupt retries
  * @nr_hangs:		Total number of hrtimer interrupt hangs
  * @max_hang_time:	Maximum time spent in hrtimer_interrupt
+ * @softirq_expiry_lock: Lock which is taken while softirq based hrtimer are
+ *			 expired
  * @expires_next:	absolute time of the next event, is required for remote
  *			hrtimer enqueue; it is the total first expiry time (hard
  *			and soft hrtimer are taken into account)
@@ -216,6 +224,7 @@
 	unsigned short			nr_hangs;
 	unsigned int			max_hang_time;
 #endif
+	spinlock_t			softirq_expiry_lock;
 	ktime_t				expires_next;
 	struct hrtimer			*next_timer;
 	ktime_t				softirq_expires_next;
@@ -353,10 +362,17 @@
 /* Initialize timers: */
 extern void hrtimer_init(struct hrtimer *timer, clockid_t which_clock,
 			 enum hrtimer_mode mode);
+extern void hrtimer_init_sleeper(struct hrtimer_sleeper *sl, clockid_t clock_id,
+				 enum hrtimer_mode mode,
+				 struct task_struct *task);
 
 #ifdef CONFIG_DEBUG_OBJECTS_TIMERS
 extern void hrtimer_init_on_stack(struct hrtimer *timer, clockid_t which_clock,
 				  enum hrtimer_mode mode);
+extern void hrtimer_init_sleeper_on_stack(struct hrtimer_sleeper *sl,
+					  clockid_t clock_id,
+					  enum hrtimer_mode mode,
+					  struct task_struct *task);
 
 extern void destroy_hrtimer_on_stack(struct hrtimer *timer);
 #else
@@ -366,6 +382,15 @@
 {
 	hrtimer_init(timer, which_clock, mode);
 }
+
+static inline void hrtimer_init_sleeper_on_stack(struct hrtimer_sleeper *sl,
+					    clockid_t clock_id,
+					    enum hrtimer_mode mode,
+					    struct task_struct *task)
+{
+	hrtimer_init_sleeper(sl, clock_id, mode, task);
+}
+
 static inline void destroy_hrtimer_on_stack(struct hrtimer *timer) { }
 #endif
 
@@ -389,6 +414,7 @@
 
 extern int hrtimer_cancel(struct hrtimer *timer);
 extern int hrtimer_try_to_cancel(struct hrtimer *timer);
+extern void hrtimer_grab_expiry_lock(const struct hrtimer *timer);
 
 static inline void hrtimer_start_expires(struct hrtimer *timer,
 					 enum hrtimer_mode mode)
@@ -474,9 +500,6 @@
 extern long hrtimer_nanosleep(const struct timespec64 *rqtp,
 			      const enum hrtimer_mode mode,
 			      const clockid_t clockid);
-
-extern void hrtimer_init_sleeper(struct hrtimer_sleeper *sl,
-				 struct task_struct *tsk);
 
 extern int schedule_hrtimeout_range(ktime_t *expires, u64 delta,
 						const enum hrtimer_mode mode);
diff --git a/kernel/include/linux/idr.h b/kernel/include/linux/idr.h
index b6c6151..81c9df5 100644
--- a/kernel/include/linux/idr.h
+++ b/kernel/include/linux/idr.h
@@ -169,10 +169,7 @@
  * Each idr_preload() should be matched with an invocation of this
  * function.  See idr_preload() for details.
  */
-static inline void idr_preload_end(void)
-{
-	preempt_enable();
-}
+void idr_preload_end(void);
 
 /**
  * idr_for_each_entry() - Iterate over an IDR's elements of a given type.
diff --git a/kernel/include/linux/interrupt.h b/kernel/include/linux/interrupt.h
index eeceac3..a3b5edb 100644
--- a/kernel/include/linux/interrupt.h
+++ b/kernel/include/linux/interrupt.h
@@ -61,6 +61,7 @@
  *                interrupt handler after suspending interrupts. For system
  *                wakeup devices users need to implement wakeup detection in
  *                their interrupt handlers.
+ * IRQF_NO_SOFTIRQ_CALL - Do not process softirqs in the irq thread context (RT)
  */
 #define IRQF_SHARED		0x00000080
 #define IRQF_PROBE_SHARED	0x00000100
@@ -74,6 +75,7 @@
 #define IRQF_NO_THREAD		0x00010000
 #define IRQF_EARLY_RESUME	0x00020000
 #define IRQF_COND_SUSPEND	0x00040000
+#define IRQF_NO_SOFTIRQ_CALL	0x00080000
 
 #define IRQF_TIMER		(__IRQF_TIMER | IRQF_NO_SUSPEND | IRQF_NO_THREAD)
 
@@ -427,7 +429,11 @@
 				 bool state);
 
 #ifdef CONFIG_IRQ_FORCED_THREADING
+# ifdef CONFIG_PREEMPT_RT_BASE
+#  define force_irqthreads	(true)
+# else
 extern bool force_irqthreads;
+# endif
 #else
 #define force_irqthreads	(0)
 #endif
@@ -493,9 +499,10 @@
 	void	(*action)(struct softirq_action *);
 };
 
+#ifndef CONFIG_PREEMPT_RT_FULL
 asmlinkage void do_softirq(void);
 asmlinkage void __do_softirq(void);
-
+static inline void thread_do_softirq(void) { do_softirq(); }
 #ifdef __ARCH_HAS_DO_SOFTIRQ
 void do_softirq_own_stack(void);
 #else
@@ -504,13 +511,25 @@
 	__do_softirq();
 }
 #endif
+#else
+extern void thread_do_softirq(void);
+#endif
 
 extern void open_softirq(int nr, void (*action)(struct softirq_action *));
 extern void softirq_init(void);
 extern void __raise_softirq_irqoff(unsigned int nr);
+#ifdef CONFIG_PREEMPT_RT_FULL
+extern void __raise_softirq_irqoff_ksoft(unsigned int nr);
+#else
+static inline void __raise_softirq_irqoff_ksoft(unsigned int nr)
+{
+	__raise_softirq_irqoff(nr);
+}
+#endif
 
 extern void raise_softirq_irqoff(unsigned int nr);
 extern void raise_softirq(unsigned int nr);
+extern void softirq_check_pending_idle(void);
 
 DECLARE_PER_CPU(struct task_struct *, ksoftirqd);
 
@@ -532,8 +551,9 @@
      to be executed on some cpu at least once after this.
    * If the tasklet is already scheduled, but its execution is still not
      started, it will be executed only once.
-   * If this tasklet is already running on another CPU (or schedule is called
-     from tasklet itself), it is rescheduled for later.
+   * If this tasklet is already running on another CPU, it is rescheduled
+     for later.
+   * Schedule must not be called from the tasklet itself (a lockup occurs)
    * Tasklet is strictly serialized wrt itself, but not
      wrt another tasklets. If client needs some intertask synchronization,
      he makes it with spinlocks.
@@ -558,13 +578,26 @@
 enum
 {
 	TASKLET_STATE_SCHED,	/* Tasklet is scheduled for execution */
-	TASKLET_STATE_RUN	/* Tasklet is running (SMP only) */
+	TASKLET_STATE_RUN,	/* Tasklet is running (SMP only) */
+	TASKLET_STATE_PENDING,	/* Tasklet is pending */
+	TASKLET_STATE_CHAINED	/* Tasklet is chained */
 };
 
-#ifdef CONFIG_SMP
+#define TASKLET_STATEF_SCHED	(1 << TASKLET_STATE_SCHED)
+#define TASKLET_STATEF_RUN	(1 << TASKLET_STATE_RUN)
+#define TASKLET_STATEF_PENDING	(1 << TASKLET_STATE_PENDING)
+#define TASKLET_STATEF_CHAINED	(1 << TASKLET_STATE_CHAINED)
+#define TASKLET_STATEF_RC	(TASKLET_STATEF_RUN | TASKLET_STATEF_CHAINED)
+
+#if defined(CONFIG_SMP) || defined(CONFIG_PREEMPT_RT_FULL)
 static inline int tasklet_trylock(struct tasklet_struct *t)
 {
 	return !test_and_set_bit(TASKLET_STATE_RUN, &(t)->state);
+}
+
+static inline int tasklet_tryunlock(struct tasklet_struct *t)
+{
+	return cmpxchg(&t->state, TASKLET_STATEF_RUN, 0) == TASKLET_STATEF_RUN;
 }
 
 static inline void tasklet_unlock(struct tasklet_struct *t)
@@ -573,12 +606,11 @@
 	clear_bit(TASKLET_STATE_RUN, &(t)->state);
 }
 
-static inline void tasklet_unlock_wait(struct tasklet_struct *t)
-{
-	while (test_bit(TASKLET_STATE_RUN, &(t)->state)) { barrier(); }
-}
+extern void tasklet_unlock_wait(struct tasklet_struct *t);
+
 #else
 #define tasklet_trylock(t) 1
+#define tasklet_tryunlock(t)	1
 #define tasklet_unlock_wait(t) do { } while (0)
 #define tasklet_unlock(t) do { } while (0)
 #endif
@@ -612,17 +644,18 @@
 	smp_mb();
 }
 
-static inline void tasklet_enable(struct tasklet_struct *t)
-{
-	smp_mb__before_atomic();
-	atomic_dec(&t->count);
-}
-
+extern void tasklet_enable(struct tasklet_struct *t);
 extern void tasklet_kill(struct tasklet_struct *t);
 extern void tasklet_kill_immediate(struct tasklet_struct *t, unsigned int cpu);
 extern void tasklet_init(struct tasklet_struct *t,
 			 void (*func)(unsigned long), unsigned long data);
 
+#ifdef CONFIG_PREEMPT_RT_FULL
+extern void softirq_early_init(void);
+#else
+static inline void softirq_early_init(void) { }
+#endif
+
 struct tasklet_hrtimer {
 	struct hrtimer		timer;
 	struct tasklet_struct	tasklet;
diff --git a/kernel/include/linux/iommu.h b/kernel/include/linux/iommu.h
index c5470ac..6d48388 100644
--- a/kernel/include/linux/iommu.h
+++ b/kernel/include/linux/iommu.h
@@ -45,10 +45,7 @@
 #define IOMMU_USE_UPSTREAM_HINT	(1 << 6)
 
 /* Use upstream device's bus attribute with no write-allocate cache policy */
-#define IOMMU_USE_LLC_NWA	(1 << 7)
-
-/* For shoting entire IOMMU tlb once */
-#define IOMMU_TLB_SHOT_ENTIRE	(1 << 6)
+#define IOMMU_USE_LLC_NWA       (1 << 7)
 
 struct iommu_ops;
 struct iommu_group;
diff --git a/kernel/include/linux/irq.h b/kernel/include/linux/irq.h
index 6d54677..e07cfbb 100644
--- a/kernel/include/linux/irq.h
+++ b/kernel/include/linux/irq.h
@@ -69,6 +69,7 @@
  * IRQ_IS_POLLED		- Always polled by another interrupt. Exclude
  *				  it from the spurious interrupt detection
  *				  mechanism and from core side polling.
+ * IRQ_NO_SOFTIRQ_CALL		- No softirq processing in the irq thread context (RT)
  * IRQ_DISABLE_UNLAZY		- Disable lazy irq disable
  */
 enum {
@@ -96,13 +97,14 @@
 	IRQ_PER_CPU_DEVID	= (1 << 17),
 	IRQ_IS_POLLED		= (1 << 18),
 	IRQ_DISABLE_UNLAZY	= (1 << 19),
+	IRQ_NO_SOFTIRQ_CALL	= (1 << 20),
 };
 
 #define IRQF_MODIFY_MASK	\
 	(IRQ_TYPE_SENSE_MASK | IRQ_NOPROBE | IRQ_NOREQUEST | \
 	 IRQ_NOAUTOEN | IRQ_MOVE_PCNTXT | IRQ_LEVEL | IRQ_NO_BALANCING | \
 	 IRQ_PER_CPU | IRQ_NESTED_THREAD | IRQ_NOTHREAD | IRQ_PER_CPU_DEVID | \
-	 IRQ_IS_POLLED | IRQ_DISABLE_UNLAZY)
+	 IRQ_IS_POLLED | IRQ_DISABLE_UNLAZY | IRQ_NO_SOFTIRQ_CALL)
 
 #define IRQ_NO_BALANCING_MASK	(IRQ_PER_CPU | IRQ_NO_BALANCING)
 
diff --git a/kernel/include/linux/irq_work.h b/kernel/include/linux/irq_work.h
index b11fcdf..0c50559 100644
--- a/kernel/include/linux/irq_work.h
+++ b/kernel/include/linux/irq_work.h
@@ -18,6 +18,8 @@
 
 /* Doesn't want IPI, wait for tick: */
 #define IRQ_WORK_LAZY		BIT(2)
+/* Run hard IRQ context, even on RT */
+#define IRQ_WORK_HARD_IRQ	BIT(3)
 
 #define IRQ_WORK_CLAIMED	(IRQ_WORK_PENDING | IRQ_WORK_BUSY)
 
@@ -52,4 +54,10 @@
 static inline void irq_work_run(void) { }
 #endif
 
+#if defined(CONFIG_IRQ_WORK) && defined(CONFIG_PREEMPT_RT_FULL)
+void irq_work_tick_soft(void);
+#else
+static inline void irq_work_tick_soft(void) { }
+#endif
+
 #endif /* _LINUX_IRQ_WORK_H */
diff --git a/kernel/include/linux/irqchip/arm-gic-v3.h b/kernel/include/linux/irqchip/arm-gic-v3.h
index 1d21e98..fdddead 100644
--- a/kernel/include/linux/irqchip/arm-gic-v3.h
+++ b/kernel/include/linux/irqchip/arm-gic-v3.h
@@ -585,6 +585,7 @@
 		void __iomem	*rd_base;
 		struct page	*pend_page;
 		phys_addr_t	phys_base;
+		bool		lpi_enabled;
 	} __percpu		*rdist;
 	struct page		*prop_page;
 	u64			flags;
diff --git a/kernel/include/linux/irqdesc.h b/kernel/include/linux/irqdesc.h
index 875c41b..ff5eb8d 100644
--- a/kernel/include/linux/irqdesc.h
+++ b/kernel/include/linux/irqdesc.h
@@ -71,6 +71,7 @@
 	unsigned int		irqs_unhandled;
 	atomic_t		threads_handled;
 	int			threads_handled_last;
+	u64			random_ip;
 	raw_spinlock_t		lock;
 	struct cpumask		*percpu_enabled;
 	const struct cpumask	*percpu_affinity;
diff --git a/kernel/include/linux/irqflags.h b/kernel/include/linux/irqflags.h
index 21619c9..b20eeb2 100644
--- a/kernel/include/linux/irqflags.h
+++ b/kernel/include/linux/irqflags.h
@@ -43,14 +43,6 @@
 do {						\
 	current->hardirq_context--;		\
 } while (0)
-# define lockdep_softirq_enter()		\
-do {						\
-	current->softirq_context++;		\
-} while (0)
-# define lockdep_softirq_exit()			\
-do {						\
-	current->softirq_context--;		\
-} while (0)
 #else
 # define trace_hardirqs_on()		do { } while (0)
 # define trace_hardirqs_off()		do { } while (0)
@@ -64,6 +56,21 @@
 # define lockdep_softirq_exit()		do { } while (0)
 #endif
 
+#if defined(CONFIG_TRACE_IRQFLAGS) && !defined(CONFIG_PREEMPT_RT_FULL)
+# define lockdep_softirq_enter()		\
+do {						\
+	current->softirq_context++;		\
+} while (0)
+# define lockdep_softirq_exit()			\
+do {						\
+	current->softirq_context--;		\
+} while (0)
+
+#else
+# define lockdep_softirq_enter()	do { } while (0)
+# define lockdep_softirq_exit()		do { } while (0)
+#endif
+
 #if defined(CONFIG_IRQSOFF_TRACER) || \
 	defined(CONFIG_PREEMPT_TRACER)
  extern void stop_critical_timings(void);
diff --git a/kernel/include/linux/jbd2.h b/kernel/include/linux/jbd2.h
index 268f300..8f5d6ec 100644
--- a/kernel/include/linux/jbd2.h
+++ b/kernel/include/linux/jbd2.h
@@ -347,32 +347,56 @@
 
 static inline void jbd_lock_bh_state(struct buffer_head *bh)
 {
+#ifndef CONFIG_PREEMPT_RT_BASE
 	bit_spin_lock(BH_State, &bh->b_state);
+#else
+	spin_lock(&bh->b_state_lock);
+#endif
 }
 
 static inline int jbd_trylock_bh_state(struct buffer_head *bh)
 {
+#ifndef CONFIG_PREEMPT_RT_BASE
 	return bit_spin_trylock(BH_State, &bh->b_state);
+#else
+	return spin_trylock(&bh->b_state_lock);
+#endif
 }
 
 static inline int jbd_is_locked_bh_state(struct buffer_head *bh)
 {
+#ifndef CONFIG_PREEMPT_RT_BASE
 	return bit_spin_is_locked(BH_State, &bh->b_state);
+#else
+	return spin_is_locked(&bh->b_state_lock);
+#endif
 }
 
 static inline void jbd_unlock_bh_state(struct buffer_head *bh)
 {
+#ifndef CONFIG_PREEMPT_RT_BASE
 	bit_spin_unlock(BH_State, &bh->b_state);
+#else
+	spin_unlock(&bh->b_state_lock);
+#endif
 }
 
 static inline void jbd_lock_bh_journal_head(struct buffer_head *bh)
 {
+#ifndef CONFIG_PREEMPT_RT_BASE
 	bit_spin_lock(BH_JournalHead, &bh->b_state);
+#else
+	spin_lock(&bh->b_journal_head_lock);
+#endif
 }
 
 static inline void jbd_unlock_bh_journal_head(struct buffer_head *bh)
 {
+#ifndef CONFIG_PREEMPT_RT_BASE
 	bit_spin_unlock(BH_JournalHead, &bh->b_state);
+#else
+	spin_unlock(&bh->b_journal_head_lock);
+#endif
 }
 
 #define J_ASSERT(assert)	BUG_ON(!(assert))
diff --git a/kernel/include/linux/kdb.h b/kernel/include/linux/kdb.h
index 68bd882..e033b25 100644
--- a/kernel/include/linux/kdb.h
+++ b/kernel/include/linux/kdb.h
@@ -167,6 +167,7 @@
 extern __printf(1, 2) int kdb_printf(const char *, ...);
 typedef __printf(1, 2) int (*kdb_printf_t)(const char *, ...);
 
+#define in_kdb_printk()	(kdb_trap_printk)
 extern void kdb_init(int level);
 
 /* Access to kdb specific polling devices */
@@ -201,6 +202,7 @@
 extern int kdb_unregister(char *);
 #else /* ! CONFIG_KGDB_KDB */
 static inline __printf(1, 2) int kdb_printf(const char *fmt, ...) { return 0; }
+#define in_kdb_printk() (0)
 static inline void kdb_init(int level) {}
 static inline int kdb_register(char *cmd, kdb_func_t func, char *usage,
 			       char *help, short minlen) { return 0; }
diff --git a/kernel/include/linux/kernel.h b/kernel/include/linux/kernel.h
index 7a4e8e2..e0e7b0f 100644
--- a/kernel/include/linux/kernel.h
+++ b/kernel/include/linux/kernel.h
@@ -232,6 +232,9 @@
  */
 # define might_sleep() \
 	do { __might_sleep(__FILE__, __LINE__, 0); might_resched(); } while (0)
+
+# define might_sleep_no_state_check() \
+	do { ___might_sleep(__FILE__, __LINE__, 0); might_resched(); } while (0)
 # define sched_annotate_sleep()	(current->task_state_change = 0)
 #else
   static inline void ___might_sleep(const char *file, int line,
@@ -239,6 +242,7 @@
   static inline void __might_sleep(const char *file, int line,
 				   int preempt_offset) { }
 # define might_sleep() do { might_resched(); } while (0)
+# define might_sleep_no_state_check() do { might_resched(); } while (0)
 # define sched_annotate_sleep() do { } while (0)
 #endif
 
diff --git a/kernel/include/linux/kthread.h b/kernel/include/linux/kthread.h
index 3359bbd..8d19da1 100644
--- a/kernel/include/linux/kthread.h
+++ b/kernel/include/linux/kthread.h
@@ -87,7 +87,7 @@
 
 struct kthread_worker {
 	unsigned int		flags;
-	spinlock_t		lock;
+	raw_spinlock_t		lock;
 	struct list_head	work_list;
 	struct list_head	delayed_work_list;
 	struct task_struct	*task;
@@ -108,7 +108,7 @@
 };
 
 #define KTHREAD_WORKER_INIT(worker)	{				\
-	.lock = __SPIN_LOCK_UNLOCKED((worker).lock),			\
+	.lock = __RAW_SPIN_LOCK_UNLOCKED((worker).lock),		\
 	.work_list = LIST_HEAD_INIT((worker).work_list),		\
 	.delayed_work_list = LIST_HEAD_INIT((worker).delayed_work_list),\
 	}
diff --git a/kernel/include/linux/list_bl.h b/kernel/include/linux/list_bl.h
index 3fc2cc5..0b5de7d 100644
--- a/kernel/include/linux/list_bl.h
+++ b/kernel/include/linux/list_bl.h
@@ -3,6 +3,7 @@
 #define _LINUX_LIST_BL_H
 
 #include <linux/list.h>
+#include <linux/spinlock.h>
 #include <linux/bit_spinlock.h>
 
 /*
@@ -33,13 +34,24 @@
 
 struct hlist_bl_head {
 	struct hlist_bl_node *first;
+#ifdef CONFIG_PREEMPT_RT_BASE
+	raw_spinlock_t lock;
+#endif
 };
 
 struct hlist_bl_node {
 	struct hlist_bl_node *next, **pprev;
 };
-#define INIT_HLIST_BL_HEAD(ptr) \
-	((ptr)->first = NULL)
+
+#ifdef CONFIG_PREEMPT_RT_BASE
+#define INIT_HLIST_BL_HEAD(h)		\
+do {					\
+	(h)->first = NULL;		\
+	raw_spin_lock_init(&(h)->lock);	\
+} while (0)
+#else
+#define INIT_HLIST_BL_HEAD(h) (h)->first = NULL
+#endif
 
 static inline void INIT_HLIST_BL_NODE(struct hlist_bl_node *h)
 {
@@ -119,12 +131,26 @@
 
 static inline void hlist_bl_lock(struct hlist_bl_head *b)
 {
+#ifndef CONFIG_PREEMPT_RT_BASE
 	bit_spin_lock(0, (unsigned long *)b);
+#else
+	raw_spin_lock(&b->lock);
+#if defined(CONFIG_SMP) || defined(CONFIG_DEBUG_SPINLOCK)
+	__set_bit(0, (unsigned long *)b);
+#endif
+#endif
 }
 
 static inline void hlist_bl_unlock(struct hlist_bl_head *b)
 {
+#ifndef CONFIG_PREEMPT_RT_BASE
 	__bit_spin_unlock(0, (unsigned long *)b);
+#else
+#if defined(CONFIG_SMP) || defined(CONFIG_DEBUG_SPINLOCK)
+	__clear_bit(0, (unsigned long *)b);
+#endif
+	raw_spin_unlock(&b->lock);
+#endif
 }
 
 static inline bool hlist_bl_is_locked(struct hlist_bl_head *b)
diff --git a/kernel/include/linux/locallock.h b/kernel/include/linux/locallock.h
new file mode 100644
index 0000000..81c89d8
--- /dev/null
+++ b/kernel/include/linux/locallock.h
@@ -0,0 +1,282 @@
+#ifndef _LINUX_LOCALLOCK_H
+#define _LINUX_LOCALLOCK_H
+
+#include <linux/percpu.h>
+#include <linux/spinlock.h>
+#include <asm/current.h>
+
+#ifdef CONFIG_PREEMPT_RT_BASE
+
+#ifdef CONFIG_DEBUG_SPINLOCK
+# define LL_WARN(cond)	WARN_ON(cond)
+#else
+# define LL_WARN(cond)	do { } while (0)
+#endif
+
+/*
+ * per cpu lock based substitute for local_irq_*()
+ */
+struct local_irq_lock {
+	spinlock_t		lock;
+	struct task_struct	*owner;
+	int			nestcnt;
+	unsigned long		flags;
+};
+
+#define DEFINE_LOCAL_IRQ_LOCK(lvar)					\
+	DEFINE_PER_CPU(struct local_irq_lock, lvar) = {			\
+		.lock = __SPIN_LOCK_UNLOCKED((lvar).lock) }
+
+#define DECLARE_LOCAL_IRQ_LOCK(lvar)					\
+	DECLARE_PER_CPU(struct local_irq_lock, lvar)
+
+#define local_irq_lock_init(lvar)					\
+	do {								\
+		int __cpu;						\
+		for_each_possible_cpu(__cpu)				\
+			spin_lock_init(&per_cpu(lvar, __cpu).lock);	\
+	} while (0)
+
+static inline void __local_lock(struct local_irq_lock *lv)
+{
+	if (lv->owner != current) {
+		spin_lock(&lv->lock);
+		LL_WARN(lv->owner);
+		LL_WARN(lv->nestcnt);
+		lv->owner = current;
+	}
+	lv->nestcnt++;
+}
+
+#define local_lock(lvar)					\
+	do { __local_lock(&get_local_var(lvar)); } while (0)
+
+#define local_lock_on(lvar, cpu)				\
+	do { __local_lock(&per_cpu(lvar, cpu)); } while (0)
+
+static inline int __local_trylock(struct local_irq_lock *lv)
+{
+	if (lv->owner != current && spin_trylock(&lv->lock)) {
+		LL_WARN(lv->owner);
+		LL_WARN(lv->nestcnt);
+		lv->owner = current;
+		lv->nestcnt = 1;
+		return 1;
+	} else if (lv->owner == current) {
+		lv->nestcnt++;
+		return 1;
+	}
+	return 0;
+}
+
+#define local_trylock(lvar)						\
+	({								\
+		int __locked;						\
+		__locked = __local_trylock(&get_local_var(lvar));	\
+		if (!__locked)						\
+			put_local_var(lvar);				\
+		__locked;						\
+	})
+
+static inline void __local_unlock(struct local_irq_lock *lv)
+{
+	LL_WARN(lv->nestcnt == 0);
+	LL_WARN(lv->owner != current);
+	if (--lv->nestcnt)
+		return;
+
+	lv->owner = NULL;
+	spin_unlock(&lv->lock);
+}
+
+#define local_unlock(lvar)					\
+	do {							\
+		__local_unlock(this_cpu_ptr(&lvar));		\
+		put_local_var(lvar);				\
+	} while (0)
+
+#define local_unlock_on(lvar, cpu)                       \
+	do { __local_unlock(&per_cpu(lvar, cpu)); } while (0)
+
+static inline void __local_lock_irq(struct local_irq_lock *lv)
+{
+	spin_lock_irqsave(&lv->lock, lv->flags);
+	LL_WARN(lv->owner);
+	LL_WARN(lv->nestcnt);
+	lv->owner = current;
+	lv->nestcnt = 1;
+}
+
+#define local_lock_irq(lvar)						\
+	do { __local_lock_irq(&get_local_var(lvar)); } while (0)
+
+#define local_lock_irq_on(lvar, cpu)					\
+	do { __local_lock_irq(&per_cpu(lvar, cpu)); } while (0)
+
+static inline void __local_unlock_irq(struct local_irq_lock *lv)
+{
+	LL_WARN(!lv->nestcnt);
+	LL_WARN(lv->owner != current);
+	lv->owner = NULL;
+	lv->nestcnt = 0;
+	spin_unlock_irq(&lv->lock);
+}
+
+#define local_unlock_irq(lvar)						\
+	do {								\
+		__local_unlock_irq(this_cpu_ptr(&lvar));		\
+		put_local_var(lvar);					\
+	} while (0)
+
+#define local_unlock_irq_on(lvar, cpu)					\
+	do {								\
+		__local_unlock_irq(&per_cpu(lvar, cpu));		\
+	} while (0)
+
+static inline int __local_lock_irqsave(struct local_irq_lock *lv)
+{
+	if (lv->owner != current) {
+		__local_lock_irq(lv);
+		return 0;
+	} else {
+		lv->nestcnt++;
+		return 1;
+	}
+}
+
+#define local_lock_irqsave(lvar, _flags)				\
+	do {								\
+		if (__local_lock_irqsave(&get_local_var(lvar)))		\
+			put_local_var(lvar);				\
+		_flags = __this_cpu_read(lvar.flags);			\
+	} while (0)
+
+#define local_lock_irqsave_on(lvar, _flags, cpu)			\
+	do {								\
+		__local_lock_irqsave(&per_cpu(lvar, cpu));		\
+		_flags = per_cpu(lvar, cpu).flags;			\
+	} while (0)
+
+static inline int __local_unlock_irqrestore(struct local_irq_lock *lv,
+					    unsigned long flags)
+{
+	LL_WARN(!lv->nestcnt);
+	LL_WARN(lv->owner != current);
+	if (--lv->nestcnt)
+		return 0;
+
+	lv->owner = NULL;
+	spin_unlock_irqrestore(&lv->lock, lv->flags);
+	return 1;
+}
+
+#define local_unlock_irqrestore(lvar, flags)				\
+	do {								\
+		if (__local_unlock_irqrestore(this_cpu_ptr(&lvar), flags)) \
+			put_local_var(lvar);				\
+	} while (0)
+
+#define local_unlock_irqrestore_on(lvar, flags, cpu)			\
+	do {								\
+		__local_unlock_irqrestore(&per_cpu(lvar, cpu), flags);	\
+	} while (0)
+
+#define local_spin_trylock_irq(lvar, lock)				\
+	({								\
+		int __locked;						\
+		local_lock_irq(lvar);					\
+		__locked = spin_trylock(lock);				\
+		if (!__locked)						\
+			local_unlock_irq(lvar);				\
+		__locked;						\
+	})
+
+#define local_spin_lock_irq(lvar, lock)					\
+	do {								\
+		local_lock_irq(lvar);					\
+		spin_lock(lock);					\
+	} while (0)
+
+#define local_spin_unlock_irq(lvar, lock)				\
+	do {								\
+		spin_unlock(lock);					\
+		local_unlock_irq(lvar);					\
+	} while (0)
+
+#define local_spin_lock_irqsave(lvar, lock, flags)			\
+	do {								\
+		local_lock_irqsave(lvar, flags);			\
+		spin_lock(lock);					\
+	} while (0)
+
+#define local_spin_unlock_irqrestore(lvar, lock, flags)			\
+	do {								\
+		spin_unlock(lock);					\
+		local_unlock_irqrestore(lvar, flags);			\
+	} while (0)
+
+#define get_locked_var(lvar, var)					\
+	(*({								\
+		local_lock(lvar);					\
+		this_cpu_ptr(&var);					\
+	}))
+
+#define put_locked_var(lvar, var)	local_unlock(lvar);
+
+#define get_locked_ptr(lvar, var)					\
+	({								\
+		local_lock(lvar);					\
+		this_cpu_ptr(var);					\
+	})
+
+#define put_locked_ptr(lvar, var)	local_unlock(lvar);
+
+#define local_lock_cpu(lvar)						\
+	({								\
+		local_lock(lvar);					\
+		smp_processor_id();					\
+	})
+
+#define local_unlock_cpu(lvar)			local_unlock(lvar)
+
+#else /* PREEMPT_RT_BASE */
+
+#define DEFINE_LOCAL_IRQ_LOCK(lvar)		__typeof__(const int) lvar
+#define DECLARE_LOCAL_IRQ_LOCK(lvar)		extern __typeof__(const int) lvar
+
+static inline void local_irq_lock_init(int lvar) { }
+
+#define local_trylock(lvar)					\
+	({							\
+		preempt_disable();				\
+		1;						\
+	})
+
+#define local_lock(lvar)			preempt_disable()
+#define local_unlock(lvar)			preempt_enable()
+#define local_lock_irq(lvar)			local_irq_disable()
+#define local_lock_irq_on(lvar, cpu)		local_irq_disable()
+#define local_unlock_irq(lvar)			local_irq_enable()
+#define local_unlock_irq_on(lvar, cpu)		local_irq_enable()
+#define local_lock_irqsave(lvar, flags)		local_irq_save(flags)
+#define local_unlock_irqrestore(lvar, flags)	local_irq_restore(flags)
+
+#define local_spin_trylock_irq(lvar, lock)	spin_trylock_irq(lock)
+#define local_spin_lock_irq(lvar, lock)		spin_lock_irq(lock)
+#define local_spin_unlock_irq(lvar, lock)	spin_unlock_irq(lock)
+#define local_spin_lock_irqsave(lvar, lock, flags)	\
+	spin_lock_irqsave(lock, flags)
+#define local_spin_unlock_irqrestore(lvar, lock, flags)	\
+	spin_unlock_irqrestore(lock, flags)
+
+#define get_locked_var(lvar, var)		get_cpu_var(var)
+#define put_locked_var(lvar, var)		put_cpu_var(var)
+#define get_locked_ptr(lvar, var)		get_cpu_ptr(var)
+#define put_locked_ptr(lvar, var)		put_cpu_ptr(var)
+
+#define local_lock_cpu(lvar)			get_cpu()
+#define local_unlock_cpu(lvar)			put_cpu()
+
+#endif
+
+#endif
diff --git a/kernel/include/linux/memcontrol.h b/kernel/include/linux/memcontrol.h
index cc6b653..dbb2c4e 100644
--- a/kernel/include/linux/memcontrol.h
+++ b/kernel/include/linux/memcontrol.h
@@ -665,6 +665,7 @@
 
 	pn = container_of(lruvec, struct mem_cgroup_per_node, lruvec);
 
+	preempt_disable_rt();
 	/* Update memcg */
 	__mod_memcg_state(pn->memcg, idx, val);
 
@@ -675,6 +676,7 @@
 		x = 0;
 	}
 	__this_cpu_write(pn->lruvec_stat_cpu->count[idx], x);
+	preempt_enable_rt();
 }
 
 static inline void mod_lruvec_state(struct lruvec *lruvec,
diff --git a/kernel/include/linux/mm_types.h b/kernel/include/linux/mm_types.h
index 718ba2e..3205791 100644
--- a/kernel/include/linux/mm_types.h
+++ b/kernel/include/linux/mm_types.h
@@ -12,6 +12,7 @@
 #include <linux/completion.h>
 #include <linux/cpumask.h>
 #include <linux/uprobes.h>
+#include <linux/rcupdate.h>
 #include <linux/page-flags-layout.h>
 #include <linux/workqueue.h>
 #include <linux/android_kabi.h>
@@ -500,6 +501,9 @@
 		bool tlb_flush_batched;
 #endif
 		struct uprobes_state uprobes_state;
+#ifdef CONFIG_PREEMPT_RT_BASE
+		struct rcu_head delayed_drop;
+#endif
 #ifdef CONFIG_HUGETLB_PAGE
 		atomic_long_t hugetlb_usage;
 #endif
diff --git a/kernel/include/linux/mutex.h b/kernel/include/linux/mutex.h
index 8f7cdf8..6aa217c 100644
--- a/kernel/include/linux/mutex.h
+++ b/kernel/include/linux/mutex.h
@@ -22,6 +22,17 @@
 
 struct ww_acquire_ctx;
 
+#ifdef CONFIG_DEBUG_LOCK_ALLOC
+# define __DEP_MAP_MUTEX_INITIALIZER(lockname) \
+		, .dep_map = { .name = #lockname }
+#else
+# define __DEP_MAP_MUTEX_INITIALIZER(lockname)
+#endif
+
+#ifdef CONFIG_PREEMPT_RT_FULL
+# include <linux/mutex_rt.h>
+#else
+
 /*
  * Simple, straightforward mutexes with strict semantics:
  *
@@ -117,13 +128,6 @@
 									\
 	__mutex_init((mutex), #mutex, &__key);				\
 } while (0)
-
-#ifdef CONFIG_DEBUG_LOCK_ALLOC
-# define __DEP_MAP_MUTEX_INITIALIZER(lockname) \
-		, .dep_map = { .name = #lockname }
-#else
-# define __DEP_MAP_MUTEX_INITIALIZER(lockname)
-#endif
 
 #define __MUTEX_INITIALIZER(lockname) \
 		{ .owner = ATOMIC_LONG_INIT(0) \
@@ -229,4 +233,6 @@
 	return mutex_trylock(lock);
 }
 
+#endif /* !PREEMPT_RT_FULL */
+
 #endif /* __LINUX_MUTEX_H */
diff --git a/kernel/include/linux/mutex_rt.h b/kernel/include/linux/mutex_rt.h
new file mode 100644
index 0000000..3fcb5ed
--- /dev/null
+++ b/kernel/include/linux/mutex_rt.h
@@ -0,0 +1,130 @@
+#ifndef __LINUX_MUTEX_RT_H
+#define __LINUX_MUTEX_RT_H
+
+#ifndef __LINUX_MUTEX_H
+#error "Please include mutex.h"
+#endif
+
+#include <linux/rtmutex.h>
+
+/* FIXME: Just for __lockfunc */
+#include <linux/spinlock.h>
+
+struct mutex {
+	struct rt_mutex		lock;
+#ifdef CONFIG_DEBUG_LOCK_ALLOC
+	struct lockdep_map	dep_map;
+#endif
+};
+
+#define __MUTEX_INITIALIZER(mutexname)					\
+	{								\
+		.lock = __RT_MUTEX_INITIALIZER(mutexname.lock)		\
+		__DEP_MAP_MUTEX_INITIALIZER(mutexname)			\
+	}
+
+#define DEFINE_MUTEX(mutexname)						\
+	struct mutex mutexname = __MUTEX_INITIALIZER(mutexname)
+
+extern void __mutex_do_init(struct mutex *lock, const char *name, struct lock_class_key *key);
+extern void __lockfunc _mutex_lock(struct mutex *lock);
+extern void __lockfunc _mutex_lock_io(struct mutex *lock);
+extern void __lockfunc _mutex_lock_io_nested(struct mutex *lock, int subclass);
+extern int __lockfunc _mutex_lock_interruptible(struct mutex *lock);
+extern int __lockfunc _mutex_lock_killable(struct mutex *lock);
+extern void __lockfunc _mutex_lock_nested(struct mutex *lock, int subclass);
+extern void __lockfunc _mutex_lock_nest_lock(struct mutex *lock, struct lockdep_map *nest_lock);
+extern int __lockfunc _mutex_lock_interruptible_nested(struct mutex *lock, int subclass);
+extern int __lockfunc _mutex_lock_killable_nested(struct mutex *lock, int subclass);
+extern int __lockfunc _mutex_trylock(struct mutex *lock);
+extern void __lockfunc _mutex_unlock(struct mutex *lock);
+
+#define mutex_is_locked(l)		rt_mutex_is_locked(&(l)->lock)
+#define mutex_lock(l)			_mutex_lock(l)
+#define mutex_lock_interruptible(l)	_mutex_lock_interruptible(l)
+#define mutex_lock_killable(l)		_mutex_lock_killable(l)
+#define mutex_trylock(l)		_mutex_trylock(l)
+#define mutex_unlock(l)			_mutex_unlock(l)
+#define mutex_lock_io(l)		_mutex_lock_io(l);
+
+#define __mutex_owner(l)		((l)->lock.owner)
+
+#ifdef CONFIG_DEBUG_MUTEXES
+#define mutex_destroy(l)		rt_mutex_destroy(&(l)->lock)
+#else
+static inline void mutex_destroy(struct mutex *lock) {}
+#endif
+
+#ifdef CONFIG_DEBUG_LOCK_ALLOC
+# define mutex_lock_nested(l, s)	_mutex_lock_nested(l, s)
+# define mutex_lock_interruptible_nested(l, s) \
+					_mutex_lock_interruptible_nested(l, s)
+# define mutex_lock_killable_nested(l, s) \
+					_mutex_lock_killable_nested(l, s)
+# define mutex_lock_io_nested(l, s)	_mutex_lock_io_nested(l, s)
+
+# define mutex_lock_nest_lock(lock, nest_lock)				\
+do {									\
+	typecheck(struct lockdep_map *, &(nest_lock)->dep_map);		\
+	_mutex_lock_nest_lock(lock, &(nest_lock)->dep_map);		\
+} while (0)
+
+#else
+# define mutex_lock_nested(l, s)	_mutex_lock(l)
+# define mutex_lock_interruptible_nested(l, s) \
+					_mutex_lock_interruptible(l)
+# define mutex_lock_killable_nested(l, s) \
+					_mutex_lock_killable(l)
+# define mutex_lock_nest_lock(lock, nest_lock) mutex_lock(lock)
+# define mutex_lock_io_nested(l, s)	_mutex_lock_io(l)
+#endif
+
+# define mutex_init(mutex)				\
+do {							\
+	static struct lock_class_key __key;		\
+							\
+	rt_mutex_init(&(mutex)->lock);			\
+	__mutex_do_init((mutex), #mutex, &__key);	\
+} while (0)
+
+# define __mutex_init(mutex, name, key)			\
+do {							\
+	rt_mutex_init(&(mutex)->lock);			\
+	__mutex_do_init((mutex), name, key);		\
+} while (0)
+
+/**
+ * These values are chosen such that FAIL and SUCCESS match the
+ * values of the regular mutex_trylock().
+ */
+enum mutex_trylock_recursive_enum {
+	MUTEX_TRYLOCK_FAILED    = 0,
+	MUTEX_TRYLOCK_SUCCESS   = 1,
+	MUTEX_TRYLOCK_RECURSIVE,
+};
+/**
+ * mutex_trylock_recursive - trylock variant that allows recursive locking
+ * @lock: mutex to be locked
+ *
+ * This function should not be used, _ever_. It is purely for hysterical GEM
+ * raisins, and once those are gone this will be removed.
+ *
+ * Returns:
+ *  MUTEX_TRYLOCK_FAILED    - trylock failed,
+ *  MUTEX_TRYLOCK_SUCCESS   - lock acquired,
+ *  MUTEX_TRYLOCK_RECURSIVE - we already owned the lock.
+ */
+int __rt_mutex_owner_current(struct rt_mutex *lock);
+
+static inline /* __deprecated */ __must_check enum mutex_trylock_recursive_enum
+mutex_trylock_recursive(struct mutex *lock)
+{
+	if (unlikely(__rt_mutex_owner_current(&lock->lock)))
+		return MUTEX_TRYLOCK_RECURSIVE;
+
+	return mutex_trylock(lock);
+}
+
+extern int atomic_dec_and_mutex_lock(atomic_t *cnt, struct mutex *lock);
+
+#endif
diff --git a/kernel/include/linux/netdevice.h b/kernel/include/linux/netdevice.h
index 0f4009d..16606e1 100644
--- a/kernel/include/linux/netdevice.h
+++ b/kernel/include/linux/netdevice.h
@@ -431,7 +431,19 @@
 typedef rx_handler_result_t rx_handler_func_t(struct sk_buff **pskb);
 
 void __napi_schedule(struct napi_struct *n);
+
+/*
+ * When PREEMPT_RT_FULL is defined, all device interrupt handlers
+ * run as threads, and they can also be preempted (without PREEMPT_RT
+ * interrupt threads can not be preempted). Which means that calling
+ * __napi_schedule_irqoff() from an interrupt handler can be preempted
+ * and can corrupt the napi->poll_list.
+ */
+#ifdef CONFIG_PREEMPT_RT_FULL
+#define __napi_schedule_irqoff(n) __napi_schedule(n)
+#else
 void __napi_schedule_irqoff(struct napi_struct *n);
+#endif
 
 static inline bool napi_disable_pending(struct napi_struct *n)
 {
@@ -596,7 +608,11 @@
  * write-mostly part
  */
 	spinlock_t		_xmit_lock ____cacheline_aligned_in_smp;
+#ifdef CONFIG_PREEMPT_RT_FULL
+	struct task_struct	*xmit_lock_owner;
+#else
 	int			xmit_lock_owner;
+#endif
 	/*
 	 * Time (in jiffies) of last Tx
 	 */
@@ -3036,6 +3052,7 @@
 	unsigned int		dropped;
 	struct sk_buff_head	input_pkt_queue;
 	struct napi_struct	backlog;
+	struct sk_buff_head	tofree_queue;
 
 };
 
@@ -3054,14 +3071,38 @@
 #endif
 }
 
+#define XMIT_RECURSION_LIMIT	8
 DECLARE_PER_CPU_ALIGNED(struct softnet_data, softnet_data);
+
+#ifdef CONFIG_PREEMPT_RT_FULL
+static inline int dev_recursion_level(void)
+{
+	return current->xmit_recursion;
+}
+
+static inline bool dev_xmit_recursion(void)
+{
+	return unlikely(current->xmit_recursion >
+			XMIT_RECURSION_LIMIT);
+}
+
+static inline void dev_xmit_recursion_inc(void)
+{
+	current->xmit_recursion++;
+}
+
+static inline void dev_xmit_recursion_dec(void)
+{
+	current->xmit_recursion--;
+}
+
+#else
 
 static inline int dev_recursion_level(void)
 {
 	return this_cpu_read(softnet_data.xmit.recursion);
 }
 
-#define XMIT_RECURSION_LIMIT	8
 static inline bool dev_xmit_recursion(void)
 {
 	return unlikely(__this_cpu_read(softnet_data.xmit.recursion) >
@@ -3077,6 +3118,7 @@
 {
 	__this_cpu_dec(softnet_data.xmit.recursion);
 }
+#endif
 
 void __netif_schedule(struct Qdisc *q);
 void netif_schedule_queue(struct netdev_queue *txq);
@@ -3885,11 +3927,50 @@
 	return (1U << debug_value) - 1;
 }
 
+#ifdef CONFIG_PREEMPT_RT_FULL
+static inline void netdev_queue_set_owner(struct netdev_queue *txq, int cpu)
+{
+	WRITE_ONCE(txq->xmit_lock_owner, current);
+}
+
+static inline void netdev_queue_clear_owner(struct netdev_queue *txq)
+{
+	WRITE_ONCE(txq->xmit_lock_owner, NULL);
+}
+
+static inline bool netdev_queue_has_owner(struct netdev_queue *txq)
+{
+	if (READ_ONCE(txq->xmit_lock_owner) != NULL)
+		return true;
+	return false;
+}
+
+#else
+
+static inline void netdev_queue_set_owner(struct netdev_queue *txq, int cpu)
+{
+	/* Pairs with READ_ONCE() in __dev_queue_xmit() */
+	WRITE_ONCE(txq->xmit_lock_owner, cpu);
+}
+
+static inline void netdev_queue_clear_owner(struct netdev_queue *txq)
+{
+	/* Pairs with READ_ONCE() in __dev_queue_xmit() */
+	WRITE_ONCE(txq->xmit_lock_owner, -1);
+}
+
+static inline bool netdev_queue_has_owner(struct netdev_queue *txq)
+{
+	if (READ_ONCE(txq->xmit_lock_owner) != -1)
+		return true;
+	return false;
+}
+#endif
+
 static inline void __netif_tx_lock(struct netdev_queue *txq, int cpu)
 {
 	spin_lock(&txq->_xmit_lock);
-	/* Pairs with READ_ONCE() in __dev_queue_xmit() */
-	WRITE_ONCE(txq->xmit_lock_owner, cpu);
+	netdev_queue_set_owner(txq, cpu);
 }
 
 static inline bool __netif_tx_acquire(struct netdev_queue *txq)
@@ -3906,8 +3987,7 @@
 static inline void __netif_tx_lock_bh(struct netdev_queue *txq)
 {
 	spin_lock_bh(&txq->_xmit_lock);
-	/* Pairs with READ_ONCE() in __dev_queue_xmit() */
-	WRITE_ONCE(txq->xmit_lock_owner, smp_processor_id());
+	netdev_queue_set_owner(txq, smp_processor_id());
 }
 
 static inline bool __netif_tx_trylock(struct netdev_queue *txq)
@@ -3915,29 +3995,26 @@
 	bool ok = spin_trylock(&txq->_xmit_lock);
 
 	if (likely(ok)) {
-		/* Pairs with READ_ONCE() in __dev_queue_xmit() */
-		WRITE_ONCE(txq->xmit_lock_owner, smp_processor_id());
+		netdev_queue_set_owner(txq, smp_processor_id());
 	}
 	return ok;
 }
 
 static inline void __netif_tx_unlock(struct netdev_queue *txq)
 {
-	/* Pairs with READ_ONCE() in __dev_queue_xmit() */
-	WRITE_ONCE(txq->xmit_lock_owner, -1);
+	netdev_queue_clear_owner(txq);
 	spin_unlock(&txq->_xmit_lock);
 }
 
 static inline void __netif_tx_unlock_bh(struct netdev_queue *txq)
 {
-	/* Pairs with READ_ONCE() in __dev_queue_xmit() */
-	WRITE_ONCE(txq->xmit_lock_owner, -1);
+	netdev_queue_clear_owner(txq);
 	spin_unlock_bh(&txq->_xmit_lock);
 }
 
 static inline void txq_trans_update(struct netdev_queue *txq)
 {
-	if (txq->xmit_lock_owner != -1)
+	if (netdev_queue_has_owner(txq))
 		txq->trans_start = jiffies;
 }
 
diff --git a/kernel/include/linux/netfilter/x_tables.h b/kernel/include/linux/netfilter/x_tables.h
index 0ade4d1..3e21ce6 100644
--- a/kernel/include/linux/netfilter/x_tables.h
+++ b/kernel/include/linux/netfilter/x_tables.h
@@ -6,6 +6,7 @@
 #include <linux/netdevice.h>
 #include <linux/static_key.h>
 #include <linux/netfilter.h>
+#include <linux/locallock.h>
 #include <uapi/linux/netfilter/x_tables.h>
 
 /* Test a struct->invflags and a boolean for inequality */
@@ -345,6 +346,8 @@
  */
 DECLARE_PER_CPU(seqcount_t, xt_recseq);
 
+DECLARE_LOCAL_IRQ_LOCK(xt_write_lock);
+
 /* xt_tee_enabled - true if x_tables needs to handle reentrancy
  *
  * Enabled if current ip(6)tables ruleset has at least one -j TEE rule.
@@ -364,6 +367,9 @@
 static inline unsigned int xt_write_recseq_begin(void)
 {
 	unsigned int addend;
+
+	/* RT protection */
+	local_lock(xt_write_lock);
 
 	/*
 	 * Low order bit of sequence is set if we already
@@ -395,6 +401,7 @@
 	/* this is kind of a write_seqcount_end(), but addend is 0 or 1 */
 	smp_wmb();
 	__this_cpu_add(xt_recseq.sequence, addend);
+	local_unlock(xt_write_lock);
 }
 
 /*
diff --git a/kernel/include/linux/nfs_fs.h b/kernel/include/linux/nfs_fs.h
index 0ff7dd2..91e7bb5 100644
--- a/kernel/include/linux/nfs_fs.h
+++ b/kernel/include/linux/nfs_fs.h
@@ -164,7 +164,11 @@
 
 	/* Readers: in-flight sillydelete RPC calls */
 	/* Writers: rmdir */
+#ifdef CONFIG_PREEMPT_RT_BASE
+	struct semaphore        rmdir_sem;
+#else
 	struct rw_semaphore	rmdir_sem;
+#endif
 	struct mutex		commit_mutex;
 
 #if IS_ENABLED(CONFIG_NFS_V4)
diff --git a/kernel/include/linux/nfs_xdr.h b/kernel/include/linux/nfs_xdr.h
index cab24a1..73b0d19 100644
--- a/kernel/include/linux/nfs_xdr.h
+++ b/kernel/include/linux/nfs_xdr.h
@@ -1549,7 +1549,7 @@
 	struct nfs_removeargs args;
 	struct nfs_removeres res;
 	struct dentry *dentry;
-	wait_queue_head_t wq;
+	struct swait_queue_head wq;
 	struct rpc_cred	*cred;
 	struct nfs_fattr dir_attr;
 	long timeout;
diff --git a/kernel/include/linux/percpu-rwsem.h b/kernel/include/linux/percpu-rwsem.h
index 79b99d6..fb44e23 100644
--- a/kernel/include/linux/percpu-rwsem.h
+++ b/kernel/include/linux/percpu-rwsem.h
@@ -29,7 +29,7 @@
 extern int __percpu_down_read(struct percpu_rw_semaphore *, int);
 extern void __percpu_up_read(struct percpu_rw_semaphore *);
 
-static inline void percpu_down_read_preempt_disable(struct percpu_rw_semaphore *sem)
+static inline void percpu_down_read(struct percpu_rw_semaphore *sem)
 {
 	might_sleep();
 
@@ -47,16 +47,10 @@
 	__this_cpu_inc(*sem->read_count);
 	if (unlikely(!rcu_sync_is_idle(&sem->rss)))
 		__percpu_down_read(sem, false); /* Unconditional memory barrier */
-	barrier();
 	/*
-	 * The barrier() prevents the compiler from
+	 * The preempt_enable() prevents the compiler from
 	 * bleeding the critical section out.
 	 */
-}
-
-static inline void percpu_down_read(struct percpu_rw_semaphore *sem)
-{
-	percpu_down_read_preempt_disable(sem);
 	preempt_enable();
 }
 
@@ -83,13 +77,9 @@
 	return ret;
 }
 
-static inline void percpu_up_read_preempt_enable(struct percpu_rw_semaphore *sem)
+static inline void percpu_up_read(struct percpu_rw_semaphore *sem)
 {
-	/*
-	 * The barrier() prevents the compiler from
-	 * bleeding the critical section out.
-	 */
-	barrier();
+	preempt_disable();
 	/*
 	 * Same as in percpu_down_read().
 	 */
@@ -100,12 +90,6 @@
 	preempt_enable();
 
 	rwsem_release(&sem->rw_sem.dep_map, 1, _RET_IP_);
-}
-
-static inline void percpu_up_read(struct percpu_rw_semaphore *sem)
-{
-	preempt_disable();
-	percpu_up_read_preempt_enable(sem);
 }
 
 extern void percpu_down_write(struct percpu_rw_semaphore *);
diff --git a/kernel/include/linux/percpu.h b/kernel/include/linux/percpu.h
index 70b7123..24421bf 100644
--- a/kernel/include/linux/percpu.h
+++ b/kernel/include/linux/percpu.h
@@ -19,6 +19,35 @@
 #define PERCPU_MODULE_RESERVE		0
 #endif
 
+#ifdef CONFIG_PREEMPT_RT_FULL
+
+#define get_local_var(var) (*({	\
+	migrate_disable();	\
+	this_cpu_ptr(&var);	}))
+
+#define put_local_var(var) do {	\
+	(void)&(var);		\
+	migrate_enable();	\
+} while (0)
+
+# define get_local_ptr(var) ({	\
+	migrate_disable();	\
+	this_cpu_ptr(var);	})
+
+# define put_local_ptr(var) do {	\
+	(void)(var);			\
+	migrate_enable();		\
+} while (0)
+
+#else
+
+#define get_local_var(var)	get_cpu_var(var)
+#define put_local_var(var)	put_cpu_var(var)
+#define get_local_ptr(var)	get_cpu_ptr(var)
+#define put_local_ptr(var)	put_cpu_ptr(var)
+
+#endif
+
 /* minimum unit size, also is the maximum supported allocation size */
 #define PCPU_MIN_UNIT_SIZE		PFN_ALIGN(32 << 10)
 
diff --git a/kernel/include/linux/pid.h b/kernel/include/linux/pid.h
index a82d2f7..a85b65f 100644
--- a/kernel/include/linux/pid.h
+++ b/kernel/include/linux/pid.h
@@ -4,6 +4,7 @@
 
 #include <linux/rculist.h>
 #include <linux/wait.h>
+#include <linux/atomic.h>
 
 enum pid_type
 {
diff --git a/kernel/include/linux/platform_device.h b/kernel/include/linux/platform_device.h
index 67d1bca..1de7ea6 100644
--- a/kernel/include/linux/platform_device.h
+++ b/kernel/include/linux/platform_device.h
@@ -234,10 +234,6 @@
 	module_driver(__platform_driver, platform_driver_register, \
 			platform_driver_unregister)
 
-#define module_platform_driver1(__platform_driver) \
-       module_driver1(__platform_driver, platform_driver_register, \
-                       platform_driver_unregister)
-
 /* builtin_platform_driver() - Helper macro for builtin drivers that
  * don't do anything special in driver init.  This eliminates some
  * boilerplate.  Each driver may only use this macro once, and
diff --git a/kernel/include/linux/posix-timers.h b/kernel/include/linux/posix-timers.h
index ee7e987..3e6c91b 100644
--- a/kernel/include/linux/posix-timers.h
+++ b/kernel/include/linux/posix-timers.h
@@ -15,6 +15,7 @@
 	u64 expires, incr;
 	struct task_struct *task;
 	int firing;
+	int firing_cpu;
 };
 
 /*
@@ -114,8 +115,8 @@
 		struct {
 			struct alarm	alarmtimer;
 		} alarm;
-		struct rcu_head		rcu;
 	} it;
+	struct rcu_head		rcu;
 };
 
 void run_posix_cpu_timers(struct task_struct *task);
diff --git a/kernel/include/linux/preempt.h b/kernel/include/linux/preempt.h
index c01813c..9c74a01 100644
--- a/kernel/include/linux/preempt.h
+++ b/kernel/include/linux/preempt.h
@@ -51,7 +51,11 @@
 #define HARDIRQ_OFFSET	(1UL << HARDIRQ_SHIFT)
 #define NMI_OFFSET	(1UL << NMI_SHIFT)
 
-#define SOFTIRQ_DISABLE_OFFSET	(2 * SOFTIRQ_OFFSET)
+#ifndef CONFIG_PREEMPT_RT_FULL
+# define SOFTIRQ_DISABLE_OFFSET		(2 * SOFTIRQ_OFFSET)
+#else
+# define SOFTIRQ_DISABLE_OFFSET		(0)
+#endif
 
 /* We use the MSB mostly because its available */
 #define PREEMPT_NEED_RESCHED	0x80000000
@@ -81,9 +85,15 @@
 #include <asm/preempt.h>
 
 #define hardirq_count()	(preempt_count() & HARDIRQ_MASK)
-#define softirq_count()	(preempt_count() & SOFTIRQ_MASK)
 #define irq_count()	(preempt_count() & (HARDIRQ_MASK | SOFTIRQ_MASK \
 				 | NMI_MASK))
+#ifndef CONFIG_PREEMPT_RT_FULL
+# define softirq_count()	(preempt_count() & SOFTIRQ_MASK)
+# define in_serving_softirq()	(softirq_count() & SOFTIRQ_OFFSET)
+#else
+# define softirq_count()	((unsigned long)current->softirq_nestcnt)
+extern int in_serving_softirq(void);
+#endif
 
 /*
  * Are we doing bottom half or hardware interrupt processing?
@@ -101,7 +111,6 @@
 #define in_irq()		(hardirq_count())
 #define in_softirq()		(softirq_count())
 #define in_interrupt()		(irq_count())
-#define in_serving_softirq()	(softirq_count() & SOFTIRQ_OFFSET)
 #define in_nmi()		(preempt_count() & NMI_MASK)
 #define in_task()		(!(preempt_count() & \
 				   (NMI_MASK | HARDIRQ_MASK | SOFTIRQ_OFFSET)))
@@ -118,7 +127,11 @@
 /*
  * The preempt_count offset after spin_lock()
  */
+#if !defined(CONFIG_PREEMPT_RT_FULL)
 #define PREEMPT_LOCK_OFFSET	PREEMPT_DISABLE_OFFSET
+#else
+#define PREEMPT_LOCK_OFFSET	0
+#endif
 
 /*
  * The preempt_count offset needed for things like:
@@ -167,11 +180,31 @@
 #define preempt_count_inc() preempt_count_add(1)
 #define preempt_count_dec() preempt_count_sub(1)
 
+#ifdef CONFIG_PREEMPT_LAZY
+#define add_preempt_lazy_count(val)	do { preempt_lazy_count() += (val); } while (0)
+#define sub_preempt_lazy_count(val)	do { preempt_lazy_count() -= (val); } while (0)
+#define inc_preempt_lazy_count()	add_preempt_lazy_count(1)
+#define dec_preempt_lazy_count()	sub_preempt_lazy_count(1)
+#define preempt_lazy_count()		(current_thread_info()->preempt_lazy_count)
+#else
+#define add_preempt_lazy_count(val)	do { } while (0)
+#define sub_preempt_lazy_count(val)	do { } while (0)
+#define inc_preempt_lazy_count()	do { } while (0)
+#define dec_preempt_lazy_count()	do { } while (0)
+#define preempt_lazy_count()		(0)
+#endif
+
 #ifdef CONFIG_PREEMPT_COUNT
 
 #define preempt_disable() \
 do { \
 	preempt_count_inc(); \
+	barrier(); \
+} while (0)
+
+#define preempt_lazy_disable() \
+do { \
+	inc_preempt_lazy_count(); \
 	barrier(); \
 } while (0)
 
@@ -181,9 +214,40 @@
 	preempt_count_dec(); \
 } while (0)
 
-#define preempt_enable_no_resched() sched_preempt_enable_no_resched()
+#ifdef CONFIG_PREEMPT_RT_BASE
+# define preempt_enable_no_resched() sched_preempt_enable_no_resched()
+# define preempt_check_resched_rt() preempt_check_resched()
+#else
+# define preempt_enable_no_resched() preempt_enable()
+# define preempt_check_resched_rt() barrier();
+#endif
 
 #define preemptible()	(preempt_count() == 0 && !irqs_disabled())
+
+#if defined(CONFIG_SMP) && defined(CONFIG_PREEMPT_RT_BASE)
+
+extern void migrate_disable(void);
+extern void migrate_enable(void);
+
+int __migrate_disabled(struct task_struct *p);
+
+#elif !defined(CONFIG_SMP) && defined(CONFIG_PREEMPT_RT_BASE)
+
+extern void migrate_disable(void);
+extern void migrate_enable(void);
+static inline int __migrate_disabled(struct task_struct *p)
+{
+	return 0;
+}
+
+#else
+#define migrate_disable()		preempt_disable()
+#define migrate_enable()		preempt_enable()
+static inline int __migrate_disabled(struct task_struct *p)
+{
+	return 0;
+}
+#endif
 
 #ifdef CONFIG_PREEMPT
 #define preempt_enable() \
@@ -206,11 +270,24 @@
 		__preempt_schedule(); \
 } while (0)
 
+#define preempt_lazy_enable() \
+do { \
+	dec_preempt_lazy_count(); \
+	barrier(); \
+	preempt_check_resched(); \
+} while (0)
+
 #else /* !CONFIG_PREEMPT */
 #define preempt_enable() \
 do { \
 	barrier(); \
 	preempt_count_dec(); \
+} while (0)
+
+#define preempt_lazy_enable() \
+do { \
+	dec_preempt_lazy_count(); \
+	barrier(); \
 } while (0)
 
 #define preempt_enable_notrace() \
@@ -251,8 +328,16 @@
 #define preempt_disable_notrace()		barrier()
 #define preempt_enable_no_resched_notrace()	barrier()
 #define preempt_enable_notrace()		barrier()
+#define preempt_check_resched_rt()		barrier()
 #define preemptible()				0
 
+#define migrate_disable()			barrier()
+#define migrate_enable()			barrier()
+
+static inline int __migrate_disabled(struct task_struct *p)
+{
+	return 0;
+}
 #endif /* CONFIG_PREEMPT_COUNT */
 
 #ifdef MODULE
@@ -271,10 +356,22 @@
 } while (0)
 #define preempt_fold_need_resched() \
 do { \
-	if (tif_need_resched()) \
+	if (tif_need_resched_now()) \
 		set_preempt_need_resched(); \
 } while (0)
 
+#ifdef CONFIG_PREEMPT_RT_FULL
+# define preempt_disable_rt()		preempt_disable()
+# define preempt_enable_rt()		preempt_enable()
+# define preempt_disable_nort()		barrier()
+# define preempt_enable_nort()		barrier()
+#else
+# define preempt_disable_rt()		barrier()
+# define preempt_enable_rt()		barrier()
+# define preempt_disable_nort()		preempt_disable()
+# define preempt_enable_nort()		preempt_enable()
+#endif
+
 #ifdef CONFIG_PREEMPT_NOTIFIERS
 
 struct preempt_notifier;
diff --git a/kernel/include/linux/printk.h b/kernel/include/linux/printk.h
index d3195ea..fdc167b 100644
--- a/kernel/include/linux/printk.h
+++ b/kernel/include/linux/printk.h
@@ -141,9 +141,11 @@
 #ifdef CONFIG_EARLY_PRINTK
 extern asmlinkage __printf(1, 2)
 void early_printk(const char *fmt, ...);
+extern void printk_kill(void);
 #else
 static inline __printf(1, 2) __cold
 void early_printk(const char *s, ...) { }
+static inline void printk_kill(void) { }
 #endif
 
 #ifdef CONFIG_PRINTK_NMI
diff --git a/kernel/include/linux/pstore.h b/kernel/include/linux/pstore.h
index d3d5214..09b6d65 100644
--- a/kernel/include/linux/pstore.h
+++ b/kernel/include/linux/pstore.h
@@ -44,8 +44,8 @@
 	PSTORE_TYPE_PPC_COMMON	= 6,
 	PSTORE_TYPE_PMSG	= 7,
 	PSTORE_TYPE_PPC_OPAL	= 8,
-#ifdef CONFIG_PSTORE_MCU_LOG
-	PSTORE_TYPE_MCU_LOG	= 9,
+#ifdef CONFIG_PSTORE_BOOT_LOG
+	PSTORE_TYPE_BOOT_LOG	= 9,
 #endif
 	PSTORE_TYPE_UNKNOWN	= 255
 };
@@ -199,8 +199,8 @@
 #define PSTORE_FLAGS_CONSOLE	(1 << 1)
 #define PSTORE_FLAGS_FTRACE	(1 << 2)
 #define PSTORE_FLAGS_PMSG	(1 << 3)
-#ifdef CONFIG_PSTORE_MCU_LOG
-#define PSTORE_FLAGS_MCU_LOG	(1 << 4)
+#ifdef CONFIG_PSTORE_BOOT_LOG
+#define PSTORE_FLAGS_BOOT_LOG	(1 << 4)
 #endif
 extern int pstore_register(struct pstore_info *);
 extern void pstore_unregister(struct pstore_info *);
diff --git a/kernel/include/linux/pstore_ram.h b/kernel/include/linux/pstore_ram.h
index 69e580b..82ffcac 100644
--- a/kernel/include/linux/pstore_ram.h
+++ b/kernel/include/linux/pstore_ram.h
@@ -76,8 +76,8 @@
 	struct persistent_ram_zone *cprz;	/* Console zone */
 	struct persistent_ram_zone **fprzs;	/* Ftrace zones */
 	struct persistent_ram_zone *mprz;	/* PMSG zone */
-#ifdef CONFIG_PSTORE_MCU_LOG
-	struct persistent_ram_zone **mcu_przs;	/* MCU log zones */
+#ifdef CONFIG_PSTORE_BOOT_LOG
+	struct persistent_ram_zone **boot_przs;	/* BOOT log zones */
 #endif
 	phys_addr_t phys_addr;
 	unsigned long size;
@@ -86,8 +86,8 @@
 	size_t console_size;
 	size_t ftrace_size;
 	size_t pmsg_size;
-#ifdef CONFIG_PSTORE_MCU_LOG
-	size_t mcu_log_size;
+#ifdef CONFIG_PSTORE_BOOT_LOG
+	size_t boot_log_size;
 #endif
 	int dump_oops;
 	u32 flags;
@@ -100,9 +100,9 @@
 	unsigned int max_ftrace_cnt;
 	unsigned int ftrace_read_cnt;
 	unsigned int pmsg_read_cnt;
-#ifdef CONFIG_PSTORE_MCU_LOG
-	unsigned int mcu_log_read_cnt;
-	unsigned int max_mcu_log_cnt;
+#ifdef CONFIG_PSTORE_BOOT_LOG
+	unsigned int boot_log_read_cnt;
+	unsigned int max_boot_log_cnt;
 #endif
 	struct pstore_info pstore;
 };
@@ -141,9 +141,9 @@
 	unsigned long	console_size;
 	unsigned long	ftrace_size;
 	unsigned long	pmsg_size;
-#ifdef CONFIG_PSTORE_MCU_LOG
-	unsigned long	mcu_log_size;
-	unsigned long	max_mcu_log_cnt;
+#ifdef CONFIG_PSTORE_BOOT_LOG
+	unsigned long	boot_log_size;
+	unsigned long	max_boot_log_cnt;
 #endif
 	int		dump_oops;
 	u32		flags;
diff --git a/kernel/include/linux/radix-tree.h b/kernel/include/linux/radix-tree.h
index 34149e8..affb0fc 100644
--- a/kernel/include/linux/radix-tree.h
+++ b/kernel/include/linux/radix-tree.h
@@ -330,6 +330,8 @@
 int radix_tree_preload(gfp_t gfp_mask);
 int radix_tree_maybe_preload(gfp_t gfp_mask);
 int radix_tree_maybe_preload_order(gfp_t gfp_mask, int order);
+void radix_tree_preload_end(void);
+
 void radix_tree_init(void);
 void *radix_tree_tag_set(struct radix_tree_root *,
 			unsigned long index, unsigned int tag);
@@ -348,11 +350,6 @@
 		void __rcu ***results, unsigned long first_index,
 		unsigned int max_items, unsigned int tag);
 int radix_tree_tagged(const struct radix_tree_root *, unsigned int tag);
-
-static inline void radix_tree_preload_end(void)
-{
-	preempt_enable();
-}
 
 int radix_tree_split_preload(unsigned old_order, unsigned new_order, gfp_t);
 int radix_tree_split(struct radix_tree_root *, unsigned long index,
diff --git a/kernel/include/linux/random.h b/kernel/include/linux/random.h
index 04e4ee9..3728a12 100644
--- a/kernel/include/linux/random.h
+++ b/kernel/include/linux/random.h
@@ -33,7 +33,7 @@
 
 extern void add_input_randomness(unsigned int type, unsigned int code,
 				 unsigned int value) __latent_entropy;
-extern void add_interrupt_randomness(int irq, int irq_flags) __latent_entropy;
+extern void add_interrupt_randomness(int irq, int irq_flags, __u64 ip) __latent_entropy;
 
 extern void get_random_bytes(void *buf, int nbytes);
 extern int wait_for_random_bytes(void);
diff --git a/kernel/include/linux/rbtree.h b/kernel/include/linux/rbtree.h
index fcbeed4..2aa2aec 100644
--- a/kernel/include/linux/rbtree.h
+++ b/kernel/include/linux/rbtree.h
@@ -31,7 +31,7 @@
 
 #include <linux/kernel.h>
 #include <linux/stddef.h>
-#include <linux/rcupdate.h>
+#include <linux/rcu_assign_pointer.h>
 
 struct rb_node {
 	unsigned long  __rb_parent_color;
diff --git a/kernel/include/linux/rcu_assign_pointer.h b/kernel/include/linux/rcu_assign_pointer.h
new file mode 100644
index 0000000..7066962
--- /dev/null
+++ b/kernel/include/linux/rcu_assign_pointer.h
@@ -0,0 +1,54 @@
+#ifndef __LINUX_RCU_ASSIGN_POINTER_H__
+#define __LINUX_RCU_ASSIGN_POINTER_H__
+#include <linux/compiler.h>
+#include <asm/barrier.h>
+
+/**
+ * RCU_INITIALIZER() - statically initialize an RCU-protected global variable
+ * @v: The value to statically initialize with.
+ */
+#define RCU_INITIALIZER(v) (typeof(*(v)) __force __rcu *)(v)
+
+/**
+ * rcu_assign_pointer() - assign to RCU-protected pointer
+ * @p: pointer to assign to
+ * @v: value to assign (publish)
+ *
+ * Assigns the specified value to the specified RCU-protected
+ * pointer, ensuring that any concurrent RCU readers will see
+ * any prior initialization.
+ *
+ * Inserts memory barriers on architectures that require them
+ * (which is most of them), and also prevents the compiler from
+ * reordering the code that initializes the structure after the pointer
+ * assignment.  More importantly, this call documents which pointers
+ * will be dereferenced by RCU read-side code.
+ *
+ * In some special cases, you may use RCU_INIT_POINTER() instead
+ * of rcu_assign_pointer().  RCU_INIT_POINTER() is a bit faster due
+ * to the fact that it does not constrain either the CPU or the compiler.
+ * That said, using RCU_INIT_POINTER() when you should have used
+ * rcu_assign_pointer() is a very bad thing that results in
+ * impossible-to-diagnose memory corruption.  So please be careful.
+ * See the RCU_INIT_POINTER() comment header for details.
+ *
+ * Note that rcu_assign_pointer() evaluates each of its arguments only
+ * once, appearances notwithstanding.  One of the "extra" evaluations
+ * is in typeof() and the other visible only to sparse (__CHECKER__),
+ * neither of which actually execute the argument.  As with most cpp
+ * macros, this execute-arguments-only-once property is important, so
+ * please be careful when making changes to rcu_assign_pointer() and the
+ * other macros that it invokes.
+ */
+#define rcu_assign_pointer(p, v)					      \
+({									      \
+	uintptr_t _r_a_p__v = (uintptr_t)(v);				      \
+									      \
+	if (__builtin_constant_p(v) && (_r_a_p__v) == (uintptr_t)NULL)	      \
+		WRITE_ONCE((p), (typeof(p))(_r_a_p__v));		      \
+	else								      \
+		smp_store_release(&p, RCU_INITIALIZER((typeof(p))_r_a_p__v)); \
+	_r_a_p__v;							      \
+})
+
+#endif
diff --git a/kernel/include/linux/rcupdate.h b/kernel/include/linux/rcupdate.h
index 68cbe11..08d64e5 100644
--- a/kernel/include/linux/rcupdate.h
+++ b/kernel/include/linux/rcupdate.h
@@ -42,6 +42,7 @@
 #include <linux/lockdep.h>
 #include <asm/processor.h>
 #include <linux/cpumask.h>
+#include <linux/rcu_assign_pointer.h>
 
 #define ULONG_CMP_GE(a, b)	(ULONG_MAX / 2 >= (a) - (b))
 #define ULONG_CMP_LT(a, b)	(ULONG_MAX / 2 < (a) - (b))
@@ -55,7 +56,11 @@
 #define	call_rcu	call_rcu_sched
 #endif /* #else #ifdef CONFIG_PREEMPT_RCU */
 
+#ifdef CONFIG_PREEMPT_RT_FULL
+#define call_rcu_bh	call_rcu
+#else
 void call_rcu_bh(struct rcu_head *head, rcu_callback_t func);
+#endif
 void call_rcu_sched(struct rcu_head *head, rcu_callback_t func);
 void synchronize_sched(void);
 void rcu_barrier_tasks(void);
@@ -73,6 +78,11 @@
  * types of kernel builds, the rcu_read_lock() nesting depth is unknowable.
  */
 #define rcu_preempt_depth() (current->rcu_read_lock_nesting)
+#ifndef CONFIG_PREEMPT_RT_FULL
+#define sched_rcu_preempt_depth()	rcu_preempt_depth()
+#else
+static inline int sched_rcu_preempt_depth(void) { return 0; }
+#endif
 
 #else /* #ifdef CONFIG_PREEMPT_RCU */
 
@@ -95,6 +105,8 @@
 {
 	return 0;
 }
+
+#define sched_rcu_preempt_depth()	rcu_preempt_depth()
 
 #endif /* #else #ifdef CONFIG_PREEMPT_RCU */
 
@@ -253,7 +265,14 @@
 extern struct lockdep_map rcu_callback_map;
 int debug_lockdep_rcu_enabled(void);
 int rcu_read_lock_held(void);
+#ifdef CONFIG_PREEMPT_RT_FULL
+static inline int rcu_read_lock_bh_held(void)
+{
+	return rcu_read_lock_held();
+}
+#else
 int rcu_read_lock_bh_held(void);
+#endif
 int rcu_read_lock_sched_held(void);
 
 #else /* #ifdef CONFIG_DEBUG_LOCK_ALLOC */
@@ -360,54 +379,6 @@
 	/* Dependency order vs. p above. */ \
 	typeof(p) ________p1 = READ_ONCE(p); \
 	((typeof(*p) __force __kernel *)(________p1)); \
-})
-
-/**
- * RCU_INITIALIZER() - statically initialize an RCU-protected global variable
- * @v: The value to statically initialize with.
- */
-#define RCU_INITIALIZER(v) (typeof(*(v)) __force __rcu *)(v)
-
-/**
- * rcu_assign_pointer() - assign to RCU-protected pointer
- * @p: pointer to assign to
- * @v: value to assign (publish)
- *
- * Assigns the specified value to the specified RCU-protected
- * pointer, ensuring that any concurrent RCU readers will see
- * any prior initialization.
- *
- * Inserts memory barriers on architectures that require them
- * (which is most of them), and also prevents the compiler from
- * reordering the code that initializes the structure after the pointer
- * assignment.  More importantly, this call documents which pointers
- * will be dereferenced by RCU read-side code.
- *
- * In some special cases, you may use RCU_INIT_POINTER() instead
- * of rcu_assign_pointer().  RCU_INIT_POINTER() is a bit faster due
- * to the fact that it does not constrain either the CPU or the compiler.
- * That said, using RCU_INIT_POINTER() when you should have used
- * rcu_assign_pointer() is a very bad thing that results in
- * impossible-to-diagnose memory corruption.  So please be careful.
- * See the RCU_INIT_POINTER() comment header for details.
- *
- * Note that rcu_assign_pointer() evaluates each of its arguments only
- * once, appearances notwithstanding.  One of the "extra" evaluations
- * is in typeof() and the other visible only to sparse (__CHECKER__),
- * neither of which actually execute the argument.  As with most cpp
- * macros, this execute-arguments-only-once property is important, so
- * please be careful when making changes to rcu_assign_pointer() and the
- * other macros that it invokes.
- */
-#define rcu_assign_pointer(p, v)					      \
-({									      \
-	uintptr_t _r_a_p__v = (uintptr_t)(v);				      \
-									      \
-	if (__builtin_constant_p(v) && (_r_a_p__v) == (uintptr_t)NULL)	      \
-		WRITE_ONCE((p), (typeof(p))(_r_a_p__v));		      \
-	else								      \
-		smp_store_release(&p, RCU_INITIALIZER((typeof(p))_r_a_p__v)); \
-	_r_a_p__v;							      \
 })
 
 /**
@@ -701,10 +672,14 @@
 static inline void rcu_read_lock_bh(void)
 {
 	local_bh_disable();
+#ifdef CONFIG_PREEMPT_RT_FULL
+	rcu_read_lock();
+#else
 	__acquire(RCU_BH);
 	rcu_lock_acquire(&rcu_bh_lock_map);
 	RCU_LOCKDEP_WARN(!rcu_is_watching(),
 			 "rcu_read_lock_bh() used illegally while idle");
+#endif
 }
 
 /*
@@ -714,10 +689,14 @@
  */
 static inline void rcu_read_unlock_bh(void)
 {
+#ifdef CONFIG_PREEMPT_RT_FULL
+	rcu_read_unlock();
+#else
 	RCU_LOCKDEP_WARN(!rcu_is_watching(),
 			 "rcu_read_unlock_bh() used illegally while idle");
 	rcu_lock_release(&rcu_bh_lock_map);
 	__release(RCU_BH);
+#endif
 	local_bh_enable();
 }
 
diff --git a/kernel/include/linux/rcutree.h b/kernel/include/linux/rcutree.h
index 9146558..462ce06 100644
--- a/kernel/include/linux/rcutree.h
+++ b/kernel/include/linux/rcutree.h
@@ -44,7 +44,11 @@
 	rcu_note_context_switch(false);
 }
 
+#ifdef CONFIG_PREEMPT_RT_FULL
+# define synchronize_rcu_bh	synchronize_rcu
+#else
 void synchronize_rcu_bh(void);
+#endif
 void synchronize_sched_expedited(void);
 void synchronize_rcu_expedited(void);
 
@@ -72,7 +76,11 @@
 }
 
 void rcu_barrier(void);
+#ifdef CONFIG_PREEMPT_RT_FULL
+# define rcu_barrier_bh		rcu_barrier
+#else
 void rcu_barrier_bh(void);
+#endif
 void rcu_barrier_sched(void);
 bool rcu_eqs_special_set(int cpu);
 unsigned long get_state_synchronize_rcu(void);
diff --git a/kernel/include/linux/regulator/consumer.h b/kernel/include/linux/regulator/consumer.h
index b07601f..54fa3ee 100644
--- a/kernel/include/linux/regulator/consumer.h
+++ b/kernel/include/linux/regulator/consumer.h
@@ -488,6 +488,11 @@
 	return 0;
 }
 
+static inline unsigned int regulator_get_linear_step(struct regulator *regulator)
+{
+	return 0;
+}
+
 static inline int regulator_set_current_limit(struct regulator *regulator,
 					     int min_uA, int max_uA)
 {
diff --git a/kernel/include/linux/reservation.h b/kernel/include/linux/reservation.h
index 02166e8..0b31df1 100644
--- a/kernel/include/linux/reservation.h
+++ b/kernel/include/linux/reservation.h
@@ -72,7 +72,7 @@
  */
 struct reservation_object {
 	struct ww_mutex lock;
-	seqcount_t seq;
+	seqlock_t seq;
 
 	struct dma_fence __rcu *fence_excl;
 	struct reservation_object_list __rcu *fence;
@@ -92,7 +92,7 @@
 {
 	ww_mutex_init(&obj->lock, &reservation_ww_class);
 
-	__seqcount_init(&obj->seq, reservation_seqcount_string, &reservation_seqcount_class);
+	seqlock_init(&obj->seq);
 	RCU_INIT_POINTER(obj->fence, NULL);
 	RCU_INIT_POINTER(obj->fence_excl, NULL);
 	obj->staged = NULL;
diff --git a/kernel/include/linux/rockchip/cpu.h b/kernel/include/linux/rockchip/cpu.h
index eef266c..feac680 100644
--- a/kernel/include/linux/rockchip/cpu.h
+++ b/kernel/include/linux/rockchip/cpu.h
@@ -24,6 +24,7 @@
 #define ROCKCHIP_CPU_RK312X		0x31260000
 #define ROCKCHIP_CPU_RK3288		0x32880000
 #define ROCKCHIP_CPU_RK3308		0x33080000
+#define ROCKCHIP_CPU_RK3528		0x35280000
 #define ROCKCHIP_CPU_RK3566		0x35660000
 #define ROCKCHIP_CPU_RK3568		0x35680000
 
@@ -153,6 +154,17 @@
 static inline bool cpu_is_rk3308(void) { return false; }
 #endif
 
+#if defined(CONFIG_CPU_RK3528)
+static inline bool cpu_is_rk3528(void)
+{
+	if (rockchip_soc_id)
+		return (rockchip_soc_id & ROCKCHIP_CPU_MASK) == ROCKCHIP_CPU_RK3528;
+	return of_machine_is_compatible("rockchip,rk3528");
+}
+#else
+static inline bool cpu_is_rk3528(void) { return false; }
+#endif
+
 #if defined(CONFIG_CPU_RK3568)
 static inline bool cpu_is_rk3566(void)
 {
@@ -185,6 +197,7 @@
 #define ROCKCHIP_SOC_RK3288W    (ROCKCHIP_CPU_RK3288 | 0x01)
 #define ROCKCHIP_SOC_RK3308	(ROCKCHIP_CPU_RK3308 | 0x00)
 #define ROCKCHIP_SOC_RK3308B	(ROCKCHIP_CPU_RK3308 | 0x01)
+#define ROCKCHIP_SOC_RK3528	(ROCKCHIP_CPU_RK3528 | 0x00)
 #define ROCKCHIP_SOC_RK3566	(ROCKCHIP_CPU_RK3566 | 0x00)
 #define ROCKCHIP_SOC_RK3568	(ROCKCHIP_CPU_RK3568 | 0x00)
 
@@ -208,6 +221,7 @@
 ROCKCHIP_SOC(rk3288w, RK3288W)
 ROCKCHIP_SOC(rk3308, RK3308)
 ROCKCHIP_SOC(rk3308b, RK3308B)
+ROCKCHIP_SOC(rk3528, RK3528)
 ROCKCHIP_SOC(rk3566, RK3566)
 ROCKCHIP_SOC(rk3568, RK3568)
 
diff --git a/kernel/include/linux/rockchip/rockchip_sip.h b/kernel/include/linux/rockchip/rockchip_sip.h
index 960db55..6682ffb 100644
--- a/kernel/include/linux/rockchip/rockchip_sip.h
+++ b/kernel/include/linux/rockchip/rockchip_sip.h
@@ -153,6 +153,9 @@
 	SHARE_PAGE_TYPE_MAX,
 } share_page_type_t;
 
+struct pt_regs;
+typedef void (*sip_fiq_debugger_uart_irq_tf_cb_t)(struct pt_regs *_pt_regs, unsigned long cpu);
+
 /*
  * Rules: struct arm_smccc_res contains result and data, details:
  *
@@ -184,7 +187,7 @@
 /***************************fiq debugger **************************************/
 void sip_fiq_debugger_enable_fiq(bool enable, uint32_t tgt_cpu);
 void sip_fiq_debugger_enable_debug(bool enable);
-int sip_fiq_debugger_uart_irq_tf_init(u32 irq_id, void *callback_fn);
+int sip_fiq_debugger_uart_irq_tf_init(u32 irq_id, sip_fiq_debugger_uart_irq_tf_cb_t callback_fn);
 int sip_fiq_debugger_set_print_port(u32 port_phyaddr, u32 baudrate);
 int sip_fiq_debugger_request_share_memory(void);
 int sip_fiq_debugger_get_target_cpu(void);
@@ -283,7 +286,7 @@
 
 static inline void sip_fiq_debugger_enable_debug(bool enable) { return; }
 static inline int sip_fiq_debugger_uart_irq_tf_init(u32 irq_id,
-						    void *callback_fn)
+						    sip_fiq_debugger_uart_irq_tf_cb_t callback_fn)
 {
 	return 0;
 }
diff --git a/kernel/include/linux/rtmutex.h b/kernel/include/linux/rtmutex.h
index 6fd615a..138bd1e 100644
--- a/kernel/include/linux/rtmutex.h
+++ b/kernel/include/linux/rtmutex.h
@@ -14,10 +14,14 @@
 #define __LINUX_RT_MUTEX_H
 
 #include <linux/linkage.h>
+#include <linux/spinlock_types_raw.h>
 #include <linux/rbtree.h>
-#include <linux/spinlock_types.h>
 
 extern int max_lock_depth; /* for sysctl */
+
+#ifdef CONFIG_DEBUG_MUTEXES
+#include <linux/debug_locks.h>
+#endif
 
 /**
  * The rt_mutex structure
@@ -31,8 +35,8 @@
 	raw_spinlock_t		wait_lock;
 	struct rb_root_cached   waiters;
 	struct task_struct	*owner;
-#ifdef CONFIG_DEBUG_RT_MUTEXES
 	int			save_state;
+#ifdef CONFIG_DEBUG_RT_MUTEXES
 	const char		*name, *file;
 	int			line;
 	void			*magic;
@@ -82,15 +86,22 @@
 #define __DEP_MAP_RT_MUTEX_INITIALIZER(mutexname)
 #endif
 
-#define __RT_MUTEX_INITIALIZER(mutexname) \
-	{ .wait_lock = __RAW_SPIN_LOCK_UNLOCKED(mutexname.wait_lock) \
+#define __RT_MUTEX_INITIALIZER_PLAIN(mutexname) \
+	.wait_lock = __RAW_SPIN_LOCK_UNLOCKED(mutexname.wait_lock) \
 	, .waiters = RB_ROOT_CACHED \
 	, .owner = NULL \
 	__DEBUG_RT_MUTEX_INITIALIZER(mutexname) \
-	__DEP_MAP_RT_MUTEX_INITIALIZER(mutexname)}
+	__DEP_MAP_RT_MUTEX_INITIALIZER(mutexname)
+
+#define __RT_MUTEX_INITIALIZER(mutexname) \
+	{ __RT_MUTEX_INITIALIZER_PLAIN(mutexname) }
 
 #define DEFINE_RT_MUTEX(mutexname) \
 	struct rt_mutex mutexname = __RT_MUTEX_INITIALIZER(mutexname)
+
+#define __RT_MUTEX_INITIALIZER_SAVE_STATE(mutexname) \
+	{ __RT_MUTEX_INITIALIZER_PLAIN(mutexname)    \
+		, .save_state = 1 }
 
 /**
  * rt_mutex_is_locked - is the mutex locked
@@ -115,6 +126,7 @@
 #endif
 
 extern int rt_mutex_lock_interruptible(struct rt_mutex *lock);
+extern int rt_mutex_lock_killable(struct rt_mutex *lock);
 extern int rt_mutex_timed_lock(struct rt_mutex *lock,
 			       struct hrtimer_sleeper *timeout);
 
diff --git a/kernel/include/linux/rwlock_rt.h b/kernel/include/linux/rwlock_rt.h
new file mode 100644
index 0000000..a9c4c2a
--- /dev/null
+++ b/kernel/include/linux/rwlock_rt.h
@@ -0,0 +1,119 @@
+#ifndef __LINUX_RWLOCK_RT_H
+#define __LINUX_RWLOCK_RT_H
+
+#ifndef __LINUX_SPINLOCK_H
+#error Do not include directly. Use spinlock.h
+#endif
+
+extern void __lockfunc rt_write_lock(rwlock_t *rwlock);
+extern void __lockfunc rt_read_lock(rwlock_t *rwlock);
+extern int __lockfunc rt_write_trylock(rwlock_t *rwlock);
+extern int __lockfunc rt_read_trylock(rwlock_t *rwlock);
+extern void __lockfunc rt_write_unlock(rwlock_t *rwlock);
+extern void __lockfunc rt_read_unlock(rwlock_t *rwlock);
+extern int __lockfunc rt_read_can_lock(rwlock_t *rwlock);
+extern int __lockfunc rt_write_can_lock(rwlock_t *rwlock);
+extern void __rt_rwlock_init(rwlock_t *rwlock, char *name, struct lock_class_key *key);
+
+#define read_can_lock(rwlock)		rt_read_can_lock(rwlock)
+#define write_can_lock(rwlock)		rt_write_can_lock(rwlock)
+
+#define read_trylock(lock)	__cond_lock(lock, rt_read_trylock(lock))
+#define write_trylock(lock)	__cond_lock(lock, rt_write_trylock(lock))
+
+static inline int __write_trylock_rt_irqsave(rwlock_t *lock, unsigned long *flags)
+{
+	/* XXX ARCH_IRQ_ENABLED */
+	*flags = 0;
+	return rt_write_trylock(lock);
+}
+
+#define write_trylock_irqsave(lock, flags)		\
+	__cond_lock(lock, __write_trylock_rt_irqsave(lock, &(flags)))
+
+#define read_lock_irqsave(lock, flags)			\
+	do {						\
+		typecheck(unsigned long, flags);	\
+		rt_read_lock(lock);			\
+		flags = 0;				\
+	} while (0)
+
+#define write_lock_irqsave(lock, flags)			\
+	do {						\
+		typecheck(unsigned long, flags);	\
+		rt_write_lock(lock);			\
+		flags = 0;				\
+	} while (0)
+
+#define read_lock(lock)		rt_read_lock(lock)
+
+#define read_lock_bh(lock)				\
+	do {						\
+		local_bh_disable();			\
+		rt_read_lock(lock);			\
+	} while (0)
+
+#define read_lock_irq(lock)	read_lock(lock)
+
+#define write_lock(lock)	rt_write_lock(lock)
+
+#define write_lock_bh(lock)				\
+	do {						\
+		local_bh_disable();			\
+		rt_write_lock(lock);			\
+	} while (0)
+
+#define write_lock_irq(lock)	write_lock(lock)
+
+#define read_unlock(lock)	rt_read_unlock(lock)
+
+#define read_unlock_bh(lock)				\
+	do {						\
+		rt_read_unlock(lock);			\
+		local_bh_enable();			\
+	} while (0)
+
+#define read_unlock_irq(lock)	read_unlock(lock)
+
+#define write_unlock(lock)	rt_write_unlock(lock)
+
+#define write_unlock_bh(lock)				\
+	do {						\
+		rt_write_unlock(lock);			\
+		local_bh_enable();			\
+	} while (0)
+
+#define write_unlock_irq(lock)	write_unlock(lock)
+
+#define read_unlock_irqrestore(lock, flags)		\
+	do {						\
+		typecheck(unsigned long, flags);	\
+		(void) flags;				\
+		rt_read_unlock(lock);			\
+	} while (0)
+
+#define write_unlock_irqrestore(lock, flags) \
+	do {						\
+		typecheck(unsigned long, flags);	\
+		(void) flags;				\
+		rt_write_unlock(lock);			\
+	} while (0)
+
+#define rwlock_init(rwl)				\
+do {							\
+	static struct lock_class_key __key;		\
+							\
+	__rt_rwlock_init(rwl, #rwl, &__key);		\
+} while (0)
+
+/*
+ * Internal functions made global for CPU pinning
+ */
+void __read_rt_lock(struct rt_rw_lock *lock);
+int __read_rt_trylock(struct rt_rw_lock *lock);
+void __write_rt_lock(struct rt_rw_lock *lock);
+int __write_rt_trylock(struct rt_rw_lock *lock);
+void __read_rt_unlock(struct rt_rw_lock *lock);
+void __write_rt_unlock(struct rt_rw_lock *lock);
+
+#endif
diff --git a/kernel/include/linux/rwlock_types.h b/kernel/include/linux/rwlock_types.h
index 857a72c..c21683f 100644
--- a/kernel/include/linux/rwlock_types.h
+++ b/kernel/include/linux/rwlock_types.h
@@ -1,6 +1,10 @@
 #ifndef __LINUX_RWLOCK_TYPES_H
 #define __LINUX_RWLOCK_TYPES_H
 
+#if !defined(__LINUX_SPINLOCK_TYPES_H)
+# error "Do not include directly, include spinlock_types.h"
+#endif
+
 /*
  * include/linux/rwlock_types.h - generic rwlock type definitions
  *				  and initializers
diff --git a/kernel/include/linux/rwlock_types_rt.h b/kernel/include/linux/rwlock_types_rt.h
new file mode 100644
index 0000000..546a1f8
--- /dev/null
+++ b/kernel/include/linux/rwlock_types_rt.h
@@ -0,0 +1,55 @@
+#ifndef __LINUX_RWLOCK_TYPES_RT_H
+#define __LINUX_RWLOCK_TYPES_RT_H
+
+#ifndef __LINUX_SPINLOCK_TYPES_H
+#error "Do not include directly. Include spinlock_types.h instead"
+#endif
+
+#ifdef CONFIG_DEBUG_LOCK_ALLOC
+# define RW_DEP_MAP_INIT(lockname)	.dep_map = { .name = #lockname }
+#else
+# define RW_DEP_MAP_INIT(lockname)
+#endif
+
+typedef struct rt_rw_lock rwlock_t;
+
+#define __RW_LOCK_UNLOCKED(name) __RWLOCK_RT_INITIALIZER(name)
+
+#define DEFINE_RWLOCK(name) \
+	rwlock_t name = __RW_LOCK_UNLOCKED(name)
+
+/*
+ * A reader biased implementation primarily for CPU pinning.
+ *
+ * Can be selected as general replacement for the single reader RT rwlock
+ * variant
+ */
+struct rt_rw_lock {
+	struct rt_mutex		rtmutex;
+	atomic_t		readers;
+#ifdef CONFIG_DEBUG_LOCK_ALLOC
+	struct lockdep_map	dep_map;
+#endif
+};
+
+#define READER_BIAS	(1U << 31)
+#define WRITER_BIAS	(1U << 30)
+
+#define __RWLOCK_RT_INITIALIZER(name)					\
+{									\
+	.readers = ATOMIC_INIT(READER_BIAS),				\
+	.rtmutex = __RT_MUTEX_INITIALIZER_SAVE_STATE(name.rtmutex),	\
+	RW_DEP_MAP_INIT(name)						\
+}
+
+void __rwlock_biased_rt_init(struct rt_rw_lock *lock, const char *name,
+			     struct lock_class_key *key);
+
+#define rwlock_biased_rt_init(rwlock)					\
+	do {								\
+		static struct lock_class_key __key;			\
+									\
+		__rwlock_biased_rt_init((rwlock), #rwlock, &__key);	\
+	} while (0)
+
+#endif
diff --git a/kernel/include/linux/rwsem.h b/kernel/include/linux/rwsem.h
index 93c2235..3122c77 100644
--- a/kernel/include/linux/rwsem.h
+++ b/kernel/include/linux/rwsem.h
@@ -20,6 +20,10 @@
 #include <linux/osq_lock.h>
 #endif
 
+#ifdef CONFIG_PREEMPT_RT_FULL
+#include <linux/rwsem_rt.h>
+#else /* PREEMPT_RT_FULL */
+
 struct rw_semaphore;
 
 #ifdef CONFIG_RWSEM_GENERIC_SPINLOCK
@@ -119,6 +123,13 @@
 	return !list_empty(&sem->wait_list);
 }
 
+#endif /* !PREEMPT_RT_FULL */
+
+/*
+ * The functions below are the same for all rwsem implementations including
+ * the RT specific variant.
+ */
+
 /*
  * lock for reading
  */
diff --git a/kernel/include/linux/rwsem_rt.h b/kernel/include/linux/rwsem_rt.h
new file mode 100644
index 0000000..3fb092b
--- /dev/null
+++ b/kernel/include/linux/rwsem_rt.h
@@ -0,0 +1,69 @@
+#ifndef _LINUX_RWSEM_RT_H
+#define _LINUX_RWSEM_RT_H
+
+#ifndef _LINUX_RWSEM_H
+#error "Include rwsem.h"
+#endif
+
+#include <linux/rtmutex.h>
+#include <linux/swait.h>
+
+#define READER_BIAS		(1U << 31)
+#define WRITER_BIAS		(1U << 30)
+
+struct rw_semaphore {
+	atomic_t		readers;
+	struct rt_mutex		rtmutex;
+#ifdef CONFIG_DEBUG_LOCK_ALLOC
+	struct lockdep_map	dep_map;
+#endif
+};
+
+#define __RWSEM_INITIALIZER(name)				\
+{								\
+	.readers = ATOMIC_INIT(READER_BIAS),			\
+	.rtmutex = __RT_MUTEX_INITIALIZER(name.rtmutex),	\
+	RW_DEP_MAP_INIT(name)					\
+}
+
+#define DECLARE_RWSEM(lockname) \
+	struct rw_semaphore lockname = __RWSEM_INITIALIZER(lockname)
+
+extern void  __rwsem_init(struct rw_semaphore *rwsem, const char *name,
+			  struct lock_class_key *key);
+
+#define __init_rwsem(sem, name, key)			\
+do {							\
+		rt_mutex_init(&(sem)->rtmutex);		\
+		__rwsem_init((sem), (name), (key));	\
+} while (0)
+
+#define init_rwsem(sem)					\
+do {							\
+	static struct lock_class_key __key;		\
+							\
+	__init_rwsem((sem), #sem, &__key);		\
+} while (0)
+
+static inline int rwsem_is_locked(struct rw_semaphore *sem)
+{
+	return atomic_read(&sem->readers) != READER_BIAS;
+}
+
+static inline int rwsem_is_contended(struct rw_semaphore *sem)
+{
+	return atomic_read(&sem->readers) > 0;
+}
+
+extern void __down_read(struct rw_semaphore *sem);
+extern int __down_read_interruptible(struct rw_semaphore *sem);
+extern int __down_read_killable(struct rw_semaphore *sem);
+extern int __down_read_trylock(struct rw_semaphore *sem);
+extern void __down_write(struct rw_semaphore *sem);
+extern int __must_check __down_write_killable(struct rw_semaphore *sem);
+extern int __down_write_trylock(struct rw_semaphore *sem);
+extern void __up_read(struct rw_semaphore *sem);
+extern void __up_write(struct rw_semaphore *sem);
+extern void __downgrade_write(struct rw_semaphore *sem);
+
+#endif
diff --git a/kernel/include/linux/sched.h b/kernel/include/linux/sched.h
index 497cfcc..85ddd3b 100644
--- a/kernel/include/linux/sched.h
+++ b/kernel/include/linux/sched.h
@@ -30,6 +30,7 @@
 #include <linux/task_io_accounting.h>
 #include <linux/rseq.h>
 #include <linux/android_kabi.h>
+#include <asm/kmap_types.h>
 
 /* task_struct member predeclarations (sorted alphabetically): */
 struct audit_context;
@@ -103,11 +104,7 @@
 					 __TASK_TRACED | EXIT_DEAD | EXIT_ZOMBIE | \
 					 TASK_PARKED)
 
-#define task_is_traced(task)		((task->state & __TASK_TRACED) != 0)
-
 #define task_is_stopped(task)		((task->state & __TASK_STOPPED) != 0)
-
-#define task_is_stopped_or_traced(task)	((task->state & (__TASK_STOPPED | __TASK_TRACED)) != 0)
 
 #define task_contributes_to_load(task)	((task->state & TASK_UNINTERRUPTIBLE) != 0 && \
 					 (task->flags & PF_FROZEN) == 0 && \
@@ -136,6 +133,9 @@
 		smp_store_mb(current->state, (state_value));	\
 	} while (0)
 
+#define __set_current_state_no_track(state_value)		\
+	current->state = (state_value);
+
 #define set_special_state(state_value)					\
 	do {								\
 		unsigned long flags; /* may shadow */			\
@@ -145,6 +145,7 @@
 		current->state = (state_value);				\
 		raw_spin_unlock_irqrestore(&current->pi_lock, flags);	\
 	} while (0)
+
 #else
 /*
  * set_current_state() includes a barrier so that the write of current->state
@@ -189,6 +190,9 @@
 #define set_current_state(state_value)					\
 	smp_store_mb(current->state, (state_value))
 
+#define __set_current_state_no_track(state_value)	\
+	__set_current_state(state_value)
+
 /*
  * set_special_state() should be used for those states when the blocking task
  * can not use the regular condition based wait-loop. In that case we must
@@ -224,6 +228,8 @@
 extern void io_schedule_finish(int token);
 extern long io_schedule_timeout(long timeout);
 extern void io_schedule(void);
+
+int cpu_nr_pinned(int cpu);
 
 /**
  * struct prev_cputime - snapshot of system and user cputime
@@ -654,6 +660,8 @@
 #endif
 	/* -1 unrunnable, 0 runnable, >0 stopped: */
 	volatile long			state;
+	/* saved state for "spinlock sleepers" */
+	volatile long			saved_state;
 
 	/*
 	 * This begins the randomizable portion of task_struct. Only
@@ -728,8 +736,24 @@
 
 	unsigned int			policy;
 	int				nr_cpus_allowed;
-	cpumask_t			cpus_allowed;
+//	cpumask_t			cpus_allowed;
 	cpumask_t			cpus_requested;
+	const cpumask_t			*cpus_ptr;
+	cpumask_t			cpus_mask;
+#if defined(CONFIG_SMP) && defined(CONFIG_PREEMPT_RT_BASE)
+	int				migrate_disable;
+	bool				migrate_disable_scheduled;
+# ifdef CONFIG_SCHED_DEBUG
+	int				pinned_on_cpu;
+# endif
+#elif !defined(CONFIG_SMP) && defined(CONFIG_PREEMPT_RT_BASE)
+# ifdef CONFIG_SCHED_DEBUG
+	int				migrate_disable;
+# endif
+#endif
+#ifdef CONFIG_PREEMPT_RT_FULL
+	int				sleeping_lock;
+#endif
 
 #ifdef CONFIG_PREEMPT_RCU
 	int				rcu_read_lock_nesting;
@@ -901,6 +925,9 @@
 #ifdef CONFIG_POSIX_TIMERS
 	struct task_cputime		cputime_expires;
 	struct list_head		cpu_timers[3];
+#ifdef CONFIG_PREEMPT_RT_BASE
+	struct task_struct		*posix_timer_list;
+#endif
 #endif
 
 	/* Process credentials: */
@@ -945,11 +972,17 @@
 	/* Signal handlers: */
 	struct signal_struct		*signal;
 	struct sighand_struct		*sighand;
+	struct sigqueue			*sigqueue_cache;
+
 	sigset_t			blocked;
 	sigset_t			real_blocked;
 	/* Restored if set_restore_sigmask() was used: */
 	sigset_t			saved_sigmask;
 	struct sigpending		pending;
+#ifdef CONFIG_PREEMPT_RT_FULL
+	/* TODO: move me into ->restart_block ? */
+	struct				siginfo forced_info;
+#endif
 	unsigned long			sas_ss_sp;
 	size_t				sas_ss_size;
 	unsigned int			sas_ss_flags;
@@ -974,6 +1007,7 @@
 	raw_spinlock_t			pi_lock;
 
 	struct wake_q_node		wake_q;
+	struct wake_q_node		wake_q_sleeper;
 
 #ifdef CONFIG_RT_MUTEXES
 	/* PI waiters blocked on a rt_mutex held by this task: */
@@ -1271,8 +1305,22 @@
 	unsigned int			sequential_io;
 	unsigned int			sequential_io_avg;
 #endif
+#ifdef CONFIG_PREEMPT_RT_BASE
+	struct rcu_head			put_rcu;
+	int				softirq_nestcnt;
+	unsigned int			softirqs_raised;
+#endif
+#ifdef CONFIG_PREEMPT_RT_FULL
+# if defined CONFIG_HIGHMEM || defined CONFIG_X86_32
+	int				kmap_idx;
+	pte_t				kmap_pte[KM_TYPE_NR];
+# endif
+#endif
 #ifdef CONFIG_DEBUG_ATOMIC_SLEEP
 	unsigned long			task_state_change;
+#endif
+#ifdef CONFIG_PREEMPT_RT_FULL
+	int				xmit_recursion;
 #endif
 	int				pagefault_disabled;
 #ifdef CONFIG_MMU
@@ -1490,6 +1538,7 @@
 /*
  * Per process flags
  */
+#define PF_IN_SOFTIRQ		0x00000001      /* Task is serving softirq */
 #define PF_IDLE			0x00000002	/* I am an IDLE thread */
 #define PF_EXITING		0x00000004	/* Getting shut down */
 #define PF_VCPU			0x00000010	/* I'm a virtual CPU */
@@ -1717,6 +1766,7 @@
 
 extern int wake_up_state(struct task_struct *tsk, unsigned int state);
 extern int wake_up_process(struct task_struct *tsk);
+extern int wake_up_lock_sleeper(struct task_struct *tsk);
 extern void wake_up_new_task(struct task_struct *tsk);
 
 #ifdef CONFIG_SMP
@@ -1799,6 +1849,89 @@
 	return unlikely(test_tsk_thread_flag(tsk,TIF_NEED_RESCHED));
 }
 
+#ifdef CONFIG_PREEMPT_LAZY
+static inline void set_tsk_need_resched_lazy(struct task_struct *tsk)
+{
+	set_tsk_thread_flag(tsk,TIF_NEED_RESCHED_LAZY);
+}
+
+static inline void clear_tsk_need_resched_lazy(struct task_struct *tsk)
+{
+	clear_tsk_thread_flag(tsk,TIF_NEED_RESCHED_LAZY);
+}
+
+static inline int test_tsk_need_resched_lazy(struct task_struct *tsk)
+{
+	return unlikely(test_tsk_thread_flag(tsk,TIF_NEED_RESCHED_LAZY));
+}
+
+static inline int need_resched_lazy(void)
+{
+	return test_thread_flag(TIF_NEED_RESCHED_LAZY);
+}
+
+static inline int need_resched_now(void)
+{
+	return test_thread_flag(TIF_NEED_RESCHED);
+}
+
+#else
+static inline void clear_tsk_need_resched_lazy(struct task_struct *tsk) { }
+static inline int need_resched_lazy(void) { return 0; }
+
+static inline int need_resched_now(void)
+{
+	return test_thread_flag(TIF_NEED_RESCHED);
+}
+
+#endif
+
+
+static inline bool __task_is_stopped_or_traced(struct task_struct *task)
+{
+	if (task->state & (__TASK_STOPPED | __TASK_TRACED))
+		return true;
+#ifdef CONFIG_PREEMPT_RT_FULL
+	if (task->saved_state & (__TASK_STOPPED | __TASK_TRACED))
+		return true;
+#endif
+	return false;
+}
+
+static inline bool task_is_stopped_or_traced(struct task_struct *task)
+{
+	bool traced_stopped;
+
+#ifdef CONFIG_PREEMPT_RT_FULL
+	unsigned long flags;
+
+	raw_spin_lock_irqsave(&task->pi_lock, flags);
+	traced_stopped = __task_is_stopped_or_traced(task);
+	raw_spin_unlock_irqrestore(&task->pi_lock, flags);
+#else
+	traced_stopped = __task_is_stopped_or_traced(task);
+#endif
+	return traced_stopped;
+}
+
+static inline bool task_is_traced(struct task_struct *task)
+{
+	bool traced = false;
+
+	if (task->state & __TASK_TRACED)
+		return true;
+#ifdef CONFIG_PREEMPT_RT_FULL
+	/* in case the task is sleeping on tasklist_lock */
+	raw_spin_lock_irq(&task->pi_lock);
+	if (task->state & __TASK_TRACED)
+		traced = true;
+	else if (task->saved_state & __TASK_TRACED)
+		traced = true;
+	raw_spin_unlock_irq(&task->pi_lock);
+#endif
+	return traced;
+}
+
 /*
  * cond_resched() and cond_resched_lock(): latency reduction via
  * explicit rescheduling in places that are safe. The return
@@ -1850,6 +1983,23 @@
 {
 	return unlikely(tif_need_resched());
 }
+
+#ifdef CONFIG_PREEMPT_RT_FULL
+static inline void sleeping_lock_inc(void)
+{
+	current->sleeping_lock++;
+}
+
+static inline void sleeping_lock_dec(void)
+{
+	current->sleeping_lock--;
+}
+
+#else
+
+static inline void sleeping_lock_inc(void) { }
+static inline void sleeping_lock_dec(void) { }
+#endif
 
 /*
  * Wrappers for p->thread_info->cpu access. No-op on UP.
@@ -2022,4 +2172,6 @@
 
 #endif
 
+extern struct task_struct *takedown_cpu_task;
+
 #endif
diff --git a/kernel/include/linux/sched/mm.h b/kernel/include/linux/sched/mm.h
index ef54f4b..88e1a56 100644
--- a/kernel/include/linux/sched/mm.h
+++ b/kernel/include/linux/sched/mm.h
@@ -49,6 +49,17 @@
 		__mmdrop(mm);
 }
 
+#ifdef CONFIG_PREEMPT_RT_BASE
+extern void __mmdrop_delayed(struct rcu_head *rhp);
+static inline void mmdrop_delayed(struct mm_struct *mm)
+{
+	if (atomic_dec_and_test(&mm->mm_count))
+		call_rcu(&mm->delayed_drop, __mmdrop_delayed);
+}
+#else
+# define mmdrop_delayed(mm)	mmdrop(mm)
+#endif
+
 void mmdrop(struct mm_struct *mm);
 
 /*
diff --git a/kernel/include/linux/sched/task.h b/kernel/include/linux/sched/task.h
index 9140130..5f8c1d5 100644
--- a/kernel/include/linux/sched/task.h
+++ b/kernel/include/linux/sched/task.h
@@ -90,6 +90,15 @@
 
 #define get_task_struct(tsk) do { atomic_inc(&(tsk)->usage); } while(0)
 
+#ifdef CONFIG_PREEMPT_RT_BASE
+extern void __put_task_struct_cb(struct rcu_head *rhp);
+
+static inline void put_task_struct(struct task_struct *t)
+{
+	if (atomic_dec_and_test(&t->usage))
+		call_rcu(&t->put_rcu, __put_task_struct_cb);
+}
+#else
 extern void __put_task_struct(struct task_struct *t);
 
 static inline void put_task_struct(struct task_struct *t)
@@ -97,7 +106,7 @@
 	if (atomic_dec_and_test(&t->usage))
 		__put_task_struct(t);
 }
-
+#endif
 struct task_struct *task_rcu_dereference(struct task_struct **ptask);
 
 #ifdef CONFIG_ARCH_WANTS_DYNAMIC_TASK_STRUCT
diff --git a/kernel/include/linux/sched/wake_q.h b/kernel/include/linux/sched/wake_q.h
index a3661e9..1c4438f 100644
--- a/kernel/include/linux/sched/wake_q.h
+++ b/kernel/include/linux/sched/wake_q.h
@@ -49,8 +49,29 @@
 	head->count = 0;
 }
 
-extern void wake_q_add(struct wake_q_head *head,
-		       struct task_struct *task);
-extern void wake_up_q(struct wake_q_head *head);
+extern void __wake_q_add(struct wake_q_head *head,
+			 struct task_struct *task, bool sleeper);
+static inline void wake_q_add(struct wake_q_head *head,
+			      struct task_struct *task)
+{
+	__wake_q_add(head, task, false);
+}
+
+static inline void wake_q_add_sleeper(struct wake_q_head *head,
+				      struct task_struct *task)
+{
+	__wake_q_add(head, task, true);
+}
+
+extern void __wake_up_q(struct wake_q_head *head, bool sleeper);
+static inline void wake_up_q(struct wake_q_head *head)
+{
+	__wake_up_q(head, false);
+}
+
+static inline void wake_up_q_sleeper(struct wake_q_head *head)
+{
+	__wake_up_q(head, true);
+}
 
 #endif /* _LINUX_SCHED_WAKE_Q_H */
diff --git a/kernel/include/linux/seqlock.h b/kernel/include/linux/seqlock.h
index a42a299..31bc2cc 100644
--- a/kernel/include/linux/seqlock.h
+++ b/kernel/include/linux/seqlock.h
@@ -221,18 +221,28 @@
 	return __read_seqcount_retry(s, start);
 }
 
-
-
-static inline void raw_write_seqcount_begin(seqcount_t *s)
+static inline void __raw_write_seqcount_begin(seqcount_t *s)
 {
 	s->sequence++;
 	smp_wmb();
 }
 
-static inline void raw_write_seqcount_end(seqcount_t *s)
+static inline void raw_write_seqcount_begin(seqcount_t *s)
+{
+	preempt_disable_rt();
+	__raw_write_seqcount_begin(s);
+}
+
+static inline void __raw_write_seqcount_end(seqcount_t *s)
 {
 	smp_wmb();
 	s->sequence++;
+}
+
+static inline void raw_write_seqcount_end(seqcount_t *s)
+{
+	__raw_write_seqcount_end(s);
+	preempt_enable_rt();
 }
 
 /**
@@ -435,10 +445,33 @@
 /*
  * Read side functions for starting and finalizing a read side section.
  */
+#ifndef CONFIG_PREEMPT_RT_FULL
 static inline unsigned read_seqbegin(const seqlock_t *sl)
 {
 	return read_seqcount_begin(&sl->seqcount);
 }
+#else
+/*
+ * Starvation safe read side for RT
+ */
+static inline unsigned read_seqbegin(seqlock_t *sl)
+{
+	unsigned ret;
+
+repeat:
+	ret = READ_ONCE(sl->seqcount.sequence);
+	if (unlikely(ret & 1)) {
+		/*
+		 * Take the lock and let the writer proceed (i.e. evtl
+		 * boost it), otherwise we could loop here forever.
+		 */
+		spin_unlock_wait(&sl->lock);
+		goto repeat;
+	}
+	smp_rmb();
+	return ret;
+}
+#endif
 
 static inline unsigned read_seqretry(const seqlock_t *sl, unsigned start)
 {
@@ -453,36 +486,45 @@
 static inline void write_seqlock(seqlock_t *sl)
 {
 	spin_lock(&sl->lock);
-	write_seqcount_begin(&sl->seqcount);
+	__raw_write_seqcount_begin(&sl->seqcount);
+}
+
+static inline int try_write_seqlock(seqlock_t *sl)
+{
+	if (spin_trylock(&sl->lock)) {
+		__raw_write_seqcount_begin(&sl->seqcount);
+		return 1;
+	}
+	return 0;
 }
 
 static inline void write_sequnlock(seqlock_t *sl)
 {
-	write_seqcount_end(&sl->seqcount);
+	__raw_write_seqcount_end(&sl->seqcount);
 	spin_unlock(&sl->lock);
 }
 
 static inline void write_seqlock_bh(seqlock_t *sl)
 {
 	spin_lock_bh(&sl->lock);
-	write_seqcount_begin(&sl->seqcount);
+	__raw_write_seqcount_begin(&sl->seqcount);
 }
 
 static inline void write_sequnlock_bh(seqlock_t *sl)
 {
-	write_seqcount_end(&sl->seqcount);
+	__raw_write_seqcount_end(&sl->seqcount);
 	spin_unlock_bh(&sl->lock);
 }
 
 static inline void write_seqlock_irq(seqlock_t *sl)
 {
 	spin_lock_irq(&sl->lock);
-	write_seqcount_begin(&sl->seqcount);
+	__raw_write_seqcount_begin(&sl->seqcount);
 }
 
 static inline void write_sequnlock_irq(seqlock_t *sl)
 {
-	write_seqcount_end(&sl->seqcount);
+	__raw_write_seqcount_end(&sl->seqcount);
 	spin_unlock_irq(&sl->lock);
 }
 
@@ -491,7 +533,7 @@
 	unsigned long flags;
 
 	spin_lock_irqsave(&sl->lock, flags);
-	write_seqcount_begin(&sl->seqcount);
+	__raw_write_seqcount_begin(&sl->seqcount);
 	return flags;
 }
 
@@ -501,7 +543,7 @@
 static inline void
 write_sequnlock_irqrestore(seqlock_t *sl, unsigned long flags)
 {
-	write_seqcount_end(&sl->seqcount);
+	__raw_write_seqcount_end(&sl->seqcount);
 	spin_unlock_irqrestore(&sl->lock, flags);
 }
 
diff --git a/kernel/include/linux/signal.h b/kernel/include/linux/signal.h
index 0be5ce2..6495fda 100644
--- a/kernel/include/linux/signal.h
+++ b/kernel/include/linux/signal.h
@@ -245,6 +245,7 @@
 }
 
 extern void flush_sigqueue(struct sigpending *queue);
+extern void flush_task_sigqueue(struct task_struct *tsk);
 
 /* Test if 'sig' is valid signal. Use this instead of testing _NSIG directly */
 static inline int valid_signal(unsigned long sig)
diff --git a/kernel/include/linux/skbuff.h b/kernel/include/linux/skbuff.h
index 2bb6429..93de9f6 100644
--- a/kernel/include/linux/skbuff.h
+++ b/kernel/include/linux/skbuff.h
@@ -286,6 +286,7 @@
 
 	__u32		qlen;
 	spinlock_t	lock;
+	raw_spinlock_t	raw_lock;
 };
 
 struct sk_buff;
@@ -1735,6 +1736,12 @@
 	__skb_queue_head_init(list);
 }
 
+static inline void skb_queue_head_init_raw(struct sk_buff_head *list)
+{
+	raw_spin_lock_init(&list->raw_lock);
+	__skb_queue_head_init(list);
+}
+
 static inline void skb_queue_head_init_class(struct sk_buff_head *list,
 		struct lock_class_key *class)
 {
diff --git a/kernel/include/linux/smp.h b/kernel/include/linux/smp.h
index 6bb7f07..039da08 100644
--- a/kernel/include/linux/smp.h
+++ b/kernel/include/linux/smp.h
@@ -202,6 +202,9 @@
 #define get_cpu()		({ preempt_disable(); smp_processor_id(); })
 #define put_cpu()		preempt_enable()
 
+#define get_cpu_light()		({ migrate_disable(); smp_processor_id(); })
+#define put_cpu_light()		migrate_enable()
+
 /*
  * Callback to arch code if there's nosmp or maxcpus=0 on the
  * boot command line:
diff --git a/kernel/include/linux/soc/rockchip/rk_vendor_storage.h b/kernel/include/linux/soc/rockchip/rk_vendor_storage.h
index e3ee20f..5891840 100644
--- a/kernel/include/linux/soc/rockchip/rk_vendor_storage.h
+++ b/kernel/include/linux/soc/rockchip/rk_vendor_storage.h
@@ -29,6 +29,43 @@
 #define LAN_RGMII_DL_ID			16
 #define EINK_VCOM_ID			17
 
+#define VENDOR_HEAD_TAG			0x524B5644
+#define FLASH_VENDOR_PART_SIZE		8
+#define VENDOR_PART_SIZE		128
+
+struct vendor_item {
+	u16  id;
+	u16  offset;
+	u16  size;
+	u16  flag;
+};
+
+struct vendor_info {
+	u32	tag;
+	u32	version;
+	u16	next_index;
+	u16	item_num;
+	u16	free_offset;
+	u16	free_size;
+	struct	vendor_item item[126]; /* 126 * 8 */
+	u8	data[VENDOR_PART_SIZE * 512 - 1024 - 8];
+	u32	hash;
+	u32	version2;
+};
+
+struct flash_vendor_info {
+	u32	tag;
+	u32	version;
+	u16	next_index;
+	u16	item_num;
+	u16	free_offset;
+	u16	free_size;
+	struct	vendor_item item[62]; /* 62 * 8 */
+	u8	data[FLASH_VENDOR_PART_SIZE * 512 - 512 - 8];
+	u32	hash;
+	u32	version2;
+};
+
 int rk_vendor_read(u32 id, void *pbuf, u32 size);
 int rk_vendor_write(u32 id, void *pbuf, u32 size);
 int rk_vendor_register(void *read, void *write);
diff --git a/kernel/include/linux/spinlock.h b/kernel/include/linux/spinlock.h
index e089157..5f5ad06 100644
--- a/kernel/include/linux/spinlock.h
+++ b/kernel/include/linux/spinlock.h
@@ -298,7 +298,11 @@
 })
 
 /* Include rwlock functions */
-#include <linux/rwlock.h>
+#ifdef CONFIG_PREEMPT_RT_FULL
+# include <linux/rwlock_rt.h>
+#else
+# include <linux/rwlock.h>
+#endif
 
 /*
  * Pull the _spin_*()/_read_*()/_write_*() functions/declarations:
@@ -308,6 +312,10 @@
 #else
 # include <linux/spinlock_api_up.h>
 #endif
+
+#ifdef CONFIG_PREEMPT_RT_FULL
+# include <linux/spinlock_rt.h>
+#else /* PREEMPT_RT_FULL */
 
 /*
  * Map the spin_lock functions to the raw variants for PREEMPT_RT=n
@@ -429,6 +437,8 @@
 
 #define assert_spin_locked(lock)	assert_raw_spin_locked(&(lock)->rlock)
 
+#endif /* !PREEMPT_RT_FULL */
+
 /*
  * Pull the atomic_t declaration:
  * (asm-mips/atomic.h needs above definitions)
diff --git a/kernel/include/linux/spinlock_api_smp.h b/kernel/include/linux/spinlock_api_smp.h
index 42dfab8..29d99ae 100644
--- a/kernel/include/linux/spinlock_api_smp.h
+++ b/kernel/include/linux/spinlock_api_smp.h
@@ -187,6 +187,8 @@
 	return 0;
 }
 
-#include <linux/rwlock_api_smp.h>
+#ifndef CONFIG_PREEMPT_RT_FULL
+# include <linux/rwlock_api_smp.h>
+#endif
 
 #endif /* __LINUX_SPINLOCK_API_SMP_H */
diff --git a/kernel/include/linux/spinlock_rt.h b/kernel/include/linux/spinlock_rt.h
new file mode 100644
index 0000000..3696a77
--- /dev/null
+++ b/kernel/include/linux/spinlock_rt.h
@@ -0,0 +1,156 @@
+#ifndef __LINUX_SPINLOCK_RT_H
+#define __LINUX_SPINLOCK_RT_H
+
+#ifndef __LINUX_SPINLOCK_H
+#error Do not include directly. Use spinlock.h
+#endif
+
+#include <linux/bug.h>
+
+extern void
+__rt_spin_lock_init(spinlock_t *lock, const char *name, struct lock_class_key *key);
+
+#define spin_lock_init(slock)				\
+do {							\
+	static struct lock_class_key __key;		\
+							\
+	rt_mutex_init(&(slock)->lock);			\
+	__rt_spin_lock_init(slock, #slock, &__key);	\
+} while (0)
+
+extern void __lockfunc rt_spin_lock(spinlock_t *lock);
+extern unsigned long __lockfunc rt_spin_lock_trace_flags(spinlock_t *lock);
+extern void __lockfunc rt_spin_lock_nested(spinlock_t *lock, int subclass);
+extern void __lockfunc rt_spin_unlock(spinlock_t *lock);
+extern void __lockfunc rt_spin_unlock_wait(spinlock_t *lock);
+extern int __lockfunc rt_spin_trylock_irqsave(spinlock_t *lock, unsigned long *flags);
+extern int __lockfunc rt_spin_trylock_bh(spinlock_t *lock);
+extern int __lockfunc rt_spin_trylock(spinlock_t *lock);
+extern int atomic_dec_and_spin_lock(atomic_t *atomic, spinlock_t *lock);
+
+/*
+ * lockdep-less calls, for derived types like rwlock:
+ * (for trylock they can use rt_mutex_trylock() directly.
+ * Migrate disable handling must be done at the call site.
+ */
+extern void __lockfunc __rt_spin_lock(struct rt_mutex *lock);
+extern void __lockfunc __rt_spin_trylock(struct rt_mutex *lock);
+extern void __lockfunc __rt_spin_unlock(struct rt_mutex *lock);
+
+#define spin_lock(lock)			rt_spin_lock(lock)
+
+#define spin_lock_bh(lock)			\
+	do {					\
+		local_bh_disable();		\
+		rt_spin_lock(lock);		\
+	} while (0)
+
+#define spin_lock_irq(lock)		spin_lock(lock)
+
+#define spin_do_trylock(lock)		__cond_lock(lock, rt_spin_trylock(lock))
+
+#define spin_trylock(lock)			\
+({						\
+	int __locked;				\
+	__locked = spin_do_trylock(lock);	\
+	__locked;				\
+})
+
+#ifdef CONFIG_LOCKDEP
+# define spin_lock_nested(lock, subclass)		\
+	do {						\
+		rt_spin_lock_nested(lock, subclass);	\
+	} while (0)
+
+#define spin_lock_bh_nested(lock, subclass)		\
+	do {						\
+		local_bh_disable();			\
+		rt_spin_lock_nested(lock, subclass);	\
+	} while (0)
+
+# define spin_lock_irqsave_nested(lock, flags, subclass) \
+	do {						 \
+		typecheck(unsigned long, flags);	 \
+		flags = 0;				 \
+		rt_spin_lock_nested(lock, subclass);	 \
+	} while (0)
+#else
+# define spin_lock_nested(lock, subclass)	spin_lock(lock)
+# define spin_lock_bh_nested(lock, subclass)	spin_lock_bh(lock)
+
+# define spin_lock_irqsave_nested(lock, flags, subclass) \
+	do {						 \
+		typecheck(unsigned long, flags);	 \
+		flags = 0;				 \
+		spin_lock(lock);			 \
+	} while (0)
+#endif
+
+#define spin_lock_irqsave(lock, flags)			 \
+	do {						 \
+		typecheck(unsigned long, flags);	 \
+		flags = 0;				 \
+		spin_lock(lock);			 \
+	} while (0)
+
+static inline unsigned long spin_lock_trace_flags(spinlock_t *lock)
+{
+	unsigned long flags = 0;
+#ifdef CONFIG_TRACE_IRQFLAGS
+	flags = rt_spin_lock_trace_flags(lock);
+#else
+	spin_lock(lock); /* lock_local */
+#endif
+	return flags;
+}
+
+/* FIXME: we need rt_spin_lock_nest_lock */
+#define spin_lock_nest_lock(lock, nest_lock) spin_lock_nested(lock, 0)
+
+#define spin_unlock(lock)			rt_spin_unlock(lock)
+
+#define spin_unlock_bh(lock)				\
+	do {						\
+		rt_spin_unlock(lock);			\
+		local_bh_enable();			\
+	} while (0)
+
+#define spin_unlock_irq(lock)		spin_unlock(lock)
+
+#define spin_unlock_irqrestore(lock, flags)		\
+	do {						\
+		typecheck(unsigned long, flags);	\
+		(void) flags;				\
+		spin_unlock(lock);			\
+	} while (0)
+
+#define spin_trylock_bh(lock)	__cond_lock(lock, rt_spin_trylock_bh(lock))
+#define spin_trylock_irq(lock)	spin_trylock(lock)
+
+#define spin_trylock_irqsave(lock, flags)	\
+	rt_spin_trylock_irqsave(lock, &(flags))
+
+#define spin_unlock_wait(lock)		rt_spin_unlock_wait(lock)
+
+#ifdef CONFIG_GENERIC_LOCKBREAK
+# define spin_is_contended(lock)	((lock)->break_lock)
+#else
+# define spin_is_contended(lock)	(((void)(lock), 0))
+#endif
+
+static inline int spin_can_lock(spinlock_t *lock)
+{
+	return !rt_mutex_is_locked(&lock->lock);
+}
+
+static inline int spin_is_locked(spinlock_t *lock)
+{
+	return rt_mutex_is_locked(&lock->lock);
+}
+
+static inline void assert_spin_locked(spinlock_t *lock)
+{
+	BUG_ON(!spin_is_locked(lock));
+}
+
+#endif
diff --git a/kernel/include/linux/spinlock_types.h b/kernel/include/linux/spinlock_types.h
index 24b4e6f..10bac71 100644
--- a/kernel/include/linux/spinlock_types.h
+++ b/kernel/include/linux/spinlock_types.h
@@ -9,77 +9,15 @@
  * Released under the General Public License (GPL).
  */
 
-#if defined(CONFIG_SMP)
-# include <asm/spinlock_types.h>
+#include <linux/spinlock_types_raw.h>
+
+#ifndef CONFIG_PREEMPT_RT_FULL
+# include <linux/spinlock_types_nort.h>
+# include <linux/rwlock_types.h>
 #else
-# include <linux/spinlock_types_up.h>
+# include <linux/rtmutex.h>
+# include <linux/spinlock_types_rt.h>
+# include <linux/rwlock_types_rt.h>
 #endif
-
-#include <linux/lockdep.h>
-
-typedef struct raw_spinlock {
-	arch_spinlock_t raw_lock;
-#ifdef CONFIG_DEBUG_SPINLOCK
-	unsigned int magic, owner_cpu;
-	void *owner;
-#endif
-#ifdef CONFIG_DEBUG_LOCK_ALLOC
-	struct lockdep_map dep_map;
-#endif
-} raw_spinlock_t;
-
-#define SPINLOCK_MAGIC		0xdead4ead
-
-#define SPINLOCK_OWNER_INIT	((void *)-1L)
-
-#ifdef CONFIG_DEBUG_LOCK_ALLOC
-# define SPIN_DEP_MAP_INIT(lockname)	.dep_map = { .name = #lockname }
-#else
-# define SPIN_DEP_MAP_INIT(lockname)
-#endif
-
-#ifdef CONFIG_DEBUG_SPINLOCK
-# define SPIN_DEBUG_INIT(lockname)		\
-	.magic = SPINLOCK_MAGIC,		\
-	.owner_cpu = -1,			\
-	.owner = SPINLOCK_OWNER_INIT,
-#else
-# define SPIN_DEBUG_INIT(lockname)
-#endif
-
-#define __RAW_SPIN_LOCK_INITIALIZER(lockname)	\
-	{					\
-	.raw_lock = __ARCH_SPIN_LOCK_UNLOCKED,	\
-	SPIN_DEBUG_INIT(lockname)		\
-	SPIN_DEP_MAP_INIT(lockname) }
-
-#define __RAW_SPIN_LOCK_UNLOCKED(lockname)	\
-	(raw_spinlock_t) __RAW_SPIN_LOCK_INITIALIZER(lockname)
-
-#define DEFINE_RAW_SPINLOCK(x)	raw_spinlock_t x = __RAW_SPIN_LOCK_UNLOCKED(x)
-
-typedef struct spinlock {
-	union {
-		struct raw_spinlock rlock;
-
-#ifdef CONFIG_DEBUG_LOCK_ALLOC
-# define LOCK_PADSIZE (offsetof(struct raw_spinlock, dep_map))
-		struct {
-			u8 __padding[LOCK_PADSIZE];
-			struct lockdep_map dep_map;
-		};
-#endif
-	};
-} spinlock_t;
-
-#define __SPIN_LOCK_INITIALIZER(lockname) \
-	{ { .rlock = __RAW_SPIN_LOCK_INITIALIZER(lockname) } }
-
-#define __SPIN_LOCK_UNLOCKED(lockname) \
-	(spinlock_t ) __SPIN_LOCK_INITIALIZER(lockname)
-
-#define DEFINE_SPINLOCK(x)	spinlock_t x = __SPIN_LOCK_UNLOCKED(x)
-
-#include <linux/rwlock_types.h>
 
 #endif /* __LINUX_SPINLOCK_TYPES_H */
diff --git a/kernel/include/linux/spinlock_types_nort.h b/kernel/include/linux/spinlock_types_nort.h
new file mode 100644
index 0000000..f1dac1f
--- /dev/null
+++ b/kernel/include/linux/spinlock_types_nort.h
@@ -0,0 +1,33 @@
+#ifndef __LINUX_SPINLOCK_TYPES_NORT_H
+#define __LINUX_SPINLOCK_TYPES_NORT_H
+
+#ifndef __LINUX_SPINLOCK_TYPES_H
+#error "Do not include directly. Include spinlock_types.h instead"
+#endif
+
+/*
+ * The non RT version maps spinlocks to raw_spinlocks
+ */
+typedef struct spinlock {
+	union {
+		struct raw_spinlock rlock;
+
+#ifdef CONFIG_DEBUG_LOCK_ALLOC
+# define LOCK_PADSIZE (offsetof(struct raw_spinlock, dep_map))
+		struct {
+			u8 __padding[LOCK_PADSIZE];
+			struct lockdep_map dep_map;
+		};
+#endif
+	};
+} spinlock_t;
+
+#define __SPIN_LOCK_INITIALIZER(lockname) \
+	{ { .rlock = __RAW_SPIN_LOCK_INITIALIZER(lockname) } }
+
+#define __SPIN_LOCK_UNLOCKED(lockname) \
+	(spinlock_t ) __SPIN_LOCK_INITIALIZER(lockname)
+
+#define DEFINE_SPINLOCK(x)	spinlock_t x = __SPIN_LOCK_UNLOCKED(x)
+
+#endif
diff --git a/kernel/include/linux/spinlock_types_raw.h b/kernel/include/linux/spinlock_types_raw.h
new file mode 100644
index 0000000..822bf64
--- /dev/null
+++ b/kernel/include/linux/spinlock_types_raw.h
@@ -0,0 +1,55 @@
+#ifndef __LINUX_SPINLOCK_TYPES_RAW_H
+#define __LINUX_SPINLOCK_TYPES_RAW_H
+
+#include <linux/types.h>
+
+#if defined(CONFIG_SMP)
+# include <asm/spinlock_types.h>
+#else
+# include <linux/spinlock_types_up.h>
+#endif
+
+#include <linux/lockdep.h>
+
+typedef struct raw_spinlock {
+	arch_spinlock_t raw_lock;
+#ifdef CONFIG_DEBUG_SPINLOCK
+	unsigned int magic, owner_cpu;
+	void *owner;
+#endif
+#ifdef CONFIG_DEBUG_LOCK_ALLOC
+	struct lockdep_map dep_map;
+#endif
+} raw_spinlock_t;
+
+#define SPINLOCK_MAGIC		0xdead4ead
+
+#define SPINLOCK_OWNER_INIT	((void *)-1L)
+
+#ifdef CONFIG_DEBUG_LOCK_ALLOC
+# define SPIN_DEP_MAP_INIT(lockname)	.dep_map = { .name = #lockname }
+#else
+# define SPIN_DEP_MAP_INIT(lockname)
+#endif
+
+#ifdef CONFIG_DEBUG_SPINLOCK
+# define SPIN_DEBUG_INIT(lockname)		\
+	.magic = SPINLOCK_MAGIC,		\
+	.owner_cpu = -1,			\
+	.owner = SPINLOCK_OWNER_INIT,
+#else
+# define SPIN_DEBUG_INIT(lockname)
+#endif
+
+#define __RAW_SPIN_LOCK_INITIALIZER(lockname)	\
+	{					\
+	.raw_lock = __ARCH_SPIN_LOCK_UNLOCKED,	\
+	SPIN_DEBUG_INIT(lockname)		\
+	SPIN_DEP_MAP_INIT(lockname) }
+
+#define __RAW_SPIN_LOCK_UNLOCKED(lockname)	\
+	(raw_spinlock_t) __RAW_SPIN_LOCK_INITIALIZER(lockname)
+
+#define DEFINE_RAW_SPINLOCK(x)	raw_spinlock_t x = __RAW_SPIN_LOCK_UNLOCKED(x)
+
+#endif
diff --git a/kernel/include/linux/spinlock_types_rt.h b/kernel/include/linux/spinlock_types_rt.h
new file mode 100644
index 0000000..3e3d8c5
--- /dev/null
+++ b/kernel/include/linux/spinlock_types_rt.h
@@ -0,0 +1,48 @@
+#ifndef __LINUX_SPINLOCK_TYPES_RT_H
+#define __LINUX_SPINLOCK_TYPES_RT_H
+
+#ifndef __LINUX_SPINLOCK_TYPES_H
+#error "Do not include directly. Include spinlock_types.h instead"
+#endif
+
+#include <linux/cache.h>
+
+/*
+ * PREEMPT_RT: spinlocks - an RT mutex plus lock-break field:
+ */
+typedef struct spinlock {
+	struct rt_mutex		lock;
+	unsigned int		break_lock;
+#ifdef CONFIG_DEBUG_LOCK_ALLOC
+	struct lockdep_map	dep_map;
+#endif
+} spinlock_t;
+
+#ifdef CONFIG_DEBUG_RT_MUTEXES
+# define __RT_SPIN_INITIALIZER(name) \
+	{ \
+	.wait_lock = __RAW_SPIN_LOCK_UNLOCKED(name.wait_lock), \
+	.save_state = 1, \
+	.file = __FILE__, \
+	.line = __LINE__ , \
+	}
+#else
+# define __RT_SPIN_INITIALIZER(name) \
+	{								\
+	.wait_lock = __RAW_SPIN_LOCK_UNLOCKED(name.wait_lock),		\
+	.save_state = 1, \
+	}
+#endif
+
+/*
+.wait_list = PLIST_HEAD_INIT_RAW((name).lock.wait_list, (name).lock.wait_lock)
+*/
+
+#define __SPIN_LOCK_UNLOCKED(name)			\
+	{ .lock = __RT_SPIN_INITIALIZER(name.lock),		\
+	  SPIN_DEP_MAP_INIT(name) }
+
+#define DEFINE_SPINLOCK(name) \
+	spinlock_t name = __SPIN_LOCK_UNLOCKED(name)
+
+#endif
diff --git a/kernel/include/linux/spinlock_types_up.h b/kernel/include/linux/spinlock_types_up.h
index c09b6407..b0243ba 100644
--- a/kernel/include/linux/spinlock_types_up.h
+++ b/kernel/include/linux/spinlock_types_up.h
@@ -1,10 +1,6 @@
 #ifndef __LINUX_SPINLOCK_TYPES_UP_H
 #define __LINUX_SPINLOCK_TYPES_UP_H
 
-#ifndef __LINUX_SPINLOCK_TYPES_H
-# error "please don't include this file directly"
-#endif
-
 /*
  * include/linux/spinlock_types_up.h - spinlock type definitions for UP
  *
diff --git a/kernel/include/linux/stop_machine.h b/kernel/include/linux/stop_machine.h
index ccdaa8f..150e886 100644
--- a/kernel/include/linux/stop_machine.h
+++ b/kernel/include/linux/stop_machine.h
@@ -26,6 +26,8 @@
 	cpu_stop_fn_t		fn;
 	void			*arg;
 	struct cpu_stop_done	*done;
+	/* Did not run due to disabled stopper; for nowait debug checks */
+	bool			disabled;
 };
 
 int stop_one_cpu(unsigned int cpu, cpu_stop_fn_t fn, void *arg);
diff --git a/kernel/include/linux/suspend.h b/kernel/include/linux/suspend.h
index 5ee7e53..ec488a3 100644
--- a/kernel/include/linux/suspend.h
+++ b/kernel/include/linux/suspend.h
@@ -198,6 +198,12 @@
 	void (*end)(void);
 };
 
+#if defined(CONFIG_SUSPEND) || defined(CONFIG_HIBERNATION)
+extern bool pm_in_action;
+#else
+# define pm_in_action false
+#endif
+
 #ifdef CONFIG_SUSPEND
 extern suspend_state_t mem_sleep_current;
 extern suspend_state_t mem_sleep_default;
diff --git a/kernel/include/linux/swait.h b/kernel/include/linux/swait.h
index 73e06e9..21ae66c 100644
--- a/kernel/include/linux/swait.h
+++ b/kernel/include/linux/swait.h
@@ -160,7 +160,9 @@
 extern void swake_up_one(struct swait_queue_head *q);
 extern void swake_up_all(struct swait_queue_head *q);
 extern void swake_up_locked(struct swait_queue_head *q);
+extern void swake_up_all_locked(struct swait_queue_head *q);
 
+extern void __prepare_to_swait(struct swait_queue_head *q, struct swait_queue *wait);
 extern void prepare_to_swait_exclusive(struct swait_queue_head *q, struct swait_queue *wait, int state);
 extern long prepare_to_swait_event(struct swait_queue_head *q, struct swait_queue *wait, int state);
 
@@ -297,4 +299,18 @@
 	__ret;								\
 })
 
+#define __swait_event_lock_irq(wq, condition, lock, cmd)		\
+	___swait_event(wq, condition, TASK_UNINTERRUPTIBLE, 0,		\
+		       raw_spin_unlock_irq(&lock);			\
+		       cmd;						\
+		       schedule();					\
+		       raw_spin_lock_irq(&lock))
+
+#define swait_event_lock_irq(wq_head, condition, lock)			\
+	do {								\
+		if (condition)						\
+			break;						\
+		__swait_event_lock_irq(wq_head, condition, lock, );	\
+	} while (0)
+
 #endif /* _LINUX_SWAIT_H */
diff --git a/kernel/include/linux/swap.h b/kernel/include/linux/swap.h
index 8bd2b0f..8fba0d4 100644
--- a/kernel/include/linux/swap.h
+++ b/kernel/include/linux/swap.h
@@ -12,6 +12,7 @@
 #include <linux/fs.h>
 #include <linux/atomic.h>
 #include <linux/page-flags.h>
+#include <linux/locallock.h>
 #include <asm/page.h>
 
 struct notifier_block;
@@ -335,6 +336,7 @@
 
 
 /* linux/mm/swap.c */
+DECLARE_LOCAL_IRQ_LOCK(swapvec_lock);
 extern void lru_cache_add(struct page *);
 extern void lru_cache_add_anon(struct page *page);
 extern void lru_cache_add_file(struct page *page);
diff --git a/kernel/include/linux/swork.h b/kernel/include/linux/swork.h
new file mode 100644
index 0000000..f175fa9
--- /dev/null
+++ b/kernel/include/linux/swork.h
@@ -0,0 +1,24 @@
+#ifndef _LINUX_SWORK_H
+#define _LINUX_SWORK_H
+
+#include <linux/list.h>
+
+struct swork_event {
+	struct list_head item;
+	unsigned long flags;
+	void (*func)(struct swork_event *);
+};
+
+static inline void INIT_SWORK(struct swork_event *event,
+			      void (*func)(struct swork_event *))
+{
+	event->flags = 0;
+	event->func = func;
+}
+
+bool swork_queue(struct swork_event *sev);
+
+int swork_get(void);
+void swork_put(void);
+
+#endif /* _LINUX_SWORK_H */
diff --git a/kernel/include/linux/thread_info.h b/kernel/include/linux/thread_info.h
index 62dbecf..57a3d99 100644
--- a/kernel/include/linux/thread_info.h
+++ b/kernel/include/linux/thread_info.h
@@ -110,7 +110,17 @@
 #define test_thread_flag(flag) \
 	test_ti_thread_flag(current_thread_info(), flag)
 
-#define tif_need_resched() test_thread_flag(TIF_NEED_RESCHED)
+#ifdef CONFIG_PREEMPT_LAZY
+#define tif_need_resched()	(test_thread_flag(TIF_NEED_RESCHED) || \
+				 test_thread_flag(TIF_NEED_RESCHED_LAZY))
+#define tif_need_resched_now()	(test_thread_flag(TIF_NEED_RESCHED))
+#define tif_need_resched_lazy()	test_thread_flag(TIF_NEED_RESCHED_LAZY))
+
+#else
+#define tif_need_resched()	test_thread_flag(TIF_NEED_RESCHED)
+#define tif_need_resched_now()	test_thread_flag(TIF_NEED_RESCHED)
+#define tif_need_resched_lazy()	0
+#endif
 
 #ifndef CONFIG_HAVE_ARCH_WITHIN_STACK_FRAMES
 static inline int arch_within_stack_frames(const void * const stack,
diff --git a/kernel/include/linux/timer.h b/kernel/include/linux/timer.h
index 611dd95..afe84c2 100644
--- a/kernel/include/linux/timer.h
+++ b/kernel/include/linux/timer.h
@@ -176,7 +176,7 @@
 
 extern int try_to_del_timer_sync(struct timer_list *timer);
 
-#ifdef CONFIG_SMP
+#if defined(CONFIG_SMP) || defined(CONFIG_PREEMPT_RT_FULL)
   extern int del_timer_sync(struct timer_list *timer);
 #else
 # define del_timer_sync(t)		del_timer(t)
diff --git a/kernel/include/linux/trace_events.h b/kernel/include/linux/trace_events.h
index 0643c08..e26a85c 100644
--- a/kernel/include/linux/trace_events.h
+++ b/kernel/include/linux/trace_events.h
@@ -62,6 +62,8 @@
 	unsigned char		flags;
 	unsigned char		preempt_count;
 	int			pid;
+	unsigned char		migrate_disable;
+	unsigned char		preempt_lazy_count;
 };
 
 #define TRACE_EVENT_TYPE_MAX						\
diff --git a/kernel/include/linux/uaccess.h b/kernel/include/linux/uaccess.h
index 1a5b23a..0704e99 100644
--- a/kernel/include/linux/uaccess.h
+++ b/kernel/include/linux/uaccess.h
@@ -185,6 +185,7 @@
  */
 static inline void pagefault_disable(void)
 {
+	migrate_disable();
 	pagefault_disabled_inc();
 	/*
 	 * make sure to have issued the store before a pagefault
@@ -201,6 +202,7 @@
 	 */
 	barrier();
 	pagefault_disabled_dec();
+	migrate_enable();
 }
 
 /*
diff --git a/kernel/include/linux/usb/hcd.h b/kernel/include/linux/usb/hcd.h
index e34faee..84b46e1 100644
--- a/kernel/include/linux/usb/hcd.h
+++ b/kernel/include/linux/usb/hcd.h
@@ -119,6 +119,7 @@
 #define HCD_FLAG_DEAD			6	/* controller has died? */
 #define HCD_FLAG_INTF_AUTHORIZED	7	/* authorize interfaces? */
 #define HCD_FLAG_DEV_AUTHORIZED		8	/* authorize devices? */
+#define HCD_FLAG_POWER_ON		9	/* power on */
 
 	/* The flags can be tested using these macros; they are likely to
 	 * be slightly faster than test_bit().
@@ -146,6 +147,8 @@
 #define HCD_DEV_AUTHORIZED(hcd) \
 	((hcd)->flags & (1U << HCD_FLAG_DEV_AUTHORIZED))
 
+#define HCD_POWER_ON(hcd)	((hcd)->flags & (1U << HCD_FLAG_POWER_ON))
+
 	/* Flags that get set only during HCD registration or removal. */
 	unsigned		rh_registered:1;/* is root hub registered? */
 	unsigned		rh_pollable:1;	/* may we poll the root hub? */
diff --git a/kernel/include/linux/vmstat.h b/kernel/include/linux/vmstat.h
index f25cef8..febee86 100644
--- a/kernel/include/linux/vmstat.h
+++ b/kernel/include/linux/vmstat.h
@@ -54,7 +54,9 @@
  */
 static inline void __count_vm_event(enum vm_event_item item)
 {
+	preempt_disable_rt();
 	raw_cpu_inc(vm_event_states.event[item]);
+	preempt_enable_rt();
 }
 
 static inline void count_vm_event(enum vm_event_item item)
@@ -64,7 +66,9 @@
 
 static inline void __count_vm_events(enum vm_event_item item, long delta)
 {
+	preempt_disable_rt();
 	raw_cpu_add(vm_event_states.event[item], delta);
+	preempt_enable_rt();
 }
 
 static inline void count_vm_events(enum vm_event_item item, long delta)
diff --git a/kernel/include/linux/wait.h b/kernel/include/linux/wait.h
index ec2e8e8..a6690bc 100644
--- a/kernel/include/linux/wait.h
+++ b/kernel/include/linux/wait.h
@@ -11,6 +11,7 @@
 
 #include <asm/current.h>
 #include <uapi/linux/wait.h>
+#include <linux/atomic.h>
 
 typedef struct wait_queue_entry wait_queue_entry_t;
 
@@ -515,8 +516,8 @@
 	int __ret = 0;								\
 	struct hrtimer_sleeper __t;						\
 										\
-	hrtimer_init_on_stack(&__t.timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);	\
-	hrtimer_init_sleeper(&__t, current);					\
+	hrtimer_init_sleeper_on_stack(&__t, CLOCK_MONOTONIC, HRTIMER_MODE_REL,	\
+				      current);					\
 	if ((timeout) != KTIME_MAX)						\
 		hrtimer_start_range_ns(&__t.timer, timeout,			\
 				       current->timer_slack_ns,			\
diff --git a/kernel/include/linux/workqueue.h b/kernel/include/linux/workqueue.h
index 342f374..6e17fe4 100644
--- a/kernel/include/linux/workqueue.h
+++ b/kernel/include/linux/workqueue.h
@@ -461,10 +461,6 @@
 
 extern void destroy_workqueue(struct workqueue_struct *wq);
 
-struct workqueue_attrs *alloc_workqueue_attrs(gfp_t gfp_mask);
-void free_workqueue_attrs(struct workqueue_attrs *attrs);
-int apply_workqueue_attrs(struct workqueue_struct *wq,
-			  const struct workqueue_attrs *attrs);
 int workqueue_set_unbound_cpumask(cpumask_var_t cpumask);
 
 extern bool queue_work_on(int cpu, struct workqueue_struct *wq,
diff --git a/kernel/include/net/cfg80211.h b/kernel/include/net/cfg80211.h
index dec1f43..5de4f9a 100644
--- a/kernel/include/net/cfg80211.h
+++ b/kernel/include/net/cfg80211.h
@@ -5782,8 +5782,11 @@
  *	case.
  * @bssid: The BSSID of the AP (may be %NULL)
  * @bss: Entry of bss to which STA got connected to, can be obtained through
- *	cfg80211_get_bss() (may be %NULL). Only one parameter among @bssid and
- *	@bss needs to be specified.
+ *	cfg80211_get_bss() (may be %NULL). But it is recommended to store the
+ *	bss from the connect_request and hold a reference to it and return
+ *	through this param to avoid a warning if the bss is expired during the
+ *	connection, esp. for those drivers implementing connect op.
+ *	Only one parameter among @bssid and @bss needs to be specified.
  * @req_ie: Association request IEs (may be %NULL)
  * @req_ie_len: Association request IEs length
  * @resp_ie: Association response IEs (may be %NULL)
@@ -5831,8 +5834,12 @@
  *
  * @dev: network device
  * @bssid: the BSSID of the AP
- * @bss: entry of bss to which STA got connected to, can be obtained
- *	through cfg80211_get_bss (may be %NULL)
+ * @bss: Entry of bss to which STA got connected to, can be obtained through
+ *	cfg80211_get_bss() (may be %NULL). But it is recommended to store the
+ *	bss from the connect_request and hold a reference to it and return
+ *	through this param to avoid a warning if the bss is expired during the
+ *	connection, esp. for those drivers implementing connect op.
+ *	Only one parameter among @bssid and @bss needs to be specified.
  * @req_ie: association request IEs (maybe be %NULL)
  * @req_ie_len: association request IEs length
  * @resp_ie: association response IEs (may be %NULL)
diff --git a/kernel/include/net/gen_stats.h b/kernel/include/net/gen_stats.h
index 883bb90..3b593cd 100644
--- a/kernel/include/net/gen_stats.h
+++ b/kernel/include/net/gen_stats.h
@@ -6,6 +6,7 @@
 #include <linux/socket.h>
 #include <linux/rtnetlink.h>
 #include <linux/pkt_sched.h>
+#include <net/net_seq_lock.h>
 
 struct gnet_stats_basic_cpu {
 	struct gnet_stats_basic_packed bstats;
@@ -36,11 +37,11 @@
 				 spinlock_t *lock, struct gnet_dump *d,
 				 int padattr);
 
-int gnet_stats_copy_basic(const seqcount_t *running,
+int gnet_stats_copy_basic(net_seqlock_t *running,
 			  struct gnet_dump *d,
 			  struct gnet_stats_basic_cpu __percpu *cpu,
 			  struct gnet_stats_basic_packed *b);
-void __gnet_stats_copy_basic(const seqcount_t *running,
+void __gnet_stats_copy_basic(net_seqlock_t *running,
 			     struct gnet_stats_basic_packed *bstats,
 			     struct gnet_stats_basic_cpu __percpu *cpu,
 			     struct gnet_stats_basic_packed *b);
@@ -60,13 +61,13 @@
 		      struct gnet_stats_basic_cpu __percpu *cpu_bstats,
 		      struct net_rate_estimator __rcu **rate_est,
 		      spinlock_t *lock,
-		      seqcount_t *running, struct nlattr *opt);
+		      net_seqlock_t *running, struct nlattr *opt);
 void gen_kill_estimator(struct net_rate_estimator __rcu **ptr);
 int gen_replace_estimator(struct gnet_stats_basic_packed *bstats,
 			  struct gnet_stats_basic_cpu __percpu *cpu_bstats,
 			  struct net_rate_estimator __rcu **ptr,
 			  spinlock_t *lock,
-			  seqcount_t *running, struct nlattr *opt);
+			  net_seqlock_t *running, struct nlattr *opt);
 bool gen_estimator_active(struct net_rate_estimator __rcu **ptr);
 bool gen_estimator_read(struct net_rate_estimator __rcu **ptr,
 			struct gnet_stats_rate_est64 *sample);
diff --git a/kernel/include/net/neighbour.h b/kernel/include/net/neighbour.h
index 5ce0359..1166fc1 100644
--- a/kernel/include/net/neighbour.h
+++ b/kernel/include/net/neighbour.h
@@ -451,7 +451,7 @@
 }
 #endif
 
-static inline int neigh_hh_output(const struct hh_cache *hh, struct sk_buff *skb)
+static inline int neigh_hh_output(struct hh_cache *hh, struct sk_buff *skb)
 {
 	unsigned int hh_alen = 0;
 	unsigned int seq;
@@ -493,7 +493,7 @@
 
 static inline int neigh_output(struct neighbour *n, struct sk_buff *skb)
 {
-	const struct hh_cache *hh = &n->hh;
+	struct hh_cache *hh = &n->hh;
 
 	if ((n->nud_state & NUD_CONNECTED) && hh->hh_len)
 		return neigh_hh_output(hh, skb);
@@ -534,7 +534,7 @@
 
 #define NEIGH_CB(skb)	((struct neighbour_cb *)(skb)->cb)
 
-static inline void neigh_ha_snapshot(char *dst, const struct neighbour *n,
+static inline void neigh_ha_snapshot(char *dst, struct neighbour *n,
 				     const struct net_device *dev)
 {
 	unsigned int seq;
diff --git a/kernel/include/net/net_seq_lock.h b/kernel/include/net/net_seq_lock.h
new file mode 100644
index 0000000..a703429
--- /dev/null
+++ b/kernel/include/net/net_seq_lock.h
@@ -0,0 +1,15 @@
+#ifndef __NET_NET_SEQ_LOCK_H__
+#define __NET_NET_SEQ_LOCK_H__
+
+#ifdef CONFIG_PREEMPT_RT_BASE
+# define net_seqlock_t			seqlock_t
+# define net_seq_begin(__r)		read_seqbegin(__r)
+# define net_seq_retry(__r, __s)	read_seqretry(__r, __s)
+
+#else
+# define net_seqlock_t			seqcount_t
+# define net_seq_begin(__r)		read_seqcount_begin(__r)
+# define net_seq_retry(__r, __s)	read_seqcount_retry(__r, __s)
+#endif
+
+#endif
diff --git a/kernel/include/net/sch_generic.h b/kernel/include/net/sch_generic.h
index f571833..6876326 100644
--- a/kernel/include/net/sch_generic.h
+++ b/kernel/include/net/sch_generic.h
@@ -10,6 +10,7 @@
 #include <linux/percpu.h>
 #include <linux/dynamic_queue_limits.h>
 #include <linux/list.h>
+#include <net/net_seq_lock.h>
 #include <linux/refcount.h>
 #include <linux/workqueue.h>
 #include <net/gen_stats.h>
@@ -100,7 +101,7 @@
 	struct sk_buff_head	gso_skb ____cacheline_aligned_in_smp;
 	struct qdisc_skb_head	q;
 	struct gnet_stats_basic_packed bstats;
-	seqcount_t		running;
+	net_seqlock_t		running;
 	struct gnet_stats_queue	qstats;
 	unsigned long		state;
 	struct Qdisc            *next_sched;
@@ -137,7 +138,11 @@
 {
 	if (qdisc->flags & TCQ_F_NOLOCK)
 		return spin_is_locked(&qdisc->seqlock);
+#ifdef CONFIG_PREEMPT_RT_BASE
+	return spin_is_locked(&qdisc->running.lock) ? true : false;
+#else
 	return (raw_read_seqcount(&qdisc->running) & 1) ? true : false;
+#endif
 }
 
 static inline bool qdisc_run_begin(struct Qdisc *qdisc)
@@ -148,17 +153,27 @@
 	} else if (qdisc_is_running(qdisc)) {
 		return false;
 	}
+#ifdef CONFIG_PREEMPT_RT_BASE
+	if (try_write_seqlock(&qdisc->running))
+		return true;
+	return false;
+#else
 	/* Variant of write_seqcount_begin() telling lockdep a trylock
 	 * was attempted.
 	 */
 	raw_write_seqcount_begin(&qdisc->running);
 	seqcount_acquire(&qdisc->running.dep_map, 0, 1, _RET_IP_);
 	return true;
+#endif
 }
 
 static inline void qdisc_run_end(struct Qdisc *qdisc)
 {
+#ifdef CONFIG_PREEMPT_RT_BASE
+	write_sequnlock(&qdisc->running);
+#else
 	write_seqcount_end(&qdisc->running);
+#endif
 	if (qdisc->flags & TCQ_F_NOLOCK)
 		spin_unlock(&qdisc->seqlock);
 }
@@ -475,7 +490,7 @@
 	return qdisc_lock(root);
 }
 
-static inline seqcount_t *qdisc_root_sleeping_running(const struct Qdisc *qdisc)
+static inline net_seqlock_t *qdisc_root_sleeping_running(const struct Qdisc *qdisc)
 {
 	struct Qdisc *root = qdisc_root_sleeping(qdisc);
 
diff --git a/kernel/include/net/sock.h b/kernel/include/net/sock.h
index 79dde11..c080fc9 100644
--- a/kernel/include/net/sock.h
+++ b/kernel/include/net/sock.h
@@ -472,7 +472,7 @@
 	u32			sk_ack_backlog;
 	u32			sk_max_ack_backlog;
 	kuid_t			sk_uid;
-#if IS_ENABLED(CONFIG_DEBUG_SPINLOCK) || IS_ENABLED(CONFIG_DEBUG_LOCK_ALLOC)
+#if IS_ENABLED(CONFIG_DEBUG_SPINLOCK) || IS_ENABLED(CONFIG_DEBUG_LOCK_ALLOC) || IS_ENABLED(CONFIG_PREEMPT_RT)
 	spinlock_t		sk_peer_lock;
 #else
 	/* sk_peer_lock is in the ANDROID_KABI_RESERVE(1) field below */
@@ -517,7 +517,7 @@
 	struct sock_reuseport __rcu	*sk_reuseport_cb;
 	struct rcu_head		sk_rcu;
 
-#if IS_ENABLED(CONFIG_DEBUG_SPINLOCK) || IS_ENABLED(CONFIG_DEBUG_LOCK_ALLOC)
+#if IS_ENABLED(CONFIG_DEBUG_SPINLOCK) || IS_ENABLED(CONFIG_DEBUG_LOCK_ALLOC) || IS_ENABLED(CONFIG_PREEMPT_RT)
 	ANDROID_KABI_RESERVE(1);
 #else
 	ANDROID_KABI_USE(1, spinlock_t sk_peer_lock);
diff --git a/kernel/include/soc/at91/atmel_tcb.h b/kernel/include/soc/at91/atmel_tcb.h
new file mode 100644
index 0000000..657e234
--- /dev/null
+++ b/kernel/include/soc/at91/atmel_tcb.h
@@ -0,0 +1,183 @@
+//SPDX-License-Identifier: GPL-2.0
+/* Copyright (C) 2018 Microchip */
+
+#ifndef __SOC_ATMEL_TCB_H
+#define __SOC_ATMEL_TCB_H
+
+/* Channel registers */
+#define ATMEL_TC_COFFS(c)		((c) * 0x40)
+#define ATMEL_TC_CCR(c)			ATMEL_TC_COFFS(c)
+#define ATMEL_TC_CMR(c)			(ATMEL_TC_COFFS(c) + 0x4)
+#define ATMEL_TC_SMMR(c)		(ATMEL_TC_COFFS(c) + 0x8)
+#define ATMEL_TC_RAB(c)			(ATMEL_TC_COFFS(c) + 0xc)
+#define ATMEL_TC_CV(c)			(ATMEL_TC_COFFS(c) + 0x10)
+#define ATMEL_TC_RA(c)			(ATMEL_TC_COFFS(c) + 0x14)
+#define ATMEL_TC_RB(c)			(ATMEL_TC_COFFS(c) + 0x18)
+#define ATMEL_TC_RC(c)			(ATMEL_TC_COFFS(c) + 0x1c)
+#define ATMEL_TC_SR(c)			(ATMEL_TC_COFFS(c) + 0x20)
+#define ATMEL_TC_IER(c)			(ATMEL_TC_COFFS(c) + 0x24)
+#define ATMEL_TC_IDR(c)			(ATMEL_TC_COFFS(c) + 0x28)
+#define ATMEL_TC_IMR(c)			(ATMEL_TC_COFFS(c) + 0x2c)
+#define ATMEL_TC_EMR(c)			(ATMEL_TC_COFFS(c) + 0x30)
+
+/* Block registers */
+#define ATMEL_TC_BCR			0xc0
+#define ATMEL_TC_BMR			0xc4
+#define ATMEL_TC_QIER			0xc8
+#define ATMEL_TC_QIDR			0xcc
+#define ATMEL_TC_QIMR			0xd0
+#define ATMEL_TC_QISR			0xd4
+#define ATMEL_TC_FMR			0xd8
+#define ATMEL_TC_WPMR			0xe4
+
+/* CCR fields */
+#define ATMEL_TC_CCR_CLKEN		BIT(0)
+#define ATMEL_TC_CCR_CLKDIS		BIT(1)
+#define ATMEL_TC_CCR_SWTRG		BIT(2)
+
+/* Common CMR fields */
+#define ATMEL_TC_CMR_TCLKS_MSK		GENMASK(2, 0)
+#define ATMEL_TC_CMR_TCLK(x)		(x)
+#define ATMEL_TC_CMR_XC(x)		((x) + 5)
+#define ATMEL_TC_CMR_CLKI		BIT(3)
+#define ATMEL_TC_CMR_BURST_MSK		GENMASK(5, 4)
+#define ATMEL_TC_CMR_BURST_XC(x)	(((x) + 1) << 4)
+#define ATMEL_TC_CMR_WAVE		BIT(15)
+
+/* Capture mode CMR fields */
+#define ATMEL_TC_CMR_LDBSTOP		BIT(6)
+#define ATMEL_TC_CMR_LDBDIS		BIT(7)
+#define ATMEL_TC_CMR_ETRGEDG_MSK	GENMASK(9, 8)
+#define ATMEL_TC_CMR_ETRGEDG_NONE	(0 << 8)
+#define ATMEL_TC_CMR_ETRGEDG_RISING	(1 << 8)
+#define ATMEL_TC_CMR_ETRGEDG_FALLING	(2 << 8)
+#define ATMEL_TC_CMR_ETRGEDG_BOTH	(3 << 8)
+#define ATMEL_TC_CMR_ABETRG		BIT(10)
+#define ATMEL_TC_CMR_CPCTRG		BIT(14)
+#define ATMEL_TC_CMR_LDRA_MSK		GENMASK(17, 16)
+#define ATMEL_TC_CMR_LDRA_NONE		(0 << 16)
+#define ATMEL_TC_CMR_LDRA_RISING	(1 << 16)
+#define ATMEL_TC_CMR_LDRA_FALLING	(2 << 16)
+#define ATMEL_TC_CMR_LDRA_BOTH		(3 << 16)
+#define ATMEL_TC_CMR_LDRB_MSK		GENMASK(19, 18)
+#define ATMEL_TC_CMR_LDRB_NONE		(0 << 18)
+#define ATMEL_TC_CMR_LDRB_RISING	(1 << 18)
+#define ATMEL_TC_CMR_LDRB_FALLING	(2 << 18)
+#define ATMEL_TC_CMR_LDRB_BOTH		(3 << 18)
+#define ATMEL_TC_CMR_SBSMPLR_MSK	GENMASK(22, 20)
+#define ATMEL_TC_CMR_SBSMPLR(x)		((x) << 20)
+
+/* Waveform mode CMR fields */
+#define ATMEL_TC_CMR_CPCSTOP		BIT(6)
+#define ATMEL_TC_CMR_CPCDIS		BIT(7)
+#define ATMEL_TC_CMR_EEVTEDG_MSK	GENMASK(9, 8)
+#define ATMEL_TC_CMR_EEVTEDG_NONE	(0 << 8)
+#define ATMEL_TC_CMR_EEVTEDG_RISING	(1 << 8)
+#define ATMEL_TC_CMR_EEVTEDG_FALLING	(2 << 8)
+#define ATMEL_TC_CMR_EEVTEDG_BOTH	(3 << 8)
+#define ATMEL_TC_CMR_EEVT_MSK		GENMASK(11, 10)
+#define ATMEL_TC_CMR_EEVT_XC(x)		(((x) + 1) << 10)
+#define ATMEL_TC_CMR_ENETRG		BIT(12)
+#define ATMEL_TC_CMR_WAVESEL_MSK	GENMASK(14, 13)
+#define ATMEL_TC_CMR_WAVESEL_UP		(0 << 13)
+#define ATMEL_TC_CMR_WAVESEL_UPDOWN	(1 << 13)
+#define ATMEL_TC_CMR_WAVESEL_UPRC	(2 << 13)
+#define ATMEL_TC_CMR_WAVESEL_UPDOWNRC	(3 << 13)
+#define ATMEL_TC_CMR_ACPA_MSK		GENMASK(17, 16)
+#define ATMEL_TC_CMR_ACPA(a)		(ATMEL_TC_CMR_ACTION_##a << 16)
+#define ATMEL_TC_CMR_ACPC_MSK		GENMASK(19, 18)
+#define ATMEL_TC_CMR_ACPC(a)		(ATMEL_TC_CMR_ACTION_##a << 18)
+#define ATMEL_TC_CMR_AEEVT_MSK		GENMASK(21, 20)
+#define ATMEL_TC_CMR_AEEVT(a)		(ATMEL_TC_CMR_ACTION_##a << 20)
+#define ATMEL_TC_CMR_ASWTRG_MSK		GENMASK(23, 22)
+#define ATMEL_TC_CMR_ASWTRG(a)		(ATMEL_TC_CMR_ACTION_##a << 22)
+#define ATMEL_TC_CMR_BCPB_MSK		GENMASK(25, 24)
+#define ATMEL_TC_CMR_BCPB(a)		(ATMEL_TC_CMR_ACTION_##a << 24)
+#define ATMEL_TC_CMR_BCPC_MSK		GENMASK(27, 26)
+#define ATMEL_TC_CMR_BCPC(a)		(ATMEL_TC_CMR_ACTION_##a << 26)
+#define ATMEL_TC_CMR_BEEVT_MSK		GENMASK(29, 28)
+#define ATMEL_TC_CMR_BEEVT(a)		(ATMEL_TC_CMR_ACTION_##a << 28)
+#define ATMEL_TC_CMR_BSWTRG_MSK		GENMASK(31, 30)
+#define ATMEL_TC_CMR_BSWTRG(a)		(ATMEL_TC_CMR_ACTION_##a << 30)
+#define ATMEL_TC_CMR_ACTION_NONE	0
+#define ATMEL_TC_CMR_ACTION_SET		1
+#define ATMEL_TC_CMR_ACTION_CLEAR	2
+#define ATMEL_TC_CMR_ACTION_TOGGLE	3
+
+/* SMMR fields */
+#define ATMEL_TC_SMMR_GCEN		BIT(0)
+#define ATMEL_TC_SMMR_DOWN		BIT(1)
+
+/* SR/IER/IDR/IMR fields */
+#define ATMEL_TC_COVFS			BIT(0)
+#define ATMEL_TC_LOVRS			BIT(1)
+#define ATMEL_TC_CPAS			BIT(2)
+#define ATMEL_TC_CPBS			BIT(3)
+#define ATMEL_TC_CPCS			BIT(4)
+#define ATMEL_TC_LDRAS			BIT(5)
+#define ATMEL_TC_LDRBS			BIT(6)
+#define ATMEL_TC_ETRGS			BIT(7)
+#define ATMEL_TC_CLKSTA			BIT(16)
+#define ATMEL_TC_MTIOA			BIT(17)
+#define ATMEL_TC_MTIOB			BIT(18)
+
+/* EMR fields */
+#define ATMEL_TC_EMR_TRIGSRCA_MSK	GENMASK(1, 0)
+#define ATMEL_TC_EMR_TRIGSRCA_TIOA	0
+#define ATMEL_TC_EMR_TRIGSRCA_PWMX	1
+#define ATMEL_TC_EMR_TRIGSRCB_MSK	GENMASK(5, 4)
+#define ATMEL_TC_EMR_TRIGSRCB_TIOB	(0 << 4)
+#define ATMEL_TC_EMR_TRIGSRCB_PWM	(1 << 4)
+#define ATMEL_TC_EMR_NOCLKDIV		BIT(8)
+
+/* BCR fields */
+#define ATMEL_TC_BCR_SYNC		BIT(0)
+
+/* BMR fields */
+#define ATMEL_TC_BMR_TCXC_MSK(c)	GENMASK(((c) * 2) + 1, (c) * 2)
+#define ATMEL_TC_BMR_TCXC(x, c)		((x) << (2 * (c)))
+#define ATMEL_TC_BMR_QDEN		BIT(8)
+#define ATMEL_TC_BMR_POSEN		BIT(9)
+#define ATMEL_TC_BMR_SPEEDEN		BIT(10)
+#define ATMEL_TC_BMR_QDTRANS		BIT(11)
+#define ATMEL_TC_BMR_EDGPHA		BIT(12)
+#define ATMEL_TC_BMR_INVA		BIT(13)
+#define ATMEL_TC_BMR_INVB		BIT(14)
+#define ATMEL_TC_BMR_INVIDX		BIT(15)
+#define ATMEL_TC_BMR_SWAP		BIT(16)
+#define ATMEL_TC_BMR_IDXPHB		BIT(17)
+#define ATMEL_TC_BMR_AUTOC		BIT(18)
+#define ATMEL_TC_MAXFILT_MSK		GENMASK(25, 20)
+#define ATMEL_TC_MAXFILT(x)		(((x) - 1) << 20)
+#define ATMEL_TC_MAXCMP_MSK		GENMASK(29, 26)
+#define ATMEL_TC_MAXCMP(x)		((x) << 26)
+
+/* QEDC fields */
+#define ATMEL_TC_QEDC_IDX		BIT(0)
+#define ATMEL_TC_QEDC_DIRCHG		BIT(1)
+#define ATMEL_TC_QEDC_QERR		BIT(2)
+#define ATMEL_TC_QEDC_MPE		BIT(3)
+#define ATMEL_TC_QEDC_DIR		BIT(8)
+
+/* FMR fields */
+#define ATMEL_TC_FMR_ENCF(x)		BIT(x)
+
+/* WPMR fields */
+#define ATMEL_TC_WPMR_WPKEY		(0x54494d << 8)
+#define ATMEL_TC_WPMR_WPEN		BIT(0)
+
+static const u8 atmel_tc_divisors[5] = { 2, 8, 32, 128, 0, };
+
+static const struct of_device_id atmel_tcb_dt_ids[] = {
+	{
+		.compatible = "atmel,at91rm9200-tcb",
+		.data = (void *)16,
+	}, {
+		.compatible = "atmel,at91sam9x5-tcb",
+		.data = (void *)32,
+	}, {
+		/* sentinel */
+	}
+};
+
+#endif /* __SOC_ATMEL_TCB_H */
diff --git a/kernel/include/soc/rockchip/rockchip_iommu.h b/kernel/include/soc/rockchip/rockchip_iommu.h
index 5a2d58e..cfae9b3 100644
--- a/kernel/include/soc/rockchip/rockchip_iommu.h
+++ b/kernel/include/soc/rockchip/rockchip_iommu.h
@@ -11,6 +11,9 @@
 int rockchip_iommu_enable(struct device *dev);
 int rockchip_iommu_disable(struct device *dev);
 bool rockchip_iommu_is_enabled(struct device *dev);
+int rockchip_pagefault_done(struct device *master_dev);
+void __iomem *rockchip_get_iommu_base(struct device *master_dev, int idx);
+int rockchip_iommu_force_reset(struct device *dev);
 #else
 static inline int rockchip_iommu_enable(struct device *dev)
 {
@@ -24,6 +27,18 @@
 {
 	return false;
 }
+static inline int rockchip_pagefault_done(struct device *master_dev)
+{
+	return 0;
+}
+static inline void __iomem *rockchip_get_iommu_base(struct device *master_dev, int idx)
+{
+	return NULL;
+}
+static inline int rockchip_iommu_force_reset(struct device *dev)
+{
+	return -ENODEV;
+}
 #endif
 
 #endif
diff --git a/kernel/include/soc/rockchip/rockchip_system_monitor.h b/kernel/include/soc/rockchip/rockchip_system_monitor.h
index 1f8bffc..5eec720 100644
--- a/kernel/include/soc/rockchip/rockchip_system_monitor.h
+++ b/kernel/include/soc/rockchip/rockchip_system_monitor.h
@@ -103,11 +103,13 @@
 	bool is_high_temp;
 	bool is_low_temp_enabled;
 	bool is_status_freq_fixed;
+	bool boosted;
 };
 
 struct monitor_dev_profile {
 	enum monitor_dev_type type;
 	void *data;
+	int (*low_temp_adjust_volt)(struct monitor_dev_info *info);
 	int (*low_temp_adjust)(struct monitor_dev_info *info, bool is_low);
 	int (*high_temp_adjust)(struct monitor_dev_info *info, bool is_low);
 	struct cpumask allowed_cpus;
@@ -132,6 +134,8 @@
 					  int temp, unsigned long *state);
 int rockchip_monitor_opp_set_rate(struct monitor_dev_info *info,
 				  unsigned long target_freq);
+void rockchip_monitor_set_boosted(void);
+void rockchip_monitor_clear_boosted(void);
 #else
 static inline struct monitor_dev_info *
 rockchip_system_monitor_register(struct device *dev,
@@ -188,6 +192,8 @@
 {
 	return 0;
 }
+static inline void rockchip_monitor_set_boosted(void) {};
+static inline void rockchip_monitor_set_boosted(void) {};
 #endif /* CONFIG_ROCKCHIP_SYSTEM_MONITOR */
 
 #endif
diff --git a/kernel/include/uapi/linux/cec.h b/kernel/include/uapi/linux/cec.h
index d6ba688..2ad8638 100644
--- a/kernel/include/uapi/linux/cec.h
+++ b/kernel/include/uapi/linux/cec.h
@@ -475,6 +475,12 @@
 #define CEC_G_MODE		_IOR('a',  8, __u32)
 #define CEC_S_MODE		_IOW('a',  9, __u32)
 
+/* set cec into standby mode */
+#define CEC_STANDBY		_IOW('a', 10, __u8)
+
+/* set cec wake up function enable */
+#define CEC_FUNC_EN		_IOW('a', 11, int)
+
 /*
  * The remainder of this header defines all CEC messages and operands.
  * The format matters since it the cec-ctl utility parses it to generate
diff --git a/kernel/include/uapi/linux/rk-pcie-ep.h b/kernel/include/uapi/linux/rk-pcie-ep.h
index 37726a6..b6e3ac0 100644
--- a/kernel/include/uapi/linux/rk-pcie-ep.h
+++ b/kernel/include/uapi/linux/rk-pcie-ep.h
@@ -8,13 +8,77 @@
 
 #include <linux/types.h>
 
+/* rkep device mode status definition */
+#define RKEP_MODE_BOOTROM       1
+#define RKEP_MODE_LOADER        2
+#define RKEP_MODE_KERNEL        3
+#define RKEP_MODE_FUN0          4
+/* 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
+
+/*
+ * rockchip pcie driver elbi ioctrl output data
+ */
 struct pcie_ep_user_data {
+	__u64 bar0_phys_addr;
 	__u32 elbi_app_user[11];
 };
 
+/*
+ * rockchip driver cache ioctrl input param
+ */
 struct pcie_ep_dma_cache_cfg {
 	__u64 addr;
 	__u32 size;
+};
+
+#define	PCIE_EP_OBJ_INFO_MAGIC 0x524B4550
+
+enum pcie_ep_obj_irq_type {
+	OBJ_IRQ_UNKNOWN,
+	OBJ_IRQ_DMA,
+	OBJ_IRQ_USER,
+	OBJ_IRQ_ELBI,
+};
+
+struct pcie_ep_obj_irq_dma_status {
+	__u32 wr;
+	__u32 rd;
+};
+
+enum pcie_ep_mmap_resource {
+	PCIE_EP_MMAP_RESOURCE_DBI,
+	PCIE_EP_MMAP_RESOURCE_BAR0,
+	PCIE_EP_MMAP_RESOURCE_BAR2,
+	PCIE_EP_MMAP_RESOURCE_BAR4,
+	PCIE_EP_MMAP_RESOURCE_MAX,
+};
+
+/*
+ * rockchip ep device information which is store in BAR0
+ */
+struct pcie_ep_obj_info {
+	__u32 magic;
+	__u32 version;
+	struct {
+		__u16 mode;
+		__u16 submode;
+	} devmode;
+	__u8 reserved[0x1F4];
+
+	__u32 irq_type_rc;					/* Generate in ep isr, valid only for rc, clear in rc */
+	struct pcie_ep_obj_irq_dma_status dma_status_rc;	/* Generate in ep isr, valid only for rc, clear in rc */
+	__u32 irq_type_ep;					/* Generate in ep isr, valid only for ep, clear in ep */
+	struct pcie_ep_obj_irq_dma_status dma_status_ep;	/* Generate in ep isr, valid only for ep, clear in ep */
+	__u32 obj_irq_user_data;				/* OBJ_IRQ_USER userspace data */
 };
 
 #define PCIE_BASE	'P'
@@ -22,5 +86,8 @@
 #define PCIE_DMA_CACHE_INVALIDE		_IOW(PCIE_BASE, 1, struct pcie_ep_dma_cache_cfg)
 #define PCIE_DMA_CACHE_FLUSH		_IOW(PCIE_BASE, 2, struct pcie_ep_dma_cache_cfg)
 #define PCIE_DMA_IRQ_MASK_ALL		_IOW(PCIE_BASE, 3, int)
+#define PCIE_DMA_RAISE_MSI_OBJ_IRQ_USER	_IOW(PCIE_BASE, 4, int)
+#define PCIE_EP_GET_USER_INFO		_IOR(PCIE_BASE, 5, struct pcie_ep_user_data)
+#define PCIE_EP_SET_MMAP_RESOURCE	_IOW(PCIE_BASE, 6, enum pcie_ep_mmap_resource)
 
 #endif
diff --git a/kernel/include/uapi/linux/rkisp21-config.h b/kernel/include/uapi/linux/rkisp21-config.h
index fc72ef9..3e83014 100644
--- a/kernel/include/uapi/linux/rkisp21-config.h
+++ b/kernel/include/uapi/linux/rkisp21-config.h
@@ -805,6 +805,7 @@
 struct rkisp_isp21_stat_buffer {
 	unsigned int meas_type;
 	unsigned int frame_id;
+	unsigned int params_id;
 	struct isp21_stat params;
 } __attribute__ ((packed));
 
diff --git a/kernel/init/Kconfig b/kernel/init/Kconfig
index 0e0d8f2..46618c6 100644
--- a/kernel/init/Kconfig
+++ b/kernel/init/Kconfig
@@ -900,6 +900,7 @@
 config RT_GROUP_SCHED
 	bool "Group scheduling for SCHED_RR/FIFO"
 	depends on CGROUP_SCHED
+	depends on !PREEMPT_RT_FULL
 	default n
 	help
 	  This feature lets you explicitly allocate real CPU bandwidth
@@ -1827,6 +1828,7 @@
 
 config SLAB
 	bool "SLAB"
+	depends on !PREEMPT_RT_FULL
 	select HAVE_HARDENED_USERCOPY_ALLOCATOR
 	help
 	  The regular slab allocator that is established and known to work
@@ -1847,6 +1849,7 @@
 config SLOB
 	depends on EXPERT
 	bool "SLOB (Simple Allocator)"
+	depends on !PREEMPT_RT_FULL
 	help
 	   SLOB replaces the stock allocator with a drastically simpler
 	   allocator. SLOB is generally more space efficient but
@@ -1888,7 +1891,7 @@
 
 config SLUB_CPU_PARTIAL
 	default y
-	depends on SLUB && SMP
+	depends on SLUB && SMP && !PREEMPT_RT_FULL
 	bool "SLUB per cpu partial cache"
 	help
 	  Per cpu partial caches accellerate objects allocation and freeing
diff --git a/kernel/init/Makefile b/kernel/init/Makefile
index c94fd10..6c74aa3 100644
--- a/kernel/init/Makefile
+++ b/kernel/init/Makefile
@@ -31,5 +31,5 @@
 include/generated/compile.h: FORCE
 	@$($(quiet)chk_compile.h)
 	$(Q)$(CONFIG_SHELL) $(srctree)/scripts/mkcompile_h $@	\
-	"$(UTS_MACHINE)" "$(CONFIG_SMP)" "$(CONFIG_PREEMPT)"	\
+	"$(UTS_MACHINE)" "$(CONFIG_SMP)" "$(CONFIG_PREEMPT)" "$(CONFIG_PREEMPT_RT_FULL)"	\
 	"$(CC) $(KBUILD_CFLAGS)" "$(LD)"
diff --git a/kernel/init/init_task.c b/kernel/init/init_task.c
index b31109d..eedcb1b 100644
--- a/kernel/init/init_task.c
+++ b/kernel/init/init_task.c
@@ -51,6 +51,12 @@
 	.signalfd_wqh	= __WAIT_QUEUE_HEAD_INITIALIZER(init_sighand.signalfd_wqh),
 };
 
+#if defined(CONFIG_POSIX_TIMERS) && defined(CONFIG_PREEMPT_RT_BASE)
+# define INIT_TIMER_LIST		.posix_timer_list = NULL,
+#else
+# define INIT_TIMER_LIST
+#endif
+
 /*
  * Set up the first task table, touch at your own risk!. Base=0,
  * limit=0x1fffff (=2MB)
@@ -72,9 +78,14 @@
 	.static_prio	= MAX_PRIO - 20,
 	.normal_prio	= MAX_PRIO - 20,
 	.policy		= SCHED_NORMAL,
-	.cpus_allowed	= CPU_MASK_ALL,
+	.cpus_ptr	= &init_task.cpus_mask,
+	.cpus_mask	= CPU_MASK_ALL,
 	.nr_cpus_allowed= NR_CPUS,
 	.cpus_requested	= CPU_MASK_ALL,
+#if defined(CONFIG_SMP) && defined(CONFIG_PREEMPT_RT_BASE) && \
+    defined(CONFIG_SCHED_DEBUG)
+	.pinned_on_cpu	= -1,
+#endif
 	.mm		= NULL,
 	.active_mm	= &init_mm,
 	.restart_block	= {
@@ -120,6 +131,7 @@
 	INIT_CPU_TIMERS(init_task)
 	.pi_lock	= __RAW_SPIN_LOCK_UNLOCKED(init_task.pi_lock),
 	.timer_slack_ns = 50000, /* 50 usec default slack */
+	INIT_TIMER_LIST
 	.thread_pid	= &init_struct_pid,
 	.thread_group	= LIST_HEAD_INIT(init_task.thread_group),
 	.thread_node	= LIST_HEAD_INIT(init_signals.thread_head),
diff --git a/kernel/init/main.c b/kernel/init/main.c
index e61c5db..6091067 100644
--- a/kernel/init/main.c
+++ b/kernel/init/main.c
@@ -580,6 +580,7 @@
 	setup_command_line(command_line);
 	setup_nr_cpu_ids();
 	setup_per_cpu_areas();
+	softirq_early_init();
 	smp_prepare_boot_cpu();	/* arch-specific boot-cpu hooks */
 	boot_cpu_hotplug_init();
 
diff --git a/kernel/kernel/Kconfig.locks b/kernel/kernel/Kconfig.locks
index 84d882f..af27c40 100644
--- a/kernel/kernel/Kconfig.locks
+++ b/kernel/kernel/Kconfig.locks
@@ -225,11 +225,11 @@
 
 config MUTEX_SPIN_ON_OWNER
 	def_bool y
-	depends on SMP && ARCH_SUPPORTS_ATOMIC_RMW
+	depends on SMP && ARCH_SUPPORTS_ATOMIC_RMW && !PREEMPT_RT_FULL
 
 config RWSEM_SPIN_ON_OWNER
        def_bool y
-       depends on SMP && RWSEM_XCHGADD_ALGORITHM && ARCH_SUPPORTS_ATOMIC_RMW
+       depends on SMP && RWSEM_XCHGADD_ALGORITHM && ARCH_SUPPORTS_ATOMIC_RMW && !PREEMPT_RT_FULL
 
 config LOCK_SPIN_ON_OWNER
        def_bool y
diff --git a/kernel/kernel/Kconfig.preempt b/kernel/kernel/Kconfig.preempt
index cd16551..fd924c0 100644
--- a/kernel/kernel/Kconfig.preempt
+++ b/kernel/kernel/Kconfig.preempt
@@ -1,3 +1,19 @@
+config PREEMPT
+	bool
+	select PREEMPT_COUNT
+
+config PREEMPT_RT_BASE
+	bool
+	select PREEMPT
+
+config PREEMPT_RT
+       bool
+
+config HAVE_PREEMPT_LAZY
+	bool
+
+config PREEMPT_LAZY
+	def_bool y if HAVE_PREEMPT_LAZY && PREEMPT_RT_FULL
 
 choice
 	prompt "Preemption Model"
@@ -34,10 +50,10 @@
 
 	  Select this if you are building a kernel for a desktop system.
 
-config PREEMPT
+config PREEMPT__LL
 	bool "Preemptible Kernel (Low-Latency Desktop)"
 	depends on !ARCH_NO_PREEMPT
-	select PREEMPT_COUNT
+	select PREEMPT
 	select UNINLINE_SPIN_UNLOCK if !ARCH_INLINE_SPIN_UNLOCK
 	help
 	  This option reduces the latency of the kernel by making
@@ -54,7 +70,24 @@
 	  embedded system with latency requirements in the milliseconds
 	  range.
 
+config PREEMPT_RTB
+	bool "Preemptible Kernel (Basic RT)"
+	select PREEMPT_RT_BASE
+	help
+	  This option is basically the same as (Low-Latency Desktop) but
+	  enables changes which are preliminary for the full preemptible
+	  RT kernel.
+
+config PREEMPT_RT_FULL
+	bool "Fully Preemptible Kernel (RT)"
+	depends on IRQ_FORCED_THREADING
+	select PREEMPT_RT_BASE
+	select PREEMPT_RCU
+	select PREEMPT_RT
+	help
+	  All and everything
+
 endchoice
 
 config PREEMPT_COUNT
-       bool
\ No newline at end of file
+       bool
diff --git a/kernel/kernel/cgroup/cgroup.c b/kernel/kernel/cgroup/cgroup.c
index 712839b..c0430df 100644
--- a/kernel/kernel/cgroup/cgroup.c
+++ b/kernel/kernel/cgroup/cgroup.c
@@ -4927,10 +4927,10 @@
 	}
 }
 
-static void css_release_work_fn(struct work_struct *work)
+static void css_release_work_fn(struct swork_event *sev)
 {
 	struct cgroup_subsys_state *css =
-		container_of(work, struct cgroup_subsys_state, destroy_work);
+		container_of(sev, struct cgroup_subsys_state, destroy_swork);
 	struct cgroup_subsys *ss = css->ss;
 	struct cgroup *cgrp = css->cgroup;
 
@@ -4992,8 +4992,8 @@
 	struct cgroup_subsys_state *css =
 		container_of(ref, struct cgroup_subsys_state, refcnt);
 
-	INIT_WORK(&css->destroy_work, css_release_work_fn);
-	queue_work(cgroup_destroy_wq, &css->destroy_work);
+	INIT_SWORK(&css->destroy_swork, css_release_work_fn);
+	swork_queue(&css->destroy_swork);
 }
 
 static void init_and_link_css(struct cgroup_subsys_state *css,
@@ -5751,6 +5751,7 @@
 	 */
 	cgroup_destroy_wq = alloc_workqueue("cgroup_destroy", 0, 1);
 	BUG_ON(!cgroup_destroy_wq);
+	BUG_ON(swork_get());
 	return 0;
 }
 core_initcall(cgroup_wq_init);
diff --git a/kernel/kernel/cgroup/cpuset.c b/kernel/kernel/cgroup/cpuset.c
index 45b4dbf..38367e6 100644
--- a/kernel/kernel/cgroup/cpuset.c
+++ b/kernel/kernel/cgroup/cpuset.c
@@ -289,7 +289,7 @@
  */
 
 static DEFINE_MUTEX(cpuset_mutex);
-static DEFINE_SPINLOCK(callback_lock);
+static DEFINE_RAW_SPINLOCK(callback_lock);
 
 static struct workqueue_struct *cpuset_migrate_mm_wq;
 
@@ -929,9 +929,9 @@
 			continue;
 		rcu_read_unlock();
 
-		spin_lock_irq(&callback_lock);
+		raw_spin_lock_irq(&callback_lock);
 		cpumask_copy(cp->effective_cpus, new_cpus);
-		spin_unlock_irq(&callback_lock);
+		raw_spin_unlock_irq(&callback_lock);
 
 		WARN_ON(!is_in_v2_mode() &&
 			!cpumask_equal(cp->cpus_allowed, cp->effective_cpus));
@@ -997,10 +997,10 @@
 	if (retval < 0)
 		return retval;
 
-	spin_lock_irq(&callback_lock);
+	raw_spin_lock_irq(&callback_lock);
 	cpumask_copy(cs->cpus_allowed, trialcs->cpus_allowed);
 	cpumask_copy(cs->cpus_requested, trialcs->cpus_requested);
-	spin_unlock_irq(&callback_lock);
+	raw_spin_unlock_irq(&callback_lock);
 
 	/* use trialcs->cpus_allowed as a temp variable */
 	update_cpumasks_hier(cs, trialcs->cpus_allowed);
@@ -1184,9 +1184,9 @@
 			continue;
 		rcu_read_unlock();
 
-		spin_lock_irq(&callback_lock);
+		raw_spin_lock_irq(&callback_lock);
 		cp->effective_mems = *new_mems;
-		spin_unlock_irq(&callback_lock);
+		raw_spin_unlock_irq(&callback_lock);
 
 		WARN_ON(!is_in_v2_mode() &&
 			!nodes_equal(cp->mems_allowed, cp->effective_mems));
@@ -1254,9 +1254,9 @@
 	if (retval < 0)
 		goto done;
 
-	spin_lock_irq(&callback_lock);
+	raw_spin_lock_irq(&callback_lock);
 	cs->mems_allowed = trialcs->mems_allowed;
-	spin_unlock_irq(&callback_lock);
+	raw_spin_unlock_irq(&callback_lock);
 
 	/* use trialcs->mems_allowed as a temp variable */
 	update_nodemasks_hier(cs, &trialcs->mems_allowed);
@@ -1347,9 +1347,9 @@
 	spread_flag_changed = ((is_spread_slab(cs) != is_spread_slab(trialcs))
 			|| (is_spread_page(cs) != is_spread_page(trialcs)));
 
-	spin_lock_irq(&callback_lock);
+	raw_spin_lock_irq(&callback_lock);
 	cs->flags = trialcs->flags;
-	spin_unlock_irq(&callback_lock);
+	raw_spin_unlock_irq(&callback_lock);
 
 	if (!cpumask_empty(trialcs->cpus_allowed) && balance_flag_changed)
 		rebuild_sched_domains_locked();
@@ -1766,7 +1766,7 @@
 	cpuset_filetype_t type = seq_cft(sf)->private;
 	int ret = 0;
 
-	spin_lock_irq(&callback_lock);
+	raw_spin_lock_irq(&callback_lock);
 
 	switch (type) {
 	case FILE_CPULIST:
@@ -1785,7 +1785,7 @@
 		ret = -EINVAL;
 	}
 
-	spin_unlock_irq(&callback_lock);
+	raw_spin_unlock_irq(&callback_lock);
 	return ret;
 }
 
@@ -2005,12 +2005,12 @@
 
 	cpuset_inc();
 
-	spin_lock_irq(&callback_lock);
+	raw_spin_lock_irq(&callback_lock);
 	if (is_in_v2_mode()) {
 		cpumask_copy(cs->effective_cpus, parent->effective_cpus);
 		cs->effective_mems = parent->effective_mems;
 	}
-	spin_unlock_irq(&callback_lock);
+	raw_spin_unlock_irq(&callback_lock);
 
 	if (!test_bit(CGRP_CPUSET_CLONE_CHILDREN, &css->cgroup->flags))
 		goto out_unlock;
@@ -2037,13 +2037,13 @@
 	}
 	rcu_read_unlock();
 
-	spin_lock_irq(&callback_lock);
+	raw_spin_lock_irq(&callback_lock);
 	cs->mems_allowed = parent->mems_allowed;
 	cs->effective_mems = parent->mems_allowed;
 	cpumask_copy(cs->cpus_allowed, parent->cpus_allowed);
 	cpumask_copy(cs->cpus_requested, parent->cpus_requested);
 	cpumask_copy(cs->effective_cpus, parent->cpus_allowed);
-	spin_unlock_irq(&callback_lock);
+	raw_spin_unlock_irq(&callback_lock);
 out_unlock:
 	mutex_unlock(&cpuset_mutex);
 	return 0;
@@ -2083,7 +2083,7 @@
 static void cpuset_bind(struct cgroup_subsys_state *root_css)
 {
 	mutex_lock(&cpuset_mutex);
-	spin_lock_irq(&callback_lock);
+	raw_spin_lock_irq(&callback_lock);
 
 	if (is_in_v2_mode()) {
 		cpumask_copy(top_cpuset.cpus_allowed, cpu_possible_mask);
@@ -2094,7 +2094,7 @@
 		top_cpuset.mems_allowed = top_cpuset.effective_mems;
 	}
 
-	spin_unlock_irq(&callback_lock);
+	raw_spin_unlock_irq(&callback_lock);
 	mutex_unlock(&cpuset_mutex);
 }
 
@@ -2108,7 +2108,7 @@
 	if (task_css_is_root(task, cpuset_cgrp_id))
 		return;
 
-	set_cpus_allowed_ptr(task, &current->cpus_allowed);
+	set_cpus_allowed_ptr(task, current->cpus_ptr);
 	task->mems_allowed = current->mems_allowed;
 }
 
@@ -2194,12 +2194,12 @@
 {
 	bool is_empty;
 
-	spin_lock_irq(&callback_lock);
+	raw_spin_lock_irq(&callback_lock);
 	cpumask_copy(cs->cpus_allowed, new_cpus);
 	cpumask_copy(cs->effective_cpus, new_cpus);
 	cs->mems_allowed = *new_mems;
 	cs->effective_mems = *new_mems;
-	spin_unlock_irq(&callback_lock);
+	raw_spin_unlock_irq(&callback_lock);
 
 	/*
 	 * Don't call update_tasks_cpumask() if the cpuset becomes empty,
@@ -2236,10 +2236,10 @@
 	if (nodes_empty(*new_mems))
 		*new_mems = parent_cs(cs)->effective_mems;
 
-	spin_lock_irq(&callback_lock);
+	raw_spin_lock_irq(&callback_lock);
 	cpumask_copy(cs->effective_cpus, new_cpus);
 	cs->effective_mems = *new_mems;
-	spin_unlock_irq(&callback_lock);
+	raw_spin_unlock_irq(&callback_lock);
 
 	if (cpus_updated)
 		update_tasks_cpumask(cs);
@@ -2332,21 +2332,21 @@
 
 	/* synchronize cpus_allowed to cpu_active_mask */
 	if (cpus_updated) {
-		spin_lock_irq(&callback_lock);
+		raw_spin_lock_irq(&callback_lock);
 		if (!on_dfl)
 			cpumask_copy(top_cpuset.cpus_allowed, &new_cpus);
 		cpumask_copy(top_cpuset.effective_cpus, &new_cpus);
-		spin_unlock_irq(&callback_lock);
+		raw_spin_unlock_irq(&callback_lock);
 		/* we don't mess with cpumasks of tasks in top_cpuset */
 	}
 
 	/* synchronize mems_allowed to N_MEMORY */
 	if (mems_updated) {
-		spin_lock_irq(&callback_lock);
+		raw_spin_lock_irq(&callback_lock);
 		if (!on_dfl)
 			top_cpuset.mems_allowed = new_mems;
 		top_cpuset.effective_mems = new_mems;
-		spin_unlock_irq(&callback_lock);
+		raw_spin_unlock_irq(&callback_lock);
 		update_tasks_nodemask(&top_cpuset);
 	}
 
@@ -2445,11 +2445,11 @@
 {
 	unsigned long flags;
 
-	spin_lock_irqsave(&callback_lock, flags);
+	raw_spin_lock_irqsave(&callback_lock, flags);
 	rcu_read_lock();
 	guarantee_online_cpus(task_cs(tsk), pmask);
 	rcu_read_unlock();
-	spin_unlock_irqrestore(&callback_lock, flags);
+	raw_spin_unlock_irqrestore(&callback_lock, flags);
 }
 
 /**
@@ -2510,11 +2510,11 @@
 	nodemask_t mask;
 	unsigned long flags;
 
-	spin_lock_irqsave(&callback_lock, flags);
+	raw_spin_lock_irqsave(&callback_lock, flags);
 	rcu_read_lock();
 	guarantee_online_mems(task_cs(tsk), &mask);
 	rcu_read_unlock();
-	spin_unlock_irqrestore(&callback_lock, flags);
+	raw_spin_unlock_irqrestore(&callback_lock, flags);
 
 	return mask;
 }
@@ -2606,14 +2606,14 @@
 		return true;
 
 	/* Not hardwall and node outside mems_allowed: scan up cpusets */
-	spin_lock_irqsave(&callback_lock, flags);
+	raw_spin_lock_irqsave(&callback_lock, flags);
 
 	rcu_read_lock();
 	cs = nearest_hardwall_ancestor(task_cs(current));
 	allowed = node_isset(node, cs->mems_allowed);
 	rcu_read_unlock();
 
-	spin_unlock_irqrestore(&callback_lock, flags);
+	raw_spin_unlock_irqrestore(&callback_lock, flags);
 	return allowed;
 }
 
diff --git a/kernel/kernel/cgroup/rstat.c b/kernel/kernel/cgroup/rstat.c
index d0ed410..3c949c4 100644
--- a/kernel/kernel/cgroup/rstat.c
+++ b/kernel/kernel/cgroup/rstat.c
@@ -149,8 +149,9 @@
 		raw_spinlock_t *cpu_lock = per_cpu_ptr(&cgroup_rstat_cpu_lock,
 						       cpu);
 		struct cgroup *pos = NULL;
+		unsigned long flags;
 
-		raw_spin_lock(cpu_lock);
+		raw_spin_lock_irqsave(cpu_lock, flags);
 		while ((pos = cgroup_rstat_cpu_pop_updated(pos, cgrp, cpu))) {
 			struct cgroup_subsys_state *css;
 
@@ -162,7 +163,7 @@
 				css->ss->css_rstat_flush(css, cpu);
 			rcu_read_unlock();
 		}
-		raw_spin_unlock(cpu_lock);
+		raw_spin_unlock_irqrestore(cpu_lock, flags);
 
 		/* if @may_sleep, play nice and yield if necessary */
 		if (may_sleep && (need_resched() ||
diff --git a/kernel/kernel/cpu.c b/kernel/kernel/cpu.c
index c664ec4..51b17e4 100644
--- a/kernel/kernel/cpu.c
+++ b/kernel/kernel/cpu.c
@@ -876,6 +876,15 @@
 	int err, cpu = smp_processor_id();
 	int ret;
 
+#ifdef CONFIG_PREEMPT_RT_BASE
+	/*
+	 * If any tasks disabled migration before we got here,
+	 * go back and sleep again.
+	 */
+	if (cpu_nr_pinned(cpu))
+		return -EAGAIN;
+#endif
+
 	/* Ensure this CPU doesn't handle any more interrupts. */
 	err = __cpu_disable();
 	if (err < 0)
@@ -903,6 +912,10 @@
 	return 0;
 }
 
+#ifdef CONFIG_PREEMPT_RT_BASE
+struct task_struct *takedown_cpu_task;
+#endif
+
 static int takedown_cpu(unsigned int cpu)
 {
 	struct cpuhp_cpu_state *st = per_cpu_ptr(&cpuhp_state, cpu);
@@ -917,11 +930,39 @@
 	 */
 	irq_lock_sparse();
 
+#ifdef CONFIG_PREEMPT_RT_BASE
+	WARN_ON_ONCE(takedown_cpu_task);
+	takedown_cpu_task = current;
+
+again:
+	/*
+	 * If a task pins this CPU after we pass this check, take_cpu_down
+	 * will return -EAGAIN.
+	 */
+	for (;;) {
+		int nr_pinned;
+
+		set_current_state(TASK_UNINTERRUPTIBLE);
+		nr_pinned = cpu_nr_pinned(cpu);
+		if (nr_pinned == 0)
+			break;
+		schedule();
+	}
+	set_current_state(TASK_RUNNING);
+#endif
+
 	/*
 	 * So now all preempt/rcu users must observe !cpu_active().
 	 */
 	err = stop_machine_cpuslocked(take_cpu_down, NULL, cpumask_of(cpu));
+#ifdef CONFIG_PREEMPT_RT_BASE
+	if (err == -EAGAIN)
+		goto again;
+#endif
 	if (err) {
+#ifdef CONFIG_PREEMPT_RT_BASE
+		takedown_cpu_task = NULL;
+#endif
 		/* CPU refused to die */
 		irq_unlock_sparse();
 		/* Unpark the hotplug thread so we can rollback there */
@@ -940,6 +981,9 @@
 	wait_for_ap_thread(st, false);
 	BUG_ON(st->state != CPUHP_AP_IDLE_DEAD);
 
+#ifdef CONFIG_PREEMPT_RT_BASE
+	takedown_cpu_task = NULL;
+#endif
 	/* Interrupts are moved away from the dying cpu, reenable alloc/free */
 	irq_unlock_sparse();
 
diff --git a/kernel/kernel/debug/kdb/kdb_io.c b/kernel/kernel/debug/kdb/kdb_io.c
index b45576c..ad1a3bc 100644
--- a/kernel/kernel/debug/kdb/kdb_io.c
+++ b/kernel/kernel/debug/kdb/kdb_io.c
@@ -861,9 +861,11 @@
 	va_list ap;
 	int r;
 
+	kdb_trap_printk++;
 	va_start(ap, fmt);
 	r = vkdb_printf(KDB_MSGSRC_INTERNAL, fmt, ap);
 	va_end(ap);
+	kdb_trap_printk--;
 
 	return r;
 }
diff --git a/kernel/kernel/events/core.c b/kernel/kernel/events/core.c
index a2899b6..7b769fa 100644
--- a/kernel/kernel/events/core.c
+++ b/kernel/kernel/events/core.c
@@ -1113,7 +1113,7 @@
 	cpuctx->hrtimer_interval = ns_to_ktime(NSEC_PER_MSEC * interval);
 
 	raw_spin_lock_init(&cpuctx->hrtimer_lock);
-	hrtimer_init(timer, CLOCK_MONOTONIC, HRTIMER_MODE_ABS_PINNED);
+	hrtimer_init(timer, CLOCK_MONOTONIC, HRTIMER_MODE_ABS_PINNED_HARD);
 	timer->function = perf_mux_hrtimer_handler;
 }
 
@@ -9307,7 +9307,7 @@
 	if (!is_sampling_event(event))
 		return;
 
-	hrtimer_init(&hwc->hrtimer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
+	hrtimer_init(&hwc->hrtimer, CLOCK_MONOTONIC, HRTIMER_MODE_REL_HARD);
 	hwc->hrtimer.function = perf_swevent_hrtimer;
 
 	/*
diff --git a/kernel/kernel/exit.c b/kernel/kernel/exit.c
index f36ad1b..bc3aa8c 100644
--- a/kernel/kernel/exit.c
+++ b/kernel/kernel/exit.c
@@ -160,7 +160,7 @@
 	 * Do this under ->siglock, we can race with another thread
 	 * doing sigqueue_free() if we have SIGQUEUE_PREALLOC signals.
 	 */
-	flush_sigqueue(&tsk->pending);
+	flush_task_sigqueue(tsk);
 	tsk->sighand = NULL;
 	spin_unlock(&sighand->siglock);
 
diff --git a/kernel/kernel/fork.c b/kernel/kernel/fork.c
index 1891a2a..6e880eb 100644
--- a/kernel/kernel/fork.c
+++ b/kernel/kernel/fork.c
@@ -42,6 +42,7 @@
 #include <linux/hmm.h>
 #include <linux/fs.h>
 #include <linux/mm.h>
+#include <linux/kprobes.h>
 #include <linux/vmacache.h>
 #include <linux/nsproxy.h>
 #include <linux/capability.h>
@@ -649,6 +650,19 @@
 }
 EXPORT_SYMBOL_GPL(__mmdrop);
 
+#ifdef CONFIG_PREEMPT_RT_BASE
+/*
+ * RCU callback for delayed mm drop. Not strictly rcu, but we don't
+ * want another facility to make this work.
+ */
+void __mmdrop_delayed(struct rcu_head *rhp)
+{
+	struct mm_struct *mm = container_of(rhp, struct mm_struct, delayed_drop);
+
+	__mmdrop(mm);
+}
+#endif
+
 static void mmdrop_async_fn(struct work_struct *work)
 {
 	struct mm_struct *mm;
@@ -683,12 +697,23 @@
 	if (atomic_dec_and_test(&sig->sigcnt))
 		free_signal_struct(sig);
 }
-
+#ifdef CONFIG_PREEMPT_RT_BASE
+static
+#endif
 void __put_task_struct(struct task_struct *tsk)
 {
 	WARN_ON(!tsk->exit_state);
 	WARN_ON(atomic_read(&tsk->usage));
 	WARN_ON(tsk == current);
+
+	/*
+	 * Remove function-return probe instances associated with this
+	 * task and put them back on the free list.
+	 */
+	kprobe_flush_task(tsk);
+
+	/* Task is done with its stack. */
+	put_task_stack(tsk);
 
 	cgroup_free(tsk);
 	task_numa_free(tsk, true);
@@ -700,7 +725,18 @@
 	if (!profile_handoff_task(tsk))
 		free_task(tsk);
 }
+#ifndef CONFIG_PREEMPT_RT_BASE
 EXPORT_SYMBOL_GPL(__put_task_struct);
+#else
+void __put_task_struct_cb(struct rcu_head *rhp)
+{
+	struct task_struct *tsk = container_of(rhp, struct task_struct, put_rcu);
+
+	__put_task_struct(tsk);
+
+}
+EXPORT_SYMBOL_GPL(__put_task_struct_cb);
+#endif
 
 void __init __weak arch_task_cache_init(void) { }
 
@@ -863,6 +899,8 @@
 #ifdef CONFIG_STACKPROTECTOR
 	tsk->stack_canary = get_random_canary();
 #endif
+	if (orig->cpus_ptr == &orig->cpus_mask)
+		tsk->cpus_ptr = &tsk->cpus_mask;
 
 	/*
 	 * One for us, one for whoever does the "release_task()" (usually
@@ -875,6 +913,7 @@
 	tsk->splice_pipe = NULL;
 	tsk->task_frag.page = NULL;
 	tsk->wake_q.next = NULL;
+	tsk->wake_q_sleeper.next = NULL;
 
 	account_kernel_stack(tsk, 1);
 
@@ -1600,6 +1639,9 @@
  */
 static void posix_cpu_timers_init(struct task_struct *tsk)
 {
+#ifdef CONFIG_PREEMPT_RT_BASE
+	tsk->posix_timer_list = NULL;
+#endif
 	tsk->cputime_expires.prof_exp = 0;
 	tsk->cputime_expires.virt_exp = 0;
 	tsk->cputime_expires.sched_exp = 0;
@@ -1915,6 +1957,7 @@
 	spin_lock_init(&p->alloc_lock);
 
 	init_sigpending(&p->pending);
+	p->sigqueue_cache = NULL;
 
 	p->utime = p->stime = p->gtime = 0;
 #ifdef CONFIG_ARCH_HAS_SCALED_CPUTIME
diff --git a/kernel/kernel/futex.c b/kernel/kernel/futex.c
index 3c67da9..81090f7 100644
--- a/kernel/kernel/futex.c
+++ b/kernel/kernel/futex.c
@@ -962,7 +962,9 @@
 		if (head->next != next) {
 			/* retain curr->pi_lock for the loop invariant */
 			raw_spin_unlock(&pi_state->pi_mutex.wait_lock);
+			raw_spin_unlock_irq(&curr->pi_lock);
 			spin_unlock(&hb->lock);
+			raw_spin_lock_irq(&curr->pi_lock);
 			put_pi_state(pi_state);
 			continue;
 		}
@@ -1573,6 +1575,7 @@
 	struct task_struct *new_owner;
 	bool postunlock = false;
 	DEFINE_WAKE_Q(wake_q);
+	DEFINE_WAKE_Q(wake_sleeper_q);
 	int ret = 0;
 
 	new_owner = rt_mutex_next_owner(&pi_state->pi_mutex);
@@ -1622,14 +1625,15 @@
 		 * not fail.
 		 */
 		pi_state_update_owner(pi_state, new_owner);
-		postunlock = __rt_mutex_futex_unlock(&pi_state->pi_mutex, &wake_q);
+		postunlock = __rt_mutex_futex_unlock(&pi_state->pi_mutex, &wake_q,
+						     &wake_sleeper_q);
 	}
 
 out_unlock:
 	raw_spin_unlock_irq(&pi_state->pi_mutex.wait_lock);
 
 	if (postunlock)
-		rt_mutex_postunlock(&wake_q);
+		rt_mutex_postunlock(&wake_q, &wake_sleeper_q);
 
 	return ret;
 }
@@ -2253,6 +2257,16 @@
 				requeue_pi_wake_futex(this, &key2, hb2);
 				drop_count++;
 				continue;
+			} else if (ret == -EAGAIN) {
+				/*
+				 * Waiter was woken by timeout or
+				 * signal and has set pi_blocked_on to
+				 * PI_WAKEUP_INPROGRESS before we
+				 * tried to enqueue it on the rtmutex.
+				 */
+				this->pi_state = NULL;
+				put_pi_state(pi_state);
+				continue;
 			} else if (ret) {
 				/*
 				 * rt_mutex_start_proxy_lock() detected a
@@ -2816,10 +2830,9 @@
 	if (abs_time) {
 		to = &timeout;
 
-		hrtimer_init_on_stack(&to->timer, (flags & FLAGS_CLOCKRT) ?
-				      CLOCK_REALTIME : CLOCK_MONOTONIC,
-				      HRTIMER_MODE_ABS);
-		hrtimer_init_sleeper(to, current);
+		hrtimer_init_sleeper_on_stack(to, (flags & FLAGS_CLOCKRT) ?
+					      CLOCK_REALTIME : CLOCK_MONOTONIC,
+					      HRTIMER_MODE_ABS, current);
 		hrtimer_set_expires_range_ns(&to->timer, *abs_time,
 					     current->timer_slack_ns);
 	}
@@ -2917,9 +2930,8 @@
 
 	if (time) {
 		to = &timeout;
-		hrtimer_init_on_stack(&to->timer, CLOCK_REALTIME,
-				      HRTIMER_MODE_ABS);
-		hrtimer_init_sleeper(to, current);
+		hrtimer_init_sleeper_on_stack(to, CLOCK_REALTIME,
+					      HRTIMER_MODE_ABS, current);
 		hrtimer_set_expires(&to->timer, *time);
 	}
 
@@ -2982,7 +2994,7 @@
 		goto no_block;
 	}
 
-	rt_mutex_init_waiter(&rt_waiter);
+	rt_mutex_init_waiter(&rt_waiter, false);
 
 	/*
 	 * On PREEMPT_RT_FULL, when hb->lock becomes an rt_mutex, we must not
@@ -2998,6 +3010,14 @@
 	 * before __rt_mutex_start_proxy_lock() is done.
 	 */
 	raw_spin_lock_irq(&q.pi_state->pi_mutex.wait_lock);
+	/*
+	 * the migrate_disable() here disables migration in the in_atomic() fast
+	 * path which is enabled again in the following spin_unlock(). We have
+	 * one migrate_disable() pending in the slow-path which is reversed
+	 * after the raw_spin_unlock_irq() where we leave the atomic context.
+	 */
+	migrate_disable();
+
 	spin_unlock(q.lock_ptr);
 	/*
 	 * __rt_mutex_start_proxy_lock() unconditionally enqueues the @rt_waiter
@@ -3006,6 +3026,7 @@
 	 */
 	ret = __rt_mutex_start_proxy_lock(&q.pi_state->pi_mutex, &rt_waiter, current);
 	raw_spin_unlock_irq(&q.pi_state->pi_mutex.wait_lock);
+	migrate_enable();
 
 	if (ret) {
 		if (ret == 1)
@@ -3140,10 +3161,19 @@
 		 * rt_waiter. Also see the WARN in wake_futex_pi().
 		 */
 		raw_spin_lock_irq(&pi_state->pi_mutex.wait_lock);
+		/*
+		 * Magic trickery for now to make the RT migrate disable
+		 * logic happy. The following spin_unlock() happens with
+		 * interrupts disabled so the internal migrate_enable()
+		 * won't undo the migrate_disable() which was issued when
+		 * locking hb->lock.
+		 */
+		migrate_disable();
 		spin_unlock(&hb->lock);
 
 		/* drops pi_state->pi_mutex.wait_lock */
 		ret = wake_futex_pi(uaddr, uval, pi_state);
+		migrate_enable();
 
 		put_pi_state(pi_state);
 
@@ -3314,7 +3344,7 @@
 {
 	struct hrtimer_sleeper timeout, *to = NULL;
 	struct rt_mutex_waiter rt_waiter;
-	struct futex_hash_bucket *hb;
+	struct futex_hash_bucket *hb, *hb2;
 	union futex_key key2 = FUTEX_KEY_INIT;
 	struct futex_q q = futex_q_init;
 	int res, ret;
@@ -3330,10 +3360,9 @@
 
 	if (abs_time) {
 		to = &timeout;
-		hrtimer_init_on_stack(&to->timer, (flags & FLAGS_CLOCKRT) ?
-				      CLOCK_REALTIME : CLOCK_MONOTONIC,
-				      HRTIMER_MODE_ABS);
-		hrtimer_init_sleeper(to, current);
+		hrtimer_init_sleeper_on_stack(to, (flags & FLAGS_CLOCKRT) ?
+					      CLOCK_REALTIME : CLOCK_MONOTONIC,
+					      HRTIMER_MODE_ABS, current);
 		hrtimer_set_expires_range_ns(&to->timer, *abs_time,
 					     current->timer_slack_ns);
 	}
@@ -3342,7 +3371,7 @@
 	 * The waiter is allocated on our stack, manipulated by the requeue
 	 * code while we sleep on uaddr.
 	 */
-	rt_mutex_init_waiter(&rt_waiter);
+	rt_mutex_init_waiter(&rt_waiter, false);
 
 	ret = get_futex_key(uaddr2, flags & FLAGS_SHARED, &key2, VERIFY_WRITE);
 	if (unlikely(ret != 0))
@@ -3373,20 +3402,55 @@
 	/* Queue the futex_q, drop the hb lock, wait for wakeup. */
 	futex_wait_queue_me(hb, &q, to);
 
-	spin_lock(&hb->lock);
-	ret = handle_early_requeue_pi_wakeup(hb, &q, &key2, to);
-	spin_unlock(&hb->lock);
-	if (ret)
-		goto out_put_keys;
+	/*
+	 * On RT we must avoid races with requeue and trying to block
+	 * on two mutexes (hb->lock and uaddr2's rtmutex) by
+	 * serializing access to pi_blocked_on with pi_lock.
+	 */
+	raw_spin_lock_irq(&current->pi_lock);
+	if (current->pi_blocked_on) {
+		/*
+		 * We have been requeued or are in the process of
+		 * being requeued.
+		 */
+		raw_spin_unlock_irq(&current->pi_lock);
+	} else {
+		/*
+		 * Setting pi_blocked_on to PI_WAKEUP_INPROGRESS
+		 * prevents a concurrent requeue from moving us to the
+		 * uaddr2 rtmutex. After that we can safely acquire
+		 * (and possibly block on) hb->lock.
+		 */
+		current->pi_blocked_on = PI_WAKEUP_INPROGRESS;
+		raw_spin_unlock_irq(&current->pi_lock);
+
+		spin_lock(&hb->lock);
+
+		/*
+		 * Clean up pi_blocked_on. We might leak it otherwise
+		 * when we succeeded with the hb->lock in the fast
+		 * path.
+		 */
+		raw_spin_lock_irq(&current->pi_lock);
+		current->pi_blocked_on = NULL;
+		raw_spin_unlock_irq(&current->pi_lock);
+
+		ret = handle_early_requeue_pi_wakeup(hb, &q, &key2, to);
+		spin_unlock(&hb->lock);
+		if (ret)
+			goto out_put_keys;
+	}
 
 	/*
-	 * In order for us to be here, we know our q.key == key2, and since
-	 * we took the hb->lock above, we also know that futex_requeue() has
-	 * completed and we no longer have to concern ourselves with a wakeup
-	 * race with the atomic proxy lock acquisition by the requeue code. The
-	 * futex_requeue dropped our key1 reference and incremented our key2
-	 * reference count.
+	 * In order to be here, we have either been requeued, are in
+	 * the process of being requeued, or requeue successfully
+	 * acquired uaddr2 on our behalf.  If pi_blocked_on was
+	 * non-null above, we may be racing with a requeue.  Do not
+	 * rely on q->lock_ptr to be hb2->lock until after blocking on
+	 * hb->lock or hb2->lock. The futex_requeue dropped our key1
+	 * reference and incremented our key2 reference count.
 	 */
+	hb2 = hash_futex(&key2);
 
 	/* Check if the requeue code acquired the second futex for us. */
 	if (!q.rt_waiter) {
@@ -3395,14 +3459,15 @@
 		 * did a lock-steal - fix up the PI-state in that case.
 		 */
 		if (q.pi_state && (q.pi_state->owner != current)) {
-			spin_lock(q.lock_ptr);
+			spin_lock(&hb2->lock);
+			BUG_ON(&hb2->lock != q.lock_ptr);
 			ret = fixup_pi_state_owner(uaddr2, &q, current);
 			/*
 			 * Drop the reference to the pi state which
 			 * the requeue_pi() code acquired for us.
 			 */
 			put_pi_state(q.pi_state);
-			spin_unlock(q.lock_ptr);
+			spin_unlock(&hb2->lock);
 			/*
 			 * Adjust the return value. It's either -EFAULT or
 			 * success (1) but the caller expects 0 for success.
@@ -3421,7 +3486,8 @@
 		pi_mutex = &q.pi_state->pi_mutex;
 		ret = rt_mutex_wait_proxy_lock(pi_mutex, to, &rt_waiter);
 
-		spin_lock(q.lock_ptr);
+		spin_lock(&hb2->lock);
+		BUG_ON(&hb2->lock != q.lock_ptr);
 		if (ret && !rt_mutex_cleanup_proxy_lock(pi_mutex, &rt_waiter))
 			ret = 0;
 
diff --git a/kernel/kernel/irq/handle.c b/kernel/kernel/irq/handle.c
index 38554bc..06a80bb 100644
--- a/kernel/kernel/irq/handle.c
+++ b/kernel/kernel/irq/handle.c
@@ -185,10 +185,16 @@
 {
 	irqreturn_t retval;
 	unsigned int flags = 0;
+	struct pt_regs *regs = get_irq_regs();
+	u64 ip = regs ? instruction_pointer(regs) : 0;
 
 	retval = __handle_irq_event_percpu(desc, &flags);
 
-	add_interrupt_randomness(desc->irq_data.irq, flags);
+#ifdef CONFIG_PREEMPT_RT_FULL
+	desc->random_ip = ip;
+#else
+	add_interrupt_randomness(desc->irq_data.irq, flags, ip);
+#endif
 
 	if (!noirqdebug)
 		note_interrupt(desc, retval);
diff --git a/kernel/kernel/irq/manage.c b/kernel/kernel/irq/manage.c
index 39d6bc9..c7ee23f 100644
--- a/kernel/kernel/irq/manage.c
+++ b/kernel/kernel/irq/manage.c
@@ -24,6 +24,7 @@
 #include "internals.h"
 
 #ifdef CONFIG_IRQ_FORCED_THREADING
+# ifndef CONFIG_PREEMPT_RT_BASE
 __read_mostly bool force_irqthreads;
 EXPORT_SYMBOL_GPL(force_irqthreads);
 
@@ -33,6 +34,7 @@
 	return 0;
 }
 early_param("threadirqs", setup_forced_irqthreads);
+# endif
 #endif
 
 static void __synchronize_hardirq(struct irq_desc *desc, bool sync_chip)
@@ -1095,6 +1097,12 @@
 		if (action_ret == IRQ_WAKE_THREAD)
 			irq_wake_secondary(desc, action);
 
+#ifdef CONFIG_PREEMPT_RT_FULL
+		migrate_disable();
+		add_interrupt_randomness(action->irq, 0,
+				 desc->random_ip ^ (unsigned long) action);
+		migrate_enable();
+#endif
 		wake_threads_waitq(desc);
 	}
 
@@ -1506,6 +1514,9 @@
 			irq_settings_set_no_balancing(desc);
 			irqd_set(&desc->irq_data, IRQD_NO_BALANCING);
 		}
+
+		if (new->flags & IRQF_NO_SOFTIRQ_CALL)
+			irq_settings_set_no_softirq_call(desc);
 
 		if (irq_settings_can_autoenable(desc)) {
 			irq_startup(desc, IRQ_RESEND, IRQ_START_COND);
@@ -2312,7 +2323,7 @@
  *	This call sets the internal irqchip state of an interrupt,
  *	depending on the value of @which.
  *
- *	This function should be called with preemption disabled if the
+ *	This function should be called with migration disabled if the
  *	interrupt controller has per-cpu registers.
  */
 int irq_set_irqchip_state(unsigned int irq, enum irqchip_irq_state which,
diff --git a/kernel/kernel/irq/settings.h b/kernel/kernel/irq/settings.h
index e43795c..47e2f9e 100644
--- a/kernel/kernel/irq/settings.h
+++ b/kernel/kernel/irq/settings.h
@@ -17,6 +17,7 @@
 	_IRQ_PER_CPU_DEVID	= IRQ_PER_CPU_DEVID,
 	_IRQ_IS_POLLED		= IRQ_IS_POLLED,
 	_IRQ_DISABLE_UNLAZY	= IRQ_DISABLE_UNLAZY,
+	_IRQ_NO_SOFTIRQ_CALL	= IRQ_NO_SOFTIRQ_CALL,
 	_IRQF_MODIFY_MASK	= IRQF_MODIFY_MASK,
 };
 
@@ -31,6 +32,7 @@
 #define IRQ_PER_CPU_DEVID	GOT_YOU_MORON
 #define IRQ_IS_POLLED		GOT_YOU_MORON
 #define IRQ_DISABLE_UNLAZY	GOT_YOU_MORON
+#define IRQ_NO_SOFTIRQ_CALL	GOT_YOU_MORON
 #undef IRQF_MODIFY_MASK
 #define IRQF_MODIFY_MASK	GOT_YOU_MORON
 
@@ -41,6 +43,16 @@
 	desc->status_use_accessors |= (set & _IRQF_MODIFY_MASK);
 }
 
+static inline bool irq_settings_no_softirq_call(struct irq_desc *desc)
+{
+	return desc->status_use_accessors & _IRQ_NO_SOFTIRQ_CALL;
+}
+
+static inline void irq_settings_set_no_softirq_call(struct irq_desc *desc)
+{
+	desc->status_use_accessors |= _IRQ_NO_SOFTIRQ_CALL;
+}
+
 static inline bool irq_settings_is_per_cpu(struct irq_desc *desc)
 {
 	return desc->status_use_accessors & _IRQ_PER_CPU;
diff --git a/kernel/kernel/irq/spurious.c b/kernel/kernel/irq/spurious.c
index d867d6d..cd12ee8 100644
--- a/kernel/kernel/irq/spurious.c
+++ b/kernel/kernel/irq/spurious.c
@@ -442,6 +442,10 @@
 
 static int __init irqfixup_setup(char *str)
 {
+#ifdef CONFIG_PREEMPT_RT_BASE
+	pr_warn("irqfixup boot option not supported w/ CONFIG_PREEMPT_RT_BASE\n");
+	return 1;
+#endif
 	irqfixup = 1;
 	printk(KERN_WARNING "Misrouted IRQ fixup support enabled.\n");
 	printk(KERN_WARNING "This may impact system performance.\n");
@@ -454,6 +458,10 @@
 
 static int __init irqpoll_setup(char *str)
 {
+#ifdef CONFIG_PREEMPT_RT_BASE
+	pr_warn("irqpoll boot option not supported w/ CONFIG_PREEMPT_RT_BASE\n");
+	return 1;
+#endif
 	irqfixup = 2;
 	printk(KERN_WARNING "Misrouted IRQ fixup and polling support "
 				"enabled\n");
diff --git a/kernel/kernel/irq_work.c b/kernel/kernel/irq_work.c
index 7328891..b6d9d35 100644
--- a/kernel/kernel/irq_work.c
+++ b/kernel/kernel/irq_work.c
@@ -17,6 +17,7 @@
 #include <linux/cpu.h>
 #include <linux/notifier.h>
 #include <linux/smp.h>
+#include <linux/interrupt.h>
 #include <asm/processor.h>
 
 
@@ -57,29 +58,40 @@
 }
 
 /* Enqueue on current CPU, work must already be claimed and preempt disabled */
-static void __irq_work_queue_local(struct irq_work *work)
+static void __irq_work_queue_local(struct irq_work *work, struct llist_head *list)
 {
-	/* If the work is "lazy", handle it from next tick if any */
-	if (work->flags & IRQ_WORK_LAZY) {
-		if (llist_add(&work->llnode, this_cpu_ptr(&lazy_list)) &&
-		    tick_nohz_tick_stopped())
-			arch_irq_work_raise();
-	} else {
-		if (llist_add(&work->llnode, this_cpu_ptr(&raised_list)))
-			arch_irq_work_raise();
-	}
+	bool empty;
+
+	empty = llist_add(&work->llnode, list);
+
+	if (empty &&
+	    (!(work->flags & IRQ_WORK_LAZY) ||
+	     tick_nohz_tick_stopped()))
+		arch_irq_work_raise();
+}
+
+static inline bool use_lazy_list(struct irq_work *work)
+{
+	return (IS_ENABLED(CONFIG_PREEMPT_RT_FULL) && !(work->flags & IRQ_WORK_HARD_IRQ))
+		|| (work->flags & IRQ_WORK_LAZY);
 }
 
 /* Enqueue the irq work @work on the current CPU */
 bool irq_work_queue(struct irq_work *work)
 {
+	struct llist_head *list;
+
 	/* Only queue if not already pending */
 	if (!irq_work_claim(work))
 		return false;
 
 	/* Queue the entry and raise the IPI if needed. */
 	preempt_disable();
-	__irq_work_queue_local(work);
+	if (use_lazy_list(work))
+		list = this_cpu_ptr(&lazy_list);
+	else
+		list = this_cpu_ptr(&raised_list);
+	__irq_work_queue_local(work, list);
 	preempt_enable();
 
 	return true;
@@ -98,6 +110,8 @@
 	return irq_work_queue(work);
 
 #else /* CONFIG_SMP: */
+	struct llist_head *list;
+
 	/* All work should have been flushed before going offline */
 	WARN_ON_ONCE(cpu_is_offline(cpu));
 
@@ -106,13 +120,18 @@
 		return false;
 
 	preempt_disable();
+	if (use_lazy_list(work))
+		list = &per_cpu(lazy_list, cpu);
+	else
+		list = &per_cpu(raised_list, cpu);
+
 	if (cpu != smp_processor_id()) {
 		/* Arch remote IPI send/receive backend aren't NMI safe */
 		WARN_ON_ONCE(in_nmi());
-		if (llist_add(&work->llnode, &per_cpu(raised_list, cpu)))
+		if (llist_add(&work->llnode, list))
 			arch_send_call_function_single_ipi(cpu);
 	} else {
-		__irq_work_queue_local(work);
+		__irq_work_queue_local(work, list);
 	}
 	preempt_enable();
 
@@ -128,9 +147,8 @@
 	raised = this_cpu_ptr(&raised_list);
 	lazy = this_cpu_ptr(&lazy_list);
 
-	if (llist_empty(raised) || arch_irq_work_has_interrupt())
-		if (llist_empty(lazy))
-			return false;
+	if (llist_empty(raised) && llist_empty(lazy))
+		return false;
 
 	/* All work should have been flushed before going offline */
 	WARN_ON_ONCE(cpu_is_offline(smp_processor_id()));
@@ -144,8 +162,12 @@
 	struct llist_node *llnode;
 	unsigned long flags;
 
+#ifndef CONFIG_PREEMPT_RT_FULL
+	/*
+	 * nort: On RT IRQ-work may run in SOFTIRQ context.
+	 */
 	BUG_ON(!irqs_disabled());
-
+#endif
 	if (llist_empty(list))
 		return;
 
@@ -177,7 +199,16 @@
 void irq_work_run(void)
 {
 	irq_work_run_list(this_cpu_ptr(&raised_list));
-	irq_work_run_list(this_cpu_ptr(&lazy_list));
+	if (IS_ENABLED(CONFIG_PREEMPT_RT_FULL)) {
+		/*
+		 * NOTE: we raise softirq via IPI for safety,
+		 * and execute in irq_work_tick() to move the
+		 * overhead from hard to soft irq context.
+		 */
+		if (!llist_empty(this_cpu_ptr(&lazy_list)))
+			raise_softirq(TIMER_SOFTIRQ);
+	} else
+		irq_work_run_list(this_cpu_ptr(&lazy_list));
 }
 EXPORT_SYMBOL_GPL(irq_work_run);
 
@@ -187,8 +218,17 @@
 
 	if (!llist_empty(raised) && !arch_irq_work_has_interrupt())
 		irq_work_run_list(raised);
+
+	if (!IS_ENABLED(CONFIG_PREEMPT_RT_FULL))
+		irq_work_run_list(this_cpu_ptr(&lazy_list));
+}
+
+#if defined(CONFIG_IRQ_WORK) && defined(CONFIG_PREEMPT_RT_FULL)
+void irq_work_tick_soft(void)
+{
 	irq_work_run_list(this_cpu_ptr(&lazy_list));
 }
+#endif
 
 /*
  * Synchronize against the irq_work @entry, ensures the entry is not
diff --git a/kernel/kernel/ksysfs.c b/kernel/kernel/ksysfs.c
index d5fb460..a23135b 100644
--- a/kernel/kernel/ksysfs.c
+++ b/kernel/kernel/ksysfs.c
@@ -140,6 +140,15 @@
 
 #endif /* CONFIG_CRASH_CORE */
 
+#if defined(CONFIG_PREEMPT_RT_FULL)
+static ssize_t realtime_show(struct kobject *kobj,
+			     struct kobj_attribute *attr, char *buf)
+{
+	return sprintf(buf, "%d\n", 1);
+}
+KERNEL_ATTR_RO(realtime);
+#endif
+
 /* whether file capabilities are enabled */
 static ssize_t fscaps_show(struct kobject *kobj,
 				  struct kobj_attribute *attr, char *buf)
@@ -231,6 +240,9 @@
 	&rcu_expedited_attr.attr,
 	&rcu_normal_attr.attr,
 #endif
+#ifdef CONFIG_PREEMPT_RT_FULL
+	&realtime_attr.attr,
+#endif
 	NULL
 };
 
diff --git a/kernel/kernel/kthread.c b/kernel/kernel/kthread.c
index e7a8797..f09fe68 100644
--- a/kernel/kernel/kthread.c
+++ b/kernel/kernel/kthread.c
@@ -638,7 +638,7 @@
 				struct lock_class_key *key)
 {
 	memset(worker, 0, sizeof(struct kthread_worker));
-	spin_lock_init(&worker->lock);
+	raw_spin_lock_init(&worker->lock);
 	lockdep_set_class_and_name(&worker->lock, key, name);
 	INIT_LIST_HEAD(&worker->work_list);
 	INIT_LIST_HEAD(&worker->delayed_work_list);
@@ -680,21 +680,21 @@
 
 	if (kthread_should_stop()) {
 		__set_current_state(TASK_RUNNING);
-		spin_lock_irq(&worker->lock);
+		raw_spin_lock_irq(&worker->lock);
 		worker->task = NULL;
-		spin_unlock_irq(&worker->lock);
+		raw_spin_unlock_irq(&worker->lock);
 		return 0;
 	}
 
 	work = NULL;
-	spin_lock_irq(&worker->lock);
+	raw_spin_lock_irq(&worker->lock);
 	if (!list_empty(&worker->work_list)) {
 		work = list_first_entry(&worker->work_list,
 					struct kthread_work, node);
 		list_del_init(&work->node);
 	}
 	worker->current_work = work;
-	spin_unlock_irq(&worker->lock);
+	raw_spin_unlock_irq(&worker->lock);
 
 	if (work) {
 		__set_current_state(TASK_RUNNING);
@@ -851,12 +851,12 @@
 	bool ret = false;
 	unsigned long flags;
 
-	spin_lock_irqsave(&worker->lock, flags);
+	raw_spin_lock_irqsave(&worker->lock, flags);
 	if (!queuing_blocked(worker, work)) {
 		kthread_insert_work(worker, work, &worker->work_list);
 		ret = true;
 	}
-	spin_unlock_irqrestore(&worker->lock, flags);
+	raw_spin_unlock_irqrestore(&worker->lock, flags);
 	return ret;
 }
 EXPORT_SYMBOL_GPL(kthread_queue_work);
@@ -882,7 +882,7 @@
 	if (WARN_ON_ONCE(!worker))
 		return;
 
-	spin_lock(&worker->lock);
+	raw_spin_lock(&worker->lock);
 	/* Work must not be used with >1 worker, see kthread_queue_work(). */
 	WARN_ON_ONCE(work->worker != worker);
 
@@ -892,7 +892,7 @@
 	if (!work->canceling)
 		kthread_insert_work(worker, work, &worker->work_list);
 
-	spin_unlock(&worker->lock);
+	raw_spin_unlock(&worker->lock);
 }
 EXPORT_SYMBOL(kthread_delayed_work_timer_fn);
 
@@ -948,14 +948,14 @@
 	unsigned long flags;
 	bool ret = false;
 
-	spin_lock_irqsave(&worker->lock, flags);
+	raw_spin_lock_irqsave(&worker->lock, flags);
 
 	if (!queuing_blocked(worker, work)) {
 		__kthread_queue_delayed_work(worker, dwork, delay);
 		ret = true;
 	}
 
-	spin_unlock_irqrestore(&worker->lock, flags);
+	raw_spin_unlock_irqrestore(&worker->lock, flags);
 	return ret;
 }
 EXPORT_SYMBOL_GPL(kthread_queue_delayed_work);
@@ -991,7 +991,7 @@
 	if (!worker)
 		return;
 
-	spin_lock_irq(&worker->lock);
+	raw_spin_lock_irq(&worker->lock);
 	/* Work must not be used with >1 worker, see kthread_queue_work(). */
 	WARN_ON_ONCE(work->worker != worker);
 
@@ -1003,7 +1003,7 @@
 	else
 		noop = true;
 
-	spin_unlock_irq(&worker->lock);
+	raw_spin_unlock_irq(&worker->lock);
 
 	if (!noop)
 		wait_for_completion(&fwork.done);
@@ -1031,9 +1031,9 @@
 	 * any queuing is blocked by setting the canceling counter.
 	 */
 	work->canceling++;
-	spin_unlock_irqrestore(&worker->lock, *flags);
+	raw_spin_unlock_irqrestore(&worker->lock, *flags);
 	del_timer_sync(&dwork->timer);
-	spin_lock_irqsave(&worker->lock, *flags);
+	raw_spin_lock_irqsave(&worker->lock, *flags);
 	work->canceling--;
 }
 
@@ -1095,7 +1095,7 @@
 	unsigned long flags;
 	int ret = false;
 
-	spin_lock_irqsave(&worker->lock, flags);
+	raw_spin_lock_irqsave(&worker->lock, flags);
 
 	/* Do not bother with canceling when never queued. */
 	if (!work->worker)
@@ -1124,7 +1124,7 @@
 fast_queue:
 	__kthread_queue_delayed_work(worker, dwork, delay);
 out:
-	spin_unlock_irqrestore(&worker->lock, flags);
+	raw_spin_unlock_irqrestore(&worker->lock, flags);
 	return ret;
 }
 EXPORT_SYMBOL_GPL(kthread_mod_delayed_work);
@@ -1138,7 +1138,7 @@
 	if (!worker)
 		goto out;
 
-	spin_lock_irqsave(&worker->lock, flags);
+	raw_spin_lock_irqsave(&worker->lock, flags);
 	/* Work must not be used with >1 worker, see kthread_queue_work(). */
 	WARN_ON_ONCE(work->worker != worker);
 
@@ -1155,13 +1155,13 @@
 	 * In the meantime, block any queuing by setting the canceling counter.
 	 */
 	work->canceling++;
-	spin_unlock_irqrestore(&worker->lock, flags);
+	raw_spin_unlock_irqrestore(&worker->lock, flags);
 	kthread_flush_work(work);
-	spin_lock_irqsave(&worker->lock, flags);
+	raw_spin_lock_irqsave(&worker->lock, flags);
 	work->canceling--;
 
 out_fast:
-	spin_unlock_irqrestore(&worker->lock, flags);
+	raw_spin_unlock_irqrestore(&worker->lock, flags);
 out:
 	return ret;
 }
diff --git a/kernel/kernel/locking/Makefile b/kernel/kernel/locking/Makefile
index 392c7f2..c0bf04b 100644
--- a/kernel/kernel/locking/Makefile
+++ b/kernel/kernel/locking/Makefile
@@ -3,7 +3,7 @@
 # and is generally not a function of system call inputs.
 KCOV_INSTRUMENT		:= n
 
-obj-y += mutex.o semaphore.o rwsem.o percpu-rwsem.o
+obj-y += semaphore.o percpu-rwsem.o
 
 ifdef CONFIG_FUNCTION_TRACER
 CFLAGS_REMOVE_lockdep.o = $(CC_FLAGS_FTRACE)
@@ -12,7 +12,11 @@
 CFLAGS_REMOVE_rtmutex-debug.o = $(CC_FLAGS_FTRACE)
 endif
 
+ifneq ($(CONFIG_PREEMPT_RT_FULL),y)
+obj-y += mutex.o
 obj-$(CONFIG_DEBUG_MUTEXES) += mutex-debug.o
+endif
+obj-y += rwsem.o
 obj-$(CONFIG_LOCKDEP) += lockdep.o
 ifeq ($(CONFIG_PROC_FS),y)
 obj-$(CONFIG_LOCKDEP) += lockdep_proc.o
@@ -25,8 +29,11 @@
 obj-$(CONFIG_DEBUG_RT_MUTEXES) += rtmutex-debug.o
 obj-$(CONFIG_DEBUG_SPINLOCK) += spinlock.o
 obj-$(CONFIG_DEBUG_SPINLOCK) += spinlock_debug.o
+ifneq ($(CONFIG_PREEMPT_RT_FULL),y)
 obj-$(CONFIG_RWSEM_GENERIC_SPINLOCK) += rwsem-spinlock.o
 obj-$(CONFIG_RWSEM_XCHGADD_ALGORITHM) += rwsem-xadd.o
+endif
+obj-$(CONFIG_PREEMPT_RT_FULL) += mutex-rt.o rwsem-rt.o rwlock-rt.o
 obj-$(CONFIG_QUEUED_RWLOCKS) += qrwlock.o
 obj-$(CONFIG_LOCK_TORTURE_TEST) += locktorture.o
 obj-$(CONFIG_WW_MUTEX_SELFTEST) += test-ww_mutex.o
diff --git a/kernel/kernel/locking/lockdep.c b/kernel/kernel/locking/lockdep.c
index 4dc79f5..4dd8342 100644
--- a/kernel/kernel/locking/lockdep.c
+++ b/kernel/kernel/locking/lockdep.c
@@ -3831,6 +3831,7 @@
 		}
 	}
 
+#ifndef CONFIG_PREEMPT_RT_FULL
 	/*
 	 * We dont accurately track softirq state in e.g.
 	 * hardirq contexts (such as on 4KSTACKS), so only
@@ -3845,6 +3846,7 @@
 			DEBUG_LOCKS_WARN_ON(!current->softirqs_enabled);
 		}
 	}
+#endif
 
 	if (!debug_locks)
 		print_irqtrace_events(current);
diff --git a/kernel/kernel/locking/locktorture.c b/kernel/kernel/locking/locktorture.c
index 95395ef..5748c19 100644
--- a/kernel/kernel/locking/locktorture.c
+++ b/kernel/kernel/locking/locktorture.c
@@ -29,7 +29,6 @@
 #include <linux/kthread.h>
 #include <linux/sched/rt.h>
 #include <linux/spinlock.h>
-#include <linux/rwlock.h>
 #include <linux/mutex.h>
 #include <linux/rwsem.h>
 #include <linux/smp.h>
diff --git a/kernel/kernel/locking/mutex-rt.c b/kernel/kernel/locking/mutex-rt.c
new file mode 100644
index 0000000..4f81595
--- /dev/null
+++ b/kernel/kernel/locking/mutex-rt.c
@@ -0,0 +1,223 @@
+/*
+ * kernel/rt.c
+ *
+ * Real-Time Preemption Support
+ *
+ * started by Ingo Molnar:
+ *
+ *  Copyright (C) 2004-2006 Red Hat, Inc., Ingo Molnar <mingo@redhat.com>
+ *  Copyright (C) 2006, Timesys Corp., Thomas Gleixner <tglx@timesys.com>
+ *
+ * historic credit for proving that Linux spinlocks can be implemented via
+ * RT-aware mutexes goes to many people: The Pmutex project (Dirk Grambow
+ * and others) who prototyped it on 2.4 and did lots of comparative
+ * research and analysis; TimeSys, for proving that you can implement a
+ * fully preemptible kernel via the use of IRQ threading and mutexes;
+ * Bill Huey for persuasively arguing on lkml that the mutex model is the
+ * right one; and to MontaVista, who ported pmutexes to 2.6.
+ *
+ * This code is a from-scratch implementation and is not based on pmutexes,
+ * but the idea of converting spinlocks to mutexes is used here too.
+ *
+ * lock debugging, locking tree, deadlock detection:
+ *
+ *  Copyright (C) 2004, LynuxWorks, Inc., Igor Manyilov, Bill Huey
+ *  Released under the General Public License (GPL).
+ *
+ * Includes portions of the generic R/W semaphore implementation from:
+ *
+ *  Copyright (c) 2001   David Howells (dhowells@redhat.com).
+ *  - Derived partially from idea by Andrea Arcangeli <andrea@suse.de>
+ *  - Derived also from comments by Linus
+ *
+ * Pending ownership of locks and ownership stealing:
+ *
+ *  Copyright (C) 2005, Kihon Technologies Inc., Steven Rostedt
+ *
+ *   (also by Steven Rostedt)
+ *    - Converted single pi_lock to individual task locks.
+ *
+ * By Esben Nielsen:
+ *    Doing priority inheritance with help of the scheduler.
+ *
+ *  Copyright (C) 2006, Timesys Corp., Thomas Gleixner <tglx@timesys.com>
+ *  - major rework based on Esben Nielsens initial patch
+ *  - replaced thread_info references by task_struct refs
+ *  - removed task->pending_owner dependency
+ *  - BKL drop/reacquire for semaphore style locks to avoid deadlocks
+ *    in the scheduler return path as discussed with Steven Rostedt
+ *
+ *  Copyright (C) 2006, Kihon Technologies Inc.
+ *    Steven Rostedt <rostedt@goodmis.org>
+ *  - debugged and patched Thomas Gleixner's rework.
+ *  - added back the cmpxchg to the rework.
+ *  - turned atomic require back on for SMP.
+ */
+
+#include <linux/spinlock.h>
+#include <linux/rtmutex.h>
+#include <linux/sched.h>
+#include <linux/delay.h>
+#include <linux/module.h>
+#include <linux/kallsyms.h>
+#include <linux/syscalls.h>
+#include <linux/interrupt.h>
+#include <linux/plist.h>
+#include <linux/fs.h>
+#include <linux/futex.h>
+#include <linux/hrtimer.h>
+
+#include "rtmutex_common.h"
+
+/*
+ * struct mutex functions
+ */
+void __mutex_do_init(struct mutex *mutex, const char *name,
+		     struct lock_class_key *key)
+{
+#ifdef CONFIG_DEBUG_LOCK_ALLOC
+	/*
+	 * Make sure we are not reinitializing a held lock:
+	 */
+	debug_check_no_locks_freed((void *)mutex, sizeof(*mutex));
+	lockdep_init_map(&mutex->dep_map, name, key, 0);
+#endif
+	mutex->lock.save_state = 0;
+}
+EXPORT_SYMBOL(__mutex_do_init);
+
+void __lockfunc _mutex_lock(struct mutex *lock)
+{
+	mutex_acquire(&lock->dep_map, 0, 0, _RET_IP_);
+	__rt_mutex_lock_state(&lock->lock, TASK_UNINTERRUPTIBLE);
+}
+EXPORT_SYMBOL(_mutex_lock);
+
+void __lockfunc _mutex_lock_io(struct mutex *lock)
+{
+	int token;
+
+	token = io_schedule_prepare();
+	_mutex_lock(lock);
+	io_schedule_finish(token);
+}
+EXPORT_SYMBOL_GPL(_mutex_lock_io);
+
+int __lockfunc _mutex_lock_interruptible(struct mutex *lock)
+{
+	int ret;
+
+	mutex_acquire(&lock->dep_map, 0, 0, _RET_IP_);
+	ret = __rt_mutex_lock_state(&lock->lock, TASK_INTERRUPTIBLE);
+	if (ret)
+		mutex_release(&lock->dep_map, 1, _RET_IP_);
+	return ret;
+}
+EXPORT_SYMBOL(_mutex_lock_interruptible);
+
+int __lockfunc _mutex_lock_killable(struct mutex *lock)
+{
+	int ret;
+
+	mutex_acquire(&lock->dep_map, 0, 0, _RET_IP_);
+	ret = __rt_mutex_lock_state(&lock->lock, TASK_KILLABLE);
+	if (ret)
+		mutex_release(&lock->dep_map, 1, _RET_IP_);
+	return ret;
+}
+EXPORT_SYMBOL(_mutex_lock_killable);
+
+#ifdef CONFIG_DEBUG_LOCK_ALLOC
+void __lockfunc _mutex_lock_nested(struct mutex *lock, int subclass)
+{
+	mutex_acquire_nest(&lock->dep_map, subclass, 0, NULL, _RET_IP_);
+	__rt_mutex_lock_state(&lock->lock, TASK_UNINTERRUPTIBLE);
+}
+EXPORT_SYMBOL(_mutex_lock_nested);
+
+void __lockfunc _mutex_lock_io_nested(struct mutex *lock, int subclass)
+{
+	int token;
+
+	token = io_schedule_prepare();
+
+	mutex_acquire_nest(&lock->dep_map, subclass, 0, NULL, _RET_IP_);
+	__rt_mutex_lock_state(&lock->lock, TASK_UNINTERRUPTIBLE);
+
+	io_schedule_finish(token);
+}
+EXPORT_SYMBOL_GPL(_mutex_lock_io_nested);
+
+void __lockfunc _mutex_lock_nest_lock(struct mutex *lock, struct lockdep_map *nest)
+{
+	mutex_acquire_nest(&lock->dep_map, 0, 0, nest, _RET_IP_);
+	__rt_mutex_lock_state(&lock->lock, TASK_UNINTERRUPTIBLE);
+}
+EXPORT_SYMBOL(_mutex_lock_nest_lock);
+
+int __lockfunc _mutex_lock_interruptible_nested(struct mutex *lock, int subclass)
+{
+	int ret;
+
+	mutex_acquire_nest(&lock->dep_map, subclass, 0, NULL, _RET_IP_);
+	ret = __rt_mutex_lock_state(&lock->lock, TASK_INTERRUPTIBLE);
+	if (ret)
+		mutex_release(&lock->dep_map, 1, _RET_IP_);
+	return ret;
+}
+EXPORT_SYMBOL(_mutex_lock_interruptible_nested);
+
+int __lockfunc _mutex_lock_killable_nested(struct mutex *lock, int subclass)
+{
+	int ret;
+
+	mutex_acquire(&lock->dep_map, subclass, 0, _RET_IP_);
+	ret = __rt_mutex_lock_state(&lock->lock, TASK_KILLABLE);
+	if (ret)
+		mutex_release(&lock->dep_map, 1, _RET_IP_);
+	return ret;
+}
+EXPORT_SYMBOL(_mutex_lock_killable_nested);
+#endif
+
+int __lockfunc _mutex_trylock(struct mutex *lock)
+{
+	int ret = __rt_mutex_trylock(&lock->lock);
+
+	if (ret)
+		mutex_acquire(&lock->dep_map, 0, 1, _RET_IP_);
+
+	return ret;
+}
+EXPORT_SYMBOL(_mutex_trylock);
+
+void __lockfunc _mutex_unlock(struct mutex *lock)
+{
+	mutex_release(&lock->dep_map, 1, _RET_IP_);
+	__rt_mutex_unlock(&lock->lock);
+}
+EXPORT_SYMBOL(_mutex_unlock);
+
+/**
+ * atomic_dec_and_mutex_lock - return holding mutex if we dec to 0
+ * @cnt: the atomic which we are to dec
+ * @lock: the mutex to return holding if we dec to 0
+ *
+ * return true and hold lock if we dec to 0, return false otherwise
+ */
+int atomic_dec_and_mutex_lock(atomic_t *cnt, struct mutex *lock)
+{
+	/* dec if we can't possibly hit 0 */
+	if (atomic_add_unless(cnt, -1, 1))
+		return 0;
+	/* we might hit 0, so take the lock */
+	mutex_lock(lock);
+	if (!atomic_dec_and_test(cnt)) {
+		/* when we actually did the dec, we didn't hit 0 */
+		mutex_unlock(lock);
+		return 0;
+	}
+	/* we hit 0, and we hold the lock */
+	return 1;
+}
+EXPORT_SYMBOL(atomic_dec_and_mutex_lock);
diff --git a/kernel/kernel/locking/rtmutex.c b/kernel/kernel/locking/rtmutex.c
index a5ec4f6..fe5153f 100644
--- a/kernel/kernel/locking/rtmutex.c
+++ b/kernel/kernel/locking/rtmutex.c
@@ -7,6 +7,11 @@
  *  Copyright (C) 2005-2006 Timesys Corp., Thomas Gleixner <tglx@timesys.com>
  *  Copyright (C) 2005 Kihon Technologies Inc., Steven Rostedt
  *  Copyright (C) 2006 Esben Nielsen
+ *  Adaptive Spinlocks:
+ *  Copyright (C) 2008 Novell, Inc., Gregory Haskins, Sven Dietrich,
+ *				     and Peter Morreale,
+ * Adaptive Spinlocks simplification:
+ *  Copyright (C) 2008 Red Hat, Inc., Steven Rostedt <srostedt@redhat.com>
  *
  *  See Documentation/locking/rt-mutex-design.txt for details.
  */
@@ -18,6 +23,8 @@
 #include <linux/sched/wake_q.h>
 #include <linux/sched/debug.h>
 #include <linux/timer.h>
+#include <linux/ww_mutex.h>
+#include <linux/blkdev.h>
 
 #include "rtmutex_common.h"
 
@@ -135,6 +142,12 @@
 		WRITE_ONCE(*p, owner & ~RT_MUTEX_HAS_WAITERS);
 }
 
+static int rt_mutex_real_waiter(struct rt_mutex_waiter *waiter)
+{
+	return waiter && waiter != PI_WAKEUP_INPROGRESS &&
+		waiter != PI_REQUEUE_INPROGRESS;
+}
+
 /*
  * We can speed up the acquire/release, if there's no debugging state to be
  * set up.
@@ -228,7 +241,7 @@
  * Only use with rt_mutex_waiter_{less,equal}()
  */
 #define task_to_waiter(p)	\
-	&(struct rt_mutex_waiter){ .prio = (p)->prio, .deadline = (p)->dl.deadline }
+	&(struct rt_mutex_waiter){ .prio = (p)->prio, .deadline = (p)->dl.deadline, .task = (p) }
 
 static inline int
 rt_mutex_waiter_less(struct rt_mutex_waiter *left,
@@ -266,6 +279,27 @@
 		return left->deadline == right->deadline;
 
 	return 1;
+}
+
+#define STEAL_NORMAL  0
+#define STEAL_LATERAL 1
+
+static inline int
+rt_mutex_steal(struct rt_mutex *lock, struct rt_mutex_waiter *waiter, int mode)
+{
+	struct rt_mutex_waiter *top_waiter = rt_mutex_top_waiter(lock);
+
+	if (waiter == top_waiter || rt_mutex_waiter_less(waiter, top_waiter))
+		return 1;
+
+	/*
+	 * Note that RT tasks are excluded from lateral-steals
+	 * to prevent the introduction of an unbounded latency.
+	 */
+	if (mode == STEAL_NORMAL || rt_task(waiter->task))
+		return 0;
+
+	return rt_mutex_waiter_equal(waiter, top_waiter);
 }
 
 static void
@@ -372,6 +406,14 @@
 	return debug_rt_mutex_detect_deadlock(waiter, chwalk);
 }
 
+static void rt_mutex_wake_waiter(struct rt_mutex_waiter *waiter)
+{
+	if (waiter->savestate)
+		wake_up_lock_sleeper(waiter->task);
+	else
+		wake_up_process(waiter->task);
+}
+
 /*
  * Max number of times we'll walk the boosting chain:
  */
@@ -379,7 +421,8 @@
 
 static inline struct rt_mutex *task_blocked_on_lock(struct task_struct *p)
 {
-	return p->pi_blocked_on ? p->pi_blocked_on->lock : NULL;
+	return rt_mutex_real_waiter(p->pi_blocked_on) ?
+		p->pi_blocked_on->lock : NULL;
 }
 
 /*
@@ -515,7 +558,7 @@
 	 * reached or the state of the chain has changed while we
 	 * dropped the locks.
 	 */
-	if (!waiter)
+	if (!rt_mutex_real_waiter(waiter))
 		goto out_unlock_pi;
 
 	/*
@@ -696,13 +739,16 @@
 	 * follow here. This is the end of the chain we are walking.
 	 */
 	if (!rt_mutex_owner(lock)) {
+		struct rt_mutex_waiter *lock_top_waiter;
+
 		/*
 		 * If the requeue [7] above changed the top waiter,
 		 * then we need to wake the new top waiter up to try
 		 * to get the lock.
 		 */
-		if (prerequeue_top_waiter != rt_mutex_top_waiter(lock))
-			wake_up_process(rt_mutex_top_waiter(lock)->task);
+		lock_top_waiter = rt_mutex_top_waiter(lock);
+		if (prerequeue_top_waiter != lock_top_waiter)
+			rt_mutex_wake_waiter(lock_top_waiter);
 		raw_spin_unlock_irq(&lock->wait_lock);
 		return 0;
 	}
@@ -804,9 +850,11 @@
  * @task:   The task which wants to acquire the lock
  * @waiter: The waiter that is queued to the lock's wait tree if the
  *	    callsite called task_blocked_on_lock(), otherwise NULL
+ * @mode:   Lock steal mode (STEAL_NORMAL, STEAL_LATERAL)
  */
-static int try_to_take_rt_mutex(struct rt_mutex *lock, struct task_struct *task,
-				struct rt_mutex_waiter *waiter)
+static int __try_to_take_rt_mutex(struct rt_mutex *lock,
+				  struct task_struct *task,
+				  struct rt_mutex_waiter *waiter, int mode)
 {
 	lockdep_assert_held(&lock->wait_lock);
 
@@ -842,12 +890,11 @@
 	 */
 	if (waiter) {
 		/*
-		 * If waiter is not the highest priority waiter of
-		 * @lock, give up.
+		 * If waiter is not the highest priority waiter of @lock,
+		 * or its peer when lateral steal is allowed, give up.
 		 */
-		if (waiter != rt_mutex_top_waiter(lock))
+		if (!rt_mutex_steal(lock, waiter, mode))
 			return 0;
-
 		/*
 		 * We can acquire the lock. Remove the waiter from the
 		 * lock waiters tree.
@@ -865,14 +912,12 @@
 		 */
 		if (rt_mutex_has_waiters(lock)) {
 			/*
-			 * If @task->prio is greater than or equal to
-			 * the top waiter priority (kernel view),
-			 * @task lost.
+			 * If @task->prio is greater than the top waiter
+			 * priority (kernel view), or equal to it when a
+			 * lateral steal is forbidden, @task lost.
 			 */
-			if (!rt_mutex_waiter_less(task_to_waiter(task),
-						  rt_mutex_top_waiter(lock)))
+			if (!rt_mutex_steal(lock, task_to_waiter(task), mode))
 				return 0;
-
 			/*
 			 * The current top waiter stays enqueued. We
 			 * don't have to change anything in the lock
@@ -919,6 +964,344 @@
 	return 1;
 }
 
+#ifdef CONFIG_PREEMPT_RT_FULL
+/*
+ * preemptible spin_lock functions:
+ */
+static inline void rt_spin_lock_fastlock(struct rt_mutex *lock,
+					 void  (*slowfn)(struct rt_mutex *lock))
+{
+	might_sleep_no_state_check();
+
+	if (likely(rt_mutex_cmpxchg_acquire(lock, NULL, current)))
+		return;
+	else
+		slowfn(lock);
+}
+
+static inline void rt_spin_lock_fastunlock(struct rt_mutex *lock,
+					   void  (*slowfn)(struct rt_mutex *lock))
+{
+	if (likely(rt_mutex_cmpxchg_release(lock, current, NULL)))
+		return;
+	else
+		slowfn(lock);
+}
+#ifdef CONFIG_SMP
+/*
+ * Note that owner is a speculative pointer and dereferencing relies
+ * on rcu_read_lock() and the check against the lock owner.
+ */
+static int adaptive_wait(struct rt_mutex *lock,
+			 struct task_struct *owner)
+{
+	int res = 0;
+
+	rcu_read_lock();
+	for (;;) {
+		if (owner != rt_mutex_owner(lock))
+			break;
+		/*
+		 * Ensure that owner->on_cpu is dereferenced _after_
+		 * checking the above to be valid.
+		 */
+		barrier();
+		if (!owner->on_cpu) {
+			res = 1;
+			break;
+		}
+		cpu_relax();
+	}
+	rcu_read_unlock();
+	return res;
+}
+#else
+static int adaptive_wait(struct rt_mutex *lock,
+			 struct task_struct *orig_owner)
+{
+	return 1;
+}
+#endif
+
+static int task_blocks_on_rt_mutex(struct rt_mutex *lock,
+				   struct rt_mutex_waiter *waiter,
+				   struct task_struct *task,
+				   enum rtmutex_chainwalk chwalk);
+/*
+ * Slow path lock function spin_lock style: this variant is very
+ * careful not to miss any non-lock wakeups.
+ *
+ * We store the current state under p->pi_lock in p->saved_state and
+ * the try_to_wake_up() code handles this accordingly.
+ */
+void __sched rt_spin_lock_slowlock_locked(struct rt_mutex *lock,
+					  struct rt_mutex_waiter *waiter,
+					  unsigned long flags)
+{
+	struct task_struct *lock_owner, *self = current;
+	struct rt_mutex_waiter *top_waiter;
+	int ret;
+
+	if (__try_to_take_rt_mutex(lock, self, NULL, STEAL_LATERAL))
+		return;
+
+	BUG_ON(rt_mutex_owner(lock) == self);
+
+	/*
+	 * We save whatever state the task is in and we'll restore it
+	 * after acquiring the lock taking real wakeups into account
+	 * as well. We are serialized via pi_lock against wakeups. See
+	 * try_to_wake_up().
+	 */
+	raw_spin_lock(&self->pi_lock);
+	self->saved_state = self->state;
+	__set_current_state_no_track(TASK_UNINTERRUPTIBLE);
+	raw_spin_unlock(&self->pi_lock);
+
+	ret = task_blocks_on_rt_mutex(lock, waiter, self, RT_MUTEX_MIN_CHAINWALK);
+	BUG_ON(ret);
+
+	for (;;) {
+		/* Try to acquire the lock again. */
+		if (__try_to_take_rt_mutex(lock, self, waiter, STEAL_LATERAL))
+			break;
+
+		top_waiter = rt_mutex_top_waiter(lock);
+		lock_owner = rt_mutex_owner(lock);
+
+		raw_spin_unlock_irqrestore(&lock->wait_lock, flags);
+
+		debug_rt_mutex_print_deadlock(waiter);
+
+		if (top_waiter != waiter || adaptive_wait(lock, lock_owner))
+			schedule();
+
+		raw_spin_lock_irqsave(&lock->wait_lock, flags);
+
+		raw_spin_lock(&self->pi_lock);
+		__set_current_state_no_track(TASK_UNINTERRUPTIBLE);
+		raw_spin_unlock(&self->pi_lock);
+	}
+
+	/*
+	 * Restore the task state to current->saved_state. We set it
+	 * to the original state above and the try_to_wake_up() code
+	 * has possibly updated it when a real (non-rtmutex) wakeup
+	 * happened while we were blocked. Clear saved_state so
+	 * try_to_wakeup() does not get confused.
+	 */
+	raw_spin_lock(&self->pi_lock);
+	__set_current_state_no_track(self->saved_state);
+	self->saved_state = TASK_RUNNING;
+	raw_spin_unlock(&self->pi_lock);
+
+	/*
+	 * try_to_take_rt_mutex() sets the waiter bit
+	 * unconditionally. We might have to fix that up:
+	 */
+	fixup_rt_mutex_waiters(lock);
+
+	BUG_ON(rt_mutex_has_waiters(lock) && waiter == rt_mutex_top_waiter(lock));
+	BUG_ON(!RB_EMPTY_NODE(&waiter->tree_entry));
+}
+
+static void noinline __sched rt_spin_lock_slowlock(struct rt_mutex *lock)
+{
+	struct rt_mutex_waiter waiter;
+	unsigned long flags;
+
+	rt_mutex_init_waiter(&waiter, true);
+
+	raw_spin_lock_irqsave(&lock->wait_lock, flags);
+	rt_spin_lock_slowlock_locked(lock, &waiter, flags);
+	raw_spin_unlock_irqrestore(&lock->wait_lock, flags);
+	debug_rt_mutex_free_waiter(&waiter);
+}
+
+static bool __sched __rt_mutex_unlock_common(struct rt_mutex *lock,
+					     struct wake_q_head *wake_q,
+					     struct wake_q_head *wq_sleeper);
+/*
+ * Slow path to release a rt_mutex spin_lock style
+ */
+void __sched rt_spin_lock_slowunlock(struct rt_mutex *lock)
+{
+	unsigned long flags;
+	DEFINE_WAKE_Q(wake_q);
+	DEFINE_WAKE_Q(wake_sleeper_q);
+	bool postunlock;
+
+	raw_spin_lock_irqsave(&lock->wait_lock, flags);
+	postunlock = __rt_mutex_unlock_common(lock, &wake_q, &wake_sleeper_q);
+	raw_spin_unlock_irqrestore(&lock->wait_lock, flags);
+
+	if (postunlock)
+		rt_mutex_postunlock(&wake_q, &wake_sleeper_q);
+}
+
+void __lockfunc rt_spin_lock(spinlock_t *lock)
+{
+	sleeping_lock_inc();
+	rcu_read_lock();
+	migrate_disable();
+	spin_acquire(&lock->dep_map, 0, 0, _RET_IP_);
+	rt_spin_lock_fastlock(&lock->lock, rt_spin_lock_slowlock);
+}
+EXPORT_SYMBOL(rt_spin_lock);
+
+void __lockfunc __rt_spin_lock(struct rt_mutex *lock)
+{
+	rt_spin_lock_fastlock(lock, rt_spin_lock_slowlock);
+}
+
+#ifdef CONFIG_DEBUG_LOCK_ALLOC
+void __lockfunc rt_spin_lock_nested(spinlock_t *lock, int subclass)
+{
+	sleeping_lock_inc();
+	rcu_read_lock();
+	migrate_disable();
+	spin_acquire(&lock->dep_map, subclass, 0, _RET_IP_);
+	rt_spin_lock_fastlock(&lock->lock, rt_spin_lock_slowlock);
+}
+EXPORT_SYMBOL(rt_spin_lock_nested);
+#endif
+
+void __lockfunc rt_spin_unlock(spinlock_t *lock)
+{
+	/* NOTE: we always pass in '1' for nested, for simplicity */
+	spin_release(&lock->dep_map, 1, _RET_IP_);
+	rt_spin_lock_fastunlock(&lock->lock, rt_spin_lock_slowunlock);
+	migrate_enable();
+	rcu_read_unlock();
+	sleeping_lock_dec();
+}
+EXPORT_SYMBOL(rt_spin_unlock);
+
+void __lockfunc __rt_spin_unlock(struct rt_mutex *lock)
+{
+	rt_spin_lock_fastunlock(lock, rt_spin_lock_slowunlock);
+}
+EXPORT_SYMBOL(__rt_spin_unlock);
+
+/*
+ * Wait for the lock to get unlocked: instead of polling for an unlock
+ * (like raw spinlocks do), we lock and unlock, to force the kernel to
+ * schedule if there's contention:
+ */
+void __lockfunc rt_spin_unlock_wait(spinlock_t *lock)
+{
+	spin_lock(lock);
+	spin_unlock(lock);
+}
+EXPORT_SYMBOL(rt_spin_unlock_wait);
+
+int __lockfunc rt_spin_trylock(spinlock_t *lock)
+{
+	int ret;
+
+	sleeping_lock_inc();
+	migrate_disable();
+	ret = __rt_mutex_trylock(&lock->lock);
+	if (ret) {
+		spin_acquire(&lock->dep_map, 0, 1, _RET_IP_);
+		rcu_read_lock();
+	} else {
+		migrate_enable();
+		sleeping_lock_dec();
+	}
+	return ret;
+}
+EXPORT_SYMBOL(rt_spin_trylock);
+
+int __lockfunc rt_spin_trylock_bh(spinlock_t *lock)
+{
+	int ret;
+
+	local_bh_disable();
+	ret = __rt_mutex_trylock(&lock->lock);
+	if (ret) {
+		sleeping_lock_inc();
+		rcu_read_lock();
+		migrate_disable();
+		spin_acquire(&lock->dep_map, 0, 1, _RET_IP_);
+	} else
+		local_bh_enable();
+	return ret;
+}
+EXPORT_SYMBOL(rt_spin_trylock_bh);
+
+int __lockfunc rt_spin_trylock_irqsave(spinlock_t *lock, unsigned long *flags)
+{
+	int ret;
+
+	*flags = 0;
+	ret = __rt_mutex_trylock(&lock->lock);
+	if (ret) {
+		sleeping_lock_inc();
+		rcu_read_lock();
+		migrate_disable();
+		spin_acquire(&lock->dep_map, 0, 1, _RET_IP_);
+	}
+	return ret;
+}
+EXPORT_SYMBOL(rt_spin_trylock_irqsave);
+
+void
+__rt_spin_lock_init(spinlock_t *lock, const char *name, struct lock_class_key *key)
+{
+#ifdef CONFIG_DEBUG_LOCK_ALLOC
+	/*
+	 * Make sure we are not reinitializing a held lock:
+	 */
+	debug_check_no_locks_freed((void *)lock, sizeof(*lock));
+	lockdep_init_map(&lock->dep_map, name, key, 0);
+#endif
+}
+EXPORT_SYMBOL(__rt_spin_lock_init);
+
+#endif /* PREEMPT_RT_FULL */
+
+#ifdef CONFIG_PREEMPT_RT_FULL
+	static inline int __sched
+__mutex_lock_check_stamp(struct rt_mutex *lock, struct ww_acquire_ctx *ctx)
+{
+	struct ww_mutex *ww = container_of(lock, struct ww_mutex, base.lock);
+	struct ww_acquire_ctx *hold_ctx = READ_ONCE(ww->ctx);
+
+	if (!hold_ctx)
+		return 0;
+
+	if (unlikely(ctx == hold_ctx))
+		return -EALREADY;
+
+	if (ctx->stamp - hold_ctx->stamp <= LONG_MAX &&
+	    (ctx->stamp != hold_ctx->stamp || ctx > hold_ctx)) {
+#ifdef CONFIG_DEBUG_MUTEXES
+		DEBUG_LOCKS_WARN_ON(ctx->contending_lock);
+		ctx->contending_lock = ww;
+#endif
+		return -EDEADLK;
+	}
+
+	return 0;
+}
+#else
+	static inline int __sched
+__mutex_lock_check_stamp(struct rt_mutex *lock, struct ww_acquire_ctx *ctx)
+{
+	BUG();
+	return 0;
+}
+
+#endif
+
+static inline int
+try_to_take_rt_mutex(struct rt_mutex *lock, struct task_struct *task,
+		     struct rt_mutex_waiter *waiter)
+{
+	return __try_to_take_rt_mutex(lock, task, waiter, STEAL_NORMAL);
+}
+
 /*
  * Task blocks on lock.
  *
@@ -951,6 +1334,22 @@
 		return -EDEADLK;
 
 	raw_spin_lock(&task->pi_lock);
+	/*
+	 * In the case of futex requeue PI, this will be a proxy
+	 * lock. The task will wake unaware that it is enqueueed on
+	 * this lock. Avoid blocking on two locks and corrupting
+	 * pi_blocked_on via the PI_WAKEUP_INPROGRESS
+	 * flag. futex_wait_requeue_pi() sets this when it wakes up
+	 * before requeue (due to a signal or timeout). Do not enqueue
+	 * the task if PI_WAKEUP_INPROGRESS is set.
+	 */
+	if (task != current && task->pi_blocked_on == PI_WAKEUP_INPROGRESS) {
+		raw_spin_unlock(&task->pi_lock);
+		return -EAGAIN;
+	}
+
+       BUG_ON(rt_mutex_real_waiter(task->pi_blocked_on));
+
 	waiter->task = task;
 	waiter->lock = lock;
 	waiter->prio = task->prio;
@@ -974,7 +1373,7 @@
 		rt_mutex_enqueue_pi(owner, waiter);
 
 		rt_mutex_adjust_prio(owner);
-		if (owner->pi_blocked_on)
+		if (rt_mutex_real_waiter(owner->pi_blocked_on))
 			chain_walk = 1;
 	} else if (rt_mutex_cond_detect_deadlock(waiter, chwalk)) {
 		chain_walk = 1;
@@ -1016,6 +1415,7 @@
  * Called with lock->wait_lock held and interrupts disabled.
  */
 static void mark_wakeup_next_waiter(struct wake_q_head *wake_q,
+				    struct wake_q_head *wake_sleeper_q,
 				    struct rt_mutex *lock)
 {
 	struct rt_mutex_waiter *waiter;
@@ -1055,7 +1455,10 @@
 	 * Pairs with preempt_enable() in rt_mutex_postunlock();
 	 */
 	preempt_disable();
-	wake_q_add(wake_q, waiter->task);
+	if (waiter->savestate)
+		wake_q_add_sleeper(wake_sleeper_q, waiter->task);
+	else
+		wake_q_add(wake_q, waiter->task);
 	raw_spin_unlock(&current->pi_lock);
 }
 
@@ -1070,7 +1473,7 @@
 {
 	bool is_top_waiter = (waiter == rt_mutex_top_waiter(lock));
 	struct task_struct *owner = rt_mutex_owner(lock);
-	struct rt_mutex *next_lock;
+	struct rt_mutex *next_lock = NULL;
 
 	lockdep_assert_held(&lock->wait_lock);
 
@@ -1096,7 +1499,8 @@
 	rt_mutex_adjust_prio(owner);
 
 	/* Store the lock on which owner is blocked or NULL */
-	next_lock = task_blocked_on_lock(owner);
+	if (rt_mutex_real_waiter(owner->pi_blocked_on))
+		next_lock = task_blocked_on_lock(owner);
 
 	raw_spin_unlock(&owner->pi_lock);
 
@@ -1132,26 +1536,28 @@
 	raw_spin_lock_irqsave(&task->pi_lock, flags);
 
 	waiter = task->pi_blocked_on;
-	if (!waiter || rt_mutex_waiter_equal(waiter, task_to_waiter(task))) {
+	if (!rt_mutex_real_waiter(waiter) ||
+	    rt_mutex_waiter_equal(waiter, task_to_waiter(task))) {
 		raw_spin_unlock_irqrestore(&task->pi_lock, flags);
 		return;
 	}
 	next_lock = waiter->lock;
-	raw_spin_unlock_irqrestore(&task->pi_lock, flags);
 
 	/* gets dropped in rt_mutex_adjust_prio_chain()! */
 	get_task_struct(task);
 
+	raw_spin_unlock_irqrestore(&task->pi_lock, flags);
 	rt_mutex_adjust_prio_chain(task, RT_MUTEX_MIN_CHAINWALK, NULL,
 				   next_lock, NULL, task);
 }
 
-void rt_mutex_init_waiter(struct rt_mutex_waiter *waiter)
+void rt_mutex_init_waiter(struct rt_mutex_waiter *waiter, bool savestate)
 {
 	debug_rt_mutex_init_waiter(waiter);
 	RB_CLEAR_NODE(&waiter->pi_tree_entry);
 	RB_CLEAR_NODE(&waiter->tree_entry);
 	waiter->task = NULL;
+	waiter->savestate = savestate;
 }
 
 /**
@@ -1167,7 +1573,8 @@
 static int __sched
 __rt_mutex_slowlock(struct rt_mutex *lock, int state,
 		    struct hrtimer_sleeper *timeout,
-		    struct rt_mutex_waiter *waiter)
+		    struct rt_mutex_waiter *waiter,
+		    struct ww_acquire_ctx *ww_ctx)
 {
 	int ret = 0;
 
@@ -1176,16 +1583,17 @@
 		if (try_to_take_rt_mutex(lock, current, waiter))
 			break;
 
-		/*
-		 * TASK_INTERRUPTIBLE checks for signals and
-		 * timeout. Ignored otherwise.
-		 */
-		if (likely(state == TASK_INTERRUPTIBLE)) {
-			/* Signal pending? */
-			if (signal_pending(current))
-				ret = -EINTR;
-			if (timeout && !timeout->task)
-				ret = -ETIMEDOUT;
+		if (timeout && !timeout->task) {
+			ret = -ETIMEDOUT;
+			break;
+		}
+		if (signal_pending_state(state, current)) {
+			ret = -EINTR;
+			break;
+		}
+
+		if (ww_ctx && ww_ctx->acquired > 0) {
+			ret = __mutex_lock_check_stamp(lock, ww_ctx);
 			if (ret)
 				break;
 		}
@@ -1224,19 +1632,157 @@
 	}
 }
 
+static __always_inline void ww_mutex_lock_acquired(struct ww_mutex *ww,
+						   struct ww_acquire_ctx *ww_ctx)
+{
+#ifdef CONFIG_DEBUG_MUTEXES
+	/*
+	 * If this WARN_ON triggers, you used ww_mutex_lock to acquire,
+	 * but released with a normal mutex_unlock in this call.
+	 *
+	 * This should never happen, always use ww_mutex_unlock.
+	 */
+	DEBUG_LOCKS_WARN_ON(ww->ctx);
+
+	/*
+	 * Not quite done after calling ww_acquire_done() ?
+	 */
+	DEBUG_LOCKS_WARN_ON(ww_ctx->done_acquire);
+
+	if (ww_ctx->contending_lock) {
+		/*
+		 * After -EDEADLK you tried to
+		 * acquire a different ww_mutex? Bad!
+		 */
+		DEBUG_LOCKS_WARN_ON(ww_ctx->contending_lock != ww);
+
+		/*
+		 * You called ww_mutex_lock after receiving -EDEADLK,
+		 * but 'forgot' to unlock everything else first?
+		 */
+		DEBUG_LOCKS_WARN_ON(ww_ctx->acquired > 0);
+		ww_ctx->contending_lock = NULL;
+	}
+
+	/*
+	 * Naughty, using a different class will lead to undefined behavior!
+	 */
+	DEBUG_LOCKS_WARN_ON(ww_ctx->ww_class != ww->ww_class);
+#endif
+	ww_ctx->acquired++;
+}
+
+#ifdef CONFIG_PREEMPT_RT_FULL
+static void ww_mutex_account_lock(struct rt_mutex *lock,
+				  struct ww_acquire_ctx *ww_ctx)
+{
+	struct ww_mutex *ww = container_of(lock, struct ww_mutex, base.lock);
+	struct rt_mutex_waiter *waiter, *n;
+
+	/*
+	 * This branch gets optimized out for the common case,
+	 * and is only important for ww_mutex_lock.
+	 */
+	ww_mutex_lock_acquired(ww, ww_ctx);
+	ww->ctx = ww_ctx;
+
+	/*
+	 * Give any possible sleeping processes the chance to wake up,
+	 * so they can recheck if they have to back off.
+	 */
+	rbtree_postorder_for_each_entry_safe(waiter, n, &lock->waiters.rb_root,
+					     tree_entry) {
+		/* XXX debug rt mutex waiter wakeup */
+
+		BUG_ON(waiter->lock != lock);
+		rt_mutex_wake_waiter(waiter);
+	}
+}
+
+#else
+
+static void ww_mutex_account_lock(struct rt_mutex *lock,
+				  struct ww_acquire_ctx *ww_ctx)
+{
+	BUG();
+}
+#endif
+
+int __sched rt_mutex_slowlock_locked(struct rt_mutex *lock, int state,
+				     struct hrtimer_sleeper *timeout,
+				     enum rtmutex_chainwalk chwalk,
+				     struct ww_acquire_ctx *ww_ctx,
+				     struct rt_mutex_waiter *waiter)
+{
+	int ret;
+
+#ifdef CONFIG_PREEMPT_RT_FULL
+	if (ww_ctx) {
+		struct ww_mutex *ww;
+
+		ww = container_of(lock, struct ww_mutex, base.lock);
+		if (unlikely(ww_ctx == READ_ONCE(ww->ctx)))
+			return -EALREADY;
+	}
+#endif
+
+	/* Try to acquire the lock again: */
+	if (try_to_take_rt_mutex(lock, current, NULL)) {
+		if (ww_ctx)
+			ww_mutex_account_lock(lock, ww_ctx);
+		return 0;
+	}
+
+	set_current_state(state);
+
+	/* Setup the timer, when timeout != NULL */
+	if (unlikely(timeout))
+		hrtimer_start_expires(&timeout->timer, HRTIMER_MODE_ABS);
+
+	ret = task_blocks_on_rt_mutex(lock, waiter, current, chwalk);
+
+	if (likely(!ret)) {
+		/* sleep on the mutex */
+		ret = __rt_mutex_slowlock(lock, state, timeout, waiter,
+					  ww_ctx);
+	} else if (ww_ctx) {
+		/* ww_mutex received EDEADLK, let it become EALREADY */
+		ret = __mutex_lock_check_stamp(lock, ww_ctx);
+		BUG_ON(!ret);
+	}
+
+	if (unlikely(ret)) {
+		__set_current_state(TASK_RUNNING);
+		remove_waiter(lock, waiter);
+		/* ww_mutex wants to report EDEADLK/EALREADY, let it */
+		if (!ww_ctx)
+			rt_mutex_handle_deadlock(ret, chwalk, waiter);
+	} else if (ww_ctx) {
+		ww_mutex_account_lock(lock, ww_ctx);
+	}
+
+	/*
+	 * try_to_take_rt_mutex() sets the waiter bit
+	 * unconditionally. We might have to fix that up.
+	 */
+	fixup_rt_mutex_waiters(lock);
+	return ret;
+}
+
 /*
  * Slow path lock function:
  */
 static int __sched
 rt_mutex_slowlock(struct rt_mutex *lock, int state,
 		  struct hrtimer_sleeper *timeout,
-		  enum rtmutex_chainwalk chwalk)
+		  enum rtmutex_chainwalk chwalk,
+		  struct ww_acquire_ctx *ww_ctx)
 {
 	struct rt_mutex_waiter waiter;
 	unsigned long flags;
 	int ret = 0;
 
-	rt_mutex_init_waiter(&waiter);
+	rt_mutex_init_waiter(&waiter, false);
 
 	/*
 	 * Technically we could use raw_spin_[un]lock_irq() here, but this can
@@ -1248,35 +1794,8 @@
 	 */
 	raw_spin_lock_irqsave(&lock->wait_lock, flags);
 
-	/* Try to acquire the lock again: */
-	if (try_to_take_rt_mutex(lock, current, NULL)) {
-		raw_spin_unlock_irqrestore(&lock->wait_lock, flags);
-		return 0;
-	}
-
-	set_current_state(state);
-
-	/* Setup the timer, when timeout != NULL */
-	if (unlikely(timeout))
-		hrtimer_start_expires(&timeout->timer, HRTIMER_MODE_ABS);
-
-	ret = task_blocks_on_rt_mutex(lock, &waiter, current, chwalk);
-
-	if (likely(!ret))
-		/* sleep on the mutex */
-		ret = __rt_mutex_slowlock(lock, state, timeout, &waiter);
-
-	if (unlikely(ret)) {
-		__set_current_state(TASK_RUNNING);
-		remove_waiter(lock, &waiter);
-		rt_mutex_handle_deadlock(ret, chwalk, &waiter);
-	}
-
-	/*
-	 * try_to_take_rt_mutex() sets the waiter bit
-	 * unconditionally. We might have to fix that up.
-	 */
-	fixup_rt_mutex_waiters(lock);
+	ret = rt_mutex_slowlock_locked(lock, state, timeout, chwalk, ww_ctx,
+				       &waiter);
 
 	raw_spin_unlock_irqrestore(&lock->wait_lock, flags);
 
@@ -1337,7 +1856,8 @@
  * Return whether the current task needs to call rt_mutex_postunlock().
  */
 static bool __sched rt_mutex_slowunlock(struct rt_mutex *lock,
-					struct wake_q_head *wake_q)
+					struct wake_q_head *wake_q,
+					struct wake_q_head *wake_sleeper_q)
 {
 	unsigned long flags;
 
@@ -1391,7 +1911,7 @@
 	 *
 	 * Queue the next waiter for wakeup once we release the wait_lock.
 	 */
-	mark_wakeup_next_waiter(wake_q, lock);
+	mark_wakeup_next_waiter(wake_q, wake_sleeper_q, lock);
 	raw_spin_unlock_irqrestore(&lock->wait_lock, flags);
 
 	return true; /* call rt_mutex_postunlock() */
@@ -1405,29 +1925,45 @@
  */
 static inline int
 rt_mutex_fastlock(struct rt_mutex *lock, int state,
+		  struct ww_acquire_ctx *ww_ctx,
 		  int (*slowfn)(struct rt_mutex *lock, int state,
 				struct hrtimer_sleeper *timeout,
-				enum rtmutex_chainwalk chwalk))
+				enum rtmutex_chainwalk chwalk,
+				struct ww_acquire_ctx *ww_ctx))
 {
 	if (likely(rt_mutex_cmpxchg_acquire(lock, NULL, current)))
 		return 0;
 
-	return slowfn(lock, state, NULL, RT_MUTEX_MIN_CHAINWALK);
+	/*
+	 * If rt_mutex blocks, the function sched_submit_work will not call
+	 * blk_schedule_flush_plug (because tsk_is_pi_blocked would be true).
+	 * We must call blk_schedule_flush_plug here, if we don't call it,
+	 * a deadlock in I/O may happen.
+	 */
+	if (unlikely(blk_needs_flush_plug(current)))
+		blk_schedule_flush_plug(current);
+
+	return slowfn(lock, state, NULL, RT_MUTEX_MIN_CHAINWALK, ww_ctx);
 }
 
 static inline int
 rt_mutex_timed_fastlock(struct rt_mutex *lock, int state,
 			struct hrtimer_sleeper *timeout,
 			enum rtmutex_chainwalk chwalk,
+			struct ww_acquire_ctx *ww_ctx,
 			int (*slowfn)(struct rt_mutex *lock, int state,
 				      struct hrtimer_sleeper *timeout,
-				      enum rtmutex_chainwalk chwalk))
+				      enum rtmutex_chainwalk chwalk,
+				      struct ww_acquire_ctx *ww_ctx))
 {
 	if (chwalk == RT_MUTEX_MIN_CHAINWALK &&
 	    likely(rt_mutex_cmpxchg_acquire(lock, NULL, current)))
 		return 0;
 
-	return slowfn(lock, state, timeout, chwalk);
+	if (unlikely(blk_needs_flush_plug(current)))
+		blk_schedule_flush_plug(current);
+
+	return slowfn(lock, state, timeout, chwalk, ww_ctx);
 }
 
 static inline int
@@ -1443,9 +1979,11 @@
 /*
  * Performs the wakeup of the the top-waiter and re-enables preemption.
  */
-void rt_mutex_postunlock(struct wake_q_head *wake_q)
+void rt_mutex_postunlock(struct wake_q_head *wake_q,
+			 struct wake_q_head *wake_sleeper_q)
 {
 	wake_up_q(wake_q);
+	wake_up_q_sleeper(wake_sleeper_q);
 
 	/* Pairs with preempt_disable() in rt_mutex_slowunlock() */
 	preempt_enable();
@@ -1454,23 +1992,46 @@
 static inline void
 rt_mutex_fastunlock(struct rt_mutex *lock,
 		    bool (*slowfn)(struct rt_mutex *lock,
-				   struct wake_q_head *wqh))
+				   struct wake_q_head *wqh,
+				   struct wake_q_head *wq_sleeper))
 {
 	DEFINE_WAKE_Q(wake_q);
+	DEFINE_WAKE_Q(wake_sleeper_q);
 
 	if (likely(rt_mutex_cmpxchg_release(lock, current, NULL)))
 		return;
 
-	if (slowfn(lock, &wake_q))
-		rt_mutex_postunlock(&wake_q);
+	if (slowfn(lock, &wake_q, &wake_sleeper_q))
+		rt_mutex_postunlock(&wake_q, &wake_sleeper_q);
+}
+
+int __sched __rt_mutex_lock_state(struct rt_mutex *lock, int state)
+{
+	might_sleep();
+	return rt_mutex_fastlock(lock, state, NULL, rt_mutex_slowlock);
+}
+
+/**
+ * rt_mutex_lock_state - lock a rt_mutex with a given state
+ *
+ * @lock:      The rt_mutex to be locked
+ * @state:     The state to set when blocking on the rt_mutex
+ */
+static inline int __sched rt_mutex_lock_state(struct rt_mutex *lock,
+					      unsigned int subclass, int state)
+{
+	int ret;
+
+	mutex_acquire(&lock->dep_map, subclass, 0, _RET_IP_);
+	ret = __rt_mutex_lock_state(lock, state);
+	if (ret)
+		mutex_release(&lock->dep_map, 1, _RET_IP_);
+	return ret;
 }
 
 static inline void __rt_mutex_lock(struct rt_mutex *lock, unsigned int subclass)
 {
-	might_sleep();
-
-	mutex_acquire(&lock->dep_map, subclass, 0, _RET_IP_);
-	rt_mutex_fastlock(lock, TASK_UNINTERRUPTIBLE, rt_mutex_slowlock);
+	rt_mutex_lock_state(lock, subclass, TASK_UNINTERRUPTIBLE);
 }
 
 #ifdef CONFIG_DEBUG_LOCK_ALLOC
@@ -1511,16 +2072,7 @@
  */
 int __sched rt_mutex_lock_interruptible(struct rt_mutex *lock)
 {
-	int ret;
-
-	might_sleep();
-
-	mutex_acquire(&lock->dep_map, 0, 0, _RET_IP_);
-	ret = rt_mutex_fastlock(lock, TASK_INTERRUPTIBLE, rt_mutex_slowlock);
-	if (ret)
-		mutex_release(&lock->dep_map, 1, _RET_IP_);
-
-	return ret;
+	return rt_mutex_lock_state(lock, 0, TASK_INTERRUPTIBLE);
 }
 EXPORT_SYMBOL_GPL(rt_mutex_lock_interruptible);
 
@@ -1536,6 +2088,22 @@
 {
 	return __rt_mutex_slowtrylock(lock);
 }
+
+/**
+ * rt_mutex_lock_killable - lock a rt_mutex killable
+ *
+ * @lock:              the rt_mutex to be locked
+ * @detect_deadlock:   deadlock detection on/off
+ *
+ * Returns:
+ *  0          on success
+ * -EINTR      when interrupted by a signal
+ */
+int __sched rt_mutex_lock_killable(struct rt_mutex *lock)
+{
+	return rt_mutex_lock_state(lock, 0, TASK_KILLABLE);
+}
+EXPORT_SYMBOL_GPL(rt_mutex_lock_killable);
 
 /**
  * rt_mutex_timed_lock - lock a rt_mutex interruptible
@@ -1560,6 +2128,7 @@
 	mutex_acquire(&lock->dep_map, 0, 0, _RET_IP_);
 	ret = rt_mutex_timed_fastlock(lock, TASK_INTERRUPTIBLE, timeout,
 				       RT_MUTEX_MIN_CHAINWALK,
+				       NULL,
 				       rt_mutex_slowlock);
 	if (ret)
 		mutex_release(&lock->dep_map, 1, _RET_IP_);
@@ -1567,6 +2136,18 @@
 	return ret;
 }
 EXPORT_SYMBOL_GPL(rt_mutex_timed_lock);
+
+int __sched __rt_mutex_trylock(struct rt_mutex *lock)
+{
+#ifdef CONFIG_PREEMPT_RT_FULL
+	if (WARN_ON_ONCE(in_irq() || in_nmi()))
+#else
+	if (WARN_ON_ONCE(in_irq() || in_nmi() || in_serving_softirq()))
+#endif
+		return 0;
+
+	return rt_mutex_fasttrylock(lock, rt_mutex_slowtrylock);
+}
 
 /**
  * rt_mutex_trylock - try to lock a rt_mutex
@@ -1583,16 +2164,18 @@
 {
 	int ret;
 
-	if (WARN_ON_ONCE(in_irq() || in_nmi() || in_serving_softirq()))
-		return 0;
-
-	ret = rt_mutex_fasttrylock(lock, rt_mutex_slowtrylock);
+	ret = __rt_mutex_trylock(lock);
 	if (ret)
 		mutex_acquire(&lock->dep_map, 0, 1, _RET_IP_);
 
 	return ret;
 }
 EXPORT_SYMBOL_GPL(rt_mutex_trylock);
+
+void __sched __rt_mutex_unlock(struct rt_mutex *lock)
+{
+	rt_mutex_fastunlock(lock, rt_mutex_slowunlock);
+}
 
 /**
  * rt_mutex_unlock - unlock a rt_mutex
@@ -1602,16 +2185,13 @@
 void __sched rt_mutex_unlock(struct rt_mutex *lock)
 {
 	mutex_release(&lock->dep_map, 1, _RET_IP_);
-	rt_mutex_fastunlock(lock, rt_mutex_slowunlock);
+	__rt_mutex_unlock(lock);
 }
 EXPORT_SYMBOL_GPL(rt_mutex_unlock);
 
-/**
- * Futex variant, that since futex variants do not use the fast-path, can be
- * simple and will not need to retry.
- */
-bool __sched __rt_mutex_futex_unlock(struct rt_mutex *lock,
-				    struct wake_q_head *wake_q)
+static bool __sched __rt_mutex_unlock_common(struct rt_mutex *lock,
+					     struct wake_q_head *wake_q,
+					     struct wake_q_head *wq_sleeper)
 {
 	lockdep_assert_held(&lock->wait_lock);
 
@@ -1628,23 +2208,35 @@
 	 * avoid inversion prior to the wakeup.  preempt_disable()
 	 * therein pairs with rt_mutex_postunlock().
 	 */
-	mark_wakeup_next_waiter(wake_q, lock);
+	mark_wakeup_next_waiter(wake_q, wq_sleeper, lock);
 
 	return true; /* call postunlock() */
+}
+
+/**
+ * Futex variant, that since futex variants do not use the fast-path, can be
+ * simple and will not need to retry.
+ */
+bool __sched __rt_mutex_futex_unlock(struct rt_mutex *lock,
+				     struct wake_q_head *wake_q,
+				     struct wake_q_head *wq_sleeper)
+{
+	return __rt_mutex_unlock_common(lock, wake_q, wq_sleeper);
 }
 
 void __sched rt_mutex_futex_unlock(struct rt_mutex *lock)
 {
 	DEFINE_WAKE_Q(wake_q);
+	DEFINE_WAKE_Q(wake_sleeper_q);
 	unsigned long flags;
 	bool postunlock;
 
 	raw_spin_lock_irqsave(&lock->wait_lock, flags);
-	postunlock = __rt_mutex_futex_unlock(lock, &wake_q);
+	postunlock = __rt_mutex_futex_unlock(lock, &wake_q, &wake_sleeper_q);
 	raw_spin_unlock_irqrestore(&lock->wait_lock, flags);
 
 	if (postunlock)
-		rt_mutex_postunlock(&wake_q);
+		rt_mutex_postunlock(&wake_q, &wake_sleeper_q);
 }
 
 /**
@@ -1683,7 +2275,7 @@
 	if (name && key)
 		debug_rt_mutex_init(lock, name, key);
 }
-EXPORT_SYMBOL_GPL(__rt_mutex_init);
+EXPORT_SYMBOL(__rt_mutex_init);
 
 /**
  * rt_mutex_init_proxy_locked - initialize and lock a rt_mutex on behalf of a
@@ -1703,6 +2295,14 @@
 				struct task_struct *proxy_owner)
 {
 	__rt_mutex_init(lock, NULL, NULL);
+#ifdef CONFIG_DEBUG_SPINLOCK
+	/*
+	 * get another key class for the wait_lock. LOCK_PI and UNLOCK_PI is
+	 * holding the ->wait_lock of the proxy_lock while unlocking a sleeping
+	 * lock.
+	 */
+	raw_spin_lock_init(&lock->wait_lock);
+#endif
 	debug_rt_mutex_proxy_lock(lock, proxy_owner);
 	rt_mutex_set_owner(lock, proxy_owner);
 }
@@ -1723,6 +2323,26 @@
 {
 	debug_rt_mutex_proxy_unlock(lock);
 	rt_mutex_set_owner(lock, NULL);
+}
+
+static void fixup_rt_mutex_blocked(struct rt_mutex *lock)
+{
+	struct task_struct *tsk = current;
+	/*
+	 * RT has a problem here when the wait got interrupted by a timeout
+	 * or a signal. task->pi_blocked_on is still set. The task must
+	 * acquire the hash bucket lock when returning from this function.
+	 *
+	 * If the hash bucket lock is contended then the
+	 * BUG_ON(rt_mutex_real_waiter(task->pi_blocked_on)) in
+	 * task_blocks_on_rt_mutex() will trigger. This can be avoided by
+	 * clearing task->pi_blocked_on which removes the task from the
+	 * boosting chain of the rtmutex. That's correct because the task
+	 * is not longer blocked on it.
+	 */
+	raw_spin_lock(&tsk->pi_lock);
+	tsk->pi_blocked_on = NULL;
+	raw_spin_unlock(&tsk->pi_lock);
 }
 
 /**
@@ -1755,6 +2375,34 @@
 	if (try_to_take_rt_mutex(lock, task, NULL))
 		return 1;
 
+#ifdef CONFIG_PREEMPT_RT_FULL
+	/*
+	 * In PREEMPT_RT there's an added race.
+	 * If the task, that we are about to requeue, times out,
+	 * it can set the PI_WAKEUP_INPROGRESS. This tells the requeue
+	 * to skip this task. But right after the task sets
+	 * its pi_blocked_on to PI_WAKEUP_INPROGRESS it can then
+	 * block on the spin_lock(&hb->lock), which in RT is an rtmutex.
+	 * This will replace the PI_WAKEUP_INPROGRESS with the actual
+	 * lock that it blocks on. We *must not* place this task
+	 * on this proxy lock in that case.
+	 *
+	 * To prevent this race, we first take the task's pi_lock
+	 * and check if it has updated its pi_blocked_on. If it has,
+	 * we assume that it woke up and we return -EAGAIN.
+	 * Otherwise, we set the task's pi_blocked_on to
+	 * PI_REQUEUE_INPROGRESS, so that if the task is waking up
+	 * it will know that we are in the process of requeuing it.
+	 */
+	raw_spin_lock(&task->pi_lock);
+	if (task->pi_blocked_on) {
+		raw_spin_unlock(&task->pi_lock);
+		return -EAGAIN;
+	}
+	task->pi_blocked_on = PI_REQUEUE_INPROGRESS;
+	raw_spin_unlock(&task->pi_lock);
+#endif
+
 	/* We enforce deadlock detection for futexes */
 	ret = task_blocks_on_rt_mutex(lock, waiter, task,
 				      RT_MUTEX_FULL_CHAINWALK);
@@ -1768,6 +2416,9 @@
 		 */
 		ret = 0;
 	}
+
+	if (ret)
+		fixup_rt_mutex_blocked(lock);
 
 	debug_rt_mutex_print_deadlock(waiter);
 
@@ -1854,12 +2505,15 @@
 	raw_spin_lock_irq(&lock->wait_lock);
 	/* sleep on the mutex */
 	set_current_state(TASK_INTERRUPTIBLE);
-	ret = __rt_mutex_slowlock(lock, TASK_INTERRUPTIBLE, to, waiter);
+	ret = __rt_mutex_slowlock(lock, TASK_INTERRUPTIBLE, to, waiter, NULL);
 	/*
 	 * try_to_take_rt_mutex() sets the waiter bit unconditionally. We might
 	 * have to fix that up.
 	 */
 	fixup_rt_mutex_waiters(lock);
+	if (ret)
+		fixup_rt_mutex_blocked(lock);
+
 	raw_spin_unlock_irq(&lock->wait_lock);
 
 	return ret;
@@ -1921,3 +2575,99 @@
 
 	return cleanup;
 }
+
+static inline int
+ww_mutex_deadlock_injection(struct ww_mutex *lock, struct ww_acquire_ctx *ctx)
+{
+#ifdef CONFIG_DEBUG_WW_MUTEX_SLOWPATH
+	unsigned tmp;
+
+	if (ctx->deadlock_inject_countdown-- == 0) {
+		tmp = ctx->deadlock_inject_interval;
+		if (tmp > UINT_MAX/4)
+			tmp = UINT_MAX;
+		else
+			tmp = tmp*2 + tmp + tmp/2;
+
+		ctx->deadlock_inject_interval = tmp;
+		ctx->deadlock_inject_countdown = tmp;
+		ctx->contending_lock = lock;
+
+		ww_mutex_unlock(lock);
+
+		return -EDEADLK;
+	}
+#endif
+
+	return 0;
+}
+
+#ifdef CONFIG_PREEMPT_RT_FULL
+int __sched
+ww_mutex_lock_interruptible(struct ww_mutex *lock, struct ww_acquire_ctx *ctx)
+{
+	int ret;
+
+	might_sleep();
+
+	mutex_acquire_nest(&lock->base.dep_map, 0, 0,
+			   ctx ? &ctx->dep_map : NULL, _RET_IP_);
+	ret = rt_mutex_slowlock(&lock->base.lock, TASK_INTERRUPTIBLE, NULL, 0,
+				ctx);
+	if (ret)
+		mutex_release(&lock->base.dep_map, 1, _RET_IP_);
+	else if (!ret && ctx && ctx->acquired > 1)
+		return ww_mutex_deadlock_injection(lock, ctx);
+
+	return ret;
+}
+EXPORT_SYMBOL_GPL(ww_mutex_lock_interruptible);
+
+int __sched
+ww_mutex_lock(struct ww_mutex *lock, struct ww_acquire_ctx *ctx)
+{
+	int ret;
+
+	might_sleep();
+
+	mutex_acquire_nest(&lock->base.dep_map, 0, 0,
+			   ctx ? &ctx->dep_map : NULL, _RET_IP_);
+	ret = rt_mutex_slowlock(&lock->base.lock, TASK_UNINTERRUPTIBLE, NULL, 0,
+				ctx);
+	if (ret)
+		mutex_release(&lock->base.dep_map, 1, _RET_IP_);
+	else if (!ret && ctx && ctx->acquired > 1)
+		return ww_mutex_deadlock_injection(lock, ctx);
+
+	return ret;
+}
+EXPORT_SYMBOL_GPL(ww_mutex_lock);
+
+void __sched ww_mutex_unlock(struct ww_mutex *lock)
+{
+	int nest = !!lock->ctx;
+
+	/*
+	 * The unlocking fastpath is the 0->1 transition from 'locked'
+	 * into 'unlocked' state:
+	 */
+	if (nest) {
+#ifdef CONFIG_DEBUG_MUTEXES
+		DEBUG_LOCKS_WARN_ON(!lock->ctx->acquired);
+#endif
+		if (lock->ctx->acquired > 0)
+			lock->ctx->acquired--;
+		lock->ctx = NULL;
+	}
+
+	mutex_release(&lock->base.dep_map, nest, _RET_IP_);
+	__rt_mutex_unlock(&lock->base.lock);
+}
+EXPORT_SYMBOL(ww_mutex_unlock);
+
+int __rt_mutex_owner_current(struct rt_mutex *lock)
+{
+	return rt_mutex_owner(lock) == current;
+}
+EXPORT_SYMBOL(__rt_mutex_owner_current);
+#endif
diff --git a/kernel/kernel/locking/rtmutex_common.h b/kernel/kernel/locking/rtmutex_common.h
index ca6fb48..8e0c592 100644
--- a/kernel/kernel/locking/rtmutex_common.h
+++ b/kernel/kernel/locking/rtmutex_common.h
@@ -15,6 +15,7 @@
 
 #include <linux/rtmutex.h>
 #include <linux/sched/wake_q.h>
+#include <linux/sched/debug.h>
 
 /*
  * This is the control structure for tasks blocked on a rt_mutex,
@@ -29,6 +30,7 @@
 	struct rb_node          pi_tree_entry;
 	struct task_struct	*task;
 	struct rt_mutex		*lock;
+	bool			savestate;
 #ifdef CONFIG_DEBUG_RT_MUTEXES
 	unsigned long		ip;
 	struct pid		*deadlock_task_pid;
@@ -130,11 +132,14 @@
 /*
  * PI-futex support (proxy locking functions, etc.):
  */
+#define PI_WAKEUP_INPROGRESS	((struct rt_mutex_waiter *) 1)
+#define PI_REQUEUE_INPROGRESS	((struct rt_mutex_waiter *) 2)
+
 extern struct task_struct *rt_mutex_next_owner(struct rt_mutex *lock);
 extern void rt_mutex_init_proxy_locked(struct rt_mutex *lock,
 				       struct task_struct *proxy_owner);
 extern void rt_mutex_proxy_unlock(struct rt_mutex *lock);
-extern void rt_mutex_init_waiter(struct rt_mutex_waiter *waiter);
+extern void rt_mutex_init_waiter(struct rt_mutex_waiter *waiter, bool savetate);
 extern int __rt_mutex_start_proxy_lock(struct rt_mutex *lock,
 				     struct rt_mutex_waiter *waiter,
 				     struct task_struct *task);
@@ -152,9 +157,27 @@
 
 extern void rt_mutex_futex_unlock(struct rt_mutex *lock);
 extern bool __rt_mutex_futex_unlock(struct rt_mutex *lock,
-				 struct wake_q_head *wqh);
+				 struct wake_q_head *wqh,
+				 struct wake_q_head *wq_sleeper);
 
-extern void rt_mutex_postunlock(struct wake_q_head *wake_q);
+extern void rt_mutex_postunlock(struct wake_q_head *wake_q,
+				struct wake_q_head *wake_sleeper_q);
+
+/* RW semaphore special interface */
+struct ww_acquire_ctx;
+
+extern int __rt_mutex_lock_state(struct rt_mutex *lock, int state);
+extern int __rt_mutex_trylock(struct rt_mutex *lock);
+extern void __rt_mutex_unlock(struct rt_mutex *lock);
+int __sched rt_mutex_slowlock_locked(struct rt_mutex *lock, int state,
+				     struct hrtimer_sleeper *timeout,
+				     enum rtmutex_chainwalk chwalk,
+				     struct ww_acquire_ctx *ww_ctx,
+				     struct rt_mutex_waiter *waiter);
+void __sched rt_spin_lock_slowlock_locked(struct rt_mutex *lock,
+					  struct rt_mutex_waiter *waiter,
+					  unsigned long flags);
+void __sched rt_spin_lock_slowunlock(struct rt_mutex *lock);
 
 #ifdef CONFIG_DEBUG_RT_MUTEXES
 # include "rtmutex-debug.h"
diff --git a/kernel/kernel/locking/rwlock-rt.c b/kernel/kernel/locking/rwlock-rt.c
new file mode 100644
index 0000000..0ae8c62
--- /dev/null
+++ b/kernel/kernel/locking/rwlock-rt.c
@@ -0,0 +1,384 @@
+/*
+ */
+#include <linux/sched/debug.h>
+#include <linux/export.h>
+
+#include "rtmutex_common.h"
+#include <linux/rwlock_types_rt.h>
+
+/*
+ * RT-specific reader/writer locks
+ *
+ * write_lock()
+ *  1) Lock lock->rtmutex
+ *  2) Remove the reader BIAS to force readers into the slow path
+ *  3) Wait until all readers have left the critical region
+ *  4) Mark it write locked
+ *
+ * write_unlock()
+ *  1) Remove the write locked marker
+ *  2) Set the reader BIAS so readers can use the fast path again
+ *  3) Unlock lock->rtmutex to release blocked readers
+ *
+ * read_lock()
+ *  1) Try fast path acquisition (reader BIAS is set)
+ *  2) Take lock->rtmutex.wait_lock which protects the writelocked flag
+ *  3) If !writelocked, acquire it for read
+ *  4) If writelocked, block on lock->rtmutex
+ *  5) unlock lock->rtmutex, goto 1)
+ *
+ * read_unlock()
+ *  1) Try fast path release (reader count != 1)
+ *  2) Wake the writer waiting in write_lock()#3
+ *
+ * read_lock()#3 has the consequence, that rw locks on RT are not writer
+ * fair, but writers, which should be avoided in RT tasks (think tasklist
+ * lock), are subject to the rtmutex priority/DL inheritance mechanism.
+ *
+ * It's possible to make the rw locks writer fair by keeping a list of
+ * active readers. A blocked writer would force all newly incoming readers
+ * to block on the rtmutex, but the rtmutex would have to be proxy locked
+ * for one reader after the other. We can't use multi-reader inheritance
+ * because there is no way to support that with
+ * SCHED_DEADLINE. Implementing the one by one reader boosting/handover
+ * mechanism is a major surgery for a very dubious value.
+ *
+ * The risk of writer starvation is there, but the pathological use cases
+ * which trigger it are not necessarily the typical RT workloads.
+ */
+
+void __rwlock_biased_rt_init(struct rt_rw_lock *lock, const char *name,
+			     struct lock_class_key *key)
+{
+#ifdef CONFIG_DEBUG_LOCK_ALLOC
+	/*
+	 * Make sure we are not reinitializing a held semaphore:
+	 */
+	debug_check_no_locks_freed((void *)lock, sizeof(*lock));
+	lockdep_init_map(&lock->dep_map, name, key, 0);
+#endif
+	atomic_set(&lock->readers, READER_BIAS);
+	rt_mutex_init(&lock->rtmutex);
+	lock->rtmutex.save_state = 1;
+}
+
+int __read_rt_trylock(struct rt_rw_lock *lock)
+{
+	int r, old;
+
+	/*
+	 * Increment reader count, if lock->readers < 0, i.e. READER_BIAS is
+	 * set.
+	 */
+	for (r = atomic_read(&lock->readers); r < 0;) {
+		old = atomic_cmpxchg(&lock->readers, r, r + 1);
+		if (likely(old == r))
+			return 1;
+		r = old;
+	}
+	return 0;
+}
+
+void __sched __read_rt_lock(struct rt_rw_lock *lock)
+{
+	struct rt_mutex *m = &lock->rtmutex;
+	struct rt_mutex_waiter waiter;
+	unsigned long flags;
+
+	if (__read_rt_trylock(lock))
+		return;
+
+	raw_spin_lock_irqsave(&m->wait_lock, flags);
+	/*
+	 * Allow readers as long as the writer has not completely
+	 * acquired the semaphore for write.
+	 */
+	if (atomic_read(&lock->readers) != WRITER_BIAS) {
+		atomic_inc(&lock->readers);
+		raw_spin_unlock_irqrestore(&m->wait_lock, flags);
+		return;
+	}
+
+	/*
+	 * Call into the slow lock path with the rtmutex->wait_lock
+	 * held, so this can't result in the following race:
+	 *
+	 * Reader1		Reader2		Writer
+	 *			read_lock()
+	 *					write_lock()
+	 *					rtmutex_lock(m)
+	 *					swait()
+	 * read_lock()
+	 * unlock(m->wait_lock)
+	 *			read_unlock()
+	 *			swake()
+	 *					lock(m->wait_lock)
+	 *					lock->writelocked=true
+	 *					unlock(m->wait_lock)
+	 *
+	 *					write_unlock()
+	 *					lock->writelocked=false
+	 *					rtmutex_unlock(m)
+	 *			read_lock()
+	 *					write_lock()
+	 *					rtmutex_lock(m)
+	 *					swait()
+	 * rtmutex_lock(m)
+	 *
+	 * That would put Reader1 behind the writer waiting on
+	 * Reader2 to call read_unlock() which might be unbound.
+	 */
+	rt_mutex_init_waiter(&waiter, true);
+	rt_spin_lock_slowlock_locked(m, &waiter, flags);
+	/*
+	 * The slowlock() above is guaranteed to return with the rtmutex is
+	 * now held, so there can't be a writer active. Increment the reader
+	 * count and immediately drop the rtmutex again.
+	 */
+	atomic_inc(&lock->readers);
+	raw_spin_unlock_irqrestore(&m->wait_lock, flags);
+	rt_spin_lock_slowunlock(m);
+
+	debug_rt_mutex_free_waiter(&waiter);
+}
+
+void __read_rt_unlock(struct rt_rw_lock *lock)
+{
+	struct rt_mutex *m = &lock->rtmutex;
+	struct task_struct *tsk;
+
+	/*
+	 * sem->readers can only hit 0 when a writer is waiting for the
+	 * active readers to leave the critical region.
+	 */
+	if (!atomic_dec_and_test(&lock->readers))
+		return;
+
+	raw_spin_lock_irq(&m->wait_lock);
+	/*
+	 * Wake the writer, i.e. the rtmutex owner. It might release the
+	 * rtmutex concurrently in the fast path, but to clean up the rw
+	 * lock it needs to acquire m->wait_lock. The worst case which can
+	 * happen is a spurious wakeup.
+	 */
+	tsk = rt_mutex_owner(m);
+	if (tsk)
+		wake_up_process(tsk);
+
+	raw_spin_unlock_irq(&m->wait_lock);
+}
+
+static void __write_unlock_common(struct rt_rw_lock *lock, int bias,
+				  unsigned long flags)
+{
+	struct rt_mutex *m = &lock->rtmutex;
+
+	atomic_add(READER_BIAS - bias, &lock->readers);
+	raw_spin_unlock_irqrestore(&m->wait_lock, flags);
+	rt_spin_lock_slowunlock(m);
+}
+
+void __sched __write_rt_lock(struct rt_rw_lock *lock)
+{
+	struct rt_mutex *m = &lock->rtmutex;
+	struct task_struct *self = current;
+	unsigned long flags;
+
+	/* Take the rtmutex as a first step */
+	__rt_spin_lock(m);
+
+	/* Force readers into slow path */
+	atomic_sub(READER_BIAS, &lock->readers);
+
+	raw_spin_lock_irqsave(&m->wait_lock, flags);
+
+	raw_spin_lock(&self->pi_lock);
+	self->saved_state = self->state;
+	__set_current_state_no_track(TASK_UNINTERRUPTIBLE);
+	raw_spin_unlock(&self->pi_lock);
+
+	for (;;) {
+		/* Have all readers left the critical region? */
+		if (!atomic_read(&lock->readers)) {
+			atomic_set(&lock->readers, WRITER_BIAS);
+			raw_spin_lock(&self->pi_lock);
+			__set_current_state_no_track(self->saved_state);
+			self->saved_state = TASK_RUNNING;
+			raw_spin_unlock(&self->pi_lock);
+			raw_spin_unlock_irqrestore(&m->wait_lock, flags);
+			return;
+		}
+
+		raw_spin_unlock_irqrestore(&m->wait_lock, flags);
+
+		if (atomic_read(&lock->readers) != 0)
+			schedule();
+
+		raw_spin_lock_irqsave(&m->wait_lock, flags);
+
+		raw_spin_lock(&self->pi_lock);
+		__set_current_state_no_track(TASK_UNINTERRUPTIBLE);
+		raw_spin_unlock(&self->pi_lock);
+	}
+}
+
+int __write_rt_trylock(struct rt_rw_lock *lock)
+{
+	struct rt_mutex *m = &lock->rtmutex;
+	unsigned long flags;
+
+	if (!__rt_mutex_trylock(m))
+		return 0;
+
+	atomic_sub(READER_BIAS, &lock->readers);
+
+	raw_spin_lock_irqsave(&m->wait_lock, flags);
+	if (!atomic_read(&lock->readers)) {
+		atomic_set(&lock->readers, WRITER_BIAS);
+		raw_spin_unlock_irqrestore(&m->wait_lock, flags);
+		return 1;
+	}
+	__write_unlock_common(lock, 0, flags);
+	return 0;
+}
+
+void __write_rt_unlock(struct rt_rw_lock *lock)
+{
+	struct rt_mutex *m = &lock->rtmutex;
+	unsigned long flags;
+
+	raw_spin_lock_irqsave(&m->wait_lock, flags);
+	__write_unlock_common(lock, WRITER_BIAS, flags);
+}
+
+/* Map the reader biased implementation */
+static inline int do_read_rt_trylock(rwlock_t *rwlock)
+{
+	return __read_rt_trylock(rwlock);
+}
+
+static inline int do_write_rt_trylock(rwlock_t *rwlock)
+{
+	return __write_rt_trylock(rwlock);
+}
+
+static inline void do_read_rt_lock(rwlock_t *rwlock)
+{
+	__read_rt_lock(rwlock);
+}
+
+static inline void do_write_rt_lock(rwlock_t *rwlock)
+{
+	__write_rt_lock(rwlock);
+}
+
+static inline void do_read_rt_unlock(rwlock_t *rwlock)
+{
+	__read_rt_unlock(rwlock);
+}
+
+static inline void do_write_rt_unlock(rwlock_t *rwlock)
+{
+	__write_rt_unlock(rwlock);
+}
+
+static inline void do_rwlock_rt_init(rwlock_t *rwlock, const char *name,
+				     struct lock_class_key *key)
+{
+	__rwlock_biased_rt_init(rwlock, name, key);
+}
+
+int __lockfunc rt_read_can_lock(rwlock_t *rwlock)
+{
+	return  atomic_read(&rwlock->readers) < 0;
+}
+
+int __lockfunc rt_write_can_lock(rwlock_t *rwlock)
+{
+	return atomic_read(&rwlock->readers) == READER_BIAS;
+}
+
+/*
+ * The common functions which get wrapped into the rwlock API.
+ */
+int __lockfunc rt_read_trylock(rwlock_t *rwlock)
+{
+	int ret;
+
+	sleeping_lock_inc();
+	migrate_disable();
+	ret = do_read_rt_trylock(rwlock);
+	if (ret) {
+		rwlock_acquire_read(&rwlock->dep_map, 0, 1, _RET_IP_);
+		rcu_read_lock();
+	} else {
+		migrate_enable();
+		sleeping_lock_dec();
+	}
+	return ret;
+}
+EXPORT_SYMBOL(rt_read_trylock);
+
+int __lockfunc rt_write_trylock(rwlock_t *rwlock)
+{
+	int ret;
+
+	sleeping_lock_inc();
+	migrate_disable();
+	ret = do_write_rt_trylock(rwlock);
+	if (ret) {
+		rwlock_acquire(&rwlock->dep_map, 0, 1, _RET_IP_);
+		rcu_read_lock();
+	} else {
+		migrate_enable();
+		sleeping_lock_dec();
+	}
+	return ret;
+}
+EXPORT_SYMBOL(rt_write_trylock);
+
+void __lockfunc rt_read_lock(rwlock_t *rwlock)
+{
+	sleeping_lock_inc();
+	rcu_read_lock();
+	migrate_disable();
+	rwlock_acquire_read(&rwlock->dep_map, 0, 0, _RET_IP_);
+	do_read_rt_lock(rwlock);
+}
+EXPORT_SYMBOL(rt_read_lock);
+
+void __lockfunc rt_write_lock(rwlock_t *rwlock)
+{
+	sleeping_lock_inc();
+	rcu_read_lock();
+	migrate_disable();
+	rwlock_acquire(&rwlock->dep_map, 0, 0, _RET_IP_);
+	do_write_rt_lock(rwlock);
+}
+EXPORT_SYMBOL(rt_write_lock);
+
+void __lockfunc rt_read_unlock(rwlock_t *rwlock)
+{
+	rwlock_release(&rwlock->dep_map, 1, _RET_IP_);
+	do_read_rt_unlock(rwlock);
+	migrate_enable();
+	rcu_read_unlock();
+	sleeping_lock_dec();
+}
+EXPORT_SYMBOL(rt_read_unlock);
+
+void __lockfunc rt_write_unlock(rwlock_t *rwlock)
+{
+	rwlock_release(&rwlock->dep_map, 1, _RET_IP_);
+	do_write_rt_unlock(rwlock);
+	migrate_enable();
+	rcu_read_unlock();
+	sleeping_lock_dec();
+}
+EXPORT_SYMBOL(rt_write_unlock);
+
+void __rt_rwlock_init(rwlock_t *rwlock, char *name, struct lock_class_key *key)
+{
+	do_rwlock_rt_init(rwlock, name, key);
+}
+EXPORT_SYMBOL(__rt_rwlock_init);
diff --git a/kernel/kernel/locking/rwsem-rt.c b/kernel/kernel/locking/rwsem-rt.c
new file mode 100644
index 0000000..9669464
--- /dev/null
+++ b/kernel/kernel/locking/rwsem-rt.c
@@ -0,0 +1,312 @@
+/*
+ */
+#include <linux/blkdev.h>
+#include <linux/rwsem.h>
+#include <linux/sched/debug.h>
+#include <linux/sched/signal.h>
+#include <linux/export.h>
+
+#include "rtmutex_common.h"
+
+/*
+ * RT-specific reader/writer semaphores
+ *
+ * down_write()
+ *  1) Lock sem->rtmutex
+ *  2) Remove the reader BIAS to force readers into the slow path
+ *  3) Wait until all readers have left the critical region
+ *  4) Mark it write locked
+ *
+ * up_write()
+ *  1) Remove the write locked marker
+ *  2) Set the reader BIAS so readers can use the fast path again
+ *  3) Unlock sem->rtmutex to release blocked readers
+ *
+ * down_read()
+ *  1) Try fast path acquisition (reader BIAS is set)
+ *  2) Take sem->rtmutex.wait_lock which protects the writelocked flag
+ *  3) If !writelocked, acquire it for read
+ *  4) If writelocked, block on sem->rtmutex
+ *  5) unlock sem->rtmutex, goto 1)
+ *
+ * up_read()
+ *  1) Try fast path release (reader count != 1)
+ *  2) Wake the writer waiting in down_write()#3
+ *
+ * down_read()#3 has the consequence, that rw semaphores on RT are not writer
+ * fair, but writers, which should be avoided in RT tasks (think mmap_sem),
+ * are subject to the rtmutex priority/DL inheritance mechanism.
+ *
+ * It's possible to make the rw semaphores writer fair by keeping a list of
+ * active readers. A blocked writer would force all newly incoming readers to
+ * block on the rtmutex, but the rtmutex would have to be proxy locked for one
+ * reader after the other. We can't use multi-reader inheritance because there
+ * is no way to support that with SCHED_DEADLINE. Implementing the one by one
+ * reader boosting/handover mechanism is a major surgery for a very dubious
+ * value.
+ *
+ * The risk of writer starvation is there, but the pathological use cases
+ * which trigger it are not necessarily the typical RT workloads.
+ */
+
+void __rwsem_init(struct rw_semaphore *sem, const char *name,
+		  struct lock_class_key *key)
+{
+#ifdef CONFIG_DEBUG_LOCK_ALLOC
+	/*
+	 * Make sure we are not reinitializing a held semaphore:
+	 */
+	debug_check_no_locks_freed((void *)sem, sizeof(*sem));
+	lockdep_init_map(&sem->dep_map, name, key, 0);
+#endif
+	atomic_set(&sem->readers, READER_BIAS);
+}
+EXPORT_SYMBOL(__rwsem_init);
+
+int __down_read_trylock(struct rw_semaphore *sem)
+{
+	int r, old;
+
+	/*
+	 * Increment reader count, if sem->readers < 0, i.e. READER_BIAS is
+	 * set.
+	 */
+	for (r = atomic_read(&sem->readers); r < 0;) {
+		old = atomic_cmpxchg(&sem->readers, r, r + 1);
+		if (likely(old == r))
+			return 1;
+		r = old;
+	}
+	return 0;
+}
+
+static int __sched __down_read_common(struct rw_semaphore *sem, int state)
+{
+	struct rt_mutex *m = &sem->rtmutex;
+	struct rt_mutex_waiter waiter;
+	int ret;
+
+	if (__down_read_trylock(sem))
+		return 0;
+	/*
+	 * If rt_mutex blocks, the function sched_submit_work will not call
+	 * blk_schedule_flush_plug (because tsk_is_pi_blocked would be true).
+	 * We must call blk_schedule_flush_plug here, if we don't call it,
+	 * a deadlock in I/O may happen.
+	 */
+	if (unlikely(blk_needs_flush_plug(current)))
+		blk_schedule_flush_plug(current);
+
+	might_sleep();
+	raw_spin_lock_irq(&m->wait_lock);
+	/*
+	 * Allow readers as long as the writer has not completely
+	 * acquired the semaphore for write.
+	 */
+	if (atomic_read(&sem->readers) != WRITER_BIAS) {
+		atomic_inc(&sem->readers);
+		raw_spin_unlock_irq(&m->wait_lock);
+		return 0;
+	}
+
+	/*
+	 * Call into the slow lock path with the rtmutex->wait_lock
+	 * held, so this can't result in the following race:
+	 *
+	 * Reader1		Reader2		Writer
+	 *			down_read()
+	 *					down_write()
+	 *					rtmutex_lock(m)
+	 *					swait()
+	 * down_read()
+	 * unlock(m->wait_lock)
+	 *			up_read()
+	 *			swake()
+	 *					lock(m->wait_lock)
+	 *					sem->writelocked=true
+	 *					unlock(m->wait_lock)
+	 *
+	 *					up_write()
+	 *					sem->writelocked=false
+	 *					rtmutex_unlock(m)
+	 *			down_read()
+	 *					down_write()
+	 *					rtmutex_lock(m)
+	 *					swait()
+	 * rtmutex_lock(m)
+	 *
+	 * That would put Reader1 behind the writer waiting on
+	 * Reader2 to call up_read() which might be unbound.
+	 */
+	rt_mutex_init_waiter(&waiter, false);
+	ret = rt_mutex_slowlock_locked(m, state, NULL, RT_MUTEX_MIN_CHAINWALK,
+				       NULL, &waiter);
+	/*
+	 * The slowlock() above is guaranteed to return with the rtmutex (for
+	 * ret = 0) is now held, so there can't be a writer active. Increment
+	 * the reader count and immediately drop the rtmutex again.
+	 * For ret != 0 we don't hold the rtmutex and need unlock the wait_lock.
+	 * We don't own the lock then.
+	 */
+	if (!ret)
+		atomic_inc(&sem->readers);
+	raw_spin_unlock_irq(&m->wait_lock);
+	if (!ret)
+		__rt_mutex_unlock(m);
+
+	debug_rt_mutex_free_waiter(&waiter);
+	return ret;
+}
+
+void __down_read(struct rw_semaphore *sem)
+{
+	int ret;
+
+	ret = __down_read_common(sem, TASK_UNINTERRUPTIBLE);
+	WARN_ON_ONCE(ret);
+}
+
+int __down_read_interruptible(struct rw_semaphore *sem)
+{
+	int ret;
+
+	ret = __down_read_common(sem, TASK_INTERRUPTIBLE);
+	if (likely(!ret))
+		return ret;
+	WARN_ONCE(ret != -EINTR, "Unexpected state: %d\n", ret);
+	return -EINTR;
+}
+
+int __down_read_killable(struct rw_semaphore *sem)
+{
+	int ret;
+
+	ret = __down_read_common(sem, TASK_KILLABLE);
+	if (likely(!ret))
+		return ret;
+	WARN_ONCE(ret != -EINTR, "Unexpected state: %d\n", ret);
+	return -EINTR;
+}
+
+void __up_read(struct rw_semaphore *sem)
+{
+	struct rt_mutex *m = &sem->rtmutex;
+	struct task_struct *tsk;
+
+	/*
+	 * sem->readers can only hit 0 when a writer is waiting for the
+	 * active readers to leave the critical region.
+	 */
+	if (!atomic_dec_and_test(&sem->readers))
+		return;
+
+	raw_spin_lock_irq(&m->wait_lock);
+	/*
+	 * Wake the writer, i.e. the rtmutex owner. It might release the
+	 * rtmutex concurrently in the fast path (due to a signal), but to
+	 * clean up the rwsem it needs to acquire m->wait_lock. The worst
+	 * case which can happen is a spurious wakeup.
+	 */
+	tsk = rt_mutex_owner(m);
+	if (tsk)
+		wake_up_process(tsk);
+
+	raw_spin_unlock_irq(&m->wait_lock);
+}
+
+static void __up_write_unlock(struct rw_semaphore *sem, int bias,
+			      unsigned long flags)
+{
+	struct rt_mutex *m = &sem->rtmutex;
+
+	atomic_add(READER_BIAS - bias, &sem->readers);
+	raw_spin_unlock_irqrestore(&m->wait_lock, flags);
+	__rt_mutex_unlock(m);
+}
+
+static int __sched __down_write_common(struct rw_semaphore *sem, int state)
+{
+	struct rt_mutex *m = &sem->rtmutex;
+	unsigned long flags;
+
+	/* Take the rtmutex as a first step */
+	if (__rt_mutex_lock_state(m, state))
+		return -EINTR;
+
+	/* Force readers into slow path */
+	atomic_sub(READER_BIAS, &sem->readers);
+	might_sleep();
+
+	set_current_state(state);
+	for (;;) {
+		raw_spin_lock_irqsave(&m->wait_lock, flags);
+		/* Have all readers left the critical region? */
+		if (!atomic_read(&sem->readers)) {
+			atomic_set(&sem->readers, WRITER_BIAS);
+			__set_current_state(TASK_RUNNING);
+			raw_spin_unlock_irqrestore(&m->wait_lock, flags);
+			return 0;
+		}
+
+		if (signal_pending_state(state, current)) {
+			__set_current_state(TASK_RUNNING);
+			__up_write_unlock(sem, 0, flags);
+			return -EINTR;
+		}
+		raw_spin_unlock_irqrestore(&m->wait_lock, flags);
+
+		if (atomic_read(&sem->readers) != 0) {
+			schedule();
+			set_current_state(state);
+		}
+	}
+}
+
+void __sched __down_write(struct rw_semaphore *sem)
+{
+	__down_write_common(sem, TASK_UNINTERRUPTIBLE);
+}
+
+int __sched __down_write_killable(struct rw_semaphore *sem)
+{
+	return __down_write_common(sem, TASK_KILLABLE);
+}
+
+int __down_write_trylock(struct rw_semaphore *sem)
+{
+	struct rt_mutex *m = &sem->rtmutex;
+	unsigned long flags;
+
+	if (!__rt_mutex_trylock(m))
+		return 0;
+
+	atomic_sub(READER_BIAS, &sem->readers);
+
+	raw_spin_lock_irqsave(&m->wait_lock, flags);
+	if (!atomic_read(&sem->readers)) {
+		atomic_set(&sem->readers, WRITER_BIAS);
+		raw_spin_unlock_irqrestore(&m->wait_lock, flags);
+		return 1;
+	}
+	__up_write_unlock(sem, 0, flags);
+	return 0;
+}
+
+void __up_write(struct rw_semaphore *sem)
+{
+	struct rt_mutex *m = &sem->rtmutex;
+	unsigned long flags;
+
+	raw_spin_lock_irqsave(&m->wait_lock, flags);
+	__up_write_unlock(sem, WRITER_BIAS, flags);
+}
+
+void __downgrade_write(struct rw_semaphore *sem)
+{
+	struct rt_mutex *m = &sem->rtmutex;
+	unsigned long flags;
+
+	raw_spin_lock_irqsave(&m->wait_lock, flags);
+	/* Release it and account current as reader */
+	__up_write_unlock(sem, WRITER_BIAS - 1, flags);
+}
diff --git a/kernel/kernel/locking/spinlock.c b/kernel/kernel/locking/spinlock.c
index 936f3d1..e89b70f 100644
--- a/kernel/kernel/locking/spinlock.c
+++ b/kernel/kernel/locking/spinlock.c
@@ -117,8 +117,11 @@
  *         __[spin|read|write]_lock_bh()
  */
 BUILD_LOCK_OPS(spin, raw_spinlock);
+
+#ifndef CONFIG_PREEMPT_RT_FULL
 BUILD_LOCK_OPS(read, rwlock);
 BUILD_LOCK_OPS(write, rwlock);
+#endif
 
 #endif
 
@@ -201,6 +204,8 @@
 }
 EXPORT_SYMBOL(_raw_spin_unlock_bh);
 #endif
+
+#ifndef CONFIG_PREEMPT_RT_FULL
 
 #ifndef CONFIG_INLINE_READ_TRYLOCK
 int __lockfunc _raw_read_trylock(rwlock_t *lock)
@@ -346,6 +351,8 @@
 EXPORT_SYMBOL(_raw_write_unlock_bh);
 #endif
 
+#endif /* !PREEMPT_RT_FULL */
+
 #ifdef CONFIG_DEBUG_LOCK_ALLOC
 
 void __lockfunc _raw_spin_lock_nested(raw_spinlock_t *lock, int subclass)
diff --git a/kernel/kernel/locking/spinlock_debug.c b/kernel/kernel/locking/spinlock_debug.c
index 03595c2..d63df28 100644
--- a/kernel/kernel/locking/spinlock_debug.c
+++ b/kernel/kernel/locking/spinlock_debug.c
@@ -31,6 +31,7 @@
 
 EXPORT_SYMBOL(__raw_spin_lock_init);
 
+#ifndef CONFIG_PREEMPT_RT_FULL
 void __rwlock_init(rwlock_t *lock, const char *name,
 		   struct lock_class_key *key)
 {
@@ -48,6 +49,7 @@
 }
 
 EXPORT_SYMBOL(__rwlock_init);
+#endif
 
 static void spin_dump(raw_spinlock_t *lock, const char *msg)
 {
@@ -135,6 +137,7 @@
 	arch_spin_unlock(&lock->raw_lock);
 }
 
+#ifndef CONFIG_PREEMPT_RT_FULL
 static void rwlock_bug(rwlock_t *lock, const char *msg)
 {
 	if (!debug_locks_off())
@@ -224,3 +227,5 @@
 	debug_write_unlock(lock);
 	arch_write_unlock(&lock->raw_lock);
 }
+
+#endif
diff --git a/kernel/kernel/panic.c b/kernel/kernel/panic.c
index 6b33469..fcfc827 100644
--- a/kernel/kernel/panic.c
+++ b/kernel/kernel/panic.c
@@ -486,9 +486,11 @@
 
 static int init_oops_id(void)
 {
+#ifndef CONFIG_PREEMPT_RT_FULL
 	if (!oops_id)
 		get_random_bytes(&oops_id, sizeof(oops_id));
 	else
+#endif
 		oops_id++;
 
 	return 0;
diff --git a/kernel/kernel/power/hibernate.c b/kernel/kernel/power/hibernate.c
index 6670a44..25cd36d 100644
--- a/kernel/kernel/power/hibernate.c
+++ b/kernel/kernel/power/hibernate.c
@@ -690,6 +690,10 @@
 	return error;
 }
 
+#ifndef CONFIG_SUSPEND
+bool pm_in_action;
+#endif
+
 /**
  * hibernate - Carry out system hibernation, including saving the image.
  */
@@ -702,6 +706,8 @@
 		pm_pr_dbg("Hibernation not available.\n");
 		return -EPERM;
 	}
+
+	pm_in_action = true;
 
 	lock_system_sleep();
 	/* The snapshot device should not be opened while we're running */
@@ -781,6 +787,7 @@
 	atomic_inc(&snapshot_device_available);
  Unlock:
 	unlock_system_sleep();
+	pm_in_action = false;
 	pr_info("hibernation exit\n");
 
 	return error;
diff --git a/kernel/kernel/power/suspend.c b/kernel/kernel/power/suspend.c
index 5be1469..e6aad73 100644
--- a/kernel/kernel/power/suspend.c
+++ b/kernel/kernel/power/suspend.c
@@ -620,6 +620,8 @@
 	return error;
 }
 
+bool pm_in_action;
+
 /**
  * pm_suspend - Externally visible function for suspending the system.
  * @state: System sleep state to enter.
@@ -634,6 +636,7 @@
 	if (state <= PM_SUSPEND_ON || state >= PM_SUSPEND_MAX)
 		return -EINVAL;
 
+	pm_in_action = true;
 	pr_info("suspend entry (%s)\n", mem_sleep_labels[state]);
 
 	if (state == PM_SUSPEND_MEM_LITE || state == PM_SUSPEND_MEM_ULTRA)
@@ -647,6 +650,7 @@
 		suspend_stats.success++;
 	}
 	pr_info("suspend exit\n");
+	pm_in_action = false;
 	return error;
 }
 EXPORT_SYMBOL(pm_suspend);
diff --git a/kernel/kernel/power/wakeup_reason.c b/kernel/kernel/power/wakeup_reason.c
index 0a5f97a..e8f68d3 100644
--- a/kernel/kernel/power/wakeup_reason.c
+++ b/kernel/kernel/power/wakeup_reason.c
@@ -44,7 +44,7 @@
 	const char *irq_name;
 };
 
-static DEFINE_SPINLOCK(wakeup_reason_lock);
+static DEFINE_RAW_SPINLOCK(wakeup_reason_lock);
 
 static LIST_HEAD(leaf_irqs);   /* kept in ascending IRQ sorted order */
 static LIST_HEAD(parent_irqs); /* unordered */
@@ -149,17 +149,17 @@
 {
 	unsigned long flags;
 
-	spin_lock_irqsave(&wakeup_reason_lock, flags);
+	raw_spin_lock_irqsave(&wakeup_reason_lock, flags);
 
 	if (!capture_reasons) {
-		spin_unlock_irqrestore(&wakeup_reason_lock, flags);
+		raw_spin_unlock_irqrestore(&wakeup_reason_lock, flags);
 		return;
 	}
 
 	if (find_node_in_list(&parent_irqs, irq) == NULL)
 		add_sibling_node_sorted(&leaf_irqs, irq);
 
-	spin_unlock_irqrestore(&wakeup_reason_lock, flags);
+	raw_spin_unlock_irqrestore(&wakeup_reason_lock, flags);
 }
 
 void log_threaded_irq_wakeup_reason(int irq, int parent_irq)
@@ -177,10 +177,10 @@
 	if (!capture_reasons)
 		return;
 
-	spin_lock_irqsave(&wakeup_reason_lock, flags);
+	raw_spin_lock_irqsave(&wakeup_reason_lock, flags);
 
 	if (!capture_reasons || (find_node_in_list(&leaf_irqs, irq) != NULL)) {
-		spin_unlock_irqrestore(&wakeup_reason_lock, flags);
+		raw_spin_unlock_irqrestore(&wakeup_reason_lock, flags);
 		return;
 	}
 
@@ -196,7 +196,7 @@
 		}
 	}
 
-	spin_unlock_irqrestore(&wakeup_reason_lock, flags);
+	raw_spin_unlock_irqrestore(&wakeup_reason_lock, flags);
 }
 
 static void __log_abort_or_abnormal_wake(bool abort, const char *fmt,
@@ -204,11 +204,11 @@
 {
 	unsigned long flags;
 
-	spin_lock_irqsave(&wakeup_reason_lock, flags);
+	raw_spin_lock_irqsave(&wakeup_reason_lock, flags);
 
 	/* Suspend abort or abnormal wake reason has already been logged. */
 	if (suspend_abort || abnormal_wake) {
-		spin_unlock_irqrestore(&wakeup_reason_lock, flags);
+		raw_spin_unlock_irqrestore(&wakeup_reason_lock, flags);
 		return;
 	}
 
@@ -216,7 +216,7 @@
 	abnormal_wake = !abort;
 	vsnprintf(non_irq_wake_reason, MAX_SUSPEND_ABORT_LEN, fmt, args);
 
-	spin_unlock_irqrestore(&wakeup_reason_lock, flags);
+	raw_spin_unlock_irqrestore(&wakeup_reason_lock, flags);
 }
 
 void log_suspend_abort_reason(const char *fmt, ...)
@@ -241,7 +241,7 @@
 {
 	unsigned long flags;
 
-	spin_lock_irqsave(&wakeup_reason_lock, flags);
+	raw_spin_lock_irqsave(&wakeup_reason_lock, flags);
 
 	delete_list(&leaf_irqs);
 	delete_list(&parent_irqs);
@@ -249,7 +249,7 @@
 	abnormal_wake = false;
 	capture_reasons = true;
 
-	spin_unlock_irqrestore(&wakeup_reason_lock, flags);
+	raw_spin_unlock_irqrestore(&wakeup_reason_lock, flags);
 }
 
 static void print_wakeup_sources(void)
@@ -257,13 +257,13 @@
 	struct wakeup_irq_node *n;
 	unsigned long flags;
 
-	spin_lock_irqsave(&wakeup_reason_lock, flags);
+	raw_spin_lock_irqsave(&wakeup_reason_lock, flags);
 
 	capture_reasons = false;
 
 	if (suspend_abort) {
 		pr_info("Abort: %s\n", non_irq_wake_reason);
-		spin_unlock_irqrestore(&wakeup_reason_lock, flags);
+		raw_spin_unlock_irqrestore(&wakeup_reason_lock, flags);
 		return;
 	}
 
@@ -276,7 +276,7 @@
 	else
 		pr_info("Resume cause unknown\n");
 
-	spin_unlock_irqrestore(&wakeup_reason_lock, flags);
+	raw_spin_unlock_irqrestore(&wakeup_reason_lock, flags);
 }
 
 static ssize_t last_resume_reason_show(struct kobject *kobj,
@@ -286,12 +286,12 @@
 	struct wakeup_irq_node *n;
 	unsigned long flags;
 
-	spin_lock_irqsave(&wakeup_reason_lock, flags);
+	raw_spin_lock_irqsave(&wakeup_reason_lock, flags);
 
 	if (suspend_abort) {
 		buf_offset = scnprintf(buf, PAGE_SIZE, "Abort: %s",
 				       non_irq_wake_reason);
-		spin_unlock_irqrestore(&wakeup_reason_lock, flags);
+		raw_spin_unlock_irqrestore(&wakeup_reason_lock, flags);
 		return buf_offset;
 	}
 
@@ -304,7 +304,7 @@
 		buf_offset = scnprintf(buf, PAGE_SIZE, "-1 %s",
 				       non_irq_wake_reason);
 
-	spin_unlock_irqrestore(&wakeup_reason_lock, flags);
+	raw_spin_unlock_irqrestore(&wakeup_reason_lock, flags);
 
 	return buf_offset;
 }
diff --git a/kernel/kernel/printk/printk.c b/kernel/kernel/printk/printk.c
index a1f5484..611c7c9 100644
--- a/kernel/kernel/printk/printk.c
+++ b/kernel/kernel/printk/printk.c
@@ -429,6 +429,65 @@
 		printk_safe_exit_irqrestore(flags);	\
 	} while (0)
 
+#ifdef CONFIG_EARLY_PRINTK
+struct console *early_console;
+
+static void early_vprintk(const char *fmt, va_list ap)
+{
+	if (early_console) {
+		char buf[512];
+		int n = vscnprintf(buf, sizeof(buf), fmt, ap);
+
+		early_console->write(early_console, buf, n);
+	}
+}
+
+asmlinkage void early_printk(const char *fmt, ...)
+{
+	va_list ap;
+
+	va_start(ap, fmt);
+	early_vprintk(fmt, ap);
+	va_end(ap);
+}
+
+/*
+ * This is independent of any log levels - a global
+ * kill switch that turns off all of printk.
+ *
+ * Used by the NMI watchdog if early-printk is enabled.
+ */
+static bool __read_mostly printk_killswitch;
+
+static int __init force_early_printk_setup(char *str)
+{
+	printk_killswitch = true;
+	return 0;
+}
+early_param("force_early_printk", force_early_printk_setup);
+
+void printk_kill(void)
+{
+	printk_killswitch = true;
+}
+
+#ifdef CONFIG_PRINTK
+static int forced_early_printk(const char *fmt, va_list ap)
+{
+	if (!printk_killswitch)
+		return 0;
+	early_vprintk(fmt, ap);
+	return 1;
+}
+#endif
+
+#else
+static inline int forced_early_printk(const char *fmt, va_list ap)
+{
+	return 0;
+}
+#endif
+
 #ifdef CONFIG_PRINTK
 DECLARE_WAIT_QUEUE_HEAD(log_wait);
 /* the next printk record to read by syslog(READ) or /proc/kmsg */
@@ -1517,12 +1576,23 @@
 	u64 next_seq;
 	u64 seq;
 	u32 idx;
+	int attempts = 0;
+	int num_msg;
 
 	text = kmalloc(LOG_LINE_MAX + PREFIX_MAX, GFP_KERNEL);
 	if (!text)
 		return -ENOMEM;
 
 	logbuf_lock_irq();
+
+try_again:
+	attempts++;
+	if (attempts > 10) {
+		len = -EBUSY;
+		goto out;
+	}
+	num_msg = 0;
+
 	/*
 	 * Find first record that fits, including all following records,
 	 * into the user-provided buffer for this dump.
@@ -1535,6 +1605,14 @@
 		len += msg_print_text(msg, true, NULL, 0);
 		idx = log_next(idx);
 		seq++;
+		num_msg++;
+		if (num_msg > 5) {
+			num_msg = 0;
+			logbuf_unlock_irq();
+			logbuf_lock_irq();
+			if (clear_seq < log_first_seq)
+				goto try_again;
+		}
 	}
 
 	/* move first record forward until length fits into the buffer */
@@ -1546,6 +1624,14 @@
 		len -= msg_print_text(msg, true, NULL, 0);
 		idx = log_next(idx);
 		seq++;
+		num_msg++;
+		if (num_msg > 5) {
+			num_msg = 0;
+			logbuf_unlock_irq();
+			logbuf_lock_irq();
+			if (clear_seq < log_first_seq)
+				goto try_again;
+		}
 	}
 
 	/* last message fitting into this dump */
@@ -1583,6 +1669,7 @@
 		clear_seq = log_next_seq;
 		clear_idx = log_next_idx;
 	}
+out:
 	logbuf_unlock_irq();
 
 	kfree(text);
@@ -1714,6 +1801,7 @@
 	return do_syslog(type, buf, len, SYSLOG_FROM_READER);
 }
 
+#ifndef CONFIG_PREEMPT_RT_FULL
 /*
  * Special console_lock variants that help to reduce the risk of soft-lockups.
  * They allow to pass console_lock to another printk() call using a busy wait.
@@ -1854,6 +1942,15 @@
 	return 1;
 }
 
+#else
+
+static int console_trylock_spinning(void)
+{
+	return console_trylock();
+}
+
+#endif
+
 /*
  * Call the console drivers, asking them to write out
  * log_buf[start] to log_buf[end - 1].
@@ -1872,6 +1969,12 @@
 	if (!console_drivers)
 		return;
 
+	if (IS_ENABLED(CONFIG_PREEMPT_RT_BASE)) {
+		if (in_irq() || in_nmi())
+			return;
+	}
+
+	migrate_disable();
 	for_each_console(con) {
 		if (exclusive_console && con != exclusive_console)
 			continue;
@@ -1887,6 +1990,7 @@
 		else
 			con->write(con, text, len);
 	}
+	migrate_enable();
 }
 
 int printk_delay_msec __read_mostly;
@@ -2057,6 +2161,13 @@
 	unsigned long flags;
 	u64 curr_log_seq;
 
+	/*
+	 * Fall back to early_printk if a debugging subsystem has
+	 * killed printk output
+	 */
+	if (unlikely(forced_early_printk(fmt, args)))
+		return 1;
+
 	if (level == LOGLEVEL_SCHED) {
 		level = LOGLEVEL_DEFAULT;
 		in_sched = true;
@@ -2074,20 +2185,30 @@
 
 	/* If called from the scheduler, we can not call up(). */
 	if (!in_sched && pending_output) {
+		int may_trylock = 1;
+
+#ifdef CONFIG_PREEMPT_RT_FULL
+		/*
+		 * we can't take a sleeping lock with IRQs or preeption disabled
+		 * so we can't print in these contexts
+		 */
+		if (!(preempt_count() == 0 && !irqs_disabled()))
+			may_trylock = 0;
+#endif
 		/*
 		 * Disable preemption to avoid being preempted while holding
 		 * console_sem which would prevent anyone from printing to
 		 * console
 		 */
-		preempt_disable();
+		migrate_disable();
 		/*
 		 * Try to acquire and then immediately release the console
 		 * semaphore.  The release will print out buffers and wake up
 		 * /dev/kmsg and syslog() users.
 		 */
-		if (console_trylock_spinning())
+		if (may_trylock && console_trylock_spinning())
 			console_unlock();
-		preempt_enable();
+		migrate_enable();
 	}
 
 	if (pending_output)
@@ -2200,26 +2321,6 @@
 static bool suppress_message_printing(int level) { return false; }
 
 #endif /* CONFIG_PRINTK */
-
-#ifdef CONFIG_EARLY_PRINTK
-struct console *early_console;
-
-asmlinkage __visible void early_printk(const char *fmt, ...)
-{
-	va_list ap;
-	char buf[512];
-	int n;
-
-	if (!early_console)
-		return;
-
-	va_start(ap, fmt);
-	n = vscnprintf(buf, sizeof(buf), fmt, ap);
-	va_end(ap);
-
-	early_console->write(early_console, buf, n);
-}
-#endif
 
 static int __add_preferred_console(char *name, int idx, char *options,
 				   char *brl_options)
@@ -2579,6 +2680,10 @@
 		console_seq++;
 		raw_spin_unlock(&logbuf_lock);
 
+#ifdef CONFIG_PREEMPT_RT_FULL
+		printk_safe_exit_irqrestore(flags);
+		call_console_drivers(ext_text, ext_len, text, len);
+#else
 		/*
 		 * While actively printing out messages, if another printk()
 		 * were to occur on another CPU, it may wait for this one to
@@ -2601,6 +2706,7 @@
 		}
 
 		printk_safe_exit_irqrestore(flags);
+#endif
 
 		if (do_cond_resched)
 			cond_resched();
@@ -2648,6 +2754,11 @@
 {
 	struct console *c;
 
+	if (IS_ENABLED(CONFIG_PREEMPT_RT_BASE)) {
+		if (in_irq() || in_nmi())
+			return;
+	}
+
 	/*
 	 * console_unblank can no longer be called in interrupt context unless
 	 * oops_in_progress is set to 1..
diff --git a/kernel/kernel/ptrace.c b/kernel/kernel/ptrace.c
index af74e84..6a4eefa 100644
--- a/kernel/kernel/ptrace.c
+++ b/kernel/kernel/ptrace.c
@@ -190,7 +190,14 @@
 	spin_lock_irq(&task->sighand->siglock);
 	if (task_is_traced(task) && !looks_like_a_spurious_pid(task) &&
 	    !__fatal_signal_pending(task)) {
-		task->state = __TASK_TRACED;
+		unsigned long flags;
+
+		raw_spin_lock_irqsave(&task->pi_lock, flags);
+		if (task->state & __TASK_TRACED)
+			task->state = __TASK_TRACED;
+		else
+			task->saved_state = __TASK_TRACED;
+		raw_spin_unlock_irqrestore(&task->pi_lock, flags);
 		ret = true;
 	}
 	spin_unlock_irq(&task->sighand->siglock);
@@ -200,8 +207,8 @@
 
 static void ptrace_unfreeze_traced(struct task_struct *task)
 {
-	if (task->state != __TASK_TRACED)
-		return;
+	unsigned long flags;
+	bool frozen = true;
 
 	WARN_ON(!task->ptrace || task->parent != current);
 
@@ -210,12 +217,19 @@
 	 * Recheck state under the lock to close this race.
 	 */
 	spin_lock_irq(&task->sighand->siglock);
-	if (task->state == __TASK_TRACED) {
-		if (__fatal_signal_pending(task))
-			wake_up_state(task, __TASK_TRACED);
-		else
-			task->state = TASK_TRACED;
-	}
+
+	raw_spin_lock_irqsave(&task->pi_lock, flags);
+	if (task->state == __TASK_TRACED)
+		task->state = TASK_TRACED;
+	else if (task->saved_state == __TASK_TRACED)
+		task->saved_state = TASK_TRACED;
+	else
+		frozen = false;
+	raw_spin_unlock_irqrestore(&task->pi_lock, flags);
+
+	if (frozen && __fatal_signal_pending(task))
+		wake_up_state(task, __TASK_TRACED);
+
 	spin_unlock_irq(&task->sighand->siglock);
 }
 
diff --git a/kernel/kernel/rcu/Kconfig b/kernel/kernel/rcu/Kconfig
index 9210379..a243a78 100644
--- a/kernel/kernel/rcu/Kconfig
+++ b/kernel/kernel/rcu/Kconfig
@@ -172,7 +172,7 @@
 
 config RCU_FAST_NO_HZ
 	bool "Accelerate last non-dyntick-idle CPU's grace periods"
-	depends on NO_HZ_COMMON && SMP && RCU_EXPERT
+	depends on NO_HZ_COMMON && SMP && RCU_EXPERT && !PREEMPT_RT_FULL
 	default n
 	help
 	  This option permits CPUs to enter dynticks-idle state even if
@@ -190,8 +190,8 @@
 
 config RCU_BOOST
 	bool "Enable RCU priority boosting"
-	depends on RT_MUTEXES && PREEMPT_RCU && RCU_EXPERT
-	default n
+	depends on (RT_MUTEXES && PREEMPT_RCU && RCU_EXPERT) || PREEMPT_RT_FULL
+	default y if PREEMPT_RT_FULL
 	help
 	  This option boosts the priority of preempted RCU readers that
 	  block the current preemptible RCU grace period for too long.
diff --git a/kernel/kernel/rcu/rcu.h b/kernel/kernel/rcu/rcu.h
index 4d04683..808cce9 100644
--- a/kernel/kernel/rcu/rcu.h
+++ b/kernel/kernel/rcu/rcu.h
@@ -528,7 +528,6 @@
 static inline int rcu_get_gp_kthreads_prio(void) { return 0; }
 #else /* #ifdef CONFIG_TINY_RCU */
 unsigned long rcu_get_gp_seq(void);
-unsigned long rcu_bh_get_gp_seq(void);
 unsigned long rcu_sched_get_gp_seq(void);
 unsigned long rcu_exp_batches_completed(void);
 unsigned long rcu_exp_batches_completed_sched(void);
@@ -536,10 +535,18 @@
 void show_rcu_gp_kthreads(void);
 int rcu_get_gp_kthreads_prio(void);
 void rcu_force_quiescent_state(void);
-void rcu_bh_force_quiescent_state(void);
 void rcu_sched_force_quiescent_state(void);
 extern struct workqueue_struct *rcu_gp_wq;
 extern struct workqueue_struct *rcu_par_gp_wq;
+
+#ifdef CONFIG_PREEMPT_RT_FULL
+#define rcu_bh_get_gp_seq		rcu_get_gp_seq
+#define rcu_bh_force_quiescent_state	rcu_force_quiescent_state
+#else
+unsigned long rcu_bh_get_gp_seq(void);
+void rcu_bh_force_quiescent_state(void);
+#endif
+
 #endif /* #else #ifdef CONFIG_TINY_RCU */
 
 #ifdef CONFIG_RCU_NOCB_CPU
diff --git a/kernel/kernel/rcu/rcutorture.c b/kernel/kernel/rcu/rcutorture.c
index 0b7af7e..e95d121 100644
--- a/kernel/kernel/rcu/rcutorture.c
+++ b/kernel/kernel/rcu/rcutorture.c
@@ -434,6 +434,7 @@
 	.name		= "rcu"
 };
 
+#ifndef CONFIG_PREEMPT_RT_FULL
 /*
  * Definitions for rcu_bh torture testing.
  */
@@ -475,6 +476,12 @@
 	.name		= "rcu_bh"
 };
 
+#else
+static struct rcu_torture_ops rcu_bh_ops = {
+	.ttype		= INVALID_RCU_FLAVOR,
+};
+#endif
+
 /*
  * Don't even think about trying any of these in real life!!!
  * The names includes "busted", and they really means it!
diff --git a/kernel/kernel/rcu/srcutree.c b/kernel/kernel/rcu/srcutree.c
index 1ff17e2..0f09a1a 100644
--- a/kernel/kernel/rcu/srcutree.c
+++ b/kernel/kernel/rcu/srcutree.c
@@ -38,6 +38,8 @@
 #include <linux/delay.h>
 #include <linux/module.h>
 #include <linux/srcu.h>
+#include <linux/cpu.h>
+#include <linux/locallock.h>
 
 #include "rcu.h"
 #include "rcu_segcblist.h"
@@ -461,21 +463,6 @@
 }
 
 /*
- * Track online CPUs to guide callback workqueue placement.
- */
-DEFINE_PER_CPU(bool, srcu_online);
-
-void srcu_online_cpu(unsigned int cpu)
-{
-	WRITE_ONCE(per_cpu(srcu_online, cpu), true);
-}
-
-void srcu_offline_cpu(unsigned int cpu)
-{
-	WRITE_ONCE(per_cpu(srcu_online, cpu), false);
-}
-
-/*
  * Place the workqueue handler on the specified CPU if online, otherwise
  * just run it whereever.  This is useful for placing workqueue handlers
  * that are to invoke the specified CPU's callbacks.
@@ -486,12 +473,12 @@
 {
 	bool ret;
 
-	preempt_disable();
-	if (READ_ONCE(per_cpu(srcu_online, cpu)))
+	cpus_read_lock();
+	if (cpu_online(cpu))
 		ret = queue_delayed_work_on(cpu, wq, dwork, delay);
 	else
 		ret = queue_delayed_work(wq, dwork, delay);
-	preempt_enable();
+	cpus_read_unlock();
 	return ret;
 }
 
@@ -774,6 +761,8 @@
  * negligible when amoritized over that time period, and the extra latency
  * of a needlessly non-expedited grace period is similarly negligible.
  */
+static DEFINE_LOCAL_IRQ_LOCK(sp_llock);
+
 static bool srcu_might_be_idle(struct srcu_struct *sp)
 {
 	unsigned long curseq;
@@ -782,13 +771,13 @@
 	unsigned long t;
 
 	/* If the local srcu_data structure has callbacks, not idle.  */
-	local_irq_save(flags);
+	local_lock_irqsave(sp_llock, flags);
 	sdp = this_cpu_ptr(sp->sda);
 	if (rcu_segcblist_pend_cbs(&sdp->srcu_cblist)) {
-		local_irq_restore(flags);
+		local_unlock_irqrestore(sp_llock, flags);
 		return false; /* Callbacks already present, so not idle. */
 	}
-	local_irq_restore(flags);
+	local_unlock_irqrestore(sp_llock, flags);
 
 	/*
 	 * No local callbacks, so probabalistically probe global state.
@@ -866,7 +855,7 @@
 		return;
 	}
 	rhp->func = func;
-	local_irq_save(flags);
+	local_lock_irqsave(sp_llock, flags);
 	sdp = this_cpu_ptr(sp->sda);
 	spin_lock_rcu_node(sdp);
 	rcu_segcblist_enqueue(&sdp->srcu_cblist, rhp, false);
@@ -882,7 +871,8 @@
 		sdp->srcu_gp_seq_needed_exp = s;
 		needexp = true;
 	}
-	spin_unlock_irqrestore_rcu_node(sdp, flags);
+	spin_unlock_rcu_node(sdp);
+	local_unlock_irqrestore(sp_llock, flags);
 	if (needgp)
 		srcu_funnel_gp_start(sp, sdp, s, do_norm);
 	else if (needexp)
diff --git a/kernel/kernel/rcu/tree.c b/kernel/kernel/rcu/tree.c
index 1c5a4ee..1cebf94 100644
--- a/kernel/kernel/rcu/tree.c
+++ b/kernel/kernel/rcu/tree.c
@@ -61,6 +61,13 @@
 #include <linux/trace_events.h>
 #include <linux/suspend.h>
 #include <linux/ftrace.h>
+#include <linux/delay.h>
+#include <linux/gfp.h>
+#include <linux/oom.h>
+#include <linux/smpboot.h>
+#include <linux/jiffies.h>
+#include <linux/sched/isolation.h>
+#include "../time/tick-internal.h"
 
 #include "tree.h"
 #include "rcu.h"
@@ -245,6 +252,19 @@
 			   this_cpu_ptr(&rcu_sched_data), true);
 }
 
+#ifdef CONFIG_PREEMPT_RT_FULL
+static void rcu_preempt_qs(void);
+
+void rcu_bh_qs(void)
+{
+	unsigned long flags;
+
+	/* Callers to this function, rcu_preempt_qs(), must disable irqs. */
+	local_irq_save(flags);
+	rcu_preempt_qs();
+	local_irq_restore(flags);
+}
+#else
 void rcu_bh_qs(void)
 {
 	RCU_LOCKDEP_WARN(preemptible(), "rcu_bh_qs() invoked with preemption enabled!!!");
@@ -255,6 +275,7 @@
 		__this_cpu_write(rcu_bh_data.cpu_no_qs.b.norm, false);
 	}
 }
+#endif
 
 /*
  * Steal a bit from the bottom of ->dynticks for idle entry/exit
@@ -569,6 +590,7 @@
 }
 EXPORT_SYMBOL_GPL(rcu_sched_get_gp_seq);
 
+#ifndef CONFIG_PREEMPT_RT_FULL
 /*
  * Return the number of RCU-bh GPs completed thus far for debug & stats.
  */
@@ -577,6 +599,7 @@
 	return READ_ONCE(rcu_bh_state.gp_seq);
 }
 EXPORT_SYMBOL_GPL(rcu_bh_get_gp_seq);
+#endif
 
 /*
  * Return the number of RCU expedited batches completed thus far for
@@ -600,6 +623,7 @@
 }
 EXPORT_SYMBOL_GPL(rcu_exp_batches_completed_sched);
 
+#ifndef CONFIG_PREEMPT_RT_FULL
 /*
  * Force a quiescent state.
  */
@@ -617,6 +641,13 @@
 	force_quiescent_state(&rcu_bh_state);
 }
 EXPORT_SYMBOL_GPL(rcu_bh_force_quiescent_state);
+
+#else
+void rcu_force_quiescent_state(void)
+{
+}
+EXPORT_SYMBOL_GPL(rcu_force_quiescent_state);
+#endif
 
 /*
  * Force a quiescent state for RCU-sched.
@@ -675,9 +706,11 @@
 	case RCU_FLAVOR:
 		rsp = rcu_state_p;
 		break;
+#ifndef CONFIG_PREEMPT_RT_FULL
 	case RCU_BH_FLAVOR:
 		rsp = &rcu_bh_state;
 		break;
+#endif
 	case RCU_SCHED_FLAVOR:
 		rsp = &rcu_sched_state;
 		break;
@@ -1264,6 +1297,7 @@
 		    !rdp->rcu_iw_pending && rdp->rcu_iw_gp_seq != rnp->gp_seq &&
 		    (rnp->ffmask & rdp->grpmask)) {
 			init_irq_work(&rdp->rcu_iw, rcu_iw_handler);
+			rdp->rcu_iw.flags = IRQ_WORK_HARD_IRQ;
 			rdp->rcu_iw_pending = true;
 			rdp->rcu_iw_gp_seq = rnp->gp_seq;
 			irq_work_queue_on(&rdp->rcu_iw, rdp->cpu);
@@ -2873,18 +2907,17 @@
 /*
  * Do RCU core processing for the current CPU.
  */
-static __latent_entropy void rcu_process_callbacks(struct softirq_action *unused)
+static __latent_entropy void rcu_process_callbacks(void)
 {
 	struct rcu_state *rsp;
 
 	if (cpu_is_offline(smp_processor_id()))
 		return;
-	trace_rcu_utilization(TPS("Start RCU core"));
 	for_each_rcu_flavor(rsp)
 		__rcu_process_callbacks(rsp);
-	trace_rcu_utilization(TPS("End RCU core"));
 }
 
+static DEFINE_PER_CPU(struct task_struct *, rcu_cpu_kthread_task);
 /*
  * Schedule RCU callback invocation.  If the specified type of RCU
  * does not support RCU priority boosting, just do a direct call,
@@ -2896,18 +2929,105 @@
 {
 	if (unlikely(!READ_ONCE(rcu_scheduler_fully_active)))
 		return;
-	if (likely(!rsp->boost)) {
-		rcu_do_batch(rsp, rdp);
-		return;
-	}
-	invoke_rcu_callbacks_kthread();
+	rcu_do_batch(rsp, rdp);
 }
 
+static void rcu_wake_cond(struct task_struct *t, int status)
+{
+	/*
+	 * If the thread is yielding, only wake it when this
+	 * is invoked from idle
+	 */
+	if (t && (status != RCU_KTHREAD_YIELDING || is_idle_task(current)))
+		wake_up_process(t);
+}
+
+/*
+ * Wake up this CPU's rcuc kthread to do RCU core processing.
+ */
 static void invoke_rcu_core(void)
 {
-	if (cpu_online(smp_processor_id()))
-		raise_softirq(RCU_SOFTIRQ);
+	unsigned long flags;
+	struct task_struct *t;
+
+	if (!cpu_online(smp_processor_id()))
+		return;
+	local_irq_save(flags);
+	__this_cpu_write(rcu_cpu_has_work, 1);
+	t = __this_cpu_read(rcu_cpu_kthread_task);
+	if (t != NULL && current != t)
+		rcu_wake_cond(t, __this_cpu_read(rcu_cpu_kthread_status));
+	local_irq_restore(flags);
 }
+
+static void rcu_cpu_kthread_park(unsigned int cpu)
+{
+	per_cpu(rcu_cpu_kthread_status, cpu) = RCU_KTHREAD_OFFCPU;
+}
+
+static int rcu_cpu_kthread_should_run(unsigned int cpu)
+{
+	return __this_cpu_read(rcu_cpu_has_work);
+}
+
+/*
+ * Per-CPU kernel thread that invokes RCU callbacks.  This replaces the
+ * RCU softirq used in flavors and configurations of RCU that do not
+ * support RCU priority boosting.
+ */
+static void rcu_cpu_kthread(unsigned int cpu)
+{
+	unsigned int *statusp = this_cpu_ptr(&rcu_cpu_kthread_status);
+	char work, *workp = this_cpu_ptr(&rcu_cpu_has_work);
+	int spincnt;
+
+	for (spincnt = 0; spincnt < 10; spincnt++) {
+		trace_rcu_utilization(TPS("Start CPU kthread@rcu_wait"));
+		local_bh_disable();
+		*statusp = RCU_KTHREAD_RUNNING;
+		this_cpu_inc(rcu_cpu_kthread_loops);
+		local_irq_disable();
+		work = *workp;
+		*workp = 0;
+		local_irq_enable();
+		if (work)
+			rcu_process_callbacks();
+		local_bh_enable();
+		if (*workp == 0) {
+			trace_rcu_utilization(TPS("End CPU kthread@rcu_wait"));
+			*statusp = RCU_KTHREAD_WAITING;
+			return;
+		}
+	}
+	*statusp = RCU_KTHREAD_YIELDING;
+	trace_rcu_utilization(TPS("Start CPU kthread@rcu_yield"));
+	schedule_timeout_interruptible(2);
+	trace_rcu_utilization(TPS("End CPU kthread@rcu_yield"));
+	*statusp = RCU_KTHREAD_WAITING;
+}
+
+static struct smp_hotplug_thread rcu_cpu_thread_spec = {
+	.store			= &rcu_cpu_kthread_task,
+	.thread_should_run	= rcu_cpu_kthread_should_run,
+	.thread_fn		= rcu_cpu_kthread,
+	.thread_comm		= "rcuc/%u",
+	.setup			= rcu_cpu_kthread_setup,
+	.park			= rcu_cpu_kthread_park,
+};
+
+/*
+ * Spawn per-CPU RCU core processing kthreads.
+ */
+static int __init rcu_spawn_core_kthreads(void)
+{
+	int cpu;
+
+	for_each_possible_cpu(cpu)
+		per_cpu(rcu_cpu_has_work, cpu) = 0;
+	BUG_ON(smpboot_register_percpu_thread(&rcu_cpu_thread_spec));
+	return 0;
+}
+early_initcall(rcu_spawn_core_kthreads);
 
 /*
  * Handle any core-RCU processing required by a call_rcu() invocation.
@@ -3060,6 +3180,7 @@
 }
 EXPORT_SYMBOL_GPL(call_rcu_sched);
 
+#ifndef CONFIG_PREEMPT_RT_FULL
 /**
  * call_rcu_bh() - Queue an RCU for invocation after a quicker grace period.
  * @head: structure to be used for queueing the RCU updates.
@@ -3087,6 +3208,7 @@
 	__call_rcu(head, func, &rcu_bh_state, -1, 0);
 }
 EXPORT_SYMBOL_GPL(call_rcu_bh);
+#endif
 
 /*
  * Queue an RCU callback for lazy invocation after a grace period.
@@ -3172,6 +3294,7 @@
 }
 EXPORT_SYMBOL_GPL(synchronize_sched);
 
+#ifndef CONFIG_PREEMPT_RT_FULL
 /**
  * synchronize_rcu_bh - wait until an rcu_bh grace period has elapsed.
  *
@@ -3198,6 +3321,7 @@
 		wait_rcu_gp(call_rcu_bh);
 }
 EXPORT_SYMBOL_GPL(synchronize_rcu_bh);
+#endif
 
 /**
  * get_state_synchronize_rcu - Snapshot current RCU state
@@ -3505,6 +3629,7 @@
 	mutex_unlock(&rsp->barrier_mutex);
 }
 
+#ifndef CONFIG_PREEMPT_RT_FULL
 /**
  * rcu_barrier_bh - Wait until all in-flight call_rcu_bh() callbacks complete.
  */
@@ -3513,6 +3638,7 @@
 	_rcu_barrier(&rcu_bh_state);
 }
 EXPORT_SYMBOL_GPL(rcu_barrier_bh);
+#endif
 
 /**
  * rcu_barrier_sched - Wait for in-flight call_rcu_sched() callbacks.
@@ -3662,8 +3788,6 @@
 		rnp->ffmask |= rdp->grpmask;
 		raw_spin_unlock_irqrestore_rcu_node(rnp, flags);
 	}
-	if (IS_ENABLED(CONFIG_TREE_SRCU))
-		srcu_online_cpu(cpu);
 	if (rcu_scheduler_active == RCU_SCHEDULER_INACTIVE)
 		return 0; /* Too early in boot for scheduler work. */
 	sync_sched_exp_online_cleanup(cpu);
@@ -3691,8 +3815,6 @@
 	}
 
 	rcutree_affinity_setting(cpu, cpu);
-	if (IS_ENABLED(CONFIG_TREE_SRCU))
-		srcu_offline_cpu(cpu);
 	return 0;
 }
 
@@ -4160,12 +4282,13 @@
 
 	rcu_bootup_announce();
 	rcu_init_geometry();
+#ifndef CONFIG_PREEMPT_RT_FULL
 	rcu_init_one(&rcu_bh_state);
+#endif
 	rcu_init_one(&rcu_sched_state);
 	if (dump_tree)
 		rcu_dump_rcu_node_tree(&rcu_sched_state);
 	__rcu_init_preempt();
-	open_softirq(RCU_SOFTIRQ, rcu_process_callbacks);
 
 	/*
 	 * We don't need protection against CPU-hotplug here because
diff --git a/kernel/kernel/rcu/tree.h b/kernel/kernel/rcu/tree.h
index 4e74df7..98257d2 100644
--- a/kernel/kernel/rcu/tree.h
+++ b/kernel/kernel/rcu/tree.h
@@ -413,7 +413,9 @@
  */
 extern struct rcu_state rcu_sched_state;
 
+#ifndef CONFIG_PREEMPT_RT_FULL
 extern struct rcu_state rcu_bh_state;
+#endif
 
 #ifdef CONFIG_PREEMPT_RCU
 extern struct rcu_state rcu_preempt_state;
@@ -421,12 +423,10 @@
 
 int rcu_dynticks_snap(struct rcu_dynticks *rdtp);
 
-#ifdef CONFIG_RCU_BOOST
 DECLARE_PER_CPU(unsigned int, rcu_cpu_kthread_status);
 DECLARE_PER_CPU(int, rcu_cpu_kthread_cpu);
 DECLARE_PER_CPU(unsigned int, rcu_cpu_kthread_loops);
 DECLARE_PER_CPU(char, rcu_cpu_has_work);
-#endif /* #ifdef CONFIG_RCU_BOOST */
 
 #ifndef RCU_TREE_NONCORE
 
@@ -449,8 +449,8 @@
 			    int ncheck);
 static void rcu_initiate_boost(struct rcu_node *rnp, unsigned long flags);
 static void rcu_preempt_boost_start_gp(struct rcu_node *rnp);
-static void invoke_rcu_callbacks_kthread(void);
 static bool rcu_is_callbacks_kthread(void);
+static void rcu_cpu_kthread_setup(unsigned int cpu);
 #ifdef CONFIG_RCU_BOOST
 static int rcu_spawn_one_boost_kthread(struct rcu_state *rsp,
 						 struct rcu_node *rnp);
diff --git a/kernel/kernel/rcu/tree_exp.h b/kernel/kernel/rcu/tree_exp.h
index 72770a5..ac6d6fd 100644
--- a/kernel/kernel/rcu/tree_exp.h
+++ b/kernel/kernel/rcu/tree_exp.h
@@ -472,7 +472,6 @@
 static void sync_rcu_exp_select_cpus(struct rcu_state *rsp,
 				     smp_call_func_t func)
 {
-	int cpu;
 	struct rcu_node *rnp;
 
 	trace_rcu_exp_grace_period(rsp->name, rcu_exp_gp_seq_endval(rsp), TPS("reset"));
@@ -494,13 +493,7 @@
 			continue;
 		}
 		INIT_WORK(&rnp->rew.rew_work, sync_rcu_exp_select_node_cpus);
-		preempt_disable();
-		cpu = cpumask_next(rnp->grplo - 1, cpu_online_mask);
-		/* If all offline, queue the work on an unbound CPU. */
-		if (unlikely(cpu > rnp->grphi))
-			cpu = WORK_CPU_UNBOUND;
-		queue_work_on(cpu, rcu_par_gp_wq, &rnp->rew.rew_work);
-		preempt_enable();
+		queue_work_on(rnp->grplo, rcu_par_gp_wq, &rnp->rew.rew_work);
 		rnp->exp_need_flush = true;
 	}
 
diff --git a/kernel/kernel/rcu/tree_plugin.h b/kernel/kernel/rcu/tree_plugin.h
index 5f6de49..56639c8 100644
--- a/kernel/kernel/rcu/tree_plugin.h
+++ b/kernel/kernel/rcu/tree_plugin.h
@@ -24,40 +24,15 @@
  *	   Paul E. McKenney <paulmck@linux.vnet.ibm.com>
  */
 
-#include <linux/delay.h>
-#include <linux/gfp.h>
-#include <linux/oom.h>
-#include <linux/sched/debug.h>
-#include <linux/smpboot.h>
-#include <linux/sched/isolation.h>
-#include <uapi/linux/sched/types.h>
-#include "../time/tick-internal.h"
-
-#ifdef CONFIG_RCU_BOOST
-
 #include "../locking/rtmutex_common.h"
 
 /*
  * Control variables for per-CPU and per-rcu_node kthreads.  These
  * handle all flavors of RCU.
  */
-static DEFINE_PER_CPU(struct task_struct *, rcu_cpu_kthread_task);
 DEFINE_PER_CPU(unsigned int, rcu_cpu_kthread_status);
 DEFINE_PER_CPU(unsigned int, rcu_cpu_kthread_loops);
 DEFINE_PER_CPU(char, rcu_cpu_has_work);
-
-#else /* #ifdef CONFIG_RCU_BOOST */
-
-/*
- * Some architectures do not define rt_mutexes, but if !CONFIG_RCU_BOOST,
- * all uses are in dead code.  Provide a definition to keep the compiler
- * happy, but add WARN_ON_ONCE() to complain if used in the wrong place.
- * This probably needs to be excluded from -rt builds.
- */
-#define rt_mutex_owner(a) ({ WARN_ON_ONCE(1); NULL; })
-#define rt_mutex_futex_unlock(x) WARN_ON_ONCE(1)
-
-#endif /* #else #ifdef CONFIG_RCU_BOOST */
 
 #ifdef CONFIG_RCU_NOCB_CPU
 static cpumask_var_t rcu_nocb_mask; /* CPUs to have callbacks offloaded. */
@@ -337,9 +312,13 @@
 	struct task_struct *t = current;
 	struct rcu_data *rdp;
 	struct rcu_node *rnp;
+	int sleeping_l = 0;
 
 	lockdep_assert_irqs_disabled();
-	WARN_ON_ONCE(!preempt && t->rcu_read_lock_nesting > 0);
+#if defined(CONFIG_PREEMPT_RT_FULL)
+	sleeping_l = t->sleeping_lock;
+#endif
+	WARN_ON_ONCE(!preempt && t->rcu_read_lock_nesting > 0 && !sleeping_l);
 	if (t->rcu_read_lock_nesting > 0 &&
 	    !t->rcu_read_unlock_special.b.blocked) {
 
@@ -520,7 +499,7 @@
 	}
 
 	/* Hardware IRQ handlers cannot block, complain if they get here. */
-	if (in_irq() || in_serving_softirq()) {
+	if (preempt_count() & (HARDIRQ_MASK | SOFTIRQ_OFFSET)) {
 		lockdep_rcu_suspicious(__FILE__, __LINE__,
 				       "rcu_read_unlock() from irq or softirq with blocking in critical section!!!\n");
 		pr_alert("->rcu_read_unlock_special: %#x (b: %d, enq: %d nq: %d)\n",
@@ -1023,17 +1002,20 @@
 
 #endif /* #else #ifdef CONFIG_PREEMPT_RCU */
 
-#ifdef CONFIG_RCU_BOOST
-
-static void rcu_wake_cond(struct task_struct *t, int status)
+/*
+ * If boosting, set rcuc kthreads to realtime priority.
+ */
+static void rcu_cpu_kthread_setup(unsigned int cpu)
 {
-	/*
-	 * If the thread is yielding, only wake it when this
-	 * is invoked from idle
-	 */
-	if (status != RCU_KTHREAD_YIELDING || is_idle_task(current))
-		wake_up_process(t);
+#ifdef CONFIG_RCU_BOOST
+	struct sched_param sp;
+
+	sp.sched_priority = kthread_prio;
+	sched_setscheduler_nocheck(current, SCHED_FIFO, &sp);
+#endif /* #ifdef CONFIG_RCU_BOOST */
 }
+
+#ifdef CONFIG_RCU_BOOST
 
 /*
  * Carry out RCU priority boosting on the task indicated by ->exp_tasks
@@ -1173,23 +1155,6 @@
 }
 
 /*
- * Wake up the per-CPU kthread to invoke RCU callbacks.
- */
-static void invoke_rcu_callbacks_kthread(void)
-{
-	unsigned long flags;
-
-	local_irq_save(flags);
-	__this_cpu_write(rcu_cpu_has_work, 1);
-	if (__this_cpu_read(rcu_cpu_kthread_task) != NULL &&
-	    current != __this_cpu_read(rcu_cpu_kthread_task)) {
-		rcu_wake_cond(__this_cpu_read(rcu_cpu_kthread_task),
-			      __this_cpu_read(rcu_cpu_kthread_status));
-	}
-	local_irq_restore(flags);
-}
-
-/*
  * Is the current CPU running the RCU-callbacks kthread?
  * Caller must have preemption disabled.
  */
@@ -1243,67 +1208,6 @@
 	return 0;
 }
 
-static void rcu_kthread_do_work(void)
-{
-	rcu_do_batch(&rcu_sched_state, this_cpu_ptr(&rcu_sched_data));
-	rcu_do_batch(&rcu_bh_state, this_cpu_ptr(&rcu_bh_data));
-	rcu_do_batch(&rcu_preempt_state, this_cpu_ptr(&rcu_preempt_data));
-}
-
-static void rcu_cpu_kthread_setup(unsigned int cpu)
-{
-	struct sched_param sp;
-
-	sp.sched_priority = kthread_prio;
-	sched_setscheduler_nocheck(current, SCHED_FIFO, &sp);
-}
-
-static void rcu_cpu_kthread_park(unsigned int cpu)
-{
-	per_cpu(rcu_cpu_kthread_status, cpu) = RCU_KTHREAD_OFFCPU;
-}
-
-static int rcu_cpu_kthread_should_run(unsigned int cpu)
-{
-	return __this_cpu_read(rcu_cpu_has_work);
-}
-
-/*
- * Per-CPU kernel thread that invokes RCU callbacks.  This replaces the
- * RCU softirq used in flavors and configurations of RCU that do not
- * support RCU priority boosting.
- */
-static void rcu_cpu_kthread(unsigned int cpu)
-{
-	unsigned int *statusp = this_cpu_ptr(&rcu_cpu_kthread_status);
-	char work, *workp = this_cpu_ptr(&rcu_cpu_has_work);
-	int spincnt;
-
-	for (spincnt = 0; spincnt < 10; spincnt++) {
-		trace_rcu_utilization(TPS("Start CPU kthread@rcu_wait"));
-		local_bh_disable();
-		*statusp = RCU_KTHREAD_RUNNING;
-		this_cpu_inc(rcu_cpu_kthread_loops);
-		local_irq_disable();
-		work = *workp;
-		*workp = 0;
-		local_irq_enable();
-		if (work)
-			rcu_kthread_do_work();
-		local_bh_enable();
-		if (*workp == 0) {
-			trace_rcu_utilization(TPS("End CPU kthread@rcu_wait"));
-			*statusp = RCU_KTHREAD_WAITING;
-			return;
-		}
-	}
-	*statusp = RCU_KTHREAD_YIELDING;
-	trace_rcu_utilization(TPS("Start CPU kthread@rcu_yield"));
-	schedule_timeout_interruptible(2);
-	trace_rcu_utilization(TPS("End CPU kthread@rcu_yield"));
-	*statusp = RCU_KTHREAD_WAITING;
-}
-
 /*
  * Set the per-rcu_node kthread's affinity to cover all CPUs that are
  * served by the rcu_node in question.  The CPU hotplug lock is still
@@ -1334,26 +1238,12 @@
 	free_cpumask_var(cm);
 }
 
-static struct smp_hotplug_thread rcu_cpu_thread_spec = {
-	.store			= &rcu_cpu_kthread_task,
-	.thread_should_run	= rcu_cpu_kthread_should_run,
-	.thread_fn		= rcu_cpu_kthread,
-	.thread_comm		= "rcuc/%u",
-	.setup			= rcu_cpu_kthread_setup,
-	.park			= rcu_cpu_kthread_park,
-};
-
 /*
  * Spawn boost kthreads -- called as soon as the scheduler is running.
  */
 static void __init rcu_spawn_boost_kthreads(void)
 {
 	struct rcu_node *rnp;
-	int cpu;
-
-	for_each_possible_cpu(cpu)
-		per_cpu(rcu_cpu_has_work, cpu) = 0;
-	BUG_ON(smpboot_register_percpu_thread(&rcu_cpu_thread_spec));
 	rcu_for_each_leaf_node(rcu_state_p, rnp)
 		(void)rcu_spawn_one_boost_kthread(rcu_state_p, rnp);
 }
@@ -1374,11 +1264,6 @@
 	__releases(rnp->lock)
 {
 	raw_spin_unlock_irqrestore_rcu_node(rnp, flags);
-}
-
-static void invoke_rcu_callbacks_kthread(void)
-{
-	WARN_ON_ONCE(1);
 }
 
 static bool rcu_is_callbacks_kthread(void)
@@ -1404,7 +1289,7 @@
 
 #endif /* #else #ifdef CONFIG_RCU_BOOST */
 
-#if !defined(CONFIG_RCU_FAST_NO_HZ)
+#if !defined(CONFIG_RCU_FAST_NO_HZ) || defined(CONFIG_PREEMPT_RT_FULL)
 
 /*
  * Check to see if any future RCU-related work will need to be done
@@ -1420,7 +1305,9 @@
 	*nextevt = KTIME_MAX;
 	return rcu_cpu_has_callbacks(NULL);
 }
+#endif /* !defined(CONFIG_RCU_FAST_NO_HZ) || defined(CONFIG_PREEMPT_RT_FULL) */
 
+#if !defined(CONFIG_RCU_FAST_NO_HZ)
 /*
  * Because we do not have RCU_FAST_NO_HZ, don't bother cleaning up
  * after it.
@@ -1517,6 +1404,8 @@
 	return cbs_ready;
 }
 
+#ifndef CONFIG_PREEMPT_RT_FULL
+
 /*
  * Allow the CPU to enter dyntick-idle mode unless it has callbacks ready
  * to invoke.  If the CPU has callbacks, try to advance them.  Tell the
@@ -1559,6 +1448,7 @@
 	*nextevt = basemono + dj * TICK_NSEC;
 	return 0;
 }
+#endif /* #ifndef CONFIG_PREEMPT_RT_FULL */
 
 /*
  * Prepare a CPU for idle from an RCU perspective.  The first major task
diff --git a/kernel/kernel/rcu/update.c b/kernel/kernel/rcu/update.c
index 81688a1..ed75add 100644
--- a/kernel/kernel/rcu/update.c
+++ b/kernel/kernel/rcu/update.c
@@ -68,8 +68,10 @@
 module_param(rcu_expedited, int, 0);
 extern int rcu_normal; /* from sysctl */
 module_param(rcu_normal, int, 0);
-static int rcu_normal_after_boot;
+static int rcu_normal_after_boot = IS_ENABLED(CONFIG_PREEMPT_RT_FULL);
+#ifndef CONFIG_PREEMPT_RT_FULL
 module_param(rcu_normal_after_boot, int, 0);
+#endif
 #endif /* #ifndef CONFIG_TINY_RCU */
 
 #ifdef CONFIG_DEBUG_LOCK_ALLOC
@@ -288,6 +290,7 @@
 }
 EXPORT_SYMBOL_GPL(rcu_read_lock_held);
 
+#ifndef CONFIG_PREEMPT_RT_FULL
 /**
  * rcu_read_lock_bh_held() - might we be in RCU-bh read-side critical section?
  *
@@ -314,6 +317,7 @@
 	return in_softirq() || irqs_disabled();
 }
 EXPORT_SYMBOL_GPL(rcu_read_lock_bh_held);
+#endif
 
 #endif /* #ifdef CONFIG_DEBUG_LOCK_ALLOC */
 
diff --git a/kernel/kernel/sched/Makefile b/kernel/kernel/sched/Makefile
index f6d19e3..260cea0 100644
--- a/kernel/kernel/sched/Makefile
+++ b/kernel/kernel/sched/Makefile
@@ -18,7 +18,7 @@
 
 obj-y += core.o loadavg.o clock.o cputime.o
 obj-y += idle.o fair.o rt.o deadline.o
-obj-y += wait.o wait_bit.o swait.o completion.o
+obj-y += wait.o wait_bit.o swait.o swork.o completion.o
 obj-y += stubs.o
 
 obj-$(CONFIG_SMP) += cpupri.o cpudeadline.o topology.o stop_task.o pelt.o
diff --git a/kernel/kernel/sched/completion.c b/kernel/kernel/sched/completion.c
index a1ad5b7..49c1413 100644
--- a/kernel/kernel/sched/completion.c
+++ b/kernel/kernel/sched/completion.c
@@ -29,12 +29,12 @@
 {
 	unsigned long flags;
 
-	spin_lock_irqsave(&x->wait.lock, flags);
+	raw_spin_lock_irqsave(&x->wait.lock, flags);
 
 	if (x->done != UINT_MAX)
 		x->done++;
-	__wake_up_locked(&x->wait, TASK_NORMAL, 1);
-	spin_unlock_irqrestore(&x->wait.lock, flags);
+	swake_up_locked(&x->wait);
+	raw_spin_unlock_irqrestore(&x->wait.lock, flags);
 }
 EXPORT_SYMBOL(complete);
 
@@ -58,10 +58,10 @@
 {
 	unsigned long flags;
 
-	spin_lock_irqsave(&x->wait.lock, flags);
+	raw_spin_lock_irqsave(&x->wait.lock, flags);
 	x->done = UINT_MAX;
-	__wake_up_locked(&x->wait, TASK_NORMAL, 0);
-	spin_unlock_irqrestore(&x->wait.lock, flags);
+	swake_up_all_locked(&x->wait);
+	raw_spin_unlock_irqrestore(&x->wait.lock, flags);
 }
 EXPORT_SYMBOL(complete_all);
 
@@ -70,20 +70,20 @@
 		   long (*action)(long), long timeout, int state)
 {
 	if (!x->done) {
-		DECLARE_WAITQUEUE(wait, current);
+		DECLARE_SWAITQUEUE(wait);
 
-		__add_wait_queue_entry_tail_exclusive(&x->wait, &wait);
 		do {
 			if (signal_pending_state(state, current)) {
 				timeout = -ERESTARTSYS;
 				break;
 			}
+			__prepare_to_swait(&x->wait, &wait);
 			__set_current_state(state);
-			spin_unlock_irq(&x->wait.lock);
+			raw_spin_unlock_irq(&x->wait.lock);
 			timeout = action(timeout);
-			spin_lock_irq(&x->wait.lock);
+			raw_spin_lock_irq(&x->wait.lock);
 		} while (!x->done && timeout);
-		__remove_wait_queue(&x->wait, &wait);
+		__finish_swait(&x->wait, &wait);
 		if (!x->done)
 			return timeout;
 	}
@@ -100,9 +100,9 @@
 
 	complete_acquire(x);
 
-	spin_lock_irq(&x->wait.lock);
+	raw_spin_lock_irq(&x->wait.lock);
 	timeout = do_wait_for_common(x, action, timeout, state);
-	spin_unlock_irq(&x->wait.lock);
+	raw_spin_unlock_irq(&x->wait.lock);
 
 	complete_release(x);
 
@@ -291,12 +291,12 @@
 	if (!READ_ONCE(x->done))
 		return false;
 
-	spin_lock_irqsave(&x->wait.lock, flags);
+	raw_spin_lock_irqsave(&x->wait.lock, flags);
 	if (!x->done)
 		ret = false;
 	else if (x->done != UINT_MAX)
 		x->done--;
-	spin_unlock_irqrestore(&x->wait.lock, flags);
+	raw_spin_unlock_irqrestore(&x->wait.lock, flags);
 	return ret;
 }
 EXPORT_SYMBOL(try_wait_for_completion);
@@ -322,8 +322,8 @@
 	 * otherwise we can end up freeing the completion before complete()
 	 * is done referencing it.
 	 */
-	spin_lock_irqsave(&x->wait.lock, flags);
-	spin_unlock_irqrestore(&x->wait.lock, flags);
+	raw_spin_lock_irqsave(&x->wait.lock, flags);
+	raw_spin_unlock_irqrestore(&x->wait.lock, flags);
 	return true;
 }
 EXPORT_SYMBOL(completion_done);
diff --git a/kernel/kernel/sched/core.c b/kernel/kernel/sched/core.c
index 3908b0e..0ed5c23 100644
--- a/kernel/kernel/sched/core.c
+++ b/kernel/kernel/sched/core.c
@@ -45,7 +45,11 @@
  * Number of tasks to iterate in a single balance run.
  * Limited because this is done with IRQs disabled.
  */
+#ifdef CONFIG_PREEMPT_RT_FULL
+const_debug unsigned int sysctl_sched_nr_migrate = 8;
+#else
 const_debug unsigned int sysctl_sched_nr_migrate = 32;
+#endif
 
 /*
  * period over which we measure -rt task CPU usage in us.
@@ -317,7 +321,7 @@
 	rq->hrtick_csd.info = rq;
 #endif
 
-	hrtimer_init(&rq->hrtick_timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
+	hrtimer_init(&rq->hrtick_timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL_HARD);
 	rq->hrtick_timer.function = hrtick;
 }
 #else	/* CONFIG_SCHED_HRTICK */
@@ -399,9 +403,15 @@
 #endif
 #endif
 
-void wake_q_add(struct wake_q_head *head, struct task_struct *task)
+void __wake_q_add(struct wake_q_head *head, struct task_struct *task,
+		  bool sleeper)
 {
-	struct wake_q_node *node = &task->wake_q;
+	struct wake_q_node *node;
+
+	if (sleeper)
+		node = &task->wake_q_sleeper;
+	else
+		node = &task->wake_q;
 
 	/*
 	 * Atomically grab the task, if ->wake_q is !nil already it means
@@ -429,25 +439,33 @@
 static int
 try_to_wake_up(struct task_struct *p, unsigned int state, int wake_flags,
 	       int sibling_count_hint);
-
-void wake_up_q(struct wake_q_head *head)
+void __wake_up_q(struct wake_q_head *head, bool sleeper)
 {
 	struct wake_q_node *node = head->first;
 
 	while (node != WAKE_Q_TAIL) {
 		struct task_struct *task;
 
-		task = container_of(node, struct task_struct, wake_q);
+		if (sleeper)
+			task = container_of(node, struct task_struct, wake_q_sleeper);
+		else
+			task = container_of(node, struct task_struct, wake_q);
 		BUG_ON(!task);
 		/* Task can safely be re-inserted now: */
 		node = node->next;
-		task->wake_q.next = NULL;
-
+		if (sleeper)
+			task->wake_q_sleeper.next = NULL;
+		else
+			task->wake_q.next = NULL;
 		/*
-		 * try_to_wake_up() executes a full barrier, which pairs with
+		 * wake_up_process() executes a full barrier, which pairs with
 		 * the queueing in wake_q_add() so as not to miss wakeups.
 		 */
-		try_to_wake_up(task, TASK_NORMAL, 0, head->count);
+		if (sleeper)
+			wake_up_lock_sleeper(task);
+		else
+			wake_up_process(task);
+
 		put_task_struct(task);
 	}
 }
@@ -486,6 +504,48 @@
 	else
 		trace_sched_wake_idle_without_ipi(cpu);
 }
+
+#ifdef CONFIG_PREEMPT_LAZY
+
+static int tsk_is_polling(struct task_struct *p)
+{
+#ifdef TIF_POLLING_NRFLAG
+	return test_tsk_thread_flag(p, TIF_POLLING_NRFLAG);
+#else
+	return 0;
+#endif
+}
+
+void resched_curr_lazy(struct rq *rq)
+{
+	struct task_struct *curr = rq->curr;
+	int cpu;
+
+	if (!sched_feat(PREEMPT_LAZY)) {
+		resched_curr(rq);
+		return;
+	}
+
+	lockdep_assert_held(&rq->lock);
+
+	if (test_tsk_need_resched(curr))
+		return;
+
+	if (test_tsk_need_resched_lazy(curr))
+		return;
+
+	set_tsk_need_resched_lazy(curr);
+
+	cpu = cpu_of(rq);
+	if (cpu == smp_processor_id())
+		return;
+
+	/* NEED_RESCHED_LAZY must be visible before we test polling */
+	smp_mb();
+	if (!tsk_is_polling(curr))
+		smp_send_reschedule(cpu);
+}
+#endif
 
 void resched_cpu(int cpu)
 {
@@ -1481,10 +1541,10 @@
  */
 static inline bool is_cpu_allowed(struct task_struct *p, int cpu)
 {
-	if (!cpumask_test_cpu(cpu, &p->cpus_allowed))
+	if (!cpumask_test_cpu(cpu, p->cpus_ptr))
 		return false;
 
-	if (is_per_cpu_kthread(p))
+	if (is_per_cpu_kthread(p) || __migrate_disabled(p))
 		return cpu_online(cpu);
 
 	return cpu_active(cpu);
@@ -1533,6 +1593,7 @@
 struct migration_arg {
 	struct task_struct *task;
 	int dest_cpu;
+	bool done;
 };
 
 /*
@@ -1568,6 +1629,11 @@
 	struct task_struct *p = arg->task;
 	struct rq *rq = this_rq();
 	struct rq_flags rf;
+	int dest_cpu = arg->dest_cpu;
+
+	/* We don't look at arg after this point. */
+	smp_mb();
+	arg->done = true;
 
 	/*
 	 * The original target CPU might have gone down and we might
@@ -1576,7 +1642,7 @@
 	local_irq_disable();
 	/*
 	 * We need to explicitly wake pending tasks before running
-	 * __migrate_task() such that we will not miss enforcing cpus_allowed
+	 * __migrate_task() such that we will not miss enforcing cpus_ptr
 	 * during wakeups, see set_cpus_allowed_ptr()'s TASK_WAKING test.
 	 */
 	sched_ttwu_pending();
@@ -1590,9 +1656,9 @@
 	 */
 	if (task_rq(p) == rq) {
 		if (task_on_rq_queued(p))
-			rq = __migrate_task(rq, &rf, p, arg->dest_cpu);
+			rq = __migrate_task(rq, &rf, p, dest_cpu);
 		else
-			p->wake_cpu = arg->dest_cpu;
+			p->wake_cpu = dest_cpu;
 	}
 	rq_unlock(rq, &rf);
 	raw_spin_unlock(&p->pi_lock);
@@ -1607,9 +1673,18 @@
  */
 void set_cpus_allowed_common(struct task_struct *p, const struct cpumask *new_mask)
 {
-	cpumask_copy(&p->cpus_allowed, new_mask);
-	p->nr_cpus_allowed = cpumask_weight(new_mask);
+	cpumask_copy(&p->cpus_mask, new_mask);
+	if (p->cpus_ptr == &p->cpus_mask)
+		p->nr_cpus_allowed = cpumask_weight(new_mask);
 }
+
+#if defined(CONFIG_SMP) && defined(CONFIG_PREEMPT_RT_BASE)
+int __migrate_disabled(struct task_struct *p)
+{
+	return p->migrate_disable;
+}
+EXPORT_SYMBOL_GPL(__migrate_disabled);
+#endif
 
 void do_set_cpus_allowed(struct task_struct *p, const struct cpumask *new_mask)
 {
@@ -1677,7 +1752,7 @@
 		goto out;
 	}
 
-	if (cpumask_equal(&p->cpus_allowed, new_mask))
+	if (cpumask_equal(&p->cpus_mask, new_mask))
 		goto out;
 
 	dest_cpu = cpumask_any_and(cpu_valid_mask, new_mask);
@@ -1699,7 +1774,8 @@
 	}
 
 	/* Can the task run on the task's current CPU? If so, we're done */
-	if (cpumask_test_cpu(task_cpu(p), new_mask))
+	if (cpumask_test_cpu(task_cpu(p), new_mask) ||
+	    p->cpus_ptr != &p->cpus_mask)
 		goto out;
 
 	if (task_running(rq, p) || p->state == TASK_WAKING) {
@@ -1840,10 +1916,10 @@
 	if (task_cpu(arg->src_task) != arg->src_cpu)
 		goto unlock;
 
-	if (!cpumask_test_cpu(arg->dst_cpu, &arg->src_task->cpus_allowed))
+	if (!cpumask_test_cpu(arg->dst_cpu, arg->src_task->cpus_ptr))
 		goto unlock;
 
-	if (!cpumask_test_cpu(arg->src_cpu, &arg->dst_task->cpus_allowed))
+	if (!cpumask_test_cpu(arg->src_cpu, arg->dst_task->cpus_ptr))
 		goto unlock;
 
 	__migrate_swap_task(arg->src_task, arg->dst_cpu);
@@ -1885,10 +1961,10 @@
 	if (!cpu_active(arg.src_cpu) || !cpu_active(arg.dst_cpu))
 		goto out;
 
-	if (!cpumask_test_cpu(arg.dst_cpu, &arg.src_task->cpus_allowed))
+	if (!cpumask_test_cpu(arg.dst_cpu, arg.src_task->cpus_ptr))
 		goto out;
 
-	if (!cpumask_test_cpu(arg.src_cpu, &arg.dst_task->cpus_allowed))
+	if (!cpumask_test_cpu(arg.src_cpu, arg.dst_task->cpus_ptr))
 		goto out;
 
 	trace_sched_swap_numa(cur, arg.src_cpu, p, arg.dst_cpu);
@@ -1898,6 +1974,18 @@
 	return ret;
 }
 #endif /* CONFIG_NUMA_BALANCING */
+
+static bool check_task_state(struct task_struct *p, long match_state)
+{
+	bool match = false;
+
+	raw_spin_lock_irq(&p->pi_lock);
+	if (p->state == match_state || p->saved_state == match_state)
+		match = true;
+	raw_spin_unlock_irq(&p->pi_lock);
+
+	return match;
+}
 
 /*
  * wait_task_inactive - wait for a thread to unschedule.
@@ -1943,7 +2031,7 @@
 		 * is actually now running somewhere else!
 		 */
 		while (task_running(rq, p)) {
-			if (match_state && unlikely(p->state != match_state))
+			if (match_state && !check_task_state(p, match_state))
 				return 0;
 			cpu_relax();
 		}
@@ -1958,7 +2046,8 @@
 		running = task_running(rq, p);
 		queued = task_on_rq_queued(p);
 		ncsw = 0;
-		if (!match_state || p->state == match_state)
+		if (!match_state || p->state == match_state ||
+		    p->saved_state == match_state)
 			ncsw = p->nvcsw | LONG_MIN; /* sets MSB */
 		task_rq_unlock(rq, p, &rf);
 
@@ -2033,7 +2122,7 @@
 EXPORT_SYMBOL_GPL(kick_process);
 
 /*
- * ->cpus_allowed is protected by both rq->lock and p->pi_lock
+ * ->cpus_ptr is protected by both rq->lock and p->pi_lock
  *
  * A few notes on cpu_active vs cpu_online:
  *
@@ -2073,14 +2162,14 @@
 		for_each_cpu(dest_cpu, nodemask) {
 			if (!cpu_active(dest_cpu))
 				continue;
-			if (cpumask_test_cpu(dest_cpu, &p->cpus_allowed))
+			if (cpumask_test_cpu(dest_cpu, p->cpus_ptr))
 				return dest_cpu;
 		}
 	}
 
 	for (;;) {
 		/* Any allowed, online CPU? */
-		for_each_cpu(dest_cpu, &p->cpus_allowed) {
+		for_each_cpu(dest_cpu, p->cpus_ptr) {
 			if (!is_cpu_allowed(p, dest_cpu))
 				continue;
 
@@ -2124,7 +2213,7 @@
 }
 
 /*
- * The caller (fork, wakeup) owns p->pi_lock, ->cpus_allowed is stable.
+ * The caller (fork, wakeup) owns p->pi_lock, ->cpus_ptr is stable.
  */
 static inline
 int select_task_rq(struct task_struct *p, int cpu, int sd_flags, int wake_flags,
@@ -2136,11 +2225,11 @@
 		cpu = p->sched_class->select_task_rq(p, cpu, sd_flags, wake_flags,
 						     sibling_count_hint);
 	else
-		cpu = cpumask_any(&p->cpus_allowed);
+		cpu = cpumask_any(p->cpus_ptr);
 
 	/*
 	 * In order not to call set_task_cpu() on a blocking task we need
-	 * to rely on ttwu() to place the task on a valid ->cpus_allowed
+	 * to rely on ttwu() to place the task on a valid ->cpus_ptr
 	 * CPU.
 	 *
 	 * Since this is common to all placement strategies, this lives here.
@@ -2243,10 +2332,6 @@
 {
 	activate_task(rq, p, en_flags);
 	p->on_rq = TASK_ON_RQ_QUEUED;
-
-	/* If a worker is waking up, notify the workqueue: */
-	if (p->flags & PF_WQ_WORKER)
-		wq_worker_waking_up(p, cpu_of(rq));
 }
 
 /*
@@ -2571,8 +2656,27 @@
 	 */
 	raw_spin_lock_irqsave(&p->pi_lock, flags);
 	smp_mb__after_spinlock();
-	if (!(p->state & state))
+	if (!(p->state & state)) {
+		/*
+		 * The task might be running due to a spinlock sleeper
+		 * wakeup. Check the saved state and set it to running
+		 * if the wakeup condition is true.
+		 */
+		if (!(wake_flags & WF_LOCK_SLEEPER)) {
+			if (p->saved_state & state) {
+				p->saved_state = TASK_RUNNING;
+				success = 1;
+			}
+		}
 		goto out;
+	}
+
+	/*
+	 * If this is a regular wakeup, then we can unconditionally
+	 * clear the saved state of a "lock sleeper".
+	 */
+	if (!(wake_flags & WF_LOCK_SLEEPER))
+		p->saved_state = TASK_RUNNING;
 
 	trace_sched_waking(p);
 
@@ -2672,56 +2776,6 @@
 }
 
 /**
- * try_to_wake_up_local - try to wake up a local task with rq lock held
- * @p: the thread to be awakened
- * @rf: request-queue flags for pinning
- *
- * Put @p on the run-queue if it's not already there. The caller must
- * ensure that this_rq() is locked, @p is bound to this_rq() and not
- * the current task.
- */
-static void try_to_wake_up_local(struct task_struct *p, struct rq_flags *rf)
-{
-	struct rq *rq = task_rq(p);
-
-	if (WARN_ON_ONCE(rq != this_rq()) ||
-	    WARN_ON_ONCE(p == current))
-		return;
-
-	lockdep_assert_held(&rq->lock);
-
-	if (!raw_spin_trylock(&p->pi_lock)) {
-		/*
-		 * This is OK, because current is on_cpu, which avoids it being
-		 * picked for load-balance and preemption/IRQs are still
-		 * disabled avoiding further scheduler activity on it and we've
-		 * not yet picked a replacement task.
-		 */
-		rq_unlock(rq, rf);
-		raw_spin_lock(&p->pi_lock);
-		rq_relock(rq, rf);
-	}
-
-	if (!(p->state & TASK_NORMAL))
-		goto out;
-
-	trace_sched_waking(p);
-
-	if (!task_on_rq_queued(p)) {
-		if (p->in_iowait) {
-			delayacct_blkio_end(p);
-			atomic_dec(&rq->nr_iowait);
-		}
-		ttwu_activate(rq, p, ENQUEUE_WAKEUP | ENQUEUE_NOCLOCK);
-	}
-
-	ttwu_do_wakeup(rq, p, 0, rf);
-	ttwu_stat(p, smp_processor_id(), 0);
-out:
-	raw_spin_unlock(&p->pi_lock);
-}
-
-/**
  * wake_up_process - Wake up a specific process
  * @p: The process to be woken up.
  *
@@ -2737,6 +2791,18 @@
 	return try_to_wake_up(p, TASK_NORMAL, 0, 1);
 }
 EXPORT_SYMBOL(wake_up_process);
+
+/**
+ * wake_up_lock_sleeper - Wake up a specific process blocked on a "sleeping lock"
+ * @p: The process to be woken up.
+ *
+ * Same as wake_up_process() above, but wake_flags=WF_LOCK_SLEEPER to indicate
+ * the nature of the wakeup.
+ */
+int wake_up_lock_sleeper(struct task_struct *p)
+{
+	return try_to_wake_up(p, TASK_UNINTERRUPTIBLE, WF_LOCK_SLEEPER, 1);
+}
 
 int wake_up_state(struct task_struct *p, unsigned int state)
 {
@@ -2978,6 +3044,9 @@
 	p->on_cpu = 0;
 #endif
 	init_task_preempt_count(p);
+#ifdef CONFIG_HAVE_PREEMPT_LAZY
+	task_thread_info(p)->preempt_lazy_count = 0;
+#endif
 #ifdef CONFIG_SMP
 	plist_node_init(&p->pushable_tasks, MAX_PRIO);
 	RB_CLEAR_NODE(&p->pushable_dl_tasks);
@@ -3018,7 +3087,7 @@
 #ifdef CONFIG_SMP
 	/*
 	 * Fork balancing, do it here and not earlier because:
-	 *  - cpus_allowed can change in the fork path
+	 *  - cpus_ptr can change in the fork path
 	 *  - any previously selected CPU might disappear through hotplug
 	 *
 	 * Use __set_task_cpu() to avoid calling sched_class::migrate_task_rq,
@@ -3307,22 +3376,17 @@
 	 *   provided by mmdrop(),
 	 * - a sync_core for SYNC_CORE.
 	 */
+	/*
+	 * We use mmdrop_delayed() here so we don't have to do the
+	 * full __mmdrop() when we are the last user.
+	 */
 	if (mm) {
 		membarrier_mm_sync_core_before_usermode(mm);
-		mmdrop(mm);
+		mmdrop_delayed(mm);
 	}
 	if (unlikely(prev_state == TASK_DEAD)) {
 		if (prev->sched_class->task_dead)
 			prev->sched_class->task_dead(prev);
-
-		/*
-		 * Remove function-return probe instances associated with this
-		 * task and put them back on the free list.
-		 */
-		kprobe_flush_task(prev);
-
-		/* Task is done with its stack. */
-		put_task_stack(prev);
 
 		put_task_struct(prev);
 	}
@@ -4001,6 +4065,8 @@
 	BUG();
 }
 
+static void migrate_disabled_sched(struct task_struct *p);
+
 /*
  * __schedule() is the main scheduler function.
  *
@@ -4071,6 +4137,9 @@
 	rq_lock(rq, &rf);
 	smp_mb__after_spinlock();
 
+	if (__migrate_disabled(prev))
+		migrate_disabled_sched(prev);
+
 	/* Promote REQ to ACT */
 	rq->clock_update_flags <<= 1;
 	update_rq_clock(rq);
@@ -4087,25 +4156,13 @@
 				atomic_inc(&rq->nr_iowait);
 				delayacct_blkio_start();
 			}
-
-			/*
-			 * If a worker went to sleep, notify and ask workqueue
-			 * whether it wants to wake up a task to maintain
-			 * concurrency.
-			 */
-			if (prev->flags & PF_WQ_WORKER) {
-				struct task_struct *to_wakeup;
-
-				to_wakeup = wq_worker_sleeping(prev);
-				if (to_wakeup)
-					try_to_wake_up_local(to_wakeup, &rf);
-			}
 		}
 		switch_count = &prev->nvcsw;
 	}
 
 	next = pick_next_task(rq, prev, &rf);
 	clear_tsk_need_resched(prev);
+	clear_tsk_need_resched_lazy(prev);
 	clear_preempt_need_resched();
 
 	if (likely(prev != next)) {
@@ -4157,14 +4214,37 @@
 
 static inline void sched_submit_work(struct task_struct *tsk)
 {
-	if (!tsk->state || tsk_is_pi_blocked(tsk))
+	if (!tsk->state)
 		return;
+
+	/*
+	 * If a worker went to sleep, notify and ask workqueue whether
+	 * it wants to wake up a task to maintain concurrency.
+	 * As this function is called inside the schedule() context,
+	 * we disable preemption to avoid it calling schedule() again
+	 * in the possible wakeup of a kworker.
+	 */
+	if (tsk->flags & PF_WQ_WORKER) {
+		preempt_disable();
+		wq_worker_sleeping(tsk);
+		preempt_enable_no_resched();
+	}
+
+	if (tsk_is_pi_blocked(tsk))
+		return;
+
 	/*
 	 * If we are going to sleep and we have plugged IO queued,
 	 * make sure to submit it to avoid deadlocks.
 	 */
 	if (blk_needs_flush_plug(tsk))
 		blk_schedule_flush_plug(tsk);
+}
+
+static void sched_update_worker(struct task_struct *tsk)
+{
+	if (tsk->flags & PF_WQ_WORKER)
+		wq_worker_running(tsk);
 }
 
 asmlinkage __visible void __sched schedule(void)
@@ -4177,6 +4257,7 @@
 		__schedule(false);
 		sched_preempt_enable_no_resched();
 	} while (need_resched());
+	sched_update_worker(tsk);
 }
 EXPORT_SYMBOL(schedule);
 
@@ -4265,6 +4346,30 @@
 	} while (need_resched());
 }
 
+#ifdef CONFIG_PREEMPT_LAZY
+/*
+ * If TIF_NEED_RESCHED is then we allow to be scheduled away since this is
+ * set by a RT task. Oterwise we try to avoid beeing scheduled out as long as
+ * preempt_lazy_count counter >0.
+ */
+static __always_inline int preemptible_lazy(void)
+{
+	if (test_thread_flag(TIF_NEED_RESCHED))
+		return 1;
+	if (current_thread_info()->preempt_lazy_count)
+		return 0;
+	return 1;
+}
+
+#else
+
+static inline int preemptible_lazy(void)
+{
+	return 1;
+}
+
+#endif
+
 #ifdef CONFIG_PREEMPT
 /*
  * this is the entry point to schedule() from in-kernel preemption
@@ -4279,7 +4384,8 @@
 	 */
 	if (likely(!preemptible()))
 		return;
-
+	if (!preemptible_lazy())
+		return;
 	preempt_schedule_common();
 }
 NOKPROBE_SYMBOL(preempt_schedule);
@@ -4304,6 +4410,9 @@
 	enum ctx_state prev_ctx;
 
 	if (likely(!preemptible()))
+		return;
+
+	if (!preemptible_lazy())
 		return;
 
 	do {
@@ -4951,7 +5060,7 @@
 			 * the entire root_domain to become SCHED_DEADLINE. We
 			 * will also fail if there's no bandwidth available.
 			 */
-			if (!cpumask_subset(span, &p->cpus_allowed) ||
+			if (!cpumask_subset(span, p->cpus_ptr) ||
 			    rq->rd->dl_bw.bw == 0) {
 				task_rq_unlock(rq, p, &rf);
 				return -EPERM;
@@ -5569,7 +5678,7 @@
 		goto out_unlock;
 
 	raw_spin_lock_irqsave(&p->pi_lock, flags);
-	cpumask_and(mask, &p->cpus_allowed, cpu_active_mask);
+	cpumask_and(mask, &p->cpus_mask, cpu_active_mask);
 	raw_spin_unlock_irqrestore(&p->pi_lock, flags);
 
 out_unlock:
@@ -6106,7 +6215,9 @@
 
 	/* Set the preempt count _outside_ the spinlocks! */
 	init_idle_preempt_count(idle, cpu);
-
+#ifdef CONFIG_HAVE_PREEMPT_LAZY
+	task_thread_info(idle)->preempt_lazy_count = 0;
+#endif
 	/*
 	 * The idle tasks have their own, simple scheduling class:
 	 */
@@ -6145,7 +6256,7 @@
 	 * allowed nodes is unnecessary.  Thus, cpusets are not
 	 * applicable for such threads.  This prevents checking for
 	 * success of set_cpus_allowed_ptr() on all attached tasks
-	 * before cpus_allowed may be changed.
+	 * before cpus_mask may be changed.
 	 */
 	if (p->flags & PF_NO_SETAFFINITY) {
 		ret = -EINVAL;
@@ -6172,7 +6283,7 @@
 	if (curr_cpu == target_cpu)
 		return 0;
 
-	if (!cpumask_test_cpu(target_cpu, &p->cpus_allowed))
+	if (!cpumask_test_cpu(target_cpu, p->cpus_ptr))
 		return -EINVAL;
 
 	/* TODO: This is not properly updating schedstats */
@@ -6211,6 +6322,7 @@
 #endif /* CONFIG_NUMA_BALANCING */
 
 #ifdef CONFIG_HOTPLUG_CPU
+
 /*
  * Ensure that the idle task is using init_mm right before its CPU goes
  * offline.
@@ -6310,8 +6422,10 @@
 		BUG_ON(!next);
 		put_prev_task(rq, next);
 
+		WARN_ON_ONCE(__migrate_disabled(next));
+
 		/*
-		 * Rules for changing task_struct::cpus_allowed are holding
+		 * Rules for changing task_struct::cpus_mask are holding
 		 * both pi_lock and rq->lock, such that holding either
 		 * stabilizes the mask.
 		 *
@@ -6777,7 +6891,7 @@
 #ifdef CONFIG_DEBUG_ATOMIC_SLEEP
 static inline int preempt_count_equals(int preempt_offset)
 {
-	int nested = preempt_count() + rcu_preempt_depth();
+	int nested = preempt_count() + sched_rcu_preempt_depth();
 
 	return (nested == preempt_offset);
 }
@@ -8014,3 +8128,171 @@
 };
 
 #undef CREATE_TRACE_POINTS
+
+#if defined(CONFIG_SMP) && defined(CONFIG_PREEMPT_RT_BASE)
+
+static inline void
+update_nr_migratory(struct task_struct *p, long delta)
+{
+	if (unlikely((p->sched_class == &rt_sched_class ||
+		      p->sched_class == &dl_sched_class) &&
+		      p->nr_cpus_allowed > 1)) {
+		if (p->sched_class == &rt_sched_class)
+			task_rq(p)->rt.rt_nr_migratory += delta;
+		else
+			task_rq(p)->dl.dl_nr_migratory += delta;
+	}
+}
+
+static inline void
+migrate_disable_update_cpus_allowed(struct task_struct *p)
+{
+	p->cpus_ptr = cpumask_of(smp_processor_id());
+	update_nr_migratory(p, -1);
+	p->nr_cpus_allowed = 1;
+}
+
+static inline void
+migrate_enable_update_cpus_allowed(struct task_struct *p)
+{
+	struct rq *rq;
+	struct rq_flags rf;
+
+	rq = task_rq_lock(p, &rf);
+	p->cpus_ptr = &p->cpus_mask;
+	p->nr_cpus_allowed = cpumask_weight(&p->cpus_mask);
+	update_nr_migratory(p, 1);
+	task_rq_unlock(rq, p, &rf);
+}
+
+void migrate_disable(void)
+{
+	preempt_disable();
+
+	if (++current->migrate_disable == 1) {
+		this_rq()->nr_pinned++;
+		preempt_lazy_disable();
+#ifdef CONFIG_SCHED_DEBUG
+		WARN_ON_ONCE(current->pinned_on_cpu >= 0);
+		current->pinned_on_cpu = smp_processor_id();
+#endif
+	}
+
+	preempt_enable();
+}
+EXPORT_SYMBOL(migrate_disable);
+
+static void migrate_disabled_sched(struct task_struct *p)
+{
+	if (p->migrate_disable_scheduled)
+		return;
+
+	migrate_disable_update_cpus_allowed(p);
+	p->migrate_disable_scheduled = 1;
+}
+
+static DEFINE_PER_CPU(struct cpu_stop_work, migrate_work);
+static DEFINE_PER_CPU(struct migration_arg, migrate_arg);
+
+void migrate_enable(void)
+{
+	struct task_struct *p = current;
+	struct rq *rq = this_rq();
+	int cpu = task_cpu(p);
+
+	WARN_ON_ONCE(p->migrate_disable <= 0);
+	if (p->migrate_disable > 1) {
+		p->migrate_disable--;
+		return;
+	}
+
+	preempt_disable();
+
+#ifdef CONFIG_SCHED_DEBUG
+	WARN_ON_ONCE(current->pinned_on_cpu != cpu);
+	current->pinned_on_cpu = -1;
+#endif
+
+	WARN_ON_ONCE(rq->nr_pinned < 1);
+
+	p->migrate_disable = 0;
+	rq->nr_pinned--;
+#ifdef CONFIG_HOTPLUG_CPU
+	if (rq->nr_pinned == 0 && unlikely(!cpu_active(cpu)) &&
+	    takedown_cpu_task)
+		wake_up_process(takedown_cpu_task);
+#endif
+
+	if (!p->migrate_disable_scheduled)
+		goto out;
+
+	p->migrate_disable_scheduled = 0;
+
+	migrate_enable_update_cpus_allowed(p);
+
+	WARN_ON(smp_processor_id() != cpu);
+	if (!is_cpu_allowed(p, cpu)) {
+		struct migration_arg __percpu *arg;
+		struct cpu_stop_work __percpu *work;
+		struct rq_flags rf;
+
+		work = this_cpu_ptr(&migrate_work);
+		arg = this_cpu_ptr(&migrate_arg);
+		WARN_ON_ONCE(!arg->done && !work->disabled && work->arg);
+
+		arg->task = p;
+		arg->done = false;
+
+		rq = task_rq_lock(p, &rf);
+		update_rq_clock(rq);
+		arg->dest_cpu = select_fallback_rq(cpu, p);
+		task_rq_unlock(rq, p, &rf);
+
+		stop_one_cpu_nowait(task_cpu(p), migration_cpu_stop,
+				    arg, work);
+		tlb_migrate_finish(p->mm);
+	}
+
+out:
+	preempt_lazy_enable();
+	preempt_enable();
+}
+EXPORT_SYMBOL(migrate_enable);
+
+int cpu_nr_pinned(int cpu)
+{
+	struct rq *rq = cpu_rq(cpu);
+
+	return rq->nr_pinned;
+}
+
+#elif !defined(CONFIG_SMP) && defined(CONFIG_PREEMPT_RT_BASE)
+static void migrate_disabled_sched(struct task_struct *p)
+{
+}
+
+void migrate_disable(void)
+{
+#ifdef CONFIG_SCHED_DEBUG
+	current->migrate_disable++;
+#endif
+	barrier();
+}
+EXPORT_SYMBOL(migrate_disable);
+
+void migrate_enable(void)
+{
+#ifdef CONFIG_SCHED_DEBUG
+	struct task_struct *p = current;
+
+	WARN_ON_ONCE(p->migrate_disable <= 0);
+	p->migrate_disable--;
+#endif
+	barrier();
+}
+EXPORT_SYMBOL(migrate_enable);
+#else
+static void migrate_disabled_sched(struct task_struct *p)
+{
+}
+#endif
diff --git a/kernel/kernel/sched/cpudeadline.c b/kernel/kernel/sched/cpudeadline.c
index 5031645..d57fb2f 100644
--- a/kernel/kernel/sched/cpudeadline.c
+++ b/kernel/kernel/sched/cpudeadline.c
@@ -124,14 +124,14 @@
 	const struct sched_dl_entity *dl_se = &p->dl;
 
 	if (later_mask &&
-	    cpumask_and(later_mask, cp->free_cpus, &p->cpus_allowed)) {
+	    cpumask_and(later_mask, cp->free_cpus, p->cpus_ptr)) {
 		return 1;
 	} else {
 		int best_cpu = cpudl_maximum(cp);
 
 		WARN_ON(best_cpu != -1 && !cpu_present(best_cpu));
 
-		if (cpumask_test_cpu(best_cpu, &p->cpus_allowed) &&
+		if (cpumask_test_cpu(best_cpu, p->cpus_ptr) &&
 		    dl_time_before(dl_se->deadline, cp->elements[0].dl)) {
 			if (later_mask)
 				cpumask_set_cpu(best_cpu, later_mask);
diff --git a/kernel/kernel/sched/cpupri.c b/kernel/kernel/sched/cpupri.c
index 685ee13..3e0c8f9 100644
--- a/kernel/kernel/sched/cpupri.c
+++ b/kernel/kernel/sched/cpupri.c
@@ -77,11 +77,11 @@
 	if (skip)
 		return 0;
 
-	if (cpumask_any_and(&p->cpus_allowed, vec->mask) >= nr_cpu_ids)
+	if (cpumask_any_and(p->cpus_ptr, vec->mask) >= nr_cpu_ids)
 		return 0;
 
 	if (lowest_mask) {
-		cpumask_and(lowest_mask, &p->cpus_allowed, vec->mask);
+		cpumask_and(lowest_mask, p->cpus_ptr, vec->mask);
 
 		/*
 		 * We have to ensure that we have at least one bit
diff --git a/kernel/kernel/sched/deadline.c b/kernel/kernel/sched/deadline.c
index 2960c5f..459e7ed 100644
--- a/kernel/kernel/sched/deadline.c
+++ b/kernel/kernel/sched/deadline.c
@@ -287,7 +287,7 @@
 
 	dl_se->dl_non_contending = 1;
 	get_task_struct(p);
-	hrtimer_start(timer, ns_to_ktime(zerolag_time), HRTIMER_MODE_REL);
+	hrtimer_start(timer, ns_to_ktime(zerolag_time), HRTIMER_MODE_REL_HARD);
 }
 
 static void task_contending(struct sched_dl_entity *dl_se, int flags)
@@ -539,7 +539,7 @@
 		 * If we cannot preempt any rq, fall back to pick any
 		 * online CPU:
 		 */
-		cpu = cpumask_any_and(cpu_active_mask, &p->cpus_allowed);
+		cpu = cpumask_any_and(cpu_active_mask, p->cpus_ptr);
 		if (cpu >= nr_cpu_ids) {
 			/*
 			 * Failed to find any suitable CPU.
@@ -1086,7 +1086,7 @@
 {
 	struct hrtimer *timer = &dl_se->dl_timer;
 
-	hrtimer_init(timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
+	hrtimer_init(timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL_HARD);
 	timer->function = dl_task_timer;
 }
 
@@ -1325,7 +1325,7 @@
 {
 	struct hrtimer *timer = &dl_se->inactive_timer;
 
-	hrtimer_init(timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
+	hrtimer_init(timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL_HARD);
 	timer->function = inactive_task_timer;
 }
 
@@ -1858,7 +1858,7 @@
 static int pick_dl_task(struct rq *rq, struct task_struct *p, int cpu)
 {
 	if (!task_running(rq, p) &&
-	    cpumask_test_cpu(cpu, &p->cpus_allowed))
+	    cpumask_test_cpu(cpu, p->cpus_ptr))
 		return 1;
 	return 0;
 }
@@ -2008,7 +2008,7 @@
 		/* Retry if something changed. */
 		if (double_lock_balance(rq, later_rq)) {
 			if (unlikely(task_rq(task) != rq ||
-				     !cpumask_test_cpu(later_rq->cpu, &task->cpus_allowed) ||
+				     !cpumask_test_cpu(later_rq->cpu, task->cpus_ptr) ||
 				     task_running(rq, task) ||
 				     !dl_task(task) ||
 				     !task_on_rq_queued(task))) {
diff --git a/kernel/kernel/sched/debug.c b/kernel/kernel/sched/debug.c
index 9518606..e97d4be 100644
--- a/kernel/kernel/sched/debug.c
+++ b/kernel/kernel/sched/debug.c
@@ -998,6 +998,10 @@
 		P(dl.runtime);
 		P(dl.deadline);
 	}
+#if defined(CONFIG_SMP) && defined(CONFIG_PREEMPT_RT_BASE)
+	P(migrate_disable);
+#endif
+	P(nr_cpus_allowed);
 #undef PN_SCHEDSTAT
 #undef PN
 #undef __PN
diff --git a/kernel/kernel/sched/fair.c b/kernel/kernel/sched/fair.c
index 15cb544..29ccb7a 100644
--- a/kernel/kernel/sched/fair.c
+++ b/kernel/kernel/sched/fair.c
@@ -1705,7 +1705,7 @@
 	 * be incurred if the tasks were swapped.
 	 */
 	/* Skip this swap candidate if cannot move to the source cpu */
-	if (!cpumask_test_cpu(env->src_cpu, &cur->cpus_allowed))
+	if (!cpumask_test_cpu(env->src_cpu, cur->cpus_ptr))
 		goto unlock;
 
 	/*
@@ -1803,7 +1803,7 @@
 
 	for_each_cpu(cpu, cpumask_of_node(env->dst_nid)) {
 		/* Skip this CPU if the source task cannot migrate */
-		if (!cpumask_test_cpu(cpu, &env->p->cpus_allowed))
+		if (!cpumask_test_cpu(cpu, env->p->cpus_ptr))
 			continue;
 
 		env->dst_cpu = cpu;
@@ -4210,7 +4210,7 @@
 	ideal_runtime = sched_slice(cfs_rq, curr);
 	delta_exec = curr->sum_exec_runtime - curr->prev_sum_exec_runtime;
 	if (delta_exec > ideal_runtime) {
-		resched_curr(rq_of(cfs_rq));
+		resched_curr_lazy(rq_of(cfs_rq));
 		/*
 		 * The current task ran long enough, ensure it doesn't get
 		 * re-elected due to buddy favours.
@@ -4234,7 +4234,7 @@
 		return;
 
 	if (delta > ideal_runtime)
-		resched_curr(rq_of(cfs_rq));
+		resched_curr_lazy(rq_of(cfs_rq));
 }
 
 static void
@@ -4376,7 +4376,7 @@
 	 * validating it and just reschedule.
 	 */
 	if (queued) {
-		resched_curr(rq_of(cfs_rq));
+		resched_curr_lazy(rq_of(cfs_rq));
 		return;
 	}
 	/*
@@ -4510,7 +4510,7 @@
 	 * hierarchy can be throttled
 	 */
 	if (!assign_cfs_rq_runtime(cfs_rq) && likely(cfs_rq->curr))
-		resched_curr(rq_of(cfs_rq));
+		resched_curr_lazy(rq_of(cfs_rq));
 }
 
 static __always_inline
@@ -4703,7 +4703,7 @@
 		struct rq *rq = rq_of(cfs_rq);
 		struct rq_flags rf;
 
-		rq_lock(rq, &rf);
+		rq_lock_irqsave(rq, &rf);
 		if (!cfs_rq_throttled(cfs_rq))
 			goto next;
 
@@ -4722,7 +4722,7 @@
 			unthrottle_cfs_rq(cfs_rq);
 
 next:
-		rq_unlock(rq, &rf);
+		rq_unlock_irqrestore(rq, &rf);
 
 		if (!remaining)
 			break;
@@ -4738,7 +4738,7 @@
  * period the timer is deactivated until scheduling resumes; cfs_b->idle is
  * used to track this state.
  */
-static int do_sched_cfs_period_timer(struct cfs_bandwidth *cfs_b, int overrun)
+static int do_sched_cfs_period_timer(struct cfs_bandwidth *cfs_b, int overrun, unsigned long flags)
 {
 	u64 runtime;
 	int throttled;
@@ -4778,10 +4778,10 @@
 	while (throttled && cfs_b->runtime > 0 && !cfs_b->distribute_running) {
 		runtime = cfs_b->runtime;
 		cfs_b->distribute_running = 1;
-		raw_spin_unlock(&cfs_b->lock);
+		raw_spin_unlock_irqrestore(&cfs_b->lock, flags);
 		/* we can't nest cfs_b->lock while distributing bandwidth */
 		runtime = distribute_cfs_runtime(cfs_b, runtime);
-		raw_spin_lock(&cfs_b->lock);
+		raw_spin_lock_irqsave(&cfs_b->lock, flags);
 
 		cfs_b->distribute_running = 0;
 		throttled = !list_empty(&cfs_b->throttled_cfs_rq);
@@ -4889,16 +4889,17 @@
 static void do_sched_cfs_slack_timer(struct cfs_bandwidth *cfs_b)
 {
 	u64 runtime = 0, slice = sched_cfs_bandwidth_slice();
+	unsigned long flags;
 
 	/* confirm we're still not at a refresh boundary */
-	raw_spin_lock(&cfs_b->lock);
+	raw_spin_lock_irqsave(&cfs_b->lock, flags);
 	if (cfs_b->distribute_running) {
-		raw_spin_unlock(&cfs_b->lock);
+		raw_spin_unlock_irqrestore(&cfs_b->lock, flags);
 		return;
 	}
 
 	if (runtime_refresh_within(cfs_b, min_bandwidth_expiration)) {
-		raw_spin_unlock(&cfs_b->lock);
+		raw_spin_unlock_irqrestore(&cfs_b->lock, flags);
 		return;
 	}
 
@@ -4908,17 +4909,17 @@
 	if (runtime)
 		cfs_b->distribute_running = 1;
 
-	raw_spin_unlock(&cfs_b->lock);
+	raw_spin_unlock_irqrestore(&cfs_b->lock, flags);
 
 	if (!runtime)
 		return;
 
 	runtime = distribute_cfs_runtime(cfs_b, runtime);
 
-	raw_spin_lock(&cfs_b->lock);
+	raw_spin_lock_irqsave(&cfs_b->lock, flags);
 	cfs_b->runtime -= min(runtime, cfs_b->runtime);
 	cfs_b->distribute_running = 0;
-	raw_spin_unlock(&cfs_b->lock);
+	raw_spin_unlock_irqrestore(&cfs_b->lock, flags);
 }
 
 /*
@@ -4998,11 +4999,12 @@
 {
 	struct cfs_bandwidth *cfs_b =
 		container_of(timer, struct cfs_bandwidth, period_timer);
+	unsigned long flags;
 	int overrun;
 	int idle = 0;
 	int count = 0;
 
-	raw_spin_lock(&cfs_b->lock);
+	raw_spin_lock_irqsave(&cfs_b->lock, flags);
 	for (;;) {
 		overrun = hrtimer_forward_now(timer, cfs_b->period);
 		if (!overrun)
@@ -5038,11 +5040,11 @@
 			count = 0;
 		}
 
-		idle = do_sched_cfs_period_timer(cfs_b, overrun);
+		idle = do_sched_cfs_period_timer(cfs_b, overrun, flags);
 	}
 	if (idle)
 		cfs_b->period_active = 0;
-	raw_spin_unlock(&cfs_b->lock);
+	raw_spin_unlock_irqrestore(&cfs_b->lock, flags);
 
 	return idle ? HRTIMER_NORESTART : HRTIMER_RESTART;
 }
@@ -5216,7 +5218,7 @@
 
 		if (delta < 0) {
 			if (rq->curr == p)
-				resched_curr(rq);
+				resched_curr_lazy(rq);
 			return;
 		}
 		hrtick_start(rq, delta);
@@ -6045,7 +6047,7 @@
 
 		/* Skip over this group if it has no CPUs allowed */
 		if (!cpumask_intersects(sched_group_span(group),
-					&p->cpus_allowed))
+					p->cpus_ptr))
 			continue;
 
 #ifdef CONFIG_ROCKCHIP_SCHED_PERFORMANCE_BIAS
@@ -6191,7 +6193,7 @@
 		return cpumask_first(sched_group_span(group));
 
 	/* Traverse only the allowed CPUs */
-	for_each_cpu_and(i, sched_group_span(group), &p->cpus_allowed) {
+	for_each_cpu_and(i, sched_group_span(group), p->cpus_ptr) {
 		if (available_idle_cpu(i)) {
 			struct rq *rq = cpu_rq(i);
 			struct cpuidle_state *idle = idle_get_state(rq);
@@ -6231,7 +6233,7 @@
 {
 	int new_cpu = cpu;
 
-	if (!cpumask_intersects(sched_domain_span(sd), &p->cpus_allowed))
+	if (!cpumask_intersects(sched_domain_span(sd), p->cpus_ptr))
 		return prev_cpu;
 
 	/*
@@ -6348,7 +6350,7 @@
 	if (!test_idle_cores(target, false))
 		return -1;
 
-	cpumask_and(cpus, sched_domain_span(sd), &p->cpus_allowed);
+	cpumask_and(cpus, sched_domain_span(sd), p->cpus_ptr);
 
 	for_each_cpu_wrap(core, cpus, target) {
 		bool idle = true;
@@ -6382,7 +6384,7 @@
 		return -1;
 
 	for_each_cpu(cpu, cpu_smt_mask(target)) {
-		if (!cpumask_test_cpu(cpu, &p->cpus_allowed))
+		if (!cpumask_test_cpu(cpu, p->cpus_ptr))
 			continue;
 		if (available_idle_cpu(cpu))
 			return cpu;
@@ -6443,7 +6445,7 @@
 
 	time = local_clock();
 
-	cpumask_and(cpus, sched_domain_span(sd), &p->cpus_allowed);
+	cpumask_and(cpus, sched_domain_span(sd), p->cpus_ptr);
 
 	for_each_cpu_wrap(cpu, cpus, target) {
 		if (!--nr)
@@ -6483,7 +6485,7 @@
 	    recent_used_cpu != target &&
 	    cpus_share_cache(recent_used_cpu, target) &&
 	    available_idle_cpu(recent_used_cpu) &&
-	    cpumask_test_cpu(p->recent_used_cpu, &p->cpus_allowed)) {
+	    cpumask_test_cpu(p->recent_used_cpu, p->cpus_ptr)) {
 		/*
 		 * Replace recent_used_cpu with prev as it is a potential
 		 * candidate for the next wake:
@@ -6701,7 +6703,7 @@
 	/* Scan CPUs in all SDs */
 	sg = sd->groups;
 	do {
-		for_each_cpu_and(i, &p->cpus_allowed, sched_group_span(sg)) {
+		for_each_cpu_and(i, p->cpus_ptr, sched_group_span(sg)) {
 			unsigned long capacity_curr = capacity_curr_of(i);
 			unsigned long capacity_orig = capacity_orig_of(i);
 			unsigned long wake_util, new_util;
@@ -7119,7 +7121,7 @@
 		max_spare_cap = 0;
 
 		for_each_cpu_and(cpu, perf_domain_span(pd), sched_domain_span(sd)) {
-			if (!cpumask_test_cpu(cpu, &p->cpus_allowed))
+			if (!cpumask_test_cpu(cpu, p->cpus_ptr))
 				continue;
 
 			util = cpu_util_next(cpu, p, cpu);
@@ -7237,7 +7239,7 @@
 
 	if (sysctl_sched_sync_hint_enable && sync) {
 		cpu = smp_processor_id();
-		if (cpumask_test_cpu(cpu, &p->cpus_allowed))
+		if (cpumask_test_cpu(cpu, p->cpus_ptr))
 			return cpu;
 	}
 
@@ -7282,7 +7284,7 @@
 		goto unlock;
 	}
 
-	if (cpumask_test_cpu(prev_cpu, &p->cpus_allowed))
+	if (cpumask_test_cpu(prev_cpu, p->cpus_ptr))
 		prev_energy = best_energy = compute_energy(p, prev_cpu, pd);
 	else
 		prev_energy = best_energy = ULONG_MAX;
@@ -7355,7 +7357,7 @@
 
 		want_affine = !wake_wide(p, sibling_count_hint) &&
 			      !wake_cap(p, cpu, prev_cpu) &&
-			      cpumask_test_cpu(cpu, &p->cpus_allowed);
+			      cpumask_test_cpu(cpu, p->cpus_ptr);
 	}
 
 sd_loop:
@@ -7617,7 +7619,7 @@
 	return;
 
 preempt:
-	resched_curr(rq);
+	resched_curr_lazy(rq);
 	/*
 	 * Only set the backward buddy when the current task is still
 	 * on the rq. This can happen when a wakeup gets interleaved
@@ -8113,14 +8115,14 @@
 	/*
 	 * We do not migrate tasks that are:
 	 * 1) throttled_lb_pair, or
-	 * 2) cannot be migrated to this CPU due to cpus_allowed, or
+	 * 2) cannot be migrated to this CPU due to cpus_ptr, or
 	 * 3) running (obviously), or
 	 * 4) are cache-hot on their current CPU.
 	 */
 	if (throttled_lb_pair(task_group(p), env->src_cpu, env->dst_cpu))
 		return 0;
 
-	if (!cpumask_test_cpu(env->dst_cpu, &p->cpus_allowed)) {
+	if (!cpumask_test_cpu(env->dst_cpu, p->cpus_ptr)) {
 		int cpu;
 
 		schedstat_inc(p->se.statistics.nr_failed_migrations_affine);
@@ -8140,7 +8142,7 @@
 
 		/* Prevent to re-select dst_cpu via env's CPUs: */
 		for_each_cpu_and(cpu, env->dst_grpmask, env->cpus) {
-			if (cpumask_test_cpu(cpu, &p->cpus_allowed)) {
+			if (cpumask_test_cpu(cpu, p->cpus_ptr)) {
 				env->flags |= LBF_DST_PINNED;
 				env->new_dst_cpu = cpu;
 				break;
@@ -8806,7 +8808,7 @@
 
 /*
  * Group imbalance indicates (and tries to solve) the problem where balancing
- * groups is inadequate due to ->cpus_allowed constraints.
+ * groups is inadequate due to ->cpus_ptr constraints.
  *
  * Imagine a situation of two groups of 4 CPUs each and 4 tasks each with a
  * cpumask covering 1 CPU of the first group and 3 CPUs of the second group.
@@ -9507,7 +9509,7 @@
 	/*
 	 * If the busiest group is imbalanced the below checks don't
 	 * work because they assume all things are equal, which typically
-	 * isn't true due to cpus_allowed constraints and the like.
+	 * isn't true due to cpus_ptr constraints and the like.
 	 */
 	if (busiest->group_type == group_imbalanced)
 		goto force_balance;
@@ -9947,7 +9949,7 @@
 			 * if the curr task on busiest CPU can't be
 			 * moved to this_cpu:
 			 */
-			if (!cpumask_test_cpu(this_cpu, &busiest->curr->cpus_allowed)) {
+			if (!cpumask_test_cpu(this_cpu, busiest->curr->cpus_ptr)) {
 				raw_spin_unlock_irqrestore(&busiest->lock,
 							    flags);
 				env.flags |= LBF_ALL_PINNED;
@@ -10943,7 +10945,7 @@
 		 * 'current' within the tree based on its new key value.
 		 */
 		swap(curr->vruntime, se->vruntime);
-		resched_curr(rq);
+		resched_curr_lazy(rq);
 	}
 
 	se->vruntime -= cfs_rq->min_vruntime;
@@ -10967,7 +10969,7 @@
 	 */
 	if (rq->curr == p) {
 		if (p->prio > oldprio)
-			resched_curr(rq);
+			resched_curr_lazy(rq);
 	} else
 		check_preempt_curr(rq, p, 0);
 }
diff --git a/kernel/kernel/sched/features.h b/kernel/kernel/sched/features.h
index bd395af..6c4089d 100644
--- a/kernel/kernel/sched/features.h
+++ b/kernel/kernel/sched/features.h
@@ -46,11 +46,19 @@
  */
 SCHED_FEAT(NONTASK_CAPACITY, true)
 
+#ifdef CONFIG_PREEMPT_RT_FULL
+SCHED_FEAT(TTWU_QUEUE, false)
+# ifdef CONFIG_PREEMPT_LAZY
+SCHED_FEAT(PREEMPT_LAZY, true)
+# endif
+#else
+
 /*
  * Queue remote wakeups on the target CPU and process them
  * using the scheduler IPI. Reduces rq->lock contention/bounces.
  */
 SCHED_FEAT(TTWU_QUEUE, true)
+#endif
 
 /*
  * When doing wakeups, attempt to limit superfluous scans of the LLC domain.
diff --git a/kernel/kernel/sched/rt.c b/kernel/kernel/sched/rt.c
index 5e85960..03edfac 100644
--- a/kernel/kernel/sched/rt.c
+++ b/kernel/kernel/sched/rt.c
@@ -45,8 +45,8 @@
 
 	raw_spin_lock_init(&rt_b->rt_runtime_lock);
 
-	hrtimer_init(&rt_b->rt_period_timer,
-			CLOCK_MONOTONIC, HRTIMER_MODE_REL);
+	hrtimer_init(&rt_b->rt_period_timer, CLOCK_MONOTONIC,
+		     HRTIMER_MODE_REL_HARD);
 	rt_b->rt_period_timer.function = sched_rt_period_timer;
 }
 
@@ -1680,7 +1680,7 @@
 static int pick_rt_task(struct rq *rq, struct task_struct *p, int cpu)
 {
 	if (!task_running(rq, p) &&
-	    cpumask_test_cpu(cpu, &p->cpus_allowed))
+	    cpumask_test_cpu(cpu, p->cpus_ptr))
 		return 1;
 
 	return 0;
@@ -1833,7 +1833,7 @@
 			 * Also make sure that it wasn't scheduled on its rq.
 			 */
 			if (unlikely(task_rq(task) != rq ||
-				     !cpumask_test_cpu(lowest_rq->cpu, &task->cpus_allowed) ||
+				     !cpumask_test_cpu(lowest_rq->cpu, task->cpus_ptr) ||
 				     task_running(rq, task) ||
 				     !rt_task(task) ||
 				     !task_on_rq_queued(task))) {
diff --git a/kernel/kernel/sched/sched.h b/kernel/kernel/sched/sched.h
index e0c2353..b30489f 100644
--- a/kernel/kernel/sched/sched.h
+++ b/kernel/kernel/sched/sched.h
@@ -1024,6 +1024,10 @@
 	struct cpuidle_state	*idle_state;
 	int			idle_state_idx;
 #endif
+
+#if defined(CONFIG_PREEMPT_RT_BASE) && defined(CONFIG_SMP)
+	int			nr_pinned;
+#endif
 };
 
 #ifdef CONFIG_FAIR_GROUP_SCHED
@@ -1670,6 +1674,7 @@
 #define WF_SYNC			0x01		/* Waker goes to sleep after wakeup */
 #define WF_FORK			0x02		/* Child wakeup after fork */
 #define WF_MIGRATED		0x4		/* Internal use, task got migrated */
+#define WF_LOCK_SLEEPER		0x08		/* wakeup spinlock "sleeper" */
 
 /*
  * To aid in avoiding the subversion of "niceness" due to uneven distribution
@@ -1889,6 +1894,15 @@
 extern void resched_curr(struct rq *rq);
 extern void resched_cpu(int cpu);
 
+#ifdef CONFIG_PREEMPT_LAZY
+extern void resched_curr_lazy(struct rq *rq);
+#else
+static inline void resched_curr_lazy(struct rq *rq)
+{
+	resched_curr(rq);
+}
+#endif
+
 extern struct rt_bandwidth def_rt_bandwidth;
 extern void init_rt_bandwidth(struct rt_bandwidth *rt_b, u64 period, u64 runtime);
 
diff --git a/kernel/kernel/sched/swait.c b/kernel/kernel/sched/swait.c
index 66b59ac..119a56d 100644
--- a/kernel/kernel/sched/swait.c
+++ b/kernel/kernel/sched/swait.c
@@ -32,6 +32,25 @@
 }
 EXPORT_SYMBOL(swake_up_locked);
 
+void swake_up_all_locked(struct swait_queue_head *q)
+{
+	struct swait_queue *curr;
+	int wakes = 0;
+
+	while (!list_empty(&q->task_list)) {
+
+		curr = list_first_entry(&q->task_list, typeof(*curr),
+					task_list);
+		wake_up_process(curr->task);
+		list_del_init(&curr->task_list);
+		wakes++;
+	}
+	if (pm_in_action)
+		return;
+	WARN(wakes > 2, "complete_all() with %d waiters\n", wakes);
+}
+EXPORT_SYMBOL(swake_up_all_locked);
+
 void swake_up_one(struct swait_queue_head *q)
 {
 	unsigned long flags;
@@ -51,6 +70,7 @@
 	struct swait_queue *curr;
 	LIST_HEAD(tmp);
 
+	WARN_ON(irqs_disabled());
 	raw_spin_lock_irq(&q->lock);
 	list_splice_init(&q->task_list, &tmp);
 	while (!list_empty(&tmp)) {
@@ -69,7 +89,7 @@
 }
 EXPORT_SYMBOL(swake_up_all);
 
-static void __prepare_to_swait(struct swait_queue_head *q, struct swait_queue *wait)
+void __prepare_to_swait(struct swait_queue_head *q, struct swait_queue *wait)
 {
 	wait->task = current;
 	if (list_empty(&wait->task_list))
diff --git a/kernel/kernel/sched/swork.c b/kernel/kernel/sched/swork.c
new file mode 100644
index 0000000..c90d14b
--- /dev/null
+++ b/kernel/kernel/sched/swork.c
@@ -0,0 +1,173 @@
+/*
+ * Copyright (C) 2014 BMW Car IT GmbH, Daniel Wagner daniel.wagner@bmw-carit.de
+ *
+ * Provides a framework for enqueuing callbacks from irq context
+ * PREEMPT_RT_FULL safe. The callbacks are executed in kthread context.
+ */
+
+#include <linux/swait.h>
+#include <linux/swork.h>
+#include <linux/kthread.h>
+#include <linux/slab.h>
+#include <linux/spinlock.h>
+#include <linux/export.h>
+
+#define SWORK_EVENT_PENDING     1
+
+static DEFINE_MUTEX(worker_mutex);
+static struct sworker *glob_worker;
+
+struct sworker {
+	struct list_head events;
+	struct swait_queue_head wq;
+
+	raw_spinlock_t lock;
+
+	struct task_struct *task;
+	int refs;
+};
+
+static bool swork_readable(struct sworker *worker)
+{
+	bool r;
+
+	if (kthread_should_stop())
+		return true;
+
+	raw_spin_lock_irq(&worker->lock);
+	r = !list_empty(&worker->events);
+	raw_spin_unlock_irq(&worker->lock);
+
+	return r;
+}
+
+static int swork_kthread(void *arg)
+{
+	struct sworker *worker = arg;
+
+	for (;;) {
+		swait_event_interruptible_exclusive(worker->wq,
+						    swork_readable(worker));
+		if (kthread_should_stop())
+			break;
+
+		raw_spin_lock_irq(&worker->lock);
+		while (!list_empty(&worker->events)) {
+			struct swork_event *sev;
+
+			sev = list_first_entry(&worker->events,
+					struct swork_event, item);
+			list_del(&sev->item);
+			raw_spin_unlock_irq(&worker->lock);
+
+			WARN_ON_ONCE(!test_and_clear_bit(SWORK_EVENT_PENDING,
+							 &sev->flags));
+			sev->func(sev);
+			raw_spin_lock_irq(&worker->lock);
+		}
+		raw_spin_unlock_irq(&worker->lock);
+	}
+	return 0;
+}
+
+static struct sworker *swork_create(void)
+{
+	struct sworker *worker;
+
+	worker = kzalloc(sizeof(*worker), GFP_KERNEL);
+	if (!worker)
+		return ERR_PTR(-ENOMEM);
+
+	INIT_LIST_HEAD(&worker->events);
+	raw_spin_lock_init(&worker->lock);
+	init_swait_queue_head(&worker->wq);
+
+	worker->task = kthread_run(swork_kthread, worker, "kswork");
+	if (IS_ERR(worker->task)) {
+		kfree(worker);
+		return ERR_PTR(-ENOMEM);
+	}
+
+	return worker;
+}
+
+static void swork_destroy(struct sworker *worker)
+{
+	kthread_stop(worker->task);
+
+	WARN_ON(!list_empty(&worker->events));
+	kfree(worker);
+}
+
+/**
+ * swork_queue - queue swork
+ *
+ * Returns %false if @work was already on a queue, %true otherwise.
+ *
+ * The work is queued and processed on a random CPU
+ */
+bool swork_queue(struct swork_event *sev)
+{
+	unsigned long flags;
+
+	if (test_and_set_bit(SWORK_EVENT_PENDING, &sev->flags))
+		return false;
+
+	raw_spin_lock_irqsave(&glob_worker->lock, flags);
+	list_add_tail(&sev->item, &glob_worker->events);
+	raw_spin_unlock_irqrestore(&glob_worker->lock, flags);
+
+	swake_up_one(&glob_worker->wq);
+	return true;
+}
+EXPORT_SYMBOL_GPL(swork_queue);
+
+/**
+ * swork_get - get an instance of the sworker
+ *
+ * Returns an negative error code if the initialization if the worker did not
+ * work, %0 otherwise.
+ *
+ */
+int swork_get(void)
+{
+	struct sworker *worker;
+
+	mutex_lock(&worker_mutex);
+	if (!glob_worker) {
+		worker = swork_create();
+		if (IS_ERR(worker)) {
+			mutex_unlock(&worker_mutex);
+			return -ENOMEM;
+		}
+
+		glob_worker = worker;
+	}
+
+	glob_worker->refs++;
+	mutex_unlock(&worker_mutex);
+
+	return 0;
+}
+EXPORT_SYMBOL_GPL(swork_get);
+
+/**
+ * swork_put - puts an instance of the sworker
+ *
+ * Will destroy the sworker thread. This function must not be called until all
+ * queued events have been completed.
+ */
+void swork_put(void)
+{
+	mutex_lock(&worker_mutex);
+
+	glob_worker->refs--;
+	if (glob_worker->refs > 0)
+		goto out;
+
+	swork_destroy(glob_worker);
+	glob_worker = NULL;
+out:
+	mutex_unlock(&worker_mutex);
+}
+EXPORT_SYMBOL_GPL(swork_put);
diff --git a/kernel/kernel/sched/topology.c b/kernel/kernel/sched/topology.c
index b88bde4..94262c0 100644
--- a/kernel/kernel/sched/topology.c
+++ b/kernel/kernel/sched/topology.c
@@ -490,6 +490,7 @@
 	rd->rto_cpu = -1;
 	raw_spin_lock_init(&rd->rto_lock);
 	init_irq_work(&rd->rto_push_work, rto_push_irq_work_func);
+	rd->rto_push_work.flags |= IRQ_WORK_HARD_IRQ;
 #endif
 
 	init_dl_bw(&rd->dl_bw);
diff --git a/kernel/kernel/signal.c b/kernel/kernel/signal.c
index a28b39e..08d677a 100644
--- a/kernel/kernel/signal.c
+++ b/kernel/kernel/signal.c
@@ -20,6 +20,7 @@
 #include <linux/sched/task_stack.h>
 #include <linux/sched/cputime.h>
 #include <linux/file.h>
+#include <linux/sched/rt.h>
 #include <linux/fs.h>
 #include <linux/proc_fs.h>
 #include <linux/tty.h>
@@ -402,13 +403,30 @@
 	task_set_jobctl_pending(task, mask | JOBCTL_STOP_PENDING);
 }
 
+static inline struct sigqueue *get_task_cache(struct task_struct *t)
+{
+	struct sigqueue *q = t->sigqueue_cache;
+
+	if (cmpxchg(&t->sigqueue_cache, q, NULL) != q)
+		return NULL;
+	return q;
+}
+
+static inline int put_task_cache(struct task_struct *t, struct sigqueue *q)
+{
+	if (cmpxchg(&t->sigqueue_cache, NULL, q) == NULL)
+		return 0;
+	return 1;
+}
+
 /*
  * allocate a new signal queue record
  * - this may be called without locks if and only if t == current, otherwise an
  *   appropriate lock must be held to stop the target task from exiting
  */
 static struct sigqueue *
-__sigqueue_alloc(int sig, struct task_struct *t, gfp_t flags, int override_rlimit)
+__sigqueue_do_alloc(int sig, struct task_struct *t, gfp_t flags,
+		    int override_rlimit, int fromslab)
 {
 	struct sigqueue *q = NULL;
 	struct user_struct *user;
@@ -430,7 +448,10 @@
 	rcu_read_unlock();
 
 	if (override_rlimit || likely(sigpending <= task_rlimit(t, RLIMIT_SIGPENDING))) {
-		q = kmem_cache_alloc(sigqueue_cachep, flags);
+		if (!fromslab)
+			q = get_task_cache(t);
+		if (!q)
+			q = kmem_cache_alloc(sigqueue_cachep, flags);
 	} else {
 		print_dropped_signal(sig);
 	}
@@ -447,6 +468,13 @@
 	return q;
 }
 
+static struct sigqueue *
+__sigqueue_alloc(int sig, struct task_struct *t, gfp_t flags,
+		 int override_rlimit)
+{
+	return __sigqueue_do_alloc(sig, t, flags, override_rlimit, 0);
+}
+
 static void __sigqueue_free(struct sigqueue *q)
 {
 	if (q->flags & SIGQUEUE_PREALLOC)
@@ -454,6 +482,21 @@
 	if (atomic_dec_and_test(&q->user->sigpending))
 		free_uid(q->user);
 	kmem_cache_free(sigqueue_cachep, q);
+}
+
+static void sigqueue_free_current(struct sigqueue *q)
+{
+	struct user_struct *up;
+
+	if (q->flags & SIGQUEUE_PREALLOC)
+		return;
+
+	up = q->user;
+	if (rt_prio(current->normal_prio) && !put_task_cache(current, q)) {
+		if (atomic_dec_and_test(&up->sigpending))
+			free_uid(up);
+	} else
+		  __sigqueue_free(q);
 }
 
 void flush_sigqueue(struct sigpending *queue)
@@ -466,6 +509,21 @@
 		list_del_init(&q->list);
 		__sigqueue_free(q);
 	}
+}
+
+/*
+ * Called from __exit_signal. Flush tsk->pending and
+ * tsk->sigqueue_cache
+ */
+void flush_task_sigqueue(struct task_struct *tsk)
+{
+	struct sigqueue *q;
+
+	flush_sigqueue(&tsk->pending);
+
+	q = get_task_cache(tsk);
+	if (q)
+		kmem_cache_free(sigqueue_cachep, q);
 }
 
 /*
@@ -591,7 +649,7 @@
 			(info->si_code == SI_TIMER) &&
 			(info->si_sys_private);
 
-		__sigqueue_free(first);
+		sigqueue_free_current(first);
 	} else {
 		/*
 		 * Ok, it wasn't in the queue.  This must be
@@ -627,6 +685,8 @@
 {
 	bool resched_timer = false;
 	int signr;
+
+	WARN_ON_ONCE(tsk != current);
 
 	/* We only dequeue private signals from ourselves, we don't let
 	 * signalfd steal them
@@ -1287,8 +1347,8 @@
  * We don't want to have recursive SIGSEGV's etc, for example,
  * that is why we also clear SIGNAL_UNKILLABLE.
  */
-int
-force_sig_info(int sig, struct siginfo *info, struct task_struct *t)
+static int
+do_force_sig_info(int sig, struct siginfo *info, struct task_struct *t)
 {
 	unsigned long int flags;
 	int ret, blocked, ignored;
@@ -1315,6 +1375,39 @@
 	spin_unlock_irqrestore(&t->sighand->siglock, flags);
 
 	return ret;
+}
+
+int force_sig_info(int sig, struct siginfo *info, struct task_struct *t)
+{
+/*
+ * On some archs, PREEMPT_RT has to delay sending a signal from a trap
+ * since it can not enable preemption, and the signal code's spin_locks
+ * turn into mutexes. Instead, it must set TIF_NOTIFY_RESUME which will
+ * send the signal on exit of the trap.
+ */
+#ifdef ARCH_RT_DELAYS_SIGNAL_SEND
+	if (in_atomic()) {
+		if (WARN_ON_ONCE(t != current))
+			return 0;
+		if (WARN_ON_ONCE(t->forced_info.si_signo))
+			return 0;
+
+		if (is_si_special(info)) {
+			WARN_ON_ONCE(info != SEND_SIG_PRIV);
+			t->forced_info.si_signo = sig;
+			t->forced_info.si_errno = 0;
+			t->forced_info.si_code = SI_KERNEL;
+			t->forced_info.si_pid = 0;
+			t->forced_info.si_uid = 0;
+		} else {
+			t->forced_info = *info;
+		}
+
+		set_tsk_thread_flag(t, TIF_NOTIFY_RESUME);
+		return 0;
+	}
+#endif
+	return do_force_sig_info(sig, info, t);
 }
 
 /*
@@ -1733,7 +1826,8 @@
  */
 struct sigqueue *sigqueue_alloc(void)
 {
-	struct sigqueue *q = __sigqueue_alloc(-1, current, GFP_KERNEL, 0);
+	/* Preallocated sigqueue objects always from the slabcache ! */
+	struct sigqueue *q = __sigqueue_do_alloc(-1, current, GFP_KERNEL, 0, 1);
 
 	if (q)
 		q->flags |= SIGQUEUE_PREALLOC;
@@ -2114,18 +2208,8 @@
 		if (gstop_done && ptrace_reparented(current))
 			do_notify_parent_cldstop(current, false, why);
 
-		/*
-		 * Don't want to allow preemption here, because
-		 * sys_ptrace() needs this task to be inactive.
-		 *
-		 * XXX: implement read_unlock_no_resched().
-		 */
-		preempt_disable();
 		read_unlock(&tasklist_lock);
-		cgroup_enter_frozen();
-		preempt_enable_no_resched();
 		freezable_schedule();
-		cgroup_leave_frozen(true);
 	} else {
 		/*
 		 * By the time we got the lock, our tracer went away.
diff --git a/kernel/kernel/softirq.c b/kernel/kernel/softirq.c
index 6f58486..9bad7a1 100644
--- a/kernel/kernel/softirq.c
+++ b/kernel/kernel/softirq.c
@@ -21,11 +21,14 @@
 #include <linux/freezer.h>
 #include <linux/kthread.h>
 #include <linux/rcupdate.h>
+#include <linux/delay.h>
 #include <linux/ftrace.h>
 #include <linux/smp.h>
 #include <linux/smpboot.h>
 #include <linux/tick.h>
+#include <linux/locallock.h>
 #include <linux/irq.h>
+#include <linux/sched/types.h>
 
 #define CREATE_TRACE_POINTS
 #include <trace/events/irq.h>
@@ -56,11 +59,135 @@
 static struct softirq_action softirq_vec[NR_SOFTIRQS] __cacheline_aligned_in_smp;
 
 DEFINE_PER_CPU(struct task_struct *, ksoftirqd);
+#ifdef CONFIG_PREEMPT_RT_FULL
+#define TIMER_SOFTIRQS ((1 << TIMER_SOFTIRQ) | (1 << HRTIMER_SOFTIRQ))
+DEFINE_PER_CPU(struct task_struct *, ktimer_softirqd);
+#endif
 
 const char * const softirq_to_name[NR_SOFTIRQS] = {
 	"HI", "TIMER", "NET_TX", "NET_RX", "BLOCK", "IRQ_POLL",
 	"TASKLET", "SCHED", "HRTIMER", "RCU"
 };
+
+#ifdef CONFIG_NO_HZ_COMMON
+# ifdef CONFIG_PREEMPT_RT_FULL
+
+struct softirq_runner {
+	struct task_struct *runner[NR_SOFTIRQS];
+};
+
+static DEFINE_PER_CPU(struct softirq_runner, softirq_runners);
+
+static inline void softirq_set_runner(unsigned int sirq)
+{
+	struct softirq_runner *sr = this_cpu_ptr(&softirq_runners);
+
+	sr->runner[sirq] = current;
+}
+
+static inline void softirq_clr_runner(unsigned int sirq)
+{
+	struct softirq_runner *sr = this_cpu_ptr(&softirq_runners);
+
+	sr->runner[sirq] = NULL;
+}
+
+static bool softirq_check_runner_tsk(struct task_struct *tsk,
+				     unsigned int *pending)
+{
+	bool ret = false;
+
+	if (!tsk)
+		return ret;
+
+	/*
+	 * The wakeup code in rtmutex.c wakes up the task
+	 * _before_ it sets pi_blocked_on to NULL under
+	 * tsk->pi_lock. So we need to check for both: state
+	 * and pi_blocked_on.
+	 * The test against UNINTERRUPTIBLE + ->sleeping_lock is in case the
+	 * task does cpu_chill().
+	 */
+	raw_spin_lock(&tsk->pi_lock);
+	if (tsk->pi_blocked_on || tsk->state == TASK_RUNNING ||
+	    (tsk->state == TASK_UNINTERRUPTIBLE && tsk->sleeping_lock)) {
+		/* Clear all bits pending in that task */
+		*pending &= ~(tsk->softirqs_raised);
+		ret = true;
+	}
+	raw_spin_unlock(&tsk->pi_lock);
+
+	return ret;
+}
+
+/*
+ * On preempt-rt a softirq running context might be blocked on a
+ * lock. There might be no other runnable task on this CPU because the
+ * lock owner runs on some other CPU. So we have to go into idle with
+ * the pending bit set. Therefor we need to check this otherwise we
+ * warn about false positives which confuses users and defeats the
+ * whole purpose of this test.
+ *
+ * This code is called with interrupts disabled.
+ */
+void softirq_check_pending_idle(void)
+{
+	struct task_struct *tsk;
+	static int rate_limit;
+	struct softirq_runner *sr = this_cpu_ptr(&softirq_runners);
+	u32 warnpending;
+	int i;
+
+	if (rate_limit >= 10)
+		return;
+
+	warnpending = local_softirq_pending() & SOFTIRQ_STOP_IDLE_MASK;
+	if (!warnpending)
+		return;
+	for (i = 0; i < NR_SOFTIRQS; i++) {
+		tsk = sr->runner[i];
+
+		if (softirq_check_runner_tsk(tsk, &warnpending))
+			warnpending &= ~(1 << i);
+	}
+
+	if (warnpending) {
+		tsk = __this_cpu_read(ksoftirqd);
+		softirq_check_runner_tsk(tsk, &warnpending);
+	}
+
+	if (warnpending) {
+		tsk = __this_cpu_read(ktimer_softirqd);
+		softirq_check_runner_tsk(tsk, &warnpending);
+	}
+
+	if (warnpending) {
+		printk(KERN_ERR "NOHZ: local_softirq_pending %02x\n",
+		       warnpending);
+		rate_limit++;
+	}
+}
+# else
+/*
+ * On !PREEMPT_RT we just printk rate limited:
+ */
+void softirq_check_pending_idle(void)
+{
+	static int rate_limit;
+
+	if (rate_limit < 10 &&
+			(local_softirq_pending() & SOFTIRQ_STOP_IDLE_MASK)) {
+		printk(KERN_ERR "NOHZ: local_softirq_pending %02x\n",
+		       local_softirq_pending());
+		rate_limit++;
+	}
+}
+# endif
+
+#else /* !CONFIG_NO_HZ_COMMON */
+static inline void softirq_set_runner(unsigned int sirq) { }
+static inline void softirq_clr_runner(unsigned int sirq) { }
+#endif
 
 /*
  * we cannot loop indefinitely here to avoid userspace starvation,
@@ -77,6 +204,38 @@
 		wake_up_process(tsk);
 }
 
+#ifdef CONFIG_PREEMPT_RT_FULL
+static void wakeup_timer_softirqd(void)
+{
+	/* Interrupts are disabled: no need to stop preemption */
+	struct task_struct *tsk = __this_cpu_read(ktimer_softirqd);
+
+	if (tsk && tsk->state != TASK_RUNNING)
+		wake_up_process(tsk);
+}
+#endif
+
+static void handle_softirq(unsigned int vec_nr)
+{
+	struct softirq_action *h = softirq_vec + vec_nr;
+	int prev_count;
+
+	prev_count = preempt_count();
+
+	kstat_incr_softirqs_this_cpu(vec_nr);
+
+	trace_softirq_entry(vec_nr);
+	h->action(h);
+	trace_softirq_exit(vec_nr);
+	if (unlikely(prev_count != preempt_count())) {
+		pr_err("huh, entered softirq %u %s %p with preempt_count %08x, exited with %08x?\n",
+		       vec_nr, softirq_to_name[vec_nr], h->action,
+		       prev_count, preempt_count());
+		preempt_count_set(prev_count);
+	}
+}
+
+#ifndef CONFIG_PREEMPT_RT_FULL
 /*
  * If ksoftirqd is scheduled, we do not want to process pending softirqs
  * right now. Let ksoftirqd handle this at its own rate, to get fairness,
@@ -90,6 +249,47 @@
 	if (pending & SOFTIRQ_NOW_MASK)
 		return false;
 	return tsk && (tsk->state == TASK_RUNNING);
+}
+
+static inline int ksoftirqd_softirq_pending(void)
+{
+	return local_softirq_pending();
+}
+
+static void handle_pending_softirqs(u32 pending)
+{
+	struct softirq_action *h = softirq_vec;
+	int softirq_bit;
+
+	local_irq_enable();
+
+	h = softirq_vec;
+
+	while ((softirq_bit = ffs(pending))) {
+		unsigned int vec_nr;
+
+		h += softirq_bit - 1;
+		vec_nr = h - softirq_vec;
+		handle_softirq(vec_nr);
+
+		h++;
+		pending >>= softirq_bit;
+	}
+
+	rcu_bh_qs();
+	local_irq_disable();
+}
+
+static void run_ksoftirqd(unsigned int cpu)
+{
+	local_irq_disable();
+	if (ksoftirqd_softirq_pending()) {
+		__do_softirq();
+		local_irq_enable();
+		cond_resched();
+		return;
+	}
+	local_irq_enable();
 }
 
 /*
@@ -251,10 +451,8 @@
 	unsigned long end = jiffies + MAX_SOFTIRQ_TIME;
 	unsigned long old_flags = current->flags;
 	int max_restart = MAX_SOFTIRQ_RESTART;
-	struct softirq_action *h;
 	bool in_hardirq;
 	__u32 pending;
-	int softirq_bit;
 
 	/*
 	 * Mask out PF_MEMALLOC s current task context is borrowed for the
@@ -273,36 +471,7 @@
 	/* Reset the pending bitmask before enabling irqs */
 	set_softirq_pending(0);
 
-	local_irq_enable();
-
-	h = softirq_vec;
-
-	while ((softirq_bit = ffs(pending))) {
-		unsigned int vec_nr;
-		int prev_count;
-
-		h += softirq_bit - 1;
-
-		vec_nr = h - softirq_vec;
-		prev_count = preempt_count();
-
-		kstat_incr_softirqs_this_cpu(vec_nr);
-
-		trace_softirq_entry(vec_nr);
-		h->action(h);
-		trace_softirq_exit(vec_nr);
-		if (unlikely(prev_count != preempt_count())) {
-			pr_err("huh, entered softirq %u %s %p with preempt_count %08x, exited with %08x?\n",
-			       vec_nr, softirq_to_name[vec_nr], h->action,
-			       prev_count, preempt_count());
-			preempt_count_set(prev_count);
-		}
-		h++;
-		pending >>= softirq_bit;
-	}
-
-	rcu_bh_qs();
-	local_irq_disable();
+	handle_pending_softirqs(pending);
 
 	pending = local_softirq_pending();
 	if (pending) {
@@ -339,6 +508,309 @@
 }
 
 /*
+ * This function must run with irqs disabled!
+ */
+void raise_softirq_irqoff(unsigned int nr)
+{
+	__raise_softirq_irqoff(nr);
+
+	/*
+	 * If we're in an interrupt or softirq, we're done
+	 * (this also catches softirq-disabled code). We will
+	 * actually run the softirq once we return from
+	 * the irq or softirq.
+	 *
+	 * Otherwise we wake up ksoftirqd to make sure we
+	 * schedule the softirq soon.
+	 */
+	if (!in_interrupt())
+		wakeup_softirqd();
+}
+
+void __raise_softirq_irqoff(unsigned int nr)
+{
+	trace_softirq_raise(nr);
+	or_softirq_pending(1UL << nr);
+}
+
+static inline void local_bh_disable_nort(void) { local_bh_disable(); }
+static inline void _local_bh_enable_nort(void) { _local_bh_enable(); }
+static void ksoftirqd_set_sched_params(unsigned int cpu) { }
+
+#else /* !PREEMPT_RT_FULL */
+
+/*
+ * On RT we serialize softirq execution with a cpu local lock per softirq
+ */
+static DEFINE_PER_CPU(struct local_irq_lock [NR_SOFTIRQS], local_softirq_locks);
+
+void __init softirq_early_init(void)
+{
+	int i;
+
+	for (i = 0; i < NR_SOFTIRQS; i++)
+		local_irq_lock_init(local_softirq_locks[i]);
+}
+
+static void lock_softirq(int which)
+{
+	local_lock(local_softirq_locks[which]);
+}
+
+static void unlock_softirq(int which)
+{
+	local_unlock(local_softirq_locks[which]);
+}
+
+static void do_single_softirq(int which)
+{
+	unsigned long old_flags = current->flags;
+
+	current->flags &= ~PF_MEMALLOC;
+	vtime_account_irq_enter(current);
+	current->flags |= PF_IN_SOFTIRQ;
+	lockdep_softirq_enter();
+	local_irq_enable();
+	handle_softirq(which);
+	local_irq_disable();
+	lockdep_softirq_exit();
+	current->flags &= ~PF_IN_SOFTIRQ;
+	vtime_account_irq_enter(current);
+	current_restore_flags(old_flags, PF_MEMALLOC);
+}
+
+/*
+ * Called with interrupts disabled. Process softirqs which were raised
+ * in current context (or on behalf of ksoftirqd).
+ */
+static void do_current_softirqs(void)
+{
+	while (current->softirqs_raised) {
+		int i = __ffs(current->softirqs_raised);
+		unsigned int pending, mask = (1U << i);
+
+		current->softirqs_raised &= ~mask;
+		local_irq_enable();
+
+		/*
+		 * If the lock is contended, we boost the owner to
+		 * process the softirq or leave the critical section
+		 * now.
+		 */
+		lock_softirq(i);
+		local_irq_disable();
+		softirq_set_runner(i);
+		/*
+		 * Check with the local_softirq_pending() bits,
+		 * whether we need to process this still or if someone
+		 * else took care of it.
+		 */
+		pending = local_softirq_pending();
+		if (pending & mask) {
+			set_softirq_pending(pending & ~mask);
+			do_single_softirq(i);
+		}
+		softirq_clr_runner(i);
+		WARN_ON(current->softirq_nestcnt != 1);
+		local_irq_enable();
+		unlock_softirq(i);
+		local_irq_disable();
+	}
+}
+
+void __local_bh_disable(void)
+{
+	if (++current->softirq_nestcnt == 1)
+		migrate_disable();
+}
+EXPORT_SYMBOL(__local_bh_disable);
+
+void __local_bh_enable(void)
+{
+	if (WARN_ON(current->softirq_nestcnt == 0))
+		return;
+
+	local_irq_disable();
+	if (current->softirq_nestcnt == 1 && current->softirqs_raised)
+		do_current_softirqs();
+	local_irq_enable();
+
+	if (--current->softirq_nestcnt == 0)
+		migrate_enable();
+}
+EXPORT_SYMBOL(__local_bh_enable);
+
+void _local_bh_enable(void)
+{
+	if (WARN_ON(current->softirq_nestcnt == 0))
+		return;
+	if (--current->softirq_nestcnt == 0)
+		migrate_enable();
+}
+EXPORT_SYMBOL(_local_bh_enable);
+
+int in_serving_softirq(void)
+{
+	return current->flags & PF_IN_SOFTIRQ;
+}
+EXPORT_SYMBOL(in_serving_softirq);
+
+/* Called with preemption disabled */
+static void run_ksoftirqd(unsigned int cpu)
+{
+	local_irq_disable();
+	current->softirq_nestcnt++;
+
+	do_current_softirqs();
+	current->softirq_nestcnt--;
+	local_irq_enable();
+	cond_resched();
+}
+
+/*
+ * Called from netif_rx_ni(). Preemption enabled, but migration
+ * disabled. So the cpu can't go away under us.
+ */
+void thread_do_softirq(void)
+{
+	if (!in_serving_softirq() && current->softirqs_raised) {
+		current->softirq_nestcnt++;
+		do_current_softirqs();
+		current->softirq_nestcnt--;
+	}
+}
+
+static void do_raise_softirq_irqoff(unsigned int nr)
+{
+	unsigned int mask;
+
+	mask = 1UL << nr;
+
+	trace_softirq_raise(nr);
+	or_softirq_pending(mask);
+
+	/*
+	 * If we are not in a hard interrupt and inside a bh disabled
+	 * region, we simply raise the flag on current. local_bh_enable()
+	 * will make sure that the softirq is executed. Otherwise we
+	 * delegate it to ksoftirqd.
+	 */
+	if (!in_irq() && current->softirq_nestcnt)
+		current->softirqs_raised |= mask;
+	else if (!__this_cpu_read(ksoftirqd) || !__this_cpu_read(ktimer_softirqd))
+		return;
+
+	if (mask & TIMER_SOFTIRQS)
+		__this_cpu_read(ktimer_softirqd)->softirqs_raised |= mask;
+	else
+		__this_cpu_read(ksoftirqd)->softirqs_raised |= mask;
+}
+
+static void wakeup_proper_softirq(unsigned int nr)
+{
+	if ((1UL << nr) & TIMER_SOFTIRQS)
+		wakeup_timer_softirqd();
+	else
+		wakeup_softirqd();
+}
+
+void __raise_softirq_irqoff(unsigned int nr)
+{
+	do_raise_softirq_irqoff(nr);
+	if (!in_irq() && !current->softirq_nestcnt)
+		wakeup_proper_softirq(nr);
+}
+
+/*
+ * Same as __raise_softirq_irqoff() but will process them in ksoftirqd
+ */
+void __raise_softirq_irqoff_ksoft(unsigned int nr)
+{
+	unsigned int mask;
+
+	if (WARN_ON_ONCE(!__this_cpu_read(ksoftirqd) ||
+			 !__this_cpu_read(ktimer_softirqd)))
+		return;
+	mask = 1UL << nr;
+
+	trace_softirq_raise(nr);
+	or_softirq_pending(mask);
+	if (mask & TIMER_SOFTIRQS)
+		__this_cpu_read(ktimer_softirqd)->softirqs_raised |= mask;
+	else
+		__this_cpu_read(ksoftirqd)->softirqs_raised |= mask;
+	wakeup_proper_softirq(nr);
+}
+
+/*
+ * This function must run with irqs disabled!
+ */
+void raise_softirq_irqoff(unsigned int nr)
+{
+	do_raise_softirq_irqoff(nr);
+
+	/*
+	 * If we're in an hard interrupt we let irq return code deal
+	 * with the wakeup of ksoftirqd.
+	 */
+	if (in_irq())
+		return;
+	/*
+	 * If we are in thread context but outside of a bh disabled
+	 * region, we need to wake ksoftirqd as well.
+	 *
+	 * CHECKME: Some of the places which do that could be wrapped
+	 * into local_bh_disable/enable pairs. Though it's unclear
+	 * whether this is worth the effort. To find those places just
+	 * raise a WARN() if the condition is met.
+	 */
+	if (!current->softirq_nestcnt)
+		wakeup_proper_softirq(nr);
+}
+
+static inline int ksoftirqd_softirq_pending(void)
+{
+	return current->softirqs_raised;
+}
+
+static inline void local_bh_disable_nort(void) { }
+static inline void _local_bh_enable_nort(void) { }
+
+static inline void ksoftirqd_set_sched_params(unsigned int cpu)
+{
+	/* Take over all but timer pending softirqs when starting */
+	local_irq_disable();
+	current->softirqs_raised = local_softirq_pending() & ~TIMER_SOFTIRQS;
+	local_irq_enable();
+}
+
+static inline void ktimer_softirqd_set_sched_params(unsigned int cpu)
+{
+	struct sched_param param = { .sched_priority = 1 };
+
+	sched_setscheduler(current, SCHED_FIFO, &param);
+
+	/* Take over timer pending softirqs when starting */
+	local_irq_disable();
+	current->softirqs_raised = local_softirq_pending() & TIMER_SOFTIRQS;
+	local_irq_enable();
+}
+
+static inline void ktimer_softirqd_clr_sched_params(unsigned int cpu,
+						    bool online)
+{
+	struct sched_param param = { .sched_priority = 0 };
+
+	sched_setscheduler(current, SCHED_NORMAL, &param);
+}
+
+static int ktimer_softirqd_should_run(unsigned int cpu)
+{
+	return current->softirqs_raised;
+}
+
+#endif /* PREEMPT_RT_FULL */
+/*
  * Enter an interrupt context.
  */
 void irq_enter(void)
@@ -349,9 +821,9 @@
 		 * Prevent raise_softirq from needlessly waking up ksoftirqd
 		 * here, as softirq will be serviced on return from interrupt.
 		 */
-		local_bh_disable();
+		local_bh_disable_nort();
 		tick_irq_enter();
-		_local_bh_enable();
+		_local_bh_enable_nort();
 	}
 
 	__irq_enter();
@@ -359,6 +831,7 @@
 
 static inline void invoke_softirq(void)
 {
+#ifndef CONFIG_PREEMPT_RT_FULL
 	if (ksoftirqd_running(local_softirq_pending()))
 		return;
 
@@ -381,6 +854,18 @@
 	} else {
 		wakeup_softirqd();
 	}
+#else /* PREEMPT_RT_FULL */
+	unsigned long flags;
+
+	local_irq_save(flags);
+	if (__this_cpu_read(ksoftirqd) &&
+			__this_cpu_read(ksoftirqd)->softirqs_raised)
+		wakeup_softirqd();
+	if (__this_cpu_read(ktimer_softirqd) &&
+			__this_cpu_read(ktimer_softirqd)->softirqs_raised)
+		wakeup_timer_softirqd();
+	local_irq_restore(flags);
+#endif
 }
 
 static inline void tick_irq_exit(void)
@@ -416,26 +901,6 @@
 	trace_hardirq_exit(); /* must be last! */
 }
 
-/*
- * This function must run with irqs disabled!
- */
-inline void raise_softirq_irqoff(unsigned int nr)
-{
-	__raise_softirq_irqoff(nr);
-
-	/*
-	 * If we're in an interrupt or softirq, we're done
-	 * (this also catches softirq-disabled code). We will
-	 * actually run the softirq once we return from
-	 * the irq or softirq.
-	 *
-	 * Otherwise we wake up ksoftirqd to make sure we
-	 * schedule the softirq soon.
-	 */
-	if (!in_interrupt())
-		wakeup_softirqd();
-}
-
 void raise_softirq(unsigned int nr)
 {
 	unsigned long flags;
@@ -443,12 +908,6 @@
 	local_irq_save(flags);
 	raise_softirq_irqoff(nr);
 	local_irq_restore(flags);
-}
-
-void __raise_softirq_irqoff(unsigned int nr)
-{
-	trace_softirq_raise(nr);
-	or_softirq_pending(1UL << nr);
 }
 
 void open_softirq(int nr, void (*action)(struct softirq_action *))
@@ -475,11 +934,44 @@
 	unsigned long flags;
 
 	local_irq_save(flags);
+	if (!tasklet_trylock(t)) {
+		local_irq_restore(flags);
+		return;
+	}
+
 	head = this_cpu_ptr(headp);
-	t->next = NULL;
-	*head->tail = t;
-	head->tail = &(t->next);
-	raise_softirq_irqoff(softirq_nr);
+again:
+	/* We may have been preempted before tasklet_trylock
+	 * and __tasklet_action may have already run.
+	 * So double check the sched bit while the takslet
+	 * is locked before adding it to the list.
+	 */
+	if (test_bit(TASKLET_STATE_SCHED, &t->state)) {
+#if defined(CONFIG_SMP) || defined(CONFIG_PREEMPT_RT_FULL)
+		if (test_and_set_bit(TASKLET_STATE_CHAINED, &t->state)) {
+			tasklet_unlock(t);
+			return;
+		}
+#endif
+		t->next = NULL;
+		*head->tail = t;
+		head->tail = &(t->next);
+		raise_softirq_irqoff(softirq_nr);
+		tasklet_unlock(t);
+	} else {
+		/* This is subtle. If we hit the corner case above
+		 * It is possible that we get preempted right here,
+		 * and another task has successfully called
+		 * tasklet_schedule(), then this function, and
+		 * failed on the trylock. Thus we must be sure
+		 * before releasing the tasklet lock, that the
+		 * SCHED_BIT is clear. Otherwise the tasklet
+		 * may get its SCHED_BIT set, but not added to the
+		 * list
+		 */
+		if (!tasklet_tryunlock(t))
+			goto again;
+	}
 	local_irq_restore(flags);
 }
 
@@ -497,11 +989,21 @@
 }
 EXPORT_SYMBOL(__tasklet_hi_schedule);
 
+void tasklet_enable(struct tasklet_struct *t)
+{
+	if (!atomic_dec_and_test(&t->count))
+		return;
+	if (test_and_clear_bit(TASKLET_STATE_PENDING, &t->state))
+		tasklet_schedule(t);
+}
+EXPORT_SYMBOL(tasklet_enable);
+
 static void tasklet_action_common(struct softirq_action *a,
 				  struct tasklet_head *tl_head,
 				  unsigned int softirq_nr)
 {
 	struct tasklet_struct *list;
+	int loops = 1000000;
 
 	local_irq_disable();
 	list = tl_head->head;
@@ -513,25 +1015,60 @@
 		struct tasklet_struct *t = list;
 
 		list = list->next;
-
-		if (tasklet_trylock(t)) {
-			if (!atomic_read(&t->count)) {
-				if (!test_and_clear_bit(TASKLET_STATE_SCHED,
-							&t->state))
-					BUG();
-				t->func(t->data);
-				tasklet_unlock(t);
-				continue;
-			}
-			tasklet_unlock(t);
+		/*
+		 * Should always succeed - after a tasklist got on the
+		 * list (after getting the SCHED bit set from 0 to 1),
+		 * nothing but the tasklet softirq it got queued to can
+		 * lock it:
+		 */
+		if (!tasklet_trylock(t)) {
+			WARN_ON(1);
+			continue;
 		}
 
-		local_irq_disable();
 		t->next = NULL;
-		*tl_head->tail = t;
-		tl_head->tail = &t->next;
-		__raise_softirq_irqoff(softirq_nr);
-		local_irq_enable();
+
+		if (unlikely(atomic_read(&t->count))) {
+out_disabled:
+			/* implicit unlock: */
+			wmb();
+			t->state = TASKLET_STATEF_PENDING;
+			continue;
+		}
+		/*
+		 * After this point on the tasklet might be rescheduled
+		 * on another CPU, but it can only be added to another
+		 * CPU's tasklet list if we unlock the tasklet (which we
+		 * dont do yet).
+		 */
+		if (!test_and_clear_bit(TASKLET_STATE_SCHED, &t->state))
+			WARN_ON(1);
+again:
+		t->func(t->data);
+
+#if defined(CONFIG_SMP) || defined(CONFIG_PREEMPT_RT_FULL)
+		while (cmpxchg(&t->state, TASKLET_STATEF_RC, 0) != TASKLET_STATEF_RC) {
+#else
+		while (!tasklet_tryunlock(t)) {
+#endif
+			/*
+			 * If it got disabled meanwhile, bail out:
+			 */
+			if (atomic_read(&t->count))
+				goto out_disabled;
+			/*
+			 * If it got scheduled meanwhile, re-execute
+			 * the tasklet function:
+			 */
+			if (test_and_clear_bit(TASKLET_STATE_SCHED, &t->state))
+				goto again;
+			if (!--loops) {
+				printk("hm, tasklet state: %08lx\n", t->state);
+				WARN_ON(1);
+				tasklet_unlock(t);
+				break;
+			}
+		}
 	}
 }
 
@@ -563,7 +1100,7 @@
 
 	while (test_and_set_bit(TASKLET_STATE_SCHED, &t->state)) {
 		do {
-			yield();
+			msleep(1);
 		} while (test_bit(TASKLET_STATE_SCHED, &t->state));
 	}
 	tasklet_unlock_wait(t);
@@ -637,25 +1174,26 @@
 	open_softirq(HI_SOFTIRQ, tasklet_hi_action);
 }
 
+#if defined(CONFIG_SMP) || defined(CONFIG_PREEMPT_RT_FULL)
+void tasklet_unlock_wait(struct tasklet_struct *t)
+{
+	while (test_bit(TASKLET_STATE_RUN, &(t)->state)) {
+		/*
+		 * Hack for now to avoid this busy-loop:
+		 */
+#ifdef CONFIG_PREEMPT_RT_FULL
+		msleep(1);
+#else
+		barrier();
+#endif
+	}
+}
+EXPORT_SYMBOL(tasklet_unlock_wait);
+#endif
+
 static int ksoftirqd_should_run(unsigned int cpu)
 {
-	return local_softirq_pending();
-}
-
-static void run_ksoftirqd(unsigned int cpu)
-{
-	local_irq_disable();
-	if (local_softirq_pending()) {
-		/*
-		 * We can safely run softirq on inline stack, as we are not deep
-		 * in the task stack here.
-		 */
-		__do_softirq();
-		local_irq_enable();
-		cond_resched();
-		return;
-	}
-	local_irq_enable();
+	return ksoftirqd_softirq_pending();
 }
 
 #ifdef CONFIG_HOTPLUG_CPU
@@ -722,17 +1260,31 @@
 
 static struct smp_hotplug_thread softirq_threads = {
 	.store			= &ksoftirqd,
+	.setup			= ksoftirqd_set_sched_params,
 	.thread_should_run	= ksoftirqd_should_run,
 	.thread_fn		= run_ksoftirqd,
 	.thread_comm		= "ksoftirqd/%u",
 };
+
+#ifdef CONFIG_PREEMPT_RT_FULL
+static struct smp_hotplug_thread softirq_timer_threads = {
+	.store			= &ktimer_softirqd,
+	.setup			= ktimer_softirqd_set_sched_params,
+	.cleanup		= ktimer_softirqd_clr_sched_params,
+	.thread_should_run	= ktimer_softirqd_should_run,
+	.thread_fn		= run_ksoftirqd,
+	.thread_comm		= "ktimersoftd/%u",
+};
+#endif
 
 static __init int spawn_ksoftirqd(void)
 {
 	cpuhp_setup_state_nocalls(CPUHP_SOFTIRQ_DEAD, "softirq:dead", NULL,
 				  takeover_tasklets);
 	BUG_ON(smpboot_register_percpu_thread(&softirq_threads));
-
+#ifdef CONFIG_PREEMPT_RT_FULL
+	BUG_ON(smpboot_register_percpu_thread(&softirq_timer_threads));
+#endif
 	return 0;
 }
 early_initcall(spawn_ksoftirqd);
diff --git a/kernel/kernel/stop_machine.c b/kernel/kernel/stop_machine.c
index 067cb83..2d15c0d 100644
--- a/kernel/kernel/stop_machine.c
+++ b/kernel/kernel/stop_machine.c
@@ -86,8 +86,11 @@
 	enabled = stopper->enabled;
 	if (enabled)
 		__cpu_stop_queue_work(stopper, work, &wakeq);
-	else if (work->done)
-		cpu_stop_signal_done(work->done);
+	else {
+		work->disabled = true;
+		if (work->done)
+			cpu_stop_signal_done(work->done);
+	}
 	raw_spin_unlock_irqrestore(&stopper->lock, flags);
 
 	wake_up_q(&wakeq);
diff --git a/kernel/kernel/time/alarmtimer.c b/kernel/kernel/time/alarmtimer.c
index 730b834..9810862 100644
--- a/kernel/kernel/time/alarmtimer.c
+++ b/kernel/kernel/time/alarmtimer.c
@@ -438,7 +438,7 @@
 		int ret = alarm_try_to_cancel(alarm);
 		if (ret >= 0)
 			return ret;
-		cpu_relax();
+		hrtimer_grab_expiry_lock(&alarm->timer);
 	}
 }
 EXPORT_SYMBOL_GPL(alarm_cancel);
diff --git a/kernel/kernel/time/hrtimer.c b/kernel/kernel/time/hrtimer.c
index 32ee24f..a846731 100644
--- a/kernel/kernel/time/hrtimer.c
+++ b/kernel/kernel/time/hrtimer.c
@@ -150,6 +150,11 @@
 
 #define migration_base	migration_cpu_base.clock_base[0]
 
+static inline bool is_migration_base(struct hrtimer_clock_base *base)
+{
+	return base == &migration_base;
+}
+
 /*
  * We are using hashed locking: holding per_cpu(hrtimer_bases)[n].lock
  * means that all timers which are tied to this base via timer->base are
@@ -273,6 +278,11 @@
 }
 
 #else /* CONFIG_SMP */
+
+static inline bool is_migration_base(struct hrtimer_clock_base *base)
+{
+	return false;
+}
 
 static inline struct hrtimer_clock_base *
 lock_hrtimer_base(const struct hrtimer *timer, unsigned long *flags)
@@ -957,6 +967,16 @@
 }
 EXPORT_SYMBOL_GPL(hrtimer_forward);
 
+void hrtimer_grab_expiry_lock(const struct hrtimer *timer)
+{
+	struct hrtimer_clock_base *base = READ_ONCE(timer->base);
+
+	if (timer->is_soft && !is_migration_base(base)) {
+		spin_lock(&base->cpu_base->softirq_expiry_lock);
+		spin_unlock(&base->cpu_base->softirq_expiry_lock);
+	}
+}
+
 /*
  * enqueue_hrtimer - internal function to (re)start a timer
  *
@@ -1175,7 +1195,9 @@
 	 * Check whether the HRTIMER_MODE_SOFT bit and hrtimer.is_soft
 	 * match.
 	 */
+#ifndef CONFIG_PREEMPT_RT_BASE
 	WARN_ON_ONCE(!(mode & HRTIMER_MODE_SOFT) ^ !timer->is_soft);
+#endif
 
 	base = lock_hrtimer_base(timer, &flags);
 
@@ -1238,7 +1260,7 @@
 
 		if (ret >= 0)
 			return ret;
-		cpu_relax();
+		hrtimer_grab_expiry_lock(timer);
 	}
 }
 EXPORT_SYMBOL_GPL(hrtimer_cancel);
@@ -1335,9 +1357,16 @@
 static void __hrtimer_init(struct hrtimer *timer, clockid_t clock_id,
 			   enum hrtimer_mode mode)
 {
-	bool softtimer = !!(mode & HRTIMER_MODE_SOFT);
-	int base = softtimer ? HRTIMER_MAX_CLOCK_BASES / 2 : 0;
+	bool softtimer;
+	int base;
 	struct hrtimer_cpu_base *cpu_base;
+
+	softtimer = !!(mode & HRTIMER_MODE_SOFT);
+#ifdef CONFIG_PREEMPT_RT_FULL
+	if (!softtimer && !(mode & HRTIMER_MODE_HARD))
+		softtimer = true;
+#endif
+	base = softtimer ? HRTIMER_MAX_CLOCK_BASES / 2 : 0;
 
 	memset(timer, 0, sizeof(struct hrtimer));
 
@@ -1535,6 +1564,7 @@
 	unsigned long flags;
 	ktime_t now;
 
+	spin_lock(&cpu_base->softirq_expiry_lock);
 	raw_spin_lock_irqsave(&cpu_base->lock, flags);
 
 	now = hrtimer_update_base(cpu_base);
@@ -1544,6 +1574,7 @@
 	hrtimer_update_softirq_timer(cpu_base, true);
 
 	raw_spin_unlock_irqrestore(&cpu_base->lock, flags);
+	spin_unlock(&cpu_base->softirq_expiry_lock);
 }
 
 #ifdef CONFIG_HIGH_RES_TIMERS
@@ -1715,12 +1746,51 @@
 	return HRTIMER_NORESTART;
 }
 
-void hrtimer_init_sleeper(struct hrtimer_sleeper *sl, struct task_struct *task)
+static void __hrtimer_init_sleeper(struct hrtimer_sleeper *sl,
+				   clockid_t clock_id,
+				   enum hrtimer_mode mode,
+				   struct task_struct *task)
 {
+#ifdef CONFIG_PREEMPT_RT_FULL
+	if (!(mode & (HRTIMER_MODE_SOFT | HRTIMER_MODE_HARD))) {
+		if (task_is_realtime(current) || system_state != SYSTEM_RUNNING)
+			mode |= HRTIMER_MODE_HARD;
+		else
+			mode |= HRTIMER_MODE_SOFT;
+	}
+#endif
+	__hrtimer_init(&sl->timer, clock_id, mode);
 	sl->timer.function = hrtimer_wakeup;
 	sl->task = task;
 }
+
+/**
+ * hrtimer_init_sleeper - initialize sleeper to the given clock
+ * @sl:		sleeper to be initialized
+ * @clock_id:	the clock to be used
+ * @mode:	timer mode abs/rel
+ * @task:	the task to wake up
+ */
+void hrtimer_init_sleeper(struct hrtimer_sleeper *sl, clockid_t clock_id,
+			  enum hrtimer_mode mode, struct task_struct *task)
+{
+	debug_init(&sl->timer, clock_id, mode);
+	__hrtimer_init_sleeper(sl, clock_id, mode, task);
+
+}
 EXPORT_SYMBOL_GPL(hrtimer_init_sleeper);
+
+#ifdef CONFIG_DEBUG_OBJECTS_TIMERS
+void hrtimer_init_sleeper_on_stack(struct hrtimer_sleeper *sl,
+				   clockid_t clock_id,
+				   enum hrtimer_mode mode,
+				   struct task_struct *task)
+{
+	debug_object_init_on_stack(&sl->timer, &hrtimer_debug_descr);
+	__hrtimer_init_sleeper(sl, clock_id, mode, task);
+}
+EXPORT_SYMBOL_GPL(hrtimer_init_sleeper_on_stack);
+#endif
 
 int nanosleep_copyout(struct restart_block *restart, struct timespec64 *ts)
 {
@@ -1745,8 +1815,6 @@
 {
 	struct restart_block *restart;
 
-	hrtimer_init_sleeper(t, current);
-
 	do {
 		set_current_state(TASK_INTERRUPTIBLE);
 		hrtimer_start_expires(&t->timer, mode);
@@ -1754,12 +1822,12 @@
 		if (likely(t->task))
 			freezable_schedule();
 
+		__set_current_state(TASK_RUNNING);
 		hrtimer_cancel(&t->timer);
 		mode = HRTIMER_MODE_ABS;
 
 	} while (t->task && !signal_pending(current));
 
-	__set_current_state(TASK_RUNNING);
 
 	if (!t->task)
 		return 0;
@@ -1783,10 +1851,9 @@
 	struct hrtimer_sleeper t;
 	int ret;
 
-	hrtimer_init_on_stack(&t.timer, restart->nanosleep.clockid,
-				HRTIMER_MODE_ABS);
+	hrtimer_init_sleeper_on_stack(&t, restart->nanosleep.clockid,
+				      HRTIMER_MODE_ABS, current);
 	hrtimer_set_expires_tv64(&t.timer, restart->nanosleep.expires);
-
 	ret = do_nanosleep(&t, HRTIMER_MODE_ABS);
 	destroy_hrtimer_on_stack(&t.timer);
 	return ret;
@@ -1804,7 +1871,7 @@
 	if (dl_task(current) || rt_task(current))
 		slack = 0;
 
-	hrtimer_init_on_stack(&t.timer, clockid, mode);
+	hrtimer_init_sleeper_on_stack(&t, clockid, mode, current);
 	hrtimer_set_expires_range_ns(&t.timer, timespec64_to_ktime(*rqtp), slack);
 	ret = do_nanosleep(&t, mode);
 	if (ret != -ERESTART_RESTARTBLOCK)
@@ -1864,6 +1931,38 @@
 }
 #endif
 
+#ifdef CONFIG_PREEMPT_RT_FULL
+/*
+ * Sleep for 1 ms in hope whoever holds what we want will let it go.
+ */
+void cpu_chill(void)
+{
+	unsigned int freeze_flag = current->flags & PF_NOFREEZE;
+	struct task_struct *self = current;
+	ktime_t chill_time;
+
+	raw_spin_lock_irq(&self->pi_lock);
+	self->saved_state = self->state;
+	__set_current_state_no_track(TASK_UNINTERRUPTIBLE);
+	raw_spin_unlock_irq(&self->pi_lock);
+
+	chill_time = ktime_set(0, NSEC_PER_MSEC);
+
+	current->flags |= PF_NOFREEZE;
+	sleeping_lock_inc();
+	schedule_hrtimeout(&chill_time, HRTIMER_MODE_REL_HARD);
+	sleeping_lock_dec();
+	if (!freeze_flag)
+		current->flags &= ~PF_NOFREEZE;
+
+	raw_spin_lock_irq(&self->pi_lock);
+	__set_current_state_no_track(self->saved_state);
+	self->saved_state = TASK_RUNNING;
+	raw_spin_unlock_irq(&self->pi_lock);
+}
+EXPORT_SYMBOL(cpu_chill);
+#endif
+
 /*
  * Functions related to boot-time initialization:
  */
@@ -1885,6 +1984,7 @@
 	cpu_base->softirq_next_timer = NULL;
 	cpu_base->expires_next = KTIME_MAX;
 	cpu_base->softirq_expires_next = KTIME_MAX;
+	spin_lock_init(&cpu_base->softirq_expiry_lock);
 	return 0;
 }
 
@@ -2003,10 +2103,8 @@
 		return -EINTR;
 	}
 
-	hrtimer_init_on_stack(&t.timer, clock_id, mode);
+	hrtimer_init_sleeper_on_stack(&t, clock_id, mode, current);
 	hrtimer_set_expires_range_ns(&t.timer, *expires, delta);
-
-	hrtimer_init_sleeper(&t, current);
 
 	hrtimer_start_expires(&t.timer, mode);
 
diff --git a/kernel/kernel/time/itimer.c b/kernel/kernel/time/itimer.c
index 2e2b335..48d977f 100644
--- a/kernel/kernel/time/itimer.c
+++ b/kernel/kernel/time/itimer.c
@@ -211,6 +211,7 @@
 		/* We are sharing ->siglock with it_real_fn() */
 		if (hrtimer_try_to_cancel(timer) < 0) {
 			spin_unlock_irq(&tsk->sighand->siglock);
+			hrtimer_grab_expiry_lock(timer);
 			goto again;
 		}
 		expires = timeval_to_ktime(value->it_value);
diff --git a/kernel/kernel/time/jiffies.c b/kernel/kernel/time/jiffies.c
index 4977191..62acb89 100644
--- a/kernel/kernel/time/jiffies.c
+++ b/kernel/kernel/time/jiffies.c
@@ -74,7 +74,8 @@
 	.max_cycles	= 10,
 };
 
-__cacheline_aligned_in_smp DEFINE_SEQLOCK(jiffies_lock);
+__cacheline_aligned_in_smp DEFINE_RAW_SPINLOCK(jiffies_lock);
+__cacheline_aligned_in_smp seqcount_t jiffies_seq;
 
 #if (BITS_PER_LONG < 64)
 u64 get_jiffies_64(void)
@@ -83,9 +84,9 @@
 	u64 ret;
 
 	do {
-		seq = read_seqbegin(&jiffies_lock);
+		seq = read_seqcount_begin(&jiffies_seq);
 		ret = jiffies_64;
-	} while (read_seqretry(&jiffies_lock, seq));
+	} while (read_seqcount_retry(&jiffies_seq, seq));
 	return ret;
 }
 EXPORT_SYMBOL(get_jiffies_64);
diff --git a/kernel/kernel/time/posix-cpu-timers.c b/kernel/kernel/time/posix-cpu-timers.c
index bfaa44a..b9e4ccb 100644
--- a/kernel/kernel/time/posix-cpu-timers.c
+++ b/kernel/kernel/time/posix-cpu-timers.c
@@ -3,8 +3,10 @@
  * Implement CPU time clocks for the POSIX clock interface.
  */
 
+#include <uapi/linux/sched/types.h>
 #include <linux/sched/signal.h>
 #include <linux/sched/cputime.h>
+#include <linux/sched/rt.h>
 #include <linux/posix-timers.h>
 #include <linux/errno.h>
 #include <linux/math64.h>
@@ -15,6 +17,7 @@
 #include <linux/workqueue.h>
 #include <linux/compat.h>
 #include <linux/sched/deadline.h>
+#include <linux/smpboot.h>
 
 #include "posix-timers.h"
 
@@ -789,6 +792,7 @@
 			return t->expires;
 
 		t->firing = 1;
+		t->firing_cpu = smp_processor_id();
 		list_move_tail(&t->entry, firing);
 	}
 
@@ -1135,18 +1139,31 @@
 	return 0;
 }
 
+static DEFINE_PER_CPU(spinlock_t, cpu_timer_expiry_lock) = __SPIN_LOCK_UNLOCKED(cpu_timer_expiry_lock);
+
+void cpu_timers_grab_expiry_lock(struct k_itimer *timer)
+{
+	int cpu = timer->it.cpu.firing_cpu;
+
+	if (cpu >= 0) {
+		spinlock_t *expiry_lock = per_cpu_ptr(&cpu_timer_expiry_lock, cpu);
+
+		spin_lock_irq(expiry_lock);
+		spin_unlock_irq(expiry_lock);
+	}
+}
+
 /*
  * This is called from the timer interrupt handler.  The irq handler has
  * already updated our counts.  We need to check if any timers fire now.
  * Interrupts are disabled.
  */
-void run_posix_cpu_timers(struct task_struct *tsk)
+static void __run_posix_cpu_timers(struct task_struct *tsk)
 {
 	LIST_HEAD(firing);
 	struct k_itimer *timer, *next;
 	unsigned long flags;
-
-	lockdep_assert_irqs_disabled();
+	spinlock_t *expiry_lock;
 
 	/*
 	 * The fast path checks that there are no expired thread or thread
@@ -1155,8 +1172,13 @@
 	if (!fastpath_timer_check(tsk))
 		return;
 
-	if (!lock_task_sighand(tsk, &flags))
+	expiry_lock = this_cpu_ptr(&cpu_timer_expiry_lock);
+	spin_lock(expiry_lock);
+
+	if (!lock_task_sighand(tsk, &flags)) {
+		spin_unlock(expiry_lock);
 		return;
+	}
 	/*
 	 * Here we take off tsk->signal->cpu_timers[N] and
 	 * tsk->cpu_timers[N] all the timers that are firing, and
@@ -1189,6 +1211,7 @@
 		list_del_init(&timer->it.cpu.entry);
 		cpu_firing = timer->it.cpu.firing;
 		timer->it.cpu.firing = 0;
+		timer->it.cpu.firing_cpu = -1;
 		/*
 		 * The firing flag is -1 if we collided with a reset
 		 * of the timer, which already reported this
@@ -1198,7 +1221,155 @@
 			cpu_timer_fire(timer);
 		spin_unlock(&timer->it_lock);
 	}
+	spin_unlock(expiry_lock);
 }
+
+#ifdef CONFIG_PREEMPT_RT_BASE
+#include <linux/kthread.h>
+#include <linux/cpu.h>
+DEFINE_PER_CPU(struct task_struct *, posix_timer_task);
+DEFINE_PER_CPU(struct task_struct *, posix_timer_tasklist);
+DEFINE_PER_CPU(bool, posix_timer_th_active);
+
+static void posix_cpu_kthread_fn(unsigned int cpu)
+{
+	struct task_struct *tsk = NULL;
+	struct task_struct *next = NULL;
+
+	BUG_ON(per_cpu(posix_timer_task, cpu) != current);
+
+	/* grab task list */
+	raw_local_irq_disable();
+	tsk = per_cpu(posix_timer_tasklist, cpu);
+	per_cpu(posix_timer_tasklist, cpu) = NULL;
+	raw_local_irq_enable();
+
+	/* its possible the list is empty, just return */
+	if (!tsk)
+		return;
+
+	/* Process task list */
+	while (1) {
+		/* save next */
+		next = tsk->posix_timer_list;
+
+		/* run the task timers, clear its ptr and
+		 * unreference it
+		 */
+		__run_posix_cpu_timers(tsk);
+		tsk->posix_timer_list = NULL;
+		put_task_struct(tsk);
+
+		/* check if this is the last on the list */
+		if (next == tsk)
+			break;
+		tsk = next;
+	}
+}
+
+static inline int __fastpath_timer_check(struct task_struct *tsk)
+{
+	/* tsk == current, ensure it is safe to use ->signal/sighand */
+	if (unlikely(tsk->exit_state))
+		return 0;
+
+	if (!task_cputime_zero(&tsk->cputime_expires))
+			return 1;
+
+	if (!task_cputime_zero(&tsk->signal->cputime_expires))
+			return 1;
+
+	return 0;
+}
+
+void run_posix_cpu_timers(struct task_struct *tsk)
+{
+	unsigned int cpu = smp_processor_id();
+	struct task_struct *tasklist;
+
+	BUG_ON(!irqs_disabled());
+
+	if (per_cpu(posix_timer_th_active, cpu) != true)
+		return;
+
+	/* get per-cpu references */
+	tasklist = per_cpu(posix_timer_tasklist, cpu);
+
+	/* check to see if we're already queued */
+	if (!tsk->posix_timer_list && __fastpath_timer_check(tsk)) {
+		get_task_struct(tsk);
+		if (tasklist) {
+			tsk->posix_timer_list = tasklist;
+		} else {
+			/*
+			 * The list is terminated by a self-pointing
+			 * task_struct
+			 */
+			tsk->posix_timer_list = tsk;
+		}
+		per_cpu(posix_timer_tasklist, cpu) = tsk;
+
+		wake_up_process(per_cpu(posix_timer_task, cpu));
+	}
+}
+
+static int posix_cpu_kthread_should_run(unsigned int cpu)
+{
+	return __this_cpu_read(posix_timer_tasklist) != NULL;
+}
+
+static void posix_cpu_kthread_park(unsigned int cpu)
+{
+	this_cpu_write(posix_timer_th_active, false);
+}
+
+static void posix_cpu_kthread_unpark(unsigned int cpu)
+{
+	this_cpu_write(posix_timer_th_active, true);
+}
+
+static void posix_cpu_kthread_setup(unsigned int cpu)
+{
+	struct sched_param sp;
+
+	sp.sched_priority = MAX_RT_PRIO - 1;
+	sched_setscheduler_nocheck(current, SCHED_FIFO, &sp);
+	posix_cpu_kthread_unpark(cpu);
+}
+
+static struct smp_hotplug_thread posix_cpu_thread = {
+	.store			= &posix_timer_task,
+	.thread_should_run	= posix_cpu_kthread_should_run,
+	.thread_fn		= posix_cpu_kthread_fn,
+	.thread_comm		= "posixcputmr/%u",
+	.setup			= posix_cpu_kthread_setup,
+	.park			= posix_cpu_kthread_park,
+	.unpark			= posix_cpu_kthread_unpark,
+};
+
+static int __init posix_cpu_thread_init(void)
+{
+	/* Start one for boot CPU. */
+	unsigned long cpu;
+	int ret;
+
+	/* init the per-cpu posix_timer_tasklets */
+	for_each_possible_cpu(cpu)
+		per_cpu(posix_timer_tasklist, cpu) = NULL;
+
+	ret = smpboot_register_percpu_thread(&posix_cpu_thread);
+	WARN_ON(ret);
+
+	return 0;
+}
+early_initcall(posix_cpu_thread_init);
+#else /* CONFIG_PREEMPT_RT_BASE */
+void run_posix_cpu_timers(struct task_struct *tsk)
+{
+	lockdep_assert_irqs_disabled();
+	__run_posix_cpu_timers(tsk);
+}
+#endif /* CONFIG_PREEMPT_RT_BASE */
 
 /*
  * Set one of the process-wide special case CPU timers or RLIMIT_CPU.
@@ -1318,6 +1489,8 @@
 		spin_unlock_irq(&timer.it_lock);
 
 		while (error == TIMER_RETRY) {
+
+			cpu_timers_grab_expiry_lock(&timer);
 			/*
 			 * We need to handle case when timer was or is in the
 			 * middle of firing. In other cases we already freed
diff --git a/kernel/kernel/time/posix-timers.c b/kernel/kernel/time/posix-timers.c
index 4875810..3fd433d 100644
--- a/kernel/kernel/time/posix-timers.c
+++ b/kernel/kernel/time/posix-timers.c
@@ -463,7 +463,7 @@
 
 static void k_itimer_rcu_free(struct rcu_head *head)
 {
-	struct k_itimer *tmr = container_of(head, struct k_itimer, it.rcu);
+	struct k_itimer *tmr = container_of(head, struct k_itimer, rcu);
 
 	kmem_cache_free(posix_timers_cache, tmr);
 }
@@ -480,7 +480,7 @@
 	}
 	put_pid(tmr->it_pid);
 	sigqueue_free(tmr->sigq);
-	call_rcu(&tmr->it.rcu, k_itimer_rcu_free);
+	call_rcu(&tmr->rcu, k_itimer_rcu_free);
 }
 
 static int common_timer_create(struct k_itimer *new_timer)
@@ -826,6 +826,17 @@
 	return hrtimer_try_to_cancel(&timr->it.real.timer);
 }
 
+static void timer_wait_for_callback(const struct k_clock *kc, struct k_itimer *timer)
+{
+	if (kc->timer_arm == common_hrtimer_arm)
+		hrtimer_grab_expiry_lock(&timer->it.real.timer);
+	else if (kc == &alarm_clock)
+		hrtimer_grab_expiry_lock(&timer->it.alarm.alarmtimer.timer);
+	else
+		/* posix-cpu-timers */
+		cpu_timers_grab_expiry_lock(timer);
+}
+
 /* Set a POSIX.1b interval timer. */
 int common_timer_set(struct k_itimer *timr, int flags,
 		     struct itimerspec64 *new_setting,
@@ -891,11 +902,15 @@
 	else
 		error = kc->timer_set(timr, flags, new_spec64, old_spec64);
 
-	unlock_timer(timr, flag);
 	if (error == TIMER_RETRY) {
+		rcu_read_lock();
+		unlock_timer(timr, flag);
+		timer_wait_for_callback(kc, timr);
+		rcu_read_unlock();
 		old_spec64 = NULL;	// We already got the old time...
 		goto retry;
 	}
+	unlock_timer(timr, flag);
 
 	return error;
 }
@@ -957,13 +972,21 @@
 	return 0;
 }
 
-static inline int timer_delete_hook(struct k_itimer *timer)
+static int timer_delete_hook(struct k_itimer *timer)
 {
 	const struct k_clock *kc = timer->kclock;
+	int ret;
 
 	if (WARN_ON_ONCE(!kc || !kc->timer_del))
 		return -EINVAL;
-	return kc->timer_del(timer);
+	ret = kc->timer_del(timer);
+	if (ret == TIMER_RETRY) {
+		rcu_read_lock();
+		spin_unlock_irq(&timer->it_lock);
+		timer_wait_for_callback(kc, timer);
+		rcu_read_unlock();
+	}
+	return ret;
 }
 
 /* Delete a POSIX.1b interval timer. */
@@ -977,10 +1000,8 @@
 	if (!timer)
 		return -EINVAL;
 
-	if (timer_delete_hook(timer) == TIMER_RETRY) {
-		unlock_timer(timer, flags);
+	if (timer_delete_hook(timer) == TIMER_RETRY)
 		goto retry_delete;
-	}
 
 	spin_lock(&current->sighand->siglock);
 	list_del(&timer->list);
@@ -1006,10 +1027,9 @@
 retry_delete:
 	spin_lock_irqsave(&timer->it_lock, flags);
 
-	if (timer_delete_hook(timer) == TIMER_RETRY) {
-		unlock_timer(timer, flags);
+	if (timer_delete_hook(timer) == TIMER_RETRY)
 		goto retry_delete;
-	}
+
 	list_del(&timer->list);
 	/*
 	 * This keeps any tasks waiting on the spin lock from thinking
diff --git a/kernel/kernel/time/posix-timers.h b/kernel/kernel/time/posix-timers.h
index ddb2114..725bd23 100644
--- a/kernel/kernel/time/posix-timers.h
+++ b/kernel/kernel/time/posix-timers.h
@@ -32,6 +32,8 @@
 extern const struct k_clock clock_thread;
 extern const struct k_clock alarm_clock;
 
+extern void cpu_timers_grab_expiry_lock(struct k_itimer *timer);
+
 int posix_timer_event(struct k_itimer *timr, int si_private);
 
 void common_timer_get(struct k_itimer *timr, struct itimerspec64 *cur_setting);
diff --git a/kernel/kernel/time/tick-broadcast-hrtimer.c b/kernel/kernel/time/tick-broadcast-hrtimer.c
index a836efd..c50e8f3 100644
--- a/kernel/kernel/time/tick-broadcast-hrtimer.c
+++ b/kernel/kernel/time/tick-broadcast-hrtimer.c
@@ -107,7 +107,7 @@
 
 void tick_setup_hrtimer_broadcast(void)
 {
-	hrtimer_init(&bctimer, CLOCK_MONOTONIC, HRTIMER_MODE_ABS);
+	hrtimer_init(&bctimer, CLOCK_MONOTONIC, HRTIMER_MODE_ABS_HARD);
 	bctimer.function = bc_handler;
 	clockevents_register_device(&ce_broadcast_hrtimer);
 }
diff --git a/kernel/kernel/time/tick-common.c b/kernel/kernel/time/tick-common.c
index 0a3cc37..7bd136b 100644
--- a/kernel/kernel/time/tick-common.c
+++ b/kernel/kernel/time/tick-common.c
@@ -80,13 +80,15 @@
 static void tick_periodic(int cpu)
 {
 	if (tick_do_timer_cpu == cpu) {
-		write_seqlock(&jiffies_lock);
+		raw_spin_lock(&jiffies_lock);
+		write_seqcount_begin(&jiffies_seq);
 
 		/* Keep track of the next tick event */
 		tick_next_period = ktime_add(tick_next_period, tick_period);
 
 		do_timer(1);
-		write_sequnlock(&jiffies_lock);
+		write_seqcount_end(&jiffies_seq);
+		raw_spin_unlock(&jiffies_lock);
 		update_wall_time();
 	}
 
@@ -158,9 +160,9 @@
 		ktime_t next;
 
 		do {
-			seq = read_seqbegin(&jiffies_lock);
+			seq = read_seqcount_begin(&jiffies_seq);
 			next = tick_next_period;
-		} while (read_seqretry(&jiffies_lock, seq));
+		} while (read_seqcount_retry(&jiffies_seq, seq));
 
 		clockevents_switch_state(dev, CLOCK_EVT_STATE_ONESHOT);
 
diff --git a/kernel/kernel/time/tick-sched.c b/kernel/kernel/time/tick-sched.c
index 77c359d..28e4f21 100644
--- a/kernel/kernel/time/tick-sched.c
+++ b/kernel/kernel/time/tick-sched.c
@@ -69,7 +69,8 @@
 		return;
 
 	/* Reevaluate with jiffies_lock held */
-	write_seqlock(&jiffies_lock);
+	raw_spin_lock(&jiffies_lock);
+	write_seqcount_begin(&jiffies_seq);
 
 	delta = ktime_sub(now, last_jiffies_update);
 	if (delta >= tick_period) {
@@ -95,10 +96,12 @@
 		/* Keep the tick_next_period variable up to date */
 		tick_next_period = ktime_add(last_jiffies_update, tick_period);
 	} else {
-		write_sequnlock(&jiffies_lock);
+		write_seqcount_end(&jiffies_seq);
+		raw_spin_unlock(&jiffies_lock);
 		return;
 	}
-	write_sequnlock(&jiffies_lock);
+	write_seqcount_end(&jiffies_seq);
+	raw_spin_unlock(&jiffies_lock);
 	update_wall_time();
 }
 
@@ -109,12 +112,14 @@
 {
 	ktime_t period;
 
-	write_seqlock(&jiffies_lock);
+	raw_spin_lock(&jiffies_lock);
+	write_seqcount_begin(&jiffies_seq);
 	/* Did we start the jiffies update yet ? */
 	if (last_jiffies_update == 0)
 		last_jiffies_update = tick_next_period;
 	period = last_jiffies_update;
-	write_sequnlock(&jiffies_lock);
+	write_seqcount_end(&jiffies_seq);
+	raw_spin_unlock(&jiffies_lock);
 	return period;
 }
 
@@ -232,6 +237,7 @@
 
 static DEFINE_PER_CPU(struct irq_work, nohz_full_kick_work) = {
 	.func = nohz_full_kick_func,
+	.flags = IRQ_WORK_HARD_IRQ,
 };
 
 /*
@@ -657,10 +663,10 @@
 
 	/* Read jiffies and the time when jiffies were updated last */
 	do {
-		seq = read_seqbegin(&jiffies_lock);
+		seq = read_seqcount_begin(&jiffies_seq);
 		basemono = last_jiffies_update;
 		basejiff = jiffies;
-	} while (read_seqretry(&jiffies_lock, seq));
+	} while (read_seqcount_retry(&jiffies_seq, seq));
 	ts->last_jiffies = basejiff;
 	ts->timer_expires_base = basemono;
 
@@ -891,14 +897,7 @@
 		return false;
 
 	if (unlikely(local_softirq_pending() && cpu_online(cpu))) {
-		static int ratelimit;
-
-		if (ratelimit < 10 &&
-		    (local_softirq_pending() & SOFTIRQ_STOP_IDLE_MASK)) {
-			pr_warn("NOHZ: local_softirq_pending %02x\n",
-				(unsigned int) local_softirq_pending());
-			ratelimit++;
-		}
+		softirq_check_pending_idle();
 		return false;
 	}
 
@@ -1330,7 +1329,7 @@
 	/*
 	 * Emulate tick processing via per-CPU hrtimers:
 	 */
-	hrtimer_init(&ts->sched_timer, CLOCK_MONOTONIC, HRTIMER_MODE_ABS);
+	hrtimer_init(&ts->sched_timer, CLOCK_MONOTONIC, HRTIMER_MODE_ABS_HARD);
 	ts->sched_timer.function = tick_sched_timer;
 
 	/* Get the next period (per-CPU) */
diff --git a/kernel/kernel/time/timekeeping.c b/kernel/kernel/time/timekeeping.c
index a1e14ef..0343c5d 100644
--- a/kernel/kernel/time/timekeeping.c
+++ b/kernel/kernel/time/timekeeping.c
@@ -2397,8 +2397,10 @@
  */
 void xtime_update(unsigned long ticks)
 {
-	write_seqlock(&jiffies_lock);
+	raw_spin_lock(&jiffies_lock);
+	write_seqcount_begin(&jiffies_seq);
 	do_timer(ticks);
-	write_sequnlock(&jiffies_lock);
+	write_seqcount_end(&jiffies_seq);
+	raw_spin_unlock(&jiffies_lock);
 	update_wall_time();
 }
diff --git a/kernel/kernel/time/timekeeping.h b/kernel/kernel/time/timekeeping.h
index 141ab3a..099737f 100644
--- a/kernel/kernel/time/timekeeping.h
+++ b/kernel/kernel/time/timekeeping.h
@@ -25,7 +25,8 @@
 extern void do_timer(unsigned long ticks);
 extern void update_wall_time(void);
 
-extern seqlock_t jiffies_lock;
+extern raw_spinlock_t jiffies_lock;
+extern seqcount_t jiffies_seq;
 
 #define CS_NAME_LEN	32
 
diff --git a/kernel/kernel/time/timer.c b/kernel/kernel/time/timer.c
index a6e88d9..3e2c0bd 100644
--- a/kernel/kernel/time/timer.c
+++ b/kernel/kernel/time/timer.c
@@ -198,6 +198,7 @@
 struct timer_base {
 	raw_spinlock_t		lock;
 	struct timer_list	*running_timer;
+	spinlock_t		expiry_lock;
 	unsigned long		clk;
 	unsigned long		next_expiry;
 	unsigned int		cpu;
@@ -214,8 +215,7 @@
 static DEFINE_STATIC_KEY_FALSE(timers_nohz_active);
 static DEFINE_MUTEX(timer_keys_mutex);
 
-static void timer_update_keys(struct work_struct *work);
-static DECLARE_WORK(timer_update_work, timer_update_keys);
+static struct swork_event timer_update_swork;
 
 #ifdef CONFIG_SMP
 unsigned int sysctl_timer_migration = 1;
@@ -233,7 +233,7 @@
 static inline void timers_update_migration(void) { }
 #endif /* !CONFIG_SMP */
 
-static void timer_update_keys(struct work_struct *work)
+static void timer_update_keys(struct swork_event *event)
 {
 	mutex_lock(&timer_keys_mutex);
 	timers_update_migration();
@@ -243,8 +243,16 @@
 
 void timers_update_nohz(void)
 {
-	schedule_work(&timer_update_work);
+	swork_queue(&timer_update_swork);
 }
+
+static __init int hrtimer_init_thread(void)
+{
+	WARN_ON(swork_get());
+	INIT_SWORK(&timer_update_swork, timer_update_keys);
+	return 0;
+}
+early_initcall(hrtimer_init_thread);
 
 int timer_migration_handler(struct ctl_table *table, int write,
 			    void __user *buffer, size_t *lenp,
@@ -1219,6 +1227,25 @@
 }
 EXPORT_SYMBOL(del_timer);
 
+static int __try_to_del_timer_sync(struct timer_list *timer,
+				   struct timer_base **basep)
+{
+	struct timer_base *base;
+	unsigned long flags;
+	int ret = -1;
+
+	debug_assert_init(timer);
+
+	*basep = base = lock_timer_base(timer, &flags);
+
+	if (base->running_timer != timer)
+		ret = detach_if_pending(timer, base, true);
+
+	raw_spin_unlock_irqrestore(&base->lock, flags);
+
+	return ret;
+}
+
 /**
  * try_to_del_timer_sync - Try to deactivate a timer
  * @timer: timer to delete
@@ -1229,23 +1256,31 @@
 int try_to_del_timer_sync(struct timer_list *timer)
 {
 	struct timer_base *base;
-	unsigned long flags;
-	int ret = -1;
 
-	debug_assert_init(timer);
-
-	base = lock_timer_base(timer, &flags);
-
-	if (base->running_timer != timer)
-		ret = detach_if_pending(timer, base, true);
-
-	raw_spin_unlock_irqrestore(&base->lock, flags);
-
-	return ret;
+	return __try_to_del_timer_sync(timer, &base);
 }
 EXPORT_SYMBOL(try_to_del_timer_sync);
 
-#ifdef CONFIG_SMP
+#if defined(CONFIG_SMP) || defined(CONFIG_PREEMPT_RT_FULL)
+static int __del_timer_sync(struct timer_list *timer)
+{
+	struct timer_base *base;
+	int ret;
+
+	for (;;) {
+		ret = __try_to_del_timer_sync(timer, &base);
+		if (ret >= 0)
+			return ret;
+
+		/*
+		 * When accessing the lock, timers of base are no longer expired
+		 * and so timer is no longer running.
+		 */
+		spin_lock(&base->expiry_lock);
+		spin_unlock(&base->expiry_lock);
+	}
+}
+
 /**
  * del_timer_sync - deactivate a timer and wait for the handler to finish.
  * @timer: the timer to be deactivated
@@ -1301,12 +1336,8 @@
 	 * could lead to deadlock.
 	 */
 	WARN_ON(in_irq() && !(timer->flags & TIMER_IRQSAFE));
-	for (;;) {
-		int ret = try_to_del_timer_sync(timer);
-		if (ret >= 0)
-			return ret;
-		cpu_relax();
-	}
+
+	return __del_timer_sync(timer);
 }
 EXPORT_SYMBOL(del_timer_sync);
 #endif
@@ -1369,10 +1400,16 @@
 		if (timer->flags & TIMER_IRQSAFE) {
 			raw_spin_unlock(&base->lock);
 			call_timer_fn(timer, fn);
+			base->running_timer = NULL;
+			spin_unlock(&base->expiry_lock);
+			spin_lock(&base->expiry_lock);
 			raw_spin_lock(&base->lock);
 		} else {
 			raw_spin_unlock_irq(&base->lock);
 			call_timer_fn(timer, fn);
+			base->running_timer = NULL;
+			spin_unlock(&base->expiry_lock);
+			spin_lock(&base->expiry_lock);
 			raw_spin_lock_irq(&base->lock);
 		}
 	}
@@ -1669,6 +1706,7 @@
 	if (!time_after_eq(jiffies, base->clk))
 		return;
 
+	spin_lock(&base->expiry_lock);
 	raw_spin_lock_irq(&base->lock);
 
 	/*
@@ -1695,8 +1733,8 @@
 		while (levels--)
 			expire_timers(base, heads + levels);
 	}
-	base->running_timer = NULL;
 	raw_spin_unlock_irq(&base->lock);
+	spin_unlock(&base->expiry_lock);
 }
 
 /*
@@ -1705,6 +1743,8 @@
 static __latent_entropy void run_timer_softirq(struct softirq_action *h)
 {
 	struct timer_base *base = this_cpu_ptr(&timer_bases[BASE_STD]);
+
+	irq_work_tick_soft();
 
 	__run_timers(base);
 	if (IS_ENABLED(CONFIG_NO_HZ_COMMON))
@@ -1941,6 +1981,7 @@
 		base->cpu = cpu;
 		raw_spin_lock_init(&base->lock);
 		base->clk = jiffies;
+		spin_lock_init(&base->expiry_lock);
 	}
 }
 
diff --git a/kernel/kernel/trace/trace.c b/kernel/kernel/trace/trace.c
index 19a6b08..ead2e09 100644
--- a/kernel/kernel/trace/trace.c
+++ b/kernel/kernel/trace/trace.c
@@ -2151,6 +2151,7 @@
 	struct task_struct *tsk = current;
 
 	entry->preempt_count		= pc & 0xff;
+	entry->preempt_lazy_count	= preempt_lazy_count();
 	entry->pid			= (tsk) ? tsk->pid : 0;
 	entry->flags =
 #ifdef CONFIG_TRACE_IRQFLAGS_SUPPORT
@@ -2161,8 +2162,11 @@
 		((pc & NMI_MASK    ) ? TRACE_FLAG_NMI     : 0) |
 		((pc & HARDIRQ_MASK) ? TRACE_FLAG_HARDIRQ : 0) |
 		((pc & SOFTIRQ_OFFSET) ? TRACE_FLAG_SOFTIRQ : 0) |
-		(tif_need_resched() ? TRACE_FLAG_NEED_RESCHED : 0) |
+		(tif_need_resched_now() ? TRACE_FLAG_NEED_RESCHED : 0) |
+		(need_resched_lazy() ? TRACE_FLAG_NEED_RESCHED_LAZY : 0) |
 		(test_preempt_need_resched() ? TRACE_FLAG_PREEMPT_RESCHED : 0);
+
+	entry->migrate_disable = (tsk) ? __migrate_disabled(tsk) & 0xFF : 0;
 }
 EXPORT_SYMBOL_GPL(tracing_generic_entry_update);
 
@@ -3360,14 +3364,17 @@
 
 static void print_lat_help_header(struct seq_file *m)
 {
-	seq_puts(m, "#                  _------=> CPU#            \n"
-		    "#                 / _-----=> irqs-off        \n"
-		    "#                | / _----=> need-resched    \n"
-		    "#                || / _---=> hardirq/softirq \n"
-		    "#                ||| / _--=> preempt-depth   \n"
-		    "#                |||| /     delay            \n"
-		    "#  cmd     pid   ||||| time  |   caller      \n"
-		    "#     \\   /      |||||  \\    |   /         \n");
+	seq_puts(m, "#                  _--------=> CPU#              \n"
+		    "#                 / _-------=> irqs-off          \n"
+		    "#                | / _------=> need-resched      \n"
+		    "#                || / _-----=> need-resched_lazy \n"
+		    "#                ||| / _----=> hardirq/softirq   \n"
+		    "#                |||| / _---=> preempt-depth     \n"
+		    "#                ||||| / _--=> preempt-lazy-depth\n"
+		    "#                |||||| / _-=> migrate-disable   \n"
+		    "#                ||||||| /     delay             \n"
+		    "# cmd     pid    |||||||| time   |  caller       \n"
+		    "#     \\   /      ||||||||   \\    |  /            \n");
 }
 
 static void print_event_info(struct trace_buffer *buf, struct seq_file *m)
@@ -3405,15 +3412,17 @@
 		   tgid ? tgid_space : space);
 	seq_printf(m, "#                          %s / _----=> need-resched\n",
 		   tgid ? tgid_space : space);
-	seq_printf(m, "#                          %s| / _---=> hardirq/softirq\n",
+	seq_printf(m, "#                          %s| / _---=> need-resched_lazy\n",
 		   tgid ? tgid_space : space);
-	seq_printf(m, "#                          %s|| / _--=> preempt-depth\n",
+	seq_printf(m, "#                          %s|| / _--=> hardirq/softirq\n",
 		   tgid ? tgid_space : space);
-	seq_printf(m, "#                          %s||| /     delay\n",
+	seq_printf(m, "#                          %s||| /     preempt-depth\n",
 		   tgid ? tgid_space : space);
-	seq_printf(m, "#           TASK-PID %sCPU#  ||||    TIMESTAMP  FUNCTION\n",
+	seq_printf(m, "#                          %s|||| /    delay\n",
+		   tgid ? tgid_space : space);
+	seq_printf(m, "#           TASK-PID %sCPU#  |||||   TIMESTAMP  FUNCTION\n",
 		   tgid ? "   TGID   " : space);
-	seq_printf(m, "#              | |   %s  |   ||||       |         |\n",
+	seq_printf(m, "#              | |   %s  |   |||||      |         |\n",
 		   tgid ? "     |    " : space);
 }
 
diff --git a/kernel/kernel/trace/trace.h b/kernel/kernel/trace/trace.h
index 74185fb..7740bcd 100644
--- a/kernel/kernel/trace/trace.h
+++ b/kernel/kernel/trace/trace.h
@@ -127,6 +127,7 @@
  *  NEED_RESCHED	- reschedule is requested
  *  HARDIRQ		- inside an interrupt handler
  *  SOFTIRQ		- inside a softirq handler
+ *  NEED_RESCHED_LAZY	- lazy reschedule is requested
  */
 enum trace_flag_type {
 	TRACE_FLAG_IRQS_OFF		= 0x01,
@@ -136,6 +137,7 @@
 	TRACE_FLAG_SOFTIRQ		= 0x10,
 	TRACE_FLAG_PREEMPT_RESCHED	= 0x20,
 	TRACE_FLAG_NMI			= 0x40,
+	TRACE_FLAG_NEED_RESCHED_LAZY	= 0x80,
 };
 
 #define TRACE_BUF_SIZE		1024
diff --git a/kernel/kernel/trace/trace_events.c b/kernel/kernel/trace/trace_events.c
index 1ca64a9..9b1b1c6 100644
--- a/kernel/kernel/trace/trace_events.c
+++ b/kernel/kernel/trace/trace_events.c
@@ -188,6 +188,8 @@
 	__common_field(unsigned char, flags);
 	__common_field(unsigned char, preempt_count);
 	__common_field(int, pid);
+	__common_field(unsigned char, migrate_disable);
+	__common_field(unsigned char, preempt_lazy_count);
 
 	return ret;
 }
diff --git a/kernel/kernel/trace/trace_hwlat.c b/kernel/kernel/trace/trace_hwlat.c
index ade6c30..164e5c6 100644
--- a/kernel/kernel/trace/trace_hwlat.c
+++ b/kernel/kernel/trace/trace_hwlat.c
@@ -280,7 +280,7 @@
 	 * of this thread, than stop migrating for the duration
 	 * of the current test.
 	 */
-	if (!cpumask_equal(current_mask, &current->cpus_allowed))
+	if (!cpumask_equal(current_mask, current->cpus_ptr))
 		goto disable;
 
 	get_online_cpus();
diff --git a/kernel/kernel/trace/trace_output.c b/kernel/kernel/trace/trace_output.c
index 6e6cc64..3f78b0a 100644
--- a/kernel/kernel/trace/trace_output.c
+++ b/kernel/kernel/trace/trace_output.c
@@ -448,6 +448,7 @@
 {
 	char hardsoft_irq;
 	char need_resched;
+	char need_resched_lazy;
 	char irqs_off;
 	int hardirq;
 	int softirq;
@@ -478,6 +479,9 @@
 		break;
 	}
 
+	need_resched_lazy =
+		(entry->flags & TRACE_FLAG_NEED_RESCHED_LAZY) ? 'L' : '.';
+
 	hardsoft_irq =
 		(nmi && hardirq)     ? 'Z' :
 		nmi                  ? 'z' :
@@ -486,14 +490,25 @@
 		softirq              ? 's' :
 		                       '.' ;
 
-	trace_seq_printf(s, "%c%c%c",
-			 irqs_off, need_resched, hardsoft_irq);
+	trace_seq_printf(s, "%c%c%c%c",
+			 irqs_off, need_resched, need_resched_lazy,
+			 hardsoft_irq);
 
 	if (entry->preempt_count)
 		trace_seq_printf(s, "%x", entry->preempt_count);
 	else
 		trace_seq_putc(s, '.');
 
+	if (entry->preempt_lazy_count)
+		trace_seq_printf(s, "%x", entry->preempt_lazy_count);
+	else
+		trace_seq_putc(s, '.');
+
+	if (entry->migrate_disable)
+		trace_seq_printf(s, "%x", entry->migrate_disable);
+	else
+		trace_seq_putc(s, '.');
+
 	return !trace_seq_has_overflowed(s);
 }
 
diff --git a/kernel/kernel/watchdog.c b/kernel/kernel/watchdog.c
index c9b759e..a81b183 100644
--- a/kernel/kernel/watchdog.c
+++ b/kernel/kernel/watchdog.c
@@ -604,7 +604,7 @@
 	 * Start the timer first to prevent the NMI watchdog triggering
 	 * before the timer has a chance to fire.
 	 */
-	hrtimer_init(hrtimer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
+	hrtimer_init(hrtimer, CLOCK_MONOTONIC, HRTIMER_MODE_REL_HARD);
 	hrtimer->function = watchdog_timer_fn;
 	hrtimer_start(hrtimer, ns_to_ktime(sample_period),
 		      HRTIMER_MODE_REL_PINNED);
diff --git a/kernel/kernel/watchdog_hld.c b/kernel/kernel/watchdog_hld.c
index 7138116..6854433 100644
--- a/kernel/kernel/watchdog_hld.c
+++ b/kernel/kernel/watchdog_hld.c
@@ -24,6 +24,8 @@
 static DEFINE_PER_CPU(bool, watchdog_nmi_touch);
 static DEFINE_PER_CPU(struct perf_event *, watchdog_ev);
 static DEFINE_PER_CPU(struct perf_event *, dead_event);
+static DEFINE_RAW_SPINLOCK(watchdog_output_lock);
+
 static struct cpumask dead_events_mask;
 
 static unsigned long hardlockup_allcpu_dumped;
@@ -134,6 +136,13 @@
 		/* only print hardlockups once */
 		if (__this_cpu_read(hard_watchdog_warn) == true)
 			return;
+		/*
+		 * If early-printk is enabled then make sure we do not
+		 * lock up in printk() and kill console logging:
+		 */
+		printk_kill();
+
+		raw_spin_lock(&watchdog_output_lock);
 
 		pr_emerg("Watchdog detected hard LOCKUP on cpu %d", this_cpu);
 		print_modules();
@@ -151,6 +160,7 @@
 				!test_and_set_bit(0, &hardlockup_allcpu_dumped))
 			trigger_allbutself_cpu_backtrace();
 
+		raw_spin_unlock(&watchdog_output_lock);
 		if (hardlockup_panic)
 			nmi_panic(regs, "Hard LOCKUP");
 
diff --git a/kernel/kernel/workqueue.c b/kernel/kernel/workqueue.c
index 4722041..ad290b4 100644
--- a/kernel/kernel/workqueue.c
+++ b/kernel/kernel/workqueue.c
@@ -128,7 +128,7 @@
  *
  * PL: wq_pool_mutex protected.
  *
- * PR: wq_pool_mutex protected for writes.  Sched-RCU protected for reads.
+ * PR: wq_pool_mutex protected for writes.  RCU protected for reads.
  *
  * PW: wq_pool_mutex and wq->mutex protected for writes.  Either for reads.
  *
@@ -137,7 +137,7 @@
  *
  * WQ: wq->mutex protected.
  *
- * WR: wq->mutex protected for writes.  Sched-RCU protected for reads.
+ * WR: wq->mutex protected for writes.  RCU protected for reads.
  *
  * MD: wq_mayday_lock protected.
  */
@@ -145,7 +145,7 @@
 /* struct worker is defined in workqueue_internal.h */
 
 struct worker_pool {
-	spinlock_t		lock;		/* the pool lock */
+	raw_spinlock_t		lock;		/* the pool lock */
 	int			cpu;		/* I: the associated cpu */
 	int			node;		/* I: the associated node ID */
 	int			id;		/* I: pool ID */
@@ -184,7 +184,7 @@
 	atomic_t		nr_running ____cacheline_aligned_in_smp;
 
 	/*
-	 * Destruction of pool is sched-RCU protected to allow dereferences
+	 * Destruction of pool is RCU protected to allow dereferences
 	 * from get_work_pool().
 	 */
 	struct rcu_head		rcu;
@@ -213,7 +213,7 @@
 	/*
 	 * Release of unbound pwq is punted to system_wq.  See put_pwq()
 	 * and pwq_unbound_release_workfn() for details.  pool_workqueue
-	 * itself is also sched-RCU protected so that the first pwq can be
+	 * itself is also RCU protected so that the first pwq can be
 	 * determined without grabbing wq->mutex.
 	 */
 	struct work_struct	unbound_release_work;
@@ -298,8 +298,8 @@
 
 static DEFINE_MUTEX(wq_pool_mutex);	/* protects pools and workqueues list */
 static DEFINE_MUTEX(wq_pool_attach_mutex); /* protects worker attach/detach */
-static DEFINE_SPINLOCK(wq_mayday_lock);	/* protects wq->maydays list */
-static DECLARE_WAIT_QUEUE_HEAD(wq_manager_wait); /* wait for manager to go away */
+static DEFINE_RAW_SPINLOCK(wq_mayday_lock);	/* protects wq->maydays list */
+static DECLARE_SWAIT_QUEUE_HEAD(wq_manager_wait); /* wait for manager to go away */
 
 static LIST_HEAD(workqueues);		/* PR: list of all workqueues */
 static bool workqueue_freezing;		/* PL: have wqs started freezing? */
@@ -358,20 +358,20 @@
 #include <trace/events/workqueue.h>
 
 #define assert_rcu_or_pool_mutex()					\
-	RCU_LOCKDEP_WARN(!rcu_read_lock_sched_held() &&			\
+	RCU_LOCKDEP_WARN(!rcu_read_lock_held() &&			\
 			 !lockdep_is_held(&wq_pool_mutex),		\
-			 "sched RCU or wq_pool_mutex should be held")
+			 "RCU or wq_pool_mutex should be held")
 
 #define assert_rcu_or_wq_mutex(wq)					\
-	RCU_LOCKDEP_WARN(!rcu_read_lock_sched_held() &&			\
+	RCU_LOCKDEP_WARN(!rcu_read_lock_held() &&			\
 			 !lockdep_is_held(&wq->mutex),			\
-			 "sched RCU or wq->mutex should be held")
+			 "RCU or wq->mutex should be held")
 
 #define assert_rcu_or_wq_mutex_or_pool_mutex(wq)			\
-	RCU_LOCKDEP_WARN(!rcu_read_lock_sched_held() &&			\
+	RCU_LOCKDEP_WARN(!rcu_read_lock_held() &&			\
 			 !lockdep_is_held(&wq->mutex) &&		\
 			 !lockdep_is_held(&wq_pool_mutex),		\
-			 "sched RCU, wq->mutex or wq_pool_mutex should be held")
+			 "RCU, wq->mutex or wq_pool_mutex should be held")
 
 #define for_each_cpu_worker_pool(pool, cpu)				\
 	for ((pool) = &per_cpu(cpu_worker_pools, cpu)[0];		\
@@ -383,7 +383,7 @@
  * @pool: iteration cursor
  * @pi: integer used for iteration
  *
- * This must be called either with wq_pool_mutex held or sched RCU read
+ * This must be called either with wq_pool_mutex held or RCU read
  * locked.  If the pool needs to be used beyond the locking in effect, the
  * caller is responsible for guaranteeing that the pool stays online.
  *
@@ -415,7 +415,7 @@
  * @pwq: iteration cursor
  * @wq: the target workqueue
  *
- * This must be called either with wq->mutex held or sched RCU read locked.
+ * This must be called either with wq->mutex held or RCU read locked.
  * If the pwq needs to be used beyond the locking in effect, the caller is
  * responsible for guaranteeing that the pwq stays online.
  *
@@ -551,7 +551,7 @@
  * @wq: the target workqueue
  * @node: the node ID
  *
- * This must be called with any of wq_pool_mutex, wq->mutex or sched RCU
+ * This must be called with any of wq_pool_mutex, wq->mutex or RCU
  * read locked.
  * If the pwq needs to be used beyond the locking in effect, the caller is
  * responsible for guaranteeing that the pwq stays online.
@@ -695,8 +695,8 @@
  * @work: the work item of interest
  *
  * Pools are created and destroyed under wq_pool_mutex, and allows read
- * access under sched-RCU read lock.  As such, this function should be
- * called under wq_pool_mutex or with preemption disabled.
+ * access under RCU read lock.  As such, this function should be
+ * called under wq_pool_mutex or inside of a rcu_read_lock() region.
  *
  * All fields of the returned pool are accessible as long as the above
  * mentioned locking is in effect.  If the returned pool needs to be used
@@ -829,7 +829,7 @@
  * Wake up the first idle worker of @pool.
  *
  * CONTEXT:
- * spin_lock_irq(pool->lock).
+ * raw_spin_lock_irq(pool->lock).
  */
 static void wake_up_worker(struct worker_pool *pool)
 {
@@ -840,43 +840,32 @@
 }
 
 /**
- * wq_worker_waking_up - a worker is waking up
+ * wq_worker_running - a worker is running again
  * @task: task waking up
- * @cpu: CPU @task is waking up to
  *
- * This function is called during try_to_wake_up() when a worker is
- * being awoken.
- *
- * CONTEXT:
- * spin_lock_irq(rq->lock)
+ * This function is called when a worker returns from schedule()
  */
-void wq_worker_waking_up(struct task_struct *task, int cpu)
+void wq_worker_running(struct task_struct *task)
 {
 	struct worker *worker = kthread_data(task);
 
-	if (!(worker->flags & WORKER_NOT_RUNNING)) {
-		WARN_ON_ONCE(worker->pool->cpu != cpu);
+	if (!worker->sleeping)
+		return;
+	if (!(worker->flags & WORKER_NOT_RUNNING))
 		atomic_inc(&worker->pool->nr_running);
-	}
+	worker->sleeping = 0;
 }
 
 /**
  * wq_worker_sleeping - a worker is going to sleep
  * @task: task going to sleep
  *
- * This function is called during schedule() when a busy worker is
- * going to sleep.  Worker on the same cpu can be woken up by
- * returning pointer to its task.
- *
- * CONTEXT:
- * spin_lock_irq(rq->lock)
- *
- * Return:
- * Worker task on @cpu to wake up, %NULL if none.
+ * This function is called from schedule() when a busy worker is
+ * going to sleep.
  */
-struct task_struct *wq_worker_sleeping(struct task_struct *task)
+void wq_worker_sleeping(struct task_struct *task)
 {
-	struct worker *worker = kthread_data(task), *to_wakeup = NULL;
+	struct worker *next, *worker = kthread_data(task);
 	struct worker_pool *pool;
 
 	/*
@@ -885,13 +874,15 @@
 	 * checking NOT_RUNNING.
 	 */
 	if (worker->flags & WORKER_NOT_RUNNING)
-		return NULL;
+		return;
 
 	pool = worker->pool;
 
-	/* this can only happen on the local cpu */
-	if (WARN_ON_ONCE(pool->cpu != raw_smp_processor_id()))
-		return NULL;
+	if (WARN_ON_ONCE(worker->sleeping))
+		return;
+
+	worker->sleeping = 1;
+	raw_spin_lock_irq(&pool->lock);
 
 	/*
 	 * The counterpart of the following dec_and_test, implied mb,
@@ -905,9 +896,12 @@
 	 * lock is safe.
 	 */
 	if (atomic_dec_and_test(&pool->nr_running) &&
-	    !list_empty(&pool->worklist))
-		to_wakeup = first_idle_worker(pool);
-	return to_wakeup ? to_wakeup->task : NULL;
+	    !list_empty(&pool->worklist)) {
+		next = first_idle_worker(pool);
+		if (next)
+			wake_up_process(next->task);
+	}
+	raw_spin_unlock_irq(&pool->lock);
 }
 
 /**
@@ -938,7 +932,7 @@
  * Set @flags in @worker->flags and adjust nr_running accordingly.
  *
  * CONTEXT:
- * spin_lock_irq(pool->lock)
+ * raw_spin_lock_irq(pool->lock)
  */
 static inline void worker_set_flags(struct worker *worker, unsigned int flags)
 {
@@ -963,7 +957,7 @@
  * Clear @flags in @worker->flags and adjust nr_running accordingly.
  *
  * CONTEXT:
- * spin_lock_irq(pool->lock)
+ * raw_spin_lock_irq(pool->lock)
  */
 static inline void worker_clr_flags(struct worker *worker, unsigned int flags)
 {
@@ -1011,7 +1005,7 @@
  * actually occurs, it should be easy to locate the culprit work function.
  *
  * CONTEXT:
- * spin_lock_irq(pool->lock).
+ * raw_spin_lock_irq(pool->lock).
  *
  * Return:
  * Pointer to worker which is executing @work if found, %NULL
@@ -1046,7 +1040,7 @@
  * nested inside outer list_for_each_entry_safe().
  *
  * CONTEXT:
- * spin_lock_irq(pool->lock).
+ * raw_spin_lock_irq(pool->lock).
  */
 static void move_linked_works(struct work_struct *work, struct list_head *head,
 			      struct work_struct **nextp)
@@ -1121,12 +1115,12 @@
 {
 	if (pwq) {
 		/*
-		 * As both pwqs and pools are sched-RCU protected, the
+		 * As both pwqs and pools are RCU protected, the
 		 * following lock operations are safe.
 		 */
-		spin_lock_irq(&pwq->pool->lock);
+		raw_spin_lock_irq(&pwq->pool->lock);
 		put_pwq(pwq);
-		spin_unlock_irq(&pwq->pool->lock);
+		raw_spin_unlock_irq(&pwq->pool->lock);
 	}
 }
 
@@ -1159,7 +1153,7 @@
  * decrement nr_in_flight of its pwq and handle workqueue flushing.
  *
  * CONTEXT:
- * spin_lock_irq(pool->lock).
+ * raw_spin_lock_irq(pool->lock).
  */
 static void pwq_dec_nr_in_flight(struct pool_workqueue *pwq, int color)
 {
@@ -1249,6 +1243,7 @@
 	if (!test_and_set_bit(WORK_STRUCT_PENDING_BIT, work_data_bits(work)))
 		return 0;
 
+	rcu_read_lock();
 	/*
 	 * The queueing is in progress, or it is already queued. Try to
 	 * steal it from ->worklist without clearing WORK_STRUCT_PENDING.
@@ -1257,7 +1252,7 @@
 	if (!pool)
 		goto fail;
 
-	spin_lock(&pool->lock);
+	raw_spin_lock(&pool->lock);
 	/*
 	 * work->data is guaranteed to point to pwq only while the work
 	 * item is queued on pwq->wq, and both updating work->data to point
@@ -1286,11 +1281,13 @@
 		/* work->data points to pwq iff queued, point to pool */
 		set_work_pool_and_keep_pending(work, pool->id);
 
-		spin_unlock(&pool->lock);
+		raw_spin_unlock(&pool->lock);
+		rcu_read_unlock();
 		return 1;
 	}
-	spin_unlock(&pool->lock);
+	raw_spin_unlock(&pool->lock);
 fail:
+	rcu_read_unlock();
 	local_irq_restore(*flags);
 	if (work_is_canceling(work))
 		return -ENOENT;
@@ -1309,7 +1306,7 @@
  * work_struct flags.
  *
  * CONTEXT:
- * spin_lock_irq(pool->lock).
+ * raw_spin_lock_irq(pool->lock).
  */
 static void insert_work(struct pool_workqueue *pwq, struct work_struct *work,
 			struct list_head *head, unsigned int extra_flags)
@@ -1403,6 +1400,7 @@
 	if (unlikely(wq->flags & __WQ_DRAINING) &&
 	    WARN_ON_ONCE(!is_chained_work(wq)))
 		return;
+	rcu_read_lock();
 retry:
 	/* pwq which will be used unless @work is executing elsewhere */
 	if (wq->flags & WQ_UNBOUND) {
@@ -1424,7 +1422,7 @@
 	if (last_pool && last_pool != pwq->pool) {
 		struct worker *worker;
 
-		spin_lock(&last_pool->lock);
+		raw_spin_lock(&last_pool->lock);
 
 		worker = find_worker_executing_work(last_pool, work);
 
@@ -1432,11 +1430,11 @@
 			pwq = worker->current_pwq;
 		} else {
 			/* meh... not running there, queue here */
-			spin_unlock(&last_pool->lock);
-			spin_lock(&pwq->pool->lock);
+			raw_spin_unlock(&last_pool->lock);
+			raw_spin_lock(&pwq->pool->lock);
 		}
 	} else {
-		spin_lock(&pwq->pool->lock);
+		raw_spin_lock(&pwq->pool->lock);
 	}
 
 	/*
@@ -1449,7 +1447,7 @@
 	 */
 	if (unlikely(!pwq->refcnt)) {
 		if (wq->flags & WQ_UNBOUND) {
-			spin_unlock(&pwq->pool->lock);
+			raw_spin_unlock(&pwq->pool->lock);
 			cpu_relax();
 			goto retry;
 		}
@@ -1461,10 +1459,8 @@
 	/* pwq determined, queue */
 	trace_workqueue_queue_work(req_cpu, pwq, work);
 
-	if (WARN_ON(!list_empty(&work->entry))) {
-		spin_unlock(&pwq->pool->lock);
-		return;
-	}
+	if (WARN_ON(!list_empty(&work->entry)))
+		goto out;
 
 	pwq->nr_in_flight[pwq->work_color]++;
 	work_flags = work_color_to_flags(pwq->work_color);
@@ -1483,7 +1479,9 @@
 	debug_work_activate(work);
 	insert_work(pwq, work, worklist, work_flags);
 
-	spin_unlock(&pwq->pool->lock);
+out:
+	raw_spin_unlock(&pwq->pool->lock);
+	rcu_read_unlock();
 }
 
 /**
@@ -1518,9 +1516,11 @@
 void delayed_work_timer_fn(struct timer_list *t)
 {
 	struct delayed_work *dwork = from_timer(dwork, t, timer);
+	unsigned long flags;
 
-	/* should have been called from irqsafe timer with irq already off */
+	local_irq_save(flags);
 	__queue_work(dwork->cpu, dwork->wq, &dwork->work);
+	local_irq_restore(flags);
 }
 EXPORT_SYMBOL(delayed_work_timer_fn);
 
@@ -1669,7 +1669,7 @@
  * necessary.
  *
  * LOCKING:
- * spin_lock_irq(pool->lock).
+ * raw_spin_lock_irq(pool->lock).
  */
 static void worker_enter_idle(struct worker *worker)
 {
@@ -1709,7 +1709,7 @@
  * @worker is leaving idle state.  Update stats.
  *
  * LOCKING:
- * spin_lock_irq(pool->lock).
+ * raw_spin_lock_irq(pool->lock).
  */
 static void worker_leave_idle(struct worker *worker)
 {
@@ -1844,11 +1844,11 @@
 	worker_attach_to_pool(worker, pool);
 
 	/* start the newly created worker */
-	spin_lock_irq(&pool->lock);
+	raw_spin_lock_irq(&pool->lock);
 	worker->pool->nr_workers++;
 	worker_enter_idle(worker);
 	wake_up_process(worker->task);
-	spin_unlock_irq(&pool->lock);
+	raw_spin_unlock_irq(&pool->lock);
 
 	return worker;
 
@@ -1867,7 +1867,7 @@
  * be idle.
  *
  * CONTEXT:
- * spin_lock_irq(pool->lock).
+ * raw_spin_lock_irq(pool->lock).
  */
 static void destroy_worker(struct worker *worker)
 {
@@ -1893,7 +1893,7 @@
 {
 	struct worker_pool *pool = from_timer(pool, t, idle_timer);
 
-	spin_lock_irq(&pool->lock);
+	raw_spin_lock_irq(&pool->lock);
 
 	while (too_many_workers(pool)) {
 		struct worker *worker;
@@ -1911,7 +1911,7 @@
 		destroy_worker(worker);
 	}
 
-	spin_unlock_irq(&pool->lock);
+	raw_spin_unlock_irq(&pool->lock);
 }
 
 static void send_mayday(struct work_struct *work)
@@ -1942,8 +1942,8 @@
 	struct worker_pool *pool = from_timer(pool, t, mayday_timer);
 	struct work_struct *work;
 
-	spin_lock_irq(&pool->lock);
-	spin_lock(&wq_mayday_lock);		/* for wq->maydays */
+	raw_spin_lock_irq(&pool->lock);
+	raw_spin_lock(&wq_mayday_lock);		/* for wq->maydays */
 
 	if (need_to_create_worker(pool)) {
 		/*
@@ -1956,8 +1956,8 @@
 			send_mayday(work);
 	}
 
-	spin_unlock(&wq_mayday_lock);
-	spin_unlock_irq(&pool->lock);
+	raw_spin_unlock(&wq_mayday_lock);
+	raw_spin_unlock_irq(&pool->lock);
 
 	mod_timer(&pool->mayday_timer, jiffies + MAYDAY_INTERVAL);
 }
@@ -1976,7 +1976,7 @@
  * may_start_working() %true.
  *
  * LOCKING:
- * spin_lock_irq(pool->lock) which may be released and regrabbed
+ * raw_spin_lock_irq(pool->lock) which may be released and regrabbed
  * multiple times.  Does GFP_KERNEL allocations.  Called only from
  * manager.
  */
@@ -1985,7 +1985,7 @@
 __acquires(&pool->lock)
 {
 restart:
-	spin_unlock_irq(&pool->lock);
+	raw_spin_unlock_irq(&pool->lock);
 
 	/* if we don't make progress in MAYDAY_INITIAL_TIMEOUT, call for help */
 	mod_timer(&pool->mayday_timer, jiffies + MAYDAY_INITIAL_TIMEOUT);
@@ -2001,7 +2001,7 @@
 	}
 
 	del_timer_sync(&pool->mayday_timer);
-	spin_lock_irq(&pool->lock);
+	raw_spin_lock_irq(&pool->lock);
 	/*
 	 * This is necessary even after a new worker was just successfully
 	 * created as @pool->lock was dropped and the new worker might have
@@ -2024,7 +2024,7 @@
  * and may_start_working() is true.
  *
  * CONTEXT:
- * spin_lock_irq(pool->lock) which may be released and regrabbed
+ * raw_spin_lock_irq(pool->lock) which may be released and regrabbed
  * multiple times.  Does GFP_KERNEL allocations.
  *
  * Return:
@@ -2047,7 +2047,7 @@
 
 	pool->manager = NULL;
 	pool->flags &= ~POOL_MANAGER_ACTIVE;
-	wake_up(&wq_manager_wait);
+	swake_up_one(&wq_manager_wait);
 	return true;
 }
 
@@ -2063,7 +2063,7 @@
  * call this function to process a work.
  *
  * CONTEXT:
- * spin_lock_irq(pool->lock) which is released and regrabbed.
+ * raw_spin_lock_irq(pool->lock) which is released and regrabbed.
  */
 static void process_one_work(struct worker *worker, struct work_struct *work)
 __releases(&pool->lock)
@@ -2145,7 +2145,7 @@
 	 */
 	set_work_pool_and_clear_pending(work, pool->id);
 
-	spin_unlock_irq(&pool->lock);
+	raw_spin_unlock_irq(&pool->lock);
 
 	lock_map_acquire(&pwq->wq->lockdep_map);
 	lock_map_acquire(&lockdep_map);
@@ -2200,7 +2200,7 @@
 	 */
 	cond_resched();
 
-	spin_lock_irq(&pool->lock);
+	raw_spin_lock_irq(&pool->lock);
 
 	/* clear cpu intensive status */
 	if (unlikely(cpu_intensive))
@@ -2226,7 +2226,7 @@
  * fetches a work from the top and executes it.
  *
  * CONTEXT:
- * spin_lock_irq(pool->lock) which may be released and regrabbed
+ * raw_spin_lock_irq(pool->lock) which may be released and regrabbed
  * multiple times.
  */
 static void process_scheduled_works(struct worker *worker)
@@ -2268,11 +2268,11 @@
 	/* tell the scheduler that this is a workqueue worker */
 	set_pf_worker(true);
 woke_up:
-	spin_lock_irq(&pool->lock);
+	raw_spin_lock_irq(&pool->lock);
 
 	/* am I supposed to die? */
 	if (unlikely(worker->flags & WORKER_DIE)) {
-		spin_unlock_irq(&pool->lock);
+		raw_spin_unlock_irq(&pool->lock);
 		WARN_ON_ONCE(!list_empty(&worker->entry));
 		set_pf_worker(false);
 
@@ -2338,7 +2338,7 @@
 	 */
 	worker_enter_idle(worker);
 	__set_current_state(TASK_IDLE);
-	spin_unlock_irq(&pool->lock);
+	raw_spin_unlock_irq(&pool->lock);
 	schedule();
 	goto woke_up;
 }
@@ -2392,7 +2392,7 @@
 	should_stop = kthread_should_stop();
 
 	/* see whether any pwq is asking for help */
-	spin_lock_irq(&wq_mayday_lock);
+	raw_spin_lock_irq(&wq_mayday_lock);
 
 	while (!list_empty(&wq->maydays)) {
 		struct pool_workqueue *pwq = list_first_entry(&wq->maydays,
@@ -2404,11 +2404,11 @@
 		__set_current_state(TASK_RUNNING);
 		list_del_init(&pwq->mayday_node);
 
-		spin_unlock_irq(&wq_mayday_lock);
+		raw_spin_unlock_irq(&wq_mayday_lock);
 
 		worker_attach_to_pool(rescuer, pool);
 
-		spin_lock_irq(&pool->lock);
+		raw_spin_lock_irq(&pool->lock);
 
 		/*
 		 * Slurp in all works issued via this workqueue and
@@ -2437,7 +2437,7 @@
 			 * incur MAYDAY_INTERVAL delay inbetween.
 			 */
 			if (need_to_create_worker(pool)) {
-				spin_lock(&wq_mayday_lock);
+				raw_spin_lock(&wq_mayday_lock);
 				/*
 				 * Queue iff we aren't racing destruction
 				 * and somebody else hasn't queued it already.
@@ -2446,7 +2446,7 @@
 					get_pwq(pwq);
 					list_add_tail(&pwq->mayday_node, &wq->maydays);
 				}
-				spin_unlock(&wq_mayday_lock);
+				raw_spin_unlock(&wq_mayday_lock);
 			}
 		}
 
@@ -2464,14 +2464,14 @@
 		if (need_more_worker(pool))
 			wake_up_worker(pool);
 
-		spin_unlock_irq(&pool->lock);
+		raw_spin_unlock_irq(&pool->lock);
 
 		worker_detach_from_pool(rescuer);
 
-		spin_lock_irq(&wq_mayday_lock);
+		raw_spin_lock_irq(&wq_mayday_lock);
 	}
 
-	spin_unlock_irq(&wq_mayday_lock);
+	raw_spin_unlock_irq(&wq_mayday_lock);
 
 	if (should_stop) {
 		__set_current_state(TASK_RUNNING);
@@ -2551,7 +2551,7 @@
  * underneath us, so we can't reliably determine pwq from @target.
  *
  * CONTEXT:
- * spin_lock_irq(pool->lock).
+ * raw_spin_lock_irq(pool->lock).
  */
 static void insert_wq_barrier(struct pool_workqueue *pwq,
 			      struct wq_barrier *barr,
@@ -2638,7 +2638,7 @@
 	for_each_pwq(pwq, wq) {
 		struct worker_pool *pool = pwq->pool;
 
-		spin_lock_irq(&pool->lock);
+		raw_spin_lock_irq(&pool->lock);
 
 		if (flush_color >= 0) {
 			WARN_ON_ONCE(pwq->flush_color != -1);
@@ -2655,7 +2655,7 @@
 			pwq->work_color = work_color;
 		}
 
-		spin_unlock_irq(&pool->lock);
+		raw_spin_unlock_irq(&pool->lock);
 	}
 
 	if (flush_color >= 0 && atomic_dec_and_test(&wq->nr_pwqs_to_flush))
@@ -2855,9 +2855,9 @@
 	for_each_pwq(pwq, wq) {
 		bool drained;
 
-		spin_lock_irq(&pwq->pool->lock);
+		raw_spin_lock_irq(&pwq->pool->lock);
 		drained = !pwq->nr_active && list_empty(&pwq->delayed_works);
-		spin_unlock_irq(&pwq->pool->lock);
+		raw_spin_unlock_irq(&pwq->pool->lock);
 
 		if (drained)
 			continue;
@@ -2886,14 +2886,14 @@
 
 	might_sleep();
 
-	local_irq_disable();
+	rcu_read_lock();
 	pool = get_work_pool(work);
 	if (!pool) {
-		local_irq_enable();
+		rcu_read_unlock();
 		return false;
 	}
 
-	spin_lock(&pool->lock);
+	raw_spin_lock_irq(&pool->lock);
 	/* see the comment in try_to_grab_pending() with the same code */
 	pwq = get_work_pwq(work);
 	if (pwq) {
@@ -2909,7 +2909,7 @@
 	check_flush_dependency(pwq->wq, work);
 
 	insert_wq_barrier(pwq, barr, work, worker);
-	spin_unlock_irq(&pool->lock);
+	raw_spin_unlock_irq(&pool->lock);
 
 	/*
 	 * Force a lock recursion deadlock when using flush_work() inside a
@@ -2925,10 +2925,11 @@
 		lock_map_acquire(&pwq->wq->lockdep_map);
 		lock_map_release(&pwq->wq->lockdep_map);
 	}
-
+	rcu_read_unlock();
 	return true;
 already_gone:
-	spin_unlock_irq(&pool->lock);
+	raw_spin_unlock_irq(&pool->lock);
+	rcu_read_unlock();
 	return false;
 }
 
@@ -3240,7 +3241,7 @@
  *
  * Undo alloc_workqueue_attrs().
  */
-void free_workqueue_attrs(struct workqueue_attrs *attrs)
+static void free_workqueue_attrs(struct workqueue_attrs *attrs)
 {
 	if (attrs) {
 		free_cpumask_var(attrs->cpumask);
@@ -3250,21 +3251,20 @@
 
 /**
  * alloc_workqueue_attrs - allocate a workqueue_attrs
- * @gfp_mask: allocation mask to use
  *
  * Allocate a new workqueue_attrs, initialize with default settings and
  * return it.
  *
  * Return: The allocated new workqueue_attr on success. %NULL on failure.
  */
-struct workqueue_attrs *alloc_workqueue_attrs(gfp_t gfp_mask)
+static struct workqueue_attrs *alloc_workqueue_attrs(void)
 {
 	struct workqueue_attrs *attrs;
 
-	attrs = kzalloc(sizeof(*attrs), gfp_mask);
+	attrs = kzalloc(sizeof(*attrs), GFP_KERNEL);
 	if (!attrs)
 		goto fail;
-	if (!alloc_cpumask_var(&attrs->cpumask, gfp_mask))
+	if (!alloc_cpumask_var(&attrs->cpumask, GFP_KERNEL))
 		goto fail;
 
 	cpumask_copy(attrs->cpumask, cpu_possible_mask);
@@ -3321,7 +3321,7 @@
  */
 static int init_worker_pool(struct worker_pool *pool)
 {
-	spin_lock_init(&pool->lock);
+	raw_spin_lock_init(&pool->lock);
 	pool->id = -1;
 	pool->cpu = -1;
 	pool->node = NUMA_NO_NODE;
@@ -3342,7 +3342,7 @@
 	pool->refcnt = 1;
 
 	/* shouldn't fail above this point */
-	pool->attrs = alloc_workqueue_attrs(GFP_KERNEL);
+	pool->attrs = alloc_workqueue_attrs();
 	if (!pool->attrs)
 		return -ENOMEM;
 	return 0;
@@ -3375,7 +3375,7 @@
  * put_unbound_pool - put a worker_pool
  * @pool: worker_pool to put
  *
- * Put @pool.  If its refcnt reaches zero, it gets destroyed in sched-RCU
+ * Put @pool.  If its refcnt reaches zero, it gets destroyed in RCU
  * safe manner.  get_unbound_pool() calls this function on its failure path
  * and this function should be able to release pools which went through,
  * successfully or not, init_worker_pool().
@@ -3407,15 +3407,15 @@
 	 * @pool's workers from blocking on attach_mutex.  We're the last
 	 * manager and @pool gets freed with the flag set.
 	 */
-	spin_lock_irq(&pool->lock);
-	wait_event_lock_irq(wq_manager_wait,
+	raw_spin_lock_irq(&pool->lock);
+	swait_event_lock_irq(wq_manager_wait,
 			    !(pool->flags & POOL_MANAGER_ACTIVE), pool->lock);
 	pool->flags |= POOL_MANAGER_ACTIVE;
 
 	while ((worker = first_idle_worker(pool)))
 		destroy_worker(worker);
 	WARN_ON(pool->nr_workers || pool->nr_idle);
-	spin_unlock_irq(&pool->lock);
+	raw_spin_unlock_irq(&pool->lock);
 
 	mutex_lock(&wq_pool_attach_mutex);
 	if (!list_empty(&pool->workers))
@@ -3429,8 +3429,8 @@
 	del_timer_sync(&pool->idle_timer);
 	del_timer_sync(&pool->mayday_timer);
 
-	/* sched-RCU protected to allow dereferences from get_work_pool() */
-	call_rcu_sched(&pool->rcu, rcu_free_pool);
+	/* RCU protected to allow dereferences from get_work_pool() */
+	call_rcu(&pool->rcu, rcu_free_pool);
 }
 
 /**
@@ -3543,14 +3543,14 @@
 	put_unbound_pool(pool);
 	mutex_unlock(&wq_pool_mutex);
 
-	call_rcu_sched(&pwq->rcu, rcu_free_pwq);
+	call_rcu(&pwq->rcu, rcu_free_pwq);
 
 	/*
 	 * If we're the last pwq going away, @wq is already dead and no one
 	 * is gonna access it anymore.  Schedule RCU free.
 	 */
 	if (is_last)
-		call_rcu_sched(&wq->rcu, rcu_free_wq);
+		call_rcu(&wq->rcu, rcu_free_wq);
 }
 
 /**
@@ -3575,7 +3575,7 @@
 		return;
 
 	/* this function can be called during early boot w/ irq disabled */
-	spin_lock_irqsave(&pwq->pool->lock, flags);
+	raw_spin_lock_irqsave(&pwq->pool->lock, flags);
 
 	/*
 	 * During [un]freezing, the caller is responsible for ensuring that
@@ -3605,7 +3605,7 @@
 		pwq->max_active = 0;
 	}
 
-	spin_unlock_irqrestore(&pwq->pool->lock, flags);
+	raw_spin_unlock_irqrestore(&pwq->pool->lock, flags);
 }
 
 /* initialize newly alloced @pwq which is associated with @wq and @pool */
@@ -3778,8 +3778,8 @@
 
 	ctx = kzalloc(struct_size(ctx, pwq_tbl, nr_node_ids), GFP_KERNEL);
 
-	new_attrs = alloc_workqueue_attrs(GFP_KERNEL);
-	tmp_attrs = alloc_workqueue_attrs(GFP_KERNEL);
+	new_attrs = alloc_workqueue_attrs();
+	tmp_attrs = alloc_workqueue_attrs();
 	if (!ctx || !new_attrs || !tmp_attrs)
 		goto out_free;
 
@@ -3915,7 +3915,7 @@
  *
  * Return: 0 on success and -errno on failure.
  */
-int apply_workqueue_attrs(struct workqueue_struct *wq,
+static int apply_workqueue_attrs(struct workqueue_struct *wq,
 			  const struct workqueue_attrs *attrs)
 {
 	int ret;
@@ -3926,7 +3926,6 @@
 
 	return ret;
 }
-EXPORT_SYMBOL_GPL(apply_workqueue_attrs);
 
 /**
  * wq_update_unbound_numa - update NUMA affinity of a wq for CPU hot[un]plug
@@ -4004,9 +4003,9 @@
 
 use_dfl_pwq:
 	mutex_lock(&wq->mutex);
-	spin_lock_irq(&wq->dfl_pwq->pool->lock);
+	raw_spin_lock_irq(&wq->dfl_pwq->pool->lock);
 	get_pwq(wq->dfl_pwq);
-	spin_unlock_irq(&wq->dfl_pwq->pool->lock);
+	raw_spin_unlock_irq(&wq->dfl_pwq->pool->lock);
 	old_pwq = numa_pwq_tbl_install(wq, node, wq->dfl_pwq);
 out_unlock:
 	mutex_unlock(&wq->mutex);
@@ -4125,7 +4124,7 @@
 		return NULL;
 
 	if (flags & WQ_UNBOUND) {
-		wq->unbound_attrs = alloc_workqueue_attrs(GFP_KERNEL);
+		wq->unbound_attrs = alloc_workqueue_attrs();
 		if (!wq->unbound_attrs)
 			goto err_free_wq;
 	}
@@ -4212,9 +4211,9 @@
 		struct worker *rescuer = wq->rescuer;
 
 		/* this prevents new queueing */
-		spin_lock_irq(&wq_mayday_lock);
+		raw_spin_lock_irq(&wq_mayday_lock);
 		wq->rescuer = NULL;
-		spin_unlock_irq(&wq_mayday_lock);
+		raw_spin_unlock_irq(&wq_mayday_lock);
 
 		/* rescuer will empty maydays list before exiting */
 		kthread_stop(rescuer->task);
@@ -4257,7 +4256,7 @@
 		 * The base ref is never dropped on per-cpu pwqs.  Directly
 		 * schedule RCU free.
 		 */
-		call_rcu_sched(&wq->rcu, rcu_free_wq);
+		call_rcu(&wq->rcu, rcu_free_wq);
 	} else {
 		/*
 		 * We're the sole accessor of @wq at this point.  Directly
@@ -4367,7 +4366,8 @@
 	struct pool_workqueue *pwq;
 	bool ret;
 
-	rcu_read_lock_sched();
+	rcu_read_lock();
+	preempt_disable();
 
 	if (cpu == WORK_CPU_UNBOUND)
 		cpu = smp_processor_id();
@@ -4378,7 +4378,8 @@
 		pwq = unbound_pwq_by_node(wq, cpu_to_node(cpu));
 
 	ret = !list_empty(&pwq->delayed_works);
-	rcu_read_unlock_sched();
+	preempt_enable();
+	rcu_read_unlock();
 
 	return ret;
 }
@@ -4404,15 +4405,15 @@
 	if (work_pending(work))
 		ret |= WORK_BUSY_PENDING;
 
-	local_irq_save(flags);
+	rcu_read_lock();
 	pool = get_work_pool(work);
 	if (pool) {
-		spin_lock(&pool->lock);
+		raw_spin_lock_irqsave(&pool->lock, flags);
 		if (find_worker_executing_work(pool, work))
 			ret |= WORK_BUSY_RUNNING;
-		spin_unlock(&pool->lock);
+		raw_spin_unlock_irqrestore(&pool->lock, flags);
 	}
-	local_irq_restore(flags);
+	rcu_read_unlock();
 
 	return ret;
 }
@@ -4597,7 +4598,7 @@
 	unsigned long flags;
 	int pi;
 
-	rcu_read_lock_sched();
+	rcu_read_lock();
 
 	pr_info("Showing busy workqueues and worker pools:\n");
 
@@ -4617,10 +4618,10 @@
 		pr_info("workqueue %s: flags=0x%x\n", wq->name, wq->flags);
 
 		for_each_pwq(pwq, wq) {
-			spin_lock_irqsave(&pwq->pool->lock, flags);
+			raw_spin_lock_irqsave(&pwq->pool->lock, flags);
 			if (pwq->nr_active || !list_empty(&pwq->delayed_works))
 				show_pwq(pwq);
-			spin_unlock_irqrestore(&pwq->pool->lock, flags);
+			raw_spin_unlock_irqrestore(&pwq->pool->lock, flags);
 			/*
 			 * We could be printing a lot from atomic context, e.g.
 			 * sysrq-t -> show_workqueue_state(). Avoid triggering
@@ -4634,7 +4635,7 @@
 		struct worker *worker;
 		bool first = true;
 
-		spin_lock_irqsave(&pool->lock, flags);
+		raw_spin_lock_irqsave(&pool->lock, flags);
 		if (pool->nr_workers == pool->nr_idle)
 			goto next_pool;
 
@@ -4653,7 +4654,7 @@
 		}
 		pr_cont("\n");
 	next_pool:
-		spin_unlock_irqrestore(&pool->lock, flags);
+		raw_spin_unlock_irqrestore(&pool->lock, flags);
 		/*
 		 * We could be printing a lot from atomic context, e.g.
 		 * sysrq-t -> show_workqueue_state(). Avoid triggering
@@ -4662,7 +4663,7 @@
 		touch_nmi_watchdog();
 	}
 
-	rcu_read_unlock_sched();
+	rcu_read_unlock();
 }
 
 /* used to show worker information through /proc/PID/{comm,stat,status} */
@@ -4683,7 +4684,7 @@
 		struct worker_pool *pool = worker->pool;
 
 		if (pool) {
-			spin_lock_irq(&pool->lock);
+			raw_spin_lock_irq(&pool->lock);
 			/*
 			 * ->desc tracks information (wq name or
 			 * set_worker_desc()) for the latest execution.  If
@@ -4697,7 +4698,7 @@
 					scnprintf(buf + off, size - off, "-%s",
 						  worker->desc);
 			}
-			spin_unlock_irq(&pool->lock);
+			raw_spin_unlock_irq(&pool->lock);
 		}
 	}
 
@@ -4728,7 +4729,7 @@
 
 	for_each_cpu_worker_pool(pool, cpu) {
 		mutex_lock(&wq_pool_attach_mutex);
-		spin_lock_irq(&pool->lock);
+		raw_spin_lock_irq(&pool->lock);
 
 		/*
 		 * We've blocked all attach/detach operations. Make all workers
@@ -4742,7 +4743,7 @@
 
 		pool->flags |= POOL_DISASSOCIATED;
 
-		spin_unlock_irq(&pool->lock);
+		raw_spin_unlock_irq(&pool->lock);
 		mutex_unlock(&wq_pool_attach_mutex);
 
 		/*
@@ -4768,9 +4769,9 @@
 		 * worker blocking could lead to lengthy stalls.  Kick off
 		 * unbound chain execution of currently pending work items.
 		 */
-		spin_lock_irq(&pool->lock);
+		raw_spin_lock_irq(&pool->lock);
 		wake_up_worker(pool);
-		spin_unlock_irq(&pool->lock);
+		raw_spin_unlock_irq(&pool->lock);
 	}
 }
 
@@ -4797,7 +4798,7 @@
 		WARN_ON_ONCE(set_cpus_allowed_ptr(worker->task,
 						  pool->attrs->cpumask) < 0);
 
-	spin_lock_irq(&pool->lock);
+	raw_spin_lock_irq(&pool->lock);
 
 	pool->flags &= ~POOL_DISASSOCIATED;
 
@@ -4836,7 +4837,7 @@
 		WRITE_ONCE(worker->flags, worker_flags);
 	}
 
-	spin_unlock_irq(&pool->lock);
+	raw_spin_unlock_irq(&pool->lock);
 }
 
 /**
@@ -5049,16 +5050,16 @@
 		 * nr_active is monotonically decreasing.  It's safe
 		 * to peek without lock.
 		 */
-		rcu_read_lock_sched();
+		rcu_read_lock();
 		for_each_pwq(pwq, wq) {
 			WARN_ON_ONCE(pwq->nr_active < 0);
 			if (pwq->nr_active) {
 				busy = true;
-				rcu_read_unlock_sched();
+				rcu_read_unlock();
 				goto out_unlock;
 			}
 		}
-		rcu_read_unlock_sched();
+		rcu_read_unlock();
 	}
 out_unlock:
 	mutex_unlock(&wq_pool_mutex);
@@ -5260,7 +5261,8 @@
 	const char *delim = "";
 	int node, written = 0;
 
-	rcu_read_lock_sched();
+	get_online_cpus();
+	rcu_read_lock();
 	for_each_node(node) {
 		written += scnprintf(buf + written, PAGE_SIZE - written,
 				     "%s%d:%d", delim, node,
@@ -5268,7 +5270,8 @@
 		delim = " ";
 	}
 	written += scnprintf(buf + written, PAGE_SIZE - written, "\n");
-	rcu_read_unlock_sched();
+	rcu_read_unlock();
+	put_online_cpus();
 
 	return written;
 }
@@ -5293,7 +5296,7 @@
 
 	lockdep_assert_held(&wq_pool_mutex);
 
-	attrs = alloc_workqueue_attrs(GFP_KERNEL);
+	attrs = alloc_workqueue_attrs();
 	if (!attrs)
 		return NULL;
 
@@ -5722,7 +5725,7 @@
 		return;
 	}
 
-	wq_update_unbound_numa_attrs_buf = alloc_workqueue_attrs(GFP_KERNEL);
+	wq_update_unbound_numa_attrs_buf = alloc_workqueue_attrs();
 	BUG_ON(!wq_update_unbound_numa_attrs_buf);
 
 	/*
@@ -5797,7 +5800,7 @@
 	for (i = 0; i < NR_STD_WORKER_POOLS; i++) {
 		struct workqueue_attrs *attrs;
 
-		BUG_ON(!(attrs = alloc_workqueue_attrs(GFP_KERNEL)));
+		BUG_ON(!(attrs = alloc_workqueue_attrs()));
 		attrs->nice = std_nice[i];
 		unbound_std_wq_attrs[i] = attrs;
 
@@ -5806,7 +5809,7 @@
 		 * guaranteed by max_active which is enforced by pwqs.
 		 * Turn off NUMA so that dfl_pwq is used for all nodes.
 		 */
-		BUG_ON(!(attrs = alloc_workqueue_attrs(GFP_KERNEL)));
+		BUG_ON(!(attrs = alloc_workqueue_attrs()));
 		attrs->nice = std_nice[i];
 		attrs->no_numa = true;
 		ordered_wq_attrs[i] = attrs;
diff --git a/kernel/kernel/workqueue_internal.h b/kernel/kernel/workqueue_internal.h
index cb68b03..0c0599c 100644
--- a/kernel/kernel/workqueue_internal.h
+++ b/kernel/kernel/workqueue_internal.h
@@ -44,6 +44,7 @@
 	unsigned long		last_active;	/* L: last active timestamp */
 	unsigned int		flags;		/* X: flags */
 	int			id;		/* I: worker id */
+	int			sleeping;	/* None */
 
 	/*
 	 * Opaque string set with work_set_desc().  Printed out with task
@@ -72,8 +73,8 @@
  * Scheduler hooks for concurrency managed workqueue.  Only to be used from
  * sched/ and workqueue.c.
  */
-void wq_worker_waking_up(struct task_struct *task, int cpu);
-struct task_struct *wq_worker_sleeping(struct task_struct *task);
 work_func_t wq_worker_last_func(struct task_struct *task);
+void wq_worker_running(struct task_struct *task);
+void wq_worker_sleeping(struct task_struct *task);
 
 #endif /* _KERNEL_WORKQUEUE_INTERNAL_H */
diff --git a/kernel/lib/Kconfig b/kernel/lib/Kconfig
index 10a4031..ae9833f 100644
--- a/kernel/lib/Kconfig
+++ b/kernel/lib/Kconfig
@@ -441,6 +441,7 @@
 
 config CPUMASK_OFFSTACK
 	bool "Force CPU masks off stack" if DEBUG_PER_CPU_MAPS
+	depends on !PREEMPT_RT_FULL
 	help
 	  Use dynamic allocation for cpumask_var_t, instead of putting
 	  them on the stack.  This is a bit more expensive, but avoids
diff --git a/kernel/lib/Kconfig.debug b/kernel/lib/Kconfig.debug
index 607c8a6..ccd0b5f 100644
--- a/kernel/lib/Kconfig.debug
+++ b/kernel/lib/Kconfig.debug
@@ -1227,7 +1227,7 @@
 
 config DEBUG_LOCKING_API_SELFTESTS
 	bool "Locking API boot-time self-tests"
-	depends on DEBUG_KERNEL
+	depends on DEBUG_KERNEL && !PREEMPT_RT_FULL
 	help
 	  Say Y here if you want the kernel to run a short self-test during
 	  bootup. The self-test checks whether common types of locking bugs
diff --git a/kernel/lib/debugobjects.c b/kernel/lib/debugobjects.c
index 14afeeb..e28481c 100644
--- a/kernel/lib/debugobjects.c
+++ b/kernel/lib/debugobjects.c
@@ -376,7 +376,10 @@
 	struct debug_obj *obj;
 	unsigned long flags;
 
-	fill_pool();
+#ifdef CONFIG_PREEMPT_RT_FULL
+	if (preempt_count() == 0 && !irqs_disabled())
+#endif
+		fill_pool();
 
 	db = get_bucket((unsigned long) addr);
 
diff --git a/kernel/lib/irq_poll.c b/kernel/lib/irq_poll.c
index 86a7099..9c069ef 100644
--- a/kernel/lib/irq_poll.c
+++ b/kernel/lib/irq_poll.c
@@ -37,6 +37,7 @@
 	list_add_tail(&iop->list, this_cpu_ptr(&blk_cpu_iopoll));
 	__raise_softirq_irqoff(IRQ_POLL_SOFTIRQ);
 	local_irq_restore(flags);
+	preempt_check_resched_rt();
 }
 EXPORT_SYMBOL(irq_poll_sched);
 
@@ -72,6 +73,7 @@
 	local_irq_save(flags);
 	__irq_poll_complete(iop);
 	local_irq_restore(flags);
+	preempt_check_resched_rt();
 }
 EXPORT_SYMBOL(irq_poll_complete);
 
@@ -96,6 +98,7 @@
 		}
 
 		local_irq_enable();
+		preempt_check_resched_rt();
 
 		/* Even though interrupts have been re-enabled, this
 		 * access is safe because interrupts can only add new
@@ -133,6 +136,7 @@
 		__raise_softirq_irqoff(IRQ_POLL_SOFTIRQ);
 
 	local_irq_enable();
+	preempt_check_resched_rt();
 }
 
 /**
@@ -196,6 +200,7 @@
 			 this_cpu_ptr(&blk_cpu_iopoll));
 	__raise_softirq_irqoff(IRQ_POLL_SOFTIRQ);
 	local_irq_enable();
+	preempt_check_resched_rt();
 
 	return 0;
 }
diff --git a/kernel/lib/locking-selftest.c b/kernel/lib/locking-selftest.c
index 1e1bbf1..32db953 100644
--- a/kernel/lib/locking-selftest.c
+++ b/kernel/lib/locking-selftest.c
@@ -742,6 +742,8 @@
 #include "locking-selftest-spin-hardirq.h"
 GENERATE_PERMUTATIONS_2_EVENTS(irqsafe1_hard_spin)
 
+#ifndef CONFIG_PREEMPT_RT_FULL
+
 #include "locking-selftest-rlock-hardirq.h"
 GENERATE_PERMUTATIONS_2_EVENTS(irqsafe1_hard_rlock)
 
@@ -757,9 +759,12 @@
 #include "locking-selftest-wlock-softirq.h"
 GENERATE_PERMUTATIONS_2_EVENTS(irqsafe1_soft_wlock)
 
+#endif
+
 #undef E1
 #undef E2
 
+#ifndef CONFIG_PREEMPT_RT_FULL
 /*
  * Enabling hardirqs with a softirq-safe lock held:
  */
@@ -792,6 +797,8 @@
 #undef E1
 #undef E2
 
+#endif
+
 /*
  * Enabling irqs with an irq-safe lock held:
  */
@@ -815,6 +822,8 @@
 #include "locking-selftest-spin-hardirq.h"
 GENERATE_PERMUTATIONS_2_EVENTS(irqsafe2B_hard_spin)
 
+#ifndef CONFIG_PREEMPT_RT_FULL
+
 #include "locking-selftest-rlock-hardirq.h"
 GENERATE_PERMUTATIONS_2_EVENTS(irqsafe2B_hard_rlock)
 
@@ -829,6 +838,8 @@
 
 #include "locking-selftest-wlock-softirq.h"
 GENERATE_PERMUTATIONS_2_EVENTS(irqsafe2B_soft_wlock)
+
+#endif
 
 #undef E1
 #undef E2
@@ -861,6 +872,8 @@
 #include "locking-selftest-spin-hardirq.h"
 GENERATE_PERMUTATIONS_3_EVENTS(irqsafe3_hard_spin)
 
+#ifndef CONFIG_PREEMPT_RT_FULL
+
 #include "locking-selftest-rlock-hardirq.h"
 GENERATE_PERMUTATIONS_3_EVENTS(irqsafe3_hard_rlock)
 
@@ -875,6 +888,8 @@
 
 #include "locking-selftest-wlock-softirq.h"
 GENERATE_PERMUTATIONS_3_EVENTS(irqsafe3_soft_wlock)
+
+#endif
 
 #undef E1
 #undef E2
@@ -909,6 +924,8 @@
 #include "locking-selftest-spin-hardirq.h"
 GENERATE_PERMUTATIONS_3_EVENTS(irqsafe4_hard_spin)
 
+#ifndef CONFIG_PREEMPT_RT_FULL
+
 #include "locking-selftest-rlock-hardirq.h"
 GENERATE_PERMUTATIONS_3_EVENTS(irqsafe4_hard_rlock)
 
@@ -924,9 +941,13 @@
 #include "locking-selftest-wlock-softirq.h"
 GENERATE_PERMUTATIONS_3_EVENTS(irqsafe4_soft_wlock)
 
+#endif
+
 #undef E1
 #undef E2
 #undef E3
+
+#ifndef CONFIG_PREEMPT_RT_FULL
 
 /*
  * read-lock / write-lock irq inversion.
@@ -990,6 +1011,10 @@
 #undef E2
 #undef E3
 
+#endif
+
+#ifndef CONFIG_PREEMPT_RT_FULL
+
 /*
  * read-lock / write-lock recursion that is actually safe.
  */
@@ -1027,6 +1052,8 @@
 #undef E1
 #undef E2
 #undef E3
+
+#endif
 
 /*
  * read-lock / write-lock recursion that is unsafe.
@@ -2057,6 +2084,7 @@
 
 	printk("  --------------------------------------------------------------------------\n");
 
+#ifndef CONFIG_PREEMPT_RT_FULL
 	/*
 	 * irq-context testcases:
 	 */
@@ -2069,6 +2097,28 @@
 
 	DO_TESTCASE_6x2("irq read-recursion", irq_read_recursion);
 //	DO_TESTCASE_6x2B("irq read-recursion #2", irq_read_recursion2);
+#else
+	/* On -rt, we only do hardirq context test for raw spinlock */
+	DO_TESTCASE_1B("hard-irqs-on + irq-safe-A", irqsafe1_hard_spin, 12);
+	DO_TESTCASE_1B("hard-irqs-on + irq-safe-A", irqsafe1_hard_spin, 21);
+
+	DO_TESTCASE_1B("hard-safe-A + irqs-on", irqsafe2B_hard_spin, 12);
+	DO_TESTCASE_1B("hard-safe-A + irqs-on", irqsafe2B_hard_spin, 21);
+
+	DO_TESTCASE_1B("hard-safe-A + unsafe-B #1", irqsafe3_hard_spin, 123);
+	DO_TESTCASE_1B("hard-safe-A + unsafe-B #1", irqsafe3_hard_spin, 132);
+	DO_TESTCASE_1B("hard-safe-A + unsafe-B #1", irqsafe3_hard_spin, 213);
+	DO_TESTCASE_1B("hard-safe-A + unsafe-B #1", irqsafe3_hard_spin, 231);
+	DO_TESTCASE_1B("hard-safe-A + unsafe-B #1", irqsafe3_hard_spin, 312);
+	DO_TESTCASE_1B("hard-safe-A + unsafe-B #1", irqsafe3_hard_spin, 321);
+
+	DO_TESTCASE_1B("hard-safe-A + unsafe-B #2", irqsafe4_hard_spin, 123);
+	DO_TESTCASE_1B("hard-safe-A + unsafe-B #2", irqsafe4_hard_spin, 132);
+	DO_TESTCASE_1B("hard-safe-A + unsafe-B #2", irqsafe4_hard_spin, 213);
+	DO_TESTCASE_1B("hard-safe-A + unsafe-B #2", irqsafe4_hard_spin, 231);
+	DO_TESTCASE_1B("hard-safe-A + unsafe-B #2", irqsafe4_hard_spin, 312);
+	DO_TESTCASE_1B("hard-safe-A + unsafe-B #2", irqsafe4_hard_spin, 321);
+#endif
 
 	ww_tests();
 
diff --git a/kernel/lib/radix-tree.c b/kernel/lib/radix-tree.c
index e5cab5c..9309e81 100644
--- a/kernel/lib/radix-tree.c
+++ b/kernel/lib/radix-tree.c
@@ -38,7 +38,7 @@
 #include <linux/rcupdate.h>
 #include <linux/slab.h>
 #include <linux/string.h>
-
+#include <linux/locallock.h>
 
 /* Number of nodes in fully populated tree of given height */
 static unsigned long height_to_maxnodes[RADIX_TREE_MAX_PATH + 1] __read_mostly;
@@ -87,6 +87,7 @@
 	struct radix_tree_node *nodes;
 };
 static DEFINE_PER_CPU(struct radix_tree_preload, radix_tree_preloads) = { 0, };
+static DEFINE_LOCAL_IRQ_LOCK(radix_tree_preloads_lock);
 
 static inline struct radix_tree_node *entry_to_node(void *ptr)
 {
@@ -405,12 +406,13 @@
 		 * succeed in getting a node here (and never reach
 		 * kmem_cache_alloc)
 		 */
-		rtp = this_cpu_ptr(&radix_tree_preloads);
+		rtp = &get_locked_var(radix_tree_preloads_lock, radix_tree_preloads);
 		if (rtp->nr) {
 			ret = rtp->nodes;
 			rtp->nodes = ret->parent;
 			rtp->nr--;
 		}
+		put_locked_var(radix_tree_preloads_lock, radix_tree_preloads);
 		/*
 		 * Update the allocation stack trace as this is more useful
 		 * for debugging.
@@ -476,14 +478,14 @@
 	 */
 	gfp_mask &= ~__GFP_ACCOUNT;
 
-	preempt_disable();
+	local_lock(radix_tree_preloads_lock);
 	rtp = this_cpu_ptr(&radix_tree_preloads);
 	while (rtp->nr < nr) {
-		preempt_enable();
+		local_unlock(radix_tree_preloads_lock);
 		node = kmem_cache_alloc(radix_tree_node_cachep, gfp_mask);
 		if (node == NULL)
 			goto out;
-		preempt_disable();
+		local_lock(radix_tree_preloads_lock);
 		rtp = this_cpu_ptr(&radix_tree_preloads);
 		if (rtp->nr < nr) {
 			node->parent = rtp->nodes;
@@ -525,7 +527,7 @@
 	if (gfpflags_allow_blocking(gfp_mask))
 		return __radix_tree_preload(gfp_mask, RADIX_TREE_PRELOAD_SIZE);
 	/* Preloading doesn't help anything with this gfp mask, skip it */
-	preempt_disable();
+	local_lock(radix_tree_preloads_lock);
 	return 0;
 }
 EXPORT_SYMBOL(radix_tree_maybe_preload);
@@ -563,7 +565,7 @@
 
 	/* Preloading doesn't help anything with this gfp mask, skip it */
 	if (!gfpflags_allow_blocking(gfp_mask)) {
-		preempt_disable();
+		local_lock(radix_tree_preloads_lock);
 		return 0;
 	}
 
@@ -596,6 +598,12 @@
 
 	return __radix_tree_preload(gfp_mask, nr_nodes);
 }
+
+void radix_tree_preload_end(void)
+{
+	local_unlock(radix_tree_preloads_lock);
+}
+EXPORT_SYMBOL(radix_tree_preload_end);
 
 static unsigned radix_tree_load_root(const struct radix_tree_root *root,
 		struct radix_tree_node **nodep, unsigned long *maxindex)
@@ -2102,9 +2110,15 @@
 void idr_preload(gfp_t gfp_mask)
 {
 	if (__radix_tree_preload(gfp_mask, IDR_PRELOAD_SIZE))
-		preempt_disable();
+		local_lock(radix_tree_preloads_lock);
 }
 EXPORT_SYMBOL(idr_preload);
+
+void idr_preload_end(void)
+{
+	local_unlock(radix_tree_preloads_lock);
+}
+EXPORT_SYMBOL(idr_preload_end);
 
 int ida_pre_get(struct ida *ida, gfp_t gfp)
 {
@@ -2114,7 +2128,7 @@
 	 * to return to the ida_pre_get() step.
 	 */
 	if (!__radix_tree_preload(gfp, IDA_PRELOAD_SIZE))
-		preempt_enable();
+		local_unlock(radix_tree_preloads_lock);
 
 	if (!this_cpu_read(ida_bitmap)) {
 		struct ida_bitmap *bitmap = kzalloc(sizeof(*bitmap), gfp);
diff --git a/kernel/lib/scatterlist.c b/kernel/lib/scatterlist.c
index 3b85920..093c3aa 100644
--- a/kernel/lib/scatterlist.c
+++ b/kernel/lib/scatterlist.c
@@ -777,7 +777,7 @@
 			flush_kernel_dcache_page(miter->page);
 
 		if (miter->__flags & SG_MITER_ATOMIC) {
-			WARN_ON_ONCE(preemptible());
+			WARN_ON_ONCE(!pagefault_disabled());
 			kunmap_atomic(miter->addr);
 		} else
 			kunmap(miter->page);
diff --git a/kernel/lib/smp_processor_id.c b/kernel/lib/smp_processor_id.c
index 85925aa..2e73985 100644
--- a/kernel/lib/smp_processor_id.c
+++ b/kernel/lib/smp_processor_id.c
@@ -22,7 +22,12 @@
 	 * Kernel threads bound to a single CPU can safely use
 	 * smp_processor_id():
 	 */
-	if (cpumask_equal(&current->cpus_allowed, cpumask_of(this_cpu)))
+#if defined(CONFIG_PREEMPT_RT_BASE) && (defined(CONFIG_SMP) || defined(CONFIG_SCHED_DEBUG))
+	if (current->migrate_disable)
+		goto out;
+#endif
+
+	if (current->nr_cpus_allowed == 1)
 		goto out;
 
 	/*
diff --git a/kernel/lib/ubsan.c b/kernel/lib/ubsan.c
index 1e9e2ab..199c75e 100644
--- a/kernel/lib/ubsan.c
+++ b/kernel/lib/ubsan.c
@@ -143,25 +143,21 @@
 	}
 }
 
-static DEFINE_SPINLOCK(report_lock);
-
-static void ubsan_prologue(struct source_location *location,
-			unsigned long *flags)
+static void ubsan_prologue(struct source_location *location)
 {
 	current->in_ubsan++;
-	spin_lock_irqsave(&report_lock, *flags);
 
 	pr_err("========================================"
 		"========================================\n");
 	print_source_location("UBSAN: Undefined behaviour in", location);
 }
 
-static void ubsan_epilogue(unsigned long *flags)
+static void ubsan_epilogue(void)
 {
 	dump_stack();
 	pr_err("========================================"
 		"========================================\n");
-	spin_unlock_irqrestore(&report_lock, *flags);
+
 	current->in_ubsan--;
 }
 
@@ -170,14 +166,13 @@
 {
 
 	struct type_descriptor *type = data->type;
-	unsigned long flags;
 	char lhs_val_str[VALUE_LENGTH];
 	char rhs_val_str[VALUE_LENGTH];
 
 	if (suppress_report(&data->location))
 		return;
 
-	ubsan_prologue(&data->location, &flags);
+	ubsan_prologue(&data->location);
 
 	val_to_string(lhs_val_str, sizeof(lhs_val_str), type, lhs);
 	val_to_string(rhs_val_str, sizeof(rhs_val_str), type, rhs);
@@ -189,7 +184,7 @@
 		rhs_val_str,
 		type->type_name);
 
-	ubsan_epilogue(&flags);
+	ubsan_epilogue();
 }
 
 void __ubsan_handle_add_overflow(struct overflow_data *data,
@@ -217,20 +212,19 @@
 void __ubsan_handle_negate_overflow(struct overflow_data *data,
 				void *old_val)
 {
-	unsigned long flags;
 	char old_val_str[VALUE_LENGTH];
 
 	if (suppress_report(&data->location))
 		return;
 
-	ubsan_prologue(&data->location, &flags);
+	ubsan_prologue(&data->location);
 
 	val_to_string(old_val_str, sizeof(old_val_str), data->type, old_val);
 
 	pr_err("negation of %s cannot be represented in type %s:\n",
 		old_val_str, data->type->type_name);
 
-	ubsan_epilogue(&flags);
+	ubsan_epilogue();
 }
 EXPORT_SYMBOL(__ubsan_handle_negate_overflow);
 
@@ -238,13 +232,12 @@
 void __ubsan_handle_divrem_overflow(struct overflow_data *data,
 				void *lhs, void *rhs)
 {
-	unsigned long flags;
 	char rhs_val_str[VALUE_LENGTH];
 
 	if (suppress_report(&data->location))
 		return;
 
-	ubsan_prologue(&data->location, &flags);
+	ubsan_prologue(&data->location);
 
 	val_to_string(rhs_val_str, sizeof(rhs_val_str), data->type, rhs);
 
@@ -254,58 +247,52 @@
 	else
 		pr_err("division by zero\n");
 
-	ubsan_epilogue(&flags);
+	ubsan_epilogue();
 }
 EXPORT_SYMBOL(__ubsan_handle_divrem_overflow);
 
 static void handle_null_ptr_deref(struct type_mismatch_data_common *data)
 {
-	unsigned long flags;
-
 	if (suppress_report(data->location))
 		return;
 
-	ubsan_prologue(data->location, &flags);
+	ubsan_prologue(data->location);
 
 	pr_err("%s null pointer of type %s\n",
 		type_check_kinds[data->type_check_kind],
 		data->type->type_name);
 
-	ubsan_epilogue(&flags);
+	ubsan_epilogue();
 }
 
 static void handle_misaligned_access(struct type_mismatch_data_common *data,
 				unsigned long ptr)
 {
-	unsigned long flags;
-
 	if (suppress_report(data->location))
 		return;
 
-	ubsan_prologue(data->location, &flags);
+	ubsan_prologue(data->location);
 
 	pr_err("%s misaligned address %p for type %s\n",
 		type_check_kinds[data->type_check_kind],
 		(void *)ptr, data->type->type_name);
 	pr_err("which requires %ld byte alignment\n", data->alignment);
 
-	ubsan_epilogue(&flags);
+	ubsan_epilogue();
 }
 
 static void handle_object_size_mismatch(struct type_mismatch_data_common *data,
 					unsigned long ptr)
 {
-	unsigned long flags;
-
 	if (suppress_report(data->location))
 		return;
 
-	ubsan_prologue(data->location, &flags);
+	ubsan_prologue(data->location);
 	pr_err("%s address %p with insufficient space\n",
 		type_check_kinds[data->type_check_kind],
 		(void *) ptr);
 	pr_err("for an object of type %s\n", data->type->type_name);
-	ubsan_epilogue(&flags);
+	ubsan_epilogue();
 }
 
 static void ubsan_type_mismatch_common(struct type_mismatch_data_common *data,
@@ -352,42 +339,39 @@
 void __ubsan_handle_vla_bound_not_positive(struct vla_bound_data *data,
 					void *bound)
 {
-	unsigned long flags;
 	char bound_str[VALUE_LENGTH];
 
 	if (suppress_report(&data->location))
 		return;
 
-	ubsan_prologue(&data->location, &flags);
+	ubsan_prologue(&data->location);
 
 	val_to_string(bound_str, sizeof(bound_str), data->type, bound);
 	pr_err("variable length array bound value %s <= 0\n", bound_str);
 
-	ubsan_epilogue(&flags);
+	ubsan_epilogue();
 }
 EXPORT_SYMBOL(__ubsan_handle_vla_bound_not_positive);
 
 void __ubsan_handle_out_of_bounds(struct out_of_bounds_data *data, void *index)
 {
-	unsigned long flags;
 	char index_str[VALUE_LENGTH];
 
 	if (suppress_report(&data->location))
 		return;
 
-	ubsan_prologue(&data->location, &flags);
+	ubsan_prologue(&data->location);
 
 	val_to_string(index_str, sizeof(index_str), data->index_type, index);
 	pr_err("index %s is out of range for type %s\n", index_str,
 		data->array_type->type_name);
-	ubsan_epilogue(&flags);
+	ubsan_epilogue();
 }
 EXPORT_SYMBOL(__ubsan_handle_out_of_bounds);
 
 void __ubsan_handle_shift_out_of_bounds(struct shift_out_of_bounds_data *data,
 					void *lhs, void *rhs)
 {
-	unsigned long flags;
 	struct type_descriptor *rhs_type = data->rhs_type;
 	struct type_descriptor *lhs_type = data->lhs_type;
 	char rhs_str[VALUE_LENGTH];
@@ -396,7 +380,7 @@
 	if (suppress_report(&data->location))
 		return;
 
-	ubsan_prologue(&data->location, &flags);
+	ubsan_prologue(&data->location);
 
 	val_to_string(rhs_str, sizeof(rhs_str), rhs_type, rhs);
 	val_to_string(lhs_str, sizeof(lhs_str), lhs_type, lhs);
@@ -419,18 +403,16 @@
 			lhs_str, rhs_str,
 			lhs_type->type_name);
 
-	ubsan_epilogue(&flags);
+	ubsan_epilogue();
 }
 EXPORT_SYMBOL(__ubsan_handle_shift_out_of_bounds);
 
 
 void __ubsan_handle_builtin_unreachable(struct unreachable_data *data)
 {
-	unsigned long flags;
-
-	ubsan_prologue(&data->location, &flags);
+	ubsan_prologue(&data->location);
 	pr_err("calling __builtin_unreachable()\n");
-	ubsan_epilogue(&flags);
+	ubsan_epilogue();
 	panic("can't return from __builtin_unreachable()");
 }
 EXPORT_SYMBOL(__ubsan_handle_builtin_unreachable);
@@ -438,19 +420,18 @@
 void __ubsan_handle_load_invalid_value(struct invalid_value_data *data,
 				void *val)
 {
-	unsigned long flags;
 	char val_str[VALUE_LENGTH];
 
 	if (suppress_report(&data->location))
 		return;
 
-	ubsan_prologue(&data->location, &flags);
+	ubsan_prologue(&data->location);
 
 	val_to_string(val_str, sizeof(val_str), data->type, val);
 
 	pr_err("load of value %s is not a valid value for type %s\n",
 		val_str, data->type->type_name);
 
-	ubsan_epilogue(&flags);
+	ubsan_epilogue();
 }
 EXPORT_SYMBOL(__ubsan_handle_load_invalid_value);
diff --git a/kernel/localversion-rt b/kernel/localversion-rt
new file mode 100644
index 0000000..d068aed
--- /dev/null
+++ b/kernel/localversion-rt
@@ -0,0 +1 @@
+-rt104
diff --git a/kernel/mm/Kconfig b/kernel/mm/Kconfig
index 036466b..20c2a1d 100644
--- a/kernel/mm/Kconfig
+++ b/kernel/mm/Kconfig
@@ -377,7 +377,7 @@
 
 config TRANSPARENT_HUGEPAGE
 	bool "Transparent Hugepage Support"
-	depends on HAVE_ARCH_TRANSPARENT_HUGEPAGE
+	depends on HAVE_ARCH_TRANSPARENT_HUGEPAGE && !PREEMPT_RT_FULL
 	select COMPACTION
 	select RADIX_TREE_MULTIORDER
 	help
diff --git a/kernel/mm/compaction.c b/kernel/mm/compaction.c
index 120e555..4853ed5 100644
--- a/kernel/mm/compaction.c
+++ b/kernel/mm/compaction.c
@@ -1669,10 +1669,12 @@
 				block_start_pfn(cc->migrate_pfn, cc->order);
 
 			if (cc->last_migrated_pfn < current_block_start) {
-				cpu = get_cpu();
+				cpu = get_cpu_light();
+				local_lock_irq(swapvec_lock);
 				lru_add_drain_cpu(cpu);
+				local_unlock_irq(swapvec_lock);
 				drain_local_pages(zone);
-				put_cpu();
+				put_cpu_light();
 				/* No more flushing until we migrate again */
 				cc->last_migrated_pfn = 0;
 			}
diff --git a/kernel/mm/highmem.c b/kernel/mm/highmem.c
index 59db322..22aa3dd 100644
--- a/kernel/mm/highmem.c
+++ b/kernel/mm/highmem.c
@@ -30,9 +30,10 @@
 #include <linux/kgdb.h>
 #include <asm/tlbflush.h>
 
-
+#ifndef CONFIG_PREEMPT_RT_FULL
 #if defined(CONFIG_HIGHMEM) || defined(CONFIG_X86_32)
 DEFINE_PER_CPU(int, __kmap_atomic_idx);
+#endif
 #endif
 
 /*
@@ -108,8 +109,9 @@
 unsigned long totalhigh_pages __read_mostly;
 EXPORT_SYMBOL(totalhigh_pages);
 
-
+#ifndef CONFIG_PREEMPT_RT_FULL
 EXPORT_PER_CPU_SYMBOL(__kmap_atomic_idx);
+#endif
 
 unsigned int nr_free_highpages (void)
 {
diff --git a/kernel/mm/kmemleak.c b/kernel/mm/kmemleak.c
index f54734a..e8a7eeb 100644
--- a/kernel/mm/kmemleak.c
+++ b/kernel/mm/kmemleak.c
@@ -26,7 +26,7 @@
  *
  * The following locks and mutexes are used by kmemleak:
  *
- * - kmemleak_lock (rwlock): protects the object_list modifications and
+ * - kmemleak_lock (raw spinlock): protects the object_list modifications and
  *   accesses to the object_tree_root. The object_list is the main list
  *   holding the metadata (struct kmemleak_object) for the allocated memory
  *   blocks. The object_tree_root is a red black tree used to look-up
@@ -147,7 +147,7 @@
  * (use_count) and freed using the RCU mechanism.
  */
 struct kmemleak_object {
-	spinlock_t lock;
+	raw_spinlock_t lock;
 	unsigned int flags;		/* object status flags */
 	struct list_head object_list;
 	struct list_head gray_list;
@@ -197,7 +197,7 @@
 /* search tree for object boundaries */
 static struct rb_root object_tree_root = RB_ROOT;
 /* rw_lock protecting the access to object_list and object_tree_root */
-static DEFINE_RWLOCK(kmemleak_lock);
+static DEFINE_RAW_SPINLOCK(kmemleak_lock);
 
 /* allocation caches for kmemleak internal data */
 static struct kmem_cache *object_cache;
@@ -491,9 +491,9 @@
 	struct kmemleak_object *object;
 
 	rcu_read_lock();
-	read_lock_irqsave(&kmemleak_lock, flags);
+	raw_spin_lock_irqsave(&kmemleak_lock, flags);
 	object = lookup_object(ptr, alias);
-	read_unlock_irqrestore(&kmemleak_lock, flags);
+	raw_spin_unlock_irqrestore(&kmemleak_lock, flags);
 
 	/* check whether the object is still available */
 	if (object && !get_object(object))
@@ -513,13 +513,13 @@
 	unsigned long flags;
 	struct kmemleak_object *object;
 
-	write_lock_irqsave(&kmemleak_lock, flags);
+	raw_spin_lock_irqsave(&kmemleak_lock, flags);
 	object = lookup_object(ptr, alias);
 	if (object) {
 		rb_erase(&object->rb_node, &object_tree_root);
 		list_del_rcu(&object->object_list);
 	}
-	write_unlock_irqrestore(&kmemleak_lock, flags);
+	raw_spin_unlock_irqrestore(&kmemleak_lock, flags);
 
 	return object;
 }
@@ -561,7 +561,7 @@
 	INIT_LIST_HEAD(&object->object_list);
 	INIT_LIST_HEAD(&object->gray_list);
 	INIT_HLIST_HEAD(&object->area_list);
-	spin_lock_init(&object->lock);
+	raw_spin_lock_init(&object->lock);
 	atomic_set(&object->use_count, 1);
 	object->flags = OBJECT_ALLOCATED;
 	object->pointer = ptr;
@@ -593,7 +593,7 @@
 	/* kernel backtrace */
 	object->trace_len = __save_stack_trace(object->trace);
 
-	write_lock_irqsave(&kmemleak_lock, flags);
+	raw_spin_lock_irqsave(&kmemleak_lock, flags);
 
 	min_addr = min(min_addr, ptr);
 	max_addr = max(max_addr, ptr + size);
@@ -624,7 +624,7 @@
 
 	list_add_tail_rcu(&object->object_list, &object_list);
 out:
-	write_unlock_irqrestore(&kmemleak_lock, flags);
+	raw_spin_unlock_irqrestore(&kmemleak_lock, flags);
 	return object;
 }
 
@@ -642,9 +642,9 @@
 	 * Locking here also ensures that the corresponding memory block
 	 * cannot be freed when it is being scanned.
 	 */
-	spin_lock_irqsave(&object->lock, flags);
+	raw_spin_lock_irqsave(&object->lock, flags);
 	object->flags &= ~OBJECT_ALLOCATED;
-	spin_unlock_irqrestore(&object->lock, flags);
+	raw_spin_unlock_irqrestore(&object->lock, flags);
 	put_object(object);
 }
 
@@ -716,9 +716,9 @@
 {
 	unsigned long flags;
 
-	spin_lock_irqsave(&object->lock, flags);
+	raw_spin_lock_irqsave(&object->lock, flags);
 	__paint_it(object, color);
-	spin_unlock_irqrestore(&object->lock, flags);
+	raw_spin_unlock_irqrestore(&object->lock, flags);
 }
 
 static void paint_ptr(unsigned long ptr, int color)
@@ -778,7 +778,7 @@
 		goto out;
 	}
 
-	spin_lock_irqsave(&object->lock, flags);
+	raw_spin_lock_irqsave(&object->lock, flags);
 	if (size == SIZE_MAX) {
 		size = object->pointer + object->size - ptr;
 	} else if (ptr + size > object->pointer + object->size) {
@@ -794,7 +794,7 @@
 
 	hlist_add_head(&area->node, &object->area_list);
 out_unlock:
-	spin_unlock_irqrestore(&object->lock, flags);
+	raw_spin_unlock_irqrestore(&object->lock, flags);
 out:
 	put_object(object);
 }
@@ -817,9 +817,9 @@
 		return;
 	}
 
-	spin_lock_irqsave(&object->lock, flags);
+	raw_spin_lock_irqsave(&object->lock, flags);
 	object->excess_ref = excess_ref;
-	spin_unlock_irqrestore(&object->lock, flags);
+	raw_spin_unlock_irqrestore(&object->lock, flags);
 	put_object(object);
 }
 
@@ -839,9 +839,9 @@
 		return;
 	}
 
-	spin_lock_irqsave(&object->lock, flags);
+	raw_spin_lock_irqsave(&object->lock, flags);
 	object->flags |= OBJECT_NO_SCAN;
-	spin_unlock_irqrestore(&object->lock, flags);
+	raw_spin_unlock_irqrestore(&object->lock, flags);
 	put_object(object);
 }
 
@@ -902,11 +902,11 @@
 			       log->min_count, GFP_ATOMIC);
 	if (!object)
 		goto out;
-	spin_lock_irqsave(&object->lock, flags);
+	raw_spin_lock_irqsave(&object->lock, flags);
 	for (i = 0; i < log->trace_len; i++)
 		object->trace[i] = log->trace[i];
 	object->trace_len = log->trace_len;
-	spin_unlock_irqrestore(&object->lock, flags);
+	raw_spin_unlock_irqrestore(&object->lock, flags);
 out:
 	rcu_read_unlock();
 }
@@ -1096,9 +1096,9 @@
 		return;
 	}
 
-	spin_lock_irqsave(&object->lock, flags);
+	raw_spin_lock_irqsave(&object->lock, flags);
 	object->trace_len = __save_stack_trace(object->trace);
-	spin_unlock_irqrestore(&object->lock, flags);
+	raw_spin_unlock_irqrestore(&object->lock, flags);
 
 	put_object(object);
 }
@@ -1310,7 +1310,7 @@
 	unsigned long *end = _end - (BYTES_PER_POINTER - 1);
 	unsigned long flags;
 
-	read_lock_irqsave(&kmemleak_lock, flags);
+	raw_spin_lock_irqsave(&kmemleak_lock, flags);
 	for (ptr = start; ptr < end; ptr++) {
 		struct kmemleak_object *object;
 		unsigned long pointer;
@@ -1344,7 +1344,7 @@
 		 * previously acquired in scan_object(). These locks are
 		 * enclosed by scan_mutex.
 		 */
-		spin_lock_nested(&object->lock, SINGLE_DEPTH_NESTING);
+		raw_spin_lock_nested(&object->lock, SINGLE_DEPTH_NESTING);
 		/* only pass surplus references (object already gray) */
 		if (color_gray(object)) {
 			excess_ref = object->excess_ref;
@@ -1353,7 +1353,7 @@
 			excess_ref = 0;
 			update_refs(object);
 		}
-		spin_unlock(&object->lock);
+		raw_spin_unlock(&object->lock);
 
 		if (excess_ref) {
 			object = lookup_object(excess_ref, 0);
@@ -1362,12 +1362,12 @@
 			if (object == scanned)
 				/* circular reference, ignore */
 				continue;
-			spin_lock_nested(&object->lock, SINGLE_DEPTH_NESTING);
+			raw_spin_lock_nested(&object->lock, SINGLE_DEPTH_NESTING);
 			update_refs(object);
-			spin_unlock(&object->lock);
+			raw_spin_unlock(&object->lock);
 		}
 	}
-	read_unlock_irqrestore(&kmemleak_lock, flags);
+	raw_spin_unlock_irqrestore(&kmemleak_lock, flags);
 }
 
 /*
@@ -1400,7 +1400,7 @@
 	 * Once the object->lock is acquired, the corresponding memory block
 	 * cannot be freed (the same lock is acquired in delete_object).
 	 */
-	spin_lock_irqsave(&object->lock, flags);
+	raw_spin_lock_irqsave(&object->lock, flags);
 	if (object->flags & OBJECT_NO_SCAN)
 		goto out;
 	if (!(object->flags & OBJECT_ALLOCATED))
@@ -1419,9 +1419,9 @@
 			if (start >= end)
 				break;
 
-			spin_unlock_irqrestore(&object->lock, flags);
+			raw_spin_unlock_irqrestore(&object->lock, flags);
 			cond_resched();
-			spin_lock_irqsave(&object->lock, flags);
+			raw_spin_lock_irqsave(&object->lock, flags);
 		} while (object->flags & OBJECT_ALLOCATED);
 	} else
 		hlist_for_each_entry(area, &object->area_list, node)
@@ -1429,7 +1429,7 @@
 				   (void *)(area->start + area->size),
 				   object);
 out:
-	spin_unlock_irqrestore(&object->lock, flags);
+	raw_spin_unlock_irqrestore(&object->lock, flags);
 }
 
 /*
@@ -1482,7 +1482,7 @@
 	/* prepare the kmemleak_object's */
 	rcu_read_lock();
 	list_for_each_entry_rcu(object, &object_list, object_list) {
-		spin_lock_irqsave(&object->lock, flags);
+		raw_spin_lock_irqsave(&object->lock, flags);
 #ifdef DEBUG
 		/*
 		 * With a few exceptions there should be a maximum of
@@ -1499,7 +1499,7 @@
 		if (color_gray(object) && get_object(object))
 			list_add_tail(&object->gray_list, &gray_list);
 
-		spin_unlock_irqrestore(&object->lock, flags);
+		raw_spin_unlock_irqrestore(&object->lock, flags);
 	}
 	rcu_read_unlock();
 
@@ -1564,14 +1564,14 @@
 	 */
 	rcu_read_lock();
 	list_for_each_entry_rcu(object, &object_list, object_list) {
-		spin_lock_irqsave(&object->lock, flags);
+		raw_spin_lock_irqsave(&object->lock, flags);
 		if (color_white(object) && (object->flags & OBJECT_ALLOCATED)
 		    && update_checksum(object) && get_object(object)) {
 			/* color it gray temporarily */
 			object->count = object->min_count;
 			list_add_tail(&object->gray_list, &gray_list);
 		}
-		spin_unlock_irqrestore(&object->lock, flags);
+		raw_spin_unlock_irqrestore(&object->lock, flags);
 	}
 	rcu_read_unlock();
 
@@ -1591,13 +1591,13 @@
 	 */
 	rcu_read_lock();
 	list_for_each_entry_rcu(object, &object_list, object_list) {
-		spin_lock_irqsave(&object->lock, flags);
+		raw_spin_lock_irqsave(&object->lock, flags);
 		if (unreferenced_object(object) &&
 		    !(object->flags & OBJECT_REPORTED)) {
 			object->flags |= OBJECT_REPORTED;
 			new_leaks++;
 		}
-		spin_unlock_irqrestore(&object->lock, flags);
+		raw_spin_unlock_irqrestore(&object->lock, flags);
 	}
 	rcu_read_unlock();
 
@@ -1749,10 +1749,10 @@
 	struct kmemleak_object *object = v;
 	unsigned long flags;
 
-	spin_lock_irqsave(&object->lock, flags);
+	raw_spin_lock_irqsave(&object->lock, flags);
 	if ((object->flags & OBJECT_REPORTED) && unreferenced_object(object))
 		print_unreferenced(seq, object);
-	spin_unlock_irqrestore(&object->lock, flags);
+	raw_spin_unlock_irqrestore(&object->lock, flags);
 	return 0;
 }
 
@@ -1782,9 +1782,9 @@
 		return -EINVAL;
 	}
 
-	spin_lock_irqsave(&object->lock, flags);
+	raw_spin_lock_irqsave(&object->lock, flags);
 	dump_object_info(object);
-	spin_unlock_irqrestore(&object->lock, flags);
+	raw_spin_unlock_irqrestore(&object->lock, flags);
 
 	put_object(object);
 	return 0;
@@ -1803,11 +1803,11 @@
 
 	rcu_read_lock();
 	list_for_each_entry_rcu(object, &object_list, object_list) {
-		spin_lock_irqsave(&object->lock, flags);
+		raw_spin_lock_irqsave(&object->lock, flags);
 		if ((object->flags & OBJECT_REPORTED) &&
 		    unreferenced_object(object))
 			__paint_it(object, KMEMLEAK_GREY);
-		spin_unlock_irqrestore(&object->lock, flags);
+		raw_spin_unlock_irqrestore(&object->lock, flags);
 	}
 	rcu_read_unlock();
 
diff --git a/kernel/mm/memcontrol.c b/kernel/mm/memcontrol.c
index 87cd5bf..921e450 100644
--- a/kernel/mm/memcontrol.c
+++ b/kernel/mm/memcontrol.c
@@ -69,6 +69,7 @@
 #include <net/sock.h>
 #include <net/ip.h>
 #include "slab.h"
+#include <linux/locallock.h>
 
 #include <linux/uaccess.h>
 
@@ -93,6 +94,8 @@
 #else
 #define do_swap_account		0
 #endif
+
+static DEFINE_LOCAL_IRQ_LOCK(event_lock);
 
 /* Whether legacy memory+swap accounting is active */
 static bool do_memsw_account(void)
@@ -2084,7 +2087,7 @@
 	 * as well as workers from this path always operate on the local
 	 * per-cpu data. CPU up doesn't touch memcg_stock at all.
 	 */
-	curcpu = get_cpu();
+	curcpu = get_cpu_light();
 	for_each_online_cpu(cpu) {
 		struct memcg_stock_pcp *stock = &per_cpu(memcg_stock, cpu);
 		struct mem_cgroup *memcg;
@@ -2104,7 +2107,7 @@
 		}
 		css_put(&memcg->css);
 	}
-	put_cpu();
+	put_cpu_light();
 	mutex_unlock(&percpu_charge_mutex);
 }
 
@@ -4933,12 +4936,12 @@
 
 	ret = 0;
 
-	local_irq_disable();
+	local_lock_irq(event_lock);
 	mem_cgroup_charge_statistics(to, page, compound, nr_pages);
 	memcg_check_events(to, page);
 	mem_cgroup_charge_statistics(from, page, compound, -nr_pages);
 	memcg_check_events(from, page);
-	local_irq_enable();
+	local_unlock_irq(event_lock);
 out_unlock:
 	unlock_page(page);
 out:
@@ -6057,10 +6060,10 @@
 
 	commit_charge(page, memcg, lrucare);
 
-	local_irq_disable();
+	local_lock_irq(event_lock);
 	mem_cgroup_charge_statistics(memcg, page, compound, nr_pages);
 	memcg_check_events(memcg, page);
-	local_irq_enable();
+	local_unlock_irq(event_lock);
 
 	if (do_memsw_account() && PageSwapCache(page)) {
 		swp_entry_t entry = { .val = page_private(page) };
@@ -6129,7 +6132,7 @@
 		memcg_oom_recover(ug->memcg);
 	}
 
-	local_irq_save(flags);
+	local_lock_irqsave(event_lock, flags);
 	__mod_memcg_state(ug->memcg, MEMCG_RSS, -ug->nr_anon);
 	__mod_memcg_state(ug->memcg, MEMCG_CACHE, -ug->nr_file);
 	__mod_memcg_state(ug->memcg, MEMCG_RSS_HUGE, -ug->nr_huge);
@@ -6137,7 +6140,7 @@
 	__count_memcg_events(ug->memcg, PGPGOUT, ug->pgpgout);
 	__this_cpu_add(ug->memcg->stat_cpu->nr_page_events, nr_pages);
 	memcg_check_events(ug->memcg, ug->dummy_page);
-	local_irq_restore(flags);
+	local_unlock_irqrestore(event_lock, flags);
 
 	if (!mem_cgroup_is_root(ug->memcg))
 		css_put_many(&ug->memcg->css, nr_pages);
@@ -6300,10 +6303,10 @@
 
 	commit_charge(newpage, memcg, false);
 
-	local_irq_save(flags);
+	local_lock_irqsave(event_lock, flags);
 	mem_cgroup_charge_statistics(memcg, newpage, compound, nr_pages);
 	memcg_check_events(memcg, newpage);
-	local_irq_restore(flags);
+	local_unlock_irqrestore(event_lock, flags);
 }
 
 DEFINE_STATIC_KEY_FALSE(memcg_sockets_enabled_key);
@@ -6485,6 +6488,7 @@
 	struct mem_cgroup *memcg, *swap_memcg;
 	unsigned int nr_entries;
 	unsigned short oldid;
+	unsigned long flags;
 
 	VM_BUG_ON_PAGE(PageLRU(page), page);
 	VM_BUG_ON_PAGE(page_count(page), page);
@@ -6530,10 +6534,14 @@
 	 * important here to have the interrupts disabled because it is the
 	 * only synchronisation we have for updating the per-CPU variables.
 	 */
+	local_lock_irqsave(event_lock, flags);
+#ifndef CONFIG_PREEMPT_RT_BASE
 	VM_BUG_ON(!irqs_disabled());
+#endif
 	mem_cgroup_charge_statistics(memcg, page, PageTransHuge(page),
 				     -nr_entries);
 	memcg_check_events(memcg, page);
+	local_unlock_irqrestore(event_lock, flags);
 
 	if (!mem_cgroup_is_root(memcg))
 		css_put_many(&memcg->css, nr_entries);
diff --git a/kernel/mm/mmu_context.c b/kernel/mm/mmu_context.c
index 3e612ae..d0ccc07 100644
--- a/kernel/mm/mmu_context.c
+++ b/kernel/mm/mmu_context.c
@@ -25,6 +25,7 @@
 	struct task_struct *tsk = current;
 
 	task_lock(tsk);
+	preempt_disable_rt();
 	active_mm = tsk->active_mm;
 	if (active_mm != mm) {
 		mmgrab(mm);
@@ -32,6 +33,7 @@
 	}
 	tsk->mm = mm;
 	switch_mm(active_mm, mm, tsk);
+	preempt_enable_rt();
 	task_unlock(tsk);
 #ifdef finish_arch_post_lock_switch
 	finish_arch_post_lock_switch();
diff --git a/kernel/mm/page_alloc.c b/kernel/mm/page_alloc.c
index f5d8cf7..3b5be03 100644
--- a/kernel/mm/page_alloc.c
+++ b/kernel/mm/page_alloc.c
@@ -60,6 +60,7 @@
 #include <linux/hugetlb.h>
 #include <linux/sched/rt.h>
 #include <linux/sched/mm.h>
+#include <linux/locallock.h>
 #include <linux/page_owner.h>
 #include <linux/kthread.h>
 #include <linux/memcontrol.h>
@@ -352,6 +353,18 @@
 int nr_online_nodes __read_mostly = 1;
 EXPORT_SYMBOL(nr_node_ids);
 EXPORT_SYMBOL(nr_online_nodes);
+#endif
+
+static DEFINE_LOCAL_IRQ_LOCK(pa_lock);
+
+#ifdef CONFIG_PREEMPT_RT_BASE
+# define cpu_lock_irqsave(cpu, flags)		\
+	local_lock_irqsave_on(pa_lock, flags, cpu)
+# define cpu_unlock_irqrestore(cpu, flags)	\
+	local_unlock_irqrestore_on(pa_lock, flags, cpu)
+#else
+# define cpu_lock_irqsave(cpu, flags)		local_irq_save(flags)
+# define cpu_unlock_irqrestore(cpu, flags)	local_irq_restore(flags)
 #endif
 
 int page_group_by_mobility_disabled __read_mostly;
@@ -1172,7 +1185,7 @@
 }
 
 /*
- * Frees a number of pages from the PCP lists
+ * Frees a number of pages which have been collected from the pcp lists.
  * Assumes all pages on list are in same zone, and of same order.
  * count is the number of pages to free.
  *
@@ -1182,15 +1195,57 @@
  * And clear the zone's pages_scanned counter, to hold off the "all pages are
  * pinned" detection logic.
  */
-static void free_pcppages_bulk(struct zone *zone, int count,
-					struct per_cpu_pages *pcp)
+static void free_pcppages_bulk(struct zone *zone, struct list_head *head,
+			       bool zone_retry)
+{
+	bool isolated_pageblocks;
+	struct page *page, *tmp;
+	unsigned long flags;
+
+	spin_lock_irqsave(&zone->lock, flags);
+	isolated_pageblocks = has_isolate_pageblock(zone);
+
+	/*
+	 * Use safe version since after __free_one_page(),
+	 * page->lru.next will not point to original list.
+	 */
+	list_for_each_entry_safe(page, tmp, head, lru) {
+		int mt = get_pcppage_migratetype(page);
+
+		if (page_zone(page) != zone) {
+			/*
+			 * free_unref_page_list() sorts pages by zone. If we end
+			 * up with pages from a different NUMA nodes belonging
+			 * to the same ZONE index then we need to redo with the
+			 * correct ZONE pointer. Skip the page for now, redo it
+			 * on the next iteration.
+			 */
+			WARN_ON_ONCE(zone_retry == false);
+			if (zone_retry)
+				continue;
+		}
+
+		/* MIGRATE_ISOLATE page should not go to pcplists */
+		VM_BUG_ON_PAGE(is_migrate_isolate(mt), page);
+		/* Pageblock could have been isolated meanwhile */
+		if (unlikely(isolated_pageblocks))
+			mt = get_pageblock_migratetype(page);
+
+		list_del(&page->lru);
+		__free_one_page(page, page_to_pfn(page), zone, 0, mt);
+		trace_mm_page_pcpu_drain(page, 0, mt);
+	}
+	spin_unlock_irqrestore(&zone->lock, flags);
+}
+
+static void isolate_pcp_pages(int count, struct per_cpu_pages *pcp,
+			      struct list_head *dst)
+
 {
 	int migratetype = 0;
 	int batch_free = 0;
 	int prefetch_nr = 0;
-	bool isolated_pageblocks;
-	struct page *page, *tmp;
-	LIST_HEAD(head);
+	struct page *page;
 
 	/*
 	 * Ensure proper count is passed which otherwise would stuck in the
@@ -1227,7 +1282,7 @@
 			if (bulkfree_pcp_prepare(page))
 				continue;
 
-			list_add_tail(&page->lru, &head);
+			list_add_tail(&page->lru, dst);
 
 			/*
 			 * We are going to put the page back to the global
@@ -1242,26 +1297,6 @@
 				prefetch_buddy(page);
 		} while (--count && --batch_free && !list_empty(list));
 	}
-
-	spin_lock(&zone->lock);
-	isolated_pageblocks = has_isolate_pageblock(zone);
-
-	/*
-	 * Use safe version since after __free_one_page(),
-	 * page->lru.next will not point to original list.
-	 */
-	list_for_each_entry_safe(page, tmp, &head, lru) {
-		int mt = get_pcppage_migratetype(page);
-		/* MIGRATE_ISOLATE page should not go to pcplists */
-		VM_BUG_ON_PAGE(is_migrate_isolate(mt), page);
-		/* Pageblock could have been isolated meanwhile */
-		if (unlikely(isolated_pageblocks))
-			mt = get_pageblock_migratetype(page);
-
-		__free_one_page(page, page_to_pfn(page), zone, 0, mt);
-		trace_mm_page_pcpu_drain(page, 0, mt);
-	}
-	spin_unlock(&zone->lock);
 }
 
 static void free_one_page(struct zone *zone,
@@ -1363,10 +1398,10 @@
 		return;
 
 	migratetype = get_pfnblock_migratetype(page, pfn);
-	local_irq_save(flags);
+	local_lock_irqsave(pa_lock, flags);
 	__count_vm_events(PGFREE, 1 << order);
 	free_one_page(page_zone(page), page, pfn, order, migratetype);
-	local_irq_restore(flags);
+	local_unlock_irqrestore(pa_lock, flags);
 }
 
 static void __init __free_pages_boot_core(struct page *page, unsigned int order)
@@ -2673,13 +2708,18 @@
 {
 	unsigned long flags;
 	int to_drain, batch;
+	LIST_HEAD(dst);
 
-	local_irq_save(flags);
+	local_lock_irqsave(pa_lock, flags);
 	batch = READ_ONCE(pcp->batch);
 	to_drain = min(pcp->count, batch);
 	if (to_drain > 0)
-		free_pcppages_bulk(zone, to_drain, pcp);
-	local_irq_restore(flags);
+		isolate_pcp_pages(to_drain, pcp, &dst);
+
+	local_unlock_irqrestore(pa_lock, flags);
+
+	if (to_drain > 0)
+		free_pcppages_bulk(zone, &dst, false);
 }
 #endif
 
@@ -2695,14 +2735,21 @@
 	unsigned long flags;
 	struct per_cpu_pageset *pset;
 	struct per_cpu_pages *pcp;
+	LIST_HEAD(dst);
+	int count;
 
-	local_irq_save(flags);
+	cpu_lock_irqsave(cpu, flags);
 	pset = per_cpu_ptr(zone->pageset, cpu);
 
 	pcp = &pset->pcp;
-	if (pcp->count)
-		free_pcppages_bulk(zone, pcp->count, pcp);
-	local_irq_restore(flags);
+	count = pcp->count;
+	if (count)
+		isolate_pcp_pages(count, pcp, &dst);
+
+	cpu_unlock_irqrestore(cpu, flags);
+
+	if (count)
+		free_pcppages_bulk(zone, &dst, false);
 }
 
 /*
@@ -2737,6 +2784,7 @@
 		drain_pages(cpu);
 }
 
+#ifndef CONFIG_PREEMPT_RT_BASE
 static void drain_local_pages_wq(struct work_struct *work)
 {
 	/*
@@ -2750,6 +2798,7 @@
 	drain_local_pages(NULL);
 	preempt_enable();
 }
+#endif
 
 /*
  * Spill all the per-cpu pages from all CPUs back into the buddy allocator.
@@ -2816,7 +2865,14 @@
 		else
 			cpumask_clear_cpu(cpu, &cpus_with_pcps);
 	}
-
+#ifdef CONFIG_PREEMPT_RT_BASE
+	for_each_cpu(cpu, &cpus_with_pcps) {
+		if (zone)
+			drain_pages_zone(cpu, zone);
+		else
+			drain_pages(cpu);
+	}
+#else
 	for_each_cpu(cpu, &cpus_with_pcps) {
 		struct work_struct *work = per_cpu_ptr(&pcpu_drain, cpu);
 		INIT_WORK(work, drain_local_pages_wq);
@@ -2824,6 +2880,7 @@
 	}
 	for_each_cpu(cpu, &cpus_with_pcps)
 		flush_work(per_cpu_ptr(&pcpu_drain, cpu));
+#endif
 
 	mutex_unlock(&pcpu_drain_mutex);
 }
@@ -2895,7 +2952,8 @@
 	return true;
 }
 
-static void free_unref_page_commit(struct page *page, unsigned long pfn)
+static void free_unref_page_commit(struct page *page, unsigned long pfn,
+				   struct list_head *dst)
 {
 	struct zone *zone = page_zone(page);
 	struct per_cpu_pages *pcp;
@@ -2924,7 +2982,8 @@
 	pcp->count++;
 	if (pcp->count >= pcp->high) {
 		unsigned long batch = READ_ONCE(pcp->batch);
-		free_pcppages_bulk(zone, batch, pcp);
+
+		isolate_pcp_pages(batch, pcp, dst);
 	}
 }
 
@@ -2935,13 +2994,17 @@
 {
 	unsigned long flags;
 	unsigned long pfn = page_to_pfn(page);
+	struct zone *zone = page_zone(page);
+	LIST_HEAD(dst);
 
 	if (!free_unref_page_prepare(page, pfn))
 		return;
 
-	local_irq_save(flags);
-	free_unref_page_commit(page, pfn);
-	local_irq_restore(flags);
+	local_lock_irqsave(pa_lock, flags);
+	free_unref_page_commit(page, pfn, &dst);
+	local_unlock_irqrestore(pa_lock, flags);
+	if (!list_empty(&dst))
+		free_pcppages_bulk(zone, &dst, false);
 }
 
 /*
@@ -2952,6 +3015,11 @@
 	struct page *page, *next;
 	unsigned long flags, pfn;
 	int batch_count = 0;
+	struct list_head dsts[__MAX_NR_ZONES];
+	int i;
+
+	for (i = 0; i < __MAX_NR_ZONES; i++)
+		INIT_LIST_HEAD(&dsts[i]);
 
 	/* Prepare pages for freeing */
 	list_for_each_entry_safe(page, next, list, lru) {
@@ -2961,25 +3029,42 @@
 		set_page_private(page, pfn);
 	}
 
-	local_irq_save(flags);
+	local_lock_irqsave(pa_lock, flags);
 	list_for_each_entry_safe(page, next, list, lru) {
 		unsigned long pfn = page_private(page);
+		enum zone_type type;
 
 		set_page_private(page, 0);
 		trace_mm_page_free_batched(page);
-		free_unref_page_commit(page, pfn);
+		type = page_zonenum(page);
+		free_unref_page_commit(page, pfn, &dsts[type]);
 
 		/*
 		 * Guard against excessive IRQ disabled times when we get
 		 * a large list of pages to free.
 		 */
 		if (++batch_count == SWAP_CLUSTER_MAX) {
-			local_irq_restore(flags);
+			local_unlock_irqrestore(pa_lock, flags);
 			batch_count = 0;
-			local_irq_save(flags);
+			local_lock_irqsave(pa_lock, flags);
 		}
 	}
-	local_irq_restore(flags);
+	local_unlock_irqrestore(pa_lock, flags);
+
+	for (i = 0; i < __MAX_NR_ZONES; ) {
+		struct page *page;
+		struct zone *zone;
+
+		if (list_empty(&dsts[i])) {
+			i++;
+			continue;
+		}
+
+		page = list_first_entry(&dsts[i], struct page, lru);
+		zone = page_zone(page);
+
+		free_pcppages_bulk(zone, &dsts[i], true);
+	}
 }
 
 /*
@@ -3124,7 +3209,7 @@
 	struct page *page;
 	unsigned long flags;
 
-	local_irq_save(flags);
+	local_lock_irqsave(pa_lock, flags);
 	pcp = &this_cpu_ptr(zone->pageset)->pcp;
 	page = __rmqueue_pcplist(zone,  migratetype, pcp,
 				 gfp_flags);
@@ -3132,7 +3217,7 @@
 		__count_zid_vm_events(PGALLOC, page_zonenum(page), 1 << order);
 		zone_statistics(preferred_zone, zone);
 	}
-	local_irq_restore(flags);
+	local_unlock_irqrestore(pa_lock, flags);
 	return page;
 }
 
@@ -3159,7 +3244,7 @@
 	 * allocate greater than order-1 page units with __GFP_NOFAIL.
 	 */
 	WARN_ON_ONCE((gfp_flags & __GFP_NOFAIL) && (order > 1));
-	spin_lock_irqsave(&zone->lock, flags);
+	local_spin_lock_irqsave(pa_lock, &zone->lock, flags);
 
 	do {
 		page = NULL;
@@ -3186,14 +3271,14 @@
 
 	__count_zid_vm_events(PGALLOC, page_zonenum(page), 1 << order);
 	zone_statistics(preferred_zone, zone);
-	local_irq_restore(flags);
+	local_unlock_irqrestore(pa_lock, flags);
 
 out:
 	VM_BUG_ON_PAGE(page && bad_range(zone, page), page);
 	return page;
 
 failed:
-	local_irq_restore(flags);
+	local_unlock_irqrestore(pa_lock, flags);
 	return NULL;
 }
 
@@ -7333,8 +7418,9 @@
 
 static int page_alloc_cpu_dead(unsigned int cpu)
 {
-
+	local_lock_irq_on(swapvec_lock, cpu);
 	lru_add_drain_cpu(cpu);
+	local_unlock_irq_on(swapvec_lock, cpu);
 	drain_pages(cpu);
 
 	/*
@@ -8257,7 +8343,7 @@
 	struct per_cpu_pageset *pset;
 
 	/* avoid races with drain_pages()  */
-	local_irq_save(flags);
+	local_lock_irqsave(pa_lock, flags);
 	if (zone->pageset != &boot_pageset) {
 		for_each_online_cpu(cpu) {
 			pset = per_cpu_ptr(zone->pageset, cpu);
@@ -8266,7 +8352,7 @@
 		free_percpu(zone->pageset);
 		zone->pageset = &boot_pageset;
 	}
-	local_irq_restore(flags);
+	local_unlock_irqrestore(pa_lock, flags);
 }
 
 #ifdef CONFIG_MEMORY_HOTREMOVE
diff --git a/kernel/mm/slab.c b/kernel/mm/slab.c
index 4e2be12..0081294 100644
--- a/kernel/mm/slab.c
+++ b/kernel/mm/slab.c
@@ -233,7 +233,7 @@
 	parent->shared = NULL;
 	parent->alien = NULL;
 	parent->colour_next = 0;
-	spin_lock_init(&parent->list_lock);
+	raw_spin_lock_init(&parent->list_lock);
 	parent->free_objects = 0;
 	parent->free_touched = 0;
 }
@@ -587,9 +587,9 @@
 	page_node = page_to_nid(page);
 	n = get_node(cachep, page_node);
 
-	spin_lock(&n->list_lock);
+	raw_spin_lock(&n->list_lock);
 	free_block(cachep, &objp, 1, page_node, &list);
-	spin_unlock(&n->list_lock);
+	raw_spin_unlock(&n->list_lock);
 
 	slabs_destroy(cachep, &list);
 }
@@ -718,7 +718,7 @@
 	struct kmem_cache_node *n = get_node(cachep, node);
 
 	if (ac->avail) {
-		spin_lock(&n->list_lock);
+		raw_spin_lock(&n->list_lock);
 		/*
 		 * Stuff objects into the remote nodes shared array first.
 		 * That way we could avoid the overhead of putting the objects
@@ -729,7 +729,7 @@
 
 		free_block(cachep, ac->entry, ac->avail, node, list);
 		ac->avail = 0;
-		spin_unlock(&n->list_lock);
+		raw_spin_unlock(&n->list_lock);
 	}
 }
 
@@ -802,9 +802,9 @@
 		slabs_destroy(cachep, &list);
 	} else {
 		n = get_node(cachep, page_node);
-		spin_lock(&n->list_lock);
+		raw_spin_lock(&n->list_lock);
 		free_block(cachep, &objp, 1, page_node, &list);
-		spin_unlock(&n->list_lock);
+		raw_spin_unlock(&n->list_lock);
 		slabs_destroy(cachep, &list);
 	}
 	return 1;
@@ -845,10 +845,10 @@
 	 */
 	n = get_node(cachep, node);
 	if (n) {
-		spin_lock_irq(&n->list_lock);
+		raw_spin_lock_irq(&n->list_lock);
 		n->free_limit = (1 + nr_cpus_node(node)) * cachep->batchcount +
 				cachep->num;
-		spin_unlock_irq(&n->list_lock);
+		raw_spin_unlock_irq(&n->list_lock);
 
 		return 0;
 	}
@@ -927,7 +927,7 @@
 		goto fail;
 
 	n = get_node(cachep, node);
-	spin_lock_irq(&n->list_lock);
+	raw_spin_lock_irq(&n->list_lock);
 	if (n->shared && force_change) {
 		free_block(cachep, n->shared->entry,
 				n->shared->avail, node, &list);
@@ -945,7 +945,7 @@
 		new_alien = NULL;
 	}
 
-	spin_unlock_irq(&n->list_lock);
+	raw_spin_unlock_irq(&n->list_lock);
 	slabs_destroy(cachep, &list);
 
 	/*
@@ -984,7 +984,7 @@
 		if (!n)
 			continue;
 
-		spin_lock_irq(&n->list_lock);
+		raw_spin_lock_irq(&n->list_lock);
 
 		/* Free limit for this kmem_cache_node */
 		n->free_limit -= cachep->batchcount;
@@ -997,7 +997,7 @@
 		}
 
 		if (!cpumask_empty(mask)) {
-			spin_unlock_irq(&n->list_lock);
+			raw_spin_unlock_irq(&n->list_lock);
 			goto free_slab;
 		}
 
@@ -1011,7 +1011,7 @@
 		alien = n->alien;
 		n->alien = NULL;
 
-		spin_unlock_irq(&n->list_lock);
+		raw_spin_unlock_irq(&n->list_lock);
 
 		kfree(shared);
 		if (alien) {
@@ -1195,7 +1195,7 @@
 	/*
 	 * Do not assume that spinlocks can be initialized via memcpy:
 	 */
-	spin_lock_init(&ptr->list_lock);
+	raw_spin_lock_init(&ptr->list_lock);
 
 	MAKE_ALL_LISTS(cachep, ptr, nodeid);
 	cachep->node[nodeid] = ptr;
@@ -1366,11 +1366,11 @@
 	for_each_kmem_cache_node(cachep, node, n) {
 		unsigned long total_slabs, free_slabs, free_objs;
 
-		spin_lock_irqsave(&n->list_lock, flags);
+		raw_spin_lock_irqsave(&n->list_lock, flags);
 		total_slabs = n->total_slabs;
 		free_slabs = n->free_slabs;
 		free_objs = n->free_objects;
-		spin_unlock_irqrestore(&n->list_lock, flags);
+		raw_spin_unlock_irqrestore(&n->list_lock, flags);
 
 		pr_warn("  node %d: slabs: %ld/%ld, objs: %ld/%ld\n",
 			node, total_slabs - free_slabs, total_slabs,
@@ -2173,7 +2173,7 @@
 {
 #ifdef CONFIG_SMP
 	check_irq_off();
-	assert_spin_locked(&get_node(cachep, numa_mem_id())->list_lock);
+	assert_raw_spin_locked(&get_node(cachep, numa_mem_id())->list_lock);
 #endif
 }
 
@@ -2181,7 +2181,7 @@
 {
 #ifdef CONFIG_SMP
 	check_irq_off();
-	assert_spin_locked(&get_node(cachep, node)->list_lock);
+	assert_raw_spin_locked(&get_node(cachep, node)->list_lock);
 #endif
 }
 
@@ -2221,9 +2221,9 @@
 	check_irq_off();
 	ac = cpu_cache_get(cachep);
 	n = get_node(cachep, node);
-	spin_lock(&n->list_lock);
+	raw_spin_lock(&n->list_lock);
 	free_block(cachep, ac->entry, ac->avail, node, &list);
-	spin_unlock(&n->list_lock);
+	raw_spin_unlock(&n->list_lock);
 	slabs_destroy(cachep, &list);
 	ac->avail = 0;
 }
@@ -2241,9 +2241,9 @@
 			drain_alien_cache(cachep, n->alien);
 
 	for_each_kmem_cache_node(cachep, node, n) {
-		spin_lock_irq(&n->list_lock);
+		raw_spin_lock_irq(&n->list_lock);
 		drain_array_locked(cachep, n->shared, node, true, &list);
-		spin_unlock_irq(&n->list_lock);
+		raw_spin_unlock_irq(&n->list_lock);
 
 		slabs_destroy(cachep, &list);
 	}
@@ -2265,10 +2265,10 @@
 	nr_freed = 0;
 	while (nr_freed < tofree && !list_empty(&n->slabs_free)) {
 
-		spin_lock_irq(&n->list_lock);
+		raw_spin_lock_irq(&n->list_lock);
 		p = n->slabs_free.prev;
 		if (p == &n->slabs_free) {
-			spin_unlock_irq(&n->list_lock);
+			raw_spin_unlock_irq(&n->list_lock);
 			goto out;
 		}
 
@@ -2281,7 +2281,7 @@
 		 * to the cache.
 		 */
 		n->free_objects -= cache->num;
-		spin_unlock_irq(&n->list_lock);
+		raw_spin_unlock_irq(&n->list_lock);
 		slab_destroy(cache, page);
 		nr_freed++;
 	}
@@ -2735,7 +2735,7 @@
 	INIT_LIST_HEAD(&page->lru);
 	n = get_node(cachep, page_to_nid(page));
 
-	spin_lock(&n->list_lock);
+	raw_spin_lock(&n->list_lock);
 	n->total_slabs++;
 	if (!page->active) {
 		list_add_tail(&page->lru, &(n->slabs_free));
@@ -2745,7 +2745,7 @@
 
 	STATS_INC_GROWN(cachep);
 	n->free_objects += cachep->num - page->active;
-	spin_unlock(&n->list_lock);
+	raw_spin_unlock(&n->list_lock);
 
 	fixup_objfreelist_debug(cachep, &list);
 }
@@ -2913,7 +2913,7 @@
 {
 	struct page *page;
 
-	assert_spin_locked(&n->list_lock);
+	assert_raw_spin_locked(&n->list_lock);
 	page = list_first_entry_or_null(&n->slabs_partial, struct page, lru);
 	if (!page) {
 		n->free_touched = 1;
@@ -2939,10 +2939,10 @@
 	if (!gfp_pfmemalloc_allowed(flags))
 		return NULL;
 
-	spin_lock(&n->list_lock);
+	raw_spin_lock(&n->list_lock);
 	page = get_first_slab(n, true);
 	if (!page) {
-		spin_unlock(&n->list_lock);
+		raw_spin_unlock(&n->list_lock);
 		return NULL;
 	}
 
@@ -2951,7 +2951,7 @@
 
 	fixup_slab_list(cachep, n, page, &list);
 
-	spin_unlock(&n->list_lock);
+	raw_spin_unlock(&n->list_lock);
 	fixup_objfreelist_debug(cachep, &list);
 
 	return obj;
@@ -3010,7 +3010,7 @@
 	if (!n->free_objects && (!shared || !shared->avail))
 		goto direct_grow;
 
-	spin_lock(&n->list_lock);
+	raw_spin_lock(&n->list_lock);
 	shared = READ_ONCE(n->shared);
 
 	/* See if we can refill from the shared array */
@@ -3034,7 +3034,7 @@
 must_grow:
 	n->free_objects -= ac->avail;
 alloc_done:
-	spin_unlock(&n->list_lock);
+	raw_spin_unlock(&n->list_lock);
 	fixup_objfreelist_debug(cachep, &list);
 
 direct_grow:
@@ -3259,7 +3259,7 @@
 	BUG_ON(!n);
 
 	check_irq_off();
-	spin_lock(&n->list_lock);
+	raw_spin_lock(&n->list_lock);
 	page = get_first_slab(n, false);
 	if (!page)
 		goto must_grow;
@@ -3277,12 +3277,12 @@
 
 	fixup_slab_list(cachep, n, page, &list);
 
-	spin_unlock(&n->list_lock);
+	raw_spin_unlock(&n->list_lock);
 	fixup_objfreelist_debug(cachep, &list);
 	return obj;
 
 must_grow:
-	spin_unlock(&n->list_lock);
+	raw_spin_unlock(&n->list_lock);
 	page = cache_grow_begin(cachep, gfp_exact_node(flags), nodeid);
 	if (page) {
 		/* This slab isn't counted yet so don't update free_objects */
@@ -3458,7 +3458,7 @@
 
 	check_irq_off();
 	n = get_node(cachep, node);
-	spin_lock(&n->list_lock);
+	raw_spin_lock(&n->list_lock);
 	if (n->shared) {
 		struct array_cache *shared_array = n->shared;
 		int max = shared_array->limit - shared_array->avail;
@@ -3487,7 +3487,7 @@
 		STATS_SET_FREEABLE(cachep, i);
 	}
 #endif
-	spin_unlock(&n->list_lock);
+	raw_spin_unlock(&n->list_lock);
 	slabs_destroy(cachep, &list);
 	ac->avail -= batchcount;
 	memmove(ac->entry, &(ac->entry[batchcount]), sizeof(void *)*ac->avail);
@@ -3897,9 +3897,9 @@
 
 		node = cpu_to_mem(cpu);
 		n = get_node(cachep, node);
-		spin_lock_irq(&n->list_lock);
+		raw_spin_lock_irq(&n->list_lock);
 		free_block(cachep, ac->entry, ac->avail, node, &list);
-		spin_unlock_irq(&n->list_lock);
+		raw_spin_unlock_irq(&n->list_lock);
 		slabs_destroy(cachep, &list);
 	}
 	free_percpu(prev);
@@ -4024,9 +4024,9 @@
 		return;
 	}
 
-	spin_lock_irq(&n->list_lock);
+	raw_spin_lock_irq(&n->list_lock);
 	drain_array_locked(cachep, ac, node, false, &list);
-	spin_unlock_irq(&n->list_lock);
+	raw_spin_unlock_irq(&n->list_lock);
 
 	slabs_destroy(cachep, &list);
 }
@@ -4110,7 +4110,7 @@
 
 	for_each_kmem_cache_node(cachep, node, n) {
 		check_irq_on();
-		spin_lock_irq(&n->list_lock);
+		raw_spin_lock_irq(&n->list_lock);
 
 		total_slabs += n->total_slabs;
 		free_slabs += n->free_slabs;
@@ -4119,7 +4119,7 @@
 		if (n->shared)
 			shared_avail += n->shared->avail;
 
-		spin_unlock_irq(&n->list_lock);
+		raw_spin_unlock_irq(&n->list_lock);
 	}
 	num_objs = total_slabs * cachep->num;
 	active_slabs = total_slabs - free_slabs;
@@ -4339,13 +4339,13 @@
 		for_each_kmem_cache_node(cachep, node, n) {
 
 			check_irq_on();
-			spin_lock_irq(&n->list_lock);
+			raw_spin_lock_irq(&n->list_lock);
 
 			list_for_each_entry(page, &n->slabs_full, lru)
 				handle_slab(x, cachep, page);
 			list_for_each_entry(page, &n->slabs_partial, lru)
 				handle_slab(x, cachep, page);
-			spin_unlock_irq(&n->list_lock);
+			raw_spin_unlock_irq(&n->list_lock);
 		}
 	} while (!is_store_user_clean(cachep));
 
diff --git a/kernel/mm/slab.h b/kernel/mm/slab.h
index 77a1a26..5b17c02 100644
--- a/kernel/mm/slab.h
+++ b/kernel/mm/slab.h
@@ -452,7 +452,7 @@
  * The slab lists for all objects.
  */
 struct kmem_cache_node {
-	spinlock_t list_lock;
+	raw_spinlock_t list_lock;
 
 #ifdef CONFIG_SLAB
 	struct list_head slabs_partial;	/* partial list first, better asm code */
diff --git a/kernel/mm/slub.c b/kernel/mm/slub.c
index 6b58391..f35fa1a 100644
--- a/kernel/mm/slub.c
+++ b/kernel/mm/slub.c
@@ -1199,7 +1199,7 @@
 	unsigned long uninitialized_var(flags);
 	int ret = 0;
 
-	spin_lock_irqsave(&n->list_lock, flags);
+	raw_spin_lock_irqsave(&n->list_lock, flags);
 	slab_lock(page);
 
 	if (s->flags & SLAB_CONSISTENCY_CHECKS) {
@@ -1234,7 +1234,7 @@
 			 bulk_cnt, cnt);
 
 	slab_unlock(page);
-	spin_unlock_irqrestore(&n->list_lock, flags);
+	raw_spin_unlock_irqrestore(&n->list_lock, flags);
 	if (!ret)
 		slab_fix(s, "Object at 0x%p not freed", object);
 	return ret;
@@ -1372,6 +1372,12 @@
 	return false;
 }
 #endif /* CONFIG_SLUB_DEBUG */
+
+struct slub_free_list {
+	raw_spinlock_t		lock;
+	struct list_head	list;
+};
+static DEFINE_PER_CPU(struct slub_free_list, slub_free_list);
 
 /*
  * Hooks for other subsystems that check memory allocations. In a typical
@@ -1619,10 +1625,17 @@
 	void *start, *p, *next;
 	int idx, order;
 	bool shuffle;
+	bool enableirqs = false;
 
 	flags &= gfp_allowed_mask;
 
 	if (gfpflags_allow_blocking(flags))
+		enableirqs = true;
+#ifdef CONFIG_PREEMPT_RT_FULL
+	if (system_state > SYSTEM_BOOTING)
+		enableirqs = true;
+#endif
+	if (enableirqs)
 		local_irq_enable();
 
 	flags |= s->allocflags;
@@ -1682,7 +1695,7 @@
 	page->frozen = 1;
 
 out:
-	if (gfpflags_allow_blocking(flags))
+	if (enableirqs)
 		local_irq_disable();
 	if (!page)
 		return NULL;
@@ -1740,6 +1753,16 @@
 	__free_pages(page, order);
 }
 
+static void free_delayed(struct list_head *h)
+{
+	while (!list_empty(h)) {
+		struct page *page = list_first_entry(h, struct page, lru);
+
+		list_del(&page->lru);
+		__free_slab(page->slab_cache, page);
+	}
+}
+
 static void rcu_free_slab(struct rcu_head *h)
 {
 	struct page *page = container_of(h, struct page, rcu_head);
@@ -1751,6 +1774,12 @@
 {
 	if (unlikely(s->flags & SLAB_TYPESAFE_BY_RCU)) {
 		call_rcu(&page->rcu_head, rcu_free_slab);
+	} else if (irqs_disabled()) {
+		struct slub_free_list *f = this_cpu_ptr(&slub_free_list);
+
+		raw_spin_lock(&f->lock);
+		list_add(&page->lru, &f->list);
+		raw_spin_unlock(&f->lock);
 	} else
 		__free_slab(s, page);
 }
@@ -1858,7 +1887,7 @@
 	if (!n || !n->nr_partial)
 		return NULL;
 
-	spin_lock(&n->list_lock);
+	raw_spin_lock(&n->list_lock);
 	list_for_each_entry_safe(page, page2, &n->partial, lru) {
 		void *t;
 
@@ -1883,7 +1912,7 @@
 			break;
 
 	}
-	spin_unlock(&n->list_lock);
+	raw_spin_unlock(&n->list_lock);
 	return object;
 }
 
@@ -2135,7 +2164,7 @@
 			 * that acquire_slab() will see a slab page that
 			 * is frozen
 			 */
-			spin_lock(&n->list_lock);
+			raw_spin_lock(&n->list_lock);
 		}
 	} else {
 		m = M_FULL;
@@ -2146,7 +2175,7 @@
 			 * slabs from diagnostic functions will not see
 			 * any frozen slabs.
 			 */
-			spin_lock(&n->list_lock);
+			raw_spin_lock(&n->list_lock);
 		}
 	}
 
@@ -2181,7 +2210,7 @@
 		goto redo;
 
 	if (lock)
-		spin_unlock(&n->list_lock);
+		raw_spin_unlock(&n->list_lock);
 
 	if (m == M_FREE) {
 		stat(s, DEACTIVATE_EMPTY);
@@ -2216,10 +2245,10 @@
 		n2 = get_node(s, page_to_nid(page));
 		if (n != n2) {
 			if (n)
-				spin_unlock(&n->list_lock);
+				raw_spin_unlock(&n->list_lock);
 
 			n = n2;
-			spin_lock(&n->list_lock);
+			raw_spin_lock(&n->list_lock);
 		}
 
 		do {
@@ -2248,7 +2277,7 @@
 	}
 
 	if (n)
-		spin_unlock(&n->list_lock);
+		raw_spin_unlock(&n->list_lock);
 
 	while (discard_page) {
 		page = discard_page;
@@ -2285,14 +2314,21 @@
 			pobjects = oldpage->pobjects;
 			pages = oldpage->pages;
 			if (drain && pobjects > s->cpu_partial) {
+				struct slub_free_list *f;
 				unsigned long flags;
+				LIST_HEAD(tofree);
 				/*
 				 * partial array is full. Move the existing
 				 * set to the per node partial list.
 				 */
 				local_irq_save(flags);
 				unfreeze_partials(s, this_cpu_ptr(s->cpu_slab));
+				f = this_cpu_ptr(&slub_free_list);
+				raw_spin_lock(&f->lock);
+				list_splice_init(&f->list, &tofree);
+				raw_spin_unlock(&f->lock);
 				local_irq_restore(flags);
+				free_delayed(&tofree);
 				oldpage = NULL;
 				pobjects = 0;
 				pages = 0;
@@ -2362,7 +2398,19 @@
 
 static void flush_all(struct kmem_cache *s)
 {
+	LIST_HEAD(tofree);
+	int cpu;
+
 	on_each_cpu_cond(has_cpu_slab, flush_cpu_slab, s, 1, GFP_ATOMIC);
+	for_each_online_cpu(cpu) {
+		struct slub_free_list *f;
+
+		f = &per_cpu(slub_free_list, cpu);
+		raw_spin_lock_irq(&f->lock);
+		list_splice_init(&f->list, &tofree);
+		raw_spin_unlock_irq(&f->lock);
+		free_delayed(&tofree);
+	}
 }
 
 /*
@@ -2417,10 +2465,10 @@
 	unsigned long x = 0;
 	struct page *page;
 
-	spin_lock_irqsave(&n->list_lock, flags);
+	raw_spin_lock_irqsave(&n->list_lock, flags);
 	list_for_each_entry(page, &n->partial, lru)
 		x += get_count(page);
-	spin_unlock_irqrestore(&n->list_lock, flags);
+	raw_spin_unlock_irqrestore(&n->list_lock, flags);
 	return x;
 }
 #endif /* CONFIG_SLUB_DEBUG || CONFIG_SLUB_SYSFS */
@@ -2560,8 +2608,10 @@
  * already disabled (which is the case for bulk allocation).
  */
 static void *___slab_alloc(struct kmem_cache *s, gfp_t gfpflags, int node,
-			  unsigned long addr, struct kmem_cache_cpu *c)
+			  unsigned long addr, struct kmem_cache_cpu *c,
+			  struct list_head *to_free)
 {
+	struct slub_free_list *f;
 	void *freelist;
 	struct page *page;
 
@@ -2627,6 +2677,13 @@
 	VM_BUG_ON(!c->page->frozen);
 	c->freelist = get_freepointer(s, freelist);
 	c->tid = next_tid(c->tid);
+
+out:
+	f = this_cpu_ptr(&slub_free_list);
+	raw_spin_lock(&f->lock);
+	list_splice_init(&f->list, to_free);
+	raw_spin_unlock(&f->lock);
+
 	return freelist;
 
 new_slab:
@@ -2642,7 +2699,7 @@
 
 	if (unlikely(!freelist)) {
 		slab_out_of_memory(s, gfpflags, node);
-		return NULL;
+		goto out;
 	}
 
 	page = c->page;
@@ -2655,7 +2712,7 @@
 		goto new_slab;	/* Slab failed checks. Next slab needed */
 
 	deactivate_slab(s, page, get_freepointer(s, freelist), c);
-	return freelist;
+	goto out;
 }
 
 /*
@@ -2667,6 +2724,7 @@
 {
 	void *p;
 	unsigned long flags;
+	LIST_HEAD(tofree);
 
 	local_irq_save(flags);
 #ifdef CONFIG_PREEMPT
@@ -2678,8 +2736,9 @@
 	c = this_cpu_ptr(s->cpu_slab);
 #endif
 
-	p = ___slab_alloc(s, gfpflags, node, addr, c);
+	p = ___slab_alloc(s, gfpflags, node, addr, c, &tofree);
 	local_irq_restore(flags);
+	free_delayed(&tofree);
 	return p;
 }
 
@@ -2878,7 +2937,7 @@
 
 	do {
 		if (unlikely(n)) {
-			spin_unlock_irqrestore(&n->list_lock, flags);
+			raw_spin_unlock_irqrestore(&n->list_lock, flags);
 			n = NULL;
 		}
 		prior = page->freelist;
@@ -2910,7 +2969,7 @@
 				 * Otherwise the list_lock will synchronize with
 				 * other processors updating the list of slabs.
 				 */
-				spin_lock_irqsave(&n->list_lock, flags);
+				raw_spin_lock_irqsave(&n->list_lock, flags);
 
 			}
 		}
@@ -2952,7 +3011,7 @@
 		add_partial(n, page, DEACTIVATE_TO_TAIL);
 		stat(s, FREE_ADD_PARTIAL);
 	}
-	spin_unlock_irqrestore(&n->list_lock, flags);
+	raw_spin_unlock_irqrestore(&n->list_lock, flags);
 	return;
 
 slab_empty:
@@ -2967,7 +3026,7 @@
 		remove_full(s, n, page);
 	}
 
-	spin_unlock_irqrestore(&n->list_lock, flags);
+	raw_spin_unlock_irqrestore(&n->list_lock, flags);
 	stat(s, FREE_SLAB);
 	discard_slab(s, page);
 }
@@ -3172,6 +3231,7 @@
 			  void **p)
 {
 	struct kmem_cache_cpu *c;
+	LIST_HEAD(to_free);
 	int i;
 
 	/* memcg and kmem_cache debug support */
@@ -3204,7 +3264,7 @@
 			 * of re-populating per CPU c->freelist
 			 */
 			p[i] = ___slab_alloc(s, flags, NUMA_NO_NODE,
-					    _RET_IP_, c);
+					    _RET_IP_, c, &to_free);
 			if (unlikely(!p[i]))
 				goto error;
 
@@ -3219,6 +3279,7 @@
 	}
 	c->tid = next_tid(c->tid);
 	local_irq_enable();
+	free_delayed(&to_free);
 
 	/* Clear memory outside IRQ disabled fastpath loop */
 	if (unlikely(slab_want_init_on_alloc(flags, s))) {
@@ -3233,6 +3294,7 @@
 	return i;
 error:
 	local_irq_enable();
+	free_delayed(&to_free);
 	slab_post_alloc_hook(s, flags, i, p);
 	__kmem_cache_free_bulk(s, i, p);
 	return 0;
@@ -3368,7 +3430,7 @@
 init_kmem_cache_node(struct kmem_cache_node *n)
 {
 	n->nr_partial = 0;
-	spin_lock_init(&n->list_lock);
+	raw_spin_lock_init(&n->list_lock);
 	INIT_LIST_HEAD(&n->partial);
 #ifdef CONFIG_SLUB_DEBUG
 	atomic_long_set(&n->nr_slabs, 0);
@@ -3721,6 +3783,11 @@
 							const char *text)
 {
 #ifdef CONFIG_SLUB_DEBUG
+#ifdef CONFIG_PREEMPT_RT_BASE
+	/* XXX move out of irq-off section */
+	slab_err(s, page, text, s->name);
+#else
+
 	void *addr = page_address(page);
 	void *p;
 	unsigned long *map = kcalloc(BITS_TO_LONGS(page->objects),
@@ -3742,6 +3809,7 @@
 	slab_unlock(page);
 	kfree(map);
 #endif
+#endif
 }
 
 /*
@@ -3755,7 +3823,7 @@
 	struct page *page, *h;
 
 	BUG_ON(irqs_disabled());
-	spin_lock_irq(&n->list_lock);
+	raw_spin_lock_irq(&n->list_lock);
 	list_for_each_entry_safe(page, h, &n->partial, lru) {
 		if (!page->inuse) {
 			remove_partial(n, page);
@@ -3765,7 +3833,7 @@
 			"Objects remaining in %s on __kmem_cache_shutdown()");
 		}
 	}
-	spin_unlock_irq(&n->list_lock);
+	raw_spin_unlock_irq(&n->list_lock);
 
 	list_for_each_entry_safe(page, h, &discard, lru)
 		discard_slab(s, page);
@@ -4039,7 +4107,7 @@
 		for (i = 0; i < SHRINK_PROMOTE_MAX; i++)
 			INIT_LIST_HEAD(promote + i);
 
-		spin_lock_irqsave(&n->list_lock, flags);
+		raw_spin_lock_irqsave(&n->list_lock, flags);
 
 		/*
 		 * Build lists of slabs to discard or promote.
@@ -4070,7 +4138,7 @@
 		for (i = SHRINK_PROMOTE_MAX - 1; i >= 0; i--)
 			list_splice(promote + i, &n->partial);
 
-		spin_unlock_irqrestore(&n->list_lock, flags);
+		raw_spin_unlock_irqrestore(&n->list_lock, flags);
 
 		/* Release empty slabs */
 		list_for_each_entry_safe(page, t, &discard, lru)
@@ -4283,6 +4351,12 @@
 {
 	static __initdata struct kmem_cache boot_kmem_cache,
 		boot_kmem_cache_node;
+	int cpu;
+
+	for_each_possible_cpu(cpu) {
+		raw_spin_lock_init(&per_cpu(slub_free_list, cpu).lock);
+		INIT_LIST_HEAD(&per_cpu(slub_free_list, cpu).list);
+	}
 
 	if (debug_guardpage_minorder())
 		slub_max_order = 0;
@@ -4486,7 +4560,7 @@
 	struct page *page;
 	unsigned long flags;
 
-	spin_lock_irqsave(&n->list_lock, flags);
+	raw_spin_lock_irqsave(&n->list_lock, flags);
 
 	list_for_each_entry(page, &n->partial, lru) {
 		validate_slab_slab(s, page, map);
@@ -4508,7 +4582,7 @@
 		       s->name, count, atomic_long_read(&n->nr_slabs));
 
 out:
-	spin_unlock_irqrestore(&n->list_lock, flags);
+	raw_spin_unlock_irqrestore(&n->list_lock, flags);
 	return count;
 }
 
@@ -4564,6 +4638,9 @@
 {
 	struct location *l;
 	int order;
+
+	if (IS_ENABLED(CONFIG_PREEMPT_RT) && flags == GFP_ATOMIC)
+		return 0;
 
 	order = get_order(sizeof(struct location) * max);
 
@@ -4698,12 +4775,12 @@
 		if (!atomic_long_read(&n->nr_slabs))
 			continue;
 
-		spin_lock_irqsave(&n->list_lock, flags);
+		raw_spin_lock_irqsave(&n->list_lock, flags);
 		list_for_each_entry(page, &n->partial, lru)
 			process_slab(&t, s, page, alloc, map);
 		list_for_each_entry(page, &n->full, lru)
 			process_slab(&t, s, page, alloc, map);
-		spin_unlock_irqrestore(&n->list_lock, flags);
+		raw_spin_unlock_irqrestore(&n->list_lock, flags);
 	}
 
 	for (i = 0; i < t.count; i++) {
diff --git a/kernel/mm/swap.c b/kernel/mm/swap.c
index 45fdbfb..3885645 100644
--- a/kernel/mm/swap.c
+++ b/kernel/mm/swap.c
@@ -33,6 +33,7 @@
 #include <linux/memcontrol.h>
 #include <linux/gfp.h>
 #include <linux/uio.h>
+#include <linux/locallock.h>
 #include <linux/hugetlb.h>
 #include <linux/page_idle.h>
 
@@ -51,6 +52,8 @@
 #ifdef CONFIG_SMP
 static DEFINE_PER_CPU(struct pagevec, activate_page_pvecs);
 #endif
+static DEFINE_LOCAL_IRQ_LOCK(rotate_lock);
+DEFINE_LOCAL_IRQ_LOCK(swapvec_lock);
 
 /*
  * This path almost never happens for VM activity - pages are normally
@@ -253,11 +256,11 @@
 		unsigned long flags;
 
 		get_page(page);
-		local_irq_save(flags);
+		local_lock_irqsave(rotate_lock, flags);
 		pvec = this_cpu_ptr(&lru_rotate_pvecs);
 		if (!pagevec_add(pvec, page) || PageCompound(page))
 			pagevec_move_tail(pvec);
-		local_irq_restore(flags);
+		local_unlock_irqrestore(rotate_lock, flags);
 	}
 }
 
@@ -307,12 +310,13 @@
 {
 	page = compound_head(page);
 	if (PageLRU(page) && !PageActive(page) && !PageUnevictable(page)) {
-		struct pagevec *pvec = &get_cpu_var(activate_page_pvecs);
+		struct pagevec *pvec = &get_locked_var(swapvec_lock,
+						       activate_page_pvecs);
 
 		get_page(page);
 		if (!pagevec_add(pvec, page) || PageCompound(page))
 			pagevec_lru_move_fn(pvec, __activate_page, NULL);
-		put_cpu_var(activate_page_pvecs);
+		put_locked_var(swapvec_lock, activate_page_pvecs);
 	}
 }
 
@@ -334,7 +338,7 @@
 
 static void __lru_cache_activate_page(struct page *page)
 {
-	struct pagevec *pvec = &get_cpu_var(lru_add_pvec);
+	struct pagevec *pvec = &get_locked_var(swapvec_lock, lru_add_pvec);
 	int i;
 
 	/*
@@ -356,7 +360,7 @@
 		}
 	}
 
-	put_cpu_var(lru_add_pvec);
+	put_locked_var(swapvec_lock, lru_add_pvec);
 }
 
 /*
@@ -398,12 +402,12 @@
 
 static void __lru_cache_add(struct page *page)
 {
-	struct pagevec *pvec = &get_cpu_var(lru_add_pvec);
+	struct pagevec *pvec = &get_locked_var(swapvec_lock, lru_add_pvec);
 
 	get_page(page);
 	if (!pagevec_add(pvec, page) || PageCompound(page))
 		__pagevec_lru_add(pvec);
-	put_cpu_var(lru_add_pvec);
+	put_locked_var(swapvec_lock, lru_add_pvec);
 }
 
 /**
@@ -581,9 +585,15 @@
 		unsigned long flags;
 
 		/* No harm done if a racing interrupt already did this */
-		local_irq_save(flags);
+#ifdef CONFIG_PREEMPT_RT_BASE
+		local_lock_irqsave_on(rotate_lock, flags, cpu);
 		pagevec_move_tail(pvec);
-		local_irq_restore(flags);
+		local_unlock_irqrestore_on(rotate_lock, flags, cpu);
+#else
+		local_lock_irqsave(rotate_lock, flags);
+		pagevec_move_tail(pvec);
+		local_unlock_irqrestore(rotate_lock, flags);
+#endif
 	}
 
 	pvec = &per_cpu(lru_deactivate_file_pvecs, cpu);
@@ -615,11 +625,12 @@
 		return;
 
 	if (likely(get_page_unless_zero(page))) {
-		struct pagevec *pvec = &get_cpu_var(lru_deactivate_file_pvecs);
+		struct pagevec *pvec = &get_locked_var(swapvec_lock,
+						       lru_deactivate_file_pvecs);
 
 		if (!pagevec_add(pvec, page) || PageCompound(page))
 			pagevec_lru_move_fn(pvec, lru_deactivate_file_fn, NULL);
-		put_cpu_var(lru_deactivate_file_pvecs);
+		put_locked_var(swapvec_lock, lru_deactivate_file_pvecs);
 	}
 }
 
@@ -634,22 +645,33 @@
 {
 	if (PageLRU(page) && PageAnon(page) && PageSwapBacked(page) &&
 	    !PageSwapCache(page) && !PageUnevictable(page)) {
-		struct pagevec *pvec = &get_cpu_var(lru_lazyfree_pvecs);
+		struct pagevec *pvec = &get_locked_var(swapvec_lock,
+						       lru_lazyfree_pvecs);
 
 		get_page(page);
 		if (!pagevec_add(pvec, page) || PageCompound(page))
 			pagevec_lru_move_fn(pvec, lru_lazyfree_fn, NULL);
-		put_cpu_var(lru_lazyfree_pvecs);
+		put_locked_var(swapvec_lock, lru_lazyfree_pvecs);
 	}
 }
 
 void lru_add_drain(void)
 {
-	lru_add_drain_cpu(get_cpu());
-	put_cpu();
+	lru_add_drain_cpu(local_lock_cpu(swapvec_lock));
+	local_unlock_cpu(swapvec_lock);
 }
 
 #ifdef CONFIG_SMP
+
+#ifdef CONFIG_PREEMPT_RT_BASE
+static inline void remote_lru_add_drain(int cpu, struct cpumask *has_work)
+{
+	local_lock_on(swapvec_lock, cpu);
+	lru_add_drain_cpu(cpu);
+	local_unlock_on(swapvec_lock, cpu);
+}
+
+#else
 
 static DEFINE_PER_CPU(struct work_struct, lru_add_drain_work);
 
@@ -657,6 +679,16 @@
 {
 	lru_add_drain();
 }
+
+static inline void remote_lru_add_drain(int cpu, struct cpumask *has_work)
+{
+	struct work_struct *work = &per_cpu(lru_add_drain_work, cpu);
+
+	INIT_WORK(work, lru_add_drain_per_cpu);
+	queue_work_on(cpu, mm_percpu_wq, work);
+	cpumask_set_cpu(cpu, has_work);
+}
+#endif
 
 /*
  * Doesn't need any cpu hotplug locking because we do rely on per-cpu
@@ -682,21 +714,19 @@
 	cpumask_clear(&has_work);
 
 	for_each_online_cpu(cpu) {
-		struct work_struct *work = &per_cpu(lru_add_drain_work, cpu);
 
 		if (pagevec_count(&per_cpu(lru_add_pvec, cpu)) ||
 		    pagevec_count(&per_cpu(lru_rotate_pvecs, cpu)) ||
 		    pagevec_count(&per_cpu(lru_deactivate_file_pvecs, cpu)) ||
 		    pagevec_count(&per_cpu(lru_lazyfree_pvecs, cpu)) ||
-		    need_activate_page_drain(cpu)) {
-			INIT_WORK(work, lru_add_drain_per_cpu);
-			queue_work_on(cpu, mm_percpu_wq, work);
-			cpumask_set_cpu(cpu, &has_work);
-		}
+		    need_activate_page_drain(cpu))
+			remote_lru_add_drain(cpu, &has_work);
 	}
 
+#ifndef CONFIG_PREEMPT_RT_BASE
 	for_each_cpu(cpu, &has_work)
 		flush_work(&per_cpu(lru_add_drain_work, cpu));
+#endif
 
 	mutex_unlock(&lock);
 }
diff --git a/kernel/mm/vmalloc.c b/kernel/mm/vmalloc.c
index 3a57f92..3eb3f16 100644
--- a/kernel/mm/vmalloc.c
+++ b/kernel/mm/vmalloc.c
@@ -860,7 +860,7 @@
 	struct vmap_block *vb;
 	struct vmap_area *va;
 	unsigned long vb_idx;
-	int node, err;
+	int node, err, cpu;
 	void *vaddr;
 
 	node = numa_node_id();
@@ -903,11 +903,12 @@
 	BUG_ON(err);
 	radix_tree_preload_end();
 
-	vbq = &get_cpu_var(vmap_block_queue);
+	cpu = get_cpu_light();
+	vbq = this_cpu_ptr(&vmap_block_queue);
 	spin_lock(&vbq->lock);
 	list_add_tail_rcu(&vb->free_list, &vbq->free);
 	spin_unlock(&vbq->lock);
-	put_cpu_var(vmap_block_queue);
+	put_cpu_light();
 
 	return vaddr;
 }
@@ -976,6 +977,7 @@
 	struct vmap_block *vb;
 	void *vaddr = NULL;
 	unsigned int order;
+	int cpu;
 
 	BUG_ON(offset_in_page(size));
 	BUG_ON(size > PAGE_SIZE*VMAP_MAX_ALLOC);
@@ -990,7 +992,8 @@
 	order = get_order(size);
 
 	rcu_read_lock();
-	vbq = &get_cpu_var(vmap_block_queue);
+	cpu = get_cpu_light();
+	vbq = this_cpu_ptr(&vmap_block_queue);
 	list_for_each_entry_rcu(vb, &vbq->free, free_list) {
 		unsigned long pages_off;
 
@@ -1013,7 +1016,7 @@
 		break;
 	}
 
-	put_cpu_var(vmap_block_queue);
+	put_cpu_light();
 	rcu_read_unlock();
 
 	/* Allocate new block if nothing was found */
diff --git a/kernel/mm/vmstat.c b/kernel/mm/vmstat.c
index d139fd9..444915b 100644
--- a/kernel/mm/vmstat.c
+++ b/kernel/mm/vmstat.c
@@ -320,6 +320,7 @@
 	long x;
 	long t;
 
+	preempt_disable_rt();
 	x = delta + __this_cpu_read(*p);
 
 	t = __this_cpu_read(pcp->stat_threshold);
@@ -329,6 +330,7 @@
 		x = 0;
 	}
 	__this_cpu_write(*p, x);
+	preempt_enable_rt();
 }
 EXPORT_SYMBOL(__mod_zone_page_state);
 
@@ -340,6 +342,7 @@
 	long x;
 	long t;
 
+	preempt_disable_rt();
 	x = delta + __this_cpu_read(*p);
 
 	t = __this_cpu_read(pcp->stat_threshold);
@@ -349,6 +352,7 @@
 		x = 0;
 	}
 	__this_cpu_write(*p, x);
+	preempt_enable_rt();
 }
 EXPORT_SYMBOL(__mod_node_page_state);
 
@@ -381,6 +385,7 @@
 	s8 __percpu *p = pcp->vm_stat_diff + item;
 	s8 v, t;
 
+	preempt_disable_rt();
 	v = __this_cpu_inc_return(*p);
 	t = __this_cpu_read(pcp->stat_threshold);
 	if (unlikely(v > t)) {
@@ -389,6 +394,7 @@
 		zone_page_state_add(v + overstep, zone, item);
 		__this_cpu_write(*p, -overstep);
 	}
+	preempt_enable_rt();
 }
 
 void __inc_node_state(struct pglist_data *pgdat, enum node_stat_item item)
@@ -397,6 +403,7 @@
 	s8 __percpu *p = pcp->vm_node_stat_diff + item;
 	s8 v, t;
 
+	preempt_disable_rt();
 	v = __this_cpu_inc_return(*p);
 	t = __this_cpu_read(pcp->stat_threshold);
 	if (unlikely(v > t)) {
@@ -405,6 +412,7 @@
 		node_page_state_add(v + overstep, pgdat, item);
 		__this_cpu_write(*p, -overstep);
 	}
+	preempt_enable_rt();
 }
 
 void __inc_zone_page_state(struct page *page, enum zone_stat_item item)
@@ -425,6 +433,7 @@
 	s8 __percpu *p = pcp->vm_stat_diff + item;
 	s8 v, t;
 
+	preempt_disable_rt();
 	v = __this_cpu_dec_return(*p);
 	t = __this_cpu_read(pcp->stat_threshold);
 	if (unlikely(v < - t)) {
@@ -433,6 +442,7 @@
 		zone_page_state_add(v - overstep, zone, item);
 		__this_cpu_write(*p, overstep);
 	}
+	preempt_enable_rt();
 }
 
 void __dec_node_state(struct pglist_data *pgdat, enum node_stat_item item)
@@ -441,6 +451,7 @@
 	s8 __percpu *p = pcp->vm_node_stat_diff + item;
 	s8 v, t;
 
+	preempt_disable_rt();
 	v = __this_cpu_dec_return(*p);
 	t = __this_cpu_read(pcp->stat_threshold);
 	if (unlikely(v < - t)) {
@@ -449,6 +460,7 @@
 		node_page_state_add(v - overstep, pgdat, item);
 		__this_cpu_write(*p, overstep);
 	}
+	preempt_enable_rt();
 }
 
 void __dec_zone_page_state(struct page *page, enum zone_stat_item item)
diff --git a/kernel/mm/zsmalloc.c b/kernel/mm/zsmalloc.c
index 11e81b3..59d97e3 100644
--- a/kernel/mm/zsmalloc.c
+++ b/kernel/mm/zsmalloc.c
@@ -56,6 +56,7 @@
 #include <linux/wait.h>
 #include <linux/pagemap.h>
 #include <linux/fs.h>
+#include <linux/locallock.h>
 
 #define ZSPAGE_MAGIC	0x58
 
@@ -73,8 +74,21 @@
  */
 #define ZS_MAX_ZSPAGE_ORDER 2
 #define ZS_MAX_PAGES_PER_ZSPAGE (_AC(1, UL) << ZS_MAX_ZSPAGE_ORDER)
-
 #define ZS_HANDLE_SIZE (sizeof(unsigned long))
+
+#ifdef CONFIG_PREEMPT_RT_FULL
+
+struct zsmalloc_handle {
+	unsigned long addr;
+	struct mutex lock;
+};
+
+#define ZS_HANDLE_ALLOC_SIZE (sizeof(struct zsmalloc_handle))
+
+#else
+
+#define ZS_HANDLE_ALLOC_SIZE (sizeof(unsigned long))
+#endif
 
 /*
  * Object location (<PFN>, <obj_idx>) is encoded as
@@ -325,7 +339,7 @@
 
 static int create_cache(struct zs_pool *pool)
 {
-	pool->handle_cachep = kmem_cache_create("zs_handle", ZS_HANDLE_SIZE,
+	pool->handle_cachep = kmem_cache_create("zs_handle", ZS_HANDLE_ALLOC_SIZE,
 					0, 0, NULL);
 	if (!pool->handle_cachep)
 		return 1;
@@ -349,9 +363,26 @@
 
 static unsigned long cache_alloc_handle(struct zs_pool *pool, gfp_t gfp)
 {
-	return (unsigned long)kmem_cache_alloc(pool->handle_cachep,
-			gfp & ~(__GFP_HIGHMEM|__GFP_MOVABLE));
+	void *p;
+
+	p = kmem_cache_alloc(pool->handle_cachep,
+			     gfp & ~(__GFP_HIGHMEM|__GFP_MOVABLE));
+#ifdef CONFIG_PREEMPT_RT_FULL
+	if (p) {
+		struct zsmalloc_handle *zh = p;
+
+		mutex_init(&zh->lock);
+	}
+#endif
+	return (unsigned long)p;
 }
+
+#ifdef CONFIG_PREEMPT_RT_FULL
+static struct zsmalloc_handle *zs_get_pure_handle(unsigned long handle)
+{
+	return (void *)(handle &~((1 << OBJ_TAG_BITS) - 1));
+}
+#endif
 
 static void cache_free_handle(struct zs_pool *pool, unsigned long handle)
 {
@@ -371,12 +402,18 @@
 
 static void record_obj(unsigned long handle, unsigned long obj)
 {
+#ifdef CONFIG_PREEMPT_RT_FULL
+	struct zsmalloc_handle *zh = zs_get_pure_handle(handle);
+
+	WRITE_ONCE(zh->addr, obj);
+#else
 	/*
 	 * lsb of @obj represents handle lock while other bits
 	 * represent object value the handle is pointing so
 	 * updating shouldn't do store tearing.
 	 */
 	WRITE_ONCE(*(unsigned long *)handle, obj);
+#endif
 }
 
 /* zpool driver */
@@ -458,6 +495,7 @@
 
 /* per-cpu VM mapping areas for zspage accesses that cross page boundaries */
 static DEFINE_PER_CPU(struct mapping_area, zs_map_area);
+static DEFINE_LOCAL_IRQ_LOCK(zs_map_area_lock);
 
 static bool is_zspage_isolated(struct zspage *zspage)
 {
@@ -887,7 +925,13 @@
 
 static unsigned long handle_to_obj(unsigned long handle)
 {
+#ifdef CONFIG_PREEMPT_RT_FULL
+	struct zsmalloc_handle *zh = zs_get_pure_handle(handle);
+
+	return zh->addr;
+#else
 	return *(unsigned long *)handle;
+#endif
 }
 
 static unsigned long obj_to_head(struct page *page, void *obj)
@@ -901,22 +945,46 @@
 
 static inline int testpin_tag(unsigned long handle)
 {
+#ifdef CONFIG_PREEMPT_RT_FULL
+	struct zsmalloc_handle *zh = zs_get_pure_handle(handle);
+
+	return mutex_is_locked(&zh->lock);
+#else
 	return bit_spin_is_locked(HANDLE_PIN_BIT, (unsigned long *)handle);
+#endif
 }
 
 static inline int trypin_tag(unsigned long handle)
 {
+#ifdef CONFIG_PREEMPT_RT_FULL
+	struct zsmalloc_handle *zh = zs_get_pure_handle(handle);
+
+	return mutex_trylock(&zh->lock);
+#else
 	return bit_spin_trylock(HANDLE_PIN_BIT, (unsigned long *)handle);
+#endif
 }
 
 static void pin_tag(unsigned long handle)
 {
+#ifdef CONFIG_PREEMPT_RT_FULL
+	struct zsmalloc_handle *zh = zs_get_pure_handle(handle);
+
+	return mutex_lock(&zh->lock);
+#else
 	bit_spin_lock(HANDLE_PIN_BIT, (unsigned long *)handle);
+#endif
 }
 
 static void unpin_tag(unsigned long handle)
 {
+#ifdef CONFIG_PREEMPT_RT_FULL
+	struct zsmalloc_handle *zh = zs_get_pure_handle(handle);
+
+	return mutex_unlock(&zh->lock);
+#else
 	bit_spin_unlock(HANDLE_PIN_BIT, (unsigned long *)handle);
+#endif
 }
 
 static void reset_page(struct page *page)
@@ -1342,7 +1410,7 @@
 	class = pool->size_class[class_idx];
 	off = (class->size * obj_idx) & ~PAGE_MASK;
 
-	area = &get_cpu_var(zs_map_area);
+	area = &get_locked_var(zs_map_area_lock, zs_map_area);
 	area->vm_mm = mm;
 	if (off + class->size <= PAGE_SIZE) {
 		/* this object is contained entirely within a page */
@@ -1396,7 +1464,7 @@
 
 		__zs_unmap_object(area, pages, off, class->size);
 	}
-	put_cpu_var(zs_map_area);
+	put_locked_var(zs_map_area_lock, zs_map_area);
 
 	migrate_read_unlock(zspage);
 	unpin_tag(handle);
diff --git a/kernel/mm/zswap.c b/kernel/mm/zswap.c
index cd91fd9..420225d 100644
--- a/kernel/mm/zswap.c
+++ b/kernel/mm/zswap.c
@@ -27,6 +27,7 @@
 #include <linux/highmem.h>
 #include <linux/slab.h>
 #include <linux/spinlock.h>
+#include <linux/locallock.h>
 #include <linux/types.h>
 #include <linux/atomic.h>
 #include <linux/frontswap.h>
@@ -990,6 +991,8 @@
 	memset_l(page, value, PAGE_SIZE / sizeof(unsigned long));
 }
 
+/* protect zswap_dstmem from concurrency */
+static DEFINE_LOCAL_IRQ_LOCK(zswap_dstmem_lock);
 /*********************************
 * frontswap hooks
 **********************************/
@@ -1066,12 +1069,11 @@
 	}
 
 	/* compress */
-	dst = get_cpu_var(zswap_dstmem);
-	tfm = *get_cpu_ptr(entry->pool->tfm);
+	dst = get_locked_var(zswap_dstmem_lock, zswap_dstmem);
+	tfm = *this_cpu_ptr(entry->pool->tfm);
 	src = kmap_atomic(page);
 	ret = crypto_comp_compress(tfm, src, PAGE_SIZE, dst, &dlen);
 	kunmap_atomic(src);
-	put_cpu_ptr(entry->pool->tfm);
 	if (ret) {
 		ret = -EINVAL;
 		goto put_dstmem;
@@ -1094,7 +1096,7 @@
 	memcpy(buf, &zhdr, hlen);
 	memcpy(buf + hlen, dst, dlen);
 	zpool_unmap_handle(entry->pool->zpool, handle);
-	put_cpu_var(zswap_dstmem);
+	put_locked_var(zswap_dstmem_lock, zswap_dstmem);
 
 	/* populate entry */
 	entry->offset = offset;
@@ -1122,7 +1124,7 @@
 	return 0;
 
 put_dstmem:
-	put_cpu_var(zswap_dstmem);
+	put_locked_var(zswap_dstmem_lock, zswap_dstmem);
 	zswap_pool_put(entry->pool);
 freepage:
 	zswap_entry_cache_free(entry);
diff --git a/kernel/net/Kconfig b/kernel/net/Kconfig
index ae8e7da..c7eb375 100644
--- a/kernel/net/Kconfig
+++ b/kernel/net/Kconfig
@@ -274,7 +274,7 @@
 
 config NET_RX_BUSY_POLL
 	bool
-	default y
+	default y if !PREEMPT_RT_FULL
 
 config BQL
 	bool
diff --git a/kernel/net/bluetooth/rfcomm/sock.c b/kernel/net/bluetooth/rfcomm/sock.c
index c044ff2..75bc810 100644
--- a/kernel/net/bluetooth/rfcomm/sock.c
+++ b/kernel/net/bluetooth/rfcomm/sock.c
@@ -64,15 +64,13 @@
 static void rfcomm_sk_state_change(struct rfcomm_dlc *d, int err)
 {
 	struct sock *sk = d->owner, *parent;
-	unsigned long flags;
 
 	if (!sk)
 		return;
 
 	BT_DBG("dlc %p state %ld err %d", d, d->state, err);
 
-	local_irq_save(flags);
-	bh_lock_sock(sk);
+	spin_lock_bh(&sk->sk_lock.slock);
 
 	if (err)
 		sk->sk_err = err;
@@ -93,8 +91,7 @@
 		sk->sk_state_change(sk);
 	}
 
-	bh_unlock_sock(sk);
-	local_irq_restore(flags);
+	spin_unlock_bh(&sk->sk_lock.slock);
 
 	if (parent && sock_flag(sk, SOCK_ZAPPED)) {
 		/* We have to drop DLC lock here, otherwise
diff --git a/kernel/net/core/dev.c b/kernel/net/core/dev.c
index 27d414d..4c582f2 100644
--- a/kernel/net/core/dev.c
+++ b/kernel/net/core/dev.c
@@ -219,14 +219,14 @@
 static inline void rps_lock(struct softnet_data *sd)
 {
 #ifdef CONFIG_RPS
-	spin_lock(&sd->input_pkt_queue.lock);
+	raw_spin_lock(&sd->input_pkt_queue.raw_lock);
 #endif
 }
 
 static inline void rps_unlock(struct softnet_data *sd)
 {
 #ifdef CONFIG_RPS
-	spin_unlock(&sd->input_pkt_queue.lock);
+	raw_spin_unlock(&sd->input_pkt_queue.raw_lock);
 #endif
 }
 
@@ -2723,6 +2723,7 @@
 	sd->output_queue_tailp = &q->next_sched;
 	raise_softirq_irqoff(NET_TX_SOFTIRQ);
 	local_irq_restore(flags);
+	preempt_check_resched_rt();
 }
 
 void __netif_schedule(struct Qdisc *q)
@@ -2785,6 +2786,7 @@
 	__this_cpu_write(softnet_data.completion_queue, skb);
 	raise_softirq_irqoff(NET_TX_SOFTIRQ);
 	local_irq_restore(flags);
+	preempt_check_resched_rt();
 }
 EXPORT_SYMBOL(__dev_kfree_skb_irq);
 
@@ -3468,7 +3470,11 @@
 	 * This permits qdisc->running owner to get the lock more
 	 * often and dequeue packets faster.
 	 */
+#ifdef CONFIG_PREEMPT_RT_FULL
+	contended = true;
+#else
 	contended = qdisc_is_running(q);
+#endif
 	if (unlikely(contended))
 		spin_lock(&q->busylock);
 
@@ -3829,10 +3835,14 @@
 	if (dev->flags & IFF_UP) {
 		int cpu = smp_processor_id(); /* ok because BHs are off */
 
+#ifdef CONFIG_PREEMPT_RT_FULL
+		if (READ_ONCE(txq->xmit_lock_owner) != current) {
+#else
 		/* Other cpus might concurrently change txq->xmit_lock_owner
 		 * to -1 or to their cpu id, but not to our id.
 		 */
 		if (READ_ONCE(txq->xmit_lock_owner) != cpu) {
+#endif
 			if (dev_xmit_recursion())
 				goto recursion_alert;
 
@@ -4267,6 +4277,7 @@
 	rps_unlock(sd);
 
 	local_irq_restore(flags);
+	preempt_check_resched_rt();
 
 	atomic_long_inc(&skb->dev->rx_dropped);
 	kfree_skb(skb);
@@ -4481,7 +4492,7 @@
 		struct rps_dev_flow voidflow, *rflow = &voidflow;
 		int cpu;
 
-		preempt_disable();
+		migrate_disable();
 		rcu_read_lock();
 
 		cpu = get_rps_cpu(skb->dev, skb, &rflow);
@@ -4491,14 +4502,14 @@
 		ret = enqueue_to_backlog(skb, cpu, &rflow->last_qtail);
 
 		rcu_read_unlock();
-		preempt_enable();
+		migrate_enable();
 	} else
 #endif
 	{
 		unsigned int qtail;
 
-		ret = enqueue_to_backlog(skb, get_cpu(), &qtail);
-		put_cpu();
+		ret = enqueue_to_backlog(skb, get_cpu_light(), &qtail);
+		put_cpu_light();
 	}
 	return ret;
 }
@@ -4532,11 +4543,9 @@
 
 	trace_netif_rx_ni_entry(skb);
 
-	preempt_disable();
+	local_bh_disable();
 	err = netif_rx_internal(skb);
-	if (local_softirq_pending())
-		do_softirq();
-	preempt_enable();
+	local_bh_enable();
 
 	return err;
 }
@@ -5818,12 +5827,14 @@
 		sd->rps_ipi_list = NULL;
 
 		local_irq_enable();
+		preempt_check_resched_rt();
 
 		/* Send pending IPI's to kick RPS processing on remote cpus. */
 		net_rps_send_ipi(remsd);
 	} else
 #endif
 		local_irq_enable();
+	preempt_check_resched_rt();
 }
 
 static bool sd_has_rps_ipi_waiting(struct softnet_data *sd)
@@ -5853,16 +5864,18 @@
 	while (again) {
 		struct sk_buff *skb;
 
+		local_irq_disable();
 		while ((skb = __skb_dequeue(&sd->process_queue))) {
+			local_irq_enable();
 			rcu_read_lock();
 			__netif_receive_skb(skb);
 			rcu_read_unlock();
 			input_queue_head_incr(sd);
 			if (++work >= quota)
 				goto state_changed;
+			local_irq_disable();
 		}
 
-		local_irq_disable();
 		rps_lock(sd);
 		if (skb_queue_empty(&sd->input_pkt_queue)) {
 			/*
@@ -5904,6 +5917,7 @@
 	local_irq_save(flags);
 	____napi_schedule(this_cpu_ptr(&softnet_data), n);
 	local_irq_restore(flags);
+	preempt_check_resched_rt();
 }
 EXPORT_SYMBOL(__napi_schedule);
 
@@ -5940,6 +5954,7 @@
 }
 EXPORT_SYMBOL(napi_schedule_prep);
 
+#ifndef CONFIG_PREEMPT_RT_FULL
 /**
  * __napi_schedule_irqoff - schedule for receive
  * @n: entry to schedule
@@ -5958,6 +5973,7 @@
 		__napi_schedule(n);
 }
 EXPORT_SYMBOL(__napi_schedule_irqoff);
+#endif
 
 bool napi_complete_done(struct napi_struct *n, int work_done)
 {
@@ -6352,12 +6368,20 @@
 	unsigned long time_limit = jiffies +
 		usecs_to_jiffies(netdev_budget_usecs);
 	int budget = netdev_budget;
+	struct sk_buff_head tofree_q;
+	struct sk_buff *skb;
 	LIST_HEAD(list);
 	LIST_HEAD(repoll);
 
+	__skb_queue_head_init(&tofree_q);
+
 	local_irq_disable();
+	skb_queue_splice_init(&sd->tofree_queue, &tofree_q);
 	list_splice_init(&sd->poll_list, &list);
 	local_irq_enable();
+
+	while ((skb = __skb_dequeue(&tofree_q)))
+		kfree_skb(skb);
 
 	for (;;) {
 		struct napi_struct *n;
@@ -6388,7 +6412,7 @@
 	list_splice_tail(&repoll, &list);
 	list_splice(&list, &sd->poll_list);
 	if (!list_empty(&sd->poll_list))
-		__raise_softirq_irqoff(NET_RX_SOFTIRQ);
+		__raise_softirq_irqoff_ksoft(NET_RX_SOFTIRQ);
 
 	net_rps_action_and_irq_enable(sd);
 out:
@@ -8595,7 +8619,7 @@
 	/* Initialize queue lock */
 	spin_lock_init(&queue->_xmit_lock);
 	netdev_set_xmit_lockdep_class(&queue->_xmit_lock, dev->type);
-	queue->xmit_lock_owner = -1;
+	netdev_queue_clear_owner(queue);
 	netdev_queue_numa_node_write(queue, NUMA_NO_NODE);
 	queue->dev = dev;
 #ifdef CONFIG_BQL
@@ -9542,6 +9566,7 @@
 
 	raise_softirq_irqoff(NET_TX_SOFTIRQ);
 	local_irq_enable();
+	preempt_check_resched_rt();
 
 #ifdef CONFIG_RPS
 	remsd = oldsd->rps_ipi_list;
@@ -9555,9 +9580,12 @@
 		netif_rx_ni(skb);
 		input_queue_head_incr(oldsd);
 	}
-	while ((skb = skb_dequeue(&oldsd->input_pkt_queue))) {
+	while ((skb = __skb_dequeue(&oldsd->input_pkt_queue))) {
 		netif_rx_ni(skb);
 		input_queue_head_incr(oldsd);
+	}
+	while ((skb = __skb_dequeue(&oldsd->tofree_queue))) {
+		kfree_skb(skb);
 	}
 
 	return 0;
@@ -9869,8 +9897,9 @@
 
 		INIT_WORK(flush, flush_backlog);
 
-		skb_queue_head_init(&sd->input_pkt_queue);
-		skb_queue_head_init(&sd->process_queue);
+		skb_queue_head_init_raw(&sd->input_pkt_queue);
+		skb_queue_head_init_raw(&sd->process_queue);
+		skb_queue_head_init_raw(&sd->tofree_queue);
 #ifdef CONFIG_XFRM_OFFLOAD
 		skb_queue_head_init(&sd->xfrm_backlog);
 #endif
diff --git a/kernel/net/core/gen_estimator.c b/kernel/net/core/gen_estimator.c
index 752744d..7112e28 100644
--- a/kernel/net/core/gen_estimator.c
+++ b/kernel/net/core/gen_estimator.c
@@ -46,7 +46,7 @@
 struct net_rate_estimator {
 	struct gnet_stats_basic_packed	*bstats;
 	spinlock_t		*stats_lock;
-	seqcount_t		*running;
+	net_seqlock_t		*running;
 	struct gnet_stats_basic_cpu __percpu *cpu_bstats;
 	u8			ewma_log;
 	u8			intvl_log; /* period : (250ms << intvl_log) */
@@ -129,7 +129,7 @@
 		      struct gnet_stats_basic_cpu __percpu *cpu_bstats,
 		      struct net_rate_estimator __rcu **rate_est,
 		      spinlock_t *lock,
-		      seqcount_t *running,
+		      net_seqlock_t *running,
 		      struct nlattr *opt)
 {
 	struct gnet_estimator *parm = nla_data(opt);
@@ -230,7 +230,7 @@
 			  struct gnet_stats_basic_cpu __percpu *cpu_bstats,
 			  struct net_rate_estimator __rcu **rate_est,
 			  spinlock_t *lock,
-			  seqcount_t *running, struct nlattr *opt)
+			  net_seqlock_t *running, struct nlattr *opt)
 {
 	return gen_new_estimator(bstats, cpu_bstats, rate_est,
 				 lock, running, opt);
diff --git a/kernel/net/core/gen_stats.c b/kernel/net/core/gen_stats.c
index e2fd8ba..8bab887 100644
--- a/kernel/net/core/gen_stats.c
+++ b/kernel/net/core/gen_stats.c
@@ -142,7 +142,7 @@
 }
 
 void
-__gnet_stats_copy_basic(const seqcount_t *running,
+__gnet_stats_copy_basic(net_seqlock_t *running,
 			struct gnet_stats_basic_packed *bstats,
 			struct gnet_stats_basic_cpu __percpu *cpu,
 			struct gnet_stats_basic_packed *b)
@@ -155,10 +155,10 @@
 	}
 	do {
 		if (running)
-			seq = read_seqcount_begin(running);
+			seq = net_seq_begin(running);
 		bstats->bytes = b->bytes;
 		bstats->packets = b->packets;
-	} while (running && read_seqcount_retry(running, seq));
+	} while (running && net_seq_retry(running, seq));
 }
 EXPORT_SYMBOL(__gnet_stats_copy_basic);
 
@@ -176,7 +176,7 @@
  * if the room in the socket buffer was not sufficient.
  */
 int
-gnet_stats_copy_basic(const seqcount_t *running,
+gnet_stats_copy_basic(net_seqlock_t *running,
 		      struct gnet_dump *d,
 		      struct gnet_stats_basic_cpu __percpu *cpu,
 		      struct gnet_stats_basic_packed *b)
diff --git a/kernel/net/core/pktgen.c b/kernel/net/core/pktgen.c
index 3714cd9..2cea192 100644
--- a/kernel/net/core/pktgen.c
+++ b/kernel/net/core/pktgen.c
@@ -2160,7 +2160,8 @@
 	s64 remaining;
 	struct hrtimer_sleeper t;
 
-	hrtimer_init_on_stack(&t.timer, CLOCK_MONOTONIC, HRTIMER_MODE_ABS);
+	hrtimer_init_sleeper_on_stack(&t, CLOCK_MONOTONIC, HRTIMER_MODE_ABS,
+				      current);
 	hrtimer_set_expires(&t.timer, spin_until);
 
 	remaining = ktime_to_ns(hrtimer_expires_remaining(&t.timer));
@@ -2175,7 +2176,6 @@
 		} while (ktime_compare(end_time, spin_until) < 0);
 	} else {
 		/* see do_nanosleep */
-		hrtimer_init_sleeper(&t, current);
 		do {
 			set_current_state(TASK_INTERRUPTIBLE);
 			hrtimer_start_expires(&t.timer, HRTIMER_MODE_ABS);
diff --git a/kernel/net/core/skbuff.c b/kernel/net/core/skbuff.c
index 6cca6a0..d895bac 100644
--- a/kernel/net/core/skbuff.c
+++ b/kernel/net/core/skbuff.c
@@ -63,6 +63,7 @@
 #include <linux/errqueue.h>
 #include <linux/prefetch.h>
 #include <linux/if_vlan.h>
+#include <linux/locallock.h>
 
 #include <net/protocol.h>
 #include <net/dst.h>
@@ -330,6 +331,8 @@
 
 static DEFINE_PER_CPU(struct page_frag_cache, netdev_alloc_cache);
 static DEFINE_PER_CPU(struct napi_alloc_cache, napi_alloc_cache);
+static DEFINE_LOCAL_IRQ_LOCK(netdev_alloc_lock);
+static DEFINE_LOCAL_IRQ_LOCK(napi_alloc_cache_lock);
 
 static void *__netdev_alloc_frag(unsigned int fragsz, gfp_t gfp_mask)
 {
@@ -337,10 +340,10 @@
 	unsigned long flags;
 	void *data;
 
-	local_irq_save(flags);
+	local_lock_irqsave(netdev_alloc_lock, flags);
 	nc = this_cpu_ptr(&netdev_alloc_cache);
 	data = page_frag_alloc(nc, fragsz, gfp_mask);
-	local_irq_restore(flags);
+	local_unlock_irqrestore(netdev_alloc_lock, flags);
 	return data;
 }
 
@@ -361,9 +364,13 @@
 
 static void *__napi_alloc_frag(unsigned int fragsz, gfp_t gfp_mask)
 {
-	struct napi_alloc_cache *nc = this_cpu_ptr(&napi_alloc_cache);
+	struct napi_alloc_cache *nc;
+	void *data;
 
-	return page_frag_alloc(&nc->page, fragsz, gfp_mask);
+	nc = &get_locked_var(napi_alloc_cache_lock, napi_alloc_cache);
+	data =  page_frag_alloc(&nc->page, fragsz, gfp_mask);
+	put_locked_var(napi_alloc_cache_lock, napi_alloc_cache);
+	return data;
 }
 
 void *napi_alloc_frag(unsigned int fragsz)
@@ -416,13 +423,13 @@
 	if (sk_memalloc_socks())
 		gfp_mask |= __GFP_MEMALLOC;
 
-	local_irq_save(flags);
+	local_lock_irqsave(netdev_alloc_lock, flags);
 
 	nc = this_cpu_ptr(&netdev_alloc_cache);
 	data = page_frag_alloc(nc, len, gfp_mask);
 	pfmemalloc = nc->pfmemalloc;
 
-	local_irq_restore(flags);
+	local_unlock_irqrestore(netdev_alloc_lock, flags);
 
 	if (unlikely(!data))
 		return NULL;
@@ -466,6 +473,7 @@
 	struct napi_alloc_cache *nc;
 	struct sk_buff *skb;
 	void *data;
+	bool pfmemalloc;
 
 	len += NET_SKB_PAD + NET_IP_ALIGN;
 
@@ -488,7 +496,10 @@
 	if (sk_memalloc_socks())
 		gfp_mask |= __GFP_MEMALLOC;
 
+	nc = &get_locked_var(napi_alloc_cache_lock, napi_alloc_cache);
 	data = page_frag_alloc(&nc->page, len, gfp_mask);
+	pfmemalloc = nc->page.pfmemalloc;
+	put_locked_var(napi_alloc_cache_lock, napi_alloc_cache);
 	if (unlikely(!data))
 		return NULL;
 
@@ -499,7 +510,7 @@
 	}
 
 	/* use OR instead of assignment to avoid clearing of bits in mask */
-	if (nc->page.pfmemalloc)
+	if (pfmemalloc)
 		skb->pfmemalloc = 1;
 	skb->head_frag = 1;
 
@@ -731,23 +742,26 @@
 
 void __kfree_skb_flush(void)
 {
-	struct napi_alloc_cache *nc = this_cpu_ptr(&napi_alloc_cache);
+	struct napi_alloc_cache *nc;
 
+	nc = &get_locked_var(napi_alloc_cache_lock, napi_alloc_cache);
 	/* flush skb_cache if containing objects */
 	if (nc->skb_count) {
 		kmem_cache_free_bulk(skbuff_head_cache, nc->skb_count,
 				     nc->skb_cache);
 		nc->skb_count = 0;
 	}
+	put_locked_var(napi_alloc_cache_lock, napi_alloc_cache);
 }
 
 static inline void _kfree_skb_defer(struct sk_buff *skb)
 {
-	struct napi_alloc_cache *nc = this_cpu_ptr(&napi_alloc_cache);
+	struct napi_alloc_cache *nc;
 
 	/* drop skb->head and call any destructors for packet */
 	skb_release_all(skb);
 
+	nc = &get_locked_var(napi_alloc_cache_lock, napi_alloc_cache);
 	/* record skb to CPU local list */
 	nc->skb_cache[nc->skb_count++] = skb;
 
@@ -762,6 +776,7 @@
 				     nc->skb_cache);
 		nc->skb_count = 0;
 	}
+	put_locked_var(napi_alloc_cache_lock, napi_alloc_cache);
 }
 void __kfree_skb_defer(struct sk_buff *skb)
 {
diff --git a/kernel/net/ipv4/icmp.c b/kernel/net/ipv4/icmp.c
index fe10a56..d35719e 100644
--- a/kernel/net/ipv4/icmp.c
+++ b/kernel/net/ipv4/icmp.c
@@ -77,6 +77,7 @@
 #include <linux/string.h>
 #include <linux/netfilter_ipv4.h>
 #include <linux/slab.h>
+#include <linux/locallock.h>
 #include <net/snmp.h>
 #include <net/ip.h>
 #include <net/route.h>
@@ -204,6 +205,8 @@
  *
  *	On SMP we have one ICMP socket per-cpu.
  */
+static DEFINE_LOCAL_IRQ_LOCK(icmp_sk_lock);
+
 static struct sock *icmp_sk(struct net *net)
 {
 	return *this_cpu_ptr(net->ipv4.icmp_sk);
@@ -214,12 +217,16 @@
 {
 	struct sock *sk;
 
+	if (!local_trylock(icmp_sk_lock))
+		return NULL;
+
 	sk = icmp_sk(net);
 
 	if (unlikely(!spin_trylock(&sk->sk_lock.slock))) {
 		/* This can happen if the output path signals a
 		 * dst_link_failure() for an outgoing ICMP packet.
 		 */
+		local_unlock(icmp_sk_lock);
 		return NULL;
 	}
 	return sk;
@@ -228,6 +235,7 @@
 static inline void icmp_xmit_unlock(struct sock *sk)
 {
 	spin_unlock(&sk->sk_lock.slock);
+	local_unlock(icmp_sk_lock);
 }
 
 int sysctl_icmp_msgs_per_sec __read_mostly = 1000;
diff --git a/kernel/net/ipv4/tcp_ipv4.c b/kernel/net/ipv4/tcp_ipv4.c
index de4edfb..6a530a0 100644
--- a/kernel/net/ipv4/tcp_ipv4.c
+++ b/kernel/net/ipv4/tcp_ipv4.c
@@ -62,6 +62,7 @@
 #include <linux/init.h>
 #include <linux/times.h>
 #include <linux/slab.h>
+#include <linux/locallock.h>
 
 #include <net/net_namespace.h>
 #include <net/icmp.h>
@@ -637,6 +638,7 @@
 }
 EXPORT_SYMBOL(tcp_v4_send_check);
 
+static DEFINE_LOCAL_IRQ_LOCK(tcp_sk_lock);
 /*
  *	This routine will send an RST to the other tcp.
  *
@@ -771,6 +773,7 @@
 	arg.tos = ip_hdr(skb)->tos;
 	arg.uid = sock_net_uid(net, sk && sk_fullsock(sk) ? sk : NULL);
 	local_bh_disable();
+	local_lock(tcp_sk_lock);
 	ctl_sk = *this_cpu_ptr(net->ipv4.tcp_sk);
 	if (sk)
 		ctl_sk->sk_mark = (sk->sk_state == TCP_TIME_WAIT) ?
@@ -783,6 +786,7 @@
 	ctl_sk->sk_mark = 0;
 	__TCP_INC_STATS(net, TCP_MIB_OUTSEGS);
 	__TCP_INC_STATS(net, TCP_MIB_OUTRSTS);
+	local_unlock(tcp_sk_lock);
 	local_bh_enable();
 
 #ifdef CONFIG_TCP_MD5SIG
@@ -863,6 +867,7 @@
 	arg.tos = tos;
 	arg.uid = sock_net_uid(net, sk_fullsock(sk) ? sk : NULL);
 	local_bh_disable();
+	local_lock(tcp_sk_lock);
 	ctl_sk = *this_cpu_ptr(net->ipv4.tcp_sk);
 	if (sk)
 		ctl_sk->sk_mark = (sk->sk_state == TCP_TIME_WAIT) ?
@@ -874,6 +879,7 @@
 
 	ctl_sk->sk_mark = 0;
 	__TCP_INC_STATS(net, TCP_MIB_OUTSEGS);
+	local_unlock(tcp_sk_lock);
 	local_bh_enable();
 }
 
diff --git a/kernel/net/netfilter/core.c b/kernel/net/netfilter/core.c
index 93aaec3..b364cf8 100644
--- a/kernel/net/netfilter/core.c
+++ b/kernel/net/netfilter/core.c
@@ -20,6 +20,7 @@
 #include <linux/inetdevice.h>
 #include <linux/proc_fs.h>
 #include <linux/mutex.h>
+#include <linux/locallock.h>
 #include <linux/mm.h>
 #include <linux/rcupdate.h>
 #include <net/net_namespace.h>
@@ -27,6 +28,11 @@
 
 #include "nf_internals.h"
 
+#ifdef CONFIG_PREEMPT_RT_BASE
+DEFINE_LOCAL_IRQ_LOCK(xt_write_lock);
+EXPORT_PER_CPU_SYMBOL(xt_write_lock);
+#endif
+
 const struct nf_ipv6_ops __rcu *nf_ipv6_ops __read_mostly;
 EXPORT_SYMBOL_GPL(nf_ipv6_ops);
 
diff --git a/kernel/net/packet/af_packet.c b/kernel/net/packet/af_packet.c
index bd7e8d4..51bca56 100644
--- a/kernel/net/packet/af_packet.c
+++ b/kernel/net/packet/af_packet.c
@@ -63,6 +63,7 @@
 #include <linux/if_packet.h>
 #include <linux/wireless.h>
 #include <linux/kernel.h>
+#include <linux/delay.h>
 #include <linux/kmod.h>
 #include <linux/slab.h>
 #include <linux/vmalloc.h>
@@ -668,7 +669,7 @@
 	if (BLOCK_NUM_PKTS(pbd)) {
 		while (atomic_read(&pkc->blk_fill_in_prog)) {
 			/* Waiting for skb_copy_bits to finish... */
-			cpu_relax();
+			cpu_chill();
 		}
 	}
 
@@ -930,7 +931,7 @@
 		if (!(status & TP_STATUS_BLK_TMO)) {
 			while (atomic_read(&pkc->blk_fill_in_prog)) {
 				/* Waiting for skb_copy_bits to finish... */
-				cpu_relax();
+				cpu_chill();
 			}
 		}
 		prb_close_block(pkc, pbd, po, status);
diff --git a/kernel/net/rds/ib_rdma.c b/kernel/net/rds/ib_rdma.c
index 0b347f4..f395f06 100644
--- a/kernel/net/rds/ib_rdma.c
+++ b/kernel/net/rds/ib_rdma.c
@@ -34,6 +34,7 @@
 #include <linux/slab.h>
 #include <linux/rculist.h>
 #include <linux/llist.h>
+#include <linux/delay.h>
 
 #include "rds_single_path.h"
 #include "ib_mr.h"
@@ -222,7 +223,7 @@
 	for_each_online_cpu(cpu) {
 		flag = &per_cpu(clean_list_grace, cpu);
 		while (test_bit(CLEAN_LIST_BUSY_BIT, flag))
-			cpu_relax();
+			cpu_chill();
 	}
 }
 
diff --git a/kernel/net/rfkill/rfkill-bt.c b/kernel/net/rfkill/rfkill-bt.c
index 378fdc9..a2d31bc 100644
--- a/kernel/net/rfkill/rfkill-bt.c
+++ b/kernel/net/rfkill/rfkill-bt.c
@@ -25,6 +25,7 @@
 #include <linux/rfkill-bt.h>
 #include <linux/rfkill-wlan.h>
 #include <linux/wakelock.h>
+#include <linux/input.h>
 #include <linux/interrupt.h>
 #include <asm/irq.h>
 #include <linux/suspend.h>
@@ -69,9 +70,11 @@
 	struct wake_lock bt_irq_wl;
 	struct delayed_work bt_sleep_delay_work;
 	int irq_req;
+	bool enable_power_key;
 };
 
 static struct rfkill_rk_data *g_rfkill = NULL;
+static struct input_dev *power_key_dev;
 
 static const char bt_name[] =
 #if defined(CONFIG_BCM4330)
@@ -113,6 +116,20 @@
 #endif
 	;
 
+static int rfkill_rk_power_key_up(void)
+{
+	if (!power_key_dev)
+		return -ENODEV;
+
+	input_report_key(power_key_dev, KEY_POWER, 1);
+	input_sync(power_key_dev);
+	msleep(20);
+	input_report_key(power_key_dev, KEY_POWER, 0);
+	input_sync(power_key_dev);
+
+	return 0;
+}
+
 static irqreturn_t rfkill_rk_wake_host_irq(int irq, void *dev)
 {
 	struct rfkill_rk_data *rfkill = dev;
@@ -123,6 +140,16 @@
 
 	wake_lock_timeout(&rfkill->bt_irq_wl,
 			  msecs_to_jiffies(BT_IRQ_WAKELOCK_TIMEOUT));
+
+	if (rfkill->enable_power_key)
+		return IRQ_WAKE_THREAD;
+
+	return IRQ_HANDLED;
+}
+
+static irqreturn_t rfkill_rk_wake_host_irq_thread(int irq, void *dev)
+{
+	rfkill_rk_power_key_up();
 
 	return IRQ_HANDLED;
 }
@@ -165,11 +192,12 @@
 		LOG("Request irq for bt wakeup host\n");
 		irq->irq = gpio_to_irq(irq->gpio.io);
 		sprintf(irq->name, "%s_irq", irq->gpio.name);
-		ret = request_irq(irq->irq, rfkill_rk_wake_host_irq,
-				  (irq->gpio.enable == GPIO_ACTIVE_LOW) ?
-					  IRQF_TRIGGER_FALLING :
-					  IRQF_TRIGGER_RISING,
-				  irq->name, rfkill);
+		ret = request_threaded_irq(irq->irq, rfkill_rk_wake_host_irq,
+					   rfkill_rk_wake_host_irq_thread,
+					   IRQF_ONESHOT | ((irq->gpio.enable == GPIO_ACTIVE_LOW) ?
+					   IRQF_TRIGGER_FALLING :
+					   IRQF_TRIGGER_RISING),
+					   irq->name, rfkill);
 		if (ret)
 			goto fail2;
 		rfkill->irq_req = 1;
@@ -271,7 +299,8 @@
 
 	return 0;
 }
-static int proc_rk_set_power(void *data, bool blocked)
+
+static int rfkill_rk_set_power(void *data, bool blocked)
 {
 	struct rfkill_rk_data *rfkill = data;
 	struct rfkill_rk_gpio *wake_host = &rfkill->pdata->wake_host_irq.gpio;
@@ -363,113 +392,6 @@
 				LOG("%s: cannot get wifi power state!\n", __func__);
 				return -EPERM;
 			}
-			if (!wifi_power) {
-				LOG("%s: bt will set vbat to low\n", __func__);
-				rfkill_set_wifi_bt_power(0);
-			} else {
-				LOG("%s: bt shouldn't control the vbat\n", __func__);
-			}
-		}
-	}
-
-	return 0;
-}
-
-
-static int rfkill_rk_set_power(void *data, bool blocked)
-{
-	struct rfkill_rk_data *rfkill = data;
-	struct rfkill_rk_gpio *wake_host = &rfkill->pdata->wake_host_irq.gpio;
-	struct rfkill_rk_gpio *poweron = &rfkill->pdata->poweron_gpio;
-	struct rfkill_rk_gpio *reset = &rfkill->pdata->reset_gpio;
-	struct rfkill_rk_gpio *rts = &rfkill->pdata->rts_gpio;
-	struct pinctrl *pinctrl = rfkill->pdata->pinctrl;
-	int wifi_power = 0;
-	bool toggle = false;
-
-	DBG("Enter %s\n", __func__);
-
-	DBG("Set blocked:%d\n", blocked);
-
-	toggle = rfkill->pdata->power_toggle;
-
-	if (toggle) {
-		if (rfkill_get_wifi_power_state(&wifi_power)) {
-			LOG("%s: cannot get wifi power state!\n", __func__);
-			return -1;
-		}
-	}
-
-	DBG("%s: toggle = %s\n", __func__, toggle ? "true" : "false");
-
-	if (!blocked) {
-		if (toggle) {
-			rfkill_set_wifi_bt_power(1);
-			msleep(100);
-		}
-
-		rfkill_rk_sleep_bt(BT_WAKEUP); // ensure bt is wakeup
-
-		if (gpio_is_valid(wake_host->io)) {
-			LOG("%s: set bt wake_host high!\n", __func__);
-			gpio_direction_output(wake_host->io, 1);
-			msleep(20);
-		}
-
-		if (gpio_is_valid(poweron->io)) {
-			if (gpio_get_value(poweron->io) == !poweron->enable) {
-				gpio_direction_output(poweron->io,
-						      !poweron->enable);
-				msleep(20);
-				gpio_direction_output(poweron->io,
-						      poweron->enable);
-				msleep(20);
-				if (gpio_is_valid(wake_host->io))
-					gpio_direction_input(wake_host->io);
-			}
-		}
-
-		if (gpio_is_valid(reset->io)) {
-			if (gpio_get_value(reset->io) == !reset->enable) {
-				gpio_direction_output(reset->io,
-						      !reset->enable);
-				msleep(20);
-				gpio_direction_output(reset->io, reset->enable);
-			}
-		}
-
-		if (pinctrl && gpio_is_valid(rts->io)) {
-			pinctrl_select_state(pinctrl, rts->gpio_state);
-			LOG("ENABLE UART_RTS\n");
-			gpio_direction_output(rts->io, rts->enable);
-			msleep(100);
-			LOG("DISABLE UART_RTS\n");
-			gpio_direction_output(rts->io, !rts->enable);
-			pinctrl_select_state(pinctrl, rts->default_state);
-		}
-
-		bt_power_state = 1;
-		LOG("bt turn on power\n");
-		rfkill_rk_setup_wake_irq(rfkill, 1);
-	} else {
-		if (gpio_is_valid(poweron->io)) {
-			if (gpio_get_value(poweron->io) == poweron->enable) {
-				gpio_direction_output(poweron->io,
-						      poweron->enable);
-				msleep(20);
-			}
-		}
-
-		bt_power_state = 0;
-		LOG("bt shut off power\n");
-		if (gpio_is_valid(reset->io)) {
-			if (gpio_get_value(reset->io) == reset->enable) {
-				gpio_direction_output(reset->io,
-						      reset->enable);
-				msleep(20);
-			}
-		}
-		if (toggle) {
 			if (!wifi_power) {
 				LOG("%s: bt will set vbat to low\n", __func__);
 				rfkill_set_wifi_bt_power(0);
@@ -592,11 +514,56 @@
 		return -EFAULT;
 
 	DBG("btwrite %c\n", b);
-	/* HCI_DEV_WRITE */
 	if (b != '0')
-		proc_rk_set_power(g_rfkill, 0);
+		rfkill_rk_sleep_bt(BT_WAKEUP);
 	else
-		proc_rk_set_power(g_rfkill, 1);
+		rfkill_rk_sleep_bt(BT_SLEEP);
+
+	return count;
+}
+
+static ssize_t bluesleep_read_proc_powerupkey(struct file *file,
+					      char __user *buffer, size_t count,
+					      loff_t *data)
+{
+	struct rfkill_rk_data *rfkill = g_rfkill;
+	char src[2];
+
+	if (*data >= 1)
+		return 0;
+
+	if (!rfkill)
+		return -EFAULT;
+
+	src[0] = rfkill->enable_power_key ? '1' : '0';
+	src[1] = '\n';
+	if (copy_to_user(buffer, src, 2))
+		return -EFAULT;
+	*data = 1;
+
+	return 2;
+}
+
+static ssize_t bluesleep_write_proc_powerupkey(struct file *file,
+					       const char __user *buffer,
+					       size_t count, loff_t *data)
+{
+	char b;
+	struct rfkill_rk_data *rfkill = g_rfkill;
+
+	if (!rfkill)
+		return -EFAULT;
+
+	if (count < 1)
+		return -EINVAL;
+
+	if (copy_from_user(&b, buffer, 1))
+		return -EFAULT;
+
+	if (b != '0')
+		rfkill->enable_power_key = true;
+	else
+		rfkill->enable_power_key = false;
 
 	return count;
 }
@@ -700,6 +667,39 @@
 	.write = bluesleep_write_proc_btwrite,
 };
 
+static const struct file_operations bluesleep_powerupkey = {
+	.owner = THIS_MODULE,
+	.read = bluesleep_read_proc_powerupkey,
+	.write = bluesleep_write_proc_powerupkey,
+};
+
+static int rfkill_rk_register_power_key(void)
+{
+	int ret = 0;
+
+	/* register input device */
+	power_key_dev = input_allocate_device();
+	if (!power_key_dev) {
+		LOG("ir_dev: not enough memory for input device\n");
+		return -ENOMEM;
+	}
+
+	power_key_dev->name = "bt-powerkey";
+	power_key_dev->id.bustype = BUS_HOST;
+
+	power_key_dev->evbit[0] = BIT_MASK(EV_KEY);
+	set_bit(KEY_POWER, power_key_dev->keybit);
+
+	ret = input_register_device(power_key_dev);
+	if (ret) {
+		input_free_device(power_key_dev);
+		LOG("ir_rx_init: register input device exception, exit\n");
+		return -EBUSY;
+	}
+
+	return ret;
+}
+
 static int rfkill_rk_probe(struct platform_device *pdev)
 {
 	struct rfkill_rk_data *rfkill;
@@ -766,6 +766,14 @@
 		goto fail_alloc;
 	}
 
+	/* read/write proc entries */
+	ent = proc_create("powerupkey", 0, sleep_dir, &bluesleep_powerupkey);
+	if (!ent) {
+		LOG("Unable to create /proc/%s/powerupkey entry", PROC_DIR);
+		ret = -ENOMEM;
+		goto fail_alloc;
+	}
+
 	DBG("init gpio\n");
 
 	ret = rfkill_rk_setup_gpio(pdev, &pdata->poweron_gpio, pdata->name,
@@ -824,12 +832,16 @@
 
 	LOG("%s device registered.\n", pdata->name);
 
+	if (rfkill_rk_register_power_key() != 0)
+		goto fail_rfkill;
+
 	return 0;
 
 fail_rfkill:
 	rfkill_destroy(rfkill->rfkill_dev);
 fail_alloc:
 
+	remove_proc_entry("powerupkey", sleep_dir);
 	remove_proc_entry("btwrite", sleep_dir);
 	remove_proc_entry("lpm", sleep_dir);
 fail_setup_wake_irq:
@@ -848,7 +860,11 @@
 
 	rfkill_unregister(rfkill->rfkill_dev);
 	rfkill_destroy(rfkill->rfkill_dev);
+	remove_proc_entry("powerupkey", sleep_dir);
+	remove_proc_entry("btwrite", sleep_dir);
+	remove_proc_entry("lpm", sleep_dir);
 
+	input_unregister_device(power_key_dev);
 	cancel_delayed_work_sync(&rfkill->bt_sleep_delay_work);
 
 	// free gpio
diff --git a/kernel/net/sched/sch_api.c b/kernel/net/sched/sch_api.c
index 424e709..6b4ee7c 100644
--- a/kernel/net/sched/sch_api.c
+++ b/kernel/net/sched/sch_api.c
@@ -1191,7 +1191,7 @@
 		rcu_assign_pointer(sch->stab, stab);
 	}
 	if (tca[TCA_RATE]) {
-		seqcount_t *running;
+		net_seqlock_t *running;
 
 		err = -EOPNOTSUPP;
 		if (sch->flags & TCQ_F_MQROOT) {
diff --git a/kernel/net/sched/sch_generic.c b/kernel/net/sched/sch_generic.c
index e987be5..43ca345 100644
--- a/kernel/net/sched/sch_generic.c
+++ b/kernel/net/sched/sch_generic.c
@@ -576,7 +576,11 @@
 	.ops		=	&noop_qdisc_ops,
 	.q.lock		=	__SPIN_LOCK_UNLOCKED(noop_qdisc.q.lock),
 	.dev_queue	=	&noop_netdev_queue,
+#ifdef CONFIG_PREEMPT_RT_BASE
+	.running	=	__SEQLOCK_UNLOCKED(noop_qdisc.running),
+#else
 	.running	=	SEQCNT_ZERO(noop_qdisc.running),
+#endif
 	.busylock	=	__SPIN_LOCK_UNLOCKED(noop_qdisc.busylock),
 	.gso_skb = {
 		.next = (struct sk_buff *)&noop_qdisc.gso_skb,
@@ -877,9 +881,17 @@
 	lockdep_set_class(&sch->busylock,
 			  dev->qdisc_tx_busylock ?: &qdisc_tx_busylock);
 
+#ifdef CONFIG_PREEMPT_RT_BASE
+	seqlock_init(&sch->running);
+	lockdep_set_class(&sch->running.seqcount,
+			  dev->qdisc_running_key ?: &qdisc_running_key);
+	lockdep_set_class(&sch->running.lock,
+			  dev->qdisc_running_key ?: &qdisc_running_key);
+#else
 	seqcount_init(&sch->running);
 	lockdep_set_class(&sch->running,
 			  dev->qdisc_running_key ?: &qdisc_running_key);
+#endif
 
 	sch->ops = ops;
 	sch->flags = ops->static_flags;
@@ -1253,7 +1265,7 @@
 	/* Wait for outstanding qdisc_run calls. */
 	list_for_each_entry(dev, head, close_list) {
 		while (some_qdisc_is_busy(dev))
-			yield();
+			msleep(1);
 		/* The new qdisc is assigned at this point so we can safely
 		 * unwind stale skb lists and qdisc statistics
 		 */
diff --git a/kernel/net/sunrpc/svc_xprt.c b/kernel/net/sunrpc/svc_xprt.c
index 4b56b94..83a4a0a 100644
--- a/kernel/net/sunrpc/svc_xprt.c
+++ b/kernel/net/sunrpc/svc_xprt.c
@@ -402,7 +402,7 @@
 	if (test_and_set_bit(XPT_BUSY, &xprt->xpt_flags))
 		return;
 
-	cpu = get_cpu();
+	cpu = get_cpu_light();
 	pool = svc_pool_for_cpu(xprt->xpt_server, cpu);
 
 	atomic_long_inc(&pool->sp_stats.packets);
@@ -426,7 +426,7 @@
 	rqstp = NULL;
 out_unlock:
 	rcu_read_unlock();
-	put_cpu();
+	put_cpu_light();
 	trace_svc_xprt_do_enqueue(xprt, rqstp);
 }
 EXPORT_SYMBOL_GPL(svc_xprt_do_enqueue);
diff --git a/kernel/net/wireless/core.h b/kernel/net/wireless/core.h
index b91363a..2d554e7 100644
--- a/kernel/net/wireless/core.h
+++ b/kernel/net/wireless/core.h
@@ -519,6 +519,10 @@
 void cfg80211_stop_nan(struct cfg80211_registered_device *rdev,
 		       struct wireless_dev *wdev);
 
+struct cfg80211_internal_bss *
+cfg80211_bss_update(struct cfg80211_registered_device *rdev,
+		    struct cfg80211_internal_bss *tmp,
+		    bool signal_valid, unsigned long ts);
 #ifdef CONFIG_CFG80211_DEVELOPER_WARNINGS
 #define CFG80211_DEV_WARN_ON(cond)	WARN_ON(cond)
 #else
diff --git a/kernel/net/wireless/scan.c b/kernel/net/wireless/scan.c
index fe4c054..32d775e 100644
--- a/kernel/net/wireless/scan.c
+++ b/kernel/net/wireless/scan.c
@@ -1034,17 +1034,17 @@
 };
 
 /* Returned bss is reference counted and must be cleaned up appropriately. */
-static struct cfg80211_internal_bss *
+struct cfg80211_internal_bss *
 cfg80211_bss_update(struct cfg80211_registered_device *rdev,
 		    struct cfg80211_internal_bss *tmp,
-		    bool signal_valid)
+		    bool signal_valid, unsigned long ts)
 {
 	struct cfg80211_internal_bss *found = NULL;
 
 	if (WARN_ON(!tmp->pub.channel))
 		return NULL;
 
-	tmp->ts = jiffies;
+	tmp->ts = ts;
 
 	spin_lock_bh(&rdev->bss_lock);
 
@@ -1367,7 +1367,8 @@
 
 	signal_valid = abs(data->chan->center_freq - channel->center_freq) <=
 		wiphy->max_adj_channel_rssi_comp;
-	res = cfg80211_bss_update(wiphy_to_rdev(wiphy), &tmp, signal_valid);
+	res = cfg80211_bss_update(wiphy_to_rdev(wiphy), &tmp, signal_valid,
+				  jiffies);
 	if (!res)
 		return NULL;
 
@@ -1691,7 +1692,8 @@
 
 	signal_valid = abs(data->chan->center_freq - channel->center_freq) <=
 		wiphy->max_adj_channel_rssi_comp;
-	res = cfg80211_bss_update(wiphy_to_rdev(wiphy), &tmp, signal_valid);
+	res = cfg80211_bss_update(wiphy_to_rdev(wiphy), &tmp, signal_valid,
+				  jiffies);
 	if (!res)
 		return NULL;
 
diff --git a/kernel/net/wireless/sme.c b/kernel/net/wireless/sme.c
index d5d9d76..4b40d1f 100644
--- a/kernel/net/wireless/sme.c
+++ b/kernel/net/wireless/sme.c
@@ -796,12 +796,36 @@
 	u8 *next;
 
 	if (params->bss) {
-		/* Make sure the bss entry provided by the driver is valid. */
 		struct cfg80211_internal_bss *ibss = bss_from_pub(params->bss);
 
-		if (WARN_ON(list_empty(&ibss->list))) {
-			cfg80211_put_bss(wdev->wiphy, params->bss);
-			return;
+		if (list_empty(&ibss->list)) {
+			struct cfg80211_bss *found = NULL, *tmp = params->bss;
+
+			found = cfg80211_get_bss(wdev->wiphy, NULL,
+						 params->bss->bssid,
+						 wdev->ssid, wdev->ssid_len,
+						 wdev->conn_bss_type,
+						 IEEE80211_PRIVACY_ANY);
+			if (found) {
+				/* The same BSS is already updated so use it
+				 * instead, as it has latest info.
+				 */
+				params->bss = found;
+			} else {
+				/* Update with BSS provided by driver, it will
+				 * be freshly added and ref cnted, we can free
+				 * the old one.
+				 *
+				 * signal_valid can be false, as we are not
+				 * expecting the BSS to be found.
+				 *
+				 * keep the old timestamp to avoid confusion
+				 */
+				cfg80211_bss_update(rdev, ibss, false,
+						    ibss->ts);
+			}
+
+			cfg80211_put_bss(wdev->wiphy, tmp);
 		}
 	}
 
diff --git a/kernel/net/xfrm/xfrm_ipcomp.c b/kernel/net/xfrm/xfrm_ipcomp.c
index a00ec71..a979973 100644
--- a/kernel/net/xfrm/xfrm_ipcomp.c
+++ b/kernel/net/xfrm/xfrm_ipcomp.c
@@ -20,6 +20,7 @@
 #include <linux/list.h>
 #include <linux/module.h>
 #include <linux/mutex.h>
+#include <linux/locallock.h>
 #include <linux/percpu.h>
 #include <linux/slab.h>
 #include <linux/smp.h>
@@ -36,6 +37,7 @@
 
 static DEFINE_MUTEX(ipcomp_resource_mutex);
 static void * __percpu *ipcomp_scratches;
+static DEFINE_LOCAL_IRQ_LOCK(ipcomp_scratches_lock);
 static int ipcomp_scratch_users;
 static LIST_HEAD(ipcomp_tfms_list);
 
@@ -45,12 +47,15 @@
 	const int plen = skb->len;
 	int dlen = IPCOMP_SCRATCH_SIZE;
 	const u8 *start = skb->data;
-	const int cpu = get_cpu();
-	u8 *scratch = *per_cpu_ptr(ipcomp_scratches, cpu);
-	struct crypto_comp *tfm = *per_cpu_ptr(ipcd->tfms, cpu);
-	int err = crypto_comp_decompress(tfm, start, plen, scratch, &dlen);
-	int len;
+	u8 *scratch;
+	struct crypto_comp *tfm;
+	int err, len;
 
+	local_lock(ipcomp_scratches_lock);
+
+	scratch = *this_cpu_ptr(ipcomp_scratches);
+	tfm = *this_cpu_ptr(ipcd->tfms);
+	err = crypto_comp_decompress(tfm, start, plen, scratch, &dlen);
 	if (err)
 		goto out;
 
@@ -103,7 +108,7 @@
 	err = 0;
 
 out:
-	put_cpu();
+	local_unlock(ipcomp_scratches_lock);
 	return err;
 }
 
@@ -146,6 +151,8 @@
 	int err;
 
 	local_bh_disable();
+	local_lock(ipcomp_scratches_lock);
+
 	scratch = *this_cpu_ptr(ipcomp_scratches);
 	tfm = *this_cpu_ptr(ipcd->tfms);
 	err = crypto_comp_compress(tfm, start, plen, scratch, &dlen);
@@ -158,12 +165,14 @@
 	}
 
 	memcpy(start + sizeof(struct ip_comp_hdr), scratch, dlen);
+	local_unlock(ipcomp_scratches_lock);
 	local_bh_enable();
 
 	pskb_trim(skb, dlen + sizeof(struct ip_comp_hdr));
 	return 0;
 
 out:
+	local_unlock(ipcomp_scratches_lock);
 	local_bh_enable();
 	return err;
 }
diff --git a/kernel/samples/trace_events/trace-events-sample.c b/kernel/samples/trace_events/trace-events-sample.c
index 5522692..8b4be8e 100644
--- a/kernel/samples/trace_events/trace-events-sample.c
+++ b/kernel/samples/trace_events/trace-events-sample.c
@@ -33,7 +33,7 @@
 
 	/* Silly tracepoints */
 	trace_foo_bar("hello", cnt, array, random_strings[len],
-		      &current->cpus_allowed);
+		      current->cpus_ptr);
 
 	trace_foo_with_template_simple("HELLO", cnt);
 
diff --git a/kernel/scripts/io-domain.sh b/kernel/scripts/io-domain.sh
index c1647b1..7867547 100755
--- a/kernel/scripts/io-domain.sh
+++ b/kernel/scripts/io-domain.sh
@@ -27,8 +27,9 @@
 ShowChecklist()
 {
 	PMUIO2=$(whiptail --title "IO Domain Checklist" --menu --nocancel\
-	"Get the corresponding value from the hardware schematic diagram" 15 60 2 \
+	"Get the corresponding value from the hardware schematic diagram" 15 60 3 \
 	"1800000" "PMUIO2 Supply Power Voltage(uV)" \
+	"3000000" "PMUIO2 Supply Power Voltage(uV)" \
 	"3300000" "PMUIO2 Supply Power Voltage(uV)" 3>&1 1>&2 2>&3)
 	exitstatus=$?
 	if [ $exitstatus != 0 ]; then
@@ -37,8 +38,9 @@
 	fi
 
 	VCCIO1=$(whiptail --title "IO Domain Checklist" --menu --nocancel\
-	"Get the corresponding value from the hardware schematic diagram" 15 60 2 \
+	"Get the corresponding value from the hardware schematic diagram" 15 60 3 \
 	"1800000" "VCCIO1 Supply Power Voltage(uV)" \
+	"3000000" "VCCIO1 Supply Power Voltage(uV)" \
 	"3300000" "VCCIO1 Supply Power Voltage(uV)" 3>&1 1>&2 2>&3)
 	exitstatus=$?
 	if [ $exitstatus != 0 ]; then
@@ -47,8 +49,9 @@
 	fi
 
 	VCCIO3=$(whiptail --title "IO Domain Checklist" --menu --nocancel\
-	"Get the corresponding value from the hardware schematic diagram" 15 60 2 \
+	"Get the corresponding value from the hardware schematic diagram" 15 60 3 \
 	"1800000" "VCCIO3 Supply Power Voltage(uV)" \
+	"3000000" "VCCIO3 Supply Power Voltage(uV)" \
 	"3300000" "VCCIO3 Supply Power Voltage(uV)" 3>&1 1>&2 2>&3)
 	exitstatus=$?
 	if [ $exitstatus != 0 ]; then
@@ -57,8 +60,9 @@
 	fi
 
 	VCCIO4=$(whiptail --title "IO Domain Checklist" --menu --nocancel\
-	"Get the corresponding value from the hardware schematic diagram" 15 60 2 \
+	"Get the corresponding value from the hardware schematic diagram" 15 60 3 \
 	"1800000" "VCCIO4 Supply Power Voltage(uV)" \
+	"3000000" "VCCIO4 Supply Power Voltage(uV)" \
 	"3300000" "VCCIO4 Supply Power Voltage(uV)" 3>&1 1>&2 2>&3)
 	exitstatus=$?
 	if [ $exitstatus != 0 ]; then
@@ -67,8 +71,9 @@
 	fi
 
 	VCCIO5=$(whiptail --title "IO Domain Checklist" --menu --nocancel\
-	"Get the corresponding value from the hardware schematic diagram" 15 60 2 \
+	"Get the corresponding value from the hardware schematic diagram" 15 60 3 \
 	"1800000" "VCCIO5 Supply Power Voltage(uV)" \
+	"3000000" "VCCIO5 Supply Power Voltage(uV)" \
 	"3300000" "VCCIO5 Supply Power Voltage(uV)" 3>&1 1>&2 2>&3)
 	exitstatus=$?
 	if [ $exitstatus != 0 ]; then
@@ -77,8 +82,9 @@
 	fi
 
 	VCCIO6=$(whiptail --title "IO Domain Checklist" --menu --nocancel\
-	"Get the corresponding value from the hardware schematic diagram" 15 60 2 \
+	"Get the corresponding value from the hardware schematic diagram" 15 60 3 \
 	"1800000" "VCCIO6 Supply Power Voltage(uV)" \
+	"3000000" "VCCIO6 Supply Power Voltage(uV)" \
 	"3300000" "VCCIO6 Supply Power Voltage(uV)" 3>&1 1>&2 2>&3)
 	exitstatus=$?
 	if [ $exitstatus != 0 ]; then
@@ -87,8 +93,9 @@
 	fi
 
 	VCCIO7=$(whiptail --title "IO Domain Checklist" --menu --nocancel\
-	"Get the corresponding value from the hardware schematic diagram" 15 60 2 \
+	"Get the corresponding value from the hardware schematic diagram" 15 60 3 \
 	"1800000" "VCCIO7 Supply Power Voltage(uV)" \
+	"3000000" "VCCIO7 Supply Power Voltage(uV)" \
 	"3300000" "VCCIO7 Supply Power Voltage(uV)" 3>&1 1>&2 2>&3)
 	exitstatus=$?
 	if [ $exitstatus != 0 ]; then
diff --git a/kernel/scripts/mkcompile_h b/kernel/scripts/mkcompile_h
index 19de4cd..a4bde25 100755
--- a/kernel/scripts/mkcompile_h
+++ b/kernel/scripts/mkcompile_h
@@ -5,8 +5,9 @@
 ARCH=$2
 SMP=$3
 PREEMPT=$4
-CC=$5
-LD=$6
+RT=$5
+CC=$6
+LD=$7
 
 vecho() { [ "${quiet}" = "silent_" ] || echo "$@" ; }
 
@@ -54,6 +55,7 @@
 CONFIG_FLAGS=""
 if [ -n "$SMP" ] ; then CONFIG_FLAGS="SMP"; fi
 if [ -n "$PREEMPT" ] ; then CONFIG_FLAGS="$CONFIG_FLAGS PREEMPT"; fi
+if [ -n "$RT" ] ; then CONFIG_FLAGS="$CONFIG_FLAGS RT"; fi
 UTS_VERSION="$UTS_VERSION $CONFIG_FLAGS $TIMESTAMP"
 
 # Truncate to maximum length
diff --git a/kernel/scripts/mkimg b/kernel/scripts/mkimg
index 01b4b3c..0d3157d 100755
--- a/kernel/scripts/mkimg
+++ b/kernel/scripts/mkimg
@@ -245,9 +245,9 @@
 fi
 scripts/resource_tool ${DTB_PATH} ${LOGO} ${LOGO_KERNEL} >/dev/null
 
-if [ "${ARCH}" == "arm64" ]; then
-	${srctree}/scripts/io-domain.sh ${srctree}/arch/arm64/boot/dts/rockchip/.${DTB}
-fi
+#if [ "${ARCH}" == "arm64" ]; then
+#	${srctree}/scripts/io-domain.sh ${srctree}/arch/arm64/boot/dts/rockchip/.${DTB}
+#fi
 
 echo "  Image:  resource.img (with ${DTB} ${LOGO} ${LOGO_KERNEL}) is ready"
 
diff --git a/kernel/security/apparmor/include/path.h b/kernel/security/apparmor/include/path.h
index b6380c5..12abfdd 100644
--- a/kernel/security/apparmor/include/path.h
+++ b/kernel/security/apparmor/include/path.h
@@ -40,8 +40,10 @@
 
 #include <linux/percpu.h>
 #include <linux/preempt.h>
+#include <linux/locallock.h>
 
 DECLARE_PER_CPU(struct aa_buffers, aa_buffers);
+DECLARE_LOCAL_IRQ_LOCK(aa_buffers_lock);
 
 #define ASSIGN(FN, A, X, N) ((X) = FN(A, N))
 #define EVAL1(FN, A, X) ASSIGN(FN, A, X, 0) /*X = FN(0)*/
@@ -51,7 +53,17 @@
 
 #define for_each_cpu_buffer(I) for ((I) = 0; (I) < MAX_PATH_BUFFERS; (I)++)
 
-#ifdef CONFIG_DEBUG_PREEMPT
+#ifdef CONFIG_PREEMPT_RT_BASE
+static inline void AA_BUG_PREEMPT_ENABLED(const char *s)
+{
+	struct local_irq_lock *lv;
+
+	lv = this_cpu_ptr(&aa_buffers_lock);
+	WARN_ONCE(lv->owner != current,
+		  "__get_buffer without aa_buffers_lock\n");
+}
+
+#elif defined(CONFIG_DEBUG_PREEMPT)
 #define AA_BUG_PREEMPT_ENABLED(X) AA_BUG(preempt_count() <= 0, X)
 #else
 #define AA_BUG_PREEMPT_ENABLED(X) /* nop */
@@ -67,14 +79,15 @@
 
 #define get_buffers(X...)						\
 do {									\
-	struct aa_buffers *__cpu_var = get_cpu_ptr(&aa_buffers);	\
+	struct aa_buffers *__cpu_var;					\
+	__cpu_var = get_locked_ptr(aa_buffers_lock, &aa_buffers);	\
 	__get_buffers(__cpu_var, X);					\
 } while (0)
 
 #define put_buffers(X, Y...)		\
 do {					\
 	__put_buffers(X, Y);		\
-	put_cpu_ptr(&aa_buffers);	\
+	put_locked_ptr(aa_buffers_lock, &aa_buffers);	\
 } while (0)
 
 #endif /* __AA_PATH_H */
diff --git a/kernel/security/apparmor/lsm.c b/kernel/security/apparmor/lsm.c
index 898752b..690c8fc 100644
--- a/kernel/security/apparmor/lsm.c
+++ b/kernel/security/apparmor/lsm.c
@@ -45,7 +45,7 @@
 int apparmor_initialized;
 
 DEFINE_PER_CPU(struct aa_buffers, aa_buffers);
-
+DEFINE_LOCAL_IRQ_LOCK(aa_buffers_lock);
 
 /*
  * LSM hook functions
diff --git a/kernel/sound/core/control_compat.c b/kernel/sound/core/control_compat.c
index 3fc2166..00d826b 100644
--- a/kernel/sound/core/control_compat.c
+++ b/kernel/sound/core/control_compat.c
@@ -319,7 +319,9 @@
 	err = snd_power_wait(card, SNDRV_CTL_POWER_D0);
 	if (err < 0)
 		goto error;
+	down_read(&card->controls_rwsem);
 	err = snd_ctl_elem_read(card, data);
+	up_read(&card->controls_rwsem);
 	if (err < 0)
 		goto error;
 	err = copy_ctl_value_to_user(userdata, valuep, data, type, count);
@@ -347,7 +349,9 @@
 	err = snd_power_wait(card, SNDRV_CTL_POWER_D0);
 	if (err < 0)
 		goto error;
+	down_write(&card->controls_rwsem);
 	err = snd_ctl_elem_write(card, file, data);
+	up_write(&card->controls_rwsem);
 	if (err < 0)
 		goto error;
 	err = copy_ctl_value_to_user(userdata, valuep, data, type, count);
diff --git a/kernel/sound/core/pcm_dmaengine.c b/kernel/sound/core/pcm_dmaengine.c
index 02d3fb4..587489a 100644
--- a/kernel/sound/core/pcm_dmaengine.c
+++ b/kernel/sound/core/pcm_dmaengine.c
@@ -27,6 +27,7 @@
 #include <sound/soc.h>
 
 #include <sound/dmaengine_pcm.h>
+#include "pcm_local.h"
 
 struct dmaengine_pcm_runtime_data {
 	struct dma_chan *dma_chan;
@@ -140,11 +141,20 @@
 static void dmaengine_pcm_dma_complete(void *arg)
 {
 	struct snd_pcm_substream *substream = arg;
-	struct dmaengine_pcm_runtime_data *prtd = substream_to_prtd(substream);
+	struct dmaengine_pcm_runtime_data *prtd;
+
+	snd_pcm_stream_lock_irq(substream);
+	if (PCM_RUNTIME_CHECK(substream)) {
+		snd_pcm_stream_unlock_irq(substream);
+		return;
+	}
+
+	prtd = substream_to_prtd(substream);
 
 	prtd->pos += snd_pcm_lib_period_bytes(substream);
 	if (prtd->pos >= snd_pcm_lib_buffer_bytes(substream))
 		prtd->pos = 0;
+	snd_pcm_stream_unlock_irq(substream);
 
 	snd_pcm_period_elapsed(substream);
 }
diff --git a/kernel/sound/core/pcm_lib.c b/kernel/sound/core/pcm_lib.c
index 64f5e48..546b9d6 100644
--- a/kernel/sound/core/pcm_lib.c
+++ b/kernel/sound/core/pcm_lib.c
@@ -43,6 +43,7 @@
 #define trace_xrun(substream)
 #define trace_hw_ptr_error(substream, reason)
 #define trace_applptr(substream, prev, curr)
+#define trace_applptr_start(substream, frame)
 #endif
 
 #define STRING_LENGTH_OF_INT 12
@@ -2139,6 +2140,8 @@
 	if (err < 0)
 		return err;
 
+	trace_applptr_start(substream, size);
+
 	is_playback = substream->stream == SNDRV_PCM_STREAM_PLAYBACK;
 	if (interleaved) {
 		if (runtime->access != SNDRV_PCM_ACCESS_RW_INTERLEAVED &&
diff --git a/kernel/sound/core/pcm_trace.h b/kernel/sound/core/pcm_trace.h
index f18da20..535fbaa 100644
--- a/kernel/sound/core/pcm_trace.h
+++ b/kernel/sound/core/pcm_trace.h
@@ -141,6 +141,32 @@
 	)
 );
 
+TRACE_EVENT(applptr_start,
+	TP_PROTO(struct snd_pcm_substream *substream, snd_pcm_uframes_t size),
+	TP_ARGS(substream, size),
+	TP_STRUCT__entry(
+		__field( unsigned int, card )
+		__field( unsigned int, device )
+		__field( unsigned int, number )
+		__field( unsigned int, stream )
+		__field( snd_pcm_uframes_t, size )
+	),
+	TP_fast_assign(
+		__entry->card = (substream)->pcm->card->number;
+		__entry->device = (substream)->pcm->device;
+		__entry->number = (substream)->number;
+		__entry->stream = (substream)->stream;
+		__entry->size = (size);
+	),
+	TP_printk("pcmC%dD%d%s/sub%d: size=%lu",
+		__entry->card,
+		__entry->device,
+		__entry->stream ? "c" : "p",
+		__entry->number,
+		__entry->size
+	)
+);
+
 #endif /* _PCM_TRACE_H */
 
 /* This part must be outside protection */
diff --git a/kernel/sound/soc/codecs/Kconfig b/kernel/sound/soc/codecs/Kconfig
index ff3c7fc..d57ba80 100644
--- a/kernel/sound/soc/codecs/Kconfig
+++ b/kernel/sound/soc/codecs/Kconfig
@@ -135,6 +135,7 @@
 	select SND_SOC_RK3228
 	select SND_SOC_RK3308
 	select SND_SOC_RK3328
+	select SND_SOC_RK3528
 	select SND_SOC_RK817 if I2C
 	select SND_SOC_RT274 if I2C
 	select SND_SOC_RT286 if I2C
@@ -840,6 +841,10 @@
 	select REGMAP_MMIO
 	tristate "Rockchip RK3328 CODEC"
 
+config SND_SOC_RK3528
+	select REGMAP_MMIO
+	tristate "Rockchip RK3528 CODEC"
+
 config SND_SOC_RK630
 	tristate "Rockchip RK630 CODEC"
 	depends on MFD_RK630
diff --git a/kernel/sound/soc/codecs/Makefile b/kernel/sound/soc/codecs/Makefile
index 4fb7a24..2518f6a 100644
--- a/kernel/sound/soc/codecs/Makefile
+++ b/kernel/sound/soc/codecs/Makefile
@@ -139,6 +139,7 @@
 snd-soc-rk3228-objs := rk3228_codec.o
 snd-soc-rk3308-objs := rk3308_codec.o
 snd-soc-rk3328-objs := rk3328_codec.o
+snd-soc-rk3528-objs := rk3528_codec.o
 snd-soc-rk630-objs := rk630_codec.o
 snd-soc-rk817-objs := rk817_codec.o
 snd-soc-rk-codec-digital-objs := rk_codec_digital.o
@@ -415,6 +416,7 @@
 obj-$(CONFIG_SND_SOC_RK3228)	+= snd-soc-rk3228.o
 obj-$(CONFIG_SND_SOC_RK3308)	+= snd-soc-rk3308.o
 obj-$(CONFIG_SND_SOC_RK3328)	+= snd-soc-rk3328.o
+obj-$(CONFIG_SND_SOC_RK3528)	+= snd-soc-rk3528.o
 obj-$(CONFIG_SND_SOC_RK630)	+= snd-soc-rk630.o
 obj-$(CONFIG_SND_SOC_RK817)	+= snd-soc-rk817.o
 obj-$(CONFIG_SND_SOC_RK_CODEC_DIGITAL)	+= snd-soc-rk-codec-digital.o
diff --git a/kernel/sound/soc/codecs/hdmi-codec.c b/kernel/sound/soc/codecs/hdmi-codec.c
index 0cb4976..93fa207 100644
--- a/kernel/sound/soc/codecs/hdmi-codec.c
+++ b/kernel/sound/soc/codecs/hdmi-codec.c
@@ -14,6 +14,7 @@
  */
 #include <linux/module.h>
 #include <linux/string.h>
+#include <linux/extcon-provider.h>
 #include <sound/core.h>
 #include <sound/jack.h>
 #include <sound/pcm.h>
@@ -277,6 +278,11 @@
 	  .mask = FL | FR | LFE | FC | RL | RR | FLC | FRC },
 };
 
+static const unsigned int hdmi_extcon_cable[] = {
+	EXTCON_DISP_HDMI_AUDIO,
+	EXTCON_NONE,
+};
+
 struct hdmi_codec_priv {
 	struct hdmi_codec_pdata hcd;
 	struct snd_soc_dai_driver *daidrv;
@@ -288,6 +294,7 @@
 	unsigned int chmap_idx;
 	unsigned int mode;
 	struct snd_soc_jack *jack;
+	struct extcon_dev *edev;
 	unsigned int jack_status;
 };
 
@@ -498,7 +505,8 @@
 	WARN_ON(hcp->current_stream != substream);
 
 	hcp->chmap_idx = HDMI_CODEC_CHMAP_IDX_UNKNOWN;
-	hcp->hcd.ops->audio_shutdown(dai->dev->parent, hcp->hcd.data);
+	if (hcp->hcd.ops->audio_shutdown)
+		hcp->hcd.ops->audio_shutdown(dai->dev->parent, hcp->hcd.data);
 
 	mutex_lock(&hcp->current_stream_lock);
 	hcp->current_stream = NULL;
@@ -774,10 +782,48 @@
 {
 	struct hdmi_codec_priv *hcp = dev_get_drvdata(dev);
 
-	if (plugged)
+	if (plugged) {
 		hdmi_codec_jack_report(hcp, SND_JACK_LINEOUT);
-	else
+		extcon_set_state_sync(hcp->edev,
+				      EXTCON_DISP_HDMI_AUDIO, true);
+	} else {
 		hdmi_codec_jack_report(hcp, 0);
+		extcon_set_state_sync(hcp->edev,
+				      EXTCON_DISP_HDMI_AUDIO, false);
+	}
+
+	mutex_lock(&hcp->current_stream_lock);
+	if (hcp->current_stream) {
+		/*
+		 * Workaround for HDMIIN and HDMIOUT plug-{in,out} when streaming.
+		 *
+		 * Actually, we should do stop stream both for HDMI_{OUT,IN} on
+		 * plug-{out,in} event. but for better experience and depop stream,
+		 * we optimize as follows:
+		 *
+		 * a) Do stop stream for HDMIIN on plug-out when streaming.
+		 * because HDMIIN work as SLAVE mode, CLK lost after HDMI cable
+		 * plugged out which will make stream stuck until ALSA timeout(10s).
+		 * so, for better experience, we should stop stream at the moment.
+		 *
+		 * b) Do stop stream for HDMIOUT on plug-in when streaming.
+		 * because HDMIOUT work as MASTER mode, there is no clk-issue like
+		 * HDMIIN, but, on HDR situation, HDMI will be reconfigured which
+		 * make HDMI audio configure lost, especially for NLPCM/HBR bitstream
+		 * which require IEC937 packet alignment, so, for this situation,
+		 * we stop stream to notify user to re-open and configure sound card
+		 * and then go on streaming.
+		 */
+		int stream = hcp->current_stream->stream;
+
+		if (stream == SNDRV_PCM_STREAM_PLAYBACK && plugged)
+			snd_pcm_stop(hcp->current_stream, SNDRV_PCM_STATE_SETUP);
+		else if (stream == SNDRV_PCM_STREAM_CAPTURE && !plugged)
+			snd_pcm_stop(hcp->current_stream, SNDRV_PCM_STATE_DISCONNECTED);
+
+		dev_dbg(dev, "stream[%d]: %s\n", stream, plugged ? "plug in" : "plug out");
+	}
+	mutex_unlock(&hcp->current_stream_lock);
 }
 
 static int hdmi_codec_set_jack(struct snd_soc_component *component,
@@ -884,8 +930,7 @@
 	}
 
 	dai_count = hcd->i2s + hcd->spdif;
-	if (dai_count < 1 || !hcd->ops || !hcd->ops->hw_params ||
-	    !hcd->ops->audio_shutdown) {
+	if (dai_count < 1 || !hcd->ops || !hcd->ops->hw_params) {
 		dev_err(dev, "%s: Invalid parameters\n", __func__);
 		return -EINVAL;
 	}
@@ -916,6 +961,18 @@
 
 	dev_set_drvdata(dev, hcp);
 
+	hcp->edev = devm_extcon_dev_allocate(&pdev->dev, hdmi_extcon_cable);
+	if (IS_ERR(hcp->edev)) {
+		dev_err(&pdev->dev, "Failed to allocate extcon device\n");
+		return -ENOMEM;
+	}
+
+	ret = devm_extcon_dev_register(&pdev->dev, hcp->edev);
+	if (ret < 0) {
+		dev_err(&pdev->dev, "Failed to register extcon device\n");
+		return ret;
+	}
+
 	ret = devm_snd_soc_register_component(dev, &hdmi_driver, hcp->daidrv,
 				     dai_count);
 	if (ret) {
diff --git a/kernel/sound/soc/codecs/rk312x_codec.c b/kernel/sound/soc/codecs/rk312x_codec.c
index 085c20a..2c742dc 100644
--- a/kernel/sound/soc/codecs/rk312x_codec.c
+++ b/kernel/sound/soc/codecs/rk312x_codec.c
@@ -1424,8 +1424,7 @@
 			    struct snd_pcm_hw_params *params,
 			    struct snd_soc_dai *dai)
 {
-	struct snd_soc_pcm_runtime *rtd = substream->private_data;
-	struct snd_soc_component *component = rtd->codec_dai->component;
+	struct snd_soc_component *component = dai->component;
 	struct rk312x_codec_priv *rk312x = rk312x_priv;
 	unsigned int rate = params_rate(params);
 	unsigned int div;
diff --git a/kernel/sound/soc/codecs/rk3528_codec.c b/kernel/sound/soc/codecs/rk3528_codec.c
new file mode 100644
index 0000000..4e55c3e
--- /dev/null
+++ b/kernel/sound/soc/codecs/rk3528_codec.c
@@ -0,0 +1,771 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * rk3528_codec.c - Rockchip RK3528 SoC Codec Driver
+ *
+ * Copyright (C) 2022 Rockchip Electronics Co., Ltd.
+ */
+
+#include <linux/clk.h>
+#include <linux/device.h>
+#include <linux/delay.h>
+#include <linux/module.h>
+#include <linux/of_gpio.h>
+#include <linux/of_platform.h>
+#include <linux/platform_device.h>
+#include <linux/pm_runtime.h>
+#include <linux/regmap.h>
+#include <linux/reset.h>
+#include <sound/pcm_params.h>
+#include <sound/soc.h>
+#include <sound/tlv.h>
+
+#include "rk3528_codec.h"
+
+#define CODEC_DRV_NAME			"rk3528-acodec"
+
+struct rk3528_codec_priv {
+	const struct device *plat_dev;
+	struct reset_control *reset;
+	struct regmap *regmap;
+	struct clk *pclk;
+	struct clk *mclk;
+	struct gpio_desc *pa_ctl_gpio;
+	struct snd_soc_component *component;
+	u32 pa_ctl_delay_ms;
+};
+
+static void rk3528_codec_pa_ctrl(struct rk3528_codec_priv *rk3528, bool on)
+{
+	if (!rk3528->pa_ctl_gpio)
+		return;
+
+	if (on) {
+		gpiod_direction_output(rk3528->pa_ctl_gpio, on);
+		msleep(rk3528->pa_ctl_delay_ms);
+	} else {
+		gpiod_direction_output(rk3528->pa_ctl_gpio, on);
+	}
+}
+
+static int rk3528_codec_reset(struct snd_soc_component *component)
+{
+	struct rk3528_codec_priv *rk3528 = snd_soc_component_get_drvdata(component);
+
+	reset_control_assert(rk3528->reset);
+	usleep_range(10000, 11000);		/* estimated value */
+	reset_control_deassert(rk3528->reset);
+
+	regmap_update_bits(rk3528->regmap, ACODEC_DIG00,
+			   ACODEC_DAC_RST_MASK |
+			   ACODEC_SYS_RST_MASK,
+			   ACODEC_DAC_RST_N |
+			   ACODEC_SYS_RST_N);
+	regmap_update_bits(rk3528->regmap, ACODEC_DIG02,
+			   ACODEC_DAC_I2S_RST_MASK,
+			   ACODEC_DAC_I2S_RST_N);
+	usleep_range(10000, 11000);		/* estimated value */
+	regmap_update_bits(rk3528->regmap, ACODEC_DIG00,
+			   ACODEC_DAC_RST_MASK |
+			   ACODEC_SYS_RST_MASK,
+			   ACODEC_DAC_RST_P |
+			   ACODEC_SYS_RST_P);
+	regmap_update_bits(rk3528->regmap, ACODEC_DIG02,
+			   ACODEC_DAC_I2S_RST_MASK,
+			   ACODEC_DAC_I2S_RST_P);
+
+	return 0;
+}
+
+static int rk3528_codec_power_on(struct rk3528_codec_priv *rk3528)
+{
+	/* vendor step 0, Supply the power of the digital part and reset the audio codec. */
+	/* vendor step 1 */
+	regmap_update_bits(rk3528->regmap, ACODEC_ANA08,
+			   ACODEC_DAC_L_POP_CTRL_MASK,
+			   ACODEC_DAC_L_POP_CTRL_ON);
+	regmap_update_bits(rk3528->regmap, ACODEC_ANA0C,
+			   ACODEC_DAC_R_POP_CTRL_MASK,
+			   ACODEC_DAC_R_POP_CTRL_ON);
+	/* vendor step 2 */
+	regmap_update_bits(rk3528->regmap, ACODEC_ANA01,
+			   ACODEC_VREF_SEL_MASK, ACODEC_VREF_SEL(0xff));
+	/* vendor step 3, supply the power of the analog part */
+	/* vendor step 4 */
+	regmap_update_bits(rk3528->regmap, ACODEC_ANA00,
+			   ACODEC_VREF_MASK, ACODEC_VREF_EN);
+
+	/* vendor step 5, Wait until the voltage of VCM keeps stable at the AVDD/2. */
+	usleep_range(20000, 22000);
+	/* vendor step 6 */
+	regmap_update_bits(rk3528->regmap, ACODEC_ANA01,
+			   ACODEC_VREF_SEL_MASK, ACODEC_VREF_SEL(2));
+	return 0;
+}
+
+static int rk3528_codec_power_off(struct rk3528_codec_priv *rk3528)
+{
+	/*
+	 * vendor step 0. Keep the power on and disable the DAC and ADC path.
+	 */
+	/* vendor step 1 */
+	regmap_update_bits(rk3528->regmap, ACODEC_ANA01,
+			   ACODEC_VREF_SEL_MASK, ACODEC_VREF_SEL(0xff));
+	/* vendor step 2 */
+	/* vendor step 3 */
+	regmap_update_bits(rk3528->regmap, ACODEC_ANA00,
+			   ACODEC_VREF_MASK, ACODEC_VREF_DIS);
+	/* vendor step 4. Wait until the voltage of VCM keep stable at AGND. */
+	usleep_range(20000, 22000);
+	/* vendor step 5, power off the analog power supply */
+	/* vendor step 6, power off the digital power supply */
+
+	return 0;
+}
+
+static int rk3528_codec_dac_enable(struct rk3528_codec_priv *rk3528)
+{
+	/* vendor step 0, power up the codec and input the mute signal */
+	/* vendor step 1 */
+	regmap_update_bits(rk3528->regmap, ACODEC_ANA00,
+			   ACODEC_IBIAS_DAC_MASK,
+			   ACODEC_IBIAS_DAC_EN);
+	/* vendor step 2 */
+	regmap_update_bits(rk3528->regmap, ACODEC_ANA08,
+			   ACODEC_DAC_L_BUF_MASK,
+			   ACODEC_DAC_L_BUF_EN);
+	regmap_update_bits(rk3528->regmap, ACODEC_ANA0C,
+			   ACODEC_DAC_R_BUF_MASK,
+			   ACODEC_DAC_R_BUF_EN);
+	/* vendor step 3 */
+	regmap_update_bits(rk3528->regmap, ACODEC_ANA08,
+			   ACODEC_DAC_L_POP_CTRL_MASK,
+			   ACODEC_DAC_L_POP_CTRL_ON);
+	regmap_update_bits(rk3528->regmap, ACODEC_ANA0C,
+			   ACODEC_DAC_R_POP_CTRL_MASK,
+			   ACODEC_DAC_R_POP_CTRL_ON);
+	/* vendor step 4 */
+	regmap_update_bits(rk3528->regmap, ACODEC_ANA09,
+			   ACODEC_LINEOUT_L_MASK,
+			   ACODEC_LINEOUT_L_EN);
+	regmap_update_bits(rk3528->regmap, ACODEC_ANA0D,
+			   ACODEC_LINEOUT_R_MASK,
+			   ACODEC_LINEOUT_R_EN);
+	/* vendor step 5 */
+	regmap_update_bits(rk3528->regmap, ACODEC_ANA09,
+			   ACODEC_LINEOUT_L_INIT_MASK,
+			   ACODEC_LINEOUT_L_INIT_WORK);
+	regmap_update_bits(rk3528->regmap, ACODEC_ANA0D,
+			   ACODEC_LINEOUT_R_INIT_MASK,
+			   ACODEC_LINEOUT_R_INIT_WORK);
+	/* vendor step 6 */
+	regmap_update_bits(rk3528->regmap, ACODEC_ANA08,
+			   ACODEC_DAC_L_VREF_MASK,
+			   ACODEC_DAC_L_VREF_EN);
+	regmap_update_bits(rk3528->regmap, ACODEC_ANA0C,
+			   ACODEC_DAC_R_VREF_MASK,
+			   ACODEC_DAC_R_VREF_EN);
+	/* vendor step 7 */
+	regmap_update_bits(rk3528->regmap, ACODEC_ANA08,
+			   ACODEC_DAC_L_CLK_MASK,
+			   ACODEC_DAC_L_CLK_EN);
+	regmap_update_bits(rk3528->regmap, ACODEC_ANA0C,
+			   ACODEC_DAC_R_CLK_MASK,
+			   ACODEC_DAC_R_CLK_EN);
+	/* vendor step 8 */
+	regmap_update_bits(rk3528->regmap, ACODEC_ANA08,
+			   ACODEC_DAC_L_MASK,
+			   ACODEC_DAC_L_EN);
+	regmap_update_bits(rk3528->regmap, ACODEC_ANA0C,
+			   ACODEC_DAC_R_MASK,
+			   ACODEC_DAC_R_EN);
+	/* vendor step 9 */
+	regmap_update_bits(rk3528->regmap, ACODEC_ANA08,
+			   ACODEC_DAC_L_INIT_MASK,
+			   ACODEC_DAC_L_WORK);
+	regmap_update_bits(rk3528->regmap, ACODEC_ANA0C,
+			   ACODEC_DAC_R_INIT_MASK,
+			   ACODEC_DAC_R_WORK);
+	/* vendor step 10 */
+	regmap_update_bits(rk3528->regmap, ACODEC_ANA09,
+			   ACODEC_LINEOUT_L_MUTE_MASK,
+			   ACODEC_LINEOUT_L_WORK);
+	regmap_update_bits(rk3528->regmap, ACODEC_ANA0D,
+			   ACODEC_LINEOUT_R_MUTE_MASK,
+			   ACODEC_LINEOUT_R_WORK);
+	/* vendor step 11, select the gain */
+	/* vendor step 12, play music */
+
+	return 0;
+}
+
+static int rk3528_codec_dac_disable(struct rk3528_codec_priv *rk3528)
+{
+	/* vendor step 0, keep the dac channel work and input the mute signal */
+	/* vendor step 1, select the gain */
+	/* vendor step 2 */
+	regmap_update_bits(rk3528->regmap, ACODEC_ANA09,
+			   ACODEC_LINEOUT_L_MUTE_MASK,
+			   ACODEC_LINEOUT_L_MUTE);
+	regmap_update_bits(rk3528->regmap, ACODEC_ANA0D,
+			   ACODEC_LINEOUT_R_MUTE_MASK,
+			   ACODEC_LINEOUT_R_MUTE);
+	/* vendor step 3 */
+	regmap_update_bits(rk3528->regmap, ACODEC_ANA09,
+			   ACODEC_LINEOUT_L_INIT_MASK,
+			   ACODEC_LINEOUT_L_INIT);
+	regmap_update_bits(rk3528->regmap, ACODEC_ANA0D,
+			   ACODEC_LINEOUT_R_INIT_MASK,
+			   ACODEC_LINEOUT_R_INIT);
+	/* vendor step 4 */
+	regmap_update_bits(rk3528->regmap, ACODEC_ANA09,
+			   ACODEC_LINEOUT_L_MASK,
+			   ACODEC_LINEOUT_L_DIS);
+	regmap_update_bits(rk3528->regmap, ACODEC_ANA0D,
+			   ACODEC_LINEOUT_R_MASK,
+			   ACODEC_LINEOUT_R_DIS);
+	/* vendor step 5 */
+	regmap_update_bits(rk3528->regmap, ACODEC_ANA08,
+			   ACODEC_DAC_L_MASK,
+			   ACODEC_DAC_L_DIS);
+	regmap_update_bits(rk3528->regmap, ACODEC_ANA0C,
+			   ACODEC_DAC_R_MASK,
+			   ACODEC_DAC_R_DIS);
+	/* vendor step 6 */
+	regmap_update_bits(rk3528->regmap, ACODEC_ANA08,
+			   ACODEC_DAC_L_CLK_MASK,
+			   ACODEC_DAC_L_CLK_DIS);
+	regmap_update_bits(rk3528->regmap, ACODEC_ANA0C,
+			   ACODEC_DAC_R_CLK_MASK,
+			   ACODEC_DAC_R_CLK_DIS);
+	/* vendor step 7 */
+	regmap_update_bits(rk3528->regmap, ACODEC_ANA08,
+			   ACODEC_DAC_L_VREF_MASK,
+			   ACODEC_DAC_L_VREF_DIS);
+	regmap_update_bits(rk3528->regmap, ACODEC_ANA0C,
+			   ACODEC_DAC_R_VREF_MASK,
+			   ACODEC_DAC_R_VREF_DIS);
+	/* vendor step 8 */
+	regmap_update_bits(rk3528->regmap, ACODEC_ANA08,
+			   ACODEC_DAC_L_POP_CTRL_MASK,
+			   ACODEC_DAC_L_POP_CTRL_OFF);
+	regmap_update_bits(rk3528->regmap, ACODEC_ANA0C,
+			   ACODEC_DAC_R_POP_CTRL_MASK,
+			   ACODEC_DAC_R_POP_CTRL_OFF);
+	/* vendor step 9 */
+	regmap_update_bits(rk3528->regmap, ACODEC_ANA08,
+			   ACODEC_DAC_L_BUF_MASK,
+			   ACODEC_DAC_L_BUF_DIS);
+	regmap_update_bits(rk3528->regmap, ACODEC_ANA0C,
+			   ACODEC_DAC_R_BUF_MASK,
+			   ACODEC_DAC_R_BUF_DIS);
+	/* vendor step 10 */
+	regmap_update_bits(rk3528->regmap, ACODEC_ANA00,
+			   ACODEC_IBIAS_DAC_MASK,
+			   ACODEC_IBIAS_DAC_DIS);
+	/* vendor step 9 */
+	regmap_update_bits(rk3528->regmap, ACODEC_ANA08,
+			   ACODEC_DAC_L_INIT_MASK,
+			   ACODEC_DAC_L_INIT);
+	regmap_update_bits(rk3528->regmap, ACODEC_ANA0C,
+			   ACODEC_DAC_R_INIT_MASK,
+			   ACODEC_DAC_R_INIT);
+
+	return 0;
+}
+
+static int rk3528_codec_dac_dig_config(struct rk3528_codec_priv *rk3528,
+				       struct snd_pcm_hw_params *params)
+{
+	unsigned int dac_aif1 = 0;
+
+	switch (params_format(params)) {
+	case SNDRV_PCM_FORMAT_S16_LE:
+		dac_aif1 |= ACODEC_DAC_I2S_16B;
+		break;
+	case SNDRV_PCM_FORMAT_S20_3LE:
+		dac_aif1 |= ACODEC_DAC_I2S_20B;
+		break;
+	case SNDRV_PCM_FORMAT_S24_LE:
+		dac_aif1 |= ACODEC_DAC_I2S_24B;
+		break;
+	case SNDRV_PCM_FORMAT_S32_LE:
+		dac_aif1 |= ACODEC_DAC_I2S_32B;
+		break;
+	default:
+		return -EINVAL;
+	}
+
+	dac_aif1 |= ACODEC_DAC_I2S_I2S;
+	regmap_update_bits(rk3528->regmap, ACODEC_DIG01,
+			   ACODEC_DAC_I2S_WL_MASK |
+			   ACODEC_DAC_I2S_FMT_MASK,
+			   dac_aif1);
+	regmap_update_bits(rk3528->regmap, ACODEC_DIG02,
+			   ACODEC_DAC_I2S_RST_MASK,
+			   ACODEC_DAC_I2S_RST_P);
+
+	return 0;
+}
+
+static int rk3528_set_dai_fmt(struct snd_soc_dai *codec_dai,
+			      unsigned int fmt)
+{
+	struct snd_soc_component *component = codec_dai->component;
+	struct rk3528_codec_priv *rk3528 = snd_soc_component_get_drvdata(component);
+	unsigned int dac_aif1 = 0, dac_aif2 = 0;
+
+	switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) {
+	case SND_SOC_DAIFMT_CBS_CFS:
+		dac_aif2 |= ACODEC_DAC_I2S_MST_FUNC_SLAVE;
+		dac_aif2 |= ACODEC_DAC_I2S_MST_IO_SLAVE;
+		break;
+	case SND_SOC_DAIFMT_CBM_CFM:
+		dac_aif2 |= ACODEC_DAC_I2S_MST_FUNC_MASTER;
+		dac_aif2 |= ACODEC_DAC_I2S_MST_IO_MASTER;
+		break;
+	default:
+		return -EINVAL;
+	}
+
+	switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
+	case SND_SOC_DAIFMT_I2S:
+		dac_aif1 |= ACODEC_DAC_I2S_I2S;
+		break;
+	case SND_SOC_DAIFMT_LEFT_J:
+		dac_aif1 |= ACODEC_DAC_I2S_LJM;
+		break;
+	default:
+		return -EINVAL;
+	}
+
+	regmap_update_bits(rk3528->regmap, ACODEC_DIG01,
+			   ACODEC_DAC_I2S_FMT_MASK,
+			   dac_aif1);
+	regmap_update_bits(rk3528->regmap, ACODEC_DIG02,
+			   ACODEC_DAC_I2S_MST_FUNC_MASK |
+			   ACODEC_DAC_I2S_MST_IO_MASK,
+			   dac_aif2);
+
+	return 0;
+}
+
+static int rk3528_mute_stream(struct snd_soc_dai *dai, int mute, int stream)
+{
+	struct snd_soc_component *component = dai->component;
+	struct rk3528_codec_priv *rk3528 = snd_soc_component_get_drvdata(component);
+
+	if (stream == SNDRV_PCM_STREAM_PLAYBACK) {
+		if (mute) {
+			/* Mute DAC LINEOUT */
+			regmap_update_bits(rk3528->regmap,
+					   ACODEC_ANA09,
+					   ACODEC_LINEOUT_L_MUTE_MASK,
+					   ACODEC_LINEOUT_L_MUTE);
+			regmap_update_bits(rk3528->regmap,
+					   ACODEC_ANA0D,
+					   ACODEC_LINEOUT_R_MUTE_MASK,
+					   ACODEC_LINEOUT_R_MUTE);
+			rk3528_codec_pa_ctrl(rk3528, false);
+		} else {
+			/* Unmute DAC LINEOUT */
+			regmap_update_bits(rk3528->regmap,
+					   ACODEC_ANA09,
+					   ACODEC_LINEOUT_L_MUTE_MASK,
+					   ACODEC_LINEOUT_L_WORK);
+			regmap_update_bits(rk3528->regmap,
+					   ACODEC_ANA0D,
+					   ACODEC_LINEOUT_R_MUTE_MASK,
+					   ACODEC_LINEOUT_R_WORK);
+			rk3528_codec_pa_ctrl(rk3528, true);
+		}
+	}
+
+	return 0;
+}
+
+static int rk3528_codec_default_gains(struct rk3528_codec_priv *rk3528)
+{
+	/* Prepare DAC gains */
+	/* set LINEOUT default gains */
+	regmap_update_bits(rk3528->regmap, ACODEC_DIG06,
+			   ACODEC_DAC_DIG_GAIN_MASK,
+			   ACODEC_DAC_DIG_GAIN(ACODEC_DAC_DIG_0DB));
+	regmap_update_bits(rk3528->regmap, ACODEC_ANA0B,
+			   ACODEC_LINEOUT_L_GAIN_MASK,
+			   ACODEC_DAC_LINEOUT_GAIN_0DB);
+	regmap_update_bits(rk3528->regmap, ACODEC_ANA0F,
+			   ACODEC_LINEOUT_R_GAIN_MASK,
+			   ACODEC_DAC_LINEOUT_GAIN_0DB);
+
+	return 0;
+}
+
+static int rk3528_codec_open_playback(struct rk3528_codec_priv *rk3528)
+{
+	rk3528_codec_dac_enable(rk3528);
+
+	return 0;
+}
+
+static int rk3528_codec_close_playback(struct rk3528_codec_priv *rk3528)
+{
+	rk3528_codec_dac_disable(rk3528);
+	return 0;
+}
+
+static int rk3528_codec_dlp_down(struct rk3528_codec_priv *rk3528)
+{
+	return 0;
+}
+
+static int rk3528_codec_dlp_up(struct rk3528_codec_priv *rk3528)
+{
+	rk3528_codec_power_on(rk3528);
+
+	return 0;
+}
+
+static int rk3528_hw_params(struct snd_pcm_substream *substream,
+			    struct snd_pcm_hw_params *params,
+			    struct snd_soc_dai *dai)
+{
+	struct snd_soc_component *component = dai->component;
+	struct rk3528_codec_priv *rk3528 = snd_soc_component_get_drvdata(component);
+
+	if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
+		rk3528_codec_open_playback(rk3528);
+		rk3528_codec_dac_dig_config(rk3528, params);
+	}
+
+	return 0;
+}
+
+static void rk3528_pcm_shutdown(struct snd_pcm_substream *substream,
+				struct snd_soc_dai *dai)
+{
+	struct snd_soc_component *component = dai->component;
+	struct rk3528_codec_priv *rk3528 = snd_soc_component_get_drvdata(component);
+
+	if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
+		rk3528_codec_close_playback(rk3528);
+
+	regcache_cache_only(rk3528->regmap, false);
+	regcache_sync(rk3528->regmap);
+}
+
+static int rk3528_codec_prepare(struct rk3528_codec_priv *rk3528)
+{
+	/* Clear registers for ADC and DAC */
+	rk3528_codec_close_playback(rk3528);
+	rk3528_codec_default_gains(rk3528);
+
+	return 0;
+}
+
+static int rk3528_set_sysclk(struct snd_soc_dai *dai, int clk_id,
+			     unsigned int freq, int dir)
+{
+	struct snd_soc_component *component = dai->component;
+	struct rk3528_codec_priv *rk3528 = snd_soc_component_get_drvdata(component);
+	int ret;
+
+	if (!freq)
+		return 0;
+
+	ret = clk_set_rate(rk3528->mclk, freq);
+	if (ret)
+		dev_err(rk3528->plat_dev, "Failed to set mclk %d\n", ret);
+
+	return ret;
+}
+
+static const struct snd_soc_dai_ops rk3528_dai_ops = {
+	.hw_params = rk3528_hw_params,
+	.set_fmt = rk3528_set_dai_fmt,
+	.mute_stream = rk3528_mute_stream,
+	.shutdown = rk3528_pcm_shutdown,
+	.set_sysclk = rk3528_set_sysclk,
+};
+
+static struct snd_soc_dai_driver rk3528_dai[] = {
+	{
+		.name = "rk3528-hifi",
+		.id = ACODEC_HIFI,
+		.playback = {
+			.stream_name = "HiFi Playback",
+			.channels_min = 1,
+			.channels_max = 2,
+			.rates = SNDRV_PCM_RATE_8000_192000,
+			.formats = (SNDRV_PCM_FMTBIT_S16_LE |
+				    SNDRV_PCM_FMTBIT_S24_LE |
+				    SNDRV_PCM_FMTBIT_S32_LE),
+		},
+		.ops = &rk3528_dai_ops,
+	},
+};
+
+static int rk3528_codec_probe(struct snd_soc_component *component)
+{
+	struct rk3528_codec_priv *rk3528 = snd_soc_component_get_drvdata(component);
+
+	rk3528->component = component;
+	rk3528_codec_reset(component);
+	rk3528_codec_dlp_up(rk3528);
+	rk3528_codec_prepare(rk3528);
+	regcache_cache_only(rk3528->regmap, false);
+	regcache_sync(rk3528->regmap);
+
+	return 0;
+}
+
+static void rk3528_codec_remove(struct snd_soc_component *component)
+{
+	struct rk3528_codec_priv *rk3528 = snd_soc_component_get_drvdata(component);
+
+	rk3528_codec_pa_ctrl(rk3528, false);
+	rk3528_codec_power_off(rk3528);
+	regcache_cache_only(rk3528->regmap, false);
+	regcache_sync(rk3528->regmap);
+}
+
+static int rk3528_codec_suspend(struct snd_soc_component *component)
+{
+	struct rk3528_codec_priv *rk3528 = snd_soc_component_get_drvdata(component);
+
+	rk3528_codec_dlp_down(rk3528);
+	regcache_cache_only(rk3528->regmap, true);
+	clk_disable_unprepare(rk3528->mclk);
+	clk_disable_unprepare(rk3528->pclk);
+
+	return 0;
+}
+
+static int rk3528_codec_resume(struct snd_soc_component *component)
+{
+	struct rk3528_codec_priv *rk3528 = snd_soc_component_get_drvdata(component);
+	int ret = 0;
+
+	ret = clk_prepare_enable(rk3528->pclk);
+	if (ret < 0) {
+		dev_err(rk3528->plat_dev,
+			"Failed to enable acodec pclk: %d\n", ret);
+		goto pclk_error;
+	}
+
+	ret = clk_prepare_enable(rk3528->mclk);
+	if (ret < 0) {
+		dev_err(rk3528->plat_dev,
+			"Failed to enable acodec mclk: %d\n", ret);
+		goto mclk_error;
+	}
+
+	regcache_cache_only(rk3528->regmap, false);
+	ret = regcache_sync(rk3528->regmap);
+	if (ret)
+		goto reg_error;
+
+	rk3528_codec_dlp_up(rk3528);
+
+	return 0;
+reg_error:
+	clk_disable_unprepare(rk3528->mclk);
+mclk_error:
+	clk_disable_unprepare(rk3528->pclk);
+pclk_error:
+	return ret;
+}
+
+static const DECLARE_TLV_DB_SCALE(rk3528_codec_dac_lineout_gain_tlv,
+				  -3900, 150, 600);
+
+static const struct snd_kcontrol_new rk3528_codec_dapm_controls[] = {
+	/* DAC LINEOUT */
+	SOC_SINGLE_RANGE_TLV("DAC LEFT LINEOUT Volume",
+			     ACODEC_ANA0B,
+			     ACODEC_LINEOUT_L_GAIN_SHIFT,
+			     ACODEC_DAC_LINEOUT_GAIN_MIN,
+			     ACODEC_DAC_LINEOUT_GAIN_MAX,
+			     0, rk3528_codec_dac_lineout_gain_tlv),
+	SOC_SINGLE_RANGE_TLV("DAC RIGHT LINEOUT Volume",
+			     ACODEC_ANA0F,
+			     ACODEC_LINEOUT_R_GAIN_SHIFT,
+			     ACODEC_DAC_LINEOUT_GAIN_MIN,
+			     ACODEC_DAC_LINEOUT_GAIN_MAX,
+			     0, rk3528_codec_dac_lineout_gain_tlv),
+};
+
+static const struct snd_soc_component_driver soc_codec_dev_rk3528 = {
+	.probe = rk3528_codec_probe,
+	.remove = rk3528_codec_remove,
+	.suspend = rk3528_codec_suspend,
+	.resume = rk3528_codec_resume,
+	.controls = rk3528_codec_dapm_controls,
+	.num_controls = ARRAY_SIZE(rk3528_codec_dapm_controls),
+};
+
+/* Set the default value or reset value */
+static const struct reg_default rk3528_codec_reg_defaults[] = {
+	{ ACODEC_DIG00, 0x71 },
+	{ ACODEC_DIG03, 0x53 },
+	{ ACODEC_DIG07, 0x03 },
+	{ ACODEC_DIG08, 0xc3 },
+	{ ACODEC_DIG09, 0x28 },
+	{ ACODEC_DIG0A, 0x1 },
+	{ ACODEC_DIG0B, 0x80 },
+	{ ACODEC_DIG0D, 0xc3 },
+	{ ACODEC_DIG0E, 0xc3 },
+	{ ACODEC_DIG10, 0xf1 },
+	{ ACODEC_DIG11, 0xf1 },
+	{ ACODEC_ANA02, 0x77 },
+	{ ACODEC_ANA08, 0x20 },
+	{ ACODEC_ANA0A, 0x8 },
+	{ ACODEC_ANA0C, 0x20 },
+	{ ACODEC_ANA0E, 0x8 },
+};
+
+static bool rk3528_codec_volatile_reg(struct device *dev, unsigned int reg)
+{
+	switch (reg) {
+	case ACODEC_DIG00:
+		return true;
+	default:
+		return false;
+	}
+	return true;
+}
+
+static const struct regmap_config rk3528_codec_regmap_config = {
+	.reg_bits = 32,
+	.reg_stride = 4,
+	.val_bits = 32,
+	.max_register = ACODEC_REG_MAX,
+	.volatile_reg = rk3528_codec_volatile_reg,
+	.reg_defaults = rk3528_codec_reg_defaults,
+	.num_reg_defaults = ARRAY_SIZE(rk3528_codec_reg_defaults),
+	.cache_type = REGCACHE_FLAT,
+};
+
+static const struct of_device_id rk3528_codec_of_match[] = {
+	{ .compatible = "rockchip,rk3528-codec", },
+	{},
+};
+
+MODULE_DEVICE_TABLE(of, rk3528_codec_of_match);
+
+static int rk3528_platform_probe(struct platform_device *pdev)
+{
+	struct device_node *np = pdev->dev.of_node;
+	struct rk3528_codec_priv *rk3528;
+	struct resource *res;
+	void __iomem *base;
+	int ret;
+
+	rk3528 = devm_kzalloc(&pdev->dev, sizeof(*rk3528), GFP_KERNEL);
+	if (!rk3528)
+		return -ENOMEM;
+
+	rk3528->plat_dev = &pdev->dev;
+	rk3528->reset = devm_reset_control_get_optional_exclusive(&pdev->dev, "acodec");
+	if (IS_ERR(rk3528->reset))
+		return PTR_ERR(rk3528->reset);
+
+	rk3528->pa_ctl_gpio = devm_gpiod_get_optional(&pdev->dev, "pa-ctl",
+						       GPIOD_OUT_LOW);
+	if (IS_ERR(rk3528->pa_ctl_gpio)) {
+		dev_err(&pdev->dev, "Unable to claim gpio pa-ctl\n");
+		return -EINVAL;
+	}
+
+	if (rk3528->pa_ctl_gpio)
+		of_property_read_u32(np, "pa-ctl-delay-ms",
+				     &rk3528->pa_ctl_delay_ms);
+
+	dev_info(&pdev->dev, "%s pa_ctl_gpio and pa_ctl_delay_ms: %d\n",
+		rk3528->pa_ctl_gpio ? "Use" : "No use",
+		rk3528->pa_ctl_delay_ms);
+
+	/* Close external PA during startup. */
+	rk3528_codec_pa_ctrl(rk3528, false);
+
+	rk3528->pclk = devm_clk_get(&pdev->dev, "pclk");
+	if (IS_ERR(rk3528->pclk)) {
+		dev_err(&pdev->dev, "Can't get acodec pclk\n");
+		return -EINVAL;
+	}
+
+	rk3528->mclk = devm_clk_get(&pdev->dev, "mclk");
+	if (IS_ERR(rk3528->mclk)) {
+		dev_err(&pdev->dev, "Can't get acodec mclk\n");
+		return -EINVAL;
+	}
+
+	ret = clk_prepare_enable(rk3528->pclk);
+	if (ret < 0) {
+		dev_err(&pdev->dev, "Failed to enable acodec pclk: %d\n", ret);
+		return ret;
+	}
+
+	ret = clk_prepare_enable(rk3528->mclk);
+	if (ret < 0) {
+		dev_err(&pdev->dev, "Failed to enable acodec mclk: %d\n", ret);
+		goto failed_1;
+	}
+
+	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+	base = devm_ioremap_resource(&pdev->dev, res);
+	if (IS_ERR(base)) {
+		ret = PTR_ERR(base);
+		dev_err(&pdev->dev, "Failed to ioremap resource\n");
+		goto failed;
+	}
+
+	rk3528->regmap = devm_regmap_init_mmio(&pdev->dev, base,
+					       &rk3528_codec_regmap_config);
+	if (IS_ERR(rk3528->regmap)) {
+		ret = PTR_ERR(rk3528->regmap);
+		dev_err(&pdev->dev, "Failed to regmap mmio\n");
+		goto failed;
+	}
+
+	platform_set_drvdata(pdev, rk3528);
+	ret = devm_snd_soc_register_component(&pdev->dev, &soc_codec_dev_rk3528,
+					      rk3528_dai, ARRAY_SIZE(rk3528_dai));
+	if (ret < 0) {
+		dev_err(&pdev->dev, "Failed to register codec: %d\n", ret);
+		goto failed;
+	}
+
+	return ret;
+
+failed:
+	clk_disable_unprepare(rk3528->mclk);
+failed_1:
+	clk_disable_unprepare(rk3528->pclk);
+
+	return ret;
+}
+
+static int rk3528_platform_remove(struct platform_device *pdev)
+{
+	struct rk3528_codec_priv *rk3528 =
+		(struct rk3528_codec_priv *)platform_get_drvdata(pdev);
+
+	clk_disable_unprepare(rk3528->mclk);
+	clk_disable_unprepare(rk3528->pclk);
+
+	return 0;
+}
+
+static struct platform_driver rk3528_codec_driver = {
+	.driver = {
+		   .name = CODEC_DRV_NAME,
+		   .of_match_table = of_match_ptr(rk3528_codec_of_match),
+	},
+	.probe = rk3528_platform_probe,
+	.remove = rk3528_platform_remove,
+};
+module_platform_driver(rk3528_codec_driver);
+
+MODULE_DESCRIPTION("ASoC rk3528 Codec Driver");
+MODULE_AUTHOR("Jason Zhu <jason.zhu@rock-chips.com>");
+MODULE_LICENSE("GPL");
diff --git a/kernel/sound/soc/codecs/rk3528_codec.h b/kernel/sound/soc/codecs/rk3528_codec.h
new file mode 100644
index 0000000..edcca0e
--- /dev/null
+++ b/kernel/sound/soc/codecs/rk3528_codec.h
@@ -0,0 +1,229 @@
+/* SPDX-License-Identifier: GPL-2.0+ */
+/*
+ * rk3528_codec.h - Rockchip RK3528 SoC Codec Driver
+ *
+ * Copyright (C) 2022 Rockchip Electronics Co., Ltd.
+ */
+
+#ifndef __RK3528_CODEC_H__
+#define __RK3528_CODEC_H__
+
+#define ACODEC_DIG00			0x00 /* REG 0x00 */
+#define ACODEC_DIG01			0x04 /* REG 0x01 */
+#define ACODEC_DIG02			0x08 /* REG 0x02 */
+#define ACODEC_DIG03			0x0c /* REG 0x03 */
+#define ACODEC_DIG04			0x10 /* REG 0x04 */
+#define ACODEC_DIG05			0x14 /* REG 0x05 */
+#define ACODEC_DIG06			0x18 /* REG 0x06 */
+#define ACODEC_DIG07			0x1c /* REG 0x07 */
+#define ACODEC_DIG08			0x20 /* REG 0x08 */
+#define ACODEC_DIG09			0x24 /* REG 0x09 */
+#define ACODEC_DIG0A			0x28 /* REG 0x0a */
+#define ACODEC_DIG0B			0x2c /* REG 0x0b */
+#define ACODEC_DIG0D			0x34 /* REG 0x0d */
+#define ACODEC_DIG0E			0x38 /* REG 0x0e */
+#define ACODEC_DIG10			0x40 /* REG 0x10 */
+#define ACODEC_DIG11			0x44 /* REG 0x11 */
+
+#define ACODEC_ANA00			0x80 /* REG 0x20 */
+#define ACODEC_ANA01			0x84 /* REG 0x21 */
+#define ACODEC_ANA02			0x88 /* REG 0x22 */
+#define ACODEC_ANA08			0xa0 /* REG 0x28 */
+#define ACODEC_ANA09			0xa4 /* REG 0x29 */
+#define ACODEC_ANA0A			0xa8 /* REG 0x2a */
+#define ACODEC_ANA0B			0xac /* REG 0x2b */
+#define ACODEC_ANA0C			0xb0 /* REG 0x2c */
+#define ACODEC_ANA0D			0xb4 /* REG 0x2d */
+#define ACODEC_ANA0E			0xb8 /* REG 0x2e */
+#define ACODEC_ANA0F			0xbc /* REG 0x2f */
+
+#define ACODEC_REG_MAX			ACODEC_ANA0F
+
+/* ACODEC_DIG00 */
+#define ACODEC_DAC_RST_MASK		(0x1 << 4)
+#define ACODEC_DAC_RST_P		(0x1 << 4)
+#define ACODEC_DAC_RST_N		(0x0 << 4)
+#define ACODEC_REG_BIST_EN		(0x1 << 1)
+#define ACODEC_SYS_RST_MASK		(0x1 << 0)
+#define ACODEC_SYS_RST_P		(0x1 << 0)
+#define ACODEC_SYS_RST_N		(0x0 << 0)
+
+/* ACODEC_DIG01 */
+#define ACODEC_DAC_I2S_WL_SHIFT		4
+#define ACODEC_DAC_I2S_WL_MASK		(0x3 << ACODEC_DAC_I2S_WL_SHIFT)
+#define ACODEC_DAC_I2S_32B		(0x3 << ACODEC_DAC_I2S_WL_SHIFT)
+#define ACODEC_DAC_I2S_24B		(0x2 << ACODEC_DAC_I2S_WL_SHIFT)
+#define ACODEC_DAC_I2S_20B		(0x1 << ACODEC_DAC_I2S_WL_SHIFT)
+#define ACODEC_DAC_I2S_16B		(0x0 << ACODEC_DAC_I2S_WL_SHIFT)
+#define ACODEC_DAC_I2S_FMT_SHIFT	2
+#define ACODEC_DAC_I2S_FMT_MASK		(0x3 << ACODEC_DAC_I2S_FMT_SHIFT)
+#define ACODEC_DAC_I2S_I2S		(0x2 << ACODEC_DAC_I2S_FMT_SHIFT)
+#define ACODEC_DAC_I2S_LJM		(0x1 << ACODEC_DAC_I2S_FMT_SHIFT)
+
+/* ACODEC_DIG02 */
+#define ACODEC_DAC_I2S_LRP_MASK		(0x1 << 7)
+#define ACODEC_DAC_I2S_LRP_REVSL	(0x1 << 7)
+#define ACODEC_DAC_I2S_LRP_NORMAL	(0x0 << 7)
+#define ACODEC_DAC_I2S_LR_SWAP		(0x1 << 6)
+#define ACODEC_DAC_I2S_MST_FUNC_MASK	(0x1 << 5)
+#define ACODEC_DAC_I2S_MST_FUNC_MASTER	(0x1 << 5)
+#define ACODEC_DAC_I2S_MST_FUNC_SLAVE	(0x0 << 5)
+#define ACODEC_DAC_I2S_MST_IO_MASK	(0x1 << 4)
+#define ACODEC_DAC_I2S_MST_IO_MASTER	(0x1 << 4)
+#define ACODEC_DAC_I2S_MST_IO_SLAVE	(0x0 << 4)
+#define ACODEC_DAC_I2S_RST_MASK		(0x1 << 0)
+#define ACODEC_DAC_I2S_RST_P		(0x1 << 0)
+#define ACODEC_DAC_I2S_RST_N		(0x0 << 0)
+
+/* ACODEC_DIG03 */
+#define ACODEC_DAC_MUTE_EN		(0x1 << 7)
+#define ACODEC_DAC_MUTE_SR_SHIFT	4
+#define ACODEC_DAC_MUTE_SR_MASK		(0x7 << ACODEC_DAC_MUTE_SR_SHIFT)
+#define ACODEC_DAC_MUTE_SR_96K		(0x7 << ACODEC_DAC_MUTE_SR_SHIFT)
+#define ACODEC_DAC_MUTE_SR_88K2		(0x6 << ACODEC_DAC_MUTE_SR_SHIFT)
+#define ACODEC_DAC_MUTE_SR_48K		(0x5 << ACODEC_DAC_MUTE_SR_SHIFT)
+#define ACODEC_DAC_MUTE_SR_44K1		(0x4 << ACODEC_DAC_MUTE_SR_SHIFT)
+#define ACODEC_DAC_MUTE_SR_32K		(0x3 << ACODEC_DAC_MUTE_SR_SHIFT)
+#define ACODEC_DAC_MUTE_SR_24K		(0x2 << ACODEC_DAC_MUTE_SR_SHIFT)
+#define ACODEC_DAC_MUTE_SR_16K		(0x1 << ACODEC_DAC_MUTE_SR_SHIFT)
+#define ACODEC_DAC_MUTE_SR_8K		(0x0 << ACODEC_DAC_MUTE_SR_SHIFT)
+#define ACODEC_DA_EN			(0x1 << 3)
+#define ACODEC_DITHER_EN		(0x1 << 2)
+#define ACODEC_DITHER_LEVEL		(0x1 << 1)
+#define ACODEC_DITHER_SIGN		(0x1 << 0)
+
+/* ACODEC_DIG04 */
+#define ACODEC_DAC_DEEMP_SEL_MASK	0x3
+#define ACODEC_DAC_DEEMP_48K		0x3
+#define ACODEC_DAC_DEEMP_44K1		0x2
+#define ACODEC_DAC_DEEMP_32K		0x1
+#define ACODEC_DAC_DEEMP_DIS		0x0
+
+/* ACODEC_DIG05 */
+#define ACODEC_DAC_R_BIST_SEL_SHIFT	6
+#define ACODEC_DAC_R_BIST_SEL_MASK	(0x3 << ACODEC_DAC_R_BIST_SEL_SHIFT)
+#define ACODEC_DAC_R_BIST_SEL_L		(0x2 << ACODEC_DAC_R_BIST_SEL_SHIFT)
+#define ACODEC_DAC_R_BIST_SEL_SINE	(0x1 << ACODEC_DAC_R_BIST_SEL_SHIFT)
+#define ACODEC_DAC_R_BIST_SEL_R		(0x0 << ACODEC_DAC_R_BIST_SEL_SHIFT)
+#define ACODEC_DAC_R_MUTE		(0x1 << 4)
+#define ACODEC_DAC_L_BIST_SEL_SHIFT	2
+#define ACODEC_DAC_L_BIST_SEL_MASK	(0x3 << ACODEC_DAC_L_BIST_SEL_SHIFT)
+#define ACODEC_DAC_L_BIST_SEL_R		(0x2 << ACODEC_DAC_L_BIST_SEL_SHIFT)
+#define ACODEC_DAC_L_BIST_SEL_SINE	(0x1 << ACODEC_DAC_L_BIST_SEL_SHIFT)
+#define ACODEC_DAC_L_BIST_SEL_L		(0x0 << ACODEC_DAC_L_BIST_SEL_SHIFT)
+#define ACODEC_DAC_J_MUTE		(0x1 << 0)
+
+/* ACODEC_DIG06 */
+#define ACODEC_DAC_DIG_GAIN_SHIT	0
+#define ACODEC_DAC_DIG_GAIN_MASK	(0xff << ACODEC_DAC_DIG_GAIN_SHIT)
+/*  0.5dB every step , 1: -121dB, 255: 6dB */
+#define ACODEC_DAC_DIG_GAIN(x)		((x) & ACODEC_DAC_DIG_GAIN_MASK)
+#define ACODEC_DAC_DIG_0DB		0xe1
+
+/* ACODEC_ANA00 */
+#define ACODEC_IBIAS_DAC_MASK		(0x1 << 1)
+#define ACODEC_IBIAS_DAC_EN		(0x1 << 1)
+#define ACODEC_IBIAS_DAC_DIS		(0x0 << 1)
+#define ACODEC_VREF_MASK		(0x1 << 0)
+#define ACODEC_VREF_EN			(0x1 << 0)
+#define ACODEC_VREF_DIS			(0x0 << 0)
+
+/* ACODEC_ANA01 */
+#define ACODEC_VREF_SEL_SHIFT		0
+/* Bit 0 is I0, bit 1 is 2 * I0 ... bit 7 is 128 * I0 */
+#define ACODEC_VREF_SEL_MASK		(0xff << ACODEC_VREF_SEL_SHIFT)
+#define ACODEC_VREF_SEL(x)		((x) & ACODEC_VREF_SEL_MASK)
+
+/* ACODEC_ANA02 */
+#define ACODEC_IBIAS_DAC_SEL_SHIFT	0
+/* Ibias_DAC = I0 * (BIT[3]*8+BIT[2]*4+BIT[1]*2+BIT[0]+1) */
+#define ACODEC_IBIAS_DAC_SEL		(0xf << ACODEC_IBIAS_DAC_SEL_SHIFT)
+
+/* ACODEC_ANA08 */
+#define ACODEC_DAC_L_POP_CTRL_SHIFT	5
+#define ACODEC_DAC_L_POP_CTRL_MASK	(0x3 << ACODEC_DAC_L_POP_CTRL_SHIFT)
+#define ACODEC_DAC_L_POP_CTRL_ON	(0x1 << ACODEC_DAC_L_POP_CTRL_SHIFT)
+#define ACODEC_DAC_L_POP_CTRL_OFF	(0x0 << ACODEC_DAC_L_POP_CTRL_SHIFT)
+#define ACODEC_DAC_L_INIT_MASK		(0x1 << 4)
+#define ACODEC_DAC_L_WORK		(0x1 << 4)
+#define ACODEC_DAC_L_INIT		(0x0 << 4)
+#define ACODEC_DAC_L_VREF_MASK		(0x1 << 3)
+#define ACODEC_DAC_L_VREF_EN		(0x1 << 3)
+#define ACODEC_DAC_L_VREF_DIS		(0x0 << 3)
+#define ACODEC_DAC_L_BUF_MASK		(0x1 << 2)
+#define ACODEC_DAC_L_BUF_EN		(0x1 << 2)
+#define ACODEC_DAC_L_BUF_DIS		(0x0 << 2)
+#define ACODEC_DAC_L_CLK_MASK		(0x1 << 1)
+#define ACODEC_DAC_L_CLK_EN		(0x1 << 1)
+#define ACODEC_DAC_L_CLK_DIS		(0x0 << 1)
+#define ACODEC_DAC_L_MASK		(0x1 << 0)
+#define ACODEC_DAC_L_EN			(0x1 << 0)
+#define ACODEC_DAC_L_DIS		(0x0 << 0)
+
+/* ACODEC_ANA09 */
+#define ACODEC_LINEOUT_L_MUTE_MASK	(0x1 << 5)
+#define ACODEC_LINEOUT_L_WORK		(0x1 << 5)
+#define ACODEC_LINEOUT_L_MUTE		(0x0 << 5)
+#define ACODEC_LINEOUT_L_INIT_MASK	(0x1 << 4)
+#define ACODEC_LINEOUT_L_INIT_WORK	(0x1 << 4)
+#define ACODEC_LINEOUT_L_INIT		(0x0 << 4)
+#define ACODEC_LINEOUT_L_MASK		(0x1 << 0)
+#define ACODEC_LINEOUT_L_EN		(0x1 << 0)
+#define ACODEC_LINEOUT_L_DIS		(0x0 << 0)
+
+/* ACODEC_ANA0A */
+#define ACODEC_LINEOUT_L_SEL_SHIFT	0
+#define ACODEC_LINEOUT_L_SEL_MASK	(0xf << ACODEC_LINEOUT_L_SEL_SHIFT)
+
+/* ACODEC_ANA0B */
+#define ACODEC_LINEOUT_L_GAIN_SHIFT	0
+/* 1.5dB every step. 0: -39dB, 0x1f: 0dB */
+#define ACODEC_LINEOUT_L_GAIN_MASK	(0x1f << ACODEC_LINEOUT_L_GAIN_SHIFT)
+
+/* ACODEC_ANA0C */
+#define ACODEC_DAC_R_POP_CTRL_SHIFT	5
+#define ACODEC_DAC_R_POP_CTRL_MASK	(0x3 << ACODEC_DAC_R_POP_CTRL_SHIFT)
+#define ACODEC_DAC_R_POP_CTRL_ON	(0x1 << ACODEC_DAC_R_POP_CTRL_SHIFT)
+#define ACODEC_DAC_R_POP_CTRL_OFF	(0x0 << ACODEC_DAC_R_POP_CTRL_SHIFT)
+#define ACODEC_DAC_R_INIT_MASK		(0x1 << 4)
+#define ACODEC_DAC_R_WORK		(0x1 << 4)
+#define ACODEC_DAC_R_INIT		(0x0 << 4)
+#define ACODEC_DAC_R_VREF_MASK		(0x1 << 3)
+#define ACODEC_DAC_R_VREF_EN		(0x1 << 3)
+#define ACODEC_DAC_R_VREF_DIS		(0x0 << 3)
+#define ACODEC_DAC_R_BUF_MASK		(0x1 << 2)
+#define ACODEC_DAC_R_BUF_EN		(0x1 << 2)
+#define ACODEC_DAC_R_BUF_DIS		(0x0 << 2)
+#define ACODEC_DAC_R_CLK_MASK		(0x1 << 1)
+#define ACODEC_DAC_R_CLK_EN		(0x1 << 1)
+#define ACODEC_DAC_R_CLK_DIS		(0x0 << 1)
+#define ACODEC_DAC_R_MASK		(0x1 << 0)
+#define ACODEC_DAC_R_EN			(0x1 << 0)
+#define ACODEC_DAC_R_DIS		(0x0 << 0)
+
+/* ACODEC_ANA0D */
+#define ACODEC_LINEOUT_R_MUTE_MASK	(0x1 << 5)
+#define ACODEC_LINEOUT_R_WORK		(0x1 << 5)
+#define ACODEC_LINEOUT_R_MUTE		(0x0 << 5)
+#define ACODEC_LINEOUT_R_INIT_MASK	(0x1 << 4)
+#define ACODEC_LINEOUT_R_INIT_WORK	(0x1 << 4)
+#define ACODEC_LINEOUT_R_INIT		(0x0 << 4)
+#define ACODEC_LINEOUT_R_MASK		(0x1 << 0)
+#define ACODEC_LINEOUT_R_EN		(0x1 << 0)
+#define ACODEC_LINEOUT_R_DIS		(0x0 << 0)
+
+/* ACODEC_ANA0E */
+#define ACODEC_LINEOUT_R_SEL_SHIFT	0
+#define ACODEC_LINEOUT_R_SEL_MASK	(0xf << ACODEC_LINEOUT_L_SEL_SHIFT)
+
+/* ACODEC_ANA0F */
+#define ACODEC_LINEOUT_R_GAIN_SHIFT	0
+/* 1.5dB every step. 0: -39dB, 0x1f: 0dB */
+#define ACODEC_LINEOUT_R_GAIN_MASK	(0x1f << ACODEC_LINEOUT_L_GAIN_SHIFT)
+
+#define ACODEC_DAC_LINEOUT_GAIN_MAX		0x1e
+#define ACODEC_DAC_LINEOUT_GAIN_MIN		0
+#define ACODEC_HIFI				0x0
+#define ACODEC_DAC_LINEOUT_GAIN_0DB		0x1a
+
+#endif /* __RK3528_CODEC_H__ */
diff --git a/kernel/sound/soc/codecs/rk817_codec.c b/kernel/sound/soc/codecs/rk817_codec.c
index 6e9d024..66d1ca2 100644
--- a/kernel/sound/soc/codecs/rk817_codec.c
+++ b/kernel/sound/soc/codecs/rk817_codec.c
@@ -67,7 +67,10 @@
 	struct regmap *regmap;
 	struct rk808 *rk817;
 	struct clk *mclk;
+	struct mutex clk_lock;
 
+	unsigned int clk_capture;
+	unsigned int clk_playback;
 	unsigned int stereo_sysclk;
 	unsigned int rate;
 
@@ -79,6 +82,7 @@
 	bool pdmdata_out_enable;
 	bool use_ext_amplifier;
 	bool adc_for_loopback;
+	bool resume_path;
 
 	bool out_l2spk_r2hp;
 	long int playback_path;
@@ -506,10 +510,7 @@
 static const char * const rk817_capture_path_mode[] = {
 	"MIC OFF", "Main Mic", "Hands Free Mic", "BT Sco Mic"};
 
-static const char * const rk817_call_path_mode[] = {
-	"OFF", "RCV", "SPK", "HP", "HP_NO_MIC", "BT"}; /* 0-5 */
-
-static const char * const rk817_modem_input_mode[] = {"OFF", "ON"};
+static const char * const rk817_binary_mode[] = {"OFF", "ON"};
 
 static SOC_ENUM_SINGLE_DECL(rk817_playback_path_type,
 	0, 0, rk817_playback_path_mode);
@@ -517,11 +518,8 @@
 static SOC_ENUM_SINGLE_DECL(rk817_capture_path_type,
 	0, 0, rk817_capture_path_mode);
 
-static SOC_ENUM_SINGLE_DECL(rk817_call_path_type,
-	0, 0, rk817_call_path_mode);
-
-static SOC_ENUM_SINGLE_DECL(rk817_modem_input_type,
-	0, 0, rk817_modem_input_mode);
+static SOC_ENUM_SINGLE_DECL(rk817_resume_path_type,
+	0, 0, rk817_binary_mode);
 
 static int rk817_playback_path_config(struct snd_soc_component *component,
 				      long pre_path, long target_path)
@@ -533,10 +531,19 @@
 	DBG("%s : set playback_path %ld, pre_path %ld\n",
 	    __func__, rk817->playback_path, pre_path);
 
-	if (rk817->playback_path != OFF)
-		clk_prepare_enable(rk817->mclk);
-	else
-		clk_disable_unprepare(rk817->mclk);
+	mutex_lock(&rk817->clk_lock);
+	if (rk817->playback_path != OFF) {
+		if (rk817->clk_playback == 0) {
+			clk_prepare_enable(rk817->mclk);
+			rk817->clk_playback++;
+		}
+	} else {
+		if (rk817->clk_playback > 0) {
+			clk_disable_unprepare(rk817->mclk);
+			rk817->clk_playback--;
+		}
+	}
+	mutex_unlock(&rk817->clk_lock);
 
 	switch (rk817->playback_path) {
 	case OFF:
@@ -720,10 +727,19 @@
 	DBG("%s : set capture_path %ld, pre_path %ld\n", __func__,
 	    rk817->capture_path, pre_path);
 
-	if (rk817->capture_path != MIC_OFF)
-		clk_prepare_enable(rk817->mclk);
-	else
-		clk_disable_unprepare(rk817->mclk);
+	mutex_lock(&rk817->clk_lock);
+	if (rk817->capture_path != MIC_OFF) {
+		if (rk817->clk_capture == 0) {
+			clk_prepare_enable(rk817->mclk);
+			rk817->clk_capture++;
+		}
+	} else {
+		if (rk817->clk_capture > 0) {
+			clk_disable_unprepare(rk817->mclk);
+			rk817->clk_capture--;
+		}
+	}
+	mutex_unlock(&rk817->clk_lock);
 
 	switch (rk817->capture_path) {
 	case MIC_OFF:
@@ -842,12 +858,39 @@
 					 ucontrol->value.integer.value[0]);
 }
 
+static int rk817_resume_path_get(struct snd_kcontrol *kcontrol,
+				 struct snd_ctl_elem_value *ucontrol)
+{
+	struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol);
+	struct rk817_codec_priv *rk817 = snd_soc_component_get_drvdata(component);
+
+	DBG("%s : resume_path %ld\n", __func__, rk817->resume_path);
+
+	ucontrol->value.integer.value[0] = rk817->resume_path;
+
+	return 0;
+}
+
+static int rk817_resume_path_put(struct snd_kcontrol *kcontrol,
+				 struct snd_ctl_elem_value *ucontrol)
+{
+	struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol);
+	struct rk817_codec_priv *rk817 = snd_soc_component_get_drvdata(component);
+
+	rk817->resume_path = ucontrol->value.integer.value[0];
+
+	return 0;
+}
+
 static struct snd_kcontrol_new rk817_snd_path_controls[] = {
 	SOC_ENUM_EXT("Playback Path", rk817_playback_path_type,
 		     rk817_playback_path_get, rk817_playback_path_put),
 
 	SOC_ENUM_EXT("Capture MIC Path", rk817_capture_path_type,
 		     rk817_capture_path_get, rk817_capture_path_put),
+
+	SOC_ENUM_EXT("Resume Path", rk817_resume_path_type,
+		     rk817_resume_path_get, rk817_resume_path_put),
 };
 
 static int rk817_set_dai_sysclk(struct snd_soc_dai *codec_dai,
@@ -892,8 +935,7 @@
 			   struct snd_pcm_hw_params *params,
 			    struct snd_soc_dai *dai)
 {
-	struct snd_soc_pcm_runtime *rtd = substream->private_data;
-	struct snd_soc_component *component = rtd->codec_dai->component;
+	struct snd_soc_component *component = dai->component;
 	struct rk817_codec_priv *rk817 = snd_soc_component_get_drvdata(component);
 	unsigned int rate = params_rate(params);
 	unsigned char apll_cfg3_val;
@@ -946,14 +988,22 @@
 	 * is before playback/capture_path_put, therefore, we need to configure
 	 * APLL_CFG3/DTOP_DIGEN_CLKE/DDAC_SR_LMT0 for different sample rates.
 	 */
-	snd_soc_component_write(component, RK817_CODEC_APLL_CFG3, apll_cfg3_val);
-	/* The 0x00 contains ADC_DIG_CLK_DIS and DAC_DIG_CLK_DIS */
-	snd_soc_component_update_bits(component, RK817_CODEC_DTOP_DIGEN_CLKE,
-				      dtop_digen_clke, 0x00);
-	snd_soc_component_update_bits(component, RK817_CODEC_DDAC_SR_LMT0,
-				      DACSRT_MASK, dtop_digen_sr_lmt0);
-	snd_soc_component_update_bits(component, RK817_CODEC_DTOP_DIGEN_CLKE,
-				      dtop_digen_clke, dtop_digen_clke);
+	if (!((substream->stream == SNDRV_PCM_STREAM_CAPTURE) && rk817->pdmdata_out_enable)) {
+		snd_soc_component_write(component, RK817_CODEC_APLL_CFG3, apll_cfg3_val);
+		/* The 0x00 contains ADC_DIG_CLK_DIS and DAC_DIG_CLK_DIS */
+		snd_soc_component_update_bits(component, RK817_CODEC_DTOP_DIGEN_CLKE,
+					      dtop_digen_clke, 0x00);
+		snd_soc_component_update_bits(component, RK817_CODEC_DDAC_SR_LMT0,
+					      DACSRT_MASK, dtop_digen_sr_lmt0);
+		snd_soc_component_update_bits(component, RK817_CODEC_DTOP_DIGEN_CLKE,
+					      dtop_digen_clke, dtop_digen_clke);
+		snd_soc_component_update_bits(component, RK817_CODEC_APLL_CFG5,
+					      PLL_PW_DOWN, PLL_PW_DOWN);
+		usleep_range(50, 60);
+		snd_soc_component_update_bits(component, RK817_CODEC_APLL_CFG5,
+					      PLL_PW_DOWN, PLL_PW_UP);
+		usleep_range(500, 600);
+	}
 
 	switch (params_format(params)) {
 	case SNDRV_PCM_FORMAT_S16_LE:
@@ -1144,6 +1194,15 @@
 
 static int rk817_resume(struct snd_soc_component *component)
 {
+	struct rk817_codec_priv *rk817 = snd_soc_component_get_drvdata(component);
+
+	if (rk817->resume_path) {
+		if (rk817->capture_path != MIC_OFF)
+			rk817_capture_path_config(component, OFF, rk817->capture_path);
+		if (rk817->playback_path != OFF)
+			rk817_playback_path_config(component, OFF, rk817->playback_path);
+	}
+
 	return 0;
 }
 
@@ -1173,6 +1232,9 @@
 	clk_prepare_enable(rk817->mclk);
 	rk817_reset(component);
 	clk_disable_unprepare(rk817->mclk);
+	mutex_init(&rk817->clk_lock);
+	rk817->clk_capture = 0;
+	rk817->clk_playback = 0;
 
 	snd_soc_add_component_controls(component, rk817_snd_path_controls,
 				       ARRAY_SIZE(rk817_snd_path_controls));
@@ -1193,6 +1255,7 @@
 
 	rk817_codec_power_down(component, RK817_CODEC_ALL);
 	snd_soc_component_exit_regmap(component);
+	mutex_destroy(&rk817->clk_lock);
 	mdelay(10);
 
 }
diff --git a/kernel/sound/soc/generic/simple-card.c b/kernel/sound/soc/generic/simple-card.c
index 3da9cd6..64bf356 100644
--- a/kernel/sound/soc/generic/simple-card.c
+++ b/kernel/sound/soc/generic/simple-card.c
@@ -108,12 +108,12 @@
 		if (ret < 0)
 			return ret;
 
-		ret = snd_soc_dai_set_sysclk(codec_dai, substream->stream, mclk,
+		ret = snd_soc_dai_set_sysclk(codec_dai, 0, mclk,
 					     SND_SOC_CLOCK_IN);
 		if (ret && ret != -ENOTSUPP)
 			goto err;
 
-		ret = snd_soc_dai_set_sysclk(cpu_dai, substream->stream, mclk,
+		ret = snd_soc_dai_set_sysclk(cpu_dai, 0, mclk,
 					     SND_SOC_CLOCK_OUT);
 		if (ret && ret != -ENOTSUPP)
 			goto err;
diff --git a/kernel/sound/soc/rockchip/Kconfig b/kernel/sound/soc/rockchip/Kconfig
index 1690a40..6e9ab63 100644
--- a/kernel/sound/soc/rockchip/Kconfig
+++ b/kernel/sound/soc/rockchip/Kconfig
@@ -60,6 +60,7 @@
 config SND_SOC_ROCKCHIP_SPDIF
 	tristate "Rockchip SPDIF Device Driver"
 	depends on CLKDEV_LOOKUP && SND_SOC_ROCKCHIP
+	select SND_PCM_IEC958
 	select SND_SOC_GENERIC_DMAENGINE_PCM
 	help
 	  Say Y or M if you want to add support for SPDIF driver for
diff --git a/kernel/sound/soc/rockchip/rockchip_hdmi.c b/kernel/sound/soc/rockchip/rockchip_hdmi.c
index 69ff54c..3315407 100644
--- a/kernel/sound/soc/rockchip/rockchip_hdmi.c
+++ b/kernel/sound/soc/rockchip/rockchip_hdmi.c
@@ -213,6 +213,9 @@
 
 	codecs = devm_kcalloc(&pdev->dev, idx,
 			      sizeof(*codecs), GFP_KERNEL);
+	if (!codecs)
+		return -ENOMEM;
+
 	rk_data->dai.codecs = codecs;
 	rk_data->dai.num_codecs = idx;
 	idx = 0;
diff --git a/kernel/sound/soc/rockchip/rockchip_i2s.c b/kernel/sound/soc/rockchip/rockchip_i2s.c
index 262a954..5af12e4 100644
--- a/kernel/sound/soc/rockchip/rockchip_i2s.c
+++ b/kernel/sound/soc/rockchip/rockchip_i2s.c
@@ -61,6 +61,7 @@
 	bool is_master_mode;
 	const struct rk_i2s_pins *pins;
 	unsigned int bclk_fs;
+	spinlock_t lock; /* tx/rx lock */
 	unsigned int clk_trcm;
 
 	unsigned int mclk_root_rate;
@@ -69,9 +70,6 @@
 	bool mclk_calibrate;
 
 };
-
-/* txctrl/rxctrl lock */
-static DEFINE_SPINLOCK(lock);
 
 static int i2s_runtime_suspend(struct device *dev)
 {
@@ -124,12 +122,51 @@
 	regcache_sync(i2s->regmap);
 }
 
+static int rockchip_i2s_clear(struct rk_i2s_dev *i2s)
+{
+	unsigned int clr = I2S_CLR_TXC | I2S_CLR_RXC;
+	unsigned int val = 0;
+	int ret;
+
+	/*
+	 * Workaround for FIFO clear on SLAVE mode:
+	 *
+	 * A Suggest to do reset hclk domain and then do mclk
+	 *   domain, especially for SLAVE mode without CLK in.
+	 *   at last, recovery regmap config.
+	 *
+	 * B Suggest to switch to MASTER, and then do FIFO clr,
+	 *   at last, bring back to SLAVE.
+	 *
+	 * Now we choose plan B here.
+	 */
+	if (!i2s->is_master_mode)
+		regmap_update_bits(i2s->regmap, I2S_CKR,
+				   I2S_CKR_MSS_MASK, I2S_CKR_MSS_MASTER);
+	regmap_update_bits(i2s->regmap, I2S_CLR, clr, clr);
+
+	ret = regmap_read_poll_timeout_atomic(i2s->regmap, I2S_CLR, val,
+					      !(val & clr), 10, 100);
+	if (!i2s->is_master_mode)
+		regmap_update_bits(i2s->regmap, I2S_CKR,
+				   I2S_CKR_MSS_MASK, I2S_CKR_MSS_SLAVE);
+	if (ret < 0) {
+		dev_warn(i2s->dev, "failed to clear fifo on %s mode\n",
+			 i2s->is_master_mode ? "master" : "slave");
+		goto reset;
+	}
+
+	return 0;
+
+reset:
+	rockchip_i2s_reset(i2s);
+
+	return ret;
+}
+
 static void rockchip_snd_txctrl(struct rk_i2s_dev *i2s, int on)
 {
-	unsigned int val = 0;
-	int retry = 10;
-
-	spin_lock(&lock);
+	spin_lock(&i2s->lock);
 	if (on) {
 		regmap_update_bits(i2s->regmap, I2S_DMACR,
 				   I2S_DMACR_TDE_ENABLE, I2S_DMACR_TDE_ENABLE);
@@ -153,33 +190,15 @@
 					   I2S_XFER_RXS_STOP);
 
 			udelay(150);
-			regmap_update_bits(i2s->regmap, I2S_CLR,
-					   I2S_CLR_TXC | I2S_CLR_RXC,
-					   I2S_CLR_TXC | I2S_CLR_RXC);
-
-			regmap_read(i2s->regmap, I2S_CLR, &val);
-
-			/* Should wait for clear operation to finish */
-			while (val) {
-				regmap_read(i2s->regmap, I2S_CLR, &val);
-				retry--;
-				if (!retry) {
-					dev_warn(i2s->dev, "reset\n");
-					rockchip_i2s_reset(i2s);
-					break;
-				}
-			}
+			rockchip_i2s_clear(i2s);
 		}
 	}
-	spin_unlock(&lock);
+	spin_unlock(&i2s->lock);
 }
 
 static void rockchip_snd_rxctrl(struct rk_i2s_dev *i2s, int on)
 {
-	unsigned int val = 0;
-	int retry = 10;
-
-	spin_lock(&lock);
+	spin_lock(&i2s->lock);
 	if (on) {
 		regmap_update_bits(i2s->regmap, I2S_DMACR,
 				   I2S_DMACR_RDE_ENABLE, I2S_DMACR_RDE_ENABLE);
@@ -203,25 +222,10 @@
 					   I2S_XFER_RXS_STOP);
 
 			udelay(150);
-			regmap_update_bits(i2s->regmap, I2S_CLR,
-					   I2S_CLR_TXC | I2S_CLR_RXC,
-					   I2S_CLR_TXC | I2S_CLR_RXC);
-
-			regmap_read(i2s->regmap, I2S_CLR, &val);
-
-			/* Should wait for clear operation to finish */
-			while (val) {
-				regmap_read(i2s->regmap, I2S_CLR, &val);
-				retry--;
-				if (!retry) {
-					dev_warn(i2s->dev, "reset\n");
-					rockchip_i2s_reset(i2s);
-					break;
-				}
-			}
+			rockchip_i2s_clear(i2s);
 		}
 	}
-	spin_unlock(&lock);
+	spin_unlock(&i2s->lock);
 }
 
 static int rockchip_i2s_set_fmt(struct snd_soc_dai *cpu_dai,
@@ -779,6 +783,7 @@
 	if (!i2s)
 		return -ENOMEM;
 
+	spin_lock_init(&i2s->lock);
 	i2s->dev = &pdev->dev;
 
 	i2s->grf = syscon_regmap_lookup_by_phandle(node, "rockchip,grf");
@@ -819,20 +824,23 @@
 	i2s->mclk = devm_clk_get(&pdev->dev, "i2s_clk");
 	if (IS_ERR(i2s->mclk)) {
 		dev_err(&pdev->dev, "Can't retrieve i2s master clock\n");
-		return PTR_ERR(i2s->mclk);
+		ret = PTR_ERR(i2s->mclk);
+		goto err_clk;
 	}
 
-	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-	regs = devm_ioremap_resource(&pdev->dev, res);
-	if (IS_ERR(regs))
-		return PTR_ERR(regs);
+	regs = devm_platform_get_and_ioremap_resource(pdev, 0, &res);
+	if (IS_ERR(regs)) {
+		ret = PTR_ERR(regs);
+		goto err_clk;
+	}
 
 	i2s->regmap = devm_regmap_init_mmio(&pdev->dev, regs,
 					    &rockchip_i2s_regmap_config);
 	if (IS_ERR(i2s->regmap)) {
 		dev_err(&pdev->dev,
 			"Failed to initialise managed register map\n");
-		return PTR_ERR(i2s->regmap);
+		ret = PTR_ERR(i2s->regmap);
+		goto err_clk;
 	}
 
 	i2s->playback_dma_data.addr = res->start + I2S_TXDR;
@@ -901,8 +909,11 @@
 		goto err_suspend;
 	}
 
-	if (of_property_read_bool(node, "rockchip,no-dmaengine"))
-		return ret;
+	if (of_property_read_bool(node, "rockchip,no-dmaengine")) {
+		dev_info(&pdev->dev, "Used for Multi-DAI\n");
+		return 0;
+	}
+
 	ret = devm_snd_dmaengine_pcm_register(&pdev->dev, NULL, 0);
 	if (ret) {
 		dev_err(&pdev->dev, "Could not register PCM\n");
@@ -916,7 +927,8 @@
 		i2s_runtime_suspend(&pdev->dev);
 err_pm_disable:
 	pm_runtime_disable(&pdev->dev);
-
+err_clk:
+	clk_disable_unprepare(i2s->hclk);
 	return ret;
 }
 
diff --git a/kernel/sound/soc/rockchip/rockchip_i2s_tdm.c b/kernel/sound/soc/rockchip/rockchip_i2s_tdm.c
index bcc2b76..1824ea5 100644
--- a/kernel/sound/soc/rockchip/rockchip_i2s_tdm.c
+++ b/kernel/sound/soc/rockchip/rockchip_i2s_tdm.c
@@ -35,10 +35,15 @@
 #endif
 
 #define DEFAULT_MCLK_FS				256
+#define DEFAULT_FS				48000
 #define CH_GRP_MAX				4  /* The max channel 8 / 2 */
 #define MULTIPLEX_CH_MAX			10
 #define CLK_PPM_MIN				(-1000)
 #define CLK_PPM_MAX				(1000)
+#define MAXBURST_PER_FIFO			8
+
+#define QUIRK_ALWAYS_ON				BIT(0)
+#define QUIRK_HDMI_PATH				BIT(1)
 
 struct txrx_config {
 	u32 addr;
@@ -79,6 +84,7 @@
 	struct regmap *grf;
 	struct snd_dmaengine_dai_dma_data capture_dma_data;
 	struct snd_dmaengine_dai_dma_data playback_dma_data;
+	struct snd_pcm_substream *substreams[SNDRV_PCM_STREAM_LAST + 1];
 	struct reset_control *tx_reset;
 	struct reset_control *rx_reset;
 	const struct rk_i2s_soc_data *soc_data;
@@ -102,9 +108,24 @@
 	unsigned int clk_trcm;
 	unsigned int i2s_sdis[CH_GRP_MAX];
 	unsigned int i2s_sdos[CH_GRP_MAX];
+	unsigned int quirks;
 	int clk_ppm;
 	atomic_t refcount;
 	spinlock_t lock; /* xfer lock */
+};
+
+static struct i2s_of_quirks {
+	char *quirk;
+	int id;
+} of_quirks[] = {
+	{
+		.quirk = "rockchip,always-on",
+		.id = QUIRK_ALWAYS_ON,
+	},
+	{
+		.quirk = "rockchip,hdmi-path",
+		.id = QUIRK_HDMI_PATH,
+	},
 };
 
 static int to_ch_num(unsigned int val)
@@ -134,10 +155,9 @@
 	struct rk_i2s_tdm_dev *i2s_tdm = dev_get_drvdata(dev);
 
 	regcache_cache_only(i2s_tdm->regmap, true);
-	if (!IS_ERR(i2s_tdm->mclk_tx))
-		clk_disable_unprepare(i2s_tdm->mclk_tx);
-	if (!IS_ERR(i2s_tdm->mclk_rx))
-		clk_disable_unprepare(i2s_tdm->mclk_rx);
+
+	clk_disable_unprepare(i2s_tdm->mclk_tx);
+	clk_disable_unprepare(i2s_tdm->mclk_rx);
 
 	return 0;
 }
@@ -147,28 +167,45 @@
 	struct rk_i2s_tdm_dev *i2s_tdm = dev_get_drvdata(dev);
 	int ret;
 
-	if (!IS_ERR(i2s_tdm->mclk_tx))
-		clk_prepare_enable(i2s_tdm->mclk_tx);
-	if (!IS_ERR(i2s_tdm->mclk_rx))
-		clk_prepare_enable(i2s_tdm->mclk_rx);
+	ret = clk_prepare_enable(i2s_tdm->mclk_tx);
+	if (ret)
+		goto err_mclk_tx;
+
+	ret = clk_prepare_enable(i2s_tdm->mclk_rx);
+	if (ret)
+		goto err_mclk_rx;
 
 	regcache_cache_only(i2s_tdm->regmap, false);
 	regcache_mark_dirty(i2s_tdm->regmap);
-
 	ret = regcache_sync(i2s_tdm->regmap);
-	if (ret) {
-		if (!IS_ERR(i2s_tdm->mclk_tx))
-			clk_disable_unprepare(i2s_tdm->mclk_tx);
-		if (!IS_ERR(i2s_tdm->mclk_rx))
-			clk_disable_unprepare(i2s_tdm->mclk_rx);
-	}
+	if (ret)
+		goto err_regmap;
 
+	return 0;
+
+err_regmap:
+	clk_disable_unprepare(i2s_tdm->mclk_rx);
+err_mclk_rx:
+	clk_disable_unprepare(i2s_tdm->mclk_tx);
+err_mclk_tx:
 	return ret;
 }
 
 static inline struct rk_i2s_tdm_dev *to_info(struct snd_soc_dai *dai)
 {
 	return snd_soc_dai_get_drvdata(dai);
+}
+
+static inline bool is_stream_active(struct rk_i2s_tdm_dev *i2s_tdm, int stream)
+{
+	unsigned int val;
+
+	regmap_read(i2s_tdm->regmap, I2S_XFER, &val);
+
+	if (stream == SNDRV_PCM_STREAM_PLAYBACK)
+		return (val & I2S_XFER_TXS_START);
+	else
+		return (val & I2S_XFER_RXS_START);
 }
 
 #ifdef HAVE_SYNC_RESET
@@ -180,7 +217,7 @@
 #define writeq(v,c) ({ __iowmb(); __raw_writeq((__force u64) cpu_to_le64(v), c); })
 #endif
 
-static void rockchip_snd_xfer_reset_assert(struct rk_i2s_tdm_dev *i2s_tdm)
+static void rockchip_i2s_tdm_reset_assert(struct rk_i2s_tdm_dev *i2s_tdm)
 {
 	int tx_bank, rx_bank, tx_offset, rx_offset, tx_id, rx_id;
 	void __iomem *cru_reset, *addr;
@@ -229,7 +266,7 @@
 			writeq(val, addr);
 			break;
 		}
-		/* fall through */
+		/* fallthrough */
 	default:
 		local_irq_save(flags);
 		writel(BIT(tx_offset) | (BIT(tx_offset) << 16),
@@ -243,7 +280,7 @@
 	udelay(10);
 }
 
-static void rockchip_snd_xfer_reset_deassert(struct rk_i2s_tdm_dev *i2s_tdm)
+static void rockchip_i2s_tdm_reset_deassert(struct rk_i2s_tdm_dev *i2s_tdm)
 {
 	int tx_bank, rx_bank, tx_offset, rx_offset, tx_id, rx_id;
 	void __iomem *cru_reset, *addr;
@@ -291,7 +328,7 @@
 			writeq(val, addr);
 			break;
 		}
-		/* fall through */
+		/* fallthrough */
 	default:
 		local_irq_save(flags);
 		writel((BIT(tx_offset) << 16),
@@ -309,94 +346,26 @@
  * make sure both tx and rx are reset at the same time for sync lrck
  * when clk_trcm > 0
  */
-static void rockchip_snd_xfer_sync_reset(struct rk_i2s_tdm_dev *i2s_tdm)
+static void rockchip_i2s_tdm_sync_reset(struct rk_i2s_tdm_dev *i2s_tdm)
 {
-	rockchip_snd_xfer_reset_assert(i2s_tdm);
-	rockchip_snd_xfer_reset_deassert(i2s_tdm);
+	rockchip_i2s_tdm_reset_assert(i2s_tdm);
+	rockchip_i2s_tdm_reset_deassert(i2s_tdm);
 }
 #else
-static inline void rockchip_snd_xfer_reset_assert(struct rk_i2s_tdm_dev *i2s_tdm)
+static inline void rockchip_i2s_tdm_reset_assert(struct rk_i2s_tdm_dev *i2s_tdm)
 {
 }
-static inline void rockchip_snd_xfer_reset_deassert(struct rk_i2s_tdm_dev *i2s_tdm)
+static inline void rockchip_i2s_tdm_reset_deassert(struct rk_i2s_tdm_dev *i2s_tdm)
 {
 }
-static inline void rockchip_snd_xfer_sync_reset(struct rk_i2s_tdm_dev *i2s_tdm)
+static inline void rockchip_i2s_tdm_sync_reset(struct rk_i2s_tdm_dev *i2s_tdm)
 {
 }
 #endif
 
-/* only used when clk_trcm > 0 */
-static void rockchip_snd_txrxctrl(struct snd_pcm_substream *substream,
-				  struct snd_soc_dai *dai, int on)
+static void rockchip_i2s_tdm_reset(struct reset_control *rc)
 {
-	struct rk_i2s_tdm_dev *i2s_tdm = to_info(dai);
-	unsigned int val = 0;
-	unsigned long flags;
-	int retry = 10;
-
-	spin_lock_irqsave(&i2s_tdm->lock, flags);
-	if (on) {
-		if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
-			regmap_update_bits(i2s_tdm->regmap, I2S_DMACR,
-					   I2S_DMACR_TDE_ENABLE,
-					   I2S_DMACR_TDE_ENABLE);
-		else
-			regmap_update_bits(i2s_tdm->regmap, I2S_DMACR,
-					   I2S_DMACR_RDE_ENABLE,
-					   I2S_DMACR_RDE_ENABLE);
-
-		if (atomic_inc_return(&i2s_tdm->refcount) == 1) {
-			rockchip_snd_xfer_reset_assert(i2s_tdm);
-			regmap_update_bits(i2s_tdm->regmap, I2S_XFER,
-					   I2S_XFER_TXS_START |
-					   I2S_XFER_RXS_START,
-					   I2S_XFER_TXS_START |
-					   I2S_XFER_RXS_START);
-			rockchip_snd_xfer_reset_deassert(i2s_tdm);
-		}
-	} else {
-		if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
-			regmap_update_bits(i2s_tdm->regmap, I2S_DMACR,
-					   I2S_DMACR_TDE_ENABLE,
-					   I2S_DMACR_TDE_DISABLE);
-		else
-			regmap_update_bits(i2s_tdm->regmap, I2S_DMACR,
-					   I2S_DMACR_RDE_ENABLE,
-					   I2S_DMACR_RDE_DISABLE);
-
-		if (atomic_dec_and_test(&i2s_tdm->refcount)) {
-			regmap_update_bits(i2s_tdm->regmap, I2S_XFER,
-					   I2S_XFER_TXS_START |
-					   I2S_XFER_RXS_START,
-					   I2S_XFER_TXS_STOP |
-					   I2S_XFER_RXS_STOP);
-
-			udelay(150);
-			regmap_update_bits(i2s_tdm->regmap, I2S_CLR,
-					   I2S_CLR_TXC | I2S_CLR_RXC,
-					   I2S_CLR_TXC | I2S_CLR_RXC);
-
-			regmap_read(i2s_tdm->regmap, I2S_CLR, &val);
-
-			/* Should wait for clear operation to finish */
-			while (val) {
-				regmap_read(i2s_tdm->regmap, I2S_CLR, &val);
-				retry--;
-				if (!retry) {
-					dev_info(i2s_tdm->dev, "reset txrx\n");
-					rockchip_snd_xfer_sync_reset(i2s_tdm);
-					break;
-				}
-			}
-		}
-	}
-	spin_unlock_irqrestore(&i2s_tdm->lock, flags);
-}
-
-static void rockchip_snd_reset(struct reset_control *rc)
-{
-	if (IS_ERR(rc))
+	if (IS_ERR_OR_NULL(rc))
 		return;
 
 	reset_control_assert(rc);
@@ -407,92 +376,264 @@
 	udelay(10);
 }
 
-static void rockchip_snd_txctrl(struct rk_i2s_tdm_dev *i2s_tdm, int on)
+static int rockchip_i2s_tdm_clear(struct rk_i2s_tdm_dev *i2s_tdm,
+				  unsigned int clr)
 {
+	struct reset_control *rst = NULL;
 	unsigned int val = 0;
-	int retry = 10;
+	int ret = 0;
 
-	if (on) {
-		regmap_update_bits(i2s_tdm->regmap, I2S_DMACR,
-				   I2S_DMACR_TDE_ENABLE, I2S_DMACR_TDE_ENABLE);
+	switch (clr) {
+	case I2S_CLR_TXC:
+		rst = i2s_tdm->tx_reset;
+		break;
+	case I2S_CLR_RXC:
+		rst = i2s_tdm->rx_reset;
+		break;
+	case I2S_CLR_TXC | I2S_CLR_RXC:
+		break;
+	default:
+		return -EINVAL;
+	}
 
-		regmap_update_bits(i2s_tdm->regmap, I2S_XFER,
-				   I2S_XFER_TXS_START,
-				   I2S_XFER_TXS_START);
+	/*
+	 * Workaround for FIFO clear on SLAVE mode:
+	 *
+	 * A Suggest to do reset hclk domain and then do mclk
+	 *   domain, especially for SLAVE mode without CLK in.
+	 *   at last, recovery regmap config.
+	 *
+	 * B Suggest to switch to MASTER, and then do FIFO clr,
+	 *   at last, bring back to SLAVE.
+	 *
+	 * Now we choose plan B here.
+	 */
+	if (!i2s_tdm->is_master_mode)
+		regmap_update_bits(i2s_tdm->regmap, I2S_CKR,
+				   I2S_CKR_MSS_MASK, I2S_CKR_MSS_MASTER);
+	regmap_update_bits(i2s_tdm->regmap, I2S_CLR, clr, clr);
+	ret = regmap_read_poll_timeout_atomic(i2s_tdm->regmap, I2S_CLR, val,
+					      !(val & clr), 10, 100);
+	if (!i2s_tdm->is_master_mode)
+		regmap_update_bits(i2s_tdm->regmap, I2S_CKR,
+				   I2S_CKR_MSS_MASK, I2S_CKR_MSS_SLAVE);
+
+	if (ret < 0) {
+		dev_warn(i2s_tdm->dev, "failed to clear %u on %s mode\n",
+			 clr, i2s_tdm->is_master_mode ? "master" : "slave");
+		goto reset;
+	}
+
+	return 0;
+
+reset:
+	if (i2s_tdm->clk_trcm)
+		rockchip_i2s_tdm_sync_reset(i2s_tdm);
+	else
+		rockchip_i2s_tdm_reset(rst);
+
+	return 0;
+}
+
+/*
+ * HDMI controller ignores the first FRAME_SYNC cycle, Lost one frame is no big deal
+ * for LPCM, but it does matter for Bitstream (NLPCM/HBR), So, padding one frame
+ * before xfer the real data to fix it.
+ */
+static void rockchip_i2s_tdm_tx_fifo_padding(struct rk_i2s_tdm_dev *i2s_tdm, bool en)
+{
+	unsigned int val, w, c, i;
+
+	if (!en)
+		return;
+
+	regmap_read(i2s_tdm->regmap, I2S_TXCR, &val);
+	w = ((val & I2S_TXCR_VDW_MASK) >> I2S_TXCR_VDW_SHIFT) + 1;
+	c = to_ch_num(val & I2S_TXCR_CSR_MASK) * w / 32;
+
+	for (i = 0; i < c; i++)
+		regmap_write(i2s_tdm->regmap, I2S_TXDR, 0x0);
+}
+
+static void rockchip_i2s_tdm_fifo_xrun_detect(struct rk_i2s_tdm_dev *i2s_tdm,
+					      int stream, bool en)
+{
+	if (stream == SNDRV_PCM_STREAM_PLAYBACK) {
+		/* clear irq status which was asserted before TXUIE enabled */
+		regmap_update_bits(i2s_tdm->regmap, I2S_INTCR,
+				   I2S_INTCR_TXUIC, I2S_INTCR_TXUIC);
+		regmap_update_bits(i2s_tdm->regmap, I2S_INTCR,
+				   I2S_INTCR_TXUIE_MASK,
+				   I2S_INTCR_TXUIE(en));
 	} else {
-		regmap_update_bits(i2s_tdm->regmap, I2S_DMACR,
-				   I2S_DMACR_TDE_ENABLE, I2S_DMACR_TDE_DISABLE);
-
-		regmap_update_bits(i2s_tdm->regmap, I2S_XFER,
-				   I2S_XFER_TXS_START,
-				   I2S_XFER_TXS_STOP);
-
-		udelay(150);
-		if (i2s_tdm->is_master_mode) {
-			regmap_update_bits(i2s_tdm->regmap, I2S_CLR,
-					   I2S_CLR_TXC,
-					   I2S_CLR_TXC);
-
-			regmap_read(i2s_tdm->regmap, I2S_CLR, &val);
-
-			/* Should wait for clear operation to finish */
-			while (val) {
-				regmap_read(i2s_tdm->regmap, I2S_CLR, &val);
-				retry--;
-				if (!retry) {
-					dev_warn(i2s_tdm->dev, "reset tx\n");
-					rockchip_snd_reset(i2s_tdm->tx_reset);
-					break;
-				}
-			}
-		} else {
-			rockchip_snd_reset(i2s_tdm->tx_reset);
-		}
+		/* clear irq status which was asserted before RXOIE enabled */
+		regmap_update_bits(i2s_tdm->regmap, I2S_INTCR,
+				   I2S_INTCR_RXOIC, I2S_INTCR_RXOIC);
+		regmap_update_bits(i2s_tdm->regmap, I2S_INTCR,
+				   I2S_INTCR_RXOIE_MASK,
+				   I2S_INTCR_RXOIE(en));
 	}
 }
 
-static void rockchip_snd_rxctrl(struct rk_i2s_tdm_dev *i2s_tdm, int on)
+static void rockchip_i2s_tdm_dma_ctrl(struct rk_i2s_tdm_dev *i2s_tdm,
+				      int stream, bool en)
 {
-	unsigned int val = 0;
-	int retry = 10;
+	if (!en)
+		rockchip_i2s_tdm_fifo_xrun_detect(i2s_tdm, stream, 0);
 
-	if (on) {
+	if (stream == SNDRV_PCM_STREAM_PLAYBACK) {
+		if (i2s_tdm->quirks & QUIRK_HDMI_PATH)
+			rockchip_i2s_tdm_tx_fifo_padding(i2s_tdm, en);
+
 		regmap_update_bits(i2s_tdm->regmap, I2S_DMACR,
-				   I2S_DMACR_RDE_ENABLE, I2S_DMACR_RDE_ENABLE);
-
-		regmap_update_bits(i2s_tdm->regmap, I2S_XFER,
-				   I2S_XFER_RXS_START,
-				   I2S_XFER_RXS_START);
+				   I2S_DMACR_TDE_MASK,
+				   I2S_DMACR_TDE(en));
+		/*
+		 * Explicitly delay 1 usec for dma to fill FIFO,
+		 * though there was a implied HW delay that around
+		 * half LRCK cycle (e.g. 2.6us@192k) from XFER-start
+		 * to FIFO-pop.
+		 *
+		 * 1 usec is enough to fill at lease 4 entry each FIFO
+		 * @192k 8ch 32bit situation.
+		 */
+		udelay(1);
 	} else {
 		regmap_update_bits(i2s_tdm->regmap, I2S_DMACR,
-				   I2S_DMACR_RDE_ENABLE, I2S_DMACR_RDE_DISABLE);
-
-		regmap_update_bits(i2s_tdm->regmap, I2S_XFER,
-				   I2S_XFER_RXS_START,
-				   I2S_XFER_RXS_STOP);
-
-		udelay(150);
-		if (i2s_tdm->is_master_mode) {
-			regmap_update_bits(i2s_tdm->regmap, I2S_CLR,
-					   I2S_CLR_RXC,
-					   I2S_CLR_RXC);
-
-			regmap_read(i2s_tdm->regmap, I2S_CLR, &val);
-
-			/* Should wait for clear operation to finish */
-			while (val) {
-				regmap_read(i2s_tdm->regmap, I2S_CLR, &val);
-				retry--;
-				if (!retry) {
-					dev_warn(i2s_tdm->dev, "reset rx\n");
-					rockchip_snd_reset(i2s_tdm->rx_reset);
-					break;
-				}
-			}
-		} else {
-			rockchip_snd_reset(i2s_tdm->rx_reset);
-		}
+				   I2S_DMACR_RDE_MASK,
+				   I2S_DMACR_RDE(en));
 	}
+
+	if (en)
+		rockchip_i2s_tdm_fifo_xrun_detect(i2s_tdm, stream, 1);
+}
+
+static void rockchip_i2s_tdm_xfer_start(struct rk_i2s_tdm_dev *i2s_tdm,
+					int stream)
+{
+	if (i2s_tdm->clk_trcm) {
+		rockchip_i2s_tdm_reset_assert(i2s_tdm);
+		regmap_update_bits(i2s_tdm->regmap, I2S_XFER,
+				   I2S_XFER_TXS_MASK |
+				   I2S_XFER_RXS_MASK,
+				   I2S_XFER_TXS_START |
+				   I2S_XFER_RXS_START);
+		rockchip_i2s_tdm_reset_deassert(i2s_tdm);
+	} else if (stream == SNDRV_PCM_STREAM_PLAYBACK) {
+		regmap_update_bits(i2s_tdm->regmap, I2S_XFER,
+				   I2S_XFER_TXS_MASK,
+				   I2S_XFER_TXS_START);
+	} else {
+		regmap_update_bits(i2s_tdm->regmap, I2S_XFER,
+				   I2S_XFER_RXS_MASK,
+				   I2S_XFER_RXS_START);
+	}
+}
+
+static void rockchip_i2s_tdm_xfer_stop(struct rk_i2s_tdm_dev *i2s_tdm,
+				       int stream, bool force)
+{
+	unsigned int msk, val, clr;
+
+	if (i2s_tdm->quirks & QUIRK_ALWAYS_ON && !force)
+		return;
+
+	if (i2s_tdm->clk_trcm) {
+		msk = I2S_XFER_TXS_MASK | I2S_XFER_RXS_MASK;
+		val = I2S_XFER_TXS_STOP | I2S_XFER_RXS_STOP;
+		clr = I2S_CLR_TXC | I2S_CLR_RXC;
+	} else if (stream == SNDRV_PCM_STREAM_PLAYBACK) {
+		msk = I2S_XFER_TXS_MASK;
+		val = I2S_XFER_TXS_STOP;
+		clr = I2S_CLR_TXC;
+	} else {
+		msk = I2S_XFER_RXS_MASK;
+		val = I2S_XFER_RXS_STOP;
+		clr = I2S_CLR_RXC;
+	}
+
+	regmap_update_bits(i2s_tdm->regmap, I2S_XFER, msk, val);
+
+	/* delay for LRCK signal integrity */
+	udelay(150);
+
+	rockchip_i2s_tdm_clear(i2s_tdm, clr);
+}
+
+static void rockchip_i2s_tdm_xfer_trcm_start(struct rk_i2s_tdm_dev *i2s_tdm)
+{
+	unsigned long flags;
+
+	spin_lock_irqsave(&i2s_tdm->lock, flags);
+	if (atomic_inc_return(&i2s_tdm->refcount) == 1)
+		rockchip_i2s_tdm_xfer_start(i2s_tdm, 0);
+	spin_unlock_irqrestore(&i2s_tdm->lock, flags);
+}
+
+static void rockchip_i2s_tdm_xfer_trcm_stop(struct rk_i2s_tdm_dev *i2s_tdm)
+{
+	unsigned long flags;
+
+	spin_lock_irqsave(&i2s_tdm->lock, flags);
+	if (atomic_dec_and_test(&i2s_tdm->refcount))
+		rockchip_i2s_tdm_xfer_stop(i2s_tdm, 0, false);
+	spin_unlock_irqrestore(&i2s_tdm->lock, flags);
+}
+
+static void rockchip_i2s_tdm_trcm_pause(struct snd_pcm_substream *substream,
+					struct rk_i2s_tdm_dev *i2s_tdm)
+{
+	int stream = substream->stream;
+	int bstream = SNDRV_PCM_STREAM_LAST - stream;
+
+	/* disable dma for both tx and rx */
+	rockchip_i2s_tdm_dma_ctrl(i2s_tdm, stream, 0);
+	rockchip_i2s_tdm_dma_ctrl(i2s_tdm, bstream, 0);
+	rockchip_i2s_tdm_xfer_stop(i2s_tdm, bstream, true);
+}
+
+static void rockchip_i2s_tdm_trcm_resume(struct snd_pcm_substream *substream,
+					 struct rk_i2s_tdm_dev *i2s_tdm)
+{
+	int bstream = SNDRV_PCM_STREAM_LAST - substream->stream;
+
+	/*
+	 * just resume bstream, because current stream will be
+	 * startup in the trigger-cmd-START
+	 */
+	rockchip_i2s_tdm_dma_ctrl(i2s_tdm, bstream, 1);
+	rockchip_i2s_tdm_xfer_start(i2s_tdm, bstream);
+}
+
+static void rockchip_i2s_tdm_start(struct rk_i2s_tdm_dev *i2s_tdm, int stream)
+{
+	/*
+	 * On HDMI-PATH-ALWAYS-ON situation, we almost keep XFER always on,
+	 * so, for new data start, suggested to STOP-CLEAR-START to make sure
+	 * data aligned.
+	 */
+	if ((i2s_tdm->quirks & QUIRK_HDMI_PATH) &&
+	    (i2s_tdm->quirks & QUIRK_ALWAYS_ON) &&
+	    (stream == SNDRV_PCM_STREAM_PLAYBACK)) {
+		rockchip_i2s_tdm_xfer_stop(i2s_tdm, stream, true);
+	}
+
+	rockchip_i2s_tdm_dma_ctrl(i2s_tdm, stream, 1);
+
+	if (i2s_tdm->clk_trcm)
+		rockchip_i2s_tdm_xfer_trcm_start(i2s_tdm);
+	else
+		rockchip_i2s_tdm_xfer_start(i2s_tdm, stream);
+}
+
+static void rockchip_i2s_tdm_stop(struct rk_i2s_tdm_dev *i2s_tdm, int stream)
+{
+	rockchip_i2s_tdm_dma_ctrl(i2s_tdm, stream, 0);
+
+	if (i2s_tdm->clk_trcm)
+		rockchip_i2s_tdm_xfer_trcm_stop(i2s_tdm);
+	else
+		rockchip_i2s_tdm_xfer_stop(i2s_tdm, stream, false);
 }
 
 static int rockchip_i2s_tdm_set_fmt(struct snd_soc_dai *cpu_dai,
@@ -659,72 +800,6 @@
 	return ret;
 }
 
-static void rockchip_i2s_tdm_xfer_pause(struct snd_pcm_substream *substream,
-					struct rk_i2s_tdm_dev *i2s_tdm)
-{
-	int stream;
-	unsigned int val = 0;
-	int retry = 10;
-
-	stream = SNDRV_PCM_STREAM_LAST - substream->stream;
-	if (stream == SNDRV_PCM_STREAM_PLAYBACK)
-		regmap_update_bits(i2s_tdm->regmap, I2S_DMACR,
-				   I2S_DMACR_TDE_ENABLE,
-				   I2S_DMACR_TDE_DISABLE);
-	else
-		regmap_update_bits(i2s_tdm->regmap, I2S_DMACR,
-				   I2S_DMACR_RDE_ENABLE,
-				   I2S_DMACR_RDE_DISABLE);
-
-	regmap_update_bits(i2s_tdm->regmap, I2S_XFER,
-			   I2S_XFER_TXS_START |
-			   I2S_XFER_RXS_START,
-			   I2S_XFER_TXS_STOP |
-			   I2S_XFER_RXS_STOP);
-
-	udelay(150);
-	regmap_update_bits(i2s_tdm->regmap, I2S_CLR,
-			   I2S_CLR_TXC | I2S_CLR_RXC,
-			   I2S_CLR_TXC | I2S_CLR_RXC);
-
-	regmap_read(i2s_tdm->regmap, I2S_CLR, &val);
-
-	/* Should wait for clear operation to finish */
-	while (val) {
-		regmap_read(i2s_tdm->regmap, I2S_CLR, &val);
-		retry--;
-		if (!retry) {
-			dev_info(i2s_tdm->dev, "reset txrx\n");
-			rockchip_snd_xfer_sync_reset(i2s_tdm);
-			break;
-		}
-	}
-}
-
-static void rockchip_i2s_tdm_xfer_resume(struct snd_pcm_substream *substream,
-					 struct rk_i2s_tdm_dev *i2s_tdm)
-{
-	int stream;
-
-	stream = SNDRV_PCM_STREAM_LAST - substream->stream;
-	if (stream == SNDRV_PCM_STREAM_PLAYBACK)
-		regmap_update_bits(i2s_tdm->regmap, I2S_DMACR,
-				   I2S_DMACR_TDE_ENABLE,
-				   I2S_DMACR_TDE_ENABLE);
-	else
-		regmap_update_bits(i2s_tdm->regmap, I2S_DMACR,
-				   I2S_DMACR_RDE_ENABLE,
-				   I2S_DMACR_RDE_ENABLE);
-
-	rockchip_snd_xfer_reset_assert(i2s_tdm);
-	regmap_update_bits(i2s_tdm->regmap, I2S_XFER,
-			   I2S_XFER_TXS_START |
-			   I2S_XFER_RXS_START,
-			   I2S_XFER_TXS_START |
-			   I2S_XFER_RXS_START);
-	rockchip_snd_xfer_reset_deassert(i2s_tdm);
-}
-
 static int rockchip_i2s_tdm_clk_set_rate(struct rk_i2s_tdm_dev *i2s_tdm,
 					 struct clk *clk, unsigned long rate,
 					 int ppm)
@@ -840,6 +915,28 @@
 	return ret;
 }
 
+static int rockchip_i2s_tdm_mclk_reparent(struct rk_i2s_tdm_dev *i2s_tdm)
+{
+	struct clk *parent;
+	int ret = 0;
+
+	/* reparent to the same clk on TRCM mode */
+	switch (i2s_tdm->clk_trcm) {
+	case I2S_CKR_TRCM_TXONLY:
+		parent = clk_get_parent(i2s_tdm->mclk_tx);
+		if (clk_has_parent(i2s_tdm->mclk_rx, parent))
+			ret = clk_set_parent(i2s_tdm->mclk_rx, parent);
+		break;
+	case I2S_CKR_TRCM_RXONLY:
+		parent = clk_get_parent(i2s_tdm->mclk_rx);
+		if (clk_has_parent(i2s_tdm->mclk_tx, parent))
+			ret = clk_set_parent(i2s_tdm->mclk_tx, parent);
+		break;
+	}
+
+	return ret;
+}
+
 static int rockchip_i2s_tdm_set_mclk(struct rk_i2s_tdm_dev *i2s_tdm,
 				     struct snd_pcm_substream *substream,
 				     struct clk **mclk)
@@ -862,6 +959,10 @@
 			goto err;
 
 		ret = clk_set_rate(i2s_tdm->mclk_rx, i2s_tdm->mclk_rx_freq);
+		if (ret)
+			goto err;
+
+		ret = rockchip_i2s_tdm_mclk_reparent(i2s_tdm);
 		if (ret)
 			goto err;
 
@@ -895,6 +996,9 @@
 	unsigned int val = 0;
 
 	if (!i2s_tdm->io_multiplex)
+		return 0;
+
+	if (IS_ERR(i2s_tdm->grf))
 		return 0;
 
 	if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) {
@@ -1006,24 +1110,18 @@
 	return false;
 }
 
-static int rockchip_i2s_trcm_mode(struct snd_pcm_substream *substream,
-				  struct snd_soc_dai *dai,
-				  unsigned int div_bclk,
-				  unsigned int div_lrck,
-				  unsigned int fmt)
+static int rockchip_i2s_tdm_params_trcm(struct snd_pcm_substream *substream,
+					struct snd_soc_dai *dai,
+					unsigned int div_bclk,
+					unsigned int div_lrck,
+					unsigned int fmt)
 {
 	struct rk_i2s_tdm_dev *i2s_tdm = to_info(dai);
 	unsigned long flags;
 
-	if (!i2s_tdm->clk_trcm)
-		return 0;
-
-	if (!is_params_dirty(substream, dai, div_bclk, div_lrck, fmt))
-		return 0;
-
 	spin_lock_irqsave(&i2s_tdm->lock, flags);
 	if (atomic_read(&i2s_tdm->refcount))
-		rockchip_i2s_tdm_xfer_pause(substream, i2s_tdm);
+		rockchip_i2s_tdm_trcm_pause(substream, i2s_tdm);
 
 	regmap_update_bits(i2s_tdm->regmap, I2S_CLKDIV,
 			   I2S_CLKDIV_TXM_MASK | I2S_CLKDIV_RXM_MASK,
@@ -1042,8 +1140,56 @@
 				   fmt);
 
 	if (atomic_read(&i2s_tdm->refcount))
-		rockchip_i2s_tdm_xfer_resume(substream, i2s_tdm);
+		rockchip_i2s_tdm_trcm_resume(substream, i2s_tdm);
 	spin_unlock_irqrestore(&i2s_tdm->lock, flags);
+
+	return 0;
+}
+
+static int rockchip_i2s_tdm_params(struct snd_pcm_substream *substream,
+				   struct snd_soc_dai *dai,
+				   unsigned int div_bclk,
+				   unsigned int div_lrck,
+				   unsigned int fmt)
+{
+	struct rk_i2s_tdm_dev *i2s_tdm = to_info(dai);
+	int stream = substream->stream;
+
+	if (is_stream_active(i2s_tdm, stream))
+		rockchip_i2s_tdm_xfer_stop(i2s_tdm, stream, true);
+
+	if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
+		regmap_update_bits(i2s_tdm->regmap, I2S_CLKDIV,
+				   I2S_CLKDIV_TXM_MASK,
+				   I2S_CLKDIV_TXM(div_bclk));
+		regmap_update_bits(i2s_tdm->regmap, I2S_CKR,
+				   I2S_CKR_TSD_MASK,
+				   I2S_CKR_TSD(div_lrck));
+		regmap_update_bits(i2s_tdm->regmap, I2S_TXCR,
+				   I2S_TXCR_VDW_MASK | I2S_TXCR_CSR_MASK,
+				   fmt);
+	} else {
+		regmap_update_bits(i2s_tdm->regmap, I2S_CLKDIV,
+				   I2S_CLKDIV_RXM_MASK,
+				   I2S_CLKDIV_RXM(div_bclk));
+		regmap_update_bits(i2s_tdm->regmap, I2S_CKR,
+				   I2S_CKR_RSD_MASK,
+				   I2S_CKR_RSD(div_lrck));
+		regmap_update_bits(i2s_tdm->regmap, I2S_RXCR,
+				   I2S_RXCR_VDW_MASK | I2S_RXCR_CSR_MASK,
+				   fmt);
+	}
+
+	/*
+	 * Bring back CLK ASAP after cfg changed to make SINK devices active
+	 * on HDMI-PATH-ALWAYS-ON situation, this workaround for some TVs no
+	 * sound issue. at the moment, it's 8K@60Hz display situation.
+	 */
+	if ((i2s_tdm->quirks & QUIRK_HDMI_PATH) &&
+	    (i2s_tdm->quirks & QUIRK_ALWAYS_ON) &&
+	    (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)) {
+		rockchip_i2s_tdm_xfer_start(i2s_tdm, SNDRV_PCM_STREAM_PLAYBACK);
+	}
 
 	return 0;
 }
@@ -1110,29 +1256,31 @@
 				      struct snd_soc_dai *dai)
 {
 	struct rk_i2s_tdm_dev *i2s_tdm = to_info(dai);
+	struct snd_dmaengine_dai_dma_data *dma_data;
 	struct clk *mclk;
 	int ret = 0;
 	unsigned int val = 0;
 	unsigned int mclk_rate, bclk_rate, div_bclk = 4, div_lrck = 64;
 
-	if (i2s_tdm->is_master_mode) {
-		if (i2s_tdm->mclk_calibrate)
-			rockchip_i2s_tdm_calibrate_mclk(i2s_tdm, substream,
-							params_rate(params));
+	dma_data = snd_soc_dai_get_dma_data(dai, substream);
+	dma_data->maxburst = MAXBURST_PER_FIFO * params_channels(params) / 2;
 
-		ret = rockchip_i2s_tdm_set_mclk(i2s_tdm, substream, &mclk);
-		if (ret)
-			goto err;
+	if (i2s_tdm->mclk_calibrate)
+		rockchip_i2s_tdm_calibrate_mclk(i2s_tdm, substream,
+						params_rate(params));
 
-		mclk_rate = clk_get_rate(mclk);
-		bclk_rate = i2s_tdm->bclk_fs * params_rate(params);
-		if (!bclk_rate) {
-			ret = -EINVAL;
-			goto err;
-		}
-		div_bclk = DIV_ROUND_CLOSEST(mclk_rate, bclk_rate);
-		div_lrck = bclk_rate / params_rate(params);
+	ret = rockchip_i2s_tdm_set_mclk(i2s_tdm, substream, &mclk);
+	if (ret)
+		goto err;
+
+	mclk_rate = clk_get_rate(mclk);
+	bclk_rate = i2s_tdm->bclk_fs * params_rate(params);
+	if (!bclk_rate) {
+		ret = -EINVAL;
+		goto err;
 	}
+	div_bclk = DIV_ROUND_CLOSEST(mclk_rate, bclk_rate);
+	div_lrck = bclk_rate / params_rate(params);
 
 	switch (params_format(params)) {
 	case SNDRV_PCM_FORMAT_S8:
@@ -1148,6 +1296,7 @@
 		val |= I2S_TXCR_VDW(24);
 		break;
 	case SNDRV_PCM_FORMAT_S32_LE:
+	case SNDRV_PCM_FORMAT_IEC958_SUBFRAME_LE:
 		val |= I2S_TXCR_VDW(32);
 		break;
 	default:
@@ -1160,29 +1309,13 @@
 		goto err;
 
 	val |= ret;
-	if (i2s_tdm->clk_trcm) {
-		rockchip_i2s_trcm_mode(substream, dai, div_bclk, div_lrck, val);
-	} else if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
-		regmap_update_bits(i2s_tdm->regmap, I2S_CLKDIV,
-				   I2S_CLKDIV_TXM_MASK,
-				   I2S_CLKDIV_TXM(div_bclk));
-		regmap_update_bits(i2s_tdm->regmap, I2S_CKR,
-				   I2S_CKR_TSD_MASK,
-				   I2S_CKR_TSD(div_lrck));
-		regmap_update_bits(i2s_tdm->regmap, I2S_TXCR,
-				   I2S_TXCR_VDW_MASK | I2S_TXCR_CSR_MASK,
-				   val);
-	} else {
-		regmap_update_bits(i2s_tdm->regmap, I2S_CLKDIV,
-				   I2S_CLKDIV_RXM_MASK,
-				   I2S_CLKDIV_RXM(div_bclk));
-		regmap_update_bits(i2s_tdm->regmap, I2S_CKR,
-				   I2S_CKR_RSD_MASK,
-				   I2S_CKR_RSD(div_lrck));
-		regmap_update_bits(i2s_tdm->regmap, I2S_RXCR,
-				   I2S_RXCR_VDW_MASK | I2S_RXCR_CSR_MASK,
-				   val);
-	}
+	if (!is_params_dirty(substream, dai, div_bclk, div_lrck, val))
+		return 0;
+
+	if (i2s_tdm->clk_trcm)
+		rockchip_i2s_tdm_params_trcm(substream, dai, div_bclk, div_lrck, val);
+	else
+		rockchip_i2s_tdm_params(substream, dai, div_bclk, div_lrck, val);
 
 	ret = rockchip_i2s_io_multiplex(substream, dai);
 
@@ -1200,22 +1333,12 @@
 	case SNDRV_PCM_TRIGGER_START:
 	case SNDRV_PCM_TRIGGER_RESUME:
 	case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
-		if (i2s_tdm->clk_trcm)
-			rockchip_snd_txrxctrl(substream, dai, 1);
-		else if (substream->stream == SNDRV_PCM_STREAM_CAPTURE)
-			rockchip_snd_rxctrl(i2s_tdm, 1);
-		else
-			rockchip_snd_txctrl(i2s_tdm, 1);
+		rockchip_i2s_tdm_start(i2s_tdm, substream->stream);
 		break;
 	case SNDRV_PCM_TRIGGER_SUSPEND:
 	case SNDRV_PCM_TRIGGER_STOP:
 	case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
-		if (i2s_tdm->clk_trcm)
-			rockchip_snd_txrxctrl(substream, dai, 0);
-		else if (substream->stream == SNDRV_PCM_STREAM_CAPTURE)
-			rockchip_snd_rxctrl(i2s_tdm, 0);
-		else
-			rockchip_snd_txctrl(i2s_tdm, 0);
+		rockchip_i2s_tdm_stop(i2s_tdm, substream->stream);
 		break;
 	default:
 		ret = -EINVAL;
@@ -1305,6 +1428,93 @@
 	.put = rockchip_i2s_tdm_clk_compensation_put,
 };
 
+/* loopback mode select */
+enum {
+	LOOPBACK_MODE_DIS = 0,
+	LOOPBACK_MODE_1,
+	LOOPBACK_MODE_2,
+	LOOPBACK_MODE_2_SWAP,
+};
+
+static const char *const loopback_text[] = {
+	"Disabled",
+	"Mode1",
+	"Mode2",
+	"Mode2 Swap",
+};
+
+static SOC_ENUM_SINGLE_EXT_DECL(loopback_mode, loopback_text);
+
+static int rockchip_i2s_tdm_loopback_get(struct snd_kcontrol *kcontrol,
+					 struct snd_ctl_elem_value *ucontrol)
+{
+	struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol);
+	struct rk_i2s_tdm_dev *i2s_tdm = snd_soc_component_get_drvdata(component);
+	unsigned int reg = 0, mode = 0;
+
+	pm_runtime_get_sync(component->dev);
+	regmap_read(i2s_tdm->regmap, I2S_XFER, &reg);
+	pm_runtime_put(component->dev);
+
+	switch (reg & I2S_XFER_LP_MODE_MASK) {
+	case I2S_XFER_LP_MODE_2_SWAP:
+		mode = LOOPBACK_MODE_2_SWAP;
+		break;
+	case I2S_XFER_LP_MODE_2:
+		mode = LOOPBACK_MODE_2;
+		break;
+	case I2S_XFER_LP_MODE_1:
+		mode = LOOPBACK_MODE_1;
+		break;
+	default:
+		mode = LOOPBACK_MODE_DIS;
+		break;
+	}
+
+	ucontrol->value.enumerated.item[0] = mode;
+
+	return 0;
+}
+
+static int rockchip_i2s_tdm_loopback_put(struct snd_kcontrol *kcontrol,
+					 struct snd_ctl_elem_value *ucontrol)
+{
+	struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol);
+	struct rk_i2s_tdm_dev *i2s_tdm = snd_soc_component_get_drvdata(component);
+	unsigned int val = 0, mode = ucontrol->value.enumerated.item[0];
+
+	if (mode < LOOPBACK_MODE_DIS ||
+	    mode > LOOPBACK_MODE_2_SWAP)
+		return -EINVAL;
+
+	switch (mode) {
+	case LOOPBACK_MODE_2_SWAP:
+		val = I2S_XFER_LP_MODE_2_SWAP;
+		break;
+	case LOOPBACK_MODE_2:
+		val = I2S_XFER_LP_MODE_2;
+		break;
+	case LOOPBACK_MODE_1:
+		val = I2S_XFER_LP_MODE_1;
+		break;
+	default:
+		val = I2S_XFER_LP_MODE_DIS;
+		break;
+	}
+
+	pm_runtime_get_sync(component->dev);
+	regmap_update_bits(i2s_tdm->regmap, I2S_XFER, I2S_XFER_LP_MODE_MASK, val);
+	pm_runtime_put(component->dev);
+
+	return 0;
+}
+
+static const struct snd_kcontrol_new rockchip_i2s_tdm_snd_controls[] = {
+	SOC_ENUM_EXT("I2STDM Digital Loopback Mode", loopback_mode,
+		     rockchip_i2s_tdm_loopback_get,
+		     rockchip_i2s_tdm_loopback_put),
+};
+
 static int rockchip_i2s_tdm_dai_probe(struct snd_soc_dai *dai)
 {
 	struct rk_i2s_tdm_dev *i2s_tdm = snd_soc_dai_get_drvdata(dai);
@@ -1340,7 +1550,30 @@
 	return 0;
 }
 
+static int rockchip_i2s_tdm_startup(struct snd_pcm_substream *substream,
+				    struct snd_soc_dai *dai)
+{
+	struct rk_i2s_tdm_dev *i2s_tdm = snd_soc_dai_get_drvdata(dai);
+
+	if (i2s_tdm->substreams[substream->stream])
+		return -EBUSY;
+
+	i2s_tdm->substreams[substream->stream] = substream;
+
+	return 0;
+}
+
+static void rockchip_i2s_tdm_shutdown(struct snd_pcm_substream *substream,
+				      struct snd_soc_dai *dai)
+{
+	struct rk_i2s_tdm_dev *i2s_tdm = snd_soc_dai_get_drvdata(dai);
+
+	i2s_tdm->substreams[substream->stream] = NULL;
+}
+
 static const struct snd_soc_dai_ops rockchip_i2s_tdm_dai_ops = {
+	.startup = rockchip_i2s_tdm_startup,
+	.shutdown = rockchip_i2s_tdm_shutdown,
 	.hw_params = rockchip_i2s_tdm_hw_params,
 	.set_sysclk = rockchip_i2s_tdm_set_sysclk,
 	.set_fmt = rockchip_i2s_tdm_set_fmt,
@@ -1350,6 +1583,8 @@
 
 static const struct snd_soc_component_driver rockchip_i2s_tdm_component = {
 	.name = DRV_NAME,
+	.controls = rockchip_i2s_tdm_snd_controls,
+	.num_controls = ARRAY_SIZE(rockchip_i2s_tdm_snd_controls),
 };
 
 static bool rockchip_i2s_tdm_wr_reg(struct device *dev, unsigned int reg)
@@ -1400,6 +1635,7 @@
 {
 	switch (reg) {
 	case I2S_TXFIFOLR:
+	case I2S_INTCR:
 	case I2S_INTSR:
 	case I2S_CLR:
 	case I2S_TXDR:
@@ -1453,9 +1689,11 @@
 	u32 reg = 0, val = 0, trcm = i2s_tdm->clk_trcm;
 	int i;
 
+	if (IS_ERR(i2s_tdm->grf))
+		return 0;
+
 	switch (trcm) {
 	case I2S_CKR_TRCM_TXONLY:
-		/* fall through */
 	case I2S_CKR_TRCM_RXONLY:
 		break;
 	default:
@@ -1591,7 +1829,8 @@
 				    SNDRV_PCM_FMTBIT_S16_LE |
 				    SNDRV_PCM_FMTBIT_S20_3LE |
 				    SNDRV_PCM_FMTBIT_S24_LE |
-				    SNDRV_PCM_FMTBIT_S32_LE),
+				    SNDRV_PCM_FMTBIT_S32_LE |
+				    SNDRV_PCM_FMTBIT_IEC958_SUBFRAME_LE),
 		},
 		.capture = {
 			.stream_name = "Capture",
@@ -1602,7 +1841,8 @@
 				    SNDRV_PCM_FMTBIT_S16_LE |
 				    SNDRV_PCM_FMTBIT_S20_3LE |
 				    SNDRV_PCM_FMTBIT_S24_LE |
-				    SNDRV_PCM_FMTBIT_S32_LE),
+				    SNDRV_PCM_FMTBIT_S32_LE |
+				    SNDRV_PCM_FMTBIT_IEC958_SUBFRAME_LE),
 		},
 		.ops = &rockchip_i2s_tdm_dai_ops,
 	};
@@ -1758,6 +1998,34 @@
 	return rockchip_i2s_tdm_path_prepare(i2s_tdm, np, 1);
 }
 
+static irqreturn_t rockchip_i2s_tdm_isr(int irq, void *devid)
+{
+	struct rk_i2s_tdm_dev *i2s_tdm = (struct rk_i2s_tdm_dev *)devid;
+	struct snd_pcm_substream *substream;
+	u32 val;
+
+	regmap_read(i2s_tdm->regmap, I2S_INTSR, &val);
+	if (val & I2S_INTSR_TXUI_ACT) {
+		dev_warn_ratelimited(i2s_tdm->dev, "TX FIFO Underrun\n");
+		regmap_update_bits(i2s_tdm->regmap, I2S_INTCR,
+				   I2S_INTCR_TXUIC, I2S_INTCR_TXUIC);
+		substream = i2s_tdm->substreams[SNDRV_PCM_STREAM_PLAYBACK];
+		if (substream)
+			snd_pcm_stop_xrun(substream);
+	}
+
+	if (val & I2S_INTSR_RXOI_ACT) {
+		dev_warn_ratelimited(i2s_tdm->dev, "RX FIFO Overrun\n");
+		regmap_update_bits(i2s_tdm->regmap, I2S_INTCR,
+				   I2S_INTCR_RXOIC, I2S_INTCR_RXOIC);
+		substream = i2s_tdm->substreams[SNDRV_PCM_STREAM_CAPTURE];
+		if (substream)
+			snd_pcm_stop_xrun(substream);
+	}
+
+	return IRQ_HANDLED;
+}
+
 static int rockchip_i2s_tdm_probe(struct platform_device *pdev)
 {
 	struct device_node *node = pdev->dev.of_node;
@@ -1769,8 +2037,7 @@
 #ifdef HAVE_SYNC_RESET
 	bool sync;
 #endif
-	int ret;
-	int val;
+	int ret, val, i, irq;
 
 	ret = rockchip_i2s_tdm_dai_prepare(pdev, &soc_dai);
 	if (ret)
@@ -1788,6 +2055,10 @@
 
 	spin_lock_init(&i2s_tdm->lock);
 	i2s_tdm->soc_data = (const struct rk_i2s_soc_data *)of_id->data;
+
+	for (i = 0; i < ARRAY_SIZE(of_quirks); i++)
+		if (of_property_read_bool(node, of_quirks[i].quirk))
+			i2s_tdm->quirks |= of_quirks[i].id;
 
 	i2s_tdm->bclk_fs = 64;
 	if (!of_property_read_u32(node, "rockchip,bclk-fs", &val)) {
@@ -1813,8 +2084,6 @@
 		soc_dai->playback.channels_min = 0;
 
 	i2s_tdm->grf = syscon_regmap_lookup_by_phandle(node, "rockchip,grf");
-	if (IS_ERR(i2s_tdm->grf))
-		return PTR_ERR(i2s_tdm->grf);
 
 #ifdef HAVE_SYNC_RESET
 	sync = of_device_is_compatible(node, "rockchip,px30-i2s-tdm") ||
@@ -1892,23 +2161,32 @@
 		i2s_tdm->mclk_root1_freq = i2s_tdm->mclk_root1_initial_freq;
 	}
 
-	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-	regs = devm_ioremap_resource(&pdev->dev, res);
+	regs = devm_platform_get_and_ioremap_resource(pdev, 0, &res);
 	if (IS_ERR(regs))
 		return PTR_ERR(regs);
 
 	i2s_tdm->regmap = devm_regmap_init_mmio(&pdev->dev, regs,
-					    &rockchip_i2s_tdm_regmap_config);
+						&rockchip_i2s_tdm_regmap_config);
 	if (IS_ERR(i2s_tdm->regmap))
 		return PTR_ERR(i2s_tdm->regmap);
 
+	irq = platform_get_irq(pdev, 0);
+	if (irq > 0) {
+		ret = devm_request_irq(&pdev->dev, irq, rockchip_i2s_tdm_isr,
+				       IRQF_SHARED, node->name, i2s_tdm);
+		if (ret) {
+			dev_err(&pdev->dev, "failed to request irq %u\n", irq);
+			return ret;
+		}
+	}
+
 	i2s_tdm->playback_dma_data.addr = res->start + I2S_TXDR;
 	i2s_tdm->playback_dma_data.addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES;
-	i2s_tdm->playback_dma_data.maxburst = 8;
+	i2s_tdm->playback_dma_data.maxburst = MAXBURST_PER_FIFO;
 
 	i2s_tdm->capture_dma_data.addr = res->start + I2S_RXDR;
 	i2s_tdm->capture_dma_data.addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES;
-	i2s_tdm->capture_dma_data.maxburst = 8;
+	i2s_tdm->capture_dma_data.maxburst = MAXBURST_PER_FIFO;
 
 	ret = rockchip_i2s_tdm_tx_path_prepare(i2s_tdm, node);
 	if (ret < 0) {
@@ -1932,6 +2210,36 @@
 			goto err_pm_disable;
 	}
 
+	if (i2s_tdm->quirks & QUIRK_ALWAYS_ON) {
+		unsigned int rate = DEFAULT_FS * DEFAULT_MCLK_FS;
+		unsigned int div_bclk = DEFAULT_FS * DEFAULT_MCLK_FS;
+		unsigned int div_lrck = i2s_tdm->bclk_fs;
+
+		div_bclk = DIV_ROUND_CLOSEST(rate, div_lrck * DEFAULT_FS);
+
+		/* assign generic freq */
+		clk_set_rate(i2s_tdm->mclk_rx, rate);
+		clk_set_rate(i2s_tdm->mclk_tx, rate);
+
+		ret = rockchip_i2s_tdm_mclk_reparent(i2s_tdm);
+		if (ret)
+			goto err_pm_disable;
+
+		regmap_update_bits(i2s_tdm->regmap, I2S_CLKDIV,
+				   I2S_CLKDIV_RXM_MASK | I2S_CLKDIV_TXM_MASK,
+				   I2S_CLKDIV_RXM(div_bclk) | I2S_CLKDIV_TXM(div_bclk));
+		regmap_update_bits(i2s_tdm->regmap, I2S_CKR,
+				   I2S_CKR_RSD_MASK | I2S_CKR_TSD_MASK,
+				   I2S_CKR_RSD(div_lrck) | I2S_CKR_TSD(div_lrck));
+
+		if (i2s_tdm->clk_trcm)
+			rockchip_i2s_tdm_xfer_trcm_start(i2s_tdm);
+		else
+			rockchip_i2s_tdm_xfer_start(i2s_tdm, SNDRV_PCM_STREAM_PLAYBACK);
+
+		pm_runtime_forbid(&pdev->dev);
+	}
+
 	regmap_update_bits(i2s_tdm->regmap, I2S_DMACR, I2S_DMACR_TDL_MASK,
 			   I2S_DMACR_TDL(16));
 	regmap_update_bits(i2s_tdm->regmap, I2S_DMACR, I2S_DMACR_RDL_MASK,
@@ -1951,8 +2259,11 @@
 		goto err_suspend;
 	}
 
-	if (of_property_read_bool(node, "rockchip,no-dmaengine"))
-		return ret;
+	if (of_property_read_bool(node, "rockchip,no-dmaengine")) {
+		dev_info(&pdev->dev, "Used for Multi-DAI\n");
+		return 0;
+	}
+
 	ret = devm_snd_dmaengine_pcm_register(&pdev->dev, NULL, 0);
 	if (ret) {
 		dev_err(&pdev->dev, "Could not register PCM\n");
@@ -1978,14 +2289,21 @@
 	if (!pm_runtime_status_suspended(&pdev->dev))
 		i2s_tdm_runtime_suspend(&pdev->dev);
 
-	if (!IS_ERR(i2s_tdm->mclk_tx))
-		clk_prepare_enable(i2s_tdm->mclk_tx);
-	if (!IS_ERR(i2s_tdm->mclk_rx))
-		clk_prepare_enable(i2s_tdm->mclk_rx);
-	if (!IS_ERR(i2s_tdm->hclk))
-		clk_disable_unprepare(i2s_tdm->hclk);
+	clk_disable_unprepare(i2s_tdm->mclk_tx);
+	clk_disable_unprepare(i2s_tdm->mclk_rx);
+	clk_disable_unprepare(i2s_tdm->hclk);
 
 	return 0;
+}
+
+static void rockchip_i2s_tdm_platform_shutdown(struct platform_device *pdev)
+{
+	struct rk_i2s_tdm_dev *i2s_tdm = dev_get_drvdata(&pdev->dev);
+
+	pm_runtime_get_sync(i2s_tdm->dev);
+	rockchip_i2s_tdm_stop(i2s_tdm, SNDRV_PCM_STREAM_PLAYBACK);
+	rockchip_i2s_tdm_stop(i2s_tdm, SNDRV_PCM_STREAM_CAPTURE);
+	pm_runtime_put(i2s_tdm->dev);
 }
 
 #ifdef CONFIG_PM_SLEEP
@@ -2023,6 +2341,7 @@
 static struct platform_driver rockchip_i2s_tdm_driver = {
 	.probe = rockchip_i2s_tdm_probe,
 	.remove = rockchip_i2s_tdm_remove,
+	.shutdown = rockchip_i2s_tdm_platform_shutdown,
 	.driver = {
 		.name = DRV_NAME,
 		.of_match_table = of_match_ptr(rockchip_i2s_tdm_match),
diff --git a/kernel/sound/soc/rockchip/rockchip_i2s_tdm.h b/kernel/sound/soc/rockchip/rockchip_i2s_tdm.h
index fa41f81..2a8c489 100644
--- a/kernel/sound/soc/rockchip/rockchip_i2s_tdm.h
+++ b/kernel/sound/soc/rockchip/rockchip_i2s_tdm.h
@@ -144,12 +144,16 @@
 #define I2S_DMACR_RDE_SHIFT	24
 #define I2S_DMACR_RDE_DISABLE	(0 << I2S_DMACR_RDE_SHIFT)
 #define I2S_DMACR_RDE_ENABLE	(1 << I2S_DMACR_RDE_SHIFT)
+#define I2S_DMACR_RDE_MASK	(1 << I2S_DMACR_RDE_SHIFT)
+#define I2S_DMACR_RDE(x)	((x) << I2S_DMACR_RDE_SHIFT)
 #define I2S_DMACR_RDL_SHIFT	16
 #define I2S_DMACR_RDL(x)	(((x) - 1) << I2S_DMACR_RDL_SHIFT)
 #define I2S_DMACR_RDL_MASK	(0x1f << I2S_DMACR_RDL_SHIFT)
 #define I2S_DMACR_TDE_SHIFT	8
 #define I2S_DMACR_TDE_DISABLE	(0 << I2S_DMACR_TDE_SHIFT)
 #define I2S_DMACR_TDE_ENABLE	(1 << I2S_DMACR_TDE_SHIFT)
+#define I2S_DMACR_TDE_MASK	(1 << I2S_DMACR_TDE_SHIFT)
+#define I2S_DMACR_TDE(x)	((x) << I2S_DMACR_TDE_SHIFT)
 #define I2S_DMACR_TDL_SHIFT	0
 #define I2S_DMACR_TDL(x)	((x) << I2S_DMACR_TDL_SHIFT)
 #define I2S_DMACR_TDL_MASK	(0x1f << I2S_DMACR_TDL_SHIFT)
@@ -162,8 +166,8 @@
 #define I2S_INTCR_RFT(x)	(((x) - 1) << I2S_INTCR_RFT_SHIFT)
 #define I2S_INTCR_RXOIC		BIT(18)
 #define I2S_INTCR_RXOIE_SHIFT	17
-#define I2S_INTCR_RXOIE_DISABLE	(0 << I2S_INTCR_RXOIE_SHIFT)
-#define I2S_INTCR_RXOIE_ENABLE	(1 << I2S_INTCR_RXOIE_SHIFT)
+#define I2S_INTCR_RXOIE_MASK	(1 << I2S_INTCR_RXOIE_SHIFT)
+#define I2S_INTCR_RXOIE(x)	((x) << I2S_INTCR_RXOIE_SHIFT)
 #define I2S_INTCR_RXFIE_SHIFT	16
 #define I2S_INTCR_RXFIE_DISABLE	(0 << I2S_INTCR_RXFIE_SHIFT)
 #define I2S_INTCR_RXFIE_ENABLE	(1 << I2S_INTCR_RXFIE_SHIFT)
@@ -172,8 +176,8 @@
 #define I2S_INTCR_TFT_MASK	(0x1f << I2S_INTCR_TFT_SHIFT)
 #define I2S_INTCR_TXUIC		BIT(2)
 #define I2S_INTCR_TXUIE_SHIFT	1
-#define I2S_INTCR_TXUIE_DISABLE	(0 << I2S_INTCR_TXUIE_SHIFT)
-#define I2S_INTCR_TXUIE_ENABLE	(1 << I2S_INTCR_TXUIE_SHIFT)
+#define I2S_INTCR_TXUIE_MASK	(1 << I2S_INTCR_TXUIE_SHIFT)
+#define I2S_INTCR_TXUIE(x)	((x) << I2S_INTCR_TXUIE_SHIFT)
 
 /*
  * INTSR
@@ -199,12 +203,37 @@
  * XFER
  * Transfer start register
  */
+/*
+ * lp mode2 swap:
+ * i2s sdi0_l <- i2s sdo0_l
+ * i2s sdi0_r <- codec sdo_r
+ *
+ * lp mode2:
+ * i2s sdi0_l <- codec sdo_l
+ * i2s sdi0_r <- i2s sdo0_r
+ *
+ * lp mode1:
+ * i2s sdi0_l <- codec sdo_l
+ * i2s sdi0_r <- codec sdo_r
+ * i2s sdi1_l <- i2s sdo0_l
+ * i2s sdi1_r <- i2s sdo0_r
+ *
+ */
+#define I2S_XFER_LP_MODE_MASK	GENMASK(4, 2)
+#define I2S_XFER_LP_MODE_2_SWAP	(BIT(4) | BIT(3))
+#define I2S_XFER_LP_MODE_2	BIT(3)
+#define I2S_XFER_LP_MODE_1	BIT(2)
+#define I2S_XFER_LP_MODE_DIS	0
 #define I2S_XFER_RXS_SHIFT	1
 #define I2S_XFER_RXS_STOP	(0 << I2S_XFER_RXS_SHIFT)
 #define I2S_XFER_RXS_START	(1 << I2S_XFER_RXS_SHIFT)
+#define I2S_XFER_RXS_MASK	(1 << I2S_XFER_RXS_SHIFT)
+#define I2S_XFER_RXS(x)		((x) << I2S_XFER_RXS_SHIFT)
 #define I2S_XFER_TXS_SHIFT	0
 #define I2S_XFER_TXS_STOP	(0 << I2S_XFER_TXS_SHIFT)
 #define I2S_XFER_TXS_START	(1 << I2S_XFER_TXS_SHIFT)
+#define I2S_XFER_TXS_MASK	(1 << I2S_XFER_TXS_SHIFT)
+#define I2S_XFER_TXS(x)		((x) << I2S_XFER_TXS_SHIFT)
 
 /*
  * CLR
diff --git a/kernel/sound/soc/rockchip/rockchip_multi_dais.c b/kernel/sound/soc/rockchip/rockchip_multi_dais.c
index 88fb11c..06d80a1 100644
--- a/kernel/sound/soc/rockchip/rockchip_multi_dais.c
+++ b/kernel/sound/soc/rockchip/rockchip_multi_dais.c
@@ -80,9 +80,19 @@
 {
 	struct rk_mdais_dev *mdais = to_info(dai);
 	struct snd_soc_dai *child;
+	unsigned int *channel_maps;
 	int ret = 0, i = 0;
 
+	if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
+		channel_maps = mdais->playback_channel_maps;
+	else
+		channel_maps = mdais->capture_channel_maps;
+
 	for (i = 0; i < mdais->num_dais; i++) {
+		/* skip DAIs which have no channel mapping */
+		if (!channel_maps[i])
+			continue;
+
 		child = mdais->dais[i].dai;
 		if (child->driver->ops && child->driver->ops->trigger) {
 			ret = child->driver->ops->trigger(substream,
diff --git a/kernel/sound/soc/rockchip/rockchip_multi_dais_pcm.c b/kernel/sound/soc/rockchip/rockchip_multi_dais_pcm.c
index c057fa8..e2a0de7 100644
--- a/kernel/sound/soc/rockchip/rockchip_multi_dais_pcm.c
+++ b/kernel/sound/soc/rockchip/rockchip_multi_dais_pcm.c
@@ -601,6 +601,9 @@
 		pos = buf_size - state.residue;
 
 	frames = bytes_to_frames(substream->runtime, pos);
+	if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
+		return frames;
+
 #ifdef CONFIG_SND_SOC_ROCKCHIP_VAD
 	if (prtd->vpos)
 		frames = bytes_to_frames(substream->runtime, prtd->vpos);
diff --git a/kernel/sound/soc/rockchip/rockchip_multicodecs.c b/kernel/sound/soc/rockchip/rockchip_multicodecs.c
index ee45076..8b1cb5f 100644
--- a/kernel/sound/soc/rockchip/rockchip_multicodecs.c
+++ b/kernel/sound/soc/rockchip/rockchip_multicodecs.c
@@ -19,9 +19,18 @@
  *
  */
 
+#include <linux/extcon-provider.h>
+#include <linux/gpio.h>
+#include <linux/iio/consumer.h>
+#include <linux/iio/iio.h>
+#include <linux/input.h>
+#include <linux/interrupt.h>
+#include <linux/irq.h>
 #include <linux/module.h>
+#include <linux/of_gpio.h>
 #include <linux/platform_device.h>
 #include <linux/slab.h>
+#include <linux/workqueue.h>
 #include <sound/core.h>
 #include <sound/jack.h>
 #include <sound/pcm.h>
@@ -29,39 +38,321 @@
 #include <sound/soc.h>
 #include <sound/soc-dapm.h>
 
-#include "../codecs/rk3308_codec_provider.h"
-
 #define DRV_NAME "rk-multicodecs"
-#define MAX_CODECS	2
 #define WAIT_CARDS	(SNDRV_CARDS - 1)
 #define DEFAULT_MCLK_FS	256
+
+struct adc_keys_button {
+	u32 voltage;
+	u32 keycode;
+};
+
+struct input_dev_poller {
+	void (*poll)(struct input_dev *dev);
+
+	unsigned int poll_interval_ms;
+	struct input_dev *input;
+	struct delayed_work work;
+};
 
 struct multicodecs_data {
 	struct snd_soc_card snd_card;
 	struct snd_soc_dai_link dai_link;
+	struct snd_soc_jack *jack_headset;
+	struct gpio_desc *hp_ctl_gpio;
+	struct gpio_desc *spk_ctl_gpio;
+	struct gpio_desc *hp_det_gpio;
+	struct iio_channel *adc;
+	struct extcon_dev *extcon;
+	struct delayed_work handler;
 	unsigned int mclk_fs;
 	bool codec_hp_det;
+	u32 num_keys;
+	u32 last_key;
+	u32 keyup_voltage;
+	const struct adc_keys_button *map;
+	struct input_dev *input;
+	struct input_dev_poller *poller;
 };
 
-static struct snd_soc_jack mc_hp_jack;
+static const unsigned int headset_extcon_cable[] = {
+	EXTCON_JACK_MICROPHONE,
+	EXTCON_JACK_HEADPHONE,
+	EXTCON_NONE,
+};
+
+static void mc_set_poll_interval(struct input_dev_poller *poller, unsigned int interval)
+{
+	if (poller)
+		poller->poll_interval_ms = interval;
+}
+
+static void mc_keys_poller_queue_work(struct input_dev_poller *poller)
+{
+	unsigned long delay;
+
+	delay = msecs_to_jiffies(poller->poll_interval_ms);
+	if (delay >= HZ)
+		delay = round_jiffies_relative(delay);
+
+	queue_delayed_work(system_freezable_wq, &poller->work, delay);
+}
+
+static void mc_keys_poller_work(struct work_struct *work)
+{
+	struct input_dev_poller *poller =
+		container_of(work, struct input_dev_poller, work.work);
+
+	poller->poll(poller->input);
+	mc_keys_poller_queue_work(poller);
+}
+
+static void mc_keys_poller_start(struct input_dev_poller *poller)
+{
+	if (poller->poll_interval_ms > 0) {
+		poller->poll(poller->input);
+		mc_keys_poller_queue_work(poller);
+	}
+}
+
+static void mc_keys_poller_stop(struct input_dev_poller *poller)
+{
+	cancel_delayed_work_sync(&poller->work);
+}
+
+static int mc_keys_setup_polling(struct multicodecs_data *mc_data,
+				 void (*poll_fn)(struct input_dev *dev))
+{
+	struct input_dev_poller *poller;
+
+	poller = devm_kzalloc(mc_data->snd_card.dev, sizeof(*poller), GFP_KERNEL);
+	if (!poller)
+		return -ENOMEM;
+
+	INIT_DELAYED_WORK(&poller->work, mc_keys_poller_work);
+	poller->input = mc_data->input;
+	poller->poll = poll_fn;
+	mc_data->poller = poller;
+
+	return 0;
+}
+
+static void mc_keys_poll(struct input_dev *input)
+{
+	struct multicodecs_data *mc_data = input_get_drvdata(input);
+	int i, value, ret;
+	u32 diff, closest = 0xffffffff;
+	int keycode = 0;
+
+	ret = iio_read_channel_processed(mc_data->adc, &value);
+	if (unlikely(ret < 0)) {
+		/* Forcibly release key if any was pressed */
+		value = mc_data->keyup_voltage;
+	} else {
+		for (i = 0; i < mc_data->num_keys; i++) {
+			diff = abs(mc_data->map[i].voltage - value);
+			if (diff < closest) {
+				closest = diff;
+				keycode = mc_data->map[i].keycode;
+			}
+		}
+	}
+
+	if (abs(mc_data->keyup_voltage - value) < closest)
+		keycode = 0;
+
+	if (mc_data->last_key && mc_data->last_key != keycode)
+		input_report_key(input, mc_data->last_key, 0);
+
+	if (keycode)
+		input_report_key(input, keycode, 1);
+
+	input_sync(input);
+	mc_data->last_key = keycode;
+}
+
+static int mc_keys_load_keymap(struct device *dev,
+			       struct multicodecs_data *mc_data)
+{
+	struct adc_keys_button *map;
+	struct fwnode_handle *child;
+	int i = 0;
+
+	mc_data->num_keys = device_get_child_node_count(dev);
+	if (mc_data->num_keys == 0) {
+		dev_err(dev, "keymap is missing\n");
+		return -EINVAL;
+	}
+
+	map = devm_kmalloc_array(dev, mc_data->num_keys, sizeof(*map), GFP_KERNEL);
+	if (!map)
+		return -ENOMEM;
+
+	device_for_each_child_node(dev, child) {
+		if (fwnode_property_read_u32(child, "press-threshold-microvolt",
+					     &map[i].voltage)) {
+			dev_err(dev, "Key with invalid or missing voltage\n");
+			fwnode_handle_put(child);
+			return -EINVAL;
+		}
+		map[i].voltage /= 1000;
+
+		if (fwnode_property_read_u32(child, "linux,code",
+					     &map[i].keycode)) {
+			dev_err(dev, "Key with invalid or missing linux,code\n");
+			fwnode_handle_put(child);
+			return -EINVAL;
+		}
+
+		i++;
+	}
+	mc_data->map = map;
+	return 0;
+}
+
+static void adc_jack_handler(struct work_struct *work)
+{
+	struct multicodecs_data *mc_data = container_of(to_delayed_work(work),
+						  struct multicodecs_data,
+						  handler);
+	struct snd_soc_jack *jack_headset = mc_data->jack_headset;
+	int adc, ret = 0;
+
+	if (!gpiod_get_value(mc_data->hp_det_gpio)) {
+		snd_soc_jack_report(jack_headset, 0, SND_JACK_HEADSET);
+		extcon_set_state_sync(mc_data->extcon,
+				EXTCON_JACK_HEADPHONE, false);
+		extcon_set_state_sync(mc_data->extcon,
+				EXTCON_JACK_MICROPHONE, false);
+		if (mc_data->poller)
+			mc_keys_poller_stop(mc_data->poller);
+
+		return;
+	}
+	if (!mc_data->adc) {
+		/* no ADC, so is headphone */
+		snd_soc_jack_report(jack_headset, SND_JACK_HEADPHONE, SND_JACK_HEADSET);
+		extcon_set_state_sync(mc_data->extcon, EXTCON_JACK_HEADPHONE, true);
+		extcon_set_state_sync(mc_data->extcon, EXTCON_JACK_MICROPHONE, false);
+		return;
+	}
+	ret = iio_read_channel_processed(mc_data->adc, &adc);
+	if (ret < 0) {
+		/* failed to read ADC, so assume headphone */
+		snd_soc_jack_report(jack_headset, SND_JACK_HEADPHONE, SND_JACK_HEADSET);
+		extcon_set_state_sync(mc_data->extcon, EXTCON_JACK_HEADPHONE, true);
+		extcon_set_state_sync(mc_data->extcon, EXTCON_JACK_MICROPHONE, false);
+
+	} else {
+		snd_soc_jack_report(jack_headset,
+				    snd_soc_jack_get_type(jack_headset, adc),
+				    SND_JACK_HEADSET);
+		extcon_set_state_sync(mc_data->extcon, EXTCON_JACK_HEADPHONE, true);
+
+		if (snd_soc_jack_get_type(jack_headset, adc) == SND_JACK_HEADSET) {
+			extcon_set_state_sync(mc_data->extcon, EXTCON_JACK_MICROPHONE, true);
+			if (mc_data->poller)
+				mc_keys_poller_start(mc_data->poller);
+		}
+	}
+};
+
+static irqreturn_t headset_det_irq_thread(int irq, void *data)
+{
+	struct multicodecs_data *mc_data = (struct multicodecs_data *)data;
+
+	queue_delayed_work(system_power_efficient_wq, &mc_data->handler, msecs_to_jiffies(200));
+
+	return IRQ_HANDLED;
+};
+
+static int mc_hp_event(struct snd_soc_dapm_widget *w,
+		       struct snd_kcontrol *kcontrol, int event)
+{
+	struct snd_soc_card *card = w->dapm->card;
+	struct multicodecs_data *mc_data = snd_soc_card_get_drvdata(card);
+
+	switch (event) {
+	case SND_SOC_DAPM_POST_PMU:
+		gpiod_set_value_cansleep(mc_data->hp_ctl_gpio, 1);
+		break;
+	case SND_SOC_DAPM_PRE_PMD:
+		gpiod_set_value_cansleep(mc_data->hp_ctl_gpio, 0);
+		break;
+	default:
+		return 0;
+
+	}
+
+	return 0;
+}
+
+static int mc_spk_event(struct snd_soc_dapm_widget *w,
+			struct snd_kcontrol *kcontrol, int event)
+{
+	struct snd_soc_card *card = w->dapm->card;
+	struct multicodecs_data *mc_data = snd_soc_card_get_drvdata(card);
+
+	switch (event) {
+	case SND_SOC_DAPM_POST_PMU:
+		gpiod_set_value_cansleep(mc_data->spk_ctl_gpio, 1);
+		break;
+	case SND_SOC_DAPM_PRE_PMD:
+		gpiod_set_value_cansleep(mc_data->spk_ctl_gpio, 0);
+		break;
+	default:
+		return 0;
+
+	}
+
+	return 0;
+}
+
+static const struct snd_soc_dapm_widget mc_dapm_widgets[] = {
+
+	SND_SOC_DAPM_HP("Headphone", NULL),
+	SND_SOC_DAPM_SPK("Speaker", NULL),
+	SND_SOC_DAPM_MIC("Main Mic", NULL),
+	SND_SOC_DAPM_MIC("Headset Mic", NULL),
+	SND_SOC_DAPM_SUPPLY("Speaker Power",
+			    SND_SOC_NOPM, 0, 0,
+			    mc_spk_event,
+			    SND_SOC_DAPM_POST_PMU |
+			    SND_SOC_DAPM_PRE_PMD),
+	SND_SOC_DAPM_SUPPLY("Headphone Power",
+			    SND_SOC_NOPM, 0, 0,
+			    mc_hp_event,
+			    SND_SOC_DAPM_POST_PMU |
+			    SND_SOC_DAPM_PRE_PMD),
+};
+
+static const struct snd_kcontrol_new mc_controls[] = {
+	SOC_DAPM_PIN_SWITCH("Headphone"),
+	SOC_DAPM_PIN_SWITCH("Speaker"),
+	SOC_DAPM_PIN_SWITCH("Main Mic"),
+	SOC_DAPM_PIN_SWITCH("Headset Mic"),
+};
 
 static int rk_multicodecs_hw_params(struct snd_pcm_substream *substream,
 				    struct snd_pcm_hw_params *params)
 {
 	struct snd_soc_pcm_runtime *rtd = substream->private_data;
-	struct snd_soc_dai *codec_dai = rtd->codec_dai;
 	struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
+	struct snd_soc_dai *codec_dai;
 	struct multicodecs_data *mc_data = snd_soc_card_get_drvdata(rtd->card);
 	unsigned int mclk;
-	int ret;
+	int ret, i;
 
 	mclk = params_rate(params) * mc_data->mclk_fs;
 
-	ret = snd_soc_dai_set_sysclk(codec_dai, substream->stream, mclk,
-				     SND_SOC_CLOCK_IN);
-	if (ret && ret != -ENOTSUPP) {
-		pr_err("Set codec_dai sysclk failed: %d\n", ret);
-		goto out;
+	for (i = 0; i < rtd->num_codecs; i++) {
+		codec_dai = rtd->codec_dais[i];
+		ret = snd_soc_dai_set_sysclk(codec_dai, substream->stream, mclk,
+					     SND_SOC_CLOCK_IN);
+		if (ret && ret != -ENOTSUPP) {
+			pr_err("Set codec_dai sysclk failed: %d\n", ret);
+			goto out;
+		}
 	}
 
 	ret = snd_soc_dai_set_sysclk(cpu_dai, substream->stream, mclk,
@@ -80,16 +371,97 @@
 static int rk_dailink_init(struct snd_soc_pcm_runtime *rtd)
 {
 	struct multicodecs_data *mc_data = snd_soc_card_get_drvdata(rtd->card);
+	struct snd_soc_card *card = rtd->card;
+	struct snd_soc_jack *jack_headset;
+	int ret, irq;
+	struct snd_soc_jack_pin *pins;
+	struct snd_soc_jack_zone *zones;
+	struct snd_soc_jack_pin jack_pins[] = {
+		{
+			.pin = "Headphone",
+			.mask = SND_JACK_HEADPHONE,
+		}, {
+			.pin = "Headset Mic",
+			.mask = SND_JACK_MICROPHONE,
+		},
+	};
+	struct snd_soc_jack_zone headset_zones[] = {
+		{
+			.min_mv = 0,
+			.max_mv = 222,
+			.jack_type = SND_JACK_HEADPHONE,
+		}, {
+			.min_mv = 223,
+			.max_mv = 1500,
+			.jack_type = SND_JACK_HEADSET,
+		}, {
+			.min_mv = 1501,
+			.max_mv = UINT_MAX,
+			.jack_type = SND_JACK_HEADPHONE,
+		}
+	};
+
+	if ((!mc_data->codec_hp_det) && (gpiod_to_irq(mc_data->hp_det_gpio) < 0)) {
+		dev_info(card->dev, "Don't need to map headset detect gpio to irq\n");
+		return 0;
+	}
+
+	jack_headset = devm_kzalloc(card->dev, sizeof(*jack_headset), GFP_KERNEL);
+	if (!jack_headset)
+		return -ENOMEM;
+
+	pins = devm_kmemdup(card->dev, jack_pins,
+			    sizeof(*jack_pins) * ARRAY_SIZE(jack_pins), GFP_KERNEL);
+	if (!pins)
+		return -ENOMEM;
+
+	zones = devm_kmemdup(card->dev, headset_zones,
+			     sizeof(*headset_zones) * ARRAY_SIZE(headset_zones), GFP_KERNEL);
+	if (!zones)
+		return -ENOMEM;
+
+	ret = snd_soc_card_jack_new(card, "Headset",
+				    SND_JACK_HEADSET,
+				    jack_headset,
+				    pins, ARRAY_SIZE(jack_pins));
+	if (ret)
+		return ret;
+	ret = snd_soc_jack_add_zones(jack_headset, ARRAY_SIZE(headset_zones), zones);
+	if (ret)
+		return ret;
+
+	mc_data->jack_headset = jack_headset;
 
 	if (mc_data->codec_hp_det) {
-		snd_soc_card_jack_new(rtd->card, "Headphones",
-				      SND_JACK_HEADPHONE,
-				      &mc_hp_jack, NULL, 0);
+		struct snd_soc_dai *codec_dai;
+		int i;
 
-#ifdef CONFIG_SND_SOC_RK3308
-		if (rk3308_codec_set_jack_detect_cb)
-			rk3308_codec_set_jack_detect_cb(rtd->codec_dai->component, &mc_hp_jack);
-#endif
+		/* set jack for the first successful one */
+		for (i = 0; i < rtd->num_codecs; i++) {
+			codec_dai = rtd->codec_dais[i];
+			ret = snd_soc_component_set_jack(codec_dai->component,
+							 jack_headset, NULL);
+			if (ret >= 0)
+				break;
+		}
+	} else {
+		irq = gpiod_to_irq(mc_data->hp_det_gpio);
+		if (irq >= 0) {
+			ret = devm_request_threaded_irq(card->dev, irq, NULL,
+							headset_det_irq_thread,
+							IRQF_TRIGGER_RISING |
+							IRQF_TRIGGER_FALLING |
+							IRQF_ONESHOT,
+							"headset_detect",
+							mc_data);
+			if (ret) {
+				dev_err(card->dev, "Failed to request headset detect irq");
+				return ret;
+			}
+
+			queue_delayed_work(system_power_efficient_wq,
+					   &mc_data->handler, msecs_to_jiffies(50));
+		}
 	}
 
 	return 0;
@@ -216,8 +588,9 @@
 	struct multicodecs_data *mc_data;
 	struct of_phandle_args args;
 	struct device_node *node;
+	struct input_dev *input;
 	u32 val;
-	int count;
+	int count, value;
 	int ret = 0, i = 0, idx = 0;
 	const char *prefix = "rockchip,";
 
@@ -244,13 +617,18 @@
 	link->stream_name = link->name;
 	link->init = rk_dailink_init;
 	link->ops = &rk_ops;
+	link->ignore_pmdown_time = 1;
 
 	card->dai_link = link;
 	card->num_links = 1;
+	card->dapm_widgets = mc_dapm_widgets;
+	card->num_dapm_widgets = ARRAY_SIZE(mc_dapm_widgets);
+	card->controls = mc_controls;
+	card->num_controls = ARRAY_SIZE(mc_controls);
 	card->num_aux_devs = 0;
 
 	count = of_count_phandle_with_args(np, "rockchip,codec", NULL);
-	if (count < 0 || count > MAX_CODECS)
+	if (count < 0)
 		return -EINVAL;
 
 	/* refine codecs, remove unavailable node */
@@ -267,6 +645,9 @@
 
 	codecs = devm_kcalloc(&pdev->dev, idx,
 			      sizeof(*codecs), GFP_KERNEL);
+	if (!codecs)
+		return -ENOMEM;
+
 	link->codecs = codecs;
 	link->num_codecs = idx;
 	idx = 0;
@@ -305,6 +686,101 @@
 	mc_data->codec_hp_det =
 		of_property_read_bool(np, "rockchip,codec-hp-det");
 
+	mc_data->adc = devm_iio_channel_get(&pdev->dev, "adc-detect");
+
+	if (IS_ERR(mc_data->adc)) {
+		if (PTR_ERR(mc_data->adc) != -EPROBE_DEFER) {
+			mc_data->adc = NULL;
+			dev_warn(&pdev->dev, "Failed to get ADC channel");
+		}
+	} else {
+		if (mc_data->adc->channel->type != IIO_VOLTAGE)
+			return -EINVAL;
+
+		if (device_property_read_u32(&pdev->dev, "keyup-threshold-microvolt",
+					&mc_data->keyup_voltage)) {
+			dev_warn(&pdev->dev, "Invalid or missing keyup voltage\n");
+			return -EINVAL;
+		}
+		mc_data->keyup_voltage /= 1000;
+
+		ret = mc_keys_load_keymap(&pdev->dev, mc_data);
+		if (ret)
+			return ret;
+
+		input = devm_input_allocate_device(&pdev->dev);
+		if (IS_ERR(input)) {
+			dev_err(&pdev->dev, "failed to allocate input device\n");
+			return PTR_ERR(input);
+		}
+
+		input_set_drvdata(input, mc_data);
+
+		input->name = "headset-keys";
+		input->phys = "headset-keys/input0";
+		input->id.bustype = BUS_HOST;
+		input->id.vendor = 0x0001;
+		input->id.product = 0x0001;
+		input->id.version = 0x0100;
+
+		__set_bit(EV_KEY, input->evbit);
+		for (i = 0; i < mc_data->num_keys; i++)
+			__set_bit(mc_data->map[i].keycode, input->keybit);
+
+		if (device_property_read_bool(&pdev->dev, "autorepeat"))
+			__set_bit(EV_REP, input->evbit);
+
+		mc_data->input = input;
+		ret = mc_keys_setup_polling(mc_data, mc_keys_poll);
+		if (ret) {
+			dev_err(&pdev->dev, "Unable to set up polling: %d\n", ret);
+			return ret;
+		}
+
+		if (!device_property_read_u32(&pdev->dev, "poll-interval", &value))
+			mc_set_poll_interval(mc_data->poller, value);
+
+		ret = input_register_device(mc_data->input);
+		if (ret) {
+			dev_err(&pdev->dev, "Unable to register input device: %d\n", ret);
+			return ret;
+		}
+	}
+
+	INIT_DEFERRABLE_WORK(&mc_data->handler, adc_jack_handler);
+
+	mc_data->spk_ctl_gpio = devm_gpiod_get_optional(&pdev->dev,
+							"spk-con",
+							GPIOD_OUT_LOW);
+	if (IS_ERR(mc_data->spk_ctl_gpio))
+		return PTR_ERR(mc_data->spk_ctl_gpio);
+
+	mc_data->hp_ctl_gpio = devm_gpiod_get_optional(&pdev->dev,
+						       "hp-con",
+						       GPIOD_OUT_LOW);
+	if (IS_ERR(mc_data->hp_ctl_gpio))
+		return PTR_ERR(mc_data->hp_ctl_gpio);
+
+	mc_data->hp_det_gpio = devm_gpiod_get_optional(&pdev->dev, "hp-det", GPIOD_IN);
+	if (IS_ERR(mc_data->hp_det_gpio))
+		return PTR_ERR(mc_data->hp_det_gpio);
+
+	mc_data->extcon = devm_extcon_dev_allocate(&pdev->dev, headset_extcon_cable);
+	if (IS_ERR(mc_data->extcon)) {
+		dev_err(&pdev->dev, "allocate extcon failed\n");
+		return PTR_ERR(mc_data->extcon);
+	}
+
+	ret = devm_extcon_dev_register(&pdev->dev, mc_data->extcon);
+	if (ret) {
+		dev_err(&pdev->dev, "failed to register extcon: %d\n", ret);
+		return ret;
+	}
+
+	ret = snd_soc_of_parse_audio_routing(card, "rockchip,audio-routing");
+	if (ret < 0)
+		dev_warn(&pdev->dev, "Audio routing invalid/unspecified\n");
+
 	snd_soc_card_set_drvdata(card, mc_data);
 
 	ret = devm_snd_soc_register_card(&pdev->dev, card);
diff --git a/kernel/sound/soc/rockchip/rockchip_pdm.c b/kernel/sound/soc/rockchip/rockchip_pdm.c
index d7f1f97..1a8ee0f 100644
--- a/kernel/sound/soc/rockchip/rockchip_pdm.c
+++ b/kernel/sound/soc/rockchip/rockchip_pdm.c
@@ -207,22 +207,35 @@
 	return snd_soc_dai_get_drvdata(dai);
 }
 
-static void rockchip_pdm_drop_fifo(struct rk_pdm_dev *pdm)
-{
-	int cnt, val, i;
-
-	/* drop the dirty data */
-	regmap_read(pdm->regmap, PDM_FIFO_CTRL, &cnt);
-	for (i = 0; i < PDM_FIFO_CNT(cnt); i++)
-		regmap_read(pdm->regmap, PDM_RXFIFO_DATA, &val);
-}
-
 static void rockchip_pdm_rxctrl(struct rk_pdm_dev *pdm, int on)
 {
+	unsigned long flags;
+
 	if (on) {
-		rockchip_pdm_drop_fifo(pdm);
+		/* The PDM device need to delete some unused data
+		 * since the pdm of various manufacturers can not
+		 * be stable quickly. This is done by commit "ASoC:
+		 * rockchip: pdm: Fix pop noise in the beginning".
+		 *
+		 * But we do not know how many data we delete, this
+		 * cause channel disorder. For example, we record
+		 * two channel 24-bit sound, then delete some starting
+		 * data. Because the deleted starting data is uncertain,
+		 * the next data may be left or right channel and cause
+		 * channel disorder.
+		 *
+		 * Luckily, we can use the PDM_RX_CLR to fix this.
+		 * Use the PDM_RX_CLR to clear fifo written data and
+		 * address, but can not clear the read data and address.
+		 * In initial state, the read data and address are zero.
+		 */
+		local_irq_save(flags);
+		regmap_update_bits(pdm->regmap, PDM_SYSCONFIG,
+				   PDM_RX_CLR_MASK,
+				   PDM_RX_CLR_WR);
 		regmap_update_bits(pdm->regmap, PDM_DMA_CTRL,
 				   PDM_DMA_RD_MSK, PDM_DMA_RD_EN);
+		local_irq_restore(flags);
 	} else {
 		regmap_update_bits(pdm->regmap, PDM_DMA_CTRL,
 				   PDM_DMA_RD_MSK, PDM_DMA_RD_DIS);
@@ -976,8 +989,10 @@
 	if (ret != 0 && ret != -ENOENT)
 		goto err_suspend;
 
-	if (of_property_read_bool(node, "rockchip,no-dmaengine"))
+	if (of_property_read_bool(node, "rockchip,no-dmaengine")) {
+		dev_info(&pdev->dev, "Used for Multi-DAI\n");
 		return 0;
+	}
 
 	ret = devm_snd_dmaengine_pcm_register(&pdev->dev, NULL, 0);
 	if (ret) {
diff --git a/kernel/sound/soc/rockchip/rockchip_sai.c b/kernel/sound/soc/rockchip/rockchip_sai.c
index fa0a8bb..c626142 100644
--- a/kernel/sound/soc/rockchip/rockchip_sai.c
+++ b/kernel/sound/soc/rockchip/rockchip_sai.c
@@ -24,6 +24,10 @@
 
 #define FW_RATIO_MAX		8
 #define FW_RATIO_MIN		1
+#define MAXBURST_PER_FIFO	8
+
+#define DEFAULT_FS		48000
+#define QUIRK_ALWAYS_ON		BIT(0)
 
 enum fpw_mode {
 	FPW_ONE_BCLK_WIDTH,
@@ -41,14 +45,28 @@
 	struct snd_dmaengine_dai_dma_data capture_dma_data;
 	struct snd_dmaengine_dai_dma_data playback_dma_data;
 	struct snd_pcm_substream *substreams[SNDRV_PCM_STREAM_LAST + 1];
+	unsigned int tx_lanes;
+	unsigned int rx_lanes;
+	unsigned int quirks;
 	enum fpw_mode fpw;
-	int fw_ratio;
+	int  fw_ratio;
 	bool has_capture;
 	bool has_playback;
 	bool is_master_mode;
+	bool is_tdm;
 };
 
-static int sai_runtime_suspend(struct device *dev)
+static const struct sai_of_quirks {
+	char *quirk;
+	int id;
+} of_quirks[] = {
+	{
+		.quirk = "rockchip,always-on",
+		.id = QUIRK_ALWAYS_ON,
+	},
+};
+
+static int rockchip_sai_runtime_suspend(struct device *dev)
 {
 	struct rk_sai_dev *sai = dev_get_drvdata(dev);
 	unsigned int val;
@@ -68,14 +86,19 @@
 
 	regcache_cache_only(sai->regmap, true);
 	clk_disable_unprepare(sai->mclk);
+	clk_disable_unprepare(sai->hclk);
 
 	return 0;
 }
 
-static int sai_runtime_resume(struct device *dev)
+static int rockchip_sai_runtime_resume(struct device *dev)
 {
 	struct rk_sai_dev *sai = dev_get_drvdata(dev);
 	int ret;
+
+	ret = clk_prepare_enable(sai->hclk);
+	if (ret)
+		goto err_hclk;
 
 	ret = clk_prepare_enable(sai->mclk);
 	if (ret)
@@ -99,6 +122,8 @@
 err_regmap:
 	clk_disable_unprepare(sai->mclk);
 err_mclk:
+	clk_disable_unprepare(sai->hclk);
+err_hclk:
 	return ret;
 }
 
@@ -359,19 +384,42 @@
 	return ret;
 }
 
+static unsigned int rockchip_sai_lanes_auto(struct snd_pcm_hw_params *params,
+					    struct snd_soc_dai *dai)
+{
+	struct rk_sai_dev *sai = snd_soc_dai_get_drvdata(dai);
+	unsigned int lanes = 1;
+
+	if (!sai->is_tdm)
+		lanes = DIV_ROUND_UP(params_channels(params), 2);
+
+	return lanes;
+}
+
 static int rockchip_sai_hw_params(struct snd_pcm_substream *substream,
 				  struct snd_pcm_hw_params *params,
 				  struct snd_soc_dai *dai)
 {
 	struct rk_sai_dev *sai = snd_soc_dai_get_drvdata(dai);
+	struct snd_dmaengine_dai_dma_data *dma_data;
 	unsigned int mclk_rate, bclk_rate, div_bclk;
 	unsigned int ch_per_lane, lanes, slot_width;
 	unsigned int val, fscr, reg;
 
-	if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
+	dma_data = snd_soc_dai_get_dma_data(dai, substream);
+	dma_data->maxburst = MAXBURST_PER_FIFO * params_channels(params) / 2;
+
+	lanes = rockchip_sai_lanes_auto(params, dai);
+
+	if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
 		reg = SAI_TXCR;
-	else
+		if (sai->tx_lanes)
+			lanes = sai->tx_lanes;
+	} else {
 		reg = SAI_RXCR;
+		if (sai->rx_lanes)
+			lanes = sai->rx_lanes;
+	}
 
 	switch (params_format(params)) {
 	case SNDRV_PCM_FORMAT_S8:
@@ -391,12 +439,13 @@
 		return -EINVAL;
 	}
 
-	regmap_update_bits(sai->regmap, reg, SAI_XCR_VDW_MASK, val);
+	val |= SAI_XCR_CSR(lanes);
+
+	regmap_update_bits(sai->regmap, reg, SAI_XCR_VDW_MASK | SAI_XCR_CSR_MASK, val);
 
 	regmap_read(sai->regmap, reg, &val);
 
 	slot_width = SAI_XCR_SBW_V(val);
-	lanes = SAI_XCR_CSR_V(val);
 	ch_per_lane = params_channels(params) / lanes;
 
 	regmap_update_bits(sai->regmap, reg, SAI_XCR_SNB_MASK,
@@ -525,6 +574,8 @@
 	regmap_update_bits(sai->regmap, SAI_RXCR, SAI_XCR_SBW_MASK,
 			   SAI_XCR_SBW(slot_width));
 	pm_runtime_put(dai->dev);
+
+	sai->is_tdm = true;
 
 	return 0;
 }
@@ -699,7 +750,7 @@
 
 		sai->playback_dma_data.addr = res->start + SAI_TXDR;
 		sai->playback_dma_data.addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES;
-		sai->playback_dma_data.maxburst = 8;
+		sai->playback_dma_data.maxburst = MAXBURST_PER_FIFO;
 	}
 
 	if (sai->has_capture) {
@@ -714,7 +765,7 @@
 
 		sai->capture_dma_data.addr = res->start + SAI_RXDR;
 		sai->capture_dma_data.addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES;
-		sai->capture_dma_data.maxburst = 8;
+		sai->capture_dma_data.maxburst = MAXBURST_PER_FIFO;
 	}
 
 	regmap_update_bits(sai->regmap, SAI_DMACR, SAI_DMACR_TDL_MASK,
@@ -728,8 +779,8 @@
 	return 0;
 }
 
-static const char * const tcsr_text[] = { "SDOx1", "SDOx2", "SDOx3", "SDOx4" };
-static const char * const rcsr_text[] = { "SDIx1", "SDIx2", "SDIx3", "SDIx4" };
+static const char * const tx_lanes_text[] = { "Auto", "SDOx1", "SDOx2", "SDOx3", "SDOx4" };
+static const char * const rx_lanes_text[] = { "Auto", "SDIx1", "SDIx2", "SDIx3", "SDIx4" };
 static const char * const edge_text[] = { "Rising Edge", "Dual Edge" };
 static const char * const edge_shift_text[] = { "Normal", "Shift 1 Edge" };
 
@@ -771,7 +822,8 @@
 
 /* TXCR */
 static SOC_ENUM_SINGLE_DECL(tsft_enum, SAI_TXCR, 22, edge_shift_text);
-static SOC_ENUM_SINGLE_DECL(tcsr_enum, SAI_TXCR, 20, tcsr_text);
+static const struct soc_enum tx_lanes_enum =
+	SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(tx_lanes_text), tx_lanes_text);
 static SOC_ENUM_SINGLE_DECL(tsjm_enum, SAI_TXCR, 19, sjm_text);
 static SOC_ENUM_SINGLE_DECL(tfbm_enum, SAI_TXCR, 18, fbm_text);
 static SOC_ENUM_SINGLE_DECL(tvdj_enum, SAI_TXCR, 10, vdj_text);
@@ -786,7 +838,8 @@
 
 /* RXCR */
 static SOC_ENUM_SINGLE_DECL(rsft_enum, SAI_RXCR, 22, edge_shift_text);
-static SOC_ENUM_SINGLE_DECL(rcsr_enum, SAI_RXCR, 20, rcsr_text);
+static const struct soc_enum rx_lanes_enum =
+	SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(rx_lanes_text), rx_lanes_text);
 static SOC_ENUM_SINGLE_DECL(rsjm_enum, SAI_RXCR, 19, sjm_text);
 static SOC_ENUM_SINGLE_DECL(rfbm_enum, SAI_RXCR, 18, fbm_text);
 static SOC_ENUM_SINGLE_DECL(rvdj_enum, SAI_RXCR, 10, vdj_text);
@@ -874,19 +927,75 @@
 	return 1;
 }
 
+static int rockchip_sai_tx_lanes_get(struct snd_kcontrol *kcontrol,
+				     struct snd_ctl_elem_value *ucontrol)
+{
+	struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol);
+	struct rk_sai_dev *sai = snd_soc_component_get_drvdata(component);
+
+	ucontrol->value.enumerated.item[0] = sai->tx_lanes;
+
+	return 0;
+}
+
+static int rockchip_sai_tx_lanes_put(struct snd_kcontrol *kcontrol,
+				     struct snd_ctl_elem_value *ucontrol)
+{
+	struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol);
+	struct rk_sai_dev *sai = snd_soc_component_get_drvdata(component);
+	int num;
+
+	num = ucontrol->value.enumerated.item[0];
+	if (num >= ARRAY_SIZE(tx_lanes_text))
+		return -EINVAL;
+
+	sai->tx_lanes = num;
+
+	return 1;
+}
+
+static int rockchip_sai_rx_lanes_get(struct snd_kcontrol *kcontrol,
+				     struct snd_ctl_elem_value *ucontrol)
+{
+	struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol);
+	struct rk_sai_dev *sai = snd_soc_component_get_drvdata(component);
+
+	ucontrol->value.enumerated.item[0] = sai->rx_lanes;
+
+	return 0;
+}
+
+static int rockchip_sai_rx_lanes_put(struct snd_kcontrol *kcontrol,
+				     struct snd_ctl_elem_value *ucontrol)
+{
+	struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol);
+	struct rk_sai_dev *sai = snd_soc_component_get_drvdata(component);
+	int num;
+
+	num = ucontrol->value.enumerated.item[0];
+	if (num >= ARRAY_SIZE(rx_lanes_text))
+		return -EINVAL;
+
+	sai->rx_lanes = num;
+
+	return 1;
+}
+
 static DECLARE_TLV_DB_SCALE(fs_shift_tlv, 0, 8192, 0);
 
 static const struct snd_kcontrol_new rockchip_sai_controls[] = {
 
 	SOC_ENUM("Transmit Edge Shift", tsft_enum),
-	SOC_ENUM("Transmit SDOx Select", tcsr_enum),
+	SOC_ENUM_EXT("Transmit SDOx Select", tx_lanes_enum,
+		     rockchip_sai_tx_lanes_get, rockchip_sai_tx_lanes_put),
 	SOC_ENUM("Transmit Store Justified Mode", tsjm_enum),
 	SOC_ENUM("Transmit First Bit Mode", tfbm_enum),
 	SOC_ENUM("Transmit Valid Data Justified", tvdj_enum),
 	SOC_ENUM("Transmit Slot Bit Width", tsbw_enum),
 
 	SOC_ENUM("Receive Edge Shift", rsft_enum),
-	SOC_ENUM("Receive SDIx Select", rcsr_enum),
+	SOC_ENUM_EXT("Receive SDIx Select", rx_lanes_enum,
+		     rockchip_sai_rx_lanes_get, rockchip_sai_rx_lanes_put),
 	SOC_ENUM("Receive Store Justified Mode", rsjm_enum),
 	SOC_ENUM("Receive First Bit Mode", rfbm_enum),
 	SOC_ENUM("Receive Valid Data Justified", rvdj_enum),
@@ -966,6 +1075,50 @@
 	return IRQ_HANDLED;
 }
 
+static int rockchip_sai_keep_clk_always_on(struct rk_sai_dev *sai)
+{
+	unsigned int mclk_rate, bclk_rate, div_bclk;
+
+	sai->is_master_mode = true;
+
+	/* init I2S fmt default */
+	rockchip_sai_fmt_create(sai, SND_SOC_DAIFMT_I2S);
+
+	regmap_update_bits(sai->regmap, SAI_FSCR,
+			   SAI_FSCR_FW_MASK |
+			   SAI_FSCR_FPW_MASK,
+			   SAI_FSCR_FW(64) |
+			   SAI_FSCR_FPW(32));
+
+	mclk_rate = clk_get_rate(sai->mclk);
+	bclk_rate = DEFAULT_FS * 64;
+	div_bclk = DIV_ROUND_CLOSEST(mclk_rate, bclk_rate);
+
+	regmap_update_bits(sai->regmap, SAI_CKR, SAI_CKR_MDIV_MASK,
+			   SAI_CKR_MDIV(div_bclk));
+
+	pm_runtime_forbid(sai->dev);
+
+	dev_info(sai->dev, "CLK-ALWAYS-ON: mclk: %d, bclk: %d, fsync: %d\n",
+		 mclk_rate, bclk_rate, DEFAULT_FS);
+
+	return 0;
+}
+
+static int rockchip_sai_parse_quirks(struct rk_sai_dev *sai)
+{
+	int ret = 0, i = 0;
+
+	for (i = 0; i < ARRAY_SIZE(of_quirks); i++)
+		if (of_property_read_bool(sai->dev->of_node, of_quirks[i].quirk))
+			sai->quirks |= of_quirks[i].id;
+
+	if (sai->quirks & QUIRK_ALWAYS_ON)
+		ret = rockchip_sai_keep_clk_always_on(sai);
+
+	return ret;
+}
+
 static int rockchip_sai_probe(struct platform_device *pdev)
 {
 	struct device_node *node = pdev->dev.of_node;
@@ -1022,13 +1175,13 @@
 		return PTR_ERR(sai->hclk);
 	}
 
-	ret = clk_prepare_enable(sai->hclk);
+	ret = rockchip_sai_parse_quirks(sai);
 	if (ret)
 		return ret;
 
 	pm_runtime_enable(&pdev->dev);
 	if (!pm_runtime_enabled(&pdev->dev)) {
-		ret = sai_runtime_resume(&pdev->dev);
+		ret = rockchip_sai_runtime_resume(&pdev->dev);
 		if (ret)
 			goto err_runtime_disable;
 	}
@@ -1051,29 +1204,52 @@
 
 err_runtime_suspend:
 	if (!pm_runtime_status_suspended(&pdev->dev))
-		sai_runtime_suspend(&pdev->dev);
+		rockchip_sai_runtime_suspend(&pdev->dev);
 err_runtime_disable:
 	pm_runtime_disable(&pdev->dev);
-	clk_disable_unprepare(sai->hclk);
 
 	return ret;
 }
 
 static int rockchip_sai_remove(struct platform_device *pdev)
 {
-	struct rk_sai_dev *sai = dev_get_drvdata(&pdev->dev);
-
 	pm_runtime_disable(&pdev->dev);
 	if (!pm_runtime_status_suspended(&pdev->dev))
-		sai_runtime_suspend(&pdev->dev);
-
-	clk_disable_unprepare(sai->hclk);
+		rockchip_sai_runtime_suspend(&pdev->dev);
 
 	return 0;
 }
 
+#ifdef CONFIG_PM_SLEEP
+static int rockchip_sai_suspend(struct device *dev)
+{
+	struct rk_sai_dev *sai = dev_get_drvdata(dev);
+
+	regcache_mark_dirty(sai->regmap);
+
+	return 0;
+}
+
+static int rockchip_sai_resume(struct device *dev)
+{
+	struct rk_sai_dev *sai = dev_get_drvdata(dev);
+	int ret = pm_runtime_get_sync(dev);
+
+	if (ret < 0) {
+		pm_runtime_put_noidle(dev);
+		return ret;
+	}
+
+	ret = regcache_sync(sai->regmap);
+	pm_runtime_put(dev);
+
+	return ret;
+}
+#endif /* CONFIG_PM_SLEEP */
+
 static const struct dev_pm_ops rockchip_sai_pm_ops = {
-	SET_RUNTIME_PM_OPS(sai_runtime_suspend, sai_runtime_resume, NULL)
+	SET_RUNTIME_PM_OPS(rockchip_sai_runtime_suspend, rockchip_sai_runtime_resume, NULL)
+	SET_SYSTEM_SLEEP_PM_OPS(rockchip_sai_suspend, rockchip_sai_resume)
 };
 
 static struct platform_driver rockchip_sai_driver = {
diff --git a/kernel/sound/soc/rockchip/rockchip_spdif.c b/kernel/sound/soc/rockchip/rockchip_spdif.c
index e8b6a2e..80a2df2 100644
--- a/kernel/sound/soc/rockchip/rockchip_spdif.c
+++ b/kernel/sound/soc/rockchip/rockchip_spdif.c
@@ -20,6 +20,7 @@
 #include <linux/mfd/syscon.h>
 #include <linux/regmap.h>
 #include <sound/pcm_params.h>
+#include <sound/pcm_iec958.h>
 #include <sound/dmaengine_pcm.h>
 
 #include "rockchip_spdif.h"
@@ -31,7 +32,25 @@
 	RK_SPDIF_RK3366,
 };
 
-#define RK3288_GRF_SOC_CON2 0x24c
+/*
+ *      |  7  |  6  |  5  |  4  |  3  |  2  |  1  |  0  |
+ * CS0: |   Mode    |        d        |  c  |  b  |  a  |
+ * CS1: |               Category Code                   |
+ * CS2: |    Channel Number     |     Source Number     |
+ * CS3: |    Clock Accuracy     |     Sample Freq       |
+ * CS4: |    Ori Sample Freq    |     Word Length       |
+ * CS5: |                                   |   CGMS-A  |
+ * CS6~CS23: Reserved
+ *
+ * a: use of channel status block
+ * b: linear PCM identification: 0 for lpcm, 1 for nlpcm
+ * c: copyright information
+ * d: additional format information
+ */
+#define CS_BYTE			6
+#define CS_FRAME(c)		((c) << 16 | (c))
+
+#define RK3288_GRF_SOC_CON2	0x24c
 
 struct rk_spdif_dev {
 	struct device *dev;
@@ -114,7 +133,19 @@
 	struct rk_spdif_dev *spdif = snd_soc_dai_get_drvdata(dai);
 	unsigned int val = SPDIF_CFGR_HALFWORD_ENABLE;
 	int srate, mclk;
-	int ret;
+	int ret, i;
+	u8 cs[CS_BYTE];
+	u16 *fc = (u16 *)cs;
+
+	ret = snd_pcm_create_iec958_consumer_hw_params(params, cs, sizeof(cs));
+	if (ret < 0)
+		return ret;
+
+	for (i = 0; i < CS_BYTE / 2; i++)
+		regmap_write(spdif->regmap, SPDIF_CHNSRn(i), CS_FRAME(fc[i]));
+
+	regmap_update_bits(spdif->regmap, SPDIF_CFGR, SPDIF_CFGR_CSE_MASK,
+			   SPDIF_CFGR_CSE_EN);
 
 	srate = params_rate(params);
 	mclk = srate * 128;
@@ -128,6 +159,11 @@
 		break;
 	case SNDRV_PCM_FORMAT_S24_LE:
 		val |= SPDIF_CFGR_VDW_24;
+		val |= SPDIF_CFGR_ADJ_RIGHT_J;
+		break;
+	case SNDRV_PCM_FORMAT_S32_LE:
+		val |= SPDIF_CFGR_VDW_24;
+		val |= SPDIF_CFGR_ADJ_LEFT_J;
 		break;
 	default:
 		return -EINVAL;
@@ -141,10 +177,14 @@
 		return ret;
 	}
 
+	regmap_update_bits(spdif->regmap, SPDIF_CFGR, SPDIF_CFGR_CLR_MASK,
+			   SPDIF_CFGR_CLR_EN);
+	udelay(1);
 	ret = regmap_update_bits(spdif->regmap, SPDIF_CFGR,
 				 SPDIF_CFGR_CLK_DIV_MASK |
 				 SPDIF_CFGR_HALFWORD_ENABLE |
-				 SDPIF_CFGR_VDW_MASK, val);
+				 SDPIF_CFGR_VDW_MASK |
+				 SPDIF_CFGR_ADJ_MASK, val);
 
 	return ret;
 }
@@ -214,14 +254,11 @@
 		.stream_name = "Playback",
 		.channels_min = 2,
 		.channels_max = 2,
-		.rates = (SNDRV_PCM_RATE_32000 |
-			  SNDRV_PCM_RATE_44100 |
-			  SNDRV_PCM_RATE_48000 |
-			  SNDRV_PCM_RATE_96000 |
-			  SNDRV_PCM_RATE_192000),
+		.rates = SNDRV_PCM_RATE_8000_192000,
 		.formats = (SNDRV_PCM_FMTBIT_S16_LE |
 			    SNDRV_PCM_FMTBIT_S20_3LE |
-			    SNDRV_PCM_FMTBIT_S24_LE),
+			    SNDRV_PCM_FMTBIT_S24_LE |
+			    SNDRV_PCM_FMTBIT_S32_LE),
 	},
 	.ops = &rk_spdif_dai_ops,
 };
@@ -238,6 +275,9 @@
 	case SPDIF_INTCR:
 	case SPDIF_XFER:
 	case SPDIF_SMPDR:
+	case SPDIF_VLDFRn(0) ... SPDIF_VLDFRn(11):
+	case SPDIF_USRDRn(0) ... SPDIF_USRDRn(11):
+	case SPDIF_CHNSRn(0) ... SPDIF_CHNSRn(11):
 		return true;
 	default:
 		return false;
@@ -253,6 +293,9 @@
 	case SPDIF_INTSR:
 	case SPDIF_XFER:
 	case SPDIF_SMPDR:
+	case SPDIF_VLDFRn(0) ... SPDIF_VLDFRn(11):
+	case SPDIF_USRDRn(0) ... SPDIF_USRDRn(11):
+	case SPDIF_CHNSRn(0) ... SPDIF_CHNSRn(11):
 		return true;
 	default:
 		return false;
@@ -275,7 +318,7 @@
 	.reg_bits = 32,
 	.reg_stride = 4,
 	.val_bits = 32,
-	.max_register = SPDIF_SMPDR,
+	.max_register = SPDIF_VERSION,
 	.writeable_reg = rk_spdif_wr_reg,
 	.readable_reg = rk_spdif_rd_reg,
 	.volatile_reg = rk_spdif_volatile_reg,
diff --git a/kernel/sound/soc/rockchip/rockchip_spdif.h b/kernel/sound/soc/rockchip/rockchip_spdif.h
index 3ef1277..18dca7e 100644
--- a/kernel/sound/soc/rockchip/rockchip_spdif.h
+++ b/kernel/sound/soc/rockchip/rockchip_spdif.h
@@ -20,6 +20,18 @@
 #define SPDIF_CFGR_CLK_DIV_MASK		(0xff << SPDIF_CFGR_CLK_DIV_SHIFT)
 #define SPDIF_CFGR_CLK_DIV(x)		(x << SPDIF_CFGR_CLK_DIV_SHIFT)
 
+#define SPDIF_CFGR_CLR_MASK		BIT(7)
+#define SPDIF_CFGR_CLR_EN		BIT(7)
+#define SPDIF_CFGR_CLR_DIS		0
+
+#define SPDIF_CFGR_CSE_MASK		BIT(6)
+#define SPDIF_CFGR_CSE_EN		BIT(6)
+#define SPDIF_CFGR_CSE_DIS		0
+
+#define SPDIF_CFGR_ADJ_MASK		BIT(3)
+#define SPDIF_CFGR_ADJ_LEFT_J		BIT(3)
+#define SPDIF_CFGR_ADJ_RIGHT_J		0
+
 #define SPDIF_CFGR_HALFWORD_SHIFT	2
 #define SPDIF_CFGR_HALFWORD_DISABLE	(0 << SPDIF_CFGR_HALFWORD_SHIFT)
 #define SPDIF_CFGR_HALFWORD_ENABLE	(1 << SPDIF_CFGR_HALFWORD_SHIFT)
@@ -59,5 +71,9 @@
 #define SPDIF_INTSR	(0x0010)
 #define SPDIF_XFER	(0x0018)
 #define SPDIF_SMPDR	(0x0020)
+#define SPDIF_VLDFRn(x)	(0x0060 + (x) * 4)
+#define SPDIF_USRDRn(x)	(0x0090 + (x) * 4)
+#define SPDIF_CHNSRn(x)	(0x00c0 + (x) * 4)
+#define SPDIF_VERSION	(0x01c0)
 
 #endif /* _ROCKCHIP_SPDIF_H */
diff --git a/kernel/tools/lib/traceevent/Makefile b/kernel/tools/lib/traceevent/Makefile
index 05f8a0f..b7f7e4e 100644
--- a/kernel/tools/lib/traceevent/Makefile
+++ b/kernel/tools/lib/traceevent/Makefile
@@ -263,7 +263,7 @@
 	xargs echo "U w W" | tr 'w ' 'W\n' | sort -u | xargs echo`;\
 	if [ "$$symbol_type" = "U W" ];then				\
 		(echo '{';						\
-		$(NM) -u -D $1 | awk 'NF>1 {print "\t"$$2";"}' | sort -u;\
+		$(NM) -u -D $1 | awk 'NF>1 {sub("@.*", "", $$2); print "\t"$$2";"}' | sort -u;\
 		echo '};';						\
 		) > $2;							\
 	else								\
diff --git a/kernel/tools/perf/bench/bench.h b/kernel/tools/perf/bench/bench.h
index 6c9fcd7..b3e418a 100644
--- a/kernel/tools/perf/bench/bench.h
+++ b/kernel/tools/perf/bench/bench.h
@@ -2,6 +2,10 @@
 #ifndef BENCH_H
 #define BENCH_H
 
+#include <sys/time.h>
+
+extern struct timeval bench__start, bench__end, bench__runtime;
+
 /*
  * The madvise transparent hugepage constants were added in glibc
  * 2.13. For compatibility with older versions of glibc, define these
diff --git a/kernel/tools/perf/bench/futex-hash.c b/kernel/tools/perf/bench/futex-hash.c
index 9aa3a67..ee9b280 100644
--- a/kernel/tools/perf/bench/futex-hash.c
+++ b/kernel/tools/perf/bench/futex-hash.c
@@ -35,7 +35,7 @@
 static bool fshared = false, done = false, silent = false;
 static int futex_flag = 0;
 
-struct timeval start, end, runtime;
+struct timeval bench__start, bench__end, bench__runtime;
 static pthread_mutex_t thread_lock;
 static unsigned int threads_starting;
 static struct stats throughput_stats;
@@ -101,8 +101,8 @@
 {
 	/* inform all threads that we're done for the day */
 	done = true;
-	gettimeofday(&end, NULL);
-	timersub(&end, &start, &runtime);
+	gettimeofday(&bench__end, NULL);
+	timersub(&bench__end, &bench__start, &bench__runtime);
 }
 
 static void print_summary(void)
@@ -112,7 +112,7 @@
 
 	printf("%sAveraged %ld operations/sec (+- %.2f%%), total secs = %d\n",
 	       !silent ? "\n" : "", avg, rel_stddev_stats(stddev, avg),
-	       (int) runtime.tv_sec);
+	       (int)bench__runtime.tv_sec);
 }
 
 int bench_futex_hash(int argc, const char **argv)
@@ -159,7 +159,7 @@
 
 	threads_starting = nthreads;
 	pthread_attr_init(&thread_attr);
-	gettimeofday(&start, NULL);
+	gettimeofday(&bench__start, NULL);
 	for (i = 0; i < nthreads; i++) {
 		worker[i].tid = i;
 		worker[i].futex = calloc(nfutexes, sizeof(*worker[i].futex));
@@ -202,7 +202,7 @@
 	pthread_mutex_destroy(&thread_lock);
 
 	for (i = 0; i < nthreads; i++) {
-		unsigned long t = worker[i].ops/runtime.tv_sec;
+		unsigned long t = worker[i].ops / bench__runtime.tv_sec;
 		update_stats(&throughput_stats, t);
 		if (!silent) {
 			if (nfutexes == 1)
diff --git a/kernel/tools/perf/bench/futex-lock-pi.c b/kernel/tools/perf/bench/futex-lock-pi.c
index 8e9c475..017609a 100644
--- a/kernel/tools/perf/bench/futex-lock-pi.c
+++ b/kernel/tools/perf/bench/futex-lock-pi.c
@@ -35,7 +35,6 @@
 static bool done = false, fshared = false;
 static unsigned int nthreads = 0;
 static int futex_flag = 0;
-struct timeval start, end, runtime;
 static pthread_mutex_t thread_lock;
 static unsigned int threads_starting;
 static struct stats throughput_stats;
@@ -62,7 +61,7 @@
 
 	printf("%sAveraged %ld operations/sec (+- %.2f%%), total secs = %d\n",
 	       !silent ? "\n" : "", avg, rel_stddev_stats(stddev, avg),
-	       (int) runtime.tv_sec);
+	       (int)bench__runtime.tv_sec);
 }
 
 static void toggle_done(int sig __maybe_unused,
@@ -71,8 +70,8 @@
 {
 	/* inform all threads that we're done for the day */
 	done = true;
-	gettimeofday(&end, NULL);
-	timersub(&end, &start, &runtime);
+	gettimeofday(&bench__end, NULL);
+	timersub(&bench__end, &bench__start, &bench__runtime);
 }
 
 static void *workerfn(void *arg)
@@ -183,7 +182,7 @@
 
 	threads_starting = nthreads;
 	pthread_attr_init(&thread_attr);
-	gettimeofday(&start, NULL);
+	gettimeofday(&bench__start, NULL);
 
 	create_threads(worker, thread_attr, cpu);
 	pthread_attr_destroy(&thread_attr);
@@ -209,7 +208,7 @@
 	pthread_mutex_destroy(&thread_lock);
 
 	for (i = 0; i < nthreads; i++) {
-		unsigned long t = worker[i].ops/runtime.tv_sec;
+		unsigned long t = worker[i].ops / bench__runtime.tv_sec;
 
 		update_stats(&throughput_stats, t);
 		if (!silent)
diff --git a/kernel/tools/perf/bench/sched-messaging.c b/kernel/tools/perf/bench/sched-messaging.c
index f9d7641..a5d30b2 100644
--- a/kernel/tools/perf/bench/sched-messaging.c
+++ b/kernel/tools/perf/bench/sched-messaging.c
@@ -69,11 +69,10 @@
 /* Block until we're ready to go */
 static void ready(int ready_out, int wakefd)
 {
-	char dummy;
 	struct pollfd pollfd = { .fd = wakefd, .events = POLLIN };
 
 	/* Tell them we're ready. */
-	if (write(ready_out, &dummy, 1) != 1)
+	if (write(ready_out, "R", 1) != 1)
 		err(EXIT_FAILURE, "CLIENT: ready write");
 
 	/* Wait for "GO" signal */
@@ -88,6 +87,7 @@
 	unsigned int i, j;
 
 	ready(ctx->ready_out, ctx->wakefd);
+	memset(data, 'S', sizeof(data));
 
 	/* Now pump to every receiver. */
 	for (i = 0; i < nr_loops; i++) {
diff --git a/kernel/tools/perf/tests/bp_account.c b/kernel/tools/perf/tests/bp_account.c
index a20cbc4..624e4ef 100644
--- a/kernel/tools/perf/tests/bp_account.c
+++ b/kernel/tools/perf/tests/bp_account.c
@@ -22,7 +22,7 @@
 #include "perf.h"
 #include "cloexec.h"
 
-volatile long the_var;
+static volatile long the_var;
 
 static noinline int test_function(void)
 {
diff --git a/kernel/tools/perf/util/parse-events.c b/kernel/tools/perf/util/parse-events.c
index 0eff0c3..601f51a 100644
--- a/kernel/tools/perf/util/parse-events.c
+++ b/kernel/tools/perf/util/parse-events.c
@@ -223,21 +223,15 @@
 				path = zalloc(sizeof(*path));
 				if (!path)
 					return NULL;
-				path->system = malloc(MAX_EVENT_LENGTH);
-				if (!path->system) {
+				if (asprintf(&path->system, "%.*s", MAX_EVENT_LENGTH, sys_dirent->d_name) < 0) {
 					free(path);
 					return NULL;
 				}
-				path->name = malloc(MAX_EVENT_LENGTH);
-				if (!path->name) {
+				if (asprintf(&path->name, "%.*s", MAX_EVENT_LENGTH, evt_dirent->d_name) < 0) {
 					zfree(&path->system);
 					free(path);
 					return NULL;
 				}
-				strncpy(path->system, sys_dirent->d_name,
-					MAX_EVENT_LENGTH);
-				strncpy(path->name, evt_dirent->d_name,
-					MAX_EVENT_LENGTH);
 				return path;
 			}
 		}
@@ -1312,7 +1306,6 @@
 int parse_events_multi_pmu_add(struct parse_events_state *parse_state,
 			       char *str, struct list_head **listp)
 {
-	struct list_head *head;
 	struct parse_events_term *term;
 	struct list_head *list;
 	struct perf_pmu *pmu = NULL;
@@ -1329,19 +1322,30 @@
 
 		list_for_each_entry(alias, &pmu->aliases, list) {
 			if (!strcasecmp(alias->name, str)) {
+				struct list_head *head;
+				char *config;
+
 				head = malloc(sizeof(struct list_head));
 				if (!head)
 					return -1;
 				INIT_LIST_HEAD(head);
-				if (parse_events_term__num(&term, PARSE_EVENTS__TERM_TYPE_USER,
-							   str, 1, false, &str, NULL) < 0)
+				config = strdup(str);
+				if (!config)
 					return -1;
+				if (parse_events_term__num(&term,
+						   PARSE_EVENTS__TERM_TYPE_USER,
+						   config, 1, false, &config,
+						   NULL) < 0) {
+					free(list);
+					free(config);
+					return -1;
+				}
 				list_add_tail(&term->list, head);
 
 				if (!parse_events_add_pmu(parse_state, list,
 							  pmu->name, head,
 							  true, true)) {
-					pr_debug("%s -> %s/%s/\n", str,
+					pr_debug("%s -> %s/%s/\n", config,
 						 pmu->name, alias->str);
 					ok++;
 				}
@@ -1350,8 +1354,10 @@
 			}
 		}
 	}
-	if (!ok)
+	if (!ok) {
+		free(list);
 		return -1;
+	}
 	*listp = list;
 	return 0;
 }
@@ -2625,30 +2631,51 @@
 			      char *config, unsigned idx)
 {
 	struct event_symbol *sym;
+	char *str;
 	struct parse_events_term temp = {
 		.type_val  = PARSE_EVENTS__TERM_TYPE_STR,
 		.type_term = PARSE_EVENTS__TERM_TYPE_USER,
-		.config    = config ?: (char *) "event",
+		.config    = config,
 	};
 
+	if (!temp.config) {
+		temp.config = strdup("event");
+		if (!temp.config)
+			return -ENOMEM;
+	}
 	BUG_ON(idx >= PERF_COUNT_HW_MAX);
 	sym = &event_symbols_hw[idx];
 
-	return new_term(term, &temp, (char *) sym->symbol, 0);
+	str = strdup(sym->symbol);
+	if (!str)
+		return -ENOMEM;
+	return new_term(term, &temp, str, 0);
 }
 
 int parse_events_term__clone(struct parse_events_term **new,
 			     struct parse_events_term *term)
 {
+	char *str;
 	struct parse_events_term temp = {
 		.type_val  = term->type_val,
 		.type_term = term->type_term,
-		.config    = term->config,
+		.config    = NULL,
 		.err_term  = term->err_term,
 		.err_val   = term->err_val,
 	};
 
-	return new_term(new, &temp, term->val.str, term->val.num);
+	if (term->config) {
+		temp.config = strdup(term->config);
+		if (!temp.config)
+			return -ENOMEM;
+	}
+	if (term->type_val == PARSE_EVENTS__TERM_TYPE_NUM)
+		return new_term(new, &temp, NULL, term->val.num);
+
+	str = strdup(term->val.str);
+	if (!str)
+		return -ENOMEM;
+	return new_term(new, &temp, str, 0);
 }
 
 int parse_events_copy_term_list(struct list_head *old,
diff --git a/kernel/tools/perf/util/parse-events.y b/kernel/tools/perf/util/parse-events.y
index 8d7578b..12ca88b 100644
--- a/kernel/tools/perf/util/parse-events.y
+++ b/kernel/tools/perf/util/parse-events.y
@@ -636,9 +636,11 @@
 PE_DRV_CFG_TERM
 {
 	struct parse_events_term *term;
+	char *config = strdup($1);
 
+	ABORT_ON(!config);
 	ABORT_ON(parse_events_term__str(&term, PARSE_EVENTS__TERM_TYPE_DRV_CFG,
-					$1, $1, &@1, NULL));
+					config, $1, &@1, NULL));
 	$$ = term;
 }
 
diff --git a/kernel/virt/kvm/arm/arch_timer.c b/kernel/virt/kvm/arm/arch_timer.c
index 17cecc9..217d39f 100644
--- a/kernel/virt/kvm/arm/arch_timer.c
+++ b/kernel/virt/kvm/arm/arch_timer.c
@@ -67,7 +67,7 @@
 static void soft_timer_start(struct hrtimer *hrt, u64 ns)
 {
 	hrtimer_start(hrt, ktime_add_ns(ktime_get(), ns),
-		      HRTIMER_MODE_ABS);
+		      HRTIMER_MODE_ABS_HARD);
 }
 
 static void soft_timer_cancel(struct hrtimer *hrt, struct work_struct *work)
@@ -638,10 +638,10 @@
 	vcpu_ptimer(vcpu)->cntvoff = 0;
 
 	INIT_WORK(&timer->expired, kvm_timer_inject_irq_work);
-	hrtimer_init(&timer->bg_timer, CLOCK_MONOTONIC, HRTIMER_MODE_ABS);
+	hrtimer_init(&timer->bg_timer, CLOCK_MONOTONIC, HRTIMER_MODE_ABS_HARD);
 	timer->bg_timer.function = kvm_bg_timer_expire;
 
-	hrtimer_init(&timer->phys_timer, CLOCK_MONOTONIC, HRTIMER_MODE_ABS);
+	hrtimer_init(&timer->phys_timer, CLOCK_MONOTONIC, HRTIMER_MODE_ABS_HARD);
 	timer->phys_timer.function = kvm_phys_timer_expire;
 
 	vtimer->irq.irq = default_vtimer_irq.irq;
diff --git a/kernel/virt/kvm/arm/arm.c b/kernel/virt/kvm/arm/arm.c
index b943ec5..ddc6db1 100644
--- a/kernel/virt/kvm/arm/arm.c
+++ b/kernel/virt/kvm/arm/arm.c
@@ -725,7 +725,7 @@
 		 * involves poking the GIC, which must be done in a
 		 * non-preemptible context.
 		 */
-		preempt_disable();
+		migrate_disable();
 
 		kvm_pmu_flush_hwstate(vcpu);
 
@@ -774,7 +774,7 @@
 				kvm_timer_sync_hwstate(vcpu);
 			kvm_vgic_sync_hwstate(vcpu);
 			local_irq_enable();
-			preempt_enable();
+			migrate_enable();
 			continue;
 		}
 
@@ -852,7 +852,7 @@
 		/* Exit types that need handling before we can be preempted */
 		handle_exit_early(vcpu, run, ret);
 
-		preempt_enable();
+		migrate_enable();
 
 		ret = handle_exit(vcpu, run, ret);
 	}

--
Gitblit v1.6.2