aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorXueqin Wang <xueqin.wang@mediatek.com>2015-11-17 17:33:07 +0800
committerMister Oyster <oysterized@gmail.com>2017-01-23 13:27:10 +0100
commitedc26f7b1641f1947a6a7984bb022b0462b629ae (patch)
treeca1e8daa4c2843c05ada64d453e51433dfeb60d6
parent138a44c1fe96138844b4826c2edca6c30ccbc9ec (diff)
downloadandroid_kernel_m2note-edc26f7b1641f1947a6a7984bb022b0462b629ae.tar.gz
remove FM code because FM is not used
BUG=23460645 [Feature] FM radio Change-Id: Ie5279ade9858007fe4e93f9d9a99346fae859f52 Signed-off-by: Xueqin Wang <xueqin.wang@mediatek.com> CR-Id: ALPS02370452
-rw-r--r--arch/arm64/configs/cm12_m2note_defconfig3
-rw-r--r--arch/arm64/configs/cm13_m2note_defconfig3
-rw-r--r--arch/arm64/configs/los13_m2note_defconfig3
-rw-r--r--arch/arm64/configs/los14_m2note_defconfig3
-rw-r--r--arch/arm64/configs/m2note_defconfig3
-rw-r--r--arch/arm64/configs/m2note_recovery_defconfig3
-rw-r--r--drivers/misc/mediatek/Kconfig1
-rw-r--r--drivers/misc/mediatek/Makefile1
-rw-r--r--drivers/misc/mediatek/fmradio/Kconfig5
-rwxr-xr-xdrivers/misc/mediatek/fmradio/Makefile228
-rw-r--r--drivers/misc/mediatek/fmradio/core/fm_config.c606
-rw-r--r--drivers/misc/mediatek/fmradio/core/fm_eint.c56
-rw-r--r--drivers/misc/mediatek/fmradio/core/fm_link.c601
-rw-r--r--drivers/misc/mediatek/fmradio/core/fm_main.c3272
-rw-r--r--drivers/misc/mediatek/fmradio/core/fm_module.c1633
-rw-r--r--drivers/misc/mediatek/fmradio/core/fm_patch.c146
-rw-r--r--drivers/misc/mediatek/fmradio/core/fm_rds_parser.c2022
-rw-r--r--drivers/misc/mediatek/fmradio/core/fm_utils.c689
-rw-r--r--drivers/misc/mediatek/fmradio/dummy.c3
-rw-r--r--drivers/misc/mediatek/fmradio/inc/fm_config.h217
-rw-r--r--drivers/misc/mediatek/fmradio/inc/fm_dbg.h185
-rw-r--r--drivers/misc/mediatek/fmradio/inc/fm_eint.h17
-rw-r--r--drivers/misc/mediatek/fmradio/inc/fm_err.h30
-rw-r--r--drivers/misc/mediatek/fmradio/inc/fm_interface.h291
-rw-r--r--drivers/misc/mediatek/fmradio/inc/fm_ioctl.h94
-rw-r--r--drivers/misc/mediatek/fmradio/inc/fm_link.h227
-rw-r--r--drivers/misc/mediatek/fmradio/inc/fm_main.h400
-rw-r--r--drivers/misc/mediatek/fmradio/inc/fm_patch.h28
-rw-r--r--drivers/misc/mediatek/fmradio/inc/fm_priv_log.h101
-rw-r--r--drivers/misc/mediatek/fmradio/inc/fm_private.h93
-rw-r--r--drivers/misc/mediatek/fmradio/inc/fm_rds.h221
-rw-r--r--drivers/misc/mediatek/fmradio/inc/fm_stdlib.h61
-rw-r--r--drivers/misc/mediatek/fmradio/inc/fm_typedef.h35
-rw-r--r--drivers/misc/mediatek/fmradio/inc/fm_utils.h311
-rw-r--r--drivers/misc/mediatek/fmradio/mt6616/inc/fm_cust_cfg.h62
-rw-r--r--drivers/misc/mediatek/fmradio/mt6616/inc/mt6616_drv_dsp.h972
-rw-r--r--drivers/misc/mediatek/fmradio/mt6616/inc/mt6616_fm.h80
-rw-r--r--drivers/misc/mediatek/fmradio/mt6616/inc/mt6616_fm_cmd.h46
-rw-r--r--drivers/misc/mediatek/fmradio/mt6616/inc/mt6616_fm_lib.h61
-rw-r--r--drivers/misc/mediatek/fmradio/mt6616/inc/mt6616_fm_link.h74
-rw-r--r--drivers/misc/mediatek/fmradio/mt6616/inc/mt6616_fm_reg.h83
-rw-r--r--drivers/misc/mediatek/fmradio/mt6616/piv/mt6616_fm_priv.c0
-rw-r--r--drivers/misc/mediatek/fmradio/mt6616/piv/mt6616_fm_priv.h5
-rw-r--r--drivers/misc/mediatek/fmradio/mt6616/pub/mt6616_fm_cmd.c692
-rw-r--r--drivers/misc/mediatek/fmradio/mt6616/pub/mt6616_fm_eint.c129
-rw-r--r--drivers/misc/mediatek/fmradio/mt6616/pub/mt6616_fm_lib.c968
-rw-r--r--drivers/misc/mediatek/fmradio/mt6616/pub/mt6616_fm_link.c282
-rw-r--r--drivers/misc/mediatek/fmradio/mt6616/pub/mt6616_fm_rds.c299
-rw-r--r--drivers/misc/mediatek/fmradio/mt6620/inc/mt6620_drv_dsp.h0
-rw-r--r--drivers/misc/mediatek/fmradio/mt6620/inc/mt6620_fm.h53
-rw-r--r--drivers/misc/mediatek/fmradio/mt6620/inc/mt6620_fm_cmd.h65
-rw-r--r--drivers/misc/mediatek/fmradio/mt6620/inc/mt6620_fm_cust_cfg.h133
-rw-r--r--drivers/misc/mediatek/fmradio/mt6620/inc/mt6620_fm_lib.h109
-rw-r--r--drivers/misc/mediatek/fmradio/mt6620/inc/mt6620_fm_link.h74
-rw-r--r--drivers/misc/mediatek/fmradio/mt6620/inc/mt6620_fm_reg.h97
-rw-r--r--drivers/misc/mediatek/fmradio/mt6620/pub/mt6620_fm_cmd.c1487
-rw-r--r--drivers/misc/mediatek/fmradio/mt6620/pub/mt6620_fm_config.c345
-rw-r--r--drivers/misc/mediatek/fmradio/mt6620/pub/mt6620_fm_lib.c2256
-rw-r--r--drivers/misc/mediatek/fmradio/mt6620/pub/mt6620_fm_rds.c365
-rw-r--r--drivers/misc/mediatek/fmradio/mt6626/inc/fm_cust_cfg.h105
-rw-r--r--drivers/misc/mediatek/fmradio/mt6626/inc/mt6626_drv_dsp.h972
-rw-r--r--drivers/misc/mediatek/fmradio/mt6626/inc/mt6626_fm.h81
-rw-r--r--drivers/misc/mediatek/fmradio/mt6626/inc/mt6626_fm_cmd.h46
-rw-r--r--drivers/misc/mediatek/fmradio/mt6626/inc/mt6626_fm_lib.h77
-rw-r--r--drivers/misc/mediatek/fmradio/mt6626/inc/mt6626_fm_link.h68
-rw-r--r--drivers/misc/mediatek/fmradio/mt6626/inc/mt6626_fm_reg.h83
-rw-r--r--drivers/misc/mediatek/fmradio/mt6626/piv/mt6626_fm_priv.c0
-rw-r--r--drivers/misc/mediatek/fmradio/mt6626/piv/mt6626_fm_priv.h5
-rw-r--r--drivers/misc/mediatek/fmradio/mt6626/pub/mt6626_fm_cmd.c690
-rw-r--r--drivers/misc/mediatek/fmradio/mt6626/pub/mt6626_fm_eint.c135
-rw-r--r--drivers/misc/mediatek/fmradio/mt6626/pub/mt6626_fm_lib.c1153
-rw-r--r--drivers/misc/mediatek/fmradio/mt6626/pub/mt6626_fm_link.c243
-rw-r--r--drivers/misc/mediatek/fmradio/mt6626/pub/mt6626_fm_rds.c320
-rw-r--r--drivers/misc/mediatek/fmradio/mt6627/inc/mt6627_drv_dsp.h14
-rw-r--r--drivers/misc/mediatek/fmradio/mt6627/inc/mt6627_fm.h58
-rw-r--r--drivers/misc/mediatek/fmradio/mt6627/inc/mt6627_fm_cmd.h71
-rw-r--r--drivers/misc/mediatek/fmradio/mt6627/inc/mt6627_fm_cust_cfg.h99
-rw-r--r--drivers/misc/mediatek/fmradio/mt6627/inc/mt6627_fm_lib.h71
-rw-r--r--drivers/misc/mediatek/fmradio/mt6627/inc/mt6627_fm_reg.h89
-rw-r--r--drivers/misc/mediatek/fmradio/mt6627/pub/mt6627_fm_cmd.c1038
-rw-r--r--drivers/misc/mediatek/fmradio/mt6627/pub/mt6627_fm_config.c180
-rw-r--r--drivers/misc/mediatek/fmradio/mt6627/pub/mt6627_fm_lib.c2126
-rw-r--r--drivers/misc/mediatek/fmradio/mt6627/pub/mt6627_fm_rds.c351
-rw-r--r--drivers/misc/mediatek/fmradio/mt6628/inc/mt6628_drv_dsp.h972
-rw-r--r--drivers/misc/mediatek/fmradio/mt6628/inc/mt6628_fm.h58
-rw-r--r--drivers/misc/mediatek/fmradio/mt6628/inc/mt6628_fm_cmd.h56
-rw-r--r--drivers/misc/mediatek/fmradio/mt6628/inc/mt6628_fm_cust_cfg.h99
-rw-r--r--drivers/misc/mediatek/fmradio/mt6628/inc/mt6628_fm_lib.h71
-rw-r--r--drivers/misc/mediatek/fmradio/mt6628/inc/mt6628_fm_link.h68
-rw-r--r--drivers/misc/mediatek/fmradio/mt6628/inc/mt6628_fm_reg.h89
-rw-r--r--drivers/misc/mediatek/fmradio/mt6628/pub/mt6628_fm_cmd.c939
-rw-r--r--drivers/misc/mediatek/fmradio/mt6628/pub/mt6628_fm_config.c298
-rw-r--r--drivers/misc/mediatek/fmradio/mt6628/pub/mt6628_fm_lib.c1814
-rw-r--r--drivers/misc/mediatek/fmradio/mt6628/pub/mt6628_fm_rds.c317
-rw-r--r--drivers/misc/mediatek/fmradio/mt6630/inc/mt6630_fm.h58
-rw-r--r--drivers/misc/mediatek/fmradio/mt6630/inc/mt6630_fm_cmd.h77
-rw-r--r--drivers/misc/mediatek/fmradio/mt6630/inc/mt6630_fm_cust_cfg.h102
-rw-r--r--drivers/misc/mediatek/fmradio/mt6630/inc/mt6630_fm_lib.h71
-rw-r--r--drivers/misc/mediatek/fmradio/mt6630/inc/mt6630_fm_reg.h89
-rw-r--r--drivers/misc/mediatek/fmradio/mt6630/pub/mt6630_fm_cmd.c1053
-rw-r--r--drivers/misc/mediatek/fmradio/mt6630/pub/mt6630_fm_config.c204
-rw-r--r--drivers/misc/mediatek/fmradio/mt6630/pub/mt6630_fm_lib.c2343
-rw-r--r--drivers/misc/mediatek/fmradio/mt6630/pub/mt6630_fm_rds.c345
103 files changed, 0 insertions, 37527 deletions
diff --git a/arch/arm64/configs/cm12_m2note_defconfig b/arch/arm64/configs/cm12_m2note_defconfig
index c34c3b078..b908b2491 100644
--- a/arch/arm64/configs/cm12_m2note_defconfig
+++ b/arch/arm64/configs/cm12_m2note_defconfig
@@ -1238,8 +1238,6 @@ CONFIG_MTK_WIFI_MCC_SUPPORT=y
CONFIG_MTK_COMBO_WIFI=y
CONFIG_MTK_BT_SUPPORT=y
CONFIG_MTK_WFD_SUPPORT=y
-# CONFIG_MTK_FM is not set
-# CONFIG_MTK_FM_SUPPORT is not set
# CONFIG_MTK_MERGE_INTERFACE_SUPPORT is not set
# CONFIG_SDIOAUTOK_SUPPORT is not set
# CONFIG_MTK_MT6306_SUPPORT is not set
@@ -1455,7 +1453,6 @@ CONFIG_MTK_LENS_BU64245_SUPPORT=y
# CONFIG_MTK_INHOUSE_GPU is not set
# CONFIG_SW_SYNC64 is not set
CONFIG_MTK_LASTPC=y
-# CONFIG_MTK_FMRADIO is not set
CONFIG_MTK_HWMON=y
CONFIG_MTK_CMDQ=y
CONFIG_MTK_VIDEOX=y
diff --git a/arch/arm64/configs/cm13_m2note_defconfig b/arch/arm64/configs/cm13_m2note_defconfig
index a284f4bcc..f9122e354 100644
--- a/arch/arm64/configs/cm13_m2note_defconfig
+++ b/arch/arm64/configs/cm13_m2note_defconfig
@@ -1238,8 +1238,6 @@ CONFIG_MTK_WIFI_MCC_SUPPORT=y
CONFIG_MTK_COMBO_WIFI=y
CONFIG_MTK_BT_SUPPORT=y
CONFIG_MTK_WFD_SUPPORT=y
-# CONFIG_MTK_FM is not set
-# CONFIG_MTK_FM_SUPPORT is not set
# CONFIG_MTK_MERGE_INTERFACE_SUPPORT is not set
# CONFIG_SDIOAUTOK_SUPPORT is not set
# CONFIG_MTK_MT6306_SUPPORT is not set
@@ -1455,7 +1453,6 @@ CONFIG_MTK_LENS_BU64245_SUPPORT=y
# CONFIG_MTK_INHOUSE_GPU is not set
# CONFIG_SW_SYNC64 is not set
CONFIG_MTK_LASTPC=y
-# CONFIG_MTK_FMRADIO is not set
CONFIG_MTK_HWMON=y
CONFIG_MTK_CMDQ=y
CONFIG_MTK_VIDEOX=y
diff --git a/arch/arm64/configs/los13_m2note_defconfig b/arch/arm64/configs/los13_m2note_defconfig
index 719355f8a..86a888db4 100644
--- a/arch/arm64/configs/los13_m2note_defconfig
+++ b/arch/arm64/configs/los13_m2note_defconfig
@@ -1244,8 +1244,6 @@ CONFIG_MTK_WIFI_MCC_SUPPORT=y
CONFIG_MTK_COMBO_WIFI=y
CONFIG_MTK_BT_SUPPORT=y
CONFIG_MTK_WFD_SUPPORT=y
-# CONFIG_MTK_FM is not set
-# CONFIG_MTK_FM_SUPPORT is not set
# CONFIG_MTK_MERGE_INTERFACE_SUPPORT is not set
# CONFIG_SDIOAUTOK_SUPPORT is not set
# CONFIG_MTK_MT6306_SUPPORT is not set
@@ -1461,7 +1459,6 @@ CONFIG_MTK_LENS_BU64245_SUPPORT=y
# CONFIG_MTK_INHOUSE_GPU is not set
# CONFIG_SW_SYNC64 is not set
CONFIG_MTK_LASTPC=y
-# CONFIG_MTK_FMRADIO is not set
CONFIG_MTK_HWMON=y
CONFIG_MTK_CMDQ=y
CONFIG_MTK_VIDEOX=y
diff --git a/arch/arm64/configs/los14_m2note_defconfig b/arch/arm64/configs/los14_m2note_defconfig
index 6327b5488..99aaf16a6 100644
--- a/arch/arm64/configs/los14_m2note_defconfig
+++ b/arch/arm64/configs/los14_m2note_defconfig
@@ -1238,8 +1238,6 @@ CONFIG_MTK_WIFI_MCC_SUPPORT=y
CONFIG_MTK_COMBO_WIFI=y
CONFIG_MTK_BT_SUPPORT=y
CONFIG_MTK_WFD_SUPPORT=y
-# CONFIG_MTK_FM is not set
-# CONFIG_MTK_FM_SUPPORT is not set
# CONFIG_MTK_MERGE_INTERFACE_SUPPORT is not set
# CONFIG_SDIOAUTOK_SUPPORT is not set
# CONFIG_MTK_MT6306_SUPPORT is not set
@@ -1455,7 +1453,6 @@ CONFIG_MTK_LENS_BU64245_SUPPORT=y
# CONFIG_MTK_INHOUSE_GPU is not set
# CONFIG_SW_SYNC64 is not set
CONFIG_MTK_LASTPC=y
-# CONFIG_MTK_FMRADIO is not set
CONFIG_MTK_HWMON=y
CONFIG_MTK_CMDQ=y
CONFIG_MTK_VIDEOX=y
diff --git a/arch/arm64/configs/m2note_defconfig b/arch/arm64/configs/m2note_defconfig
index 7d1d1f5f4..c0eb8d333 100644
--- a/arch/arm64/configs/m2note_defconfig
+++ b/arch/arm64/configs/m2note_defconfig
@@ -1204,8 +1204,6 @@ CONFIG_MTK_WIFI_MCC_SUPPORT=y
CONFIG_MTK_COMBO_WIFI=y
CONFIG_MTK_BT_SUPPORT=y
CONFIG_MTK_WFD_SUPPORT=y
-# CONFIG_MTK_FM is not set
-# CONFIG_MTK_FM_SUPPORT is not set
# CONFIG_MTK_MERGE_INTERFACE_SUPPORT is not set
# CONFIG_SDIOAUTOK_SUPPORT is not set
# CONFIG_MTK_MT6306_SUPPORT is not set
@@ -1421,7 +1419,6 @@ CONFIG_MTK_LENS_BU64245_SUPPORT=y
# CONFIG_MTK_INHOUSE_GPU is not set
# CONFIG_SW_SYNC64 is not set
CONFIG_MTK_LASTPC=y
-# CONFIG_MTK_FMRADIO is not set
CONFIG_MTK_HWMON=y
CONFIG_MTK_CMDQ=y
CONFIG_MTK_VIDEOX=y
diff --git a/arch/arm64/configs/m2note_recovery_defconfig b/arch/arm64/configs/m2note_recovery_defconfig
index ab43b6524..7b05de567 100644
--- a/arch/arm64/configs/m2note_recovery_defconfig
+++ b/arch/arm64/configs/m2note_recovery_defconfig
@@ -1209,8 +1209,6 @@ CONFIG_MTK_WIFI_MCC_SUPPORT=y
CONFIG_MTK_COMBO_WIFI=y
CONFIG_MTK_BT_SUPPORT=y
CONFIG_MTK_WFD_SUPPORT=y
-# CONFIG_MTK_FM is not set
-# CONFIG_MTK_FM_SUPPORT is not set
# CONFIG_MTK_MERGE_INTERFACE_SUPPORT is not set
# CONFIG_SDIOAUTOK_SUPPORT is not set
# CONFIG_MTK_MT6306_SUPPORT is not set
@@ -1426,7 +1424,6 @@ CONFIG_MTK_LENS_BU64245_SUPPORT=y
# CONFIG_MTK_INHOUSE_GPU is not set
# CONFIG_SW_SYNC64 is not set
CONFIG_MTK_LASTPC=y
-# CONFIG_MTK_FMRADIO is not set
CONFIG_MTK_HWMON=y
CONFIG_MTK_CMDQ=y
CONFIG_MTK_VIDEOX=y
diff --git a/drivers/misc/mediatek/Kconfig b/drivers/misc/mediatek/Kconfig
index 1737cce9d..00abc771d 100644
--- a/drivers/misc/mediatek/Kconfig
+++ b/drivers/misc/mediatek/Kconfig
@@ -467,7 +467,6 @@ source "drivers/misc/mediatek/smartpa/Kconfig"
source "drivers/misc/mediatek/lastpc/Kconfig"
-source "drivers/misc/mediatek/fmradio/Kconfig"
source "drivers/misc/mediatek/hwmon/Kconfig"
source "drivers/misc/mediatek/cmdq/Kconfig"
source "drivers/misc/mediatek/videox/Kconfig"
diff --git a/drivers/misc/mediatek/Makefile b/drivers/misc/mediatek/Makefile
index 62f962151..404516ca7 100644
--- a/drivers/misc/mediatek/Makefile
+++ b/drivers/misc/mediatek/Makefile
@@ -47,7 +47,6 @@ obj-y += aee/
obj-$(CONFIG_MTK_EMI_MPU) += emi_mpu/
obj-$(CONFIG_MTK_EMI_BWL) += emi_bwl/
-obj-$(CONFIG_MTK_FMRADIO) += fmradio/
obj-$(CONFIG_MTK_GPS) += gps/
obj-y += m4u/
diff --git a/drivers/misc/mediatek/fmradio/Kconfig b/drivers/misc/mediatek/fmradio/Kconfig
deleted file mode 100644
index 0e396d449..000000000
--- a/drivers/misc/mediatek/fmradio/Kconfig
+++ /dev/null
@@ -1,5 +0,0 @@
-config MTK_FMRADIO
- bool CONFIG_MTK_FMRADIO
- default n
- help
- CONFIG_MTK_FMRADIO
diff --git a/drivers/misc/mediatek/fmradio/Makefile b/drivers/misc/mediatek/fmradio/Makefile
deleted file mode 100755
index dd675150a..000000000
--- a/drivers/misc/mediatek/fmradio/Makefile
+++ /dev/null
@@ -1,228 +0,0 @@
-# Makefile generated by Mediatek
-# fm support
-ifeq ($(CONFIG_MTK_FM_SUPPORT), y)
-
-subdir-ccflags-y += -D MTK_WCN_REMOVE_KERNEL_MODULE
-subdir-ccflags-y += -I$(srctree)/drivers/misc/mediatek/mach/$(MTK_PLATFORM)/include
-
-#define build_speical_fm_driver
-
-# MT6628 FM driver
-#ifeq ($(CONFIG_MTK_FM_CHIP), MT6628_FM)
-
-$(warning feature_option=$(CONFIG_MTK_FM_CHIP))
-ifeq ($(findstring MT6628_FM,$(CONFIG_MTK_FM_CHIP)),MT6628_FM)
-$(warning MT6628_FM)
- FM_CHIP := mt6628
- FM_CHIP_PATH := $(FM_CHIP)/pub/$(FM_CHIP)
- ccflags-y += -I$(src)/inc \
- -I$(src)/$(FM_CHIP)/inc \
- -I$(src)/../connectivity/combo/common/include \
- -I$(src)/../connectivity/combo/common/linux/include \
- -I$(src)/../connectivity/common_detect
-
-obj-$(CONFIG_MTK_FM) += mtk_fm_drv.o
- mt6628-objs := core/fm_module.o \
- core/fm_main.o \
- core/fm_config.o \
- core/fm_rds_parser.o \
- core/fm_patch.o \
- core/fm_utils.o \
- core/fm_link.o \
- core/fm_eint.o \
- $(FM_CHIP_PATH)_fm_lib.o \
- $(FM_CHIP_PATH)_fm_rds.o \
- $(FM_CHIP_PATH)_fm_cmd.o \
- $(FM_CHIP_PATH)_fm_config.o
- mtk_fm_drv-objs += $(mt6628-objs)
-$(warning $(mtk_fm_drv-objs))
- #obj-$(CONFIG_MTK_FM) += private/
-endif
-
-# MT6620 FM driver
-#ifeq ($(CONFIG_MTK_FM_CHIP), MT6620_FM)
-
-ifeq ($(findstring MT6620_FM,$(CONFIG_MTK_FM_CHIP)),MT6620_FM)
-$(warning MT6620_FM)
- FM_CHIP := mt6620
- FM_CHIP_PATH := $(FM_CHIP)/pub/$(FM_CHIP)
- ccflags-y += -I$(src)/inc \
- -I$(src)/$(FM_CHIP)/inc \
- -I$(src)/../connectivity/combo/common/include \
- -I$(src)/../connectivity/combo/common/linux/include \
- -I$(src)/../connectivity/common_detect
-
- obj-$(CONFIG_MTK_FM) += mtk_fm_drv.o
- mt6620-objs := core/fm_module.o \
- core/fm_main.o \
- core/fm_config.o \
- core/fm_rds_parser.o \
- core/fm_patch.o \
- core/fm_utils.o \
- core/fm_link.o \
- core/fm_eint.o \
- $(FM_CHIP_PATH)_fm_lib.o \
- $(FM_CHIP_PATH)_fm_rds.o \
- $(FM_CHIP_PATH)_fm_cmd.o \
- $(FM_CHIP_PATH)_fm_config.o
- mtk_fm_drv-objs += $(mt6620-objs)
-$(warning $(mtk_fm_drv-objs))
- #obj-$(CONFIG_MTK_FM) += private/
-endif
-#$(foreach each_chip, $(CONFIG_MTK_FM_CHIP),$(eval $(call build_speical_fm_driver,$(each_chip))))
-#endef
-
-# MT6627 FM driver
-
-ifeq ($(findstring MT6627_FM,$(CONFIG_MTK_FM_CHIP)),MT6627_FM)
-$(warning MT6627_FM)
- FM_CHIP := mt6627
- FM_CHIP_PATH := $(FM_CHIP)/pub/$(FM_CHIP)
- ccflags-y += -DMT6627_FM
- ccflags-y += -I$(src)/inc \
- -I$(src)/$(FM_CHIP)/inc \
- -I$(src)/../connectivity/conn_soc/common/include \
- -I$(src)/../connectivity/conn_soc/common/linux/include \
- -I$(src)/../connectivity/common_detect
-
- obj-$(CONFIG_MTK_FM) += mtk_fm_drv.o
- mt6627-objs := core/fm_module.o \
- core/fm_main.o \
- core/fm_config.o \
- core/fm_rds_parser.o \
- core/fm_patch.o \
- core/fm_utils.o \
- core/fm_link.o \
- core/fm_eint.o \
- $(FM_CHIP_PATH)_fm_lib.o \
- $(FM_CHIP_PATH)_fm_rds.o \
- $(FM_CHIP_PATH)_fm_cmd.o \
- $(FM_CHIP_PATH)_fm_config.o
- mtk_fm_drv-objs += $(mt6627-objs)
-$(warning $(mtk_fm_drv-objs))
- #obj-$(CONFIG_MTK_FM) += private/
-endif
-
-# MT6625 FM driver
-
-ifeq ($(findstring MT6625_FM,$(CONFIG_MTK_FM_CHIP)),MT6625_FM)
-$(warning MT6627_FM)
- FM_CHIP := mt6627
- FM_CHIP_PATH := $(FM_CHIP)/pub/$(FM_CHIP)
- ccflags-y += -DMT6627_FM
- ccflags-y += -DMT6625_FM
- ccflags-y += -I$(src)/inc \
- -I$(src)/$(FM_CHIP)/inc \
- -I$(src)/../connectivity/conn_soc/common/include \
- -I$(src)/../connectivity/conn_soc/common/linux/include \
- -I$(src)/../connectivity/common_detect
-
- obj-$(CONFIG_MTK_FM) += mtk_fm_drv.o
- mt6627-objs := core/fm_module.o \
- core/fm_main.o \
- core/fm_config.o \
- core/fm_rds_parser.o \
- core/fm_patch.o \
- core/fm_utils.o \
- core/fm_link.o \
- core/fm_eint.o \
- $(FM_CHIP_PATH)_fm_lib.o \
- $(FM_CHIP_PATH)_fm_rds.o \
- $(FM_CHIP_PATH)_fm_cmd.o \
- $(FM_CHIP_PATH)_fm_config.o
- mtk_fm_drv-objs += $(mt6627-objs)
-$(warning $(mtk_fm_drv-objs))
- #obj-$(CONFIG_MTK_FM) += private/
-endif
-
-# MT6580 FM driver
-
-ifeq ($(findstring MT6580_FM,$(CONFIG_MTK_FM_CHIP)),MT6580_FM)
-$(warning MT6580_FM)
- FM_CHIP := mt6580
- FM_CHIP_PATH := $(FM_CHIP)/pub/$(FM_CHIP)
- ccflags-y += -DMT6580_FM
- ccflags-y += -I$(src)/inc \
- -I$(src)/$(FM_CHIP)/inc \
- -I$(src)/../connectivity/conn_soc/common/include \
- -I$(src)/../connectivity/conn_soc/common/linux/include \
- -I$(src)/../connectivity/common_detect
-
- obj-$(CONFIG_MTK_FM) += mtk_fm_drv.o
- mt6580-objs := core/fm_module.o \
- core/fm_main.o \
- core/fm_config.o \
- core/fm_rds_parser.o \
- core/fm_patch.o \
- core/fm_utils.o \
- core/fm_link.o \
- core/fm_eint.o \
- $(FM_CHIP_PATH)_fm_lib.o \
- $(FM_CHIP_PATH)_fm_rds.o \
- $(FM_CHIP_PATH)_fm_cmd.o \
- $(FM_CHIP_PATH)_fm_config.o
- mtk_fm_drv-objs += $(mt6580-objs)
-$(warning $(mtk_fm_drv-objs))
- #obj-$(CONFIG_MTK_FM) += private/
-endif
-
-# MT6630 FM driver
-ifeq ($(findstring MT6630_FM,$(CONFIG_MTK_FM_CHIP)),MT6630_FM)
-$(warning MT6630_FM)
- FM_CHIP := mt6630
- FM_CHIP_PATH := $(FM_CHIP)/pub/$(FM_CHIP)
- ccflags-y += -DMT6630_FM
- ccflags-y += -I$(src)/inc \
- -I$(src)/$(FM_CHIP)/inc \
- -I$(src)/../connectivity/combo/common/include \
- -I$(src)/../connectivity/combo/common/linux/include \
- -I$(src)/../connectivity/common_detect
-
- obj-$(CONFIG_MTK_FM) += mtk_fm_drv.o
- mt6630-objs := core/fm_module.o \
- core/fm_main.o \
- core/fm_config.o \
- core/fm_rds_parser.o \
- core/fm_patch.o \
- core/fm_utils.o \
- core/fm_link.o \
- core/fm_eint.o \
- $(FM_CHIP_PATH)_fm_lib.o \
- $(FM_CHIP_PATH)_fm_rds.o \
- $(FM_CHIP_PATH)_fm_cmd.o \
- $(FM_CHIP_PATH)_fm_config.o
- mtk_fm_drv-objs += $(mt6630-objs)
-$(warning $(mtk_fm_drv-objs))
- #obj-$(CONFIG_MTK_FM) += private/
-endif
-
-# MT6626 FM driver
-ifeq ($(CONFIG_MTK_FM_CHIP), mt6626)
-FM_CHIP := mt6626
-FM_CHIP_PATH := $(FM_CHIP)/pub/$(FM_CHIP)
-ccflags-y := -I$(src)/inc \
- -I$(src)/$(FM_CHIP)/inc \
- -I$(src)/cust/$(FM_CHIP) \
- -I$(src)/private/inc
-
-obj-$(CONFIG_MTK_FM) += mtk_fm_drv.o
-mtk_fm_drv-objs := core/fm_module.o \
- core/fm_main.o \
- core/fm_config.o \
- core/fm_patch.o \
- core/fm_rds_parser.o \
- core/fm_utils.o \
- core/fm_link.o \
- $(FM_CHIP_PATH)_fm_lib.o \
- $(FM_CHIP_PATH)_fm_rds.o \
- $(FM_CHIP_PATH)_fm_link.o \
- $(FM_CHIP_PATH)_fm_eint.o
-endif
-
-#for include WMT header
-subdir-ccflags-y += -DWMT_PLAT_ALPS=1
-
-endif
-
-obj-y += dummy.o
-
diff --git a/drivers/misc/mediatek/fmradio/core/fm_config.c b/drivers/misc/mediatek/fmradio/core/fm_config.c
deleted file mode 100644
index 4372eb303..000000000
--- a/drivers/misc/mediatek/fmradio/core/fm_config.c
+++ /dev/null
@@ -1,606 +0,0 @@
-/* fm_config.c
- *
- * (C) Copyright 2011
- * MediaTek <www.MediaTek.com>
- * hongcheng <hongcheng.xia@MediaTek.com>
- *
- * FM Radio Driver
- *
- * 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.
- *
- * 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.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- */
-#include <linux/string.h>
-#include <linux/slab.h>
-
-#include "fm_typedef.h"
-#include "fm_rds.h"
-#include "fm_dbg.h"
-#include "fm_err.h"
-#include "fm_stdlib.h"
-#include "fm_patch.h"
-#include "fm_config.h"
-#if (!defined(MT6628_FM) && !defined(MT6620_FM) && !defined(MT6627_FM) && !defined(MT6580_FM) && !defined(MT6630_FM))
-#include "fm_cust_cfg.h"
-#endif
-static fm_cust_cfg fm_config;
-static fm_s32 fm_index;
-
-#if 0
-static fm_s32 to_upper(fm_s8 *str)
-{
- fm_s32 i = 0;
-
- for (i = 0; i < (int)strlen(str); i++) {
- if (('a' <= str[i]) && (str[i] <= 'z')) {
- str[i] = str[i] - ('a' - 'A');
- }
- }
-
- return 0;
-}
-#endif
-
-fm_s32 to_upper_n(fm_s8 *str, fm_s32 len)
-{
- fm_s32 i = 0;
-
- for (i = 0; i < len; i++) {
- if (('a' <= str[i]) && (str[i] <= 'z')) {
- str[i] = str[i] - ('a' - 'A');
- }
- }
-
- return 0;
-}
-
-fm_s32 check_hex_str(fm_s8 *str, fm_s32 len)
-{
- fm_s32 i = 0;
-
- for (i = 0; i < len; i++) {
- if ((('a' <= str[i]) && (str[i] <= 'z')) || (('A' <= str[i]) && (str[i] <= 'Z'))
- || (('0' <= str[i]) && (str[i] <= '9'))) {
- ;
- } else {
- return -1;
- }
- }
-
- return 0;
-}
-
-fm_s32 check_dec_str(fm_s8 *str, fm_s32 len)
-{
- fm_s32 i = 0;
-
- for (i = 0; i < len; i++) {
- if (('0' <= str[i]) && (str[i] <= '9')) {
- ;
- } else {
- return -1;
- }
- }
-
- return 0;
-}
-
-fm_s32 ascii_to_hex(fm_s8 *in_ascii, fm_u16 *out_hex)
-{
- fm_s32 len = (fm_s32) strlen(in_ascii);
- int i = 0;
- fm_u16 tmp;
-
- len = (len > 4) ? 4 : len;
-
- if (check_hex_str(in_ascii, len)) {
- return -1;
- }
-
- to_upper_n(in_ascii, len);
- *out_hex = 0;
-
- for (i = 0; i < len; i++) {
- if (in_ascii[len - i - 1] < 'A') {
- tmp = in_ascii[len - i - 1];
- *out_hex |= ((tmp - '0') << (4 * i));
- } else {
- tmp = in_ascii[len - i - 1];
- *out_hex |= ((tmp - 'A' + 10) << (4 * i));
- }
- }
-
- return 0;
-}
-
-fm_s32 ascii_to_dec(fm_s8 *in_ascii, fm_s32 *out_dec)
-{
- fm_s32 len = (fm_s32) strlen(in_ascii);
- int i = 0;
- int flag;
- int multi = 1;
-
- len = (len > 10) ? 10 : len;
-
- if (in_ascii[0] == '-') {
- flag = -1;
- in_ascii += 1;
- len -= 1;
- } else {
- flag = 1;
- }
-
- if (check_dec_str(in_ascii, len)) {
- return -1;
- }
-
- *out_dec = 0;
- multi = 1;
-
- for (i = 0; i < len; i++) {
- *out_dec += ((in_ascii[len - i - 1] - '0') * multi);
- multi *= 10;
- }
-
- *out_dec *= flag;
- return 0;
-}
-
-fm_s32 trim_string(fm_s8 **start)
-{
- fm_s8 *end = *start;
-
- /* Advance to non-space character */
- while (*(*start) == ' ') {
- (*start)++;
- }
-
- /* Move to end of string */
- while (*end != '\0') {
- (end)++;
- }
-
- /* Backup to non-space character */
- do {
- end--;
- } while ((end >= *start) && (*end == ' '));
-
- /* Terminate string after last non-space character */
- *(++end) = '\0';
- return (end - *start);
-}
-
-fm_s32 trim_path(fm_s8 **start)
-{
- fm_s8 *end = *start;
-
- while (*(*start) == ' ') {
- (*start)++;
- }
-
- while (*end != '\0') {
- (end)++;
- }
-
- do {
- end--;
- } while ((end >= *start) && ((*end == ' ') || (*end == '\n') || (*end == '\r')));
-
- *(++end) = '\0';
- return (end - *start);
-}
-
-fm_s32 cfg_parser(fm_s8 *buffer, CFG_HANDLER handler, fm_cust_cfg *cfg)
-{
- fm_s32 ret = 0;
- fm_s8 *p = buffer;
- fm_s8 *group_start = NULL;
- fm_s8 *key_start = NULL;
- fm_s8 *value_start = NULL;
-
- enum fm_cfg_parser_state state = FM_CFG_STAT_NONE;
-
- FMR_ASSERT(p);
-
- for (p = buffer; *p != '\0'; p++) {
- switch (state) {
- case FM_CFG_STAT_NONE:{
- if (*p == '[') {
- /* if we get char '[' in none state, it means a new group name start */
- state = FM_CFG_STAT_GROUP;
- group_start = p + 1;
- } else if (*p == COMMENT_CHAR) {
- /* if we get char '#' in none state, it means a new comment start */
- state = FM_CFG_STAT_COMMENT;
- } else if (!isspace(*p) && (*p != '\n') && (*p != '\r')) {
- /* if we get an nonspace char in none state, it means a new key start */
- state = FM_CFG_STAT_KEY;
- key_start = p;
- }
-
- break;
- }
- case FM_CFG_STAT_GROUP:{
- if (*p == ']') {
- /* if we get char ']' in group state, it means a group name complete */
- *p = '\0';
- /* FIX_ME */
- /* record group name */
- state = FM_CFG_STAT_NONE;
- trim_string(&group_start);
- /* WCN_DBG(FM_NTC|MAIN, "g=%s\n", group_start); */
- }
-
- break;
- }
- case FM_CFG_STAT_COMMENT:{
- if (*p == '\n') {
- /* if we get char '\n' in comment state, it means new line start */
- state = FM_CFG_STAT_NONE;
- group_start = p + 1;
- }
-
- break;
- }
- case FM_CFG_STAT_KEY:{
- if (*p == DELIMIT_CHAR) {
- /* if we get char '=' in key state, it means a key name complete */
- *p = '\0';
- /* FIX_ME */
- /* record key name */
- state = FM_CFG_STAT_VALUE;
- value_start = p + 1;
- trim_string(&key_start);
- /* WCN_DBG(FM_NTC|MAIN, "k=%s\n", key_start); */
- }
-
- break;
- }
- case FM_CFG_STAT_VALUE:{
- if (*p == '\n' || *p == '\r') {
- /* if we get char '\n' or '\r' in value state, it means a value complete */
- *p = '\0';
- /* record value */
- trim_string(&value_start);
- /* WCN_DBG(FM_NTC|MAIN, "v=%s\n", value_start); */
-
- if (handler) {
- ret =
- handler(group_start, key_start, value_start,
- cfg);
- }
-
- state = FM_CFG_STAT_NONE;
- }
-
- break;
- }
- default:
- break;
- }
- }
-
- return ret;
-}
-
-fm_s32 cfg_item_match(fm_s8 *src_key, fm_s8 *src_val, fm_s8 *dst_key, fm_s32 *dst_val)
-{
- fm_s32 ret = 0;
- fm_u16 tmp_hex;
- fm_s32 tmp_dec;
-
- /* WCN_DBG(FM_NTC|MAIN,"src_key=%s,src_val=%s\n", src_key,src_val); */
- /* WCN_DBG(FM_NTC|MAIN,"dst_key=%s\n", dst_key); */
- if (strcmp(src_key, dst_key) == 0) {
- if (strncmp(src_val, "0x", strlen("0x")) == 0) {
- src_val += strlen("0x");
- /* WCN_DBG(FM_NTC|MAIN,"%s\n", src_val); */
- ret = ascii_to_hex(src_val, &tmp_hex);
-
- if (!ret) {
- *dst_val = tmp_hex;
- /* WCN_DBG(FM_NTC|MAIN, "%s 0x%04x\n", dst_key, tmp_hex); */
- return 0;
- } else {
- /* WCN_DBG(FM_ERR | MAIN, "%s format error\n", dst_key); */
- return 1;
- }
- } else {
- ret = ascii_to_dec(src_val, &tmp_dec);
-
- if (!ret /*&& ((0 <= tmp_dec) && (tmp_dec <= 0xFFFF)) */) {
- *dst_val = tmp_dec;
- /* WCN_DBG(FM_NTC|MAIN, "%s %d\n", dst_key, tmp_dec); */
- return 0;
- } else {
- /* WCN_DBG(FM_ERR | MAIN, "%s format error\n", dst_key); */
- return 1;
- }
- }
- }
- /* else */
- /* { */
- /* WCN_DBG(FM_ERR | MAIN, "src_key!=dst_key\n"); */
- /* } */
-
- return -1;
-}
-
-static fm_s32 cfg_item_handler(fm_s8 *grp, fm_s8 *key, fm_s8 *val, fm_cust_cfg *cfg)
-{
- fm_s32 ret = 0;
- struct fm_rx_cust_cfg *rx_cfg = &cfg->rx_cfg;
- struct fm_tx_cust_cfg *tx_cfg = &cfg->tx_cfg;
-
- if (0 <= (ret = cfg_item_match(key, val, "FMR_RSSI_TH_L", &rx_cfg->long_ana_rssi_th))) { /* FMR_RSSI_TH_L = 0x0301 */
- return ret;
- } else if (0 <=
- (ret = cfg_item_match(key, val, "FMR_RSSI_TH_S", &rx_cfg->short_ana_rssi_th))) {
- return ret;
- } else if (0 <= (ret = cfg_item_match(key, val, "FMR_CQI_TH", &rx_cfg->cqi_th))) {
- return ret;
- } else if (0 <= (ret = cfg_item_match(key, val, "FMR_MR_TH", &rx_cfg->mr_th))) {
- return ret;
- } else if (0 <= (ret = cfg_item_match(key, val, "FMR_SMG_TH", &rx_cfg->smg_th))) {
- return ret;
- } else if (0 <= (ret = cfg_item_match(key, val, "FMR_SCAN_CH_SIZE", &rx_cfg->scan_ch_size))) {
- return ret;
- } else if (0 <= (ret = cfg_item_match(key, val, "FMR_SCAN_SORT", &rx_cfg->scan_sort))) {
- return ret;
- } else if (0 <= (ret = cfg_item_match(key, val, "FMR_SEEK_SPACE", &rx_cfg->seek_space))) {
- return ret;
- } else if (0 <= (ret = cfg_item_match(key, val, "FMR_BAND", &rx_cfg->band))) {
- return ret;
- } else if (0 <= (ret = cfg_item_match(key, val, "FMR_BAND_FREQ_L", &rx_cfg->band_freq_l))) {
- return ret;
- } else if (0 <= (ret = cfg_item_match(key, val, "FMR_BAND_FREQ_H", &rx_cfg->band_freq_h))) {
- return ret;
- } else if (0 <= (ret = cfg_item_match(key, val, "FMR_FAKE_CH", &rx_cfg->fake_ch[fm_index]))) {
- fm_index += 1;
- rx_cfg->fake_ch_num =
- (rx_cfg->fake_ch_num < fm_index) ? fm_index : rx_cfg->fake_ch_num;
- return ret;
- } else if (0 <=
- (ret = cfg_item_match(key, val, "FMR_FAKE_CH_RSSI", &rx_cfg->fake_ch_rssi_th))) {
- return ret;
- } else if (0 <= (ret = cfg_item_match(key, val, "FMR_DEEMPHASIS", &rx_cfg->deemphasis))) {
- return ret;
- } else if (0 <= (ret = cfg_item_match(key, val, "FMR_OSC_FREQ", &rx_cfg->osc_freq))) {
- return ret;
- } else if (0 <= (ret = cfg_item_match(key, val, "FMT_SCAN_HOLE_L", &tx_cfg->scan_hole_low))) {
- return ret;
- } else if (0 <=
- (ret = cfg_item_match(key, val, "FMT_SCAN_HOLE_H", &tx_cfg->scan_hole_high))) {
- return ret;
- } else if (0 <= (ret = cfg_item_match(key, val, "FMT_PWR_LVL_MAX", &tx_cfg->power_level))) {
- return ret;
- } else {
- WCN_DBG(FM_WAR | MAIN, "invalid key\n");
- return -1;
- }
-}
-
-static fm_s32 fm_cust_config_default(fm_cust_cfg *cfg)
-{
- FMR_ASSERT(cfg);
-#if (!defined(MT6628_FM) && !defined(MT6620_FM) && !defined(MT6627_FM) && !defined(MT6580_FM) && !defined(MT6630_FM))
-
- cfg->rx_cfg.long_ana_rssi_th = FM_RX_RSSI_TH_LONG;
- cfg->rx_cfg.short_ana_rssi_th = FM_RX_RSSI_TH_SHORT;
- cfg->rx_cfg.cqi_th = FM_RX_CQI_TH;
- cfg->rx_cfg.mr_th = FM_RX_MR_TH;
- cfg->rx_cfg.smg_th = FM_RX_SMG_TH;
- cfg->rx_cfg.scan_ch_size = FM_RX_SCAN_CH_SIZE;
- cfg->rx_cfg.seek_space = FM_RX_SEEK_SPACE;
- cfg->rx_cfg.band = FM_RX_BAND;
- cfg->rx_cfg.band_freq_l = FM_RX_BAND_FREQ_L;
- cfg->rx_cfg.band_freq_h = FM_RX_BAND_FREQ_H;
- cfg->rx_cfg.scan_sort = FM_RX_SCAN_SORT_SELECT;
- cfg->rx_cfg.fake_ch_num = FM_RX_FAKE_CH_NUM;
- cfg->rx_cfg.fake_ch_rssi_th = FM_RX_FAKE_CH_RSSI;
- cfg->rx_cfg.fake_ch[0] = FM_RX_FAKE_CH_1;
- cfg->rx_cfg.fake_ch[1] = FM_RX_FAKE_CH_2;
- cfg->rx_cfg.fake_ch[2] = FM_RX_FAKE_CH_3;
- cfg->rx_cfg.fake_ch[3] = FM_RX_FAKE_CH_4;
- cfg->rx_cfg.fake_ch[4] = FM_RX_FAKE_CH_5;
- cfg->rx_cfg.deemphasis = FM_RX_DEEMPHASIS;
-
- cfg->tx_cfg.scan_hole_low = FM_TX_SCAN_HOLE_LOW;
- cfg->tx_cfg.scan_hole_high = FM_TX_SCAN_HOLE_HIGH;
- cfg->tx_cfg.power_level = FM_TX_PWR_LEVEL_MAX;
-#endif
- return 0;
-}
-
-static fm_s32 fm_cust_config_file(const fm_s8 *filename, fm_cust_cfg *cfg)
-{
- fm_s32 ret = 0;
- fm_s8 *buf = NULL;
- fm_s32 file_len = 0;
-
- if (!(buf = fm_zalloc(4096))) {
- WCN_DBG(FM_ALT | MAIN, "-ENOMEM\n");
- return -ENOMEM;
- }
-
- fm_index = 0;
-
- file_len = fm_file_read(filename, buf, 4096, 0);
-
- if (file_len <= 0) {
- ret = -1;
- goto out;
- }
-
- ret = cfg_parser(buf, cfg_item_handler, cfg);
-
- out:
-
- if (buf) {
- fm_free(buf);
- }
-
- return ret;
-}
-
-static fm_s32 fm_cust_config_print(fm_cust_cfg *cfg)
-{
- fm_s32 i;
-
- WCN_DBG(FM_NTC | MAIN, "rssi_l:\t0x%04x\n", cfg->rx_cfg.long_ana_rssi_th);
- WCN_DBG(FM_NTC | MAIN, "rssi_s:\t0x%04x\n", cfg->rx_cfg.short_ana_rssi_th);
- WCN_DBG(FM_NTC | MAIN, "mr_th:\t0x%04x\n", cfg->rx_cfg.mr_th);
- WCN_DBG(FM_NTC | MAIN, "cqi_th:\t0x%04x\n", cfg->rx_cfg.cqi_th);
- WCN_DBG(FM_NTC | MAIN, "smg_th:\t0x%04x\n", cfg->rx_cfg.smg_th);
- WCN_DBG(FM_NTC | MAIN, "scan_ch_size:\t%d\n", cfg->rx_cfg.scan_ch_size);
- WCN_DBG(FM_NTC | MAIN, "seek_space:\t%d\n", cfg->rx_cfg.seek_space);
- WCN_DBG(FM_NTC | MAIN, "band:\t%d\n", cfg->rx_cfg.band);
- WCN_DBG(FM_NTC | MAIN, "band_freq_l:\t%d\n", cfg->rx_cfg.band_freq_l);
- WCN_DBG(FM_NTC | MAIN, "band_freq_h:\t%d\n", cfg->rx_cfg.band_freq_h);
- WCN_DBG(FM_NTC | MAIN, "scan_sort:\t%d\n", cfg->rx_cfg.scan_sort);
- WCN_DBG(FM_NTC | MAIN, "fake_ch_num:\t%d\n", cfg->rx_cfg.fake_ch_num);
- WCN_DBG(FM_NTC | MAIN, "fake_ch_rssi_th:\t%d\n", cfg->rx_cfg.fake_ch_rssi_th);
-
- for (i = 0; i < cfg->rx_cfg.fake_ch_num; i++) {
- WCN_DBG(FM_NTC | MAIN, "fake_ch:\t%d\n", cfg->rx_cfg.fake_ch[i]);
- }
-
- WCN_DBG(FM_NTC | MAIN, "de_emphasis:\t%d\n", cfg->rx_cfg.deemphasis);
- WCN_DBG(FM_NTC | MAIN, "osc_freq:\t%d\n", cfg->rx_cfg.osc_freq);
- WCN_DBG(FM_NTC | MAIN, "scan_hole_low:\t%d\n", cfg->tx_cfg.scan_hole_low);
- WCN_DBG(FM_NTC | MAIN, "scan_hole_high:\t%d\n", cfg->tx_cfg.scan_hole_high);
- WCN_DBG(FM_NTC | MAIN, "power_level:\t%d\n", cfg->tx_cfg.power_level);
-
- return 0;
-}
-
-fm_s32 fm_cust_config(const fm_s8 *filepath)
-{
- fm_s32 ret = 0;
- fm_s8 *filep = NULL;
- fm_s8 file_path[51] = { 0 };
-
- fm_cust_config_default(&fm_config);
- WCN_DBG(FM_NTC | MAIN, "FM default config\n");
- fm_cust_config_print(&fm_config);
-
- if (!filepath) {
- filep = FM_CUST_CFG_PATH;
- } else {
- memcpy(file_path, filepath, (strlen(filepath) > 50) ? 50 : strlen(filepath));
- filep = file_path;
- trim_path(&filep);
- }
-
- ret = fm_cust_config_file(filep, &fm_config);
- WCN_DBG(FM_NTC | MAIN, "FM cust config\n");
- fm_cust_config_print(&fm_config);
- return ret;
-}
-
-fm_u16 fm_cust_config_fetch(enum fm_cust_cfg_op op_code)
-{
- fm_u16 tmp = 0;
- fm_s32 i;
- static fm_s32 fake_ch_idx;
-
- switch (op_code) {
- /* For FM RX */
- case FM_CFG_RX_RSSI_TH_LONG:{
- tmp = fm_config.rx_cfg.long_ana_rssi_th;
- break;
- }
- case FM_CFG_RX_RSSI_TH_SHORT:{
- tmp = fm_config.rx_cfg.short_ana_rssi_th;
- break;
- }
- case FM_CFG_RX_CQI_TH:{
- tmp = fm_config.rx_cfg.cqi_th;
- break;
- }
- case FM_CFG_RX_MR_TH:{
- tmp = fm_config.rx_cfg.mr_th;
- break;
- }
- case FM_CFG_RX_SMG_TH:{
- tmp = fm_config.rx_cfg.smg_th;
- break;
- }
- case FM_CFG_RX_SCAN_CH_SIZE:{
- tmp = fm_config.rx_cfg.scan_ch_size;
- break;
- }
- case FM_CFG_RX_SEEK_SPACE:{
- tmp = fm_config.rx_cfg.seek_space;
- break;
- }
- case FM_CFG_RX_BAND:{
- tmp = fm_config.rx_cfg.band;
- break;
- }
- case FM_CFG_RX_BAND_FREQ_L:{
- tmp = fm_config.rx_cfg.band_freq_l;
- break;
- }
- case FM_CFG_RX_BAND_FREQ_H:{
- tmp = fm_config.rx_cfg.band_freq_h;
- break;
- }
- case FM_CFG_RX_SCAN_SORT:{
- tmp = fm_config.rx_cfg.scan_sort;
- break;
- }
- case FM_CFG_RX_FAKE_CH_NUM:{
- tmp = fm_config.rx_cfg.fake_ch_num;
- break;
- }
- case FM_CFG_RX_FAKE_CH:{
- tmp = fm_config.rx_cfg.fake_ch[fake_ch_idx];
- i = (fm_config.rx_cfg.fake_ch_num >
- 0) ? fm_config.rx_cfg.fake_ch_num : FAKE_CH_MAX;
- fake_ch_idx++;
- fake_ch_idx = fake_ch_idx % i;
- break;
- }
- case FM_CFG_RX_FAKE_CH_RSSI:{
- tmp = fm_config.rx_cfg.fake_ch_rssi_th;
- break;
- }
- case FM_CFG_RX_DEEMPHASIS:{
- tmp = fm_config.rx_cfg.deemphasis;
- break;
- }
- case FM_CFG_RX_OSC_FREQ:{
- tmp = fm_config.rx_cfg.osc_freq;
- break;
- }
- /* For FM TX */
- case FM_CFG_TX_SCAN_HOLE_LOW:{
- tmp = fm_config.tx_cfg.scan_hole_low;
- break;
- }
- case FM_CFG_TX_SCAN_HOLE_HIGH:{
- tmp = fm_config.tx_cfg.scan_hole_high;
- break;
- }
- case FM_CFG_TX_PWR_LEVEL:{
- tmp = fm_config.tx_cfg.power_level;
- break;
- }
- default:
- break;
- }
-
- WCN_DBG(FM_DBG | MAIN, "cust cfg %d: 0x%04x\n", op_code, tmp);
- return tmp;
-}
diff --git a/drivers/misc/mediatek/fmradio/core/fm_eint.c b/drivers/misc/mediatek/fmradio/core/fm_eint.c
deleted file mode 100644
index 19dbbe64b..000000000
--- a/drivers/misc/mediatek/fmradio/core/fm_eint.c
+++ /dev/null
@@ -1,56 +0,0 @@
-/* mt6620_fm_eint.c
- *
- * (C) Copyright 2009
- * MediaTek <www.MediaTek.com>
- * Run <Run.Liu@MediaTek.com>
- *
- * WCN combo chip FM Radio Driver -- EINT functions
- *
- * 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.
- *
- * 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.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- */
-#if (defined(MT6620_FM) || defined(MT6628_FM) || defined(MT6627_FM) || defined(MT6580_FM) || defined(MT6630_FM))
-#include "osal_typedef.h"
-#include "stp_exp.h"
-#include "wmt_exp.h"
-
-#include "fm_typedef.h"
-#include "fm_dbg.h"
-#include "fm_err.h"
-#include "fm_eint.h"
-
-fm_s32 fm_enable_eint(void)
-{
- return 0;
-}
-
-fm_s32 fm_disable_eint(void)
-{
- return 0;
-}
-
-fm_s32 fm_request_eint(void (*parser) (void))
-{
- WCN_DBG(FM_NTC | EINT, "%s\n", __func__);
-
- mtk_wcn_stp_register_event_cb(FM_TASK_INDX, parser);
-
- return 0;
-}
-
-fm_s32 fm_eint_pin_cfg(fm_s32 mode)
-{
- return 0;
-}
-#endif
diff --git a/drivers/misc/mediatek/fmradio/core/fm_link.c b/drivers/misc/mediatek/fmradio/core/fm_link.c
deleted file mode 100644
index b7dde404e..000000000
--- a/drivers/misc/mediatek/fmradio/core/fm_link.c
+++ /dev/null
@@ -1,601 +0,0 @@
-/* fm_link.c
- *
- * (C) Copyright 2012
- * MediaTek <www.MediaTek.com>
- * Hongcheng <hongcheng.xia@MediaTek.com>
- *
- * FM Radio Driver -- setup data link common part
- *
- * 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.
- *
- * 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.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- */
-#include <linux/slab.h>
-#include <linux/interrupt.h>
-
-#include "fm_typedef.h"
-#include "fm_dbg.h"
-#include "fm_err.h"
-#include "fm_stdlib.h"
-#include "fm_link.h"
-#if (defined(MT6620_FM) || defined(MT6628_FM) || defined(MT6627_FM) || defined(MT6580_FM) || defined(MT6630_FM))
-#include "osal_typedef.h"
-#include "stp_exp.h"
-#include "wmt_exp.h"
-static struct fm_link_event *link_event;
-
-static struct fm_trace_fifo_t *cmd_fifo;
-
-static struct fm_trace_fifo_t *evt_fifo;
-
-static fm_s32(*reset) (fm_s32 sta);
-
-static void WCNfm_wholechip_rst_cb(ENUM_WMTDRV_TYPE_T src,
- ENUM_WMTDRV_TYPE_T dst,
- ENUM_WMTMSG_TYPE_T type, void *buf, unsigned int sz)
-{
- /* To handle reset procedure please */
- ENUM_WMTRSTMSG_TYPE_T rst_msg;
-
- if (sz <= sizeof(ENUM_WMTRSTMSG_TYPE_T)) {
- memcpy((char *)&rst_msg, (char *)buf, sz);
- WCN_DBG(FM_WAR | LINK,
- "[src=%d], [dst=%d], [type=%d], [buf=0x%x], [sz=%d], [max=%d]\n", src, dst,
- type, rst_msg, sz, WMTRSTMSG_RESET_MAX);
-
- if ((src == WMTDRV_TYPE_WMT) && (dst == WMTDRV_TYPE_FM)
- && (type == WMTMSG_TYPE_RESET)) {
- if (rst_msg == WMTRSTMSG_RESET_START) {
- WCN_DBG(FM_WAR | LINK, "FM restart start!\n");
- if (reset) {
- reset(1);
- }
-
- } else if (rst_msg == WMTRSTMSG_RESET_END) {
- WCN_DBG(FM_WAR | LINK, "FM restart end!\n");
- if (reset) {
- reset(0);
- }
- }
- }
- } else {
- /*message format invalid */
- WCN_DBG(FM_WAR | LINK, "message format invalid!\n");
- }
-}
-
-
-fm_s32 fm_link_setup(void *data)
-{
- fm_s32 ret = 0;
-
- if (!(link_event = fm_zalloc(sizeof(struct fm_link_event)))) {
- WCN_DBG(FM_ALT | LINK, "fm_zalloc(fm_link_event) -ENOMEM\n");
- return -1;
- }
-
- link_event->ln_event = fm_flag_event_create("ln_evt");
-
- if (!link_event->ln_event) {
- WCN_DBG(FM_ALT | LINK, "create mt6620_ln_event failed\n");
- fm_free(link_event);
- return -1;
- }
-
- fm_flag_event_get(link_event->ln_event);
-
-
- WCN_DBG(FM_NTC | LINK, "fm link setup\n");
-
- cmd_fifo = fm_trace_fifo_create("cmd_fifo");
- if (!cmd_fifo) {
- WCN_DBG(FM_ALT | LINK, "create cmd_fifo failed\n");
- ret = -1;
- goto failed;
- }
-
- evt_fifo = fm_trace_fifo_create("evt_fifo");
- if (!evt_fifo) {
- WCN_DBG(FM_ALT | LINK, "create evt_fifo failed\n");
- ret = -1;
- goto failed;
- }
-
- reset = data; /* get whole chip reset cb */
- mtk_wcn_wmt_msgcb_reg(WMTDRV_TYPE_FM, WCNfm_wholechip_rst_cb);
- return 0;
-
- failed:
- fm_trace_fifo_release(evt_fifo);
- fm_trace_fifo_release(cmd_fifo);
- fm_flag_event_put(link_event->ln_event);
- if (link_event) {
- fm_free(link_event);
- }
-
- return ret;
-}
-
-fm_s32 fm_link_release(void)
-{
-
- fm_trace_fifo_release(evt_fifo);
- fm_trace_fifo_release(cmd_fifo);
- fm_flag_event_put(link_event->ln_event);
- if (link_event) {
- fm_free(link_event);
- }
-
- WCN_DBG(FM_NTC | LINK, "fm link release\n");
- return 0;
-}
-
-/*
- * fm_ctrl_rx
- * the low level func to read a rigister
- * @addr - rigister address
- * @val - the pointer of target buf
- * If success, return 0; else error code
- */
-fm_s32 fm_ctrl_rx(fm_u8 addr, fm_u16 *val)
-{
- return 0;
-}
-
-/*
- * fm_ctrl_tx
- * the low level func to write a rigister
- * @addr - rigister address
- * @val - value will be writed in the rigister
- * If success, return 0; else error code
- */
-fm_s32 fm_ctrl_tx(fm_u8 addr, fm_u16 val)
-{
- return 0;
-}
-
-/*
- * fm_cmd_tx() - send cmd to FM firmware and wait event
- * @buf - send buffer
- * @len - the length of cmd
- * @mask - the event flag mask
- * @ cnt - the retry conter
- * @timeout - timeout per cmd
- * Return 0, if success; error code, if failed
- */
-fm_s32 fm_cmd_tx(fm_u8 *buf, fm_u16 len, fm_s32 mask, fm_s32 cnt, fm_s32 timeout,
- fm_s32(*callback) (struct fm_res_ctx *result))
-{
- fm_s32 ret_time = 0;
- struct task_struct *task = current;
- struct fm_trace_t trace;
-
- if ((NULL == buf) || (len < 0) || (0 == mask)
- || (cnt > SW_RETRY_CNT_MAX) || (timeout > SW_WAIT_TIMEOUT_MAX)) {
- WCN_DBG(FM_ERR | LINK, "cmd tx, invalid para\n");
- return -FM_EPARA;
- }
-
- FM_EVENT_CLR(link_event->ln_event, mask);
-
-#ifdef FM_TRACE_ENABLE
- trace.type = buf[0];
- trace.opcode = buf[1];
- trace.len = len - 4;
- trace.tid = (fm_s32) task->pid;
- fm_memset(trace.pkt, 0, FM_TRACE_PKT_SIZE);
- fm_memcpy(trace.pkt, &buf[4],
- (trace.len > FM_TRACE_PKT_SIZE) ? FM_TRACE_PKT_SIZE : trace.len);
-#endif
-
- sw_retry:
-
-#ifdef FM_TRACE_ENABLE
- if (fm_true == FM_TRACE_FULL(cmd_fifo)) {
- FM_TRACE_OUT(cmd_fifo, NULL);
- }
- FM_TRACE_IN(cmd_fifo, &trace);
-#endif
-
- /* send cmd to FM firmware */
- if ((ret_time = mtk_wcn_stp_send_data(buf, len, FM_TASK_INDX)) <= 0) {
- WCN_DBG(FM_EMG | LINK, "send data over stp failed[%d]\n", ret_time);
- return -FM_ELINK;
- }
- /* wait the response form FM firmware */
- ret_time = FM_EVENT_WAIT_TIMEOUT(link_event->ln_event, mask, timeout);
-
- if (!ret_time) {
- if (0 < cnt--) {
- WCN_DBG(FM_WAR | LINK, "wait even timeout, [retry_cnt=%d], pid=%d\n", cnt,
- task->pid);
- fm_print_cmd_fifo();
- fm_print_evt_fifo();
- return -FM_EFW;
- goto sw_retry; /* retry if timeout and retry cnt > 0 */
- } else {
- WCN_DBG(FM_ALT | LINK, "fatal error, SW retry failed, reset HW\n");
- return -FM_EFW;
- }
- }
-
- FM_EVENT_CLR(link_event->ln_event, mask);
-
- if (callback) {
- callback(&link_event->result);
- }
-
- return 0;
-}
-
-fm_s32 fm_event_parser(fm_s32(*rds_parser) (struct rds_rx_t *, fm_s32))
-{
- fm_s32 len;
- fm_s32 i = 0;
- fm_u8 opcode = 0;
- fm_u16 length = 0;
- fm_u8 ch;
- fm_u8 rx_buf[RX_BUF_SIZE + 10] = { 0 }; /* the 10 bytes are protect gaps */
- static volatile fm_task_parser_state state = FM_TASK_RX_PARSER_PKT_TYPE;
- struct fm_trace_t trace;
- struct task_struct *task = current;
-
- len = mtk_wcn_stp_receive_data(rx_buf, RX_BUF_SIZE, FM_TASK_INDX);
- WCN_DBG(FM_DBG | LINK, "[len=%d],[CMD=0x%02x 0x%02x 0x%02x 0x%02x]\n", len, rx_buf[0],
- rx_buf[1], rx_buf[2], rx_buf[3]);
-
- while (i < len) {
- ch = rx_buf[i];
-
- switch (state) {
- case FM_TASK_RX_PARSER_PKT_TYPE:
-
- if (ch == FM_TASK_EVENT_PKT_TYPE) {
- if ((i + 5) < RX_BUF_SIZE) {
- WCN_DBG(FM_DBG | LINK,
- "0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x\n",
- rx_buf[i], rx_buf[i + 1], rx_buf[i + 2],
- rx_buf[i + 3], rx_buf[i + 4], rx_buf[i + 5]);
- } else {
- WCN_DBG(FM_DBG | LINK, "0x%02x 0x%02x\n", rx_buf[i],
- rx_buf[i + 1]);
- }
-
- state = FM_TASK_RX_PARSER_OPCODE;
- } else {
- WCN_DBG(FM_ALT | LINK,
- "event pkt type error (rx_buf[%d] = 0x%02x)\n", i, ch);
- }
-
- i++;
- break;
-
- case FM_TASK_RX_PARSER_OPCODE:
- i++;
- opcode = ch;
- state = FM_TASK_RX_PARSER_PKT_LEN_1;
- break;
-
- case FM_TASK_RX_PARSER_PKT_LEN_1:
- i++;
- length = ch;
- state = FM_TASK_RX_PARSER_PKT_LEN_2;
- break;
-
- case FM_TASK_RX_PARSER_PKT_LEN_2:
- i++;
- length |= (fm_u16) (ch << 0x8);
-
-#ifdef FM_TRACE_ENABLE
- trace.type = FM_TASK_EVENT_PKT_TYPE;
- trace.opcode = opcode;
- trace.len = length;
- trace.tid = (fm_s32) task->pid;
- fm_memset(trace.pkt, 0, FM_TRACE_PKT_SIZE);
- fm_memcpy(trace.pkt, &rx_buf[i],
- (length > FM_TRACE_PKT_SIZE) ? FM_TRACE_PKT_SIZE : length);
-
- if (fm_true == FM_TRACE_FULL(cmd_fifo)) {
- FM_TRACE_OUT(cmd_fifo, NULL);
- }
- FM_TRACE_IN(cmd_fifo, &trace);
-#endif
- if (length > 0) {
- state = FM_TASK_RX_PARSER_PKT_PAYLOAD;
- } else if (opcode == CSPI_WRITE_OPCODE) {
- state = FM_TASK_RX_PARSER_PKT_TYPE;
- FM_EVENT_SEND(link_event->ln_event, FLAG_CSPI_WRITE);
- } else {
- state = FM_TASK_RX_PARSER_PKT_TYPE;
- FM_EVENT_SEND(link_event->ln_event, (1 << opcode));
- }
-
- break;
-
- case FM_TASK_RX_PARSER_PKT_PAYLOAD:
-
- switch (opcode) {
- case FM_TUNE_OPCODE:
-
- if ((length == 1) && (rx_buf[i] == 1)) {
- FM_EVENT_SEND(link_event->ln_event, FLAG_TUNE_DONE);
- }
-
- break;
-
- case FM_SOFT_MUTE_TUNE_OPCODE:
-
- if (length >= 2) {
- fm_memcpy(link_event->result.cqi, &rx_buf[i],
- (length >
- FM_CQI_BUF_SIZE) ? FM_CQI_BUF_SIZE : length);
- FM_EVENT_SEND(link_event->ln_event, FLAG_SM_TUNE);
- }
- break;
-
- case FM_SEEK_OPCODE:
-
- if ((i + 1) < RX_BUF_SIZE) {
- link_event->result.seek_result = rx_buf[i] + (rx_buf[i + 1] << 8); /* 8760 means 87.60Mhz */
- }
-
- FM_EVENT_SEND(link_event->ln_event, FLAG_SEEK_DONE);
- break;
-
- case FM_SCAN_OPCODE:
-
- /* check if the result data is long enough */
- if ((RX_BUF_SIZE - i) < (sizeof(fm_u16) * FM_SCANTBL_SIZE)) {
- WCN_DBG(FM_ALT | LINK,
- "FM_SCAN_OPCODE err, [tblsize=%d],[bufsize=%d]\n",
- (unsigned int)(sizeof(fm_u16) * FM_SCANTBL_SIZE),
- (unsigned int)(RX_BUF_SIZE - i));
- FM_EVENT_SEND(link_event->ln_event, FLAG_SCAN_DONE);
- return 0;
- } else if ((length >= FM_CQI_BUF_SIZE)
- && ((RX_BUF_SIZE - i) >= FM_CQI_BUF_SIZE)) {
- fm_memcpy(link_event->result.cqi, &rx_buf[i],
- FM_CQI_BUF_SIZE);
- FM_EVENT_SEND(link_event->ln_event, FLAG_CQI_DONE);
- } else {
- fm_memcpy(link_event->result.scan_result, &rx_buf[i],
- sizeof(fm_u16) * FM_SCANTBL_SIZE);
- FM_EVENT_SEND(link_event->ln_event, FLAG_SCAN_DONE);
- }
-
- break;
-
- case FSPI_READ_OPCODE:
-
- if ((i + 1) < RX_BUF_SIZE) {
- link_event->result.fspi_rd =
- (rx_buf[i] + (rx_buf[i + 1] << 8));
- }
-
- FM_EVENT_SEND(link_event->ln_event, (1 << opcode));
- break;
- case CSPI_READ_OPCODE:
- {
- if ((i + 1) < RX_BUF_SIZE) {
- link_event->result.cspi_rd =
- (rx_buf[i] + (rx_buf[i + 1] << 8) +
- (rx_buf[i + 2] << 16) + (rx_buf[i + 3] << 24));
- }
-
- FM_EVENT_SEND(link_event->ln_event, FLAG_CSPI_READ);
- break;
- }
- case FM_HOST_READ_OPCODE:
- {
- if ((i + 1) < RX_BUF_SIZE) {
- link_event->result.cspi_rd =
- (rx_buf[i] + (rx_buf[i + 1] << 8) +
- (rx_buf[i + 2] << 16) + (rx_buf[i + 3] << 24));
- }
-
- FM_EVENT_SEND(link_event->ln_event, (1 << opcode));
- break;
- }
-
- case RDS_RX_DATA_OPCODE:
-
- /* check if the rds data is long enough */
- if ((RX_BUF_SIZE - i) < length) {
- WCN_DBG(FM_ALT | LINK,
- "RDS RX err, [rxlen=%d],[bufsize=%d]\n",
- (fm_s32) length, (RX_BUF_SIZE - i));
- FM_EVENT_SEND(link_event->ln_event, (1 << opcode));
- break;
- }
- /* copy rds data to rds buf */
- fm_memcpy(&link_event->result.rds_rx_result, &rx_buf[i], length);
-
- /*Handle the RDS data that we get */
- if (rds_parser) {
- rds_parser(&link_event->result.rds_rx_result, length);
- } else {
- WCN_DBG(FM_WAR | LINK, "no method to parse RDS data\n");
- }
-
- FM_EVENT_SEND(link_event->ln_event, (1 << opcode));
- break;
-
- default:
- FM_EVENT_SEND(link_event->ln_event, (1 << opcode));
- break;
- }
-
- state = FM_TASK_RX_PARSER_PKT_TYPE;
- i += length;
- break;
-
- default:
- break;
- }
- }
-
- return 0;
-}
-
-fm_bool fm_wait_stc_done(fm_u32 sec)
-{
- return fm_true;
-}
-
-fm_s32 fm_force_active_event(fm_u32 mask)
-{
- fm_u32 flag;
-
- flag = FM_EVENT_GET(link_event->ln_event);
- WCN_DBG(FM_WAR | LINK, "before force active event, [flag=0x%08x]\n", flag);
- flag = FM_EVENT_SEND(link_event->ln_event, mask);
- WCN_DBG(FM_WAR | LINK, "after force active event, [flag=0x%08x]\n", flag);
-
- return 0;
-}
-
-
-extern fm_s32 fm_print_cmd_fifo(void)
-{
-#ifdef FM_TRACE_ENABLE
- struct fm_trace_t trace;
- fm_s32 i = 0;
-
- while (fm_false == FM_TRACE_EMPTY(cmd_fifo)) {
- fm_memset(trace.pkt, 0, FM_TRACE_PKT_SIZE);
- FM_TRACE_OUT(cmd_fifo, &trace);
- WCN_DBG(FM_ALT | LINK, "trace, type %d, op %d, len %d, tid %d, time %d\n",
- trace.type, trace.opcode, trace.len, trace.tid,
- jiffies_to_msecs(abs(trace.time)));
- i = 0;
- while ((trace.len > 0) && (i < trace.len) && (i < (FM_TRACE_PKT_SIZE - 8))) {
- WCN_DBG(FM_ALT | LINK, "trace, %02x %02x %02x %02x %02x %02x %02x %02x\n",
- trace.pkt[i], trace.pkt[i + 1], trace.pkt[i + 2], trace.pkt[i + 3],
- trace.pkt[i + 4], trace.pkt[i + 5], trace.pkt[i + 6],
- trace.pkt[i + 7]);
- i += 8;
- }
- WCN_DBG(FM_ALT | LINK, "trace\n");
- }
-#endif
-
- return 0;
-}
-
-extern fm_s32 fm_print_evt_fifo(void)
-{
-#ifdef FM_TRACE_ENABLE
- struct fm_trace_t trace;
- fm_s32 i = 0;
-
- while (fm_false == FM_TRACE_EMPTY(evt_fifo)) {
- fm_memset(trace.pkt, 0, FM_TRACE_PKT_SIZE);
- FM_TRACE_OUT(evt_fifo, &trace);
- WCN_DBG(FM_ALT | LINK, "%s: op %d, len %d, %d\n", evt_fifo->name, trace.opcode,
- trace.len, jiffies_to_msecs(abs(trace.time)));
- i = 0;
- while ((trace.len > 0) && (i < trace.len) && (i < (FM_TRACE_PKT_SIZE - 8))) {
- WCN_DBG(FM_ALT | LINK, "%s: %02x %02x %02x %02x %02x %02x %02x %02x\n",
- evt_fifo->name, trace.pkt[i], trace.pkt[i + 1], trace.pkt[i + 2],
- trace.pkt[i + 3], trace.pkt[i + 4], trace.pkt[i + 5],
- trace.pkt[i + 6], trace.pkt[i + 7]);
- i += 8;
- }
- WCN_DBG(FM_ALT | LINK, "%s\n", evt_fifo->name);
- }
-#endif
-
- return 0;
-}
-#endif
-
-fm_s32 fm_trace_in(struct fm_trace_fifo_t *thiz, struct fm_trace_t *new_tra)
-{
- FMR_ASSERT(new_tra);
-
- if (thiz->len < thiz->size) {
- fm_memcpy(&(thiz->trace[thiz->in]), new_tra, sizeof(struct fm_trace_t));
- thiz->trace[thiz->in].time = jiffies;
- thiz->in = (thiz->in + 1) % thiz->size;
- thiz->len++;
- /* WCN_DBG(FM_DBG | RDSC, "add a new tra[len=%d]\n", thiz->len); */
- } else {
- WCN_DBG(FM_WAR | RDSC, "tra buf is full\n");
- return -FM_ENOMEM;
- }
-
- return 0;
-}
-
-fm_s32 fm_trace_out(struct fm_trace_fifo_t *thiz, struct fm_trace_t *dst_tra)
-{
- if (thiz->len > 0) {
- if (dst_tra) {
- fm_memcpy(dst_tra, &(thiz->trace[thiz->out]), sizeof(struct fm_trace_t));
- fm_memset(&(thiz->trace[thiz->out]), 0, sizeof(struct fm_trace_t));
- }
- thiz->out = (thiz->out + 1) % thiz->size;
- thiz->len--;
- /* WCN_DBG(FM_DBG | RDSC, "del a tra[len=%d]\n", thiz->len); */
- } else {
- WCN_DBG(FM_WAR | RDSC, "tra buf is empty\n");
- }
-
- return 0;
-}
-
-fm_bool fm_trace_is_full(struct fm_trace_fifo_t *thiz)
-{
- return (thiz->len == thiz->size) ? fm_true : fm_false;
-}
-
-fm_bool fm_trace_is_empty(struct fm_trace_fifo_t *thiz)
-{
- return (thiz->len == 0) ? fm_true : fm_false;
-}
-
-
-struct fm_trace_fifo_t *fm_trace_fifo_create(const fm_s8 *name)
-{
- struct fm_trace_fifo_t *tmp;
-
- if (!(tmp = fm_zalloc(sizeof(struct fm_trace_fifo_t)))) {
- WCN_DBG(FM_ALT | MAIN, "fm_zalloc(fm_trace_fifo) -ENOMEM\n");
- return NULL;
- }
-
- fm_memcpy(tmp->name, name, (strlen(name)+1));
- tmp->size = FM_TRACE_FIFO_SIZE;
- tmp->in = 0;
- tmp->out = 0;
- tmp->len = 0;
- tmp->trace_in = fm_trace_in;
- tmp->trace_out = fm_trace_out;
- tmp->is_full = fm_trace_is_full;
- tmp->is_empty = fm_trace_is_empty;
-
- WCN_DBG(FM_NTC | LINK, "%s created\n", tmp->name);
-
- return tmp;
-}
-
-
-fm_s32 fm_trace_fifo_release(struct fm_trace_fifo_t *fifo)
-{
- if (fifo) {
- WCN_DBG(FM_NTC | LINK, "%s released\n", fifo->name);
- fm_free(fifo);
- }
-
- return 0;
-}
diff --git a/drivers/misc/mediatek/fmradio/core/fm_main.c b/drivers/misc/mediatek/fmradio/core/fm_main.c
deleted file mode 100644
index 11233c06c..000000000
--- a/drivers/misc/mediatek/fmradio/core/fm_main.c
+++ /dev/null
@@ -1,3272 +0,0 @@
-/* fm_main.c
- *
- * (C) Copyright 2011
- * MediaTek <www.MediaTek.com>
- * Hongcheng <hongcheng.xia@MediaTek.com>
- *
- * FM Radio Driver -- main functions
- *
- * 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.
- *
- * 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.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- */
-#include <linux/kernel.h>
-#include <asm/uaccess.h>
-#include <linux/slab.h>
-#include <mach/mtk_wcn_cmb_stub.h>
-
-#include "fm_main.h"
-#include "fm_config.h"
-#include "fm_err.h"
-/* #include "fm_cust_cfg.h" */
-#include "osal_typedef.h"
-#include "wmt_exp.h"
-/* fm main data structure */
-static struct fm *g_fm_struct = NULL;
-/* we must get low level interface first, when add a new chip, the main effort is this interface */
-static struct fm_lowlevel_ops fm_low_ops;
-#ifdef MT6620_FM
-static struct fm_lowlevel_ops MT6620fm_low_ops;
-#endif
-#ifdef MT6628_FM
-static struct fm_lowlevel_ops MT6628fm_low_ops;
-#endif
-#ifdef MT6627_FM
-static struct fm_lowlevel_ops MT6627fm_low_ops;
-#endif
-#ifdef MT6580_FM
-static struct fm_lowlevel_ops MT6580fm_low_ops;
-#endif
-#ifdef MT6630_FM
-static struct fm_lowlevel_ops MT6630fm_low_ops;
-#endif
-/* MTK FM Radio private advanced features */
-#if 0 /* (!defined(MT6620_FM)&&!defined(MT6628_FM)) */
-static struct fm_priv priv_adv;
-#endif
-/* mutex for char device ops */
-static struct fm_lock *fm_ops_lock;
-/* mutex for RDS parsing and read result */
-static struct fm_lock *fm_read_lock;
-/* for get rds block counter */
-static struct fm_lock *fm_rds_cnt;
-/* mutex for fm timer, RDS reset */
-static struct fm_lock *fm_timer_lock;
-static struct fm_lock *fm_rxtx_lock; /* protect FM RX TX mode switch */
-static struct fm_lock *fm_rtc_mutex; /* protect FM GPS RTC drift info */
-
-static struct fm_timer *fm_timer_sys;
-
-static fm_bool scan_stop_flag = fm_false;
-static struct fm_gps_rtc_info gps_rtc_info;
-volatile static bool g_fm_stat[3] = {
- fm_false, //RX power
- fm_false, //TX power
- fm_false, //TX scan
-};
-
-/* RDS reset related functions */
-static fm_u16 fm_cur_freq_get(void);
-static fm_s32 fm_cur_freq_set(fm_u16 new_freq);
-static enum fm_op_state fm_op_state_get(struct fm *fmp);
-static enum fm_op_state fm_op_state_set(struct fm *fmp, enum fm_op_state sta);
-static void fm_timer_func(unsigned long data);
-#ifdef MT6620_FM
-static void fmtx_timer_func(unsigned long data);
-#endif
-static void fm_enable_rds_BlerCheck(struct fm *fm);
-static void fm_disable_rds_BlerCheck(void);
-static void fm_rds_reset_work_func(unsigned long data);
-/* when interrupt be triggered by FM chip, fm_eint_handler will first be executed */
-/* then fm_eint_handler will schedule fm_eint_work_func to run */
-static void fm_eint_handler(void);
-static void fm_eint_work_func(unsigned long data);
-static fm_s32 fm_rds_parser(struct rds_rx_t *rds_raw, fm_s32 rds_size);
-static fm_s32 fm_callback_register(struct fm_lowlevel_ops *ops);
-static fm_s32 fm_callback_unregister(struct fm_lowlevel_ops *ops);
-
-static fm_s32 pwrdown_flow(struct fm *fm);
-
-static fm_u16 fm_cur_freq_get(void)
-{
- return g_fm_struct ? g_fm_struct->cur_freq : 0;
-}
-
-static fm_s32 fm_cur_freq_set(fm_u16 new_freq)
-{
- if (g_fm_struct)
- g_fm_struct->cur_freq = new_freq;
-
- return 0;
-}
-
-static enum fm_op_state fm_op_state_get(struct fm *fmp)
-{
- if (fmp) {
- WCN_DBG(FM_DBG | MAIN, "op state get %d\n", fmp->op_sta);
- return fmp->op_sta;
- } else {
- WCN_DBG(FM_ERR | MAIN, "op state get para error\n");
- return FM_STA_UNKOWN;
- }
-}
-
-static enum fm_op_state fm_op_state_set(struct fm *fmp, enum fm_op_state sta)
-{
- if (fmp && (sta < FM_STA_MAX)) {
- fmp->op_sta = sta;
- WCN_DBG(FM_DBG | MAIN, "op state set to %d\n", sta);
- return fmp->op_sta;
- } else {
- WCN_DBG(FM_ERR | MAIN, "op state set para error, %d\n", sta);
- return FM_STA_UNKOWN;
- }
-}
-
-enum fm_pwr_state fm_pwr_state_get(struct fm *fmp)
-{
- if (fmp) {
- WCN_DBG(FM_DBG | MAIN, "pwr state get %d\n", fmp->pwr_sta);
- return fmp->pwr_sta;
- } else {
- WCN_DBG(FM_ERR | MAIN, "pwr state get para error\n");
- return FM_PWR_MAX;
- }
-}
-
-enum fm_pwr_state fm_pwr_state_set(struct fm *fmp, enum fm_pwr_state sta)
-{
- if (fmp && (sta < FM_PWR_MAX)) {
- fmp->pwr_sta = sta;
- WCN_DBG(FM_NTC | MAIN, "pwr state set to %d\n", sta);
- return fmp->pwr_sta;
- } else {
- WCN_DBG(FM_ERR | MAIN, "pwr state set para error, %d\n", sta);
- return FM_PWR_MAX;
- }
-}
-
-fm_s32 fm_set_stat(struct fm *fmp, int which, bool stat)
-{
- fm_s32 ret = 0;
- FMR_ASSERT(fmp);
-
- if (FM_LOCK(fm_ops_lock)) return (-FM_ELOCK);
-
- if(which < (sizeof(g_fm_stat)/sizeof(g_fm_stat[0])))
- {
- g_fm_stat[which] = stat;
- WCN_DBG(FM_DBG | MAIN, "fm set stat object=%d, stat=%d\n", which, stat);
- }
- else
- {
- ret = -1;
- WCN_DBG(FM_ERR | MAIN, "fm set stat error, object=%d, stat=%d\n", which, stat);
- }
-
- FM_UNLOCK(fm_ops_lock);
- return ret;
-}
-
-fm_s32 fm_get_stat(struct fm *fmp, int which, bool *stat)
-{
- fm_s32 ret = 0;
- FMR_ASSERT(fmp);
- FMR_ASSERT(stat);
- if (FM_LOCK(fm_ops_lock)) return (-FM_ELOCK);
-
- if(which < (sizeof(g_fm_stat)/sizeof(g_fm_stat[0])))
- {
- *stat = g_fm_stat[which];
- WCN_DBG(FM_DBG | MAIN, "fm get stat object=%d, stat=%d\n", which, *stat);
- }
- else
- {
- ret = -1;
- WCN_DBG(FM_ERR | MAIN, "fm get stat error, object=%d\n", which);
- }
-
- FM_UNLOCK(fm_ops_lock);
- return ret;
-}
-
-static volatile fm_s32 subsys_rst_state = FM_SUBSYS_RST_OFF;
-
-fm_s32 fm_sys_state_get(struct fm *fmp)
-{
- return subsys_rst_state;
-}
-
-fm_s32 fm_sys_state_set(struct fm *fmp, fm_s32 sta)
-{
- if ((sta >= FM_SUBSYS_RST_OFF) && (sta < FM_SUBSYS_RST_MAX)) {
- WCN_DBG(FM_NTC | MAIN, "sys state set from %d to %d\n", subsys_rst_state, sta);
- subsys_rst_state = sta;
- } else {
- WCN_DBG(FM_ERR | MAIN, "sys state set para error, %d\n", sta);
- }
-
- return subsys_rst_state;
-}
-
-
-fm_s32 fm_subsys_reset(struct fm *fm)
-{
- /* check if we are resetting */
- if (fm_sys_state_get(fm) != FM_SUBSYS_RST_OFF) {
- WCN_DBG(FM_NTC | MAIN, "subsys reset is ongoing\n");
- goto out;
- }
-
- FMR_ASSERT(fm);
- fm->timer_wkthd->add_work(fm->timer_wkthd, fm->rst_wk);
-
- out:
- return 0;
-}
-
-
-fm_s32 fm_wholechip_rst_cb(fm_s32 sta)
-{
- struct fm *fm = g_fm_struct;
-
- if (!fm)
- return 0;
-
- if (sta == 1) {
- if (fm_sys_state_get(fm) == FM_SUBSYS_RST_OFF) {
- fm_sys_state_set(fm, FM_SUBSYS_RST_START);
- }
- } else {
- fm->timer_wkthd->add_work(fm->timer_wkthd, fm->rst_wk);
- }
- return 0;
-}
-
-fm_s32 fm_open(struct fm *fmp)
-{
- fm_s32 ret = 0;
- fm_s32 chipid;
- FMR_ASSERT(fmp);
- if (FM_LOCK(fm_ops_lock))
- return (-FM_ELOCK);
-
- /* makesure fmp->ref >= 0 */
- /* fmp->ref = (fmp->ref < 0) ? 0 : fmp->ref; */
- /* fmp->ref++; */
-
- /* if ((fmp->ref > 0) && (fmp->chipon == fm_false)) */
- if (fmp->chipon == fm_false) {
- chipid = mtk_wcn_wmt_chipid_query();
- WCN_DBG(FM_NTC | MAIN, "wmt chip id=0x%x\n", chipid);
- if (chipid == 0x6628) /* get WCN chip ID */
- {
-#ifdef MT6628_FM
- fm_low_ops = MT6628fm_low_ops;
- fmp->chip_id = 0x6628;
- WCN_DBG(FM_NTC | MAIN, "get 6628 low ops\n");
-#endif
- } else if (chipid == 0x6620) {
-#ifdef MT6620_FM
- fm_low_ops = MT6620fm_low_ops;
- fmp->chip_id = 0x6620;
- WCN_DBG(FM_NTC | MAIN, "get 6620 low ops\n");
-#endif
- } else if ((chipid == 0x6572) || (chipid == 0x6582) || (chipid == 0x6592) \
- || (chipid == 0x8127) || (chipid == 0x6571) || (chipid == 0x6752) \
- || (chipid == 0x0321) || (chipid == 0x0335) || (chipid == 0x0337) \
- || (chipid == 0x6735) || (chipid == 0x8163)) {
-#ifdef MT6627_FM
- fm_low_ops = MT6627fm_low_ops;
- fmp->chip_id = 0x6627;
- WCN_DBG(FM_NTC | MAIN, "get 6627 low ops\n");
-#endif
- } else if (chipid == 0x6580) {
-#ifdef MT6580_FM
- fm_low_ops = MT6580fm_low_ops;
- fmp->chip_id = 0x6580;
- WCN_DBG(FM_NTC | MAIN, "get 6580 low ops\n");
-#endif
- } else if (chipid == 0x6630) {
-#ifdef MT6630_FM
- fm_low_ops = MT6630fm_low_ops;
- fmp->chip_id = 0x6630;
- WCN_DBG(FM_NTC | MAIN, "get 6630 low ops\n");
-#endif
- }
-
-/*
- if(fm_low_ops.bi.pwron == NULL)
- {
- WCN_DBG(FM_NTC | MAIN, "get fm_low_ops fail\n");
- fmp->ref--;
- ret = -ENODEV;
- goto out;
- }
-
- ret = fm_low_ops.bi.pwron(0);
- if (ret) {
- fmp->ref--;
- ret = -ENODEV;
- goto out;
- }
-
-
- fmp->chipon = fm_true;
-*/
- fm_eint_pin_cfg(FM_EINT_PIN_EINT_MODE);
- fm_request_eint(fm_eint_handler);
- }
-/* out: */
- /* WCN_DBG(FM_NTC | MAIN, "fm->ref:%d\n", fmp->ref); */
- FM_UNLOCK(fm_ops_lock);
- return ret;
-}
-
-fm_s32 fm_close(struct fm *fmp)
-{
- fm_s32 ret = 0;
-
- FMR_ASSERT(fmp);
- if (FM_LOCK(fm_ops_lock))
- return (-FM_ELOCK);
-
-/*
- fmp->ref--;
- if (fmp->ref == 0) {
- pwrdown_flow(fmp);
- if (fmp->chipon == fm_true) {
- fm_eint_pin_cfg(FM_EINT_PIN_GPIO_MODE);
- fm_low_ops.bi.pwroff(0);
- fmp->chipon = fm_false;
- }
- }
-
- //makesure fm->ref >= 0
- fmp->ref = (fmp->ref < 0) ? 0 : fmp->ref;
- WCN_DBG(FM_NTC | MAIN, "fmp->ref:%d\n", fmp->ref);
-*/
-
- fm_eint_pin_cfg(FM_EINT_PIN_GPIO_MODE);
-
- FM_UNLOCK(fm_ops_lock);
-
- return ret;
-}
-
-/*
-fm_s32 fm_flush(struct fm *fmp)
-{
- fm_s32 ret = 0;
-
- FMR_ASSERT(fmp);
- if (FM_LOCK(fm_ops_lock)) return (-FM_ELOCK);
-
- if (FM_PWR_OFF == fm_pwr_state_get(fmp))
- {
- WCN_DBG(FM_NTC | MAIN, "should power off combo!\n");
- if (fmp->chipon == fm_true)
- {
- fm_low_ops.bi.pwroff(0);
- fmp->chipon = fm_false;
- }
- }
- WCN_DBG(FM_NTC | MAIN, "fm_flush done\n");
- FM_UNLOCK(fm_ops_lock);
-
- return ret;
-}
-*/
-fm_s32 fm_rds_read(struct fm *fmp, fm_s8 *dst, fm_s32 len)
-{
- fm_s32 copy_len = 0, left = 0;
- copy_len = sizeof(rds_t);
-
- if (FM_EVENT_GET(fmp->rds_event) == FM_RDS_DATA_READY) {
- if (FM_LOCK(fm_read_lock))
- return (-FM_ELOCK);
-
- if ((left = copy_to_user((void *)dst, fmp->pstRDSData, (unsigned long)copy_len))) {
- WCN_DBG(FM_ALT | MAIN, "fm_read copy failed\n");
- } else {
- fmp->pstRDSData->event_status = 0x0000;
- }
-
- WCN_DBG(FM_DBG | MAIN, "fm_read copy len:%d\n", (copy_len - left));
-
- FM_EVENT_RESET(fmp->rds_event);
- FM_UNLOCK(fm_read_lock);
- } else {
- /*if (FM_EVENT_WAIT(fmp->rds_event, FM_RDS_DATA_READY) == 0) {
- WCN_DBG(FM_DBG | MAIN, "fm_read wait ok\n");
- goto RESTART;
- } else {
- WCN_DBG(FM_ALT | MAIN, "fm_read wait err\n");
- return 0;
- } *//*event wait caused AP stop RDS thread and re-read RDS, which caused issue ALPS00595367 */
-
- WCN_DBG(FM_DBG | MAIN, "fm_read no event now\n");
- return 0;
- }
-
- return (copy_len - left);
-}
-
-fm_s32 fm_powerup(struct fm *fm, struct fm_tune_parm *parm)
-{
- fm_s32 ret = 0;
- fm_u8 tmp_vol;
-
- FMR_ASSERT(fm_low_ops.bi.pwron);
- FMR_ASSERT(fm_low_ops.bi.pwrupseq);
-
- if (FM_LOCK(fm_ops_lock))
- return (-FM_ELOCK);
-
- /* for normal case */
- if (fm_low_ops.bi.pwron == NULL) {
- WCN_DBG(FM_NTC | MAIN, "get fm_low_ops fail\n");
- ret = -ENODEV;
- goto out;
- }
-
- if (fm->chipon == fm_false) {
- ret = fm_low_ops.bi.pwron(0);
- if (ret) {
- ret = -ENODEV;
- goto out;
- }
- fm->chipon = fm_true;
- }
-
- if (FM_PWR_RX_ON == fm_pwr_state_get(fm)) {
- WCN_DBG(FM_NTC | MAIN, "already pwron!\n");
- goto out;
- } else if (FM_PWR_TX_ON == fm_pwr_state_get(fm)) {
- /* if Tx is on, we need pwr down TX first */
- WCN_DBG(FM_NTC | MAIN, "power down TX first!\n");
-
- ret = fm_powerdowntx(fm);
- if (ret) {
- WCN_DBG(FM_ERR | MAIN, "FM pwr down Tx fail!\n");
- return ret;
- }
- }
-
- fm_pwr_state_set(fm, FM_PWR_RX_ON);
-
- /* execute power on sequence */
- ret = fm_low_ops.bi.pwrupseq(&fm->chip_id, &fm->device_id);
- if (ret) {
- goto out;
- }
-
- fm_enable_eint();
-
- WCN_DBG(FM_DBG | MAIN, "pwron ok\n");
- fm_cur_freq_set(parm->freq);
-
- parm->err = FM_SUCCESS;
- if (fm_low_ops.bi.low_pwr_wa) {
- fm_low_ops.bi.low_pwr_wa(1);
- }
-
- fm_low_ops.bi.volget(&tmp_vol);
- WCN_DBG(FM_NTC | MAIN, "vol=%d!!!\n", tmp_vol);
-
- /* fm_low_ops.bi.volset(0); */
- fm->vol = 15;
- if (fm_low_ops.ri.rds_bci_get) {
- fm_timer_sys->init(fm_timer_sys, fm_timer_func, (unsigned long)g_fm_struct,
- fm_low_ops.ri.rds_bci_get(), 0);
- fm_timer_sys->start(fm_timer_sys);
- WCN_DBG(FM_NTC | MAIN, "start timer ok\n");
- } else {
- WCN_DBG(FM_NTC | MAIN, "start timer fail!!!\n");
- }
-
- out:
- FM_UNLOCK(fm_ops_lock);
- return ret;
-}
-
-/*
- * fm_powerup_tx
- */
-fm_s32 fm_powerup_tx(struct fm *fm, struct fm_tune_parm *parm)
-{
- fm_s32 ret = 0;
-
- FMR_ASSERT(fm_low_ops.bi.pwron);
- FMR_ASSERT(fm_low_ops.bi.pwrupseq_tx);
-
- if (FM_PWR_TX_ON == fm_pwr_state_get(fm)) {
- WCN_DBG(FM_NTC | MAIN, "already pwron!\n");
- parm->err = FM_BADSTATUS;
- goto out;
- } else if (FM_PWR_RX_ON == fm_pwr_state_get(fm)) {
- /* if Rx is on, we need pwr down first */
- ret = fm_powerdown(fm, 0);
- if (ret) {
- WCN_DBG(FM_ERR | MAIN, "FM pwr down Rx fail!\n");
- goto out;
- }
- }
-
- if (FM_LOCK(fm_ops_lock))
- return (-FM_ELOCK);
-
- /* for normal case */
- if (fm->chipon == fm_false) {
- fm_low_ops.bi.pwron(0);
- fm->chipon = fm_true;
- }
-
- fm_pwr_state_set(fm, FM_PWR_TX_ON);
- ret = fm_low_ops.bi.pwrupseq_tx();
-
- if (ret) {
- parm->err = FM_FAILED;
- fm_pwr_state_set(fm, FM_PWR_OFF);
- WCN_DBG(FM_ERR | MAIN,"FM pwr up Tx fail!\n");
- } else {
- parm->err = FM_SUCCESS;
- }
- fm_cur_freq_set(parm->freq);
-#ifdef MT6620_FM
- /* if(fm_low_ops.ri.rds_bci_get) */
- {
- fm_timer_sys->count = 0;
- fm_timer_sys->tx_pwr_ctrl_en = FM_TX_PWR_CTRL_ENABLE;
- fm_timer_sys->tx_rtc_ctrl_en = FM_TX_RTC_CTRL_ENABLE;
- fm_timer_sys->tx_desense_en = FM_TX_DESENSE_ENABLE;
-
- fm_timer_sys->init(fm_timer_sys, fmtx_timer_func, (unsigned long)g_fm_struct,
- FM_TIMER_TIMEOUT_MIN, 0);
- fm_timer_sys->start(fm_timer_sys);
- WCN_DBG(FM_NTC | MAIN, "start timer ok\n");
- }
-#endif
- out:
- FM_UNLOCK(fm_ops_lock);
- return ret;
-}
-
-static fm_s32 pwrdown_flow(struct fm *fm)
-{
- fm_s32 ret = 0;
- FMR_ASSERT(fm_low_ops.ri.rds_onoff);
- FMR_ASSERT(fm_low_ops.bi.pwrdownseq);
-
- if (FM_PWR_OFF == fm_pwr_state_get(fm)) {
- WCN_DBG(FM_NTC | MAIN, "FMSYS already pwroff!\n");
- goto out;
- }
-
- if (FM_PWR_RX_ON == fm_pwr_state_get(fm)) {
- /* Disable all interrupt */
- fm_disable_rds_BlerCheck();
- fm_low_ops.ri.rds_onoff(fm->pstRDSData, fm_false);
- fm_disable_eint();
-
- fm_pwr_state_set(fm, FM_PWR_OFF);
-
- /* execute power down sequence */
- ret = fm_low_ops.bi.pwrdownseq();
-
- if (fm_low_ops.bi.low_pwr_wa) {
- fm_low_ops.bi.low_pwr_wa(0);
- }
-
- WCN_DBG(FM_ALT | MAIN, "pwrdown_flow exit\n");
- }
- out:
- return ret;
-}
-
-fm_s32 fm_powerdown(struct fm *fm, int type)
-{
- fm_s32 ret = 0;
- if (1 == type) /* 0: RX 1: TX */
- {
- ret = fm_powerdowntx(fm);
- } else {
- if (FM_LOCK(fm_ops_lock))
- return (-FM_ELOCK);
- if (FM_LOCK(fm_rxtx_lock))
- return (-FM_ELOCK);
-
- ret = pwrdown_flow(fm);
-
- FM_UNLOCK(fm_rxtx_lock);
- FM_UNLOCK(fm_ops_lock);
- }
-
- if ((FM_PWR_OFF == fm_pwr_state_get(fm)) && (fm->chipon == fm_true)) {
- fm_low_ops.bi.pwroff(0);
- fm->chipon = fm_false;
- }
-
- return ret;
-}
-
-fm_s32 fm_powerdowntx(struct fm *fm)
-{
- fm_s32 ret = 0;
-
- FMR_ASSERT(fm_low_ops.bi.pwrdownseq_tx);
- /* if (FM_LOCK(fm_ops_lock)) return (-FM_ELOCK); */
- if (FM_LOCK(fm_rxtx_lock))
- return (-FM_ELOCK);
-
- if (FM_PWR_TX_ON == fm_pwr_state_get(fm)) {
-#ifdef MT6620_FM
- if (FM_LOCK(fm_timer_lock))
- return (-FM_ELOCK);
- fm_timer_sys->stop(fm_timer_sys);
- FM_UNLOCK(fm_timer_lock);
- fm_timer_sys->count = 0;
- fm_timer_sys->tx_pwr_ctrl_en = FM_TX_PWR_CTRL_DISABLE;
- fm_timer_sys->tx_rtc_ctrl_en = FM_TX_RTC_CTRL_DISABLE;
- fm_timer_sys->tx_desense_en = FM_TX_DESENSE_DISABLE;
-#endif
- /* fm_low_ops.ri.rds_onoff(fm->pstRDSData, fm_false); */
- /* execute power down sequence */
- ret = fm_low_ops.bi.pwrdownseq_tx();
- if (ret) {
- WCN_DBG(FM_ERR | MAIN, "pwrdown tx fail\n");
- }
-
- fm_pwr_state_set(fm, FM_PWR_OFF);
- WCN_DBG(FM_NTC | MAIN, "pwrdown tx ok\n");
- }
-
- FM_UNLOCK(fm_rxtx_lock);
- /* FM_UNLOCK(fm_ops_lock); */
- return ret;
-}
-
-fm_s32 fm_seek(struct fm *fm, struct fm_seek_parm *parm)
-{
- fm_s32 ret = 0;
- fm_u16 seekdir, space;
-
- FMR_ASSERT(fm_low_ops.bi.seek);
- if (FM_LOCK(fm_ops_lock))
- return (-FM_ELOCK);
-
- if (fm_pwr_state_get(fm) != FM_PWR_RX_ON) {
- parm->err = FM_BADSTATUS;
- ret = -EPERM;
- goto out;
- }
-
- if (parm->space == FM_SPACE_100K) {
- space = 0x0002;
- } else if (parm->space == FM_SPACE_50K) {
- space = 0x0001;
- } else if (parm->space == FM_SPACE_200K) {
- space = 0x0004;
- } else {
- /* default */
- space = 0x0002;
- }
-
-#ifdef MTK_FM_50KHZ_SUPPORT
- if (parm->band == FM_BAND_UE) {
- fm->min_freq = FM_UE_FREQ_MIN;
- fm->max_freq = FM_UE_FREQ_MAX;
- } else if (parm->band == FM_BAND_JAPANW) {
- fm->min_freq = FM_JP_FREQ_MIN;
- fm->max_freq = FM_JP_FREQ_MAX;
- } else if (parm->band == FM_BAND_SPECIAL) {
- fm->min_freq = FM_RX_BAND_FREQ_L;
- fm->max_freq = FM_RX_BAND_FREQ_H;
- }
-#else
- if (parm->band == FM_BAND_UE) {
- fm->min_freq = FM_UE_FREQ_MIN * 10;
- fm->max_freq = FM_UE_FREQ_MAX * 10;
- } else if (parm->band == FM_BAND_JAPANW) {
- fm->min_freq = FM_JP_FREQ_MIN * 10;
- fm->max_freq = FM_JP_FREQ_MAX * 10;
- } else if (parm->band == FM_BAND_SPECIAL) {
- fm->min_freq = FM_RX_BAND_FREQ_L * 10;
- fm->max_freq = FM_RX_BAND_FREQ_H * 10;
- }
-#endif
- else {
- WCN_DBG(FM_ALT | MAIN, "band:%d out of range\n", parm->band);
- parm->err = FM_EPARM;
- ret = -EPERM;
- goto out;
- }
-
- if (parm->freq < fm->min_freq || parm->freq > fm->max_freq) {
- WCN_DBG(FM_ALT | MAIN, "freq:%d out of range\n", parm->freq);
- parm->err = FM_EPARM;
- ret = -EPERM;
- goto out;
- }
-
- if (parm->seekdir == FM_SEEK_UP) {
- seekdir = FM_SEEK_UP;
- } else {
- seekdir = FM_SEEK_DOWN;
- }
-
- fm_op_state_set(fm, FM_STA_SEEK);
-
- /* seek successfully */
- if (fm_true ==
- fm_low_ops.bi.seek(fm->min_freq, fm->max_freq, &(parm->freq), seekdir, space)) {
- parm->err = FM_SUCCESS;
- } else {
- parm->err = FM_SEEK_FAILED;
- ret = -EPERM;
- }
-
- if ((parm->space != FM_SPACE_50K) && (1 == fm_get_channel_space(parm->freq))) {
- parm->freq /= 10; /* (8750 / 10) = 875 */
- }
-
- fm_op_state_set(fm, FM_STA_PLAY);
- out:
- FM_UNLOCK(fm_ops_lock);
- return ret;
-}
-
-/***********************************************************
-Function: fm_tx_scan()
-
-Description: get the valid channels for fm tx function
-
-Para: fm--->fm driver global info
- parm--->input/output paramater
-
-Return: 0, if success; error code, if failed
-***********************************************************/
-fm_s32 fm_tx_scan(struct fm *fm, struct fm_tx_scan_parm *parm)
-{
- fm_s32 ret = 0;
- fm_u16 scandir = 0;
- fm_u16 space = FM_SPACE_100K;
-
- FMR_ASSERT(fm_low_ops.bi.tx_scan);
-
- if (FM_LOCK(fm_ops_lock))
- return (-FM_ELOCK);
-
- if (fm->chipon != fm_true) {
- parm->err = FM_BADSTATUS;
- ret = -EPERM;
- WCN_DBG(FM_ERR | MAIN, "tx scan chip not on\n");
- goto out;
- }
- switch (parm->scandir) {
- case FM_TX_SCAN_UP:
- scandir = 0;
- break;
- case FM_TX_SCAN_DOWN:
- scandir = 1;
- break;
- default:
- scandir = 0;
- break;
- }
-
- /*if (parm->space == FM_SPACE_100K) {
- space = 2;
- } else if (parm->space == FM_SPACE_50K) {
- space = 1;
- } else if (parm->space == FM_SPACE_200K) {
- space = 4;
- } else {
- //default
- space = 2;
- } */
-#ifdef MTK_FM_50KHZ_SUPPORT
- if (parm->band == FM_BAND_UE) {
- fm->min_freq = FM_UE_FREQ_MIN * 10;
- fm->max_freq = FM_UE_FREQ_MAX * 10;
- } else if (parm->band == FM_BAND_JAPANW) {
- fm->min_freq = FM_JP_FREQ_MIN * 10;
- fm->max_freq = FM_JP_FREQ_MAX * 10;
- } else if (parm->band == FM_BAND_SPECIAL) {
- fm->min_freq = FM_FREQ_MIN * 10;
- fm->max_freq = FM_FREQ_MAX * 10;
- }
-#else
- if (parm->band == FM_BAND_UE) {
- fm->min_freq = FM_UE_FREQ_MIN;
- fm->max_freq = FM_UE_FREQ_MAX;
- } else if (parm->band == FM_BAND_JAPANW) {
- fm->min_freq = FM_JP_FREQ_MIN;
- fm->max_freq = FM_JP_FREQ_MAX;
- } else if (parm->band == FM_BAND_SPECIAL) {
- fm->min_freq = FM_FREQ_MIN;
- fm->max_freq = FM_FREQ_MAX;
- }
-#endif
- else {
- WCN_DBG(FM_ERR | MAIN, "band:%d out of range\n", parm->band);
- parm->err = FM_EPARM;
- ret = -EPERM;
- goto out;
- }
-
- if (unlikely((parm->freq < fm->min_freq) || (parm->freq > fm->max_freq))) {
- parm->err = FM_EPARM;
- ret = -EPERM;
- goto out;
- }
-
- if (unlikely(parm->ScanTBLSize < TX_SCAN_MIN || parm->ScanTBLSize > TX_SCAN_MAX)) {
- parm->err = FM_EPARM;
- ret = -EPERM;
- goto out;
- }
-
- ret = fm_low_ops.bi.anaswitch(FM_ANA_SHORT);
- if (ret) {
- WCN_DBG(FM_ERR | MAIN, "switch to short ana failed\n");
- goto out;
- }
- /* do tx scan */
- if (!(ret = fm_low_ops.bi.tx_scan(fm->min_freq, fm->max_freq, &(parm->freq),
- parm->ScanTBL, &(parm->ScanTBLSize), scandir, space))) {
- parm->err = FM_SUCCESS;
- } else {
- WCN_DBG(FM_ERR | MAIN, "fm_tx_scan failed\n");
- parm->err = FM_SCAN_FAILED;
- }
- out:
- FM_UNLOCK(fm_ops_lock);
- return ret;
-}
-
-fm_s32 fm_scan(struct fm *fm, struct fm_scan_parm *parm)
-{
- fm_s32 ret = 0;
- fm_u16 scandir = FM_SEEK_UP, space;
-
- FMR_ASSERT(fm_low_ops.bi.scan);
- WCN_DBG(FM_NTC | MAIN, "fm_scan:start\n");
- if (FM_LOCK(fm_ops_lock))
- return (-FM_ELOCK);
-
- if (fm_pwr_state_get(fm) != FM_PWR_RX_ON) {
- parm->err = FM_BADSTATUS;
- ret = -EPERM;
- goto out;
- }
-
- if (parm->space == FM_SPACE_100K) {
- space = 0x0002;
- } else if (parm->space == FM_SPACE_50K) {
- space = 0x0001;
- } else if (parm->space == FM_SPACE_200K) {
- space = 0x0004;
- } else {
- /* default */
- space = 0x0002;
- }
-
-#ifdef MTK_FM_50KHZ_SUPPORT
- if (parm->band == FM_BAND_UE) {
- fm->min_freq = FM_UE_FREQ_MIN * 10;
- fm->max_freq = FM_UE_FREQ_MAX * 10;
- } else if (parm->band == FM_BAND_JAPANW) {
- fm->min_freq = FM_JP_FREQ_MIN * 10;
- fm->max_freq = FM_JP_FREQ_MAX * 10;
- } else if (parm->band == FM_BAND_SPECIAL) {
- fm->min_freq = FM_FREQ_MIN * 10;
- fm->max_freq = FM_FREQ_MAX * 10;
- }
-#else
- if (parm->band == FM_BAND_UE) {
- fm->min_freq = FM_UE_FREQ_MIN;
- fm->max_freq = FM_UE_FREQ_MAX;
- } else if (parm->band == FM_BAND_JAPANW) {
- fm->min_freq = FM_JP_FREQ_MIN;
- fm->max_freq = FM_JP_FREQ_MAX;
- } else if (parm->band == FM_BAND_SPECIAL) {
- fm->min_freq = FM_RX_BAND_FREQ_L;
- fm->max_freq = FM_RX_BAND_FREQ_H;
- }
-#endif
- else {
- WCN_DBG(FM_ALT | MAIN, "band:%d out of range\n", parm->band);
- parm->err = FM_EPARM;
- ret = -EPERM;
- goto out;
- }
-
- fm_op_state_set(fm, FM_STA_SCAN);
- scan_stop_flag = fm_false;
-
- if (fm_true ==
- fm_low_ops.bi.scan(fm->min_freq, fm->max_freq, &(parm->freq), parm->ScanTBL,
- &(parm->ScanTBLSize), scandir, space)) {
- parm->err = FM_SUCCESS;
- } else {
- WCN_DBG(FM_ALT | MAIN, "fm_scan failed\n");
- parm->err = FM_SEEK_FAILED;
- ret = -EPERM;
- }
-
- fm_op_state_set(fm, FM_STA_STOP);
-
- out:
- FM_UNLOCK(fm_ops_lock);
- WCN_DBG(FM_NTC | MAIN, "fm_scan:done\n");
- return ret;
-}
-
-
-#define SCAN_SEG_LEN 250
-static struct fm_cqi cqi_buf[SCAN_SEG_LEN];
-
-fm_s32 fm_scan_new(struct fm *fm, struct fm_scan_t *parm)
-{
- fm_s32 ret = 0;
- fm_s32 tmp;
- fm_s32 cnt, seg;
- fm_s32 i, j;
- fm_s32 start_freq, end_freq;
- fm_u16 scan_tbl[FM_SCANTBL_SIZE]; /* need no less than the chip */
- fm_u16 tbl_size = FM_SCANTBL_SIZE;
- fm_u16 tmp_freq = 0;
- fm_s32 chl_cnt;
- fm_s32 ch_offset, step, tmp_val;
- fm_u16 space_idx = 0x0002;
-
- fm_s32 cqi_cnt, cqi_idx;
- fm_s8 *buf = (fm_s8 *) cqi_buf;
-
- FMR_ASSERT(fm_low_ops.bi.scan);
- FMR_ASSERT(fm_low_ops.bi.cqi_get);
- if (FM_LOCK(fm_ops_lock))
- return (-FM_ELOCK);
-
- /* caculate channel number, get segment count */
- cnt = (parm->upper - parm->lower) / parm->space + 1; /* Eg, (10800 - 8750) / 5 = 411 */
- seg = (cnt / SCAN_SEG_LEN) + ((cnt % SCAN_SEG_LEN) ? 1 : 0); /* Eg, (411 / 200) + ((411 % 200) ? 1 : 0) = 2 + 1 = 3 */
-
- WCN_DBG(FM_NTC | MAIN, "total ch %d, seg %d\n", cnt, seg);
-
- /* alloc memory */
- tmp = cnt * sizeof(struct fm_ch_rssi *);
- if (parm->sr_size < tmp) {
- if (parm->sr.ch_rssi_buf) {
- fm_free(parm->sr.ch_rssi_buf);
- parm->sr.ch_rssi_buf = NULL;
- }
- parm->sr_size = tmp;
- }
-
- if (!parm->sr.ch_rssi_buf) {
- parm->sr.ch_rssi_buf = (struct fm_ch_rssi *)fm_zalloc(parm->sr_size);
- if (!parm->sr.ch_rssi_buf) {
- WCN_DBG(FM_ERR | MAIN, "scan alloc mem failed\n");
- parm->sr_size = 0;
- return -2;
- }
- }
-
- if (parm->space == 5) {
- space_idx = 0x0001; /* 50Khz */
- } else if (parm->space == 10) {
- space_idx = 0x0002; /* 100Khz */
- } else if (parm->space == 20) {
- space_idx = 0x0004; /* 200Khz */
- }
-
-
- fm_op_state_set(fm, FM_STA_SCAN);
-
- /* do scan */
- chl_cnt = 0;
- for (i = 0; (i < seg) && (fm_false == scan_stop_flag); i++) {
- cqi_cnt = 0;
- cqi_idx = 0;
-
- start_freq = parm->lower + SCAN_SEG_LEN * parm->space * i;
- end_freq = parm->lower + SCAN_SEG_LEN * parm->space * (i + 1) - parm->space;
- end_freq = (end_freq > parm->upper) ? parm->upper : end_freq;
-
- WCN_DBG(FM_NTC | MAIN, "seg %d, start %d, end %d\n", i, start_freq, end_freq);
- if (fm_false ==
- fm_low_ops.bi.scan(start_freq, end_freq, &tmp_freq, scan_tbl, &tbl_size,
- FM_SEEK_UP, space_idx)) {
- ret = -1;
- goto out;
- }
- /* get channel count */
- for (ch_offset = 0; ch_offset < FM_SCANTBL_SIZE; ch_offset++) {
- if (scan_tbl[ch_offset] == 0)
- continue;
- for (step = 0; step < 16; step++) {
- if (scan_tbl[ch_offset] & (1 << step)) {
- tmp_val =
- start_freq + (ch_offset * 16 + step) * parm->space;
- if (tmp_val <= end_freq) {
- /* record valid result channel */
- WCN_DBG(FM_NTC | MAIN, "freq %d\n", tmp_val);
- parm->sr.ch_rssi_buf[chl_cnt].freq = tmp_val;
- chl_cnt++;
- cqi_cnt++;
- }
- }
- }
- }
-
- /* get cqi */
- if (fm_low_ops.bi.cqi_get) {
- tmp = cqi_cnt;
- while ((cqi_cnt > 0) && (fm_false == scan_stop_flag)) {
- ret =
- fm_low_ops.bi.cqi_get(buf +
- (16 * sizeof(struct fm_cqi) * cqi_idx),
- sizeof(cqi_buf) -
- (16 * sizeof(struct fm_cqi) * cqi_idx));
- if (ret) {
- goto out;
- }
-
- cqi_cnt -= 16;
- cqi_idx++;
- }
- cqi_cnt = tmp;
-
- /* fill cqi to result buffer */
- for (j = 0; j < cqi_cnt; j++) {
- tmp = chl_cnt - cqi_cnt + j; /* target pos */
- parm->sr.ch_rssi_buf[tmp].freq = (fm_u16) cqi_buf[j].ch;
- parm->sr.ch_rssi_buf[tmp].rssi = cqi_buf[j].rssi;
- WCN_DBG(FM_NTC | MAIN, "idx %d, freq %d, rssi %d\n", tmp,
- parm->sr.ch_rssi_buf[tmp].freq,
- parm->sr.ch_rssi_buf[tmp].rssi);
- }
- }
- /* 6620 won't get rssi in scan new */
- /* else if(fm_low_ops.bi.rssiget) */
- }
-
- fm_op_state_set(fm, FM_STA_STOP);
-
- out:
- scan_stop_flag = fm_false;
- FM_UNLOCK(fm_ops_lock);
- parm->num = chl_cnt;
- return ret;
-}
-
-
-fm_s32 fm_seek_new(struct fm *fm, struct fm_seek_t *parm)
-{
- fm_s32 ret = 0;
- fm_s32 space_idx = 0x0002;
-
- FMR_ASSERT(fm_low_ops.bi.setfreq);
- FMR_ASSERT(fm_low_ops.bi.rssiget);
- FMR_ASSERT(fm_low_ops.bi.rampdown);
- FMR_ASSERT(fm_low_ops.bi.seek);
-
- if (FM_LOCK(fm_ops_lock))
- return (-FM_ELOCK);
-
- if (parm->freq < parm->lower || parm->freq > parm->upper) {
- WCN_DBG(FM_ERR | MAIN, "seek start freq:%d out of range\n", parm->freq);
- ret = -EPERM;
- goto out;
- }
- /* tune to start freq */
- fm_low_ops.bi.rampdown();
- fm_low_ops.bi.setfreq(parm->freq);
-
- if (parm->space == 5) {
- space_idx = 0x0001;
- } else if (parm->space == 10) {
- space_idx = 0x0002;
- } else if (parm->space == 20) {
- space_idx = 0x0004;
- }
-
- fm_op_state_set(fm, FM_STA_SEEK);
- if (fm_false ==
- fm_low_ops.bi.seek(parm->lower, parm->upper, &(parm->freq), parm->dir, space_idx)) {
- ret = -1;
- goto out;
- }
- /* tune to new channel */
- fm_low_ops.bi.setfreq(parm->freq);
- fm_low_ops.bi.rssiget(&parm->th);
-
- out:
- FM_UNLOCK(fm_ops_lock);
- return ret;
-}
-
-
-fm_s32 fm_tune_new(struct fm *fm, struct fm_tune_t *parm)
-{
- fm_s32 ret = 0;
-
- FMR_ASSERT(fm_low_ops.bi.mute);
- FMR_ASSERT(fm_low_ops.bi.rampdown);
- FMR_ASSERT(fm_low_ops.bi.setfreq);
-
- if (FM_LOCK(fm_ops_lock))
- return (-FM_ELOCK);
-
- WCN_DBG(FM_DBG | MAIN, "%s\n", __func__);
-
- if (fm_pwr_state_get(fm) != FM_PWR_RX_ON) {
- ret = -EPERM;
- goto out;
- }
-
- if (parm->freq < parm->lower || parm->freq > parm->upper) {
- WCN_DBG(FM_ERR | MAIN, "tune freq:%d out of range\n", parm->freq);
- ret = -EPERM;
- goto out;
- }
-/* fm_low_ops.bi.mute(fm_true); */
- fm_low_ops.bi.rampdown();
-
- if (fm_cur_freq_get() != parm->freq) {
- fm_memset(fm->pstRDSData, 0, sizeof(rds_t));
- }
-#if 0 /* (!defined(MT6620_FM)&&!defined(MT6628_FM)) */
- /* HILO side adjust if need */
- if (priv_adv.priv_tbl.hl_dese) {
- if ((ret = priv_adv.priv_tbl.hl_dese(parm->freq, NULL)) < 0) {
- goto out;
- }
-
- WCN_DBG(FM_INF | MAIN, "HILO side %d\n", ret);
- }
- /* Frequency avoid adjust if need */
- if (priv_adv.priv_tbl.fa_dese) {
- if ((ret = priv_adv.priv_tbl.fa_dese(parm->freq, NULL)) < 0) {
- goto out;
- }
-
- WCN_DBG(FM_INF | MAIN, "FA %d\n", ret);
- }
- /* MCU clock adjust if need */
- if (priv_adv.priv_tbl.mcu_dese) {
- if ((ret = priv_adv.priv_tbl.mcu_dese(parm->freq, NULL)) < 0) {
- goto out;
- }
-
- WCN_DBG(FM_INF | MAIN, "MCU %d\n", ret);
- }
- /* GPS clock adjust if need */
- if (priv_adv.priv_tbl.gps_dese) {
- if ((ret = priv_adv.priv_tbl.gps_dese(parm->freq, NULL)) < 0) {
- goto out;
- }
-
- WCN_DBG(FM_INF | MAIN, "GPS %d\n", ret);
- }
-#endif
- fm_op_state_set(fm, FM_STA_TUNE);
- WCN_DBG(FM_ALT | MAIN, "tuning to %d\n", parm->freq);
-
- if (fm_false == fm_low_ops.bi.setfreq(parm->freq)) {
- WCN_DBG(FM_ALT | MAIN, "FM tune failed\n");
- ret = -EPERM;
- goto out;
- }
-/* fm_low_ops.bi.mute(fm_false); */
- fm_op_state_set(fm, FM_STA_PLAY);
- out:
- FM_UNLOCK(fm_ops_lock);
- return ret;
-}
-
-
-fm_s32 fm_cqi_get(struct fm *fm, fm_s32 ch_num, fm_s8 *buf, fm_s32 buf_size)
-{
- fm_s32 ret = 0;
- fm_s32 idx = 0;
-
- FMR_ASSERT(fm_low_ops.bi.cqi_get);
- if (FM_LOCK(fm_ops_lock))
- return (-FM_ELOCK);
-
- if (fm_true == scan_stop_flag) {
- WCN_DBG(FM_NTC | MAIN, "scan flow aborted, do not get CQI\n");
- ret = -1;
- goto out;
- }
-
- if (fm_pwr_state_get(fm) != FM_PWR_RX_ON) {
- ret = -EPERM;
- goto out;
- }
-
- if (ch_num * sizeof(struct fm_cqi) > buf_size) {
- ret = -EPERM;
- goto out;
- }
-
- fm_op_state_set(fm, FM_STA_SCAN);
-
- idx = 0;
- WCN_DBG(FM_NTC | MAIN, "cqi num %d\n", ch_num);
-
- while (ch_num > 0) {
- ret =
- fm_low_ops.bi.cqi_get(buf + 16 * sizeof(struct fm_cqi) * idx,
- buf_size - 16 * sizeof(struct fm_cqi) * idx);
-
- if (ret) {
- goto out;
- }
-
- ch_num -= 16;
- idx++;
- }
-
- fm_op_state_set(fm, FM_STA_STOP);
-
- out:
- FM_UNLOCK(fm_ops_lock);
- return ret;
-}
-
-
-/* fm_is_dese_chan -- check if gived channel is a de-sense channel or not
- * @pfm - fm driver global DS
- * @freq - gived channel
- * return value: 0, not a dese chan; 1, a dese chan; else error NO.
- */
-fm_s32 fm_is_dese_chan(struct fm *pfm, fm_u16 freq)
-{
- fm_s32 ret = 0;
- FMR_ASSERT(pfm);
- if (fm_low_ops.bi.is_dese_chan) {
- if (FM_LOCK(fm_ops_lock))
- return (-FM_ELOCK);
- ret = fm_low_ops.bi.is_dese_chan(freq);
- FM_UNLOCK(fm_ops_lock);
- }
-
- return ret;
-}
-
-
-/* fm_is_dese_chan -- check if gived channel is a de-sense channel or not
- * @pfm - fm driver global DS
- * @freq - gived channel
- * return value: 0, not a dese chan; 1, a dese chan; else error NO.
- */
-fm_s32 fm_desense_check(struct fm *pfm, fm_u16 freq, fm_s32 rssi)
-{
- fm_s32 ret = 0;
- FMR_ASSERT(pfm);
- if (fm_low_ops.bi.desense_check) {
- if (FM_LOCK(fm_ops_lock))
- return (-FM_ELOCK);
- ret = fm_low_ops.bi.desense_check(freq, rssi);
- FM_UNLOCK(fm_ops_lock);
- }
-
- return ret;
-}
-
-fm_s32 fm_dump_reg(void)
-{
- fm_s32 ret = 0;
- if (fm_low_ops.bi.dumpreg) {
- if (FM_LOCK(fm_ops_lock))
- return (-FM_ELOCK);
- ret = fm_low_ops.bi.dumpreg();
- FM_UNLOCK(fm_ops_lock);
- }
- return ret;
-}
-
-/* fm_get_hw_info -- hw info: chip id, ECO version, DSP ROM version, Patch version
- * @pfm - fm driver global DS
- * @freq - target buffer
- * return value: 0, success; else error NO.
- */
-fm_s32 fm_get_hw_info(struct fm *pfm, struct fm_hw_info *req)
-{
- fm_s32 ret = 0;
-
- FMR_ASSERT(req);
-
- /* default value for all chips */
- req->chip_id = 0x000066FF;
- req->eco_ver = 0x00000000;
- req->rom_ver = 0x00000001;
- req->patch_ver = 0x00000100;
- req->reserve = 0x00000000;
-
- /* get actual chip hw info */
- if (fm_low_ops.bi.hwinfo_get) {
- if (FM_LOCK(fm_ops_lock))
- return (-FM_ELOCK);
- ret = fm_low_ops.bi.hwinfo_get(req);
- FM_UNLOCK(fm_ops_lock);
- }
-
- return ret;
-}
-
-fm_s32 fm_get_aud_info(fm_audio_info_t *data)
-{
- /* FMR_ASSERT(fm_low_ops.bi.get_aud_info); */
- if (fm_low_ops.bi.get_aud_info) {
- return fm_low_ops.bi.get_aud_info(data);
- } else {
- data->aud_path = FM_AUD_ERR;
- data->i2s_info.mode = FM_I2S_MODE_ERR;
- data->i2s_info.status = FM_I2S_STATE_ERR;
- data->i2s_info.rate = FM_I2S_SR_ERR;
- return 0;
- }
-}
-
-/* fm_get_i2s_info -- i2s info: on/off, master/slave, sample rate
- * @pfm - fm driver global DS
- * @req - target buffer
- * return value: 0, success; else error NO.
- */
-fm_s32 fm_get_i2s_info(struct fm *pfm, struct fm_i2s_info *req)
-{
- FMR_ASSERT(fm_low_ops.bi.i2s_get);
-
- return fm_low_ops.bi.i2s_get(&req->status, &req->mode, &req->rate);
-}
-
-
-fm_s32 fm_hwscan_stop(struct fm *fm)
-{
- fm_s32 ret = 0;
-
- if ((FM_STA_SCAN != fm_op_state_get(fm)) && (FM_STA_SEEK != fm_op_state_get(fm))) {
- WCN_DBG(FM_WAR | MAIN, "fm isn't on scan, no need stop\n");
- return ret;
- }
-
- FMR_ASSERT(fm_low_ops.bi.scanstop);
-
- fm_low_ops.bi.scanstop();
- fm_low_ops.bi.seekstop();
- scan_stop_flag = fm_true;
- WCN_DBG(FM_DBG | MAIN, "fm will stop scan\n");
-
- if (FM_LOCK(fm_ops_lock))
- return (-FM_ELOCK);
-
- fm_low_ops.bi.rampdown();
- fm_low_ops.bi.setfreq(fm_cur_freq_get());
-
- FM_UNLOCK(fm_ops_lock);
-
- return ret;
-}
-
-/* fm_ana_switch -- switch antenna to long/short
- * @fm - fm driver main data structure
- * @antenna - 0, long; 1, short
- * If success, return 0; else error code
- */
-fm_s32 fm_ana_switch(struct fm *fm, fm_s32 antenna)
-{
- fm_s32 ret = 0;
-
- FMR_ASSERT(fm_low_ops.bi.anaswitch);
- if (FM_LOCK(fm_ops_lock))
- return (-FM_ELOCK);
-
- WCN_DBG(FM_DBG | MAIN, "Switching ana to %s\n", antenna ? "short" : "long");
- fm->ana_type = antenna;
-
- if((FM_PWR_RX_ON == fm_pwr_state_get(fm)) || (FM_PWR_TX_ON == fm_pwr_state_get(fm)))
- {
- ret = fm_low_ops.bi.anaswitch(antenna);
- }
-
- if (ret) {
- WCN_DBG(FM_ALT | MAIN, "Switch ana Failed\n");
- } else {
- WCN_DBG(FM_DBG | MAIN, "Switch ana OK!\n");
- }
-
- FM_UNLOCK(fm_ops_lock);
- return ret;
-}
-
-/* volume?[0~15] */
-fm_s32 fm_setvol(struct fm *fm, fm_u32 vol)
-{
- fm_u8 tmp_vol;
-
- if (fm_pwr_state_get(fm) != FM_PWR_RX_ON) {
- return -EPERM;
- }
- FMR_ASSERT(fm_low_ops.bi.volset);
- if (FM_LOCK(fm_ops_lock))
- return (-FM_ELOCK);
-
- tmp_vol = (vol > 15) ? 15 : vol;
- fm_low_ops.bi.volset(tmp_vol);
- fm->vol = (fm_s32) tmp_vol;
-
- FM_UNLOCK(fm_ops_lock);
- return 0;
-}
-
-fm_s32 fm_getvol(struct fm *fm, fm_u32 *vol)
-{
- fm_u8 tmp_vol;
-
- if (fm_pwr_state_get(fm) != FM_PWR_RX_ON) {
- return -EPERM;
- }
- FMR_ASSERT(fm_low_ops.bi.volget);
- if (FM_LOCK(fm_ops_lock))
- return (-FM_ELOCK);
-
- fm_low_ops.bi.volget(&tmp_vol);
- *vol = (fm_u32) tmp_vol;
-
- FM_UNLOCK(fm_ops_lock);
- return 0;
-}
-
-fm_s32 fm_mute(struct fm *fm, fm_u32 bmute)
-{
- fm_s32 ret = 0;
-
- if (fm_pwr_state_get(fm) != FM_PWR_RX_ON) {
- ret = -EPERM;
- return ret;
- }
- FMR_ASSERT(fm_low_ops.bi.mute);
- if (FM_LOCK(fm_ops_lock))
- return (-FM_ELOCK);
-
- if (bmute) {
- ret = fm_low_ops.bi.mute(fm_true);
- fm->mute = fm_true;
- } else {
- ret = fm_low_ops.bi.mute(fm_false);
- fm->mute = fm_false;
- }
-
- FM_UNLOCK(fm_ops_lock);
- return ret;
-}
-
-fm_s32 fm_getrssi(struct fm *fm, fm_s32 *rssi)
-{
- fm_s32 ret = 0;
-
- if (fm_pwr_state_get(fm) != FM_PWR_RX_ON) {
- ret = -EPERM;
- return ret;
- }
- FMR_ASSERT(fm_low_ops.bi.rssiget);
- if (FM_LOCK(fm_ops_lock))
- return (-FM_ELOCK);
-
- ret = fm_low_ops.bi.rssiget(rssi);
-
- FM_UNLOCK(fm_ops_lock);
- return ret;
-}
-
-fm_s32 fm_reg_read(struct fm *fm, fm_u8 addr, fm_u16 *val)
-{
- fm_s32 ret = 0;
-
- FMR_ASSERT(fm_low_ops.bi.read);
- if (FM_LOCK(fm_ops_lock))
- return (-FM_ELOCK);
-
- ret = fm_low_ops.bi.read(addr, val);
-
- FM_UNLOCK(fm_ops_lock);
- return ret;
-}
-
-fm_s32 fm_reg_write(struct fm *fm, fm_u8 addr, fm_u16 val)
-{
- fm_s32 ret = 0;
-
- FMR_ASSERT(fm_low_ops.bi.write);
- if (FM_LOCK(fm_ops_lock))
- return (-FM_ELOCK);
-
- ret = fm_low_ops.bi.write(addr, val);
-
- FM_UNLOCK(fm_ops_lock);
- return ret;
-}
-
-fm_s32 fm_top_read(struct fm *fm, fm_u16 addr, fm_u32 *val)
-{
- fm_s32 ret = 0;
-
- FMR_ASSERT(fm_low_ops.bi.top_read);
- if (FM_LOCK(fm_ops_lock))
- return (-FM_ELOCK);
-
- ret = fm_low_ops.bi.top_read(addr, val);
-
- FM_UNLOCK(fm_ops_lock);
- return ret;
-}
-
-fm_s32 fm_top_write(struct fm *fm, fm_u16 addr, fm_u32 val)
-{
- fm_s32 ret = 0;
-
- FMR_ASSERT(fm_low_ops.bi.top_write);
- if (FM_LOCK(fm_ops_lock))
- return (-FM_ELOCK);
-
- ret = fm_low_ops.bi.top_write(addr, val);
-
- FM_UNLOCK(fm_ops_lock);
- return ret;
-}
-
-fm_s32 fm_host_read(struct fm *fm, fm_u32 addr, fm_u32 *val)
-{
- fm_s32 ret = 0;
-
- FMR_ASSERT(fm_low_ops.bi.host_read);
- if (FM_LOCK(fm_ops_lock))
- return (-FM_ELOCK);
-
- ret = fm_low_ops.bi.host_read(addr, val);
-
- FM_UNLOCK(fm_ops_lock);
- return ret;
-}
-
-fm_s32 fm_host_write(struct fm *fm, fm_u32 addr, fm_u32 val)
-{
- fm_s32 ret = 0;
-
- FMR_ASSERT(fm_low_ops.bi.host_write);
- if (FM_LOCK(fm_ops_lock))
- return (-FM_ELOCK);
-
- ret = fm_low_ops.bi.host_write(addr, val);
-
- FM_UNLOCK(fm_ops_lock);
- return ret;
-}
-
-fm_s32 fm_chipid_get(struct fm *fm, fm_u16 *chipid)
-{
- FMR_ASSERT(chipid);
- if (FM_LOCK(fm_ops_lock))
- return (-FM_ELOCK);
-
- *chipid = fm->chip_id;
-
- FM_UNLOCK(fm_ops_lock);
- return 0;
-}
-
-fm_s32 fm_monostereo_get(struct fm *fm, fm_u16 *ms)
-{
- fm_s32 ret = 0;
-
- FMR_ASSERT(fm_low_ops.bi.msget);
- FMR_ASSERT(ms);
- if (FM_LOCK(fm_ops_lock))
- return (-FM_ELOCK);
-
- if (fm_low_ops.bi.msget(ms) == fm_false) {
- ret = -FM_EPARA;
- }
-
- FM_UNLOCK(fm_ops_lock);
- return ret;
-}
-
-/*
- * Force set to stero/mono mode
- * @MonoStereo -- 0, auto; 1, mono
- * If success, return 0; else error code
- */
-fm_s32 fm_monostereo_set(struct fm *fm, fm_s32 ms)
-{
- fm_s32 ret = 0;
-
- FMR_ASSERT(fm_low_ops.bi.msset);
- if (FM_LOCK(fm_ops_lock))
- return (-FM_ELOCK);
-
- ret = fm_low_ops.bi.msset(ms);
-
- FM_UNLOCK(fm_ops_lock);
- return ret;
-}
-
-fm_s32 fm_pamd_get(struct fm *fm, fm_u16 *pamd)
-{
- fm_s32 ret = 0;
-
- FMR_ASSERT(fm_low_ops.bi.pamdget);
- FMR_ASSERT(pamd);
- if (FM_LOCK(fm_ops_lock))
- return (-FM_ELOCK);
-
- if (fm_low_ops.bi.pamdget(pamd) == fm_false) {
- ret = -FM_EPARA;
- }
-
- FM_UNLOCK(fm_ops_lock);
- return ret;
-}
-
-fm_s32 fm_caparray_get(struct fm *fm, fm_s32 *ca)
-{
- fm_s32 ret = 0;
-
- FMR_ASSERT(fm_low_ops.bi.caparray_get);
- FMR_ASSERT(ca);
- if (FM_LOCK(fm_ops_lock))
- return (-FM_ELOCK);
-
- ret = fm_low_ops.bi.caparray_get(ca);
-
- FM_UNLOCK(fm_ops_lock);
- return ret;
-}
-
-fm_s32 fm_em_test(struct fm *fm, fm_u16 group, fm_u16 item, fm_u32 val)
-{
- fm_s32 ret = 0;
-
- FMR_ASSERT(fm_low_ops.bi.em);
- if (FM_LOCK(fm_ops_lock))
- return (-FM_ELOCK);
-
- if (fm_false == fm_low_ops.bi.em(group, item, val)) {
- ret = -FM_EPARA;
- }
-
- FM_UNLOCK(fm_ops_lock);
- return ret;
-}
-
-fm_s32 fm_set_search_th(struct fm *fm, struct fm_search_threshold_t parm)
-{
- fm_s32 ret = 0;
-
- FMR_ASSERT(fm_low_ops.bi.set_search_th);
- if (FM_LOCK(fm_ops_lock))
- return (-FM_ELOCK);
- ret = fm_low_ops.bi.set_search_th(parm.th_type, parm.th_val, parm.reserve);
-
- FM_UNLOCK(fm_ops_lock);
- return ret;
-}
-
-fm_s32 fm_rds_tx(struct fm *fm, struct fm_rds_tx_parm *parm)
-{
- fm_s32 ret = 0;
-
- FMR_ASSERT(fm_low_ops.ri.rds_tx);
-
- if (fm_pwr_state_get(fm) != FM_PWR_TX_ON) {
- parm->err = FM_BADSTATUS;
- ret = -FM_EPARA;
- goto out;
- }
- if (parm->other_rds_cnt > 29) {
- parm->err = FM_EPARM;
- WCN_DBG(FM_ERR | MAIN, "other_rds_cnt=%d\n", parm->other_rds_cnt);
- ret = -FM_EPARA;
- goto out;
- }
-
- ret = fm_low_ops.ri.rds_tx(parm->pi, parm->ps, parm->other_rds, parm->other_rds_cnt);
- if (ret) {
- WCN_DBG(FM_ERR | MAIN, "Rds_Tx failed!\n");
- goto out;
- }
-/* fm_cxt->txcxt.rdsTxOn = true; */
-/* fm_cxt->txcxt.pi = parm->pi; */
-/* memcpy(fm_cxt->txcxt.ps, parm->ps,sizeof(parm->ps)); */
-/* memcpy(fm_cxt->txcxt.other_rds, parm->other_rds,sizeof(parm->other_rds)); */
-/* fm_cxt->txcxt.other_rds_cnt = parm->other_rds_cnt; */
- out :
- return ret;
-}
-
-fm_s32 fm_rds_onoff(struct fm *fm, fm_u16 rdson_off)
-{
- fm_s32 ret = 0;
-
- if (fm_pwr_state_get(fm) != FM_PWR_RX_ON) {
- ret = -EPERM;
- goto out;
- }
- FMR_ASSERT(fm_low_ops.ri.rds_onoff);
- if (FM_LOCK(fm_ops_lock))
- return (-FM_ELOCK);
-
- if (rdson_off) {
- fm->rds_on = fm_true;
- if (fm_low_ops.ri.rds_onoff(fm->pstRDSData, fm_true) == fm_false) {
- WCN_DBG(FM_ALT | MAIN, "FM_IOCTL_RDS_ONOFF on faield\n");
- ret = -EPERM;
- goto out;
- }
-
- fm_enable_rds_BlerCheck(fm);
- } else {
- fm->rds_on = fm_false;
- fm_disable_rds_BlerCheck();
- if (fm_low_ops.ri.rds_onoff(fm->pstRDSData, fm_false) == fm_false) {
- WCN_DBG(FM_ALT | MAIN, "FM_IOCTL_RDS_ONOFF off faield\n");
- ret = -EPERM;
- };
- }
-
- out:
- FM_UNLOCK(fm_ops_lock);
- return ret;
-}
-
-fm_s32 fm_rds_good_bc_get(struct fm *fm, fm_u16 *gbc)
-{
- fm_s32 ret = 0;
-
- FMR_ASSERT(fm_low_ops.ri.rds_gbc_get);
- FMR_ASSERT(gbc);
- if (FM_LOCK(fm_ops_lock))
- return (-FM_ELOCK);
-
- *gbc = fm_low_ops.ri.rds_gbc_get();
-
- FM_UNLOCK(fm_ops_lock);
- return ret;
-}
-
-fm_s32 fm_rds_bad_bc_get(struct fm *fm, fm_u16 *bbc)
-{
- fm_s32 ret = 0;
-
- FMR_ASSERT(fm_low_ops.ri.rds_bbc_get);
- FMR_ASSERT(bbc);
- if (FM_LOCK(fm_ops_lock))
- return (-FM_ELOCK);
-
- *bbc = fm_low_ops.ri.rds_bbc_get();
-
- FM_UNLOCK(fm_ops_lock);
- return ret;
-}
-
-fm_s32 fm_rds_bler_ratio_get(struct fm *fm, fm_u16 *bbr)
-{
- fm_s32 ret = 0;
-
- FMR_ASSERT(fm_low_ops.ri.rds_bbr_get);
- FMR_ASSERT(bbr);
- if (FM_LOCK(fm_ops_lock))
- return (-FM_ELOCK);
-
- *bbr = (fm_u16) fm_low_ops.ri.rds_bbr_get();
-
- FM_UNLOCK(fm_ops_lock);
- return ret;
-}
-
-fm_s32 fm_rds_group_cnt_get(struct fm *fm, struct rds_group_cnt_t *dst)
-{
- fm_s32 ret = 0;
-
- FMR_ASSERT(fm_low_ops.ri.rds_gc_get);
- FMR_ASSERT(dst);
- if (FM_LOCK(fm_rds_cnt))
- return (-FM_ELOCK);
-
- ret = fm_low_ops.ri.rds_gc_get(dst, fm->pstRDSData);
-
- FM_UNLOCK(fm_rds_cnt);
- return ret;
-}
-
-fm_s32 fm_rds_group_cnt_reset(struct fm *fm)
-{
- fm_s32 ret = 0;
-
- FMR_ASSERT(fm_low_ops.ri.rds_gc_reset);
- if (FM_LOCK(fm_rds_cnt))
- return (-FM_ELOCK);
-
- ret = fm_low_ops.ri.rds_gc_reset(fm->pstRDSData);
-
- FM_UNLOCK(fm_rds_cnt);
- return ret;
-}
-
-fm_s32 fm_rds_log_get(struct fm *fm, struct rds_rx_t *dst, fm_s32 *dst_len)
-{
- fm_s32 ret = 0;
-
- FMR_ASSERT(fm_low_ops.ri.rds_log_get);
- FMR_ASSERT(dst);
- FMR_ASSERT(dst_len);
- if (FM_LOCK(fm_read_lock))
- return (-FM_ELOCK);
-
- ret = fm_low_ops.ri.rds_log_get(dst, dst_len);
-
- FM_UNLOCK(fm_read_lock);
- return ret;
-}
-
-fm_s32 fm_rds_block_cnt_reset(struct fm *fm)
-{
- fm_s32 ret = 0;
-
- FMR_ASSERT(fm_low_ops.ri.rds_bc_reset);
- if (FM_LOCK(fm_ops_lock))
- return (-FM_ELOCK);
-
- ret = fm_low_ops.ri.rds_bc_reset();
-
- FM_UNLOCK(fm_ops_lock);
- return ret;
-}
-
-fm_s32 fm_i2s_set(struct fm *fm, fm_s32 onoff, fm_s32 mode, fm_s32 sample)
-{
- fm_s32 ret = 0;
-
- FMR_ASSERT(fm_low_ops.bi.i2s_set);
- if ((onoff != 0) || (onoff != 1)) {
- onoff = 0; /* default on. */
- }
- if (FM_LOCK(fm_ops_lock))
- return (-FM_ELOCK);
-
- ret = fm_low_ops.bi.i2s_set(onoff, mode, sample);
-
- FM_UNLOCK(fm_ops_lock);
- return ret;
-}
-
-/*
- * fm_tune_tx
- */
-fm_s32 fm_tune_tx(struct fm *fm, struct fm_tune_parm *parm)
-{
- fm_s32 ret = 0;
-
- FMR_ASSERT(fm_low_ops.bi.tune_tx);
-
- if (fm_pwr_state_get(fm) != FM_PWR_TX_ON) {
- parm->err = FM_BADSTATUS;
- return -EPERM;
- }
- if (FM_LOCK(fm_ops_lock))
- return (-FM_ELOCK);
-
- WCN_DBG(FM_DBG | MAIN, "%s\n", __func__);
-
- fm_op_state_set(fm, FM_STA_TUNE);
- WCN_DBG(FM_NTC | MAIN, "Tx tune to %d\n", parm->freq);
- /* tune to desired channel */
- if (fm_true != fm_low_ops.bi.tune_tx(parm->freq)) {
- parm->err = FM_TUNE_FAILED;
- WCN_DBG(FM_ALT | MAIN, "Tx tune failed\n");
- ret = -EPERM;
- }
- fm_op_state_set(fm, FM_STA_PLAY);
- FM_UNLOCK(fm_ops_lock);
-
- return ret;
-}
-
-/*
- * fm_tune
- */
-fm_s32 fm_tune(struct fm *fm, struct fm_tune_parm *parm)
-{
- fm_s32 ret = 0;
-
- FMR_ASSERT(fm_low_ops.bi.mute);
- FMR_ASSERT(fm_low_ops.bi.rampdown);
- FMR_ASSERT(fm_low_ops.bi.setfreq);
-
- if (FM_LOCK(fm_ops_lock))
- return (-FM_ELOCK);
-
- WCN_DBG(FM_DBG | MAIN, "%s\n", __func__);
-
- if (fm_pwr_state_get(fm) != FM_PWR_RX_ON) {
- parm->err = FM_BADSTATUS;
- ret = -EPERM;
- goto out;
- }
-/* fm_low_ops.bi.mute(fm_true); */
- ret = fm_low_ops.bi.rampdown();
- if (ret) {
- WCN_DBG(FM_ALT | MAIN, "FM ramp down failed\n");
- goto out;
- }
-
- if (fm_cur_freq_get() != parm->freq) {
- fm_memset(fm->pstRDSData, 0, sizeof(rds_t));
- }
-#if 0 /* (!defined(MT6620_FM)&&!defined(MT6628_FM)) */
- /* HILO side adjust if need */
- if (priv_adv.priv_tbl.hl_dese) {
- if ((ret = priv_adv.priv_tbl.hl_dese(parm->freq, NULL)) < 0) {
- goto out;
- }
-
- WCN_DBG(FM_INF | MAIN, "HILO side %d\n", ret);
- }
- /* Frequency avoid adjust if need */
- if (priv_adv.priv_tbl.fa_dese) {
- if ((ret = priv_adv.priv_tbl.fa_dese(parm->freq, NULL)) < 0) {
- goto out;
- }
-
- WCN_DBG(FM_INF | MAIN, "FA %d\n", ret);
- }
- /* MCU clock adjust if need */
- if (priv_adv.priv_tbl.mcu_dese) {
- if ((ret = priv_adv.priv_tbl.mcu_dese(parm->freq, NULL)) < 0) {
- goto out;
- }
-
- WCN_DBG(FM_INF | MAIN, "MCU %d\n", ret);
- }
- /* GPS clock adjust if need */
- if (priv_adv.priv_tbl.gps_dese) {
- if ((ret = priv_adv.priv_tbl.gps_dese(parm->freq, NULL)) < 0) {
- goto out;
- }
-
- WCN_DBG(FM_INF | MAIN, "GPS %d\n", ret);
- }
-#endif
- fm_op_state_set(fm, FM_STA_TUNE);
- WCN_DBG(FM_ALT | MAIN, "tuning to %d\n", parm->freq);
-
- if (fm_true != fm_low_ops.bi.setfreq(parm->freq)) {
- parm->err = FM_TUNE_FAILED;
- WCN_DBG(FM_ALT | MAIN, "FM tune failed\n");
- ret = -FM_EFW;
- }
- /* fm_low_ops.bi.mute(fm_false);//open for dbg */
- fm_op_state_set(fm, FM_STA_PLAY);
- out:
- FM_UNLOCK(fm_ops_lock);
- return ret;
-}
-
-/* cqi log tool entry */
-fm_s32 fm_cqi_log(void)
-{
- fm_s32 ret = 0;
- fm_u16 freq;
- FMR_ASSERT(fm_low_ops.bi.cqi_log);
- freq = fm_cur_freq_get();
- if (0 == fm_get_channel_space(freq)) {
- freq *= 10;
- }
- if ((freq != 10000) && (0xffffffff != g_dbg_level)) {
- return -FM_EPARA;
- }
- if (FM_LOCK(fm_ops_lock))
- return (-FM_ELOCK);
- ret = fm_low_ops.bi.cqi_log(8750, 10800, 2, 5);
- FM_UNLOCK(fm_ops_lock);
- return ret;
-}
-
-fm_s32 fm_pre_search(struct fm *fm)
-{
- fm_s32 ret = 0;
- FMR_ASSERT(fm_low_ops.bi.pre_search);
- if (fm_pwr_state_get(fm) != FM_PWR_RX_ON) {
- return -FM_EPARA;
- }
- if (FM_LOCK(fm_ops_lock)) {
- return (-FM_ELOCK);
- }
- ret = fm_low_ops.bi.pre_search();
- FM_UNLOCK(fm_ops_lock);
- return ret;
-}
-
-fm_s32 fm_restore_search(struct fm *fm)
-{
- fm_s32 ret = 0;
- FMR_ASSERT(fm_low_ops.bi.restore_search);
- if (fm_pwr_state_get(fm) != FM_PWR_RX_ON) {
- return -FM_EPARA;
- }
- if (FM_LOCK(fm_ops_lock)) {
- return (-FM_ELOCK);
- }
- ret = fm_low_ops.bi.restore_search();
- FM_UNLOCK(fm_ops_lock);
- return ret;
-}
-
-/*fm soft mute tune function*/
-fm_s32 fm_soft_mute_tune(struct fm *fm, struct fm_softmute_tune_t *parm)
-{
- fm_s32 ret = 0;
-
- FMR_ASSERT(fm_low_ops.bi.softmute_tune);
-
- if (FM_LOCK(fm_ops_lock))
- return (-FM_ELOCK);
-
-
- if (fm_pwr_state_get(fm) != FM_PWR_RX_ON) {
- parm->valid = fm_false;
- ret = -EPERM;
- goto out;
- }
- /* fm_low_ops.bi.mute(fm_true); */
- WCN_DBG(FM_NTC | MAIN, "+%s():[freq=%d]\n", __func__, parm->freq);
- /* fm_op_state_set(fm, FM_STA_TUNE); */
-
- if (fm_false == fm_low_ops.bi.softmute_tune(parm->freq, &parm->rssi, &parm->valid)) {
- parm->valid = fm_false;
- WCN_DBG(FM_ALT | MAIN, "sm tune failed\n");
- ret = -EPERM;
- }
-/* fm_low_ops.bi.mute(fm_false); */
- out :
- WCN_DBG(FM_NTC | MAIN, "-%s()\n", __func__);
- FM_UNLOCK(fm_ops_lock);
-
- return ret;
-}
-
-fm_s32 fm_over_bt(struct fm *fm, fm_s32 flag)
-{
- fm_s32 ret = 0;
- FMR_ASSERT(fm_low_ops.bi.fm_via_bt);
-
- if (fm_pwr_state_get(fm) != FM_PWR_RX_ON) {
- return -EPERM;
- }
- if (FM_LOCK(fm_ops_lock))
- return (-FM_ELOCK);
-
- ret = fm_low_ops.bi.fm_via_bt(flag);
- if (ret) {
- WCN_DBG(FM_ALT | MAIN, "%s(),failed!\n", __func__);
- } else {
- fm->via_bt = flag;
- }
- WCN_DBG(FM_NTC | MAIN, "%s(),[ret=%d]!\n", __func__, ret);
- FM_UNLOCK(fm_ops_lock);
- return ret;
-}
-
-fm_s32 fm_tx_support(struct fm *fm, fm_s32 *support)
-{
- if (FM_LOCK(fm_ops_lock))
- return (-FM_ELOCK);
- if (fm_low_ops.bi.tx_support) {
- fm_low_ops.bi.tx_support(support);
- } else {
- *support = 0;
- }
- WCN_DBG(FM_NTC | MAIN, "%s(),[%d]!\n", __func__, *support);
- FM_UNLOCK(fm_ops_lock);
- return 0;
-}
-
-fm_s32 fm_rdstx_support(struct fm *fm, fm_s32 *support)
-{
- if (FM_LOCK(fm_ops_lock))
- return (-FM_ELOCK);
- if (fm_low_ops.ri.rdstx_support) {
- fm_low_ops.ri.rdstx_support(support);
- } else {
- *support = 0;
- }
- WCN_DBG(FM_NTC | MAIN, "support=[%d]!\n", *support);
- FM_UNLOCK(fm_ops_lock);
- return 0;
-}
-
-/*1:on,0:off*/
-fm_s32 fm_rdstx_enable(struct fm *fm, fm_s32 enable)
-{
- fm_s32 ret = -1;
- FMR_ASSERT(fm_low_ops.ri.rds_tx_enable);
- FMR_ASSERT(fm_low_ops.ri.rds_tx_disable);
- if (fm_pwr_state_get(fm) != FM_PWR_TX_ON) {
- return -FM_EPARA;
- }
- if (FM_LOCK(fm_ops_lock))
- return (-FM_ELOCK);
- if (enable == 1) {
- ret = fm_low_ops.ri.rds_tx_enable();
- if (ret) {
- FM_LOG_ERR(MAIN, "rds_tx_enable fail=[%d]!\n", ret);
- }
- fm->rdstx_on = fm_true;
- } else {
- ret = fm_low_ops.ri.rds_tx_disable();
- if (ret) {
- FM_LOG_ERR(MAIN, "rds_tx_disable fail=[%d]!\n", ret);
- }
- fm->rdstx_on = fm_false;
- }
- FM_LOG_NTC(MAIN, "rds tx enable=[%d]!\n", enable);
- FM_UNLOCK(fm_ops_lock);
- return 0;
-}
-
-static void fm_timer_func(unsigned long data)
-{
- struct fm *fm = g_fm_struct;
-
- if (FM_LOCK(fm_timer_lock))
- return;
-
- if (fm_timer_sys->update(fm_timer_sys)) {
- WCN_DBG(FM_NTC | MAIN, "timer skip\n");
- goto out; /* fm timer is stoped before timeout */
- }
-
- if (fm != NULL) {
- WCN_DBG(FM_NTC | MAIN, "timer:rds_wk\n");
- fm->timer_wkthd->add_work(fm->timer_wkthd, fm->rds_wk);
- }
-
- out:
- FM_UNLOCK(fm_timer_lock);
-}
-
-#ifdef MT6620_FM
-static void fmtx_timer_func(unsigned long data)
-{
- struct fm *fm = g_fm_struct;
- fm_s32 vco_cycle = 1;
-
- if (FM_LOCK(fm_timer_lock))
- return;
-
- fm_timer_sys->count++;
- if (fm != NULL) {
- /* schedule tx pwr ctrl work if need */
- if (fm->txpwrctl < 1) {
- WCN_DBG(FM_WAR | MAIN, "tx power ctl time err\n");
- fm->txpwrctl = FM_TX_PWR_CTRL_INVAL_MIN;
- }
- if ((fm_timer_sys->tx_pwr_ctrl_en == FM_TX_PWR_CTRL_ENABLE)
- && (fm_timer_sys->count % fm->txpwrctl == 0)) {
- WCN_DBG(FM_NTC | MAIN, "Tx timer:fm_tx_power_ctrl_work\n");
- fm->timer_wkthd->add_work(fm->timer_wkthd, fm->fm_tx_power_ctrl_work);
- }
- /*
- //schedule tx RTC ctrl work if need
- if((timer->tx_rtc_ctrl_en == FM_TX_RTC_CTRL_ENABLE)&& (timer->count%FM_TX_RTC_CTRL_INTERVAL == 0)){
- FM_LOG_DBG(D_TIMER,"fm_tx_rtc_ctrl_work, ticks:%d\n", jiffies_to_msecs(jiffies));
- queue_work(fm->fm_timer_workqueue, &fm->fm_tx_rtc_ctrl_work);
- } */
- /* schedule tx desense with wifi/bt work if need */
- if (fm->vcooff < 1) {
- WCN_DBG(FM_WAR | MAIN, "tx vco tracking time err\n");
- fm->vcooff = FM_TX_VCO_OFF_MIN;
- }
- vco_cycle = fm->vcooff + fm->vcoon / 1000;
- if ((fm_timer_sys->tx_desense_en == FM_TX_DESENSE_ENABLE)
- && (fm_timer_sys->count % vco_cycle == 0)) {
- WCN_DBG(FM_NTC | MAIN, "Tx timer:fm_tx_desense_wifi_work\n");
- fm->timer_wkthd->add_work(fm->timer_wkthd, fm->fm_tx_desense_wifi_work);
- }
- }
- if (fm_timer_sys->update(fm_timer_sys)) {
- WCN_DBG(FM_NTC | MAIN, "timer skip\n");
- goto out; /* fm timer is stoped before timeout */
- }
-
- out:
- FM_UNLOCK(fm_timer_lock);
-}
-#endif
-static void fm_tx_power_ctrl_worker_func(unsigned long data)
-{
- fm_s32 ctrl = 0, ret = 0;
- struct fm *fm = g_fm_struct;
-
- WCN_DBG(FM_NTC | MAIN, "+%s():\n", __func__);
-
- if (fm_low_ops.bi.tx_pwr_ctrl == NULL)
- return;
- if (FM_LOCK(fm_rxtx_lock))
- return;
-
- if (fm_pwr_state_get(fm) != FM_PWR_TX_ON) {
- WCN_DBG(FM_ERR | MAIN, "FM is not on TX mode\n");
- goto out;
- }
-
- ctrl = fm->tx_pwr;
- WCN_DBG(FM_NTC | MAIN, "tx pwr %ddb\n", ctrl);
- ret = fm_low_ops.bi.tx_pwr_ctrl(fm_cur_freq_get(), &ctrl);
- if (ret) {
- WCN_DBG(FM_ERR | MAIN, "tx_pwr_ctrl fail\n");
- }
-
- out:
- FM_UNLOCK(fm_rxtx_lock);
- WCN_DBG(FM_NTC | MAIN, "-%s()\n", __func__);
- return;
-}
-
-static void fm_tx_rtc_ctrl_worker_func(unsigned long data)
-{
- fm_s32 ret = 0;
- fm_s32 ctrl = 0;
- struct fm_gps_rtc_info rtcInfo;
- /* struct timeval curTime; */
- /* struct fm *fm = (struct fm*)fm_cb; */
- unsigned long curTime = 0;
-
- WCN_DBG(FM_NTC | MAIN, "+%s():\n", __func__);
-
- if (FM_LOCK(fm_rtc_mutex))
- return;
-
- if (gps_rtc_info.flag == FM_GPS_RTC_INFO_NEW) {
- memcpy(&rtcInfo, &gps_rtc_info, sizeof(struct fm_gps_rtc_info));
- gps_rtc_info.flag = FM_GPS_RTC_INFO_OLD;
- FM_UNLOCK(fm_rtc_mutex);
- } else {
- WCN_DBG(FM_NTC | MAIN, "there's no new rtc drift info\n");
- FM_UNLOCK(fm_rtc_mutex);
- goto out;
- }
-
- if (rtcInfo.age > rtcInfo.ageThd) {
- WCN_DBG(FM_WAR | MAIN, "age over it's threshlod\n");
- goto out;
- }
- if ((rtcInfo.drift <= rtcInfo.driftThd) && (rtcInfo.drift >= -rtcInfo.driftThd)) {
- WCN_DBG(FM_WAR | MAIN, "drift over it's MIN threshlod\n");
- goto out;
- }
-
- if (rtcInfo.drift > FM_GPS_RTC_DRIFT_MAX) {
- WCN_DBG(FM_WAR | MAIN, "drift over it's +MAX threshlod\n");
- rtcInfo.drift = FM_GPS_RTC_DRIFT_MAX;
- goto out;
- } else if (rtcInfo.drift < -FM_GPS_RTC_DRIFT_MAX) {
- WCN_DBG(FM_WAR | MAIN, "drift over it's -MAX threshlod\n");
- rtcInfo.drift = -FM_GPS_RTC_DRIFT_MAX;
- goto out;
- }
- /*
- //get current time
- do_gettimeofday(&curTime);
- if((curTime.tv_sec - rtcInfo.tv.tv_sec) > rtcInfo.tvThd.tv_sec){
- FM_LOG_WAR(D_MAIN,"time diff over it's threshlod\n");
- goto out;
- } */
- curTime = jiffies;
- if (((long)curTime - (long)rtcInfo.stamp) / HZ > rtcInfo.tvThd.tv_sec) {
- WCN_DBG(FM_WAR | MAIN, "time diff over it's threshlod\n");
- goto out;
- }
- if (fm_low_ops.bi.rtc_drift_ctrl != NULL) {
- ctrl = rtcInfo.drift;
- WCN_DBG(FM_NTC | MAIN, "RTC_drift_ctrl[0x%08x]\n", ctrl);
- if ((ret = fm_low_ops.bi.rtc_drift_ctrl(fm_cur_freq_get(), &ctrl)))
- goto out;
- }
- out:
- WCN_DBG(FM_NTC | MAIN, "-%s()\n", __func__);
- return;
-}
-
-static void fm_tx_desense_wifi_worker_func(unsigned long data)
-{
- fm_s32 ret = 0;
- fm_s32 ctrl = 0;
- struct fm *fm = g_fm_struct;
-
- WCN_DBG(FM_NTC | MAIN, "+%s():\n", __func__);
-
- if (FM_LOCK(fm_rxtx_lock))
- return;
-
- if (fm_pwr_state_get(fm) != FM_PWR_TX_ON) {
- WCN_DBG(FM_ERR | MAIN, "FM is not on TX mode\n");
- goto out;
- }
-
- fm_tx_rtc_ctrl_worker_func(0);
-
- ctrl = fm->vcoon;
- if (fm_low_ops.bi.tx_desense_wifi) {
- WCN_DBG(FM_NTC | MAIN, "tx_desense_wifi[%d]\n", ctrl);
- ret = fm_low_ops.bi.tx_desense_wifi(fm_cur_freq_get(), &ctrl);
- if (ret) {
- WCN_DBG(FM_ERR | MAIN, "tx_desense_wifi fail\n");
- }
- }
- out:
- FM_UNLOCK(fm_rxtx_lock);
- WCN_DBG(FM_NTC | MAIN, "-%s()\n", __func__);
- return;
-}
-
-/*
-************************************************************************************
-Function: fm_get_gps_rtc_info()
-
-Description: get GPS RTC drift info, and this function should not block
-
-Date: 2011/04/10
-
-Return Value: success:0, failed: error coe
-************************************************************************************
-*/
-fm_s32 fm_get_gps_rtc_info(struct fm_gps_rtc_info *src)
-{
- fm_s32 ret = 0;
-/* fm_s32 retry_cnt = 0; */
- struct fm_gps_rtc_info *dst = &gps_rtc_info;
-
- FMR_ASSERT(src);
- FMR_ASSERT(dst);
-
- if (src->retryCnt > 0) {
- dst->retryCnt = src->retryCnt;
- WCN_DBG(FM_NTC | MAIN, "%s, new [retryCnt=%d]\n", __func__, dst->retryCnt);
- }
- if (src->ageThd > 0) {
- dst->ageThd = src->ageThd;
- WCN_DBG(FM_NTC | MAIN, "%s, new [ageThd=%d]\n", __func__, dst->ageThd);
- }
- if (src->driftThd > 0) {
- dst->driftThd = src->driftThd;
- WCN_DBG(FM_NTC | MAIN, "%s, new [driftThd=%d]\n", __func__, dst->driftThd);
- }
- if (src->tvThd.tv_sec > 0) {
- dst->tvThd.tv_sec = src->tvThd.tv_sec;
- WCN_DBG(FM_NTC | MAIN, "%s, new [tvThd=%d]\n", __func__,
- (fm_s32) dst->tvThd.tv_sec);
- }
- ret = fm_rtc_mutex->trylock(fm_rtc_mutex, dst->retryCnt);
- if (ret) {
- goto out;
- }
- dst->age = src->age;
- dst->drift = src->drift;
- dst->stamp = jiffies; /* get curren time stamp */
- dst->flag = FM_GPS_RTC_INFO_NEW;
-
- FM_UNLOCK(fm_rtc_mutex);
-
- /*
- //send event to info fm_tx_rtc_ctrl_work
- if(timer_sys.tx_rtc_ctrl_en == FM_TX_RTC_CTRL_ENABLE){
- FM_LOG_DBG(D_TIMER,"fm_tx_rtc_ctrl_work, ticks:%d\n", jiffies_to_msecs(jiffies));
- queue_work(fm->fm_timer_workqueue, &fm->fm_tx_rtc_ctrl_work);
- }
- */
-
- out:
- return ret;
-}
-
-static void fm_enable_rds_BlerCheck(struct fm *fm)
-{
- if (FM_LOCK(fm_timer_lock))
- return;
- fm_timer_sys->start(fm_timer_sys);
- FM_UNLOCK(fm_timer_lock);
- FM_LOG_NTC(MAIN, "enable rds timer ok\n");
-}
-
-static void fm_disable_rds_BlerCheck(void)
-{
- if (FM_LOCK(fm_timer_lock))
- return;
- fm_timer_sys->stop(fm_timer_sys);
- FM_UNLOCK(fm_timer_lock);
- FM_LOG_NTC(MAIN, "stop rds timer ok\n");
-}
-
-void fm_rds_reset_work_func(unsigned long data)
-{
- fm_s32 ret = 0;
-
- if (!fm_low_ops.ri.rds_blercheck) {
- return;
- }
- if (FM_LOCK(fm_rxtx_lock))
- return;
-
- if (FM_LOCK(fm_rds_cnt))
- return;
- ret = fm_low_ops.ri.rds_blercheck(g_fm_struct->pstRDSData);
-
- WCN_DBG(FM_NTC | MAIN, "Addr_Cnt=%x\n", g_fm_struct->pstRDSData->AF_Data.Addr_Cnt);
- if (g_fm_struct->pstRDSData->AF_Data.Addr_Cnt == 0xFF) /* check af list get,can't use event==af_list because event will clear after read rds every time */
- {
- g_fm_struct->pstRDSData->event_status |= RDS_EVENT_AF;
- }
- if (!ret && g_fm_struct->pstRDSData->event_status) {
- FM_EVENT_SEND(g_fm_struct->rds_event, FM_RDS_DATA_READY);
- }
- WCN_DBG(FM_NTC | MAIN, "rds event check=%x\n", g_fm_struct->pstRDSData->event_status);
- FM_UNLOCK(fm_rds_cnt);
- FM_UNLOCK(fm_rxtx_lock);
-}
-
-
-void fm_subsys_reset_work_func(unsigned long data)
-{
- g_dbg_level = 0xffffffff;
- if (FM_LOCK(fm_ops_lock))
- return;
-
- fm_sys_state_set(g_fm_struct, FM_SUBSYS_RST_START);
-
- if (g_fm_struct->chipon == fm_false) {
- WCN_DBG(FM_ALT | MAIN, "chip off no need do recover\n");
- goto out;
- }
-
- /* if whole chip reset, wmt will clear fm-on-flag, and firmware turn fm to off status, so no need turn fm off again */
- if (g_fm_struct->wholechiprst == fm_false) {
- fm_low_ops.bi.pwrdownseq();
- /* subsystem power off */
- if (fm_low_ops.bi.pwroff(0)) {
- WCN_DBG(FM_ALT | MAIN, "chip off fail\n");
- goto out;
- }
- }
-
- /* prepare to reset */
-
- /* wait 3s */
- /* fm_low_ops.bi.msdelay(2000); */
-
- /* subsystem power on */
- if (fm_low_ops.bi.pwron(0)) {
- WCN_DBG(FM_ALT | MAIN, "chip on fail\n");
- goto out;
- }
- /* recover context */
- if (g_fm_struct->chipon == fm_false) {
- fm_low_ops.bi.pwroff(0);
- WCN_DBG(FM_ALT | MAIN, "no need do recover\n");
- goto out;
- }
-
- if (FM_PWR_RX_ON == fm_pwr_state_get(g_fm_struct)) {
- fm_low_ops.bi.pwrupseq(&g_fm_struct->chip_id, &g_fm_struct->device_id);
- } else {
- WCN_DBG(FM_ALT | MAIN, "no need do re-powerup\n");
- goto out;
- }
-
- fm_low_ops.bi.anaswitch(g_fm_struct->ana_type);
-
- fm_low_ops.bi.setfreq(fm_cur_freq_get());
-
- fm_low_ops.bi.volset((fm_u8) g_fm_struct->vol);
-
- g_fm_struct->mute = 0;
- fm_low_ops.bi.mute(g_fm_struct->mute);
-
- if(fm_low_ops.ri.rds_bci_get)
- {
- fm_timer_sys->init(fm_timer_sys, fm_timer_func, (unsigned long)g_fm_struct, fm_low_ops.ri.rds_bci_get(), 0);
- WCN_DBG(FM_NTC | MAIN, "initial timer ok\n");
- }
- else
- {
- WCN_DBG(FM_NTC | MAIN, "initial timer fail!!!\n");
- }
-
- g_fm_struct->rds_on = 1;
- fm_low_ops.ri.rds_onoff(g_fm_struct->pstRDSData, g_fm_struct->rds_on);
-
- WCN_DBG(FM_ALT | MAIN, "recover done\n");
-
- out:
- fm_sys_state_set(g_fm_struct, FM_SUBSYS_RST_END);
- fm_sys_state_set(g_fm_struct, FM_SUBSYS_RST_OFF);
- g_fm_struct->wholechiprst = fm_true;
-
- FM_UNLOCK(fm_ops_lock);
- g_dbg_level = 0xfffffff5;
-}
-
-static void fm_eint_handler(void)
-{
- struct fm *fm = g_fm_struct;
- WCN_DBG(FM_DBG | MAIN, "intr occur, ticks:%d\n", jiffies_to_msecs(jiffies));
-
- if (fm != NULL) {
- fm->eint_wkthd->add_work(fm->eint_wkthd, fm->eint_wk);
- }
-}
-
-static fm_s32 fm_rds_parser(struct rds_rx_t *rds_raw, fm_s32 rds_size)
-{
- struct fm *fm = g_fm_struct; /* (struct fm *)work->data; */
- rds_t *pstRDSData = fm->pstRDSData;
-
- if (FM_LOCK(fm_read_lock))
- return (-FM_ELOCK);
- /* parsing RDS data */
- fm_low_ops.ri.rds_parser(pstRDSData, rds_raw, rds_size, fm_cur_freq_get);
- FM_UNLOCK(fm_read_lock);
-
- if ((pstRDSData->event_status != 0x0000) && (pstRDSData->event_status != RDS_EVENT_AF_LIST)) {
- WCN_DBG(FM_NTC | MAIN, "Notify user to read, [event:%04x]\n",
- pstRDSData->event_status);
- FM_EVENT_SEND(fm->rds_event, FM_RDS_DATA_READY);
- }
-
- return 0;
-}
-
-static void fm_eint_work_func(unsigned long data)
-{
- fm_event_parser(fm_rds_parser);
- /* re-enable eint if need */
- fm_enable_eint();
-}
-
-static fm_s32 fm_callback_register(struct fm_lowlevel_ops *ops)
-{
- FMR_ASSERT(ops);
-
- ops->cb.cur_freq_get = fm_cur_freq_get;
- ops->cb.cur_freq_set = fm_cur_freq_set;
- return 0;
-}
-
-static fm_s32 fm_callback_unregister(struct fm_lowlevel_ops *ops)
-{
- FMR_ASSERT(ops);
-
- fm_memset(&ops->cb, 0, sizeof(struct fm_callback));
- return 0;
-}
-
-
-static fm_s32 fm_para_init(struct fm *fmp)
-{
- FMR_ASSERT(fmp);
-
- fmp->band = FM_BAND_SPECIAL;
- fmp->min_freq = FM_RX_BAND_FREQ_L;
- fmp->max_freq = FM_RX_BAND_FREQ_H;
- fmp->cur_freq = 0;
-
- return 0;
-}
-
-fm_s32 fm_cust_config_setup(fm_s8 *filename)
-{
- fm_s32 ret;
-#if (defined(MT6620_FM) || defined(MT6628_FM) || defined(MT6627_FM) || defined(MT6630_FM) || defined(MT6580_FM))
-#ifdef MT6628_FM
- ret = MT6628fm_cust_config_setup(filename);
- if (ret < 0) {
- WCN_DBG(FM_ERR | MAIN, "MT6628fm_cust_config_setup failed\n");
- }
-#endif
-#ifdef MT6620_FM
- ret = MT6620fm_cust_config_setup(filename);
- if (ret < 0) {
- WCN_DBG(FM_ERR | MAIN, "MT6620fm_cust_config_setup failed\n");
- }
-#endif
-#ifdef MT6627_FM
- ret = MT6627fm_cust_config_setup(filename);
- if (ret < 0) {
- WCN_DBG(FM_ERR | MAIN, "MT6627fm_cust_config_setup failed\n");
- }
-#endif
-#ifdef MT6580_FM
- ret = MT6580fm_cust_config_setup(filename);
- if (ret < 0) {
- WCN_DBG(FM_ERR | MAIN, "MT6580fm_cust_config_setup failed\n");
- }
-#endif
-#ifdef MT6630_FM
- ret = MT6630fm_cust_config_setup(filename);
- if (ret < 0) {
- WCN_DBG(FM_ERR | MAIN, "MT6630fm_cust_config_setup failed\n");
- }
-#endif
-#else
- fm_cust_config(filename);
- if (ret < 0) {
- WCN_DBG(FM_ERR | MAIN, "fm_cust_config failed\n");
- }
-#endif
- return ret;
-}
-
-struct fm *fm_dev_init(fm_u32 arg)
-{
- fm_s32 ret = 0;
- struct fm *fm = NULL;
-
-/* if (!fm_low_ops.ri.rds_bci_get) */
-/* return NULL; */
-
-/* if (!fm_low_ops.bi.chipid_get) */
-/* return NULL; */
-
- /* alloc fm main data structure */
- if (!(fm = fm_zalloc(sizeof(struct fm)))) {
- WCN_DBG(FM_ALT | MAIN, "-ENOMEM\n");
- ret = -ENOMEM;
- goto ERR_EXIT;
- }
-
- fm->ref = 0;
- fm->chipon = fm_false;
- fm_pwr_state_set(fm, FM_PWR_OFF);
-/* fm->chip_id = fm_low_ops.bi.chipid_get(); */
- /* FM Tx */
- fm->vcoon = FM_TX_VCO_ON_DEFAULT;
- fm->vcooff = FM_TX_VCO_OFF_DEFAULT;
- fm->txpwrctl = FM_TX_PWR_CTRL_INVAL_DEFAULT;
- fm->tx_pwr = FM_TX_PWR_LEVEL_MAX;
- fm->wholechiprst = fm_true;
- gps_rtc_info.err = 0;
- gps_rtc_info.age = 0;
- gps_rtc_info.drift = 0;
- gps_rtc_info.tv.tv_sec = 0;
- gps_rtc_info.tv.tv_usec = 0;
- gps_rtc_info.ageThd = FM_GPS_RTC_AGE_TH;
- gps_rtc_info.driftThd = FM_GPS_RTC_DRIFT_TH;
- gps_rtc_info.tvThd.tv_sec = FM_GPS_RTC_TIME_DIFF_TH;
- gps_rtc_info.retryCnt = FM_GPS_RTC_RETRY_CNT;
- gps_rtc_info.flag = FM_GPS_RTC_INFO_OLD;
-
- if (!(fm->rds_event = fm_flag_event_create("fm_rds_event"))) {
- WCN_DBG(FM_ALT | MAIN, "-ENOMEM for RDS event\n");
- ret = -ENOMEM;
- goto ERR_EXIT;
- }
-
- fm_flag_event_get(fm->rds_event);
-
- /* alloc fm rds data structure */
- if (!(fm->pstRDSData = fm_zalloc(sizeof(rds_t)))) {
- WCN_DBG(FM_ALT | MAIN, "-ENOMEM for RDS\n");
- ret = -ENOMEM;
- goto ERR_EXIT;
- }
-
- g_fm_struct = fm;
-
- fm->timer_wkthd = fm_workthread_create("fm_timer_wq");
-
- if (!fm->timer_wkthd) {
- WCN_DBG(FM_ALT | MAIN, "-ENOMEM for fm_timer_wq\n");
- ret = -ENOMEM;
- goto ERR_EXIT;
- }
-
- fm_workthread_get(fm->timer_wkthd);
-
- fm->eint_wkthd = fm_workthread_create("fm_eint_wq");
-
- if (!fm->eint_wkthd) {
- WCN_DBG(FM_ALT | MAIN, "-ENOMEM for fm_eint_wq\n");
- ret = -ENOMEM;
- goto ERR_EXIT;
- }
-
- fm_workthread_get(fm->eint_wkthd);
-
- fm->eint_wk = fm_work_create("fm_eint_work");
-
- if (!fm->eint_wk) {
- WCN_DBG(FM_ALT | MAIN, "-ENOMEM for eint_wk\n");
- ret = -ENOMEM;
- goto ERR_EXIT;
- } else {
- fm_work_get(fm->eint_wk);
- fm->eint_wk->init(fm->eint_wk, fm_eint_work_func, (unsigned long)fm);
- }
-
- /* create reset work */
- fm->rst_wk = fm_work_create("fm_rst_work");
-
- if (!fm->rst_wk) {
- WCN_DBG(FM_ALT | MAIN, "-ENOMEM for rst_wk\n");
- ret = -ENOMEM;
- goto ERR_EXIT;
- } else {
- fm_work_get(fm->rst_wk);
- fm->rst_wk->init(fm->rst_wk, fm_subsys_reset_work_func, (unsigned long)fm);
- }
-
- fm->rds_wk = fm_work_create("fm_rds_work");
- if (!fm->rds_wk) {
- WCN_DBG(FM_ALT | MAIN, "-ENOMEM for rds_wk\n");
- ret = -ENOMEM;
- goto ERR_EXIT;
- } else {
- fm_work_get(fm->rds_wk);
- fm->rds_wk->init(fm->rds_wk, fm_rds_reset_work_func, (unsigned long)fm);
- }
-
- fm->fm_tx_power_ctrl_work = fm_work_create("tx_pwr_ctl_work");
- if (!fm->fm_tx_power_ctrl_work) {
- WCN_DBG(FM_ALT | MAIN, "-ENOMEM for tx_pwr_ctl_work\n");
- ret = -ENOMEM;
- goto ERR_EXIT;
- } else {
- fm_work_get(fm->fm_tx_power_ctrl_work);
- fm->fm_tx_power_ctrl_work->init(fm->fm_tx_power_ctrl_work,
- fm_tx_power_ctrl_worker_func, (unsigned long)fm);
- }
-
- fm->fm_tx_desense_wifi_work = fm_work_create("tx_desen_wifi_work");
- if (!fm->fm_tx_desense_wifi_work) {
- WCN_DBG(FM_ALT | MAIN, "-ENOMEM for tx_desen_wifi_work\n");
- ret = -ENOMEM;
- goto ERR_EXIT;
- } else {
- fm_work_get(fm->fm_tx_desense_wifi_work);
- fm->fm_tx_desense_wifi_work->init(fm->fm_tx_desense_wifi_work,
- fm_tx_desense_wifi_worker_func,
- (unsigned long)fm);
- }
-
- /* fm timer was created in fm_env_setp() */
-/* fm_timer_sys->init(fm_timer_sys, fm_timer_func, (unsigned long)g_fm_struct, fm_low_ops.ri.rds_bci_get(), 0); */
-/* fm_timer_sys->start(fm_timer_sys); */
-
- /* init customer config parameter */
- fm_cust_config_setup(NULL);
-
- fm_para_init(fm);
-
- return g_fm_struct;
-
- ERR_EXIT:
-
- if (fm->eint_wkthd) {
- ret = fm_workthread_put(fm->eint_wkthd);
-
- if (!ret)
- fm->eint_wkthd = NULL;
- }
-
- if (fm->timer_wkthd) {
- ret = fm_workthread_put(fm->timer_wkthd);
-
- if (!ret)
- fm->timer_wkthd = NULL;
- }
-
- if (fm->eint_wk) {
- ret = fm_work_put(fm->eint_wk);
-
- if (!ret)
- fm->eint_wk = NULL;
- }
-
- if (fm->rds_wk) {
- ret = fm_work_put(fm->rds_wk);
-
- if (!ret)
- fm->rds_wk = NULL;
- }
-
- if (fm->rst_wk) {
- ret = fm_work_put(fm->rst_wk);
-
- if (!ret)
- fm->rst_wk = NULL;
- }
-
- if (fm->fm_tx_desense_wifi_work) {
- ret = fm_work_put(fm->fm_tx_desense_wifi_work);
-
- if (!ret)
- fm->fm_tx_desense_wifi_work = NULL;
- }
-
- if (fm->fm_tx_power_ctrl_work) {
- ret = fm_work_put(fm->fm_tx_power_ctrl_work);
-
- if (!ret)
- fm->fm_tx_power_ctrl_work = NULL;
- }
-
- if (fm->pstRDSData) {
- fm_free(fm->pstRDSData);
- fm->pstRDSData = NULL;
- }
-
- fm_free(fm);
- g_fm_struct = NULL;
- return NULL;
-}
-
-fm_s32 fm_dev_destroy(struct fm *fm)
-{
- fm_s32 ret = 0;
-
- WCN_DBG(FM_DBG | MAIN, "%s\n", __func__);
-
- fm_timer_sys->stop(fm_timer_sys);
-
- if (fm->eint_wkthd) {
- ret = fm_workthread_put(fm->eint_wkthd);
-
- if (!ret)
- fm->eint_wkthd = NULL;
- }
-
- if (fm->timer_wkthd) {
- ret = fm_workthread_put(fm->timer_wkthd);
-
- if (!ret)
- fm->timer_wkthd = NULL;
- }
-
- if (fm->eint_wk) {
- ret = fm_work_put(fm->eint_wk);
-
- if (!ret)
- fm->eint_wk = NULL;
- }
-
- if (fm->rds_wk) {
- ret = fm_work_put(fm->rds_wk);
-
- if (!ret)
- fm->rds_wk = NULL;
- }
-
- if (fm->rst_wk) {
- ret = fm_work_put(fm->rst_wk);
-
- if (!ret)
- fm->rst_wk = NULL;
- }
-
- if (fm->pstRDSData) {
- fm_free(fm->pstRDSData);
- fm->pstRDSData = NULL;
- }
-
- if (fm->pstRDSData) {
- fm_free(fm->pstRDSData);
- fm->pstRDSData = NULL;
- }
-
- fm_flag_event_put(fm->rds_event);
-
- /* free all memory */
- if (fm) {
- fm_free(fm);
- fm = NULL;
- g_fm_struct = NULL;
- }
-
- return ret;
-}
-
-fm_s32 fm_env_setup(void)
-{
- fm_s32 ret = 0;
-
- WCN_DBG(FM_NTC | MAIN, "%s\n", __func__);
-#if (defined(MT6620_FM) || defined(MT6628_FM) || defined(MT6627_FM) || defined(MT6580_FM) || defined(MT6630_FM))
-#ifdef MT6620_FM
- /* register call back functions */
- ret = fm_callback_register(&MT6620fm_low_ops);
- if (ret) {
- return ret;
- }
- WCN_DBG(FM_NTC | MAIN, "1. fm callback registered\n");
- /* get low level functions */
- ret = MT6620fm_low_ops_register(&MT6620fm_low_ops);
- if (ret) {
- return ret;
- }
- WCN_DBG(FM_NTC | MAIN, "2. fm low ops registered\n");
- /* get rds level functions */
- ret = MT6620fm_rds_ops_register(&MT6620fm_low_ops);
- if (ret) {
- return ret;
- }
- WCN_DBG(FM_NTC | MAIN, "3. fm rds ops registered\n");
-#endif
-#ifdef MT6628_FM
- /* register call back functions */
- ret = fm_callback_register(&MT6628fm_low_ops);
- if (ret) {
- return ret;
- }
- WCN_DBG(FM_NTC | MAIN, "1. fm callback registered\n");
- /* get low level functions */
- ret = MT6628fm_low_ops_register(&MT6628fm_low_ops);
- if (ret) {
- return ret;
- }
- WCN_DBG(FM_NTC | MAIN, "2. fm low ops registered\n");
- /* get rds level functions */
- ret = MT6628fm_rds_ops_register(&MT6628fm_low_ops);
- if (ret) {
- return ret;
- }
- WCN_DBG(FM_NTC | MAIN, "3. fm rds ops registered\n");
-#endif
-#ifdef MT6627_FM
- /* register call back functions */
- ret = fm_callback_register(&MT6627fm_low_ops);
- if (ret) {
- return ret;
- }
- WCN_DBG(FM_NTC | MAIN, "1. fm callback registered\n");
- /* get low level functions */
- ret = MT6627fm_low_ops_register(&MT6627fm_low_ops);
- if (ret) {
- return ret;
- }
- WCN_DBG(FM_NTC | MAIN, "2. fm low ops registered\n");
- /* get rds level functions */
- ret = MT6627fm_rds_ops_register(&MT6627fm_low_ops);
- if (ret) {
- return ret;
- }
- WCN_DBG(FM_NTC | MAIN, "3. fm rds ops registered\n");
-#endif
-#ifdef MT6580_FM
- /* register call back functions */
- ret = fm_callback_register(&MT6580fm_low_ops);
- if (ret) {
- return ret;
- }
- WCN_DBG(FM_NTC | MAIN, "1. fm callback registered\n");
- /* get low level functions */
- ret = MT6580fm_low_ops_register(&MT6580fm_low_ops);
- if (ret) {
- return ret;
- }
- WCN_DBG(FM_NTC | MAIN, "2. fm low ops registered\n");
- /* get rds level functions */
- ret = MT6580fm_rds_ops_register(&MT6580fm_low_ops);
- if (ret) {
- return ret;
- }
- WCN_DBG(FM_NTC | MAIN, "3. fm rds ops registered\n");
-#endif
-#ifdef MT6630_FM
- /* register call back functions */
- ret = fm_callback_register(&MT6630fm_low_ops);
- if (ret) {
- return ret;
- }
- WCN_DBG(FM_NTC | MAIN, "1. fm callback registered\n");
- /* get low level functions */
- ret = MT6630fm_low_ops_register(&MT6630fm_low_ops);
- if (ret) {
- return ret;
- }
- WCN_DBG(FM_NTC | MAIN, "2. fm low ops registered\n");
- /* get rds level functions */
- ret = MT6630fm_rds_ops_register(&MT6630fm_low_ops);
- if (ret) {
- return ret;
- }
- WCN_DBG(FM_NTC | MAIN, "3. fm rds ops registered\n");
-#endif
-#else
- /* register call back functions */
- ret = fm_callback_register(&fm_low_ops);
- if (ret) {
- return ret;
- }
- WCN_DBG(FM_NTC | MAIN, "1. fm callback registered\n");
- /* get low level functions */
- ret = fm_low_ops_register(&fm_low_ops);
-
- if (ret) {
- return ret;
- }
-
- WCN_DBG(FM_NTC | MAIN, "2. fm low ops registered\n");
- /* get rds level functions */
- ret = fm_rds_ops_register(&fm_low_ops);
-
- if (ret) {
- return ret;
- }
- WCN_DBG(FM_NTC | MAIN, "3. fm rds ops registered\n");
-#endif
-
- fm_ops_lock = fm_lock_create("ops_lock");
-
- if (!fm_ops_lock) {
- return -1;
- }
-
- fm_read_lock = fm_lock_create("rds_read");
-
- if (!fm_read_lock) {
- return -1;
- }
-
- fm_rds_cnt = fm_lock_create("rds_cnt");
-
- if (!fm_rds_cnt) {
- return -1;
- }
-
- fm_timer_lock = fm_spin_lock_create("timer_lock");
-
- if (!fm_timer_lock) {
- return -1;
- }
- fm_rxtx_lock = fm_lock_create("rxtx_lock");
- if (!fm_rxtx_lock) {
- return -1;
- }
- fm_rtc_mutex = fm_lock_create("rxtx_lock");
- if (!fm_rxtx_lock) {
- return -1;
- }
-
- fm_lock_get(fm_ops_lock);
- fm_lock_get(fm_read_lock);
- fm_lock_get(fm_rds_cnt);
- fm_spin_lock_get(fm_timer_lock);
- fm_lock_get(fm_rxtx_lock);
- WCN_DBG(FM_NTC | MAIN, "4. fm locks created\n");
-
- fm_timer_sys = fm_timer_create("fm_sys_timer");
-
- if (!fm_timer_sys) {
- return -1;
- }
-
- fm_timer_get(fm_timer_sys);
- WCN_DBG(FM_NTC | MAIN, "5. fm timer created\n");
-
- ret = fm_link_setup((void *)fm_wholechip_rst_cb);
-
- if (ret) {
- WCN_DBG(FM_ERR | MAIN, "fm link setup Failed\n");
- return -1;
- }
-
- return ret;
-}
-
-fm_s32 fm_env_destroy(void)
-{
- fm_s32 ret = 0;
-
- WCN_DBG(FM_NTC | MAIN, "%s\n", __func__);
-
- fm_link_release();
-
-#if (defined(MT6620_FM) || defined(MT6628_FM) || defined(MT6627_FM) || defined(MT6580_FM) || defined(MT6630_FM))
-#if defined(MT6620_FM)
- /* register call back functions */
- ret = fm_callback_unregister(&MT6620fm_low_ops);
-
- if (ret) {
- return -1;
- }
- /* put low level functions */
- ret = MT6620fm_low_ops_unregister(&MT6620fm_low_ops);
-
- if (ret) {
- return -1;
- }
- /* put rds func */
- ret = MT6620fm_rds_ops_unregister(&MT6620fm_low_ops);
-
- if (ret) {
- return -1;
- }
-#endif
-#if defined(MT6628_FM)
- /* register call back functions */
- ret = fm_callback_unregister(&MT6628fm_low_ops);
-
- if (ret) {
- return -1;
- }
- /* put low level functions */
- ret = MT6628fm_low_ops_unregister(&MT6628fm_low_ops);
-
- if (ret) {
- return -1;
- }
- /* put rds func */
- ret = MT6628fm_rds_ops_unregister(&MT6628fm_low_ops);
-
- if (ret) {
- return -1;
- }
-#endif
-#if defined(MT6627_FM)
- /* register call back functions */
- ret = fm_callback_unregister(&MT6627fm_low_ops);
-
- if (ret) {
- return -1;
- }
- /* put low level functions */
- ret = MT6627fm_low_ops_unregister(&MT6627fm_low_ops);
-
- if (ret) {
- return -1;
- }
- /* put rds func */
- ret = MT6627fm_rds_ops_unregister(&MT6627fm_low_ops);
-
- if (ret) {
- return -1;
- }
-#endif
-#if defined(MT6580_FM)
- /* register call back functions */
- ret = fm_callback_unregister(&MT6580fm_low_ops);
-
- if (ret) {
- return -1;
- }
- /* put low level functions */
- ret = MT6580fm_low_ops_unregister(&MT6580fm_low_ops);
-
- if (ret) {
- return -1;
- }
- /* put rds func */
- ret = MT6580fm_rds_ops_unregister(&MT6580fm_low_ops);
-
- if (ret) {
- return -1;
- }
-#endif
-#if defined(MT6630_FM)
- /* register call back functions */
- ret = fm_callback_unregister(&MT6630fm_low_ops);
-
- if (ret) {
- return -1;
- }
- /* put low level functions */
- ret = MT6630fm_low_ops_unregister(&MT6630fm_low_ops);
-
- if (ret) {
- return -1;
- }
- /* put rds func */
- ret = MT6630fm_rds_ops_unregister(&MT6630fm_low_ops);
-
- if (ret) {
- return -1;
- }
-#endif
-#else
- /* register call back functions */
- ret = fm_callback_unregister(&fm_low_ops);
-
- if (ret) {
- return -1;
- }
- /* put low level functions */
- ret = fm_low_ops_unregister(&fm_low_ops);
-
- if (ret) {
- return -1;
- }
- /* put rds func */
- ret = fm_rds_ops_unregister(&fm_low_ops);
-
- if (ret) {
- return -1;
- }
-#endif
- ret = fm_lock_put(fm_ops_lock);
-
- if (!ret)
- fm_ops_lock = NULL;
-
- ret = fm_lock_put(fm_read_lock);
-
- if (!ret)
- fm_read_lock = NULL;
-
- ret = fm_lock_put(fm_rds_cnt);
-
- if (!ret)
- fm_rds_cnt = NULL;
- ret = fm_spin_lock_put(fm_timer_lock);
-
- if (!ret)
- fm_timer_lock = NULL;
-
- ret = fm_timer_put(fm_timer_sys);
-
- if (!ret)
- fm_timer_sys = NULL;
-
- return ret;
-}
-
-/*
- * GetChannelSpace - get the spcace of gived channel
- * @freq - value in 760~1080 or 7600~10800
- *
- * Return 0, if 760~1080; return 1, if 7600 ~ 10800, else err code < 0
- */
-fm_s32 fm_get_channel_space(fm_s32 freq)
-{
- if ((freq >= 640) && (freq <= 1080)) {
- return 0;
- } else if ((freq >= 6400) && (freq <= 10800)) {
- return 1;
- } else {
- return -1;
- }
-}
diff --git a/drivers/misc/mediatek/fmradio/core/fm_module.c b/drivers/misc/mediatek/fmradio/core/fm_module.c
deleted file mode 100644
index 676dd839a..000000000
--- a/drivers/misc/mediatek/fmradio/core/fm_module.c
+++ /dev/null
@@ -1,1633 +0,0 @@
-/* fm_module.c
- *
- * (C) Copyright 2011
- * MediaTek <www.MediaTek.com>
- * Hongcheng <hongcheng.xia@MediaTek.com>
- *
- * FM Radio Driver -- main functions
- *
- * 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.
- *
- * 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.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- */
-#include <linux/kernel.h>
-#include <linux/init.h>
-#include <linux/module.h>
-#include <linux/platform_device.h>
-#include <linux/device.h>
-#include <linux/fs.h>
-#include <linux/proc_fs.h>
-#include <linux/cdev.h>
-#include <linux/interrupt.h>
-#include <asm/uaccess.h>
-#include <linux/sched.h>
-#include <linux/delay.h> /* udelay() */
-
-#include "fm_config.h"
-#include "fm_main.h"
-#include "fm_ioctl.h"
-
-#define FM_PROC_FILE "fm"
-
-fm_u32 g_dbg_level = 0xfffffff5; /* Debug level of FM */
-
-/* fm main data structure */
-static struct fm *g_fm;
-/* proc file entry */
-static struct proc_dir_entry *g_fm_proc;
-
-/* char device interface */
-static fm_s32 fm_cdev_setup(struct fm *fm);
-static fm_s32 fm_cdev_destroy(struct fm *fm);
-
-static long fm_ops_ioctl(struct file *filp, fm_u32 cmd, unsigned long arg);
-#ifdef CONFIG_COMPAT
-static long fm_ops_compat_ioctl(struct file * filp,fm_u32 cmd,unsigned long arg);
-#endif
-static loff_t fm_ops_lseek(struct file *filp, loff_t off, fm_s32 whence);
-static ssize_t fm_ops_read(struct file *filp, char *buf, size_t len, loff_t *off);
-static fm_s32 fm_ops_open(struct inode *inode, struct file *filp);
-static fm_s32 fm_ops_release(struct inode *inode, struct file *filp);
-static fm_s32 fm_ops_flush(struct file *filp, fl_owner_t Id);
-static struct file_operations fm_ops = {
- .owner = THIS_MODULE,
- .unlocked_ioctl = fm_ops_ioctl,
-#ifdef CONFIG_COMPAT
- .compat_ioctl = fm_ops_compat_ioctl,
-#endif
- .llseek = fm_ops_lseek,
- .read = fm_ops_read,
- .open = fm_ops_open,
- .release = fm_ops_release,
- .flush = fm_ops_flush,
-};
-
-/* static fm_s32 fm_proc_read(char *page, char **start, off_t off, fm_s32 count, fm_s32 *eof, void *data); */
-static ssize_t fm_proc_read(struct file *file, char __user *buf, size_t count, loff_t *ppos);
-static ssize_t fm_proc_write(struct file *file, const char *buffer, size_t count, loff_t *ppos);
-
-static struct file_operations fm_proc_ops = {
- .owner = THIS_MODULE,
- .read = fm_proc_read,
- .write = fm_proc_write,
-};
-
-static struct fm_scan_t parm = {
- .sr_size = 0,
- .sr.ch_rssi_buf = NULL,
-};
-
-#ifdef CONFIG_COMPAT
-static long fm_ops_compat_ioctl(struct file *filp, fm_u32 cmd, unsigned long arg)
-{
- long ret;
-
- WCN_DBG(FM_NTC | MAIN, "COMPAT %s---pid(%d)---cmd(0x%08x)---arg(0x%08x)\n", current->comm,
- current->pid, cmd, (fm_u32) arg);
-
- if(!filp->f_op || !filp->f_op->unlocked_ioctl)
- return -ENOTTY;
- switch (cmd) {
- case COMPAT_FM_IOCTL_GET_AUDIO_INFO: {
- ret = filp->f_op->unlocked_ioctl(filp, FM_IOCTL_GET_AUDIO_INFO, arg);
- break;
- }
- default:
- ret = filp->f_op->unlocked_ioctl(filp, cmd, arg);
- break;
- }
-
- return ret;
-}
-#endif
-
-static long fm_ops_ioctl(struct file *filp, fm_u32 cmd, unsigned long arg)
-{
- fm_s32 ret = 0;
- struct fm_platform *plat =
- container_of(filp->f_dentry->d_inode->i_cdev, struct fm_platform, cdev);
- struct fm *fm = container_of(plat, struct fm, platform);
-
- WCN_DBG(FM_NTC | MAIN, "%s---pid(%d)---cmd(0x%08x)---arg(0x%08x)\n", current->comm,
- current->pid, cmd, (fm_u32) arg);
-
- if (fm_sys_state_get(fm) != FM_SUBSYS_RST_OFF) {
- WCN_DBG(FM_ALT | MAIN, "FM subsys is resetting, retry later\n");
- ret = -FM_ESRST;
- return ret;
- }
-
- switch (cmd) {
- case FM_IOCTL_POWERUP:{
- struct fm_tune_parm parm;
- WCN_DBG(FM_NTC | MAIN, "FM_IOCTL_POWERUP:0\n");
-
- if (copy_from_user(&parm, (void *)arg, sizeof(struct fm_tune_parm))) {
- ret = -EFAULT;
- goto out;
- }
-
- ret = fm_powerup(fm, &parm);
- if (ret < 0)
- goto out;
- ret = fm_tune(fm, &parm);
- if (ret < 0)
- goto out;
-
- if (copy_to_user((void *)arg, &parm, sizeof(struct fm_tune_parm))) {
- ret = -EFAULT;
- goto out;
- }
- WCN_DBG(FM_NTC | MAIN, "FM_IOCTL_POWERUP:1\n");
-
- break;
- }
-
- case FM_IOCTL_POWERDOWN:{
- int powerdwn_type = 0;
- WCN_DBG(FM_NTC | MAIN, "FM_IOCTL_POWERDOWN:0\n");
-
- if (copy_from_user(&powerdwn_type, (void *)arg, sizeof(int))) {
- ret = -EFAULT;
- goto out;
- }
-
- ret = fm_powerdown(fm, powerdwn_type); /* 0: RX 1: TX */
- WCN_DBG(FM_NTC | MAIN, "FM_IOCTL_POWERDOWN:1\n");
- break;
- }
-
- case FM_IOCTL_TUNE:{
- struct fm_tune_parm parm;
- WCN_DBG(FM_NTC | MAIN, "FM_IOCTL_TUNE:0\n");
-
- if (copy_from_user(&parm, (void *)arg, sizeof(struct fm_tune_parm))) {
- ret = -EFAULT;
- goto out;
- }
-
- ret = fm_tune(fm, &parm);
- if (ret < 0) {
- goto out;
- }
-
- if (copy_to_user((void *)arg, &parm, sizeof(struct fm_tune_parm))) {
- ret = -EFAULT;
- goto out;
- }
-
- WCN_DBG(FM_NTC | MAIN, "FM_IOCTL_TUNE:1\n");
- break;
- }
-
- case FM_IOCTL_SOFT_MUTE_TUNE:
- {
- struct fm_softmute_tune_t parm;
- fm_cqi_log(); /* cqi log tool */
- WCN_DBG(FM_NTC | MAIN, "......FM_IOCTL_SOFT_MUTE_TUNE......\n");
- if (copy_from_user(&parm, (void *)arg, sizeof(struct fm_softmute_tune_t))) {
- ret = -EFAULT;
- goto out;
- }
-
- ret = fm_soft_mute_tune(fm, &parm);
- if (ret < 0) {
- goto out;
- }
-
- if (copy_to_user((void *)arg, &parm, sizeof(struct fm_softmute_tune_t))) {
- ret = -EFAULT;
- goto out;
- }
- break;
- }
- case FM_IOCTL_PRE_SEARCH:
- {
- ret = fm_pre_search(fm);
- break;
- }
- case FM_IOCTL_RESTORE_SEARCH:
- {
- ret = fm_restore_search(fm);
- break;
- }
- case FM_IOCTL_SEEK:{
- struct fm_seek_parm parm;
- WCN_DBG(FM_NTC | MAIN, "FM_IOCTL_SEEK:0\n");
-
- if (copy_from_user(&parm, (void *)arg, sizeof(struct fm_seek_parm))) {
- ret = -EFAULT;
- goto out;
- }
-
- ret = fm_seek(fm, &parm);
- if (ret < 0) {
- goto out;
- }
-
- if (copy_to_user((void *)arg, &parm, sizeof(struct fm_seek_parm))) {
- ret = -EFAULT;
- goto out;
- }
- WCN_DBG(FM_NTC | MAIN, "FM_IOCTL_SEEK:1\n");
- break;
- }
-
- case FM_IOCTL_SCAN:{
- struct fm_scan_parm parm;
- WCN_DBG(FM_NTC | MAIN, "FM_IOCTL_SCAN start\n");
-
- if (copy_from_user(&parm, (void *)arg, sizeof(struct fm_scan_parm))) {
- WCN_DBG(FM_ALT | MAIN, "copy_from_user failed\n");
- ret = -EFAULT;
- goto out;
- }
-
- ret = fm_scan(fm, &parm);
- if (ret < 0)
- goto out;
-
- if (copy_to_user((void *)arg, &parm, sizeof(struct fm_scan_parm))) {
- ret = -EFAULT;
- goto out;
- }
-
- WCN_DBG(FM_NTC | MAIN, "FM_IOCTL_SCAN end\n");
- break;
- }
-
- case FM_IOCTL_TUNE_NEW:{
- struct fm_tune_t tune_tmp;
-
- WCN_DBG(FM_NTC | MAIN, "FM_IOCTL_TUNE_NEW\n");
-
- if (copy_from_user(&tune_tmp, (void *)arg, sizeof(struct fm_tune_t))) {
- WCN_DBG(FM_ERR | MAIN, "tune new copy_from_user error\n");
- ret = -EFAULT;
- goto out;
- }
-
- ret = fm_tune_new(fm, &tune_tmp);
- if (ret < 0) {
- goto out;
- }
-
- if (copy_to_user((void *)arg, &tune_tmp, sizeof(struct fm_tune_t))) {
- WCN_DBG(FM_ERR | MAIN, "tune new copy_to_user error\n");
- ret = -EFAULT;
- goto out;
- }
-
- break;
- }
-
- case FM_IOCTL_SEEK_NEW:{
- struct fm_seek_t seek_tmp;
-
- WCN_DBG(FM_NTC | MAIN, "FM_IOCTL_SEEK_NEW\n");
-
- if (copy_from_user(&seek_tmp, (void *)arg, sizeof(struct fm_seek_t))) {
- WCN_DBG(FM_ERR | MAIN, "seek new copy_from_user error\n");
- ret = -EFAULT;
- goto out;
- }
-
- ret = fm_seek_new(fm, &seek_tmp);
- if (ret < 0) {
- goto out;
- }
-
- if (copy_to_user((void *)arg, &seek_tmp, sizeof(struct fm_seek_t))) {
- WCN_DBG(FM_ERR | MAIN, "seek new copy_to_user error\n");
- ret = -EFAULT;
- goto out;
- }
-
- break;
- }
-
- case FM_IOCTL_SCAN_NEW:{
- struct fm_scan_t tmp;
-
- WCN_DBG(FM_NTC | MAIN, "FM_IOCTL_SCAN_NEW\n");
-
- if (copy_from_user(&tmp, (void *)arg, sizeof(struct fm_scan_t))) {
- WCN_DBG(FM_ERR | MAIN, "copy_from_user error\n");
- ret = -EFAULT;
- goto out;
- }
-
- switch (tmp.cmd) {
- case FM_SCAN_CMD_START:
- if ((tmp.upper > 10800) || (tmp.lower < 7600) || (tmp.space < 5)
- || (tmp.space > 20)) {
- WCN_DBG(FM_ERR | MAIN, "scan para error\n");
- ret = -EFAULT;
- goto out;
- }
- parm.cmd = tmp.cmd;
- parm.lower = tmp.lower;
- parm.upper = tmp.upper;
- parm.space = tmp.space;
-
- ret = fm_scan_new(fm, &parm);
- if (ret < 0) {
- goto out;
- }
- break;
-
- case FM_SCAN_CMD_GET_CH_RSSI:
- if (parm.sr_size && parm.sr.ch_rssi_buf) {
- if (copy_to_user
- (tmp.sr.ch_rssi_buf, parm.sr.ch_rssi_buf,
- parm.num * sizeof(struct fm_ch_rssi))) {
- WCN_DBG(FM_ERR | MAIN, "scan copy_to_user err\n");
- ret = -EFAULT;
- goto out;
- }
- }
- break;
-
- default:
- break;
- }
-
- tmp.num = parm.num;
- if (copy_to_user((void *)arg, &tmp, sizeof(struct fm_scan_t))) {
- WCN_DBG(FM_ERR | MAIN, "copy_to_user error\n");
- ret = -EFAULT;
- goto out;
- }
- break;
- }
-
- case FM_IOCTL_CQI_GET:{
- struct fm_cqi_req cqi_req;
- fm_s8 *buf = NULL;
- fm_s32 tmp;
-
- WCN_DBG(FM_DBG | MAIN, "FM_IOCTL_CQI_GET\n");
-
- if (copy_from_user(&cqi_req, (void *)arg, sizeof(struct fm_cqi_req))) {
- WCN_DBG(FM_ALT | MAIN, "copy_from_user failed\n");
- ret = -EFAULT;
- goto out;
- }
-
- if ((cqi_req.ch_num * sizeof(struct fm_cqi) > cqi_req.buf_size)
- || !cqi_req.cqi_buf) {
- ret = -FM_EPARA;
- goto out;
- }
-
- tmp = cqi_req.ch_num / 16 + ((cqi_req.ch_num % 16) ? 1 : 0);
- tmp = tmp * 16 * sizeof(struct fm_cqi);
- buf = fm_zalloc(tmp);
-
- if (!buf) {
- ret = -FM_ENOMEM;
- goto out;
- }
-
- ret = fm_cqi_get(fm, cqi_req.ch_num, buf, tmp);
-
- if (ret) {
- fm_free(buf);
- WCN_DBG(FM_ALT | MAIN, "get cqi failed\n");
- goto out;
- }
-
- if (copy_to_user
- ((void *)cqi_req.cqi_buf, buf,
- cqi_req.ch_num * sizeof(struct fm_cqi))) {
- fm_free(buf);
- ret = -EFAULT;
- goto out;
- }
-
- fm_free(buf);
- break;
- }
-
- case FM_IOCTL_GET_HW_INFO:{
- struct fm_hw_info info;
-
- WCN_DBG(FM_NTC | MAIN, "FM_IOCTL_GET_HW_INFO\n");
-
- ret = fm_get_hw_info(fm, &info);
-
- if (ret) {
- WCN_DBG(FM_ALT | MAIN, "get hw info failed\n");
- goto out;
- }
-
- if (copy_to_user((void *)arg, &info, sizeof(struct fm_hw_info))) {
- ret = -EFAULT;
- goto out;
- }
-
- break;
- }
-
- case FM_IOCTL_GET_I2S_INFO:{
- struct fm_i2s_info i2sinfo;
-
- WCN_DBG(FM_NTC | MAIN, "FM_IOCTL_GET_I2S_INFO\n");
-
- ret = fm_get_i2s_info(fm, &i2sinfo);
-
- if (ret) {
- WCN_DBG(FM_ALT | MAIN, "get i2s info failed\n");
- goto out;
- }
-
- if (copy_to_user((void *)arg, &i2sinfo, sizeof(struct fm_i2s_info))) {
- ret = -EFAULT;
- goto out;
- }
-
- break;
- }
-
- case FM_IOCTL_SETVOL:{
- fm_u32 vol;
-
- WCN_DBG(FM_NTC | MAIN, "FM_IOCTL_SETVOL start\n");
- if (copy_from_user(&vol, (void *)arg, sizeof(fm_u32))) {
- WCN_DBG(FM_ALT | MAIN, "copy_from_user failed\n");
- ret = -EFAULT;
- goto out;
- }
-
- ret = fm_setvol(fm, vol);
- WCN_DBG(FM_NTC | MAIN, "FM_IOCTL_SETVOL end:%d\n", vol);
- break;
- }
- case FM_IOCTL_GETVOL:{
- fm_u32 vol;
- WCN_DBG(FM_NTC | MAIN, "FM_IOCTL_GETVOL start\n");
- ret = fm_getvol(fm, &vol);
- if (ret < 0)
- goto out;
-
- if (copy_to_user((void *)arg, &vol, sizeof(fm_u32))) {
- ret = -EFAULT;
- goto out;
- }
-
- WCN_DBG(FM_NTC | MAIN, "FM_IOCTL_GETVOL end=%d\n", vol);
- break;
- }
-
- case FM_IOCTL_MUTE:{
- fm_u32 bmute;
-
- WCN_DBG(FM_NTC | MAIN, "FM_IOCTL_MUTE start\n");
- if (copy_from_user(&bmute, (void *)arg, sizeof(fm_u32))) {
- ret = -EFAULT;
- goto out;
- }
-
- ret = fm_mute(fm, bmute);
- WCN_DBG(FM_NTC | MAIN, "FM_IOCTL_MUTE end-%d\n", bmute);
- break;
- }
-
- case FM_IOCTL_GETRSSI:{
- fm_s32 rssi = 0;
-
- ret = fm_getrssi(fm, &rssi);
- if (ret < 0)
- goto out;
-
- if (copy_to_user((void *)arg, &rssi, sizeof(fm_s32))) {
- ret = -EFAULT;
- goto out;
- }
-
- WCN_DBG(FM_NTC | MAIN, "FM_IOCTL_GETRSSI:%d\n", rssi);
- break;
- }
-
- case FM_IOCTL_RW_REG:{
- struct fm_ctl_parm parm_ctl;
- WCN_DBG(FM_DBG | MAIN, "FM_IOCTL_RW_REG\n");
-
- if (copy_from_user(&parm_ctl, (void *)arg, sizeof(struct fm_ctl_parm))) {
- ret = -EFAULT;
- goto out;
- }
-
- if (parm_ctl.rw_flag == 0) {
- ret = fm_reg_write(fm, parm_ctl.addr, parm_ctl.val);
- } else {
- ret = fm_reg_read(fm, parm_ctl.addr, &parm_ctl.val);
- }
- if (ret < 0)
- goto out;
-
- if ((parm_ctl.rw_flag == 0x01) && (!ret)) {
- if (copy_to_user
- ((void *)arg, &parm_ctl, sizeof(struct fm_ctl_parm))) {
- ret = -EFAULT;
- goto out;
- }
- }
-
- break;
- }
- case FM_IOCTL_TOP_RDWR:
- {
- struct fm_top_rw_parm parm_ctl;
- WCN_DBG(FM_DBG | MAIN, "FM_IOCTL_TOP_RDWR\n");
-
- if (copy_from_user(&parm_ctl, (void *)arg, sizeof(struct fm_top_rw_parm))) {
- ret = -EFAULT;
- goto out;
- }
-
- if (parm_ctl.rw_flag == 0) {
- ret = fm_top_write(fm, parm_ctl.addr, parm_ctl.val);
- } else {
- ret = fm_top_read(fm, parm_ctl.addr, &parm_ctl.val);
- }
- if (ret < 0)
- goto out;
-
- if ((parm_ctl.rw_flag == 0x01) && (!ret)) {
- if (copy_to_user
- ((void *)arg, &parm_ctl, sizeof(struct fm_top_rw_parm))) {
- ret = -EFAULT;
- goto out;
- }
- }
-
- break;
- }
- case FM_IOCTL_HOST_RDWR:
- {
- struct fm_host_rw_parm parm_ctl;
- WCN_DBG(FM_DBG | MAIN, "FM_IOCTL_TOP_RDWR\n");
-
- if (copy_from_user(&parm_ctl, (void *)arg, sizeof(struct fm_host_rw_parm))) {
- ret = -EFAULT;
- goto out;
- }
-
- if (parm_ctl.rw_flag == 0) {
- ret = fm_host_write(fm, parm_ctl.addr, parm_ctl.val);
- } else {
- ret = fm_host_read(fm, parm_ctl.addr, &parm_ctl.val);
- }
- if (ret < 0)
- goto out;
-
- if ((parm_ctl.rw_flag == 0x01) && (!ret)) {
- if (copy_to_user
- ((void *)arg, &parm_ctl, sizeof(struct fm_host_rw_parm))) {
- ret = -EFAULT;
- goto out;
- }
- }
-
- break;
- }
-
- case FM_IOCTL_GETCHIPID:{
- fm_u16 chipid;
-
- ret = fm_chipid_get(fm, &chipid);
- WCN_DBG(FM_DBG | MAIN, "FM_IOCTL_GETCHIPID:%04x\n", chipid);
- if (ret < 0)
- goto out;
-
- if (copy_to_user((void *)arg, &chipid, sizeof(fm_u16))) {
- ret = -EFAULT;
- goto out;
- }
- break;
- }
-
- case FM_IOCTL_GETMONOSTERO:{
- fm_u16 usStereoMono;
-
- ret = fm_monostereo_get(fm, &usStereoMono);
- WCN_DBG(FM_DBG | MAIN, "FM_IOCTL_GETMONOSTERO:%04x\n", usStereoMono);
- if (ret < 0)
- goto out;
-
- if (copy_to_user((void *)arg, &usStereoMono, sizeof(fm_u16))) {
- ret = -EFAULT;
- goto out;
- }
- break;
- }
-
- case FM_IOCTL_SETMONOSTERO:{
- WCN_DBG(FM_DBG | MAIN, "FM_IOCTL_SETMONOSTERO, %d\n", (fm_s32) arg);
- ret = fm_monostereo_set(fm, (fm_s32) arg);
- break;
- }
-
- case FM_IOCTL_GETCURPAMD:{
- fm_u16 PamdLevl;
-
- ret = fm_pamd_get(fm, &PamdLevl);
- WCN_DBG(FM_DBG | MAIN, "FM_IOCTL_GETCURPAMD:%d\n", PamdLevl);
- if (ret < 0)
- goto out;
-
- if (copy_to_user((void *)arg, &PamdLevl, sizeof(fm_u16)))
- ret = -EFAULT;
- goto out;
-
- break;
- }
-
- case FM_IOCTL_GETCAPARRAY:{
- fm_s32 ca;
-
- ret = fm_caparray_get(fm, &ca);
- WCN_DBG(FM_DBG | MAIN, "FM_IOCTL_GETCAPARRAY:%d\n", ca);
- if (ret < 0)
- goto out;
-
- if (copy_to_user((void *)arg, &ca, sizeof(fm_s32))) {
- ret = -EFAULT;
- goto out;
- }
- break;
- }
-
- case FM_IOCTL_EM_TEST:{
- struct fm_em_parm parm_em;
-
- WCN_DBG(FM_DBG | MAIN, "FM_IOCTL_EM_TEST\n");
-
- if (copy_from_user(&parm_em, (void *)arg, sizeof(struct fm_em_parm))) {
- ret = -EFAULT;
- goto out;
- }
- ret =
- fm_em_test(fm, parm_em.group_idx, parm_em.item_idx, parm_em.item_value);
- break;
- }
-
- case FM_IOCTL_RDS_SUPPORT:{
- fm_s32 support = FM_RDS_ENABLE;
- WCN_DBG(FM_NTC | MAIN, "FM_IOCTL_RDS_SUPPORT\n");
-
- if (copy_to_user((void *)arg, &support, sizeof(fm_s32))) {
- ret = -EFAULT;
- goto out;
- }
- break;
- }
-
- case FM_IOCTL_IS_FM_POWERED_UP:{
- fm_u32 powerup;
- WCN_DBG(FM_DBG | MAIN, "FM_IOCTL_IS_FM_POWERED_UP");
-
- if (fm->chipon && fm_pwr_state_get(fm)) {
- powerup = 1;
- } else {
- powerup = 0;
- }
-
- if (copy_to_user((void *)arg, &powerup, sizeof(fm_u32))) {
- ret = -EFAULT;
- goto out;
- }
- break;
- }
-
- case FM_IOCTL_FM_SET_STATUS: {
- fm_status_t fm_stat;
- WCN_DBG(FM_DBG | MAIN, "FM_IOCTL_FM_SET_STATUS");
-
- if (copy_from_user(&fm_stat, (void*)arg, sizeof(fm_status_t))) {
- ret = -EFAULT;
- goto out;
- }
-
- fm_set_stat(fm, fm_stat.which, fm_stat.stat);
-
- break;
- }
-
- case FM_IOCTL_FM_GET_STATUS: {
- fm_status_t fm_stat;
- WCN_DBG(FM_DBG | MAIN, "FM_IOCTL_FM_GET_STATUS");
-
- if (copy_from_user(&fm_stat, (void*)arg, sizeof(fm_status_t))) {
- ret = -EFAULT;
- goto out;
- }
-
- fm_get_stat(fm, fm_stat.which, &fm_stat.stat);
-
- if (copy_to_user((void*)arg, &fm_stat, sizeof(fm_status_t))) {
- ret = -EFAULT;
- goto out;
- }
-
- break;
- }
-
- case FM_IOCTL_RDS_ONOFF:{
- fm_u16 rdson_off = 0;
- WCN_DBG(FM_NTC | MAIN, "FM_IOCTL_RDS_ONOFF start\n");
-
- if (copy_from_user(&rdson_off, (void *)arg, sizeof(fm_u16))) {
- ret = -EFAULT;
- goto out;
- }
- ret = fm_rds_onoff(fm, rdson_off);
- WCN_DBG(FM_NTC | MAIN, "FM_IOCTL_RDS_ONOFF end:%d\n", rdson_off);
- break;
- }
-
- case FM_IOCTL_GETGOODBCNT:{
- fm_u16 uGBLCNT = 0;
-
- ret = fm_rds_good_bc_get(fm, &uGBLCNT);
- WCN_DBG(FM_DBG | MAIN, "FM_IOCTL_GETGOODBCNT:%d\n", uGBLCNT);
- if (ret < 0)
- goto out;
-
- if (copy_to_user((void *)arg, &uGBLCNT, sizeof(fm_u16))) {
- ret = -EFAULT;
- goto out;
- }
- break;
- }
-
- case FM_IOCTL_GETBADBNT:{
- fm_u16 uBadBLCNT = 0;
-
- ret = fm_rds_bad_bc_get(fm, &uBadBLCNT);
- WCN_DBG(FM_DBG | MAIN, "FM_IOCTL_GETBADBNT:%d\n", uBadBLCNT);
- if (ret < 0)
- goto out;
-
- if (copy_to_user((void *)arg, &uBadBLCNT, sizeof(fm_u16))) {
- ret = -EFAULT;
- goto out;
- }
- break;
- }
-
- case FM_IOCTL_GETBLERRATIO:{
- fm_u16 uBlerRatio = 0;
-
- ret = fm_rds_bler_ratio_get(fm, &uBlerRatio);
- WCN_DBG(FM_DBG | MAIN, "FM_IOCTL_GETBLERRATIO:%d\n", uBlerRatio);
- if (ret < 0)
- goto out;
-
- if (copy_to_user((void *)arg, &uBlerRatio, sizeof(fm_u16))) {
- ret = -EFAULT;
- goto out;
- }
- break;
- }
-
- case FM_IOCTL_ANA_SWITCH:{
- fm_s32 antenna = -1;
- WCN_DBG(FM_DBG | MAIN, "FM_IOCTL_ANA_SWITCH\n");
-
- if (copy_from_user(&antenna, (void *)arg, sizeof(fm_s32))) {
- WCN_DBG(FM_ALT | MAIN, "copy from user error\n");
- ret = -EFAULT;
- goto out;
- }
-
- ret = fm_ana_switch(fm, antenna);
- break;
- }
-
- case FM_IOCTL_RDS_GROUPCNT:{
- struct rds_group_cnt_req_t gc_req;
- WCN_DBG(FM_DBG | MAIN, "......FM_IOCTL_RDS_GROUPCNT......\n");
-
- if (copy_from_user
- (&gc_req, (void *)arg, sizeof(struct rds_group_cnt_req_t))) {
- WCN_DBG(FM_ALT | MAIN, "copy_from_user error\n");
- ret = -EFAULT;
- goto out;
- }
- /* handle group counter request */
- switch (gc_req.op) {
- case RDS_GROUP_CNT_READ:
- ret = fm_rds_group_cnt_get(fm, &gc_req.gc);
- break;
- case RDS_GROUP_CNT_WRITE:
- break;
- case RDS_GROUP_CNT_RESET:
- ret = fm_rds_group_cnt_reset(fm);
- break;
- default:
- break;
- }
-
- if (copy_to_user((void *)arg, &gc_req, sizeof(struct rds_group_cnt_req_t))) {
- WCN_DBG(FM_ALT | MAIN, "copy_to_user error\n");
- ret = -EFAULT;
- goto out;
- }
-
- break;
- }
-
- case FM_IOCTL_RDS_GET_LOG:{
- struct rds_raw_t rds_log;
- fm_s32 len;
- WCN_DBG(FM_DBG | MAIN, "......FM_IOCTL_RDS_GET_LOG......\n");
- /* fetch a record form RDS log buffer */
- ret = fm_rds_log_get(fm, (struct rds_rx_t *)&(rds_log.data), &len);
- rds_log.dirty = TRUE;
- rds_log.len = (len < sizeof(rds_log.data)) ? len : sizeof(rds_log.data);
- if (ret < 0)
- goto out;
-
- if (copy_to_user((void *)arg, &rds_log, rds_log.len + 2 * sizeof(fm_s32))) {
- WCN_DBG(FM_ALT | MAIN, "copy_to_user error\n");
- ret = -EFAULT;
- goto out;
- }
-
- break;
- }
-
- case FM_IOCTL_RDS_BC_RST:{
- WCN_DBG(FM_DBG | MAIN, "FM_IOCTL_RDS_BC_RST\n");
- ret = fm_rds_block_cnt_reset(fm);
- break;
- }
-
- case FM_IOCTL_I2S_SETTING:{
- struct fm_i2s_setting i2s_cfg;
- WCN_DBG(FM_DBG | MAIN, "FM_IOCTL_I2S_SETTING\n");
-
- if (copy_from_user(&i2s_cfg, (void *)arg, sizeof(struct fm_i2s_setting))) {
- WCN_DBG(FM_ALT | MAIN, "i2s set, copy_from_user err\n");
- ret = -EFAULT;
- goto out;
- }
-
- ret = fm_i2s_set(fm, i2s_cfg.onoff, i2s_cfg.mode, i2s_cfg.sample);
-
- if (ret) {
- WCN_DBG(FM_ALT | MAIN, "Set i2s err\n");
- goto out;
- }
-
- break;
- }
-
- case FM_IOCTL_IS_DESE_CHAN:{
- fm_s32 tmp;
- WCN_DBG(FM_DBG | MAIN, "FM_IOCTL_IS_DESE_CHAN\n");
-
- if (copy_from_user(&tmp, (void *)arg, sizeof(fm_s32))) {
- WCN_DBG(FM_ALT | MAIN, "is dese chan, copy_from_user err\n");
- ret = -EFAULT;
- goto out;
- }
-
- tmp = fm_is_dese_chan(fm, (fm_u16) tmp);
-
- if (copy_to_user((void *)arg, &tmp, sizeof(fm_s32))) {
- WCN_DBG(FM_ALT | MAIN, "is dese chan, copy_to_user err\n");
- ret = -EFAULT;
- goto out;
- }
-
- break;
- }
- case FM_IOCTL_DESENSE_CHECK:
- {
- fm_desense_check_t tmp;
- WCN_DBG(FM_DBG | MAIN, "FM_IOCTL_IS_DESE_CHAN\n");
-
- if (copy_from_user(&tmp, (void *)arg, sizeof(fm_desense_check_t))) {
- WCN_DBG(FM_ALT | MAIN, "desene check, copy_from_user err\n");
- ret = -EFAULT;
- goto out;
- }
- ret = fm_desense_check(fm, (fm_u16) tmp.freq, tmp.rssi);
-
- /*if (copy_to_user((void*)arg, &tmp, sizeof(fm_desense_check_t))) {
- WCN_DBG(FM_ALT | MAIN, "desene check, copy_to_user err\n");
- ret = -EFAULT;
- goto out;
- } */
-
- break;
- }
- case FM_IOCTL_SCAN_GETRSSI:
- {
- /*struct fm_rssi_req *req;
- WCN_DBG(FM_DBG | MAIN, "FM_IOCTL_SCAN_GETRSSI\n");
- if(!(req = fm_vmalloc(sizeof(struct fm_rssi_req))))
- {
- WCN_DBG(FM_ALT | MAIN, "fm_vmalloc err\n");
- ret = -EFAULT;
- goto out;
- }
- if(copy_from_user(req, (void*)arg, sizeof(struct fm_rssi_req)))
- {
- WCN_DBG(FM_ALT | MAIN, "copy_from_user err\n");
- ret = -EFAULT;
- fm_vfree(req);
- goto out;
- }
- ret = fm_get_rssi_after_scan(fm, req);
- if(-ERR_FW_NORES == ret){
- WCN_DBG(FM_ALT | MAIN, "fm_get_rssi_after_scan err\n");
- }
- if(copy_to_user((void*)arg, req, sizeof(struct fm_rssi_req)))
- {
- WCN_DBG(FM_ALT | MAIN, "copy_to_user err\n");
- ret = -EFAULT;
- fm_vfree(req);
- goto out;
- }
- */
- WCN_DBG(FM_ALT | MAIN, "FM_IOCTL_SCAN_GETRSSI:not support\n");
- break;
- }
-
- case FM_IOCTL_DUMP_REG:
- {
- WCN_DBG(FM_NTC | MAIN, "......FM_IOCTL_DUMP_REG......\n");
-
- ret = fm_dump_reg();
- if (ret) {
- WCN_DBG(FM_ALT | MAIN, "fm_dump_reg err\n");
- }
- break;
- }
- case FM_IOCTL_GPS_RTC_DRIFT:{
- struct fm_gps_rtc_info rtc_info;
- WCN_DBG(FM_NTC | MAIN, "......FM_IOCTL_GPS_RTC_DRIFT......\n");
-
- if (fm_false == fm->chipon) {
- WCN_DBG(FM_ERR | MAIN, "ERROR, FM chip is OFF\n");
- ret = -EFAULT;
- goto out;
- }
- if (copy_from_user(&rtc_info, (void *)arg, sizeof(struct fm_gps_rtc_info))) {
- WCN_DBG(FM_ERR | MAIN, "copy_from_user error\n");
- ret = -EFAULT;
- goto out;
- }
-
- ret = fm_get_gps_rtc_info(&rtc_info);
- if (ret) {
- WCN_DBG(FM_ERR | MAIN, "fm_get_gps_rtc_info error\n");
- goto out;
- }
- break;
- }
- case FM_IOCTL_OVER_BT_ENABLE:
- {
- fm_s32 fm_via_bt = -1;
- WCN_DBG(FM_NTC | MAIN, "......FM_IOCTL_OVER_BT_ENABLE......\n");
-
- if (copy_from_user(&fm_via_bt, (void *)arg, sizeof(int32_t))) {
- WCN_DBG(FM_ERR | MAIN, "copy_from_user error\n");
- ret = -EFAULT;
- goto out;
- }
-
- ret = fm_over_bt(fm, fm_via_bt);
- if (ret) {
- WCN_DBG(FM_ERR | MAIN, "fm_over_bt err\n");
- }
- break;
- }
-
- case FM_IOCTL_SET_SEARCH_THRESHOLD:
- {
- struct fm_search_threshold_t parm;
- WCN_DBG(FM_NTC | MAIN, "......FM_IOCTL_SET_SEARCH_THRESHOLD......\n");
-
- if (copy_from_user
- (&parm, (void *)arg, sizeof(struct fm_search_threshold_t))) {
- WCN_DBG(FM_ALT | MAIN, "copy_from_user error\n");
- ret = -EFAULT;
- goto out;
- }
- ret = fm_set_search_th(fm, parm);
- if (ret < 0) {
- WCN_DBG(FM_ERR | MAIN,
- "FM_IOCTL_SET_SEARCH_THRESHOLD not supported\n");
- }
- break;
- }
- case FM_IOCTL_GET_AUDIO_INFO:
- {
- fm_audio_info_t aud_data;
-
- ret = fm_get_aud_info(&aud_data);
- if (ret) {
- WCN_DBG(FM_ERR | MAIN, "fm_get_aud_info err\n");
- }
- if (copy_to_user((void *)arg, &aud_data, sizeof(fm_audio_info_t))) {
- WCN_DBG(FM_ERR | MAIN, "copy_to_user error\n");
- ret = -EFAULT;
- goto out;
- }
-
- WCN_DBG(FM_DBG | MAIN, "fm_get_aud_info ret=%d\n", ret);
- break;
- }
- /***************************FM Tx function************************************/
- case FM_IOCTL_TX_SUPPORT:
- {
- fm_s32 tx_support = -1;
- WCN_DBG(FM_NTC | MAIN, "......FM_IOCTL_TX_SUPPORT......\n");
-
- ret = fm_tx_support(fm, &tx_support);
- if (ret) {
- WCN_DBG(FM_ERR | MAIN, "fm_tx_support err\n");
- }
- if (copy_to_user((void *)arg, &tx_support, sizeof(fm_s32))) {
- WCN_DBG(FM_ERR | MAIN, "copy_to_user error\n");
- ret = -EFAULT;
- goto out;
- }
- break;
- }
- case FM_IOCTL_POWERUP_TX:
- {
- struct fm_tune_parm parm;
- WCN_DBG(FM_NTC | MAIN, "FM_IOCTL_POWERUP_TX:0\n");
- if (copy_from_user(&parm, (void *)arg, sizeof(struct fm_tune_parm))) {
- ret = -EFAULT;
- goto out;
- }
-
- ret = fm_powerup_tx(fm, &parm);
- if (ret < 0) {
- goto out;
- }
- ret = fm_tune_tx(fm, &parm);
- if (ret < 0)
- goto out;
-
- if (copy_to_user((void *)arg, &parm, sizeof(struct fm_tune_parm))) {
- ret = -EFAULT;
- goto out;
- }
- WCN_DBG(FM_NTC | MAIN, "FM_IOCTL_POWERUP_TX:1\n");
- break;
- }
-
- case FM_IOCTL_TUNE_TX:
- {
- struct fm_tune_parm parm;
- WCN_DBG(FM_NTC | MAIN, "FM_IOCTL_TUNE_TX:0\n");
-
- if (copy_from_user(&parm, (void *)arg, sizeof(struct fm_tune_parm))) {
- ret = -EFAULT;
- goto out;
- }
-
- ret = fm_tune_tx(fm, &parm);
- if (ret < 0) {
- goto out;
- }
-
- if (copy_to_user((void *)arg, &parm, sizeof(struct fm_tune_parm))) {
- ret = -EFAULT;
- goto out;
- }
-
- WCN_DBG(FM_NTC | MAIN, "FM_IOCTL_TUNE_TX:1\n");
- break;
- }
- case FM_IOCTL_RDSTX_SUPPORT:
- {
- fm_s32 rds_tx_support = -1;
- WCN_DBG(FM_NTC | MAIN, "......FM_IOCTL_RDSTX_SUPPORT......\n");
-
- ret = fm_rdstx_support(fm, &rds_tx_support);
- if (ret) {
- WCN_DBG(FM_ERR | MAIN, "fm_rdstx_support err\n");
- }
- if (copy_to_user((void *)arg, &rds_tx_support, sizeof(fm_s32))) {
- WCN_DBG(FM_ERR | MAIN, "copy_to_user error\n");
- ret = -EFAULT;
- goto out;
- }
- break;
- }
-
- case FM_IOCTL_RDSTX_ENABLE:
- {
- fm_s32 onoff = -1;
- WCN_DBG(FM_NTC | MAIN, "......FM_IOCTL_RDSTX_ENABLE......\n");
-
- if (copy_from_user(&onoff, (void *)arg, sizeof(fm_s32))) {
- WCN_DBG(FM_ALT | MAIN,
- "FM_IOCTL_RDSTX_ENABLE, copy_from_user err\n");
- ret = -EFAULT;
- goto out;
- }
-
- ret = fm_rdstx_enable(fm, onoff);
- if (ret) {
- WCN_DBG(FM_ERR | MAIN, "fm_rdstx_enable err\n");
- }
-
- break;
- }
-
- case FM_IOCTL_RDS_TX:
- {
- struct fm_rds_tx_parm parm;
- WCN_DBG(FM_NTC | MAIN, "......FM_IOCTL_RDS_TX......\n");
-
- if (copy_from_user(&parm, (void *)arg, sizeof(struct fm_rds_tx_parm))) {
- WCN_DBG(FM_ALT | MAIN, "RDS Tx, copy_from_user err\n");
- ret = -EFAULT;
- goto out;
- }
-
- ret = fm_rds_tx(fm, &parm);
- if (ret) {
- WCN_DBG(FM_ALT | MAIN, "fm_rds_tx err\n");
- }
-
- if (copy_to_user((void *)arg, &parm, sizeof(struct fm_rds_tx_parm))) {
- WCN_DBG(FM_ALT | MAIN, "RDS Tx, copy_to_user err\n");
- ret = -EFAULT;
- goto out;
- }
- break;
- }
-
- case FM_IOCTL_TX_SCAN:
- {
- struct fm_tx_scan_parm parm;
- WCN_DBG(FM_NTC | MAIN, "......FM_IOCTL_TX_SCAN......\n");
-
- if (copy_from_user(&parm, (void *)arg, sizeof(struct fm_tx_scan_parm))) {
- WCN_DBG(FM_ALT | MAIN, "copy_from_user error\n");
- ret = -EFAULT;
- goto out;
- }
- ret = fm_tx_scan(fm, &parm);
- if (ret < 0) {
- WCN_DBG(FM_ERR | MAIN, "FM_IOCTL_TX_SCAN failed\n");
- }
- if (copy_to_user((void *)arg, &parm, sizeof(struct fm_tx_scan_parm))) {
- WCN_DBG(FM_ALT | MAIN, "copy_to_user error\n");
- ret = -EFAULT;
- goto out;
- }
- break;
- }
-
- default:
- ret = -EPERM;
- }
-
- out:
- if (ret == -FM_EFW) {
- if (fm_sys_state_get(fm) == FM_SUBSYS_RST_OFF) {
- fm->wholechiprst = fm_false;
- /* subsystem reset */
- fm_subsys_reset(fm);
- }
- }
-
- return ret;
-}
-
-static loff_t fm_ops_lseek(struct file *filp, loff_t off, fm_s32 whence)
-{
- struct fm *fm = filp->private_data;
-
- if (whence == SEEK_END) {
- fm_hwscan_stop(fm);
- } else if (whence == SEEK_SET) {
- FM_EVENT_SEND(fm->rds_event, FM_RDS_DATA_READY);
- }
-
- return off;
-}
-
-static ssize_t fm_ops_read(struct file *filp, char *buf, size_t len, loff_t *off)
-{
- struct fm *fm = filp->private_data;
- fm_s32 copy_len = 0;
-
- if (!fm) {
- WCN_DBG(FM_ALT | MAIN, "fm_read invalid fm pointer\n");
- return 0;
- }
-
- WCN_DBG(FM_DBG | MAIN, "rds buf len=%zu\n", len);
- WCN_DBG(FM_DBG | MAIN, "sizeof(rds_t)=%zu\n", sizeof(rds_t));
-
- if (!buf || len < sizeof(rds_t)) {
- WCN_DBG(FM_DBG | MAIN, "fm_read invliad buf\n");
- return 0;
- }
- /* return if FM is resetting */
- if (fm_sys_state_get(fm) != FM_SUBSYS_RST_OFF) {
- WCN_DBG(FM_ALT | MAIN, "fm subsys underring reset\n");
- return 0;
- }
-
- copy_len = sizeof(rds_t);
-
- return fm_rds_read(fm, buf, copy_len);
-}
-
-static fm_s32 fm_ops_open(struct inode *inode, struct file *filp)
-{
- fm_s32 ret = 0;
- struct fm_platform *plat = container_of(inode->i_cdev, struct fm_platform, cdev);
- struct fm *fm = container_of(plat, struct fm, platform);
-
- WCN_DBG(FM_NTC | MAIN, "fm_ops_open:0\n");
- if (fm_sys_state_get(fm) != FM_SUBSYS_RST_OFF) {
- WCN_DBG(FM_ALT | MAIN, "FM subsys is resetting, retry later\n");
- ret = -FM_ESRST;
- return ret;
- }
-
- ret = fm_open(fm);
- filp->private_data = fm;
-
- WCN_DBG(FM_NTC | MAIN, "fm_ops_open:1\n");
- return ret;
-}
-
-static fm_s32 fm_ops_release(struct inode *inode, struct file *filp)
-{
-/* fm_s32 ret = 0; */
-/* struct fm_platform *plat = container_of(inode->i_cdev, struct fm_platform, cdev); */
-/* struct fm *fm = container_of(plat, struct fm, platform); */
-
-/* WCN_DBG(FM_NTC | MAIN, "fm_ops_release:0\n"); */
-/* fm_close(fm); */
- filp->private_data = NULL;
-
- WCN_DBG(FM_NTC | MAIN, "fm_ops_release\n");
- return 0;
-}
-
-static fm_s32 fm_ops_flush(struct file *filp, fl_owner_t Id)
-{
- fm_s32 ret = 0;
- struct fm *fm = filp->private_data;
-
- WCN_DBG(FM_NTC | MAIN, "fm_ops_flush:0\n");
- fm_close(fm);
- filp->private_data = fm;
-
- WCN_DBG(FM_NTC | MAIN, "fm_ops_flush:1\n");
- return ret;
-}
-
-static ssize_t fm_proc_read(struct file *file, char __user *buf, size_t count, loff_t *ppos)
-{
- struct fm *fm = g_fm;
- ssize_t length = 0;
- char tmpbuf[3];
- unsigned long pos = *ppos;
-
- WCN_DBG(FM_NTC | MAIN, "Enter fm_proc_read.\n");
- /* WCN_DBG(FM_NTC | MAIN, "count = %d\n", count); */
- /* WCN_DBG(FM_NTC | MAIN, "ppos = %d\n", pos); */
-
- if (pos != 0)
- return 0;
-
- if (!fm) {
- WCN_DBG(FM_ALT | MAIN, "para err\n");
- return 0;
- }
-
- if (fm->chipon && (fm_pwr_state_get(fm) == FM_PWR_RX_ON)) {
- length = sprintf(tmpbuf, "1\n");
- WCN_DBG(FM_NTC | MAIN, " FM_PWR_RX_ON\n");
- } else if (fm->chipon && (fm_pwr_state_get(fm) == FM_PWR_TX_ON)) {
- length = sprintf(tmpbuf, "2\n");
- WCN_DBG(FM_NTC | MAIN, " FM_PWR_TX_ON\n");
- } else {
- length = sprintf(tmpbuf, "0\n");
- WCN_DBG(FM_NTC | MAIN, " FM POWER OFF\n");
- }
-
- if (copy_to_user(buf, tmpbuf, length)) {
- WCN_DBG(FM_NTC | MAIN, " Read FM status fail!\n");
- return 0;
- }
-
- pos += length;
- *ppos = pos;
- WCN_DBG(FM_NTC | MAIN, "Leave fm_proc_read. length = %zu\n", length);
-
- return length;
-}
-
-/*
-static fm_s32 fm_proc_read(char *page, char **start, off_t off, fm_s32 count, fm_s32 *eof, void *data)
-{
- fm_s32 cnt = 0;
- struct fm *fm = g_fm;
-
- WCN_DBG(FM_NTC | MAIN, "Enter fm_proc_read.\n");
-
- if (off != 0)
- return 0;
-
- if (!fm) {
- WCN_DBG(FM_ALT | MAIN, "para err\n");
- return 0;
- }
-
- if (fm->chipon && (fm_pwr_state_get(fm) == FM_PWR_RX_ON))
- {
- cnt = sprintf(page, "1\n");
- WCN_DBG(FM_NTC | MAIN, " FM_PWR_RX_ON\n");
- }
- else if (fm->chipon && (fm_pwr_state_get(fm) == FM_PWR_TX_ON))
- {
- WCN_DBG(FM_NTC | MAIN, " FM_PWR_TX_ON\n");
- cnt = sprintf(page, "2\n");
- }
- else
- {
- cnt = sprintf(page, "0\n");
- }
-
- *eof = 1;
- WCN_DBG(FM_NTC | MAIN, "Leave fm_proc_read. cnt = %d\n", cnt);
- return cnt;
-}
-*/
-static ssize_t fm_proc_write(struct file *file, const char *buffer, size_t count, loff_t *ppos)
-{
- fm_s8 tmp_buf[50] = { 0 };
- fm_u32 copysize;
-
- copysize = (count < (sizeof(tmp_buf) - 1)) ? count : (sizeof(tmp_buf) - 1);
-
- WCN_DBG(FM_NTC | MAIN, "fm_proc_write:0\n");
- if (copy_from_user(tmp_buf, buffer, copysize)) {
- WCN_DBG(FM_ERR | MAIN, "failed copy_from_user\n");
- return -EFAULT;
- }
-
- if (strncmp(tmp_buf, "subsys reset", strlen("subsys reset")) == 0) {
- fm_subsys_reset(g_fm);
- return count;
- }
-
- if (!fm_cust_config_setup(tmp_buf)) {
- WCN_DBG(FM_NTC | MAIN, "get config form %s ok\n", tmp_buf);
- return count;
- }
-
- if (sscanf(tmp_buf, "%x", &g_dbg_level) != 1) {
- WCN_DBG(FM_ERR | MAIN, "failed g_dbg_level = 0x%x\n", g_dbg_level);
- return -EFAULT;
- }
-
- WCN_DBG(FM_NTC | MAIN, "fm_proc_write:1 g_dbg_level = 0x%x\n", g_dbg_level);
- return count;
-}
-
-//#define FM_DEV_STATIC_ALLOC
-//#define FM_DEV_MAJOR 193
-//static int FM_major = FM_DEV_MAJOR; /* dynamic allocation */
-
-static fm_s32 fm_cdev_setup(struct fm *fm)
-{
- fm_s32 ret = 0;
- struct fm_platform *plat = &fm->platform;
-
-#ifdef FM_DEV_STATIC_ALLOC
- /*static allocate chrdev */
- plat->dev_t = MKDEV(FM_major, 0);
- ret = register_chrdev_region(plat->dev_t, 1, FM_NAME);
-
- if (ret) {
- WCN_DBG(FM_ERR | MAIN, "%s():fail to register chrdev\n", __func__);
- return ret;
- }
-#endif
-
-#ifndef FM_DEV_STATIC_ALLOC
- ret = alloc_chrdev_region(&plat->dev_t, 0, 1, FM_NAME);
-
- if (ret) {
- WCN_DBG(FM_ALT | MAIN, "alloc dev_t failed\n");
- return ret;
- }
-#endif
-
- WCN_DBG(FM_NTC | MAIN, "alloc %s:%d:%d\n", FM_NAME, MAJOR(plat->dev_t), MINOR(plat->dev_t));
-
- cdev_init(&plat->cdev, &fm_ops);
-
- plat->cdev.owner = THIS_MODULE;
- plat->cdev.ops = &fm_ops;
-
- ret = cdev_add(&plat->cdev, plat->dev_t, 1);
-
- if (ret) {
- WCN_DBG(FM_ALT | MAIN, "add dev_t failed\n");
- return ret;
- }
-#ifndef FM_DEV_STATIC_ALLOC
- plat->cls = class_create(THIS_MODULE, FM_NAME);
-
- if (IS_ERR(plat->cls)) {
- ret = PTR_ERR(plat->cls);
- WCN_DBG(FM_ALT | MAIN, "class_create err:%d\n", ret);
- return ret;
- }
-
- plat->dev = device_create(plat->cls, NULL, plat->dev_t, NULL, FM_NAME);
-#endif
-
- return ret;
-}
-
-static fm_s32 fm_cdev_destroy(struct fm *fm)
-{
- FMR_ASSERT(fm);
-
- device_destroy(fm->platform.cls, fm->platform.dev_t);
- class_destroy(fm->platform.cls);
- cdev_del(&fm->platform.cdev);
- unregister_chrdev_region(fm->platform.dev_t, 1);
-
- return 0;
-}
-
-static fm_s32 fm_mod_init(fm_u32 arg)
-{
- fm_s32 ret = 0;
- struct fm *fm = NULL;
-
- fm = fm_dev_init(0);
-
- if (!fm) {
- ret = -ENOMEM;
- goto ERR_EXIT;
- }
-
- if ((ret = fm_cdev_setup(fm))) {
- goto ERR_EXIT;
- }
- /* fm proc file create "/proc/fm" */
- g_fm_proc = proc_create(FM_PROC_FILE, 0444, NULL, &fm_proc_ops);
-
- if (g_fm_proc == NULL) {
- WCN_DBG(FM_ALT | MAIN, "create_proc_entry failed\n");
- ret = -ENOMEM;
- goto ERR_EXIT;
- } else {
- WCN_DBG(FM_NTC | MAIN, "create_proc_entry success\n");
- }
-
- g_fm = fm;
- return 0;
-
- ERR_EXIT:
-
- if (fm) {
- fm_cdev_destroy(fm);
- fm_dev_destroy(fm);
- }
-
- remove_proc_entry(FM_PROC_FILE, NULL);
- return ret;
-}
-
-static fm_s32 fm_mod_destroy(struct fm *fm)
-{
- fm_s32 ret = 0;
-
- FMR_ASSERT(fm);
-
- WCN_DBG(FM_NTC | MAIN, "%s\n", __func__);
- remove_proc_entry(FM_PROC_FILE, NULL);
- fm_cdev_destroy(fm);
- fm_dev_destroy(fm);
-
- return ret;
-}
-
-static fm_s32 mt_fm_probe(struct platform_device *pdev)
-{
- fm_s32 ret = 0;
-
- WCN_DBG(FM_NTC | MAIN, "%s\n", __func__);
-
- ret = fm_mod_init(0);
-
- if (ret) {
- WCN_DBG(FM_ERR | MAIN, "fm mod init err\n");
- return -ENOMEM;
- }
-
- return ret;
-}
-
-static fm_s32 mt_fm_remove(struct platform_device *pdev)
-{
- WCN_DBG(FM_NTC | MAIN, "%s\n", __func__);
-
- fm_mod_destroy(g_fm);
- g_fm = NULL;
- return 0;
-}
-
-static struct platform_device mt_fm_device = {
- .name = FM_NAME,
- .id = -1,
-};
-
-/* platform driver entry */
-static struct platform_driver mt_fm_dev_drv = {
- .probe = mt_fm_probe,
- .remove = mt_fm_remove,
- .driver = {
- .name = FM_NAME,
- .owner = THIS_MODULE,
- }
-};
-
-static fm_s32 mt_fm_init(void)
-{
- fm_s32 ret = 0;
-
- ret = fm_env_setup();
-
- if (ret) {
- fm_env_destroy();
- return ret;
- }
- /* register fm device to platform bus */
- ret = platform_device_register(&mt_fm_device);
-
- if (ret) {
- return ret;
- }
- /* register fm driver to platform bus */
- ret = platform_driver_register(&mt_fm_dev_drv);
-
- if (ret) {
- return ret;
- }
-
- WCN_DBG(FM_NTC | MAIN, "6. fm platform driver registered\n");
- return ret;
-}
-
-static void mt_fm_exit(void)
-{
- platform_driver_unregister(&mt_fm_dev_drv);
- fm_env_destroy();
-}
-
-#ifdef MTK_WCN_REMOVE_KERNEL_MODULE
-int mtk_wcn_fm_init(void)
-{
- return mt_fm_init();
-}
-
-void mtk_wcn_fm_exit(void)
-{
- mt_fm_exit();
-}
-EXPORT_SYMBOL(mtk_wcn_fm_init);
-EXPORT_SYMBOL(mtk_wcn_fm_exit);
-#else
-module_init(mt_fm_init);
-module_exit(mt_fm_exit);
-#endif
-EXPORT_SYMBOL(g_dbg_level);
-MODULE_LICENSE("GPL");
-MODULE_DESCRIPTION("MediaTek FM Driver");
-MODULE_AUTHOR("Hongcheng <hongcheng.xia@MediaTek.com>");
diff --git a/drivers/misc/mediatek/fmradio/core/fm_patch.c b/drivers/misc/mediatek/fmradio/core/fm_patch.c
deleted file mode 100644
index 049a528ed..000000000
--- a/drivers/misc/mediatek/fmradio/core/fm_patch.c
+++ /dev/null
@@ -1,146 +0,0 @@
-/* fm_patch.c
- *
- * (C) Copyright 2011
- * MediaTek <www.MediaTek.com>
- * Hongcheng <hongcheng.xia@MediaTek.com>
- *
- * FM Radio Driver -- patch functions
- *
- * 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.
- *
- * 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.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- */
-#include <linux/fs.h>
-#include <asm/uaccess.h>
-
-#include "fm_typedef.h"
-#include "fm_dbg.h"
-#include "fm_err.h"
-
-/*
- * fm_file_exist - test file
- * @filename - source file name
- * If exsit, return 0, else error code
- */
-fm_s32 fm_file_exist(const fm_s8 *filename)
-{
- fm_s32 ret = 0;
- mm_segment_t old_fs;
- struct file *fp = NULL;
-
- old_fs = get_fs();
- set_fs(KERNEL_DS);
- fp = filp_open(filename, O_RDONLY, 0);
-
- if (IS_ERR(fp)) {
- WCN_DBG(FM_ERR | CHIP, "open \"%s\" failed\n", filename);
- set_fs(old_fs);
- return -FM_EPATCH;
- } else {
- WCN_DBG(FM_NTC | CHIP, "open \"%s\" ok\n", filename);
- }
-
- if (fp) {
- filp_close(fp, NULL);
- }
-
- set_fs(old_fs);
-
- return ret;
-}
-
-
-/*
- * fm_file_read - read FM DSP patch/coeff/hwcoeff/rom binary file
- * @filename - source file name
- * @dst - target buffer
- * @len - desired read length
- * @position - the read position
- * If success, return read length in bytes, else error code
- */
-fm_s32 fm_file_read(const fm_s8 *filename, fm_u8 *dst, fm_s32 len, fm_s32 position)
-{
- fm_s32 ret = 0;
- loff_t pos = position;
- mm_segment_t old_fs;
- struct file *fp = NULL;
-
- old_fs = get_fs();
- set_fs(KERNEL_DS);
- fp = filp_open(filename, O_RDONLY, 0);
-
- if (IS_ERR(fp)) {
- WCN_DBG(FM_ERR | CHIP, "open \"%s\" failed\n", filename);
- set_fs(old_fs);
- return -FM_EPATCH;
- } else {
- WCN_DBG(FM_NTC | CHIP, "open \"%s\" ok\n", filename);
- }
-
- ret = vfs_read(fp, (char __user *)dst, len, &pos);
-
- if (ret < 0) {
- WCN_DBG(FM_ERR | CHIP, "read \"%s\" failed\n", filename);
- } else if (ret < len) {
- WCN_DBG(FM_NTC | CHIP, "read \"%s\" part data\n", filename);
- } else {
- WCN_DBG(FM_NTC | CHIP, "read \"%s\" full data\n", filename);
- }
-
- if (fp) {
- filp_close(fp, NULL);
- }
-
- set_fs(old_fs);
-
- return ret;
-}
-
-
-fm_s32 fm_file_write(const fm_s8 *filename, fm_u8 *dst, fm_s32 len, fm_s32 *ppos)
-{
- fm_s32 ret = 0;
- loff_t pos = *ppos;
- mm_segment_t old_fs;
- struct file *fp = NULL;
-
- old_fs = get_fs();
- set_fs(KERNEL_DS);
- fp = filp_open(filename, O_CREAT | O_RDWR, 0);
-
- if (IS_ERR(fp)) {
- WCN_DBG(FM_ERR | CHIP, "open \"%s\" failed\n", filename);
- set_fs(old_fs);
- return -FM_EPATCH;
- } else {
- WCN_DBG(FM_NTC | CHIP, "open \"%s\" ok\n", filename);
- }
-
- WCN_DBG(FM_NTC | CHIP, "\"%s\" old pos %d\n", filename, (int)pos);
- ret = vfs_write(fp, (char __user *)dst, len, &pos);
- WCN_DBG(FM_NTC | CHIP, "\"%s\" new pos %d\n", filename, (int)pos);
- *ppos = pos;
- if (ret < 0) {
- WCN_DBG(FM_ERR | CHIP, "write \"%s\" failed\n", filename);
- } else if (ret < len) {
- WCN_DBG(FM_NTC | CHIP, "write \"%s\" data\n", filename);
- }
-
- if (fp) {
- filp_close(fp, NULL);
- }
-
- set_fs(old_fs);
-
- return ret;
-}
diff --git a/drivers/misc/mediatek/fmradio/core/fm_rds_parser.c b/drivers/misc/mediatek/fmradio/core/fm_rds_parser.c
deleted file mode 100644
index 68541bcdc..000000000
--- a/drivers/misc/mediatek/fmradio/core/fm_rds_parser.c
+++ /dev/null
@@ -1,2022 +0,0 @@
-/* fm_rds_parser.c
- *
- * (C) Copyright 2011
- * MediaTek <www.MediaTek.com>
- * hongcheng <hongcheng.xia@MediaTek.com>
- *
- * FM Radio Driver
- *
- * 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.
- *
- * 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.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- */
-#include <linux/string.h>
-
-#include "fm_typedef.h"
-#include "fm_rds.h"
-#include "fm_dbg.h"
-#include "fm_err.h"
-#include "fm_stdlib.h"
-
-/* static rds_ps_state_machine_t ps_state_machine = RDS_PS_START; */
-/* static rds_rt_state_machine_t rt_state_machine = RDS_RT_START; */
-struct fm_state_machine {
- fm_s32 state;
- fm_s32(*state_get) (struct fm_state_machine *thiz);
- fm_s32(*state_set) (struct fm_state_machine *thiz, fm_s32 new_state);
-};
-
-static fm_s32 fm_state_get(struct fm_state_machine *thiz)
-{
- return thiz->state;
-}
-
-static fm_s32 fm_state_set(struct fm_state_machine *thiz, fm_s32 new_state)
-{
- return thiz->state = new_state;
-}
-
-#define STATE_SET(a, s) \
-{ \
- if ((a)->state_set) { \
- (a)->state_set((a), (s)); \
- } \
-}
-
-#define STATE_GET(a) \
-({ \
- fm_s32 __ret = 0; \
- if ((a)->state_get) { \
- __ret = (a)->state_get((a)); \
- } \
- __ret; \
-})
-
-static fm_u16(*rds_get_freq) (void);
-
-/* RDS spec related handle flow */
-/*
- * rds_cnt_get
- * To get rds group count form raw data
- * If success return 0, else return error code
-*/
-static fm_s32 rds_cnt_get(struct rds_rx_t *rds_raw, fm_s32 raw_size, fm_s32 *cnt)
-{
- fm_s32 gap = sizeof(rds_raw->cos) + sizeof(rds_raw->sin);
-
- FMR_ASSERT(rds_raw);
- FMR_ASSERT(cnt);
- *cnt = (raw_size - gap) / sizeof(rds_packet_t);
- WCN_DBG(FM_INF | RDSC, "group cnt=%d\n", *cnt);
-
- return 0;
-}
-
-/*
- * rds_grp_get
- * To get rds group[n] data form raw data with index
- * If success return 0, else return error code
-*/
-static fm_s32 rds_grp_get(fm_u16 *dst, struct rds_rx_t *raw, fm_s32 idx)
-{
- FMR_ASSERT(dst);
- FMR_ASSERT(raw);
-
- if (idx > (MAX_RDS_RX_GROUP_CNT - 1)) {
- return -FM_EPARA;
- }
-
- dst[0] = raw->data[idx].blkA;
- dst[1] = raw->data[idx].blkB;
- dst[2] = raw->data[idx].blkC;
- dst[3] = raw->data[idx].blkD;
- dst[4] = raw->data[idx].crc;
- dst[5] = raw->data[idx].cbc;
-
- WCN_DBG(FM_NTC | RDSC, "BLOCK:%04x %04x %04x %04x, CRC:%04x CBC:%04x\n", dst[0], dst[1],
- dst[2], dst[3], dst[4], dst[5]);
-
- return 0;
-}
-
-/*
- * rds_checksum_check
- * To check CRC rerult, if OK, *valid=fm_true, else *valid=fm_false
- * If success return 0, else return error code
-*/
-static fm_s32 rds_checksum_check(fm_u16 crc, fm_s32 mask, fm_bool *valid)
-{
- FMR_ASSERT(valid);
-
- if ((crc & mask) == mask) {
- *valid = fm_true;
- } else {
- *valid = fm_false;
- }
-
- return 0;
-}
-
-/*
- * rds_cbc_get - To get block_n's correct bit count form cbc
- * @cbc, the group's correct bit count
- * @blk, target the block
- *
- * If success, return block_n's cbc, else error code
-*/
-/*
-static fm_s32 rds_cbc_get(fm_u16 cbc, enum rds_blk_t blk)
-{
- int ret = 0;
-
- switch (blk) {
- case RDS_BLK_A:
- ret = (cbc & 0xF000) >> 12;
- break;
- case RDS_BLK_B:
- ret = (cbc & 0x0F00) >> 8;
- break;
- case RDS_BLK_C:
- ret = (cbc & 0x00F0) >> 4;
- break;
- case RDS_BLK_D:
- ret = (cbc & 0x000F) >> 0;
- break;
- default:
- break;
- }
-
- WCN_DBG(FM_INF | RDSC, "group cbc=0x%04x\n", cbc);
- return ret;
-}
-*/
-/*
- * rds_event_set
- * To set rds event, and user space can use this flag to juge which event happened
- * If success return 0, else return error code
-*/
-static fm_s32 rds_event_set(fm_u16 *events, fm_s32 event_mask)
-{
- FMR_ASSERT(events);
- WCN_DBG(FM_NTC | RDSC, "rds set event[%x->%x]\n", event_mask, *events);
- *events |= event_mask;
-
- return 0;
-}
-
-/*
- * rds_flag_set
- * To set rds event flag, and user space can use this flag to juge which event happened
- * If success return 0, else return error code
-*/
-static fm_s32 rds_flag_set(fm_u32 *flags, fm_s32 flag_mask)
-{
- FMR_ASSERT(flags);
- *flags |= flag_mask;
- WCN_DBG(FM_NTC | RDSC, "rds set flag[%x->%x]\n", flag_mask, *flags);
-
- return 0;
-}
-
-/*
- * rds_grp_type_get
- * To get rds group type form blockB
- * If success return 0, else return error code
-*/
-static fm_s32 rds_grp_type_get(fm_u16 crc, fm_u16 blk, fm_u8 *type, fm_u8 *subtype)
-{
- fm_bool valid = fm_false;
-
- FMR_ASSERT(type);
- FMR_ASSERT(subtype);
- /* to get the group type from block B */
- rds_checksum_check(crc, FM_RDS_GDBK_IND_B, &valid);
-
- if (valid == fm_true) {
- *type = (blk & 0xF000) >> 12; /* Group type(4bits) */
- *subtype = (blk & 0x0800) >> 11; /* version code(1bit), 0=vesionA, 1=versionB */
- } else {
- WCN_DBG(FM_WAR | RDSC, "Block1 CRC err\n");
- return -FM_ECRC;
- }
-
- WCN_DBG(FM_DBG | RDSC, "Type=%d, subtype:%s\n", (fm_s32) *type,
- *subtype ? "version B" : "version A");
- return 0;
-}
-
-/*
- * rds_grp_counter_add
- * @type -- group type, rang: 0~15
- * @subtype -- sub group type, rang:0~1
- *
- * add group counter, g0a~g15b
- * we use type value as the index
- * If success return 0, else return error code
-*/
-static fm_s32 rds_grp_counter_add(fm_u8 type, fm_u8 subtype, struct rds_group_cnt_t *gc)
-{
- FMR_ASSERT(gc);
-
- if (type > 15) {
- return -FM_EPARA;
- }
-
- switch (subtype) {
- case RDS_GRP_VER_A:
- gc->groupA[type]++;
- break;
- case RDS_GRP_VER_B:
- gc->groupB[type]++;
- break;
- default:
- return -FM_EPARA;
- break;
- }
-
- gc->total++;
- WCN_DBG(FM_INF | RDSC, "group counter:%d\n", (fm_s32) gc->total);
- return 0;
-}
-
-/*
- * rds_grp_counter_get
- *
- * read group counter , g0a~g15b
- * If success return 0, else return error code
-*/
-extern fm_s32 rds_grp_counter_get(struct rds_group_cnt_t *dst, struct rds_group_cnt_t *src)
-{
- FMR_ASSERT(dst);
- FMR_ASSERT(src);
- fm_memcpy(dst, src, sizeof(struct rds_group_cnt_t));
- WCN_DBG(FM_DBG | RDSC, "rds gc get[total=%d]\n", (fm_s32) dst->total);
- return 0;
-}
-
-/*
- * rds_grp_counter_reset
- *
- * clear group counter to 0, g0a~g15b
- * If success return 0, else return error code
-*/
-extern fm_s32 rds_grp_counter_reset(struct rds_group_cnt_t *gc)
-{
- FMR_ASSERT(gc);
- fm_memset(gc, 0, sizeof(struct rds_group_cnt_t));
- return 0;
-}
-
-extern fm_s32 rds_log_in(struct rds_log_t *thiz, struct rds_rx_t *new_log, fm_s32 new_len)
-{
- FMR_ASSERT(new_log);
-
- if (thiz->len < thiz->size) {
- new_len = (new_len < sizeof(struct rds_rx_t)) ? new_len : sizeof(struct rds_rx_t);
- fm_memcpy(&(thiz->rds_log[thiz->in]), new_log, new_len);
- thiz->log_len[thiz->in] = new_len;
- thiz->in = (thiz->in + 1) % thiz->size;
- thiz->len++;
- WCN_DBG(FM_DBG | RDSC, "add a new log[len=%d]\n", thiz->len);
- } else {
- WCN_DBG(FM_WAR | RDSC, "rds log buf is full\n");
- return -FM_ENOMEM;
- }
-
- return 0;
-}
-
-extern fm_s32 rds_log_out(struct rds_log_t *thiz, struct rds_rx_t *dst, fm_s32 *dst_len)
-{
- FMR_ASSERT(dst);
- FMR_ASSERT(dst_len);
-
- if (thiz->len > 0) {
- *dst_len = thiz->log_len[thiz->out];
- *dst_len =
- (*dst_len < sizeof(struct rds_rx_t)) ? *dst_len : sizeof(struct rds_rx_t);
- fm_memcpy(dst, &(thiz->rds_log[thiz->out]), *dst_len);
- thiz->out = (thiz->out + 1) % thiz->size;
- thiz->len--;
- WCN_DBG(FM_DBG | RDSC, "del a new log[len=%d]\n", thiz->len);
- } else {
- *dst_len = 0;
- WCN_DBG(FM_WAR | RDSC, "rds log buf is empty\n");
- }
-
- return 0;
-}
-
-/*
- * rds_grp_pi_get
- * To get rds group pi code form blockA
- * If success return 0, else return error code
-*/
-static fm_s32 rds_grp_pi_get(fm_u16 crc, fm_u16 blk, fm_u16 *pi, fm_bool *dirty)
-{
- fm_s32 ret = 0;
- fm_bool valid = fm_false;
-
- FMR_ASSERT(pi);
- FMR_ASSERT(dirty);
-
- /* to get the group pi code from block A */
- ret = rds_checksum_check(crc, FM_RDS_GDBK_IND_A, &valid);
-
- if (valid == fm_true) {
- if (*pi != blk) {
- /* PI=program Identication */
- *pi = blk;
- *dirty = fm_true; /* yes, we got new PI code */
- } else {
- *dirty = fm_false; /* PI is the same as last one */
- }
- } else {
- WCN_DBG(FM_WAR | RDSC, "Block0 CRC err\n");
- return -FM_ECRC;
- }
-
- WCN_DBG(FM_INF | RDSC, "PI=0x%04x, %s\n", *pi, *dirty ? "new" : "old");
- return ret;
-}
-
-/*
- * rds_grp_pty_get
- * To get rds group pty code form blockB
- * If success return 0, else return error code
-*/
-static fm_s32 rds_grp_pty_get(fm_u16 crc, fm_u16 blk, fm_u8 *pty, fm_bool *dirty)
-{
- fm_s32 ret = 0;
-/* fm_bool valid = fm_false; */
-
- FMR_ASSERT(pty);
- FMR_ASSERT(dirty);
-
- /* to get PTY code from block B */
-/* ret = rds_checksum_check(crc, FM_RDS_GDBK_IND_B, &valid); */
-
-/* if (valid == fm_false) { */
-/* WCN_DBG(FM_WAR | RDSC, "Block1 CRC err\n"); */
-/* return -FM_ECRC; */
-/* } */
-
- if (*pty != ((blk & 0x03E0) >> 5)) {
- /* PTY=Program Type Code */
- *pty = (blk & 0x03E0) >> 5;
- *dirty = fm_true; /* yes, we got new PTY code */
- } else {
- *dirty = fm_false; /* PTY is the same as last one */
- }
-
- WCN_DBG(FM_INF | RDSC, "PTY=%d, %s\n", (fm_s32) *pty, *dirty ? "new" : "old");
- return ret;
-}
-
-/*
- * rds_grp_tp_get
- * To get rds group tp code form blockB
- * If success return 0, else return error code
-*/
-static fm_s32 rds_grp_tp_get(fm_u16 crc, fm_u16 blk, fm_u8 *tp, fm_bool *dirty)
-{
- fm_s32 ret = 0;
-/* fm_bool valid = fm_false; */
-
- FMR_ASSERT(tp);
- FMR_ASSERT(dirty);
-
- /* to get TP code from block B */
-/* ret = rds_checksum_check(crc, FM_RDS_GDBK_IND_B, &valid); */
-
-/* if (valid == fm_false) { */
-/* WCN_DBG(FM_WAR | RDSC, "Block1 CRC err\n"); */
-/* return -FM_ECRC; */
-/* } */
-
- if (*tp != ((blk & 0x0400) >> 10)) {
- /* Tranfic Program Identification */
- *tp = (blk & 0x0400) >> 10;
- *dirty = fm_true; /* yes, we got new TP code */
- } else {
- *dirty = fm_false; /* TP is the same as last one */
- }
-
- WCN_DBG(FM_NTC | RDSC, "TP=%d, %s\n", (fm_s32) *tp, *dirty ? "new" : "old");
- return ret;
-}
-
-/*
- * rds_g0_ta_get
- * To get rds group ta code form blockB
- * If success return 0, else return error code
-*/
-static fm_s32 rds_g0_ta_get(fm_u16 blk, fm_u8 *ta, fm_bool *dirty)
-{
- fm_s32 ret = 0;
-
- FMR_ASSERT(ta);
- FMR_ASSERT(dirty);
-
- /* TA=Traffic Announcement code */
- if (*ta != ((blk & 0x0010) >> 4)) {
- *ta = (blk & 0x0010) >> 4;
- *dirty = fm_true; /* yes, we got new TA code */
- } else {
- *dirty = fm_false; /* TA is the same as last one */
- }
-
- WCN_DBG(FM_INF | RDSC, "TA=%d, %s\n", (fm_s32) *ta, *dirty ? "new" : "old");
- return ret;
-}
-
-/*
- * rds_g0_music_get
- * To get music-speech switch code form blockB
- * If success return 0, else return error code
-*/
-static fm_s32 rds_g0_music_get(fm_u16 blk, fm_u8 *music, fm_bool *dirty)
-{
- fm_s32 ret = 0;
-
- FMR_ASSERT(music);
- FMR_ASSERT(dirty);
-
- /* M/S=music speech switch code */
- if (*music != ((blk & 0x0008) >> 3)) {
- *music = (blk & 0x0008) >> 3;
- *dirty = fm_true; /* yes, we got new music code */
- } else {
- *dirty = fm_false; /* music is the same as last one */
- }
-
- WCN_DBG(FM_INF | RDSC, "Music=%d, %s\n", (fm_s32) *music, *dirty ? "new" : "old");
- return ret;
-}
-
-/*
- * rds_g0_ps_addr_get
- * To get ps addr form blockB, blkB b0~b1
- * If success return 0, else return error code
-*/
-static fm_s32 rds_g0_ps_addr_get(fm_u16 blkB, fm_u8 *addr)
-{
- FMR_ASSERT(addr);
- *addr = (fm_u8) blkB & 0x03;
-
- WCN_DBG(FM_INF | RDSC, "addr=0x%02x\n", *addr);
- return 0;
-}
-
-/*
- * rds_g0_di_flag_get
- * To get DI segment flag form blockB, blkB b2
- * If success return 0, else return error code
-*/
-static fm_s32 rds_g0_di_flag_get(fm_u16 blkB, fm_u8 *flag)
-{
- FMR_ASSERT(flag);
- *flag = (fm_u8) ((blkB & 0x0004) >> 2);
-
- WCN_DBG(FM_INF | RDSC, "flag=0x%02x\n", *flag);
- return 0;
-}
-
-static fm_s32 rds_g0_ps_get(fm_u16 crc, fm_u16 blkD, fm_u8 addr, fm_u8 *buf)
-{
-/* fm_bool valid = fm_false; */
- fm_s32 idx = 0;
-
- FMR_ASSERT(buf);
-
- /* ps segment addr rang 0~3 */
- if (addr > 0x03) {
- WCN_DBG(FM_ERR | RDSC, "addr invalid(0x%02x)\n", addr);
- return -FM_EPARA;
- } else {
- idx = 2 * addr;
- }
-
- buf[idx] = blkD >> 8;
- buf[idx + 1] = blkD & 0xFF;
-#if 0
- rds_checksum_check(crc, FM_RDS_GDBK_IND_D, &valid);
-
- if (valid == fm_true) {
- buf[idx] = blkD >> 8;
- buf[idx + 1] = blkD & 0xFF;
- } else {
- WCN_DBG(FM_ERR | RDSC, "ps crc check err\n");
- return -FM_ECRC;
- }
-#endif
-
- WCN_DBG(FM_NTC | RDSC, "PS:addr[%02x]:0x%02x 0x%02x\n", addr, buf[idx], buf[idx + 1]);
- return 0;
-}
-
-/*
- * rds_g0_ps_cmp
- * this function is the most importent flow for PS parsing
- * 1.Compare fresh buf with once buf per byte, if eque copy this byte to twice buf, else copy it to once buf
- * 2.Check wether we got a full segment
- * If success return 0, else return error code
-*/
-static fm_s32 rds_g0_ps_cmp(fm_u8 addr, fm_u16 cbc, fm_u8 *fresh,
- fm_u8 *once, fm_u8 *twice, /*fm_bool *valid, */ fm_u8 *bm)
-{
- fm_s32 ret = 0, indx;
- /* fm_s32 i = 0; */
- /* fm_s32 j = 0; */
- /* fm_s32 cnt = 0; */
- fm_u8 AF_H, AF_L, PS_Num;
- /* fm_u8 corrBitCnt_BlkB, corrBitCnt_BlkD; */
- static fm_s8 Pre_PS_Num = -1;
-
- FMR_ASSERT(fresh);
- FMR_ASSERT(once);
- FMR_ASSERT(twice);
-
- if (addr > 3) { /* ps limited in 8 chars */
- WCN_DBG(FM_NTC | RDSC, "PS Address error, addr=%x\n", addr);
- return -1;
- }
-
- /* j = 2; // PS segment width */
- PS_Num = addr;
- /* corrBitCnt_BlkB = rds_cbc_get(cbc, RDS_BLK_B); */
- /* corrBitCnt_BlkD = rds_cbc_get(cbc, RDS_BLK_D); */
-
- AF_H = once[2 * PS_Num];
- AF_L = once[2 * PS_Num + 1];
- if ((AF_H == fresh[2 * PS_Num]) && (AF_L == fresh[2 * PS_Num + 1])) {
- twice[2 * PS_Num] = once[2 * PS_Num];
- twice[2 * PS_Num + 1] = once[2 * PS_Num + 1];
- *bm |= 1 << PS_Num;
- } else {
- if (PS_Num - Pre_PS_Num > 1) {
- for (indx = Pre_PS_Num + 1; indx < PS_Num; indx++) {
- *bm &= ~(1 << indx);
- once[2 * indx] = 0x00;
- once[2 * indx + 1] = 0x00;
- twice[2 * indx] = 0x00;
- twice[2 * indx + 1] = 0x00;
- }
- } else if (PS_Num - Pre_PS_Num < 1) {
- for (indx = 0; indx < PS_Num; indx++) {
- *bm &= ~(1 << indx);
- once[2 * indx] = 0x00;
- once[2 * indx + 1] = 0x00;
- twice[2 * indx] = 0x00;
- twice[2 * indx + 1] = 0x00;
- }
- }
-
- if ((once[2 * PS_Num] != 0) || (once[2 * PS_Num + 1] != 0)) {
- for (indx = PS_Num; indx < 4; indx++) {
- *bm &= ~(1 << indx);
- }
- }
- /* if((corrBitCnt_BlkB == 0) && (corrBitCnt_BlkD == 0)) */
- /* ALPS00523685:6627 CBC sometime is unreliable */
-#ifdef RDS_CBC_DEPENDENCY
- if (cbc == 0) {
- *bm |= 1 << PS_Num;
- once[2 * PS_Num] = fresh[2 * PS_Num];
- once[2 * PS_Num + 1] = fresh[2 * PS_Num + 1];
- twice[2 * PS_Num] = fresh[2 * PS_Num];
- twice[2 * PS_Num + 1] = fresh[2 * PS_Num + 1];
- } else
-#endif
- {
- once[2 * PS_Num] = fresh[2 * PS_Num];
- once[2 * PS_Num + 1] = fresh[2 * PS_Num + 1];
- }
- }
-
- Pre_PS_Num = PS_Num;
-#if 0
- if (rds_cbc_get(cbc, RDS_BLK_D) == 0) {
- once[j * addr] = fresh[j * addr];
- once[j * addr + 1] = fresh[j * addr + 1];
- }
- if ((once[j * addr] == fresh[j * addr]) && (once[j * addr + 1] == fresh[j * addr + 1])) {
- twice[j * addr] = once[j * addr];
- twice[j * addr + 1] = once[j * addr + 1];
- *valid = fm_true;
- } else {
- once[j * addr] = fresh[j * addr];
- once[j * addr + 1] = fresh[j * addr + 1];
- *valid = fm_false;
- }
-#endif
-#if 0
- for (i = 0; i < j; i++) {
- if (fresh[j * addr + i] == once[j * addr + i]) {
- twice[j * addr + i] = once[j * addr + i]; /* get the same byte 2 times */
- cnt++;
- } else {
- once[j * addr + i] = fresh[j * addr + i]; /* use new val */
- }
- }
-
- /* check if we got a valid segment */
- if (cnt == j) {
- *valid = fm_true;
- } else {
- *valid = fm_false;
- }
-#endif
- /* WCN_DBG(FM_NTC | RDSC, "PS seg=%s\n", *valid == fm_true ? "fm_true" : "fm_false"); */
- WCN_DBG(FM_NTC | RDSC, "bitmap=%x\n", *bm);
- WCN_DBG(FM_NTC | RDSC, "PS[1]=%x %x %x %x %x %x %x %x\n", once[0], once[1], once[2],
- once[3], once[4], once[5], once[6], once[7]);
- WCN_DBG(FM_NTC | RDSC, "PS[2]=%x %x %x %x %x %x %x %x\n", twice[0], twice[1], twice[2],
- twice[3], twice[4], twice[5], twice[6], twice[7]);
- return ret;
-}
-
-struct rds_bitmap {
- fm_u16 bm;
- fm_s32 cnt;
- fm_s32 max_addr;
- fm_u16(*bm_get) (struct rds_bitmap *thiz);
- fm_s32(*bm_cnt_get) (struct rds_bitmap *thiz);
- fm_s32(*bm_get_pos) (struct rds_bitmap *thiz);
- fm_s32(*bm_clr) (struct rds_bitmap *thiz);
- fm_s32(*bm_cmp) (struct rds_bitmap *thiz, struct rds_bitmap *that);
- fm_s32(*bm_set) (struct rds_bitmap *thiz, fm_u8 addr);
-};
-
-static fm_u16 rds_bm_get(struct rds_bitmap *thiz)
-{
- return thiz->bm;
-}
-
-static fm_s32 rds_bm_cnt_get(struct rds_bitmap *thiz)
-{
- return thiz->cnt;
-}
-
-#define FM_RDS_USE_SOLUTION_B
-
-static fm_s32 rds_bm_get_pos(struct rds_bitmap *thiz)
-{
- fm_s32 i = thiz->max_addr;
- fm_s32 j;
-
- j = 0;
-
- while (!(thiz->bm & (1 << i)) && (i > -1)) {
- i--;
- }
-
-#ifdef FM_RDS_USE_SOLUTION_B
- for (j = i; j >= 0; j--) {
- if (!(thiz->bm & (1 << j))) {
- WCN_DBG(FM_NTC | RDSC, "uncomplete msg 0x%04x, delete it\n", thiz->bm);
- return -1;
- }
- }
-#endif
-
- return i;
-}
-
-static fm_s32 rds_bm_clr(struct rds_bitmap *thiz)
-{
- thiz->bm = 0x0000;
- thiz->cnt = 0;
- return 0;
-}
-
-static fm_s32 rds_bm_cmp(struct rds_bitmap *bitmap1, struct rds_bitmap *bitmap2)
-{
- return (fm_s32) (bitmap1->bm - bitmap2->bm);
-}
-
-static fm_s32 rds_bm_set(struct rds_bitmap *thiz, fm_u8 addr)
-{
- struct rds_bitmap bm_old;
-
- /* text segment addr rang */
- if (addr > thiz->max_addr) {
- WCN_DBG(FM_ERR | RDSC, "addr invalid(0x%02x)\n", addr);
- return -FM_EPARA;
- }
-
- bm_old.bm = thiz->bm;
- thiz->bm |= (1 << addr); /* set bitmap */
-
- if (!rds_bm_cmp(&bm_old, thiz)) {
- thiz->cnt++; /* multi get a segment */
- } else if (thiz->cnt > 0) {
- thiz->cnt--;
- }
-
- return 0;
-}
-
-
-/*
- * rds_g2_rt_addr_get
- * To get rt addr form blockB
- * If success return 0, else return error code
-*/
-static fm_s32 rds_g2_rt_addr_get(fm_u16 blkB, fm_u8 *addr)
-{
- fm_s32 ret = 0;
-
- FMR_ASSERT(addr);
- *addr = (fm_u8) blkB & 0x0F;
-
- WCN_DBG(FM_INF | RDSC, "addr=0x%02x\n", *addr);
- return ret;
-}
-
-static fm_s32 rds_g2_txtAB_get(fm_u16 blk, fm_u8 *txtAB, fm_bool *dirty)
-{
- fm_s32 ret = 0;
- static fm_bool once_dirty = fm_false;
-
- FMR_ASSERT(txtAB);
- FMR_ASSERT(dirty);
-
- *dirty = fm_false;
- if (*txtAB != ((blk & 0x0010) >> 4)) {
- if (once_dirty) {
- *txtAB = (blk & 0x0010) >> 4;
- *dirty = fm_true; /* yes, we got new txtAB code */
- once_dirty = fm_false;
- WCN_DBG(FM_NTC | RDSC, "changed! txtAB=%d\n", *txtAB);
- return ret;
- }
- once_dirty = fm_true;
- } else {
- once_dirty = fm_false; /* txtAB is the same as last one */
- }
-
- WCN_DBG(FM_INF | RDSC, "txtAB=%d, %s\n", *txtAB, *dirty ? "new" : "old");
- return ret;
-}
-
-static fm_s32 rds_g2_rt_get(fm_u16 crc, fm_u8 subtype, fm_u16 blkC, fm_u16 blkD, fm_u8 addr,
- fm_u8 *buf)
-{
- fm_s32 ret = 0;
- fm_bool valid = fm_false;
- fm_s32 idx = 0;
-
- FMR_ASSERT(buf);
-
- /* text segment addr rang 0~15 */
- if (addr > 0x0F) {
- WCN_DBG(FM_ERR | RDSC, "addr invalid(0x%02x)\n", addr);
- ret = -FM_EPARA;
- return ret;
- }
-
- switch (subtype) {
- case RDS_GRP_VER_A:
- idx = 4 * addr;
- ret = rds_checksum_check(crc, FM_RDS_GDBK_IND_C | FM_RDS_GDBK_IND_D, &valid);
-
- if (valid == fm_true) {
- buf[idx] = blkC >> 8;
- buf[idx + 1] = blkC & 0xFF;
- buf[idx + 2] = blkD >> 8;
- buf[idx + 3] = blkD & 0xFF;
- } else {
- WCN_DBG(FM_ERR | RDSC, "rt crc check err\n");
- ret = -FM_ECRC;
- }
-
- break;
- case RDS_GRP_VER_B:
- idx = 2 * addr;
- ret = rds_checksum_check(crc, FM_RDS_GDBK_IND_D, &valid);
-
- if (valid == fm_true) {
- buf[idx] = blkD >> 8;
- buf[idx + 1] = blkD & 0xFF;
- } else {
- WCN_DBG(FM_ERR | RDSC, "rt crc check err\n");
- ret = -FM_ECRC;
- }
-
- break;
- default:
- break;
- }
-
- WCN_DBG(FM_NTC | RDSC, "fresh addr[%02x]:0x%02x%02x 0x%02x%02x\n", addr, buf[idx],
- buf[idx + 1], buf[idx + 2], buf[idx + 3]);
- return ret;
-}
-
-static fm_s32 rds_g2_rt_get_len(fm_u8 subtype, fm_s32 pos, fm_s32 *len)
-{
- fm_s32 ret = 0;
-
- FMR_ASSERT(len);
-
- if (subtype == RDS_GRP_VER_A) {
- *len = 4 * (pos + 1);
- } else {
- *len = 2 * (pos + 1);
- }
-
- return ret;
-}
-
-/*
- * rds_g2_rt_cmp
- * this function is the most importent flow for RT parsing
- * 1.Compare fresh buf with once buf per byte, if eque copy this byte to twice buf, else copy it to once buf
- * 2.Check wether we got a full segment, for typeA if copyed 4bytes to twice buf, for typeB 2bytes copyed to twice buf
- * 3.Check wether we got the end of RT, if we got 0x0D
- * 4.If we got the end, then caculate the RT lenth
- * If success return 0, else return error code
-*/
-static fm_s32 rds_g2_rt_cmp(fm_u8 addr, fm_u16 cbc, fm_u8 subtype, fm_u8 *fresh,
- fm_u8 *once, fm_u8 *twice,
- fm_bool *valid /*, fm_bool *end, fm_s32 *len */)
-{
- fm_s32 ret = 0;
- fm_s32 i = 0;
- fm_s32 j = 0;
- fm_s32 cnt = 0;
-
- FMR_ASSERT(fresh);
- FMR_ASSERT(once);
- FMR_ASSERT(twice);
- FMR_ASSERT(valid);
-/* FMR_ASSERT(end); */
-
- j = (subtype == RDS_GRP_VER_A) ? 4 : 2; /* RT segment width */
-
- if (subtype == RDS_GRP_VER_A) {
- /* if (rds_cbc_get(cbc, RDS_BLK_C) == 0) */
-#ifdef RDS_CBC_DEPENDENCY
- if (cbc == 0)
-#endif
- {
- once[j * addr + 0] = fresh[j * addr + 0];
- once[j * addr + 1] = fresh[j * addr + 1];
- /* } */
-
- /* if (rds_cbc_get(cbc, RDS_BLK_D) == 0) */
- /* { */
- once[j * addr + 2] = fresh[j * addr + 2];
- once[j * addr + 3] = fresh[j * addr + 3];
- }
- } else if (subtype == RDS_GRP_VER_B) {
- /* if (rds_cbc_get(cbc, RDS_BLK_D) == 0) */
-#ifdef RDS_CBC_DEPENDENCY
- if (cbc == 0)
-#endif
- {
- once[j * addr + 0] = fresh[j * addr + 0];
- once[j * addr + 1] = fresh[j * addr + 1];
- }
- }
-#ifdef RDS_CBC_DEPENDENCY
- for (i = 0; i < j; i++) {
- if (fresh[j * addr + i] == once[j * addr + i]) {
- twice[j * addr + i] = once[j * addr + i]; /* get the same byte 2 times */
- cnt++;
- WCN_DBG(FM_NTC | RDSC, "twice=%d\n", j * addr + i);
- } else {
- once[j * addr + i] = fresh[j * addr + i]; /* use new val */
- WCN_DBG(FM_NTC | RDSC, "once=%d\n", j * addr + i);
- }
- }
-#else
- for (i = 0; i < j; i++) {
- if (twice[j * addr + i] == once[j * addr + i]) {
- cnt++;
- WCN_DBG(FM_NTC | RDSC, "twice=%d\n", j * addr + i);
- } else {
- twice[j * addr + i] = once[j * addr + i];
- WCN_DBG(FM_NTC | RDSC, "once=%d\n", j * addr + i);
- }
- }
-#endif
-
- /* check if we got a valid segment 4bytes for typeA, 2bytes for typeB */
- if (cnt == j) {
- *valid = fm_true;
- } else {
- *valid = fm_false;
- }
-
- WCN_DBG(FM_INF | RDSC, "RT seg=%s\n", *valid == fm_true ? "fm_true" : "fm_false");
-/* WCN_DBG(FM_INF | RDSC, "RT end=%s\n", *end == fm_true ? "fm_true" : "fm_false"); */
-/* WCN_DBG(FM_INF | RDSC, "RT len=%d\n", *len); */
- return ret;
-}
-
-/*
- * rds_g2_rt_check_end
- * check 0x0D end flag
- * If we got the end, then caculate the RT lenth
- * If success return 0, else return error code
-*/
-static fm_s32 rds_g2_rt_check_end(fm_u8 addr, fm_u8 subtype, fm_u8 *twice, fm_bool *end)
-{
- fm_s32 i = 0;
- fm_s32 j = 0;
-
- FMR_ASSERT(twice);
- FMR_ASSERT(end);
-
- j = (subtype == RDS_GRP_VER_A) ? 4 : 2; /* RT segment width */
- *end = fm_false;
-
- for (i = 0; i < j; i++) {
- /* if we got 0x0D twice, it means a RT end */
- if (twice[j * addr + i] == 0x0D) {
- *end = fm_true;
- WCN_DBG(FM_NTC | RDSC, "get 0x0D\n");
- break;
- }
- }
-
- return 0;
-}
-
-static fm_s32 rds_retrieve_g0_af(fm_u16 *block_data, fm_u8 SubType, rds_t *pstRDSData)
-{
- static fm_s16 preAF_Num;
- fm_u8 indx, indx2, AF_H, AF_L, num;
- fm_s32 ret = 0;
- fm_bool valid = fm_false;
- fm_bool dirty = fm_false;
- fm_u16 *event = &pstRDSData->event_status;
- fm_u32 *flag = &pstRDSData->RDSFlag.flag_status;
-
-/* ret = rds_checksum_check(block_data[4], FM_RDS_GDBK_IND_D, &valid); */
-
-/* if (valid == fm_false) { */
-/* WCN_DBG(FM_WAR | RDSC, "Group0 BlockD crc err\n"); */
-/* return -FM_ECRC; */
-/* } */
-
- ret = rds_g0_ta_get(block_data[1], &pstRDSData->RDSFlag.TA, &dirty);
-
- if (ret) {
- WCN_DBG(FM_WAR | RDSC, "get ta failed[ret=%d]\n", ret);
- } else if (dirty == fm_true) {
- ret = rds_event_set(event, RDS_EVENT_FLAGS); /* yes, we got new TA code */
- ret = rds_flag_set(flag, RDS_FLAG_IS_TA);
- }
-
- ret = rds_g0_music_get(block_data[1], &pstRDSData->RDSFlag.Music, &dirty);
-
- if (ret) {
- WCN_DBG(FM_WAR | RDSC, "get music failed[ret=%d]\n", ret);
- } else if (dirty == fm_true) {
- ret = rds_event_set(event, RDS_EVENT_FLAGS); /* yes, we got new MUSIC code */
- ret = rds_flag_set(flag, RDS_FLAG_IS_MUSIC);
- }
-
- if ((pstRDSData->Switch_TP) && (pstRDSData->RDSFlag.TP) && !(pstRDSData->RDSFlag.TA)) {
- ret = rds_event_set(event, RDS_EVENT_TAON_OFF);
- }
-
- if (!SubType) {
- /* Type A */
- ret = rds_checksum_check(block_data[4], FM_RDS_GDBK_IND_C, &valid);
-
- if (valid == fm_false) {
- WCN_DBG(FM_WAR | RDSC, "Group0 BlockC crc err\n");
- return -FM_ECRC;
- } else {
- AF_H = (block_data[2] & 0xFF00) >> 8;
- AF_L = block_data[2] & 0x00FF;
-
- if ((AF_H > 224) && (AF_H < 250)) {
- /* Followed AF Number, see RDS spec Table 11, valid(224-249) */
- WCN_DBG(FM_NTC | RDSC, "RetrieveGroup0 AF_H:%d, AF_L:%d\n", AF_H,
- AF_L);
- preAF_Num = AF_H - 224; /* AF Number */
-
- if (preAF_Num != pstRDSData->AF_Data.AF_Num) {
- pstRDSData->AF_Data.AF_Num = preAF_Num;
- pstRDSData->AF_Data.isAFNum_Get = 0;
- } else {
- /* Get the same AFNum two times */
- pstRDSData->AF_Data.isAFNum_Get = 1;
- }
-
- if ((AF_L < 205) && (AF_L > 0)) {
- /* See RDS Spec table 10, valid VHF */
- pstRDSData->AF_Data.AF[0][0] = AF_L + 875; /* convert to 100KHz */
-#ifdef CONFIG_MTK_FM_50KHZ_SUPPORT
- pstRDSData->AF_Data.AF[0][0] *= 10;
-#endif
- WCN_DBG(FM_NTC | RDSC, "RetrieveGroup0 AF[0][0]:%d\n",
- pstRDSData->AF_Data.AF[0][0]);
-
- if ((pstRDSData->AF_Data.AF[0][0]) !=
- (pstRDSData->AF_Data.AF[1][0])) {
- pstRDSData->AF_Data.AF[1][0] =
- pstRDSData->AF_Data.AF[0][0];
- } else {
- if (pstRDSData->AF_Data.AF[1][0] != rds_get_freq())
- pstRDSData->AF_Data.isMethod_A = 1;
- else
- pstRDSData->AF_Data.isMethod_A = 0;
- }
-
- WCN_DBG(FM_NTC | RDSC,
- "RetrieveGroup0 isAFNum_Get:%d, isMethod_A:%d\n",
- pstRDSData->AF_Data.isAFNum_Get,
- pstRDSData->AF_Data.isMethod_A);
-
- /* only one AF handle */
- if ((pstRDSData->AF_Data.isAFNum_Get)
- && (pstRDSData->AF_Data.AF_Num == 1)) {
- pstRDSData->AF_Data.Addr_Cnt = 0xFF;
- pstRDSData->event_status |= RDS_EVENT_AF_LIST;
- WCN_DBG(FM_NTC | RDSC,
- "RetrieveGroup0 RDS_EVENT_AF_LIST update\n");
- }
- }
- } else if ((pstRDSData->AF_Data.isAFNum_Get)
- && (pstRDSData->AF_Data.Addr_Cnt != 0xFF)) {
- /* AF Num correct */
- num = pstRDSData->AF_Data.AF_Num;
- num = (num > 25) ? 25 : num;
- num = num >> 1;
- WCN_DBG(FM_NTC | RDSC, "RetrieveGroup0 +num:%d\n", num);
-
- /* Put AF freq fm_s32o buffer and check if AF freq is repeat again */
- for (indx = 1; indx < (num + 1); indx++) {
- if ((AF_H == (pstRDSData->AF_Data.AF[0][2 * indx - 1]))
- && (AF_L == (pstRDSData->AF_Data.AF[0][2 * indx]))) {
- WCN_DBG(FM_ERR | RDSC,
- "RetrieveGroup0 AF same as indx:%d\n",
- indx);
- break;
- } else if (!(pstRDSData->AF_Data.AF[0][2 * indx - 1])) {
- /* null buffer */
- pstRDSData->AF_Data.AF[0][2 * indx - 1] = AF_H + 875; /* convert to 100KHz */
- pstRDSData->AF_Data.AF[0][2 * indx] = AF_L + 875;
-
-#ifdef CONFIG_MTK_FM_50KHZ_SUPPORT
- pstRDSData->AF_Data.AF[0][2 * indx - 1] *= 10;
- pstRDSData->AF_Data.AF[0][2 * indx] *= 10;
-#endif
- WCN_DBG(FM_NTC | RDSC,
- "RetrieveGroup0 AF[0][%d]:%d, AF[0][%d]:%d\n",
- 2 * indx - 1,
- pstRDSData->AF_Data.AF[0][2 * indx - 1],
- 2 * indx,
- pstRDSData->AF_Data.AF[0][2 * indx]);
- break;
- }
- }
-
- num = pstRDSData->AF_Data.AF_Num;
- num = (num > 25) ? 25 : num;
- WCN_DBG(FM_NTC | RDSC, "RetrieveGroup0 ++num:%d\n", num);
-
- if (num > 0) {
- if ((pstRDSData->AF_Data.AF[0][num - 1]) != 0) {
- num = num >> 1;
- WCN_DBG(FM_NTC | RDSC, "RetrieveGroup0 +++num:%d\n",
- num);
-
- /* arrange frequency from low to high:start */
- for (indx = 1; indx < num; indx++) {
- for (indx2 = indx + 1; indx2 < (num + 1);
- indx2++) {
- AF_H =
- pstRDSData->AF_Data.AF[0][2 *
- indx -
- 1];
- AF_L =
- pstRDSData->AF_Data.AF[0][2 *
- indx];
-
- if (AF_H >
- (pstRDSData->AF_Data.
- AF[0][2 * indx2 - 1])) {
- pstRDSData->AF_Data.
- AF[0][2 * indx - 1] =
- pstRDSData->AF_Data.
- AF[0][2 * indx2 - 1];
- pstRDSData->AF_Data.
- AF[0][2 * indx] =
- pstRDSData->AF_Data.
- AF[0][2 * indx2];
- pstRDSData->AF_Data.
- AF[0][2 * indx2 - 1] =
- AF_H;
- pstRDSData->AF_Data.
- AF[0][2 * indx2] = AF_L;
- } else if (AF_H ==
- (pstRDSData->AF_Data.
- AF[0][2 * indx2 - 1])) {
- if (AF_L >
- (pstRDSData->AF_Data.
- AF[0][2 * indx2])) {
- pstRDSData->AF_Data.
- AF[0][2 * indx -
- 1] =
- pstRDSData->
- AF_Data.
- AF[0][2 *
- indx2 -
- 1];
- pstRDSData->AF_Data.
- AF[0][2 *
- indx] =
- pstRDSData->
- AF_Data.
- AF[0][2 *
- indx2];
- pstRDSData->AF_Data.
- AF[0][2 *
- indx2 -
- 1] = AF_H;
- pstRDSData->AF_Data.
- AF[0][2 *
- indx2] =
- AF_L;
- }
- }
- }
- }
-
- /* arrange frequency from low to high:end */
- /* compare AF buff0 and buff1 data:start */
- num = pstRDSData->AF_Data.AF_Num;
- num = (num > 25) ? 25 : num;
- indx2 = 0;
-
- for (indx = 0; indx < num; indx++) {
- if ((pstRDSData->AF_Data.AF[1][indx]) ==
- (pstRDSData->AF_Data.AF[0][indx])) {
- if (pstRDSData->AF_Data.
- AF[1][indx] != 0)
- indx2++;
- } else
- pstRDSData->AF_Data.AF[1][indx] =
- pstRDSData->AF_Data.AF[0][indx];
- }
-
- WCN_DBG(FM_NTC | RDSC,
- "RetrieveGroup0 indx2:%d, num:%d\n", indx2,
- num);
-
- /* compare AF buff0 and buff1 data:end */
- if (indx2 == num) {
- pstRDSData->AF_Data.Addr_Cnt = 0xFF;
- pstRDSData->event_status |=
- RDS_EVENT_AF_LIST;
- WCN_DBG(FM_NTC | RDSC,
- "RetrieveGroup0 AF_Num:%d\n",
- pstRDSData->AF_Data.AF_Num);
-
- for (indx = 0; indx < num; indx++) {
- if ((pstRDSData->AF_Data.
- AF[1][indx]) == 0) {
- pstRDSData->AF_Data.
- Addr_Cnt = 0x0F;
- pstRDSData->event_status &=
- (~RDS_EVENT_AF_LIST);
- }
- }
- } else
- pstRDSData->AF_Data.Addr_Cnt = 0x0F;
- }
- }
- }
- }
- }
-
- return ret;
-}
-
-static fm_s32 rds_retrieve_g0_di(fm_u16 *block_data, fm_u8 SubType, rds_t *pstRDSData)
-{
- fm_u8 DI_Code, DI_Flag;
- fm_s32 ret = 0;
-/* fm_bool valid = fm_false; */
-
- fm_u16 *event = &pstRDSData->event_status;
- fm_u32 *flag = &pstRDSData->RDSFlag.flag_status;
-
- /* parsing Program service name segment (in BlockD) */
-/* ret = rds_checksum_check(block_data[4], FM_RDS_GDBK_IND_D, &valid); */
-
-/* if (valid == fm_false) { */
-/* WCN_DBG(FM_WAR | RDSC, "Group0 BlockD crc err\n"); */
-/* return -FM_ECRC; */
-/* } */
-
- rds_g0_ps_addr_get(block_data[1], &DI_Code);
- rds_g0_di_flag_get(block_data[1], &DI_Flag);
-
- switch (DI_Code) {
- case 3:
-
- if (pstRDSData->RDSFlag.Stereo != DI_Flag) {
- pstRDSData->RDSFlag.Stereo = DI_Flag;
- ret = rds_event_set(event, RDS_EVENT_FLAGS);
- ret = rds_flag_set(flag, RDS_FLAG_IS_STEREO);
- }
-
- break;
- case 2:
-
- if (pstRDSData->RDSFlag.Artificial_Head != DI_Flag) {
- pstRDSData->RDSFlag.Artificial_Head = DI_Flag;
- ret = rds_event_set(event, RDS_EVENT_FLAGS);
- ret = rds_flag_set(flag, RDS_FLAG_IS_ARTIFICIAL_HEAD);
- }
-
- break;
- case 1:
-
- if (pstRDSData->RDSFlag.Compressed != DI_Flag) {
- pstRDSData->RDSFlag.Compressed = DI_Flag;
- ret = rds_event_set(event, RDS_EVENT_FLAGS);
- ret = rds_flag_set(flag, RDS_FLAG_IS_COMPRESSED);
- }
-
- break;
- case 0:
-
- if (pstRDSData->RDSFlag.Dynamic_PTY != DI_Flag) {
- pstRDSData->RDSFlag.Dynamic_PTY = DI_Flag;
- ret = rds_event_set(event, RDS_EVENT_FLAGS);
- ret = rds_flag_set(flag, RDS_FLAG_IS_DYNAMIC_PTY);
- }
-
- break;
- default:
- break;
- }
-
- return ret;
-}
-
-static fm_s32 rds_retrieve_g0_ps(fm_u16 *block_data, fm_u8 SubType, rds_t *pstRDSData)
-{
- fm_u8 ps_addr;
- fm_s32 ret = 0, i, num;
- fm_bool valid = fm_false;
-/* fm_s32 pos = 0; */
- static struct fm_state_machine ps_sm = {
- .state = RDS_PS_START,
- .state_get = fm_state_get,
- .state_set = fm_state_set,
- };
-#if 0
- static struct rds_bitmap ps_bm = {
- .bm = 0,
- .cnt = 0,
- .max_addr = 0x03,
- .bm_get = rds_bm_get,
- .bm_cnt_get = rds_bm_cnt_get,
- .bm_set = rds_bm_set,
- .bm_get_pos = rds_bm_get_pos,
- .bm_clr = rds_bm_clr,
- .bm_cmp = rds_bm_cmp,
- };
-#endif
- fm_u16 *event = &pstRDSData->event_status;
-
- /* parsing Program service name segment (in BlockD) */
- ret = rds_checksum_check(block_data[4], FM_RDS_GDBK_IND_D, &valid);
-
- if (valid == fm_false) {
- WCN_DBG(FM_WAR | RDSC, "Group0 BlockD crc err\n");
- return -FM_ECRC;
- }
-
- rds_g0_ps_addr_get(block_data[1], &ps_addr);
-
- /* PS parsing state machine run */
- while (1) {
- switch (STATE_GET(&ps_sm)) {
- case RDS_PS_START:
-
- if (rds_g0_ps_get
- (block_data[4], block_data[3], ps_addr, pstRDSData->PS_Data.PS[0])) {
- STATE_SET(&ps_sm, RDS_PS_FINISH); /* if CRC error, we should not do parsing */
- break;
- }
-
- rds_g0_ps_cmp(ps_addr, block_data[5], pstRDSData->PS_Data.PS[0],
- pstRDSData->PS_Data.PS[1], pstRDSData->PS_Data.PS[2],
- /*&valid, */ &pstRDSData->PS_Data.Addr_Cnt);
-
- /* if (valid == fm_true) { */
- /* ps_bm.bm_set(&ps_bm, ps_addr); */
- /* } */
-
- STATE_SET(&ps_sm, RDS_PS_DECISION);
- break;
- case RDS_PS_DECISION:
-
- if (pstRDSData->PS_Data.Addr_Cnt == 0x000F) /* get max 8 chars */
- /* ps shouldn't check bm_cnt */
- /* || (ps_bm.bm_cnt_get(&ps_bm) > RDS_RT_MULTI_REV_TH)) { //repeate many times, but no end char get */
- {
- /* pos = ps_bm.bm_get_pos(&ps_bm); */
- STATE_SET(&ps_sm, RDS_PS_GETLEN);
- } else {
- STATE_SET(&ps_sm, RDS_PS_FINISH);
- }
-
- break;
- case RDS_PS_GETLEN:
-
- /* if (pos == ps_bm.max_addr) */
- {
- num = 0;
- WCN_DBG(FM_NTC | RDSC, "PS[3]=%x %x %x %x %x %x %x %x\n",
- pstRDSData->PS_Data.PS[3][0],
- pstRDSData->PS_Data.PS[3][1],
- pstRDSData->PS_Data.PS[3][2],
- pstRDSData->PS_Data.PS[3][3],
- pstRDSData->PS_Data.PS[3][4],
- pstRDSData->PS_Data.PS[3][5],
- pstRDSData->PS_Data.PS[3][6], pstRDSData->PS_Data.PS[3][7]);
- for (i = 0; i < 8; i++) /* compare with last PS. */
- {
- if (pstRDSData->PS_Data.PS[3][i] ==
- pstRDSData->PS_Data.PS[2][i]) {
- num++;
- }
- }
- if (num != 8) {
- num = 0;
- for (i = 0; i < 8; i++) {
- /* even ps=0x20 and bitmap=0xF, send event to host to cover last ps. */
- if (/*(pstRDSData->PS_Data.PS[2][i]==0x20)|| */
- (pstRDSData->PS_Data.PS[2][i] == 0x0)) {
- num++;
- }
- }
- if (num != 8) {
- fm_memcpy(pstRDSData->PS_Data.PS[3],
- pstRDSData->PS_Data.PS[2], 8);
- rds_event_set(event, RDS_EVENT_PROGRAMNAME); /* yes we got a new PS */
- WCN_DBG(FM_NTC | RDSC, "Yes, get an PS!\n");
- } else {
- /* clear bitmap */
- pstRDSData->PS_Data.Addr_Cnt = 0;
- }
- } else {
- /* if px3==ps2,clear bitmap */
- pstRDSData->PS_Data.Addr_Cnt = 0;
- /* clear buf */
- fm_memset(pstRDSData->PS_Data.PS[0], 0x00, 8);
- fm_memset(pstRDSData->PS_Data.PS[1], 0x00, 8);
- fm_memset(pstRDSData->PS_Data.PS[2], 0x00, 8);
- }
- }
-#if 0
- ps_bm.bm_clr(&ps_bm);
- /* clear buf */
- fm_memset(pstRDSData->PS_Data.PS[0], 0x20, 8);
- fm_memset(pstRDSData->PS_Data.PS[1], 0x20, 8);
- fm_memset(pstRDSData->PS_Data.PS[2], 0x20, 8);
-#endif
- STATE_SET(&ps_sm, RDS_PS_FINISH);
- break;
- case RDS_PS_FINISH:
- STATE_SET(&ps_sm, RDS_PS_START);
- goto out;
- break;
- default:
- break;
- }
- }
-
- out:
- return ret;
-}
-
-static fm_s32 rds_retrieve_g0(fm_u16 *block_data, fm_u8 SubType, rds_t *pstRDSData)
-{
- fm_s32 ret = 0;
-
- ret = rds_retrieve_g0_af(block_data, SubType, pstRDSData);
-
- if (ret) {
- return ret;
- }
-
- ret = rds_retrieve_g0_di(block_data, SubType, pstRDSData);
-
- if (ret) {
- return ret;
- }
-
- ret = rds_retrieve_g0_ps(block_data, SubType, pstRDSData);
-
- if (ret) {
- return ret;
- }
-
- return ret;
-}
-
-static fm_s32 rds_retrieve_g1(fm_u16 *block_data, fm_u8 SubType, rds_t *pstRDSData)
-{
- fm_u8 variant_code = (block_data[2] & 0x7000) >> 12;
- fm_s32 ret = 0;
-
- if (variant_code == 0) {
- pstRDSData->Extend_Country_Code = (fm_u8) block_data[2] & 0xFF;
- WCN_DBG(FM_DBG | RDSC, "Extend_Country_Code:%d\n", pstRDSData->Extend_Country_Code);
- } else if (variant_code == 3) {
- pstRDSData->Language_Code = block_data[2] & 0xFFF;
- WCN_DBG(FM_DBG | RDSC, "Language_Code:%d\n", pstRDSData->Language_Code);
- }
-
- pstRDSData->Radio_Page_Code = block_data[1] & 0x001F;
- pstRDSData->Program_Item_Number_Code = block_data[3];
-
- return ret;
-}
-
-static fm_s32 rds_retrieve_g2(fm_u16 *source, fm_u8 subtype, rds_t *target)
-{
- fm_s32 ret = 0;
- fm_u16 crc, cbc;
- fm_u16 blkA, blkB, blkC, blkD;
- fm_u8 *fresh, *once, *twice, *display;
- fm_u16 *event;
- fm_u32 *flag;
- fm_u16 i = 0;
- static struct fm_state_machine rt_sm = {
- .state = RDS_RT_START,
- .state_get = fm_state_get,
- .state_set = fm_state_set,
- };
- static struct rds_bitmap rt_bm = {
- .bm = 0,
- .cnt = 0,
- .max_addr = 0xF,
- .bm_get = rds_bm_get,
- .bm_cnt_get = rds_bm_cnt_get,
- .bm_set = rds_bm_set,
- .bm_get_pos = rds_bm_get_pos,
- .bm_clr = rds_bm_clr,
- .bm_cmp = rds_bm_cmp,
- };
- fm_u8 rt_addr = 0;
- fm_bool txtAB_change = fm_false; /* text AB flag 0 --> 1 or 1-->0 meas new RT incoming */
- fm_bool txt_end = fm_false; /* 0x0D means text end */
- fm_bool seg_ok = 0;
- fm_s32 pos = 0;
- fm_s32 rt_len = 0, indx = 0, invalid_cnt = 0;
- fm_s32 bufsize = 0;
-
- FMR_ASSERT(source);
- FMR_ASSERT(target);
- /* source */
- blkA = source[0];
- blkB = source[1];
- blkC = source[2];
- blkD = source[3];
- crc = source[4];
- cbc = source[5];
- /* target */
- fresh = target->RT_Data.TextData[0];
- once = target->RT_Data.TextData[1];
- twice = target->RT_Data.TextData[2];
- display = target->RT_Data.TextData[3];
- event = &target->event_status;
- flag = &target->RDSFlag.flag_status;
- bufsize = sizeof(target->RT_Data.TextData[0]);
- rt_bm.bm = target->RT_Data.Addr_Cnt;
-
- /* get basic info: addr, txtAB */
- if (rds_g2_rt_addr_get(blkB, &rt_addr))
- return ret;
-
- if (rds_g2_txtAB_get(blkB, &target->RDSFlag.Text_AB, &txtAB_change))
- return ret;
- if (txtAB_change == fm_true) {
- /* clear buf */
- fm_memset(fresh, 0x20, bufsize);
- fm_memset(once, 0x20, bufsize);
- fm_memset(twice, 0x20, bufsize);
- rt_bm.bm_clr(&rt_bm);
- }
- /* RT parsing state machine run */
- while (1) {
- switch (STATE_GET(&rt_sm)) {
- case RDS_RT_START:
- {
-#if 0
- if (txtAB_change == fm_true) {
- STATE_SET(&rt_sm, RDS_RT_DECISION);
- } else
-#endif
- {
- if (rds_g2_rt_get(crc, subtype, blkC, blkD, rt_addr, fresh)
- == 0) {
- /* STATE_SET(&rt_sm, RDS_RT_FINISH); //if CRC error, we should not do parsing */
- /* break; */
- rds_g2_rt_cmp(rt_addr, cbc, subtype, fresh, once,
- twice,
- &seg_ok /*, &txt_end, &rt_len */);
-
- if (seg_ok == fm_true) {
- rt_bm.bm_set(&rt_bm, rt_addr);
- } else /* clear bitmap of rt_addr */
- {
- rt_bm.bm &= ~(1 << rt_addr);
- }
- }
- WCN_DBG(FM_NTC | RDSC, "bitmap=0x%04x, bmcnt=%d\n",
- rt_bm.bm, rt_bm.cnt);
- rds_g2_rt_check_end(rt_addr, subtype, twice, &txt_end);
-
- STATE_SET(&rt_sm, RDS_RT_DECISION);
- }
- break;
- }
- case RDS_RT_DECISION:
- {
- if ((txt_end == fm_true)
- || (rt_bm.bm_get(&rt_bm) == 0xFFFF) /* get max 64 chars */
- || (rt_bm.bm_cnt_get(&rt_bm) > RDS_RT_MULTI_REV_TH)) /* repeate many times, but no end char get */
- {
- pos = rt_bm.bm_get_pos(&rt_bm);
- rds_g2_rt_get_len(subtype, pos, &rt_len);
-
- if (pos == -1) {
- STATE_SET(&rt_sm, RDS_RT_FINISH);
- } else {
- if (rt_addr == pos) {
- STATE_SET(&rt_sm, RDS_RT_GETLEN);
- } else if (pos > rt_addr) {
- rt_bm.bm &= ~(1 << (rt_addr + 1));
- STATE_SET(&rt_sm, RDS_RT_FINISH);
- } else
- STATE_SET(&rt_sm, RDS_RT_FINISH);
- }
-
- if (txt_end == fm_true) {
- for (i = rt_addr + 1; i < rt_bm.max_addr; i++) {
- rt_bm.bm &= ~(1 << i);
- }
- }
- } else {
- STATE_SET(&rt_sm, RDS_RT_FINISH);
- }
-
- break;
- }
- case RDS_RT_GETLEN:
-
- if (rt_len >
- 0 /*&& ((txt_end == fm_true) || (rt_bm.bm_get(&rt_bm) == 0xFFFF)) */) {
- for (indx = 0; indx < rt_len; indx++) {
- if (twice[indx] == 0x20)
- invalid_cnt++;
- }
- if (invalid_cnt != rt_len) {
- if (memcmp(display, twice, bufsize) != 0) {
- fm_memcpy(display, twice, bufsize);
- target->RT_Data.TextLength = rt_len;
- rds_event_set(event, RDS_EVENT_LAST_RADIOTEXT); /* yes we got a new RT */
- WCN_DBG(FM_NTC | RDSC, "Yes, get an RT! [len=%d]\n",
- rt_len);
- }
- rt_bm.bm_clr(&rt_bm);
- /* clear buf */
- fm_memset(fresh, 0x20, bufsize);
- fm_memset(once, 0x20, bufsize);
- fm_memset(twice, 0x20, bufsize);
- } else
- WCN_DBG(FM_NTC | RDSC, "Get 0x20 RT %d\n", invalid_cnt);
- }
-#if 0
- if (txtAB_change == fm_true) {
- txtAB_change = fm_false;
- /* we need get new RT after show the old RT to the display */
- STATE_SET(&rt_sm, RDS_RT_START);
- } else
-#endif
- {
- STATE_SET(&rt_sm, RDS_RT_FINISH);
- }
- break;
- case RDS_RT_FINISH:
- STATE_SET(&rt_sm, RDS_RT_START);
- goto out;
- break;
- default:
- break;
- }
- }
-
- out:
- target->RT_Data.Addr_Cnt = rt_bm.bm;
- return ret;
-}
-
-static fm_s32 rds_retrieve_g4(fm_u16 *block_data, fm_u8 SubType, rds_t *pstRDSData)
-{
- fm_u16 year, month, k = 0, D2, minute;
- fm_u32 MJD, D1;
- fm_s32 ret = 0;
- WCN_DBG(FM_DBG | RDSC, "RetrieveGroup4 %d\n", SubType);
-
- if (!SubType) {
- /* Type A */
- if ((block_data[4] & FM_RDS_GDBK_IND_C) && (block_data[4] & FM_RDS_GDBK_IND_D)) {
- MJD =
- (fm_u32) (((block_data[1] & 0x0003) << 15) +
- ((block_data[2] & 0xFFFE) >> 1));
- year = (MJD * 100 - 1507820) / 36525;
- month = (MJD * 10000 - 149561000 - 3652500 * year) / 306001;
-
- if ((month == 14) || (month == 15))
- k = 1;
-
- D1 = (fm_u32) ((36525 * year) / 100);
- D2 = (fm_u16) ((306001 * month) / 10000);
- pstRDSData->CT.Year = 1900 + year + k;
- pstRDSData->CT.Month = month - 1 - k * 12;
- pstRDSData->CT.Day = (fm_u16) (MJD - 14956 - D1 - D2);
- pstRDSData->CT.Hour =
- ((block_data[2] & 0x0001) << 4) + ((block_data[3] & 0xF000) >> 12);
- minute = (block_data[3] & 0x0FC0) >> 6;
-
- if (block_data[3] & 0x0020) {
- pstRDSData->CT.Local_Time_offset_signbit = 1; /* 0=+, 1=- */
- }
-
- pstRDSData->CT.Local_Time_offset_half_hour = block_data[3] & 0x001F;
-
- if (pstRDSData->CT.Minute != minute) {
- pstRDSData->CT.Minute = (block_data[3] & 0x0FC0) >> 6;
- pstRDSData->event_status |= RDS_EVENT_UTCDATETIME;
- }
- }
- }
-
- return ret;
-}
-
-static fm_s32 rds_retrieve_g14(fm_u16 *block_data, fm_u8 SubType, rds_t *pstRDSData)
-{
- static fm_s16 preAFON_Num;
- fm_u8 TP_ON, TA_ON, PI_ON, PS_Num, AF_H, AF_L, indx, indx2, num;
- fm_s32 ret = 0;
- WCN_DBG(FM_DBG | RDSC, "RetrieveGroup14 %d\n", SubType);
- /* SubType = (*(block_data+1)&0x0800)>>11; */
- PI_ON = block_data[3];
- TP_ON = block_data[1] & 0x0010;
-
- if ((!SubType) && (block_data[4] & FM_RDS_GDBK_IND_C)) {
- /* Type A */
- PS_Num = block_data[1] & 0x000F;
-
- if (PS_Num < 4) {
- for (indx = 0; indx < 2; indx++) {
- pstRDSData->PS_ON[2 * PS_Num] = block_data[2] >> 8;
- pstRDSData->PS_ON[2 * PS_Num + 1] = block_data[2] & 0xFF;
- }
- } else if (PS_Num == 4) {
- AF_H = (block_data[2] & 0xFF00) >> 8;
- AF_L = block_data[2] & 0x00FF;
-
- if ((AF_H > 224) && (AF_H < 250)) {
- /* Followed AF Number */
- pstRDSData->AFON_Data.isAFNum_Get = 0;
- preAFON_Num = AF_H - 224;
-
- if (pstRDSData->AFON_Data.AF_Num != preAFON_Num) {
- pstRDSData->AFON_Data.AF_Num = preAFON_Num;
- } else
- pstRDSData->AFON_Data.isAFNum_Get = 1;
-
- if (AF_L < 205) {
- pstRDSData->AFON_Data.AF[0][0] = AF_L + 875;
-
- if ((pstRDSData->AFON_Data.AF[0][0]) !=
- (pstRDSData->AFON_Data.AF[1][0])) {
- pstRDSData->AFON_Data.AF[1][0] =
- pstRDSData->AFON_Data.AF[0][0];
- } else {
- pstRDSData->AFON_Data.isMethod_A = 1;
- }
- }
- } else if ((pstRDSData->AFON_Data.isAFNum_Get)
- && ((pstRDSData->AFON_Data.Addr_Cnt) != 0xFF)) {
- /* AF Num correct */
- num = pstRDSData->AFON_Data.AF_Num;
- num = (num > 25) ? 25 : num;
- num = num >> 1;
-
- /* Put AF freq fm_s32o buffer and check if AF freq is repeat again */
- for (indx = 1; indx < (num + 1); indx++) {
- if ((AF_H == (pstRDSData->AFON_Data.AF[0][2 * indx - 1]))
- && (AF_L == (pstRDSData->AFON_Data.AF[0][2 * indx]))) {
- WCN_DBG(FM_NTC | RDSC,
- "RetrieveGroup14 AFON same as indx:%d\n",
- indx);
- break;
- } else if (!(pstRDSData->AFON_Data.AF[0][2 * indx - 1])) {
- /* null buffer */
- pstRDSData->AFON_Data.AF[0][2 * indx - 1] =
- AF_H + 875;
- pstRDSData->AFON_Data.AF[0][2 * indx] = AF_L + 875;
- break;
- }
- }
-
- num = pstRDSData->AFON_Data.AF_Num;
- num = (num > 25) ? 25 : num;
- if (num > 0) {
- if ((pstRDSData->AFON_Data.AF[0][num - 1]) != 0) {
- num = num >> 1;
-
- /* arrange frequency from low to high:start */
- for (indx = 1; indx < num; indx++) {
- for (indx2 = indx + 1; indx2 < (num + 1);
- indx2++) {
- AF_H =
- pstRDSData->AFON_Data.AF[0][2 *
- indx
- -
- 1];
- AF_L =
- pstRDSData->AFON_Data.AF[0][2 *
- indx];
-
- if (AF_H >
- (pstRDSData->AFON_Data.
- AF[0][2 * indx2 - 1])) {
- pstRDSData->AFON_Data.
- AF[0][2 * indx - 1] =
- pstRDSData->AFON_Data.
- AF[0][2 * indx2 - 1];
- pstRDSData->AFON_Data.
- AF[0][2 * indx] =
- pstRDSData->AFON_Data.
- AF[0][2 * indx2];
- pstRDSData->AFON_Data.
- AF[0][2 * indx2 - 1] =
- AF_H;
- pstRDSData->AFON_Data.
- AF[0][2 * indx2] = AF_L;
- } else if (AF_H ==
- (pstRDSData->AFON_Data.
- AF[0][2 * indx2 - 1])) {
- if (AF_L >
- (pstRDSData->AFON_Data.
- AF[0][2 * indx2])) {
- pstRDSData->
- AFON_Data.
- AF[0][2 * indx -
- 1] =
- pstRDSData->
- AFON_Data.
- AF[0][2 *
- indx2 -
- 1];
- pstRDSData->
- AFON_Data.
- AF[0][2 *
- indx] =
- pstRDSData->
- AFON_Data.
- AF[0][2 *
- indx2];
- pstRDSData->
- AFON_Data.
- AF[0][2 *
- indx2 -
- 1] = AF_H;
- pstRDSData->
- AFON_Data.
- AF[0][2 *
- indx2] =
- AF_L;
- }
- }
- }
- }
-
- /* arrange frequency from low to high:end */
- /* compare AF buff0 and buff1 data:start */
- num = pstRDSData->AFON_Data.AF_Num;
- num = (num > 25) ? 25 : num;
- indx2 = 0;
-
- for (indx = 0; indx < num; indx++) {
- if ((pstRDSData->AFON_Data.AF[1][indx]) ==
- (pstRDSData->AFON_Data.AF[0][indx])) {
- if (pstRDSData->AFON_Data.
- AF[1][indx] != 0)
- indx2++;
- } else
- pstRDSData->AFON_Data.AF[1][indx] =
- pstRDSData->AFON_Data.
- AF[0][indx];
- }
-
- /* compare AF buff0 and buff1 data:end */
- if (indx2 == num) {
- pstRDSData->AFON_Data.Addr_Cnt = 0xFF;
- pstRDSData->event_status |=
- RDS_EVENT_AFON_LIST;
-
- for (indx = 0; indx < num; indx++) {
- if ((pstRDSData->AFON_Data.
- AF[1][indx]) == 0) {
- pstRDSData->AFON_Data.
- Addr_Cnt = 0x0F;
- pstRDSData->event_status &=
- (~RDS_EVENT_AFON_LIST);
- }
- }
- } else
- pstRDSData->AFON_Data.Addr_Cnt = 0x0F;
- }
- }
- }
- }
- } else {
- /* Type B */
- TA_ON = block_data[1] & 0x0008;
- WCN_DBG(FM_DBG | RDSC,
- "TA g14 typeB pstRDSData->RDSFlag.TP=%d pstRDSData->RDSFlag.TA=%d TP_ON=%d TA_ON=%d\n",
- pstRDSData->RDSFlag.TP, pstRDSData->RDSFlag.TA, TP_ON, TA_ON);
-
- if ((!pstRDSData->RDSFlag.TP) && (pstRDSData->RDSFlag.TA) && TP_ON && TA_ON) {
- fm_s32 TA_num = 0;
-
- for (num = 0; num < 25; num++) {
- if (pstRDSData->AFON_Data.AF[1][num] != 0) {
- TA_num++;
- } else {
- break;
- }
- }
-
- WCN_DBG(FM_NTC | RDSC, "TA set RDS_EVENT_TAON");
-
- if (TA_num == pstRDSData->AFON_Data.AF_Num) {
- pstRDSData->event_status |= RDS_EVENT_TAON;
- }
- }
- }
-
- return ret;
-}
-
-/*
- * rds_parser
- * Block0: PI code(16bits)
- * Block1: Group type(4bits), B0=version code(1bit), TP=traffic program code(1bit),
- * PTY=program type code(5bits), other(5bits)
- * Block2: 16bits
- * Block3: 16bits
- * @rds_dst - target buffer that record RDS parsing result
- * @rds_raw - rds raw data
- * @rds_size - size of rds raw data
- * @getfreq - function pointer, AF need get current freq
- */
-fm_s32 rds_parser(rds_t *rds_dst, struct rds_rx_t *rds_raw, fm_s32 rds_size,
- fm_u16(*getfreq) (void))
-{
- fm_s32 ret = 0;
- /* block_data[0] = blockA, block_data[1] = blockB, block_data[2] = blockC, block_data[3] = blockD, */
- /* block_data[4] = CRC, block_data[5] = CBC */
- fm_u16 block_data[6];
- fm_u8 GroupType, SubType = 0;
- fm_s32 rds_cnt = 0;
- fm_s32 i = 0;
- fm_bool dirty = fm_false;
- /* target buf to fill the result in */
- fm_u16 *event = &rds_dst->event_status;
- fm_u32 *flag = &rds_dst->RDSFlag.flag_status;
-
- FMR_ASSERT(getfreq);
- rds_get_freq = getfreq;
-
- ret = rds_cnt_get(rds_raw, rds_size, &rds_cnt);
-
- if (ret) {
- WCN_DBG(FM_WAR | RDSC, "get cnt err[ret=%d]\n", ret);
- return ret;
- }
-
- while (rds_cnt > 0) {
- ret = rds_grp_get(&block_data[0], rds_raw, i);
-
- if (ret) {
- WCN_DBG(FM_WAR | RDSC, "get group err[ret=%d]\n", ret);
- goto do_next;
- }
-
- ret = rds_grp_type_get(block_data[4], block_data[1], &GroupType, &SubType);
-
- if (ret) {
- WCN_DBG(FM_WAR | RDSC, "get group type err[ret=%d]\n", ret);
- goto do_next;
- }
-
- ret = rds_grp_counter_add(GroupType, SubType, &rds_dst->gc);
-
- ret = rds_grp_pi_get(block_data[4], block_data[0], &rds_dst->PI, &dirty);
-
- if (ret) {
- WCN_DBG(FM_WAR | RDSC, "get group pi err[ret=%d]\n", ret);
- goto do_next;
- } else if (dirty == fm_true) {
- ret = rds_event_set(event, RDS_EVENT_PI_CODE); /* yes, we got new PI code */
- }
-
- ret = rds_grp_pty_get(block_data[4], block_data[1], &rds_dst->PTY, &dirty);
-
- if (ret) {
- WCN_DBG(FM_WAR | RDSC, "get group pty err[ret=%d]\n", ret);
- goto do_next;
- } else if (dirty == fm_true) {
- ret = rds_event_set(event, RDS_EVENT_PTY_CODE); /* yes, we got new PTY code */
- }
-
- ret = rds_grp_tp_get(block_data[4], block_data[1], &rds_dst->RDSFlag.TP, &dirty);
-
- if (ret) {
- WCN_DBG(FM_WAR | RDSC, "get group tp err[ret=%d]\n", ret);
- goto do_next;
- } else if (dirty == fm_true) {
- ret = rds_event_set(event, RDS_EVENT_FLAGS); /* yes, we got new TP code */
- ret = rds_flag_set(flag, RDS_FLAG_IS_TP);
- }
-
- switch (GroupType) {
- case 0:
-
- if ((ret = rds_retrieve_g0(&block_data[0], SubType, rds_dst)))
- goto do_next;
-
- break;
- case 1:
-
- if ((ret = rds_retrieve_g1(&block_data[0], SubType, rds_dst)))
- goto do_next;
-
- break;
- case 2:
-
- if ((ret = rds_retrieve_g2(&block_data[0], SubType, rds_dst)))
- goto do_next;
-
- break;
- case 4:
-
- if ((ret = rds_retrieve_g4(&block_data[0], SubType, rds_dst)))
- goto do_next;
-
- break;
- case 14:
-
- if ((ret = rds_retrieve_g14(&block_data[0], SubType, rds_dst)))
- goto do_next;
-
- break;
- default:
- break;
- }
-
- do_next:
-
- if (ret && (ret != -FM_ECRC)) {
- WCN_DBG(FM_ERR | RDSC, "parsing err[ret=%d]\n", ret);
- return ret;
- }
-
- rds_cnt--;
- i++;
- }
-
- return ret;
-}
diff --git a/drivers/misc/mediatek/fmradio/core/fm_utils.c b/drivers/misc/mediatek/fmradio/core/fm_utils.c
deleted file mode 100644
index cc0ed365d..000000000
--- a/drivers/misc/mediatek/fmradio/core/fm_utils.c
+++ /dev/null
@@ -1,689 +0,0 @@
-/* fm_event.c
- *
- * (C) Copyright 2011
- * MediaTek <www.MediaTek.com>
- * Hongcheng <hongcheng.xia@MediaTek.com>
- *
- * FM Radio Driver -- a common event
- *
- * 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.
- *
- * 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.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- */
-#include <linux/sched.h>
-#include <linux/slab.h>
-#include <linux/version.h>
-#include <linux/interrupt.h>
-#include <linux/wait.h>
-#include <asm/uaccess.h>
-#include <linux/semaphore.h>
-#include <linux/timer.h>
-#include <linux/delay.h>
-
-#include "fm_typedef.h"
-#include "fm_dbg.h"
-#include "fm_err.h"
-#include "fm_stdlib.h"
-#include "fm_utils.h"
-
-static fm_u32 fm_event_send(struct fm_flag_event *thiz, fm_u32 mask)
-{
- thiz->flag |= mask;
- /* WCN_DBG(FM_DBG|MAIN, "%s set 0x%08x\n", thiz->name, thiz->flag); */
- wake_up((wait_queue_head_t *) (thiz->priv));
-
- return thiz->flag;
-}
-
-static fm_s32 fm_event_wait(struct fm_flag_event *thiz, fm_u32 mask)
-{
- return wait_event_interruptible(*(wait_queue_head_t *) (thiz->priv),
- ((thiz->flag & mask) == mask));
-}
-
-/**
- * fm_event_check - sleep until a condition gets true or a timeout elapses
- * @thiz: the pointer of current object
- * @mask: bitmap in fm_u32
- * @timeout: timeout, in jiffies
- *
- * fm_event_set() has to be called after changing any variable that could
- * change the result of the wait condition.
- *
- * The function returns 0 if the @timeout elapsed, and the remaining
- * jiffies if the condition evaluated to true before the timeout elapsed.
- */
-long fm_event_wait_timeout(struct fm_flag_event *thiz, fm_u32 mask, long timeout)
-{
- return wait_event_timeout(*((wait_queue_head_t *) (thiz->priv)),
- ((thiz->flag & mask) == mask), timeout * HZ);
-}
-
-static fm_u32 fm_event_clr(struct fm_flag_event *thiz, fm_u32 mask)
-{
- thiz->flag &= ~mask;
- /* WCN_DBG(FM_DBG|MAIN, "%s clr 0x%08x\n", thiz->name, thiz->flag); */
- return thiz->flag;
-}
-
-static fm_u32 fm_event_get(struct fm_flag_event *thiz)
-{
- return thiz->flag;
-
-}
-
-static fm_u32 fm_event_rst(struct fm_flag_event *thiz)
-{
- return thiz->flag = 0;
-}
-
-struct fm_flag_event *fm_flag_event_create(const fm_s8 *name)
-{
- struct fm_flag_event *tmp;
- wait_queue_head_t *wq;
-
- if (!(tmp = fm_zalloc(sizeof(struct fm_flag_event)))) {
- WCN_DBG(FM_ALT | MAIN, "fm_zalloc(fm_event) -ENOMEM\n");
- return NULL;
- }
-
- if (!(wq = fm_zalloc(sizeof(wait_queue_head_t)))) {
- WCN_DBG(FM_ALT | MAIN, "fm_zalloc(wait_queue_head_t) -ENOMEM\n");
- fm_free(tmp);
- return NULL;
- }
-
- fm_memcpy(tmp->name, name, (strlen(name) > FM_NAME_MAX) ? (FM_NAME_MAX) : (strlen(name)));
- tmp->priv = wq;
- init_waitqueue_head(wq);
- tmp->ref = 0;
-
- tmp->send = fm_event_send;
- tmp->wait = fm_event_wait;
- tmp->wait_timeout = fm_event_wait_timeout;
- tmp->clr = fm_event_clr;
- tmp->get = fm_event_get;
- tmp->rst = fm_event_rst;
-
- tmp->rst(tmp); /* set flag to 0x00000000 */
-
- return tmp;
-}
-
-fm_s32 fm_flag_event_get(struct fm_flag_event *thiz)
-{
- FMR_ASSERT(thiz);
- thiz->ref++;
- return 0;
-}
-
-fm_s32 fm_flag_event_put(struct fm_flag_event *thiz)
-{
- FMR_ASSERT(thiz);
- thiz->ref--;
-
- if (thiz->ref == 0) {
- fm_free(thiz->priv);
- fm_free(thiz);
- return 0;
- } else if (thiz->ref > 0) {
- return -FM_EINUSE;
- } else {
- return -FM_EPARA;
- }
-}
-
-/* fm lock methods */
-static fm_s32 fm_lock_try(struct fm_lock *thiz, fm_s32 retryCnt)
-{
- fm_s32 retry_cnt = 0;
- struct semaphore *sem;
- struct task_struct *task = current;
- FMR_ASSERT(thiz);
- FMR_ASSERT(thiz->priv);
-
- while (down_trylock((struct semaphore *)thiz->priv)) {
- WCN_DBG(FM_WAR | MAIN, "down_trylock failed\n");
- if (++retry_cnt < retryCnt) {
- WCN_DBG(FM_WAR | MAIN, "[retryCnt=%d]\n", retry_cnt);
- msleep_interruptible(50);
- continue;
- } else {
- WCN_DBG(FM_CRT | MAIN, "down_trylock retry failed\n");
- return -FM_ELOCK;
- }
- }
-
- sem = (struct semaphore *)thiz->priv;
- FM_LOG_DBG(MAIN, "%s --->trylock, cnt=%d, pid=%d\n", thiz->name, (int)sem->count,
- task->pid);
- return 0;
-}
-
-/* fm try lock methods */
-static fm_s32 fm_lock_lock(struct fm_lock *thiz)
-{
- struct semaphore *sem;
- struct task_struct *task = current;
- FMR_ASSERT(thiz);
- FMR_ASSERT(thiz->priv);
-
- if (down_interruptible((struct semaphore *)thiz->priv)) {
- WCN_DBG(FM_CRT | MAIN, "get mutex failed\n");
- return -FM_ELOCK;
- }
-
- sem = (struct semaphore *)thiz->priv;
- FM_LOG_DBG(MAIN, "%s --->lock, cnt=%d, pid=%d\n", thiz->name, (int)sem->count, task->pid);
- return 0;
-}
-
-static fm_s32 fm_lock_unlock(struct fm_lock *thiz)
-{
- struct semaphore *sem;
- struct task_struct *task = current;
- FMR_ASSERT(thiz);
- FMR_ASSERT(thiz->priv);
- sem = (struct semaphore *)thiz->priv;
- FM_LOG_DBG(MAIN, "%s <---unlock, cnt=%d, pid=%d\n", thiz->name, (int)sem->count + 1,
- task->pid);
- up((struct semaphore *)thiz->priv);
- return 0;
-}
-
-struct fm_lock *fm_lock_create(const fm_s8 *name)
-{
- struct fm_lock *tmp;
- struct semaphore *mutex;
-
- if (!(tmp = fm_zalloc(sizeof(struct fm_lock)))) {
- WCN_DBG(FM_ALT | MAIN, "fm_zalloc(fm_lock) -ENOMEM\n");
- return NULL;
- }
-
- if (!(mutex = fm_zalloc(sizeof(struct semaphore)))) {
- WCN_DBG(FM_ALT | MAIN, "fm_zalloc(struct semaphore) -ENOMEM\n");
- fm_free(tmp);
- return NULL;
- }
-
- tmp->priv = mutex;
- sema_init(mutex, 1);
- tmp->ref = 0;
- fm_memcpy(tmp->name, name, (strlen(name) > FM_NAME_MAX) ? (FM_NAME_MAX) : (strlen(name)));
-
- tmp->lock = fm_lock_lock;
- tmp->trylock = fm_lock_try;
- tmp->unlock = fm_lock_unlock;
-
- return tmp;
-}
-
-fm_s32 fm_lock_get(struct fm_lock *thiz)
-{
- FMR_ASSERT(thiz);
- thiz->ref++;
- return 0;
-}
-
-fm_s32 fm_lock_put(struct fm_lock *thiz)
-{
- FMR_ASSERT(thiz);
- thiz->ref--;
-
- if (thiz->ref == 0) {
- fm_free(thiz->priv);
- fm_free(thiz);
- return 0;
- } else if (thiz->ref > 0) {
- return -FM_EINUSE;
- } else {
- return -FM_EPARA;
- }
-}
-
-/* fm lock methods */
-static fm_s32 fm_spin_lock_lock(struct fm_lock *thiz)
-{
- struct task_struct *task = current;
- FMR_ASSERT(thiz);
- FMR_ASSERT(thiz->priv);
-
- spin_lock_bh((spinlock_t *) thiz->priv);
-
- FM_LOG_DBG(MAIN, "%s --->lock pid=%d\n", thiz->name, task->pid);
- return 0;
-}
-
-static fm_s32 fm_spin_lock_unlock(struct fm_lock *thiz)
-{
- struct task_struct *task = current;
- FMR_ASSERT(thiz);
- FMR_ASSERT(thiz->priv);
-
- FM_LOG_DBG(MAIN, "%s <---unlock, pid=%d\n", thiz->name, task->pid);
- spin_unlock_bh((spinlock_t *) thiz->priv);
- return 0;
-}
-
-struct fm_lock *fm_spin_lock_create(const fm_s8 *name)
-{
- struct fm_lock *tmp;
- spinlock_t *spin_lock;
-
- if (!(tmp = fm_zalloc(sizeof(struct fm_lock)))) {
- WCN_DBG(FM_ALT | MAIN, "fm_zalloc(fm_lock) -ENOMEM\n");
- return NULL;
- }
-
- if (!(spin_lock = fm_zalloc(sizeof(spinlock_t)))) {
- WCN_DBG(FM_ALT | MAIN, "fm_zalloc(spinlock_t) -ENOMEM\n");
- fm_free(tmp);
- return NULL;
- }
-
- tmp->priv = spin_lock;
- spin_lock_init(spin_lock);
- tmp->ref = 0;
- fm_memcpy(tmp->name, name, (strlen(name) > FM_NAME_MAX) ? (FM_NAME_MAX) : (strlen(name)));
-
- tmp->lock = fm_spin_lock_lock;
- tmp->unlock = fm_spin_lock_unlock;
-
- return tmp;
-}
-
-
-fm_s32 fm_spin_lock_get(struct fm_lock *thiz)
-{
- FMR_ASSERT(thiz);
- thiz->ref++;
- return 0;
-}
-
-fm_s32 fm_spin_lock_put(struct fm_lock *thiz)
-{
- FMR_ASSERT(thiz);
- thiz->ref--;
-
- if (thiz->ref == 0) {
- fm_free(thiz->priv);
- fm_free(thiz);
- return 0;
- } else if (thiz->ref > 0) {
- return -FM_EINUSE;
- } else {
- return -FM_EPARA;
- }
-}
-
-/*
- * fm timer
- *
- */
-static fm_s32 fm_timer_init(struct fm_timer *thiz, void (*timeout) (unsigned long data),
- unsigned long data, signed long time, fm_s32 flag)
-{
- struct timer_list *timerlist = (struct timer_list *)thiz->priv;
-
- thiz->flag = flag;
- thiz->flag &= ~FM_TIMER_FLAG_ACTIVATED;
- thiz->timeout_func = timeout;
- thiz->data = data;
- thiz->timeout_ms = time;
-
- timerlist->expires = jiffies + (thiz->timeout_ms) / (1000 / HZ);
- timerlist->function = thiz->timeout_func;
- timerlist->data = (unsigned long)thiz->data;
-
- return 0;
-}
-
-static fm_s32 fm_timer_start(struct fm_timer *thiz)
-{
- struct timer_list *timerlist = (struct timer_list *)thiz->priv;
-
- thiz->flag |= FM_TIMER_FLAG_ACTIVATED;
- mod_timer(timerlist, jiffies + (thiz->timeout_ms) / (1000 / HZ));
-
- return 0;
-}
-
-static fm_s32 fm_timer_update(struct fm_timer *thiz)
-{
- struct timer_list *timerlist = (struct timer_list *)thiz->priv;
-
- if (thiz->flag & FM_TIMER_FLAG_ACTIVATED) {
- mod_timer(timerlist, jiffies + (thiz->timeout_ms) / (1000 / HZ));
- return 0;
- } else {
- return 1;
- }
-}
-
-static fm_s32 fm_timer_stop(struct fm_timer *thiz)
-{
- struct timer_list *timerlist = (struct timer_list *)thiz->priv;
-
- thiz->flag &= ~FM_TIMER_FLAG_ACTIVATED;
- del_timer(timerlist);
-
- return 0;
-}
-
-static fm_s32 fm_timer_control(struct fm_timer *thiz, enum fm_timer_ctrl cmd, void *arg)
-{
-
- return 0;
-}
-
-struct fm_timer *fm_timer_create(const fm_s8 *name)
-{
- struct fm_timer *tmp;
- struct timer_list *timerlist;
-
- if (!(tmp = fm_zalloc(sizeof(struct fm_timer)))) {
- WCN_DBG(FM_ALT | MAIN, "fm_zalloc(fm_timer) -ENOMEM\n");
- return NULL;
- }
-
- if (!(timerlist = fm_zalloc(sizeof(struct timer_list)))) {
- WCN_DBG(FM_ALT | MAIN, "fm_zalloc(struct timer_list) -ENOMEM\n");
- fm_free(tmp);
- return NULL;
- }
-
- init_timer(timerlist);
-
- fm_memcpy(tmp->name, name, (strlen(name) > FM_NAME_MAX) ? (FM_NAME_MAX) : (strlen(name)));
- tmp->priv = timerlist;
- tmp->ref = 0;
- tmp->init = fm_timer_init;
- tmp->start = fm_timer_start;
- tmp->stop = fm_timer_stop;
- tmp->update = fm_timer_update;
- tmp->control = fm_timer_control;
-
- return tmp;
-}
-
-fm_s32 fm_timer_get(struct fm_timer *thiz)
-{
- FMR_ASSERT(thiz);
- thiz->ref++;
- return 0;
-}
-
-fm_s32 fm_timer_put(struct fm_timer *thiz)
-{
- FMR_ASSERT(thiz);
- thiz->ref--;
-
- if (thiz->ref == 0) {
- fm_free(thiz->priv);
- fm_free(thiz);
- return 0;
- } else if (thiz->ref > 0) {
- return -FM_EINUSE;
- } else {
- return -FM_EPARA;
- }
-}
-
-
-/*
- * FM work thread mechanism
- */
-static fm_s32 fm_work_init(struct fm_work *thiz, void (*work_func) (unsigned long data),
- unsigned long data)
-{
- struct work_struct *sys_work = (struct work_struct *)thiz->priv;
- work_func_t func;
-
- thiz->work_func = work_func;
- thiz->data = data;
- func = (work_func_t) thiz->work_func;
-
- INIT_WORK(sys_work, func);
-
- return 0;
-
-}
-
-struct fm_work *fm_work_create(const fm_s8 *name)
-{
- struct fm_work *my_work;
- struct work_struct *sys_work;
-
- if (!(my_work = fm_zalloc(sizeof(struct fm_work)))) {
- WCN_DBG(FM_ALT | MAIN, "fm_zalloc(fm_work) -ENOMEM\n");
- return NULL;
- }
-
- if (!(sys_work = fm_zalloc(sizeof(struct work_struct)))) {
- WCN_DBG(FM_ALT | MAIN, "fm_zalloc(struct work_struct) -ENOMEM\n");
- fm_free(my_work);
- return NULL;
- }
-
- fm_memcpy(my_work->name, name,
- (strlen(name) > FM_NAME_MAX) ? (FM_NAME_MAX) : (strlen(name)));
- my_work->priv = sys_work;
- my_work->init = fm_work_init;
-
- return my_work;
-}
-
-fm_s32 fm_work_get(struct fm_work *thiz)
-{
- FMR_ASSERT(thiz);
- thiz->ref++;
- return 0;
-}
-
-fm_s32 fm_work_put(struct fm_work *thiz)
-{
- FMR_ASSERT(thiz);
- thiz->ref--;
-
- if (thiz->ref == 0) {
- fm_free(thiz->priv);
- fm_free(thiz);
- return 0;
- } else if (thiz->ref > 0) {
- return -FM_EINUSE;
- } else {
- return -FM_EPARA;
- }
-}
-
-
-static fm_s32 fm_workthread_add_work(struct fm_workthread *thiz, struct fm_work *work)
-{
- FMR_ASSERT(thiz);
- FMR_ASSERT(work);
-
- queue_work((struct workqueue_struct *)thiz->priv, (struct work_struct *)work->priv);
- return 0;
-}
-
-struct fm_workthread *fm_workthread_create(const fm_s8 *name)
-{
- struct fm_workthread *my_thread;
- struct workqueue_struct *sys_thread;
-
- if (!(my_thread = fm_zalloc(sizeof(struct fm_workthread)))) {
- WCN_DBG(FM_ALT | MAIN, "fm_zalloc(fm_workthread) -ENOMEM\n");
- return NULL;
- }
-
- sys_thread = create_singlethread_workqueue(name);
-
- fm_memcpy(my_thread->name, name,
- (strlen(name) > FM_NAME_MAX) ? (FM_NAME_MAX) : (strlen(name)));
- my_thread->priv = sys_thread;
- my_thread->add_work = fm_workthread_add_work;
-
- return my_thread;
-}
-
-fm_s32 fm_workthread_get(struct fm_workthread *thiz)
-{
- FMR_ASSERT(thiz);
- thiz->ref++;
- return 0;
-}
-
-fm_s32 fm_workthread_put(struct fm_workthread *thiz)
-{
- FMR_ASSERT(thiz);
- thiz->ref--;
-
- if (thiz->ref == 0) {
- destroy_workqueue((struct workqueue_struct *)thiz->priv);
- fm_free(thiz);
- return 0;
- } else if (thiz->ref > 0) {
- return -FM_EINUSE;
- } else {
- return -FM_EPARA;
- }
-}
-
-
-fm_s32 fm_fifo_in(struct fm_fifo *thiz, void *item)
-{
- FMR_ASSERT(item);
-
- if (thiz->len < thiz->size) {
- fm_memcpy((thiz->obj.priv + (thiz->item_size * thiz->in)), item, thiz->item_size);
- thiz->in = (thiz->in + 1) % thiz->size;
- thiz->len++;
- /* WCN_DBG(FM_DBG | MAIN, "add a new item[len=%d]\n", thiz->len); */
- } else {
- WCN_DBG(FM_WAR | MAIN, "%s fifo is full\n", thiz->obj.name);
- return -FM_ENOMEM;
- }
-
- return 0;
-}
-
-fm_s32 fm_fifo_out(struct fm_fifo *thiz, void *item)
-{
- if (thiz->len > 0) {
- if (item) {
- fm_memcpy(item, (thiz->obj.priv + (thiz->item_size * thiz->out)),
- thiz->item_size);
- fm_memset((thiz->obj.priv + (thiz->item_size * thiz->out)), 0,
- thiz->item_size);
- }
- thiz->out = (thiz->out + 1) % thiz->size;
- thiz->len--;
- /* WCN_DBG(FM_DBG | MAIN, "del an item[len=%d]\n", thiz->len); */
- } else {
- WCN_DBG(FM_WAR | MAIN, "%s fifo is empty\n", thiz->obj.name);
- }
-
- return 0;
-}
-
-fm_bool fm_fifo_is_full(struct fm_fifo *thiz)
-{
- return (thiz->len == thiz->size) ? fm_true : fm_false;
-}
-
-fm_bool fm_fifo_is_empty(struct fm_fifo *thiz)
-{
- return (thiz->len == 0) ? fm_true : fm_false;
-}
-
-fm_s32 fm_fifo_get_total_len(struct fm_fifo *thiz)
-{
- return thiz->size;
-}
-
-fm_s32 fm_fifo_get_valid_len(struct fm_fifo *thiz)
-{
- return thiz->len;
-}
-
-fm_s32 fm_fifo_reset(struct fm_fifo *thiz)
-{
- fm_memset(thiz->obj.priv, 0, thiz->item_size * thiz->size);
- thiz->in = 0;
- thiz->out = 0;
- thiz->len = 0;
-
- return 0;
-}
-
-struct fm_fifo *fm_fifo_init(struct fm_fifo *fifo, void *buf, const fm_s8 *name, fm_s32 item_size,
- fm_s32 item_num)
-{
- fm_memcpy(fifo->obj.name, name, 20);
- fifo->size = item_num;
- fifo->in = 0;
- fifo->out = 0;
- fifo->len = 0;
- fifo->item_size = item_size;
- fifo->obj.priv = buf;
-
- fifo->input = fm_fifo_in;
- fifo->output = fm_fifo_out;
- fifo->is_full = fm_fifo_is_full;
- fifo->is_empty = fm_fifo_is_empty;
- fifo->get_total_len = fm_fifo_get_total_len;
- fifo->get_valid_len = fm_fifo_get_valid_len;
- fifo->reset = fm_fifo_reset;
-
- WCN_DBG(FM_NTC | LINK, "%s inited\n", fifo->obj.name);
-
- return fifo;
-}
-
-struct fm_fifo *fm_fifo_create(const fm_s8 *name, fm_s32 item_size, fm_s32 item_num)
-{
- struct fm_fifo *tmp;
- void *buf;
-
- if (!(tmp = fm_zalloc(sizeof(struct fm_fifo)))) {
- WCN_DBG(FM_ALT | MAIN, "fm_zalloc(fm_fifo) -ENOMEM\n");
- return NULL;
- }
-
- if (!(buf = fm_zalloc(item_size * item_num))) {
- WCN_DBG(FM_ALT | MAIN, "fm_zalloc(fm_fifo) -ENOMEM\n");
- fm_free(tmp);
- return NULL;
- }
-
- tmp = fm_fifo_init(tmp, buf, name, item_size, item_num);
-
- WCN_DBG(FM_NTC | LINK, "%s created\n", tmp->obj.name);
-
- return tmp;
-}
-
-
-fm_s32 fm_fifo_release(struct fm_fifo *fifo)
-{
- if (fifo) {
- WCN_DBG(FM_NTC | LINK, "%s released\n", fifo->obj.name);
- if (fifo->obj.priv) {
- fm_free(fifo->obj.priv);
- }
- fm_free(fifo);
- }
-
- return 0;
-}
diff --git a/drivers/misc/mediatek/fmradio/dummy.c b/drivers/misc/mediatek/fmradio/dummy.c
deleted file mode 100644
index 351c747c2..000000000
--- a/drivers/misc/mediatek/fmradio/dummy.c
+++ /dev/null
@@ -1,3 +0,0 @@
-/* dummy.c
- * This dummy file is just for meetting the build system's rule.
- */
diff --git a/drivers/misc/mediatek/fmradio/inc/fm_config.h b/drivers/misc/mediatek/fmradio/inc/fm_config.h
deleted file mode 100644
index 6f3036411..000000000
--- a/drivers/misc/mediatek/fmradio/inc/fm_config.h
+++ /dev/null
@@ -1,217 +0,0 @@
-/* fm_config.h
- *
- * (C) Copyright 2011
- * MediaTek <www.MediaTek.com>
- * hongcheng <hongcheng.xia@MediaTek.com>
- *
- * FM Radio Driver
- *
- * 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.
- *
- * 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.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- */
-
-#ifndef __FM_CONFIG_H__
-#define __FM_CONFIG_H__
-
-#include "fm_typedef.h"
-#include "fm_rds.h"
-#include "fm_dbg.h"
-#include "fm_err.h"
-#include "fm_stdlib.h"
-#include "fm_interface.h"
-/* band */
-#define FM_BAND_UNKNOWN 0
-#define FM_BAND_UE 1 /* US/Europe band 87.5MHz ~ 108MHz (DEFAULT) */
-#define FM_BAND_JAPAN 2 /* Japan band 76MHz ~ 90MHz */
-#define FM_BAND_JAPANW 3 /* Japan wideband 76MHZ ~ 108MHz */
-#define FM_BAND_SPECIAL 4 /* special band between 76MHZ and 108MHz */
-#define FM_BAND_DEFAULT FM_BAND_UE
-#define FM_RAIDO_BAND FM_BAND_UE
-#define FM_FREQ_MIN FM_RX_BAND_FREQ_L
-#define FM_FREQ_MAX FM_RX_BAND_FREQ_H
-
-#ifdef CONFIG_MTK_FM_50KHZ_SUPPORT
-#define FM_UE_FREQ_MIN 8750
-#define FM_UE_FREQ_MAX 10800
-#define FM_JP_FREQ_MIN 7600
-#define FM_JP_FREQ_MAX 10800
-
-#define FM_RX_BAND_FREQ_L 8750 /* FM radio special band low freq(Default 87.5MHz) */
-#define FM_RX_BAND_FREQ_H 10800 /* FM radio special band high freq(Default 108.0MHz) */
-/* TX */
-#define FM_TX_SCAN_HOLE_LOW 9230 /* 92.3MHz~95.4MHz should not show to user */
-#define FM_TX_SCAN_HOLE_HIGH 9540 /* 92.3MHz~95.4MHz should not show to user */
-
-#else
-#define FM_UE_FREQ_MIN 875
-#define FM_UE_FREQ_MAX 1080
-#define FM_JP_FREQ_MIN 760
-#define FM_JP_FREQ_MAX 1080
-
-#define FM_RX_BAND_FREQ_L 875 /* FM radio special band low freq(Default 87.5MHz) */
-#define FM_RX_BAND_FREQ_H 1080 /* FM radio special band high freq(Default 108.0MHz) */
-/* TX */
-#define FM_TX_SCAN_HOLE_LOW 923 /* 92.30MHz~95.40MHz should not show to user */
-#define FM_TX_SCAN_HOLE_HIGH 954 /* 92.30MHz~95.40MHz should not show to user */
-
-#endif /* CONFIG_MTK_FM_50KHZ_SUPPORT */
-
-/* space */
-#define FM_SPACE_UNKNOWN 0
-#define FM_SPACE_100K 1
-#define FM_SPACE_200K 2
-#define FM_SPACE_50K 5
-
-#ifdef CONFIG_MTK_FM_50KHZ_SUPPORT
-#define FM_SPACE_DEFAULT FM_SPACE_50K
-#else
-#define FM_SPACE_DEFAULT FM_SPACE_100K
-#endif
-
-#define FM_TX_SCAN_UP (0)
-#define FM_TX_SCAN_DOWN (1)
-#define FM_TX_SCAN_MAX 10
-#define FM_TX_SCAN_MIN 1
-
-/* seek direction */
-#define FM_SEEK_UP 0
-#define FM_SEEK_DOWN 1
-
-#define FM_CHIP_AR1000 0x1000
-#define FM_CHIP_MT5192 0x91
-#define FM_CHIP_MT5193 0x92
-#define FM_CHIP_MT6616 0x6616
-#define FM_CHIP_MT6626 0x6626
-#define FM_CHIP_MT6628 0x6628
-#define FM_CHIP_MT6620 0x6620
-#define FM_CHIP_MT6627 0x6627
-#define FM_CHIP_MT6580 0x6580
-#define FM_CHIP_UNSUPPORTED 0xffff
-
-enum fm_cfg_parser_state {
- FM_CFG_STAT_NONE = 0,
- FM_CFG_STAT_GROUP,
- FM_CFG_STAT_KEY,
- FM_CFG_STAT_VALUE,
- FM_CFG_STAT_COMMENT
-};
-
-typedef enum fm_cfg_parser_state fm_cfg_parser_state_t;
-
-#define COMMENT_CHAR '#'
-#define DELIMIT_CHAR '='
-
-#define isspace(a) ((a) == 0x20)
-
-#define FAKE_CH_MAX 10
-#define FM_CUST_CFG_PATH "/etc/fm_cust.cfg"
-
-struct fm_rx_cust_cfg {
- fm_s32 desene_rssi_th;
- fm_s32 pamd_th;
- fm_s32 mr_th;
- fm_s32 atdc_th;
- fm_s32 prx_th;
- fm_s32 atdev_th;
- fm_s32 short_ana_rssi_th;
- fm_s32 long_ana_rssi_th;
- fm_s32 cqi_th;
-/* fm_u16 mr_th; */
- fm_s32 smg_th;
- fm_s32 scan_ch_size;
- fm_s32 seek_space;
- fm_s32 band;
- fm_s32 band_freq_l;
- fm_s32 band_freq_h;
- fm_s32 scan_sort;
- fm_s32 fake_ch[FAKE_CH_MAX];
- fm_s32 fake_ch_num;
- fm_s32 fake_ch_rssi_th;
- fm_s32 deemphasis;
- fm_s32 osc_freq;
-};
-
-struct fm_tx_cust_cfg {
- fm_s32 scan_hole_low;
- fm_s32 scan_hole_high;
- fm_s32 power_level;
- fm_s32 pamd_th;
- fm_s32 mr_th;
- fm_s32 smg_th;
-};
-typedef struct {
- struct fm_rx_cust_cfg rx_cfg;
- struct fm_tx_cust_cfg tx_cfg;
- fm_audio_info_t aud_cfg;
-} fm_cust_cfg;
-
-enum fm_cust_cfg_op {
- FM_CFG_RX_RSSI_TH_LONG = 0,
- FM_CFG_RX_RSSI_TH_SHORT,
- FM_CFG_RX_CQI_TH,
- FM_CFG_RX_MR_TH,
- FM_CFG_RX_SMG_TH,
- FM_CFG_RX_SCAN_CH_SIZE,
- FM_CFG_RX_SEEK_SPACE,
- FM_CFG_RX_BAND,
- FM_CFG_RX_BAND_FREQ_L,
- FM_CFG_RX_BAND_FREQ_H,
- FM_CFG_RX_SCAN_SORT,
- FM_CFG_RX_FAKE_CH_NUM,
- FM_CFG_RX_FAKE_CH_RSSI,
- FM_CFG_RX_FAKE_CH,
- FM_CFG_RX_DEEMPHASIS,
- FM_CFG_RX_OSC_FREQ,
-
- FM_CFG_TX_SCAN_HOLE_LOW,
- FM_CFG_TX_SCAN_HOLE_HIGH,
- FM_CFG_TX_PWR_LEVEL,
- FM_CFG_MAX
-};
-
-typedef fm_s32(*CFG_HANDLER) (fm_s8 *grp, fm_s8 *key, fm_s8 *val, fm_cust_cfg *cfg);
-extern fm_s32 to_upper_n(fm_s8 *str, fm_s32 len);
-extern fm_s32 check_hex_str(fm_s8 *str, fm_s32 len);
-extern fm_s32 check_dec_str(fm_s8 *str, fm_s32 len);
-extern fm_s32 ascii_to_hex(fm_s8 *in_ascii, fm_u16 *out_hex);
-extern fm_s32 ascii_to_dec(fm_s8 *in_ascii, fm_s32 *out_dec);
-extern fm_s32 trim_string(fm_s8 **start);
-extern fm_s32 trim_path(fm_s8 **start);
-extern fm_s32 cfg_parser(fm_s8 *buffer, CFG_HANDLER handler, fm_cust_cfg *cfg);
-extern fm_s32 cfg_item_match(fm_s8 *src_key, fm_s8 *src_val, fm_s8 *dst_key, fm_s32 *dst_val);
-
-extern fm_s32 fm_cust_config(const fm_s8 *filepath);
-extern fm_u16 fm_cust_config_fetch(enum fm_cust_cfg_op op_code);
-#ifdef MT6628_FM
-extern fm_s32 MT6628fm_cust_config_setup(const fm_s8 *filepath);
-extern fm_u16 MT6628fm_cust_config_fetch(enum fm_cust_cfg_op op_code);
-#endif
-#ifdef MT6620_FM
-extern fm_s32 MT6620fm_cust_config_setup(const fm_s8 *filepath);
-extern fm_u16 MT6620fm_cust_config_fetch(enum fm_cust_cfg_op op_code);
-#endif
-#ifdef MT6627_FM
-extern fm_s32 MT6627fm_cust_config_setup(const fm_s8 *filepath);
-extern fm_u16 MT6627fm_cust_config_fetch(enum fm_cust_cfg_op op_code);
-#endif
-#ifdef MT6580_FM
-extern fm_s32 MT6580fm_cust_config_setup(const fm_s8 *filepath);
-extern fm_u16 MT6580fm_cust_config_fetch(enum fm_cust_cfg_op op_code);
-#endif
-#ifdef MT6630_FM
-extern fm_s32 MT6630fm_cust_config_setup(const fm_s8 *filepath);
-extern fm_u16 MT6630fm_cust_config_fetch(enum fm_cust_cfg_op op_code);
-#endif
-
-#endif /* __FM_CONFIG_H__ */
diff --git a/drivers/misc/mediatek/fmradio/inc/fm_dbg.h b/drivers/misc/mediatek/fmradio/inc/fm_dbg.h
deleted file mode 100644
index 75fbcf3a0..000000000
--- a/drivers/misc/mediatek/fmradio/inc/fm_dbg.h
+++ /dev/null
@@ -1,185 +0,0 @@
-#ifndef __FM_DBG_H__
-#define __FM_DBG_H__
-
-/* #include <linux/kernel.h> //for printk() */
-/* #include <linux/xlog.h> */
-#include <linux/printk.h>
-
-/* DBG zone */
-#define BASE 4
-#define MAIN (1 << (BASE+0))
-#define LINK (1 << (BASE+1))
-#define EINT (1 << (BASE+2))
-#define CHIP (1 << (BASE+3))
-#define RDSC (1 << (BASE+4))
-#define G0 (1 << (BASE+5))
-#define G1 (1 << (BASE+6))
-#define G2 (1 << (BASE+7))
-#define G3 (1 << (BASE+8))
-#define G4 (1 << (BASE+9))
-#define G14 (1 << (BASE+10))
-#define RAW (1 << (BASE+11))
-#define OPEN (1 << (BASE+12))
-#define IOCTL (1 << (BASE+13))
-#define READ_ (1 << (BASE+14))
-#define CLOSE (1 << (BASE+15))
-#define CQI (1 << (BASE+16))
-#define ALL 0xfffffff0
-
-/* DBG level */
-#define L0 0x00000000 /* EMERG, system will crush */
-#define L1 0x00000001 /* ALERT, need action in time */
-#define L2 0x00000002 /* CRIT, important HW or SW operation failed */
-#define L3 0x00000003 /* ERR, normal HW or SW ERR */
-#define L4 0x00000004 /* WARNING, importan path or somewhere may occurs err */
-#define L5 0x00000005 /* NOTICE, normal case */
-#define L6 0x00000006 /* INFO, print info if need */
-#define L7 0x00000007 /* DEBUG, for debug info */
-
-#define FM_EMG L0
-#define FM_ALT L1
-#define FM_CRT L2
-#define FM_ERR L3
-#define FM_WAR L4
-#define FM_NTC L5
-#define FM_INF L6
-#define FM_DBG L7
-
-extern fm_u32 g_dbg_level;
-#if 0
-#define WCN_DBG(flag, fmt, args...) \
- do { \
- if ((((flag)&0x0000000f) <= (g_dbg_level&0x0000000f)) && ((flag)&0xfffffff0) & g_dbg_level) { \
- xlog_printk(ANDROID_LOG_INFO, "[" #flag "]", fmt, ## args);\
- } \
- } while (0)
-#else
-#define WCN_DBG(flag, fmt, args...) \
- do { \
- if ((((flag)&0x0000000f) <= (g_dbg_level&0x0000000f)) && ((flag)&0xfffffff0) & g_dbg_level) { \
- pr_notice("[" #flag "]" fmt, ## args); \
- } \
- } while (0)
-#endif
-
-/* #define FM_USE_XLOG */
-
-#ifdef FM_USE_XLOG
-#define FM_DRV_LOG_TAG "FM_DRV"
-
-#define FM_LOG_DBG(flag, fmt, args...) \
- do { \
- if ((FM_DBG <= (g_dbg_level&0x0000000f)) && ((flag)&0xfffffff0) & g_dbg_level) { \
- xlog_printk(ANDROID_LOG_INFO, FM_DRV_LOG_TAG, "[" #flag "]" fmt, ## args); \
- } \
- } while (0)
-
-#define FM_LOG_INF(flag, fmt, args...) \
- do { \
- if ((FM_INF <= (g_dbg_level&0x0000000f)) && ((flag)&0xfffffff0) & g_dbg_level) { \
- xlog_printk(ANDROID_LOG_INFO, FM_DRV_LOG_TAG, "[" #flag "]" fmt, ## args); \
- } \
- } while (0)
-
-#define FM_LOG_NTC(flag, fmt, args...) \
- do { \
- if ((FM_NTC <= (g_dbg_level&0x0000000f)) && ((flag)&0xfffffff0) & g_dbg_level) { \
- xlog_printk(ANDROID_LOG_WARN, FM_DRV_LOG_TAG, "[" #flag "]" fmt, ## args); \
- } \
- } while (0)
-
-#define FM_LOG_WAR(flag, fmt, args...) \
- do { \
- if ((FM_WAR <= (g_dbg_level&0x0000000f)) && ((flag)&0xfffffff0) & g_dbg_level) { \
- xlog_printk(ANDROID_LOG_WARN, FM_DRV_LOG_TAG, "[" #flag "]" fmt, ## args); \
- } \
- } while (0)
-
-#define FM_LOG_ERR(flag, fmt, args...) \
- do { \
- if ((FM_ERR <= (g_dbg_level&0x0000000f)) && ((flag)&0xfffffff0) & g_dbg_level) { \
- xlog_printk(ANDROID_LOG_ERROR, FM_DRV_LOG_TAG, "[" #flag "]" fmt, ## args); \
- } \
- } while (0)
-
-#define FM_LOG_CRT(flag, fmt, args...) \
- do { \
- if ((FM_CRT <= (g_dbg_level&0x0000000f)) && ((flag)&0xfffffff0) & g_dbg_level) { \
- xlog_printk(ANDROID_LOG_FATAL, FM_DRV_LOG_TAG, "[" #flag "]" fmt, ## args); \
- } \
- } while (0)
-
-#define FM_LOG_ALT(flag, fmt, args...) \
- do { \
- if ((FM_ALT <= (g_dbg_level&0x0000000f)) && ((flag)&0xfffffff0) & g_dbg_level) { \
- xlog_printk(ANDROID_LOG_FATAL, FM_DRV_LOG_TAG, "[" #flag "]" fmt, ## args); \
- } \
- } while (0)
-
-#define FM_LOG_EMG(flag, fmt, args...) \
- do { \
- if ((FM_EMG <= (g_dbg_level&0x0000000f)) && ((flag)&0xfffffff0) & g_dbg_level) { \
- xlog_printk(ANDROID_LOG_FATAL, FM_DRV_LOG_TAG, "[" #flag "]" fmt, ## args); \
- } \
- } while (0)
-
-#else
-
-#define FM_LOG_DBG(flag, fmt, args...) \
- do { \
- if ((FM_DBG <= (g_dbg_level&0x0000000f)) && ((flag)&0xfffffff0) & g_dbg_level) { \
- pr_debug("[" #flag "]" fmt, ## args); \
- } \
- } while (0)
-
-#define FM_LOG_INF(flag, fmt, args...) \
- do { \
- if ((FM_INF <= (g_dbg_level&0x0000000f)) && ((flag)&0xfffffff0) & g_dbg_level) { \
- pr_info("[" #flag "]" fmt, ## args); \
- } \
- } while (0)
-
-#define FM_LOG_NTC(flag, fmt, args...) \
- do { \
- if ((FM_NTC <= (g_dbg_level&0x0000000f)) && ((flag)&0xfffffff0) & g_dbg_level) { \
- pr_notice("[" #flag "]" fmt, ## args); \
- } \
- } while (0)
-
-#define FM_LOG_WAR(flag, fmt, args...) \
- do { \
- if ((FM_WAR <= (g_dbg_level&0x0000000f)) && ((flag)&0xfffffff0) & g_dbg_level) { \
- pr_warn("[" #flag "]" fmt, ## args); \
- } \
- } while (0)
-
-#define FM_LOG_ERR(flag, fmt, args...) \
- do { \
- if ((FM_ERR <= (g_dbg_level&0x0000000f)) && ((flag)&0xfffffff0) & g_dbg_level) { \
- pr_err("[" #flag "]" fmt, ## args); \
- } \
- } while (0)
-
-#define FM_LOG_CRT(flag, fmt, args...) \
- do { \
- if ((FM_CRT <= (g_dbg_level&0x0000000f)) && ((flag)&0xfffffff0) & g_dbg_level) { \
- pr_crit("[" #flag "]" fmt, ## args); \
- } \
- } while (0)
-
-#define FM_LOG_ALT(flag, fmt, args...) \
- do { \
- if ((FM_ALT <= (g_dbg_level&0x0000000f)) && ((flag)&0xfffffff0) & g_dbg_level) { \
- pr_alert("[" #flag "]" fmt, ## args); \
- } \
- } while (0)
-
-#define FM_LOG_EMG(flag, fmt, args...) \
- do { \
- if ((FM_EMG <= (g_dbg_level&0x0000000f)) && ((flag)&0xfffffff0) & g_dbg_level) { \
- pr_emerg("[" #flag "]" fmt, ## args); \
- } \
- } while (0)
-#endif
-
-#endif /* __FM_DBG_H__ */
diff --git a/drivers/misc/mediatek/fmradio/inc/fm_eint.h b/drivers/misc/mediatek/fmradio/inc/fm_eint.h
deleted file mode 100644
index d77ce896d..000000000
--- a/drivers/misc/mediatek/fmradio/inc/fm_eint.h
+++ /dev/null
@@ -1,17 +0,0 @@
-#ifndef __FM_EINT_H__
-#define __FM_EINT_H__
-
-#include "fm_typedef.h"
-
-enum {
- FM_EINT_PIN_EINT_MODE,
- FM_EINT_PIN_GPIO_MODE,
- FM_EINT_PIN_MAX_MODE
-};
-
-extern fm_s32 fm_enable_eint(void);
-extern fm_s32 fm_disable_eint(void);
-extern fm_s32 fm_request_eint(void (*parser) (void));
-extern fm_s32 fm_eint_pin_cfg(fm_s32 mode);
-
-#endif /* __FM_EINT_H__ */
diff --git a/drivers/misc/mediatek/fmradio/inc/fm_err.h b/drivers/misc/mediatek/fmradio/inc/fm_err.h
deleted file mode 100644
index b7a59a70c..000000000
--- a/drivers/misc/mediatek/fmradio/inc/fm_err.h
+++ /dev/null
@@ -1,30 +0,0 @@
-#ifndef __FM_ERR_H__
-#define __FM_ERR_H__
-
-#include <linux/kernel.h> /* for printk() */
-
-#define FM_ERR_BASE 1000
-typedef enum fm_drv_err_t {
- FM_EOK = FM_ERR_BASE,
- FM_EBUF,
- FM_EPARA,
- FM_ELINK,
- FM_ELOCK,
- FM_EFW,
- FM_ECRC,
- FM_EWRST, /* wholechip reset */
- FM_ESRST, /* subsystem reset */
- FM_EPATCH,
- FM_ENOMEM,
- FM_EINUSE, /* other client is using this object */
- FM_EMAX
-} fm_drv_err_t;
-
-#define FMR_ASSERT(a) { \
- if ((a) == NULL) { \
- pr_err("%s,invalid pointer\n", __func__);\
- return -FM_EPARA; \
- } \
- }
-
-#endif /* __FM_ERR_H__ */
diff --git a/drivers/misc/mediatek/fmradio/inc/fm_interface.h b/drivers/misc/mediatek/fmradio/inc/fm_interface.h
deleted file mode 100644
index 62adbe3fb..000000000
--- a/drivers/misc/mediatek/fmradio/inc/fm_interface.h
+++ /dev/null
@@ -1,291 +0,0 @@
-#ifndef __FM_INTERFACE_H__
-#define __FM_INTERFACE_H__
-
-#include <linux/cdev.h>
-#include <linux/workqueue.h>
-
-#include "fm_typedef.h"
-#include "fm_rds.h"
-#include "fm_utils.h"
-
-/******************************************************************************
- * STRUCTURE DEFINITIONS
- *****************************************************************************/
-enum fm_op_state {
- FM_STA_STOP = 0,
- FM_STA_PLAY = 1,
- FM_STA_TUNE = 2,
- FM_STA_SEEK = 3,
- FM_STA_SCAN = 4,
- FM_STA_RAMPDOWN = 5,
- FM_STA_UNKOWN = 100,
- FM_STA_MAX
-};
-
-enum fm_pwr_state {
- FM_PWR_OFF = 0,
- FM_PWR_RX_ON = 1,
- FM_PWR_TX_ON = 2,
- FM_PWR_MAX
-};
-
-enum fm_antenna_type {
- FM_ANA_LONG = 0, /* long antenna */
- FM_ANA_SHORT = 1, /* short antenna */
- FM_ANA_MAX
-};
-
-struct fm_hw_info {
- fm_s32 chip_id; /* chip ID, eg. 6620 */
- fm_s32 eco_ver; /* chip ECO version, eg. E3 */
- fm_s32 rom_ver; /* FM DSP rom code version, eg. V2 */
- fm_s32 patch_ver; /* FM DSP patch version, eg. 1.11 */
- fm_s32 reserve;
-};
-
-struct fm_i2s_setting {
- fm_s32 onoff;
- fm_s32 mode;
- fm_s32 sample;
-};
-
-typedef enum {
- FM_I2S_ON = 0,
- FM_I2S_OFF,
- FM_I2S_STATE_ERR
-} fm_i2s_state_e;
-
-typedef enum {
- FM_I2S_MASTER = 0,
- FM_I2S_SLAVE,
- FM_I2S_MODE_ERR
-} fm_i2s_mode_e;
-
-typedef enum {
- FM_I2S_32K = 0,
- FM_I2S_44K,
- FM_I2S_48K,
- FM_I2S_SR_ERR
-} fm_i2s_sample_e;
-
-typedef struct fm_i2s_info {
- fm_s32 status; /*0:FM_I2S_ON, 1:FM_I2S_OFF,2:error */
- fm_s32 mode; /*0:FM_I2S_MASTER, 1:FM_I2S_SLAVE,2:error */
- fm_s32 rate; /*0:FM_I2S_32K:32000,1:FM_I2S_44K:44100,2:FM_I2S_48K:48000,3:error */
-} fm_i2s_info_t;
-
-typedef enum {
- FM_AUD_ANALOG = 0,
- FM_AUD_I2S = 1,
- FM_AUD_MRGIF = 2,
- FM_AUD_ERR
-} fm_audio_path_e;
-
-typedef enum {
- FM_I2S_PAD_CONN = 0, /* sco fm chip: e.g.6627 */
- FM_I2S_PAD_IO = 1, /* combo fm chip: e.g.6628 */
- FM_I2S_PAD_ERR
-} fm_i2s_pad_sel_e;
-
-typedef struct fm_audio_info {
- fm_audio_path_e aud_path;
- fm_i2s_info_t i2s_info;
- fm_i2s_pad_sel_e i2s_pad;
-} fm_audio_info_t;
-
-
-struct fm_platform {
- struct cdev cdev;
- dev_t dev_t;
- struct class *cls;
- struct device *dev;
-};
-
-struct fm {
- /* chip info */
- fm_u16 chip_id; /* chip id, such as 6616/6620/6626/6628 */
- fm_u16 device_id; /* chip version */
- /* basic run time info */
- fm_s32 ref; /* fm driver can be multi opened */
- fm_bool chipon; /* Chip power state */
- enum fm_pwr_state pwr_sta; /* FM module power state */
- enum fm_op_state op_sta; /* current operation state: tune, seek, scan ... */
- /* enum fm_audio_path aud_path; //I2S or Analog */
- fm_s32 vol; /* current audio volume from chip side */
- fm_bool mute; /* true: mute, false: playing */
- fm_bool rds_on; /* true: on, false: off */
- enum fm_antenna_type ana_type; /* long/short antenna */
- fm_bool via_bt; /* true: fm over bt controller; false: fm over host */
- fm_u16 min_freq; /* for UE, 875KHz */
- fm_u16 max_freq; /* for UE, 1080KHz */
- fm_u16 cur_freq; /* current frequency */
- fm_u8 band; /* UE/JAPAN/JPANWD */
- /*FM Tx */
- fm_u32 vcoon; /* TX VCO tracking ON duiration(ms) */
- fm_u32 vcooff; /* TX RTC VCO tracking interval(s) */
- fm_u32 txpwrctl; /* TX power contrl interval(s) */
- fm_u32 tx_pwr;
- fm_bool rdstx_on; /* false:rds tx off, true:rds tx on */
- fm_bool wholechiprst;
- /* RDS data */
- struct fm_flag_event *rds_event; /* pointer to rds event */
- struct rds_t *pstRDSData; /* rds spec data buffer */
- /* platform data */
- struct fm_platform platform; /* platform related members */
-
- struct fm_workthread *eint_wkthd;
- struct fm_workthread *timer_wkthd;
- struct fm_work *eint_wk;
- struct fm_work *rds_wk;
- struct fm_work *rst_wk; /* work for subsystem reset */
- /* Tx */
- struct fm_work *fm_tx_desense_wifi_work;
- struct fm_work *fm_tx_power_ctrl_work;
-
-};
-
-struct fm_callback {
- /* call backs */
- fm_u16(*cur_freq_get) (void);
- fm_s32(*cur_freq_set) (fm_u16 new_freq);
-/* fm_u16(*chan_para_get)(fm_u16 freq); //get channel parameter, HL side/ FA / ATJ */
-};
-
-struct fm_basic_interface {
- /* mt66x6 lib interfaces */
- fm_s32(*low_pwr_wa) (fm_s32 onoff);
- fm_s32(*pwron) (fm_s32 data);
- fm_s32(*pwroff) (fm_s32 data);
- fm_s32(*msdelay) (fm_u32 val);
- fm_s32(*usdelay) (fm_u32 val);
- fm_s32(*read) (fm_u8 addr, fm_u16 *val);
- fm_s32(*write) (fm_u8 addr, fm_u16 val);
- fm_s32(*top_read) (fm_u16 addr, fm_u32 *val);
- fm_s32(*top_write) (fm_u16 addr, fm_u32 val);
- fm_s32(*host_read) (fm_u32 addr, fm_u32 *val);
- fm_s32(*host_write) (fm_u32 addr, fm_u32 val);
- fm_s32(*setbits) (fm_u8 addr, fm_u16 bits, fm_u16 msk);
- fm_u16(*chipid_get) (void);
- fm_s32(*mute) (fm_bool mute);
- fm_s32(*rampdown) (void);
- fm_s32(*pwrupseq) (fm_u16 *chip_id, fm_u16 *device_id);
- fm_s32(*pwrdownseq) (void);
- fm_bool(*setfreq) (fm_u16 freq);
- fm_bool(*seek) (fm_u16 min_freq, fm_u16 max_freq, fm_u16 *freq, fm_u16 dir, fm_u16 space);
- fm_s32(*seekstop) (void);
- fm_bool(*scan) (fm_u16 min_freq, fm_u16 max_freq, fm_u16 *freq, fm_u16 *tbl,
- fm_u16 *tblsize, fm_u16 dir, fm_u16 space);
- fm_bool(*jammer_scan) (fm_u16 min_freq, fm_u16 max_freq, fm_u16 *freq, fm_u16 *tbl,
- fm_u16 *tblsize, fm_u16 dir, fm_u16 space);
- fm_s32(*cqi_get) (fm_s8 *buf, fm_s32 buf_len);
- fm_s32(*scanstop) (void);
- fm_s32(*rssiget) (fm_s32 *rssi);
- fm_s32(*volset) (fm_u8 vol);
- fm_s32(*volget) (fm_u8 *vol);
- fm_s32(*dumpreg) (void);
- fm_bool(*msget) (fm_u16 *ms); /* mono/stereo indicator get */
- fm_s32(*msset) (fm_s32 ms); /* mono/stereo force set */
- fm_bool(*pamdget) (fm_u16 *pamd);
- fm_bool(*em) (fm_u16 group, fm_u16 item, fm_u32 val);
- fm_s32(*anaswitch) (fm_s32 ana);
- fm_s32(*anaget) (void);
- fm_s32(*caparray_get) (fm_s32 *ca);
- fm_s32(*i2s_set) (fm_s32 onoff, fm_s32 mode, fm_s32 sample);
- fm_s32(*i2s_get) (fm_s32 *ponoff, fm_s32 *pmode, fm_s32 *psample);
- fm_s32(*hwinfo_get) (struct fm_hw_info *req);
- fm_s32(*is_dese_chan) (fm_u16 freq); /* check if this is a de-sense channel */
- fm_s32(*softmute_tune) (fm_u16 freq, fm_s32 *rssi, fm_bool *valid);
- fm_s32(*pre_search) (void);
- fm_s32(*restore_search) (void);
- fm_s32(*desense_check) (fm_u16 freq, fm_s32 rssi); /* check if this is a valid channel */
- fm_s32(*get_freq_cqi) (fm_u16 freq, fm_s32 *cqi);
- fm_s32(*cqi_log) (fm_s32 min_freq, fm_s32 max_freq, fm_s32 space, fm_s32 cnt); /* cqi log tool */
- fm_s32(*fm_via_bt) (fm_bool flag); /* fm over BT:1:enable,0:disable */
- fm_s32(*set_search_th) (fm_s32 idx, fm_s32 val, fm_s32 reserve);
- fm_s32(*get_aud_info) (fm_audio_info_t *data);
- /*tx function */
- fm_s32(*tx_support) (fm_s32 *sup);
- fm_s32(*rdstx_enable) (fm_s32 *flag);
- fm_bool(*tune_tx) (fm_u16 freq);
- fm_s32(*pwrupseq_tx) (void);
- fm_s32(*pwrdownseq_tx) (void);
- fm_s32(*tx_pwr_ctrl) (fm_u16 freq, fm_s32 *ctr);
- fm_s32(*rtc_drift_ctrl) (fm_u16 freq, fm_s32 *ctr);
- fm_s32(*tx_desense_wifi) (fm_u16 freq, fm_s32 *ctr);
- fm_s32(*tx_scan) (fm_u16 min_freq, fm_u16 max_freq, fm_u16 *pFreq, fm_u16 *pScanTBL,
- fm_u16 *ScanTBLsize, fm_u16 scandir, fm_u16 space);
-};
-
-struct fm_rds_interface {
- /* rds lib interfaces */
- fm_s32(*rds_blercheck) (rds_t *dst);
- fm_bool(*rds_onoff) (rds_t *dst, fm_bool onoff);
- fm_s32(*rds_parser) (rds_t *rds_dst, struct rds_rx_t *rds_raw, fm_s32 rds_size,
- fm_u16(*getfreq) (void));
- fm_u16(*rds_gbc_get) (void); /* good block counter */
- fm_u16(*rds_bbc_get) (void); /* bad block counter */
- fm_u8(*rds_bbr_get) (void); /* bad block ratio */
- fm_s32(*rds_bc_reset) (void); /* reset block counter */
- fm_u32(*rds_bci_get) (void); /* bler check interval */
- fm_s32(*rds_log_get) (struct rds_rx_t *dst, fm_s32 *dst_len);
- fm_s32(*rds_gc_get) (struct rds_group_cnt_t *dst, rds_t *rdsp);
- fm_s32(*rds_gc_reset) (rds_t *rdsp);
- /*Tx */
- fm_s32(*rds_tx) (fm_u16 pi, fm_u16 *ps, fm_u16 *other_rds, fm_u8 other_rds_cnt);
- fm_s32(*rds_tx_enable) (void);
- fm_s32(*rds_tx_disable) (void);
- fm_s32(*rdstx_support) (fm_s32 *sup);
-};
-
-struct fm_lowlevel_ops {
- struct fm_callback cb;
- struct fm_basic_interface bi;
- struct fm_rds_interface ri;
-};
-
-#if (!defined(MT6620_FM) && !defined(MT6628_FM) && !defined(MT6627_FM) && !defined(MT6580_FM) && !defined(MT6630_FM))
-extern fm_s32 fm_low_ops_register(struct fm_lowlevel_ops *ops);
-extern fm_s32 fm_low_ops_unregister(struct fm_lowlevel_ops *ops);
-extern fm_s32 fm_rds_ops_register(struct fm_lowlevel_ops *ops);
-extern fm_s32 fm_rds_ops_unregister(struct fm_lowlevel_ops *ops);
-#endif
-#ifdef MT6620_FM
-extern fm_s32 MT6620fm_low_ops_register(struct fm_lowlevel_ops *ops);
-extern fm_s32 MT6620fm_low_ops_unregister(struct fm_lowlevel_ops *ops);
-extern fm_s32 MT6620fm_rds_ops_register(struct fm_lowlevel_ops *ops);
-extern fm_s32 MT6620fm_rds_ops_unregister(struct fm_lowlevel_ops *ops);
-#endif
-#ifdef MT6628_FM
-extern fm_s32 MT6628fm_low_ops_register(struct fm_lowlevel_ops *ops);
-extern fm_s32 MT6628fm_low_ops_unregister(struct fm_lowlevel_ops *ops);
-extern fm_s32 MT6628fm_rds_ops_register(struct fm_lowlevel_ops *ops);
-extern fm_s32 MT6628fm_rds_ops_unregister(struct fm_lowlevel_ops *ops);
-#endif
-#ifdef MT6627_FM
-extern fm_s32 MT6627fm_low_ops_register(struct fm_lowlevel_ops *ops);
-extern fm_s32 MT6627fm_low_ops_unregister(struct fm_lowlevel_ops *ops);
-extern fm_s32 MT6627fm_rds_ops_register(struct fm_lowlevel_ops *ops);
-extern fm_s32 MT6627fm_rds_ops_unregister(struct fm_lowlevel_ops *ops);
-#endif
-#ifdef MT6580_FM
-extern fm_s32 MT6580fm_low_ops_register(struct fm_lowlevel_ops *ops);
-extern fm_s32 MT6580fm_low_ops_unregister(struct fm_lowlevel_ops *ops);
-extern fm_s32 MT6580fm_rds_ops_register(struct fm_lowlevel_ops *ops);
-extern fm_s32 MT6580fm_rds_ops_unregister(struct fm_lowlevel_ops *ops);
-#endif
-#ifdef MT6630_FM
-extern fm_s32 MT6630fm_low_ops_register(struct fm_lowlevel_ops *ops);
-extern fm_s32 MT6630fm_low_ops_unregister(struct fm_lowlevel_ops *ops);
-extern fm_s32 MT6630fm_rds_ops_register(struct fm_lowlevel_ops *ops);
-extern fm_s32 MT6630fm_rds_ops_unregister(struct fm_lowlevel_ops *ops);
-#endif
-
-/*
- * fm_get_channel_space - get the spcace of gived channel
- * @freq - value in 760~1080 or 7600~10800
- *
- * Return 0, if 760~1080; return 1, if 7600 ~ 10800, else err code < 0
- */
-
-extern fm_s32 fm_get_channel_space(int freq);
-#endif /* __FM_INTERFACE_H__ */
diff --git a/drivers/misc/mediatek/fmradio/inc/fm_ioctl.h b/drivers/misc/mediatek/fmradio/inc/fm_ioctl.h
deleted file mode 100644
index 32cf9be09..000000000
--- a/drivers/misc/mediatek/fmradio/inc/fm_ioctl.h
+++ /dev/null
@@ -1,94 +0,0 @@
-#ifndef __FM_IOCTL_H__
-#define __FM_IOCTL_H__
-#include "fm_typedef.h"
-#include "fm_rds.h"
-#include "fm_main.h"
-
-#define FM_IOC_MAGIC 0xf5 /* FIXME: any conflict? */
-
-#define FM_IOCTL_POWERUP _IOWR(FM_IOC_MAGIC, 0, struct fm_tune_parm)
-#define FM_IOCTL_POWERDOWN _IOWR(FM_IOC_MAGIC, 1, int32_t)
-#define FM_IOCTL_TUNE _IOWR(FM_IOC_MAGIC, 2, struct fm_tune_parm)
-#define FM_IOCTL_SEEK _IOWR(FM_IOC_MAGIC, 3, struct fm_seek_parm)
-#define FM_IOCTL_SETVOL _IOWR(FM_IOC_MAGIC, 4, uint32_t)
-#define FM_IOCTL_GETVOL _IOWR(FM_IOC_MAGIC, 5, uint32_t)
-#define FM_IOCTL_MUTE _IOWR(FM_IOC_MAGIC, 6, uint32_t)
-#define FM_IOCTL_GETRSSI _IOWR(FM_IOC_MAGIC, 7, int32_t)
-#define FM_IOCTL_SCAN _IOWR(FM_IOC_MAGIC, 8, struct fm_scan_parm)
-#define FM_IOCTL_STOP_SCAN _IO(FM_IOC_MAGIC, 9)
-
-/* IOCTL and struct for test */
-#define FM_IOCTL_GETCHIPID _IOWR(FM_IOC_MAGIC, 10, uint16_t)
-#define FM_IOCTL_EM_TEST _IOWR(FM_IOC_MAGIC, 11, struct fm_em_parm)
-#define FM_IOCTL_RW_REG _IOWR(FM_IOC_MAGIC, 12, struct fm_ctl_parm)
-#define FM_IOCTL_GETMONOSTERO _IOWR(FM_IOC_MAGIC, 13, uint16_t)
-#define FM_IOCTL_GETCURPAMD _IOWR(FM_IOC_MAGIC, 14, uint16_t)
-#define FM_IOCTL_GETGOODBCNT _IOWR(FM_IOC_MAGIC, 15, uint16_t)
-#define FM_IOCTL_GETBADBNT _IOWR(FM_IOC_MAGIC, 16, uint16_t)
-#define FM_IOCTL_GETBLERRATIO _IOWR(FM_IOC_MAGIC, 17, uint16_t)
-
-/* IOCTL for RDS */
-#define FM_IOCTL_RDS_ONOFF _IOWR(FM_IOC_MAGIC, 18, uint16_t)
-#define FM_IOCTL_RDS_SUPPORT _IOWR(FM_IOC_MAGIC, 19, int32_t)
-
-#define FM_IOCTL_POWERUP_TX _IOWR(FM_IOC_MAGIC, 20, struct fm_tune_parm)
-#define FM_IOCTL_TUNE_TX _IOWR(FM_IOC_MAGIC, 21, struct fm_tune_parm)
-#define FM_IOCTL_RDS_TX _IOWR(FM_IOC_MAGIC, 22, struct fm_rds_tx_parm)
-
-#define FM_IOCTL_RDS_SIM_DATA _IOWR(FM_IOC_MAGIC, 23, uint32_t)
-#define FM_IOCTL_IS_FM_POWERED_UP _IOWR(FM_IOC_MAGIC, 24, uint32_t)
-
-/* IOCTL for FM Tx */
-#define FM_IOCTL_TX_SUPPORT _IOWR(FM_IOC_MAGIC, 25, int32_t)
-#define FM_IOCTL_RDSTX_SUPPORT _IOWR(FM_IOC_MAGIC, 26, int32_t)
-#define FM_IOCTL_RDSTX_ENABLE _IOWR(FM_IOC_MAGIC, 27, int32_t)
-#define FM_IOCTL_TX_SCAN _IOWR(FM_IOC_MAGIC, 28, struct fm_tx_scan_parm)
-
-/* IOCTL for FM over BT */
-#define FM_IOCTL_OVER_BT_ENABLE _IOWR(FM_IOC_MAGIC, 29, int32_t)
-
-/* IOCTL for FM ANTENNA SWITCH */
-#define FM_IOCTL_ANA_SWITCH _IOWR(FM_IOC_MAGIC, 30, int32_t)
-#define FM_IOCTL_GETCAPARRAY _IOWR(FM_IOC_MAGIC, 31, int32_t)
-
-/* IOCTL for FM compensation by GPS RTC */
-#define FM_IOCTL_GPS_RTC_DRIFT _IOWR(FM_IOC_MAGIC, 32, struct fm_gps_rtc_info)
-
-/* IOCTL for FM I2S Setting */
-#define FM_IOCTL_I2S_SETTING _IOWR(FM_IOC_MAGIC, 33, struct fm_i2s_setting)
-
-#define FM_IOCTL_RDS_GROUPCNT _IOWR(FM_IOC_MAGIC, 34, struct rds_group_cnt_req_t)
-#define FM_IOCTL_RDS_GET_LOG _IOWR(FM_IOC_MAGIC, 35, struct rds_raw_t)
-
-#define FM_IOCTL_SCAN_GETRSSI _IOWR(FM_IOC_MAGIC, 36, struct fm_rssi_req)
-#define FM_IOCTL_SETMONOSTERO _IOWR(FM_IOC_MAGIC, 37, int32_t)
-
-#define FM_IOCTL_RDS_BC_RST _IOWR(FM_IOC_MAGIC, 38, int32_t)
-#define FM_IOCTL_CQI_GET _IOWR(FM_IOC_MAGIC, 39, struct fm_cqi_req)
-#define FM_IOCTL_GET_HW_INFO _IOWR(FM_IOC_MAGIC, 40, struct fm_hw_info)
-#define FM_IOCTL_GET_I2S_INFO _IOWR(FM_IOC_MAGIC, 41, struct fm_i2s_info)
-#define FM_IOCTL_IS_DESE_CHAN _IOWR(FM_IOC_MAGIC, 42, int32_t)
-
-#define FM_IOCTL_TOP_RDWR _IOWR(FM_IOC_MAGIC, 43, struct fm_top_rw_parm)
-#define FM_IOCTL_HOST_RDWR _IOWR(FM_IOC_MAGIC, 44, struct fm_host_rw_parm)
-
-#define FM_IOCTL_PRE_SEARCH _IOWR(FM_IOC_MAGIC, 45, int32_t)
-#define FM_IOCTL_RESTORE_SEARCH _IOWR(FM_IOC_MAGIC, 46, int32_t)
-
-#define FM_IOCTL_SET_SEARCH_THRESHOLD _IOWR(FM_IOC_MAGIC, 47, struct fm_search_threshold_t)
-
-#define FM_IOCTL_GET_AUDIO_INFO _IOWR(FM_IOC_MAGIC, 48, fm_audio_info_t)
-#define FM_IOCTL_FM_SET_STATUS _IOWR(FM_IOC_MAGIC, 49, fm_status_t)
-#define FM_IOCTL_FM_GET_STATUS _IOWR(FM_IOC_MAGIC, 50, fm_status_t)
-
-#define FM_IOCTL_SCAN_NEW _IOWR(FM_IOC_MAGIC, 60, struct fm_scan_t)
-#define FM_IOCTL_SEEK_NEW _IOWR(FM_IOC_MAGIC, 61, struct fm_seek_t)
-#define FM_IOCTL_TUNE_NEW _IOWR(FM_IOC_MAGIC, 62, struct fm_tune_t)
-#define FM_IOCTL_SOFT_MUTE_TUNE _IOWR(FM_IOC_MAGIC, 63, struct fm_softmute_tune_t) /*for soft mute tune */
-#define FM_IOCTL_DESENSE_CHECK _IOWR(FM_IOC_MAGIC, 64, fm_desense_check_t)
-
-#define COMPAT_FM_IOCTL_GET_AUDIO_INFO _IOWR(FM_IOC_MAGIC, 48, int32_t)
-
-#define FM_IOCTL_DUMP_REG _IO(FM_IOC_MAGIC, 0xFF)
-
-#endif /* __FM_IOCTL_H__ */
diff --git a/drivers/misc/mediatek/fmradio/inc/fm_link.h b/drivers/misc/mediatek/fmradio/inc/fm_link.h
deleted file mode 100644
index 5859d29a9..000000000
--- a/drivers/misc/mediatek/fmradio/inc/fm_link.h
+++ /dev/null
@@ -1,227 +0,0 @@
-#ifndef __FM_LINK_H__
-#define __FM_LINK_H__
-
-#include "fm_typedef.h"
-#include "fm_rds.h"
-
-typedef enum {
- FM_TASK_RX_PARSER_PKT_TYPE = 0,
- FM_TASK_RX_PARSER_OPCODE,
- FM_TASK_RX_PARSER_PKT_LEN_1,
- FM_TASK_RX_PARSER_PKT_LEN_2,
- FM_TASK_RX_PARSER_PKT_PAYLOAD,
- FM_TASK_RX_PARSER_BUFFER_CONGESTION
-} fm_task_parser_state;
-
-enum {
- FM_TASK_COMMAND_PKT_TYPE = 0x01,
- FM_TASK_EVENT_PKT_TYPE = 0x04
-};
-
-enum {
- FM_STP_TEST_OPCODE = 0x00,
- FSPI_ENABLE_OPCODE = 0x01,
- FSPI_MUX_SEL_OPCODE = 0x02,
- FSPI_READ_OPCODE = 0x03,
- FSPI_WRITE_OPCODE = 0x04,
- FI2C_READ_OPCODE = 0x05,
- FI2C_WRITE_OPCODE = 0x06,
- FM_ENABLE_OPCODE = 0x07,
- FM_RESET_OPCODE = 0x08,
- FM_TUNE_OPCODE = 0x09,
- FM_SEEK_OPCODE = 0x0a,
- FM_SCAN_OPCODE = 0x0b,
- RDS_RX_ENABLE_OPCODE = 0x0c,
- RDS_RX_DATA_OPCODE = 0x0d,
- FM_RAMPDOWN_OPCODE = 0x0e,
- FM_MCUCLK_SEL_OPCODE = 0x0f,
- FM_MODEMCLK_SEL_OPCODE = 0x10,
- RDS_TX_OPCODE = 0x11,
- FM_PATCH_DOWNLOAD_OPCODE = 0x12,
- FM_COEFF_DOWNLOAD_OPCODE = 0x13,
- FM_HWCOEFF_DOWNLOAD_OPCODE = 0x14,
- FM_ROM_DOWNLOAD_OPCODE = 0x15,
- FM_SOFT_MUTE_TUNE_OPCODE = 0x17,
- FM_HOST_READ_OPCODE = 0x18, /* mcu register read */
- FM_HOST_WRITE_OPCODE = 0x19,
- CSPI_WRITE_OPCODE = 0x20,
- CSPI_READ_OPCODE = 0x21, /* common SPI read */
-};
-
-enum {
- FLAG_TEST = (1 << FM_STP_TEST_OPCODE),
- FLAG_FSPI_EN = (1 << FSPI_ENABLE_OPCODE),
- FLAG_FSPI_MUXSEL = (1 << FSPI_MUX_SEL_OPCODE),
- FLAG_FSPI_RD = (1 << FSPI_READ_OPCODE),
- FLAG_FSPI_WR = (1 << FSPI_WRITE_OPCODE),
- FLAG_I2C_RD = (1 << FI2C_READ_OPCODE),
- FLAG_I2C_WR = (1 << FI2C_WRITE_OPCODE),
- FLAG_EN = (1 << FM_ENABLE_OPCODE),
- FLAG_RST = (1 << FM_RESET_OPCODE),
- FLAG_TUNE = (1 << FM_TUNE_OPCODE),
- FLAG_SEEK = (1 << FM_SEEK_OPCODE),
- FLAG_SCAN = (1 << FM_SCAN_OPCODE),
- FLAG_RDS_RX_EN = (1 << RDS_RX_ENABLE_OPCODE),
- FLAG_RDS_DATA = (1 << RDS_RX_DATA_OPCODE),
- FLAG_RAMPDOWN = (1 << FM_RAMPDOWN_OPCODE),
- FLAG_MCUCLK = (1 << FM_MCUCLK_SEL_OPCODE),
- FLAG_MODEMCLK = (1 << FM_MODEMCLK_SEL_OPCODE),
- FLAG_RDS_TX = (1 << RDS_TX_OPCODE),
- FLAG_PATCH = (1 << FM_PATCH_DOWNLOAD_OPCODE),
- FLAG_COEFF = (1 << FM_COEFF_DOWNLOAD_OPCODE),
- FLAG_HWCOEFF = (1 << FM_HWCOEFF_DOWNLOAD_OPCODE),
- FLAG_ROM = (1 << FM_ROM_DOWNLOAD_OPCODE),
- FLAG_CSPI_READ = (1 << 22), /* 22 */
- FLAG_SM_TUNE = (1 << FM_SOFT_MUTE_TUNE_OPCODE), /* 23 */
- FLAG_HOST_READ = (1 << FM_HOST_READ_OPCODE), /* 24 */
- FLAG_HOST_WRITE = (1 << FM_HOST_WRITE_OPCODE), /* 25 */
- FLAG_CSPI_WRITE = (1 << 26), /* 26 */
- FLAG_CQI_DONE = (1 << 27),
- FLAG_TUNE_DONE = (1 << 28),
- FLAG_SEEK_DONE = (1 << 29),
- FLAG_SCAN_DONE = (1 << 30),
- FLAG_TERMINATE = (1 << 31)
-};
-
-#define FM_SCANTBL_SIZE 16
-#define FM_CQI_BUF_SIZE 96
-struct fm_res_ctx {
- fm_u16 fspi_rd;
- fm_u16 seek_result;
- fm_u16 scan_result[FM_SCANTBL_SIZE];
- fm_s8 cqi[FM_CQI_BUF_SIZE];
- struct rds_rx_t rds_rx_result;
- fm_u32 cspi_rd; /* common spi read data */
-};
-
-#define FM_TRACE_ENABLE
-
-#define FM_TRACE_FIFO_SIZE 200
-#define FM_TRACE_PKT_SIZE 60
-struct fm_trace_t {
- fm_s32 type;
- fm_s32 opcode;
- fm_s32 len;
- fm_u8 pkt[FM_TRACE_PKT_SIZE]; /* full packet */
- unsigned long time;
- fm_s32 tid;
-};
-
-struct fm_trace_fifo_t {
- fm_s8 name[20 + 1];
- struct fm_trace_t trace[FM_TRACE_FIFO_SIZE];
- fm_u32 size;
- fm_u32 in;
- fm_u32 out;
- fm_u32 len;
- fm_s32(*trace_in) (struct fm_trace_fifo_t *thiz, struct fm_trace_t *new_tra);
- fm_s32(*trace_out) (struct fm_trace_fifo_t *thiz, struct fm_trace_t *dst_tra);
- fm_bool(*is_full) (struct fm_trace_fifo_t *thiz);
- fm_bool(*is_empty) (struct fm_trace_fifo_t *thiz);
-};
-
-#define FM_TRACE_IN(fifop, tracep) \
-({ \
- fm_s32 __ret = (fm_s32)0; \
- if (fifop && (fifop)->trace_in) { \
- __ret = (fifop)->trace_in(fifop, tracep); \
- } \
- __ret; \
-})
-
-#define FM_TRACE_OUT(fifop, tracep) \
-({ \
- fm_s32 __ret = (fm_s32)0; \
- if (fifop && (fifop)->trace_out) { \
- __ret = (fifop)->trace_out(fifop, tracep); \
- } \
- __ret; \
-})
-
-#define FM_TRACE_FULL(fifop) \
-({ \
- fm_bool __ret = (fm_bool)fm_false; \
- if (fifop && (fifop)->is_full) { \
- __ret = (fifop)->is_full(fifop); \
- } \
- __ret; \
-})
-
-#define FM_TRACE_EMPTY(fifop) \
-({ \
- fm_bool __ret = (fm_bool)fm_false; \
- if (fifop && (fifop)->is_empty) { \
- __ret = (fifop)->is_empty(fifop); \
- } \
- __ret; \
-})
-
-#if (defined(MT6620_FM) || defined(MT6628_FM) || defined(MT6627_FM) || defined(MT6580_FM) || defined(MT6630_FM))
-#include "fm_utils.h"
-
-#define RX_BUF_SIZE 128
-#define TX_BUF_SIZE 1024
-
-#define SW_RETRY_CNT (1)
-#define SW_RETRY_CNT_MAX (5)
-#define SW_WAIT_TIMEOUT_MAX (100)
-/* FM operation timeout define for error handle */
-#define TEST_TIMEOUT (3)
-#define FSPI_EN_TIMEOUT (3)
-#define FSPI_MUXSEL_TIMEOUT (3)
-#define FSPI_RD_TIMEOUT (3)
-#define FSPI_WR_TIMEOUT (3)
-#define I2C_RD_TIMEOUT (3)
-#define I2C_WR_TIMEOUT (3)
-#define EN_TIMEOUT (3)
-#define RST_TIMEOUT (3)
-#define TUNE_TIMEOUT (3)
-#define SM_TUNE_TIMEOUT (6)
-#define SEEK_TIMEOUT (15)
-#define SCAN_TIMEOUT (15) /* usualy scan will cost 10 seconds */
-#define RDS_RX_EN_TIMEOUT (3)
-#define RDS_DATA_TIMEOUT (100)
-#define RAMPDOWN_TIMEOUT (3)
-#define MCUCLK_TIMEOUT (3)
-#define MODEMCLK_TIMEOUT (3)
-#define RDS_TX_TIMEOUT (3)
-#define PATCH_TIMEOUT (3)
-#define COEFF_TIMEOUT (3)
-#define HWCOEFF_TIMEOUT (3)
-#define ROM_TIMEOUT (3)
-
-struct fm_link_event {
- struct fm_flag_event *ln_event;
- struct fm_res_ctx result; /* seek/scan/read/RDS */
-};
-#endif
-
-/*
- * FM data and ctrl link APIs: platform related and bus related
- */
-extern fm_s32 fm_link_setup(void *data);
-
-extern fm_s32 fm_link_release(void);
-
-extern fm_s32 fm_cmd_tx(fm_u8 *buf, fm_u16 len, fm_s32 mask, fm_s32 cnt, fm_s32 timeout,
- fm_s32(*callback) (struct fm_res_ctx *result));
-
-extern fm_s32 fm_event_parser(fm_s32(*rds_parser) (struct rds_rx_t *, fm_s32));
-
-extern fm_s32 fm_ctrl_rx(fm_u8 addr, fm_u16 *val);
-
-extern fm_s32 fm_ctrl_tx(fm_u8 addr, fm_u16 val);
-
-extern fm_s32 fm_force_active_event(fm_u32 mask);
-
-extern fm_bool fm_wait_stc_done(fm_u32 sec);
-
-extern struct fm_trace_fifo_t *fm_trace_fifo_create(const fm_s8 *name);
-
-extern fm_s32 fm_trace_fifo_release(struct fm_trace_fifo_t *fifo);
-
-extern fm_s32 fm_print_cmd_fifo(void);
-
-extern fm_s32 fm_print_evt_fifo(void);
-
-#endif /* __FM_LINK_H__ */
diff --git a/drivers/misc/mediatek/fmradio/inc/fm_main.h b/drivers/misc/mediatek/fmradio/inc/fm_main.h
deleted file mode 100644
index 932cdbeae..000000000
--- a/drivers/misc/mediatek/fmradio/inc/fm_main.h
+++ /dev/null
@@ -1,400 +0,0 @@
-#ifndef __FM_MAIN_H__
-#define __FM_MAIN_H__
-#include "fm_typedef.h"
-#include "fm_dbg.h"
-#include "fm_err.h"
-#include "fm_rds.h"
-#include "fm_eint.h"
-#include "fm_link.h"
-#include "fm_interface.h"
-#include "fm_stdlib.h"
-#include "fm_private.h"
-
-#define FM_NAME "fm"
-#define FM_DEVICE_NAME "/dev/fm"
-
-#define FM_VOL_MAX 0x2B /* 43 volume(0-15) */
-#define FM_TIMER_TIMEOUT_DEFAULT 1000
-#define FM_TIMER_TIMEOUT_MIN 1000
-#define FM_TIMER_TIMEOUT_MAX 1000000
-/* FM Tx */
-#define FM_TX_PWR_LEVEL_MAX 120 /* FM transmitter power level, rang: 85db~120db, default 120db */
-
-#define FM_TX_PWR_CTRL_INVAL_DEFAULT 10
-#define FM_TX_PWR_CTRL_INVAL_MIN 5
-#define FM_TX_PWR_CTRL_INVAL_MAX 10000
-
-#define FM_TX_VCO_OFF_DEFAULT 5
-#define FM_TX_VCO_OFF_MIN 1
-#define FM_TX_VCO_OFF_MAX 10000
-
-#define FM_TX_VCO_ON_DEFAULT 100
-#define FM_TX_VCO_ON_MIN 10
-#define FM_TX_VCO_ON_MAX 10000
-
-#define FM_GPS_RTC_AGE_TH 2
-#define FM_GPS_RTC_DRIFT_TH 0
-#define FM_GPS_RTC_TIME_DIFF_TH 10
-#define FM_GPS_RTC_RETRY_CNT 1
-#define FM_GPS_RTC_DRIFT_MAX 5000
-enum {
- FM_GPS_RTC_INFO_OLD = 0,
- FM_GPS_RTC_INFO_NEW = 1,
- FM_GPS_RTC_INFO_MAX
-};
-
-typedef enum {
- FM_OVER_BT_DISABLE = 0,
- FM_OVER_BT_ENABLE
-} fm_over_bt_enable_state;
-
-#define FM_RDS_ENABLE 0x01 /* 1: enable RDS, 0:disable RDS */
-#define FM_RDS_DATA_READY (1 << 0)
-
-/* errno */
-#define FM_SUCCESS 0
-#define FM_FAILED 1
-#define FM_EPARM 2
-#define FM_BADSTATUS 3
-#define FM_TUNE_FAILED 4
-#define FM_SEEK_FAILED 5
-#define FM_BUSY 6
-#define FM_SCAN_FAILED 7
-
-struct fm_tune_parm {
- fm_u8 err;
- fm_u8 band;
- fm_u8 space;
- fm_u8 hilo;
- fm_u16 freq; /* IN/OUT parameter */
-};
-
-struct fm_seek_parm {
- fm_u8 err;
- fm_u8 band;
- fm_u8 space;
- fm_u8 hilo;
- fm_u8 seekdir;
- fm_u8 seekth;
- fm_u16 freq; /* IN/OUT parameter */
-};
-
-#ifdef CONFIG_MTK_FM_50KHZ_SUPPORT
-struct fm_scan_parm {
- fm_u8 err;
- fm_u8 band;
- fm_u8 space;
- fm_u8 hilo;
- fm_u16 freq; /* OUT parameter */
- fm_u16 ScanTBL[26]; /* need no less than the chip */
- fm_u16 ScanTBLSize; /* IN/OUT parameter */
-};
-#else
-struct fm_scan_parm {
- fm_u8 err;
- fm_u8 band;
- fm_u8 space;
- fm_u8 hilo;
- fm_u16 freq; /* OUT parameter */
- fm_u16 ScanTBL[16]; /* need no less than the chip */
- fm_u16 ScanTBLSize; /* IN/OUT parameter */
-};
-#endif
-
-struct fm_cqi {
- fm_s32 ch;
- fm_s32 rssi;
- fm_s32 reserve;
-};
-
-struct fm_cqi_req {
- fm_u16 ch_num;
- fm_s32 buf_size;
- fm_s8 *cqi_buf;
-};
-
-struct fm_ch_rssi {
- fm_u16 freq;
- fm_s32 rssi;
-};
-
-enum fm_scan_cmd_t {
- FM_SCAN_CMD_INIT = 0,
- FM_SCAN_CMD_START,
- FM_SCAN_CMD_GET_NUM,
- FM_SCAN_CMD_GET_CH,
- FM_SCAN_CMD_GET_RSSI,
- FM_SCAN_CMD_GET_CH_RSSI,
- FM_SCAN_CMD_MAX
-};
-
-struct fm_scan_t {
- enum fm_scan_cmd_t cmd;
- fm_s32 ret; /* 0, success; else error code */
- fm_u16 lower; /* lower band, Eg, 7600 -> 76.0Mhz */
- fm_u16 upper; /* upper band, Eg, 10800 -> 108.0Mhz */
- fm_s32 space; /* 5: 50KHz, 10: 100Khz, 20: 200Khz */
- fm_s32 num; /* valid channel number */
- void *priv;
- fm_s32 sr_size; /* scan result buffer size in bytes */
- union {
- fm_u16 *ch_buf; /* channel buffer */
- fm_s32 *rssi_buf; /* rssi buffer */
- struct fm_ch_rssi *ch_rssi_buf; /* channel and RSSI buffer */
- } sr;
-};
-
-struct fm_seek_t {
- fm_s32 ret; /* 0, success; else error code */
- fm_u16 freq;
- fm_u16 lower; /* lower band, Eg, 7600 -> 76.0Mhz */
- fm_u16 upper; /* upper band, Eg, 10800 -> 108.0Mhz */
- fm_s32 space; /* 5: 50KHz, 10: 100Khz, 20: 200Khz */
- fm_s32 dir; /* 0: up; 1: down */
- fm_s32 th; /* seek threshold in dbm(Eg, -95dbm) */
- void *priv;
-};
-
-struct fm_tune_t {
- fm_s32 ret; /* 0, success; else error code */
- fm_u16 freq;
- fm_u16 lower; /* lower band, Eg, 7600 -> 76.0Mhz */
- fm_u16 upper; /* upper band, Eg, 10800 -> 108.0Mhz */
- fm_s32 space; /* 5: 50KHz, 10: 100Khz, 20: 200Khz */
- void *priv;
-};
-
-
-#ifdef CONFIG_MTK_FM_50KHZ_SUPPORT
-struct fm_rssi_req {
- fm_u16 num;
- fm_u16 read_cnt;
- struct fm_ch_rssi cr[26 * 16];
-};
-#else
-struct fm_rssi_req {
- fm_u16 num;
- fm_u16 read_cnt;
- struct fm_ch_rssi cr[16 * 16];
-};
-#endif
-
-struct fm_rds_tx_parm {
- fm_u8 err;
- fm_u16 pi;
- fm_u16 ps[12]; /* 4 ps */
- fm_u16 other_rds[87]; /* 0~29 other groups */
- fm_u8 other_rds_cnt; /* # of other group */
-};
-
-typedef struct fm_rds_tx_req {
- unsigned char pty; /* 0~31 integer */
- unsigned char rds_rbds; /* 0:RDS, 1:RBDS */
- unsigned char dyn_pty; /* 0:static, 1:dynamic */
- unsigned short pi_code; /* 2-byte hex */
- unsigned char ps_buf[8]; /* hex buf of PS */
- unsigned char ps_len; /* length of PS, must be 0 / 8" */
- unsigned char af; /* 0~204, 0:not used, 1~204:(87.5+0.1*af)MHz */
- unsigned char ah; /* Artificial head, 0:no, 1:yes */
- unsigned char stereo; /* 0:mono, 1:stereo */
- unsigned char compress; /* Audio compress, 0:no, 1:yes */
- unsigned char tp; /* traffic program, 0:no, 1:yes */
- unsigned char ta; /* traffic announcement, 0:no, 1:yes */
- unsigned char speech; /* 0:music, 1:speech */
-} fm_rds_tx_req;
-
-#define TX_SCAN_MAX 10
-#define TX_SCAN_MIN 1
-
-struct fm_tx_scan_parm {
- fm_u8 err;
- fm_u8 band; /* 87.6~108MHz */
- fm_u8 space;
- fm_u8 hilo;
- fm_u16 freq; /* start freq, if less than band min freq, then will use band min freq */
- fm_u8 scandir;
- fm_u16 ScanTBL[TX_SCAN_MAX]; /* need no less than the chip */
- fm_u16 ScanTBLSize; /* IN: desired size, OUT: scan result size */
-};
-
-struct fm_gps_rtc_info {
- fm_s32 err; /* error number, 0: success, other: err code */
- fm_s32 retryCnt; /* GPS mnl can decide retry times */
- fm_s32 ageThd; /* GPS 3D fix time diff threshold */
- fm_s32 driftThd; /* GPS RTC drift threshold */
- struct timeval tvThd; /* time value diff threshold */
- fm_s32 age; /* GPS 3D fix time diff */
- fm_s32 drift; /* GPS RTC drift */
- union {
- unsigned long stamp; /* time stamp in jiffies */
- struct timeval tv; /* time stamp value in RTC */
- };
- fm_s32 flag; /* rw flag */
-};
-
-typedef struct {
- fm_s32 freq;
- fm_s32 rssi;
-} fm_desense_check_t;
-
-typedef struct {
- uint16_t lower; /* lower band, Eg, 7600 -> 76.0Mhz */
- uint16_t upper; /* upper band, Eg, 10800 -> 108.0Mhz */
- int space; /* 0x1: 50KHz, 0x2: 100Khz, 0x4: 200Khz */
- int cycle; /* repeat times */
-} fm_full_cqi_log_t;
-
-typedef enum {
- FM_RX = 0,
- FM_TX = 1
-} FM_PWR_T;
-
-struct fm_ctl_parm {
- fm_u8 err;
- fm_u8 addr;
- fm_u16 val;
- fm_u16 rw_flag; /* 0:write, 1:read */
-};
-struct fm_em_parm {
- fm_u16 group_idx;
- fm_u16 item_idx;
- fm_u32 item_value;
-};
-struct fm_top_rw_parm {
- fm_u8 err;
- fm_u8 rw_flag; /* 0:write, 1:read */
- fm_u16 addr;
- fm_u32 val;
-};
-struct fm_host_rw_parm {
- fm_u8 err;
- fm_u8 rw_flag; /* 0:write, 1:read */
- fm_u32 addr;
- fm_u32 val;
-};
-
-enum {
- FM_SUBSYS_RST_OFF,
- FM_SUBSYS_RST_START,
- FM_SUBSYS_RST_END,
- FM_SUBSYS_RST_MAX
-};
-enum {
- FM_TX_PWR_CTRL_DISABLE,
- FM_TX_PWR_CTRL_ENABLE,
- FM_TX_PWR_CTRL_MAX
-};
-
-enum {
- FM_TX_RTC_CTRL_DISABLE,
- FM_TX_RTC_CTRL_ENABLE,
- FM_TX_RTC_CTRL_MAX
-};
-
-enum {
- FM_TX_DESENSE_DISABLE,
- FM_TX_DESENSE_ENABLE,
- FM_TX_DESENSE_MAX
-};
-
-struct fm_softmute_tune_t {
- fm_s32 rssi; /* RSSI of current channel */
- fm_u16 freq; /* current frequency */
- fm_bool valid; /* current channel is valid(true) or not(false) */
-};
-struct fm_search_threshold_t {
- fm_s32 th_type; /* 0, RSSI. 1,desense RSSI. 2,SMG. */
- fm_s32 th_val; /* threshold value */
- fm_s32 reserve;
-};
-
-typedef struct
-{
- int which;
- bool stat;
-}fm_status_t;
-
-/* init and deinit APIs */
-extern fm_s32 fm_env_setup(void);
-extern fm_s32 fm_env_destroy(void);
-extern struct fm *fm_dev_init(fm_u32 arg);
-extern fm_s32 fm_dev_destroy(struct fm *fm);
-
-
-/* fm main basic APIs */
-extern enum fm_pwr_state fm_pwr_state_get(struct fm *fmp);
-extern enum fm_pwr_state fm_pwr_state_set(struct fm *fmp, enum fm_pwr_state sta);
-extern fm_s32 fm_open(struct fm *fmp);
-extern fm_s32 fm_close(struct fm *fmp);
-extern fm_s32 fm_rds_read(struct fm *fmp, fm_s8 *dst, fm_s32 len);
-extern fm_s32 fm_powerup(struct fm *fm, struct fm_tune_parm *parm);
-extern fm_s32 fm_powerdown(struct fm *fm, int type);
-extern fm_s32 fm_seek(struct fm *fm, struct fm_seek_parm *parm);
-extern fm_s32 fm_scan(struct fm *fm, struct fm_scan_parm *parm);
-extern fm_s32 fm_cqi_get(struct fm *fm, fm_s32 ch_num, fm_s8 *buf, fm_s32 buf_size);
-extern fm_s32 fm_get_hw_info(struct fm *pfm, struct fm_hw_info *req);
-extern fm_s32 fm_hwscan_stop(struct fm *fm);
-extern fm_s32 fm_ana_switch(struct fm *fm, fm_s32 antenna);
-extern fm_s32 fm_setvol(struct fm *fm, fm_u32 vol);
-extern fm_s32 fm_getvol(struct fm *fm, fm_u32 *vol);
-extern fm_s32 fm_mute(struct fm *fm, fm_u32 bmute);
-extern fm_s32 fm_getrssi(struct fm *fm, fm_s32 *rssi);
-extern fm_s32 fm_reg_read(struct fm *fm, fm_u8 addr, fm_u16 *val);
-extern fm_s32 fm_reg_write(struct fm *fm, fm_u8 addr, fm_u16 val);
-extern fm_s32 fm_top_read(struct fm *fm, fm_u16 addr, fm_u32 *val);
-extern fm_s32 fm_top_write(struct fm *fm, fm_u16 addr, fm_u32 val);
-extern fm_s32 fm_host_read(struct fm *fm, fm_u32 addr, fm_u32 *val);
-extern fm_s32 fm_host_write(struct fm *fm, fm_u32 addr, fm_u32 val);
-extern fm_s32 fm_chipid_get(struct fm *fm, fm_u16 *chipid);
-extern fm_s32 fm_monostereo_get(struct fm *fm, fm_u16 *ms);
-extern fm_s32 fm_monostereo_set(struct fm *fm, fm_s32 ms);
-extern fm_s32 fm_pamd_get(struct fm *fm, fm_u16 *pamd);
-extern fm_s32 fm_caparray_get(struct fm *fm, fm_s32 *ca);
-extern fm_s32 fm_em_test(struct fm *fm, fm_u16 group, fm_u16 item, fm_u32 val);
-extern fm_s32 fm_rds_onoff(struct fm *fm, fm_u16 rdson_off);
-extern fm_s32 fm_rds_good_bc_get(struct fm *fm, fm_u16 *gbc);
-extern fm_s32 fm_rds_bad_bc_get(struct fm *fm, fm_u16 *bbc);
-extern fm_s32 fm_rds_bler_ratio_get(struct fm *fm, fm_u16 *bbr);
-extern fm_s32 fm_rds_group_cnt_get(struct fm *fm, struct rds_group_cnt_t *dst);
-extern fm_s32 fm_rds_group_cnt_reset(struct fm *fm);
-extern fm_s32 fm_rds_log_get(struct fm *fm, struct rds_rx_t *dst, fm_s32 *dst_len);
-extern fm_s32 fm_rds_block_cnt_reset(struct fm *fm);
-extern fm_s32 fm_i2s_set(struct fm *fm, fm_s32 onoff, fm_s32 mode, fm_s32 sample);
-extern fm_s32 fm_get_i2s_info(struct fm *pfm, struct fm_i2s_info *req);
-extern fm_s32 fm_tune(struct fm *fm, struct fm_tune_parm *parm);
-extern fm_s32 fm_is_dese_chan(struct fm *pfm, fm_u16 freq);
-extern fm_s32 fm_desense_check(struct fm *pfm, fm_u16 freq, fm_s32 rssi);
-extern fm_s32 fm_sys_state_get(struct fm *fmp);
-extern fm_s32 fm_sys_state_set(struct fm *fmp, fm_s32 sta);
-extern fm_s32 fm_set_stat(struct fm *fmp, int which, bool stat);
-extern fm_s32 fm_get_stat(struct fm *fmp, int which, bool *stat);
-extern fm_s32 fm_subsys_reset(struct fm *fm);
-
-extern fm_s32 fm_scan_new(struct fm *fm, struct fm_scan_t *parm);
-extern fm_s32 fm_seek_new(struct fm *fm, struct fm_seek_t *parm);
-extern fm_s32 fm_tune_new(struct fm *fm, struct fm_tune_t *parm);
-
-extern fm_s32 fm_cust_config_setup(fm_s8 *filename);
-extern fm_s32 fm_cqi_log(void);
-extern fm_s32 fm_soft_mute_tune(struct fm *fm, struct fm_softmute_tune_t *parm);
-extern fm_s32 fm_pre_search(struct fm *fm);
-extern fm_s32 fm_restore_search(struct fm *fm);
-
-extern fm_s32 fm_dump_reg(void);
-extern fm_s32 fm_get_gps_rtc_info(struct fm_gps_rtc_info *src);
-extern fm_s32 fm_over_bt(struct fm *fm, fm_s32 flag);
-extern fm_s32 fm_set_search_th(struct fm *fm, struct fm_search_threshold_t parm);
-extern fm_s32 fm_get_aud_info(fm_audio_info_t *data);
-/*tx function*/
-extern fm_s32 fm_tx_support(struct fm *fm, fm_s32 *support);
-
-extern fm_s32 fm_powerup_tx(struct fm *fm, struct fm_tune_parm *parm);
-extern fm_s32 fm_tune_tx(struct fm *fm, struct fm_tune_parm *parm);
-extern fm_s32 fm_powerdowntx(struct fm *fm);
-extern fm_s32 fm_rds_tx(struct fm *fm, struct fm_rds_tx_parm *parm);
-extern fm_s32 fm_rdstx_support(struct fm *fm, fm_s32 *support);
-extern fm_s32 fm_rdstx_enable(struct fm *fm, fm_s32 enable);
-extern fm_s32 fm_tx_scan(struct fm *fm, struct fm_tx_scan_parm *parm);
-fm_s32 fm_full_cqi_logger(fm_full_cqi_log_t *setting);
-
-#endif /* __FM_MAIN_H__ */
diff --git a/drivers/misc/mediatek/fmradio/inc/fm_patch.h b/drivers/misc/mediatek/fmradio/inc/fm_patch.h
deleted file mode 100644
index 0db191b8f..000000000
--- a/drivers/misc/mediatek/fmradio/inc/fm_patch.h
+++ /dev/null
@@ -1,28 +0,0 @@
-#ifndef __FM_PATCH_H__
-#define __FM_PATCH_H__
-
-enum {
- FM_ROM_V1 = 0,
- FM_ROM_V2 = 1,
- FM_ROM_V3 = 2,
- FM_ROM_V4 = 3,
- FM_ROM_V5 = 4,
- FM_ROM_MAX
-};
-
-struct fm_patch_tbl {
- fm_s32 idx;
- fm_s8 *patch;
- fm_s8 *coeff;
- fm_s8 *rom;
- fm_s8 *hwcoeff;
-};
-
-extern fm_s32 fm_file_exist(const fm_s8 *filename);
-
-extern fm_s32 fm_file_read(const fm_s8 *filename, fm_u8 *dst, fm_s32 len, fm_s32 position);
-
-extern fm_s32 fm_file_write(const fm_s8 *filename, fm_u8 *dst, fm_s32 len, fm_s32 *ppos);
-
-
-#endif /* __FM_PATCH_H__ */
diff --git a/drivers/misc/mediatek/fmradio/inc/fm_priv_log.h b/drivers/misc/mediatek/fmradio/inc/fm_priv_log.h
deleted file mode 100644
index 634d3d667..000000000
--- a/drivers/misc/mediatek/fmradio/inc/fm_priv_log.h
+++ /dev/null
@@ -1,101 +0,0 @@
-#ifndef __FM_PRIV_LOG_H__
-#define __FM_PRIV_LOG_H__
-#if 0
-#include "fm_typedef.h"
-
-/******************DBG level ************************/
-#define D_BASE 4
-#define D_IOCTL (1 << (D_BASE+0))
-#define D_RX (1 << (D_BASE+1))
-#define D_TIMER (1 << (D_BASE+2))
-#define D_BLKC (1 << (D_BASE+3))
-#define D_G0 (1 << (D_BASE+4))
-#define D_G1 (1 << (D_BASE+5))
-#define D_G2 (1 << (D_BASE+6))
-#define D_G3 (1 << (D_BASE+7))
-#define D_G4 (1 << (D_BASE+8))
-#define D_G14 (1 << (D_BASE+9))
-#define D_RAW (1 << (D_BASE+10))
-#define D_RDS (1 << (D_BASE+11))
-#define D_INIT (1 << (D_BASE+12))
-#define D_MAIN (1 << (D_BASE+13))
-#define D_CMD (1 << (D_BASE+14))
-#define D_ALL 0xfffffff0
-
-#define L0 0x00000000 /* EMERG, system will crush */
-#define L1 0x00000001 /* ALERT, need action in time */
-#define L2 0x00000002 /* CRIT, important HW or SW operation failed */
-#define L3 0x00000003 /* ERR, normal HW or SW ERR */
-#define L4 0x00000004 /* WARNING, importan path or somewhere may occurs err */
-#define L5 0x00000005 /* NOTICE, normal case */
-#define L6 0x00000006 /* INFO, print info if need */
-#define L7 0x00000007 /* DEBUG, for debug info */
-
-#define FM_EMERG L0
-#define FM_ALERT L1
-#define FM_CRIT L2
-#define FM_ERR L3
-#define FM_WARNING L4
-#define FM_NOTICE L5
-#define FM_INFO L6
-#define FM_DEBUG L7
-
-extern fm_u32 g_dbg_level;
-
-#define FM_LOG_DBG(flag, fmt, args...) \
- do { \
- if (pub_cb->log && (FM_DEBUG <= (g_dbg_level&0x0000000f)) && ((flag)&0xfffffff0) & g_dbg_level) { \
- pub_cb->log("[" #flag "]" fmt, ## args); \
- } \
- } while (0)
-
-#define FM_LOG_INF(flag, fmt, args...) \
- do { \
- if (pub_cb->log && (FM_INFO <= (g_dbg_level&0x0000000f)) && ((flag)&0xfffffff0) & g_dbg_level) { \
- pub_cb->log("[" #flag "]" fmt, ## args); \
- } \
- } while (0)
-
-#define FM_LOG_NTC(flag, fmt, args...) \
- do { \
- if (pub_cb->log && (FM_NOTICE <= (g_dbg_level&0x0000000f)) && ((flag)&0xfffffff0) & g_dbg_level) { \
- pub_cb->log("[" #flag "]" fmt, ## args); \
- } \
- } while (0)
-
-#define FM_LOG_WAR(flag, fmt, args...) \
- do { \
- if (pub_cb->log && (FM_WARNING <= (g_dbg_level&0x0000000f)) && ((flag)&0xfffffff0) & g_dbg_level) { \
- pub_cb->log("[" #flag "]" fmt, ## args); \
- } \
- } while (0)
-
-#define FM_LOG_ERR(flag, fmt, args...) \
- do { \
- if (pub_cb->log && (FM_ERR <= (g_dbg_level&0x0000000f)) && ((flag)&0xfffffff0) & g_dbg_level) { \
- pub_cb->log("[" #flag "]" fmt, ## args); \
- } \
- } while (0)
-
-#define FM_LOG_CRT(flag, fmt, args...) \
- do { \
- if (pub_cb->log && (FM_CRIT <= (g_dbg_level&0x0000000f)) && ((flag)&0xfffffff0) & g_dbg_level) { \
- pub_cb->log("[" #flag "]" fmt, ## args); \
- } \
- } while (0)
-
-#define FM_LOG_ALT(flag, fmt, args...) \
- do { \
- if (pub_cb->log && (FM_ALERT <= (g_dbg_level&0x0000000f)) && ((flag)&0xfffffff0) & g_dbg_level) { \
- pub_cb->log("[" #flag "]" fmt, ## args); \
- } \
- } while (0)
-
-#define FM_LOG_EMG(flag, fmt, args...) \
- do { \
- if (pub_cb->log && (FM_EMERG <= (g_dbg_level&0x0000000f)) && ((flag)&0xfffffff0) & g_dbg_level) { \
- pub_cb->log("[" #flag "]" fmt, ## args); \
- } \
- } while (0)
-#endif
-#endif /* __FM_PRIV_LOG_H__ */
diff --git a/drivers/misc/mediatek/fmradio/inc/fm_private.h b/drivers/misc/mediatek/fmradio/inc/fm_private.h
deleted file mode 100644
index 80129e9a0..000000000
--- a/drivers/misc/mediatek/fmradio/inc/fm_private.h
+++ /dev/null
@@ -1,93 +0,0 @@
-#ifndef __FM_PRIVATE_H__
-#define __FM_PRIVATE_H__
-
-#include "fm_typedef.h"
-
-typedef enum fm_priv_state {
- UNINITED,
- INITED
-} fm_priv_state_t;
-
-typedef enum fm_adpll_state {
- FM_ADPLL_ON,
- FM_ADPLL_OFF
-} fm_adpll_state_t;
-
-typedef enum fm_hl_dese {
- FM_HL_DESE_LOW,
- FM_HL_DESE_HIGH
-} fm_hl_dese_t;
-
-typedef enum fm_adpll_clk {
- FM_ADPLL_16M,
- FM_ADPLL_15M
-} fm_adpll_clk_t;
-
-typedef enum fm_mcu_desense {
- FM_MCU_DESE_ENABLE,
- FM_MCU_DESE_DISABLE
-} fm_mcu_desense_t;
-
-typedef enum fm_gps_desense {
- FM_GPS_DESE_ENABLE,
- FM_GPS_DESE_DISABLE
-} fm_gps_desense_t;
-
-/* 6620 */
-typedef struct MT6620fm_priv_cb {
- /* Basic functions. */
- int (*hl_side) (uint16_t freq, int *hl);
- int (*adpll_freq_avoid) (uint16_t freq, int *freqavoid);
- int (*mcu_freq_avoid) (uint16_t freq, int *freqavoid);
- int (*tx_pwr_ctrl) (uint16_t freq, int *ctr);
- int (*rtc_drift_ctrl) (uint16_t freq, int *ctr);
- int (*tx_desense_wifi) (uint16_t freq, int *ctr);
- int (*is_dese_chan) (fm_u16 freq); /* check if this is a de-sense channel */
-} MT6620fm_priv_cb_t;
-
-typedef struct MT6620fm_priv {
- int state;
- void *data;
- MT6620fm_priv_cb_t priv_tbl;
-} MT6620fm_priv_t;
-
-/* 6628 */
-typedef struct fm_priv_cb {
- /* De-sense functions. */
- fm_s32(*is_dese_chan) (fm_u16 freq); /* check if this is a de-sense channel */
- fm_s32(*hl_dese) (fm_u16 freq, void *arg); /* return value: 0, low side; 1, high side; else error no */
- fm_s32(*fa_dese) (fm_u16 freq, void *arg); /* return value: 0, fa off; 1, fa on; else error no */
- fm_s32(*mcu_dese) (fm_u16 freq, void *arg); /* return value: 0, mcu dese disable; 1, enable; else error no */
- fm_s32(*gps_dese) (fm_u16 freq, void *arg); /* return value: 0,mcu dese disable; 1, enable; else error no */
- fm_u16(*chan_para_get) (fm_u16 freq); /* get channel parameter, HL side/ FA / ATJ */
-} fm_priv_cb_t;
-
-typedef struct fm_priv {
- fm_s32 state;
- fm_priv_cb_t priv_tbl;
- void *data;
-} fm_priv_t;
-
-typedef struct fm_pub_cb {
- /* Basic functions. */
- fm_s32(*read) (fm_u8 addr, fm_u16 *val);
- fm_s32(*write) (fm_u8 addr, fm_u16 val);
- fm_s32(*setbits) (fm_u8 addr, fm_u16 bits, fm_u16 mask);
- fm_s32(*rampdown) (void);
- fm_s32(*msdelay) (fm_u32 val);
- fm_s32(*usdelay) (fm_u32 val);
- fm_s32(*log) (const fm_s8 *arg1, ...);
-} fm_pub_cb_t;
-
-typedef struct fm_pub {
- fm_s32 state;
- void *data;
- struct fm_pub_cb pub_tbl;
-} fm_pub_t;
-
-
-#if 0 /* (!defined(MT6620_FM)&&!defined(MT6628_FM)) */
-extern fm_s32 fm_priv_register(struct fm_priv *pri, struct fm_pub *pub);
-extern fm_s32 fm_priv_unregister(struct fm_priv *pri, struct fm_pub *pub);
-#endif
-#endif /* __FM_PRIVATE_H__ */
diff --git a/drivers/misc/mediatek/fmradio/inc/fm_rds.h b/drivers/misc/mediatek/fmradio/inc/fm_rds.h
deleted file mode 100644
index 4763f3200..000000000
--- a/drivers/misc/mediatek/fmradio/inc/fm_rds.h
+++ /dev/null
@@ -1,221 +0,0 @@
-#ifndef __FM_RDS_H__
-#define __FM_RDS_H__
-#include "fm_typedef.h"
-
-/* FM_RDS_DATA_CRC_FFOST */
-#define FM_RDS_GDBK_IND_A (0x08)
-#define FM_RDS_GDBK_IND_B (0x04)
-#define FM_RDS_GDBK_IND_C (0x02)
-#define FM_RDS_GDBK_IND_D (0x01)
-#define FM_RDS_DCO_FIFO_OFST (0x01E0)
-#define FM_RDS_READ_DELAY (0x80)
-
-#define RDS_RX_BLOCK_PER_GROUP (4)
-#define RDS_RX_GROUP_SIZE (2*RDS_RX_BLOCK_PER_GROUP)
-#define MAX_RDS_RX_GROUP_CNT (12)
-#define RDS_RT_MULTI_REV_TH 80 /* 100 */
-/* #define RDS_CBC_DEPENDENCY */
-
-typedef struct rds_packet_t {
- fm_u16 blkA;
- fm_u16 blkB;
- fm_u16 blkC;
- fm_u16 blkD;
- fm_u16 cbc; /* correct bit cnt */
- fm_u16 crc; /* crc checksum */
-} rds_packet_t;
-
-typedef struct rds_rx_t {
- fm_u16 sin;
- fm_u16 cos;
- rds_packet_t data[MAX_RDS_RX_GROUP_CNT];
-} rds_rx_t;
-
-typedef enum rds_ps_state_machine_t {
- RDS_PS_START = 0,
- RDS_PS_DECISION,
- RDS_PS_GETLEN,
- RDS_PS_DISPLAY,
- RDS_PS_FINISH,
- RDS_PS_MAX
-} rds_ps_state_machine_t;
-
-typedef enum rds_rt_state_machine_t {
- RDS_RT_START = 0,
- RDS_RT_DECISION,
- RDS_RT_GETLEN,
- RDS_RT_DISPLAY,
- RDS_RT_FINISH,
- RDS_RT_MAX
-} rds_rt_state_machine_t;
-
-
-enum {
- RDS_GRP_VER_A = 0, /* group version A */
- RDS_GRP_VER_B
-};
-
-typedef enum rds_blk_t {
- RDS_BLK_A = 0,
- RDS_BLK_B,
- RDS_BLK_C,
- RDS_BLK_D,
- RDS_BLK_MAX
-} rds_blk_t;
-
-/* For RDS feature, these strcutures also be defined in "fm.h" */
-typedef struct rds_flag_t {
- fm_u8 TP;
- fm_u8 TA;
- fm_u8 Music;
- fm_u8 Stereo;
- fm_u8 Artificial_Head;
- fm_u8 Compressed;
- fm_u8 Dynamic_PTY;
- fm_u8 Text_AB;
- fm_u32 flag_status;
-} rds_flag_t;
-
-typedef struct rds_ct_t {
- fm_u16 Month;
- fm_u16 Day;
- fm_u16 Year;
- fm_u16 Hour;
- fm_u16 Minute;
- fm_u8 Local_Time_offset_signbit;
- fm_u8 Local_Time_offset_half_hour;
-} rds_ct_t;
-
-typedef struct rds_af_t {
- fm_s16 AF_Num;
- fm_s16 AF[2][25]; /* 100KHz */
- fm_u8 Addr_Cnt;
- fm_u8 isMethod_A;
- fm_u8 isAFNum_Get;
-} rds_af_t;
-
-typedef struct rds_ps_t {
- fm_u8 PS[4][8];
- fm_u8 Addr_Cnt;
-} rds_ps_t;
-
-typedef struct rds_rt_t {
- fm_u8 TextData[4][64];
- fm_u8 GetLength;
- fm_u8 isRTDisplay;
- fm_u8 TextLength;
- fm_u8 isTypeA;
- fm_u8 BufCnt;
- fm_u16 Addr_Cnt;
-} rds_rt_t;
-
-typedef struct rds_raw_t {
- fm_s32 dirty; /* indicate if the data changed or not */
- fm_s32 len; /* the data len form chip */
- fm_u8 data[146];
-} rds_raw_t;
-
-typedef struct rds_group_cnt_t {
- unsigned int total;
- unsigned int groupA[16]; /* RDS groupA counter */
- unsigned int groupB[16]; /* RDS groupB counter */
-} rds_group_cnt_t;
-
-typedef enum rds_group_cnt_op_t {
- RDS_GROUP_CNT_READ = 0,
- RDS_GROUP_CNT_WRITE,
- RDS_GROUP_CNT_RESET,
- RDS_GROUP_CNT_MAX
-} rds_group_cnt_op_t;
-
-typedef struct rds_group_cnt_req_t {
- fm_s32 err;
- enum rds_group_cnt_op_t op;
- struct rds_group_cnt_t gc;
-} rds_group_cnt_req_t;
-
-typedef struct rds_t {
- struct rds_ct_t CT;
- struct rds_flag_t RDSFlag;
- fm_u16 PI;
- fm_u8 Switch_TP;
- fm_u8 PTY;
- struct rds_af_t AF_Data;
- fm_u8 Radio_Page_Code;
- fm_u16 Program_Item_Number_Code;
- struct rds_af_t AFON_Data;
- fm_u8 Extend_Country_Code;
- fm_u16 Language_Code;
- struct rds_ps_t PS_Data;
- fm_u8 PS_ON[8];
- fm_u16 event_status; /* will use RDSFlag_Struct RDSFlag->flag_status to check which event, is that ok? */
- struct rds_rt_t RT_Data;
- fm_u8 PAD1; //padding for data aligh
- struct rds_group_cnt_t gc;
-} rds_t;
-
-
-/* Need care the following definition. */
-/* valid Rds Flag for notify */
-typedef enum rds_flag_status_t {
- RDS_FLAG_IS_TP = 0x0001, /* Program is a traffic program */
- RDS_FLAG_IS_TA = 0x0002, /* Program currently broadcasts a traffic ann. */
- RDS_FLAG_IS_MUSIC = 0x0004, /* Program currently broadcasts music */
- RDS_FLAG_IS_STEREO = 0x0008, /* Program is transmitted in stereo */
- RDS_FLAG_IS_ARTIFICIAL_HEAD = 0x0010, /* Program is an artificial head recording */
- RDS_FLAG_IS_COMPRESSED = 0x0020, /* Program content is compressed */
- RDS_FLAG_IS_DYNAMIC_PTY = 0x0040, /* Program type can change */
- RDS_FLAG_TEXT_AB = 0x0080 /* If this flag changes state, a new radio text string begins */
-} rds_flag_status_t;
-
-typedef enum rds_event_status_t {
- RDS_EVENT_FLAGS = 0x0001, /* One of the RDS flags has changed state */
- RDS_EVENT_PI_CODE = 0x0002, /* The program identification code has changed */
- RDS_EVENT_PTY_CODE = 0x0004, /* The program type code has changed */
- RDS_EVENT_PROGRAMNAME = 0x0008, /* The program name has changed */
- RDS_EVENT_UTCDATETIME = 0x0010, /* A new UTC date/time is available */
- RDS_EVENT_LOCDATETIME = 0x0020, /* A new local date/time is available */
- RDS_EVENT_LAST_RADIOTEXT = 0x0040, /* A radio text string was completed */
- RDS_EVENT_AF = 0x0080, /* Current Channel RF signal strength too weak, need do AF switch */
- RDS_EVENT_AF_LIST = 0x0100, /* An alternative frequency list is ready */
- RDS_EVENT_AFON_LIST = 0x0200, /* An alternative frequency list is ready */
- RDS_EVENT_TAON = 0x0400, /* Other Network traffic announcement start */
- RDS_EVENT_TAON_OFF = 0x0800, /* Other Network traffic announcement finished. */
- RDS_EVENT_RDS = 0x2000, /* RDS Interrupt had arrived durint timer period */
- RDS_EVENT_NO_RDS = 0x4000, /* RDS Interrupt not arrived durint timer period */
- RDS_EVENT_RDS_TIMER = 0x8000 /* Timer for RDS Bler Check. ---- BLER block error rate */
-} rds_event_status_t;
-
-
-#define RDS_LOG_SIZE 2
-struct rds_log_t {
- struct rds_rx_t rds_log[RDS_LOG_SIZE];
- fm_s32 log_len[RDS_LOG_SIZE];
- fm_u32 size;
- fm_u32 in;
- fm_u32 out;
- fm_u32 len;
- fm_s32(*log_in) (struct rds_log_t *thiz, struct rds_rx_t *new_log, fm_s32 new_len);
- fm_s32(*log_out) (struct rds_log_t *thiz, struct rds_rx_t *dst, fm_s32 *dst_len);
-};
-
-extern fm_s32 rds_parser(rds_t *rds_dst, struct rds_rx_t *rds_raw, fm_s32 rds_size,
- fm_u16(*getfreq) (void));
-extern fm_s32 rds_grp_counter_get(struct rds_group_cnt_t *dst, struct rds_group_cnt_t *src);
-extern fm_s32 rds_grp_counter_reset(struct rds_group_cnt_t *gc);
-extern fm_s32 rds_log_in(struct rds_log_t *thiz, struct rds_rx_t *new_log, fm_s32 new_len);
-extern fm_s32 rds_log_out(struct rds_log_t *thiz, struct rds_rx_t *dst, fm_s32 *dst_len);
-
-
-#define DEFINE_RDSLOG(name) \
- struct rds_log_t name = { \
- .size = RDS_LOG_SIZE, \
- .in = 0, \
- .out = 0, \
- .len = 0, \
- .log_in = rds_log_in, \
- .log_out = rds_log_out, \
- }
-
-
-#endif /* __FM_RDS_H__ */
diff --git a/drivers/misc/mediatek/fmradio/inc/fm_stdlib.h b/drivers/misc/mediatek/fmradio/inc/fm_stdlib.h
deleted file mode 100644
index 1f4bbc05b..000000000
--- a/drivers/misc/mediatek/fmradio/inc/fm_stdlib.h
+++ /dev/null
@@ -1,61 +0,0 @@
-#ifndef __FM_STDLIB_H__
-#define __FM_STDLIB_H__
-
-#include "fm_typedef.h"
-#include <linux/string.h>
-#include <linux/slab.h>
-
-#if 1
-#define fm_memset(buf, a, len) \
-({ \
- void *__ret = (void *)0; \
- __ret = memset((buf), (a), (len)); \
- __ret; \
-})
-
-#define fm_memcpy(dst, src, len) \
-({ \
- void *__ret = (void *)0; \
- __ret = memcpy((dst), (src), (len)); \
- __ret; \
-})
-
-#define fm_malloc(len) \
-({ \
- void *__ret = (void *)0; \
- __ret = kmalloc(len, GFP_KERNEL); \
- __ret; \
-})
-
-#define fm_zalloc(len) \
-({ \
- void *__ret = (void *)0; \
- __ret = kzalloc(len, GFP_KERNEL); \
- __ret; \
-})
-
-#define fm_free(ptr) kfree(ptr)
-
-#define fm_vmalloc(len) \
-({ \
- void *__ret = (void *)0; \
- __ret = vmalloc(len); \
- __ret; \
-})
-
-#define fm_vfree(ptr) vfree(ptr)
-
-#else
-inline void *fm_memset(void *buf, fm_s8 val, fm_s32 len)
-{
- return memset(buf, val, len);
-}
-
-inline void *fm_memcpy(void *dst, const void *src, fm_s32 len)
-{
- return memcpy(dst, src, len);
-}
-
-#endif
-
-#endif /* __FM_STDLIB_H__ */
diff --git a/drivers/misc/mediatek/fmradio/inc/fm_typedef.h b/drivers/misc/mediatek/fmradio/inc/fm_typedef.h
deleted file mode 100644
index cb55657bc..000000000
--- a/drivers/misc/mediatek/fmradio/inc/fm_typedef.h
+++ /dev/null
@@ -1,35 +0,0 @@
-#ifndef __FM_TYPEDEF_H__
-#define __FM_TYPEDEF_H__
-
-typedef signed char fm_s8;
-typedef signed short fm_s16;
-typedef signed int fm_s32;
-typedef signed long long fm_s64;
-typedef unsigned char fm_u8;
-typedef unsigned short fm_u16;
-typedef unsigned int fm_u32;
-typedef unsigned long long fm_u64;
-
-#ifndef FALSE
-#define FALSE (0)
-#endif
-
-#ifndef TRUE
-#define TRUE (1)
-#endif
-
-#ifndef NULL
-#define NULL (0)
-#endif
-
-#ifndef BOOL
-typedef unsigned char BOOL;
-#endif
-
-typedef enum fm_bool {
- fm_false = 0,
- fm_true = 1
-} fm_bool;
-
-
-#endif /* __FM_TYPEDEF_H__ */
diff --git a/drivers/misc/mediatek/fmradio/inc/fm_utils.h b/drivers/misc/mediatek/fmradio/inc/fm_utils.h
deleted file mode 100644
index 0f306d624..000000000
--- a/drivers/misc/mediatek/fmradio/inc/fm_utils.h
+++ /dev/null
@@ -1,311 +0,0 @@
-#ifndef __FM_UTILS_H__
-#define __FM_UTILS_H__
-
-#include "fm_typedef.h"
-
-
-/**
- * Base structure of fm object
- */
-#define FM_NAME_MAX 20
-struct fm_object {
- fm_s8 name[FM_NAME_MAX + 1]; /* name of fm object */
- fm_u8 type; /* type of fm object */
- fm_u8 flag; /* flag of fm object */
- fm_s32 ref;
- void *priv;
- /* struct fm_list *list; // list node of fm object */
-};
-
-
-/*
- * FM FIFO
- */
-struct fm_fifo {
- struct fm_object obj;
- fm_s32 size;
- fm_s32 in;
- fm_s32 out;
- fm_s32 len;
- fm_s32 item_size;
- fm_s32(*input) (struct fm_fifo *thiz, void *item);
- fm_s32(*output) (struct fm_fifo *thiz, void *item);
- fm_bool(*is_full) (struct fm_fifo *thiz);
- fm_bool(*is_empty) (struct fm_fifo *thiz);
- fm_s32(*get_total_len) (struct fm_fifo *thiz);
- fm_s32(*get_valid_len) (struct fm_fifo *thiz);
- fm_s32(*reset) (struct fm_fifo *thiz);
-};
-
-extern struct fm_fifo *fm_fifo_init(struct fm_fifo *fifo, void *buf, const fm_s8 *name,
- fm_s32 item_size, fm_s32 item_num);
-
-extern struct fm_fifo *fm_fifo_create(const fm_s8 *name, fm_s32 item_size, fm_s32 item_num);
-
-extern fm_s32 fm_fifo_release(struct fm_fifo *fifo);
-
-#define FM_FIFO_INPUT(fifop, item) \
-({ \
- fm_s32 __ret = (fm_s32)0; \
- if (fifop && (fifop)->input) { \
- __ret = (fifop)->input(fifop, item); \
- } \
- __ret; \
-})
-
-#define FM_FIFO_OUTPUT(fifop, item) \
-({ \
- fm_s32 __ret = (fm_s32)0; \
- if (fifop && (fifop)->output) { \
- __ret = (fifop)->output(fifop, item); \
- } \
- __ret; \
-})
-
-#define FM_FIFO_IS_FULL(fifop) \
-({ \
- fm_bool __ret = fm_false; \
- if (fifop && (fifop)->is_full) { \
- __ret = (fifop)->is_full(fifop); \
- } \
- __ret; \
-})
-
-#define FM_FIFO_IS_EMPTY(fifop) \
-({ \
- fm_bool __ret = fm_false; \
- if (fifop && (fifop)->is_empty) { \
- __ret = (fifop)->is_empty(fifop); \
- } \
- __ret; \
-})
-
-#define FM_FIFO_RESET(fifop) \
-({ \
- fm_s32 __ret = (fm_s32)0; \
- if (fifop && (fifop)->reset) { \
- __ret = (fifop)->reset(fifop); \
- } \
- __ret; \
-})
-
-#define FM_FIFO_GET_TOTAL_LEN(fifop) \
-({ \
- fm_s32 __ret = (fm_s32)0; \
- if (fifop && (fifop)->get_total_len) { \
- __ret = (fifop)->get_total_len(fifop); \
- } \
- __ret; \
-})
-
-#define FM_FIFO_GET_VALID_LEN(fifop) \
-({ \
- fm_s32 __ret = (fm_s32)0; \
- if (fifop && (fifop)->get_valid_len) { \
- __ret = (fifop)->get_valid_len(fifop); \
- } \
- __ret; \
-})
-
-
-/*
- * FM asynchronous information mechanism
- */
-struct fm_flag_event {
- fm_s32 ref;
- fm_s8 name[FM_NAME_MAX + 1];
- void *priv;
-
- volatile fm_u32 flag;
-
- /* flag methods */
- fm_u32(*send) (struct fm_flag_event *thiz, fm_u32 mask);
- fm_s32(*wait) (struct fm_flag_event *thiz, fm_u32 mask);
- long (*wait_timeout) (struct fm_flag_event *thiz, fm_u32 mask, long timeout);
- fm_u32(*clr) (struct fm_flag_event *thiz, fm_u32 mask);
- fm_u32(*get) (struct fm_flag_event *thiz);
- fm_u32(*rst) (struct fm_flag_event *thiz);
-};
-
-extern struct fm_flag_event *fm_flag_event_create(const fm_s8 *name);
-
-extern fm_s32 fm_flag_event_get(struct fm_flag_event *thiz);
-
-extern fm_s32 fm_flag_event_put(struct fm_flag_event *thiz);
-
-#define FM_EVENT_SEND(eventp, mask) \
-({ \
- fm_u32 __ret = (fm_u32)0; \
- if (eventp && (eventp)->send) { \
- __ret = (eventp)->send(eventp, mask); \
- } \
- __ret; \
-})
-
-#define FM_EVENT_WAIT(eventp, mask) \
-({ \
- fm_s32 __ret = (fm_s32)0; \
- if (eventp && (eventp)->wait) { \
- __ret = (eventp)->wait(eventp, mask); \
- } \
- __ret; \
-})
-
-#define FM_EVENT_WAIT_TIMEOUT(eventp, mask, timeout) \
-({ \
- long __ret = (long)0; \
- if (eventp && (eventp)->wait_timeout) { \
- __ret = (eventp)->wait_timeout(eventp, mask, timeout); \
- } \
- __ret; \
-})
-
-#define FM_EVENT_GET(eventp) \
-({ \
- fm_u32 __ret = (fm_u32)0; \
- if (eventp && (eventp)->get) { \
- __ret = (eventp)->get(eventp); \
- } \
- __ret; \
-})
-
-#define FM_EVENT_RESET(eventp) \
-({ \
- fm_u32 __ret = (fm_u32)0; \
- if (eventp && (eventp)->rst) { \
- __ret = (eventp)->rst(eventp); \
- } \
- __ret; \
-})
-
-#define FM_EVENT_CLR(eventp, mask) \
-({ \
- fm_u32 __ret = (fm_u32)0; \
- if (eventp && (eventp)->clr) { \
- __ret = (eventp)->clr(eventp, mask); \
- } \
- __ret; \
-})
-
-/*
- * FM lock mechanism
- */
-struct fm_lock {
- fm_s8 name[FM_NAME_MAX + 1];
- fm_s32 ref;
- void *priv;
-
- /* lock methods */
- fm_s32(*lock) (struct fm_lock *thiz);
- fm_s32(*trylock) (struct fm_lock *thiz, fm_s32 retryCnt);
- fm_s32(*unlock) (struct fm_lock *thiz);
-};
-
-extern struct fm_lock *fm_lock_create(const fm_s8 *name);
-
-extern fm_s32 fm_lock_get(struct fm_lock *thiz);
-
-extern fm_s32 fm_lock_put(struct fm_lock *thiz);
-
-extern struct fm_lock *fm_spin_lock_create(const fm_s8 *name);
-
-extern fm_s32 fm_spin_lock_get(struct fm_lock *thiz);
-
-extern fm_s32 fm_spin_lock_put(struct fm_lock *thiz);
-
-#define FM_LOCK(a) \
-({ \
- fm_s32 __ret = (fm_s32)0; \
- if (a && (a)->lock) { \
- __ret = (a)->lock(a); \
- } \
- __ret; \
-})
-
-#define FM_UNLOCK(a) \
-{ \
- if ((a)->unlock) { \
- (a)->unlock(a); \
- } \
-}
-
-
-/*
- * FM timer mechanism
- */
-enum fm_timer_ctrl {
- FM_TIMER_CTRL_GET_TIME = 0,
- FM_TIMER_CTRL_SET_TIME = 1,
- FM_TIMER_CTRL_MAX
-};
-
-#define FM_TIMER_FLAG_ACTIVATED (1<<0)
-
-struct fm_timer {
- fm_s32 ref;
- fm_s8 name[FM_NAME_MAX + 1];
- void *priv; /* platform detail impliment */
-
- fm_s32 flag; /* timer active/inactive */
- void (*timeout_func) (unsigned long data); /* timeout function */
- unsigned long data; /* timeout function's parameter */
- signed long timeout_ms; /* timeout tick */
- /* Tx parameters */
- volatile fm_u32 count;
- volatile fm_u8 tx_pwr_ctrl_en;
- volatile fm_u8 tx_rtc_ctrl_en;
- volatile fm_u8 tx_desense_en;
-
- /* timer methods */
- fm_s32(*init) (struct fm_timer *thiz, void (*timeout) (unsigned long data),
- unsigned long data, signed long time, fm_s32 flag);
- fm_s32(*start) (struct fm_timer *thiz);
- fm_s32(*update) (struct fm_timer *thiz);
- fm_s32(*stop) (struct fm_timer *thiz);
- fm_s32(*control) (struct fm_timer *thiz, enum fm_timer_ctrl cmd, void *arg);
-};
-
-extern struct fm_timer *fm_timer_create(const fm_s8 *name);
-
-extern fm_s32 fm_timer_get(struct fm_timer *thiz);
-
-extern fm_s32 fm_timer_put(struct fm_timer *thiz);
-
-/*
- * FM work thread mechanism
- */
-struct fm_work {
- fm_s32 ref;
- fm_s8 name[FM_NAME_MAX + 1];
- void *priv;
-
- void (*work_func) (unsigned long data);
- unsigned long data;
- /* work methods */
- fm_s32(*init) (struct fm_work *thiz, void (*work_func) (unsigned long data),
- unsigned long data);
-};
-
-extern struct fm_work *fm_work_create(const fm_s8 *name);
-
-extern fm_s32 fm_work_get(struct fm_work *thiz);
-
-extern fm_s32 fm_work_put(struct fm_work *thiz);
-
-
-struct fm_workthread {
- fm_s32 ref;
- fm_s8 name[FM_NAME_MAX + 1];
- void *priv;
-
- /* workthread methods */
- fm_s32(*add_work) (struct fm_workthread *thiz, struct fm_work *work);
-};
-
-extern struct fm_workthread *fm_workthread_create(const fm_s8 *name);
-
-extern fm_s32 fm_workthread_get(struct fm_workthread *thiz);
-
-extern fm_s32 fm_workthread_put(struct fm_workthread *thiz);
-
-#endif /* __FM_UTILS_H__ */
diff --git a/drivers/misc/mediatek/fmradio/mt6616/inc/fm_cust_cfg.h b/drivers/misc/mediatek/fmradio/mt6616/inc/fm_cust_cfg.h
deleted file mode 100644
index fb0cdeb93..000000000
--- a/drivers/misc/mediatek/fmradio/mt6616/inc/fm_cust_cfg.h
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- *
- * (C) Copyright 20011
- * MediaTek <www.MediaTek.com>
- * Hongcheng Xia<Hongcheng.Xia@MediaTek.com>
- *
- * FM Radio Driver
- *
- * 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.
- *
- * 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.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- */
-
-#ifndef __FM_CUST_CFG_H__
-#define __FM_CUST_CFG_H__
-
-/* scan sort algorithm */
-enum {
- FM_SCAN_SORT_NON = 0,
- FM_SCAN_SORT_UP,
- FM_SCAN_SORT_DOWN,
- FM_SCAN_SORT_MAX
-};
-
-/* ***************************************************************************************** */
-/* ***********************************FM config for customer *********************************** */
-/* ***************************************************************************************** */
-/* RX */
-#define FM_RX_RSSI_TH_LONG 0xFF01 /* FM radio long antenna RSSI threshold(11.375dBuV) */
-#define FM_RX_RSSI_TH_SHORT 0xFEE0 /* FM radio short antenna RSSI threshold(-1dBuV) */
-#define FM_RX_CQI_TH 0x00E9 /* FM radio Channel quality indicator threshold(0x0000~0x00FF) */
-#define FM_RX_MR_TH 0x01BD /* FM radio MR threshold */
-#define FM_RX_SEEK_SPACE 1 /* FM radio seek space,1:100KHZ; 2:200KHZ */
-#define FM_RX_SCAN_CH_SIZE 40 /* FM radio scan max channel size */
-#define FM_RX_BAND 1 /* FM radio band, 1:87.5MHz~108.0MHz; 2:76.0MHz~90.0MHz; 3:76.0MHz~108.0MHz; 4:special */
-#define FM_RX_BAND_FREQ_L 875 /* FM radio special band low freq(Default 87.5MHz) */
-#define FM_RX_BAND_FREQ_H 1080 /* FM radio special band high freq(Default 108.0MHz) */
-#define FM_RX_SCAN_SORT_SELECT FM_SCAN_SORT_NON
-#define FM_RX_FAKE_CH_NUM 1
-#define FM_RX_FAKE_CH_RSSI 40
-#define FM_RX_FAKE_CH_1 1075
-#define FM_RX_FAKE_CH_2 0
-#define FM_RX_FAKE_CH_3 0
-#define FM_RX_FAKE_CH_4 0
-#define FM_RX_FAKE_CH_5 0
-
-/* TX */
-#define FM_TX_PWR_LEVEL_MAX 120
-#define FM_TX_SCAN_HOLE_LOW 923 /* 92.3MHz~95.4MHz should not show to user */
-#define FM_TX_SCAN_HOLE_HIGH 954 /* 92.3MHz~95.4MHz should not show to user */
-
-#endif /* __FM_CUST_CFG_H__ */
diff --git a/drivers/misc/mediatek/fmradio/mt6616/inc/mt6616_drv_dsp.h b/drivers/misc/mediatek/fmradio/mt6616/inc/mt6616_drv_dsp.h
deleted file mode 100644
index 749a38a32..000000000
--- a/drivers/misc/mediatek/fmradio/mt6616/inc/mt6616_drv_dsp.h
+++ /dev/null
@@ -1,972 +0,0 @@
-
-const unsigned char channel_parameter[] = {
- 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 5, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0
-};
-
-#if defined(MT6626_FPGA)
-const unsigned short bin_rom[] = {
- 0x0000, 0x1FFF, 0xBC00, 0x0010, 0xBC00, 0x0271, 0x8EC8, 0x8E00, 0x8EC8, 0x8E00, 0x8EC8,
- 0x8E00, 0x8EC8, 0x8E00, 0x8EC8, 0x8E00, 0x8EC8, 0x8E00, 0xBC02, 0x0906, 0xBC20, 0x2019,
- 0x4021, 0xFB11, 0xBC02, 0x0807, 0xBC20, 0x2019, 0x4041, 0xFB11, 0xBC22, 0x0480, 0xBC20,
- 0x0080, 0x4001, 0x8B02, 0xE401, 0xBC21, 0x0367, 0xA301, 0x0080, 0xBC20, 0x201A, 0x41E1,
- 0xFA12, 0xA302, 0x0082, 0x0891, 0x2620, 0x8FF9, 0x3D02, 0xBC21, 0x2018, 0x481E, 0xBC22,
- 0x2019, 0x8C69, 0x40C0, 0xA203, 0x0082, 0x2631, 0x8F4B, 0x2634, 0x8F3E, 0x2632, 0x8F1D,
- 0xB306, 0x0008, 0x8F0A, 0x40E0, 0xFB50, 0xBC02, 0x1E58, 0xBC22, 0x2019, 0xBC21, 0x2018,
- 0x481E, 0x8C53, 0x40C0, 0xFB50, 0xFA33, 0x26B0, 0x8F08, 0xBC02, 0x072A, 0xBC21, 0x2018,
- 0x4020, 0x7207, 0xBB30, 0x40C0, 0xBC22, 0x2019, 0xA31E, 0x0082, 0x8D41, 0x40A0, 0x70E0,
- 0x3B50, 0xBC21, 0x201D, 0xBC22, 0x201B, 0xFA31, 0xFA52, 0x0810, 0xBC3E, 0x00E4, 0xBC3A,
- 0x0692, 0xB400, 0x0002, 0xA31E, 0x0083, 0xA31A, 0x0084, 0x0408, 0xBC02, 0x0131, 0x40C0,
- 0xBC22, 0x2019, 0xBC21, 0x2018, 0x481E, 0x8D23, 0x4080, 0xFB50, 0xBC02, 0x016B, 0x40C0,
- 0xBC22, 0x2019, 0xBC21, 0x2018, 0x481E, 0x8D18, 0x4060, 0xBC21, 0x201F, 0xFB50, 0xFA30,
- 0xBC3E, 0x00C8, 0xBC3A, 0x0652, 0xBC21, 0x03FF, 0xA31E, 0x0083, 0xA31A, 0x0084, 0x0801,
- 0xBC02, 0x0131, 0x40C0, 0xBC22, 0x2019, 0xBC21, 0x2018, 0x481E, 0xA203, 0x0082, 0xB316,
- 0x0040, 0x8F91, 0xBC00, 0x001C, 0x6915, 0xA902, 0x8E00, 0xA30E, 0x0085, 0xDFD5, 0xBC02,
- 0x0607, 0xBC02, 0x077A, 0xBC20, 0x2019, 0x7040, 0x4FD5, 0xBC22, 0x2008, 0xFB11, 0xFA51,
- 0xBC23, 0x4000, 0x0ACB, 0xBC21, 0x2100, 0xFB53, 0xFA32, 0xB314, 0x0020, 0x8FFB, 0x4121,
- 0xE9FE, 0xFB11, 0xBC00, 0x1D52, 0xE902, 0xBC20, 0x2019, 0x7060, 0x5FD5, 0x8C02, 0xFB11,
- 0x8E00, 0xA200, 0x008B, 0x2600, 0x8FFA, 0x3E02, 0xA200, 0x008C, 0x6980, 0x4FD5, 0x8F02,
- 0xA200, 0x0086, 0x2681, 0x8F02, 0x4080, 0xA300, 0x0082, 0x8EC0, 0xE9FE, 0x8E00, 0xE902,
- 0xBC20, 0x2019, 0x7068, 0x5FD5, 0x8C02, 0xFB11, 0x8E00, 0xA200, 0x008B, 0x2600, 0x8FFA,
- 0x3E02, 0xA200, 0x008C, 0xA201, 0x0088, 0x2681, 0x8F06, 0x4020, 0xA202, 0x008A, 0x1401,
- 0x0A10, 0xA300, 0x008A, 0x3409, 0xA300, 0x0088, 0xA201, 0x0086, 0xB300, 0x0010, 0x8F01,
- 0x2691, 0x8F09, 0x401C, 0xBC20, 0x2041, 0xA202, 0x008A, 0xA31C, 0x0088, 0xA31C, 0x008A,
- 0xFB12, 0x2691, 0x8F16, 0xBC20, 0x2019, 0x41C1, 0x7008, 0x7B11, 0xBC22, 0x2018, 0xBC20,
- 0x201A, 0x8C05, 0xFB51, 0x8E00, 0xBC20, 0x201A, 0x8E00, 0xFA10, 0xB310, 0x0008, 0x8FF6,
- 0x7040, 0x0FD5, 0x8C03, 0xA300, 0x0082, 0xCFD5, 0x8E00, 0x8EC0, 0xE9FE, 0x8E00, 0xE902,
- 0x8E00, 0xDFC0, 0xDFF5, 0xBC02, 0x05A2, 0xA200, 0x0087, 0x2680, 0x8F0C, 0xBC20, 0x2040,
- 0x7000, 0x4FC3, 0x700F, 0xBB11, 0x4042, 0xA303, 0x0089, 0xA31E, 0x0087, 0xA301, 0x0086,
- 0xFB12, 0xA200, 0x0084, 0x8EA0, 0xBC20, 0x02C7, 0xA300, 0x009B, 0xBC02, 0x00A7, 0x3E01,
- 0xBC20, 0x2008, 0xBC21, 0x033D, 0xA202, 0x0083, 0xFB11, 0x8EA2, 0xBC20, 0x2008, 0x7000,
- 0x4FF5, 0xBC22, 0x201A, 0x7040, 0x3B11, 0xFA51, 0x2248, 0x8F00, 0xA300, 0x0082, 0x8EC0,
- 0xE9FE, 0x8E00, 0xE902, 0x8E00, 0xDFD5, 0xBC02, 0x0480, 0xBC20, 0x02B3, 0xA300, 0x009B,
- 0xBC02, 0x00A7, 0x3E01, 0xBC20, 0x2008, 0xBC21, 0x03F7, 0xBC22, 0x2018, 0x7008, 0x3B11,
- 0x7050, 0x3B50, 0xBC21, 0x2019, 0x8C2E, 0xFB30, 0xA200, 0x0081, 0x2601, 0x8F04, 0xBC21,
- 0x8000, 0xBC20, 0x2023, 0x8C24, 0xFB11, 0xBC02, 0x01BE, 0xA200, 0x0085, 0x4001, 0xA301,
- 0x0081, 0x2682, 0x8F02, 0x4100, 0xA300, 0x0082, 0xBC02, 0x1E58, 0xBC20, 0x201A, 0x8E00,
- 0xFA10, 0xB310, 0x0008, 0x8F05, 0xBC20, 0x2019, 0x4161, 0x7008, 0x3B11, 0xA300, 0x0085,
- 0xBC02, 0x077A, 0xBC20, 0x2023, 0xBC21, 0x8000, 0xFB11, 0xA200, 0x0082, 0x2604, 0x8FCE,
- 0x3E02, 0x7000, 0x4FD5, 0xBC20, 0x2008, 0x8EC0, 0xE9FE, 0xFB11, 0xE902, 0xA200, 0x0098,
- 0x6CE0, 0x1FD5, 0x8F57, 0xBC02, 0x0918, 0xBC20, 0x01AE, 0xBC02, 0x09F0, 0xA200, 0x02A7,
- 0x2682, 0x8F02, 0xBC20, 0x01AE, 0xBC02, 0x0D50, 0xA200, 0x008E, 0x2606, 0x8F1E, 0x2604,
- 0x8F17, 0x2602, 0x8F0B, 0x2600, 0x8F05, 0xA200, 0x008D, 0x2680, 0x8F20, 0xBC02, 0x0BDE,
- 0x8D1F, 0xBC02, 0x0E6E, 0x8D1C, 0xBC20, 0x2032, 0x4101, 0xFA10, 0x0801, 0xA300, 0x01E3,
- 0xBC02, 0x0A17, 0x8D12, 0xBC02, 0x0AA2, 0xBC02, 0x0CA4, 0x8D0D, 0xA200, 0x0085, 0x2601,
- 0x8F05, 0xA200, 0x02C7, 0x2601, 0x8F01, 0xBC02, 0x0B48, 0x8D02, 0xBC02, 0x0B2B, 0xA201,
- 0x01BE, 0xBC20, 0x01AE, 0xBC02, 0x0A72, 0xBC20, 0x01E7, 0xBC02, 0x0B04, 0xA200, 0x0266,
- 0x2680, 0xBC20, 0x01E7, 0x8F03, 0xBC21, 0x7FFF, 0xBC02, 0x0B8C, 0x8D04, 0xA201, 0x01FF,
- 0xBC02, 0x0B8C, 0xBC02, 0x0C54, 0xA200, 0x0099, 0x2600, 0x8F02, 0xBC02, 0x195E, 0xBC02,
- 0x1926, 0xA200, 0x009A, 0x2600, 0x8F02, 0xB000, 0xFFFF, 0xA300, 0x009A, 0xBC20, 0x2040,
- 0x4021, 0xFA10, 0x0801, 0x2600, 0x8F0A, 0xBC20, 0x2023, 0xBC21, 0x4000, 0xFA10, 0x0801,
- 0x2680, 0x8F02, 0xA200, 0x009A, 0x2600, 0x8F15, 0x3E02, 0x4000, 0xA300, 0x0099, 0x3E01,
- 0xBC20, 0x2008, 0xBC21, 0x0080, 0xFA12, 0x0851, 0x2610, 0x8F0B, 0xFA11, 0xBC22, 0xFF7F,
- 0x084A, 0x7000, 0x3B11, 0xBC02, 0x05B3, 0x8D03, 0x4020, 0xA300, 0x0099, 0x7038, 0x4FD5,
- 0xA200, 0x008E, 0xE9FE, 0x3401, 0x8EC0, 0x0801, 0xA300, 0x008E, 0x4020, 0xBC21, 0x00C0,
- 0xA300, 0x0091, 0xA300, 0x0092, 0xA301, 0x0098, 0x8EC0, 0xA300, 0x0090, 0xA300, 0x008F,
- 0xE918, 0x8E00, 0xDD05, 0xBC25, 0x2096, 0xDD5B, 0xFAB5, 0xA205, 0x009B, 0xDD7A, 0xDD9F,
- 0xDDBE, 0xDDDD, 0xDDFC, 0xDE0B, 0xDE2C, 0xDE49, 0xDE68, 0xDE8F, 0xDEAE, 0xDED5, 0xDEE6,
- 0xDF04, 0xDF23, 0xDF42, 0xDF61, 0xDF80, 0xDD27, 0xF9FC, 0x8EA5, 0xBC20, 0x2096, 0xBC21,
- 0x00FF, 0xFA10, 0x6220, 0x4D05, 0xA203, 0x0096, 0x6854, 0xCD27, 0x6624, 0xCF80, 0xA302,
- 0x0096, 0xCF61, 0xCF42, 0xCF23, 0xCF04, 0xCEE6, 0xCDFC, 0xCDDD, 0xCDBE, 0xCD9F, 0xCD7A,
- 0xCD5B, 0xF8FC, 0xCED5, 0xCEAE, 0xCE8F, 0xCE68, 0xCE49, 0xCE2C, 0xCE0B, 0xE9E8, 0x8EC8,
- 0xBC20, 0x2102, 0xBC21, 0x8000, 0xFA10, 0x0801, 0x6980, 0x2902, 0x8F07, 0xDFD5, 0xBC02,
- 0x02DB, 0xBC20, 0x02DB, 0xCFD5, 0xA300, 0x009B, 0x8EC0, 0xE9FE, 0x8E00, 0xBC20, 0x2104,
- 0xBC21, 0x8000, 0xFA10, 0x0801, 0x6980, 0x2902, 0x8F07, 0xDFD5, 0xBC02, 0x0423, 0xBC20,
- 0x0423, 0xCFD5, 0xA300, 0x009B, 0x8EC0, 0xE9FE, 0x8E00, 0xE906, 0xA202, 0x0090, 0x69A8,
- 0x1F95, 0x8F19, 0xBC24, 0x2081, 0xBC23, 0x2082, 0xFA95, 0xBC24, 0x2015, 0xFA73, 0xA21A,
- 0x0461, 0xA21E, 0x046B, 0xA210, 0x0361, 0xFA94, 0xA305, 0x02CA, 0xA303, 0x02CB, 0xA310,
- 0x02C8, 0xA31A, 0x02C9, 0xA304, 0x02CC, 0xA31E, 0x02CD, 0x26A6, 0x8F32, 0xBC23, 0x027F,
- 0xBC24, 0x026F, 0x4022, 0xBD10, 0x0306, 0xE205, 0xE585, 0xA21C, 0x02C8, 0xA21A, 0x02CA,
- 0xA21E, 0x02CB, 0xA210, 0x02C9, 0xA205, 0x02CC, 0xA203, 0x02CD, 0xA204, 0x0081, 0xA31C,
- 0x02C2, 0xA310, 0x02C3, 0xA31A, 0x02C4, 0xA31E, 0x02C5, 0xA305, 0x02C6, 0xA303, 0x02C7,
- 0x2640, 0x8F03, 0xA203, 0x0095, 0x34D9, 0xA303, 0x0095, 0xA203, 0x0098, 0xA302, 0x0081,
- 0x3230, 0x8F02, 0xB026, 0xFFFF, 0xA302, 0x0098, 0xA200, 0x028F, 0x421E, 0x403A, 0xBC3C,
- 0x027F, 0xBC22, 0x2033, 0xE064, 0xBC23, 0x2034, 0xE065, 0xFB54, 0xFB75, 0xA300, 0x028F,
- 0xBC02, 0x1BC3, 0xBC22, 0x3105, 0xA200, 0x0313, 0x700E, 0xBA52, 0x3BC2, 0xBC22, 0x2139,
- 0xBC3C, 0x02E0, 0xBD05, 0x0352, 0xFA53, 0xE463, 0xA202, 0x0099, 0x2620, 0xA300, 0x0313,
- 0x385A, 0x8F10, 0xBC23, 0x2008, 0xBC24, 0x0080, 0xFA75, 0x0B2C, 0xBC25, 0x2103, 0xFB74,
- 0xFAB3, 0xBC24, 0x4000, 0x08DC, 0x2630, 0x8F01, 0xBC02, 0x15BE, 0x4022, 0xA203, 0x0091,
- 0x26B0, 0x8F05, 0xBC20, 0x2012, 0xBC21, 0x2014, 0xBC02, 0x106C, 0x4022, 0xA203, 0x0093,
- 0xB306, 0x0011, 0x4003, 0x1893, 0xA204, 0x0091, 0x6D28, 0x5FA2, 0x4244, 0x2214, 0x18DA,
- 0xA202, 0x008F, 0x2620, 0xA303, 0x0091, 0x8F67, 0x2621, 0x8F53, 0x2622, 0x8F2B, 0x26A3,
- 0x8F26, 0xBC02, 0x118C, 0xCFA2, 0x2620, 0xBC20, 0x2015, 0x8F0E, 0xA201, 0x0097, 0xBC02,
- 0x101D, 0xBC02, 0x1391, 0xBC02, 0x1DAA, 0xA202, 0x0097, 0x2622, 0x4043, 0x8F00, 0x34D1,
- 0xA303, 0x0097, 0xA202, 0x0093, 0x3511, 0x4242, 0x21E2, 0xA203, 0x0094, 0x4005, 0x34D9,
- 0x192C, 0x4062, 0x08DA, 0xA304, 0x0093, 0x8C51, 0xA303, 0x0094, 0x8C4E, 0x4062, 0x3854,
- 0xB004, 0xFFFB, 0xDFC0, 0xBC02, 0x121B, 0x6E15, 0x0FC0, 0xB014, 0xFFFA, 0xDFC1, 0xBC02,
- 0x1277, 0xBC02, 0x12BC, 0xCFC0, 0xBC21, 0x0464, 0xBC02, 0x1326, 0x7018, 0x8FA3, 0x2630,
- 0x8F33, 0xA201, 0x0097, 0xBC20, 0x2013, 0xBC02, 0x1037, 0xA201, 0x0097, 0xBC20, 0x200B,
- 0xBC02, 0x1092, 0x4062, 0x8D27, 0xBC02, 0x118C, 0xBC02, 0x11E4, 0xBC02, 0x1B03, 0x7018,
- 0x8FA3, 0x2630, 0x8F1B, 0xA201, 0x0097, 0xBC20, 0x2011, 0xBC02, 0x10B6, 0x4062, 0x8D15,
- 0xBC02, 0x12BC, 0xCFA2, 0x2620, 0x8F00, 0xBC02, 0x1E00, 0xBC02, 0x10FF, 0xA202, 0x0094,
- 0x26A0, 0x4062, 0x8F05, 0xA203, 0x047B, 0x2630, 0x8F01, 0xBC02, 0x115E, 0x4062, 0xA204,
- 0x008F, 0xA203, 0x0090, 0x6D48, 0x4F95, 0x34D9, 0x40E6, 0xA205, 0x008D, 0x08DE, 0x08A2,
- 0x26D0, 0xA303, 0x0090, 0xA302, 0x008F, 0x8F04, 0xBC22, 0x31F8, 0xDF95, 0xFA52, 0x8EA2,
- 0xCF95, 0x8E00, 0x8EC0, 0xE9FA, 0x8E00, 0xE902, 0xA200, 0x0092, 0xDFC0, 0xDFF5, 0xBC02,
- 0x10DC, 0xCFC0, 0xB300, 0x0044, 0x8F2B, 0xA201, 0x0097, 0xB300, 0x0045, 0x8F21, 0xB300,
- 0x0046, 0x8F14, 0xCFC0, 0xB310, 0x0047, 0x8F21, 0xA200, 0x0470, 0x2680, 0x8F00, 0xBC02,
- 0x0F91, 0xBC02, 0x1DAA, 0xA200, 0x0097, 0x2602, 0x4041, 0x8F00, 0x3441, 0xA301, 0x0097,
- 0x8D12, 0xBC20, 0x2013, 0xBC02, 0x1037, 0xA201, 0x0097, 0xBC20, 0x200B, 0xBC02, 0x1092,
- 0x8D07, 0xBC20, 0x2011, 0xBC02, 0x10B6, 0x8D02, 0xBC02, 0x1E00, 0x7240, 0x4FC0, 0x6D00,
- 0x4FF5, 0x21C1, 0x4001, 0x1808, 0xA201, 0x008D, 0x2690, 0xA300, 0x0092, 0x8F04, 0xBC20,
- 0x31F8, 0xDFD5, 0xFA10, 0x8EA0, 0xCFD5, 0x8E00, 0x8EC0, 0xE9FE, 0x8E00, 0xBC20, 0x009C,
- 0xBC21, 0x047C, 0x0448, 0x3489, 0x32A0, 0x4001, 0x8F01, 0x8B02, 0xE401, 0x8EB8, 0xE902,
- 0x8E00, 0xDFD5, 0xBC02, 0x0474, 0xBC20, 0x3173, 0xBC21, 0x3010, 0xBC24, 0x02A8, 0xBC22,
- 0x2032, 0x7014, 0x3A10, 0x4085, 0x700F, 0x3A31, 0xA300, 0x01E5, 0xFA53, 0xBC40, 0x1605,
- 0xA301, 0x0467, 0x4100, 0xBC40, 0x1E10, 0xBC40, 0x2610, 0x6206, 0x2610, 0xFA51, 0x6213,
- 0x6650, 0xBC3A, 0x0184, 0xBC3E, 0x01C0, 0x4503, 0x4444, 0xBC2E, 0x0160, 0xBC2F, 0x0170,
- 0xB048, 0x009C, 0xB056, 0x009C, 0xA300, 0x01E3, 0xA301, 0x01F7, 0xA31C, 0x0468, 0xA31C,
- 0x0461, 0xA31C, 0x045C, 0xA30E, 0x016E, 0xA30F, 0x017E, 0xA31A, 0x01AC, 0xA31A, 0x01AD,
- 0xA31E, 0x01E0, 0xA31E, 0x01E1, 0xA304, 0x015E, 0xA305, 0x015F, 0xBC20, 0x3136, 0xBC21,
- 0x3163, 0xBD04, 0x04D2, 0xFA04, 0xFB24, 0xFA0C, 0xFB24, 0xBD04, 0x04D8, 0xFA0C, 0xFB24,
- 0xBC20, 0x31B2, 0x7717, 0xBA51, 0x7006, 0xBA14, 0x38BC, 0x084D, 0xB048, 0x319C, 0xA301,
- 0x0266, 0xBC20, 0x0200, 0xFA91, 0xB040, 0x0050, 0xB060, 0x0010, 0xA304, 0x0261, 0xA300,
- 0x0260, 0xA306, 0x0262, 0xFA52, 0x4044, 0x1609, 0x41E6, 0x0894, 0x1406, 0xB4F2, 0x0001,
- 0x0B07, 0xBC20, 0x01F9, 0xA302, 0x02A7, 0xBC40, 0x1C01, 0xBC40, 0x3401, 0x144E, 0x24A1,
- 0xBC24, 0x029A, 0xBC40, 0x140C, 0xBC21, 0x0267, 0xBC22, 0x0294, 0xBC3C, 0x4000, 0x6D79,
- 0x640E, 0xBC3F, 0x0285, 0xBC3B, 0x0290, 0xBC30, 0x2000, 0x7000, 0x244F, 0xBC40, 0x6607,
- 0xA31F, 0x028F, 0xA31B, 0x0293, 0xBC40, 0x0C9C, 0xBC40, 0x149C, 0xBC40, 0x151E, 0xBC40,
- 0x2C80, 0xBC40, 0x3490, 0xBC40, 0x3C9A, 0xBC40, 0x2D10, 0xBC40, 0x1D03, 0x40A7, 0xBC02,
- 0x05B3, 0xB04A, 0x0318, 0xBC23, 0x30FD, 0xBC22, 0x30FF, 0xA304, 0x0325, 0xFA74, 0xFA52,
- 0x04F2, 0xBC21, 0x02E0, 0x3589, 0xB00E, 0x0318, 0xA306, 0x0312, 0xA300, 0x0326, 0xBC26,
- 0x30FC, 0xBC20, 0x3102, 0xFAD6, 0xFA10, 0xA306, 0x0360, 0x14AA, 0x1428, 0x14EB, 0xA304,
- 0x035F, 0xBC26, 0x2021, 0x35CD, 0xBC25, 0x0327, 0xBC24, 0x07C0, 0xBC3E, 0x7FFF, 0xBC3A,
- 0x0320, 0xB012, 0x0019, 0xB024, 0xFFFF, 0xB000, 0xFFFF, 0x6D4B, 0x3BD4, 0xA305, 0x0354,
- 0xA31E, 0x047A, 0xA31A, 0x02DC, 0xA301, 0x0314, 0xA307, 0x0313, 0xA304, 0x0353, 0xA302,
- 0x0363, 0xA303, 0x0364, 0xA300, 0x0365, 0xBC02, 0x0263, 0xBC02, 0x07A4, 0xBC20, 0x2023,
- 0xBC21, 0x4000, 0x700F, 0xBA10, 0x0801, 0x2680, 0x8F09, 0xBC20, 0x2040, 0x7008, 0x4FD5,
- 0xFA10, 0x0801, 0x2600, 0x8F10, 0xA301, 0x0099, 0x8D0F, 0xBC20, 0x2008, 0xBC21, 0xFF7F,
- 0x7007, 0x3A12, 0x6214, 0x4FD5, 0xA31C, 0x0099, 0xA31C, 0x02A7, 0xA31E, 0x008D, 0xFB11,
- 0x8EC0, 0xE9FE, 0x8E00, 0xE902, 0x8E00, 0xDFD5, 0xBC02, 0x0474, 0x6914, 0x4FD5, 0x4020,
- 0xE9FE, 0xA309, 0x008B, 0xA309, 0x008C, 0xA300, 0x00A0, 0xBC00, 0x0263, 0xBC22, 0x036A,
- 0xBC21, 0x044C, 0x044A, 0x3509, 0x32C0, 0x4001, 0x4023, 0x8F01, 0x8B04, 0xE501, 0x2680,
- 0x8F02, 0xBC22, 0x2040, 0x8E00, 0xFB51, 0xBC22, 0x305A, 0x40BC, 0x703F, 0xBA52, 0xBC3A,
- 0x0376, 0xBC2E, 0x0399, 0x4FEF, 0xBC28, 0x03A8, 0x2680, 0x149A, 0x4270, 0xA31E, 0x0372,
- 0xA31A, 0x0375, 0xA310, 0x0395, 0xA31C, 0x0396, 0xA31C, 0x0397, 0xA30E, 0x0398, 0xA30F,
- 0x03B8, 0xA308, 0x03A6, 0xA302, 0x03A5, 0xBC20, 0x2040, 0x8F01, 0x4042, 0xFB12, 0xBC20,
- 0x3079, 0xBC3E, 0x03DC, 0xBC3A, 0x041A, 0xBC24, 0x2044, 0xFA03, 0xBC30, 0x03F1, 0xA31E,
- 0x03DB, 0xA31A, 0x0442, 0xA310, 0x03F0, 0xFB91, 0xA301, 0x03E2, 0xA303, 0x03E0, 0xBC22,
- 0x2043, 0x8EC0, 0xA300, 0x03E1, 0xFB51, 0xE902, 0xA200, 0x008C, 0xA201, 0x0082, 0x6980,
- 0x5FD5, 0x8F16, 0x2611, 0x8F14, 0x2612, 0x8F11, 0xBC20, 0x201A, 0x4201, 0xFA10, 0x0801,
- 0x2680, 0x8F00, 0xBC02, 0x06A8, 0xBC20, 0x201F, 0xBC21, 0x03FF, 0xFA10, 0x0801, 0xBC22,
- 0x2002, 0x8C06, 0xFB50, 0xBC20, 0x2002, 0xA201, 0x0089, 0xFB11, 0xBC20, 0x2000, 0x4021,
- 0xFB11, 0xFA11, 0x2693, 0x8FFC, 0x8E00, 0xBC20, 0x2000, 0x4001, 0xBC22, 0x2020, 0x7010,
- 0x3B11, 0xFA51, 0x0808, 0x2600, 0x4021, 0x8F0C, 0xBC20, 0x2001, 0x8E00, 0xFB11, 0xFA11,
- 0x2693, 0x8FFC, 0x8E00, 0x7000, 0x4FD5, 0xBC20, 0x2001, 0x8C02, 0xFB11, 0xCFD5, 0x8E00,
- 0x8EC0, 0xE9FE, 0x8E00, 0xBC20, 0x201B, 0x4022, 0xFA10, 0x4381, 0x0902, 0x0841, 0x4043,
- 0x2640, 0x0803, 0x124B, 0xA204, 0x0089, 0xBC23, 0x201D, 0x8F10, 0x0461, 0xFA73, 0xA301,
- 0x0089, 0x218B, 0x8F1A, 0x2600, 0xBC20, 0x201C, 0x8F03, 0xFA10, 0x8C15, 0xA300, 0x0089,
- 0xA302, 0x0086, 0x8D10, 0xBC25, 0x201C, 0x0061, 0xFAB4, 0xA301, 0x0089, 0x208C, 0x8F07,
- 0x2600, 0x8F03, 0xFA70, 0x8C04, 0xA300, 0x0089, 0xA302, 0x0086, 0xBC20, 0x201F, 0xBC21,
- 0x03FF, 0xFA10, 0xA203, 0x0089, 0x0801, 0x2258, 0x8F03, 0x8EC0, 0xA302, 0x0086, 0x8E00,
- 0x8EB8, 0xBC20, 0x201B, 0x4381, 0xFA10, 0x0801, 0xA201, 0x0089, 0xB480, 0x0002, 0xBC22,
- 0x201C, 0x0008, 0xFA51, 0x2001, 0xA300, 0x0089, 0x8F03, 0x8EC0, 0x4020, 0xA300, 0x0086,
- 0x8EB8, 0xE902, 0xBC22, 0x2000, 0xDFD5, 0x41A3, 0xBC02, 0x0723, 0x4344, 0xBC25, 0x0400,
- 0x2620, 0x8F05, 0xBC02, 0x07F0, 0x5404, 0x4025, 0xBC02, 0x07F0, 0x8D06, 0xBC02, 0x07FB,
- 0x5404, 0x4025, 0xBC02, 0x07FB, 0xBC02, 0x072A, 0x4E20, 0xBC02, 0x07B8, 0xBC20, 0x0001,
- 0x0848, 0xB412, 0x0000, 0xBC22, 0x1000, 0x4183, 0xBC02, 0x0723, 0x220A, 0x8F3F, 0xDFE2,
- 0xBC21, 0x2098, 0x41C2, 0xFA33, 0x0ADA, 0xFB33, 0x4060, 0x4841, 0xBC02, 0x07D8, 0xBC21,
- 0x2098, 0x4202, 0xBC20, 0xFFFE, 0x0ADA, 0xFB33, 0x08D8, 0xFB33, 0x4E20, 0xBC02, 0x07B8,
- 0xBC22, 0xFFFE, 0x084A, 0xCFE2, 0x0A4A, 0xBC02, 0x07CA, 0x4224, 0xBC25, 0x4000, 0xBC02,
- 0x07FB, 0x4044, 0x4045, 0xBC02, 0x07FB, 0x4284, 0x4105, 0xBC02, 0x07FB, 0x4284, 0x4105,
- 0xBC02, 0x07F0, 0xCFE0, 0xBC02, 0x0733, 0x4E24, 0x4045, 0xBC02, 0x07FB, 0x4E24, 0x4045,
- 0xBC02, 0x07F0, 0xBC20, 0x2098, 0x43E1, 0xFB11, 0x4021, 0xFB11, 0xBC22, 0x4000, 0x41C3,
- 0xBC02, 0x0723, 0x38A2, 0x4E20, 0xBC02, 0x07B8, 0xB55A, 0x0002, 0x0A4D, 0xBC02, 0x07CA,
- 0xCFD5, 0xE9FE, 0x8EB8, 0xBC20, 0x201F, 0x8E00, 0xFA10, 0x0890, 0x1093, 0x8EB8, 0xE902,
- 0x4E24, 0xDFD5, 0x4085, 0xBC02, 0x07FB, 0xCFD5, 0xE9FE, 0x8EB8, 0xE902, 0xBC21, 0x202D,
- 0xDFD5, 0xDFE0, 0x4280, 0xBC02, 0x07CA, 0xBC22, 0x8018, 0xBC23, 0x8098, 0xCFE0, 0x2600,
- 0x1853, 0x42C0, 0xBC02, 0x07CA, 0x4240, 0xBC21, 0xE419, 0xBC02, 0x07CA, 0x4260, 0xBC21,
- 0x9010, 0xBC02, 0x07CA, 0x4040, 0xBC21, 0x0FFB, 0xBC02, 0x07CA, 0x4220, 0xBC21, 0x2020,
- 0xBC02, 0x07CA, 0xBC20, 0x0005, 0x4461, 0xBC02, 0x07D8, 0x4220, 0xBC21, 0x1020, 0xBC02,
- 0x07CA, 0xBC20, 0x0005, 0x4461, 0xBC02, 0x07D8, 0x4220, 0xBC21, 0x4020, 0xBC02, 0x07CA,
- 0xBC20, 0x0064, 0x4461, 0xBC02, 0x07D8, 0x4520, 0xBC21, 0x8001, 0xBC02, 0x07CA, 0xCFD5,
- 0xE9FE, 0x8EB8, 0xE902, 0xBC20, 0x2023, 0xDFD5, 0xFA16, 0xBC20, 0x2000, 0x09B0, 0xDFE6,
- 0x4060, 0xBC02, 0x07B8, 0xBC22, 0x39AE, 0xBC23, 0x19AE, 0xCFE6, 0x2660, 0x195A, 0x220D,
- 0x8F02, 0x3825, 0xBC02, 0x07CA, 0x4480, 0xBC02, 0x07B8, 0xBC22, 0x0000, 0xBC23, 0x0001,
- 0xCFE6, 0x2660, 0x195A, 0x220D, 0x8F02, 0x3825, 0xBC02, 0x07CA, 0xCFD5, 0xE9FE, 0x8EB8,
- 0xE902, 0x4E04, 0x4805, 0xDFD5, 0xBC20, 0x2023, 0xBC21, 0x4000, 0xFA10, 0x0801, 0x2600,
- 0x8F01, 0xBC02, 0x07FB, 0x8D02, 0xBC02, 0x07F0, 0xCFD5, 0xE9FE, 0x8EB8, 0xBC22, 0x209A,
- 0xBC23, 0x0100, 0x0AD8, 0xBC21, 0x209D, 0xFB53, 0x4043, 0xFA32, 0x0893, 0x26A0, 0x8FFA,
- 0xBC22, 0x209C, 0x8E00, 0xFA51, 0x8EB8, 0xBC22, 0x209A, 0xBC23, 0x209B, 0xFB50, 0xBC22,
- 0x209D, 0xFB71, 0x4023, 0xFA51, 0x084B, 0x2690, 0x8FFB, 0x8EB8, 0xBC08, 0x07E6, 0x8E00,
- 0xBDC8, 0x07E5, 0x8E00, 0xBC09, 0x07E4, 0x8E00, 0x8E00, 0x8E00, 0x8E00, 0x8E00, 0x8E00,
- 0x8E00, 0x8EB8, 0xBC08, 0x07EE, 0x8E00, 0xBC09, 0x07ED, 0x8E00, 0x8E00, 0x8EB8, 0xE902,
- 0x3804, 0xDFD5, 0xBC02, 0x07B8, 0x0A4D, 0xBC02, 0x07CA, 0xCFD5, 0xE9FE, 0x8EB8, 0xE902,
- 0x1745, 0xDFD5, 0x3804, 0xBC02, 0x07B8, 0x084D, 0xBC02, 0x07CA, 0xCFD5, 0xE9FE, 0x8EB8,
- 0xBC20, 0x201A, 0x4201, 0xFA10, 0x0801, 0x2600, 0x8F00, 0x8EB8, 0xE902, 0x4020, 0xDFD5,
- 0xBC21, 0x1F2A, 0xBC02, 0x07CA, 0xBC20, 0x01F4, 0x4461, 0xBC02, 0x07E8, 0x4000, 0xBC21,
- 0x402D, 0xBC02, 0x07CA, 0x4280, 0x4461, 0xBC02, 0x07E8, 0x4000, 0xBC21, 0x5FED, 0xBC02,
- 0x07CA, 0x4020, 0xBC21, 0x1F6A, 0xBC02, 0x07CA, 0x4280, 0x4461, 0xBC02, 0x07E8, 0x4000,
- 0xBC21, 0x7FED, 0xBC02, 0x07CA, 0x4500, 0x4461, 0xBC02, 0x07E8, 0xBC20, 0x2023, 0xBC22,
- 0x39AE, 0xBC23, 0x19AE, 0xFA10, 0xBC21, 0x2000, 0x0841, 0x38C1, 0x2610, 0x185A, 0x4060,
- 0xBC02, 0x07CA, 0x4040, 0xBC21, 0x0FF9, 0xBC02, 0x07CA, 0xBC20, 0x000A, 0x4461, 0xBC02,
- 0x07E8, 0x4022, 0x4003, 0x2660, 0x1853, 0x4480, 0xBC02, 0x07CA, 0x4540, 0xBC02, 0x07B8,
- 0xDFE1, 0x40C0, 0x4202, 0x41E3, 0x4104, 0xBC25, 0x31EC, 0x41E6, 0xBC02, 0x08EC, 0x41C0,
- 0xBC24, 0x87FF, 0x4166, 0xBC02, 0x08F9, 0xCFE1, 0x4000, 0x4402, 0x43E3, 0x4164, 0xBC25,
- 0x31ED, 0x43E6, 0xBC02, 0x08EC, 0xDFE5, 0x4180, 0xBC24, 0xFF07, 0x4066, 0xBC02, 0x08F9,
- 0xCFE5, 0x40E0, 0xBC24, 0xFFE0, 0x4006, 0xBC02, 0x08F9, 0x4000, 0xBC02, 0x0733, 0xBC20,
- 0x2098, 0x43E1, 0xFB11, 0x4021, 0xFB11, 0x4500, 0x4401, 0xBC02, 0x07CA, 0x4140, 0xBC21,
- 0x0841, 0xBC02, 0x07CA, 0xBC20, 0x01F4, 0x4841, 0xBC02, 0x07E8, 0x4140, 0xBC21, 0x0840,
- 0xBC02, 0x07CA, 0x4500, 0x4001, 0xBC02, 0x07CA, 0xBC21, 0x2023, 0xBC22, 0x0400, 0xFA31,
- 0x084A, 0x2610, 0x8F0A, 0x5364, 0x4065, 0xBC02, 0x07F0, 0x4AC0, 0x4021, 0xBC02, 0x07CA,
- 0xBC21, 0x1FFA, 0x8D02, 0xBC21, 0x1FFB, 0x4040, 0xBC02, 0x07CA, 0x4C80, 0x4841, 0xBC02,
- 0x07E8, 0x41E0, 0xBC21, 0x4042, 0xBC02, 0x07CA, 0xBC02, 0x07A4, 0x4E80, 0x4021, 0xBC02,
- 0x07CA, 0x4E60, 0xBC21, 0x0480, 0xBC02, 0x07CA, 0x5380, 0xBC21, 0xAB40, 0xBC02, 0x07CA,
- 0x4102, 0x4503, 0xBC24, 0x2023, 0xBC25, 0x0400, 0xFA94, 0x0925, 0x2640, 0x1853, 0x53C0,
- 0xBC02, 0x07CA, 0x4E04, 0x4025, 0xBC02, 0x07FB, 0xCFD5, 0xE9FE, 0x8EB8, 0x1048, 0x0891,
- 0x08D9, 0x2620, 0x1863, 0xFAB2, 0x004A, 0x4002, 0x3210, 0x1851, 0x210E, 0x1971, 0x8EB8,
- 0xE901, 0x8E00, 0xDFF5, 0xBC02, 0x07B8, 0x0861, 0x316E, 0x0A4D, 0xBC02, 0x07CA, 0xCFF5,
- 0xE9FF, 0x8EB8, 0xBC20, 0x209F, 0xBC21, 0x31DB, 0xA300, 0x047E, 0xA301, 0x047D, 0xBD11,
- 0x0911, 0xFA22, 0xFB02, 0x8EC0, 0xA300, 0x047E, 0xA301, 0x047D, 0x0000, 0x6915, 0xA908,
- 0xA21B, 0x0180, 0xA21E, 0x017E, 0xA21D, 0x016E, 0xBC3C, 0x3116, 0xBC30, 0x311D, 0x7016,
- 0xDF1B, 0xA204, 0x017F, 0xA202, 0x0181, 0xA203, 0x0182, 0xA201, 0x01AD, 0x6915, 0x1F3D,
- 0x77F6, 0x9F5E, 0xBC26, 0x3106, 0xDF70, 0xDF9C, 0xBD08, 0x09DB, 0xA200, 0x015E, 0xBC3C,
- 0x009C, 0xBC3E, 0x00C2, 0xA304, 0x017F, 0x6E7B, 0x9FA1, 0x6E43, 0xBAC5, 0x6E4B, 0xBE18,
- 0x396C, 0x8A0E, 0xBF95, 0x8A18, 0x77E6, 0x9FC6, 0x6A91, 0x7AD5, 0x7077, 0xFE18, 0x6A91,
- 0x4F86, 0x88D0, 0x6E62, 0xFAC7, 0x6E7A, 0x5FE0, 0x39C8, 0x8890, 0xBC3D, 0x0170, 0x6FCA,
- 0x4F41, 0x6910, 0xBAC5, 0x6910, 0xFF38, 0x7016, 0xBE38, 0x2A47, 0x6A91, 0xFE38, 0xBF95,
- 0x8A38, 0x6A91, 0x7AC7, 0xBF95, 0x8A38, 0xBF9D, 0x8E38, 0xBF95, 0xAA38, 0x2A47, 0x6A91,
- 0xFE38, 0x2A45, 0x88D0, 0x398B, 0x39E9, 0x39C8, 0x88F0, 0xB06C, 0xFFFA, 0x613E, 0xDF86,
- 0xBC26, 0x7ADD, 0xBCB7, 0x8000, 0x04AA, 0xBC26, 0x7ADD, 0xBCA5, 0x8000, 0xA300, 0x015E,
- 0x6025, 0x0F00, 0x6FCB, 0xCFC4, 0x6036, 0x0FE0, 0xB048, 0xFFF1, 0x6910, 0xBF38, 0x6910,
- 0xDF41, 0xFA86, 0x6960, 0x3E18, 0x8A0E, 0xBF99, 0x0C18, 0x7076, 0x9F07, 0x6A91, 0xBA96,
- 0x7016, 0xBE18, 0x2A46, 0x88E0, 0x398B, 0x39E9, 0x39C8, 0x88F0, 0xA300, 0x015E, 0x7077,
- 0x8F20, 0xBC3C, 0x0160, 0x6FCD, 0xCF66, 0x6910, 0xBF18, 0x6910, 0xFAC7, 0x7147, 0xFE18,
- 0x2A47, 0xBF9D, 0x8E18, 0xBF9D, 0x8E18, 0x2A47, 0xBF9D, 0x8E18, 0xBF9D, 0x8E18, 0xBF9D,
- 0x8E18, 0x2A47, 0xBF9D, 0xAE18, 0x2A47, 0x88F0, 0xB06C, 0xFFFA, 0x6E62, 0xDF66, 0x39E9,
- 0x39C8, 0x88E0, 0x0E7A, 0x3F3E, 0x63EC, 0xFF18, 0x6FC3, 0x8FA1, 0xBC3D, 0x0184, 0xB068,
- 0xFFF1, 0x6915, 0xBF38, 0x6915, 0x1F20, 0x5FDA, 0x3885, 0xCF1E, 0xCF50, 0xA310, 0x017E,
- 0xA301, 0x01AD, 0xA304, 0x017F, 0xA302, 0x0181, 0xA31E, 0x0180, 0xA303, 0x0182, 0xCF3B,
- 0x8EC0, 0xE9F8, 0xA31B, 0x016E, 0x0000, 0x2451, 0xA201, 0x01AC, 0x3909, 0xBC22, 0x3124,
- 0x2453, 0xBC3D, 0x0184, 0x451F, 0xBD08, 0x0A11, 0x77F6, 0xFA43, 0x2442, 0x6960, 0x3E38,
- 0x8A0C, 0xBF8C, 0x8638, 0x2A43, 0x88B0, 0x398B, 0x39E9, 0x39C8, 0x88C0, 0x439B, 0x6E18,
- 0x2403, 0xB024, 0xFFF3, 0x6D06, 0xA444, 0x6910, 0xEA38, 0x8EC0, 0xA301, 0x01AC, 0x8E00,
- 0xBC20, 0x3131, 0xA201, 0x02C2, 0xFA10, 0x2600, 0x8F3E, 0xA200, 0x01E2, 0x2680, 0x8F39,
- 0x2610, 0xA200, 0x01BE, 0xB010, 0xFFFF, 0x8F2C, 0xA202, 0x01E3, 0x26A0, 0x8F28, 0xBC22,
- 0x02A8, 0xBC23, 0x3133, 0xBC24, 0x3132, 0xBC40, 0x3906, 0xFA73, 0xBC25, 0x3134, 0xBC27,
- 0x3135, 0xBC40, 0x3102, 0xFA94, 0x04F3, 0xFAB5, 0xFAF6, 0x04A2, 0x1095, 0x10DE, 0x1D1A,
- 0x4003, 0x3240, 0x3843, 0x8F02, 0xB228, 0x0040, 0x4803, 0x18DC, 0x2103, 0x8F05, 0x2183,
- 0x8F18, 0x3401, 0xA300, 0x01BE, 0x8D15, 0x8C14, 0xA301, 0x01BE, 0x3280, 0x4002, 0x8F0D,
- 0xA301, 0x01BE, 0x8D0C, 0x8C0B, 0x4002, 0x2690, 0x4800, 0x4002, 0x8F03, 0x8E00, 0x8C04,
- 0xA302, 0x01BE, 0xA300, 0x01BE, 0xA200, 0x01BE, 0x2600, 0xBC21, 0x2035, 0x4020, 0x8EC0,
- 0x1810, 0xFB30, 0x0000, 0x38E0, 0xA200, 0x01E1, 0xB202, 0x0040, 0x405A, 0xBC3C, 0x01C0,
- 0x441E, 0x8F0F, 0x6E11, 0xE800, 0xBD08, 0x0A88, 0x6D74, 0xA103, 0xE142, 0x1B1A, 0x0E9A,
- 0x3F14, 0x6E11, 0xFF18, 0x8E00, 0x8EC0, 0xA300, 0x01E1, 0x8E00, 0xB522, 0x0009, 0x3867,
- 0xBD08, 0x0A9D, 0x6D76, 0xA184, 0xE1C3, 0xBCB6, 0x8000, 0x8E00, 0x1B63, 0x0EE3, 0x3F1D,
- 0x6E19, 0xFF18, 0x8E00, 0x8EC0, 0xA300, 0x01E1, 0x8E00, 0xA200, 0x01F7, 0x2600, 0xA200,
- 0x01E4, 0x8F44, 0xA201, 0x01F8, 0x2690, 0x8F41, 0xBC21, 0x3173, 0xA202, 0x01E5, 0xFA31,
- 0x2191, 0x8F02, 0x3491, 0xA302, 0x01E5, 0xA202, 0x01E5, 0x2251, 0x8F33, 0xBC21, 0x02A8,
- 0xBC23, 0x316F, 0xBC25, 0x316C, 0xBC40, 0x4086, 0xFA73, 0xBC22, 0x316D, 0xBC24, 0x316E,
- 0x680C, 0xFAB3, 0xFA52, 0xFA94, 0x38A3, 0x8F04, 0xBC23, 0x3170, 0x8E00, 0xFA73, 0x2033,
- 0x18D4, 0xBC26, 0x3171, 0xBC40, 0x4881, 0xFAD6, 0x210E, 0x8F04, 0xBC25, 0x3172, 0x8E00,
- 0xFAB5, 0x210D, 0x1954, 0x1E5D, 0x2208, 0x401E, 0x8F0A, 0x2108, 0xA31E, 0x01E5, 0x8F03,
- 0x8E00, 0x8C05, 0xB000, 0xFFFF, 0x3401, 0x8D01, 0x4000, 0x40A1, 0x2801, 0xA300, 0x01E4,
- 0x382E, 0xB012, 0x3136, 0xBC20, 0x3163, 0xBD04, 0x0AFB, 0xFA22, 0xFB02, 0xFA2A, 0xFB02,
- 0xBD04, 0x0B01, 0xFA2A, 0xFB02, 0x8EB8, 0x0000, 0x2451, 0xA201, 0x01E0, 0x3909, 0xBC22,
- 0x3163, 0x2453, 0xBC3D, 0x01C0, 0x441F, 0xBD08, 0x0B25, 0x77F6, 0xFA43, 0x2442, 0x6960,
- 0x3E38, 0x8A08, 0xBF8C, 0x8638, 0x2A43, 0x88B0, 0x398B, 0x39E9, 0x39C8, 0x88C0, 0x429B,
- 0x6E18, 0x2403, 0xB024, 0xFFF7, 0x6D06, 0xA444, 0x6910, 0xEA38, 0x8EC0, 0xA301, 0x01E0,
- 0x8E00, 0xBC20, 0x31B2, 0x5FE1, 0xFA10, 0xB020, 0x319C, 0xB012, 0x319C, 0x0008, 0xBC23,
- 0x01F9, 0xFA10, 0xBC40, 0x1981, 0x6862, 0x3A52, 0xBC40, 0x3582, 0x8F06, 0xA200, 0x0085,
- 0x2681, 0x8F03, 0x8EC0, 0x4040, 0xA300, 0x0085, 0x8EB8, 0x0000, 0xBC21, 0x02A8, 0xBC23,
- 0x0263, 0xBC40, 0x4880, 0xBC40, 0x5084, 0x6E10, 0xE580, 0x7000, 0x25C4, 0xA203, 0x0266,
- 0xBC40, 0x5881, 0x2630, 0xBC40, 0x1501, 0x401C, 0x8F28, 0x3820, 0xB532, 0x0002, 0xB036,
- 0x3174, 0x3882, 0x6910, 0xBA65, 0x6960, 0x2206, 0x8A02, 0xBBD4, 0xCA86, 0x6A3D, 0x7A73,
- 0x88C0, 0x3215, 0x00E3, 0x8F05, 0xB416, 0x0002, 0x0441, 0x3214, 0x1801, 0x8C0A, 0x3B80,
- 0x3330, 0x8F04, 0x2614, 0x8F04, 0x8E00, 0x8CE1, 0x3449, 0x344D, 0x8DDE, 0xBC20, 0x31B2,
- 0x383C, 0xFA10, 0x2108, 0x1801, 0xB000, 0x319C, 0x8EC0, 0xFA10, 0xA300, 0x01FF, 0xBC25,
- 0x01F9, 0x34AB, 0xE904, 0xE143, 0x6122, 0xDF82, 0x3320, 0x8F02, 0xBC23, 0x31B4, 0x8C05,
- 0xFA73, 0xBC23, 0x31B3, 0x8E00, 0xFA73, 0x2813, 0xA201, 0x0260, 0xBC40, 0x268E, 0xBC40,
- 0x2E8F, 0x6D4A, 0xA29E, 0x700E, 0xE2DC, 0x7307, 0xDFDE, 0x6E7F, 0x224C, 0xCFCE, 0x6A34,
- 0xDFA5, 0x6E28, 0x2800, 0xBC3D, 0x0200, 0x6EE3, 0xE287, 0x88E0, 0xBD07, 0x0BC7, 0x6D00,
- 0x9FCE, 0xBCFF, 0x8000, 0x8E00, 0xE4E7, 0xE2C5, 0xBCDB, 0x8000, 0x6E7F, 0x0FCE, 0x6A34,
- 0xE4E5, 0x38A0, 0x88E0, 0x6EE3, 0xE287, 0xDFCE, 0xBCFF, 0x8000, 0xCF82, 0xE4E7, 0xE2C5,
- 0xBCDB, 0x8000, 0xE64C, 0xE4E5, 0xCFDF, 0xE546, 0xA301, 0x0260, 0xA31F, 0x01F9, 0xCFA3,
- 0x8EC0, 0xE9FC, 0xE5DC, 0x0000, 0xBC22, 0x31B7, 0x8E00, 0xFA52, 0x26A0, 0x8F04, 0x8EC0,
- 0xBC22, 0x6568, 0xA302, 0x0268, 0xA200, 0x0261, 0x403A, 0xBC3C, 0x0200, 0x4C1E, 0x8E00,
- 0xE062, 0xA300, 0x0261, 0x6904, 0xBC1B, 0x241B, 0xBD1E, 0x0BFA, 0x67A6, 0xBC1B, 0x241B,
- 0x1E9A, 0xBC3D, 0x0290, 0xA201, 0x0293, 0x3B7A, 0x407F, 0xBC23, 0x31B6, 0x6EE7, 0x64E2,
- 0xFA73, 0xA204, 0x02B0, 0xA300, 0x0261, 0xA301, 0x0293, 0x21A3, 0x8F2C, 0xA200, 0x0293,
- 0x407E, 0xBC23, 0x31B5, 0x7016, 0xBC1C, 0x1EA2, 0xB800, 0xE61C, 0x1EA2, 0x1E93, 0xB124,
- 0x0001, 0xBC23, 0x2000, 0xBCA4, 0xC000, 0xBC24, 0x3FFF, 0x24DA, 0xB056, 0xFFFF, 0x3095,
- 0x0562, 0xA300, 0x0293, 0x4004, 0xBD0B, 0x0C39, 0x33D0, 0xB56A, 0x0001, 0x8F02, 0xB548,
- 0x0001, 0x8C05, 0x0172, 0x3521, 0x0572, 0xB548, 0x0001, 0x8E00, 0x30A3, 0xA302, 0x0269,
- 0xA202, 0x0269, 0xA203, 0x0268, 0x0493, 0x3220, 0xBC23, 0x0400, 0x8F02, 0xBC23, 0x31B8,
- 0x8E00, 0xFA73, 0xBC24, 0x0267, 0x281A, 0xE643, 0x8EC0, 0xBC40, 0x260F, 0xBC40, 0x1E0E,
- 0x0000, 0xBC23, 0x0267, 0x349D, 0xE904, 0x6D57, 0xA15F, 0x6D27, 0xDF82, 0x700E, 0xA2DD,
- 0xBC40, 0x2184, 0x6E7F, 0x5FDF, 0xBC40, 0x1983, 0x7307, 0xA14C, 0xCFCE, 0x6AA7, 0x1FA5,
- 0xA200, 0x0262, 0xBC3C, 0x0200, 0x88E0, 0x6EEB, 0xFC1F, 0x6960, 0x1FCE, 0xBC25, 0x026F,
- 0xBCFD, 0xC000, 0xBD07, 0x0C8C, 0xB51E, 0x0002, 0x6D7A, 0xA681, 0xE061, 0xBC9C, 0x4000,
- 0x6E7F, 0x4FCE, 0xB512, 0x0002, 0x6AA7, 0x26C1, 0x88E0, 0x6E29, 0xDFCE, 0x6EEB, 0xFC1F,
- 0xBCFD, 0xC000, 0x8E00, 0xB51E, 0x0002, 0xE681, 0xE061, 0xBC9C, 0x4000, 0xCFA3, 0xB512,
- 0x0002, 0xBC24, 0x0267, 0xE6C1, 0xE5DD, 0xE54C, 0xA300, 0x0262, 0xBC40, 0x0E06, 0xCF85,
- 0xCFDE, 0x8EC0, 0xE9FC, 0xE6DE, 0xA200, 0x02A7, 0x2600, 0xBC01, 0x0D4B, 0xA203, 0x0294,
- 0x2630, 0xA202, 0x02C5, 0xBC25, 0x1000, 0xA200, 0x02C6, 0xA204, 0x02C3, 0xA201, 0x01BE,
- 0xBCA5, 0x4000, 0xBC23, 0x0294, 0x8F33, 0xBC26, 0x31CE, 0xBC40, 0x1185, 0x6990, 0x7AD4,
- 0x0495, 0xBCA5, 0x0000, 0xBC26, 0x31CF, 0x00AA, 0xBC25, 0x31D0, 0xBC40, 0x1984, 0xBC40,
- 0x2187, 0x0404, 0xFAD6, 0x044F, 0xFAB5, 0xBC81, 0x8000, 0xBC93, 0x4000, 0x0020, 0x0079,
- 0xA204, 0x0299, 0xBC40, 0x1582, 0xBC40, 0x1D80, 0xBC40, 0x2581, 0x8F07, 0x32C0, 0x4000,
- 0x8F00, 0xB008, 0xFFFF, 0x8C13, 0xA300, 0x0299, 0xBC20, 0x4000, 0x21A0, 0x8F00, 0x3421,
- 0x8C0B, 0xA300, 0x0299, 0x403E, 0xBC40, 0x1D80, 0xA31E, 0x0294, 0xBC40, 0x2581, 0xBC40,
- 0x1582, 0xBC20, 0x31D1, 0xBC40, 0x1185, 0xFA10, 0x20A8, 0x4020, 0xBC40, 0x1981, 0x3840,
- 0x8F06, 0xBC20, 0x31D2, 0x8E00, 0xFA10, 0x2088, 0x3802, 0x8F00, 0x4000, 0xBC24, 0x31D3,
- 0xBC40, 0x2183, 0xFA94, 0xBC27, 0x31EE, 0x4006, 0x6867, 0x3AF3, 0x1932, 0x202B, 0x8F04,
- 0xBC23, 0x31EF, 0x8E00, 0xFA73, 0x218B, 0x8F00, 0x3886, 0x2640, 0xBC21, 0x029A, 0x8F0B,
- 0xBC23, 0x31D4, 0xA204, 0x0299, 0xFA73, 0x2023, 0x8F01, 0x2600, 0x8F03, 0x8E00, 0x8C13,
- 0xA306, 0x0295, 0xBC20, 0x31F7, 0xBC40, 0x2083, 0xFA10, 0x2118, 0x1803, 0xA302, 0x0295,
- 0xBC40, 0x1C86, 0xBC40, 0x1486, 0xBC40, 0x5C86, 0xBC40, 0x2480, 0xBC40, 0x2080, 0xB230,
- 0x7530, 0x4C02, 0x8EC0, 0x1810, 0xBC40, 0x2480, 0x8EC0, 0x4000, 0xA300, 0x0294, 0x0000,
- 0xBC22, 0x31F0, 0xE91C, 0xBC24, 0x029A, 0x7007, 0x3A52, 0x6E11, 0x1C82, 0x6E7F, 0x3C85,
- 0xBC26, 0x31F4, 0xBC23, 0x31F3, 0x77FE, 0xDCA4, 0xBC27, 0x31F2, 0xB801, 0xA891, 0x7027,
- 0xFA73, 0xFAF6, 0xDCC3, 0xBC27, 0x31D5, 0xBC23, 0x31DA, 0xDD26, 0xDD04, 0xFAF6, 0xBC24,
- 0x31F5, 0xFA73, 0xDD66, 0xDD43, 0xFA96, 0xB074, 0x000B, 0xBC23, 0x31D8, 0xDDA6, 0xDD87,
- 0xBC26, 0x31D7, 0xB800, 0xE6F7, 0xDCE1, 0xBC24, 0x31D6, 0x6D34, 0x9DC3, 0xDDE7, 0xBC21,
- 0x8000, 0xFAD6, 0xBC27, 0x31D9, 0xFA94, 0x6163, 0x9E46, 0xE1DE, 0x6D34, 0xDE03, 0x6143,
- 0x1E24, 0xDE86, 0xDE63, 0xB801, 0xEE73, 0xB064, 0x000C, 0xBC21, 0x31F6, 0xDEA7, 0xDEE3,
- 0xDF06, 0xBC27, 0x31F1, 0xB034, 0x0009, 0x6D45, 0x1EC4, 0xB800, 0x6CD1, 0x6E81, 0xBAF6,
- 0xB024, 0x000A, 0xDFA6, 0xDF42, 0xDF23, 0xE1C3, 0xE142, 0xE246, 0xDF64, 0xDF8F, 0xBC3D,
- 0x029F, 0xBD08, 0x0E56, 0x6CD8, 0x1FC1, 0x7003, 0x0E27, 0x6915, 0xA044, 0x8F01, 0x2640,
- 0x8F6F, 0x6A3B, 0xCCE5, 0x6D6C, 0x4EC7, 0x6A3B, 0xDFE6, 0x88D0, 0xB20C, 0x0060, 0xDCE5,
- 0xCDC5, 0x8F65, 0x6A09, 0x4D65, 0x88FC, 0x6910, 0x8C86, 0x28DD, 0x28FD, 0x8890, 0xBCFF,
- 0xC000, 0xBC92, 0x4000, 0x2442, 0x28D5, 0x6A3F, 0x4CE5, 0x88F0, 0x686B, 0x8D26, 0x611E,
- 0x4DE7, 0x2409, 0x8F05, 0xCFA6, 0x686B, 0x8CC5, 0xCD06, 0x666B, 0x8CE5, 0x6113, 0x5DFC,
- 0x2409, 0x32F0, 0xBCEC, 0x4000, 0x8F05, 0xCD41, 0x686E, 0x5DFC, 0x8F01, 0x35F9, 0xDDE7,
- 0x686D, 0x4EE6, 0x401F, 0x8F12, 0x6CB8, 0x0DC5, 0x3BBC, 0x8F09, 0x38FE, 0xBC21, 0x2666,
- 0xBCFE, 0x4000, 0xB06C, 0xFFFF, 0x3BA6, 0x3BE7, 0x0F27, 0x6EF7, 0xDEFD, 0xBC3D, 0x029F,
- 0x8C26, 0x409F, 0xCDE5, 0x69B4, 0x0EA6, 0x8F01, 0x3569, 0xDDE5, 0x684B, 0x9EFC, 0x7027,
- 0xCDC5, 0xBC3D, 0x029F, 0x8F16, 0x6910, 0x8FC1, 0x5BE5, 0x28E5, 0xBC25, 0x31CA, 0x403B,
- 0xFAA6, 0xE0E7, 0x8A03, 0xBBF9, 0x4C3F, 0x6A3F, 0x9EF0, 0x88D0, 0x77FE, 0xDFC1, 0x66EB,
- 0x0DC5, 0x0F26, 0x3BC6, 0x8D02, 0xDFE6, 0xCDC5, 0x6A09, 0x4E47, 0x88EC, 0x6915, 0x0F8F,
- 0x6915, 0x8E85, 0x28F7, 0x28DD, 0x88B0, 0xBC9D, 0x8000, 0xBCE6, 0xC000, 0x6915, 0x0F8F,
- 0x2456, 0x6A33, 0xCFC1, 0x28D5, 0x88A0, 0x8E00, 0x0556, 0x242D, 0x26D0, 0x8F04, 0xCFE6,
- 0xCDA7, 0x2137, 0x19BE, 0xDFE6, 0x6D00, 0xA444, 0x6915, 0xEA38, 0xE4C4, 0xCFE6, 0xCF44,
- 0xCF27, 0xCF00, 0xE7C3, 0xE642, 0xA305, 0x029A, 0xCE02, 0xCD83, 0xCF65, 0xE441, 0xCDE7,
- 0xCE64, 0xCEFB, 0xCCF0, 0xCCA1, 0xE9E4, 0xE6C6, 0xE5C7, 0xE55E, 0x8EC0, 0xE65B, 0xE4D0,
- 0xBC21, 0x02A8, 0xE90E, 0x6E18, 0x7C22, 0xA204, 0x02C4, 0x6C28, 0xA0C5, 0xA200, 0x02C2,
- 0x6C49, 0x5F04, 0xB050, 0x31BD, 0x6E0D, 0x1F55, 0x6980, 0x3AB6, 0xB012, 0xFFF2, 0xA21E,
- 0x02C6, 0xB000, 0x31BF, 0x616C, 0xA4DE, 0x7000, 0x5F21, 0xFA12, 0x4025, 0x180D, 0x0554,
- 0xB020, 0x31BB, 0xA204, 0x02C5, 0xBC40, 0x2187, 0x31E7, 0xFA52, 0x0497, 0xB000, 0x31B9,
- 0xBC40, 0x1987, 0x3127, 0x6C88, 0x3A10, 0x0504, 0x38F4, 0xB00E, 0xFFF7, 0x6622, 0x9F60,
- 0x6D37, 0x6446, 0xB06E, 0xFFF6, 0x6C90, 0x1F86, 0x6643, 0x2745, 0xB05E, 0xFFF5, 0xB07E,
- 0xFFF4, 0xE1C6, 0x6998, 0x66C4, 0xE7C2, 0xDFC7, 0xDFA5, 0x8F54, 0xBC20, 0x02A8, 0x700F,
- 0x8E44, 0x65E3, 0x0EC5, 0xB5A8, 0x000F, 0x65B3, 0x65DE, 0xBC40, 0xBC02, 0xBC40, 0x5404,
- 0xB4AA, 0x0001, 0xB5B6, 0x000F, 0xB4C8, 0x0001, 0xB5EC, 0x000F, 0x62B6, 0x8EA2, 0x0BB4,
- 0x170A, 0xBC40, 0xC406, 0xB4E4, 0x0001, 0xB5C8, 0x000F, 0xBC40, 0x9403, 0x62C9, 0x8E83,
- 0x178B, 0xB4F6, 0x0001, 0xB5EC, 0x000F, 0x0BB7, 0xBC40, 0x8404, 0xCEE4, 0xB5FA, 0x000F,
- 0xBC40, 0x4405, 0x174C, 0xBC40, 0x8C07, 0xB4F8, 0x0001, 0xB5DA, 0x000F, 0xBC40, 0x3C02,
- 0xBC40, 0x4C03, 0xB5A4, 0x000F, 0xB5B6, 0x000F, 0xBC40, 0x3404, 0x0B6F, 0xB5C8, 0x000F,
- 0xBC40, 0x7C02, 0xBC40, 0x9C03, 0xBC40, 0x5C01, 0xBC40, 0xAC01, 0xBC40, 0xB401, 0xBC40,
- 0x7405, 0xBC40, 0xA406, 0x8C69, 0xA304, 0x02B5, 0xBC23, 0x02B5, 0xBC22, 0x31C4, 0xB046,
- 0xFFF9, 0xFA52, 0xDFE4, 0xBC02, 0x1E36, 0x7000, 0x4FE0, 0xB030, 0x000B, 0xBC20, 0x31C3,
- 0xB046, 0xFFF7, 0xFA12, 0xCF80, 0xDF84, 0xBC02, 0x1E36, 0x7000, 0x4F80, 0x6D31, 0xCFA0,
- 0xBC22, 0x31C6, 0xB046, 0xFFF8, 0xFA52, 0xDF84, 0xBC02, 0x1E36, 0x7000, 0x4F80, 0xB030,
- 0x000C, 0xBC20, 0x31C5, 0xB046, 0xFFF6, 0xFA12, 0xCFC0, 0xDF84, 0xBC02, 0x1E36, 0x6E05,
- 0x0F81, 0xB032, 0x000E, 0xBC40, 0x788F, 0x7000, 0x61CE, 0xB040, 0xFFF3, 0x88D8, 0xBC22,
- 0x31C7, 0xB066, 0xFFF3, 0xCF20, 0xFA52, 0xDE65, 0xDF26, 0xDF83, 0xBC02, 0x1E36, 0xCF80,
- 0xCF01, 0xBC47, 0xA803, 0xBC47, 0x5804, 0x6112, 0xCE7E, 0x6C33, 0x0F21, 0x241B, 0xBC47,
- 0xA004, 0x6847, 0x24DE, 0xDEE3, 0x8F03, 0xBC23, 0x31C9, 0x4001, 0x8C05, 0xFA72, 0xBC23,
- 0x31C8, 0x4001, 0xFA72, 0xB030, 0xFFFE, 0xB046, 0xFFF6, 0xCF60, 0xBC02, 0x1E36, 0xBC21,
- 0x02A8, 0xBC20, 0x31C1, 0xCF1E, 0xBC40, 0x4083, 0xFA10, 0xBC40, 0x649E, 0x2098, 0x8F09,
- 0xBC20, 0x31C2, 0xBC40, 0x5083, 0xFA10, 0x6406, 0x0F55, 0x0018, 0x8C03, 0xBC40, 0x5480,
- 0xCF55, 0x8E00, 0x8EC0, 0xE9F2, 0x8E00, 0xBC23, 0x00A5, 0xBC20, 0x3054, 0x6E10, 0xE181,
- 0xB800, 0x2074, 0x24A1, 0xA201, 0x045F, 0x28C8, 0x6911, 0x2902, 0xBC21, 0x00A3, 0x6E10,
- 0x654E, 0xBC24, 0x2081, 0xE085, 0xBC26, 0x2083, 0xB801, 0x2837, 0x692F, 0x65CF, 0xDFC3,
- 0xFAD3, 0x28D8, 0x2444, 0xBC23, 0x00A1, 0x6E10, 0xE54E, 0xE185, 0xE1C6, 0x692D, 0x64CF,
- 0x28E0, 0x2444, 0xA200, 0x00A0, 0x7008, 0xA54E, 0x6220, 0xA5CF, 0xBC24, 0x2080, 0x26A0,
- 0xFA94, 0xBC22, 0x00A7, 0x8F0E, 0x38A2, 0x8E00, 0xE286, 0xE2C7, 0x24BE, 0xBC26, 0x3055,
- 0x8E00, 0xFAD6, 0x28E6, 0x2444, 0x8E00, 0xA30E, 0x00A7, 0xE6CF, 0xBC24, 0x3053, 0x8E00,
- 0xFA94, 0x2244, 0x8F3A, 0x7007, 0x8FC4, 0xA20E, 0x00A5, 0xE24F, 0x88C8, 0xA20E, 0x00A1,
- 0x690B, 0x21CF, 0x88B8, 0xA20E, 0x00A3, 0xE0CF, 0x8898, 0xBC26, 0x3056, 0xE10E, 0xFAD6,
- 0x6807, 0xA14F, 0x88A8, 0x8F10, 0xBC26, 0x3057, 0x8E00, 0xFAD6, 0x200E, 0x8F0A, 0xBC26,
- 0x3059, 0x8E00, 0xFAD6, 0x212E, 0x8F04, 0xBC25, 0x3058, 0x8E00, 0xFAB5, 0x2095, 0x8F03,
- 0x8E00, 0x8C06, 0xA31E, 0x008C, 0x403E, 0x8E00, 0xA31E, 0x008C, 0x403C, 0xA303, 0x009C,
- 0xA301, 0x009D, 0xA304, 0x009E, 0xA302, 0x009F, 0xA31C, 0x008B, 0xE9FE, 0x8EC0, 0x3401,
- 0xA300, 0x00A0, 0x6C84, 0xA904, 0xFA13, 0x6E0D, 0x1FD5, 0xBC22, 0x3104, 0xB002, 0xFFFD,
- 0xFA52, 0xBC21, 0x7FFF, 0x6622, 0xA443, 0x40A1, 0xBC23, 0x02CE, 0xBC24, 0x045A, 0xBC02,
- 0x1E36, 0xCFD5, 0x8E00, 0x8EC0, 0xE9FC, 0x8E00, 0xE906, 0xA202, 0x02D3, 0x6E0D, 0x1F81,
- 0xB012, 0xFFFB, 0x6988, 0x5FA1, 0xDFD5, 0x8F04, 0xBC20, 0x2080, 0x4021, 0x8C0F, 0xA301,
- 0x02D3, 0xFA11, 0xBC02, 0x1E46, 0xA201, 0x0474, 0x1A41, 0x7007, 0x9F61, 0xBC20, 0x2080,
- 0xA31E, 0x02D3, 0xFB11, 0x7040, 0x4F83, 0xBC22, 0x3104, 0x6C8C, 0xBA10, 0xFA52, 0xBC23,
- 0x7FFF, 0x6626, 0x9F60, 0xCFA0, 0xBC23, 0x02D1, 0xBC24, 0x045B, 0xBC02, 0x1E36, 0xCFD5,
- 0x8E00, 0x8EC0, 0xE9FA, 0x8E00, 0xE902, 0xFA31, 0xDFC0, 0xDFF5, 0xBC02, 0x1E46, 0xCFC1,
- 0xDFC0, 0xFA31, 0xBC02, 0x1E46, 0xCFC1, 0x1A48, 0xA200, 0x02D5, 0xA202, 0x045C, 0x0E41,
- 0x26A0, 0xA301, 0x02D5, 0x8F06, 0xBC21, 0x2082, 0x401E, 0xA200, 0x02D5, 0xA31E, 0x02D5,
- 0xFB30, 0x6D14, 0x4FF5, 0xE9FE, 0x40E0, 0x8EC0, 0x0848, 0xA301, 0x045C, 0x6C84, 0xBA10,
- 0xE904, 0xB580, 0x0002, 0xA201, 0x0474, 0xB100, 0x00BE, 0xBC23, 0x2081, 0x66C2, 0x1FD5,
- 0xBC22, 0x3104, 0x6E2D, 0x3B74, 0xB00A, 0xFFFD, 0xFA52, 0xBC23, 0x7FFF, 0x6626, 0xA444,
- 0x40C1, 0xBC23, 0x02D6, 0xBC24, 0x045D, 0xBC02, 0x1E36, 0xCFD5, 0x8E00, 0x8EC0, 0xE9FC,
- 0x8E00, 0xE904, 0xFA10, 0x6E08, 0x1FC1, 0xDFF5, 0xBC02, 0x1E46, 0xA201, 0x0474, 0xBC22,
- 0x3104, 0x6692, 0x0FC0, 0xBC23, 0x2083, 0x6C80, 0xBA52, 0xBC24, 0x7FFF, 0x6E05, 0x3B71,
- 0x6628, 0x9FA1, 0xB000, 0xFFFD, 0x40E1, 0xBC23, 0x02D9, 0xBC24, 0x045E, 0xBC02, 0x1E36,
- 0xCFF5, 0x8E00, 0x8EC0, 0xE9FC, 0x8E00, 0x0000, 0xBC21, 0x00A9, 0x4402, 0xE083, 0xE0C4,
- 0x24A3, 0xBC23, 0x213F, 0x8E00, 0x6960, 0x3A74, 0x8A0E, 0x6A38, 0xBA74, 0xB300, 0x0044,
- 0x28E2, 0x8F0B, 0x2600, 0x8F04, 0x2444, 0x8EC0, 0xA30E, 0x00A9, 0xE4CF, 0x4000, 0x8EC0,
- 0xA300, 0x00A9, 0xE4C0, 0x8880, 0x8EC0, 0x8E00, 0xA300, 0x045F, 0xE904, 0xBC21, 0x2022,
- 0x6E05, 0x1FD5, 0xA21C, 0x047A, 0xB000, 0xFFFD, 0xFA35, 0x7000, 0x6445, 0xDFFC, 0xBC22,
- 0x0780, 0xBC23, 0x02DD, 0xBC24, 0x02DF, 0xBC02, 0x1E36, 0xA201, 0x02DF, 0xA200, 0x02DC,
- 0xCFE2, 0xA092, 0x8000, 0xB000, 0xFFFF, 0xA301, 0x047A, 0x2680, 0xA300, 0x02DC, 0x8F34,
- 0xBC20, 0x304D, 0xBC3E, 0x0320, 0xBC3A, 0x7FFF, 0xFA10, 0xA202, 0x047C, 0xA31E, 0x02DC,
- 0xA31A, 0x047A, 0x21C8, 0x8F14, 0xBC20, 0x304E, 0xBC23, 0x304F, 0xFA10, 0x6872, 0x3A70,
- 0x8F03, 0x2048, 0x8F01, 0x26A0, 0x8F05, 0x21C8, 0x8F0A, 0x4000, 0xA300, 0x047C, 0x8D07,
- 0x4040, 0x8C05, 0xA300, 0x047C, 0x4020, 0xA300, 0x047C, 0xA200, 0x047C, 0x2242, 0x4000,
- 0x8F02, 0xA300, 0x047B, 0x8C07, 0xCFD5, 0x7008, 0x0FD5, 0x8C03, 0xA300, 0x047B, 0xCFD5,
- 0x8E00, 0x8EC0, 0xE9FC, 0x8E00, 0xBC20, 0x2021, 0xA201, 0x047C, 0x6984, 0x3A12, 0x8F1B,
- 0x2611, 0xB034, 0xFFE0, 0x8F10, 0x2692, 0x8F1B, 0xBC21, 0x3051, 0x8E00, 0xFA31, 0x20D1,
- 0x8F00, 0xA026, 0x4000, 0x21D1, 0x8F11, 0xB024, 0x0020, 0xA0A4, 0x4000, 0x8D0E, 0xBC21,
- 0x3052, 0x8E00, 0xFA31, 0x8C09, 0xA026, 0x4000, 0xBC21, 0x3050, 0xB024, 0x0020, 0xFA31,
- 0xA0A4, 0x4000, 0x8EC0, 0xFB12, 0x8E00, 0x0000, 0xBC22, 0x3105, 0xE902, 0xA21C, 0x0326,
- 0x77FE, 0xBA52, 0x6EF0, 0x9FDC, 0xA200, 0x0312, 0xBC3C, 0x02E0, 0xBC22, 0x30C2, 0xBC23,
- 0x8EE4, 0xBC24, 0x771E, 0xBC25, 0x88E2, 0x403B, 0x706F, 0xE800, 0xBD05, 0x11DA, 0x6E30,
- 0xBC19, 0x2442, 0x6960, 0x3AC7, 0x8A08, 0xBB3D, 0x8E19, 0x28CF, 0xA207, 0x0315, 0xBC21,
- 0x12EB, 0xA206, 0x0316, 0x28F9, 0x28F3, 0xA307, 0x0316, 0x88F0, 0x2442, 0x28FC, 0x28F5,
- 0xA307, 0x0315, 0x417A, 0x88E0, 0xA207, 0x0317, 0x699C, 0xEA18, 0x2442, 0x4001, 0x8F00,
- 0xB01E, 0xFFFF, 0x6A3C, 0x4FC1, 0x88E4, 0xBC3D, 0x0318, 0x5FFA, 0x7007, 0x64E6, 0xA206,
- 0x0317, 0x6998, 0xDFC1, 0x8F02, 0x35B1, 0x3BA6, 0x8E00, 0xA31D, 0x0317, 0xA300, 0x0312,
- 0xCFC2, 0x8EC0, 0xE9FE, 0xA302, 0x0326, 0x0000, 0xA200, 0x0325, 0xA201, 0x0354, 0xBC3D,
- 0x0327, 0x459F, 0x403B, 0xBC3C, 0x0318, 0x41BE, 0xBC22, 0x30CB, 0xBD05, 0x1200, 0x5FFA,
- 0x3862, 0x6910, 0xBC1D, 0x6960, 0x3A64, 0x8A03, 0xBBB0, 0xC81D, 0x28EC, 0x88B0, 0x40DA,
- 0xE4E3, 0xEA18, 0xA300, 0x0325, 0xA200, 0x0353, 0x3B9D, 0x459E, 0xBC22, 0x30CF, 0x5FFA,
- 0xA301, 0x0354, 0x6910, 0xBA43, 0xE064, 0x8A27, 0xBB8C, 0x861C, 0x403A, 0x28E3, 0x88A0,
- 0xEA18, 0x8EC0, 0xA300, 0x0353, 0xA302, 0x0355, 0xBC25, 0x0357, 0xBC22, 0x30F8, 0x6E09,
- 0x7CA4, 0xB800, 0xA6B6, 0x24B4, 0xA206, 0x0356, 0x33B0, 0x4FE4, 0xBC27, 0x01FF, 0x35B1,
- 0x1927, 0x09F4, 0xBC24, 0x0100, 0x4806, 0x1926, 0xA206, 0x0355, 0x2670, 0xA307, 0x0356,
- 0x243E, 0x28FC, 0x2444, 0x4004, 0x7008, 0x64CE, 0x6673, 0x26CF, 0x2670, 0x8F2C, 0xBC27,
- 0x30F7, 0xE2CF, 0xFAF7, 0x6CDC, 0x26C4, 0xA20E, 0x0357, 0xA304, 0x0357, 0x88D8, 0x8F1C,
- 0x3230, 0x8F01, 0xB036, 0xFFFF, 0xFB53, 0xA202, 0x0359, 0x2620, 0x8F0D, 0x2622, 0x4043,
- 0x8F05, 0xB20A, 0x099A, 0x189A, 0xB22A, 0x21EC, 0x8C08, 0x18A2, 0xB22A, 0x13D7, 0x8C04,
- 0x188A, 0xB20A, 0x17AE, 0x188A, 0x8C07, 0xA302, 0x0359, 0xBC22, 0x30F7, 0xB03E, 0xFFFF,
- 0xFB53, 0xA202, 0x0359, 0x144A, 0x2442, 0x28F1, 0x8894, 0x8EC0, 0x8E00, 0xE441, 0xBC22,
- 0x2131, 0xBC23, 0x00B0, 0xBC24, 0x2135, 0x6915, 0x3B53, 0xFA93, 0xBC22, 0x2136, 0xE4C3,
- 0xB800, 0xA210, 0xBC80, 0x4000, 0x6915, 0xE902, 0xBC21, 0x30F9, 0xA203, 0x035B, 0xBC22,
- 0x035C, 0x6E73, 0xFA31, 0xBC24, 0x30FA, 0x28C1, 0xA300, 0x035B, 0xFA94, 0x6E08, 0xBC40,
- 0x6A37, 0x2143, 0x2A83, 0x88C0, 0xDFCE, 0xDFEF, 0xBC20, 0x0A30, 0xBC88, 0x0000, 0xCFCE,
- 0xA300, 0x035A, 0xCFEF, 0x2444, 0xA203, 0x035E, 0xB580, 0x0001, 0x6000, 0xE4CE, 0xB000,
- 0x2000, 0xE54F, 0xA300, 0x035E, 0xBC21, 0x3244, 0xBC80, 0x4000, 0xBC21, 0x2111, 0x8EC0,
- 0xE9FE, 0xFB30, 0xBC22, 0x3105, 0xBC24, 0x30FB, 0xE906, 0xA203, 0x035A, 0xBC25, 0xF000,
- 0xFA52, 0xFA94, 0xA21E, 0x0314, 0xA21C, 0x015F, 0x66BA, 0xDF84, 0xDFA2, 0x7050, 0xDF63,
- 0xDFDC, 0xDF5E, 0xBC22, 0x0CCD, 0xBC24, 0x2131, 0xBC25, 0x199A, 0xBC3B, 0x009C, 0xBC3D,
- 0x02E0, 0xBD0A, 0x131D, 0xA206, 0x035F, 0x700E, 0x8F67, 0x63ED, 0xCFBE, 0xB47C, 0x000E,
- 0xB11E, 0x0005, 0xA200, 0x0360, 0x0E08, 0x2810, 0xB5FE, 0x000E, 0x380E, 0x1BB7, 0xB000,
- 0x0400, 0xBCF0, 0xC000, 0xA306, 0x035F, 0xBCED, 0x4000, 0x283A, 0xA307, 0x0360, 0x888C,
- 0xBC27, 0x00B1, 0x6EE7, 0x7B97, 0x606C, 0x0F40, 0xBC27, 0x3244, 0xBCED, 0xC000, 0x7016,
- 0xBC1F, 0x6EE6, 0xDF40, 0xBC20, 0x2135, 0xBC21, 0x2111, 0xFA10, 0xBC8E, 0x0000, 0xFB36,
- 0xB560, 0x0001, 0xCF80, 0xBC8C, 0x0000, 0xBC3E, 0x00C2, 0x63E1, 0x8FC0, 0x3F3E, 0xFF18,
- 0xDFC0, 0xCFC2, 0xA302, 0x015F, 0xCF43, 0x8EC0, 0xE9FA, 0xA303, 0x0314, 0xA203, 0x0366,
- 0x6D06, 0x6044, 0xBC22, 0x0367, 0xA203, 0x0363, 0x08C3, 0xA206, 0x0355, 0x6E00, 0xBC45,
- 0xBCC9, 0x8000, 0x698C, 0x2146, 0x24B5, 0xA205, 0x0364, 0x28E5, 0x2444, 0xA303, 0x0366,
- 0x7000, 0x244E, 0x7008, 0xE54F, 0x1918, 0x2640, 0x8F4A, 0xE14F, 0xA20E, 0x0367, 0xE540,
- 0xA300, 0x0367, 0xBC22, 0x3101, 0xE0C1, 0x2409, 0xFA52, 0x88C8, 0x218A, 0x240C, 0x3840,
- 0x8F0B, 0xBC20, 0x2004, 0x8E00, 0xFA10, 0x2680, 0x3802, 0x8F04, 0xBC20, 0x3100, 0x5FE4,
- 0xFA10, 0x2108, 0x181C, 0xA201, 0x0369, 0xA204, 0x0365, 0x3449, 0x084C, 0xBC24, 0x30FE,
- 0x2610, 0xA301, 0x0369, 0xA201, 0x0362, 0xFA94, 0x195A, 0x0048, 0x3340, 0x8F12, 0x2650,
- 0x8F14, 0xBC20, 0x3103, 0xA204, 0x0361, 0x69B0, 0x3A10, 0x8F02, 0x2188, 0x8C04, 0x185A,
- 0x0410, 0x2088, 0x1853, 0xA301, 0x0361, 0x3822, 0x8D05, 0xBC20, 0x30FE, 0xB028, 0xFFFF,
- 0xFB12, 0x8EC0, 0xA301, 0x0362, 0x8E00, 0x8EB8, 0xBC20, 0x303D, 0x4021, 0xFA10, 0xA202,
- 0x0462, 0x1408, 0x3491, 0xB000, 0xFFFF, 0x0810, 0x2680, 0xA300, 0x0462, 0xA200, 0x0460,
- 0x8F36, 0xBC23, 0x3041, 0xBC22, 0x3040, 0x6980, 0x3A73, 0xA204, 0x045B, 0xA21C, 0x045A,
- 0xFA52, 0x8F06, 0x21A3, 0x8F02, 0x387C, 0x201A, 0x8F07, 0x4000, 0x8D06, 0x21A3, 0x8F03,
- 0x387C, 0x219A, 0x8F00, 0x3801, 0xBC22, 0x3043, 0x8E00, 0xFA52, 0x2620, 0x8F17, 0xA202,
- 0x0465, 0x26A0, 0x8F12, 0xBC22, 0x2004, 0x8E00, 0xFA52, 0x26A0, 0x8F0C, 0xBC22, 0x303F,
- 0xA203, 0x045E, 0xFA52, 0x209A, 0x8F05, 0xBC22, 0x303E, 0xA203, 0x045D, 0xFA52, 0x211A,
- 0x8F00, 0x4000, 0xBC22, 0x3044, 0xA300, 0x0460, 0xFA50, 0xA202, 0x0463, 0x2680, 0x8F03,
- 0x4000, 0x8C42, 0xA300, 0x0461, 0xBC20, 0x2015, 0xBC23, 0x3048, 0xFA10, 0xFA73, 0x2003,
- 0x4000, 0x3860, 0x8F1A, 0xBC20, 0x2080, 0xBC24, 0x3046, 0xFA10, 0xFA94, 0x2184, 0x3803,
- 0x8F07, 0xBC20, 0x3047, 0xBC24, 0x2015, 0xFA10, 0xFA94, 0x2020, 0x3803, 0x8F08, 0xBC20,
- 0x2083, 0xBC24, 0x3045, 0xFA10, 0xFA94, 0x2004, 0x3803, 0x8F00, 0x3801, 0x2680, 0x8F02,
- 0xBC20, 0x304A, 0x8C05, 0xFA10, 0xBC20, 0x3049, 0x8E00, 0xFA10, 0xBC24, 0x304B, 0x0E10,
- 0xFA92, 0x2102, 0x8F04, 0xBC22, 0x304C, 0x8E00, 0xFA52, 0x2002, 0x1890, 0x33A0, 0x180B,
- 0xA300, 0x0461, 0xBC20, 0x3042, 0xA201, 0x0461, 0xA203, 0x0460, 0xB512, 0x0001, 0xFA10,
- 0xA302, 0x0463, 0x0059, 0x2600, 0x8F0A, 0x2601, 0x8F07, 0x2602, 0x4042, 0x8F02, 0x2603,
- 0x8C04, 0x1851, 0x8C02, 0x4001, 0x4021, 0xBC20, 0x200D, 0x8EC0, 0x8E00, 0xFB11, 0xBC20,
- 0x0375, 0xBC21, 0x0372, 0xBC22, 0x036A, 0xBC3C, 0x0376, 0x700E, 0xA0C1, 0x70CF, 0xA040,
- 0xBC23, 0x038F, 0xBC09, 0x1482, 0x2442, 0xE104, 0xBC26, 0x1180, 0x6A39, 0xA185, 0xBC21,
- 0xF2C0, 0x6A3A, 0x61C7, 0x6A3F, 0xA5A5, 0xE584, 0xE184, 0xE185, 0xBC21, 0x1CF0, 0x6A3A,
- 0x61C7, 0xBC21, 0x8620, 0x6A3E, 0x65A5, 0x88C0, 0x2442, 0x6A39, 0xA584, 0xBC21, 0x0840,
- 0x6A3A, 0x6184, 0x6A3F, 0xA185, 0xBC21, 0x0A40, 0x6A3A, 0x61C7, 0xBC21, 0x8620, 0x6A3E,
- 0x65A5, 0x88C0, 0x8E00, 0xE584, 0xE464, 0xBC23, 0x038F, 0xBC21, 0x0375, 0x8E00, 0xE4C0,
- 0x8EB8, 0x0000, 0xA202, 0x0372, 0xA203, 0x0395, 0x009A, 0xB214, 0x0014, 0x8F16, 0xB024,
- 0xFFEC, 0x5FC3, 0x04DA, 0x3B43, 0xA200, 0x0375, 0xBC3C, 0x0376, 0x433E, 0xBC23, 0x305B,
- 0x77F6, 0xAA18, 0x6910, 0xBA64, 0xE065, 0x8A05, 0xBBB0, 0xC81D, 0x4023, 0x8880, 0xA303,
- 0x0373, 0x8EC0, 0xA302, 0x0395, 0x8E00, 0xBC20, 0x03BA, 0xA203, 0x03B9, 0x6D20, 0xA00E,
- 0xB206, 0x0080, 0xE04F, 0xE14C, 0x8F36, 0x88B0, 0x40A4, 0xB226, 0x01B0, 0x40C5, 0x1925,
- 0x401C, 0xB226, 0x06C0, 0x7007, 0xA45C, 0x4083, 0x6607, 0x255E, 0xA205, 0x0396, 0xA202,
- 0x03BE, 0xA31C, 0x03B9, 0xA31C, 0x03BA, 0x2268, 0x8F03, 0x8E00, 0x8C03, 0xB034, 0xFFFF,
- 0x34D1, 0xA300, 0x0396, 0xA202, 0x03BD, 0xB236, 0x000A, 0x8F05, 0xB226, 0xFFF6, 0x3B83,
- 0x8F04, 0x4002, 0x401C, 0x8D02, 0x4022, 0x401C, 0x26A1, 0x8F00, 0x40A0, 0xA31C, 0x03BE,
- 0xA302, 0x03BD, 0x8C0D, 0xA300, 0x0397, 0x2421, 0xBC25, 0x1000, 0x28E5, 0x34D9, 0xA303,
- 0x03B9, 0xA30E, 0x03BA, 0xE44F, 0xE54C, 0xA200, 0x0397, 0x3048, 0xBC20, 0x7E7E, 0x8EC0,
- 0xBC82, 0x0000, 0x8E00, 0xBC22, 0x2131, 0xBC24, 0x00B2, 0x77F6, 0xBB54, 0xBC23, 0x2135,
- 0xBC22, 0x2136, 0x7087, 0xBA73, 0x6910, 0xFA52, 0xBCB2, 0xC000, 0xBCA2, 0x8000, 0xA200,
- 0x03A6, 0x3F1A, 0xBC22, 0x3060, 0xBC3C, 0x03A8, 0x6910, 0xBF10, 0xE902, 0xFA43, 0x6960,
- 0x3E18, 0x8A06, 0xBF8C, 0x8618, 0xBF8C, 0xA410, 0x2A42, 0xBC23, 0x03C4, 0x88D0, 0x6D26,
- 0xA19E, 0xBC27, 0x03C7, 0x6E62, 0xE15A, 0x6E7A, 0x5FC2, 0x6E72, 0x21DC, 0x88A0, 0x6D4E,
- 0xA38E, 0xA206, 0x03A5, 0xA300, 0x03A6, 0x6998, 0x23CF, 0xE24C, 0xDFE5, 0x8F03, 0x8E00,
- 0x8C16, 0xB06C, 0xFFFF, 0x88E0, 0x39FC, 0x39DE, 0x399A, 0x8880, 0xBC21, 0x2045, 0x2442,
- 0x7007, 0xBB30, 0xBC20, 0x2046, 0xBC21, 0x305A, 0x7009, 0xBB16, 0x7007, 0x3A30, 0x3B4C,
- 0x15B0, 0x240A, 0x4020, 0x28C8, 0xBC21, 0x03BF, 0xE7CF, 0xA30E, 0x03C7, 0xBCAA, 0x8000,
- 0xA306, 0x03A5, 0x690B, 0x60C6, 0x6E20, 0x664C, 0x6E7F, 0x2482, 0x6E77, 0xA0C7, 0x6E66,
- 0xA4C6, 0x6A3A, 0x0FC1, 0xBC20, 0x3068, 0x6915, 0x24CC, 0xA30E, 0x03C4, 0x6915, 0xE5CF,
- 0x6915, 0xBA01, 0x6A34, 0x7A02, 0x6A3C, 0xBA02, 0xBC40, 0x1205, 0x6A3E, 0xBA02, 0x6A3A,
- 0xBA16, 0xBC40, 0x1A03, 0x6A3A, 0x8FE0, 0x28DE, 0x88A0, 0xBC40, 0x1E05, 0xBC40, 0x1602,
- 0xBC23, 0x28BE, 0xA204, 0x03C3, 0xBCA4, 0xC000, 0xB038, 0x4000, 0x009A, 0xA302, 0x03C3,
- 0xBC23, 0x3244, 0xBCA4, 0xC000, 0xBC23, 0x2111, 0x8EC0, 0xE9FE, 0xFB72, 0xA200, 0x0398,
- 0x2457, 0xBC22, 0x306D, 0x77FE, 0xA441, 0xBC3C, 0x0399, 0x7067, 0xBA43, 0x6E73, 0xE800,
- 0x6915, 0x3C1C, 0x8A0A, 0xBB8C, 0x861C, 0xBB8C, 0xA413, 0x28DA, 0xA300, 0x0398, 0x8EC0,
- 0x8880, 0x8E00, 0xE902, 0xA203, 0x0372, 0x6CAC, 0x1FD5, 0x8F06, 0xBC20, 0x036A, 0xBC21,
- 0x213E, 0xBC0B, 0x15CB, 0xFA32, 0xE402, 0xBC02, 0x1445, 0xBC02, 0x148A, 0xA201, 0x0372,
- 0x41E3, 0xA202, 0x0373, 0x0459, 0x2621, 0xA301, 0x0372, 0x8F07, 0x26A2, 0x8F1A, 0xA200,
- 0x0374, 0xBC02, 0x1AEC, 0x4002, 0x8D16, 0x3820, 0xBC02, 0x14AE, 0x3820, 0xBC02, 0x1504,
- 0xA201, 0x03B8, 0x2610, 0x8F04, 0xB002, 0xFFFF, 0x4002, 0x8C08, 0xA300, 0x03B8, 0x3820,
- 0xBC02, 0x15A4, 0xA300, 0x0374, 0x4042, 0xCFD5, 0x8E00, 0x8EC0, 0xE9FE, 0xA302, 0x0373,
- 0x3E02, 0xBC20, 0x03E5, 0x3820, 0xE002, 0xE003, 0xE044, 0xE402, 0xE484, 0xE042, 0xE482,
- 0x7008, 0xA443, 0xA200, 0x03E4, 0x0C10, 0xA300, 0x03E4, 0x3E01, 0x8EB8, 0xBC20, 0x30BF,
- 0xA201, 0x0447, 0xFA10, 0x6852, 0x2902, 0xBC22, 0x30BB, 0xBC23, 0x30BD, 0x18D3, 0xA202,
- 0x0449, 0xFA64, 0x3491, 0x6835, 0x3A73, 0x8F65, 0xA202, 0x0448, 0x2153, 0x8F07, 0x3449,
- 0x3401, 0xA080, 0x4000, 0x4002, 0x8C5B, 0xA300, 0x0447, 0xBC20, 0x30C1, 0xA201, 0x03CF,
- 0xBC22, 0x30BA, 0x6114, 0x5FF5, 0x701F, 0x3A10, 0x4023, 0x6220, 0xDFDC, 0xB412, 0x0001,
- 0x2620, 0x8F04, 0x7000, 0x5FC1, 0xA301, 0x03CB, 0xA301, 0x03CC, 0xBC22, 0x30C0, 0xA201,
- 0x03D6, 0x3449, 0xFA52, 0x20CA, 0xA301, 0x03D6, 0x8F19, 0x4041, 0x0801, 0x2600, 0x8F13,
- 0x3E02, 0x4000, 0xA300, 0x0099, 0x3E01, 0xBC20, 0x2008, 0xBC21, 0xFF7F, 0xFA12, 0x0851,
- 0x7008, 0x3B11, 0xBC02, 0x05B3, 0x7010, 0x4FC0, 0x8C05, 0xA301, 0x009A, 0x8C02, 0x4060,
- 0xCFC0, 0x3302, 0x8F18, 0x3541, 0xBC21, 0x1111, 0x2829, 0x3200, 0x380E, 0x8F0D, 0x70F0,
- 0x4FF5, 0xBC22, 0x2042, 0xBC23, 0x2041, 0xBC24, 0xEEEF, 0xBC0D, 0x1681, 0xFB51, 0x6008,
- 0x3B70, 0x8C06, 0x4002, 0x8C04, 0x7000, 0x8FF5, 0x7000, 0x8FF5, 0xA302, 0x0448, 0x8EC0,
- 0xE9FE, 0xA302, 0x0449, 0xA200, 0x03CE, 0xB300, 0x6600, 0x4020, 0x3820, 0x8F00, 0xA200,
- 0x044A, 0x2681, 0xA300, 0x044A, 0x8F27, 0xA200, 0x03D2, 0x2600, 0xBC22, 0x2044, 0x4000,
- 0x1801, 0xFA53, 0x0118, 0xBC23, 0x2043, 0xFB54, 0xFA72, 0x0448, 0x0091, 0xA204, 0x03D5,
- 0xFB72, 0xB5C8, 0x0001, 0x0061, 0xA202, 0x044C, 0x004A, 0xBC23, 0x2042, 0xA204, 0x0448,
- 0xA300, 0x03D2, 0xBC22, 0x2041, 0xA205, 0x03CA, 0x0020, 0xFB71, 0xA300, 0x0448, 0xFB55,
- 0xBC00, 0x1612, 0x8EB8, 0xA201, 0x03D5, 0x3312, 0xA201, 0x03CE, 0x8F0A, 0xB312, 0x3F00,
- 0x8F07, 0xA202, 0x03D4, 0x224A, 0x8F04, 0x4001, 0x7008, 0x2441, 0xA300, 0x03D0, 0x8EB8,
- 0x2680, 0xA200, 0x03CF, 0x8F0A, 0xFA11, 0xB312, 0x0198, 0x8F05, 0xA201, 0x03D3, 0x1641,
- 0x40A2, 0x2E4A, 0x8F00, 0x3401, 0x3402, 0xBC21, 0x30BB, 0x2041, 0x8F04, 0x4000, 0xA300,
- 0x03D0, 0xBC20, 0x30B3, 0xA201, 0x03D0, 0x2611, 0x4001, 0x8F00, 0xFA11, 0xA300, 0x03CF,
- 0x8EC0, 0xB592, 0x0006, 0xA301, 0x03CE, 0x6EF5, 0x6080, 0xE906, 0x7007, 0x20C1, 0xA204,
- 0x03CE, 0x6313, 0x1F83, 0x65B0, 0x5FA2, 0x65C0, 0x1FE3, 0x7000, 0x9FC0, 0x4020, 0x4207,
- 0x5FE6, 0xBC23, 0xC6C0, 0xBC21, 0x6E40, 0x38A2, 0xBC0F, 0x1720, 0x2F68, 0x2F20, 0x8F00,
- 0x0D6B, 0x2FB0, 0x8F00, 0x0D69, 0x1785, 0x3491, 0x4044, 0x6815, 0x0FE4, 0x4147, 0x8FEE,
- 0x6E1D, 0x0FA2, 0xB036, 0xFFFB, 0x69A8, 0x5FE3, 0x8F08, 0xB42A, 0x0006, 0xBC23, 0x03FF,
- 0x0893, 0xA31C, 0x03D5, 0xDF62, 0xA302, 0x03D2, 0x7000, 0x8F83, 0xBC21, 0x7F80, 0x3882,
- 0xBD10, 0x174F, 0x2E90, 0x2F68, 0x2FB0, 0x8F0B, 0x26B1, 0x8F02, 0x09E9, 0x2670, 0x8F03,
- 0xBC26, 0x6E40, 0x0D6E, 0x8C03, 0x1785, 0x3521, 0x3491, 0x8E00, 0xCFA0, 0x2601, 0xBC20,
- 0x03FF, 0x8F27, 0xB41A, 0x0006, 0x0808, 0x2680, 0x8F01, 0x32C2, 0x8F00, 0x403C, 0x26B0,
- 0xDF7C, 0x8F12, 0xBC22, 0x30B3, 0x6E20, 0x8FC3, 0xBC21, 0x30BB, 0xBD04, 0x1772, 0xFA86,
- 0x6881, 0xBA86, 0x8F01, 0x2246, 0x8F03, 0x21E1, 0x1914, 0xA304, 0x03CF, 0x8E00, 0x8D0B,
- 0xCFC0, 0x6330, 0x8FE0, 0xA305, 0x03D4, 0xA304, 0x03D5, 0xBC02, 0x16C7, 0x8D01, 0xCFC3,
- 0x6EAF, 0x8F60, 0xA303, 0x03D3, 0x8EC0, 0xE9FA, 0xA305, 0x03D4, 0xB022, 0x3098, 0xA200,
- 0x03D2, 0x6980, 0x3A45, 0x8F26, 0x4343, 0x0519, 0x4003, 0xBC0C, 0x1799, 0xFA46, 0x0DAE,
- 0x2246, 0x8F01, 0x3882, 0x3803, 0x8E00, 0x2680, 0x8F18, 0x2610, 0x4046, 0x4022, 0x1996,
- 0x4205, 0x3290, 0x0569, 0xA306, 0x03D5, 0x8F02, 0x3250, 0x8F00, 0x14D5, 0xBC21, 0x30A9,
- 0x044C, 0x3210, 0x8F01, 0x1451, 0x00D9, 0xA201, 0x03D3, 0x0C4B, 0xA301, 0x03D3, 0x8EC0,
- 0xA300, 0x03D2, 0x8E00, 0xE904, 0xA201, 0x03CC, 0xA200, 0x03CD, 0x7000, 0x9F81, 0xB000,
- 0xFFFF, 0xA302, 0x03CE, 0x6984, 0x1FB5, 0x8F4C, 0x2680, 0x8F47, 0xA201, 0x03CF, 0x344A,
- 0xBC20, 0x30BB, 0x21C8, 0xBC20, 0x30B3, 0x1841, 0x6E18, 0x9FC1, 0xBC21, 0x03D7, 0xBC02,
- 0x1700, 0xA201, 0x03CF, 0x7000, 0x8FC0, 0xA204, 0x0444, 0x6882, 0x1FC1, 0x4023, 0x8F06,
- 0xB018, 0xFFFF, 0x6CC7, 0x9FC0, 0x6626, 0x9FE1, 0x8C20, 0xDF82, 0x3422, 0x6CE1, 0x1FE0,
- 0x181A, 0x2681, 0xA300, 0x03CB, 0x8F15, 0xBC20, 0x0444, 0x8A09, 0xE402, 0xFA31, 0xA21E,
- 0x03D3, 0xB592, 0x0006, 0xA302, 0x03D0, 0xA303, 0x03D1, 0xA302, 0x03D5, 0xA302, 0x03D2,
- 0xA301, 0x03CE, 0xA31E, 0x03CA, 0xBC02, 0x1690, 0xCFE2, 0xCFC1, 0xA302, 0x0444, 0xA301,
- 0x03CF, 0x8C26, 0x71A0, 0x0F85, 0x8C23, 0xCF85, 0x2600, 0x4681, 0x1848, 0x7008, 0x1FC1,
- 0x2C48, 0x401E, 0xBC21, 0x03D9, 0xBC20, 0x03D7, 0xA31E, 0x03CF, 0x1848, 0x3862, 0xBC02,
- 0x1700, 0xA202, 0x03CF, 0x6988, 0x0FC0, 0x4025, 0x8F09, 0x0885, 0x2620, 0x4006, 0x8F00,
- 0xBC02, 0x15FE, 0xA306, 0x0444, 0x8C02, 0x4680, 0xCF85, 0xCFB5, 0xA305, 0x03CC, 0x8EC0,
- 0xE9FC, 0xA300, 0x03CD, 0xE902, 0xA203, 0x03CD, 0xB036, 0xFFFF, 0x698C, 0x1FC3, 0xDFF5,
- 0xBC01, 0x190F, 0xA201, 0x03D1, 0x2690, 0xBC01, 0x1920, 0xB016, 0xFFE6, 0x4340, 0x2048,
- 0xBC01, 0x190A, 0xB306, 0x0019, 0xBC01, 0x18F4, 0xA201, 0x03D2, 0xB306, 0x0018, 0x8F7E,
- 0xB306, 0x0017, 0x8F4E, 0xCFC3, 0xB316, 0x0016, 0xBC01, 0x1920, 0xA203, 0x044B, 0x26B0,
- 0xBC01, 0x1920, 0x4023, 0x2610, 0xA303, 0x044B, 0x4002, 0x8F0F, 0xBC21, 0x03D7, 0xBC02,
- 0x1700, 0x2680, 0xA300, 0x03D2, 0x8F07, 0xA203, 0x0444, 0xA21E, 0x03D3, 0x34D9, 0xA31E,
- 0x03CA, 0xA303, 0x0444, 0xA203, 0x0444, 0xB236, 0x0080, 0x8F19, 0xA203, 0x0446, 0xB236,
- 0x0080, 0x7000, 0xCFC5, 0xBC21, 0x0444, 0x8F09, 0xA200, 0x0445, 0xB200, 0x0080, 0x8F12,
- 0x8A03, 0xE483, 0x3569, 0xBC02, 0x15FE, 0x8D0D, 0x8A03, 0xE483, 0xB05A, 0xFFFF, 0xBC02,
- 0x15FE, 0x8D06, 0x7000, 0xCFC5, 0xBC21, 0x0444, 0x8A03, 0xE483, 0xA200, 0x03D2, 0xDFC5,
- 0xBC02, 0x16DA, 0xBC02, 0x1690, 0x8D73, 0x2610, 0xBC21, 0x03D7, 0x8F24, 0xBC40, 0x1880,
- 0x4023, 0x2E03, 0xBC40, 0x1C80, 0x4002, 0x185A, 0xA200, 0x03D9, 0x2E03, 0x0001, 0xA300,
- 0x03D9, 0xBC21, 0x03D9, 0x441A, 0xBC02, 0x1700, 0x2680, 0xA300, 0x03D2, 0x8F0B, 0xA203,
- 0x0445, 0xA201, 0x03D3, 0x34D9, 0xA301, 0x03CA, 0xA31A, 0x044C, 0xA303, 0x0445, 0x8C04,
- 0x4003, 0x8C02, 0x4003, 0x4003, 0x8C47, 0xA303, 0x044B, 0x2610, 0xBC21, 0x03D9, 0x4002,
- 0x4023, 0x8F3D, 0xBC02, 0x1700, 0x2680, 0xA300, 0x03D2, 0x8F37, 0xA203, 0x0446, 0x441E,
- 0xA201, 0x03D3, 0x34D9, 0xA301, 0x03CA, 0xA31E, 0x044C, 0xA303, 0x0446, 0x8D2C, 0xA203,
- 0x03D4, 0x2630, 0xBC20, 0x03D2, 0x8F00, 0xBC02, 0x16C7, 0xA203, 0x03D2, 0x26B0, 0x8F1E,
- 0xA203, 0x0444, 0xA21E, 0x03D3, 0x34D9, 0xA31E, 0x03CA, 0xA303, 0x0444, 0x8D16, 0x4661,
- 0x044B, 0xBC02, 0x1787, 0x8D11, 0xA200, 0x03D7, 0x4010, 0x4023, 0xA300, 0x03CA, 0xA310,
- 0x03D1, 0xBC21, 0x03D7, 0x3843, 0xBC02, 0x1700, 0x4683, 0xA310, 0x044C, 0xDFC3, 0xCFF5,
- 0xCFC3, 0x8EC0, 0xE9FE, 0xA303, 0x03CD, 0xE902, 0x8E00, 0xDFD5, 0x3E02, 0xA200, 0x03E3,
- 0x7000, 0x5FE0, 0xA301, 0x03E3, 0x2600, 0x8F12, 0xA200, 0x03CB, 0x2680, 0x8F02, 0xA200,
- 0x03CC, 0x2600, 0x8F02, 0xA200, 0x03CD, 0x2681, 0x8F06, 0xBC20, 0x03E5, 0xBC21, 0x03D7,
- 0xBD04, 0x1945, 0xE002, 0xE482, 0x3E01, 0x8C0E, 0xCFE0, 0xA200, 0x03CB, 0x2601, 0x8F02,
- 0xBC02, 0x17B9, 0x8C04, 0xCFE0, 0xBC02, 0x183D, 0xCFE0, 0xB000, 0xFFFF, 0x69A0, 0x1FE0,
- 0x8FEF, 0xCFD5, 0x8E00, 0x8EC0, 0xE9FE, 0x8E00, 0xBC20, 0x2048, 0x8E00, 0xFA10, 0x2600,
- 0x8F06, 0xBC20, 0x2043, 0xBC22, 0x2044, 0x4001, 0x8EC0, 0xFB11, 0xFB51, 0x8EB8, 0xA201,
- 0x03E1, 0xBC22, 0x3079, 0xFA20, 0xB030, 0xFFD8, 0xB302, 0x308C, 0xA303, 0x03EE, 0x8EC0,
- 0x1851, 0xA301, 0x03E1, 0xA203, 0x03E3, 0x34D9, 0xA200, 0x03FD, 0x5FFA, 0xBC3C, 0x03FA,
- 0x407E, 0xA303, 0x03E3, 0x7009, 0x2461, 0x6CE4, 0x3C1E, 0x4003, 0xA205, 0x03E4, 0x19E3,
- 0x0C95, 0x2131, 0x6555, 0x2042, 0x1863, 0xA300, 0x03FD, 0x33A0, 0xB05A, 0x03E6, 0x1823,
- 0x637E, 0x22C0, 0x2E04, 0xB5FE, 0x0005, 0x01C7, 0x6678, 0xE6A7, 0x684C, 0xA2C2, 0x18E3,
- 0x0C0B, 0x2E94, 0x8EC0, 0x0097, 0xE6C2, 0xA200, 0x03DB, 0xBC3C, 0x03DC, 0x409E, 0x405A,
- 0xBC22, 0x03EA, 0x77FE, 0xAA18, 0xE05F, 0xBC23, 0x308C, 0xE51F, 0xBD03, 0x19C3, 0x6910,
- 0xBC1C, 0xFA65, 0x8A03, 0xBBB0, 0xCA1C, 0x28EC, 0x88C0, 0x8E00, 0xE504, 0x8EC0, 0xEA18,
- 0xA300, 0x03DB, 0xBC26, 0x03E2, 0xA202, 0x03E9, 0xE343, 0x698C, 0x2902, 0xA203, 0x03E0,
- 0xBC01, 0x1A6F, 0xA204, 0x03F6, 0x69B0, 0x5FD5, 0x3883, 0x8F02, 0x4004, 0xA304, 0x03F6,
- 0x3342, 0x8F68, 0xBC26, 0x03F7, 0x602D, 0x215F, 0x26C0, 0xE55F, 0x8F61, 0x6E11, 0xBCC5,
- 0x6CF4, 0x2341, 0x4004, 0x4026, 0x19B4, 0x3210, 0x8F00, 0x35B1, 0xBC40, 0x1102, 0x3220,
- 0x8F00, 0x35B1, 0x2663, 0xA207, 0x03F1, 0x8F01, 0x26E0, 0x8F09, 0x2435, 0x2429, 0x2412,
- 0x20B5, 0x8F00, 0x35F9, 0x2095, 0x8F00, 0xB07E, 0xFFFF, 0xA202, 0x03F2, 0x3551, 0xB20A,
- 0x004C, 0x3844, 0x8F0B, 0xB23E, 0x0008, 0x38A7, 0x4024, 0x38E2, 0x8F05, 0x38E5, 0x3378,
- 0x3882, 0x8F01, 0x5FE4, 0x38E2, 0x38A2, 0x00E3, 0xA305, 0x03F2, 0xA307, 0x03F1, 0xDFE3,
- 0xBC02, 0x197C, 0xA203, 0x03F5, 0xA202, 0x03F3, 0x6056, 0x0FE4, 0x3491, 0xB438, 0x0001,
- 0xA305, 0x03F5, 0xB204, 0x0208, 0x8F14, 0xA202, 0x03F5, 0xA205, 0x03F4, 0xB524, 0x0001,
- 0x20AA, 0x401D, 0x8F06, 0xA202, 0x03E4, 0x4024, 0x0C94, 0x3883, 0xA302, 0x03E4, 0x4643,
- 0xA31D, 0x03F5, 0xA31D, 0x03F4, 0x4002, 0xA303, 0x03EF, 0xA302, 0x03F3, 0xA202, 0x03EF,
- 0x2222, 0x8F09, 0x3491, 0x2262, 0x8F11, 0xA202, 0x03E9, 0x8E00, 0xE142, 0xA302, 0x03F0,
- 0x8D0C, 0xA201, 0x03F0, 0x7008, 0x9FE4, 0xBC02, 0x197C, 0xA202, 0x03F4, 0x6024, 0x0FE4,
- 0xA302, 0x03F4, 0xB008, 0xFFFF, 0x69A0, 0x0FD5, 0x8F79, 0x700F, 0xDFD5, 0xBC02, 0x196D,
- 0xA31F, 0x03F6, 0xCFD5, 0x8D73, 0x7766, 0xE145, 0xA202, 0x03F0, 0x3822, 0xBC3D, 0x03F1,
- 0x453F, 0xA204, 0x0442, 0x69AC, 0x64E5, 0x6E28, 0x6A38, 0x8F02, 0xA207, 0x03EE, 0x26F0,
- 0x8F15, 0xE142, 0xE2C5, 0x6175, 0x60C2, 0x615A, 0xA242, 0x243F, 0x242D, 0x017D, 0xB05A,
- 0x0008, 0xB4DA, 0x0004, 0x356A, 0xB4DA, 0x0002, 0x016A, 0x206A, 0x5FE2, 0x1955, 0x8C02,
- 0xE605, 0x5FE2, 0xB006, 0xFFFF, 0x2680, 0x8F3F, 0xA203, 0x0443, 0x34D9, 0xA303, 0x0443,
- 0xB236, 0x00F0, 0x8F08, 0xDFC1, 0xDFF5, 0xBC24, 0x041A, 0xBC02, 0x196D, 0xCFF5, 0x8C31,
- 0xCFC1, 0xBC24, 0x041A, 0x4003, 0x6E38, 0xE200, 0x4005, 0xA071, 0xC000, 0xBD27, 0x1ABA,
- 0x6659, 0x6200, 0xA071, 0xC000, 0x1965, 0xA207, 0x03EE, 0xB0DA, 0x041A, 0x003D, 0xB450,
- 0x0001, 0xA305, 0x03EF, 0x26D0, 0x4685, 0x4667, 0x405F, 0x19EF, 0xE71F, 0xA307, 0x03CD,
- 0xBC25, 0x03F0, 0x8A06, 0xE703, 0x8A0A, 0xE683, 0x8A03, 0xE682, 0xBC3F, 0x03FA, 0xA303,
- 0x03CC, 0xA31F, 0x03FD, 0xA303, 0x03CB, 0xA304, 0x0442, 0xA301, 0x03F0, 0xE9FE, 0xA300,
- 0x03E0, 0xA202, 0x03E9, 0x8EC0, 0x3491, 0xA302, 0x03E9, 0x0000, 0xE902, 0xA201, 0x03DB,
- 0xDFD5, 0x6960, 0x24C0, 0xBC02, 0x19AA, 0xBC20, 0x03EA, 0xA300, 0x03E9, 0xBD04, 0x1AFD,
- 0xBC02, 0x19C8, 0x8E00, 0x8E00, 0xCFD5, 0x8E00, 0x8EC0, 0xE9FE, 0x8E00, 0xE902, 0xA200,
- 0x0466, 0x6980, 0x1FC0, 0xBC01, 0x1BB4, 0xB310, 0x00FF, 0xBC01, 0x1BBA, 0xA201, 0x0468,
- 0xA202, 0x0467, 0xB034, 0xFFFF, 0x3310, 0xBC20, 0x0450, 0xBC01, 0x1BAA, 0x3880, 0x4021,
- 0xE20E, 0xE24F, 0xBC24, 0x3002, 0x88D8, 0xFA94, 0xBCDB, 0x0000, 0xBC24, 0x3009, 0x2435,
- 0xFA94, 0x2134, 0x4004, 0x19CC, 0xA307, 0x0465, 0xBC27, 0x3013, 0xA305, 0x0464, 0xFAF7,
- 0x21B7, 0x198C, 0x26E0, 0x8F04, 0xBC26, 0x2004, 0x8E00, 0xFAD6, 0x2660, 0x8F03, 0xA206,
- 0x046A, 0x35B1, 0xA306, 0x046A, 0xBC27, 0x3011, 0xA206, 0x0469, 0x35B1, 0xFAF7, 0x2037,
- 0xA306, 0x0469, 0x8F0F, 0xBC26, 0x3012, 0xA207, 0x046A, 0xFAD6, 0x21BE, 0x8F03, 0x8E00,
- 0x8C04, 0xA304, 0x046B, 0xA301, 0x046B, 0xA304, 0x046A, 0xA304, 0x0469, 0xBC26, 0x300A,
- 0x8E00, 0xFAD6, 0x212E, 0x0526, 0x19B5, 0x202C, 0xBC25, 0x2017, 0x1926, 0x6CA8, 0x3AB2,
- 0xBC25, 0x3006, 0x8F02, 0xA303, 0x0467, 0xBC25, 0x3003, 0xBC23, 0x300C, 0x8E00, 0xFA73,
- 0x2013, 0x8F13, 0xBC26, 0x300D, 0x34E9, 0xFAD6, 0x2016, 0x8F0C, 0xBC26, 0x300E, 0x8E00,
- 0xFAD6, 0x2016, 0x8F05, 0xBC26, 0x300F, 0x8E00, 0xFAD6, 0x2016, 0x8C02, 0x18DD, 0x34EA,
- 0x38A3, 0x2442, 0xFAB2, 0x28E2, 0x88A0, 0xBC23, 0x300B, 0xB524, 0x0006, 0xFA73, 0xB424,
- 0x0006, 0x32B0, 0x8F01, 0x4003, 0x049A, 0xBC23, 0x2020, 0xB524, 0x0001, 0xFA73, 0x0859,
- 0x2690, 0xBC23, 0x2003, 0x8F02, 0x4001, 0x8C0C, 0xFB71, 0x3451, 0x8C09, 0x7000, 0x7B71,
- 0xB012, 0xFFFF, 0xA301, 0x0468, 0xA303, 0x0467, 0x4001, 0xE401, 0xE441, 0x8D06, 0xBC20,
- 0x2003, 0x5FC1, 0xFA12, 0x0851, 0xFB11, 0xCFC0, 0x3401, 0xE9FE, 0xBC21, 0x00FF, 0x8EC0,
- 0x0801, 0xA300, 0x0466, 0xE904, 0xBC21, 0x2016, 0x6E05, 0x1FD5, 0xB000, 0xFFFD, 0xBC22,
- 0x3000, 0xFA31, 0x7000, 0x6441, 0xFA52, 0xBC23, 0x044D, 0xBC24, 0x044F, 0xBC02, 0x1E36,
- 0xA200, 0x044F, 0x7003, 0x0FD5, 0xBC22, 0x4444, 0x6915, 0xE9FC, 0x2456, 0x28C2, 0xBC20,
- 0x3001, 0x8890, 0xBC22, 0x0450, 0x6910, 0xBA10, 0x28C8, 0x6E00, 0xBC41, 0x88B4, 0x7101,
- 0x2145, 0x24A9, 0x28DC, 0x2444, 0x8EC0, 0xE54F, 0xE44E, 0xBC21, 0x3033, 0xBC22, 0x201E,
- 0xB580, 0x0001, 0xFA31, 0x4043, 0xFA54, 0x0923, 0xB012, 0xFFFF, 0x2220, 0x8F01, 0x3310,
- 0x8FF7, 0x8EB8, 0xA200, 0x0470, 0x3280, 0xBC21, 0x0477, 0xBC22, 0x0474, 0x184A, 0xA202,
- 0x046D, 0xBC40, 0x1083, 0x6CE8, 0xE084, 0x66B7, 0x20C1, 0x8F04, 0xB044, 0x3014, 0x8E00,
- 0xFA94, 0x211C, 0x8F0B, 0x32A0, 0xB044, 0xFFFF, 0x8F07, 0xB058, 0x3017, 0x8E00, 0xFAB5,
- 0x219D, 0x8F02, 0x3844, 0x8D01, 0x3491, 0xB034, 0x301A, 0xA302, 0x046D, 0xFA73, 0xBC22,
- 0x3023, 0x1A59, 0x2419, 0xFA52, 0x211A, 0x8F05, 0x3300, 0x8F02, 0xBC20, 0x301F, 0x8C05,
- 0xFA10, 0xBC20, 0x301E, 0x8E00, 0xFA10, 0x4202, 0x0490, 0xA203, 0x0473, 0x2442, 0x28DA,
- 0x28C8, 0x8884, 0xBC21, 0x0200, 0xBC90, 0x4000, 0xBC22, 0x0800, 0xBC80, 0x8000, 0xBC22,
- 0x3024, 0x2690, 0x4004, 0xA203, 0x0454, 0x1820, 0xFA52, 0x0E4B, 0x210A, 0xA300, 0x0473,
- 0x8F04, 0xBC20, 0x3025, 0x8E00, 0xFA10, 0x2008, 0x1881, 0x8EC0, 0xA302, 0x0454, 0x8E00,
- 0xBC20, 0x200F, 0xA201, 0x046E, 0xFA10, 0x2680, 0x8F00, 0x3449, 0x2682, 0x4000, 0x8F00,
- 0xB012, 0xFFFF, 0x3210, 0x8F02, 0x3317, 0x40E0, 0x1801, 0x8EC0, 0xA300, 0x046E, 0x8E00,
- 0xBC20, 0x3031, 0xBC21, 0x2000, 0xFA12, 0x0811, 0x2241, 0xA200, 0x046E, 0x8F03, 0x4E00,
- 0x0810, 0xB400, 0x0004, 0xB010, 0x3026, 0xA203, 0x0454, 0xFA31, 0xBC24, 0x1000, 0x0994,
- 0x1AD9, 0x2274, 0x34D9, 0x4025, 0x111D, 0x8F01, 0x41E3, 0x0913, 0x4002, 0x3240, 0x3862,
- 0x8F02, 0x4103, 0x2123, 0x18DC, 0xB5C6, 0x0001, 0xBC26, 0x302E, 0x0E4C, 0x6980, 0x3AD6,
- 0xBC24, 0x200B, 0xB5F0, 0x0004, 0xA303, 0x046F, 0x1895, 0x0E4E, 0xA300, 0x046E, 0x00FB,
- 0x6988, 0x3B91, 0x8F01, 0x2681, 0x8F00, 0x4002, 0x2620, 0x8F01, 0x2682, 0x8F00, 0x4002,
- 0x2620, 0x8F01, 0x2683, 0x8F00, 0x4002, 0x2620, 0x8F40, 0x2604, 0x8F3E, 0x2620, 0x8F01,
- 0x2685, 0x8F00, 0x4002, 0x2620, 0x8F33, 0x2606, 0x8F31, 0x2620, 0x8F01, 0x2687, 0x8F33,
- 0xBC20, 0x2005, 0xBC21, 0x0200, 0xFA10, 0x0801, 0x2680, 0x8F20, 0xA200, 0x0452, 0x2602,
- 0x8F11, 0x2603, 0x8F03, 0x4060, 0x8C25, 0xA300, 0x0452, 0xBC20, 0x3036, 0xBC21, 0x2081,
- 0xFA10, 0xFA31, 0x2088, 0x4040, 0x8F18, 0xA300, 0x0452, 0x8D17, 0xBC20, 0x3037, 0xBC21,
- 0x2081, 0xFA10, 0xFA31, 0x2188, 0x4060, 0x8F0C, 0xA300, 0x0452, 0x8D0B, 0x4060, 0xA300,
- 0x0452, 0x8D07, 0x4020, 0x8C05, 0xA300, 0x0452, 0x4000, 0xA300, 0x0452, 0xA200, 0x0452,
- 0xB000, 0x3039, 0xBC21, 0x2006, 0xFA10, 0x8EC0, 0x0003, 0xFB30, 0xA200, 0x0474, 0xA201,
- 0x0453, 0xB500, 0x0007, 0xBC22, 0x302F, 0x1AC8, 0x241B, 0xFA52, 0x211A, 0x8F02, 0xBC22,
- 0x3021, 0x8C05, 0xFA52, 0xBC22, 0x3020, 0x8E00, 0xFA52, 0xA204, 0x046C, 0xBC23, 0x8000,
- 0x04DA, 0x3340, 0x2457, 0x2456, 0x8F04, 0x2454, 0x28CB, 0x28C2, 0x8C03, 0x8880, 0xA30E,
- 0x046C, 0xBC21, 0x3030, 0xBC22, 0x3032, 0xA300, 0x0453, 0xFA31, 0xFA52, 0xBC23, 0x1000,
- 0x0913, 0x1A08, 0xBC25, 0x0400, 0x2263, 0xBC81, 0x4000, 0x8F01, 0xBC20, 0x0FFF, 0x0810,
- 0xBC21, 0x200C, 0x8EC0, 0x8E00, 0xFB30, 0x0000, 0xBC20, 0x3022, 0xBC21, 0x3038, 0x7017,
- 0xBA10, 0x700C, 0x3A31, 0xA310, 0x046C, 0xA31E, 0x0470, 0xA300, 0x0454, 0xA301, 0x0452,
- 0x6EE5, 0x6800, 0xBD0F, 0x1D81, 0xBC20, 0x3034, 0xBC21, 0x2005, 0xFA10, 0xB000, 0x0301,
- 0x7008, 0x3B30, 0xBC02, 0x1BF3, 0xBC02, 0x1C65, 0xBC02, 0x1C7B, 0xBC20, 0x3034, 0xBC21,
- 0x2005, 0xFA10, 0xB000, 0x0201, 0x7000, 0x3B30, 0xBC02, 0x1BF3, 0x8E00, 0x8E00, 0xBC20,
- 0x3034, 0xBC21, 0x2005, 0xFA10, 0xB000, 0x0301, 0x7008, 0x3B30, 0xBC02, 0x1BF3, 0xBC02,
- 0x1C65, 0xBC02, 0x1C7B, 0xA201, 0x046E, 0xBC20, 0x3034, 0xB012, 0x3026, 0x6EAF, 0x3A10,
- 0xBC22, 0x3035, 0xBC23, 0x2005, 0xFA31, 0xB000, 0x0201, 0xFA52, 0xA301, 0x0454, 0xFB70,
- 0xBC24, 0x2009, 0x8EC0, 0x7008, 0x3B72, 0xFB90, 0xE902, 0xA200, 0x0470, 0x6CC0, 0x1FD5,
- 0x8F34, 0xA200, 0x0472, 0xA201, 0x0471, 0x2680, 0x8F0F, 0xB312, 0x007F, 0xBC20, 0x3035,
- 0x8F07, 0xFA10, 0xB000, 0x0101, 0xBC21, 0x2005, 0x8C03, 0x7008, 0x3B30, 0x4020, 0x8C1E,
- 0xA300, 0x0472, 0xB232, 0x007F, 0x4000, 0x8F00, 0x3409, 0x3300, 0xA300, 0x0471, 0x8F0A,
- 0xBC02, 0x1C65, 0xBC02, 0x1C7B, 0xBC20, 0x3035, 0xBC21, 0x2005, 0xFA10, 0x8C07, 0x7000,
- 0x3B30, 0xBC02, 0x1C04, 0xBC02, 0x1C7B, 0x4000, 0xA300, 0x0472, 0xBC02, 0x1D12, 0x8D13,
- 0xBC02, 0x1C04, 0xBC02, 0x1C7B, 0xA200, 0x0470, 0xB000, 0xFFFF, 0xA201, 0x0471, 0xA300,
- 0x0470, 0xB232, 0x007F, 0x4000, 0x8F00, 0x3409, 0xA300, 0x0471, 0x7008, 0x4FD5, 0xBC20,
- 0x2009, 0x8EC0, 0xE9FE, 0xFB11, 0xBC21, 0x2010, 0xE908, 0xBC20, 0x200E, 0xFA31, 0xFA12,
- 0xBC24, 0x7F00, 0x6E1D, 0x1F95, 0xB036, 0xFFF9, 0x0894, 0xB444, 0x0008, 0x6E10, 0xE581,
- 0xFA10, 0x73F8, 0x65C4, 0x0801, 0xBC21, 0x0474, 0xBC40, 0x1500, 0xDFA1, 0xBD03, 0x1E2E,
- 0xE0DC, 0xE101, 0xDFC2, 0xDFFC, 0xBC02, 0x1E46, 0xCFE1, 0x63A0, 0x4FA1, 0x6D34, 0x4FC2,
- 0x6E20, 0x6480, 0xB406, 0x0001, 0xBC40, 0x1E00, 0xDFA1, 0x7000, 0x0F95, 0xBC21, 0x2009,
- 0x8EC0, 0xE9F8, 0xFB30, 0xE040, 0x6C00, 0x6246, 0x6E08, 0xE185, 0x6681, 0xA1C6, 0x24B5,
- 0x28C2, 0x2444, 0x8E00, 0xE5CF, 0x88B8, 0x8EC0, 0xE4CE, 0xE643, 0x3291, 0x8F0C, 0x24C1,
- 0x1448, 0x41A2, 0x2442, 0x4403, 0x0410, 0x28CB, 0xB580, 0x0004, 0x8890, 0x8EC0, 0x0001,
- 0x8E00, 0x8EC0, 0x4000, 0x8E00, 0xBC20, 0x2092, 0x4041, 0xFA10, 0xBC22, 0x2093, 0x0841,
- 0x6984, 0xBA51, 0x8F0F, 0x4022, 0x0802, 0x2681, 0x8F17, 0xBC20, 0x2000, 0x21C8, 0xBC20,
- 0x2095, 0x8F02, 0x8EC0, 0xE0C1, 0xFB11, 0xFA31, 0xFB11, 0x8EB8, 0xBC20, 0x2094, 0xBC22,
- 0x2000, 0x6872, 0xBA10, 0x8F02, 0x8EC0, 0xE4C0, 0x8E00, 0x8EC0, 0xFB30, 0x8E00, 0x8EB8,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000
-};
-#endif
-
-const unsigned short bin_patch_E1[] = {
- 0x2000, 0x21FF, 0xBC24, 0x20A0, 0x8E00, 0xFA95, 0xB30A, 0x06AF, 0x8F2E, 0xB30A, 0x08E5,
- 0x8F07, 0xBC25, 0x08E5, 0xFB95, 0xBC22, 0x399E, 0xBC23, 0x199E, 0xBC00, 0x0841, 0xBC25,
- 0x06AF, 0xFB95, 0x5400, 0xBC21, 0xD0B1, 0xBC02, 0x07CA, 0x5500, 0xBC21, 0x07C2, 0xBC02,
- 0x07CA, 0x40A0, 0xBC21, 0x0359, 0xBC02, 0x07CA, 0x41A0, 0xBC21, 0x00A0, 0xBC02, 0x07CA,
- 0x41C0, 0xBC21, 0x4208, 0xBC02, 0x07CA, 0x4380, 0xBC21, 0x2800, 0xBC02, 0x07CA, 0x4E04,
- 0xBC00, 0x08E6, 0x4344, 0xBC25, 0x0400, 0x2620, 0x8F06, 0xBC02, 0x07F0, 0x5404, 0x4025,
- 0xBC02, 0x07FB, 0xBC00, 0x06C1, 0xBC02, 0x07FB, 0x5404, 0x4025, 0xBC02, 0x07F0, 0xBC00,
- 0x06C1, 0xBDC8, 0x404E, 0x8E00, 0xFA11, 0xBC00, 0x0630, 0x8E00, 0x8E00, 0x8E00, 0xBC21,
- 0x0002, 0xBC20, 0x2008, 0xBC00, 0x01BB, 0xBC21, 0x033F, 0xA202, 0x0083, 0xFB11, 0x8EA2,
- 0xBC20, 0x2008, 0x7010, 0x4FF5, 0xBC22, 0x201A, 0xBC00, 0x0161, 0x4044, 0xBC25, 0x1000,
- 0xBC02, 0x07F0, 0x4E24, 0xBC00, 0x0705, 0xBC22, 0x399E, 0xBC23, 0x199E, 0xBC00, 0x078A,
- 0xBC24, 0x2080, 0x6C88, 0x3A10, 0xFA94, 0xB548, 0x0005, 0xBC00, 0x0E9F, 0xE902, 0xBC26,
- 0x2023, 0xDFE4, 0xBC24, 0x2000, 0xFAD6, 0x0934, 0x26C0, 0x8F01, 0xBC26, 0x3056, 0x8D02,
- 0xBC26, 0x31F9, 0xCFE4, 0xE9FE, 0xBC00, 0x0FED, 0xBC20, 0x2090, 0xBC21, 0x0100, 0xFA12,
- 0xE902, 0x0851, 0x6984, 0x1FD5, 0x8F37, 0x8E00, 0x8D03, 0x8E00, 0xBC20, 0x2090, 0xBC21,
- 0x8000, 0xFA10, 0x0801, 0x2600, 0x8FF5, 0xBC20, 0x2090, 0xBC21, 0x2091, 0x714F, 0xBA10,
- 0xBC22, 0x666D, 0x7028, 0xBB32, 0x71F8, 0xBB32, 0xA203, 0x0457, 0x0802, 0xA204, 0x0458,
- 0x6980, 0x3B33, 0xFB34, 0xBC22, 0x2545, 0xA31E, 0x0459, 0xFB32, 0x8F0C, 0x2601, 0x4FE1,
- 0x8F0D, 0x2602, 0xBC21, 0x0380, 0x8F09, 0x2683, 0x4001, 0x8F05, 0xBC02, 0x40E7, 0x8D04,
- 0xBC21, 0x03FF, 0xA301, 0x0456, 0xA301, 0x0455, 0xA200, 0x0458, 0xA201, 0x0457, 0x260F,
- 0x8F02, 0x8E00, 0x8C03, 0x3401, 0x3449, 0x4000, 0xCFD5, 0xA300, 0x0458, 0x8EC0, 0xE9FE,
- 0xA301, 0x0457, 0xBC22, 0x3105, 0xA200, 0x0313, 0x77DE, 0xBA52, 0x3BC2, 0xBC22, 0x2091,
- 0xBC3C, 0x02E0, 0xBC23, 0x666D, 0x7000, 0xFB53, 0x700E, 0xAA18, 0xBC24, 0x0B12, 0xFB54,
- 0x6D36, 0x7C1C, 0x6C8D, 0x7B54, 0x8FF9, 0xA203, 0x0355, 0xFB53, 0xA203, 0x035A, 0xFB53,
- 0xA203, 0x0464, 0xBC24, 0x2004, 0xFB53, 0xFA94, 0xA203, 0x047F, 0xFB54, 0xFB53, 0xA204,
- 0x0480, 0xFB54, 0xA203, 0x0481, 0xFB53, 0xA204, 0x0361, 0xA203, 0x0362, 0xFB54, 0xFB53,
- 0xBC23, 0x5A5A, 0xFB53, 0x8EC0, 0xBC23, 0x2545, 0xFB53, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000
-};
-
-const unsigned short bin_patch_E2[] = {
- 0x2000, 0x21FF, 0x8E00, 0x8E00, 0x8E00, 0xBC21, 0x0002, 0xBC20, 0x2008, 0xBC00, 0x01A9,
- 0xBC21, 0x033F, 0xA202, 0x0083, 0xFB11, 0x8EA2, 0xBC20, 0x2008, 0x7010, 0x4FF5, 0xBC22,
- 0x201A, 0xBC00, 0x014F, 0x240C, 0xA301, 0x047F, 0xA30F, 0x0480, 0xA30E, 0x0481, 0xBC00,
- 0x1353, 0x5380, 0xBC21, 0xAC40, 0xBC02, 0x07EA, 0x4380, 0xBC21, 0x2C00, 0xBC02, 0x07EA,
- 0x43A0, 0xBC21, 0xFB40, 0xBC02, 0x07EA, 0x43C0, 0xBC21, 0x0546, 0xBC02, 0x07EA, 0x43E0,
- 0xBC21, 0xFB3C, 0xBC02, 0x07EA, 0x4400, 0xBC21, 0x0537, 0xBC02, 0x07EA, 0x4E04, 0xBC00,
- 0x092A, 0x4025, 0xBC21, 0x2023, 0xBC22, 0x0400, 0xFA31, 0x084A, 0x2610, 0x8F01, 0xBC02,
- 0x081B, 0x8D02, 0xBC02, 0x0810, 0x4E24, 0xBC00, 0x0722, 0x4280, 0xBC02, 0x07EA, 0xBC22,
- 0x8018, 0xBC23, 0x8098, 0xCFE0, 0x2600, 0x1853, 0x42C0, 0xBC02, 0x07EA, 0x4240, 0xBC21,
- 0xE400, 0xBC02, 0x07EA, 0x4260, 0xBC21, 0x0010, 0xBC02, 0x07EA, 0x4040, 0xBC21, 0x0FFB,
- 0xBC02, 0x07EA, 0x4220, 0xBC21, 0x2020, 0xBC02, 0x07EA, 0xBC20, 0x0005, 0x4461, 0xBC02,
- 0x07F8, 0x4220, 0xBC21, 0x1020, 0xBC02, 0x07EA, 0xBC20, 0x0005, 0x4461, 0xBC02, 0x07F8,
- 0x4220, 0xBC21, 0x4020, 0xBC02, 0x07EA, 0xBC20, 0x0064, 0x4461, 0xBC02, 0x07F8, 0x4240,
- 0xBC21, 0xE407, 0xBC02, 0x07EA, 0x4260, 0xBC21, 0x7010, 0xBC02, 0x07EA, 0xBC20, 0x0064,
- 0x4461, 0xBC02, 0x07F8, 0x4520, 0xBC21, 0x8001, 0xBC02, 0x07EA, 0xBC00, 0x0794, 0xBC20,
- 0x2090, 0xBC21, 0x0100, 0xFA12, 0xE902, 0x0851, 0x6984, 0x1FD5, 0x8F37, 0x8E00, 0x8D03,
- 0x8E00, 0xBC20, 0x2090, 0xBC21, 0x8000, 0xFA10, 0x0801, 0x2600, 0x8FF5, 0xBC20, 0x2090,
- 0xBC21, 0x2091, 0x714F, 0xBA10, 0xBC22, 0x666D, 0x7028, 0xBB32, 0x71F8, 0xBB32, 0xA203,
- 0x045B, 0x0802, 0xA204, 0x045C, 0x6980, 0x3B33, 0xFB34, 0xBC22, 0x2545, 0xA31E, 0x045D,
- 0xFB32, 0x8F0C, 0x2601, 0x4FE1, 0x8F0D, 0x2602, 0xBC21, 0x0380, 0x8F09, 0x2683, 0x4001,
- 0x8F05, 0xBC02, 0x40F6, 0x8D04, 0xBC21, 0x03FF, 0xA301, 0x045A, 0xA301, 0x0459, 0xA200,
- 0x045C, 0xA201, 0x045B, 0x260F, 0x8F02, 0x8E00, 0x8C03, 0x3401, 0x3449, 0x4000, 0xCFD5,
- 0xA300, 0x045C, 0x8EC0, 0xE9FE, 0xA301, 0x045B, 0xBC22, 0x3105, 0xA200, 0x0314, 0x77DE,
- 0xBA52, 0x3BC2, 0xBC22, 0x2091, 0xBC3C, 0x02E1, 0xBC23, 0x666D, 0x7000, 0xFB53, 0x700E,
- 0xAA18, 0xBC24, 0x0B12, 0xFB54, 0x6D36, 0x7C1C, 0x6C8D, 0x7B54, 0x8FF9, 0xA203, 0x0356,
- 0xFB53, 0xA203, 0x035D, 0xFB53, 0xA203, 0x0468, 0xBC24, 0x2004, 0xFB53, 0xFA94, 0xA203,
- 0x0483, 0xFB54, 0xFB53, 0xA204, 0x0484, 0xFB54, 0xA203, 0x0485, 0xFB53, 0xA204, 0x0364,
- 0xA203, 0x0365, 0xFB54, 0xFB53, 0xBC23, 0x5A5A, 0xFB53, 0x8EC0, 0xBC23, 0x2545, 0xFB53,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000
-};
-
-const unsigned short bin_coeff_E1[] = {
- 0x0000, 0x01FF, 0x0400, 0x0006, 0x2AAB, 0x0324, 0x0324, 0x0324, 0x010C, 0x010C, 0x010C,
- 0x1111, 0x1259, 0x0001, 0x005A, 0x0E9B, 0x0FFF, 0x0FFF, 0x0008, 0x0001, 0x0001, 0x0CCD,
- 0xFFE0, 0xFFD8, 0x00FF, 0xFFAC, 0xFFBC, 0xFF00, 0x0020, 0x0048, 0x0050, 0x0050, 0x000E,
- 0x0002, 0x7000, 0x0800, 0xFFF8, 0x0008, 0x002B, 0xFFF6, 0xFFF8, 0xFFFE, 0x0003, 0x0008,
- 0x000D, 0x000F, 0x0014, 0x0019, 0x0000, 0x0800, 0x6580, 0x0000, 0x0000, 0x7FFF, 0x0008,
- 0x0078, 0xFEF5, 0xFEE8, 0x0003, 0x0080, 0x0080, 0x0080, 0x0300, 0x0006, 0xC080, 0xF000,
- 0x0660, 0xDA80, 0x0000, 0x0001, 0x0001, 0xFFE4, 0xFFE8, 0x0080, 0x0034, 0x0001, 0xFFFF,
- 0x0001, 0xFFFE, 0x3AC0, 0x3340, 0x2BC0, 0x07C0, 0x05C0, 0x03E0, 0x0008, 0x1000, 0x2000,
- 0xFF01, 0xFFE5, 0xFFE9, 0x0DA8, 0x000E, 0xF75E, 0x1136, 0xEC7B, 0x0D3C, 0xFA9A, 0xFC47,
- 0xF58B, 0x1055, 0x3DDA, 0x3DDA, 0x1055, 0xF58B, 0xFC47, 0x1B17, 0x362A, 0x1B17, 0x67DA,
- 0xA798, 0xFDA6, 0xF8BE, 0xF36E, 0xF0D4, 0xF368, 0xFB18, 0x04E8, 0x0C98, 0x0F2C, 0x0C92,
- 0x0742, 0x025A, 0x0028, 0x0029, 0x0028, 0x0029, 0x0028, 0x0029, 0x0028, 0x0028, 0x0029,
- 0x0028, 0x0029, 0x0028, 0x0028, 0x0029, 0x0028, 0x0029, 0x0028, 0x0029, 0x0028, 0x712C,
- 0xF1A8, 0xF9D4, 0x208E, 0x4BC2, 0xF280, 0xF280, 0x4BC2, 0x208E, 0xF9D4, 0xF1A8, 0x712C,
- 0x0000, 0x0200, 0x0100, 0x0080, 0x0040, 0x0020, 0x0010, 0x0008, 0x0004, 0x0002, 0x0001,
- 0x02DC, 0x016E, 0x00B7, 0x0287, 0x039F, 0x0313, 0x0355, 0x0376, 0x01BB, 0x0201, 0x03DC,
- 0x01EE, 0x00F7, 0x02A7, 0x038F, 0x031B, 0x00FC, 0x00FC, 0x0198, 0x0198, 0x0168, 0x0350,
- 0x01B4, 0x01B4, 0x0089, 0x002C, 0x0058, 0x002C, 0x0400, 0x0000, 0x0003, 0xFAED, 0xFED0,
- 0x09E2, 0x166A, 0x1BEF, 0x166A, 0x09E2, 0xFED0, 0xFAED, 0x2715, 0x58EB, 0x58EB, 0x2715,
- 0xFF8F, 0xFF25, 0xFEA1, 0xFE12, 0xFD8A, 0xFD26, 0xFD04, 0xFD43, 0xFE00, 0xFF4E, 0x0139,
- 0x03B9, 0x06BB, 0x0A1A, 0x0DA5, 0x111F, 0x144B, 0x16EC, 0x18CC, 0x19C7, 0x19C7, 0x18CC,
- 0x16EC, 0x144B, 0x111F, 0x0DA5, 0x0A1A, 0x06BB, 0x03B9, 0x0139, 0xFF4E, 0xFE00, 0xFD43,
- 0xFD04, 0xFD26, 0xFD8A, 0xFE12, 0xFEA1, 0xFF25, 0xFF8F, 0x0002, 0x0004, 0x47B3, 0xBAC5,
- 0x0B85, 0x0005, 0x299A, 0x0004, 0x000A, 0x0660, 0x0CCD, 0x0003, 0x0006, 0x0080, 0x002C,
- 0x0020, 0x0027, 0xFF4F, 0xFDB1, 0xFE2E, 0x0465, 0x0EF1, 0x161E, 0x1382, 0x0983, 0x007B,
- 0xFD66, 0xFE7D, 0xFFE2, 0x0031, 0x000D, 0x4000, 0xFD24, 0x513A, 0xCAEC, 0x3514, 0xAEC6,
- 0x02DC, 0x4000, 0xEFB5, 0x6EAE, 0x8DAB, 0x7255, 0x9152, 0x104B, 0x2518, 0x1FBB, 0x14A2,
- 0x0D6A, 0x08B9, 0x05AC, 0x03B0, 0x0266, 0x018F, 0x0104, 0x00A9, 0x006E, 0x0047, 0x0001,
- 0x0164, 0x019A, 0x0001, 0x0002, 0x0000, 0x0000, 0x0000, 0x0000, 0x7FFF, 0x0000, 0x0100,
- 0xF500, 0x1C00, 0x5A00, 0x0100, 0xFF00, 0xF800, 0x2000, 0x4F00, 0x0100, 0xFE00, 0xFC00,
- 0x2200, 0x4700, 0x0000, 0xFD00, 0x0100, 0x2300, 0x3D00, 0xFF00, 0xFE00, 0x0500, 0x2200,
- 0x3600, 0xFF00, 0xFF00, 0x0900, 0x2100, 0x2F00, 0x0000, 0x0100, 0x0C00, 0x1F00, 0x2900,
- 0x0000, 0x0300, 0x0E00, 0x1D00, 0x2500, 0x0000, 0x0000, 0x0000, 0x0000, 0x7FFF, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0004, 0x0008, 0x0308, 0x0312, 0x01CC, 0x017C, 0x0019,
- 0x0000, 0x0000, 0x0000, 0x0000, 0xE000, 0x1840, 0xC880, 0xFFEE, 0x0000, 0x4000, 0x2680,
- 0xFF81, 0xE000, 0x5000, 0xD080, 0xFFB3, 0xF800, 0x4500, 0xD380, 0xFFE2, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0F80, 0xDB80, 0x21C0, 0xFFCC, 0x0000, 0xC680, 0x0540, 0x0023, 0x33C0,
- 0xDAC0, 0x5900, 0xFFDA, 0x0AC0, 0xDF80, 0x1940, 0xFFF7, 0x7FFF, 0x50C3, 0x47FA, 0x4026,
- 0x392C, 0x32F5, 0x2D6A, 0x287A, 0x2413, 0x2027, 0x1CA8, 0x198A, 0x16C3, 0x1449, 0x1214,
- 0x101D, 0x0E5D, 0x0CCD, 0x0B68, 0x0A2B, 0x0910, 0x0813, 0x0015, 0x0002, 0x0080, 0x2848,
- 0x051F, 0x0001, 0x0010, 0xFC40, 0xFC40, 0xFD94, 0xFD80, 0xFE80, 0xFE80, 0xFE7C, 0xFE7F,
- 0x02F4, 0x0001, 0x0080, 0x0080, 0x1000, 0x0080, 0x1000, 0x1000, 0x0400, 0x599A, 0x199A,
- 0x0666, 0x0021, 0x2000, 0x2000, 0x2000, 0xFFE4, 0x0032, 0x000A, 0x2000, 0x4000, 0x0800,
- 0x0400, 0x000C, 0x0005, 0x000C, 0x00FF, 0x083D, 0x4000, 0x062F, 0x404C, 0x01B9, 0x4052,
- 0x0155, 0x405B, 0x0704, 0x4069, 0x0786, 0x4071, 0x0E9A, 0x4077, 0x0FEB, 0x4080, 0x0000,
- 0x0000, 0xFFD5, 0x0001, 0x0375, 0x001E, 0x0AAB, 0x2000, 0x2AAB, 0x0040, 0x0005, 0x001E,
- 0x4093, 0xFEE0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000
-};
-
-const unsigned short bin_coeff_E2[] = {
- 0x0000, 0x01FF, 0x0400, 0x0006, 0x2AAB, 0x0324, 0x0324, 0x0324, 0x010C, 0x010C, 0x010C,
- 0x1111, 0x1259, 0x0001, 0x005A, 0x0E9B, 0x0FFF, 0x0FFF, 0x0020, 0x0001, 0x0001, 0x0CCD,
- 0xFFE0, 0xFFD8, 0x00FF, 0xFFAC, 0xFFBC, 0xFF00, 0x0020, 0x0048, 0x0050, 0x0050, 0x000E,
- 0x0002, 0x7000, 0x0800, 0xFFF8, 0x0008, 0x002B, 0xFFF6, 0xFFF8, 0xFFFE, 0x0003, 0x0008,
- 0x000D, 0x000F, 0x0014, 0x0019, 0x0000, 0x0800, 0x6580, 0x0000, 0x0000, 0x7FFF, 0x0008,
- 0x0078, 0xFEF5, 0xFEE8, 0x0003, 0x0080, 0x0080, 0x0080, 0x0300, 0x0006, 0xC080, 0xF000,
- 0x0660, 0xDA80, 0x0000, 0x0001, 0x0001, 0xFFE4, 0xFFE8, 0x0080, 0x0034, 0x0001, 0xFFFF,
- 0x0001, 0xFFFE, 0x3AC0, 0x3340, 0x2BC0, 0x07C0, 0x05C0, 0x03E0, 0x0008, 0x1000, 0x2000,
- 0xFF01, 0xFFE5, 0xFFE9, 0x0DA8, 0x000E, 0xF75E, 0x1136, 0xEC7B, 0x0D3C, 0xFA9A, 0xFC47,
- 0xF58B, 0x1055, 0x3DDA, 0x3DDA, 0x1055, 0xF58B, 0xFC47, 0x1B17, 0x362A, 0x1B17, 0x67DA,
- 0xA798, 0xFDA6, 0xF8BE, 0xF36E, 0xF0D4, 0xF368, 0xFB18, 0x04E8, 0x0C98, 0x0F2C, 0x0C92,
- 0x0742, 0x025A, 0x0028, 0x0029, 0x0028, 0x0029, 0x0028, 0x0029, 0x0028, 0x0028, 0x0029,
- 0x0028, 0x0029, 0x0028, 0x0028, 0x0029, 0x0028, 0x0029, 0x0028, 0x0029, 0x0028, 0x712C,
- 0xF1A8, 0xF9D4, 0x208E, 0x4BC2, 0xF280, 0xF280, 0x4BC2, 0x208E, 0xF9D4, 0xF1A8, 0x712C,
- 0x0000, 0x0200, 0x0100, 0x0080, 0x0040, 0x0020, 0x0010, 0x0008, 0x0004, 0x0002, 0x0001,
- 0x02DC, 0x016E, 0x00B7, 0x0287, 0x039F, 0x0313, 0x0355, 0x0376, 0x01BB, 0x0201, 0x03DC,
- 0x01EE, 0x00F7, 0x02A7, 0x038F, 0x031B, 0x00FC, 0x00FC, 0x0198, 0x0198, 0x0168, 0x0350,
- 0x01B4, 0x01B4, 0x0089, 0x002C, 0x0058, 0x002C, 0x0400, 0x0000, 0x0003, 0xFAED, 0xFED0,
- 0x09E2, 0x166A, 0x1BEF, 0x166A, 0x09E2, 0xFED0, 0xFAED, 0x2715, 0x58EB, 0x58EB, 0x2715,
- 0xFF8F, 0xFF25, 0xFEA1, 0xFE12, 0xFD8A, 0xFD26, 0xFD04, 0xFD43, 0xFE00, 0xFF4E, 0x0139,
- 0x03B9, 0x06BB, 0x0A1A, 0x0DA5, 0x111F, 0x144B, 0x16EC, 0x18CC, 0x19C7, 0x19C7, 0x18CC,
- 0x16EC, 0x144B, 0x111F, 0x0DA5, 0x0A1A, 0x06BB, 0x03B9, 0x0139, 0xFF4E, 0xFE00, 0xFD43,
- 0xFD04, 0xFD26, 0xFD8A, 0xFE12, 0xFEA1, 0xFF25, 0xFF8F, 0x0002, 0x0004, 0x47B3, 0xBAC5,
- 0x0B85, 0x0005, 0x299A, 0x0004, 0x000A, 0x0660, 0x0CCD, 0x0003, 0x0006, 0x0080, 0x002C,
- 0x0020, 0x0027, 0xFF4F, 0xFDB1, 0xFE2E, 0x0465, 0x0EF1, 0x161E, 0x1382, 0x0983, 0x007B,
- 0xFD66, 0xFE7D, 0xFFE2, 0x0031, 0x000D, 0x4000, 0xFD24, 0x513A, 0xCAEC, 0x3514, 0xAEC6,
- 0x02DC, 0x4000, 0xEFB5, 0x6EAE, 0x8DAB, 0x7255, 0x9152, 0x104B, 0x2518, 0x1FBB, 0x14A2,
- 0x0D6A, 0x08B9, 0x05AC, 0x03B0, 0x0266, 0x018F, 0x0104, 0x00A9, 0x006E, 0x0047, 0x0001,
- 0x0164, 0x019A, 0x0001, 0x0002, 0x0000, 0x0000, 0x0000, 0x0000, 0x7FFF, 0x0000, 0x0100,
- 0xF500, 0x1C00, 0x5A00, 0x0100, 0xFF00, 0xF800, 0x2000, 0x4F00, 0x0100, 0xFE00, 0xFC00,
- 0x2200, 0x4700, 0x0000, 0xFD00, 0x0100, 0x2300, 0x3D00, 0xFF00, 0xFE00, 0x0500, 0x2200,
- 0x3600, 0xFF00, 0xFF00, 0x0900, 0x2100, 0x2F00, 0x0000, 0x0100, 0x0C00, 0x1F00, 0x2900,
- 0x0000, 0x0300, 0x0E00, 0x1D00, 0x2500, 0x0000, 0x0000, 0x0000, 0x0000, 0x7FFF, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0004, 0x0008, 0x0308, 0x0312, 0x01CC, 0x017C, 0x0019,
- 0x0000, 0x0000, 0x0000, 0x0000, 0xE000, 0x1840, 0xC880, 0xFFEE, 0x0000, 0x4000, 0x2680,
- 0xFF81, 0xE000, 0x5000, 0xD080, 0xFFB3, 0xF800, 0x4500, 0xD380, 0xFFE2, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0F80, 0xDB80, 0x21C0, 0xFFCC, 0x0000, 0xC680, 0x0540, 0x0023, 0x33C0,
- 0xDAC0, 0x5900, 0xFFDA, 0x0AC0, 0xDF80, 0x1940, 0xFFF7, 0x7FFF, 0x50C3, 0x47FA, 0x4026,
- 0x392C, 0x32F5, 0x2D6A, 0x287A, 0x2413, 0x2027, 0x1CA8, 0x198A, 0x16C3, 0x1449, 0x1214,
- 0x101D, 0x0E5D, 0x0CCD, 0x0B68, 0x0A2B, 0x0910, 0x0813, 0x0015, 0x0002, 0x0080, 0x2848,
- 0x051F, 0x0001, 0x0010, 0xFC40, 0xFC40, 0xFD94, 0xFD80, 0xFE80, 0xFE80, 0xFE7C, 0xFE7F,
- 0x02F4, 0x0001, 0x0080, 0x0080, 0x1000, 0x0080, 0x1000, 0x1000, 0x0400, 0x599A, 0x199A,
- 0x0666, 0x0021, 0x2000, 0x2000, 0x2000, 0xFFE4, 0x0032, 0x000A, 0x2000, 0x4000, 0x0800,
- 0x0400, 0x000C, 0x0005, 0x000C, 0x0038, 0x01A7, 0x4000, 0x0143, 0x4009, 0x0000, 0x0000,
- 0x0929, 0x4020, 0x0721, 0x4041, 0x0755, 0x4052, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0xFFD5, 0x0001, 0x0375, 0x001E, 0x0AAB, 0x2000, 0x2AAB, 0x0040, 0x0005, 0x001E,
- 0x0001, 0xFEE0, 0xFED8, 0xFED8, 0x0000, 0x0040, 0x40A2, 0x0000
-};
-
-const unsigned short bin_hw_coeff[] = {
- 0x0000, 0x0027, 0xfffd, 0xfffc, 0x0002, 0x000a, 0x0005, 0xfff4, 0xffed, 0x0004, 0x0024,
- 0x0018, 0xffd8, 0xffb1, 0x0006, 0x00cd, 0x0179, 0x0001, 0xfffd, 0x0004, 0x0000, 0x000b,
- 0xffe0, 0x0047, 0xff75, 0x0134, 0x04c4, 0xff9c, 0x000f, 0x0007, 0xfff7, 0x0006, 0x0001,
- 0x0008, 0xffdf, 0x005d, 0xff18, 0x034a, 0xff81, 0x03d9, 0x00a6, 0xfffe, 0x0012, 0xffa6,
- 0x0000
-};
diff --git a/drivers/misc/mediatek/fmradio/mt6616/inc/mt6616_fm.h b/drivers/misc/mediatek/fmradio/mt6616/inc/mt6616_fm.h
deleted file mode 100644
index 828360649..000000000
--- a/drivers/misc/mediatek/fmradio/mt6616/inc/mt6616_fm.h
+++ /dev/null
@@ -1,80 +0,0 @@
-/* mt6628_fm.h
- *
- * (C) Copyright 2009
- * MediaTek <www.MediaTek.com>
- * Hongcheng <hongcheng.xia@MediaTek.com>
- *
- * MT6626 FM Radio Driver -- head file
- *
- * 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.
- *
- * 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.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- */
-#ifndef __MT6616_FM_H__
-#define __MT6616_FM_H__
-
-#include "fm_typedef.h"
-
-/* #define FM_PowerOn_with_ShortAntenna */
-#define MT6626_RSSI_TH_LONG 0xFF01 /* FM radio long antenna RSSI threshold(11.375dBuV) */
-#define MT6626_RSSI_TH_SHORT 0xFEE0 /* FM radio short antenna RSSI threshold(-1dBuV) */
-#define MT6626_CQI_TH 0x00E9 /* FM radio Channel quality indicator threshold(0x0000~0x00FF) */
-#define MT6626_SEEK_SPACE 1 /* FM radio seek space,1:100KHZ; 2:200KHZ */
-#define MT6626_SCAN_CH_SIZE 40 /* FM radio scan max channel size */
-#define MT6626_BAND 1 /* FM radio band, 1:87.5MHz~108.0MHz; 2:76.0MHz~90.0MHz; 3:76.0MHz~108.0MHz; 4:special */
-#define MT6626_BAND_FREQ_L 875 /* FM radio special band low freq(Default 87.5MHz) */
-#define MT6626_BAND_FREQ_H 1080 /* FM radio special band high freq(Default 108.0MHz) */
-#define MT6626_DEEMPHASIS_50us TRUE
-
-/* customer need customize the I2C port */
-#if 0 /* def MT6516 */
-#define MT6626_I2C_PORT 2
-#else
-#define MT6626_I2C_PORT 0
-/* #endif */
-
-#define MT6626_SLAVE_ADDR 0xE0 /* 0x70 7-bit address */
-#define MT6626_MAX_COUNT 100
-#define MT6626_SCANTBL_SIZE 16 /* 16*uinit16_t */
-
-#define AFC_ON 0x01
-#if AFC_ON
-#define FM_MAIN_CTRL_INIT 0x480
-#else
-#define FM_MAIN_CTRL_INIT 0x080
-#endif
-
-/* FM_MAIN_EXTINTRMASK */
-#define FM_EXT_STC_DONE_MASK 0x01
-#define FM_EXT_RDS_MASK 0x20
-
-#define MT6626_FM_STC_DONE_TIMEOUT 12 /* second */
-
-/* FM_MAIN_CHANDETSTAT */
-#define FM_MAIN_CHANDET_MASK 0x3FF0 /* D4~D15 in address 3FH */
-#define FM_MAIN_CHANDET_SHIFT 0x04
-
-/* FM_MAIN_CFG1(0x36) && FM_MAIN_CFG2(0x37) */
-#define MT6626_FM_SEEK_UP 0x0
-#define MT6626_FM_SEEK_DOWN 0x01
-#define MT6626_FM_SCAN_UP 0x0
-#define MT6626_FM_SCAN_DOWN 0x01
-#define MT6626_FM_SPACE_INVALID 0x0
-#define MT6626_FM_SPACE_50K 0x01
-#define MT6626_FM_SPACE_100K 0x02
-#define MT6626_FM_SPACE_200K 0x04
-
-#define ext_clk /* if define ext_clk use external reference clock or mask will use internal */
-#define MT6626_DEV "MT6626"
-
-#endif /* end of #ifndef __MT6626_FM_H__ */
diff --git a/drivers/misc/mediatek/fmradio/mt6616/inc/mt6616_fm_cmd.h b/drivers/misc/mediatek/fmradio/mt6616/inc/mt6616_fm_cmd.h
deleted file mode 100644
index d95df49aa..000000000
--- a/drivers/misc/mediatek/fmradio/mt6616/inc/mt6616_fm_cmd.h
+++ /dev/null
@@ -1,46 +0,0 @@
-#ifndef __MT6626_FM_CMD_H__
-#define __MT6626_FM_CMD_H__
-
-#include <linux/types.h>
-#include "fm_typedef.h"
-
-/* FM basic-operation's opcode */
-#define FM_BOP_BASE (0x80)
-enum {
- FM_WRITE_BASIC_OP = (FM_BOP_BASE + 0x00),
- FM_UDELAY_BASIC_OP = (FM_BOP_BASE + 0x01),
- FM_RD_UNTIL_BASIC_OP = (FM_BOP_BASE + 0x02),
- FM_MODIFY_BASIC_OP = (FM_BOP_BASE + 0x03),
- FM_MSLEEP_BASIC_OP = (FM_BOP_BASE + 0x04),
- FM_MAX_BASIC_OP = (FM_BOP_BASE + 0x05)
-};
-
-/* FM BOP's size */
-#define FM_WRITE_BASIC_OP_SIZE (3)
-#define FM_UDELAY_BASIC_OP_SIZE (4)
-#define FM_RD_UNTIL_BASIC_OP_SIZE (5)
-#define FM_MODIFY_BASIC_OP_SIZE (5)
-#define FM_MSLEEP_BASIC_OP_SIZE (4)
-
-fm_s32 mt6626_pwrup_clock_on(fm_u8 *tx_buf, fm_s32 tx_buf_size);
-fm_s32 mt6626_pwrup_digital_init_1(fm_u8 *tx_buf, fm_s32 tx_buf_size);
-fm_s32 mt6626_pwrup_digital_init_2(fm_u8 *tx_buf, fm_s32 tx_buf_size);
-fm_s32 mt6626_pwrdown(fm_u8 *tx_buf, fm_s32 tx_buf_size);
-fm_s32 mt6626_rampdown(fm_u8 *tx_buf, fm_s32 tx_buf_size);
-fm_s32 mt6626_tune(fm_u8 *tx_buf, fm_s32 tx_buf_size, fm_u16 freq);
-fm_s32 mt6626_seek(fm_u8 *tx_buf, fm_s32 tx_buf_size, fm_u16 seekdir, fm_u16 space,
- fm_u16 max_freq, fm_u16 min_freq);
-fm_s32 mt6626_scan(fm_u8 *tx_buf, fm_s32 tx_buf_size, fm_u16 scandir, fm_u16 space,
- fm_u16 max_freq, fm_u16 min_freq);
-fm_s32 mt6626_get_reg(fm_u8 *tx_buf, fm_s32 tx_buf_size, fm_u8 addr);
-fm_s32 mt6626_set_reg(fm_u8 *tx_buf, fm_s32 tx_buf_size, fm_u8 addr, fm_u16 value);
-fm_s32 mt6626_patch_download(fm_u8 *tx_buf, fm_s32 tx_buf_size, fm_u8 seg_num, fm_u8 seg_id,
- const fm_u8 *src, fm_s32 seg_len);
-fm_s32 mt6626_coeff_download(fm_u8 *tx_buf, fm_s32 tx_buf_size, fm_u8 seg_num, fm_u8 seg_id,
- const fm_u8 *src, fm_s32 seg_len);
-fm_s32 mt6626_hwcoeff_download(fm_u8 *tx_buf, fm_s32 tx_buf_size, fm_u8 seg_num, fm_u8 seg_id,
- const fm_u8 *src, fm_s32 seg_len);
-fm_s32 mt6626_rom_download(fm_u8 *tx_buf, fm_s32 tx_buf_size, fm_u8 seg_num, fm_u8 seg_id,
- const fm_u8 *src, fm_s32 seg_len);
-
-#endif
diff --git a/drivers/misc/mediatek/fmradio/mt6616/inc/mt6616_fm_lib.h b/drivers/misc/mediatek/fmradio/mt6616/inc/mt6616_fm_lib.h
deleted file mode 100644
index ce9ae5a2f..000000000
--- a/drivers/misc/mediatek/fmradio/mt6616/inc/mt6616_fm_lib.h
+++ /dev/null
@@ -1,61 +0,0 @@
-#ifndef __MT6626_FM_LIB_H__
-#define __MT6626_FM_LIB_H__
-
-#include "fm_typedef.h"
-
-enum {
- DSPPATCH = 0xFFF9,
- USDELAY = 0xFFFA,
- MSDELAY = 0xFFFB,
- HW_VER = 0xFFFD,
- POLL_N = 0xFFFE, /* poling check if bit(n) is '0' */
- POLL_P = 0xFFFF, /* polling check if bit(n) is '1' */
-};
-
-enum {
- FM_PUS_DSPPATCH = DSPPATCH,
- FM_PUS_USDELAY = USDELAY,
- FM_PUS_MSDELAY = MSDELAY,
- FM_PUS_HW_VER = HW_VER,
- FM_PUS_POLL_N = POLL_N, /* poling check if bit(n) is '0' */
- FM_PUS_POLL_P = POLL_P, /* polling check if bit(n) is '1' */
- FM_PUS_MAX
-};
-
-enum {
- DSP_PATH = 0x02,
- DSP_COEFF = 0x03,
- DSP_HW_COEFF = 0x04
-};
-
-enum IMG_TYPE {
- IMG_WRONG = 0,
- IMG_ROM,
- IMG_PATCH,
- IMG_COEFFICIENT,
- IMG_HW_COEFFICIENT
-};
-
-enum {
- mt6626_E1 = 0,
- mt6626_E2
-};
-
-enum {
- FM_LONG_ANA = 0,
- FM_SHORT_ANA
-};
-
-struct ctrl_word_operation {
- fm_u16 addr;
- fm_u16 and;
- fm_u16 or;
-};
-
-enum {
- MT66x6_BT = 0,
- MT66x6_FM,
- MT66x6_MAX
-};
-
-#endif
diff --git a/drivers/misc/mediatek/fmradio/mt6616/inc/mt6616_fm_link.h b/drivers/misc/mediatek/fmradio/mt6616/inc/mt6616_fm_link.h
deleted file mode 100644
index c318b59d1..000000000
--- a/drivers/misc/mediatek/fmradio/mt6616/inc/mt6616_fm_link.h
+++ /dev/null
@@ -1,74 +0,0 @@
-/* mt6626_fm_ctrl_link.h
- *
- * (C) Copyright 2009
- * MediaTek <www.MediaTek.com>
- * Hongcheng <hongcheng.xia@MediaTek.com>
- *
- * MT6626 FM Radio Driver -- setup data link
- *
- * 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.
- *
- * 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.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- */
-
-#ifndef __MT6626_FM_LINK_H__
-#define __MT6626_FM_LINK_H__
-
-#include <linux/wait.h>
-#include "fm_link.h"
-
-#define RX_BUF_SIZE 128
-#define TX_BUF_SIZE 1024
-
-#define SW_RETRY_CNT (2)
-#define SW_RETRY_CNT_MAX (5)
-#define SW_WAIT_TIMEOUT_MAX (100)
-
-/* FM operation timeout define for error handle */
-#define TEST_TIMEOUT (3)
-#define FSPI_EN_TIMEOUT (3)
-#define FSPI_MUXSEL_TIMEOUT (3)
-#define FSPI_RD_TIMEOUT (3)
-#define FSPI_WR_TIMEOUT (3)
-#define I2C_RD_TIMEOUT (3)
-#define I2C_WR_TIMEOUT (3)
-#define EN_TIMEOUT (5)
-#define RST_TIMEOUT (3)
-#define TUNE_TIMEOUT (3)
-#define SEEK_TIMEOUT (10)
-#define SCAN_TIMEOUT (15) /* usualy scan will cost 10 seconds */
-#define RDS_RX_EN_TIMEOUT (3)
-#define RDS_DATA_TIMEOUT (100)
-#define RAMPDOWN_TIMEOUT (3)
-#define MCUCLK_TIMEOUT (3)
-#define MODEMCLK_TIMEOUT (3)
-#define RDS_TX_TIMEOUT (3)
-#define PATCH_TIMEOUT (5)
-#define COEFF_TIMEOUT (5)
-#define HWCOEFF_TIMEOUT (5)
-#define ROM_TIMEOUT (5)
-
-struct fm_link_event {
- /* data */
- volatile fm_u32 flag;
- wait_queue_head_t wq;
- struct fm_res_ctx result; /* seek/scan/read/RDS */
- /* methods */
- fm_u32(*set) (struct fm_link_event *thiz, fm_u32 mask);
- fm_u32(*clr) (struct fm_link_event *thiz, fm_u32 mask);
- long (*check) (struct fm_link_event *thiz, fm_u32 mask, long timeout);
- fm_u32(*get) (struct fm_link_event *thiz);
- fm_u32(*rst) (struct fm_link_event *thiz);
-};
-
-#endif
diff --git a/drivers/misc/mediatek/fmradio/mt6616/inc/mt6616_fm_reg.h b/drivers/misc/mediatek/fmradio/mt6616/inc/mt6616_fm_reg.h
deleted file mode 100644
index bc2c9e50b..000000000
--- a/drivers/misc/mediatek/fmradio/mt6616/inc/mt6616_fm_reg.h
+++ /dev/null
@@ -1,83 +0,0 @@
-#ifndef __MT6626_FM_REG_H__
-#define __MT6626_FM_REG_H__
-
-enum MT6626_REG {
- FM_MAIN_CG1_CTRL = 0x60,
- FM_MAIN_CG2_CTRL = 0x61,
- FM_MAIN_HWVER = 0x62,
- FM_MAIN_CTRL = 0x63,
- FM_CHANNEL_SET = 0x65,
- FM_MAIN_CFG1 = 0x66,
- FM_MAIN_CFG2 = 0x67,
- FM_MAIN_MCLKDESENSE = 0x38,
- FM_MAIN_INTR = 0x69,
- FM_MAIN_INTRMASK = 0x6A,
- FM_MAIN_EXTINTRMASK = 0x6B,
- FM_RSSI_IND = 0x6C,
- FM_RSSI_TH = 0x6D,
- FM_MAIN_RESET = 0x6E,
- FM_MAIN_CHANDETSTAT = 0x6F,
- FM_RDS_CFG0 = 0x80,
- FM_RDS_INFO = 0x81,
- FM_RDS_DATA_REG = 0x82,
- FM_RDS_GOODBK_CNT = 0x83,
- FM_RDS_BADBK_CNT = 0x84,
- FM_RDS_PWDI = 0x85,
- FM_RDS_PWDQ = 0x86,
- FM_RDS_FIFO_STATUS0 = 0x87,
- FM_FT_CON9 = 0x8F,
- FM_DSP_PATCH_CTRL = 0x90,
- FM_DSP_PATCH_OFFSET = 0x91,
- FM_DSP_PATCH_DATA = 0x92,
- FM_DSP_MEM_CTRL4 = 0x93,
- FM_ADDR_PAMD = 0xB4,
- FM_RDS_BDGRP_ABD_CTRL_REG = 0xB6,
- FM_RDS_POINTER = 0xF0,
-};
-
-/* RDS_BDGRP_ABD_CTRL_REG */
-enum {
- BDGRP_ABD_EN = 0x0001,
- BER_RUN = 0x2000
-};
-#define FM_DAC_CON1 0x83
-#define FM_DAC_CON2 0x84
-#define FM_FT_CON0 0x86
-enum {
- FT_EN = 0x0001
-};
-
-#define FM_I2S_CON0 0x90
-enum {
- I2S_EN = 0x0001,
- FORMAT = 0x0002,
- WLEN = 0x0004,
- I2S_SRC = 0x0008
-};
-
-/* FM_MAIN_CTRL */
-enum {
- TUNE = 0x0001,
- SEEK = 0x0002,
- SCAN = 0x0004,
- RDS_MASK = 0x0010,
- MUTE = 0x0020,
- RDS_BRST = 0x0040,
- RAMP_DOWN = 0x0100,
-};
-
-/* FM_MAIN_INTR */
-enum {
- FM_INTR_STC_DONE = 0x0001,
- FM_INTR_IQCAL_DONE = 0x0002,
- FM_INTR_DESENSE_HIT = 0x0004,
- FM_INTR_CHNL_CHG = 0x0008,
- FM_INTR_SW_INTR = 0x0010,
- FM_INTR_RDS = 0x0020
-};
-
-enum {
- ANTENNA_TYPE = 0x0010,
-};
-
-#endif /* __MT6626_FM_REG_H__ */
diff --git a/drivers/misc/mediatek/fmradio/mt6616/piv/mt6616_fm_priv.c b/drivers/misc/mediatek/fmradio/mt6616/piv/mt6616_fm_priv.c
deleted file mode 100644
index e69de29bb..000000000
--- a/drivers/misc/mediatek/fmradio/mt6616/piv/mt6616_fm_priv.c
+++ /dev/null
diff --git a/drivers/misc/mediatek/fmradio/mt6616/piv/mt6616_fm_priv.h b/drivers/misc/mediatek/fmradio/mt6616/piv/mt6616_fm_priv.h
deleted file mode 100644
index 99407933e..000000000
--- a/drivers/misc/mediatek/fmradio/mt6616/piv/mt6616_fm_priv.h
+++ /dev/null
@@ -1,5 +0,0 @@
-#ifndef __MTK_FM_H__
-#define __MTK_FM_H__
-
-
-#endif /* __MTK_FM_H__ */
diff --git a/drivers/misc/mediatek/fmradio/mt6616/pub/mt6616_fm_cmd.c b/drivers/misc/mediatek/fmradio/mt6616/pub/mt6616_fm_cmd.c
deleted file mode 100644
index cdc989453..000000000
--- a/drivers/misc/mediatek/fmradio/mt6616/pub/mt6616_fm_cmd.c
+++ /dev/null
@@ -1,692 +0,0 @@
-#include <linux/kernel.h>
-#include <linux/types.h>
-#include <linux/fm.h>
-
-#include "fm_typedef.h"
-#include "fm_dbg.h"
-#include "fm_err.h"
-#include "fm_rds.h"
-
-#include "mt6626_fm_reg.h"
-#include "mt6626_fm_link.h"
-#include "mt6626_fm.h"
-#include "mt6626_fm_cmd.h"
-
-
-static fm_s32 fm_bop_write(fm_u8 addr, fm_u16 value, fm_u8 *buf, fm_s32 size)
-{
- if (size < (FM_WRITE_BASIC_OP_SIZE + 2)) {
- return (-1);
- }
-
- if (buf == NULL) {
- return (-2);
- }
-
- buf[0] = FM_WRITE_BASIC_OP;
- buf[1] = FM_WRITE_BASIC_OP_SIZE;
- buf[2] = addr;
- buf[3] = (fm_u8) ((value) & 0x00FF);
- buf[4] = (fm_u8) ((value >> 8) & 0x00FF);
-
- WCN_DBG(FM_DBG | CHIP, "%02x %02x %02x %02x %02x\n", buf[0], buf[1], buf[2], buf[3],
- buf[4]);
-
- return (FM_WRITE_BASIC_OP_SIZE + 2);
-}
-
-static fm_s32 fm_bop_udelay(fm_u32 value, fm_u8 *buf, fm_s32 size)
-{
- if (size < (FM_UDELAY_BASIC_OP_SIZE + 2)) {
- return (-1);
- }
-
- if (buf == NULL) {
- return (-2);
- }
-
- buf[0] = FM_UDELAY_BASIC_OP;
- buf[1] = FM_UDELAY_BASIC_OP_SIZE;
- buf[2] = (fm_u8) ((value) & 0x000000FF);
- buf[3] = (fm_u8) ((value >> 8) & 0x000000FF);
- buf[4] = (fm_u8) ((value >> 16) & 0x000000FF);
- buf[5] = (fm_u8) ((value >> 24) & 0x000000FF);
-
- WCN_DBG(FM_DBG | CHIP, "%02x %02x %02x %02x %02x %02x\n", buf[0], buf[1], buf[2], buf[3],
- buf[4], buf[5]);
-
- return (FM_UDELAY_BASIC_OP_SIZE + 2);
-}
-
-static fm_s32 fm_bop_rd_until(fm_u8 addr, fm_u16 mask, fm_u16 value, fm_u8 *buf, fm_s32 size)
-{
- if (size < (FM_RD_UNTIL_BASIC_OP_SIZE + 2)) {
- return (-1);
- }
-
- if (buf == NULL) {
- return (-2);
- }
-
- buf[0] = FM_RD_UNTIL_BASIC_OP;
- buf[1] = FM_RD_UNTIL_BASIC_OP_SIZE;
- buf[2] = addr;
- buf[3] = (fm_u8) ((mask) & 0x00FF);
- buf[4] = (fm_u8) ((mask >> 8) & 0x00FF);
- buf[5] = (fm_u8) ((value) & 0x00FF);
- buf[6] = (fm_u8) ((value >> 8) & 0x00FF);
-
- WCN_DBG(FM_DBG | CHIP, "%02x %02x %02x %02x %02x %02x %02x\n", buf[0], buf[1], buf[2],
- buf[3], buf[4], buf[5], buf[6]);
-
- return (FM_RD_UNTIL_BASIC_OP_SIZE + 2);
-}
-
-static fm_s32 fm_bop_modify(fm_u8 addr, fm_u16 mask_and, fm_u16 mask_or, fm_u8 *buf, fm_s32 size)
-{
- if (size < (FM_MODIFY_BASIC_OP_SIZE + 2)) {
- return (-1);
- }
-
- if (buf == NULL) {
- return (-2);
- }
-
- buf[0] = FM_MODIFY_BASIC_OP;
- buf[1] = FM_MODIFY_BASIC_OP_SIZE;
- buf[2] = addr;
- buf[3] = (fm_u8) ((mask_and) & 0x00FF);
- buf[4] = (fm_u8) ((mask_and >> 8) & 0x00FF);
- buf[5] = (fm_u8) ((mask_or) & 0x00FF);
- buf[6] = (fm_u8) ((mask_or >> 8) & 0x00FF);
-
- WCN_DBG(FM_DBG | CHIP, "%02x %02x %02x %02x %02x %02x %02x\n", buf[0], buf[1], buf[2],
- buf[3], buf[4], buf[5], buf[6]);
-
- return (FM_MODIFY_BASIC_OP_SIZE + 2);
-}
-
-#if 0
-static fm_s32 fm_bop_msleep(fm_u32 value, fm_u8 *buf, fm_s32 size)
-{
- if (size < (FM_MSLEEP_BASIC_OP_SIZE + 2)) {
- return (-1);
- }
-
- if (buf == NULL) {
- return (-2);
- }
-
- buf[0] = FM_MSLEEP_BASIC_OP;
- buf[1] = FM_MSLEEP_BASIC_OP_SIZE;
- buf[2] = (fm_u8) ((value) & 0x000000FF);
- buf[3] = (fm_u8) ((value >> 8) & 0x000000FF);
- buf[4] = (fm_u8) ((value >> 16) & 0x000000FF);
- buf[5] = (fm_u8) ((value >> 24) & 0x000000FF);
-
- WCN_DBG(FM_DBG | CHIP, "%02x %02x %02x %02x %02x %02x\n", buf[0], buf[1], buf[2], buf[3],
- buf[4], buf[5]);
-
- return (FM_MSLEEP_BASIC_OP_SIZE + 2);
-}
-#endif
-
-/*
- * mt6626_pwrup_clock_on - Wholechip FM Power Up: step 1, FM Digital Clock enable
- * @buf - target buf
- * @buf_size - buffer size
- * return package size
- */
-fm_s32 mt6626_pwrup_clock_on(fm_u8 *buf, fm_s32 buf_size)
-{
- fm_s32 pkt_size = 0;
-
- if (buf_size < TX_BUF_SIZE) {
- return (-1);
- }
-
- buf[0] = FM_TASK_COMMAND_PKT_TYPE;
- buf[1] = FM_ENABLE_OPCODE;
- pkt_size = 4;
-
- /* FM Digital Clock enable */
- pkt_size += fm_bop_write(0x60, 0x3000, &buf[pkt_size], buf_size - pkt_size); /* wr 60 3000 */
- pkt_size += fm_bop_write(0x60, 0x3001, &buf[pkt_size], buf_size - pkt_size); /* wr 60 3001 */
- pkt_size += fm_bop_udelay(3000, &buf[pkt_size], buf_size - pkt_size); /* delay 3ms */
- pkt_size += fm_bop_write(0x60, 0x3003, &buf[pkt_size], buf_size - pkt_size); /* wr 60 3003 */
- pkt_size += fm_bop_write(0x60, 0x3007, &buf[pkt_size], buf_size - pkt_size); /* wr 60 3007 */
- /* no low power mode, analog line in, long antenna */
- pkt_size += fm_bop_modify(0x61, 0xFF63, 0x0000, &buf[pkt_size], buf_size - pkt_size);
-
- buf[2] = (fm_u8) ((pkt_size - 4) & 0x00FF);
- buf[3] = (fm_u8) (((pkt_size - 4) >> 8) & 0x00FF);
-
- return pkt_size;
-}
-
-/*
- * mt6626_patch_download - Wholechip FM Power Up: step 3, download patch to f/w,
- * @buf - target buf
- * @buf_size - buffer size
- * @seg_num - total segments that this patch divided into
- * @seg_id - No. of Segments: segment that will now be sent
- * @src - patch source buffer
- * @seg_len - segment size: segment that will now be sent
- * return package size
- */
-fm_s32 mt6626_patch_download(fm_u8 *buf, fm_s32 buf_size, fm_u8 seg_num, fm_u8 seg_id,
- const fm_u8 *src, fm_s32 seg_len)
-{
- fm_s32 pkt_size = 0;
- fm_u8 *dst = NULL;
-
- if (buf_size < TX_BUF_SIZE) {
- return (-1);
- }
-
- buf[0] = FM_TASK_COMMAND_PKT_TYPE;
- buf[1] = FM_PATCH_DOWNLOAD_OPCODE;
- pkt_size = 4;
-
- buf[pkt_size++] = seg_num;
- buf[pkt_size++] = seg_id;
-
- if (seg_len > (buf_size - pkt_size)) {
- return -1;
- }
-
- dst = &buf[pkt_size];
- pkt_size += seg_len;
-
- /* copy patch to tx buffer */
- while (seg_len--) {
- *dst = *src;
- /* pr_debug("%02x ", *dst); */
- src++;
- dst++;
- }
-
- buf[2] = (fm_u8) ((pkt_size - 4) & 0x00FF);
- buf[3] = (fm_u8) (((pkt_size - 4) >> 8) & 0x00FF);
- WCN_DBG(FM_DBG | CHIP, "%02x %02x %02x %02x %02x %02x %02x\n", buf[0], buf[1], buf[2],
- buf[3], buf[4], buf[5], buf[6]);
-
- return pkt_size;
-}
-
-/*
- * mt6626_coeff_download - Wholechip FM Power Up: step 3,download coeff to f/w,
- * @buf - target buf
- * @buf_size - buffer size
- * @seg_num - total segments that this patch divided into
- * @seg_id - No. of Segments: segment that will now be sent
- * @src - patch source buffer
- * @seg_len - segment size: segment that will now be sent
- * return package size
- */
-fm_s32 mt6626_coeff_download(fm_u8 *buf, fm_s32 buf_size, fm_u8 seg_num, fm_u8 seg_id,
- const fm_u8 *src, fm_s32 seg_len)
-{
- fm_s32 pkt_size = 0;
- fm_u8 *dst = NULL;
-
- if (buf_size < TX_BUF_SIZE) {
- return (-1);
- }
-
- buf[0] = FM_TASK_COMMAND_PKT_TYPE;
- buf[1] = FM_COEFF_DOWNLOAD_OPCODE;
- pkt_size = 4;
-
- buf[pkt_size++] = seg_num;
- buf[pkt_size++] = seg_id;
-
- if (seg_len > (buf_size - pkt_size)) {
- return -1;
- }
-
- dst = &buf[pkt_size];
- pkt_size += seg_len;
-
- /* copy patch to tx buffer */
- while (seg_len--) {
- *dst = *src;
- /* pr_debug("%02x ", *dst); */
- src++;
- dst++;
- }
-
- buf[2] = (fm_u8) ((pkt_size - 4) & 0x00FF);
- buf[3] = (fm_u8) (((pkt_size - 4) >> 8) & 0x00FF);
- WCN_DBG(FM_DBG | CHIP, "%02x %02x %02x %02x %02x %02x %02x\n", buf[0], buf[1], buf[2],
- buf[3], buf[4], buf[5], buf[6]);
-
- return pkt_size;
-}
-
-/*
- * mt6626_hwcoeff_download - Wholechip FM Power Up: step 3,download hwcoeff to f/w,
- * @buf - target buf
- * @buf_size - buffer size
- * @seg_num - total segments that this patch divided into
- * @seg_id - No. of Segments: segment that will now be sent
- * @src - patch source buffer
- * @seg_len - segment size: segment that will now be sent
- * return package size
- */
-fm_s32 mt6626_hwcoeff_download(fm_u8 *buf, fm_s32 buf_size, fm_u8 seg_num, fm_u8 seg_id,
- const fm_u8 *src, fm_s32 seg_len)
-{
- fm_s32 pkt_size = 0;
- fm_u8 *dst = NULL;
-
- if (buf_size < TX_BUF_SIZE) {
- return (-1);
- }
-
- buf[0] = FM_TASK_COMMAND_PKT_TYPE;
- buf[1] = FM_HWCOEFF_DOWNLOAD_OPCODE;
- pkt_size = 4;
-
- buf[pkt_size++] = seg_num;
- buf[pkt_size++] = seg_id;
-
- if (seg_len > (buf_size - pkt_size)) {
- return -1;
- }
-
- dst = &buf[pkt_size];
- pkt_size += seg_len;
-
- /* copy patch to tx buffer */
- while (seg_len--) {
- *dst = *src;
- /* pr_debug("%02x ", *dst); */
- src++;
- dst++;
- }
-
- buf[2] = (fm_u8) ((pkt_size - 4) & 0x00FF);
- buf[3] = (fm_u8) (((pkt_size - 4) >> 8) & 0x00FF);
- WCN_DBG(FM_DBG | CHIP, "%02x %02x %02x %02x %02x %02x %02x\n", buf[0], buf[1], buf[2],
- buf[3], buf[4], buf[5], buf[6]);
-
- return pkt_size;
-}
-
-/*
- * mt6626_rom_download - Wholechip FM Power Up: step 3,download rom to f/w,
- * @buf - target buf
- * @buf_size - buffer size
- * @seg_num - total segments that this patch divided into
- * @seg_id - No. of Segments: segment that will now be sent
- * @src - patch source buffer
- * @seg_len - segment size: segment that will now be sent
- * return package size
- */
-fm_s32 mt6626_rom_download(fm_u8 *buf, fm_s32 buf_size, fm_u8 seg_num, fm_u8 seg_id,
- const fm_u8 *src, fm_s32 seg_len)
-{
- fm_s32 pkt_size = 0;
- fm_u8 *dst = NULL;
-
- if (buf_size < TX_BUF_SIZE) {
- return (-1);
- }
-
- buf[0] = FM_TASK_COMMAND_PKT_TYPE;
- buf[1] = FM_ROM_DOWNLOAD_OPCODE;
- pkt_size = 4;
-
- buf[pkt_size++] = seg_num;
- buf[pkt_size++] = seg_id;
-
- if (seg_len > (buf_size - pkt_size)) {
- return -1;
- }
-
- dst = &buf[pkt_size];
- pkt_size += seg_len;
-
- /* copy patch to tx buffer */
- while (seg_len--) {
- *dst = *src;
- /* pr_debug("%02x ", *dst); */
- src++;
- dst++;
- }
-
- buf[2] = (fm_u8) ((pkt_size - 4) & 0x00FF);
- buf[3] = (fm_u8) (((pkt_size - 4) >> 8) & 0x00FF);
- WCN_DBG(FM_DBG | CHIP, "%02x %02x %02x %02x %02x %02x %02x\n", buf[0], buf[1], buf[2],
- buf[3], buf[4], buf[5], buf[6]);
-
- return pkt_size;
-}
-
-/*
- * mt6626_pwrup_digital_init - Wholechip FM Power Up: step 4, FM Digital Init: fm_rgf_maincon
- * @buf - target buf
- * @buf_size - buffer size
- * return package size
- */
-fm_s32 mt6626_pwrup_digital_init_1(fm_u8 *buf, fm_s32 buf_size)
-{
- fm_s32 pkt_size = 0;
-
- if (buf_size < TX_BUF_SIZE) {
- return (-1);
- }
-
- buf[0] = FM_TASK_COMMAND_PKT_TYPE;
- buf[1] = FM_ENABLE_OPCODE;
- pkt_size = 4;
-
- /* Wholechip FM Power Up: FM Digital Init: fm_rgf_maincon */
- pkt_size += fm_bop_write(0x6A, 0x0020, &buf[pkt_size], buf_size - pkt_size); /* wr 6A 0020 */
- pkt_size += fm_bop_write(0x6B, 0x0020, &buf[pkt_size], buf_size - pkt_size); /* wr 6B 0020 */
- pkt_size += fm_bop_write(0xA0, 0xD0B1, &buf[pkt_size], buf_size - pkt_size); /* wr a0 D0B1 */
- pkt_size += fm_bop_write(0x60, 0x300F, &buf[pkt_size], buf_size - pkt_size); /* wr 60 300F */
- pkt_size += fm_bop_write(0x61, 0x0003, &buf[pkt_size], buf_size - pkt_size); /* wr 61 3 */
- pkt_size += fm_bop_write(0x61, 0x0002, &buf[pkt_size], buf_size - pkt_size); /* wr 61 2 */
- /* pkt_size += fm_bop_modify(0x61, 0xFFFF, 0x0002, &buf[pkt_size], buf_size - pkt_size); */
- /* pkt_size += fm_bop_modify(0x61, 0xFFFE, 0x0000, &buf[pkt_size], buf_size - pkt_size); */
-
- buf[2] = (fm_u8) ((pkt_size - 4) & 0x00FF);
- buf[3] = (fm_u8) (((pkt_size - 4) >> 8) & 0x00FF);
-
- return pkt_size;
-}
-
-/*
- * mt6626_pwrup_digital_init - Wholechip FM Power Up: step 4, FM Digital Init: fm_rgf_maincon
- * @buf - target buf
- * @buf_size - buffer size
- * return package size
- */
-fm_s32 mt6626_pwrup_digital_init_2(fm_u8 *buf, fm_s32 buf_size)
-{
- fm_s32 pkt_size = 0;
-
- if (buf_size < TX_BUF_SIZE) {
- return (-1);
- }
-
- buf[0] = FM_TASK_COMMAND_PKT_TYPE;
- buf[1] = FM_ENABLE_OPCODE;
- pkt_size = 4;
-
- pkt_size += fm_bop_rd_until(0x64, 0x001F, 0x0002, &buf[pkt_size], buf_size - pkt_size); /* Poll 64[0~4] = 2 */
-
- buf[2] = (fm_u8) ((pkt_size - 4) & 0x00FF);
- buf[3] = (fm_u8) (((pkt_size - 4) >> 8) & 0x00FF);
-
- return pkt_size;
-}
-
-/*
- * mt6626_pwrdown - Wholechip FM Power down: Digital Modem Power Down
- * @buf - target buf
- * @buf_size - buffer size
- * return package size
- */
-fm_s32 mt6626_pwrdown(fm_u8 *buf, fm_s32 buf_size)
-{
- fm_s32 pkt_size = 0;
-
- if (buf_size < TX_BUF_SIZE) {
- return (-1);
- }
-
- buf[0] = FM_TASK_COMMAND_PKT_TYPE;
- buf[1] = FM_ENABLE_OPCODE;
- pkt_size = 4;
-
- /* Disable HW clock control */
- pkt_size += fm_bop_write(0x60, 0x330F, &buf[pkt_size], buf_size - pkt_size); /* wr 60 330F */
- /* Reset ASIP */
- pkt_size += fm_bop_write(0x61, 0x0001, &buf[pkt_size], buf_size - pkt_size); /* wr 61 0001 */
- /* digital core + digital rgf reset */
- pkt_size += fm_bop_modify(0x6E, 0xFFF8, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* wr 6E[0~2] 0 */
- pkt_size += fm_bop_modify(0x6E, 0xFFF8, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* wr 6E[0~2] 0 */
- pkt_size += fm_bop_modify(0x6E, 0xFFF8, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* wr 6E[0~2] 0 */
- /* Disable all clock */
- pkt_size += fm_bop_write(0x60, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* wr 60 0000 */
- /* Reset rgfrf */
- pkt_size += fm_bop_write(0x60, 0x4000, &buf[pkt_size], buf_size - pkt_size); /* wr 60 4000 */
- pkt_size += fm_bop_write(0x60, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* wr 60 0000 */
-
- buf[2] = (fm_u8) ((pkt_size - 4) & 0x00FF);
- buf[3] = (fm_u8) (((pkt_size - 4) >> 8) & 0x00FF);
-
- return pkt_size;
-}
-
-/*
- * mt6626_rampdown - f/w will wait for STC_DONE interrupt
- * @buf - target buf
- * @buf_size - buffer size
- * return package size
- */
-fm_s32 mt6626_rampdown(fm_u8 *buf, fm_s32 buf_size)
-{
- fm_s32 pkt_size = 0;
-
- if (buf_size < TX_BUF_SIZE) {
- return (-1);
- }
-
- buf[0] = FM_TASK_COMMAND_PKT_TYPE;
- buf[1] = FM_RAMPDOWN_OPCODE;
- pkt_size = 4;
-
- /* Clear DSP state */
- pkt_size += fm_bop_modify(FM_MAIN_CTRL, 0xFFF0, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* wr 63[3:0] = 0 */
- /* Set DSP ramp down state */
- pkt_size += fm_bop_modify(FM_MAIN_CTRL, 0xFFFF, RAMP_DOWN, &buf[pkt_size], buf_size - pkt_size); /* wr 63[8] = 1 */
- /* @Wait for STC_DONE interrupt@ */
- pkt_size += fm_bop_rd_until(FM_MAIN_INTR, FM_INTR_STC_DONE, FM_INTR_STC_DONE, &buf[pkt_size], buf_size - pkt_size); /* Poll 69[0] = b'1 */
- /* Clear DSP ramp down state */
- pkt_size += fm_bop_modify(FM_MAIN_CTRL, (~RAMP_DOWN), 0x0000, &buf[pkt_size], buf_size - pkt_size); /* wr 63[8] = 0 */
- /* Write 1 clear the STC_DONE interrupt status flag */
- pkt_size += fm_bop_modify(FM_MAIN_INTR, 0xFFFF, FM_INTR_STC_DONE, &buf[pkt_size], buf_size - pkt_size); /* wr 69[0] = 1 */
-
- buf[2] = (fm_u8) ((pkt_size - 4) & 0x00FF);
- buf[3] = (fm_u8) (((pkt_size - 4) >> 8) & 0x00FF);
-
- return pkt_size;
-}
-
-/*
- * mt6626_tune - execute tune action,
- * @buf - target buf
- * @buf_size - buffer size
- * @freq - 760 ~ 1080, 100KHz unit
- * return package size
- */
-fm_s32 mt6626_tune(fm_u8 *buf, fm_s32 buf_size, fm_u16 freq)
-{
- fm_s32 pkt_size = 0;
-
- if (buf_size < TX_BUF_SIZE) {
- return (-1);
- }
-
- freq = (freq - 640) * 2;
-
- buf[0] = FM_TASK_COMMAND_PKT_TYPE;
- buf[1] = FM_TUNE_OPCODE;
- pkt_size = 4;
-
- /* Set desired channel & channel parameter */
- pkt_size += fm_bop_modify(FM_CHANNEL_SET, 0xFC00, freq, &buf[pkt_size], buf_size - pkt_size); /* set 0x65[9:0] = 0x029e, => ((97.5 - 64) * 20) */
- /* Enable hardware controlled tuning sequence */
- pkt_size += fm_bop_modify(FM_MAIN_CTRL, 0xFFFE, TUNE, &buf[pkt_size], buf_size - pkt_size); /* set 0x63[0] = 1 */
- /* Wait for STC_DONE interrupt */
- pkt_size += fm_bop_rd_until(FM_MAIN_INTR, FM_INTR_STC_DONE, FM_INTR_STC_DONE, &buf[pkt_size], buf_size - pkt_size); /* Poll 69[0] = b'1 */
- /* Write 1 clear the STC_DONE interrupt status flag */
- pkt_size += fm_bop_modify(FM_MAIN_INTR, 0xFFFF, FM_INTR_STC_DONE, &buf[pkt_size], buf_size - pkt_size); /* wr 69[0] = 1 */
-
- buf[2] = (fm_u8) ((pkt_size - 4) & 0x00FF);
- buf[3] = (fm_u8) (((pkt_size - 4) >> 8) & 0x00FF);
-
- return pkt_size;
-}
-
-/*
- * mt6626_seek - execute seek action,
- * @buf - target buf
- * @buf_size - buffer size
- * @seekdir - 0=seek up, 1=seek down
- * @space - step, 50KHz:001, 100KHz:010, 200KHz:100
- * @max_freq - upper bound
- * @min_freq - lower bound
- * return package size
- */
-fm_s32 mt6626_seek(fm_u8 *buf, fm_s32 buf_size, fm_u16 seekdir, fm_u16 space, fm_u16 max_freq,
- fm_u16 min_freq)
-{
- fm_s32 pkt_size = 0;
-
- if (buf_size < TX_BUF_SIZE) {
- return (-1);
- }
-
- buf[0] = FM_TASK_COMMAND_PKT_TYPE;
- buf[1] = FM_SEEK_OPCODE;
- pkt_size = 4;
-
- /* Program seek direction */
- if (seekdir == 0) {
- pkt_size += fm_bop_modify(FM_MAIN_CFG1, 0xFBFF, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* 0x66[10] = 0, seek up */
- } else {
- pkt_size += fm_bop_modify(FM_MAIN_CFG1, 0xFFFF, 0x0400, &buf[pkt_size], buf_size - pkt_size); /* 0x66[10] = 1, seek down */
- }
-
- /* Program scan channel spacing */
- if (space == 1) {
- pkt_size += fm_bop_modify(FM_MAIN_CFG1, 0x8FFF, 0x1000, &buf[pkt_size], buf_size - pkt_size); /* clear 0x66[14:12] then 0x66[14:12]=001 */
- } else if (space == 2) {
- pkt_size += fm_bop_modify(FM_MAIN_CFG1, 0x8FFF, 0x2000, &buf[pkt_size], buf_size - pkt_size); /* clear 0x66[14:12] then 0x66[14:12]=010 */
- } else if (space == 4) {
- pkt_size += fm_bop_modify(FM_MAIN_CFG1, 0x8FFF, 0x4000, &buf[pkt_size], buf_size - pkt_size); /* clear 0x66[14:12] then 0x66[14:12]=100 */
- }
- /* enable wrap , if it is not auto scan function, 0x66[11] 0=no wrarp, 1=wrap */
- pkt_size += fm_bop_modify(FM_MAIN_CFG1, 0xFFFF, 0x0800, &buf[pkt_size], buf_size - pkt_size); /* 0x66[11] = 1, wrap */
- /* 0x66[9:0] freq upper bound */
- max_freq = (max_freq - 640) * 2;
- pkt_size +=
- fm_bop_modify(FM_MAIN_CFG1, 0xFC00, max_freq, &buf[pkt_size], buf_size - pkt_size);
- /* 0x67[9:0] freq lower bound */
- min_freq = (min_freq - 640) * 2;
- pkt_size +=
- fm_bop_modify(FM_MAIN_CFG2, 0xFC00, min_freq, &buf[pkt_size], buf_size - pkt_size);
- /* Enable hardware controlled seeking sequence */
- pkt_size += fm_bop_modify(FM_MAIN_CTRL, 0xFFFF, SEEK, &buf[pkt_size], buf_size - pkt_size); /* 0x63[1] = 1 */
- /* Wait for STC_DONE interrupt */
- pkt_size += fm_bop_rd_until(FM_MAIN_INTR, FM_INTR_STC_DONE, FM_INTR_STC_DONE, &buf[pkt_size], buf_size - pkt_size); /* Poll 69[0] = b'1 */
- /* Write 1 clear the STC_DONE interrupt status flag */
- pkt_size += fm_bop_modify(FM_MAIN_INTR, 0xFFFF, FM_INTR_STC_DONE, &buf[pkt_size], buf_size - pkt_size); /* wr 69[0] = 1 */
-
- buf[2] = (fm_u8) ((pkt_size - 4) & 0x00FF);
- buf[3] = (fm_u8) (((pkt_size - 4) >> 8) & 0x00FF);
-
- return pkt_size;
-}
-
-/*
- * mt6626_scan - execute scan action,
- * @buf - target buf
- * @buf_size - buffer size
- * @scandir - 0=seek up, 1=seek down
- * @space - step, 50KHz:001, 100KHz:010, 200KHz:100
- * @max_freq - upper bound
- * @min_freq - lower bound
- * return package size
- */
-fm_s32 mt6626_scan(fm_u8 *buf, fm_s32 buf_size, fm_u16 scandir, fm_u16 space, fm_u16 max_freq,
- fm_u16 min_freq)
-{
- fm_s32 pkt_size = 0;
-
- if (buf_size < TX_BUF_SIZE) {
- return (-1);
- }
-
- buf[0] = FM_TASK_COMMAND_PKT_TYPE;
- buf[1] = FM_SCAN_OPCODE;
- pkt_size = 4;
-
- /* Program seek direction */
- if (scandir == 0) {
- pkt_size += fm_bop_modify(FM_MAIN_CFG1, 0xFBFF, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* 0x66[10] = 0, seek up */
- } else {
- pkt_size += fm_bop_modify(FM_MAIN_CFG1, 0xFFFF, 0x0400, &buf[pkt_size], buf_size - pkt_size); /* 0x66[10] = 1, seek down */
- }
-
- /* Program scan channel spacing */
- if (space == 1) {
- pkt_size += fm_bop_modify(FM_MAIN_CFG1, 0x8FFF, 0x1000, &buf[pkt_size], buf_size - pkt_size); /* clear 0x66[14:12] then 0x66[14:12]=001 */
- } else if (space == 2) {
- pkt_size += fm_bop_modify(FM_MAIN_CFG1, 0x8FFF, 0x2000, &buf[pkt_size], buf_size - pkt_size); /* clear 0x66[14:12] then 0x66[14:12]=010 */
- } else if (space == 4) {
- pkt_size += fm_bop_modify(FM_MAIN_CFG1, 0x8FFF, 0x4000, &buf[pkt_size], buf_size - pkt_size); /* clear 0x66[14:12] then 0x66[14:12]=100 */
- }
- /* disable wrap , if it is auto scan function, 0x66[11] 0=no wrarp, 1=wrap */
- pkt_size += fm_bop_modify(FM_MAIN_CFG1, 0xF7FF, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* 0x66[11] = 0, no wrap */
- /* 0x66[9:0] freq upper bound */
- max_freq = (max_freq - 640) * 2;
- pkt_size +=
- fm_bop_modify(FM_MAIN_CFG1, 0xFC00, max_freq, &buf[pkt_size], buf_size - pkt_size);
- /* 0x67[9:0] freq lower bound */
- min_freq = (min_freq - 640) * 2;
- pkt_size +=
- fm_bop_modify(FM_MAIN_CFG2, 0xFC00, min_freq, &buf[pkt_size], buf_size - pkt_size);
- /* Enable hardware controlled scanning sequence */
- pkt_size += fm_bop_modify(FM_MAIN_CTRL, 0xFFFF, SCAN, &buf[pkt_size], buf_size - pkt_size); /* 0x63[1] = 1 */
- /* Wait for STC_DONE interrupt */
- pkt_size += fm_bop_rd_until(FM_MAIN_INTR, FM_INTR_STC_DONE, FM_INTR_STC_DONE, &buf[pkt_size], buf_size - pkt_size); /* Poll 69[0] = b'1 */
- /* Write 1 clear the STC_DONE interrupt status flag */
- pkt_size += fm_bop_modify(FM_MAIN_INTR, 0xFFFF, FM_INTR_STC_DONE, &buf[pkt_size], buf_size - pkt_size); /* wr 69[0] = 1 */
-
- buf[2] = (fm_u8) ((pkt_size - 4) & 0x00FF);
- buf[3] = (fm_u8) (((pkt_size - 4) >> 8) & 0x00FF);
-
- return pkt_size;
-}
-
-fm_s32 mt6626_get_reg(fm_u8 *buf, fm_s32 buf_size, fm_u8 addr)
-{
- if (buf_size < TX_BUF_SIZE) {
- return (-1);
- }
-
- buf[0] = FM_TASK_COMMAND_PKT_TYPE;
- buf[1] = FSPI_READ_OPCODE;
- buf[2] = 0x01;
- buf[3] = 0x00;
- buf[4] = addr;
-
- WCN_DBG(FM_DBG | CHIP, "%02x %02x %02x %02x %02x\n", buf[0], buf[1], buf[2], buf[3],
- buf[4]);
- return 5;
-}
-
-fm_s32 mt6626_set_reg(fm_u8 *buf, fm_s32 buf_size, fm_u8 addr, fm_u16 value)
-{
- if (buf_size < TX_BUF_SIZE) {
- return (-1);
- }
-
- buf[0] = FM_TASK_COMMAND_PKT_TYPE;
- buf[1] = FSPI_WRITE_OPCODE;
- buf[2] = 0x03;
- buf[3] = 0x00;
- buf[4] = addr;
- buf[5] = (fm_u8) ((value) & 0x00FF);
- buf[6] = (fm_u8) ((value >> 8) & 0x00FF);
-
- WCN_DBG(FM_DBG | CHIP, "%02x %02x %02x %02x %02x %02x %02x\n", buf[0], buf[1], buf[2],
- buf[3], buf[4], buf[5], buf[6]);
- return 7;
-}
diff --git a/drivers/misc/mediatek/fmradio/mt6616/pub/mt6616_fm_eint.c b/drivers/misc/mediatek/fmradio/mt6616/pub/mt6616_fm_eint.c
deleted file mode 100644
index f43ea99a9..000000000
--- a/drivers/misc/mediatek/fmradio/mt6616/pub/mt6616_fm_eint.c
+++ /dev/null
@@ -1,129 +0,0 @@
-/* mt6626_fm_eint.c
- *
- * (C) Copyright 2009
- * MediaTek <www.MediaTek.com>
- * Hongcheng <hongcheng.xia@MediaTek.com>
- *
- * mt6626 FM Radio Driver -- EINT functions
- *
- * 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.
- *
- * 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.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- */
-#include "fm_typedef.h"
-#include "fm_dbg.h"
-#include "fm_err.h"
-#include "fm_eint.h"
-
-#if 0 /* def MT6516 */
-#include <mach/mt6516_eint.h>
-#include <mach/mt6516_gpio.h>
-#else
-#include <mach/mt6573_eint.h>
-#include <mach/mt6573_gpio.h>
-#endif
-#include <cust_eint.h>
-#include <cust_gpio_usage.h>
-
-struct fm_eint_interface {
- void (*mask) (fm_u32 eint_num);
- void (*unmask) (fm_u32 eint_num);
- void (*set_hw_debounce) (fm_u32 eint_num, fm_u32 ms);
- void (*set_polarity) (fm_u32 eint_num, fm_u32 pol);
- fm_u32(*set_sens) (fm_u32 eint_num, fm_u32 sens);
- void (*registration) (fm_u32 eint_num, fm_u32 is_deb_en, fm_u32 pol,
- void (EINT_FUNC_PTR) (void), fm_u32 is_auto_umask);
- fm_s32(*init) (void);
-};
-
-
-#if 0 /* def MT6516 */
-extern void MT6516_EINTIRQUnmask(fm_u32 line);
-extern void MT6516_EINTIRQMask(fm_u32 line);
-extern void MT6516_EINT_Set_HW_Debounce(fm_u8 eintno, fm_u32 ms);
-extern fm_u32 MT6516_EINT_Set_Sensitivity(fm_u8 eintno, kal_bool sens);
-extern void MT6516_EINT_Registration(fm_u8 eintno, kal_bool Dbounce_En,
- kal_bool ACT_Polarity, void (EINT_FUNC_PTR) (void),
- kal_bool auto_umask);
-#endif
-
-static struct fm_eint_interface fm_eint_ops = {
-#if 0 /* def MT6516 */
- .mask = MT6516_EINTIRQMask,
- .unmask = MT6516_EINTIRQUnmask,
- .set_hw_debounce = MT6516_EINT_Set_HW_Debounce,
- .set_polarity = NULL,
- .set_sens = MT6516_EINT_Set_Sensitivity,
- .registration = MT6516_EINT_Registration,
- .init = NULL,
-#else
- .mask = mt65xx_eint_mask,
- .unmask = mt65xx_eint_unmask,
- .set_hw_debounce = mt65xx_eint_set_hw_debounce,
- .set_polarity = mt65xx_eint_set_polarity,
- .set_sens = mt65xx_eint_set_sens,
- .registration = mt65xx_eint_registration,
- .init = mt65xx_eint_init,
-#endif
-};
-
-fm_s32 fm_enable_eint(void)
-{
- WCN_DBG(FM_INF | EINT, "%s\n", __func__);
- fm_eint_ops.unmask(CUST_EINT_FM_RDS_NUM);
- return 0;
-}
-
-fm_s32 fm_disable_eint(void)
-{
- WCN_DBG(FM_INF | EINT, "%s\n", __func__);
- fm_eint_ops.mask(CUST_EINT_FM_RDS_NUM);
- return 0;
-}
-
-fm_s32 fm_request_eint(void (*parser) (void))
-{
- WCN_DBG(FM_NTC | EINT, "%s\n", __func__);
- fm_eint_ops.set_sens(CUST_EINT_FM_RDS_NUM, CUST_EINT_FM_RDS_SENSITIVE);
- fm_eint_ops.set_hw_debounce(CUST_EINT_FM_RDS_NUM, CUST_EINT_FM_RDS_DEBOUNCE_CN);
- fm_eint_ops.registration(CUST_EINT_FM_RDS_NUM,
- CUST_EINT_FM_RDS_DEBOUNCE_EN,
- CUST_EINT_FM_RDS_POLARITY, parser, 0);
- fm_eint_ops.mask(CUST_EINT_FM_RDS_NUM);
- return 0;
-}
-
-fm_s32 fm_eint_pin_cfg(fm_s32 mode)
-{
- int ret = 0;
-
- WCN_DBG(FM_NTC | EINT, "%s\n", __func__);
-
- switch (mode) {
- case FM_EINT_PIN_EINT_MODE:
- mt_set_gpio_mode(GPIO_FM_RDS_PIN, GPIO_FM_RDS_PIN_M_GPIO);
- mt_set_gpio_pull_enable(GPIO_FM_RDS_PIN, GPIO_PULL_ENABLE);
- mt_set_gpio_pull_select(GPIO_FM_RDS_PIN, GPIO_PULL_UP);
- mt_set_gpio_mode(GPIO_FM_RDS_PIN, GPIO_FM_RDS_PIN_M_EINT);
- break;
- case FM_EINT_PIN_GPIO_MODE:
- mt_set_gpio_mode(GPIO_FM_RDS_PIN, GPIO_FM_RDS_PIN_M_GPIO);
- mt_set_gpio_dir(GPIO_FM_RDS_PIN, GPIO_DIR_IN);
- break;
- default:
- ret = -1;
- break;
- }
-
- return ret;
-}
diff --git a/drivers/misc/mediatek/fmradio/mt6616/pub/mt6616_fm_lib.c b/drivers/misc/mediatek/fmradio/mt6616/pub/mt6616_fm_lib.c
deleted file mode 100644
index 47774aa0c..000000000
--- a/drivers/misc/mediatek/fmradio/mt6616/pub/mt6616_fm_lib.c
+++ /dev/null
@@ -1,968 +0,0 @@
-#include <linux/semaphore.h>
-#include <linux/delay.h>
-#include <linux/slab.h>
-
-#include "fm_typedef.h"
-#include "fm_dbg.h"
-#include "fm_err.h"
-#include "fm_interface.h"
-#include "fm_stdlib.h"
-#include "fm_patch.h"
-
-#include "mt6626_fm_reg.h"
-#include "mt6626_fm.h"
-#include "mt6626_drv_dsp.h"
-#include "mt6626_fm_link.h"
-#include "mt6626_fm_lib.h"
-#include "mt6626_fm_cmd.h"
-
-#define MT6626_FM_PATCH_PATH "/etc/firmware/mt6626_fm_patch.bin"
-#define MT6626_FM_COEFF_PATH "/etc/firmware/mt6626_fm_coeff.bin"
-#define MT6626_FM_HWCOEFF_PATH "/etc/firmware/mt6626_fm_hwcoeff.bin"
-#define MT6626_FM_ROM_PATH "/etc/firmware/mt6626_fm_rom.bin"
-
-extern void fm_low_power_wa(int fmon);
-extern void mt66x6_poweron(int idx);
-extern void mt66x6_poweroff(int idx);
-
-static struct fm_callback *fm_cb_op;
-
-/* mt6626 FM Receiver Power Up Sequence*/
-static const struct ctrl_word_operation PowerOnSetting[] = {
- /* @Wholechip FM Power Up: FM Digital Clock enable */
- {0x60, 0x0, 0x3000},
- {0x60, 0x0, 0x3001},
- {MSDELAY, 0x0, 0x0003}, /* Delay 3ms */
- {0x60, 0x0, 0x3003},
- {0x60, 0x0, 0x3007},
- {HW_VER, 0x99, 0x0000},
- /* antenna and audio path config */
-#ifdef FMRADIO_I2S_SUPPORT
-#ifdef FM_PowerOn_with_ShortAntenna
- {0x61, 0xFF73, 0x0090}, /* no low power mode, I2S, short antenna */
-#else
- {0x61, 0xFF73, 0x0080}, /* no low power mode, I2S, long antenna */
-#endif
- {0x9B, 0xFFF7, 0x0008}, /* 0000->master, 0008->slave */
- {0x5F, 0xE7FF, 0x0000}, /* 0000->32K, 0800->44.1K, 1000->48K */
- /* {0x61, 0xFF73, 0x0080},//no low power mode, I2S, long antenna, 0xff63 */
- /* {0x9B, 0xFFF7, 0x0008},//0000->master, 0008->slave */
- /* {0x5F, 0xE7FF, 0x0000},//0000->32K, 0800->44.1K, 1000->48K */
-#else
-#ifdef FM_PowerOn_with_ShortAntenna
- {0x61, 0xFF63, 0x0010}, /* no low power mode, analog line in, short antenna */
-#else
- {0x61, 0xFF63, 0x0000}, /* no low power mode, analog line in, long antenna */
-#endif
-#endif
- {HW_VER, 0x0062, 0x0000}, /* read the HW version */
-
- /* @Wholechip FM Power Up: FM Digital Init: download patch/DSP coefficient/HWACC coefficient */
- {DSPPATCH, 0x0, DSP_PATH},
- {DSPPATCH, 0x0, DSP_COEFF},
- {DSPPATCH, 0x0, DSP_HW_COEFF},
- {0x90, 0x0, 0x0040},
- {0x90, 0x0, 0x0000},
-
- /* @Wholechip FM Power Up: FM Digital Init: fm_rgf_maincon */
- {0x6A, 0x0, 0x0020},
- {0x6B, 0x0, 0x0020},
- {0x60, 0x0, 0x300F},
- {0x61, 0xFFFF, 0x0002},
- {0x61, 0xFFFE, 0x0000},
- {POLL_P, 0x64, 0x2}
-};
-
-#define POWER_ON_COMMAND_COUNT (sizeof(PowerOnSetting)/sizeof(PowerOnSetting[0]))
-
-static int Chip_Version = mt6626_E1;
-
-
-static fm_s32 mt6626_pwron(fm_s32 data)
-{
- mt66x6_poweron(MT66x6_FM);
- return 0;
-}
-
-
-static fm_s32 mt6626_pwroff(fm_s32 data)
-{
- mt66x6_poweroff(MT66x6_FM);
- return 0;
-}
-
-static fm_s32 Delayms(fm_u32 data)
-{
- WCN_DBG(FM_DBG | CHIP, "delay %dms\n", data);
- msleep(data);
- return 0;
-}
-
-static fm_s32 Delayus(fm_u32 data)
-{
- WCN_DBG(FM_DBG | CHIP, "delay %dus\n", data);
- udelay(data);
- return 0;
-}
-
-static fm_s32 mt6626_read(fm_u8 addr, fm_u16 *val)
-{
- fm_s32 ret = 0;
-
- ret = fm_ctrl_rx(addr, val);
-
- if (ret) {
- WCN_DBG(FM_ALT | CHIP, "rd 0x%02x err\n", addr);
- return ret;
- }
-
- WCN_DBG(FM_DBG | CHIP, "rd 0x%02x 0x%04x\n", addr, *val);
- return ret;
-}
-
-static fm_s32 mt6626_write(fm_u8 addr, fm_u16 val)
-{
- fm_s32 ret = 0;
-
- ret = fm_ctrl_tx(addr, val);
-
- if (ret) {
- WCN_DBG(FM_ALT | CHIP, "wr 0x%02x err\n", addr);
- return ret;
- }
-
- WCN_DBG(FM_DBG | CHIP, "wr 0x%02x 0x%04x\n", addr, val);
- return ret;
-}
-
-static fm_s32 mt6626_write1(fm_u8 addr, fm_u16 val)
-{
- return fm_ctrl_tx(addr, val);
-}
-
-static fm_s32 mt6626_set_bits(fm_u8 addr, fm_u16 bits, fm_u16 mask)
-{
- fm_s32 ret = 0;
- fm_u16 val;
-
- ret = mt6626_read(addr, &val);
-
- if (ret)
- return ret;
-
- val = ((val & (mask)) | bits);
- ret = mt6626_write(addr, val);
-
- return ret;
-}
-
-static fm_u16 mt6626_get_chipid(void)
-{
- return 0x6626;
-}
-
-static void mt6626_TUNE_ON(void)
-{
- fm_u16 dataRead;
-
- WCN_DBG(FM_DBG | CHIP, "tune on\n");
- mt6626_read(FM_MAIN_CTRL, &dataRead);
- mt6626_write(FM_MAIN_CTRL, (dataRead & 0xFFFE) | TUNE);
-}
-
-static void mt6626_SEEK_ON(void)
-{
- fm_u16 dataRead;
-
- WCN_DBG(FM_DBG | CHIP, "seek on\n");
- mt6626_read(FM_MAIN_CTRL, &dataRead);
- mt6626_write(FM_MAIN_CTRL, (dataRead & 0xFFFD) | SEEK);
-}
-
-static void mt6626_SCAN_ON(void)
-{
- fm_u16 dataRead;
-
- WCN_DBG(FM_DBG | CHIP, "scan on\n");
- mt6626_read(FM_MAIN_CTRL, &dataRead);
- mt6626_write(FM_MAIN_CTRL, (dataRead & 0xFFFB) | SCAN);
-}
-
-/* MT6628_SetAntennaType - set Antenna type
- * @type - 1,Short Antenna; 0, Long Antenna
- */
-static fm_s32 mt6626_SetAntennaType(fm_s32 type)
-{
- fm_u16 dataRead;
-
- WCN_DBG(FM_DBG | CHIP, "set ana to %s\n", type ? "short" : "long");
- mt6626_read(FM_MAIN_CG2_CTRL, &dataRead);
-
- if (type) {
- dataRead |= ANTENNA_TYPE;
- } else {
- dataRead &= (~ANTENNA_TYPE);
- }
-
- mt6626_write(FM_MAIN_CG2_CTRL, dataRead);
-
- return 0;
-}
-
-static fm_s32 mt6626_GetAntennaType(void)
-{
- fm_u16 dataRead;
-
- mt6626_read(FM_MAIN_CG2_CTRL, &dataRead);
- WCN_DBG(FM_DBG | CHIP, "get ana type: %s\n", (dataRead & ANTENNA_TYPE) ? "short" : "long");
-
- if (dataRead & ANTENNA_TYPE)
- return FM_SHORT_ANA; /* short antenna */
- else
- return FM_LONG_ANA; /* long antenna */
-}
-
-
-static fm_s32 mt6626_writeFA(fm_u16 *buff, fm_u8 fa)
-{
- fm_u8 i = 0;
-
- for (i = 0; i < 3; i++) {
- if ((fa >> i) & 0x1)
- *buff |= (1 << (12 + i));
- else
- *buff &= ~(1 << (12 + i));
- }
-
- return 0;
-}
-
-static fm_s32 mt6626_Mute(fm_bool mute)
-{
- fm_u16 dataRead;
-
- WCN_DBG(FM_DBG | CHIP, "set %s\n", mute ? "mute" : "unmute");
- mt6626_read(FM_MAIN_CTRL, &dataRead);
-
- if (mute == 1) {
- mt6626_write(FM_MAIN_CTRL, (dataRead & 0xFFDF) | 0x0020);
- } else {
- mt6626_write(FM_MAIN_CTRL, (dataRead & 0xFFDF));
- }
-
- return 0;
-}
-
-/*
- * mt6626_WaitSTCDone - wait for stc done flag change to '1'
- * @waittime - the total wait time in ms
- * @interval - the delay time of every polling loop in ms
- * if success, return 0; else error code
- */
-static fm_s32 mt6626_WaitSTCDone(fm_u32 waittime, fm_u32 interval)
-{
- fm_u16 dataRead;
- fm_s32 cnt;
-
- if (interval) {
- cnt = waittime / interval;
- } else {
- cnt = 0;
- }
-
- do {
- if (cnt-- < 0) {
- return -1; /* wait for STC done failed */
- }
-
- Delayms(interval);
- mt6626_read(FM_MAIN_INTR, &dataRead);
- } while ((dataRead & FM_INTR_STC_DONE) == 0);
-
- return 0;
-}
-
-static fm_s32 mt6626_ClearSTCDone(void)
-{
- fm_u16 dataRead;
-
- mt6626_read(FM_MAIN_INTR, &dataRead);
- mt6626_write(FM_MAIN_INTR, dataRead | FM_INTR_STC_DONE); /* clear status flag */
- return 0;
-}
-
-static fm_s32 mt6626_RampDown(void)
-{
- fm_u16 dataRead;
-
- WCN_DBG(FM_DBG | CHIP, "ramp down\n");
- /* Clear DSP state */
- mt6626_read(FM_MAIN_CTRL, &dataRead);
- mt6626_write(FM_MAIN_CTRL, (dataRead & 0xFFF0)); /* clear rgf_tune/seek/scan/dsp_init */
-
- /* Set DSP ramp down state */
- mt6626_read(FM_MAIN_CTRL, &dataRead);
- mt6626_write(FM_MAIN_CTRL, (dataRead | RAMP_DOWN));
-
- /* Check STC_DONE status flag (not the interrupt flag!) */
- if (mt6626_WaitSTCDone(1000, 1)) {
- WCN_DBG(FM_ALT | CHIP, "ramp down failed\n");
- return -1;
- }
- /* Clear DSP ramp down state */
- mt6626_read(FM_MAIN_CTRL, &dataRead);
- mt6626_write(FM_MAIN_CTRL, (dataRead & (~RAMP_DOWN)));
-
- mt6626_ClearSTCDone();
- return 0;
-}
-
-/*
-* mt6626_DspPatch - DSP download procedure
-* @img - source dsp bin code
-* @type - rom/patch/coefficient/hw_coefficient
-*
-*/
-static fm_s32 mt6626_DspPatch(const fm_u16 *img, enum IMG_TYPE type)
-{
- fm_u32 ctrl_code = 0;
- fm_u16 data_len = 0; /* in words */
- fm_u16 i;
-
- FMR_ASSERT(img);
-
- WCN_DBG(FM_DBG | CHIP, "down load DSP patch %d (1-rom, 2-patch, 3-coe, 4-hwcoe)\n", type);
-
- switch (type) {
- case IMG_ROM: /* rom code */
- case IMG_PATCH: /* patch */
- ctrl_code = 0x10;
- break;
- case IMG_COEFFICIENT: /* coeff */
- ctrl_code = 0xe;
- break;
- case IMG_HW_COEFFICIENT: /* HW coeff */
- ctrl_code = 0xd;
- break;
- default:
- break;
- }
-
- data_len = img[1] - img[0] + 1;
- WCN_DBG(FM_DBG | CHIP, "patch len: %d\n", data_len);
-
- if (!(data_len > 0)) {
- ; /* error */
- return -FM_EPARA;
- }
-
- mt6626_write(FM_DSP_PATCH_CTRL, 0);
- mt6626_write(FM_DSP_PATCH_OFFSET, img[0]); /* Start address */
- mt6626_write(FM_DSP_PATCH_CTRL, 0x40); /* Reset download control */
- mt6626_write(FM_DSP_PATCH_CTRL, ctrl_code); /* Set download control */
-
- switch (type) {
- case IMG_ROM:
- case IMG_PATCH:
- case IMG_HW_COEFFICIENT:
- WCN_DBG(FM_DBG | CHIP, "rom/patch/hw_coefficient downloading......\n");
-
- for (i = 0; i < data_len; i++) {
- mt6626_write1(FM_DSP_PATCH_DATA, img[2 + i]);
- }
-
- break;
- case IMG_COEFFICIENT:
- WCN_DBG(FM_DBG | CHIP, "coefficient downloading......\n");
-
- if (MT6626_DEEMPHASIS_50us) {
- for (i = 0; i < data_len; i++) {
- if (i == 86) {
- mt6626_write1(FM_DSP_PATCH_DATA, MT6626_RSSI_TH_LONG);
- } else if (i == 292) {
- mt6626_write1(FM_DSP_PATCH_DATA, 0x332B);
- mt6626_write1(FM_DSP_PATCH_DATA, 0x2545);
- mt6626_write1(FM_DSP_PATCH_DATA, 0x1344);
- mt6626_write1(FM_DSP_PATCH_DATA, 0x09F5);
- mt6626_write1(FM_DSP_PATCH_DATA, 0x0526);
- mt6626_write1(FM_DSP_PATCH_DATA, 0x02A9);
- mt6626_write1(FM_DSP_PATCH_DATA, 0x0160);
- mt6626_write1(FM_DSP_PATCH_DATA, 0x00B6);
- mt6626_write1(FM_DSP_PATCH_DATA, 0x005E);
- mt6626_write1(FM_DSP_PATCH_DATA, 0x0031);
- mt6626_write1(FM_DSP_PATCH_DATA, 0x0000);
- mt6626_write1(FM_DSP_PATCH_DATA, 0x0000);
- mt6626_write1(FM_DSP_PATCH_DATA, 0x0000);
- i += 12;
- } else if (i == 505) {
- mt6626_write1(FM_DSP_PATCH_DATA, MT6626_RSSI_TH_SHORT);
- } else {
- mt6626_write1(FM_DSP_PATCH_DATA, img[2 + i]);
- }
- }
- } else {
- for (i = 0; i < data_len; i++) {
- if (i == 86) {
- mt6626_write1(FM_DSP_PATCH_DATA, MT6626_RSSI_TH_LONG);
- } else if (i == 505) {
- mt6626_write1(FM_DSP_PATCH_DATA, MT6626_RSSI_TH_SHORT);
- } else {
- mt6626_write1(FM_DSP_PATCH_DATA, img[2 + i]);
- }
- }
- }
-
- break;
- default:
- break;
- }
-
- WCN_DBG(FM_DBG | CHIP, "down load DSP patch %d ok\n", type);
- return 0;
-}
-
-static fm_s32 mt6626_PowerUp(fm_u16 *chip_id, fm_u16 *device_id)
-{
- fm_s32 ret = 0;
- fm_s32 i;
- fm_u16 tmp_reg, cnt = 0;
-
- const fm_u16 *bin_patch = NULL;
- const fm_u16 *bin_coeff = NULL;
-
- FMR_ASSERT(chip_id);
- FMR_ASSERT(device_id);
-
- WCN_DBG(FM_DBG | CHIP, "pwr on seq\n");
-
- /* mt6626 FM power on sequence */
- for (i = 0; i < POWER_ON_COMMAND_COUNT; i++) {
- switch (PowerOnSetting[i].addr) {
- case FM_PUS_DSPPATCH:
-
- switch (PowerOnSetting[i].or) {
- case DSP_PATH: /* DSP path download */
- mt6626_DspPatch(bin_patch, IMG_PATCH);
- break;
- case DSP_COEFF: /* DSP coefficient download */
- mt6626_DspPatch(bin_coeff, IMG_COEFFICIENT);
- break;
- case DSP_HW_COEFF: /* DSP HW coefficient download */
- mt6626_DspPatch(bin_hw_coeff, IMG_HW_COEFFICIENT);
- break;
- default:
- break;
- }
-
- break;
- case FM_PUS_POLL_P:
- cnt = 0;
-
- do {
- mt6626_read((fm_u8) PowerOnSetting[i].and, &tmp_reg);
- tmp_reg &= PowerOnSetting[i].or;
-
- if (tmp_reg == 0) {
- Delayms(10);
- cnt++;
- }
- } while ((tmp_reg == 0) && (cnt < (MT6626_MAX_COUNT << 1)));
-
- if (cnt == (MT6626_MAX_COUNT << 1)) {
- WCN_DBG(FM_ALT | CHIP, "polling status Active failed:0x%02X\n",
- (fm_u8) PowerOnSetting[i].and);
- return -FM_EPARA;
- }
-
- break;
- case FM_PUS_POLL_N:
- cnt = 0;
-
- do {
- mt6626_read((fm_u8) PowerOnSetting[i].and, &tmp_reg);
- tmp_reg &= PowerOnSetting[i].or;
-
- if (tmp_reg != 0) {
- Delayms(10);
- cnt++;
- }
- } while ((tmp_reg != 0) && (cnt < MT6626_MAX_COUNT));
-
- if (cnt == MT6626_MAX_COUNT) {
- WCN_DBG(FM_ALT | CHIP, "polling status Negative failed:0x%02X\n",
- (fm_u8) PowerOnSetting[i].and);
- return -FM_EPARA;
- }
-
- break;
- case FM_PUS_USDELAY:
- Delayus(PowerOnSetting[i].or);
- break;
- case FM_PUS_MSDELAY:
- Delayms(PowerOnSetting[i].or);
- break;
- case FM_PUS_HW_VER:
-
- switch (PowerOnSetting[i].and) {
- case 0x99:
-
- switch (tmp_reg) {
- case 0x0:
- Chip_Version = mt6626_E1;
- bin_patch = bin_patch_E1;
- bin_coeff = bin_coeff_E1;
- break;
- case 0x8A01:
- default:
- Chip_Version = mt6626_E2;
- bin_patch = bin_patch_E2;
- bin_coeff = bin_coeff_E2;
- break;
- }
-
- break;
- case 0x62:
- mt6626_read((fm_u8) PowerOnSetting[i].and, &tmp_reg);
- /* record chip id & device id */
- *chip_id = tmp_reg;
- *device_id = tmp_reg;
- WCN_DBG(FM_NTC | CHIP, "chip_id:0x%04x\n", tmp_reg);
- break;
- case 0x1C:
- mt6626_read((fm_u8) PowerOnSetting[i].and, &tmp_reg);
-
- if (PowerOnSetting[i].or) {
- mt6626_write(PowerOnSetting[i].and, (tmp_reg | 0x8000));
- } else {
- mt6626_write(PowerOnSetting[i].and, (tmp_reg & 0x7FFF));
- }
-
- break;
- default:
- break;
- }
-
- break;
- default:
-
- if (PowerOnSetting[i].and != 0) {
- if (mt6626_read((fm_u8) PowerOnSetting[i].addr, &tmp_reg)) {
- WCN_DBG(FM_ALT | CHIP,
- "power up failed, can't read reg %02X\n",
- (fm_u8) PowerOnSetting[i].and);
- return -FM_EPARA;
- }
-
- tmp_reg &= PowerOnSetting[i].and;
- tmp_reg |= PowerOnSetting[i].or;
- } else {
- tmp_reg = PowerOnSetting[i].or;
- }
-
- if (mt6626_write((fm_u8) PowerOnSetting[i].addr, tmp_reg)) {
- WCN_DBG(FM_ALT | CHIP, "power up failed, can't write reg %02X\n",
- (fm_u8) PowerOnSetting[i].addr);
- return -FM_EPARA;
- }
-
- break;
- }
- }
-
- WCN_DBG(FM_DBG | CHIP, "pwr on seq done\n");
- return ret;
-}
-
-static fm_s32 mt6626_PowerDown(void)
-{
- fm_s32 ret = 0;
- fm_s16 i;
- fm_u16 dataRead;
-
- /*SW work around for MCUFA issue.
- *if interrupt happen before doing rampdown, DSP can't switch MCUFA back well.
- * In case read interrupt, and clean if interrupt found before rampdown.
- */
- WCN_DBG(FM_DBG | CHIP, "pwr down seq\n");
- mt6626_read(FM_MAIN_INTR, &dataRead);
-
- if (dataRead & 0x1) {
- mt6626_write(FM_MAIN_INTR, dataRead); /* clear status flag */
- }
-
- mt6626_RampDown();
-
- mt6626_write(0x60, 0x330F);
- mt6626_write(FM_MAIN_CG2_CTRL, 1);
-
- for (i = 0; i < 4; i++) {
- mt6626_read(0x6E, &dataRead);
- mt6626_write(0x6E, (dataRead & 0xFFF8));
- }
-
- mt6626_write(FM_MAIN_CG1_CTRL, 0);
- mt6626_write(FM_MAIN_CG1_CTRL, 0x4000);
- mt6626_write(FM_MAIN_CG1_CTRL, 0);
-
- return ret;
-}
-
-static fm_bool mt6626_SetFreq(fm_u16 freq)
-{
- fm_u32 CHAN = 0x0000;
- fm_u16 dataRead, cnt = 0, tempbuff = 0;
-
- Rampdown_again:
- mt6626_RampDown();
-
- fm_cb_op->cur_freq_set(freq);
- CHAN = (freq - 640) << 1;
- mt6626_read(FM_CHANNEL_SET, &dataRead);
-
- switch (Chip_Version) {
- case mt6626_E1:
-
- if (((fm_u8) ((dataRead & 0x1000) >> 12)) ^ (channel_parameter[freq - 760] & 0x1)) {
- mt6626_read(0x61, &tempbuff);
- mt6626_write(0x60, 0x330F);
- mt6626_write(0x61, 1);
- mt6626_write(0x6e, 0x0);
- mt6626_write(0x6e, 0x0);
- mt6626_write(0x6e, 0x0);
- mt6626_write(0x6e, 0x0);
- mt6626_write(0x60, 0x0);
- mt6626_write(0x60, 0x4000);
- mt6626_write(0x60, 0x0);
- mt6626_write(0x60, 0x3000);
- mt6626_write(0x60, 0x3001);
- Delayms(3);
- mt6626_write(0x60, 0x3003);
- mt6626_write(0x60, 0x3007);
- mt6626_write(0x60, 0x300f);
- mt6626_write(0x61, tempbuff | 0x3);
- mt6626_write(0x61, tempbuff | 0x2);
- mt6626_write(0x6A, 0x20);
- mt6626_write(0x6B, 0x20);
- Delayms(200);
- }
-
- break;
- case mt6626_E2:
- break;
- default:
- break;
-
- }
-
- mt6626_writeFA(&dataRead, (channel_parameter[freq - 760]));
- mt6626_write(FM_CHANNEL_SET, (dataRead & 0xFC00) | CHAN);
-
- mt6626_TUNE_ON();
-
- if (mt6626_WaitSTCDone(5000, 15)) {
- if (cnt++ > 100) {
- WCN_DBG(FM_ALT | CHIP, "set freq failed\n");
- return FALSE;
- } else {
- WCN_DBG(FM_WAR | CHIP, "set freq retry, cnt=%d\n", cnt);
- goto Rampdown_again;
- }
- }
-
- mt6626_ClearSTCDone(); /* clear status flag */
-
- WCN_DBG(FM_DBG | CHIP, "set freq to %d ok\n", freq);
- return TRUE;
-}
-
-/*
-* mt6626_Seek
-* pFreq: IN/OUT parm, IN start freq/OUT seek valid freq
-* return fm_true:seek success; fm_false:seek failed
-*/
-static fm_bool mt6626_Seek(fm_u16 min_freq, fm_u16 max_freq, fm_u16 *pFreq, fm_u16 seekdir,
- fm_u16 space)
-{
- fm_u16 tmp_reg;
- fm_u16 startfreq = *pFreq;
- fm_u16 dataRead;
-
- mt6626_Mute(fm_true);
-
- if (fm_cb_op->cur_freq_get() != startfreq) {
- /* set freq */
- if (fm_false == mt6626_SetFreq(startfreq)) {
- WCN_DBG(FM_ALT | CHIP, "seek, failed set freq\n");
- return -1;
- }
- }
-
- mt6626_RampDown();
-
- /* Setting before seek */
- mt6626_read(FM_MAIN_CFG2, &dataRead);
- mt6626_write(FM_MAIN_CFG2, (dataRead & 0xFC00) | ((min_freq - 640) << 1)); /* set space(100k/200k)and band(875~1080)and up/down */
- mt6626_read(FM_MAIN_CFG1, &dataRead);
- mt6626_write(FM_MAIN_CFG1, (dataRead & 0x8800) | (seekdir << 10) | (1 << (12 + space)) | ((max_freq - 640) << 1)); /* set space(100k/200k)and band(875~1080)and up/down */
- mt6626_read(FM_MAIN_CFG1, &dataRead);
- mt6626_write(FM_MAIN_CFG1, (dataRead & 0xF7FF) | 0x0800); /* enable wrap , if it is not auto scan function */
-
- /* Enable STC done intr */
- mt6626_set_bits(FM_MAIN_EXTINTRMASK, FM_EXT_STC_DONE_MASK, 0xFFFE);
- mt6626_SEEK_ON();
-
- if (fm_wait_stc_done(MT6626_FM_STC_DONE_TIMEOUT) == fm_false) {
- WCN_DBG(FM_ALT | CHIP, "seek, get stc done failed\n");
- mt6626_set_bits(FM_MAIN_INTR, 0x0001, 0xFFFF);
- mt6626_RampDown();
- return fm_false;
- }
- /* Disable STC done intr */
- mt6626_set_bits(FM_MAIN_EXTINTRMASK, 0, 0xFFFE);
- mt6626_RampDown();
- mt6626_read(FM_MAIN_CHANDETSTAT, &tmp_reg);
- *pFreq = 640 + ((tmp_reg & FM_MAIN_CHANDET_MASK) >> (FM_MAIN_CHANDET_SHIFT + 1));
- fm_cb_op->cur_freq_set(*pFreq);
- /* get the result freq */
- WCN_DBG(FM_NTC | CHIP, "seek, result freq:%d\n", *pFreq);
- mt6626_Mute(fm_false);
-
- return fm_true;
-}
-
-static fm_bool mt6626_Scan(fm_u16 min_freq, fm_u16 max_freq,
- fm_u16 *pFreq,
- fm_u16 *pScanTBL, fm_u16 *ScanTBLsize, fm_u16 scandir, fm_u16 space)
-{
- fm_u16 tmp_reg, space_val, startfreq, offset = 0;
- fm_u16 tmp_scanTBLsize = *ScanTBLsize;
- fm_u16 dataRead;
-
- if ((!pScanTBL) || (tmp_scanTBLsize == 0)) {
- WCN_DBG(FM_ALT | CHIP, "scan, failed:invalid scan table\n");
- return fm_false;
- }
-
- WCN_DBG(FM_DBG | CHIP,
- "scan start freq: %d, max_freq:%d, min_freq:%d, scan BTL size:%d, scandir:%d, space:%d\n",
- *pFreq, max_freq, min_freq, *ScanTBLsize, scandir, space);
-
- if (tmp_scanTBLsize > MT6626_SCANTBL_SIZE) {
- tmp_scanTBLsize = MT6626_SCANTBL_SIZE;
- }
-
- if (space == MT6626_FM_SPACE_200K) {
- space_val = 2; /* 200K */
- } else if (space == MT6626_FM_SPACE_100K) {
- space_val = 1; /* 100K */
- } else {
- space_val = 1; /* 100K */
- }
-
- /* scan up */
- if (scandir == MT6626_FM_SCAN_UP) {
- startfreq = min_freq - space_val;
- } else {
- startfreq = max_freq + space_val; /* max_freq compare need or not */
- }
-
- mt6626_Mute(fm_true);
- mt6626_RampDown();
-
- /* set freq */
- if (fm_false == mt6626_SetFreq(startfreq)) {
- WCN_DBG(FM_ALT | CHIP, "scan, failed set freq\n");
- return fm_false;
- }
-
- mt6626_RampDown();
-
- /* set space(100k/200k)and band(min_freq~max_freq) and up/down and disable wrap */
- mt6626_read(FM_MAIN_CFG2, &dataRead);
- mt6626_write(FM_MAIN_CFG2, (dataRead & 0xFC00) | ((min_freq - 640) << 1)); /* set space(100k/200k)and band(875~1080)and up/down */
- mt6626_read(FM_MAIN_CFG1, &dataRead);
- mt6626_write(FM_MAIN_CFG1, (dataRead & 0x8800) | (scandir << 10) | (1 << (12 + space)) | ((max_freq - 640) << 1)); /* set space(100k/200k)and band(875~1080)and up/down */
- mt6626_read(FM_MAIN_CFG1, &dataRead);
- mt6626_write(FM_MAIN_CFG1, dataRead & 0xF7FF); /* disable wrap , if it is auto scan function */
-
- /* Enable STC done intr */
- mt6626_set_bits(FM_MAIN_EXTINTRMASK, FM_EXT_STC_DONE_MASK, 0xFFFE);
- /* scan on */
- mt6626_SCAN_ON();
-
- if (fm_wait_stc_done(MT6626_FM_STC_DONE_TIMEOUT) == fm_false) {
- WCN_DBG(FM_ALT | CHIP, "scan, get stc done failed\n");
- mt6626_set_bits(FM_MAIN_INTR, 0x0001, 0xFFFF);
- mt6626_RampDown();
-
- /* get the valid freq after scan */
- mt6626_read(FM_MAIN_CHANDETSTAT, &tmp_reg);
- tmp_reg = 640 + ((tmp_reg & FM_MAIN_CHANDET_MASK) >> (FM_MAIN_CHANDET_SHIFT + 1));
- *pFreq = tmp_reg;
- WCN_DBG(FM_DBG | CHIP, "scan, failed freq:%d\n", *pFreq);
- return fm_false;
- }
- /* Disable STC done intr */
- mt6626_set_bits(FM_MAIN_EXTINTRMASK, 0, 0xFFFE);
-
- /* get scan Table */
- WCN_DBG(FM_DBG | CHIP, "mt6626_Scan tbl:");
-
- for (offset = 0; offset < tmp_scanTBLsize; offset++) {
- mt6626_read(FM_RDS_DATA_REG, &tmp_reg);
- *(pScanTBL + offset) = tmp_reg;
- }
-
- *ScanTBLsize = tmp_scanTBLsize;
-
- /* get the valid freq after scan */
- mt6626_read(FM_MAIN_CHANDETSTAT, &tmp_reg);
- tmp_reg = 640 + ((tmp_reg & FM_MAIN_CHANDET_MASK) >> (FM_MAIN_CHANDET_SHIFT + 1));
- *pFreq = tmp_reg;
- WCN_DBG(FM_DBG | CHIP, "scan, after scan freq:%d\n", *pFreq);
- mt6626_Mute(fm_false);
-
- return fm_true;
-}
-
-/*
- * mt6626_GetCurRSSI - get current freq's RSSI value
- * RS=RSSI
- * If RS>511, then RSSI(dBm)= (RS-1024)/16*6
- * else RSSI(dBm)= RS/16*6 dBuV
- */
-static fm_s32 mt6626_GetCurRSSI(fm_u16 *pRSSI)
-{
- fm_u16 tmp_reg, rssi;
-
- mt6626_read(FM_RSSI_IND, &tmp_reg);
- rssi = tmp_reg & 0x03ff;
-
- if (pRSSI) {
- *pRSSI =
- (rssi > 511) ? ((fm_s16) (((rssi - 1024) * 6) >> 4) + 113) : ((rssi * 6) >> 4);
- }
-
- WCN_DBG(FM_DBG | CHIP, "rssi:%d, dBuV:%d\n", rssi, *pRSSI);
- return 0;
-}
-
-static fm_s32 mt6626_SetVol(fm_u8 vol)
-{
- return 0;
-}
-
-static fm_s32 mt6626_GetVol(fm_u8 *pVol)
-{
- return 0;
-
-}
-
-static fm_s32 mt6626_dump_reg(void)
-{
- return 0;
-}
-
-static fm_bool mt6626_GetMonoStereo(fm_u16 *pMonoStereo)
-{
-#define FM_BF_STEREO 0x1000
- fm_u16 TmpReg, value;
- mt6626_read(FM_RSSI_IND, &TmpReg);
- value = (TmpReg & FM_BF_STEREO) >> 12;
- return value;
-}
-
-
-/*
- * mt6626_GetCurPamd - get current freq's PAMD value
- * PA=PAMD
- * If PA>511 then PAMD(dB)= (PA-1024)/16*6,
- * else PAMD(dB)=PA/16*6
- */
-static fm_bool mt6626_GetCurPamd(fm_u16 *pPamdLevl)
-{
- fm_u16 tmp_reg;
- fm_u16 dBvalue;
-
- if (mt6626_read(FM_ADDR_PAMD, &tmp_reg))
- return fm_false;
-
- tmp_reg &= 0x03FF;
- dBvalue = (tmp_reg > 511) ? ((1024 - tmp_reg) * 6 / 16) : 0;
-
- *pPamdLevl = dBvalue;
- return fm_true;
-}
-
-static fm_s32 mt6626_ScanStop(void)
-{
- return fm_force_active_event(FLAG_SCAN);
-}
-
-static fm_s32 mt6626_SeekStop(void)
-{
- return fm_force_active_event(FLAG_SEEK);
-}
-
-static fm_bool mt6626_em_test(fm_u16 group_idx, fm_u16 item_idx, fm_u32 item_value)
-{
- return fm_true;
-}
-
-static fm_s32 fm_low_power_wa_default(fm_s32 fmon)
-{
- return 0;
-}
-
-fm_s32 fm_low_ops_register(struct fm_lowlevel_ops *ops)
-{
- fm_s32 ret = 0;
- /* Basic functions. */
-
- FMR_ASSERT(ops);
- FMR_ASSERT(ops->cb.cur_freq_get);
- FMR_ASSERT(ops->cb.cur_freq_set);
- fm_cb_op = &ops->cb;
-
- /* ops->bi.low_pwr_wa = mt6626_low_pwr_wa; */
- ops->bi.low_pwr_wa = fm_low_power_wa_default;
- ops->bi.pwron = mt6626_pwron;
- ops->bi.pwroff = mt6626_pwroff;
- ops->bi.msdelay = Delayms;
- ops->bi.usdelay = Delayus;
- ops->bi.read = mt6626_read;
- ops->bi.write = mt6626_write;
- ops->bi.setbits = mt6626_set_bits;
- ops->bi.chipid_get = mt6626_get_chipid;
- ops->bi.mute = mt6626_Mute;
- ops->bi.rampdown = mt6626_RampDown;
- ops->bi.pwrupseq = mt6626_PowerUp;
- ops->bi.pwrdownseq = mt6626_PowerDown;
- ops->bi.setfreq = mt6626_SetFreq;
- ops->bi.seek = mt6626_Seek;
- ops->bi.seekstop = mt6626_SeekStop;
- ops->bi.scan = mt6626_Scan;
- ops->bi.scanstop = mt6626_ScanStop;
- ops->bi.rssiget = mt6626_GetCurRSSI;
- ops->bi.volset = mt6626_SetVol;
- ops->bi.volget = mt6626_GetVol;
- ops->bi.dumpreg = mt6626_dump_reg;
- ops->bi.msget = mt6626_GetMonoStereo;
- ops->bi.pamdget = mt6626_GetCurPamd;
- ops->bi.em = mt6626_em_test;
- ops->bi.anaswitch = mt6626_SetAntennaType;
- ops->bi.anaget = mt6626_GetAntennaType;
-
- return ret;
-}
-
-fm_s32 fm_low_ops_unregister(struct fm_lowlevel_ops *ops)
-{
- fm_s32 ret = 0;
- /* Basic functions. */
-
- FMR_ASSERT(ops);
-
- fm_memset(&ops->bi, 0, sizeof(struct fm_basic_interface));
- return ret;
-}
diff --git a/drivers/misc/mediatek/fmradio/mt6616/pub/mt6616_fm_link.c b/drivers/misc/mediatek/fmradio/mt6616/pub/mt6616_fm_link.c
deleted file mode 100644
index 86d4db77d..000000000
--- a/drivers/misc/mediatek/fmradio/mt6616/pub/mt6616_fm_link.c
+++ /dev/null
@@ -1,282 +0,0 @@
-/* mt6626_fm_link.c
- *
- * (C) Copyright 2009
- * MediaTek <www.MediaTek.com>
- * Hongcheng <hongcheng.xia@MediaTek.com>
- *
- * MT6626 FM Radio Driver -- setup data link
- *
- * 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.
- *
- * 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.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- */
-#include <linux/slab.h>
-#include <linux/version.h>
-#include <linux/interrupt.h>
-#include <linux/cdev.h>
-#include <asm/uaccess.h>
-#include <linux/i2c.h>
-#include <linux/fm.h>
-
-#include "fm_typedef.h"
-#include "fm_dbg.h"
-#include "fm_err.h"
-#include "fm_stdlib.h"
-
-#include "mt6626_fm.h"
-#include "mt6626_fm_link.h"
-#include "mt6626_fm_reg.h"
-
-/* these functions are defined after Linux2.6.32 */
-static int fm_i2c_probe(struct i2c_client *client, const struct i2c_device_id *id);
-static int fm_i2c_detect(struct i2c_client *client, int kind, struct i2c_board_info *info);
-static int fm_i2c_remove(struct i2c_client *client);
-
-
-static const struct i2c_device_id fm_i2c_id = { MT6626_DEV, 0 };
-static unsigned short force[] =
- { MT6626_I2C_PORT, MT6626_SLAVE_ADDR, I2C_CLIENT_END, I2C_CLIENT_END };
-static const unsigned short *const forces[] = { force, NULL };
-
-static struct i2c_client_address_data addr_data = {
- .forces = forces
-};
-
-struct i2c_driver MT6626_driver = {
- .probe = fm_i2c_probe,
- .remove = fm_i2c_remove,
- .detect = fm_i2c_detect,
- .driver.name = MT6626_DEV,
- .id_table = &fm_i2c_id,
- .address_data = &addr_data,
-};
-
-static struct i2c_client *g_client;
-
-static int fm_i2c_probe(struct i2c_client *client, const struct i2c_device_id *id)
-{
- int ret = 0;
-
- WCN_DBG(FM_NTC | LINK, "%s\n", __func__);
- g_client = client;
-
- return ret;
-}
-
-static int fm_i2c_detect(struct i2c_client *client, int kind, struct i2c_board_info *info)
-{
- WCN_DBG(FM_NTC | LINK, "%s\n", __func__);
- strcpy(info->type, MT6626_DEV);
- return 0;
-}
-
-static int fm_i2c_remove(struct i2c_client *client)
-{
- WCN_DBG(FM_NTC | LINK, "%s\n", __func__);
- return 0;
-}
-
-static fm_u32 fm_event_set(struct fm_link_event *thiz, fm_u32 mask)
-{
- thiz->flag |= mask;
- wake_up(&thiz->wq);
-
- return thiz->flag;
-}
-
-static fm_u32 fm_event_clr(struct fm_link_event *thiz, fm_u32 mask)
-{
- return thiz->flag &= ~mask;
-}
-
-/**
- * fm_event_check - sleep until a condition gets true or a timeout elapses
- * @thiz: the pointer of current object
- * @mask: bitmap in fm_u32
- * @timeout: timeout, in jiffies
- *
- * fm_event_set() has to be called after changing any variable that could
- * change the result of the wait condition.
- *
- * The function returns 0 if the @timeout elapsed, and the remaining
- * jiffies if the condition evaluated to true before the timeout elapsed.
- */
-static long fm_event_check(struct fm_link_event *thiz, fm_u32 mask, long timeout)
-{
- return wait_event_timeout(thiz->wq, ((thiz->flag & mask) == mask), timeout * HZ);
-}
-
-static fm_u32 fm_event_get(struct fm_link_event *thiz)
-{
- return thiz->flag;
-
-}
-
-static fm_u32 fm_event_rst(struct fm_link_event *thiz)
-{
- return thiz->flag = 0;
-}
-
-static struct fm_link_event *stcdone_event;
-
-fm_s32 fm_link_setup(void *data)
-{
- if (!(stcdone_event = kzalloc(sizeof(struct fm_link_event), GFP_KERNEL))) {
- WCN_DBG(FM_ALT | LINK, "kzalloc(fm_link_event) -ENOMEM\n");
- return -1;
- }
-
- stcdone_event->rst = fm_event_rst;
- stcdone_event->get = fm_event_get;
- stcdone_event->clr = fm_event_clr;
- stcdone_event->check = fm_event_check;
- stcdone_event->set = fm_event_set;
- init_waitqueue_head(&stcdone_event->wq);
- stcdone_event->rst(stcdone_event); /* set flag to 0x00000000 */
-
- WCN_DBG(FM_NTC | LINK, "fm link setup\n");
- return i2c_add_driver(&MT6626_driver);
-}
-
-fm_s32 fm_link_release(void)
-{
- if (stcdone_event) {
- kfree(stcdone_event);
- }
-
- WCN_DBG(FM_NTC | LINK, "fm link release\n");
- i2c_del_driver(&MT6626_driver);
- return 0;
-}
-
-/*
- * fm_ctrl_rx
- * the low level func to read a rigister
- * @addr - rigister address
- * @val - the pointer of target buf
- * If success, return 0; else error code
- */
-fm_s32 fm_ctrl_rx(fm_u8 addr, fm_u16 *val)
-{
- fm_s32 n;
- fm_s8 b[2] = { 0 };
-
- /* first, send addr to MT6626 */
- n = i2c_master_send(g_client, (char *)&addr, 1);
-
- if (n < 0) {
- WCN_DBG(FM_ALT | LINK, "rx 1, [addr=0x%02X] [err=%d]\n", addr, n);
- return -1;
- }
- /* second, receive two byte from MT6626 */
- n = i2c_master_recv(g_client, b, 2);
-
- if (n < 0) {
- WCN_DBG(FM_ALT | LINK, "rx 2, [addr=0x%02X] [err=%d]\n", addr, n);
- return -2;
- }
-
- *val = ((uint16_t) b[0] << 8 | (uint16_t) b[1]);
-
- return 0;
-}
-
-/*
- * fm_ctrl_tx
- * the low level func to write a rigister
- * @addr - rigister address
- * @val - value will be writed in the rigister
- * If success, return 0; else error code
- */
-fm_s32 fm_ctrl_tx(fm_u8 addr, fm_u16 val)
-{
- fm_s32 n;
- fm_s8 b[3];
-
- b[0] = addr;
- b[1] = (char)(val >> 8);
- b[2] = (char)(val & 0xFF);
-
- n = i2c_master_send(g_client, b, 3);
-
- if (n < 0) {
- WCN_DBG(FM_ALT | LINK, "tx, [addr=0x%02X] [err=%d]\n", addr, n);
- return -1;
- }
-
- return 0;
-}
-
-/*
- * fm_cmd_tx() - send cmd to FM firmware and wait event
- * @buf - send buffer
- * @len - the length of cmd
- * @mask - the event flag mask
- * @ cnt - the retry conter
- * @timeout - timeout per cmd
- * Return 0, if success; error code, if failed
- */
-fm_s32 fm_cmd_tx(fm_u8 *buf, fm_u16 len, fm_s32 mask, fm_s32 cnt, fm_s32 timeout,
- fm_s32(*callback) (struct fm_res_ctx *result))
-{
- return 0;
-}
-
-fm_bool fm_wait_stc_done(fm_u32 sec)
-{
- fm_s32 ret_time = 0;
-
- ret_time = stcdone_event->check(stcdone_event, FLAG_TEST, sec);
-
- if (!ret_time) {
- WCN_DBG(FM_WAR | LINK, "wait stc done fail\n");
- return fm_false;
- } else {
- WCN_DBG(FM_DBG | LINK, "wait stc done ok\n");
- }
-
- stcdone_event->clr(stcdone_event, FLAG_TEST);
- return fm_true;
-}
-
-fm_s32 fm_event_parser(fm_s32(*rds_parser) (struct rds_rx_t *, fm_s32))
-{
- fm_u16 tmp_reg;
-
- fm_ctrl_rx(FM_MAIN_INTR, &tmp_reg);
-
- if (tmp_reg & 0x0001) {
- /* clear status flag */
- fm_ctrl_tx(FM_MAIN_INTR, (tmp_reg & 0xFFFF) | 0x0001);
- stcdone_event->set(stcdone_event, FLAG_TEST);
- }
-
- if (tmp_reg & 0x0020) {
- /* clear status flag */
- fm_ctrl_tx(FM_MAIN_INTR, (tmp_reg & 0xFFFF) | 0x0020);
-
- /*Handle the RDS data that we get */
- if (rds_parser) {
- rds_parser(NULL, 0); /* mt6626 rds lib will get rds raw data by itself */
- } else {
- WCN_DBG(FM_WAR | LINK, "no method to parse RDS data\n");
- }
- }
-
- return 0;
-}
-
-fm_s32 fm_force_active_event(fm_u32 mask)
-{
- return 0;
-}
diff --git a/drivers/misc/mediatek/fmradio/mt6616/pub/mt6616_fm_rds.c b/drivers/misc/mediatek/fmradio/mt6616/pub/mt6616_fm_rds.c
deleted file mode 100644
index 06519c599..000000000
--- a/drivers/misc/mediatek/fmradio/mt6616/pub/mt6616_fm_rds.c
+++ /dev/null
@@ -1,299 +0,0 @@
-/* mt6626_rds.c
- *
- * (C) Copyright 2009
- * MediaTek <www.MediaTek.com>
- * hongcheng <hongcheng.xia@MediaTek.com>
- *
- * mt6626 FM Radio Driver
- *
- * 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.
- *
- * 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.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- */
-#include "fm_typedef.h"
-#include "fm_dbg.h"
-#include "fm_err.h"
-#include "fm_interface.h"
-#include "fm_stdlib.h"
-
-#include "mt6626_fm_reg.h"
-
-
-static fm_bool bRDS_FirstIn = fm_false;
-static fm_u32 gBLER_CHK_INTERVAL = 5000;
-static fm_u16 GOOD_BLK_CNT = 0, BAD_BLK_CNT;
-static fm_u8 BAD_BLK_RATIO;
-
-static struct fm_callback *fm_cb;
-static struct fm_basic_interface *fm_bi;
-
-
-static fm_bool mt6626_RDS_support(void);
-static fm_s32 mt6626_RDS_enable(void);
-static fm_s32 mt6626_RDS_disable(void);
-static fm_u16 mt6626_RDS_Get_GoodBlock_Counter(void);
-static fm_u16 mt6626_RDS_Get_BadBlock_Counter(void);
-static fm_u8 mt6626_RDS_Get_BadBlock_Ratio(void);
-static fm_u32 mt6626_RDS_Get_BlerCheck_Interval(void);
-static void mt6626_RDS_GetData(fm_u16 *data, fm_u16 datalen);
-static void mt6626_RDS_Init_Data(rds_t *pstRDSData);
-
-
-
-static fm_bool mt6626_RDS_support(void)
-{
- return fm_true;
-}
-
-static fm_s32 mt6626_RDS_enable(void)
-{
- fm_u16 dataRead;
-
- WCN_DBG(FM_DBG | RDSC, "rds enable\n");
- fm_bi->read(FM_RDS_CFG0, &dataRead);
- fm_bi->write(FM_RDS_CFG0, 6); /* set buf_start_th */
- fm_bi->read(FM_MAIN_CTRL, &dataRead);
- fm_bi->write(FM_MAIN_CTRL, dataRead | (RDS_MASK));
-
- return 0;
-}
-
-static fm_s32 mt6626_RDS_disable(void)
-{
- fm_u16 dataRead;
-
- WCN_DBG(FM_DBG | RDSC, "rds disable\n");
- fm_bi->read(FM_MAIN_CTRL, &dataRead);
- fm_bi->write(FM_MAIN_CTRL, dataRead & (~RDS_MASK));
-
- return 0;
-}
-
-static fm_u16 mt6626_RDS_Get_GoodBlock_Counter(void)
-{
- fm_u16 tmp_reg;
-
- fm_bi->read(FM_RDS_GOODBK_CNT, &tmp_reg);
- GOOD_BLK_CNT = tmp_reg;
- WCN_DBG(FM_DBG | RDSC, "get good block cnt:%d\n", (fm_s32) tmp_reg);
-
- return tmp_reg;
-}
-
-static fm_u16 mt6626_RDS_Get_BadBlock_Counter(void)
-{
- fm_u16 tmp_reg;
-
- fm_bi->read(FM_RDS_BADBK_CNT, &tmp_reg);
- BAD_BLK_CNT = tmp_reg;
- WCN_DBG(FM_DBG | RDSC, "get bad block cnt:%d\n", (fm_s32) tmp_reg);
-
- return tmp_reg;
-}
-
-static fm_u8 mt6626_RDS_Get_BadBlock_Ratio(void)
-{
- fm_u16 tmp_reg;
- fm_u16 gbc;
- fm_u16 bbc;
-
- gbc = mt6626_RDS_Get_GoodBlock_Counter();
- bbc = mt6626_RDS_Get_BadBlock_Counter();
- tmp_reg = (fm_u8) (bbc * 100 / (gbc + bbc));
- BAD_BLK_RATIO = tmp_reg;
- WCN_DBG(FM_DBG | RDSC, "get badblock ratio:%d\n", (fm_s32) tmp_reg);
-
- return tmp_reg;
-}
-
-static fm_u32 mt6626_RDS_Get_BlerCheck_Interval(void)
-{
- return gBLER_CHK_INTERVAL;
-}
-
-void mt6626_RDS_BlerCheck(struct fm *fm)
-{
- return;
-}
-
-static void RDS_Recovery_Handler(void)
-{
- fm_u16 tempData = 0;
-
- do {
- fm_bi->read(FM_RDS_DATA_REG, &tempData);
- fm_bi->read(FM_RDS_POINTER, &tempData);
- } while (tempData & 0x3);
-}
-
-static void mt6626_RDS_GetData(fm_u16 *data, fm_u16 datalen)
-{
-#define RDS_GROUP_DIFF_OFS 0x007C
-#define RDS_FIFO_DIFF 0x007F
-#define RDS_CRC_BLK_ADJ 0x0020
-#define RDS_CRC_CORR_CNT 0x001E
-#define RDS_CRC_INFO 0x0001
-
- fm_u16 CRC = 0, i = 0, RDS_adj = 0, RDSDataCount = 0, FM_WARorrCnt = 0;
- fm_u16 temp = 0, OutputPofm_s32 = 0;
-
- WCN_DBG(FM_DBG | RDSC, "get data\n");
- fm_bi->read(FM_RDS_FIFO_STATUS0, &temp);
- RDSDataCount = ((RDS_GROUP_DIFF_OFS & temp) << 2);
-
- if ((temp & RDS_FIFO_DIFF) >= 4) {
- /* block A data and info handling */
- fm_bi->read(FM_RDS_INFO, &temp);
- RDS_adj |= (temp & RDS_CRC_BLK_ADJ) << 10;
- CRC |= (temp & RDS_CRC_INFO) << 3;
- FM_WARorrCnt |= ((temp & RDS_CRC_CORR_CNT) << 11);
- fm_bi->read(FM_RDS_DATA_REG, &data[0]);
-
- /* block B data and info handling */
- fm_bi->read(FM_RDS_INFO, &temp);
- RDS_adj |= (temp & RDS_CRC_BLK_ADJ) << 9;
- CRC |= (temp & RDS_CRC_INFO) << 2;
- FM_WARorrCnt |= ((temp & RDS_CRC_CORR_CNT) << 7);
- fm_bi->read(FM_RDS_DATA_REG, &data[1]);
-
- /* block C data and info handling */
- fm_bi->read(FM_RDS_INFO, &temp);
- RDS_adj |= (temp & RDS_CRC_BLK_ADJ) << 8;
- CRC |= (temp & RDS_CRC_INFO) << 1;
- FM_WARorrCnt |= ((temp & RDS_CRC_CORR_CNT) << 3);
- fm_bi->read(FM_RDS_DATA_REG, &data[2]);
-
- /* block D data and info handling */
- fm_bi->read(FM_RDS_INFO, &temp);
- RDS_adj |= (temp & RDS_CRC_BLK_ADJ) << 7;
- CRC |= (temp & RDS_CRC_INFO);
- FM_WARorrCnt |= ((temp & RDS_CRC_CORR_CNT) >> 1);
- fm_bi->read(FM_RDS_DATA_REG, &data[3]);
-
- data[4] = (CRC | RDS_adj | RDSDataCount);
- data[5] = FM_WARorrCnt;
-
- fm_bi->read(FM_RDS_PWDI, &data[6]);
- fm_bi->read(FM_RDS_PWDQ, &data[7]);
-
- fm_bi->read(FM_RDS_POINTER, &OutputPofm_s32);
-
- /* Go fm_s32o RDS recovery handler while RDS output pofm_s32 doesn't align to 4 in numeric */
- if (OutputPofm_s32 & 0x3) {
- RDS_Recovery_Handler();
- }
-
- } else {
- for (; i < 8; i++)
- data[i] = 0;
- }
-}
-
-static void mt6626_RDS_Init_Data(rds_t *pstRDSData)
-{
- fm_u8 indx;
-
- fm_memset(pstRDSData, 0, sizeof(rds_t));
- bRDS_FirstIn = fm_true;
-
- for (indx = 0; indx < 64; indx++) {
- pstRDSData->RT_Data.TextData[0][indx] = 0x20;
- pstRDSData->RT_Data.TextData[1][indx] = 0x20;
- }
-
- for (indx = 0; indx < 8; indx++) {
- pstRDSData->PS_Data.PS[0][indx] = '\0';
- pstRDSData->PS_Data.PS[1][indx] = '\0';
- pstRDSData->PS_Data.PS[2][indx] = '\0';
- pstRDSData->PS_ON[indx] = 0x20;
- }
-}
-
-fm_bool mt6626_RDS_OnOff(struct fm *fm, fm_bool bFlag)
-{
- rds_t *pstRDSData = fm->pstRDSData;
-
- if (mt6626_RDS_support() == fm_false) {
- WCN_DBG(FM_ALT | RDSC, "mt6626_RDS_OnOff failed, RDS not support\n");
- return fm_false;
- }
-
- if (bFlag) {
- mt6626_RDS_Init_Data(pstRDSData);
- mt6626_RDS_enable();
- } else {
- mt6626_RDS_disable();
- }
-
- return fm_true;
-}
-
-extern fm_s32 rds_parser(rds_t *rds_dst, struct rds_rx_t *rds_raw, fm_s32 rds_size,
- fm_u16(*getfreq) (void));
-
-/* mt6626_RDS_Efm_s32_Handler - response FM RDS fm_s32errupt
- * @fm - main data structure of FM driver
- * This function first get RDS raw data, then call RDS spec parser
- */
-fm_s32 mt6628_rds_parser(rds_t *rds_dst, struct rds_rx_t *rds_raw, fm_s32 rds_size,
- fm_u16(*getfreq) (void))
-{
- struct rds_rx_t raw;
- fm_u16 fifo_offset;
-
- do {
- mt6626_RDS_GetData(&raw.data[0].blkA, sizeof(rds_packet_t) + 2);
- fifo_offset = (raw.data[0].crc & FM_RDS_DCO_FIFO_OFST) >> 5; /* FM_RDS_DATA_CRC_FFOST */
- WCN_DBG(FM_DBG | RDSC, "RDS fifo_offset:%d\n", fifo_offset);
- rds_parser(rds_dst, &raw, sizeof(rds_packet_t) + 2 * sizeof(fm_u16), getfreq);
- } while (fifo_offset > 1);
-
- return 0;
-}
-
-fm_s32 fm_rds_ops_register(struct fm_lowlevel_ops *ops)
-{
- fm_s32 ret = 0;
-
- FMR_ASSERT(ops);
- FMR_ASSERT(ops->bi.write);
- FMR_ASSERT(ops->bi.read);
- FMR_ASSERT(ops->bi.setbits);
- FMR_ASSERT(ops->bi.usdelay);
- fm_bi = &ops->bi;
-
- FMR_ASSERT(ops->cb.cur_freq_get);
- FMR_ASSERT(ops->cb.cur_freq_set);
- fm_cb = &ops->cb;
-
- ops->ri.rds_blercheck = mt6626_RDS_BlerCheck;
- ops->ri.rds_onoff = mt6626_RDS_OnOff;
- ops->ri.rds_parser = mt6628_rds_parser;
- ops->ri.rds_gbc_get = mt6626_RDS_Get_GoodBlock_Counter;
- ops->ri.rds_bbc_get = mt6626_RDS_Get_BadBlock_Counter;
- ops->ri.rds_bbr_get = mt6626_RDS_Get_BadBlock_Ratio;
- ops->ri.rds_bci_get = mt6626_RDS_Get_BlerCheck_Interval;
-
- return ret;
-}
-
-fm_s32 fm_rds_ops_unregister(struct fm_lowlevel_ops *ops)
-{
- fm_s32 ret = 0;
-
- FMR_ASSERT(ops);
-
- fm_bi = NULL;
- fm_memset(&ops->ri, 0, sizeof(struct fm_rds_interface));
- return ret;
-}
diff --git a/drivers/misc/mediatek/fmradio/mt6620/inc/mt6620_drv_dsp.h b/drivers/misc/mediatek/fmradio/mt6620/inc/mt6620_drv_dsp.h
deleted file mode 100644
index e69de29bb..000000000
--- a/drivers/misc/mediatek/fmradio/mt6620/inc/mt6620_drv_dsp.h
+++ /dev/null
diff --git a/drivers/misc/mediatek/fmradio/mt6620/inc/mt6620_fm.h b/drivers/misc/mediatek/fmradio/mt6620/inc/mt6620_fm.h
deleted file mode 100644
index 822e65de5..000000000
--- a/drivers/misc/mediatek/fmradio/mt6620/inc/mt6620_fm.h
+++ /dev/null
@@ -1,53 +0,0 @@
-/* mt6620_fm.h
- *
- * (C) Copyright 2011
- * MediaTek <www.MediaTek.com>
- * Hongcheng <hongcheng.xia@MediaTek.com>
- *
- * MT6620 FM Radio Driver -- head file
- *
- * 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.
- *
- * 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.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- */
-#ifndef __MT6620_FM_H__
-#define __MT6620_FM_H__
-
-#include "fm_typedef.h"
-
-/* #define FM_PowerOn_with_ShortAntenna */
-#define MT6620_RSSI_TH_LONG 0xFF01 /* FM radio long antenna RSSI threshold(11.375dBuV) */
-#define MT6620_RSSI_TH_SHORT 0xFEE0 /* FM radio short antenna RSSI threshold(-1dBuV) */
-#define MT6620_CQI_TH 0x00E9 /* FM radio Channel quality indicator threshold(0x0000~0x00FF) */
-#define MT6620_SEEK_SPACE 1 /* FM radio seek space,1:100KHZ; 2:200KHZ */
-#define MT6620_SCAN_CH_SIZE 40 /* FM radio scan max channel size */
-#define MT6620_BAND 1 /* FM radio band, 1:87.5MHz~108.0MHz; 2:76.0MHz~90.0MHz; 3:76.0MHz~108.0MHz; 4:special */
-#define MT6620_BAND_FREQ_L 875 /* FM radio special band low freq(Default 87.5MHz) */
-#define MT6620_BAND_FREQ_H 1080 /* FM radio special band high freq(Default 108.0MHz) */
-#define MT6620_DEEMPHASIS_50us TRUE
-
-#define MT6620_SLAVE_ADDR 0xE0 /* 0x70 7-bit address */
-#define MT6620_MAX_COUNT 100
-#define MT6620_SCANTBL_SIZE 16 /* 16*uinit16_t */
-
-#define AFC_ON 0x01
-#if AFC_ON
-#define FM_MAIN_CTRL_INIT 0x480
-#else
-#define FM_MAIN_CTRL_INIT 0x080
-#endif
-
-#define ext_clk /* if define ext_clk use external reference clock or mask will use internal */
-#define MT6620_DEV "MT6620"
-
-#endif /* end of #ifndef __MT6620_FM_H__ */
diff --git a/drivers/misc/mediatek/fmradio/mt6620/inc/mt6620_fm_cmd.h b/drivers/misc/mediatek/fmradio/mt6620/inc/mt6620_fm_cmd.h
deleted file mode 100644
index 9e8f9deb9..000000000
--- a/drivers/misc/mediatek/fmradio/mt6620/inc/mt6620_fm_cmd.h
+++ /dev/null
@@ -1,65 +0,0 @@
-#ifndef __MT6620_FM_CMD_H__
-#define __MT6620_FM_CMD_H__
-
-#include <linux/types.h>
-#include "fm_typedef.h"
-
-/* FM basic-operation's opcode */
-#define FM_BOP_BASE (0x80)
-enum {
- FM_WRITE_BASIC_OP = (FM_BOP_BASE + 0x00),
- FM_UDELAY_BASIC_OP = (FM_BOP_BASE + 0x01),
- FM_RD_UNTIL_BASIC_OP = (FM_BOP_BASE + 0x02),
- FM_MODIFY_BASIC_OP = (FM_BOP_BASE + 0x03),
- FM_MSLEEP_BASIC_OP = (FM_BOP_BASE + 0x04),
- FM_MAX_BASIC_OP = (FM_BOP_BASE + 0x05)
-};
-
-/* FM BOP's size */
-#define FM_WRITE_BASIC_OP_SIZE (3)
-#define FM_UDELAY_BASIC_OP_SIZE (4)
-#define FM_RD_UNTIL_BASIC_OP_SIZE (5)
-#define FM_MODIFY_BASIC_OP_SIZE (5)
-#define FM_MSLEEP_BASIC_OP_SIZE (4)
-
-fm_s32 mt6620_off_2_longANA_1(fm_u8 *buf, fm_s32 buf_size);
-fm_s32 mt6620_off_2_longANA_2(fm_u8 *buf, fm_s32 buf_size);
-
-fm_s32 mt6620_pwrup_digital_init_1(fm_u8 *buf, fm_s32 buf_size);
-fm_s32 mt6620_pwrup_digital_init_2(fm_u8 *buf, fm_s32 buf_size);
-fm_s32 mt6620_pwrup_digital_init_3(fm_u8 *buf, fm_s32 buf_size);
-
-fm_s32 mt6620_pwrdown(fm_u8 *buf, fm_s32 buf_size);
-fm_s32 mt6620_rampdown(fm_u8 *buf, fm_s32 buf_size);
-
-fm_s32 mt6620_tune_1(fm_u8 *buf, fm_s32 buf_size, fm_u16 freq);
-fm_s32 mt6620_tune_2(fm_u8 *buf, fm_s32 buf_size, fm_u16 freq);
-fm_s32 mt6620_tune_3(fm_u8 *buf, fm_s32 buf_size, fm_u16 freq);
-fm_s32 mt6620_fast_tune(fm_u8 *tx_buf, fm_s32 tx_buf_size, fm_u16 freq);
-fm_s32 mt6620_full_cqi_req(fm_u8 *buf, fm_s32 buf_size, fm_u16 freq, fm_s32 cnt, fm_s32 type);
-
-fm_s32 mt6620_seek_1(fm_u8 *buf, fm_s32 buf_size, fm_u16 seekdir, fm_u16 space, fm_u16 max_freq,
- fm_u16 min_freq);
-fm_s32 mt6620_seek_2(fm_u8 *buf, fm_s32 buf_size, fm_u16 seekdir, fm_u16 space, fm_u16 max_freq,
- fm_u16 min_freq);
-
-fm_s32 mt6620_scan_1(fm_u8 *buf, fm_s32 buf_size, fm_u16 scandir, fm_u16 space, fm_u16 max_freq,
- fm_u16 min_freq);
-fm_s32 mt6620_scan_2(fm_u8 *buf, fm_s32 buf_size, fm_u16 scandir, fm_u16 space, fm_u16 max_freq,
- fm_u16 min_freq);
-
-fm_s32 mt6620_get_reg(fm_u8 *buf, fm_s32 buf_size, fm_u8 addr);
-fm_s32 mt6620_set_reg(fm_u8 *buf, fm_s32 buf_size, fm_u8 addr, fm_u16 value);
-fm_s32 mt6620_rampdown_tx(unsigned char *tx_buf, int tx_buf_size);
-fm_s32 mt6620_tune_txscan(unsigned char *tx_buf, int tx_buf_size, uint16_t freq);
-fm_s32 mt6620_tune_tx(unsigned char *tx_buf, int tx_buf_size, uint16_t freq);
-fm_s32 mt6620_rds_rx_enable(unsigned char *tx_buf, int tx_buf_size);
-fm_s32 mt6620_rds_rx_disable(unsigned char *tx_buf, int tx_buf_size);
-fm_s32 mt6620_rds_tx(unsigned char *tx_buf, int tx_buf_size, uint16_t pi, uint16_t *ps,
- uint16_t *other_rds, uint8_t other_rds_cnt);
-fm_s32 mt6620_off_2_tx_shortANA(fm_u8 *tx_buf, fm_s32 tx_buf_size);
-fm_s32 mt6620_dig_init(fm_u8 *tx_buf, fm_s32 tx_buf_size);
-
-extern fm_s32 fm_get_channel_space(int freq);
-
-#endif
diff --git a/drivers/misc/mediatek/fmradio/mt6620/inc/mt6620_fm_cust_cfg.h b/drivers/misc/mediatek/fmradio/mt6620/inc/mt6620_fm_cust_cfg.h
deleted file mode 100644
index 5751ea50e..000000000
--- a/drivers/misc/mediatek/fmradio/mt6620/inc/mt6620_fm_cust_cfg.h
+++ /dev/null
@@ -1,133 +0,0 @@
-/*
- *
- * (C) Copyright 2009
- * MediaTek <www.MediaTek.com>
- * William Chung <William.Chung@MediaTek.com>
- *
- * MT6516 AR10x0 FM Radio Driver
- *
- * 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.
- *
- * 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.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- */
-
-#ifndef __FM_CUST_CFG_H__
-#define __FM_CUST_CFG_H__
-
-/* scan sort algorithm */
-enum {
- FM_SCAN_SORT_NON = 0,
- FM_SCAN_SORT_UP,
- FM_SCAN_SORT_DOWN,
- FM_SCAN_SORT_MAX
-};
-/* ***********************************FM config for customer *********************************** */
-/* RX */
-#define FMR_RSSI_TH_LONG_MT6620 0x0301 /* FM radio long antenna RSSI threshold(11.375dBuV) */
-#define FMR_RSSI_TH_SHORT_MT6620 0x02E0 /* FM radio short antenna RSSI threshold(-1dBuV) */
-#define FMR_CQI_TH_MT6620 0x00E9 /* FM radio Channel quality indicator threshold(0x0000~0x00FF) */
-/* ***********************************FM config for engineer *********************************** */
-/* RX */
-#define FMR_MR_TH_MT6620 0x01BD /* FM radio MR threshold */
-#if 0
-/* ***************************************************************************************** */
-/* ***********************************FM config for customer *********************************** */
-/* ***************************************************************************************** */
-#define FMR_SEEK_SPACE 1 /* FM radio seek space,1:100KHZ; 2:200KHZ */
-#define FMR_SCAN_CH_SIZE 40 /* FM radio scan max channel size */
-#define FMR_BAND 1 /* FM radio band, 1:87.5MHz~108.0MHz; 2:76.0MHz~90.0MHz; 3:76.0MHz~108.0MHz; 4:special */
-#define FM_SCAN_SORT_SELECT FM_SCAN_SORT_NON
-#define FM_FAKE_CH_NUM 1
-#define FM_FAKE_CH_RSSI 40
-#define FM_FAKE_CH_1 1075
-#define FM_FAKE_CH_2 0
-#define FM_FAKE_CH_3 0
-#define FM_FAKE_CH_4 0
-#define FM_FAKE_CH_5 0
-
-/* TX */
-#define FMTX_PWR_LEVEL_MAX 120
-
-/* ***************************************************************************************** */
-#define ADDR_SCAN_TH 0xE0 /* scan thrshold register */
-#define ADDR_CQI_TH 0xE1 /* scan CQI register */
-
-/* TX */
-#define FMTX_SCAN_HOLE_LOW 923 /* 92.3MHz~95.4MHz should not show to user */
-#define FMTX_SCAN_HOLE_HIGH 954 /* 92.3MHz~95.4MHz should not show to user */
-/* ***************************************************************************************** */
-
-/* errno */
-#define FM_SUCCESS 0
-#define FM_FAILED 1
-#define FM_EPARM 2
-#define FM_BADSTATUS 3
-#define FM_TUNE_FAILED 4
-#define FM_SEEK_FAILED 5
-#define FM_BUSY 6
-#define FM_SCAN_FAILED 7
-
-/* max scan chl num */
-#define FM_MAX_CHL_SIZE FMR_SCAN_CH_SIZE
-/* auto HiLo */
-#define FM_AUTO_HILO_OFF 0
-#define FM_AUTO_HILO_ON 1
-
-#define FM_CHIP_AR1000 0x1000
-#define FM_CHIP_MT5192 0x91
-#define FM_CHIP_MT5193 0x92
-#define FM_CHIP_MT6616 0x6616
-#define FM_CHIP_MT6626 0x6626
-#define FM_CHIP_MT6628 0x6628
-#define FM_CHIP_MT6620 0x6620
-#define FM_CHIP_UNSUPPORTED 0xffff
-
-/* seek threshold */
-#define FM_SEEKTH_LEVEL_DEFAULT 4
-#endif
-/* RX */
-#define FM_RX_RSSI_TH_LONG_MT6620 -296 /* FM radio long antenna RSSI threshold(-4dBuV) */
-#define FM_RX_RSSI_TH_SHORT_MT6620 -296 /* FM radio short antenna RSSI threshold(-4dBuV) */
-#define FM_RX_DESENSE_RSSI_MT6620 -245
-#define FM_RX_PAMD_TH_MT6620 -12
-#define FM_RX_MR_TH_MT6620 -67
-#define FM_RX_ATDC_TH_MT6620 219
-#define FM_RX_PRX_TH_MT6620 64
-#define FM_RX_SMG_TH_MT6620 6 /* FM soft-mute gain threshold */
-#define FM_RX_DEEMPHASIS_MT6620 0 /* 0-50us, China Mainland; 1-75us China Taiwan */
-#define FM_RX_OSC_FREQ_MT6620 0 /* 0-26MHz; 1-19MHz; 2-24MHz; 3-38.4MHz; 4-40MHz; 5-52MHz */
-#if 0
-#define FM_RX_RSSI_TH_LONG_MT6620 0xF2D8 /* FM radio long antenna RSSI threshold(-4dBuV) */
-#define FM_RX_RSSI_TH_SHORT_MT6620 0xF2D8 /* FM radio short antenna RSSI threshold(-4dBuV) */
-#define FM_RX_CQI_TH_MT6620 0x00E9 /* FM radio Channel quality indicator threshold(0x0000~0x00FF) */
-#define FM_RX_MR_TH_MT6620 0x01BD /* FM radio MR threshold */
-#define FM_RX_SMG_TH_MT6620 0x4025 /* FM soft-mute gain threshold */
-#define FM_RX_SEEK_SPACE_MT6620 1 /* FM radio seek space,1:100KHZ; 2:200KHZ */
-#define FM_RX_SCAN_CH_SIZE_MT6620 40 /* FM radio scan max channel size */
-#define FM_RX_BAND_MT6620 1 /* FM radio band, 1:87.5MHz~108.0MHz; 2:76.0MHz~90.0MHz; 3:76.0MHz~108.0MHz; 4:special */
-
-#define FM_RX_SCAN_SORT_SELECT_MT6620 FM_SCAN_SORT_NON
-#define FM_RX_FAKE_CH_NUM_MT6620 1
-#define FM_RX_FAKE_CH_RSSI_MT6620 40
-#define FM_RX_FAKE_CH_1_MT6620 1075
-#define FM_RX_FAKE_CH_2_MT6620 0
-#define FM_RX_FAKE_CH_3_MT6620 0
-#define FM_RX_FAKE_CH_4_MT6620 0
-#define FM_RX_FAKE_CH_5_MT6620 0
-#endif
-/* TX */
-#define FM_TX_PWR_LEVEL_MAX_MT6620 120
-#define FM_TX_SCAN_HOLE_LOW_MT6620 923 /* 92.3MHz~95.4MHz should not show to user */
-#define FM_TX_SCAN_HOLE_HIGH_MT6620 954 /* 92.3MHz~95.4MHz should not show to user */
-
-#endif /* __FM_CUST_CFG_H__ */
diff --git a/drivers/misc/mediatek/fmradio/mt6620/inc/mt6620_fm_lib.h b/drivers/misc/mediatek/fmradio/mt6620/inc/mt6620_fm_lib.h
deleted file mode 100644
index 474894096..000000000
--- a/drivers/misc/mediatek/fmradio/mt6620/inc/mt6620_fm_lib.h
+++ /dev/null
@@ -1,109 +0,0 @@
-#ifndef __MT6620_FM_LIB_H__
-#define __MT6620_FM_LIB_H__
-
-#include "fm_typedef.h"
-
-#define MT6620_VOL_MAX 0x2B /* 43 volume(0-15) */
-enum {
- DSPPATCH = 0xFFF9,
- USDELAY = 0xFFFA,
- MSDELAY = 0xFFFB,
- HW_VER = 0xFFFD,
- POLL_N = 0xFFFE, /* poling check if bit(n) is '0' */
- POLL_P = 0xFFFF, /* polling check if bit(n) is '1' */
-};
-
-enum {
- FM_PUS_DSPPATCH = DSPPATCH,
- FM_PUS_USDELAY = USDELAY,
- FM_PUS_MSDELAY = MSDELAY,
- FM_PUS_HW_VER = HW_VER,
- FM_PUS_POLL_N = POLL_N, /* poling check if bit(n) is '0' */
- FM_PUS_POLL_P = POLL_P, /* polling check if bit(n) is '1' */
- FM_PUS_MAX
-};
-
-enum {
- DSP_PATH = 0x02,
- DSP_COEFF = 0x03,
- DSP_HW_COEFF = 0x04
-};
-
-enum IMG_TYPE {
- IMG_WRONG = 0,
- IMG_ROM,
- IMG_PATCH,
- IMG_COEFFICIENT,
- IMG_HW_COEFFICIENT
-};
-
-enum {
- mt6620_E1 = 0,
- mt6620_E2
-};
-
-struct mt6620_fm_softmute_tune_cqi_t {
- fm_u16 ch; /* current frequency */
- fm_u16 rssi; /* RSSI of current channel (raw data) */
- fm_u16 pamd; /* PAMD of current channel (raw data) */
- fm_u16 mr; /* MR of current channel (raw data) */
- fm_u16 atdc; /* ATDC of current channel (raw data) */
- fm_u16 prx; /* PRX of current channel (raw data) */
- fm_u16 smg; /* soft mute gain of current channel (raw data) */
-};
-
-#define BITn(n) (uint16_t)(1<<(n))
-#define MASK(n) (uint16_t)(~(1<<(n)))
-/* #define HiSideTableSize 1 */
-#define FM_TX_PWR_CTRL_FREQ_THR 890
-#define FM_TX_PWR_CTRL_TMP_THR_UP 45
-#define FM_TX_PWR_CTRL_TMP_THR_DOWN 0
-
-#define FM_TX_TRACKING_TIME_MAX 10000 /* TX VCO tracking time, default 100ms */
-
-/* #define MT6620_FPGA */
-/* #define FM_MAIN_PGSEL (0x9F) */
-/*
-#define FM_MAIN_BASE (0x0)
-#define FM_MAIN_BITMAP0 (FM_MAIN_BASE + 0x80)
-#define FM_MAIN_BITMAP1 (FM_MAIN_BASE + 0x81)
-#define FM_MAIN_BITMAP2 (FM_MAIN_BASE + 0x82)
-#define FM_MAIN_BITMAP3 (FM_MAIN_BASE + 0x83)
-#define FM_MAIN_BITMAP4 (FM_MAIN_BASE + 0x84)
-#define FM_MAIN_BITMAP5 (FM_MAIN_BASE + 0x85)
-#define FM_MAIN_BITMAP6 (FM_MAIN_BASE + 0x86)
-#define FM_MAIN_BITMAP7 (FM_MAIN_BASE + 0x87)
-#define FM_MAIN_BITMAP8 (FM_MAIN_BASE + 0x88)
-#define FM_MAIN_BITMAP9 (FM_MAIN_BASE + 0x89)
-#define FM_MAIN_BITMAPA (FM_MAIN_BASE + 0x8a)
-#define FM_MAIN_BITMAPB (FM_MAIN_BASE + 0x8b)
-#define FM_MAIN_BITMAPC (FM_MAIN_BASE + 0x8c)
-#define FM_MAIN_BITMAPD (FM_MAIN_BASE + 0x8d)
-#define FM_MAIN_BITMAPE (FM_MAIN_BASE + 0x8e)
-#define FM_MAIN_BITMAPF (FM_MAIN_BASE + 0x8f)
-*/
-enum group_idx {
- mono = 0,
- stereo,
- RSSI_threshold,
- HCC_Enable,
- PAMD_threshold,
- Softmute_Enable,
- De_emphasis,
- HL_Side,
- Demod_BW,
- Dynamic_Limiter,
- Softmute_Rate,
- AFC_Enable,
- Softmute_Level,
- Analog_Volume,
- GROUP_TOTAL_NUMS
-};
-
-enum item_idx {
- Sblend_OFF = 0,
- Sblend_ON,
- ITEM_TOTAL_NUMS
-};
-
-#endif
diff --git a/drivers/misc/mediatek/fmradio/mt6620/inc/mt6620_fm_link.h b/drivers/misc/mediatek/fmradio/mt6620/inc/mt6620_fm_link.h
deleted file mode 100644
index 920ed7b12..000000000
--- a/drivers/misc/mediatek/fmradio/mt6620/inc/mt6620_fm_link.h
+++ /dev/null
@@ -1,74 +0,0 @@
-/* mt6620_fm_link.h
- *
- * (C) Copyright 2011
- * MediaTek <www.MediaTek.com>
- * Hongcheng <hongcheng.xia@MediaTek.com>
- *
- * MT6620 FM Radio Driver -- setup data link
- *
- * 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.
- *
- * 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.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- */
-
-#ifndef __MT6620_FM_LINK_H__
-#define __MT6620_FM_LINK_H__
-#if 0
-#include <linux/wait.h>
-#include "fm_link.h"
-
-#define RX_BUF_SIZE 128
-#define TX_BUF_SIZE 1024
-
-#define SW_RETRY_CNT (2)
-#define SW_RETRY_CNT_MAX (5)
-#define SW_WAIT_TIMEOUT_MAX (100)
-
-/* FM operation timeout define for error handle */
-#define TEST_TIMEOUT (3)
-#define FSPI_EN_TIMEOUT (3)
-#define FSPI_MUXSEL_TIMEOUT (3)
-#define FSPI_RD_TIMEOUT (3)
-#define FSPI_WR_TIMEOUT (3)
-#define I2C_RD_TIMEOUT (3)
-#define I2C_WR_TIMEOUT (3)
-#define EN_TIMEOUT (10)
-#define RST_TIMEOUT (3)
-#define TUNE_TIMEOUT (3)
-#define SEEK_TIMEOUT (15)
-#define SCAN_TIMEOUT (15) /* usualy scan will cost 10 seconds */
-#define RDS_RX_EN_TIMEOUT (3)
-#define RDS_DATA_TIMEOUT (100)
-#define RAMPDOWN_TIMEOUT (3)
-#define MCUCLK_TIMEOUT (3)
-#define MODEMCLK_TIMEOUT (3)
-#define RDS_TX_TIMEOUT (3)
-#define PATCH_TIMEOUT (5)
-#define COEFF_TIMEOUT (5)
-#define HWCOEFF_TIMEOUT (5)
-#define ROM_TIMEOUT (5)
-
-struct fm_link_event {
- /* data */
- volatile fm_u32 flag;
- wait_queue_head_t wq;
- struct fm_res_ctx result; /* seek/scan/read/RDS */
- /* methods */
- fm_u32(*set) (struct fm_link_event *thiz, fm_u32 mask);
- fm_u32(*clr) (struct fm_link_event *thiz, fm_u32 mask);
- long (*check) (struct fm_link_event *thiz, fm_u32 mask, long timeout);
- fm_u32(*get) (struct fm_link_event *thiz);
- fm_u32(*rst) (struct fm_link_event *thiz);
-};
-#endif
-#endif
diff --git a/drivers/misc/mediatek/fmradio/mt6620/inc/mt6620_fm_reg.h b/drivers/misc/mediatek/fmradio/mt6620/inc/mt6620_fm_reg.h
deleted file mode 100644
index 2c0e978fb..000000000
--- a/drivers/misc/mediatek/fmradio/mt6620/inc/mt6620_fm_reg.h
+++ /dev/null
@@ -1,97 +0,0 @@
-#ifndef __MT6620_FM_REG_H__
-#define __MT6620_FM_REG_H__
-
-enum MT6620_REG {
- FM_MAIN_CG1_CTRL = 0x60,
- FM_MAIN_CG2_CTRL = 0x61,
- FM_MAIN_HWVER = 0x62,
- FM_MAIN_CTRL = 0x63,
- FM_CHANNEL_SET = 0x65,
- FM_MAIN_CFG1 = 0x66,
- FM_MAIN_CFG2 = 0x67,
- FM_MAIN_MCLKDESENSE = 0x38,
- FM_MAIN_INTR = 0x69,
- FM_MAIN_INTRMASK = 0x6A,
- FM_MAIN_EXTINTRMASK = 0x6B,
- FM_RSSI_IND = 0xE8,
- FM_RSSI_TH = 0x6D,
- FM_MAIN_RESET = 0x6E,
- FM_MAIN_CHANDETSTAT = 0x6F,
- FM_RDS_CFG0 = 0x80,
- FM_RDS_INFO = 0x81,
- FM_RDS_DATA_REG = 0x82,
- FM_RDS_GOODBK_CNT = 0xC6, /* page3 0xC6 */
- FM_RDS_BADBK_CNT = 0xC7, /* page3 0xC7 */
- FM_RDS_PWDI = 0x85,
- FM_RDS_PWDQ = 0x86,
- FM_RDS_FIFO_STATUS0 = 0x87,
- FM_FT_CON9 = 0x8F,
- FM_DSP_PATCH_CTRL = 0x90,
- FM_DSP_PATCH_OFFSET = 0x91,
- FM_DSP_PATCH_DATA = 0x92,
- FM_DSP_MEM_CTRL4 = 0x93,
- FM_MAIN_PGSEL = 0x9F,
- FM_ADDR_PAMD = 0xE9,
- FM_RDS_BDGRP_ABD_CTRL_REG = 0xB6,
- FM_RDS_POINTER = 0xF0,
- FM_MR_IND = 0xF2,
-};
-#define FM_TXSCAN_RSSI_TH (-250)
-#define FM_TXSCAN_PAMD_TH (-20)
-#define FM_TXSCAN_MR_TH (-38)
-
-/* RDS_BDGRP_ABD_CTRL_REG */
-enum {
- BDGRP_ABD_EN = 0x0001,
- BER_RUN = 0x2000
-};
-#define FM_DAC_CON1 0x83
-#define FM_DAC_CON2 0x84
-#define FM_FT_CON0 0x86
-#define FM_I2S_CON0 0x90
-#define FM_STEROMONO_CTR (0xE0)
-enum {
- FT_EN = 0x0001
-};
-
-enum {
- I2S_EN = 0x0001,
- FORMAT = 0x0002,
- WLEN = 0x0004,
- I2S_SRC = 0x0008
-};
-
-/* FM_MAIN_CTRL */
-enum {
- TUNE = 0x0001,
- SEEK = 0x0002,
- SCAN = 0x0004,
- RDS_MASK = 0x0010,
- MUTE = 0x0020,
- RDS_BRST = 0x0040,
- RAMP_DOWN = 0x0100,
-};
-
-/* FM_MAIN_INTR */
-enum {
- FM_INTR_STC_DONE = 0x0001,
- FM_INTR_IQCAL_DONE = 0x0002,
- FM_INTR_DESENSE_HIT = 0x0004,
- FM_INTR_CHNL_CHG = 0x0008,
- FM_INTR_SW_INTR = 0x0010,
- FM_INTR_RDS = 0x0020
-};
-
-enum {
- ANTENNA_TYPE = 0x0010,
-};
-/* FM reg page */
-enum FM_PAGE {
- FM_PG0 = 0,
- FM_PG1,
- FM_PG2,
- FM_PG3,
- FM_PGMAX
-};
-
-#endif /* __MT6620_FM_REG_H__ */
diff --git a/drivers/misc/mediatek/fmradio/mt6620/pub/mt6620_fm_cmd.c b/drivers/misc/mediatek/fmradio/mt6620/pub/mt6620_fm_cmd.c
deleted file mode 100644
index 3ef13c4e8..000000000
--- a/drivers/misc/mediatek/fmradio/mt6620/pub/mt6620_fm_cmd.c
+++ /dev/null
@@ -1,1487 +0,0 @@
-#include <linux/kernel.h>
-#include <linux/types.h>
-
-#include "fm_typedef.h"
-#include "fm_dbg.h"
-#include "fm_err.h"
-#include "fm_rds.h"
-#include "fm_link.h"
-
-#include "mt6620_fm_reg.h"
-/* #include "mt6620_fm_link.h" */
-#include "mt6620_fm.h"
-#include "mt6620_fm_cmd.h"
-#include "mt6620_fm_cust_cfg.h"
-
-static fm_s32 fm_bop_write(fm_u8 addr, fm_u16 value, fm_u8 * buf, fm_s32 size)
-{
- if (size < (FM_WRITE_BASIC_OP_SIZE + 2)) {
- return (-1);
- }
-
- if (buf == NULL) {
- return (-2);
- }
-
- buf[0] = FM_WRITE_BASIC_OP;
- buf[1] = FM_WRITE_BASIC_OP_SIZE;
- buf[2] = addr;
- buf[3] = (fm_u8) ((value) & 0x00FF);
- buf[4] = (fm_u8) ((value >> 8) & 0x00FF);
-
- WCN_DBG(FM_DBG | CHIP, "%02x %02x %02x %02x %02x\n", buf[0], buf[1], buf[2], buf[3],
- buf[4]);
-
- return (FM_WRITE_BASIC_OP_SIZE + 2);
-}
-
-static fm_s32 fm_bop_udelay(fm_u32 value, fm_u8 *buf, fm_s32 size)
-{
- if (size < (FM_UDELAY_BASIC_OP_SIZE + 2)) {
- return (-1);
- }
-
- if (buf == NULL) {
- return (-2);
- }
-
- buf[0] = FM_UDELAY_BASIC_OP;
- buf[1] = FM_UDELAY_BASIC_OP_SIZE;
- buf[2] = (fm_u8) ((value) & 0x000000FF);
- buf[3] = (fm_u8) ((value >> 8) & 0x000000FF);
- buf[4] = (fm_u8) ((value >> 16) & 0x000000FF);
- buf[5] = (fm_u8) ((value >> 24) & 0x000000FF);
-
- WCN_DBG(FM_DBG | CHIP, "%02x %02x %02x %02x %02x %02x\n", buf[0], buf[1], buf[2], buf[3],
- buf[4], buf[5]);
-
- return (FM_UDELAY_BASIC_OP_SIZE + 2);
-}
-
-static fm_s32 fm_bop_rd_until(fm_u8 addr, fm_u16 mask, fm_u16 value, fm_u8 *buf, fm_s32 size)
-{
- if (size < (FM_RD_UNTIL_BASIC_OP_SIZE + 2)) {
- return (-1);
- }
-
- if (buf == NULL) {
- return (-2);
- }
-
- buf[0] = FM_RD_UNTIL_BASIC_OP;
- buf[1] = FM_RD_UNTIL_BASIC_OP_SIZE;
- buf[2] = addr;
- buf[3] = (fm_u8) ((mask) & 0x00FF);
- buf[4] = (fm_u8) ((mask >> 8) & 0x00FF);
- buf[5] = (fm_u8) ((value) & 0x00FF);
- buf[6] = (fm_u8) ((value >> 8) & 0x00FF);
-
- WCN_DBG(FM_DBG | CHIP, "%02x %02x %02x %02x %02x %02x %02x\n", buf[0], buf[1], buf[2],
- buf[3], buf[4], buf[5], buf[6]);
-
- return (FM_RD_UNTIL_BASIC_OP_SIZE + 2);
-}
-
-static fm_s32 fm_bop_modify(fm_u8 addr, fm_u16 mask_and, fm_u16 mask_or, fm_u8 *buf, fm_s32 size)
-{
- if (size < (FM_MODIFY_BASIC_OP_SIZE + 2)) {
- return (-1);
- }
-
- if (buf == NULL) {
- return (-2);
- }
-
- buf[0] = FM_MODIFY_BASIC_OP;
- buf[1] = FM_MODIFY_BASIC_OP_SIZE;
- buf[2] = addr;
- buf[3] = (fm_u8) ((mask_and) & 0x00FF);
- buf[4] = (fm_u8) ((mask_and >> 8) & 0x00FF);
- buf[5] = (fm_u8) ((mask_or) & 0x00FF);
- buf[6] = (fm_u8) ((mask_or >> 8) & 0x00FF);
-
- WCN_DBG(FM_DBG | CHIP, "%02x %02x %02x %02x %02x %02x %02x\n", buf[0], buf[1], buf[2],
- buf[3], buf[4], buf[5], buf[6]);
-
- return (FM_MODIFY_BASIC_OP_SIZE + 2);
-}
-
-
-/*
- * mt6620_pwrup_clock_on - Wholechip FM Power Up: step 1, FM Digital Clock enable
- * @buf - target buf
- * @buf_size - buffer size
- * return package size
- */
-fm_s32 mt6620_off_2_longANA_1(fm_u8 *buf, fm_s32 buf_size)
-{
- fm_s32 pkt_size = 0;
-
- if (buf_size < TX_BUF_SIZE) {
- return (-1);
- }
-
- buf[0] = FM_TASK_COMMAND_PKT_TYPE;
- buf[1] = FM_ENABLE_OPCODE;
- pkt_size = 4;
-
- /* A01 Turn on the bandgap and central biasing core */
- pkt_size += fm_bop_write(0x01, 0x4A00, &buf[pkt_size], buf_size - pkt_size); /* wr 1 4A00 */
- pkt_size += fm_bop_udelay(30, &buf[pkt_size], buf_size - pkt_size); /* delay 30 */
- pkt_size += fm_bop_write(0x01, 0x6A00, &buf[pkt_size], buf_size - pkt_size); /* wr 1 6A00 */
- pkt_size += fm_bop_udelay(50, &buf[pkt_size], buf_size - pkt_size); /* delay 50 */
- /* A02 Initialise the LDO's Output */
- pkt_size += fm_bop_write(0x02, 0x299C, &buf[pkt_size], buf_size - pkt_size); /* wr 2 299C */
- /* A03 Enable RX, ADC and ADPLL LDO */
- pkt_size += fm_bop_write(0x01, 0x6B82, &buf[pkt_size], buf_size - pkt_size); /* wr 1 6B82 */
- /* A04 Update FMRF optimized register settings */
- pkt_size += fm_bop_write(0x04, 0x0142, &buf[pkt_size], buf_size - pkt_size); /* wr 4 0142 */
- pkt_size += fm_bop_write(0x05, 0x00E7, &buf[pkt_size], buf_size - pkt_size); /* wr 5 00E7 */
- pkt_size += fm_bop_write(0x0A, 0x0060, &buf[pkt_size], buf_size - pkt_size); /* wr a 0060 */
- pkt_size += fm_bop_write(0x0C, 0xA88C, &buf[pkt_size], buf_size - pkt_size); /* wr c A88C */
- pkt_size += fm_bop_write(0x0D, 0x0888, &buf[pkt_size], buf_size - pkt_size); /* wr d 0888 */
- pkt_size += fm_bop_write(0x10, 0x1E8D, &buf[pkt_size], buf_size - pkt_size); /* wr 10 1E8D */
- pkt_size += fm_bop_write(0x27, 0x0005, &buf[pkt_size], buf_size - pkt_size); /* wr 27 0005 */
- pkt_size += fm_bop_write(0x0E, 0x0040, &buf[pkt_size], buf_size - pkt_size); /* wr e 0040 */
- pkt_size += fm_bop_write(0x03, 0x50F0, &buf[pkt_size], buf_size - pkt_size); /* wr 3 50f0 */
- pkt_size += fm_bop_write(0x3F, 0xAD06, &buf[pkt_size], buf_size - pkt_size); /* wr 3f AD06 */
- pkt_size += fm_bop_write(0x3E, 0x3280, &buf[pkt_size], buf_size - pkt_size); /* wr 3e 3280 */
- pkt_size += fm_bop_write(0x06, 0x0124, &buf[pkt_size], buf_size - pkt_size); /* wr 6 0124 */
- pkt_size += fm_bop_write(0x08, 0x15B8, &buf[pkt_size], buf_size - pkt_size); /* wr 8 15B8 */
- /* A05 Enable RX related blocks */
- pkt_size += fm_bop_write(0x28, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* wr 28 0000 */
- pkt_size += fm_bop_write(0x00, 0x0166, &buf[pkt_size], buf_size - pkt_size); /* wr 0 0166 */
- pkt_size += fm_bop_write(0x3A, 0x0004, &buf[pkt_size], buf_size - pkt_size); /* wr 3a 0004 */
- pkt_size += fm_bop_write(0x37, 0x2590, &buf[pkt_size], buf_size - pkt_size); /* wr 37 2590 */
- /* FM ADPLL Power Up */
- /* () for 16.384M mode, otherwise 15.36M */
- pkt_size += fm_bop_write(0x25, 0x040F, &buf[pkt_size], buf_size - pkt_size); /* wr 25 040f */
- pkt_size += fm_bop_write(0x20, 0x2720, &buf[pkt_size], buf_size - pkt_size); /* wr 20 2720 */
- /* XHC, 2011/03/18, [wr 22 9980->6680] */
- pkt_size += fm_bop_write(0x22, 0x6680, &buf[pkt_size], buf_size - pkt_size); /* wr 22 9980 */
- pkt_size += fm_bop_write(0x25, 0x080F, &buf[pkt_size], buf_size - pkt_size); /* wr 25 080f */
- pkt_size += fm_bop_write(0x1E, 0x0863, &buf[pkt_size], buf_size - pkt_size); /* wr 1e 0863(0A63) */
- pkt_size += fm_bop_udelay(5000, &buf[pkt_size], buf_size - pkt_size); /* delay 5000 */
- pkt_size += fm_bop_write(0x1E, 0x0865, &buf[pkt_size], buf_size - pkt_size); /* wr 1e 0865 (0A65) */
- pkt_size += fm_bop_udelay(5000, &buf[pkt_size], buf_size - pkt_size); /* delay 5000 */
- pkt_size += fm_bop_write(0x1E, 0x0871, &buf[pkt_size], buf_size - pkt_size); /* wr 1e 0871 (0A71) */
-
- buf[2] = (fm_u8) ((pkt_size - 4) & 0x00FF);
- buf[3] = (fm_u8) (((pkt_size - 4) >> 8) & 0x00FF);
-
- return pkt_size;
-}
-
-fm_s32 mt6620_off_2_longANA_2(fm_u8 *buf, fm_s32 buf_size)
-{
- fm_s32 pkt_size = 0;
-
- if (buf_size < TX_BUF_SIZE) {
- return (-1);
- }
-
- buf[0] = FM_TASK_COMMAND_PKT_TYPE;
- buf[1] = FM_ENABLE_OPCODE;
- pkt_size = 4;
-
- pkt_size += fm_bop_udelay(100000, &buf[pkt_size], buf_size - pkt_size); /* delay 100000 */
- pkt_size += fm_bop_write(0x2A, 0x1026, &buf[pkt_size], buf_size - pkt_size); /* wr 2a 1026 */
- /* FM RC Calibration */
- pkt_size += fm_bop_write(0x00, 0x01E6, &buf[pkt_size], buf_size - pkt_size); /* wr 0 01E6 */
- pkt_size += fm_bop_udelay(1, &buf[pkt_size], buf_size - pkt_size); /* delay 1 */
- pkt_size += fm_bop_write(0x1B, 0x0094, &buf[pkt_size], buf_size - pkt_size); /* wr 1b 0094 */
- pkt_size += fm_bop_write(0x1B, 0x0095, &buf[pkt_size], buf_size - pkt_size); /* wr 1b 0095 */
- pkt_size += fm_bop_udelay(200, &buf[pkt_size], buf_size - pkt_size); /* delay 200 */
- pkt_size += fm_bop_write(0x1B, 0x0094, &buf[pkt_size], buf_size - pkt_size); /* wr 1b 0094 */
- pkt_size += fm_bop_write(0x00, 0x0166, &buf[pkt_size], buf_size - pkt_size); /* wr 0 0166 */
- /* FM VCO Enable */
- pkt_size += fm_bop_write(0x01, 0x6B8A, &buf[pkt_size], buf_size - pkt_size); /* wr 1 6B8A */
- pkt_size += fm_bop_udelay(1, &buf[pkt_size], buf_size - pkt_size); /* delay 1 */
- pkt_size += fm_bop_write(0x00, 0xC166, &buf[pkt_size], buf_size - pkt_size); /* wr 0 C166 */
- pkt_size += fm_bop_udelay(3000, &buf[pkt_size], buf_size - pkt_size); /* delay 3000 */
- pkt_size += fm_bop_write(0x00, 0xF166, &buf[pkt_size], buf_size - pkt_size); /* wr 0 F166 */
- pkt_size += fm_bop_write(0x09, 0x2964, &buf[pkt_size], buf_size - pkt_size); /* wr 9 2964 */
- /* FM RFDIG settings */
- pkt_size += fm_bop_write(0x2E, 0x0008, &buf[pkt_size], buf_size - pkt_size); /* wr 2e 8 */
- pkt_size += fm_bop_write(0x2B, 0x0064, &buf[pkt_size], buf_size - pkt_size); /* wr 2b 64 */
- pkt_size += fm_bop_write(0x2C, 0x0032, &buf[pkt_size], buf_size - pkt_size); /* wr 2c 32 */
- pkt_size += fm_bop_write(0x11, 0x17d4, &buf[pkt_size], buf_size - pkt_size); /* wr 11 17d4 */
- /* Update dynamic subband switching setting, XHC 2011/05/17 */
- pkt_size += fm_bop_write(0x13, 0xFA00, &buf[pkt_size], buf_size - pkt_size); /* wr 13 FA00 */
- pkt_size += fm_bop_write(0x14, 0x0580, &buf[pkt_size], buf_size - pkt_size); /* wr 14 0580 */
- pkt_size += fm_bop_write(0x15, 0xFA80, &buf[pkt_size], buf_size - pkt_size); /* wr 15 FA80 */
- pkt_size += fm_bop_write(0x16, 0x0580, &buf[pkt_size], buf_size - pkt_size); /* wr 16 0580 */
- pkt_size += fm_bop_write(0x33, 0x0008, &buf[pkt_size], buf_size - pkt_size); /* wr 33 0008 */
- /* FM DCOC Calibration */
- pkt_size += fm_bop_write(0x64, 0x0001, &buf[pkt_size], buf_size - pkt_size); /* wr 64 1 */
- pkt_size += fm_bop_write(0x63, 0x0020, &buf[pkt_size], buf_size - pkt_size); /* wr 63 20 */
- pkt_size += fm_bop_write(0x9C, 0x0044, &buf[pkt_size], buf_size - pkt_size); /* wr 9C 0044 */
- /* pkt_size += fm_bop_write(0x6B, 0x0100, &buf[pkt_size], buf_size - pkt_size);//"Disable other interrupts except for STC_DONE(dependent on interrupt output source selection)" */
- pkt_size += fm_bop_write(0x0F, 0x1A08, &buf[pkt_size], buf_size - pkt_size); /* wr F 1A08 */
- pkt_size += fm_bop_write(0x63, 0x0021, &buf[pkt_size], buf_size - pkt_size); /* wr 63 21 */
- pkt_size += fm_bop_rd_until(0x69, 0x0001, 0x0001, &buf[pkt_size], buf_size - pkt_size); /* Poll fm_intr_stc_done (69H D0) = 1 */
- pkt_size += fm_bop_write(0x69, 0x0001, &buf[pkt_size], buf_size - pkt_size); /* wr 69 1 */
- pkt_size += fm_bop_write(0x63, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* wr 63 0 */
- pkt_size += fm_bop_rd_until(0x6F, 0x0001, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* Poll stc_done (6FH D0)= 0 */
- /* Others */
- pkt_size += fm_bop_write(0x00, 0xF167, &buf[pkt_size], buf_size - pkt_size); /* wr 0 F167 */
-
- buf[2] = (fm_u8) ((pkt_size - 4) & 0x00FF);
- buf[3] = (fm_u8) (((pkt_size - 4) >> 8) & 0x00FF);
-
- return pkt_size;
-}
-
-fm_s32 mt6620_rx_digital_init(fm_u8 *tx_buf, fm_s32 tx_buf_size)
-{
- fm_s32 pkt_size = 0;
-
- if (tx_buf_size < TX_BUF_SIZE) {
- return (-1);
- }
-
- tx_buf[0] = FM_TASK_COMMAND_PKT_TYPE;
- tx_buf[1] = FM_ENABLE_OPCODE;
- pkt_size = 4;
-
- /* fm_rgf_maincon */
- /* rd 62 */
- pkt_size += fm_bop_write(0x65, 0x0000, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 65 0 */
- pkt_size += fm_bop_write(0x64, 0x0001, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 64 1 */
- pkt_size += fm_bop_write(0x63, 0x0480, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 63 480 */
- pkt_size += fm_bop_write(0x6D, 0x1AB2, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 6d 1ab2 */
- pkt_size += fm_bop_write(0x6B, 0x2100, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 6b 2100 */
- pkt_size += fm_bop_write(0x68, 0xE100, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 68 E100 */
- pkt_size += fm_bop_udelay(10000, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* delay 10000 */
- pkt_size += fm_bop_write(0x68, 0xE000, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 68 E000 */
- /* fm_rgf_dac */
- pkt_size += fm_bop_write(0x9C, 0xab48, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 9c ab48 */
- pkt_size += fm_bop_write(0x9E, 0x000C, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 9e c */
- pkt_size += fm_bop_write(0x71, 0x807f, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 71 807f */
- pkt_size += fm_bop_write(0x72, 0x878f, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 72 878f */
- /* XHC, 2011/04/29 update 0x73 form 0x07C3 to 0x07C1 speed up I/Q calibration */
- pkt_size += fm_bop_write(0x73, 0x07c1, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 73 7c3 */
- /* fm_rgf_front */
- pkt_size += fm_bop_write(0x9F, 0x0000, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 9f 0 */
- pkt_size += fm_bop_write(0xCB, 0x00B0, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr cb b0 */
- /* XHC, 2011/05/06 FM RSSI config */
-/* pkt_size += fm_bop_write(0xE0, ((0xA301 & 0xFC00) | (FMR_RSSI_TH_LONG & 0x03FF)), &tx_buf[pkt_size], tx_buf_size - pkt_size);//wr e0 a301 */
-/* pkt_size += fm_bop_write(0xE1, ((0x00E9 & 0xFF00) | (FMR_CQI_TH & 0x00FF)), &tx_buf[pkt_size], tx_buf_size - pkt_size);//wr e1 D0~D7, PAMD TH */
- /* Run,2013/01 smt scan, ignore this */
- pkt_size += fm_bop_write(0xE0, ((0xA301 & 0xFC00) | (0x0301 & 0x03FF)), &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr e0 a301 */
- pkt_size += fm_bop_write(0xE1, ((0x00E9 & 0xFF00) | (0x00E9 & 0x00FF)), &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr e1 D0~D7, PAMD TH */
- /* XHC, 2011/04/15 update search MR threshold */
-/* pkt_size += fm_bop_write(0xE3, FMR_MR_TH, &tx_buf[pkt_size], tx_buf_size - pkt_size);//wr e3 1B0 */
- /* Run,2013/01 smt scan, ignore this */
- pkt_size += fm_bop_write(0xE3, 0x01BD, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr e3 1B0 */
- pkt_size += fm_bop_write(0xE4, 0x008F, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr e4 8f */
- pkt_size += fm_bop_write(0xCC, 0x0488, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr cc 488 */
- pkt_size += fm_bop_write(0xD6, 0x036A, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr d6 36a */
- pkt_size += fm_bop_write(0xD7, 0x836a, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr d7 836a */
- pkt_size += fm_bop_write(0xDD, 0x0080, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr dd 80 */
- pkt_size += fm_bop_write(0xB0, 0xcd00, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr b0 cd00 */
- /* XHC, 2011/03/18 Update AFC gain[wr 96 41E2->4000][wr 97 049A->021F] */
- /* [wr 98 0B66->0D00][wr 99 0E1E->0E7F][wr D0 8233->8192][wr D1 20BC->2086] */
- /* [wr 90 03FF->0192][wr 91 01BE->0086][wr 92 03FF->0192][wr 93 0354->0086] */
- /* [wr 94 03FF->0192][wr 95 0354->0086][wr 52 17F3] */
- pkt_size += fm_bop_write(0x96, 0x4000, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 96 41E2 */
- pkt_size += fm_bop_write(0x97, 0x021F, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 97 049A */
- pkt_size += fm_bop_write(0x98, 0x0D00, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 98 0B66 */
- pkt_size += fm_bop_write(0x99, 0x0E7F, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 99 0E1E */
- pkt_size += fm_bop_write(0xD0, 0x8192, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr D0 8233 */
- pkt_size += fm_bop_write(0xD1, 0x2086, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr D1 20BC */
- pkt_size += fm_bop_write(0x90, 0x0192, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 90 03ff */
- pkt_size += fm_bop_write(0x91, 0x0086, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 91 01BE */
- pkt_size += fm_bop_write(0x92, 0x0192, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 92 03FF */
- pkt_size += fm_bop_write(0x93, 0x0086, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 93 0354 */
- pkt_size += fm_bop_write(0x94, 0x0192, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 94 03FF */
- pkt_size += fm_bop_write(0x95, 0x0086, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 95 0354 */
- pkt_size += fm_bop_write(0x52, 0x17F3, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 95 0354 */
- /* fm_rgf_fmx */
- pkt_size += fm_bop_write(0x9F, 0x0001, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 9f 1 */
- pkt_size += fm_bop_write(0xDE, 0x3388, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr de 3388 */
- pkt_size += fm_bop_write(0xC2, 0x0180, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr c2 180 */
- pkt_size += fm_bop_write(0xC3, 0x0180, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr c3 180 */
- pkt_size += fm_bop_write(0xDB, 0x0181, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr db 181 */
- pkt_size += fm_bop_write(0xDC, 0x0184, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr dc 184 */
- pkt_size += fm_bop_write(0xA2, 0x03C0, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr a2 3c0 */
- pkt_size += fm_bop_write(0xA3, 0x03C0, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr a3 3c0 */
- pkt_size += fm_bop_write(0xA4, 0x03C0, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr a4 3c0 */
- pkt_size += fm_bop_write(0xA5, 0x03C0, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr a5 3c0 */
- pkt_size += fm_bop_write(0xA6, 0x03C0, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr a6 3c0 */
- pkt_size += fm_bop_write(0xA7, 0x03C0, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr a7 3c0 */
- pkt_size += fm_bop_write(0xE3, 0x0280, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr e3 280 */
- pkt_size += fm_bop_write(0xE4, 0x0280, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr e4 280 */
- pkt_size += fm_bop_write(0xE5, 0x0280, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr e5 280 */
- pkt_size += fm_bop_write(0xE6, 0x026C, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr e6 26c */
- pkt_size += fm_bop_write(0xE7, 0x026C, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr e7 26c */
- pkt_size += fm_bop_write(0xEA, 0x026C, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr ea 26c */
- pkt_size += fm_bop_udelay(1000, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* delay 1000 */
- pkt_size += fm_bop_write(0xB6, 0x03FC, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr b6 3fc */
- pkt_size += fm_bop_write(0xB7, 0x02C1, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr b7 2c1 */
- pkt_size += fm_bop_write(0xA8, 0x0820, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr a8 820 */
- pkt_size += fm_bop_write(0xAC, 0x065E, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr ac 65e */
- pkt_size += fm_bop_write(0xAD, 0x09AD, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr ad 9ad */
- pkt_size += fm_bop_write(0xAE, 0x0CF8, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr ae cf8 */
- pkt_size += fm_bop_write(0xAF, 0x0302, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr af 302 */
- pkt_size += fm_bop_write(0xB0, 0x04A6, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr b0 4a6 */
- pkt_size += fm_bop_write(0xB1, 0x062C, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr b1 62c */
- pkt_size += fm_bop_write(0xEC, 0x014A, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr ec 14a */
- pkt_size += fm_bop_write(0xC8, 0x0232, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr c8 232 */
- pkt_size += fm_bop_write(0xC7, 0x0184, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr c7 0184 */
- pkt_size += fm_bop_write(0xD8, 0x00E8, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr d8 0e8 */
- pkt_size += fm_bop_write(0xFB, 0x051F, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr fb 51f */
- pkt_size += fm_bop_udelay(1000, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* delay 1000 */
- /* XHC,2011/03/18 [wr C9 01F0][wr CA 0250][wr D4 2657] */
- pkt_size += fm_bop_write(0xC9, 0x01F0, &tx_buf[pkt_size], tx_buf_size - pkt_size);
- pkt_size += fm_bop_write(0xCA, 0x0250, &tx_buf[pkt_size], tx_buf_size - pkt_size);
- pkt_size += fm_bop_write(0xD4, 0x2657, &tx_buf[pkt_size], tx_buf_size - pkt_size);
- pkt_size += fm_bop_write(0x9F, 0x0002, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 9f 2 */
- pkt_size += fm_bop_write(0xA8, 0x0000, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr a8 0 */
- pkt_size += fm_bop_write(0xA8, 0x0000, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr a8 0 */
- pkt_size += fm_bop_write(0xA8, 0x0000, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr a8 0 */
- pkt_size += fm_bop_write(0xA8, 0xFF80, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr a8 ff80 */
- pkt_size += fm_bop_write(0xA8, 0x0061, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr a8 61 */
- pkt_size += fm_bop_write(0xA8, 0xFF22, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr a8 ff22 */
- pkt_size += fm_bop_write(0xA8, 0x0000, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr a8 0 */
- pkt_size += fm_bop_write(0xA8, 0x0100, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr a8 100 */
- pkt_size += fm_bop_write(0xA8, 0x009A, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr a8 9a */
- pkt_size += fm_bop_write(0xA8, 0xFF80, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr a8 ff80 */
- pkt_size += fm_bop_write(0xA8, 0x0140, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr a8 140 */
- pkt_size += fm_bop_write(0xA8, 0xFF42, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr a8 ff42 */
- pkt_size += fm_bop_write(0xA8, 0xFFE0, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr a8 ffe0 */
- pkt_size += fm_bop_write(0xA8, 0x0114, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr a8 114 */
- pkt_size += fm_bop_write(0xA8, 0xFF4E, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr a8 ff4e */
- pkt_size += fm_bop_write(0xA8, 0x0000, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr a8 0 */
- pkt_size += fm_bop_write(0xA8, 0x0000, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr a8 0 */
- pkt_size += fm_bop_write(0xA8, 0x0000, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr a8 0 */
- pkt_size += fm_bop_write(0xA8, 0x003E, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr a8 3e */
- pkt_size += fm_bop_write(0xA8, 0xFF6E, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr a8 ff6e */
- pkt_size += fm_bop_write(0xA8, 0x0087, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr a8 87 */
- pkt_size += fm_bop_write(0xA8, 0x0000, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr a8 0 */
- pkt_size += fm_bop_write(0xA8, 0xFEDC, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr a8 fedc */
- pkt_size += fm_bop_write(0xA8, 0x0015, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr a8 15 */
- pkt_size += fm_bop_write(0xA8, 0x00CF, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr a8 cf */
- pkt_size += fm_bop_write(0xA8, 0xFF6B, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr a8 ff6b */
- pkt_size += fm_bop_write(0xA8, 0x0164, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr a8 164 */
- pkt_size += fm_bop_write(0xA8, 0x002B, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr a8 2b */
- pkt_size += fm_bop_write(0xA8, 0xFF7E, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr a8 ff7e */
- pkt_size += fm_bop_write(0xA8, 0x0065, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr a8 65 */
- pkt_size += fm_bop_udelay(10000, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* delay 10000 */
- pkt_size += fm_bop_write(0x9F, 0x0002, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 9f 2 */
- pkt_size += fm_bop_write(0xA9, 0x0000, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr a9 0 */
- pkt_size += fm_bop_write(0xA9, 0xFFEE, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr a9 ffee */
- pkt_size += fm_bop_write(0xA9, 0xFF81, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr a9 ff81 */
- /* XHC,2011/03/18 [wr A9 FFC3] */
- pkt_size += fm_bop_write(0xA9, 0xFFC3, &tx_buf[pkt_size], tx_buf_size - pkt_size);
- pkt_size += fm_bop_write(0xA9, 0x0022, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr a9 22 */
- pkt_size += fm_bop_write(0xA9, 0x0000, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr a9 0 */
- pkt_size += fm_bop_write(0xA9, 0xFFCC, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr a9 ffcc */
- pkt_size += fm_bop_write(0xA9, 0x0023, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr a9 23 */
- pkt_size += fm_bop_write(0xA9, 0xFFDA, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr a9 ffda */
- pkt_size += fm_bop_write(0xA9, 0xFFF7, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr a9 fff7 */
- pkt_size += fm_bop_udelay(10, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* delay 10 */
- pkt_size += fm_bop_write(0x9F, 0x0001, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 9f 1 */
- pkt_size += fm_bop_write(0xD3, 0x250b, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr d3 250b */
- pkt_size += fm_bop_write(0xBB, 0x2320, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr bb 2320 */
- pkt_size += fm_bop_write(0xD0, 0x02f8, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr d0 02f8 */
- pkt_size += fm_bop_write(0xEC, 0x019a, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr ec 19a */
- pkt_size += fm_bop_write(0xFE, 0x2140, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr fe 2140 */
- pkt_size += fm_bop_write(0x9F, 0x0000, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 9f 0 */
- /* fm_rgf_rds */
- pkt_size += fm_bop_write(0x9F, 0x0003, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 9f 3 */
- pkt_size += fm_bop_write(0xBD, 0x37EB, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr bd 37eb */
- pkt_size += fm_bop_write(0xBC, 0x0404, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr bc 404 */
- pkt_size += fm_bop_write(0x9F, 0x0000, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 9f 0 */
-
- tx_buf[2] = (fm_u8) ((pkt_size - 4) & 0x00FF);
- tx_buf[3] = (fm_u8) (((pkt_size - 4) >> 8) & 0x00FF);
-
- return pkt_size;
-}
-
-/*
- * mt6620_pwrup_digital_init - Wholechip FM Power Up: step 4, FM Digital Init: fm_rgf_maincon
- * @buf - target buf
- * @buf_size - buffer size
- * return package size
- */
-fm_s32 mt6620_pwrup_digital_init_1(fm_u8 *buf, fm_s32 buf_size)
-{
- fm_s32 pkt_size = 0;
-
- if (buf_size < TX_BUF_SIZE) {
- return (-1);
- }
-
- buf[0] = FM_TASK_COMMAND_PKT_TYPE;
- buf[1] = FM_ENABLE_OPCODE;
- pkt_size = 4;
-
-
- /* fm_rgf_maincon */
- /* rd 62 */
- pkt_size += fm_bop_write(0x65, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* wr 65 0 */
- pkt_size += fm_bop_write(0x64, 0x0001, &buf[pkt_size], buf_size - pkt_size); /* wr 64 1 */
- pkt_size += fm_bop_write(0x63, 0x0480, &buf[pkt_size], buf_size - pkt_size); /* wr 63 480 */
- pkt_size += fm_bop_write(0x6D, 0x1AB2, &buf[pkt_size], buf_size - pkt_size); /* wr 6d 1ab2 */
- pkt_size += fm_bop_write(0x6B, 0x2100, &buf[pkt_size], buf_size - pkt_size); /* wr 6b 2100 */
- pkt_size += fm_bop_write(0x68, 0xE100, &buf[pkt_size], buf_size - pkt_size); /* wr 68 E100 */
-
- buf[2] = (fm_u8) ((pkt_size - 4) & 0x00FF);
- buf[3] = (fm_u8) (((pkt_size - 4) >> 8) & 0x00FF);
-
- return pkt_size;
-}
-
-fm_s32 mt6620_pwrup_digital_init_2(fm_u8 *buf, fm_s32 buf_size)
-{
- fm_s32 pkt_size = 0;
-
- if (buf_size < TX_BUF_SIZE) {
- return (-1);
- }
-
- buf[0] = FM_TASK_COMMAND_PKT_TYPE;
- buf[1] = FM_ENABLE_OPCODE;
- pkt_size = 4;
-
- pkt_size += fm_bop_write(0x68, 0xE000, &buf[pkt_size], buf_size - pkt_size); /* wr 68 E000 */
- /* fm_rgf_dac */
- pkt_size += fm_bop_write(0x9C, 0xab48, &buf[pkt_size], buf_size - pkt_size); /* wr 9c ab48 */
- pkt_size += fm_bop_write(0x9E, 0x000C, &buf[pkt_size], buf_size - pkt_size); /* wr 9e c */
- pkt_size += fm_bop_write(0x71, 0x807f, &buf[pkt_size], buf_size - pkt_size); /* wr 71 807f */
- pkt_size += fm_bop_write(0x72, 0x878f, &buf[pkt_size], buf_size - pkt_size); /* wr 72 878f */
- /* XHC, 2011/04/29 update 0x73 form 0x07C3 to 0x07C1 speed up I/Q calibration */
- pkt_size += fm_bop_write(0x73, 0x07c1, &buf[pkt_size], buf_size - pkt_size); /* wr 73 7c3 */
- /* fm_rgf_front */
- pkt_size += fm_bop_write(0x9F, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* wr 9f 0 */
- pkt_size += fm_bop_write(0xCB, 0x00B0, &buf[pkt_size], buf_size - pkt_size); /* wr cb b0 */
- /* XHC, 2011/05/06 FM RSSI config */
- pkt_size += fm_bop_write(0xE0, ((0xA301 & 0xFC00) | (FMR_RSSI_TH_LONG_MT6620 & 0x03FF)), &buf[pkt_size], buf_size - pkt_size); /* wr e0 a301 */
- pkt_size += fm_bop_write(0xE1, ((0x00E9 & 0xFF00) | (FMR_CQI_TH_MT6620 & 0x00FF)), &buf[pkt_size], buf_size - pkt_size); /* wr e1 D0~D7, PAMD TH */
- /* XHC, 2011/04/15 update search MR threshold */
- pkt_size += fm_bop_write(0xE3, FMR_MR_TH_MT6620, &buf[pkt_size], buf_size - pkt_size); /* wr e3 1B0 */
- pkt_size += fm_bop_write(0xE4, 0x008F, &buf[pkt_size], buf_size - pkt_size); /* wr e4 8f */
- pkt_size += fm_bop_write(0xCC, 0x0488, &buf[pkt_size], buf_size - pkt_size); /* wr cc 488 */
- pkt_size += fm_bop_write(0xD6, 0x036A, &buf[pkt_size], buf_size - pkt_size); /* wr d6 36a */
- pkt_size += fm_bop_write(0xD7, 0x836a, &buf[pkt_size], buf_size - pkt_size); /* wr d7 836a */
- pkt_size += fm_bop_write(0xDD, 0x0080, &buf[pkt_size], buf_size - pkt_size); /* wr dd 80 */
- pkt_size += fm_bop_write(0xB0, 0xcd00, &buf[pkt_size], buf_size - pkt_size); /* wr b0 cd00 */
- /* XHC, 2011/03/18 Update AFC gain[wr 96 41E2->4000][wr 97 049A->021F] */
- /* [wr 98 0B66->0D00][wr 99 0E1E->0E7F][wr D0 8233->8192][wr D1 20BC->2086] */
- /* [wr 90 03FF->0192][wr 91 01BE->0086][wr 92 03FF->0192][wr 93 0354->0086] */
- /* [wr 94 03FF->0192][wr 95 0354->0086][wr 52 17F3] */
- pkt_size += fm_bop_write(0x96, 0x4000, &buf[pkt_size], buf_size - pkt_size); /* wr 96 41E2 */
- pkt_size += fm_bop_write(0x97, 0x021F, &buf[pkt_size], buf_size - pkt_size); /* wr 97 049A */
- pkt_size += fm_bop_write(0x98, 0x0D00, &buf[pkt_size], buf_size - pkt_size); /* wr 98 0B66 */
- pkt_size += fm_bop_write(0x99, 0x0E7F, &buf[pkt_size], buf_size - pkt_size); /* wr 99 0E1E */
- pkt_size += fm_bop_write(0xD0, 0x8192, &buf[pkt_size], buf_size - pkt_size); /* wr D0 8233 */
- pkt_size += fm_bop_write(0xD1, 0x2086, &buf[pkt_size], buf_size - pkt_size); /* wr D1 20BC */
- pkt_size += fm_bop_write(0x90, 0x0192, &buf[pkt_size], buf_size - pkt_size); /* wr 90 03ff */
- pkt_size += fm_bop_write(0x91, 0x0086, &buf[pkt_size], buf_size - pkt_size); /* wr 91 01BE */
- pkt_size += fm_bop_write(0x92, 0x0192, &buf[pkt_size], buf_size - pkt_size); /* wr 92 03FF */
- pkt_size += fm_bop_write(0x93, 0x0086, &buf[pkt_size], buf_size - pkt_size); /* wr 93 0354 */
- pkt_size += fm_bop_write(0x94, 0x0192, &buf[pkt_size], buf_size - pkt_size); /* wr 94 03FF */
- pkt_size += fm_bop_write(0x95, 0x0086, &buf[pkt_size], buf_size - pkt_size); /* wr 95 0354 */
- pkt_size += fm_bop_write(0x52, 0x17F3, &buf[pkt_size], buf_size - pkt_size); /* wr 95 0354 */
- /* fm_rgf_fmx */
- pkt_size += fm_bop_write(0x9F, 0x0001, &buf[pkt_size], buf_size - pkt_size); /* wr 9f 1 */
- pkt_size += fm_bop_write(0xDE, 0x3388, &buf[pkt_size], buf_size - pkt_size); /* wr de 3388 */
- pkt_size += fm_bop_write(0xC2, 0x0180, &buf[pkt_size], buf_size - pkt_size); /* wr c2 180 */
- pkt_size += fm_bop_write(0xC3, 0x0180, &buf[pkt_size], buf_size - pkt_size); /* wr c3 180 */
- pkt_size += fm_bop_write(0xDB, 0x0181, &buf[pkt_size], buf_size - pkt_size); /* wr db 181 */
- pkt_size += fm_bop_write(0xDC, 0x0184, &buf[pkt_size], buf_size - pkt_size); /* wr dc 184 */
- pkt_size += fm_bop_write(0xA2, 0x03C0, &buf[pkt_size], buf_size - pkt_size); /* wr a2 3c0 */
- pkt_size += fm_bop_write(0xA3, 0x03C0, &buf[pkt_size], buf_size - pkt_size); /* wr a3 3c0 */
- pkt_size += fm_bop_write(0xA4, 0x03C0, &buf[pkt_size], buf_size - pkt_size); /* wr a4 3c0 */
- pkt_size += fm_bop_write(0xA5, 0x03C0, &buf[pkt_size], buf_size - pkt_size); /* wr a5 3c0 */
- pkt_size += fm_bop_write(0xA6, 0x03C0, &buf[pkt_size], buf_size - pkt_size); /* wr a6 3c0 */
- pkt_size += fm_bop_write(0xA7, 0x03C0, &buf[pkt_size], buf_size - pkt_size); /* wr a7 3c0 */
- pkt_size += fm_bop_write(0xE3, 0x0280, &buf[pkt_size], buf_size - pkt_size); /* wr e3 280 */
- pkt_size += fm_bop_write(0xE4, 0x0280, &buf[pkt_size], buf_size - pkt_size); /* wr e4 280 */
- pkt_size += fm_bop_write(0xE5, 0x0280, &buf[pkt_size], buf_size - pkt_size); /* wr e5 280 */
- pkt_size += fm_bop_write(0xE6, 0x026C, &buf[pkt_size], buf_size - pkt_size); /* wr e6 26c */
- pkt_size += fm_bop_write(0xE7, 0x026C, &buf[pkt_size], buf_size - pkt_size); /* wr e7 26c */
- pkt_size += fm_bop_write(0xEA, 0x026C, &buf[pkt_size], buf_size - pkt_size); /* wr ea 26c */
- pkt_size += fm_bop_udelay(1000, &buf[pkt_size], buf_size - pkt_size); /* delay 1000 */
- pkt_size += fm_bop_write(0xB6, 0x03FC, &buf[pkt_size], buf_size - pkt_size); /* wr b6 3fc */
- pkt_size += fm_bop_write(0xB7, 0x02C1, &buf[pkt_size], buf_size - pkt_size); /* wr b7 2c1 */
- pkt_size += fm_bop_write(0xA8, 0x0820, &buf[pkt_size], buf_size - pkt_size); /* wr a8 820 */
- pkt_size += fm_bop_write(0xAC, 0x065E, &buf[pkt_size], buf_size - pkt_size); /* wr ac 65e */
- pkt_size += fm_bop_write(0xAD, 0x09AD, &buf[pkt_size], buf_size - pkt_size); /* wr ad 9ad */
- pkt_size += fm_bop_write(0xAE, 0x0CF8, &buf[pkt_size], buf_size - pkt_size); /* wr ae cf8 */
- pkt_size += fm_bop_write(0xAF, 0x0302, &buf[pkt_size], buf_size - pkt_size); /* wr af 302 */
- pkt_size += fm_bop_write(0xB0, 0x04A6, &buf[pkt_size], buf_size - pkt_size); /* wr b0 4a6 */
- pkt_size += fm_bop_write(0xB1, 0x062C, &buf[pkt_size], buf_size - pkt_size); /* wr b1 62c */
- pkt_size += fm_bop_write(0xEC, 0x014A, &buf[pkt_size], buf_size - pkt_size); /* wr ec 14a */
- pkt_size += fm_bop_write(0xC8, 0x0232, &buf[pkt_size], buf_size - pkt_size); /* wr c8 232 */
- pkt_size += fm_bop_write(0xC7, 0x0184, &buf[pkt_size], buf_size - pkt_size); /* wr c7 0184 */
- pkt_size += fm_bop_write(0xD8, 0x00E8, &buf[pkt_size], buf_size - pkt_size); /* wr d8 0e8 */
- pkt_size += fm_bop_write(0xFB, 0x051F, &buf[pkt_size], buf_size - pkt_size); /* wr fb 51f */
- pkt_size += fm_bop_udelay(1000, &buf[pkt_size], buf_size - pkt_size); /* delay 1000 */
- /* XHC,2011/03/18 [wr C9 01F0][wr CA 0250][wr D4 2657] */
- pkt_size += fm_bop_write(0xC9, 0x01F0, &buf[pkt_size], buf_size - pkt_size);
- pkt_size += fm_bop_write(0xCA, 0x0250, &buf[pkt_size], buf_size - pkt_size);
- pkt_size += fm_bop_write(0xD4, 0x2657, &buf[pkt_size], buf_size - pkt_size);
- pkt_size += fm_bop_write(0x9F, 0x0002, &buf[pkt_size], buf_size - pkt_size); /* wr 9f 2 */
- pkt_size += fm_bop_write(0xA8, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* wr a8 0 */
- pkt_size += fm_bop_write(0xA8, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* wr a8 0 */
- pkt_size += fm_bop_write(0xA8, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* wr a8 0 */
- pkt_size += fm_bop_write(0xA8, 0xFF80, &buf[pkt_size], buf_size - pkt_size); /* wr a8 ff80 */
- pkt_size += fm_bop_write(0xA8, 0x0061, &buf[pkt_size], buf_size - pkt_size); /* wr a8 61 */
- pkt_size += fm_bop_write(0xA8, 0xFF22, &buf[pkt_size], buf_size - pkt_size); /* wr a8 ff22 */
- pkt_size += fm_bop_write(0xA8, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* wr a8 0 */
- pkt_size += fm_bop_write(0xA8, 0x0100, &buf[pkt_size], buf_size - pkt_size); /* wr a8 100 */
- pkt_size += fm_bop_write(0xA8, 0x009A, &buf[pkt_size], buf_size - pkt_size); /* wr a8 9a */
- pkt_size += fm_bop_write(0xA8, 0xFF80, &buf[pkt_size], buf_size - pkt_size); /* wr a8 ff80 */
- pkt_size += fm_bop_write(0xA8, 0x0140, &buf[pkt_size], buf_size - pkt_size); /* wr a8 140 */
- pkt_size += fm_bop_write(0xA8, 0xFF42, &buf[pkt_size], buf_size - pkt_size); /* wr a8 ff42 */
- pkt_size += fm_bop_write(0xA8, 0xFFE0, &buf[pkt_size], buf_size - pkt_size); /* wr a8 ffe0 */
- pkt_size += fm_bop_write(0xA8, 0x0114, &buf[pkt_size], buf_size - pkt_size); /* wr a8 114 */
- pkt_size += fm_bop_write(0xA8, 0xFF4E, &buf[pkt_size], buf_size - pkt_size); /* wr a8 ff4e */
- pkt_size += fm_bop_write(0xA8, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* wr a8 0 */
- pkt_size += fm_bop_write(0xA8, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* wr a8 0 */
- pkt_size += fm_bop_write(0xA8, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* wr a8 0 */
- pkt_size += fm_bop_write(0xA8, 0x003E, &buf[pkt_size], buf_size - pkt_size); /* wr a8 3e */
- pkt_size += fm_bop_write(0xA8, 0xFF6E, &buf[pkt_size], buf_size - pkt_size); /* wr a8 ff6e */
- pkt_size += fm_bop_write(0xA8, 0x0087, &buf[pkt_size], buf_size - pkt_size); /* wr a8 87 */
- pkt_size += fm_bop_write(0xA8, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* wr a8 0 */
- pkt_size += fm_bop_write(0xA8, 0xFEDC, &buf[pkt_size], buf_size - pkt_size); /* wr a8 fedc */
- pkt_size += fm_bop_write(0xA8, 0x0015, &buf[pkt_size], buf_size - pkt_size); /* wr a8 15 */
- pkt_size += fm_bop_write(0xA8, 0x00CF, &buf[pkt_size], buf_size - pkt_size); /* wr a8 cf */
- pkt_size += fm_bop_write(0xA8, 0xFF6B, &buf[pkt_size], buf_size - pkt_size); /* wr a8 ff6b */
- pkt_size += fm_bop_write(0xA8, 0x0164, &buf[pkt_size], buf_size - pkt_size); /* wr a8 164 */
- pkt_size += fm_bop_write(0xA8, 0x002B, &buf[pkt_size], buf_size - pkt_size); /* wr a8 2b */
- pkt_size += fm_bop_write(0xA8, 0xFF7E, &buf[pkt_size], buf_size - pkt_size); /* wr a8 ff7e */
- pkt_size += fm_bop_write(0xA8, 0x0065, &buf[pkt_size], buf_size - pkt_size); /* wr a8 65 */
-
- buf[2] = (fm_u8) ((pkt_size - 4) & 0x00FF);
- buf[3] = (fm_u8) (((pkt_size - 4) >> 8) & 0x00FF);
-
- return pkt_size;
-}
-
-fm_s32 mt6620_pwrup_digital_init_3(fm_u8 *buf, fm_s32 buf_size)
-{
- fm_s32 pkt_size = 0;
-
- if (buf_size < TX_BUF_SIZE) {
- return (-1);
- }
-
- buf[0] = FM_TASK_COMMAND_PKT_TYPE;
- buf[1] = FM_ENABLE_OPCODE;
- pkt_size = 4;
-
- pkt_size += fm_bop_write(0x9F, 0x0002, &buf[pkt_size], buf_size - pkt_size); /* wr 9f 2 */
- pkt_size += fm_bop_write(0xA9, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* wr a9 0 */
- pkt_size += fm_bop_write(0xA9, 0xFFEE, &buf[pkt_size], buf_size - pkt_size); /* wr a9 ffee */
- pkt_size += fm_bop_write(0xA9, 0xFF81, &buf[pkt_size], buf_size - pkt_size); /* wr a9 ff81 */
- /* XHC,2011/03/18 [wr A9 FFC3] */
- pkt_size += fm_bop_write(0xA9, 0xFFC3, &buf[pkt_size], buf_size - pkt_size);
- pkt_size += fm_bop_write(0xA9, 0x0022, &buf[pkt_size], buf_size - pkt_size); /* wr a9 22 */
- pkt_size += fm_bop_write(0xA9, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* wr a9 0 */
- pkt_size += fm_bop_write(0xA9, 0xFFCC, &buf[pkt_size], buf_size - pkt_size); /* wr a9 ffcc */
- pkt_size += fm_bop_write(0xA9, 0x0023, &buf[pkt_size], buf_size - pkt_size); /* wr a9 23 */
- pkt_size += fm_bop_write(0xA9, 0xFFDA, &buf[pkt_size], buf_size - pkt_size); /* wr a9 ffda */
- pkt_size += fm_bop_write(0xA9, 0xFFF7, &buf[pkt_size], buf_size - pkt_size); /* wr a9 fff7 */
- pkt_size += fm_bop_udelay(10, &buf[pkt_size], buf_size - pkt_size); /* delay 10 */
- pkt_size += fm_bop_write(0x9F, 0x0001, &buf[pkt_size], buf_size - pkt_size); /* wr 9f 1 */
- pkt_size += fm_bop_write(0xD3, 0x250b, &buf[pkt_size], buf_size - pkt_size); /* wr d3 250b */
- pkt_size += fm_bop_write(0xBB, 0x2320, &buf[pkt_size], buf_size - pkt_size); /* wr bb 2320 */
- pkt_size += fm_bop_write(0xD0, 0x02f8, &buf[pkt_size], buf_size - pkt_size); /* wr d0 02f8 */
- pkt_size += fm_bop_write(0xEC, 0x019a, &buf[pkt_size], buf_size - pkt_size); /* wr ec 19a */
- pkt_size += fm_bop_write(0xFE, 0x2140, &buf[pkt_size], buf_size - pkt_size); /* wr fe 2140 */
- pkt_size += fm_bop_write(0x9F, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* wr 9f 0 */
- /* fm_rgf_rds */
- pkt_size += fm_bop_write(0x9F, 0x0003, &buf[pkt_size], buf_size - pkt_size); /* wr 9f 3 */
- pkt_size += fm_bop_write(0xBD, 0x37EB, &buf[pkt_size], buf_size - pkt_size); /* wr bd 37eb */
- pkt_size += fm_bop_write(0xBC, 0x0404, &buf[pkt_size], buf_size - pkt_size); /* wr bc 808 */
- pkt_size += fm_bop_write(0x9F, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* wr 9f 0 */
-
- buf[2] = (fm_u8) ((pkt_size - 4) & 0x00FF);
- buf[3] = (fm_u8) (((pkt_size - 4) >> 8) & 0x00FF);
-
- return pkt_size;
-}
-
-/*
- * mt6620_pwrdown - Wholechip FM Power down: Digital Modem Power Down
- * @buf - target buf
- * @buf_size - buffer size
- * return package size
- */
-fm_s32 mt6620_pwrdown(fm_u8 *buf, fm_s32 buf_size)
-{
- fm_s32 pkt_size = 0;
-
- if (buf_size < TX_BUF_SIZE) {
- return (-1);
- }
-
- buf[0] = FM_TASK_COMMAND_PKT_TYPE;
- buf[1] = FM_ENABLE_OPCODE;
- pkt_size = 4;
-
- /* Digital Modem Power Down */
- pkt_size += fm_bop_write(0x63, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* wr 63 0 */
- pkt_size += fm_bop_modify(0x6E, 0xFFFC, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* clear 0x6e[1:0], round1 */
- pkt_size += fm_bop_modify(0x6E, 0xFFFC, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* clear 0x6e[1:0], round2 */
- pkt_size += fm_bop_modify(0x6E, 0xFFFC, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* clear 0x6e[1:0], round3 */
- pkt_size += fm_bop_modify(0x6E, 0xFFFC, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* clear 0x6e[1:0], round4 */
- /* ADPLL Power Off Sequence */
- pkt_size += fm_bop_write(0x2A, 0x0022, &buf[pkt_size], buf_size - pkt_size); /* wr 2a 22 */
- pkt_size += fm_bop_write(0x1E, 0x0860, &buf[pkt_size], buf_size - pkt_size); /* wr 1E 0860 */
- pkt_size += fm_bop_write(0x20, 0x0720, &buf[pkt_size], buf_size - pkt_size); /* wr 20 0720 */
- pkt_size += fm_bop_write(0x20, 0x2720, &buf[pkt_size], buf_size - pkt_size); /* wr 20 2720 */
- /* ANALOG/RF Power Off Sequence */
- pkt_size += fm_bop_write(0x00, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* wr 0 0 */
- pkt_size += fm_bop_write(0x01, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* wr 1 0 */
- pkt_size += fm_bop_write(0x04, 0x0141, &buf[pkt_size], buf_size - pkt_size); /* wr 4 0141 */
- pkt_size += fm_bop_write(0x09, 0x0964, &buf[pkt_size], buf_size - pkt_size); /* wr 9 0964 */
- pkt_size += fm_bop_write(0x0C, 0x288C, &buf[pkt_size], buf_size - pkt_size); /* wr c 288c */
- pkt_size += fm_bop_write(0x26, 0x0004, &buf[pkt_size], buf_size - pkt_size); /* wr 26 0004 */
- pkt_size += fm_bop_write(0x3A, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* wr 3A 0000 */
- pkt_size += fm_bop_write(0x3B, 0x00C3, &buf[pkt_size], buf_size - pkt_size); /* wr 3B 00C3 */
- pkt_size += fm_bop_write(0x3E, 0x3280, &buf[pkt_size], buf_size - pkt_size); /* wr 3E 3280 */
- pkt_size += fm_bop_write(0x3F, 0x4E16, &buf[pkt_size], buf_size - pkt_size); /* wr 3F 4E16 */
- pkt_size += fm_bop_write(0x41, 0x0004, &buf[pkt_size], buf_size - pkt_size); /* wr 41 0004 */
- /* clear TX settings */
- pkt_size += fm_bop_write(0x12, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* wr 12 0000 */
- pkt_size += fm_bop_write(0x47, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* wr 47 0000 */
-
- buf[2] = (fm_u8) ((pkt_size - 4) & 0x00FF);
- buf[3] = (fm_u8) (((pkt_size - 4) >> 8) & 0x00FF);
-
- return pkt_size;
-}
-
-/*
- * mt6620_rampdown - f/w will wait for STC_DONE interrupt
- * @buf - target buf
- * @buf_size - buffer size
- * return package size
- */
-fm_s32 mt6620_rampdown(fm_u8 *buf, fm_s32 buf_size)
-{
- fm_s32 pkt_size = 0;
-
- if (buf_size < TX_BUF_SIZE) {
- return (-1);
- }
-
- buf[0] = FM_TASK_COMMAND_PKT_TYPE;
- buf[1] = FM_RAMPDOWN_OPCODE;
- pkt_size = 4;
-
- pkt_size += fm_bop_modify(0x9C, 0xFF87, 0x0068, &buf[pkt_size], buf_size - pkt_size); /* wr 9c[3] = 1, ramp down */
- pkt_size += fm_bop_write(0x9F, 0x0001, &buf[pkt_size], buf_size - pkt_size); /* wr 9f 1 */
- pkt_size += fm_bop_write(0xC8, 0x0101, &buf[pkt_size], buf_size - pkt_size); /* wr c8 101 */
- pkt_size += fm_bop_write(0xDD, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* wr dd 0 */
- pkt_size += fm_bop_write(0xD8, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* wr d8 0 */
- pkt_size += fm_bop_write(0x9F, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* wr 9f 0 */
- pkt_size += fm_bop_udelay(35000, &buf[pkt_size], buf_size - pkt_size); /* delay 35000 */
- /* disable interrupt before rampdown */
- pkt_size += fm_bop_write(0x6B, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* wr 6b 0000 */
- pkt_size += fm_bop_modify(0x63, 0xFFF0, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* wr 63[3:0] = 0, ramp down */
- pkt_size += fm_bop_rd_until(0x6f, 0x0001, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* Poll 6f[0] = b'0 */
- pkt_size += fm_bop_write(0x6B, 0x2100, &buf[pkt_size], buf_size - pkt_size); /* wr 6b 2100 */
- /* enable interrupt after rampdown */
-
- buf[2] = (fm_u8) ((pkt_size - 4) & 0x00FF);
- buf[3] = (fm_u8) (((pkt_size - 4) >> 8) & 0x00FF);
-
- return pkt_size;
-}
-
-#if 0 /* ramp down tx will do in tx tune flow */
-fm_s32 mt6620_rampdown_tx(fm_u8 *tx_buf, fm_s32 tx_buf_size)
-{
- fm_s32 pkt_size = 0;
-
- if (tx_buf_size < TX_BUF_SIZE) {
- return (-1);
- }
-
- tx_buf[0] = FM_TASK_COMMAND_PKT_TYPE;
- tx_buf[1] = FM_RAMPDOWN_OPCODE;
- pkt_size = 4;
-
- pkt_size += fm_bop_write(0x3B, 0x0500, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 3b 0500 */
- pkt_size += fm_bop_write(0x3A, 0x00FF, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 3a ff */
- pkt_size += fm_bop_write(0x65, 0x0001, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 65 1 */
- pkt_size += fm_bop_write(0x48, 0x0000, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 48 0 */
-
- tx_buf[2] = (fm_u8) ((pkt_size - 4) & 0x00FF);
- tx_buf[3] = (fm_u8) (((pkt_size - 4) >> 8) & 0x00FF);
-
- return pkt_size;
-}
-#endif
-/*
- * mt6620_tune - execute tune action,
- * @buf - target buf
- * @buf_size - buffer size
- * @freq - 760 ~ 1080, 100KHz unit
- * return package size
- */
-fm_s32 mt6620_tune_1(fm_u8 *buf, fm_s32 buf_size, fm_u16 freq)
-{
- fm_s32 pkt_size = 0;
-
- if (buf_size < TX_BUF_SIZE) {
- return (-1);
- }
- if (0 == fm_get_channel_space(freq)) {
- freq *= 10;
- }
-
- freq = (freq - 6400) * 2 / 10;
-
- buf[0] = FM_TASK_COMMAND_PKT_TYPE;
- buf[1] = FM_TUNE_OPCODE;
- pkt_size = 4;
-
- pkt_size += fm_bop_modify(0x0F, 0xFC00, freq, &buf[pkt_size], buf_size - pkt_size); /* set 0x0F[9:0] = 0x029e, => ((97.5 - 64) * 20) */
- pkt_size += fm_bop_modify(0x63, 0xFFFF, 0x0001, &buf[pkt_size], buf_size - pkt_size); /* set 0x63[0] = 1 */
-
- buf[2] = (fm_u8) ((pkt_size - 4) & 0x00FF);
- buf[3] = (fm_u8) (((pkt_size - 4) >> 8) & 0x00FF);
-
- return pkt_size;
-}
-
-fm_s32 mt6620_tune_2(fm_u8 *buf, fm_s32 buf_size, fm_u16 freq)
-{
- fm_s32 pkt_size = 0;
-
- if (buf_size < TX_BUF_SIZE) {
- return (-1);
- }
-/*
- if (0 == fm_get_channel_space(freq)) {
- freq *= 10;
- }
-
- freq = (freq - 640) * 2 / 10;
-*/
- buf[0] = FM_TASK_COMMAND_PKT_TYPE;
- buf[1] = FM_TUNE_OPCODE;
- pkt_size = 4;
-
- pkt_size += fm_bop_modify(0x9C, 0xFFF7, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* set 0x9C[3] = 0 */
-
- buf[2] = (fm_u8) ((pkt_size - 4) & 0x00FF);
- buf[3] = (fm_u8) (((pkt_size - 4) >> 8) & 0x00FF);
-
- return pkt_size;
-}
-
-fm_s32 mt6620_tune_3(fm_u8 *buf, fm_s32 buf_size, fm_u16 freq)
-{
- fm_s32 pkt_size = 0;
-
- if (buf_size < TX_BUF_SIZE) {
- return (-1);
- }
-/*
- if (0 == fm_get_channel_space(freq)) {
- freq *= 10;
- }
-
- freq = (freq - 640) * 2 / 10;
-*/
- buf[0] = FM_TASK_COMMAND_PKT_TYPE;
- buf[1] = FM_TUNE_OPCODE;
- pkt_size = 4;
-
- pkt_size += fm_bop_write(0x9F, 0x0001, &buf[pkt_size], buf_size - pkt_size); /* wr 9F 1 */
- pkt_size += fm_bop_write(0xC8, 0x0232, &buf[pkt_size], buf_size - pkt_size); /* wr C8 232 */
- pkt_size += fm_bop_write(0xDD, 0x8833, &buf[pkt_size], buf_size - pkt_size); /* wr DD 8833 */
- pkt_size += fm_bop_write(0xD8, 0x00E8, &buf[pkt_size], buf_size - pkt_size); /* wr D8 E8 */
- pkt_size += fm_bop_write(0x9F, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* wr 9F 0 */
-
- buf[2] = (fm_u8) ((pkt_size - 4) & 0x00FF);
- buf[3] = (fm_u8) (((pkt_size - 4) >> 8) & 0x00FF);
-
- return pkt_size;
-}
-
-fm_s32 mt6620_fast_tune(fm_u8 *tx_buf, fm_s32 tx_buf_size, fm_u16 freq)
-{
- fm_s32 pkt_size = 0;
-
- if (tx_buf_size < TX_BUF_SIZE) {
- return (-1);
- }
-
- if (0 == fm_get_channel_space(freq)) {
- freq *= 10;
- }
-
- freq = (freq - 6400) * 2 / 10;
-
- tx_buf[0] = FM_TASK_COMMAND_PKT_TYPE;
- tx_buf[1] = FM_TUNE_OPCODE;
- pkt_size = 4;
-
- pkt_size += fm_bop_modify(0x63, 0xFFF0, 0x0000, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* set 0x63[3:0] = 0 */
- pkt_size += fm_bop_modify(0x6F, 0xFFFE, 0x0000, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* set 0x6F[0] = 0 */
- pkt_size += fm_bop_modify(0x0F, 0xFC00, freq, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* set 0x0F[9:0] = 0x029e, => ((97.5 - 64) * 20) */
- /* disable interrupt before rampdown */
- pkt_size += fm_bop_write(0x6B, 0x0000, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 6b 0000 */
- pkt_size += fm_bop_modify(0x63, 0xFFFE, 0x0001, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* set 0x63[0] = 1 */
- pkt_size += fm_bop_rd_until(0x69, 0x0001, 0x0001, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* Poll 69[0] = b'1 */
- pkt_size += fm_bop_modify(0x69, 0xFFFE, 0x0001, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* set 0x69[0] = 1 */
- pkt_size += fm_bop_write(0x6B, 0x2100, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 6b 2100 */
- /* enable interrupt after rampdown */
-
- tx_buf[2] = (fm_u8) ((pkt_size - 4) & 0x00FF);
- tx_buf[3] = (fm_u8) (((pkt_size - 4) >> 8) & 0x00FF);
-
- return pkt_size;
-}
-
-/*
- * mt6620_full_cqi_req - execute request cqi info action,
- * @buf - target buf
- * @buf_size - buffer size
- * @freq - 7600 ~ 10800, freq array
- * @cnt - channel count
- * @type - request type, 1: a single channel; 2: multi channel; 3:multi channel with 100Khz step; 4: multi channel with 50Khz step
- *
- * return package size
- */
-
-fm_s32 mt6620_full_cqi_req(fm_u8 *buf, fm_s32 buf_size, fm_u16 freq, fm_s32 cnt, fm_s32 type)
-{
- fm_s32 pkt_size = 0;
-
- if (buf_size < TX_BUF_SIZE) {
- return (-1);
- }
- if (0 == fm_get_channel_space(freq)) {
- freq *= 10;
- }
- buf[0] = FM_TASK_COMMAND_PKT_TYPE;
- buf[1] = FM_SOFT_MUTE_TUNE_OPCODE;
- pkt_size = 4;
-
- switch (type) {
- case 1:
- buf[pkt_size] = 0x0001;
- pkt_size++;
- buf[pkt_size] = (fm_u8) (freq & 0x00FF);
- pkt_size++;
- buf[pkt_size] = (fm_u8) ((freq >> 8) & 0x00FF);
- pkt_size++;
- break;
- default:
- buf[pkt_size] = (fm_u16) type;
- pkt_size++;
- break;
- }
-
- buf[2] = (fm_u8) ((pkt_size - 4) & 0x00FF);
- buf[3] = (fm_u8) (((pkt_size - 4) >> 8) & 0x00FF);
-
- return pkt_size;
-
-}
-
-/* freq: 760 ~ 1080, 100KHz unit */
-fm_s32 mt6620_tune_tx(fm_u8 *tx_buf, fm_s32 tx_buf_size, fm_u16 freq)
-{
- fm_s32 pkt_size = 0;
-
- if (tx_buf_size < TX_BUF_SIZE) {
- return (-1);
- }
-
- if (0 == fm_get_channel_space(freq)) {
- freq *= 10;
- }
-
- freq = (freq - 6400) * 2 / 10;
-
- tx_buf[0] = FM_TASK_COMMAND_PKT_TYPE;
- tx_buf[1] = FM_TUNE_OPCODE;
- pkt_size = 4;
-
- /* XHC, 2011/04/20, ramp down before tune */
- pkt_size += fm_bop_write(0x3B, 0x0500, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 3b 0500 */
- pkt_size += fm_bop_write(0x3A, 0x00FF, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 3a ff */
- pkt_size += fm_bop_write(0x65, 0x0001, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 65 1 */
- pkt_size += fm_bop_write(0x48, 0x0000, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 48 0 */
- /* XHC, 2011/04/14 */
- pkt_size += fm_bop_modify(0x41, 0xFFFE, 0x0001, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* set 0x41[0] = 1 */
- /* XHC, 2011/04/18 */
- pkt_size += fm_bop_modify(0x12, 0x7FFF, 0x0000, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* set 0x12[15] = 0 */
- /* XHC, 2011/04/22, clear RTC compensation info */
- pkt_size += fm_bop_modify(0x47, 0x003F, 0x0000, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* set 0x47[15:6] = 0 */
- pkt_size += fm_bop_modify(0x0F, 0xFC00, freq, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* set 0x0F[9:0] = freq */
- pkt_size += fm_bop_write(0x26, 0x002C, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 26 002C --> SCAL Related --> SCAL_EN and SCAL_GM_EN */
- pkt_size += fm_bop_udelay(1000, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* delay 1000us */
- pkt_size += fm_bop_write(0x26, 0x003C, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 26 003C --> SCAL_BUF_EN */
- pkt_size += fm_bop_udelay(1000, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* delay 1000us */
- pkt_size += fm_bop_write(0x10, 0x1E8D, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 10 1e8d */
- pkt_size += fm_bop_udelay(1000, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* delay 1000us */
- pkt_size += fm_bop_write(0x10, 0x9E8D, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 10 9e8d */
- pkt_size += fm_bop_udelay(10000, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* delay 10000us */
- pkt_size += fm_bop_write(0x26, 0x0024, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 26 0024 --> Turn off SCAL gm and BUF */
- pkt_size += fm_bop_write(0x65, 0x400F, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 65 400f */
- pkt_size += fm_bop_write(0x48, 0x8000, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 48 8000 */
- pkt_size += fm_bop_write(0x3B, 0x0420, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 3b 0420 */
- pkt_size += fm_bop_write(0x3A, 0x01FF, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 3a 1ff */
- /* XHC, 2011/04/14 */
- /* pkt_size += fm_bop_udelay(10000, &tx_buf[pkt_size], tx_buf_size - pkt_size);//delay 10000us */
- /* pkt_size += fm_bop_modify(0x41, 0xFFFE, 0x0000, &tx_buf[pkt_size], tx_buf_size - pkt_size);// set 0x41[0] = 0 */
-
- tx_buf[2] = (fm_u8) ((pkt_size - 4) & 0x00FF);
- tx_buf[3] = (fm_u8) (((pkt_size - 4) >> 8) & 0x00FF);
-
- return pkt_size;
-}
-
-/* freq: 760 ~ 1080, 100KHz unit */
-fm_s32 mt6620_tune_txscan(fm_u8 *tx_buf, fm_s32 tx_buf_size, fm_u16 freq)
-{
- fm_s32 pkt_size = 0;
-
- if (tx_buf_size < TX_BUF_SIZE) {
- return (-1);
- }
-
- if (0 == fm_get_channel_space(freq)) {
- freq *= 10;
- }
-
- freq = (freq - 6400) * 2 / 10;
-
- tx_buf[0] = FM_TASK_COMMAND_PKT_TYPE;
- tx_buf[1] = FM_TUNE_OPCODE;
- pkt_size = 4;
-
- /* rampdown */
- /* disable interrupt before rampdown */
- pkt_size += fm_bop_write(0x6B, 0x0000, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 6b 0000 */
- pkt_size += fm_bop_modify(0x63, 0xFFF0, 0x0000, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 63[3:0] = 0, ramp down */
- pkt_size += fm_bop_rd_until(0x6f, 0x0001, 0x0000, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* Poll 6f[0] = b'0 */
- pkt_size += fm_bop_modify(0x9C, 0xFFFF, 0x0008, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 9c[3] = 1, ramp down */
- pkt_size += fm_bop_write(0x6B, 0x2100, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 6b 2100 */
- /* enable interrupt after rampdown */
-
- /* set desired channel */
- pkt_size += fm_bop_modify(0x0F, 0xFC00, freq, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* set 0x0F[9:0] = 0x029e, => ((97.5 - 64) * 20) */
-
- /* only for short antennal tune */
-#ifdef MT6620_FM_USE_SHORT_ANTENNA
- pkt_size += fm_bop_write(0x28, 0x3800, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 28 3800 */
- pkt_size += fm_bop_write(0x03, 0x90F0, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 3 90f0 */
- pkt_size += fm_bop_write(0x2E, 0x0028, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 2e 28 */
- pkt_size += fm_bop_write(0x2F, 0x0000, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 2f 0 */
- pkt_size += fm_bop_write(0x26, 0x003C, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 26 3c */
- pkt_size += fm_bop_write(0x2E, 0x002C, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 2e 2c */
- pkt_size += fm_bop_udelay(10000, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wait 10ms */
- pkt_size += fm_bop_write(0x26, 0x0024, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 26 24 */
- pkt_size += fm_bop_write(0x28, 0x0000, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 28 00 */
-#endif
-
- /* only for E1 */
-#ifdef MT6620E1
- pkt_size += fm_bop_write(0x9F, 0x0000, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 9F 0 */
- pkt_size += fm_bop_write(0xAF, 0x2210, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr AF 2210 */
-#endif
-
- /* mask STC_DONE interrupt, 6a(D0) 0 */
- /* pkt_size += fm_bop_modify(0x6A, 0xFFFE, 0x0000, &tx_buf[pkt_size], tx_buf_size - pkt_size); */
-
- /* enable hardware are controlled tuning sequence */
- pkt_size += fm_bop_modify(0x63, 0xFFFF, 0x0001, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* set rgf_tune (63H D0) =1 */
-
- /* check STC_DONE interrupt status flag */
- /* pkt_size += fm_bop_rd_until(0x69, 0x0001, 0x0001, &tx_buf[pkt_size], tx_buf_size - pkt_size);//Poll fm_intr_stc_done (69H D0) = 1 */
-
- /* write 1 clear the STC_DONE status flag */
- /* pkt_size += fm_bop_modify(0x69, 0xFFFF, 0x0001, &tx_buf[pkt_size], tx_buf_size - pkt_size);// set stc_done (6FH D0) =1 */
-
- /* unmask STC_DONE interrupt, 6a(D0) 1 */
- /* pkt_size += fm_bop_modify(0x6A, 0xFFFF, 0x0001, &tx_buf[pkt_size], tx_buf_size - pkt_size); */
-
- /* only for E1 */
-#ifdef MT6620E1
- /* pkt_size += fm_bop_write(0xAF, 0x7710, &tx_buf[pkt_size], tx_buf_size - pkt_size);//wr AF 7710 */
-#endif
-
- tx_buf[2] = (fm_u8) ((pkt_size - 4) & 0x00FF);
- tx_buf[3] = (fm_u8) (((pkt_size - 4) >> 8) & 0x00FF);
-
- return pkt_size;
-}
-
-/*
- * mt6620_seek - execute seek action,
- * @buf - target buf
- * @buf_size - buffer size
- * @seekdir - 0=seek up, 1=seek down
- * @space - step, 50KHz:001, 100KHz:010, 200KHz:100
- * @max_freq - upper bound
- * @min_freq - lower bound
- * return package size
- */
-fm_s32 mt6620_seek_1(fm_u8 *buf, fm_s32 buf_size, fm_u16 seekdir, fm_u16 space, fm_u16 max_freq,
- fm_u16 min_freq)
-{
- fm_s32 pkt_size = 0;
-
- if (buf_size < TX_BUF_SIZE) {
- return (-1);
- }
-
- buf[0] = FM_TASK_COMMAND_PKT_TYPE;
- buf[1] = FM_SEEK_OPCODE;
- pkt_size = 4;
-
- /* A1 Program seek direction, 0x66[10]: 0=seek up, 1=seek down */
- if (seekdir == 0) {
- pkt_size += fm_bop_modify(0x66, 0xFBFF, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* 0x66[10] = 0, seek up */
- } else {
- pkt_size += fm_bop_modify(0x66, 0xFFFF, 0x0400, &buf[pkt_size], buf_size - pkt_size); /* 0x66[10] = 1, seek down */
- }
-
- /* 0x66[11] 0=no wrarp, 1=wrap */
- pkt_size += fm_bop_modify(0x66, 0xFFFF, 0x0800, &buf[pkt_size], buf_size - pkt_size); /* 0x66[11] = 1, wrap */
- /* A2 Program scan channel spacing, 0x66[14:12] step 50KHz:001/100KHz:010/200KHz:100 */
- if (space == 4) {
- pkt_size += fm_bop_modify(0x66, 0x8FFF, 0x4000, &buf[pkt_size], buf_size - pkt_size); /* clear 0x66[14:12] then 0x66[14:12]=001 */
- } else {
- pkt_size += fm_bop_modify(0x66, 0x8FFF, 0x2000, &buf[pkt_size], buf_size - pkt_size); /* clear 0x66[14:12] then 0x66[14:12]=010 */
- }
-
- /* 0x66[9:0] freq upper bound */
- max_freq = (max_freq - 640) * 2;
- pkt_size += fm_bop_modify(0x66, 0xFC00, max_freq, &buf[pkt_size], buf_size - pkt_size);
-
- /* 0x67[9:0] freq lower bound */
- min_freq = (min_freq - 640) * 2;
- pkt_size += fm_bop_modify(0x67, 0xFC00, min_freq, &buf[pkt_size], buf_size - pkt_size);
- /* A3 Enable hardware controlled seeking sequence */
- pkt_size += fm_bop_modify(0x63, 0xFFFF, 0x0002, &buf[pkt_size], buf_size - pkt_size); /* 0x63[1] = 1 */
-
- buf[2] = (fm_u8) ((pkt_size - 4) & 0x00FF);
- buf[3] = (fm_u8) (((pkt_size - 4) >> 8) & 0x00FF);
-
- return pkt_size;
-}
-
-fm_s32 mt6620_seek_2(fm_u8 *buf, fm_s32 buf_size, fm_u16 seekdir, fm_u16 space, fm_u16 max_freq,
- fm_u16 min_freq)
-{
- fm_s32 pkt_size = 0;
-
- if (buf_size < TX_BUF_SIZE) {
- return (-1);
- }
-
- buf[0] = FM_TASK_COMMAND_PKT_TYPE;
- buf[1] = FM_SEEK_OPCODE;
- pkt_size = 4;
-
- /* A10 Set softmute to normal mode */
- pkt_size += fm_bop_write(0x9F, 0x0001, &buf[pkt_size], buf_size - pkt_size); /* wr 9F 1 */
- pkt_size += fm_bop_write(0xC8, 0x0232, &buf[pkt_size], buf_size - pkt_size); /* wr C8 232 */
- pkt_size += fm_bop_write(0xDD, 0x8833, &buf[pkt_size], buf_size - pkt_size); /* wr DD 8833 */
- pkt_size += fm_bop_write(0xD8, 0x00E8, &buf[pkt_size], buf_size - pkt_size); /* wr D8 E8 */
- pkt_size += fm_bop_write(0x9F, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* wr 9F 0 */
-
- buf[2] = (fm_u8) ((pkt_size - 4) & 0x00FF);
- buf[3] = (fm_u8) (((pkt_size - 4) >> 8) & 0x00FF);
-
- return pkt_size;
-}
-
-/*
- * mt6620_scan - execute scan action,
- * @buf - target buf
- * @buf_size - buffer size
- * @scandir - 0=seek up, 1=seek down
- * @space - step, 50KHz:001, 100KHz:010, 200KHz:100
- * @max_freq - upper bound
- * @min_freq - lower bound
- * return package size
- */
-fm_s32 mt6620_scan_1(fm_u8 *buf, fm_s32 buf_size, fm_u16 scandir, fm_u16 space, fm_u16 max_freq,
- fm_u16 min_freq)
-{
- fm_s32 pkt_size = 0;
-
- if (buf_size < TX_BUF_SIZE) {
- return (-1);
- }
-
- buf[0] = FM_TASK_COMMAND_PKT_TYPE;
- buf[1] = FM_SCAN_OPCODE;
- pkt_size = 4;
-
- /* A1 Program seek direction, 0x66[10]: 0=seek up, 1=seek down */
- if (scandir == 0) {
- pkt_size += fm_bop_modify(0x66, 0xFBFF, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* 0x66[10] = 0, seek up */
- } else {
- pkt_size += fm_bop_modify(0x66, 0xFFFF, 0x0400, &buf[pkt_size], buf_size - pkt_size); /* 0x66[10] = 1, seek down */
- }
-
- /* 0x66[11] 0=no wrarp, 1=wrap */
- pkt_size += fm_bop_modify(0x66, 0xFFFF, 0x0800, &buf[pkt_size], buf_size - pkt_size); /* 0x66[11] = 1, wrap */
- /* A2 Program scan channel spacing, 0x66[14:12] step 50KHz:001/100KHz:010/200KHz:100 */
- if (space == 4) {
- pkt_size += fm_bop_modify(0x66, 0x8FFF, 0x4000, &buf[pkt_size], buf_size - pkt_size); /* clear 0x66[14:12] then 0x66[14:12]=001 */
- } else {
- pkt_size += fm_bop_modify(0x66, 0x8FFF, 0x2000, &buf[pkt_size], buf_size - pkt_size); /* clear 0x66[14:12] then 0x66[14:12]=010 */
- }
-
- /* 0x66[9:0] freq upper bound */
- max_freq = (max_freq - 640) * 2;
- pkt_size += fm_bop_modify(0x66, 0xFC00, max_freq, &buf[pkt_size], buf_size - pkt_size);
-
- /* 0x67[9:0] freq lower bound */
- min_freq = (min_freq - 640) * 2;
- pkt_size += fm_bop_modify(0x67, 0xFC00, min_freq, &buf[pkt_size], buf_size - pkt_size);
- /* A3 Enable hardware controlled seeking sequence */
- pkt_size += fm_bop_modify(0x63, 0xFFFF, 0x0004, &buf[pkt_size], buf_size - pkt_size); /* 0x63[1] = 1 */
-
- buf[2] = (fm_u8) ((pkt_size - 4) & 0x00FF);
- buf[3] = (fm_u8) (((pkt_size - 4) >> 8) & 0x00FF);
-
- return pkt_size;
-}
-
-fm_s32 mt6620_scan_2(fm_u8 *buf, fm_s32 buf_size, fm_u16 scandir, fm_u16 space, fm_u16 max_freq,
- fm_u16 min_freq)
-{
- fm_s32 pkt_size = 0;
-
- if (buf_size < TX_BUF_SIZE) {
- return (-1);
- }
-
- buf[0] = FM_TASK_COMMAND_PKT_TYPE;
- buf[1] = FM_SCAN_OPCODE;
- pkt_size = 4;
-
- /* A10 Set softmute to normal mode */
- pkt_size += fm_bop_write(0x9F, 0x0001, &buf[pkt_size], buf_size - pkt_size); /* wr 9F 1 */
- pkt_size += fm_bop_write(0xC8, 0x0232, &buf[pkt_size], buf_size - pkt_size); /* wr C8 232 */
- pkt_size += fm_bop_write(0xDD, 0x8833, &buf[pkt_size], buf_size - pkt_size); /* wr DD 8833 */
- pkt_size += fm_bop_write(0xD8, 0x00E8, &buf[pkt_size], buf_size - pkt_size); /* wr D8 E8 */
- pkt_size += fm_bop_write(0x9F, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* wr 9F 0 */
-
- buf[2] = (fm_u8) ((pkt_size - 4) & 0x00FF);
- buf[3] = (fm_u8) (((pkt_size - 4) >> 8) & 0x00FF);
-
- return pkt_size;
-}
-
-fm_s32 mt6620_get_reg(fm_u8 *buf, fm_s32 buf_size, fm_u8 addr)
-{
- if (buf_size < TX_BUF_SIZE) {
- return (-1);
- }
-
- buf[0] = FM_TASK_COMMAND_PKT_TYPE;
- buf[1] = FSPI_READ_OPCODE;
- buf[2] = 0x01;
- buf[3] = 0x00;
- buf[4] = addr;
-
- WCN_DBG(FM_DBG | CHIP, "%02x %02x %02x %02x %02x\n", buf[0], buf[1], buf[2], buf[3],
- buf[4]);
- return 5;
-}
-
-fm_s32 mt6620_set_reg(fm_u8 *buf, fm_s32 buf_size, fm_u8 addr, fm_u16 value)
-{
- if (buf_size < TX_BUF_SIZE) {
- return (-1);
- }
-
- buf[0] = FM_TASK_COMMAND_PKT_TYPE;
- buf[1] = FSPI_WRITE_OPCODE;
- buf[2] = 0x03;
- buf[3] = 0x00;
- buf[4] = addr;
- buf[5] = (fm_u8) ((value) & 0x00FF);
- buf[6] = (fm_u8) ((value >> 8) & 0x00FF);
-
- WCN_DBG(FM_DBG | CHIP, "%02x %02x %02x %02x %02x %02x %02x\n", buf[0], buf[1], buf[2],
- buf[3], buf[4], buf[5], buf[6]);
- return 7;
-}
-
-fm_s32 mt6620_rds_rx_enable(fm_u8 *tx_buf, fm_s32 tx_buf_size) /* IC version */
-{
- fm_s32 pkt_size = 0;
-
- if (tx_buf_size < TX_BUF_SIZE) {
- return (-1);
- }
-
- tx_buf[0] = FM_TASK_COMMAND_PKT_TYPE;
- tx_buf[1] = RDS_RX_ENABLE_OPCODE;
- pkt_size = 4;
-
- pkt_size += fm_bop_write(0x9F, 0x0003, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 0x9f 3 */
- pkt_size += fm_bop_write(0xCB, 0xE016, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* Wr 0xcb e016 */
- pkt_size += fm_bop_write(0x9F, 0x0000, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 0x9f 0 */
- pkt_size += fm_bop_write(0x63, 0x0491, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* Wr 0x63 491 */
- pkt_size += fm_bop_modify(0x6B, 0xFFFF, 0x2000, &tx_buf[pkt_size], TX_BUF_SIZE - pkt_size); /* Wr 0x6b [13] = 1 */
-
- tx_buf[2] = (fm_u8) ((pkt_size - 4) & 0x00FF);
- tx_buf[3] = (fm_u8) (((pkt_size - 4) >> 8) & 0x00FF);
-
- return pkt_size;
-}
-
-fm_s32 mt6620_rds_rx_disable(fm_u8 *tx_buf, fm_s32 tx_buf_size) /* IC version */
-{
- fm_s32 pkt_size = 0;
-
- if (tx_buf_size < TX_BUF_SIZE) {
- return (-1);
- }
-
- tx_buf[0] = FM_TASK_COMMAND_PKT_TYPE;
- tx_buf[1] = RDS_RX_ENABLE_OPCODE;
- pkt_size = 4;
-
- pkt_size += fm_bop_modify(0x6B, 0xDFFF, 0x0000, &tx_buf[pkt_size], TX_BUF_SIZE - pkt_size); /* Wr 0x6b [13] = 0 */
- pkt_size += fm_bop_write(0x63, 0x0481, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* Wr 0x63 481 */
-
-
- tx_buf[2] = (fm_u8) ((pkt_size - 4) & 0x00FF);
- tx_buf[3] = (fm_u8) (((pkt_size - 4) >> 8) & 0x00FF);
-
- return pkt_size;
-}
-
-/* TBD for IC */
-fm_s32 mt6620_rds_tx(fm_u8 *tx_buf, fm_s32 tx_buf_size, fm_u16 pi, fm_u16 *ps, fm_u16 *other_rds,
- fm_u8 other_rds_cnt)
-{
- fm_s32 pkt_size = 0;
- fm_s32 i;
-
- if (tx_buf_size < TX_BUF_SIZE) {
- return (-1);
- }
-
- if (other_rds_cnt > 29) {
- return (-2);
- }
-
- tx_buf[0] = FM_TASK_COMMAND_PKT_TYPE;
- tx_buf[1] = RDS_TX_OPCODE;
- pkt_size = 4;
-
- /* RDS Tx config */
- pkt_size += fm_bop_modify(0x65, 0xFFFF, 0x0010, &tx_buf[pkt_size], TX_BUF_SIZE - pkt_size); /* wr 65[4] = b'1, enable RDS Tx */
- pkt_size += fm_bop_write(0x9F, 0x0003, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 9F 3 */
- pkt_size += fm_bop_write(0xA2, 0x0005, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr a2 5, repeat + PI_reg mode */
- pkt_size += fm_bop_write(0xA1, 0x0000, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr a1 0 */
- /* pkt_size += fm_bop_write(0xA0, 0x0001, &tx_buf[pkt_size], tx_buf_size - pkt_size);//wr a0 1 */
- pkt_size += fm_bop_write(0xA4, pi, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* write PI to PI_reg */
- /* program PS buf */
- pkt_size += fm_bop_rd_until(0xAA, 0x0001, 0x0000, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* rd until aa[0] = b'0, ptr in normal buf */
- /* program normal buf, workaround that PS buf can't work while normal buf is empty */
- for (i = 0; i < 12; i++) {
- pkt_size += fm_bop_write(0xA8, ps[i], &tx_buf[pkt_size], tx_buf_size - pkt_size); /* a8 = RDS Tx data */
- }
- pkt_size += fm_bop_modify(0xA2, 0xFFFF, 0x0002, &tx_buf[pkt_size], TX_BUF_SIZE - pkt_size); /* wr a2[1] = b'1, mem_addr mode */
- for (i = 0; i < 12; i++) {
- pkt_size += fm_bop_write(0xA7, (0x0063 + i), &tx_buf[pkt_size], tx_buf_size - pkt_size); /* a7 = mem_addr */
- pkt_size += fm_bop_write(0xA8, ps[i], &tx_buf[pkt_size], tx_buf_size - pkt_size); /* a8 = RDS Tx data */
- }
- pkt_size += fm_bop_modify(0xA2, 0xFFFF, 0x0010, &tx_buf[pkt_size], TX_BUF_SIZE - pkt_size); /* wr a2[4] = b'1, switch to ps buf */
- /* program normal buf */
- pkt_size += fm_bop_rd_until(0xAA, 0x0001, 0x0001, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* rd until aa[0] = b'1, ptr in ps buf */
- pkt_size += fm_bop_modify(0xA2, 0xFFFD, 0x0000, &tx_buf[pkt_size], TX_BUF_SIZE - pkt_size); /* wr a2[1] = b'0, h/w addr mode */
- for (i = 0; i < 12; i++) {
- pkt_size += fm_bop_write(0xA8, ps[i], &tx_buf[pkt_size], tx_buf_size - pkt_size); /* a8 = RDS Tx data */
- }
- for (i = 0; i < (other_rds_cnt * 3); i++) {
- pkt_size += fm_bop_write(0xA8, other_rds[i], &tx_buf[pkt_size], tx_buf_size - pkt_size); /* a8 = RDS Tx data */
- }
- pkt_size += fm_bop_modify(0xA2, 0xFFEF, 0x0000, &tx_buf[pkt_size], TX_BUF_SIZE - pkt_size); /* wr a2[4] = b'0, switch to normal buf */
- pkt_size += fm_bop_write(0x9F, 0x0000, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 9F 0 */
-
- tx_buf[2] = (fm_u8) ((pkt_size - 4) & 0x00FF);
- tx_buf[3] = (fm_u8) (((pkt_size - 4) >> 8) & 0x00FF);
-
- return pkt_size;
-}
-
-/* TBD for IC */
-fm_s32 mt6620_off_2_tx_shortANA(fm_u8 *tx_buf, fm_s32 tx_buf_size)
-{
- fm_s32 pkt_size = 0;
-
- if (tx_buf_size < TX_BUF_SIZE) {
- return (-1);
- }
-
- tx_buf[0] = FM_TASK_COMMAND_PKT_TYPE;
- tx_buf[1] = FM_ENABLE_OPCODE;
- pkt_size = 4;
-
- pkt_size += fm_bop_write(0x01, 0x4A00, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 1 4A00 --> Turn on Central Bias + FC */
- pkt_size += fm_bop_udelay(30, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* delay 30 */
- pkt_size += fm_bop_write(0x01, 0x6A00, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 1 6A00 --> Turn off FC */
- pkt_size += fm_bop_udelay(50, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* delay 50 */
- pkt_size += fm_bop_write(0x02, 0x299C, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 2 299C --> Set the LDOs Output Voltages */
- pkt_size += fm_bop_write(0x01, 0x6B82, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 1 6B82 --> Turn on DCO, RX and ADDA LDO */
- pkt_size += fm_bop_write(0x3B, 0x0500, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 3B 0500 --> Turn on PA LDO --> LDO PA = 2.5V [0000 010x xxx0 000] {xxxx} - 0001 = 2.5V */
- pkt_size += fm_bop_write(0x04, 0x0548, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 4 0548 --> Set the RX LDO to Low Power Mode + TR Switch Off */
- pkt_size += fm_bop_write(0x37, 0x2000, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 37 2000 --> Set the Short Antenna Bias */
- pkt_size += fm_bop_write(0x42, 0xC002, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 42 C002 --> Set the Short Antenna Bias */
- pkt_size += fm_bop_write(0x0A, 0x0060, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr A 0060 --> Update AFCDAC LPF Setting */
- pkt_size += fm_bop_write(0x0E, 0x0040, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr E 0040 --> Update SX_VDC_CBANK */
- pkt_size += fm_bop_write(0x0C, 0xA88C, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr c A88C */
- pkt_size += fm_bop_write(0x10, 0x1E8D, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 10 1e8d */
- pkt_size += fm_bop_write(0x27, 0x0005, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 27 0005 --> Update ACAL and Enable RMS_DET */
- pkt_size += fm_bop_write(0x11, 0x07D8, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 11 07D8 --> Set VCO_DIVRST_N = 0 */
- pkt_size += fm_bop_write(0x41, 0x0003, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 41 0003 --> Set TX_FVCO_EN = 1 and FVCO_SEL=1 */
- pkt_size += fm_bop_write(0x08, 0x25B8, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 8 25b8 --> ADC = TX Mode (AU_ADC) */
- pkt_size += fm_bop_write(0x09, 0x2964, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 9 2964 --> ADC DWA ON */
- pkt_size += fm_bop_write(0x3F, 0xAD86, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 3F AD86 --> TX DAc RX_TX_SEL = TX MOde */
- pkt_size += fm_bop_write(0x3A, 0x01EF, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 3A 01EF --> Turn on TX Chain [PA+D2S+HRM+AUPGA+TXDAC+LODIV] */
- pkt_size += fm_bop_write(0x3E, 0x3181, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 3E 3181 --> TX LPF EN + CSEL from RCCAL */
- pkt_size += fm_bop_write(0x00, 0x0100, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 0 0100 --> Turn on SDADC */
- pkt_size += fm_bop_write(0x37, 0x2000, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 37 2000 --> Control Signal for DAC_CK output clock gate */
- /* FM ADPLL Power Up */
- pkt_size += fm_bop_write(0x25, 0x040F, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 25 040f --> Turn off DIG_CK_EN */
- pkt_size += fm_bop_write(0x20, 0x2720, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 20 2720 --> Turn on ADPLL 2320 CW32 */
- /* XHC,2011/03/18, [wr 22 9980-> 6680] */
- pkt_size += fm_bop_write(0x22, 0x6680, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 22 9980 --> Update DLF Gain */
- pkt_size += fm_bop_write(0x25, 0x080F, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 25 080f --> Update I_CODE_CCAL + ADC_CK_EN + 32KCLKPLL_EN 0803 CW37 */
- pkt_size += fm_bop_write(0x1E, 0x0863, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 1e 0863 --> Turn on DCO + CAL_COARSE_EN */
- pkt_size += fm_bop_udelay(5000, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* delay 5000 */
- pkt_size += fm_bop_write(0x1E, 0x0865, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 1e 0865 --> Change the CAL_COARSE to CAL_FINE */
- pkt_size += fm_bop_udelay(5000, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* delay 5000 */
- pkt_size += fm_bop_write(0x1E, 0x0871, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 1e 0871 --> Off the CAL_COARSE and CAL_FINE + Turn on PLL */
- pkt_size += fm_bop_udelay(100000, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* delay 100000 */
- pkt_size += fm_bop_write(0x2A, 0x1026, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 2a 1022 --> Enable TOP_CG */
- /* FM RC Calibration */
- pkt_size += fm_bop_write(0x00, 0x0080, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 0 0080 --> RCCAL */
- pkt_size += fm_bop_udelay(1, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* delay 1000 */
- pkt_size += fm_bop_write(0x1B, 0x0094, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 1b 0094 --> Update RCCAL Target Count */
- pkt_size += fm_bop_write(0x1B, 0x0095, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 1b 0095 --> Start RCCAL */
- pkt_size += fm_bop_udelay(200, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* delay 1000 */
- pkt_size += fm_bop_write(0x1B, 0x0094, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 1b 0094 --> Off RCCAL */
- pkt_size += fm_bop_write(0x00, 0x0100, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 0 0100 --> Turn off RCCAL Analog Block */
- /* FM VCO Enable */
- pkt_size += fm_bop_write(0x01, 0x6B8A, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 1 6B8A --> Turn on VCO LDO */
- pkt_size += fm_bop_udelay(1, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* delay 1000 */
- pkt_size += fm_bop_write(0x00, 0xC100, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 0 C100 --> Turn on VCO, AFCDAC */
- pkt_size += fm_bop_write(0x0C, 0xB88C, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr c B88c --> Turn on Const gm */
- pkt_size += fm_bop_udelay(3000, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* delay 3000 */
- pkt_size += fm_bop_write(0x3A, 0x01FF, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 3A 01FF --> Enable TX Divider */
- /* Short Antenna Setting */
- pkt_size += fm_bop_write(0x42, 0xF002, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 42 F002 --> MSB of HRM_Gain <5> ****>> For Max Pout */
- pkt_size += fm_bop_write(0x3C, 0xABE9, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 3C ABE9 --> Max HRM Gain<4:0> - xxxxx [1010 10xx xxx0 1001] */
- pkt_size += fm_bop_write(0x3D, 0x027E, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 3D 027E --> Max PA Gain<4:0> - [0000 0010 0xxx xx10] */
- pkt_size += fm_bop_write(0x33, 0x0008, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 33 0008 --> Use old VCO calibration routine to save calibration time */
- pkt_size += fm_bop_write(0x28, 0xFFFF, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 28 FFFF */
- pkt_size += fm_bop_write(0x2E, 0x0020, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 2E 0020 --> Turn on SCAL_HWTRIG_DIS --> VCO CAL and SCAL are done separately */
- pkt_size += fm_bop_write(0x2F, 0x0000, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 2F 0000 --> Disable Capbank manual enter mode [4A40 previously] */
- pkt_size += fm_bop_write(0x44, 0x006E, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 44 6e */
- pkt_size += fm_bop_write(0x46, 0xDC22, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 46 DC22 */
- pkt_size += fm_bop_write(0x49, 0x0080, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 49 80 */
- pkt_size += fm_bop_write(0x4A, 0x0004, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 4A 4 */
- pkt_size += fm_bop_write(0x4B, 0x0040, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 4B 40 */
-
- tx_buf[2] = (fm_u8) ((pkt_size - 4) & 0x00FF);
- tx_buf[3] = (fm_u8) (((pkt_size - 4) >> 8) & 0x00FF);
-
- return pkt_size;
-}
-
-/* TBD for IC */
-fm_s32 mt6620_dig_init(fm_u8 *tx_buf, fm_s32 tx_buf_size)
-{
- fm_s32 pkt_size = 0;
-
- if (tx_buf_size < TX_BUF_SIZE) {
- return (-1);
- }
-
- tx_buf[0] = FM_TASK_COMMAND_PKT_TYPE;
- tx_buf[1] = FM_ENABLE_OPCODE;
- pkt_size = 4;
-
-/* fm_rgf_maincon */
- pkt_size += fm_bop_write(0x64, 0x0000, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 64 0 */
- pkt_size += fm_bop_write(0x65, 0x0001, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 65 1 */
- pkt_size += fm_bop_write(0x68, 0xE100, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 68 E100 */
- pkt_size += fm_bop_udelay(10000, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* delay 10000 */
- pkt_size += fm_bop_write(0x68, 0xE000, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 68 E000 */
-/* fm_rgf_dac */
- pkt_size += fm_bop_write(0x9F, 0x0000, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 9F 0 */
- pkt_size += fm_bop_write(0x9E, 0x001C, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 9E 1C */
- pkt_size += fm_bop_write(0x9C, 0xA540, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 9c A540 */
-/* fm_rgf_front */
- pkt_size += fm_bop_write(0x9F, 0x0000, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 9f 0 --> start rgf_front */
- pkt_size += fm_bop_write(0xB8, 0x0001, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr b8 1 */
- pkt_size += fm_bop_write(0xAB, 0x39B6, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr ab 39b6 */
- pkt_size += fm_bop_write(0xAC, 0x3C3E, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr ac 3c3e */
- pkt_size += fm_bop_write(0xAD, 0x0000, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr ad 0 */
- pkt_size += fm_bop_write(0xAE, 0x03C2, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr ae 3c2 */
- pkt_size += fm_bop_write(0xAF, 0x0001, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr af 1 */
- pkt_size += fm_bop_write(0xB1, 0x623D, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr b1 623d */
- pkt_size += fm_bop_write(0xF4, 0x0020, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr f4 20 */
- pkt_size += fm_bop_write(0xF5, 0xBF16, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr f5 bf16 */
- pkt_size += fm_bop_write(0xB9, 0x0050, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr b9 0050 */
- pkt_size += fm_bop_write(0xBA, 0x00C3, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr ba 00c3 */
- pkt_size += fm_bop_write(0xBB, 0x0000, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr bb 0 */
- pkt_size += fm_bop_write(0xBC, 0x0000, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr bc 0 */
- pkt_size += fm_bop_write(0xBD, 0x0056, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr bd 56 */
- pkt_size += fm_bop_write(0xBE, 0x0089, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr be 89 */
- pkt_size += fm_bop_write(0xBF, 0x004C, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr bf 4c */
- pkt_size += fm_bop_write(0xC0, 0x0171, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr c0 171 */
- pkt_size += fm_bop_write(0xC1, 0x002B, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr c1 2b */
- pkt_size += fm_bop_write(0xC2, 0x001F, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr c2 1f */
- pkt_size += fm_bop_write(0xC3, 0x0066, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr c3 66 */
- pkt_size += fm_bop_write(0xC4, 0x00F6, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr c4 f6 */
- pkt_size += fm_bop_write(0xC5, 0x0066, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr c5 66 */
- pkt_size += fm_bop_write(0xC6, 0x001F, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr c6 1f */
- pkt_size += fm_bop_write(0xC7, 0x0007, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr c7 7 */
- pkt_size += fm_bop_write(0xFE, 0x0039, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr fe 39 */
- pkt_size += fm_bop_write(0xFF, 0x3907, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr ff 3907 */
-/* fm_rgf_fmx */
- pkt_size += fm_bop_write(0x9F, 0x0001, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 9f 1 --> start rgf_outer */
- pkt_size += fm_bop_write(0xC0, 0x076C, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr c0 76c */
- pkt_size += fm_bop_write(0xB7, 0x0004, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr b7 4 */
- pkt_size += fm_bop_write(0xD8, 0x006A, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr d8 6a */
- pkt_size += fm_bop_write(0xC8, 0x2828, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr c8 2828 */
- pkt_size += fm_bop_write(0xCE, 0x0090, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr ce 90 */
- pkt_size += fm_bop_write(0xFE, 0x000F, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr fe f */
- pkt_size += fm_bop_write(0xA2, 0x0100, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr a2 100 */
- pkt_size += fm_bop_write(0xA3, 0x0111, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr a3 111 */
- pkt_size += fm_bop_write(0xA4, 0x0122, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr a4 122 */
- pkt_size += fm_bop_write(0xA5, 0x0135, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr a5 135 */
- pkt_size += fm_bop_write(0xA6, 0x0149, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr a6 149 */
- pkt_size += fm_bop_write(0xA7, 0x015E, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr a7 15e */
- pkt_size += fm_bop_write(0xDB, 0x0174, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr db 174 */
- pkt_size += fm_bop_write(0xDC, 0x018D, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr dc 18d */
- pkt_size += fm_bop_write(0xC9, 0x01A6, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr c9 1a6 */
- pkt_size += fm_bop_write(0xCA, 0x01C1, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr ca 1c1 */
- pkt_size += fm_bop_write(0xCB, 0x01DE, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr cb 1de */
- pkt_size += fm_bop_write(0xCC, 0x01FD, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr cc 1fd */
- pkt_size += fm_bop_write(0xD4, 0x2657, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr d4 2657 */
- pkt_size += fm_bop_write(0xA0, 0x85B2, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr a0 85b2 */
- pkt_size += fm_bop_write(0x9F, 0x0000, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* wr 9f 0 */
-
- tx_buf[2] = (fm_u8) ((pkt_size - 4) & 0x00FF);
- tx_buf[3] = (fm_u8) (((pkt_size - 4) >> 8) & 0x00FF);
-
- return pkt_size;
-}
diff --git a/drivers/misc/mediatek/fmradio/mt6620/pub/mt6620_fm_config.c b/drivers/misc/mediatek/fmradio/mt6620/pub/mt6620_fm_config.c
deleted file mode 100644
index fce9fd2b1..000000000
--- a/drivers/misc/mediatek/fmradio/mt6620/pub/mt6620_fm_config.c
+++ /dev/null
@@ -1,345 +0,0 @@
-/* fm_config.c
- *
- * (C) Copyright 2011
- * MediaTek <www.MediaTek.com>
- * hongcheng <hongcheng.xia@MediaTek.com>
- *
- * FM Radio Driver
- *
- * 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.
- *
- * 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.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- */
-#include <linux/string.h>
-#include <linux/slab.h>
-
-#include "fm_typedef.h"
-#include "fm_rds.h"
-#include "fm_dbg.h"
-#include "fm_err.h"
-#include "fm_stdlib.h"
-#include "fm_patch.h"
-#include "fm_config.h"
-/* #include "fm_cust_cfg.h" */
-#include "mt6620_fm_cust_cfg.h"
-
-fm_cust_cfg mt6620_fm_config;
-/* static fm_s32 fm_index = 0; */
-
-static fm_s32 MT6620fm_cust_config_print(fm_cust_cfg *cfg)
-{
- /* fm_s32 i; */
-
- WCN_DBG(FM_NTC | MAIN, "MT6620 rssi_l:\t%d\n", cfg->rx_cfg.long_ana_rssi_th);
- WCN_DBG(FM_NTC | MAIN, "MT6620 rssi_s:\t%d\n", cfg->rx_cfg.short_ana_rssi_th);
- WCN_DBG(FM_NTC | MAIN, "MT6620 pamd_th:\t%d\n", cfg->rx_cfg.pamd_th);
- WCN_DBG(FM_NTC | MAIN, "MT6620 mr_th:\t%d\n", cfg->rx_cfg.mr_th);
- WCN_DBG(FM_NTC | MAIN, "MT6620 atdc_th:\t%d\n", cfg->rx_cfg.atdc_th);
- WCN_DBG(FM_NTC | MAIN, "MT6620 prx_th:\t%d\n", cfg->rx_cfg.prx_th);
- WCN_DBG(FM_NTC | MAIN, "MT6620 atdev_th:\t%d\n", cfg->rx_cfg.atdev_th);
- WCN_DBG(FM_NTC | MAIN, "MT6620 smg_th:\t%d\n", cfg->rx_cfg.smg_th);
- WCN_DBG(FM_NTC | MAIN, "MT6620 de_emphasis:\t%d\n", cfg->rx_cfg.deemphasis);
- WCN_DBG(FM_NTC | MAIN, "MT6620 osc_freq:\t%d\n", cfg->rx_cfg.osc_freq);
-
- WCN_DBG(FM_NTC | MAIN, "MT6620 scan_hole_low:\t%d\n", cfg->tx_cfg.scan_hole_low);
- WCN_DBG(FM_NTC | MAIN, "MT6620 scan_hole_high:\t%d\n", cfg->tx_cfg.scan_hole_high);
- WCN_DBG(FM_NTC | MAIN, "MT6620 power_level:\t%d\n", cfg->tx_cfg.power_level);
-
- WCN_DBG(FM_NTC | MAIN, "aud path[%d]I2S state[%d]mode[%d]rate[%d]\n", cfg->aud_cfg.aud_path,
- cfg->aud_cfg.i2s_info.status, cfg->aud_cfg.i2s_info.mode,
- cfg->aud_cfg.i2s_info.rate);
- return 0;
-}
-
-static fm_s32 MT6620cfg_item_handler(fm_s8 *grp, fm_s8 *key, fm_s8 *val, fm_cust_cfg *cfg)
-{
- fm_s32 ret = 0;
- struct fm_rx_cust_cfg *rx_cfg = &cfg->rx_cfg;
- struct fm_tx_cust_cfg *tx_cfg = &cfg->tx_cfg;
-
- if (0 <= (ret = cfg_item_match(key, val, "FM_RX_RSSI_TH_LONG_MT6620", &rx_cfg->long_ana_rssi_th))) { /* FMR_RSSI_TH_L = 0x0301 */
- return ret;
- } else if (0 <=
- (ret =
- cfg_item_match(key, val, "FM_RX_RSSI_TH_SHORT_MT6620",
- &rx_cfg->short_ana_rssi_th))) {
- return ret;
- } else if (0 <=
- (ret =
- cfg_item_match(key, val, "FM_RX_DESENSE_RSSI_MT6620",
- &rx_cfg->desene_rssi_th))) {
- return ret;
- } else if (0 <= (ret = cfg_item_match(key, val, "FM_RX_PAMD_TH_MT6620", &rx_cfg->pamd_th))) {
- return ret;
- } else if (0 <= (ret = cfg_item_match(key, val, "FM_RX_MR_TH_MT6620", &rx_cfg->mr_th))) {
- return ret;
- } else if (0 <= (ret = cfg_item_match(key, val, "FM_RX_ATDC_TH_MT6620", &rx_cfg->atdc_th))) {
- return ret;
- } else if (0 <= (ret = cfg_item_match(key, val, "FM_RX_PRX_TH_MT6620", &rx_cfg->prx_th))) {
- return ret;
- } else if (0 <= (ret = cfg_item_match(key, val, "FM_RX_SMG_TH_MT6620", &rx_cfg->smg_th))) {
- return ret;
- } else if (0 <=
- (ret =
- cfg_item_match(key, val, "FM_RX_DEEMPHASIS_MT6620", &rx_cfg->deemphasis))) {
- return ret;
- } else if (0 <=
- (ret = cfg_item_match(key, val, "FM_RX_OSC_FREQ_MT6620", &rx_cfg->osc_freq))) {
- return ret;
- } else if (0 <=
- (ret =
- cfg_item_match(key, val, "FMT_SCAN_HOLE_L_MT6620", &tx_cfg->scan_hole_low))) {
- return ret;
- } else if (0 <=
- (ret =
- cfg_item_match(key, val, "FMT_SCAN_HOLE_H_MT6620", &tx_cfg->scan_hole_high))) {
- return ret;
- } else if (0 <=
- (ret =
- cfg_item_match(key, val, "FMT_PWR_LVL_MAX_MT6620", &tx_cfg->power_level))) {
- return ret;
- } else {
- WCN_DBG(FM_WAR | MAIN, "invalid key\n");
- return -1;
- }
-/* if (0 <= (ret = cfg_item_match(key, val, "FMR_RSSI_TH_L_MT6620", &rx_cfg->long_ana_rssi_th))) {//FMR_RSSI_TH_L = 0x0301
- return ret;
- } else if (0 <= (ret = cfg_item_match(key, val, "FMR_RSSI_TH_S_MT6620", &rx_cfg->short_ana_rssi_th))) {
- return ret;
- } else if (0 <= (ret = cfg_item_match(key, val, "FMR_CQI_TH_MT6620", &rx_cfg->cqi_th))) {
- return ret;
- } else if (0 <= (ret = cfg_item_match(key, val, "FMR_MR_TH_MT6620", &rx_cfg->mr_th))) {
- return ret;
- } else if (0 <= (ret = cfg_item_match(key, val, "FMR_SMG_TH_MT6620", &rx_cfg->smg_th))) {
- return ret;
- } else if (0 <= (ret = cfg_item_match(key, val, "FMR_SCAN_CH_SIZE_MT6620", &rx_cfg->scan_ch_size))) {
- return ret;
- } else if (0 <= (ret = cfg_item_match(key, val, "FMR_SCAN_SORT_MT6620", &rx_cfg->scan_sort))) {
- return ret;
- } else if (0 <= (ret = cfg_item_match(key, val, "FMR_SEEK_SPACE_MT6620", &rx_cfg->seek_space))) {
- return ret;
- } else if (0 <= (ret = cfg_item_match(key, val, "FMR_BAND_MT6620", &rx_cfg->band))) {
- return ret;
- } else if (0 <= (ret = cfg_item_match(key, val, "FMR_BAND_FREQ_L_MT6620", &rx_cfg->band_freq_l))) {
- return ret;
- } else if (0 <= (ret = cfg_item_match(key, val, "FMR_BAND_FREQ_H_MT6620", &rx_cfg->band_freq_h))) {
- return ret;
- } else if (0 <= (ret = cfg_item_match(key, val, "FMR_FAKE_CH_MT6620", &rx_cfg->fake_ch[fm_index]))) {
- fm_index += 1;
- rx_cfg->fake_ch_num = (rx_cfg->fake_ch_num < fm_index) ? fm_index : rx_cfg->fake_ch_num;
- return ret;
- } else if (0 <= (ret = cfg_item_match(key, val, "FMR_FAKE_CH_RSSI_MT6620", &rx_cfg->fake_ch_rssi_th))) {
- return ret;
- } else if (0 <= (ret = cfg_item_match(key, val, "FMR_DEEMPHASIS_MT6620", &rx_cfg->deemphasis))) {
- return ret;
- } else if (0 <= (ret = cfg_item_match(key, val, "FMR_OSC_FREQ_MT6620", &rx_cfg->osc_freq))) {
- return ret;
- } */
-}
-
-static fm_s32 MT6620fm_cust_config_default(fm_cust_cfg *cfg)
-{
- FMR_ASSERT(cfg);
-
- cfg->rx_cfg.long_ana_rssi_th = FM_RX_RSSI_TH_LONG_MT6620;
- cfg->rx_cfg.short_ana_rssi_th = FM_RX_RSSI_TH_SHORT_MT6620;
- cfg->rx_cfg.desene_rssi_th = FM_RX_DESENSE_RSSI_MT6620;
- cfg->rx_cfg.pamd_th = FM_RX_PAMD_TH_MT6620;
- cfg->rx_cfg.mr_th = FM_RX_MR_TH_MT6620;
- cfg->rx_cfg.atdc_th = FM_RX_ATDC_TH_MT6620;
- cfg->rx_cfg.prx_th = FM_RX_PRX_TH_MT6620;
- cfg->rx_cfg.smg_th = FM_RX_SMG_TH_MT6620;
- cfg->rx_cfg.deemphasis = FM_RX_DEEMPHASIS_MT6620;
- cfg->rx_cfg.osc_freq = FM_RX_OSC_FREQ_MT6620;
-
- cfg->tx_cfg.scan_hole_low = FM_TX_SCAN_HOLE_LOW_MT6620;
- cfg->tx_cfg.scan_hole_high = FM_TX_SCAN_HOLE_HIGH_MT6620;
- cfg->tx_cfg.power_level = FM_TX_PWR_LEVEL_MAX_MT6620;
-
-#if (defined CONFIG_MTK_MERGE_INTERFACE_SUPPORT) || (defined FM_DIGITAL_INPUT)
- cfg->aud_cfg.aud_path = FM_AUD_I2S;
- cfg->aud_cfg.i2s_info.status = FM_I2S_OFF;
- cfg->aud_cfg.i2s_info.mode = FM_I2S_SLAVE;
- cfg->aud_cfg.i2s_info.rate = FM_I2S_44K;
- cfg->aud_cfg.i2s_pad = FM_I2S_PAD_IO;
-#elif defined FM_ANALOG_INPUT
- cfg->aud_cfg.aud_path = FM_AUD_ANALOG;
- cfg->aud_cfg.i2s_info.status = FM_I2S_STATE_ERR;
- cfg->aud_cfg.i2s_info.mode = FM_I2S_MODE_ERR;
- cfg->aud_cfg.i2s_info.rate = FM_I2S_SR_ERR;
- cfg->aud_cfg.i2s_pad = FM_I2S_PAD_ERR;
-#else
- cfg->aud_cfg.aud_path = FM_AUD_ERR;
- cfg->aud_cfg.i2s_info.status = FM_I2S_STATE_ERR;
- cfg->aud_cfg.i2s_info.mode = FM_I2S_MODE_ERR;
- cfg->aud_cfg.i2s_info.rate = FM_I2S_SR_ERR;
- cfg->aud_cfg.i2s_pad = FM_I2S_PAD_ERR;
-#endif
- return 0;
-}
-
-static fm_s32 MT6620fm_cust_config_file(const fm_s8 *filename, fm_cust_cfg *cfg)
-{
- fm_s32 ret = 0;
- fm_s8 *buf = NULL;
- fm_s32 file_len = 0;
-
- if (!(buf = fm_zalloc(4096))) {
- WCN_DBG(FM_ALT | MAIN, "-ENOMEM\n");
- return -ENOMEM;
- }
-/* fm_index = 0; */
-
- file_len = fm_file_read(filename, buf, 4096, 0);
-
- if (file_len <= 0) {
- ret = -1;
- goto out;
- }
-
- ret = cfg_parser(buf, MT6620cfg_item_handler, cfg);
-
- out:
-
- if (buf) {
- fm_free(buf);
- }
-
- return ret;
-}
-
-#define MT6620_FM_CUST_CFG_PATH "etc/fmr/mt6620_fm_cust.cfg"
-fm_s32 MT6620fm_cust_config_setup(const fm_s8 *filepath)
-{
- fm_s32 ret = 0;
- fm_s8 *filep = NULL;
- fm_s8 file_path[51] = { 0 };
-
- MT6620fm_cust_config_default(&mt6620_fm_config);
- WCN_DBG(FM_NTC | MAIN, "MT6620 FM default config\n");
- MT6620fm_cust_config_print(&mt6620_fm_config);
-
- if (!filepath) {
- filep = MT6620_FM_CUST_CFG_PATH;
- } else {
- memcpy(file_path, filepath, (strlen(filepath) > 50) ? 50 : strlen(filepath));
- filep = file_path;
- trim_path(&filep);
- }
-
- ret = MT6620fm_cust_config_file(filep, &mt6620_fm_config);
- WCN_DBG(FM_NTC | MAIN, "MT6620 FM cust config\n");
- MT6620fm_cust_config_print(&mt6620_fm_config);
-
- return ret;
-}
-
-fm_u16 MT6620fm_cust_config_fetch(enum fm_cust_cfg_op op_code)
-{
-#if 0
- fm_u16 tmp = 0;
- fm_s32 i;
- static fm_s32 fake_ch_idx;
-
- switch (op_code) {
- /* For FM RX */
- case FM_CFG_RX_RSSI_TH_LONG:{
- tmp = mt6620_fm_config.rx_cfg.long_ana_rssi_th;
- break;
- }
- case FM_CFG_RX_RSSI_TH_SHORT:{
- tmp = mt6620_fm_config.rx_cfg.short_ana_rssi_th;
- break;
- }
- case FM_CFG_RX_CQI_TH:{
- tmp = mt6620_fm_config.rx_cfg.cqi_th;
- break;
- }
- case FM_CFG_RX_MR_TH:{
- tmp = mt6620_fm_config.rx_cfg.mr_th;
- break;
- }
- case FM_CFG_RX_SMG_TH:{
- tmp = mt6620_fm_config.rx_cfg.smg_th;
- break;
- }
- case FM_CFG_RX_SCAN_CH_SIZE:{
- tmp = mt6620_fm_config.rx_cfg.scan_ch_size;
- break;
- }
- case FM_CFG_RX_SEEK_SPACE:{
- tmp = mt6620_fm_config.rx_cfg.seek_space;
- break;
- }
- case FM_CFG_RX_BAND:{
- tmp = mt6620_fm_config.rx_cfg.band;
- break;
- }
- case FM_CFG_RX_BAND_FREQ_L:{
- tmp = mt6620_fm_config.rx_cfg.band_freq_l;
- break;
- }
- case FM_CFG_RX_BAND_FREQ_H:{
- tmp = mt6620_fm_config.rx_cfg.band_freq_h;
- break;
- }
- case FM_CFG_RX_SCAN_SORT:{
- tmp = mt6620_fm_config.rx_cfg.scan_sort;
- break;
- }
- case FM_CFG_RX_FAKE_CH_NUM:{
- tmp = mt6620_fm_config.rx_cfg.fake_ch_num;
- break;
- }
- case FM_CFG_RX_FAKE_CH:{
- tmp = mt6620_fm_config.rx_cfg.fake_ch[fake_ch_idx];
- i = (mt6620_fm_config.rx_cfg.fake_ch_num >
- 0) ? mt6620_fm_config.rx_cfg.fake_ch_num : FAKE_CH_MAX;
- fake_ch_idx++;
- fake_ch_idx = fake_ch_idx % i;
- break;
- }
- case FM_CFG_RX_FAKE_CH_RSSI:{
- tmp = mt6620_fm_config.rx_cfg.fake_ch_rssi_th;
- break;
- }
- case FM_CFG_RX_DEEMPHASIS:{
- tmp = mt6620_fm_config.rx_cfg.deemphasis;
- break;
- }
- case FM_CFG_RX_OSC_FREQ:{
- tmp = mt6620_fm_config.rx_cfg.osc_freq;
- break;
- }
- /* For FM TX */
- case FM_CFG_TX_SCAN_HOLE_LOW:{
- tmp = mt6620_fm_config.tx_cfg.scan_hole_low;
- break;
- }
- case FM_CFG_TX_SCAN_HOLE_HIGH:{
- tmp = mt6620_fm_config.tx_cfg.scan_hole_high;
- break;
- }
- case FM_CFG_TX_PWR_LEVEL:{
- tmp = mt6620_fm_config.tx_cfg.power_level;
- break;
- }
- default:
- break;
- }
-
- WCN_DBG(FM_DBG | MAIN, "mt6620_cust cfg %d: 0x%04x\n", op_code, tmp);
- return tmp;
-#endif
- return 0;
-}
diff --git a/drivers/misc/mediatek/fmradio/mt6620/pub/mt6620_fm_lib.c b/drivers/misc/mediatek/fmradio/mt6620/pub/mt6620_fm_lib.c
deleted file mode 100644
index 6289a4c8c..000000000
--- a/drivers/misc/mediatek/fmradio/mt6620/pub/mt6620_fm_lib.c
+++ /dev/null
@@ -1,2256 +0,0 @@
-#include <linux/semaphore.h>
-#include <linux/delay.h>
-#include <linux/slab.h>
-
-#include "stp_exp.h"
-#include "wmt_exp.h"
-
-#include "fm_typedef.h"
-#include "fm_dbg.h"
-#include "fm_err.h"
-#include "fm_interface.h"
-#include "fm_stdlib.h"
-#include "fm_utils.h"
-#include "fm_patch.h"
-#include "fm_link.h"
-#include "fm_config.h"
-#include "fm_private.h"
-
-#include "mt6620_fm_reg.h"
-#include "mt6620_fm.h"
-/* #include "mt6620_drv_dsp.h" */
-/* #include "mt6620_fm_link.h" */
-#include "mt6620_fm_lib.h"
-#include "mt6620_fm_cmd.h"
-#include "mt6620_fm_cust_cfg.h"
-#ifdef CONFIG_MTK_FM_50KHZ_SUPPORT
-static struct fm_fifo *cqi_fifo;
-#endif
-extern fm_cust_cfg mt6620_fm_config;
-static struct fm_hw_info mt6620_hw_info = {
- .chip_id = 0x00006620,
- .eco_ver = 0x00000000,
- .rom_ver = 0x00000002,
- .patch_ver = 0x00000111,
- .reserve = 0x00000000,
-};
-
-fm_s32 MT6620_HL_Side_Adj(fm_u16 freq, fm_s32 *hl);
-fm_s32 MT6620_ADPLL_Freq_Avoid(fm_u16 freq, fm_s32 *freqavoid);
-fm_s32 MT6620_MCU_Freq_Avoid(fm_u16 freq, fm_s32 *freqavoid);
-fm_s32 MT6620_ADPLL_Power_OnOff(fm_s32 onoff, fm_s32 ADPLL_clk);
-fm_s32 MT6620_TX_PWR_CTRL(fm_u16 freq, fm_s32 *ctr);
-fm_s32 MT6620_RTC_Drift_CTRL(fm_u16 freq, fm_s32 *ctr);
-fm_s32 MT6620_TX_DESENSE(fm_u16 freq, fm_s32 *ctr);
-
-static fm_s32 mt6620_I2s_Setting(fm_s32 onoff, fm_s32 mode, fm_s32 sample);
-static fm_s32 mt6620_desense_check(fm_u16 freq, fm_s32 rssi);
-static fm_s32 MT6620_Rds_Tx(fm_u16 pi, fm_u16 *ps, fm_u16 *other_rds, fm_u8 other_rds_cnt);
-static fm_s32 MT6620_Rds_Tx_Enable(void);
-static fm_s32 MT6620_Rds_Tx_Disable(void);
-
-static fm_u8 *cmd_buf;
-static struct fm_lock *cmd_buf_lock;
-static struct fm_callback *fm_cb_op;
-/* static struct MT6620fm_priv priv_adv_6620; */
-static ENUM_WMTHWVER_TYPE_T hw_ver = WMTHWVER_E3;
-static fm_s32 mt6620_pwron(fm_s32 data)
-{
- if (MTK_WCN_BOOL_FALSE == mtk_wcn_wmt_func_on(WMTDRV_TYPE_FM)) {
- WCN_DBG(FM_ALT | CHIP, "WMT turn on FM Fail!\n");
- return -FM_ELINK;
- } else {
- /* GeorgeKuo: turn on function before check stp ready */
- if (fm_false == mtk_wcn_stp_is_ready()) {
- WCN_DBG(FM_ALT | MAIN, "6620 stp is not ready, please retry later\n");
- return -FM_ELINK;
- }
- hw_ver = mtk_wcn_wmt_hwver_get();
- WCN_DBG(FM_ALT | CHIP, "WMT turn on FM OK!\n");
- return 0;
- }
-}
-
-
-static fm_s32 mt6620_pwroff(fm_s32 data)
-{
- if (MTK_WCN_BOOL_FALSE == mtk_wcn_wmt_func_off(WMTDRV_TYPE_FM)) {
- WCN_DBG(FM_ALT | CHIP, "WMT turn off FM Fail!\n");
- return -FM_ELINK;
- } else {
- WCN_DBG(FM_NTC | CHIP, "WMT turn off FM OK!\n");
- return 0;
- }
-}
-
-static fm_s32 Delayms(fm_u32 data)
-{
- WCN_DBG(FM_DBG | CHIP, "delay %dms\n", data);
- msleep(data);
- return 0;
-}
-
-static fm_s32 Delayus(fm_u32 data)
-{
- WCN_DBG(FM_DBG | CHIP, "delay %dus\n", data);
- udelay(data);
- return 0;
-}
-
-static struct fm_res_ctx *res;
-
-fm_s32 mt6620_get_read_result(struct fm_res_ctx *result)
-{
- FMR_ASSERT(result);
- res = result;
-
- return 0;
-}
-
-static fm_s32 mt6620_read(fm_u8 addr, fm_u16 *val)
-{
- fm_s32 ret = 0;
- fm_u16 pkt_size;
-
- if (FM_LOCK(cmd_buf_lock))
- return (-FM_ELOCK);
- pkt_size = mt6620_get_reg(cmd_buf, TX_BUF_SIZE, addr);
- ret =
- fm_cmd_tx(cmd_buf, pkt_size, FLAG_FSPI_RD, SW_RETRY_CNT, FSPI_RD_TIMEOUT,
- mt6620_get_read_result);
-
- if (!ret && res) {
- *val = res->fspi_rd;
- }
-
- FM_UNLOCK(cmd_buf_lock);
-
- return ret;
-}
-
-static fm_s32 mt6620_write(fm_u8 addr, fm_u16 val)
-{
- fm_s32 ret = 0;
- fm_u16 pkt_size;
-
- if (FM_LOCK(cmd_buf_lock))
- return (-FM_ELOCK);
- pkt_size = mt6620_set_reg(cmd_buf, TX_BUF_SIZE, addr, val);
- ret = fm_cmd_tx(cmd_buf, pkt_size, FLAG_FSPI_WR, SW_RETRY_CNT, FSPI_WR_TIMEOUT, NULL);
- FM_UNLOCK(cmd_buf_lock);
-
- return ret;
-}
-
-static fm_s32 mt6620_set_bits(fm_u8 addr, fm_u16 bits, fm_u16 mask)
-{
- fm_s32 ret = 0;
- fm_u16 val;
-
- ret = mt6620_read(addr, &val);
-
- if (ret)
- return ret;
-
- val = ((val & (mask)) | bits);
- ret = mt6620_write(addr, val);
-
- return ret;
-}
-
-static fm_u16 mt6620_get_chipid(void)
-{
- return 0x6620;
-}
-
-/* mt6620_SetAntennaType - set Antenna type
- * @type - 1,Short Antenna; 0, Long Antenna
- */
-static fm_s32 mt6620_SetAntennaType(fm_s32 type)
-{
- WCN_DBG(FM_DBG | CHIP, "set ana to %s\n", type ? "short" : "long");
-
- if (type == FM_ANA_LONG) {
- /* Long Antenna RSSI threshold, 0xE0 D0~D9 */
- /* mt6620_write(0xE0, ((0xA301 & 0xFC00) | (FMR_RSSI_TH_LONG_MT6620 & 0x03FF))); */
- /* Turn on Short Antenna LNA and Off TR Switch */
- mt6620_write(0x04, 0x0142);
- /* Turn off the Short Antenna Capbank biasing */
- mt6620_write(0x05, 0x00E7);
- /* Turn off the Short Antenna Capbank biasing */
- mt6620_write(0x26, 0x0004);
- /* Disable concurrent calibration for VCO and SCAL */
- mt6620_write(0x2E, 0x0008);
- } else if (type == FM_ANA_SHORT) {
- /* Short Antenna RSSI threshold, 0xE0 D0~D9 */
- /* mt6620_write(0xE0, ((0xA2E0 & 0xFC00) | (FMR_RSSI_TH_SHORT_MT6620 & 0x03FF))); */
- /* Turn on Short Antenna LNA and TR Switch */
- mt6620_write(0x04, 0x0145);
- /* Turn on the Short Antenna Capbank biasing */
- mt6620_write(0x05, 0x00FF);
- /* Turn on the Short Antenna Capbank biasing */
- mt6620_write(0x26, 0x0024);
- /* Enable concurrent calibration for VCO and SCAL */
- mt6620_write(0x2E, 0x0000);
- } else {
- WCN_DBG(FM_ERR | CHIP, "%s()\n", __func__);
- return -FM_EPARA;
- }
-
- return 0;
-}
-
-static fm_s32 mt6620_GetAntennaType(void)
-{
- fm_u16 dataRead;
-
- mt6620_read(0x2E, &dataRead);
-
- if (dataRead == 0x0000)
- return FM_ANA_SHORT; /* short antenna */
- else
- return FM_ANA_LONG; /* long antenna */
-}
-
-static fm_s32 mt6620_Mute(fm_bool mute)
-{
- WCN_DBG(FM_DBG | CHIP, "set %s\n", mute ? "mute" : "unmute");
-
- if (mute) {
- return mt6620_set_bits(0x9C, 0x0008, 0xFFF7); /* 1:9C D3 = 1 */
- } else {
- return mt6620_set_bits(0x9c, 0x0000, 0xFFF7); /* 1:9C D3 = 0 */
- }
-}
-
-static fm_s32 mt6620_RampDown(void)
-{
- fm_s32 ret = 0;
- fm_u16 pkt_size;
-
- WCN_DBG(FM_NTC | CHIP, "ramp down\n");
-
- if (FM_LOCK(cmd_buf_lock))
- return (-FM_ELOCK);
- pkt_size = mt6620_rampdown(cmd_buf, TX_BUF_SIZE);
- ret = fm_cmd_tx(cmd_buf, pkt_size, FLAG_RAMPDOWN, SW_RETRY_CNT, RAMPDOWN_TIMEOUT, NULL);
- FM_UNLOCK(cmd_buf_lock);
-
- if (ret) {
- WCN_DBG(FM_ERR | CHIP, "ramp down failed\n");
- }
-
- return ret;
-}
-
-#if 0 /* ramp down tx will do in tx tune flow */
-static fm_s32 MT6620_RampDown_Tx(void)
-{
- fm_s32 ret = 0;
- fm_u16 pkt_size = 0;
-
- WCN_DBG(FM_NTC | CHIP, "ramp down TX\n");
- if (FM_LOCK(cmd_buf_lock))
- return (-FM_ELOCK);
-
- pkt_size = mt6620_rampdown_tx(cmd_buf, TX_BUF_SIZE);
- ret = fm_cmd_tx(cmd_buf, pkt_size, FLAG_RAMPDOWN, SW_RETRY_CNT, RAMPDOWN_TIMEOUT, NULL);
-
- FM_UNLOCK(cmd_buf_lock);
- if (ret) {
- WCN_DBG(FM_ERR | CHIP, "ramp down TX failed\n");
- }
- return ret;
-}
-#endif
-static fm_s32 mt6620_PowerUp(fm_u16 *chip_id, fm_u16 *device_id)
-{
- fm_s32 ret = 0;
- fm_u16 pkt_size;
-
- FMR_ASSERT(chip_id);
- FMR_ASSERT(device_id);
-
- WCN_DBG(FM_DBG | CHIP, "pwr on seq......\n");
-
- /* Wholechip FM Power Up: step 1, mt6620_off_2_longANA */
- if (FM_LOCK(cmd_buf_lock))
- return (-FM_ELOCK);
- pkt_size = mt6620_off_2_longANA_1(cmd_buf, TX_BUF_SIZE);
- ret = fm_cmd_tx(cmd_buf, pkt_size, FLAG_EN, SW_RETRY_CNT, EN_TIMEOUT, NULL);
- FM_UNLOCK(cmd_buf_lock);
-
- if (ret) {
- WCN_DBG(FM_ALT | CHIP, "mt6620_off_2_longANA_1 failed\n");
- return ret;
- }
-
- Delayms(100);
-
- if (FM_LOCK(cmd_buf_lock))
- return (-FM_ELOCK);
- pkt_size = mt6620_off_2_longANA_2(cmd_buf, TX_BUF_SIZE);
- ret = fm_cmd_tx(cmd_buf, pkt_size, FLAG_EN, SW_RETRY_CNT, EN_TIMEOUT, NULL);
- FM_UNLOCK(cmd_buf_lock);
-
- if (ret) {
- WCN_DBG(FM_ALT | CHIP, "mt6620_off_2_longANA_2 failed\n");
- return ret;
- }
-
- Delayms(50);
-
- /* *chip_id = 0x6620; */
- /* *device_id = 0x6620; */
- /* WCN_DBG(FM_NTC | CHIP, "chip_id:0x%04x\n", 0x6620); */
-
- /* Wholechip FM Power Up: step 2, FM Digital Init: fm_rgf_maincon */
- if (FM_LOCK(cmd_buf_lock))
- return (-FM_ELOCK);
- pkt_size = mt6620_pwrup_digital_init_1(cmd_buf, TX_BUF_SIZE);
- ret = fm_cmd_tx(cmd_buf, pkt_size, FLAG_EN, SW_RETRY_CNT, EN_TIMEOUT, NULL);
- FM_UNLOCK(cmd_buf_lock);
-
- if (ret) {
- WCN_DBG(FM_ALT | CHIP, "mt6620_pwrup_digital_init_2 failed\n");
- return ret;
- }
-
- Delayms(10);
-
- if (FM_LOCK(cmd_buf_lock))
- return (-FM_ELOCK);
- pkt_size = mt6620_pwrup_digital_init_2(cmd_buf, TX_BUF_SIZE);
- ret = fm_cmd_tx(cmd_buf, pkt_size, FLAG_EN, SW_RETRY_CNT, EN_TIMEOUT, NULL);
- FM_UNLOCK(cmd_buf_lock);
-
- if (ret) {
- WCN_DBG(FM_ALT | CHIP, "mt6620_pwrup_digital_init_2 failed\n");
- return ret;
- }
-
- Delayms(10);
-
- if (FM_LOCK(cmd_buf_lock))
- return (-FM_ELOCK);
- pkt_size = mt6620_pwrup_digital_init_3(cmd_buf, TX_BUF_SIZE);
- ret = fm_cmd_tx(cmd_buf, pkt_size, FLAG_EN, SW_RETRY_CNT, EN_TIMEOUT, NULL);
- FM_UNLOCK(cmd_buf_lock);
-
- if (ret) {
- WCN_DBG(FM_ALT | CHIP, "mt6620_pwrup_digital_init_3 failed\n");
- return ret;
- }
- if ((mt6620_fm_config.aud_cfg.aud_path == FM_AUD_MRGIF)
- || (mt6620_fm_config.aud_cfg.aud_path == FM_AUD_I2S)) {
- mt6620_I2s_Setting(FM_I2S_ON, mt6620_fm_config.aud_cfg.i2s_info.mode,
- mt6620_fm_config.aud_cfg.i2s_info.rate);
- /* mt_combo_audio_ctrl(COMBO_AUDIO_STATE_2); */
- mtk_wcn_cmb_stub_audio_ctrl((CMB_STUB_AIF_X) CMB_STUB_AIF_2);
- WCN_DBG(FM_NTC | CHIP, "pwron set I2S on ok\n");
- }
-
- mt6620_hw_info.eco_ver = (fm_s32) mtk_wcn_wmt_hwver_get();
- WCN_DBG(FM_DBG | CHIP, "pwr on seq ok\n");
- return ret;
-}
-
-static fm_s32 mt6620_PowerUpTx(void)
-{
- fm_s32 ret = 0;
- fm_u16 pkt_size;
- fm_u16 dataRead;
-
- WCN_DBG(FM_DBG | CHIP, "pwr on Tx seq......\n");
-
- if (FM_LOCK(cmd_buf_lock))
- return (-FM_ELOCK);
- pkt_size = mt6620_off_2_tx_shortANA(cmd_buf, TX_BUF_SIZE);
- ret = fm_cmd_tx(cmd_buf, pkt_size, FLAG_EN, SW_RETRY_CNT, EN_TIMEOUT, NULL);
- FM_UNLOCK(cmd_buf_lock);
-
- if (ret) {
- WCN_DBG(FM_ALT | CHIP, "mt6620_off_2_tx_shortANA failed\n");
- return ret;
- }
-
-
- mt6620_read(0x62, &dataRead);
- WCN_DBG(FM_NTC | CHIP, "Tx on chipid=%x\n", dataRead);
-
- if (FM_LOCK(cmd_buf_lock))
- return (-FM_ELOCK);
- pkt_size = mt6620_dig_init(cmd_buf, TX_BUF_SIZE);
- ret = fm_cmd_tx(cmd_buf, pkt_size, FLAG_EN, SW_RETRY_CNT, EN_TIMEOUT, NULL);
- FM_UNLOCK(cmd_buf_lock);
-
- if (ret) {
- WCN_DBG(FM_ALT | CHIP, "mt6620_dig_init failed\n");
- return ret;
- }
- /* get temprature */
- if (mtk_wcn_wmt_therm_ctrl(WMTTHERM_ENABLE) != fm_true) {
- WCN_DBG(FM_ERR | MAIN, "wmt_therm_ctrl, WMTTHERM_ENABLE failed\n");
- ret = -FM_ELINK;
- return ret;
- }
-#ifdef FM_DIGITAL_INPUT
- ret = mt6620_I2s_Setting(FM_I2S_ON, FM_I2S_SLAVE, FM_I2S_48K);
- if (ret) {
- WCN_DBG(FM_ERR | CHIP, "pwron tx set I2S on error\n");
- return ret;
- }
- /* we will disable 6620 fm chip analog output when use I2S path, set 0x3A bit2 = 0 */
- /* mt6620_set_bits(0x3A, 0, MASK(2)); */
- WCN_DBG(FM_NTC | CHIP, "pwron set I2S on ok\n");
-#endif
-
- WCN_DBG(FM_DBG | CHIP, "pwr on tx seq ok\n");
- return ret;
-}
-
-static fm_s32 mt6620_PowerDown(void)
-{
- fm_s32 ret = 0;
- fm_u16 pkt_size;
-
- WCN_DBG(FM_DBG | CHIP, "pwr down seq\n");
-
- /* mt6620_RampDown(); */
-
- if (FM_LOCK(cmd_buf_lock))
- return (-FM_ELOCK);
- pkt_size = mt6620_pwrdown(cmd_buf, TX_BUF_SIZE);
- ret = fm_cmd_tx(cmd_buf, pkt_size, FLAG_EN, SW_RETRY_CNT, EN_TIMEOUT, NULL);
- FM_UNLOCK(cmd_buf_lock);
-
- if (ret) {
- WCN_DBG(FM_ALT | CHIP, "mt6620_pwrdown failed\n");
- return ret;
- }
-
- return ret;
-}
-
-static fm_s32 mt6620_PowerDownTx(void)
-{
- fm_s32 ret = 0;
-
- mt6620_PowerDown();
-
- if (mtk_wcn_wmt_therm_ctrl(WMTTHERM_DISABLE) != fm_true) {
- WCN_DBG(FM_ERR | MAIN, "wmt_therm_ctrl, WMTTHERM_DISABLE failed\n");
- ret = -FM_ELINK;
- }
-
- return ret;
-}
-
-static fm_bool MT6620_SetFreq_Tx(fm_u16 freq)
-{
- fm_s32 ret = 0;
- fm_u16 pkt_size;
-
- fm_cb_op->cur_freq_set(freq);
- /* start tune */
- if (FM_LOCK(cmd_buf_lock))
- return (-FM_ELOCK);
- pkt_size = mt6620_tune_tx(cmd_buf, TX_BUF_SIZE, freq);
- ret = fm_cmd_tx(cmd_buf, pkt_size, FLAG_TUNE, SW_RETRY_CNT, TUNE_TIMEOUT, NULL);
- FM_UNLOCK(cmd_buf_lock);
-
- if (ret) {
- WCN_DBG(FM_ALT | CHIP, "mt6620_tune_tx failed\n");
- return ret;
- }
-
- Delayms(125);
-
- WCN_DBG(FM_DBG | CHIP, "mt6620_tune_tx to %d ok\n", freq);
-
- return fm_true;
-}
-
-/*
- * fm_print_curCQI -- print cur freq's CQI
- * @cur_freq, current frequency
- * If OK, return 0, else error code
- */
-static fm_s32 mt6620_print_curCQI(fm_u16 cur_freq)
-{
- fm_s32 ret = 0;
- fm_u16 rssi = 0;
- fm_u16 pamd = 0;
- fm_u16 mr = 0;
-
- if ((ret = mt6620_write(FM_MAIN_PGSEL, FM_PG0)))
- return ret;
- if ((ret = mt6620_read(FM_RSSI_IND, &rssi)))
- return ret;
- if ((ret = mt6620_read(FM_ADDR_PAMD, &pamd)))
- return ret;
- if ((ret = mt6620_read(FM_MR_IND, &mr)))
- return ret;
-
- WCN_DBG(FM_NTC | CHIP, "FREQ=%d, RSSI=0x%04x, PAMD=0x%04x, MR=0x%04x\n", (fm_s32) cur_freq,
- rssi, pamd, mr);
- return ret;
-}
-
-static fm_bool mt6620_SetFreq(fm_u16 freq)
-{
- fm_s32 ret = 0;
- fm_s32 hl_side = -1;
- fm_s32 freq_avoid = -1;
- fm_u16 pkt_size;
-
- fm_cb_op->cur_freq_set(freq);
-
- if ((ret = MT6620_HL_Side_Adj(freq, &hl_side)))
- return ret;
- WCN_DBG(FM_NTC | CHIP, "%s, [hl_side=%d]\n", __func__, hl_side);
-
- if ((ret = MT6620_ADPLL_Freq_Avoid(freq, &freq_avoid)))
- return ret;
- WCN_DBG(FM_NTC | CHIP, "%s, adpll [freq_avoid=%d]\n", __func__, freq_avoid);
-
-/* hw_ver = mtk_wcn_wmt_hwver_get(); */
- if (hw_ver >= WMTHWVER_E3) {
- if ((ret = MT6620_MCU_Freq_Avoid(freq, &freq_avoid)))
- return ret;
- WCN_DBG(FM_NTC | CHIP, "%s, mcu [freq_avoid=%d]\n", __func__, freq_avoid);
- } else {
- WCN_DBG(FM_NTC | CHIP, "%s, no need do mcu freq avoid[hw_ver=%d]\n", __func__,
- hw_ver);
- }
-
- /* start tune */
- if (FM_LOCK(cmd_buf_lock))
- return (-FM_ELOCK);
- pkt_size = mt6620_tune_1(cmd_buf, TX_BUF_SIZE, freq);
- ret = fm_cmd_tx(cmd_buf, pkt_size, FLAG_TUNE, SW_RETRY_CNT, TUNE_TIMEOUT, NULL);
- FM_UNLOCK(cmd_buf_lock);
-
- if (ret) {
- WCN_DBG(FM_ALT | CHIP, "mt6620_tune_1 failed\n");
- return ret;
- }
-
- Delayms(200);
-
- if (FM_LOCK(cmd_buf_lock))
- return (-FM_ELOCK);
- pkt_size = mt6620_tune_2(cmd_buf, TX_BUF_SIZE, freq);
- ret = fm_cmd_tx(cmd_buf, pkt_size, FLAG_TUNE, SW_RETRY_CNT, TUNE_TIMEOUT, NULL);
- FM_UNLOCK(cmd_buf_lock);
-
- if (ret) {
- WCN_DBG(FM_ALT | CHIP, "mt6620_tune_2 failed\n");
- return ret;
- }
-
- Delayms(35);
-
- if (FM_LOCK(cmd_buf_lock))
- return (-FM_ELOCK);
- pkt_size = mt6620_tune_3(cmd_buf, TX_BUF_SIZE, freq);
- ret = fm_cmd_tx(cmd_buf, pkt_size, FLAG_TUNE, SW_RETRY_CNT, TUNE_TIMEOUT, NULL);
- FM_UNLOCK(cmd_buf_lock);
-
- if (ret) {
- WCN_DBG(FM_ALT | CHIP, "mt6620_tune_3 failed\n");
- return ret;
- }
-
- ret = mt6620_print_curCQI(freq);
- WCN_DBG(FM_DBG | CHIP, "set freq to %d ok\n", freq);
-
- return fm_true;
-}
-
-
-static fm_s32 mt6620_TxScan_SetFreq(fm_u16 freq)
-{
- fm_s32 ret = 0;
- fm_u16 pkt_size = 0;
-
- WCN_DBG(FM_NTC | CHIP, "+%s():[freq=%d]\n", __func__, freq);
- if (FM_LOCK(cmd_buf_lock))
- return (-FM_ELOCK);
-
- pkt_size = mt6620_tune_txscan(cmd_buf, TX_BUF_SIZE, freq);
- ret = fm_cmd_tx(cmd_buf, pkt_size, FLAG_TUNE, SW_RETRY_CNT, TUNE_TIMEOUT, NULL);
- FM_UNLOCK(cmd_buf_lock);
-
- FM_UNLOCK(cmd_buf_lock);
- WCN_DBG(FM_NTC | CHIP, "-%s():[ret=%d]\n", __func__, ret);
- return ret;
-}
-
-static fm_s32 mt6620_TxScan_GetCQI(fm_s16 *pRSSI, fm_s16 *pPAMD, fm_s16 *pMR)
-{
- fm_s32 cnt = 0;
- fm_s32 ret = 0;
- fm_s16 tmp_reg = 0;
- fm_s16 aRSSI = 0;
- fm_s16 aPAMD = 0;
- fm_s16 aMR = 0;
-
- WCN_DBG(FM_NTC | CHIP, "+%s():\n", __func__);
-
- if ((pRSSI == NULL) || (pPAMD == NULL) || (pMR == NULL)) {
- WCN_DBG(FM_ERR | CHIP, "%s():para error, [pRSSI=%p],[aPAMD=%p],[pMR=%p]\n",
- __func__, pRSSI, pPAMD, pMR);
- ret = -FM_EPARA;
- goto out;
- }
-
- for (cnt = 0; cnt < 8; cnt++) {
- Delayms(3);
- if ((ret = mt6620_read(FM_RSSI_IND, &tmp_reg)))
- goto out;
- tmp_reg = tmp_reg & 0x03ff;
- tmp_reg = (tmp_reg > 511) ? ((fm_s16) (tmp_reg - 1024)) : tmp_reg;
- aRSSI += tmp_reg;
-
- if ((ret = mt6620_read(FM_ADDR_PAMD, &tmp_reg)))
- goto out;
- tmp_reg = tmp_reg & 0x00ff;
- tmp_reg = (tmp_reg > 127) ? ((fm_s16) (tmp_reg - 256)) : tmp_reg;
- aPAMD += tmp_reg;
-
- if ((ret = mt6620_read(FM_MR_IND, &tmp_reg)))
- goto out;
- tmp_reg = tmp_reg & 0x01ff;
- tmp_reg = (tmp_reg > 255) ? ((fm_s16) (tmp_reg - 512)) : tmp_reg;
- aMR += tmp_reg;
- }
-
- *pRSSI = aRSSI >> 3;
- *pPAMD = aPAMD >> 3;
- *pMR = aMR >> 3;
-
- WCN_DBG(FM_NTC | CHIP, "%s():[RSSI=%d],[PAMD=%d],[MR=%d]\n",
- __func__, *pRSSI, *pPAMD, *pMR);
-
- out:
- WCN_DBG(FM_NTC | CHIP, "-%s():[ret=%d]\n", __func__, ret);
- return ret;
-}
-
-static fm_s32 mt6620_TxScan_IsEmptyChannel(fm_s16 RSSI, fm_s16 PAMD, fm_s16 MR, fm_s32 *empty)
-{
- fm_s32 ret = 0;
-
- WCN_DBG(FM_NTC | CHIP, "+%s():[RSSI=%d],[PAMD=%d],[MR=%d]\n", __func__, RSSI, PAMD, MR);
-
- if (empty == NULL) {
- WCN_DBG(FM_NTC | CHIP, "invalid pointer [empty=0x%x]!\n", (fm_u32) empty);
- ret = -FM_EPARA;
- goto out;
- }
-
- *empty = fm_true;
- if (RSSI > FM_TXSCAN_RSSI_TH) {
- *empty = fm_false;
- goto out;
- }
-
- if (PAMD < FM_TXSCAN_PAMD_TH) {
- *empty = fm_false;
- goto out;
- }
-
- if (MR < FM_TXSCAN_MR_TH) {
- *empty = fm_false;
- goto out;
- }
-
- out:
- WCN_DBG(FM_NTC | CHIP, "-%s():[ret=%d]\n", __func__, ret);
- return ret;
-}
-
-static fm_s32 mt6620_TxScan(fm_u16 min_freq,
- fm_u16 max_freq,
- fm_u16 *pFreq,
- fm_u16 *pScanTBL, fm_u16 *ScanTBLsize, fm_u16 scandir, fm_u16 space)
-{
- fm_s32 ret = 0;
- fm_u16 freq = *pFreq;
- fm_u16 scan_cnt = *ScanTBLsize;
- fm_u16 cnt = 0;
- fm_s16 rssi = 0;
- fm_s16 pamd = 0;
- fm_s16 mr = 0;
- fm_s32 counter = 0;
- fm_s32 empty = -1;
- fm_s32 step;
-
- WCN_DBG(FM_NTC | CHIP, "+%s():\n", __func__);
-
- if ((!pScanTBL) || (*ScanTBLsize < FM_TX_SCAN_MIN) || (*ScanTBLsize > FM_TX_SCAN_MAX)) {
- WCN_DBG(FM_ERR | CHIP, "+%s():invalid scan table\n", __func__);
- ret = -FM_EPARA;
- goto out;
- }
-
- WCN_DBG(FM_NTC | CHIP,
- "[freq=%d], [max_freq=%d],[min_freq=%d],[scan BTL size=%d],[scandir=%d],[space=%d]\n",
- *pFreq, max_freq, min_freq, *ScanTBLsize, scandir, space);
-
- cnt = 0;
- /* if (space == MT6620_FM_SPACE_100K) {
- step = 1;
- } else if (space == MT6620_FM_SPACE_50K) {
- step = 5;
- } else if (space == MT6620_FM_SPACE_200K) {
- step = 2;
- } else {
- //default
- step = 1;
- } */
- step = space;
- while (!(!(cnt < scan_cnt) || (freq > max_freq) || (freq < min_freq))) {
- /* MT6620_RampDown(); */
- /* Set desired channel, tune to the channel, and perform fast AGC */
- counter++; /* just for debug */
-
- ret = mt6620_TxScan_SetFreq(freq);
- if (ret) {
- WCN_DBG(FM_ERR | CHIP, "%s():set freq failed\n", __func__);
- goto out;
- }
- /* wait 8~10ms for RF setting */
- Delayms(10);
- /* wait 4 AAGC period for AAGC setting, AAGC period = 1024/480k = 2.13ms */
- Delayms(9);
-
- ret = mt6620_TxScan_GetCQI(&rssi, &pamd, &mr);
- if (ret) {
- WCN_DBG(FM_ERR | CHIP, "%s():get CQI failed\n", __func__);
- goto out;
- }
-
- ret = mt6620_TxScan_IsEmptyChannel(rssi, pamd, mr, &empty);
- if (!ret) {
- if ((empty == fm_true)
- && ((freq < FM_TX_SCAN_HOLE_LOW) || (freq > FM_TX_SCAN_HOLE_HIGH))) {
- *(pScanTBL + cnt) = freq; /* strore the valid empty channel */
- cnt++;
- WCN_DBG(FM_NTC | CHIP, "empty channel:[freq=%d] [cnt=%d]\n", freq,
- cnt);
- }
- } else {
- WCN_DBG(FM_ERR | CHIP, "%s():IsEmptyChannel failed\n", __func__);
- goto out;
- }
-
- if (scandir == FM_TX_SCAN_UP) {
- if (freq == FM_TX_SCAN_HOLE_LOW) {
- freq += (FM_TX_SCAN_HOLE_HIGH - FM_TX_SCAN_HOLE_LOW + step);
- } else {
- freq += step;
- }
- } else if (scandir == FM_TX_SCAN_DOWN) {
- if (freq == FM_TX_SCAN_HOLE_HIGH) {
- freq -= (FM_TX_SCAN_HOLE_HIGH - FM_TX_SCAN_HOLE_LOW + step);
- } else {
- freq -= step;
- }
- } else {
- WCN_DBG(FM_ERR | CHIP, "%s():scandir para error\n", __func__);
- ret = -FM_EPARA;
- goto out;
- }
- }
-
- *ScanTBLsize = cnt;
- *pFreq = *(pScanTBL + cnt);
- WCN_DBG(FM_NTC | CHIP, "completed, [cnt=%d],[freq=%d],[counter=%d]\n", cnt, freq, counter);
-
- out:
- WCN_DBG(FM_NTC | CHIP, "-%s():[ret=%d]\n", __func__, ret);
- return ret;
-}
-
-/*
-* mt6620_Seek
-* @pFreq - IN/OUT parm, IN start freq/OUT seek valid freq
-* @seekdir - 0:up, 1:down
-* @space - 1:50KHz, 2:100KHz, 4:200KHz
-* return fm_true:seek success; fm_false:seek failed
-*/
-static fm_bool mt6620_Seek(fm_u16 min_freq, fm_u16 max_freq, fm_u16 *pFreq, fm_u16 seekdir,
- fm_u16 space)
-{
- fm_s32 ret = 0;
- fm_u16 pkt_size, temp;
-
- mt6620_RampDown();
- mt6620_read(0x9C, &temp);
- mt6620_Mute(fm_true);
-
- if (FM_LOCK(cmd_buf_lock))
- return (-FM_ELOCK);
- pkt_size = mt6620_seek_1(cmd_buf, TX_BUF_SIZE, seekdir, space, max_freq, min_freq);
- ret =
- fm_cmd_tx(cmd_buf, pkt_size, FLAG_SEEK | FLAG_SEEK_DONE, SW_RETRY_CNT, SEEK_TIMEOUT,
- mt6620_get_read_result);
- FM_UNLOCK(cmd_buf_lock);
-
- if (!ret && res) {
- *pFreq = res->seek_result;
- fm_cb_op->cur_freq_set(*pFreq);
- } else {
- WCN_DBG(FM_ALT | CHIP, "mt6620_seek_1 failed\n");
- return ret;
- }
-
- Delayms(35);
-
- if (FM_LOCK(cmd_buf_lock))
- return (-FM_ELOCK);
- pkt_size = mt6620_seek_2(cmd_buf, TX_BUF_SIZE, seekdir, space, max_freq, min_freq);
- ret =
- fm_cmd_tx(cmd_buf, pkt_size, FLAG_SEEK | FLAG_SEEK_DONE, SW_RETRY_CNT, SEEK_TIMEOUT,
- mt6620_get_read_result);
- FM_UNLOCK(cmd_buf_lock);
-
- if (ret) {
- WCN_DBG(FM_ALT | CHIP, "mt6620_seek_2 failed\n");
- return ret;
- }
- /* get the result freq */
- WCN_DBG(FM_NTC | CHIP, "seek, result freq:%d\n", *pFreq);
- if ((temp & 0x0008) == 0) {
- mt6620_Mute(fm_false);
- }
-
- return fm_true;
-}
-
-static fm_bool mt6620_Scan(fm_u16 min_freq, fm_u16 max_freq, fm_u16 *pFreq, fm_u16 *pScanTBL,
- fm_u16 *ScanTBLsize, fm_u16 scandir, fm_u16 space)
-{
- fm_s32 ret = 0;
- fm_u16 pkt_size, temp;
- fm_u16 offset = 0;
- fm_u16 tmp_scanTBLsize = *ScanTBLsize;
-
- if ((!pScanTBL) || (tmp_scanTBLsize == 0)) {
- WCN_DBG(FM_ALT | CHIP, "scan, failed:invalid scan table\n");
- return fm_false;
- }
-
- WCN_DBG(FM_DBG | CHIP,
- "start freq: %d, max_freq:%d, min_freq:%d, scan BTL size:%d, scandir:%d, space:%d\n",
- *pFreq, max_freq, min_freq, *ScanTBLsize, scandir, space);
-
- mt6620_RampDown();
- mt6620_read(0x9C, &temp);
- mt6620_Mute(fm_true);
-
- if (FM_LOCK(cmd_buf_lock))
- return (-FM_ELOCK);
- pkt_size = mt6620_scan_1(cmd_buf, TX_BUF_SIZE, scandir, space, max_freq, min_freq);
- ret =
- fm_cmd_tx(cmd_buf, pkt_size, FLAG_SCAN | FLAG_SCAN_DONE, SW_RETRY_CNT, SCAN_TIMEOUT,
- mt6620_get_read_result);
- FM_UNLOCK(cmd_buf_lock);
-
- if (!ret && res) {
- fm_memcpy(pScanTBL, res->scan_result, sizeof(fm_u16) * FM_SCANTBL_SIZE);
- WCN_DBG(FM_INF | CHIP, "Rx Scan Result:\n");
-
- for (offset = 0; offset < tmp_scanTBLsize; offset++) {
- WCN_DBG(FM_INF | CHIP, "%d: %04x\n", (fm_s32) offset, *(pScanTBL + offset));
- }
-
- *ScanTBLsize = tmp_scanTBLsize;
- } else {
- WCN_DBG(FM_ALT | CHIP, "mt6620_scan_1 failed\n");
- return ret;
- }
-
- Delayms(35);
-
- if (FM_LOCK(cmd_buf_lock))
- return (-FM_ELOCK);
- pkt_size = mt6620_scan_2(cmd_buf, TX_BUF_SIZE, scandir, space, max_freq, min_freq);
- ret =
- fm_cmd_tx(cmd_buf, pkt_size, FLAG_SEEK | FLAG_SEEK_DONE, SW_RETRY_CNT, SEEK_TIMEOUT,
- mt6620_get_read_result);
- FM_UNLOCK(cmd_buf_lock);
-
- if (ret) {
- WCN_DBG(FM_ALT | CHIP, "mt6620_scan_2 failed\n");
- return ret;
- }
-
- if ((temp & 0x0008) == 0) {
- mt6620_Mute(fm_false);
- }
-
- return fm_true;
-}
-
-/*
- * mt6620_GetCurRSSI - get current freq's RSSI value
- * RS=RSSI
- * If RS>511, then RSSI(dBm)= (RS-1024)/16*6
- * else RSSI(dBm)= RS/16*6
- */
-static fm_s32 mt6620_GetCurRSSI(fm_s32 *pRSSI)
-{
- fm_u16 tmp_reg;
-
- mt6620_read(FM_RSSI_IND, &tmp_reg);
- tmp_reg = tmp_reg & 0x03ff;
-
- if (pRSSI) {
- *pRSSI = (tmp_reg > 511) ? (((tmp_reg - 1024) * 6) >> 4) : ((tmp_reg * 6) >> 4);
- WCN_DBG(FM_DBG | CHIP, "rssi:%d, dBm:%d\n", tmp_reg, *pRSSI);
- } else {
- WCN_DBG(FM_ERR | CHIP, "get rssi para error\n");
- return -FM_EPARA;
- }
-
- return 0;
-}
-
-static fm_s32 MT6620_Fast_SetFreq(fm_u16 freq)
-{
- fm_s32 ret = 0;
- fm_u16 pkt_size = 0;
-
- if (FM_LOCK(cmd_buf_lock))
- return (-FM_ELOCK);
- pkt_size = mt6620_fast_tune(cmd_buf, TX_BUF_SIZE, freq);
- ret =
- fm_cmd_tx(cmd_buf, pkt_size, FLAG_TUNE, SW_RETRY_CNT, SEEK_TIMEOUT,
- mt6620_get_read_result);
- FM_UNLOCK(cmd_buf_lock);
-
- if (ret) {
- WCN_DBG(FM_ALT | CHIP, "mt6620_fast_tune failed\n");
- return ret;
- }
- return ret;
-}
-
-/*
- * mt6620_get_RSSI - set freq and return RSSI value
-*
- */
-static fm_s32 mt6620_GetFreqCQI(fm_u16 freq, fm_s32 *pRSSI)
-{
- if (MT6620_Fast_SetFreq(freq)) {
- mt6620_GetCurRSSI(pRSSI);
- }
-
- return 0;
-}
-
-static fm_u8 mt6620_vol_tbl[16] = {
- 0, 1, 2, 3, 4, 5, 7, 9, 11, 14, 17, 21, 25, 30, 36, 43
-};
-
-static fm_s32 mt6620_SetVol(fm_u8 vol)
-{
- fm_s32 ret = 0;
- fm_u8 tmp_vol; /* = vol & 0x3f; */
-
- vol = (vol > 15) ? 15 : vol;
- tmp_vol = mt6620_vol_tbl[vol] & 0x3f;
- if (tmp_vol > MT6620_VOL_MAX)
- tmp_vol = MT6620_VOL_MAX;
-
- ret = mt6620_set_bits(0x9C, (tmp_vol << 8), 0xC0FF);
-
- if (ret) {
- WCN_DBG(FM_ERR | CHIP, "Set vol=%d Failed\n", tmp_vol);
- return ret;
- } else {
- WCN_DBG(FM_DBG | CHIP, "Set vol=%d OK\n", tmp_vol);
- }
-
- return 0;
-}
-
-static fm_s32 mt6620_GetVol(fm_u8 *pVol)
-{
- fm_s32 ret = 0;
- fm_u16 tmp_reg;
-
- FMR_ASSERT(pVol);
-
- ret = mt6620_read(0x9C, &tmp_reg);
-
- if (ret) {
- *pVol = 0;
- WCN_DBG(FM_ERR | CHIP, "Get vol Failed\n");
- return ret;
- } else {
- *pVol = (tmp_reg >> 8) & 0x3f;
- if (*pVol == MT6620_VOL_MAX)
- *pVol = 15;
- else
- *pVol = (*pVol / 3);
- WCN_DBG(FM_DBG | CHIP, "Get vol=%d OK\n", *pVol);
- }
-
- return 0;
-
-}
-
-static fm_s32 mt6620_dump_reg(void)
-{
- fm_s32 i;
- fm_u16 TmpReg;
- for (i = 0; i < 0xff; i++) {
- mt6620_read(i, &TmpReg);
- WCN_DBG(FM_NTC | CHIP, "0x%02x=0x%04x\n", i, TmpReg);
- }
- return 0;
-}
-
-
-static fm_bool mt6620_GetMonoStereo(fm_u16 *pMonoStereo)
-{
- fm_u16 tmp_reg;
-
- mt6620_write(FM_MAIN_PGSEL, 0x0001);
-
- if (pMonoStereo) {
- mt6620_read(0xF8, &tmp_reg);
- *pMonoStereo = (tmp_reg & 0x0400) >> 10;
- } else {
- WCN_DBG(FM_ERR | CHIP, "MonoStero: para err\n");
- return fm_false;
- }
-
- mt6620_write(FM_MAIN_PGSEL, 0x0000);
-
- *pMonoStereo = (*pMonoStereo) ? 0 : 1; /* return true: stereo, false: mono */
-
- WCN_DBG(FM_DBG | CHIP, "MonoStero:0x%04x\n", *pMonoStereo);
- return fm_true;
-}
-
-/*
- * MT6620_SetMonoStereo
- * Force set to stero/mono mode
- * @MonoStereo -- 0, auto; 1, force mono
- * If success, return 0; else error code
- */
-static fm_s32 MT6620_SetMonoStereo(fm_s32 MonoStereo)
-{
- fm_u16 tmp_reg;
- fm_s32 ret = 0;
-
- if ((ret = mt6620_write(FM_MAIN_PGSEL, FM_PG1)))
- goto out;
-
- tmp_reg = MonoStereo ? BITn(1) : 0; /* MonoStereo, 1: force mono; 0:auto */
- if ((ret = mt6620_set_bits(FM_STEROMONO_CTR, tmp_reg, MASK(1)))) /* set E0 D1=0 */
- goto out;
-
- if ((ret = mt6620_write(FM_MAIN_PGSEL, FM_PG0)))
- goto out;
-
- WCN_DBG(FM_DBG | CHIP, "set to %s\n", MonoStereo ? "auto" : "force mono");
-
- out:
- return ret;
-}
-
-static fm_s32 mt6620_GetCapArray(fm_s32 *ca)
-{
- fm_u16 dataRead;
-
- FMR_ASSERT(ca);
-
- mt6620_read(0x26, &dataRead);
- *ca = dataRead;
-
- return 0;
-}
-
-/*
- * mt6620_GetCurPamd - get current freq's PAMD value
- * PA=PAMD
- * If PA>511 then PAMD(dB)= (PA-1024)/16*6,
- * else PAMD(dB)=PA/16*6
- */
-static fm_bool mt6620_GetCurPamd(fm_u16 *pPamdLevl)
-{
- fm_u16 tmp_reg;
- fm_u16 dBvalue = 0, valid_cnt = 0;
- fm_s32 i, total = 0;
-
- for (i = 0; i < 8; i++) {
- if (mt6620_read(FM_ADDR_PAMD, &tmp_reg)) {
- *pPamdLevl = 0;
- return fm_false;
- }
-
- tmp_reg &= 0x00FF;
- dBvalue = (tmp_reg > 127) ? ((256 - tmp_reg) * 6 / 16) : 0;
- if (dBvalue != 0) {
- total += dBvalue;
- valid_cnt++;
- WCN_DBG(FM_DBG | CHIP, "[%d]PAMD=%d\n", i, dBvalue);
- }
- Delayms(3);
- }
- if (valid_cnt != 0) {
- *pPamdLevl = total / valid_cnt;
- } else {
- *pPamdLevl = 0;
- }
- WCN_DBG(FM_DBG | CHIP, "PamdLevl=%d\n", *pPamdLevl);
- return fm_true;
-}
-
-static fm_s32 mt6620_ScanStop(void)
-{
- return fm_force_active_event(FLAG_SCAN);
-}
-
-static fm_s32 mt6620_SeekStop(void)
-{
- return fm_force_active_event(FLAG_SEEK);
-}
-
-/*
- * mt6620_I2s_Setting - set the I2S state on MT6620
- * @onoff - I2S on/off
- * @mode - I2S mode: Master or Slave
- *
- * Return:0, if success; error code, if failed
- */
-static fm_s32 mt6620_I2s_Setting(fm_s32 onoff, fm_s32 mode, fm_s32 sample)
-{
- fm_u16 tmp_state = 0;
- fm_u16 tmp_mode = 0;
- fm_u16 tmp_sample = 0;
- fm_s32 ret = 0;
-
- if (onoff == FM_I2S_ON) {
- tmp_state = 0x01; /* I2S Frequency tracking on */
- mt6620_fm_config.aud_cfg.i2s_info.status = FM_I2S_ON;
- } else if (onoff == FM_I2S_OFF) {
- tmp_state = 0x00; /* I2S Frequency tracking off */
- mt6620_fm_config.aud_cfg.i2s_info.status = FM_I2S_OFF;
- } else {
- WCN_DBG(FM_ERR | CHIP, "%s():[onoff=%d]\n", __func__, onoff);
- ret = -FM_EPARA;
- goto out;
- }
-
- if (mode == FM_I2S_MASTER) {
- tmp_mode = 0x03; /* 6620 as I2S master */
- mt6620_fm_config.aud_cfg.i2s_info.mode = FM_I2S_MASTER;
- } else if (mode == FM_I2S_SLAVE) {
- tmp_mode = 0x0B; /* 6620 as I2S slave */
- mt6620_fm_config.aud_cfg.i2s_info.mode = FM_I2S_SLAVE;
- } else {
- WCN_DBG(FM_ERR | CHIP, "%s():[mode=%d]\n", __func__, mode);
- ret = -FM_EPARA;
- goto out;
- }
-
- if (sample == FM_I2S_32K) {
- tmp_sample = 0x0000; /* 6620 I2S 32KHz sample rate */
- mt6620_fm_config.aud_cfg.i2s_info.rate = FM_I2S_32K;
- } else if (sample == FM_I2S_44K) {
- tmp_sample = 0x0800; /* 6620 I2S 44.1KHz sample rate */
- mt6620_fm_config.aud_cfg.i2s_info.rate = FM_I2S_44K;
- } else if (sample == FM_I2S_48K) {
- tmp_sample = 0x1000; /* 6620 I2S 48KHz sample rate */
- mt6620_fm_config.aud_cfg.i2s_info.rate = FM_I2S_48K;
- } else {
- WCN_DBG(FM_ERR | CHIP, "%s():[sample=%d]\n", __func__, sample);
- ret = -FM_EPARA;
- goto out;
- }
-
- if ((ret = mt6620_set_bits(0x5F, tmp_sample, 0xE7FF)))
- goto out;
-
- if ((ret = mt6620_write(0x9B, tmp_mode)))
- goto out;
-
- if ((ret = mt6620_set_bits(0x56, tmp_state, 0xFF7F)))
- goto out;
-
- WCN_DBG(FM_NTC | CHIP, "[onoff=%s][mode=%s][sample=%d](0)33KHz,(1)44.1KHz,(2)48KHz\n",
- (onoff == FM_I2S_ON) ? "On" : "Off",
- (mode == FM_I2S_MASTER) ? "Master" : "Slave", sample);
- out:
- return ret;
-}
-
-static fm_s32 mt6620_Tx_Support(fm_s32 *sup)
-{
- *sup = 1;
- return 0;
-}
-
-static fm_s32 mt6620_rdsTx_Support(fm_s32 *sup)
-{
- *sup = 1;
- return 0;
-}
-
-static fm_s32 MT6620_FMOverBT(fm_bool enable)
-{
- fm_s32 ret = 0;
- static fm_u16 state;
- static fm_u16 mode;
- static fm_u16 sample;
- static fm_u16 inited = fm_false;
-
- WCN_DBG(FM_NTC | CHIP, "+%s():\n", __func__);
- if (inited == fm_false) {
- /* record priv val */
- if ((ret = mt6620_read(0x56, &state)))
- goto out;
- if ((ret = mt6620_read(0x9B, &mode)))
- goto out;
- if ((ret = mt6620_read(0x5F, &sample)))
- goto out;
- inited = fm_true;
- WCN_DBG(FM_NTC | CHIP, "init, record priv seetings\n");
- }
-
- if (enable == fm_true) {
- /* disable analog output when FM over BT */
- if ((ret = mt6620_set_bits(0x3A, 0, MASK(2))))
- goto out;
- /* set FM over BT */
- if ((ret = mt6620_write(0x56, 0x0001)))
- goto out;
- if ((ret = mt6620_write(0x9B, 0x000b)))
- goto out;
- if ((ret = mt6620_write(0x5F, 0x1175)))
- goto out;
- WCN_DBG(FM_NTC | CHIP, "set FM via BT controller\n");
- } else if (enable == fm_false) {
- /* enable analog output when FM normal mode */
- if ((ret = mt6620_set_bits(0x3A, BITn(2), MASK(2))))
- goto out;
- /* recover to priv val */
- if ((ret = mt6620_write(0x56, state)))
- goto out;
- if ((ret = mt6620_write(0x9B, mode)))
- goto out;
- if ((ret = mt6620_write(0x5F, sample)))
- goto out;
- WCN_DBG(FM_NTC | CHIP, "set FM via Host\n");
- } else {
- WCN_DBG(FM_ERR | CHIP, "%s()\n", __func__);
- ret = -FM_EPARA;
- goto out;
- }
- out:
- WCN_DBG(FM_NTC | CHIP, "-%s():[ret=%d]\n", __func__, ret);
- return ret;
-}
-
-static fm_s32 mt6620_pre_search(void)
-{
- mt6620_RampDown();
- mt6620_Mute(fm_true);
-
- FM_LOG_NTC(FM_NTC | CHIP, "search threshold: RSSI=%d,de-RSSI=%d,smg=%d %d\n",
- mt6620_fm_config.rx_cfg.long_ana_rssi_th, mt6620_fm_config.rx_cfg.desene_rssi_th,
- mt6620_fm_config.rx_cfg.smg_th);
- return 0;
-}
-
-static fm_s32 mt6620_restore_search(void)
-{
- mt6620_RampDown();
- mt6620_Mute(fm_false);
- return 0;
-}
-
-/*fm soft mute tune function*/
-static fm_s32 mt6620_soft_mute_tune(fm_u16 freq, fm_s32 *rssi, fm_bool *valid)
-{
- fm_s32 ret = 0;
- fm_u16 pkt_size;
- fm_s32 hilo_side = -1;
- struct mt6620_fm_softmute_tune_cqi_t *p_cqi;
- fm_s32 RSSI = 0, PAMD = 0, MR = 0, ATDC = 0;
- fm_u32 PRX = 0;
- fm_u16 softmuteGainLvl = 0;
-
- /*set hilo side first(f/w won't do this), need to check whether work if set before rampdown */
- if ((ret = MT6620_HL_Side_Adj(freq, &hilo_side)))
- return ret;
-
- if (FM_LOCK(cmd_buf_lock))
- return (-FM_ELOCK);
- pkt_size = mt6620_full_cqi_req(cmd_buf, TX_BUF_SIZE, freq, 1, 1);
- ret =
- fm_cmd_tx(cmd_buf, pkt_size, FLAG_SM_TUNE, SW_RETRY_CNT, SM_TUNE_TIMEOUT,
- mt6620_get_read_result);
- FM_UNLOCK(cmd_buf_lock);
-
- if (!ret && res) {
- WCN_DBG(FM_NTC | CHIP, "smt cqi size %d\n", res->cqi[0]);
- p_cqi = (struct mt6620_fm_softmute_tune_cqi_t *)&res->cqi[2];
- /* just for debug */
- WCN_DBG(FM_NTC | CHIP, "freq %d, 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x\n",
- p_cqi->ch,
- p_cqi->rssi, p_cqi->pamd, p_cqi->mr, p_cqi->atdc, p_cqi->prx, p_cqi->smg);
- RSSI =
- ((p_cqi->rssi & 0x03FF) >=
- 512) ? ((p_cqi->rssi & 0x03FF) - 1024) : (p_cqi->rssi & 0x03FF);
- PAMD =
- ((p_cqi->pamd & 0xFF) >=
- 128) ? ((p_cqi->pamd & 0x0FF) - 256) : (p_cqi->pamd & 0x0FF);
- MR = ((p_cqi->mr & 0x01FF) >=
- 256) ? ((p_cqi->mr & 0x01FF) - 512) : (p_cqi->mr & 0x01FF);
- ATDC =
- ((p_cqi->atdc & 0x0FFF) >=
- 2048) ? ((p_cqi->atdc & 0x0FFF) - 4096) : (p_cqi->atdc & 0x0FFF);
- if (ATDC < 0) {
- ATDC = (~(ATDC)) - 1; /* Get abs value of ATDC */
- }
- PRX = (p_cqi->prx & 0x00FF);
- softmuteGainLvl = p_cqi->smg;
- /* check if the channel is valid according to each CQIs */
- if ((RSSI >= mt6620_fm_config.rx_cfg.long_ana_rssi_th)
- && (PAMD <= mt6620_fm_config.rx_cfg.pamd_th)
- && (ATDC <= mt6620_fm_config.rx_cfg.atdc_th)
- && (MR >= mt6620_fm_config.rx_cfg.mr_th)
- && (PRX >= mt6620_fm_config.rx_cfg.prx_th)
- && (softmuteGainLvl <= mt6620_fm_config.rx_cfg.smg_th)) {
- *valid = fm_true;
- } else {
- *valid = fm_false;
- }
- *rssi = RSSI;
- } else {
- WCN_DBG(FM_ALT | CHIP, "smt get CQI failed\n");
- return fm_false;
- }
- WCN_DBG(FM_NTC | CHIP, "valid=%d\n", *valid);
- return fm_true;
-}
-
-static fm_s32 mt6620fm_get_audio_info(fm_audio_info_t *data)
-{
- memcpy(data, &mt6620_fm_config.aud_cfg, sizeof(fm_audio_info_t));
- return 0;
-}
-
-static fm_s32 mt6620_i2s_info_get(fm_s32 *ponoff, fm_s32 *pmode, fm_s32 *psample)
-{
- FMR_ASSERT(ponoff);
- FMR_ASSERT(pmode);
- FMR_ASSERT(psample);
-
- *ponoff = mt6620_fm_config.aud_cfg.i2s_info.status;
- *pmode = mt6620_fm_config.aud_cfg.i2s_info.mode;
- *psample = mt6620_fm_config.aud_cfg.i2s_info.rate;
-
- return 0;
-}
-
-static fm_s32 mt6620_hw_info_get(struct fm_hw_info *req)
-{
- FMR_ASSERT(req);
-
- req->chip_id = mt6620_hw_info.chip_id;
- req->eco_ver = mt6620_hw_info.eco_ver;
- req->patch_ver = mt6620_hw_info.patch_ver;
- req->rom_ver = mt6620_hw_info.rom_ver;
-
- return 0;
-}
-
-static fm_bool mt6620_em_test(fm_u16 group_idx, fm_u16 item_idx, fm_u32 item_value)
-{
- fm_s32 ret = 0;
-
- WCN_DBG(FM_NTC | CHIP, "+%s():[group_idx=%d],[item_idx=%d],[item_value=%d]\n",
- __func__, group_idx, item_idx, item_value);
-
- switch (group_idx) {
- case mono:
- if ((ret = mt6620_write(FM_MAIN_PGSEL, 0x01)))
- goto out;
-
- if (item_value == 1) {
- if ((ret = mt6620_set_bits(0xE0, 0x02, 0xFFFF)))
- goto out;
- } else {
- if ((ret = mt6620_set_bits(0xE0, 0x0, 0xFFFD)))
- goto out;
- }
- if ((ret = mt6620_write(FM_MAIN_PGSEL, 0x0)))
- goto out;
- break;
- case stereo:
- if ((ret = mt6620_write(FM_MAIN_PGSEL, 0x01)))
- goto out;
- if (item_value == 0) {
- if ((ret = mt6620_set_bits(0xE0, 0x0, 0xFFFD)))
- goto out;
- } else {
- switch (item_idx) {
- case Sblend_ON:
- if ((ret = mt6620_set_bits(0xD8, item_idx << 15, 0x7FFF)))
- goto out;
- break;
- case Sblend_OFF:
- if ((ret = mt6620_set_bits(0xD8, 0, 0x7FFF)))
- goto out;
- break;
- }
- }
- if ((ret = mt6620_write(FM_MAIN_PGSEL, 0x0)))
- goto out;
- break;
- case RSSI_threshold:
- if ((ret = mt6620_set_bits(0xe0, item_value, 0xFC00)))
- goto out;
- break;
- case HCC_Enable:
- if ((ret = mt6620_write(FM_MAIN_PGSEL, 0x01)))
- goto out;
- if (item_idx) {
- if ((ret = mt6620_set_bits(0xCF, 0x10, 0xFFFF)))
- goto out;
- } else {
- if ((ret = mt6620_set_bits(0xCF, 0x0, 0xFFEF)))
- goto out;
- }
- if ((ret = mt6620_write(FM_MAIN_PGSEL, 0x0)))
- goto out;
- break;
- case PAMD_threshold:
- if ((ret = mt6620_set_bits(0xE1, item_value, 0xFF00)))
- goto out;
- break;
- case Softmute_Enable:
- if ((ret = mt6620_write(FM_MAIN_PGSEL, 0x01)))
- goto out;
- if (item_idx) {
- if ((ret = mt6620_set_bits(0xCF, 0x0020, 0xFFFF))) /* 1:CF[5] = 1 */
- goto out;
- } else {
- if ((ret = mt6620_set_bits(0xCF, 0x0000, 0xFFDF))) /* 1:CF[5] = 0 */
- goto out;
- }
- if ((ret = mt6620_write(FM_MAIN_PGSEL, 0x0)))
- goto out;
- break;
- case De_emphasis:
- if ((ret = mt6620_write(FM_MAIN_PGSEL, 0x01)))
- goto out;
- if (item_idx == 2) {
- if ((ret = mt6620_set_bits(0xd4, 0x2000, 0xCFFF)))
- goto out;
- } else if (item_idx == 1) {
- if ((ret = mt6620_set_bits(0xd4, 0x1000, 0xCFFF)))
- goto out;
- } else if (item_idx == 0) {
- if ((ret = mt6620_set_bits(0xd4, 0x0000, 0xCFFF)))
- goto out;
- }
- if ((ret = mt6620_write(FM_MAIN_PGSEL, 0x0)))
- goto out;
- break;
- case HL_Side:
- if (item_idx == 2) {
- /* H-Side */
- if ((ret = mt6620_set_bits(0xCB, 0x11, 0xFFFE)))
- goto out;
- if ((ret = mt6620_set_bits(0xF, 0x0400, 0xFBFF)))
- goto out;
- } else if (item_idx == 1) {
- /* L-Side */
- if ((ret = mt6620_set_bits(0xCB, 0x10, 0xFFFE)))
- goto out;
- if ((ret = mt6620_set_bits(0xF, 0x0, 0xFBFF)))
- goto out;
- }
- break;
-
- case Dynamic_Limiter:
- if ((ret = mt6620_write(FM_MAIN_PGSEL, 0x01)))
- goto out;
- if (item_idx) {
- if ((ret = mt6620_set_bits(0xFA, 0x0, 0xFFF7)))
- goto out;
- } else {
- if ((ret = mt6620_set_bits(0xFA, 0x08, 0xFFF7)))
- goto out;
- }
- if ((ret = mt6620_write(FM_MAIN_PGSEL, 0x0)))
- goto out;
- break;
-
- case Softmute_Rate:
- if ((ret = mt6620_write(FM_MAIN_PGSEL, 0x01)))
- goto out;
- if ((ret = mt6620_set_bits(0xc8, item_value << 8, 0x80FF)))
- goto out;
- if ((ret = mt6620_write(FM_MAIN_PGSEL, 0x0)))
- goto out;
- break;
-
- case AFC_Enable:
- if (item_idx) {
- if ((ret = mt6620_set_bits(0x63, 0x0400, 0xFBFF)))
- goto out;
- } else {
- if ((ret = mt6620_set_bits(0x63, 0x0, 0xFBFF)))
- goto out;
- }
- break;
-
-#if 0
- case Softmute_Level:
- mt6620_write(FM_MAIN_PGSEL, 0x01);
- if (item_value > 0x24)
- item_value = 0x24;
- mt6620_set_bits(0xD1, item_value, 0xFFC0);
- mt6620_write(FM_MAIN_PGSEL, 0x0);
- break;
-#endif
- case Analog_Volume:
- if ((ret = mt6620_set_bits(0x9C, item_value << 8, 0xC0FF)))
- goto out;
- break;
-
- default:
- break;
- }
-
- out:
- WCN_DBG(FM_NTC | CHIP, "-%s():[ret=%d]\n", __func__, ret);
- return ret;
- return fm_true;
-}
-
-/*
-parm:
- parm.th_type: 0, RSSI. 1,desense RSSI. 2,SMG.
- parm.th_val: threshold value
-*/
-static fm_s32 mt6620_set_search_th(fm_s32 idx, fm_s32 val, fm_s32 reserve)
-{
- switch (idx) {
- case 0:
- {
- mt6620_fm_config.rx_cfg.long_ana_rssi_th = val;
- WCN_DBG(FM_NTC | CHIP, "set rssi th =%d\n", val);
- break;
- }
- case 1:
- {
- mt6620_fm_config.rx_cfg.desene_rssi_th = val;
- WCN_DBG(FM_NTC | CHIP, "set desense rssi th =%d\n", val);
- break;
- }
- case 2:
- {
- mt6620_fm_config.rx_cfg.smg_th = val;
- WCN_DBG(FM_NTC | CHIP, "set smg th =%d\n", val);
- break;
- }
- default:
- break;
- }
- return 0;
-}
-
-static const fm_u16 DesenseChMap[] = {
- 0x0000, 0x0000, 0x0000, 0x0000, /* 7675~7600, 7755~7680, 7835~7760, 7915~7840 */
- 0x0000, 0x0000, 0x0000, 0x0000, /* 7995~7920, 8075~8000, 8155~8080, 8235~8160 */
- 0x0000, 0x0000, 0x0000, 0x0000, /* 8315~8240, 8395~8320, 8475~8400, 8555~8480 */
- 0x0000, 0x0000, 0x0000, 0x0400, /* 8635~8560, 8715~8640, 8795~8720, 8875~8800 */
- 0x0000, 0x0000, 0x0000, 0x0000, /* 8955~8880, 9035~8960, 9115~9040, 9195~9120 */
- 0x00FC, 0x0000, 0x0000, 0x1C00, /* 9275~9200, 9355~9280, 9435~9360, 9515~9440 */
- 0x0000, 0x0001, 0x0000, 0x0000, /* 9595~9520, 9675~9600, 9755~9680, 9835~9760 */
- 0x0000, 0x7800, 0x0000, 0x0000, /* 9915~9840, 9995~9920, 10075~10000, 10155~10080 */
- 0x0000, 0x0000, 0x0000, 0x0000, /* 10235~10160, 10315~10240, 10395~10320, 10475~10400 */
- 0x0000, 0x0000, 0x0000, 0x0000, /* 10555~10480, 10635~10560, 10715~10640, 10795~10720 */
- 0x0000 /* 10875~10800 */
-};
-
-/* return value: 0, not a de-sense channel; 1, this is a de-sense channel; else error no */
-static fm_s32 mt6620_is_dese_chan(fm_u16 freq)
-{
- fm_u8 bDesenseCh = 0;
-
- /* caculate and applye compensation */
- if (0 == fm_get_channel_space(freq)) {
- freq *= 10;
- }
- WCN_DBG(FM_NTC | CHIP, "%s, freq=%d\n", __func__, freq);
-
- bDesenseCh =
- ((0x0001 << (((freq - 7600) % 80) / 5)) & DesenseChMap[((freq - 7600) / 80)]) >>
- (((freq - 7600) % 80) / 5);
- WCN_DBG(FM_NTC | CHIP, "freq[%d] desense=[%d]\n", freq, bDesenseCh);
-
- return bDesenseCh;
-}
-
-/* return value:
-1, is desense channel and rssi is less than threshold;
-0, not desense channel or it is but rssi is more than threshold.*/
-static fm_s32 mt6620_desense_check(fm_u16 freq, fm_s32 rssi)
-{
- if (mt6620_is_dese_chan(freq)) {
- if (rssi < mt6620_fm_config.rx_cfg.desene_rssi_th) {
- return 1;
- }
- }
- return 0;
-}
-
-static fm_s32 MT6620fm_low_power_wa_default(fm_s32 fmon)
-{
- return 0;
-}
-
-fm_s32 MT6620fm_low_ops_register(struct fm_lowlevel_ops *ops)
-{
- fm_s32 ret = 0;
- /* Basic functions. */
-
- FMR_ASSERT(ops);
- FMR_ASSERT(ops->cb.cur_freq_get);
- FMR_ASSERT(ops->cb.cur_freq_set);
- fm_cb_op = &ops->cb;
-
- ops->bi.low_pwr_wa = MT6620fm_low_power_wa_default;
- ops->bi.pwron = mt6620_pwron;
- ops->bi.pwroff = mt6620_pwroff;
- ops->bi.msdelay = Delayms;
- ops->bi.usdelay = Delayus;
- ops->bi.read = mt6620_read;
- ops->bi.write = mt6620_write;
- ops->bi.setbits = mt6620_set_bits;
- ops->bi.chipid_get = mt6620_get_chipid;
- ops->bi.mute = mt6620_Mute;
- ops->bi.rampdown = mt6620_RampDown;
- ops->bi.pwrupseq = mt6620_PowerUp;
- ops->bi.pwrdownseq = mt6620_PowerDown;
- ops->bi.setfreq = mt6620_SetFreq;
- ops->bi.seek = mt6620_Seek;
- ops->bi.seekstop = mt6620_SeekStop;
- ops->bi.scan = mt6620_Scan;
- ops->bi.scanstop = mt6620_ScanStop;
- ops->bi.rssiget = mt6620_GetCurRSSI;
- ops->bi.volset = mt6620_SetVol;
- ops->bi.volget = mt6620_GetVol;
- ops->bi.dumpreg = mt6620_dump_reg;
- ops->bi.msget = mt6620_GetMonoStereo;
- ops->bi.msset = MT6620_SetMonoStereo;
- ops->bi.pamdget = mt6620_GetCurPamd;
- ops->bi.em = mt6620_em_test;
- ops->bi.anaswitch = mt6620_SetAntennaType;
- ops->bi.anaget = mt6620_GetAntennaType;
- ops->bi.caparray_get = mt6620_GetCapArray;
- ops->bi.i2s_set = mt6620_I2s_Setting;
- ops->bi.i2s_get = mt6620_i2s_info_get;
- ops->bi.is_dese_chan = mt6620_is_dese_chan;
- ops->bi.softmute_tune = mt6620_soft_mute_tune;
- ops->bi.desense_check = mt6620_desense_check;
- ops->bi.get_freq_cqi = mt6620_GetFreqCQI;
- ops->bi.hwinfo_get = mt6620_hw_info_get;
- ops->bi.fm_via_bt = MT6620_FMOverBT;
- ops->bi.set_search_th = mt6620_set_search_th;
- ops->bi.get_aud_info = mt6620fm_get_audio_info;
- /*****tx function****/
- ops->bi.tx_support = mt6620_Tx_Support;
- ops->bi.pwrupseq_tx = mt6620_PowerUpTx;
- ops->bi.tune_tx = MT6620_SetFreq_Tx;
- ops->bi.pwrdownseq_tx = mt6620_PowerDownTx;
- ops->bi.tx_scan = mt6620_TxScan;
- ops->ri.rds_tx = MT6620_Rds_Tx;
- ops->ri.rds_tx_enable = MT6620_Rds_Tx_Enable;
- ops->ri.rds_tx_disable = MT6620_Rds_Tx_Disable;
- ops->ri.rdstx_support = mt6620_rdsTx_Support;
- ops->bi.tx_pwr_ctrl = MT6620_TX_PWR_CTRL;
- ops->bi.rtc_drift_ctrl = MT6620_RTC_Drift_CTRL;
- ops->bi.tx_desense_wifi = MT6620_TX_DESENSE;
- ops->bi.pre_search = mt6620_pre_search;
- ops->bi.restore_search = mt6620_restore_search;
-
- cmd_buf_lock = fm_lock_create("20_cmd");
- ret = fm_lock_get(cmd_buf_lock);
-
- cmd_buf = fm_zalloc(TX_BUF_SIZE + 1);
-
- if (!cmd_buf) {
- WCN_DBG(FM_ALT | CHIP, "6620 fm lib alloc tx buf failed\n");
- ret = -1;
- }
-#if 0 /* def CONFIG_MTK_FM_50KHZ_SUPPORT */
- cqi_fifo = fm_fifo_create("6620_cqi_fifo", sizeof(struct adapt_fm_cqi), 640);
- if (!cqi_fifo) {
- WCN_DBG(FM_ALT | CHIP, "6620 fm lib create cqi fifo failed\n");
- ret = -1;
- }
-#endif
-
- return ret;
-}
-
-fm_s32 MT6620fm_low_ops_unregister(struct fm_lowlevel_ops *ops)
-{
- fm_s32 ret = 0;
- /* Basic functions. */
-#if 0 /* def CONFIG_MTK_FM_50KHZ_SUPPORT */
- fm_fifo_release(cqi_fifo);
-#endif
-
- if (cmd_buf) {
- fm_free(cmd_buf);
- cmd_buf = NULL;
- }
-
- ret = fm_lock_put(cmd_buf_lock);
-
- FMR_ASSERT(ops);
-
- fm_memset(&ops->bi, 0, sizeof(struct fm_basic_interface));
- return ret;
-}
-
-
-/***********************************************************************
-* Hi-Lo Side Injection
-*
-***********************************************************************/
-fm_s32 MT6620_HL_Side_Adj(fm_u16 freq, fm_s32 *hl)
-{
- fm_s32 ret = 0;
- fm_s32 isHiSide = 0;
- fm_s32 tblsize = 0;
- fm_s32 indx = 0;
- fm_u16 tmp;
- static fm_u16 Hi_Channels[] = { 7950, 8070, 8210, 10640 };
-
- if (0 == fm_get_channel_space(freq)) {
- freq *= 10;
- }
-
- WCN_DBG(FM_DBG | CHIP, "+%s, [freq=%d]\n", __func__, (fm_s32) freq);
-
- *hl = 0;
-
- if (sizeof(Hi_Channels) == 0)
- goto out;
-
- tblsize = sizeof(Hi_Channels) / sizeof(Hi_Channels[0]);
- for (indx = 0; indx < tblsize; indx++) {
- if (Hi_Channels[indx] == freq) {
- isHiSide = 1;
- *hl = 1;
- /* goto set_HL; */
- break;
- }
- }
-
- if (isHiSide) {
- /* Set high-side injection (AFC) */
- if ((ret = mt6620_read(0x0F, &tmp)))
- goto out;
- if ((ret = mt6620_write(0x0F, tmp | 0x0400)))
- goto out;
- if ((ret = mt6620_write(FM_MAIN_PGSEL, 0)))
- goto out;
- /* Set high-side injection (DFE) */
- if ((ret = mt6620_read(0xCB, &tmp)))
- goto out;
- if ((ret = mt6620_write(0xCB, tmp | 0x01)))
- goto out;
- /* mt6620_write(0xCB, dataRead&0xFFFE); */
- } else {
- /* Set low-side injection (AFC) */
- if ((ret = mt6620_read(0x0F, &tmp)))
- goto out;
- if ((ret = mt6620_write(0x0F, tmp & 0xFBFF)))
- goto out;
- if ((ret = mt6620_write(FM_MAIN_PGSEL, 0)))
- goto out;
- /* Set low-side injection (DFE) */
- if ((ret = mt6620_read(0xCB, &tmp)))
- goto out;
- /* mt6620_write(0xCB, dataRead | 0x01); */
- if ((ret = mt6620_write(0xCB, tmp & 0xFFFE)))
- goto out;
- }
- out:
- WCN_DBG(FM_NTC | CHIP, "-%s, [isHiSide=%d][ret=%d]\n", __func__, (fm_s32) isHiSide, ret);
- return ret;
-}
-
-/***********************************************************************
-* ADPLL Power On or Off
-*
-***********************************************************************/
-fm_s32 MT6620_ADPLL_Power_OnOff(fm_s32 onoff, fm_s32 ADPLL_clk)
-{
- fm_s32 ret = 0;
-
-
- switch (onoff) {
- case FM_ADPLL_ON:
- if ((ret = mt6620_write(0x25, 0x040F)))
- goto out;
- /* Remove the Reset_N */
- if ((ret = mt6620_write(0x20, 0x2720)))
- goto out;
- /* change DLF loop gain */
- /* Set FMCR_DLF_GAIN_A = "9" */
- /* Set FMCR_DLF_GAIN_B = "9" */
- if ((ret = mt6620_write(0x22, 0x9980)))
- goto out;
- /* Configure initial I_CODE for calibration */
- if ((ret = mt6620_write(0x25, 0x080F)))
- goto out;
- /* Enable ADPLL DCO */
- /* Set FMCR_DCO_ EN = "1 */
- if (ADPLL_clk == FM_ADPLL_16M) {
- if ((ret = mt6620_write(0x1E, 0x0A63)))
- goto out;
- /* wait 5ms */
- Delayms(5);
- if ((ret = mt6620_write(0x1E, 0x0A65)))
- goto out;
- /* wait 5ms */
- Delayms(5);
- if ((ret = mt6620_write(0x1E, 0x0A71)))
- goto out;
- } else if (ADPLL_clk == FM_ADPLL_15M) {
- if ((ret = mt6620_write(0x1E, 0x0863)))
- goto out;
- /* wait 5ms */
- Delayms(5);
- if ((ret = mt6620_write(0x1E, 0x0865)))
- goto out;
- /* wait 5ms */
- Delayms(5);
- if ((ret = mt6620_write(0x1E, 0x0871)))
- goto out;
- } else {
- ret = -FM_EPARA;
- goto out;
- }
- /* wait 100ms */
- Delayms(100);
- if ((ret = mt6620_write(0x2A, 0x1026)))
- goto out;
- break;
-
- /* ADPLL Power Off Sequence */
- case FM_ADPLL_OFF:
- /* Set rgfrf_top_ck = "0" */
- if ((ret = mt6620_set_bits(0x2A, 0, MASK(12)))) /* set 2A D12=0 */
- goto out;
- /* Set FMCR_OPEN_LOOP_EN = "0" */
- /* Set FMCR_PLL_EN = "0" */
- /* Set FMCR_DCO_EN = "0" */
- if ((ret = mt6620_set_bits(0x1E, 0, MASK(7) & MASK(4) & MASK(0)))) /* set 1E D7 D4 D0=0 */
- goto out;
- /* Set rgfrf_adpll_reset_n = "0" */
- if ((ret = mt6620_set_bits(0x20, 0, MASK(13)))) /* set 20 D13=0 */
- goto out;
- /* Set rgfrf_adpll_reset_n = "1" */
- if ((ret = mt6620_set_bits(0x20, BITn(13), MASK(13)))) /* set 20 D13=1 */
- goto out;
- break;
- default:
- break;
- }
- out:
- return ret;
-}
-
-/***********************************************************************
-* Frequency Avoidance
-*
-***********************************************************************/
-fm_s32 MT6620_ADPLL_Freq_Avoid(fm_u16 freq, fm_s32 *freqavoid)
-{
- fm_s32 ret = 0;
- fm_s32 ADPLL_clk = FM_ADPLL_15M;
- fm_u16 dataRead = 0;
- fm_u16 indx = 0;
- static fm_u16 Avoid_Channels[] = {
- 7670, 7680, 7690, 7700, 8060, 8070, 8080, 8440, 8450, 8460, 8720, 8830, 8840, 9200,
- 9210, 9220, 9230, 9360, 9490, 9600, 9610, 9980, 9990, 10000, 10130, 10360, 10370,
- 10380, 10740,
- 10750, 10760, 10770
- };
-
- if (0 == fm_get_channel_space(freq)) {
- freq *= 10;
- }
-
- WCN_DBG(FM_DBG | CHIP, "+%s, [freq=%d]\n", __func__, (fm_s32) freq);
-
- *freqavoid = 0;
-
- dataRead = sizeof(Avoid_Channels) / sizeof(Avoid_Channels[0]);
- indx = 0;
- while ((indx < dataRead) && (ADPLL_clk != FM_ADPLL_16M)) {
- if (Avoid_Channels[indx] == freq) {
- ADPLL_clk = FM_ADPLL_16M;
- *freqavoid = 1;
- }
- indx++;
- }
- /* isADPLL_16M = 1; */
- if ((ret = mt6620_read(0x1E, &dataRead)))
- goto out;
- if (((dataRead & BITn(9)) && (ADPLL_clk == FM_ADPLL_16M)) || (!(dataRead & BITn(9)) && (ADPLL_clk == FM_ADPLL_15M))) /* 1EH, D9 */
- goto out; /* we need not do freq avoid at these caes */
-
- if (ADPLL_clk == FM_ADPLL_16M) {
- /* Set rgf_f16mode_en = X */
- if ((ret = mt6620_set_bits(0x61, BITn(0), MASK(0)))) /* set 61H D0=1, 16.384MHZ */
- goto out;
- } else if (ADPLL_clk == FM_ADPLL_15M) {
- /* Set rgf_f16mode_en = X */
- if ((ret = mt6620_set_bits(0x61, 0, MASK(0)))) /* set 61H D0=0, 15.36MHZ */
- goto out;
- } else {
- ret = -FM_EPARA;
- goto out;
- }
-
- /* Disable ADPLL */
- ret = MT6620_ADPLL_Power_OnOff(FM_ADPLL_OFF, ADPLL_clk);
- if (ret) {
- WCN_DBG(FM_NTC | CHIP, "%s, ADPLL OFF failed, [ret=%d]n", __func__, ret);
- goto out;
- }
- /* Set FMCR_DCO_CK_SEL = ? (default = 0, 15.36) */
- if (ADPLL_clk == FM_ADPLL_16M) {
- if ((ret = mt6620_set_bits(0x1E, BITn(9), MASK(9)))) /* set 1EH D9=1, 16.384MHZ */
- goto out;
- } else if (ADPLL_clk == FM_ADPLL_15M) {
- if ((ret = mt6620_set_bits(0x1E, 0, MASK(9)))) /* set 1EH D9=0, 15.36MHZ */
- goto out;
- } else {
- ret = -FM_EPARA;
- goto out;
- }
-
- /* Ensable ADPLL */
- ret = MT6620_ADPLL_Power_OnOff(FM_ADPLL_ON, ADPLL_clk);
- if (ret) {
- WCN_DBG(FM_NTC | CHIP, "%s, ADPLL ON failed, [ret=%d]\n", __func__, ret);
- goto out;
- }
- /* Set rgfrf_cnt_resync_b = 0 */
- if ((ret = mt6620_set_bits(0x2A, 0, MASK(1)))) /* set 2AH D1=0 */
- goto out;
- /* Set rgfrf_cnt_resync_b = 1 */
- if ((ret = mt6620_set_bits(0x2A, BITn(1), MASK(1)))) /* set 2AH D1=1 */
- goto out;
- out:
- WCN_DBG(FM_NTC | CHIP, "-%s, [ADPLL_clk=%d][ret=%d]\n", __func__, (fm_s32) ADPLL_clk, ret);
- return ret;
-}
-
-/***********************************************************************
-* Frequency Avoidance
-*
-***********************************************************************/
-fm_s32 MT6620_MCU_Freq_Avoid(fm_u16 freq, fm_s32 *freqavoid)
-{
- fm_s32 ret = 0;
- fm_s32 mcuDsense = FM_MCU_DESE_DISABLE;
- fm_u16 len = 0;
- fm_u16 indx = 0;
- static fm_u16 FreqList[] = { 7800, 7940, 8320, 9260, 9600, 10400 };
-
- if (0 == fm_get_channel_space(freq)) {
- freq *= 10;
- }
-
- WCN_DBG(FM_DBG | CHIP, "+%s, [freq=%d]\n", __func__, (fm_s32) freq);
-
- *freqavoid = 0;
-
- len = sizeof(FreqList) / sizeof(FreqList[0]);
- indx = 0;
- while ((indx < len) && (mcuDsense != FM_MCU_DESE_ENABLE)) {
- if (FreqList[indx] == freq) {
- mcuDsense = FM_MCU_DESE_ENABLE;
- *freqavoid = 1;
- }
- indx++;
- }
-
- if (mcuDsense == FM_MCU_DESE_DISABLE) {
- if (mtk_wcn_wmt_dsns_ctrl(WMTDSNS_FM_DISABLE)) {
- ret = 0;
- } else {
- ret = -FM_ELINK;
- }
- } else if (mcuDsense == FM_MCU_DESE_ENABLE) {
- if (mtk_wcn_wmt_dsns_ctrl(WMTDSNS_FM_ENABLE)) {
- ret = 0;
- } else {
- ret = -FM_ELINK;
- }
- } else {
- WCN_DBG(FM_ERR | CHIP, "para error!\n");
- ret = -FM_EPARA;
- }
-
- WCN_DBG(FM_NTC | CHIP, "-%s, [mcuDsense=%d][ret=%d]\n", __func__, (fm_s32) mcuDsense, ret);
- return ret;
-}
-
-/***********************************************************************
-* TX PWR CTRL
-*
-***********************************************************************/
-fm_s32 MT6620_TX_PWR_CTRL(fm_u16 freq, fm_s32 *ctr)
-{
-#define MT6620_TX_PWR_LEV_MAX 120
-#define MT6620_TX_PWR_LEV_MIN 85
- fm_s32 ret = 0;
- fm_s32 tmp = 0;
- fm_u16 reg = 0;
- fm_u16 coarse;
- fm_u16 fine;
-
- WCN_DBG(FM_DBG | CHIP, "+%s, [freq=%d]\n", __func__, (fm_s32) freq);
-
- if (freq < FM_TX_PWR_CTRL_FREQ_THR) {
- /* Power setting - 1dB, 3C(HEX)=A9E9 */
- *ctr -= 1;
- } else {
- /* Power setting -2 dB, 3C(HEX)=A8E9 */
- *ctr -= 2;
- }
-
- if (*ctr > MT6620_TX_PWR_LEV_MAX) {
- *ctr = MT6620_TX_PWR_LEV_MAX;
- } else if (*ctr < MT6620_TX_PWR_LEV_MIN) {
- *ctr = MT6620_TX_PWR_LEV_MIN;
- }
- fine = 43017 + ((1 << ((*ctr - 85) % 6)) - 1) * 32;
- WCN_DBG(FM_DBG | CHIP, "0x3C = 0x%04x\n", fine);
- coarse = 514 + ((1 << ((*ctr - 85) / 6)) - 1) * 4;
- WCN_DBG(FM_DBG | CHIP, "0x3D = 0x%04x\n", coarse);
-
- if ((ret = mt6620_write(0x3C, fine)))
- goto out;
- if ((ret = mt6620_write(0x3D, coarse)))
- goto out;
-
- tmp = mtk_wcn_wmt_therm_ctrl(WMTTHERM_READ);
- if ((ret = mt6620_read(0x9C, &reg)))
- goto out;
- reg &= 0xC0FF;
- if (tmp < FM_TX_PWR_CTRL_TMP_THR_DOWN) {
- reg |= (0x1C << 8); /* 9CH, D13~D8 = 1C */
- } else if (tmp > FM_TX_PWR_CTRL_TMP_THR_UP) {
- reg |= (0x33 << 8); /* 9CH, D13~D8 ==33 */
- } else {
- reg |= (0x25 << 8); /* 9CH, D13~D8 =25 */
- }
- if ((ret = mt6620_write(0x9C, reg)))
- goto out;
-
- out:
- WCN_DBG(FM_NTC | CHIP, "-%s, [temp=%d][ret=%d]\n", __func__, (fm_s32) tmp, ret);
- return ret;
-}
-
-/***********************************************************************
-* TX RTC PWR CTRL
-*
-***********************************************************************/
-fm_s32 MT6620_RTC_Drift_CTRL(fm_u16 freq, fm_s32 *ctr)
-{
- fm_s32 ret = 0;
- fm_u16 reg = 0;
- fm_s32 chanel_resolution = 1;
- fm_s16 compensation_int16 = 0;
- fm_s32 tmp = 0;
- fm_s32 drift = *ctr;
-
- WCN_DBG(FM_DBG | CHIP, "+%s, [freq=%d]\n", __func__, (fm_s32) freq);
-
- /* turn off VCO tracking */
- if ((ret = mt6620_set_bits(0x48, 0, MASK(15)))) /* set 48 D15=0 */
- goto out;
-
- /* get channel resolution */
- if ((ret = mt6620_read(0x46, &reg)))
- goto out;
- reg &= 0xC000;
- switch (reg >> 14) {
- case 0:
- chanel_resolution = 1024;
- break;
- case 1:
- chanel_resolution = 512;
- break;
- case 2:
- chanel_resolution = 256;
- break;
- case 3:
- chanel_resolution = 128;
- break;
- default:
- WCN_DBG(FM_ERR | CHIP, "chanel_resolution error[%d]\n", (fm_s32) (reg >> 14));
- break;
- }
-
- /* caculate and applye compensation */
- if (0 == fm_get_channel_space(freq)) {
- freq *= 10;
- }
- WCN_DBG(FM_DBG | CHIP, "[resolution=%d][freq=%d][drift=%d]\n", chanel_resolution,
- (fm_s32) (freq / 100), (*ctr));
- tmp = (2 * drift * (freq / 100)) / chanel_resolution;
- compensation_int16 = (fm_s16) tmp;
- if (compensation_int16 >= 511) {
- compensation_int16 = 511;
- } else if (compensation_int16 <= -512) {
- compensation_int16 = -512;
- }
- if ((ret = mt6620_read(0x47, &reg)))
- goto out;
- reg &= 0x003F;
- reg |= (compensation_int16 << 6);
- if ((ret = mt6620_write(0x47, reg)))
- goto out;
-
- /*
- //turn on VCO tracking
- if((ret = mt6620_set_bits(0x48, BITn(15), MASK(15))))//set 48 D15=1
- goto out;
- */
- out:
- WCN_DBG(FM_NTC | CHIP, "-%s, [compensation=%d][ret=%d]\n", __func__,
- (fm_s32) (compensation_int16), ret);
- return ret;
-}
-
-/***********************************************************************
-* TX desense with WIFI/BT
-*
-***********************************************************************/
-fm_s32 MT6620_TX_DESENSE(fm_u16 freq, fm_s32 *ctr)
-{
- fm_s32 ret = 0;
- fm_u16 dataRead = 0;
- fm_u16 tmp = 0;
-
- WCN_DBG(FM_DBG | CHIP, "+%s, [freq=%d]\n", __func__, (fm_s32) freq);
-
- /* enable FM TX VCO tracking */
- if ((ret = mt6620_read(0x29, &dataRead))) /* read 29 */
- goto out;
- WCN_DBG(FM_NTC | CHIP, "Before VCO On, [0x29=0x%04x]\n", dataRead);
- if ((ret = mt6620_read(0x12, &dataRead))) /* read 12 */
- goto out;
- WCN_DBG(FM_NTC | CHIP, "Before VCO On, [0x12=0x%04x]\n", dataRead);
-
- if ((ret = mt6620_set_bits(0x12, 0, MASK(15)))) /* set 12 D15=0 */
- goto out;
- if ((ret = mt6620_set_bits(0x41, BITn(0), MASK(0)))) /* set 41 D0=1 */
- goto out;
- if ((ret = mt6620_set_bits(0x48, BITn(15), MASK(15)))) /* set 48 D15=1 */
- goto out;
-
- /* wait 100ms (VCO tracking 100ms) */
- if (*ctr > FM_TX_TRACKING_TIME_MAX) {
- *ctr = FM_TX_TRACKING_TIME_MAX;
- }
- Delayms(*ctr);
-
- /* disable FM TX VCO tracking */
- if ((ret = mt6620_set_bits(0x28, BITn(2), MASK(2)))) /* set 28 D2=1 */
- goto out;
- if ((ret = mt6620_read(0x29, &dataRead))) /* read 29 D11~D0 */
- goto out;
- WCN_DBG(FM_NTC | CHIP, "Before VCO Off, [0x29=0x%04x]\n", dataRead);
- tmp = dataRead & 0x0FFF; /* Read 0x29 D11~D0 */
- if ((ret = mt6620_read(0x12, &dataRead))) /* read 12 */
- goto out;
- /* Set 0x12 D15 to 1, D11:D0 to read(0x29 D11~D0) */
- dataRead &= 0xF000;
- dataRead |= tmp;
- dataRead |= 1 << 15;
- if ((ret = mt6620_write(0x12, dataRead)))
- goto out;
- WCN_DBG(FM_NTC | CHIP, "Before VCO Off, [0x12=0x%04x]\n", dataRead);
- if ((ret = mt6620_set_bits(0x48, 0, MASK(15)))) /* set 48 D15=0 */
- goto out;
- if ((ret = mt6620_set_bits(0x41, 0, MASK(0)))) /* set 41 D0=0 */
- goto out;
-
- out:
- WCN_DBG(FM_DBG | CHIP, "-%s, [freq=%d][delay=%dms][ret=%d]\n", __func__, (fm_s32) freq,
- *ctr, ret);
- return ret;
-}
-
-static fm_s32 MT6620_Rds_Tx_Enable(void)
-{
- mt6620_write(0x9F, 0x0000);
- mt6620_write(0xAB, 0x3872);
- mt6620_write(0xAC, 0x3B3A);
- mt6620_write(0xAD, 0x0113);
- mt6620_write(0xAE, 0x03B2);
- mt6620_write(0xAF, 0x0001);
- mt6620_write(0xB1, 0x63EB);
- mt6620_write(0xF4, 0x0020);
- mt6620_write(0xF5, 0x3222);
-
- return 0;
-}
-
-static fm_s32 MT6620_Rds_Tx_Disable(void)
-{
- mt6620_write(0x9F, 0x0000);
- mt6620_write(0xAB, 0x39B6);
- mt6620_write(0xAC, 0x3C3E);
- mt6620_write(0xAD, 0x0000);
- mt6620_write(0xAE, 0x03C2);
- mt6620_write(0xAF, 0x0001);
- mt6620_write(0xF4, 0x0020);
- mt6620_write(0xF5, 0xBF16);
- mt6620_write(0xB1, 0x623D);
-
- return 0;
-}
-
-static fm_s32 MT6620_Rds_Tx(fm_u16 pi, fm_u16 *ps, fm_u16 *other_rds, fm_u8 other_rds_cnt)
-{
- fm_s32 ret = 0;
- fm_u16 pkt_size = 0;
-
- WCN_DBG(FM_NTC | RDSC, "+%s():PI=0x%04x, PS=0x%04x/0x%04x/0x%04x, other_rds_cnt=%d\n",
- __func__, pi, ps[0], ps[1], ps[2], other_rds_cnt);
- if (FM_LOCK(cmd_buf_lock))
- return (-FM_ELOCK);
- pkt_size = mt6620_rds_tx(cmd_buf, TX_BUF_SIZE, pi, ps, other_rds, other_rds_cnt);
- ret = fm_cmd_tx(cmd_buf, pkt_size, FLAG_RDS_TX, SW_RETRY_CNT, RDS_TX_TIMEOUT, NULL);
- FM_UNLOCK(cmd_buf_lock);
-
- return ret;
-}
diff --git a/drivers/misc/mediatek/fmradio/mt6620/pub/mt6620_fm_rds.c b/drivers/misc/mediatek/fmradio/mt6620/pub/mt6620_fm_rds.c
deleted file mode 100644
index 293d1c39c..000000000
--- a/drivers/misc/mediatek/fmradio/mt6620/pub/mt6620_fm_rds.c
+++ /dev/null
@@ -1,365 +0,0 @@
-/* mt6620_rds.c
- *
- * (C) Copyright 2011
- * MediaTek <www.MediaTek.com>
- * hongcheng <hongcheng.xia@MediaTek.com>
- *
- * mt6620 FM Radio Driver
- *
- * 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.
- *
- * 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.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- */
-#include "fm_typedef.h"
-#include "fm_dbg.h"
-#include "fm_err.h"
-#include "fm_interface.h"
-#include "fm_stdlib.h"
-#include "fm_rds.h"
-#include "mt6620_fm_reg.h"
-
-
-#define MT6620_RDS_BLER_TH1 90
-#define MT6620_RDS_BLER_TH2 60
-#define MT6620_RDS_BLER_C1 12
-#define MT6620_RDS_BLER_C2 6
-#define MT6620_RDS_BLER_T1 5000
-#define MT6620_RDS_BLER_T2 5000
-
-static fm_bool bRDS_FirstIn = fm_false;
-static fm_u32 gBLER_CHK_INTERVAL = 5000;
-static fm_u16 GOOD_BLK_CNT = 0, BAD_BLK_CNT;
-static fm_u8 BAD_BLK_RATIO;
-
-static struct fm_callback *fm_cb;
-static struct fm_basic_interface *fm_bi;
-
-/* static fm_bool mt6620_RDS_support(void); */
-static fm_s32 mt6620_RDS_enable(void);
-static fm_s32 mt6620_RDS_disable(void);
-static fm_u16 mt6620_RDS_Get_GoodBlock_Counter(void);
-static fm_u16 mt6620_RDS_Get_BadBlock_Counter(void);
-static fm_u8 mt6620_RDS_Get_BadBlock_Ratio(void);
-static fm_u32 mt6620_RDS_Get_BlerCheck_Interval(void);
-static void mt6620_RDS_Init_Data(rds_t *pstRDSData);
-
-#if 0
-static fm_bool mt6620_RDS_support(void)
-{
- return fm_true;
-}
-#endif
-static fm_s32 mt6620_RDS_enable(void)
-{
- fm_u16 page;
-
- WCN_DBG(FM_DBG | RDSC, "rds enable\n");
- fm_bi->read(FM_MAIN_PGSEL, &page);
- fm_bi->write(FM_MAIN_PGSEL, 0x0003); /* sleect page3 */
-
- fm_bi->write(0xCB, 0xE016);
-
- fm_bi->write(FM_MAIN_PGSEL, 0x0000); /* sleect page0 */
-
- fm_bi->write(0x63, 0x0491);
- fm_bi->setbits(0x6B, 0x2000, 0xFFFF);
-
- fm_bi->write(FM_MAIN_PGSEL, page); /* recover page */
- return 0;
-}
-
-static fm_s32 mt6620_RDS_disable(void)
-{
- WCN_DBG(FM_DBG | RDSC, "rds disable\n");
- fm_bi->setbits(0x6B, 0x0000, 0xDFFF);
- fm_bi->write(0x63, 0x0481);
-
- return 0;
-}
-
-static fm_u16 mt6620_RDS_Get_GoodBlock_Counter(void)
-{
- fm_u16 tmp_reg;
- fm_u16 page;
-
- fm_bi->read(FM_MAIN_PGSEL, &page);
- fm_bi->write(FM_MAIN_PGSEL, 0x0003);
-
- fm_bi->read(FM_RDS_GOODBK_CNT, &tmp_reg);
- GOOD_BLK_CNT = tmp_reg;
-
- fm_bi->write(FM_MAIN_PGSEL, page);
- WCN_DBG(FM_DBG | RDSC, "get good block cnt:%d\n", (fm_s32) tmp_reg);
-
- return tmp_reg;
-}
-
-static fm_u16 mt6620_RDS_Get_BadBlock_Counter(void)
-{
- fm_u16 tmp_reg;
- fm_u16 page;
-
- fm_bi->read(FM_MAIN_PGSEL, &page);
- fm_bi->write(FM_MAIN_PGSEL, 0x0003);
-
- fm_bi->read(FM_RDS_BADBK_CNT, &tmp_reg);
- BAD_BLK_CNT = tmp_reg;
-
- fm_bi->write(FM_MAIN_PGSEL, page);
- WCN_DBG(FM_DBG | RDSC, "get bad block cnt:%d\n", (fm_s32) tmp_reg);
-
- return tmp_reg;
-}
-
-static fm_u8 mt6620_RDS_Get_BadBlock_Ratio(void)
-{
- fm_u16 tmp_reg;
- fm_u16 gbc;
- fm_u16 bbc;
-
- gbc = mt6620_RDS_Get_GoodBlock_Counter();
- bbc = mt6620_RDS_Get_BadBlock_Counter();
-
- if ((gbc + bbc) > 0) {
- tmp_reg = (fm_u8) (bbc * 100 / (gbc + bbc));
- } else {
- tmp_reg = 0;
- }
-
- BAD_BLK_RATIO = tmp_reg;
- WCN_DBG(FM_DBG | RDSC, "get badblock ratio:%d\n", (fm_s32) tmp_reg);
-
- return tmp_reg;
-}
-
-static fm_s32 mt6620_RDS_BlockCounter_Reset(void)
-{
- fm_u16 page;
-
- fm_bi->read(FM_MAIN_PGSEL, &page);
- fm_bi->write(FM_MAIN_PGSEL, 0x0003);
-
- fm_bi->write(0xC8, 0x0001);
- fm_bi->write(0xC8, 0x0002);
-
- fm_bi->write(FM_MAIN_PGSEL, page);
-
- return 0;
-}
-
-static fm_u32 mt6620_RDS_Get_BlerCheck_Interval(void)
-{
- return gBLER_CHK_INTERVAL;
-}
-
-static fm_s32 mt6620_RDS_Reset(void)
-{
- fm_u16 page;
-
- fm_bi->read(FM_MAIN_PGSEL, &page);
- fm_bi->write(FM_MAIN_PGSEL, 0x0003);
-
- fm_bi->write(0xB0, 0x0001);
-
- fm_bi->write(FM_MAIN_PGSEL, page);
-
- return 0;
-}
-
-static fm_s32 mt6620_RDS_Reset_Block(void)
-{
- fm_u16 page;
-
- fm_bi->read(FM_MAIN_PGSEL, &page);
- fm_bi->write(FM_MAIN_PGSEL, 0x0003);
-
- fm_bi->write(0xDD, 0x0001);
-
- fm_bi->write(FM_MAIN_PGSEL, page);
-
- return 0;
-}
-
-static fm_s32 mt6620_RDS_BlerCheck(rds_t *dst)
-{
- fm_s32 ret = 0;
- fm_u16 TOTAL_CNT;
- static fm_u16 RDS_Sync_Cnt;
- static fm_u16 RDS_Block_Reset_Cnt;
-#if 0
- if (dst->AF_Data.Addr_Cnt == 0xFF) {
- /* AF List Finished */
- dst->event_status |= RDS_EVENT_AF; /* Need notfiy application */
- /* loop dst->event_status then act */
- if (dst->event_status != 0) {
- /* fm->RDS_Data_ready = true; */
- /* wake_up_interruptible(&fm->read_wait); */
- /* FIXME */
- WCN_DBG(FM_DBG | RDSC, "RDS_EVENT_AF, trigger read\n");
- }
- }
-#endif
- gBLER_CHK_INTERVAL = MT6620_RDS_BLER_T1;
- GOOD_BLK_CNT = mt6620_RDS_Get_GoodBlock_Counter();
- BAD_BLK_CNT = mt6620_RDS_Get_BadBlock_Counter();
- TOTAL_CNT = GOOD_BLK_CNT + BAD_BLK_CNT;
-
- mt6620_RDS_BlockCounter_Reset();
-
- if ((GOOD_BLK_CNT == 0) && (BAD_BLK_CNT == 0)) {
- BAD_BLK_RATIO = 0;
- } else {
- BAD_BLK_RATIO = (BAD_BLK_CNT * 100) / TOTAL_CNT;
- }
-
- if ((BAD_BLK_RATIO < MT6620_RDS_BLER_TH2) && (RDS_Sync_Cnt > MT6620_RDS_BLER_C1)) {
- gBLER_CHK_INTERVAL = MT6620_RDS_BLER_T2;
-
- if (RDS_Block_Reset_Cnt > 1)
- RDS_Block_Reset_Cnt--;
- } else {
- if (BAD_BLK_RATIO > MT6620_RDS_BLER_TH1) {
- /* >90% */
- mt6620_RDS_BlockCounter_Reset();
- RDS_Sync_Cnt = 0; /* need clear or not, Question, LCH. */
- RDS_Block_Reset_Cnt++;
-
- if ((RDS_Block_Reset_Cnt > MT6620_RDS_BLER_C2) || bRDS_FirstIn) {
- if (bRDS_FirstIn)
- bRDS_FirstIn = false;
-
- if ((ret = mt6620_RDS_Reset()))
- return ret;
-
- RDS_Block_Reset_Cnt = 0;
- WCN_DBG(FM_DBG | RDSC, "RDS Reset, blk_cnt:%d, RDS_FirstIn:%d\n",
- RDS_Block_Reset_Cnt, bRDS_FirstIn);
- } else if (TOTAL_CNT > 12) {
- /* LCH question 2, why 12??? */
- WCN_DBG(FM_DBG | RDSC, "RDS Block Reset: %x\n",
- RDS_Block_Reset_Cnt);
-
- if ((ret = mt6620_RDS_Reset_Block()))
- return ret;
- }
- } else {
- RDS_Sync_Cnt++; /* (60%-90%) */
- WCN_DBG(FM_DBG | RDSC, "RDS Sync Cnt: %d\n", RDS_Block_Reset_Cnt);
-
- if (RDS_Block_Reset_Cnt > 1)
- RDS_Block_Reset_Cnt--;
-
- if (RDS_Sync_Cnt > MT6620_RDS_BLER_C1) {
- gBLER_CHK_INTERVAL = MT6620_RDS_BLER_T2;
- }
- }
- }
-
- return ret;
-}
-
-static void mt6620_RDS_Init_Data(rds_t *pstRDSData)
-{
- fm_memset(pstRDSData, 0, sizeof(rds_t));
- bRDS_FirstIn = fm_true;
-
- fm_memset(pstRDSData->RT_Data.TextData, 0x20, sizeof(pstRDSData->RT_Data.TextData));
- fm_memset(pstRDSData->PS_Data.PS, '\0', sizeof(pstRDSData->PS_Data.PS));
- fm_memset(pstRDSData->PS_ON, 0x20, sizeof(pstRDSData->PS_ON));
-}
-
-fm_bool mt6620_RDS_OnOff(rds_t *dst, fm_bool bFlag)
-{
-#if 0
- if (mt6620_RDS_support() == fm_false) {
- WCN_DBG(FM_ALT | RDSC, "mt6620_RDS_OnOff failed, RDS not support\n");
- return fm_false;
- }
-#endif
- if (bFlag) {
- mt6620_RDS_Init_Data(dst);
- mt6620_RDS_enable();
- } else {
- mt6620_RDS_disable();
- }
-
- return fm_true;
-}
-
-DEFINE_RDSLOG(mt6620_rds_log);
-
-/* mt6620_RDS_Efm_s32_Handler - response FM RDS interrupt
- * @fm - main data structure of FM driver
- * This function first get RDS raw data, then call RDS spec parser
- */
-static fm_s32 mt6620_rds_parser(rds_t *rds_dst, struct rds_rx_t *rds_raw, fm_s32 rds_size,
- fm_u16(*getfreq) (void))
-{
- mt6620_rds_log.log_in(&mt6620_rds_log, rds_raw, rds_size);
- return rds_parser(rds_dst, rds_raw, rds_size, getfreq);
-}
-
-static fm_s32 mt6620_rds_log_get(struct rds_rx_t *dst, fm_s32 *dst_len)
-{
- return mt6620_rds_log.log_out(&mt6620_rds_log, dst, dst_len);
-}
-
-static fm_s32 mt6620_rds_gc_get(struct rds_group_cnt_t *dst, rds_t *rdsp)
-{
- return rds_grp_counter_get(dst, &rdsp->gc);
-}
-
-static fm_s32 mt6620_rds_gc_reset(rds_t *rdsp)
-{
- return rds_grp_counter_reset(&rdsp->gc);
-}
-
-fm_s32 MT6620fm_rds_ops_register(struct fm_lowlevel_ops *ops)
-{
- fm_s32 ret = 0;
-
- FMR_ASSERT(ops);
- FMR_ASSERT(ops->bi.write);
- FMR_ASSERT(ops->bi.read);
- FMR_ASSERT(ops->bi.setbits);
- FMR_ASSERT(ops->bi.usdelay);
- fm_bi = &ops->bi;
-
- FMR_ASSERT(ops->cb.cur_freq_get);
- FMR_ASSERT(ops->cb.cur_freq_set);
- fm_cb = &ops->cb;
-
- ops->ri.rds_blercheck = mt6620_RDS_BlerCheck;
- ops->ri.rds_onoff = mt6620_RDS_OnOff;
- ops->ri.rds_parser = mt6620_rds_parser;
- ops->ri.rds_gbc_get = mt6620_RDS_Get_GoodBlock_Counter;
- ops->ri.rds_bbc_get = mt6620_RDS_Get_BadBlock_Counter;
- ops->ri.rds_bbr_get = mt6620_RDS_Get_BadBlock_Ratio;
- ops->ri.rds_bc_reset = mt6620_RDS_BlockCounter_Reset;
- ops->ri.rds_bci_get = mt6620_RDS_Get_BlerCheck_Interval;
- ops->ri.rds_log_get = mt6620_rds_log_get;
- ops->ri.rds_gc_get = mt6620_rds_gc_get;
- ops->ri.rds_gc_reset = mt6620_rds_gc_reset;
- return ret;
-}
-
-fm_s32 MT6620fm_rds_ops_unregister(struct fm_lowlevel_ops *ops)
-{
- fm_s32 ret = 0;
-
- FMR_ASSERT(ops);
-
- fm_bi = NULL;
- fm_memset(&ops->ri, 0, sizeof(struct fm_rds_interface));
- return ret;
-}
diff --git a/drivers/misc/mediatek/fmradio/mt6626/inc/fm_cust_cfg.h b/drivers/misc/mediatek/fmradio/mt6626/inc/fm_cust_cfg.h
deleted file mode 100644
index 3dc895d3f..000000000
--- a/drivers/misc/mediatek/fmradio/mt6626/inc/fm_cust_cfg.h
+++ /dev/null
@@ -1,105 +0,0 @@
-/*
- *
- * (C) Copyright 20011
- * MediaTek <www.MediaTek.com>
- * Hongcheng Xia<Hongcheng.Xia@MediaTek.com>
- *
- * FM Radio Driver
- *
- * 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.
- *
- * 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.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- */
-
-#ifndef __FM_CUST_CFG_H__
-#define __FM_CUST_CFG_H__
-
-/* scan sort algorithm */
-enum {
- FM_SCAN_SORT_NON = 0,
- FM_SCAN_SORT_UP,
- FM_SCAN_SORT_DOWN,
- FM_SCAN_SORT_MAX
-};
-
-/* ***************************************************************************************** */
-/* ***********************************FM config for customer: start****************************** */
-/* ***************************************************************************************** */
-/* RX */
-#define FM_RX_RSSI_TH_LONG 0xFF01 /* FM radio long antenna RSSI threshold(11.375dBuV) */
-#define FM_RX_RSSI_TH_SHORT 0xFEE0 /* FM radio short antenna RSSI threshold(-1dBuV) */
-#define FM_RX_CQI_TH 0x00E9 /* FM radio Channel quality indicator threshold(0x0000~0x00FF) */
-#define FM_RX_MR_TH 0x01BD /* FM radio MR threshold */
-#define FM_RX_SMG_TH 0x4025 /* FM soft-mute gain threshold */
-#define FM_RX_SEEK_SPACE 1 /* FM radio seek space,1:100KHZ; 2:200KHZ */
-#define FM_RX_SCAN_CH_SIZE 40 /* FM radio scan max channel size */
-#define FM_RX_BAND 1 /* FM radio band, 1:87.5MHz~108.0MHz; 2:76.0MHz~90.0MHz; 3:76.0MHz~108.0MHz; 4:special */
-#define FM_RX_BAND_FREQ_L 875 /* FM radio special band low freq(Default 87.5MHz) */
-#define FM_RX_BAND_FREQ_H 1080 /* FM radio special band high freq(Default 108.0MHz) */
-#define FM_RX_SCAN_SORT_SELECT FM_SCAN_SORT_NON
-#define FM_RX_FAKE_CH_NUM 1
-#define FM_RX_FAKE_CH_RSSI 40
-#define FM_RX_FAKE_CH_1 1075
-#define FM_RX_FAKE_CH_2 0
-#define FM_RX_FAKE_CH_3 0
-#define FM_RX_FAKE_CH_4 0
-#define FM_RX_FAKE_CH_5 0
-#define FM_RX_DEEMPHASIS 0 /* 0-50us, China Mainland; 1-75us China Taiwan */
-#define FM_RX_OSC_FREQ 0 /* 0-26MHz; 1-19MHz; 2-24MHz; 3-38.4MHz; 4-40MHz; 5-52MHz */
-
-/* TX */
-#define FM_TX_PWR_LEVEL_MAX 120
-#define FM_TX_SCAN_HOLE_LOW 923 /* 92.3MHz~95.4MHz should not show to user */
-#define FM_TX_SCAN_HOLE_HIGH 954 /* 92.3MHz~95.4MHz should not show to user */
-
-
-/* ***************************************************************************************** */
-/* ***********************************FM config for customer:end ******************************* */
-/* ***************************************************************************************** */
-/* band */
-#define FM_BAND_UNKNOWN 0
-#define FM_BAND_UE 1 /* US/Europe band 87.5MHz ~ 108MHz (DEFAULT) */
-#define FM_BAND_JAPAN 2 /* Japan band 76MHz ~ 90MHz */
-#define FM_BAND_JAPANW 3 /* Japan wideband 76MHZ ~ 108MHz */
-#define FM_BAND_SPECIAL 4 /* special band between 76MHZ and 108MHz */
-#define FM_BAND_DEFAULT FM_BAND_UE
-#define FM_FREQ_MIN FM_RX_BAND_FREQ_L
-#define FM_FREQ_MAX FM_RX_BAND_FREQ_H
-#define FM_RAIDO_BAND FM_BAND_UE
-/* space */
-#define FM_SPACE_UNKNOWN 0
-#define FM_SPACE_100K 1
-#define FM_SPACE_200K 2
-#define FM_SPACE_DEFAULT FM_RX_SEEK_SPACE
-#define FM_SEEK_SPACE FM_RX_SEEK_SPACE
-/* max scan chl num */
-#define FM_MAX_CHL_SIZE FM_RX_SCAN_CH_SIZE
-/* auto HiLo */
-#define FM_AUTO_HILO_OFF 0
-#define FM_AUTO_HILO_ON 1
-/* seek direction */
-#define FM_SEEK_UP 0
-#define FM_SEEK_DOWN 1
-
-#define FM_CHIP_AR1000 0x1000
-#define FM_CHIP_MT5192 0x91
-#define FM_CHIP_MT5193 0x92
-#define FM_CHIP_MT6616 0x6616
-#define FM_CHIP_MT6626 0x6626
-#define FM_CHIP_MT6628 0x6628
-#define FM_CHIP_MT6620 0x6620
-#define FM_CHIP_UNSUPPORTED 0xffff
-
-/* seek threshold */
-#define FM_SEEKTH_LEVEL_DEFAULT 4
-#endif /* __FM_CUST_CFG_H__ */
diff --git a/drivers/misc/mediatek/fmradio/mt6626/inc/mt6626_drv_dsp.h b/drivers/misc/mediatek/fmradio/mt6626/inc/mt6626_drv_dsp.h
deleted file mode 100644
index 749a38a32..000000000
--- a/drivers/misc/mediatek/fmradio/mt6626/inc/mt6626_drv_dsp.h
+++ /dev/null
@@ -1,972 +0,0 @@
-
-const unsigned char channel_parameter[] = {
- 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 5, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0
-};
-
-#if defined(MT6626_FPGA)
-const unsigned short bin_rom[] = {
- 0x0000, 0x1FFF, 0xBC00, 0x0010, 0xBC00, 0x0271, 0x8EC8, 0x8E00, 0x8EC8, 0x8E00, 0x8EC8,
- 0x8E00, 0x8EC8, 0x8E00, 0x8EC8, 0x8E00, 0x8EC8, 0x8E00, 0xBC02, 0x0906, 0xBC20, 0x2019,
- 0x4021, 0xFB11, 0xBC02, 0x0807, 0xBC20, 0x2019, 0x4041, 0xFB11, 0xBC22, 0x0480, 0xBC20,
- 0x0080, 0x4001, 0x8B02, 0xE401, 0xBC21, 0x0367, 0xA301, 0x0080, 0xBC20, 0x201A, 0x41E1,
- 0xFA12, 0xA302, 0x0082, 0x0891, 0x2620, 0x8FF9, 0x3D02, 0xBC21, 0x2018, 0x481E, 0xBC22,
- 0x2019, 0x8C69, 0x40C0, 0xA203, 0x0082, 0x2631, 0x8F4B, 0x2634, 0x8F3E, 0x2632, 0x8F1D,
- 0xB306, 0x0008, 0x8F0A, 0x40E0, 0xFB50, 0xBC02, 0x1E58, 0xBC22, 0x2019, 0xBC21, 0x2018,
- 0x481E, 0x8C53, 0x40C0, 0xFB50, 0xFA33, 0x26B0, 0x8F08, 0xBC02, 0x072A, 0xBC21, 0x2018,
- 0x4020, 0x7207, 0xBB30, 0x40C0, 0xBC22, 0x2019, 0xA31E, 0x0082, 0x8D41, 0x40A0, 0x70E0,
- 0x3B50, 0xBC21, 0x201D, 0xBC22, 0x201B, 0xFA31, 0xFA52, 0x0810, 0xBC3E, 0x00E4, 0xBC3A,
- 0x0692, 0xB400, 0x0002, 0xA31E, 0x0083, 0xA31A, 0x0084, 0x0408, 0xBC02, 0x0131, 0x40C0,
- 0xBC22, 0x2019, 0xBC21, 0x2018, 0x481E, 0x8D23, 0x4080, 0xFB50, 0xBC02, 0x016B, 0x40C0,
- 0xBC22, 0x2019, 0xBC21, 0x2018, 0x481E, 0x8D18, 0x4060, 0xBC21, 0x201F, 0xFB50, 0xFA30,
- 0xBC3E, 0x00C8, 0xBC3A, 0x0652, 0xBC21, 0x03FF, 0xA31E, 0x0083, 0xA31A, 0x0084, 0x0801,
- 0xBC02, 0x0131, 0x40C0, 0xBC22, 0x2019, 0xBC21, 0x2018, 0x481E, 0xA203, 0x0082, 0xB316,
- 0x0040, 0x8F91, 0xBC00, 0x001C, 0x6915, 0xA902, 0x8E00, 0xA30E, 0x0085, 0xDFD5, 0xBC02,
- 0x0607, 0xBC02, 0x077A, 0xBC20, 0x2019, 0x7040, 0x4FD5, 0xBC22, 0x2008, 0xFB11, 0xFA51,
- 0xBC23, 0x4000, 0x0ACB, 0xBC21, 0x2100, 0xFB53, 0xFA32, 0xB314, 0x0020, 0x8FFB, 0x4121,
- 0xE9FE, 0xFB11, 0xBC00, 0x1D52, 0xE902, 0xBC20, 0x2019, 0x7060, 0x5FD5, 0x8C02, 0xFB11,
- 0x8E00, 0xA200, 0x008B, 0x2600, 0x8FFA, 0x3E02, 0xA200, 0x008C, 0x6980, 0x4FD5, 0x8F02,
- 0xA200, 0x0086, 0x2681, 0x8F02, 0x4080, 0xA300, 0x0082, 0x8EC0, 0xE9FE, 0x8E00, 0xE902,
- 0xBC20, 0x2019, 0x7068, 0x5FD5, 0x8C02, 0xFB11, 0x8E00, 0xA200, 0x008B, 0x2600, 0x8FFA,
- 0x3E02, 0xA200, 0x008C, 0xA201, 0x0088, 0x2681, 0x8F06, 0x4020, 0xA202, 0x008A, 0x1401,
- 0x0A10, 0xA300, 0x008A, 0x3409, 0xA300, 0x0088, 0xA201, 0x0086, 0xB300, 0x0010, 0x8F01,
- 0x2691, 0x8F09, 0x401C, 0xBC20, 0x2041, 0xA202, 0x008A, 0xA31C, 0x0088, 0xA31C, 0x008A,
- 0xFB12, 0x2691, 0x8F16, 0xBC20, 0x2019, 0x41C1, 0x7008, 0x7B11, 0xBC22, 0x2018, 0xBC20,
- 0x201A, 0x8C05, 0xFB51, 0x8E00, 0xBC20, 0x201A, 0x8E00, 0xFA10, 0xB310, 0x0008, 0x8FF6,
- 0x7040, 0x0FD5, 0x8C03, 0xA300, 0x0082, 0xCFD5, 0x8E00, 0x8EC0, 0xE9FE, 0x8E00, 0xE902,
- 0x8E00, 0xDFC0, 0xDFF5, 0xBC02, 0x05A2, 0xA200, 0x0087, 0x2680, 0x8F0C, 0xBC20, 0x2040,
- 0x7000, 0x4FC3, 0x700F, 0xBB11, 0x4042, 0xA303, 0x0089, 0xA31E, 0x0087, 0xA301, 0x0086,
- 0xFB12, 0xA200, 0x0084, 0x8EA0, 0xBC20, 0x02C7, 0xA300, 0x009B, 0xBC02, 0x00A7, 0x3E01,
- 0xBC20, 0x2008, 0xBC21, 0x033D, 0xA202, 0x0083, 0xFB11, 0x8EA2, 0xBC20, 0x2008, 0x7000,
- 0x4FF5, 0xBC22, 0x201A, 0x7040, 0x3B11, 0xFA51, 0x2248, 0x8F00, 0xA300, 0x0082, 0x8EC0,
- 0xE9FE, 0x8E00, 0xE902, 0x8E00, 0xDFD5, 0xBC02, 0x0480, 0xBC20, 0x02B3, 0xA300, 0x009B,
- 0xBC02, 0x00A7, 0x3E01, 0xBC20, 0x2008, 0xBC21, 0x03F7, 0xBC22, 0x2018, 0x7008, 0x3B11,
- 0x7050, 0x3B50, 0xBC21, 0x2019, 0x8C2E, 0xFB30, 0xA200, 0x0081, 0x2601, 0x8F04, 0xBC21,
- 0x8000, 0xBC20, 0x2023, 0x8C24, 0xFB11, 0xBC02, 0x01BE, 0xA200, 0x0085, 0x4001, 0xA301,
- 0x0081, 0x2682, 0x8F02, 0x4100, 0xA300, 0x0082, 0xBC02, 0x1E58, 0xBC20, 0x201A, 0x8E00,
- 0xFA10, 0xB310, 0x0008, 0x8F05, 0xBC20, 0x2019, 0x4161, 0x7008, 0x3B11, 0xA300, 0x0085,
- 0xBC02, 0x077A, 0xBC20, 0x2023, 0xBC21, 0x8000, 0xFB11, 0xA200, 0x0082, 0x2604, 0x8FCE,
- 0x3E02, 0x7000, 0x4FD5, 0xBC20, 0x2008, 0x8EC0, 0xE9FE, 0xFB11, 0xE902, 0xA200, 0x0098,
- 0x6CE0, 0x1FD5, 0x8F57, 0xBC02, 0x0918, 0xBC20, 0x01AE, 0xBC02, 0x09F0, 0xA200, 0x02A7,
- 0x2682, 0x8F02, 0xBC20, 0x01AE, 0xBC02, 0x0D50, 0xA200, 0x008E, 0x2606, 0x8F1E, 0x2604,
- 0x8F17, 0x2602, 0x8F0B, 0x2600, 0x8F05, 0xA200, 0x008D, 0x2680, 0x8F20, 0xBC02, 0x0BDE,
- 0x8D1F, 0xBC02, 0x0E6E, 0x8D1C, 0xBC20, 0x2032, 0x4101, 0xFA10, 0x0801, 0xA300, 0x01E3,
- 0xBC02, 0x0A17, 0x8D12, 0xBC02, 0x0AA2, 0xBC02, 0x0CA4, 0x8D0D, 0xA200, 0x0085, 0x2601,
- 0x8F05, 0xA200, 0x02C7, 0x2601, 0x8F01, 0xBC02, 0x0B48, 0x8D02, 0xBC02, 0x0B2B, 0xA201,
- 0x01BE, 0xBC20, 0x01AE, 0xBC02, 0x0A72, 0xBC20, 0x01E7, 0xBC02, 0x0B04, 0xA200, 0x0266,
- 0x2680, 0xBC20, 0x01E7, 0x8F03, 0xBC21, 0x7FFF, 0xBC02, 0x0B8C, 0x8D04, 0xA201, 0x01FF,
- 0xBC02, 0x0B8C, 0xBC02, 0x0C54, 0xA200, 0x0099, 0x2600, 0x8F02, 0xBC02, 0x195E, 0xBC02,
- 0x1926, 0xA200, 0x009A, 0x2600, 0x8F02, 0xB000, 0xFFFF, 0xA300, 0x009A, 0xBC20, 0x2040,
- 0x4021, 0xFA10, 0x0801, 0x2600, 0x8F0A, 0xBC20, 0x2023, 0xBC21, 0x4000, 0xFA10, 0x0801,
- 0x2680, 0x8F02, 0xA200, 0x009A, 0x2600, 0x8F15, 0x3E02, 0x4000, 0xA300, 0x0099, 0x3E01,
- 0xBC20, 0x2008, 0xBC21, 0x0080, 0xFA12, 0x0851, 0x2610, 0x8F0B, 0xFA11, 0xBC22, 0xFF7F,
- 0x084A, 0x7000, 0x3B11, 0xBC02, 0x05B3, 0x8D03, 0x4020, 0xA300, 0x0099, 0x7038, 0x4FD5,
- 0xA200, 0x008E, 0xE9FE, 0x3401, 0x8EC0, 0x0801, 0xA300, 0x008E, 0x4020, 0xBC21, 0x00C0,
- 0xA300, 0x0091, 0xA300, 0x0092, 0xA301, 0x0098, 0x8EC0, 0xA300, 0x0090, 0xA300, 0x008F,
- 0xE918, 0x8E00, 0xDD05, 0xBC25, 0x2096, 0xDD5B, 0xFAB5, 0xA205, 0x009B, 0xDD7A, 0xDD9F,
- 0xDDBE, 0xDDDD, 0xDDFC, 0xDE0B, 0xDE2C, 0xDE49, 0xDE68, 0xDE8F, 0xDEAE, 0xDED5, 0xDEE6,
- 0xDF04, 0xDF23, 0xDF42, 0xDF61, 0xDF80, 0xDD27, 0xF9FC, 0x8EA5, 0xBC20, 0x2096, 0xBC21,
- 0x00FF, 0xFA10, 0x6220, 0x4D05, 0xA203, 0x0096, 0x6854, 0xCD27, 0x6624, 0xCF80, 0xA302,
- 0x0096, 0xCF61, 0xCF42, 0xCF23, 0xCF04, 0xCEE6, 0xCDFC, 0xCDDD, 0xCDBE, 0xCD9F, 0xCD7A,
- 0xCD5B, 0xF8FC, 0xCED5, 0xCEAE, 0xCE8F, 0xCE68, 0xCE49, 0xCE2C, 0xCE0B, 0xE9E8, 0x8EC8,
- 0xBC20, 0x2102, 0xBC21, 0x8000, 0xFA10, 0x0801, 0x6980, 0x2902, 0x8F07, 0xDFD5, 0xBC02,
- 0x02DB, 0xBC20, 0x02DB, 0xCFD5, 0xA300, 0x009B, 0x8EC0, 0xE9FE, 0x8E00, 0xBC20, 0x2104,
- 0xBC21, 0x8000, 0xFA10, 0x0801, 0x6980, 0x2902, 0x8F07, 0xDFD5, 0xBC02, 0x0423, 0xBC20,
- 0x0423, 0xCFD5, 0xA300, 0x009B, 0x8EC0, 0xE9FE, 0x8E00, 0xE906, 0xA202, 0x0090, 0x69A8,
- 0x1F95, 0x8F19, 0xBC24, 0x2081, 0xBC23, 0x2082, 0xFA95, 0xBC24, 0x2015, 0xFA73, 0xA21A,
- 0x0461, 0xA21E, 0x046B, 0xA210, 0x0361, 0xFA94, 0xA305, 0x02CA, 0xA303, 0x02CB, 0xA310,
- 0x02C8, 0xA31A, 0x02C9, 0xA304, 0x02CC, 0xA31E, 0x02CD, 0x26A6, 0x8F32, 0xBC23, 0x027F,
- 0xBC24, 0x026F, 0x4022, 0xBD10, 0x0306, 0xE205, 0xE585, 0xA21C, 0x02C8, 0xA21A, 0x02CA,
- 0xA21E, 0x02CB, 0xA210, 0x02C9, 0xA205, 0x02CC, 0xA203, 0x02CD, 0xA204, 0x0081, 0xA31C,
- 0x02C2, 0xA310, 0x02C3, 0xA31A, 0x02C4, 0xA31E, 0x02C5, 0xA305, 0x02C6, 0xA303, 0x02C7,
- 0x2640, 0x8F03, 0xA203, 0x0095, 0x34D9, 0xA303, 0x0095, 0xA203, 0x0098, 0xA302, 0x0081,
- 0x3230, 0x8F02, 0xB026, 0xFFFF, 0xA302, 0x0098, 0xA200, 0x028F, 0x421E, 0x403A, 0xBC3C,
- 0x027F, 0xBC22, 0x2033, 0xE064, 0xBC23, 0x2034, 0xE065, 0xFB54, 0xFB75, 0xA300, 0x028F,
- 0xBC02, 0x1BC3, 0xBC22, 0x3105, 0xA200, 0x0313, 0x700E, 0xBA52, 0x3BC2, 0xBC22, 0x2139,
- 0xBC3C, 0x02E0, 0xBD05, 0x0352, 0xFA53, 0xE463, 0xA202, 0x0099, 0x2620, 0xA300, 0x0313,
- 0x385A, 0x8F10, 0xBC23, 0x2008, 0xBC24, 0x0080, 0xFA75, 0x0B2C, 0xBC25, 0x2103, 0xFB74,
- 0xFAB3, 0xBC24, 0x4000, 0x08DC, 0x2630, 0x8F01, 0xBC02, 0x15BE, 0x4022, 0xA203, 0x0091,
- 0x26B0, 0x8F05, 0xBC20, 0x2012, 0xBC21, 0x2014, 0xBC02, 0x106C, 0x4022, 0xA203, 0x0093,
- 0xB306, 0x0011, 0x4003, 0x1893, 0xA204, 0x0091, 0x6D28, 0x5FA2, 0x4244, 0x2214, 0x18DA,
- 0xA202, 0x008F, 0x2620, 0xA303, 0x0091, 0x8F67, 0x2621, 0x8F53, 0x2622, 0x8F2B, 0x26A3,
- 0x8F26, 0xBC02, 0x118C, 0xCFA2, 0x2620, 0xBC20, 0x2015, 0x8F0E, 0xA201, 0x0097, 0xBC02,
- 0x101D, 0xBC02, 0x1391, 0xBC02, 0x1DAA, 0xA202, 0x0097, 0x2622, 0x4043, 0x8F00, 0x34D1,
- 0xA303, 0x0097, 0xA202, 0x0093, 0x3511, 0x4242, 0x21E2, 0xA203, 0x0094, 0x4005, 0x34D9,
- 0x192C, 0x4062, 0x08DA, 0xA304, 0x0093, 0x8C51, 0xA303, 0x0094, 0x8C4E, 0x4062, 0x3854,
- 0xB004, 0xFFFB, 0xDFC0, 0xBC02, 0x121B, 0x6E15, 0x0FC0, 0xB014, 0xFFFA, 0xDFC1, 0xBC02,
- 0x1277, 0xBC02, 0x12BC, 0xCFC0, 0xBC21, 0x0464, 0xBC02, 0x1326, 0x7018, 0x8FA3, 0x2630,
- 0x8F33, 0xA201, 0x0097, 0xBC20, 0x2013, 0xBC02, 0x1037, 0xA201, 0x0097, 0xBC20, 0x200B,
- 0xBC02, 0x1092, 0x4062, 0x8D27, 0xBC02, 0x118C, 0xBC02, 0x11E4, 0xBC02, 0x1B03, 0x7018,
- 0x8FA3, 0x2630, 0x8F1B, 0xA201, 0x0097, 0xBC20, 0x2011, 0xBC02, 0x10B6, 0x4062, 0x8D15,
- 0xBC02, 0x12BC, 0xCFA2, 0x2620, 0x8F00, 0xBC02, 0x1E00, 0xBC02, 0x10FF, 0xA202, 0x0094,
- 0x26A0, 0x4062, 0x8F05, 0xA203, 0x047B, 0x2630, 0x8F01, 0xBC02, 0x115E, 0x4062, 0xA204,
- 0x008F, 0xA203, 0x0090, 0x6D48, 0x4F95, 0x34D9, 0x40E6, 0xA205, 0x008D, 0x08DE, 0x08A2,
- 0x26D0, 0xA303, 0x0090, 0xA302, 0x008F, 0x8F04, 0xBC22, 0x31F8, 0xDF95, 0xFA52, 0x8EA2,
- 0xCF95, 0x8E00, 0x8EC0, 0xE9FA, 0x8E00, 0xE902, 0xA200, 0x0092, 0xDFC0, 0xDFF5, 0xBC02,
- 0x10DC, 0xCFC0, 0xB300, 0x0044, 0x8F2B, 0xA201, 0x0097, 0xB300, 0x0045, 0x8F21, 0xB300,
- 0x0046, 0x8F14, 0xCFC0, 0xB310, 0x0047, 0x8F21, 0xA200, 0x0470, 0x2680, 0x8F00, 0xBC02,
- 0x0F91, 0xBC02, 0x1DAA, 0xA200, 0x0097, 0x2602, 0x4041, 0x8F00, 0x3441, 0xA301, 0x0097,
- 0x8D12, 0xBC20, 0x2013, 0xBC02, 0x1037, 0xA201, 0x0097, 0xBC20, 0x200B, 0xBC02, 0x1092,
- 0x8D07, 0xBC20, 0x2011, 0xBC02, 0x10B6, 0x8D02, 0xBC02, 0x1E00, 0x7240, 0x4FC0, 0x6D00,
- 0x4FF5, 0x21C1, 0x4001, 0x1808, 0xA201, 0x008D, 0x2690, 0xA300, 0x0092, 0x8F04, 0xBC20,
- 0x31F8, 0xDFD5, 0xFA10, 0x8EA0, 0xCFD5, 0x8E00, 0x8EC0, 0xE9FE, 0x8E00, 0xBC20, 0x009C,
- 0xBC21, 0x047C, 0x0448, 0x3489, 0x32A0, 0x4001, 0x8F01, 0x8B02, 0xE401, 0x8EB8, 0xE902,
- 0x8E00, 0xDFD5, 0xBC02, 0x0474, 0xBC20, 0x3173, 0xBC21, 0x3010, 0xBC24, 0x02A8, 0xBC22,
- 0x2032, 0x7014, 0x3A10, 0x4085, 0x700F, 0x3A31, 0xA300, 0x01E5, 0xFA53, 0xBC40, 0x1605,
- 0xA301, 0x0467, 0x4100, 0xBC40, 0x1E10, 0xBC40, 0x2610, 0x6206, 0x2610, 0xFA51, 0x6213,
- 0x6650, 0xBC3A, 0x0184, 0xBC3E, 0x01C0, 0x4503, 0x4444, 0xBC2E, 0x0160, 0xBC2F, 0x0170,
- 0xB048, 0x009C, 0xB056, 0x009C, 0xA300, 0x01E3, 0xA301, 0x01F7, 0xA31C, 0x0468, 0xA31C,
- 0x0461, 0xA31C, 0x045C, 0xA30E, 0x016E, 0xA30F, 0x017E, 0xA31A, 0x01AC, 0xA31A, 0x01AD,
- 0xA31E, 0x01E0, 0xA31E, 0x01E1, 0xA304, 0x015E, 0xA305, 0x015F, 0xBC20, 0x3136, 0xBC21,
- 0x3163, 0xBD04, 0x04D2, 0xFA04, 0xFB24, 0xFA0C, 0xFB24, 0xBD04, 0x04D8, 0xFA0C, 0xFB24,
- 0xBC20, 0x31B2, 0x7717, 0xBA51, 0x7006, 0xBA14, 0x38BC, 0x084D, 0xB048, 0x319C, 0xA301,
- 0x0266, 0xBC20, 0x0200, 0xFA91, 0xB040, 0x0050, 0xB060, 0x0010, 0xA304, 0x0261, 0xA300,
- 0x0260, 0xA306, 0x0262, 0xFA52, 0x4044, 0x1609, 0x41E6, 0x0894, 0x1406, 0xB4F2, 0x0001,
- 0x0B07, 0xBC20, 0x01F9, 0xA302, 0x02A7, 0xBC40, 0x1C01, 0xBC40, 0x3401, 0x144E, 0x24A1,
- 0xBC24, 0x029A, 0xBC40, 0x140C, 0xBC21, 0x0267, 0xBC22, 0x0294, 0xBC3C, 0x4000, 0x6D79,
- 0x640E, 0xBC3F, 0x0285, 0xBC3B, 0x0290, 0xBC30, 0x2000, 0x7000, 0x244F, 0xBC40, 0x6607,
- 0xA31F, 0x028F, 0xA31B, 0x0293, 0xBC40, 0x0C9C, 0xBC40, 0x149C, 0xBC40, 0x151E, 0xBC40,
- 0x2C80, 0xBC40, 0x3490, 0xBC40, 0x3C9A, 0xBC40, 0x2D10, 0xBC40, 0x1D03, 0x40A7, 0xBC02,
- 0x05B3, 0xB04A, 0x0318, 0xBC23, 0x30FD, 0xBC22, 0x30FF, 0xA304, 0x0325, 0xFA74, 0xFA52,
- 0x04F2, 0xBC21, 0x02E0, 0x3589, 0xB00E, 0x0318, 0xA306, 0x0312, 0xA300, 0x0326, 0xBC26,
- 0x30FC, 0xBC20, 0x3102, 0xFAD6, 0xFA10, 0xA306, 0x0360, 0x14AA, 0x1428, 0x14EB, 0xA304,
- 0x035F, 0xBC26, 0x2021, 0x35CD, 0xBC25, 0x0327, 0xBC24, 0x07C0, 0xBC3E, 0x7FFF, 0xBC3A,
- 0x0320, 0xB012, 0x0019, 0xB024, 0xFFFF, 0xB000, 0xFFFF, 0x6D4B, 0x3BD4, 0xA305, 0x0354,
- 0xA31E, 0x047A, 0xA31A, 0x02DC, 0xA301, 0x0314, 0xA307, 0x0313, 0xA304, 0x0353, 0xA302,
- 0x0363, 0xA303, 0x0364, 0xA300, 0x0365, 0xBC02, 0x0263, 0xBC02, 0x07A4, 0xBC20, 0x2023,
- 0xBC21, 0x4000, 0x700F, 0xBA10, 0x0801, 0x2680, 0x8F09, 0xBC20, 0x2040, 0x7008, 0x4FD5,
- 0xFA10, 0x0801, 0x2600, 0x8F10, 0xA301, 0x0099, 0x8D0F, 0xBC20, 0x2008, 0xBC21, 0xFF7F,
- 0x7007, 0x3A12, 0x6214, 0x4FD5, 0xA31C, 0x0099, 0xA31C, 0x02A7, 0xA31E, 0x008D, 0xFB11,
- 0x8EC0, 0xE9FE, 0x8E00, 0xE902, 0x8E00, 0xDFD5, 0xBC02, 0x0474, 0x6914, 0x4FD5, 0x4020,
- 0xE9FE, 0xA309, 0x008B, 0xA309, 0x008C, 0xA300, 0x00A0, 0xBC00, 0x0263, 0xBC22, 0x036A,
- 0xBC21, 0x044C, 0x044A, 0x3509, 0x32C0, 0x4001, 0x4023, 0x8F01, 0x8B04, 0xE501, 0x2680,
- 0x8F02, 0xBC22, 0x2040, 0x8E00, 0xFB51, 0xBC22, 0x305A, 0x40BC, 0x703F, 0xBA52, 0xBC3A,
- 0x0376, 0xBC2E, 0x0399, 0x4FEF, 0xBC28, 0x03A8, 0x2680, 0x149A, 0x4270, 0xA31E, 0x0372,
- 0xA31A, 0x0375, 0xA310, 0x0395, 0xA31C, 0x0396, 0xA31C, 0x0397, 0xA30E, 0x0398, 0xA30F,
- 0x03B8, 0xA308, 0x03A6, 0xA302, 0x03A5, 0xBC20, 0x2040, 0x8F01, 0x4042, 0xFB12, 0xBC20,
- 0x3079, 0xBC3E, 0x03DC, 0xBC3A, 0x041A, 0xBC24, 0x2044, 0xFA03, 0xBC30, 0x03F1, 0xA31E,
- 0x03DB, 0xA31A, 0x0442, 0xA310, 0x03F0, 0xFB91, 0xA301, 0x03E2, 0xA303, 0x03E0, 0xBC22,
- 0x2043, 0x8EC0, 0xA300, 0x03E1, 0xFB51, 0xE902, 0xA200, 0x008C, 0xA201, 0x0082, 0x6980,
- 0x5FD5, 0x8F16, 0x2611, 0x8F14, 0x2612, 0x8F11, 0xBC20, 0x201A, 0x4201, 0xFA10, 0x0801,
- 0x2680, 0x8F00, 0xBC02, 0x06A8, 0xBC20, 0x201F, 0xBC21, 0x03FF, 0xFA10, 0x0801, 0xBC22,
- 0x2002, 0x8C06, 0xFB50, 0xBC20, 0x2002, 0xA201, 0x0089, 0xFB11, 0xBC20, 0x2000, 0x4021,
- 0xFB11, 0xFA11, 0x2693, 0x8FFC, 0x8E00, 0xBC20, 0x2000, 0x4001, 0xBC22, 0x2020, 0x7010,
- 0x3B11, 0xFA51, 0x0808, 0x2600, 0x4021, 0x8F0C, 0xBC20, 0x2001, 0x8E00, 0xFB11, 0xFA11,
- 0x2693, 0x8FFC, 0x8E00, 0x7000, 0x4FD5, 0xBC20, 0x2001, 0x8C02, 0xFB11, 0xCFD5, 0x8E00,
- 0x8EC0, 0xE9FE, 0x8E00, 0xBC20, 0x201B, 0x4022, 0xFA10, 0x4381, 0x0902, 0x0841, 0x4043,
- 0x2640, 0x0803, 0x124B, 0xA204, 0x0089, 0xBC23, 0x201D, 0x8F10, 0x0461, 0xFA73, 0xA301,
- 0x0089, 0x218B, 0x8F1A, 0x2600, 0xBC20, 0x201C, 0x8F03, 0xFA10, 0x8C15, 0xA300, 0x0089,
- 0xA302, 0x0086, 0x8D10, 0xBC25, 0x201C, 0x0061, 0xFAB4, 0xA301, 0x0089, 0x208C, 0x8F07,
- 0x2600, 0x8F03, 0xFA70, 0x8C04, 0xA300, 0x0089, 0xA302, 0x0086, 0xBC20, 0x201F, 0xBC21,
- 0x03FF, 0xFA10, 0xA203, 0x0089, 0x0801, 0x2258, 0x8F03, 0x8EC0, 0xA302, 0x0086, 0x8E00,
- 0x8EB8, 0xBC20, 0x201B, 0x4381, 0xFA10, 0x0801, 0xA201, 0x0089, 0xB480, 0x0002, 0xBC22,
- 0x201C, 0x0008, 0xFA51, 0x2001, 0xA300, 0x0089, 0x8F03, 0x8EC0, 0x4020, 0xA300, 0x0086,
- 0x8EB8, 0xE902, 0xBC22, 0x2000, 0xDFD5, 0x41A3, 0xBC02, 0x0723, 0x4344, 0xBC25, 0x0400,
- 0x2620, 0x8F05, 0xBC02, 0x07F0, 0x5404, 0x4025, 0xBC02, 0x07F0, 0x8D06, 0xBC02, 0x07FB,
- 0x5404, 0x4025, 0xBC02, 0x07FB, 0xBC02, 0x072A, 0x4E20, 0xBC02, 0x07B8, 0xBC20, 0x0001,
- 0x0848, 0xB412, 0x0000, 0xBC22, 0x1000, 0x4183, 0xBC02, 0x0723, 0x220A, 0x8F3F, 0xDFE2,
- 0xBC21, 0x2098, 0x41C2, 0xFA33, 0x0ADA, 0xFB33, 0x4060, 0x4841, 0xBC02, 0x07D8, 0xBC21,
- 0x2098, 0x4202, 0xBC20, 0xFFFE, 0x0ADA, 0xFB33, 0x08D8, 0xFB33, 0x4E20, 0xBC02, 0x07B8,
- 0xBC22, 0xFFFE, 0x084A, 0xCFE2, 0x0A4A, 0xBC02, 0x07CA, 0x4224, 0xBC25, 0x4000, 0xBC02,
- 0x07FB, 0x4044, 0x4045, 0xBC02, 0x07FB, 0x4284, 0x4105, 0xBC02, 0x07FB, 0x4284, 0x4105,
- 0xBC02, 0x07F0, 0xCFE0, 0xBC02, 0x0733, 0x4E24, 0x4045, 0xBC02, 0x07FB, 0x4E24, 0x4045,
- 0xBC02, 0x07F0, 0xBC20, 0x2098, 0x43E1, 0xFB11, 0x4021, 0xFB11, 0xBC22, 0x4000, 0x41C3,
- 0xBC02, 0x0723, 0x38A2, 0x4E20, 0xBC02, 0x07B8, 0xB55A, 0x0002, 0x0A4D, 0xBC02, 0x07CA,
- 0xCFD5, 0xE9FE, 0x8EB8, 0xBC20, 0x201F, 0x8E00, 0xFA10, 0x0890, 0x1093, 0x8EB8, 0xE902,
- 0x4E24, 0xDFD5, 0x4085, 0xBC02, 0x07FB, 0xCFD5, 0xE9FE, 0x8EB8, 0xE902, 0xBC21, 0x202D,
- 0xDFD5, 0xDFE0, 0x4280, 0xBC02, 0x07CA, 0xBC22, 0x8018, 0xBC23, 0x8098, 0xCFE0, 0x2600,
- 0x1853, 0x42C0, 0xBC02, 0x07CA, 0x4240, 0xBC21, 0xE419, 0xBC02, 0x07CA, 0x4260, 0xBC21,
- 0x9010, 0xBC02, 0x07CA, 0x4040, 0xBC21, 0x0FFB, 0xBC02, 0x07CA, 0x4220, 0xBC21, 0x2020,
- 0xBC02, 0x07CA, 0xBC20, 0x0005, 0x4461, 0xBC02, 0x07D8, 0x4220, 0xBC21, 0x1020, 0xBC02,
- 0x07CA, 0xBC20, 0x0005, 0x4461, 0xBC02, 0x07D8, 0x4220, 0xBC21, 0x4020, 0xBC02, 0x07CA,
- 0xBC20, 0x0064, 0x4461, 0xBC02, 0x07D8, 0x4520, 0xBC21, 0x8001, 0xBC02, 0x07CA, 0xCFD5,
- 0xE9FE, 0x8EB8, 0xE902, 0xBC20, 0x2023, 0xDFD5, 0xFA16, 0xBC20, 0x2000, 0x09B0, 0xDFE6,
- 0x4060, 0xBC02, 0x07B8, 0xBC22, 0x39AE, 0xBC23, 0x19AE, 0xCFE6, 0x2660, 0x195A, 0x220D,
- 0x8F02, 0x3825, 0xBC02, 0x07CA, 0x4480, 0xBC02, 0x07B8, 0xBC22, 0x0000, 0xBC23, 0x0001,
- 0xCFE6, 0x2660, 0x195A, 0x220D, 0x8F02, 0x3825, 0xBC02, 0x07CA, 0xCFD5, 0xE9FE, 0x8EB8,
- 0xE902, 0x4E04, 0x4805, 0xDFD5, 0xBC20, 0x2023, 0xBC21, 0x4000, 0xFA10, 0x0801, 0x2600,
- 0x8F01, 0xBC02, 0x07FB, 0x8D02, 0xBC02, 0x07F0, 0xCFD5, 0xE9FE, 0x8EB8, 0xBC22, 0x209A,
- 0xBC23, 0x0100, 0x0AD8, 0xBC21, 0x209D, 0xFB53, 0x4043, 0xFA32, 0x0893, 0x26A0, 0x8FFA,
- 0xBC22, 0x209C, 0x8E00, 0xFA51, 0x8EB8, 0xBC22, 0x209A, 0xBC23, 0x209B, 0xFB50, 0xBC22,
- 0x209D, 0xFB71, 0x4023, 0xFA51, 0x084B, 0x2690, 0x8FFB, 0x8EB8, 0xBC08, 0x07E6, 0x8E00,
- 0xBDC8, 0x07E5, 0x8E00, 0xBC09, 0x07E4, 0x8E00, 0x8E00, 0x8E00, 0x8E00, 0x8E00, 0x8E00,
- 0x8E00, 0x8EB8, 0xBC08, 0x07EE, 0x8E00, 0xBC09, 0x07ED, 0x8E00, 0x8E00, 0x8EB8, 0xE902,
- 0x3804, 0xDFD5, 0xBC02, 0x07B8, 0x0A4D, 0xBC02, 0x07CA, 0xCFD5, 0xE9FE, 0x8EB8, 0xE902,
- 0x1745, 0xDFD5, 0x3804, 0xBC02, 0x07B8, 0x084D, 0xBC02, 0x07CA, 0xCFD5, 0xE9FE, 0x8EB8,
- 0xBC20, 0x201A, 0x4201, 0xFA10, 0x0801, 0x2600, 0x8F00, 0x8EB8, 0xE902, 0x4020, 0xDFD5,
- 0xBC21, 0x1F2A, 0xBC02, 0x07CA, 0xBC20, 0x01F4, 0x4461, 0xBC02, 0x07E8, 0x4000, 0xBC21,
- 0x402D, 0xBC02, 0x07CA, 0x4280, 0x4461, 0xBC02, 0x07E8, 0x4000, 0xBC21, 0x5FED, 0xBC02,
- 0x07CA, 0x4020, 0xBC21, 0x1F6A, 0xBC02, 0x07CA, 0x4280, 0x4461, 0xBC02, 0x07E8, 0x4000,
- 0xBC21, 0x7FED, 0xBC02, 0x07CA, 0x4500, 0x4461, 0xBC02, 0x07E8, 0xBC20, 0x2023, 0xBC22,
- 0x39AE, 0xBC23, 0x19AE, 0xFA10, 0xBC21, 0x2000, 0x0841, 0x38C1, 0x2610, 0x185A, 0x4060,
- 0xBC02, 0x07CA, 0x4040, 0xBC21, 0x0FF9, 0xBC02, 0x07CA, 0xBC20, 0x000A, 0x4461, 0xBC02,
- 0x07E8, 0x4022, 0x4003, 0x2660, 0x1853, 0x4480, 0xBC02, 0x07CA, 0x4540, 0xBC02, 0x07B8,
- 0xDFE1, 0x40C0, 0x4202, 0x41E3, 0x4104, 0xBC25, 0x31EC, 0x41E6, 0xBC02, 0x08EC, 0x41C0,
- 0xBC24, 0x87FF, 0x4166, 0xBC02, 0x08F9, 0xCFE1, 0x4000, 0x4402, 0x43E3, 0x4164, 0xBC25,
- 0x31ED, 0x43E6, 0xBC02, 0x08EC, 0xDFE5, 0x4180, 0xBC24, 0xFF07, 0x4066, 0xBC02, 0x08F9,
- 0xCFE5, 0x40E0, 0xBC24, 0xFFE0, 0x4006, 0xBC02, 0x08F9, 0x4000, 0xBC02, 0x0733, 0xBC20,
- 0x2098, 0x43E1, 0xFB11, 0x4021, 0xFB11, 0x4500, 0x4401, 0xBC02, 0x07CA, 0x4140, 0xBC21,
- 0x0841, 0xBC02, 0x07CA, 0xBC20, 0x01F4, 0x4841, 0xBC02, 0x07E8, 0x4140, 0xBC21, 0x0840,
- 0xBC02, 0x07CA, 0x4500, 0x4001, 0xBC02, 0x07CA, 0xBC21, 0x2023, 0xBC22, 0x0400, 0xFA31,
- 0x084A, 0x2610, 0x8F0A, 0x5364, 0x4065, 0xBC02, 0x07F0, 0x4AC0, 0x4021, 0xBC02, 0x07CA,
- 0xBC21, 0x1FFA, 0x8D02, 0xBC21, 0x1FFB, 0x4040, 0xBC02, 0x07CA, 0x4C80, 0x4841, 0xBC02,
- 0x07E8, 0x41E0, 0xBC21, 0x4042, 0xBC02, 0x07CA, 0xBC02, 0x07A4, 0x4E80, 0x4021, 0xBC02,
- 0x07CA, 0x4E60, 0xBC21, 0x0480, 0xBC02, 0x07CA, 0x5380, 0xBC21, 0xAB40, 0xBC02, 0x07CA,
- 0x4102, 0x4503, 0xBC24, 0x2023, 0xBC25, 0x0400, 0xFA94, 0x0925, 0x2640, 0x1853, 0x53C0,
- 0xBC02, 0x07CA, 0x4E04, 0x4025, 0xBC02, 0x07FB, 0xCFD5, 0xE9FE, 0x8EB8, 0x1048, 0x0891,
- 0x08D9, 0x2620, 0x1863, 0xFAB2, 0x004A, 0x4002, 0x3210, 0x1851, 0x210E, 0x1971, 0x8EB8,
- 0xE901, 0x8E00, 0xDFF5, 0xBC02, 0x07B8, 0x0861, 0x316E, 0x0A4D, 0xBC02, 0x07CA, 0xCFF5,
- 0xE9FF, 0x8EB8, 0xBC20, 0x209F, 0xBC21, 0x31DB, 0xA300, 0x047E, 0xA301, 0x047D, 0xBD11,
- 0x0911, 0xFA22, 0xFB02, 0x8EC0, 0xA300, 0x047E, 0xA301, 0x047D, 0x0000, 0x6915, 0xA908,
- 0xA21B, 0x0180, 0xA21E, 0x017E, 0xA21D, 0x016E, 0xBC3C, 0x3116, 0xBC30, 0x311D, 0x7016,
- 0xDF1B, 0xA204, 0x017F, 0xA202, 0x0181, 0xA203, 0x0182, 0xA201, 0x01AD, 0x6915, 0x1F3D,
- 0x77F6, 0x9F5E, 0xBC26, 0x3106, 0xDF70, 0xDF9C, 0xBD08, 0x09DB, 0xA200, 0x015E, 0xBC3C,
- 0x009C, 0xBC3E, 0x00C2, 0xA304, 0x017F, 0x6E7B, 0x9FA1, 0x6E43, 0xBAC5, 0x6E4B, 0xBE18,
- 0x396C, 0x8A0E, 0xBF95, 0x8A18, 0x77E6, 0x9FC6, 0x6A91, 0x7AD5, 0x7077, 0xFE18, 0x6A91,
- 0x4F86, 0x88D0, 0x6E62, 0xFAC7, 0x6E7A, 0x5FE0, 0x39C8, 0x8890, 0xBC3D, 0x0170, 0x6FCA,
- 0x4F41, 0x6910, 0xBAC5, 0x6910, 0xFF38, 0x7016, 0xBE38, 0x2A47, 0x6A91, 0xFE38, 0xBF95,
- 0x8A38, 0x6A91, 0x7AC7, 0xBF95, 0x8A38, 0xBF9D, 0x8E38, 0xBF95, 0xAA38, 0x2A47, 0x6A91,
- 0xFE38, 0x2A45, 0x88D0, 0x398B, 0x39E9, 0x39C8, 0x88F0, 0xB06C, 0xFFFA, 0x613E, 0xDF86,
- 0xBC26, 0x7ADD, 0xBCB7, 0x8000, 0x04AA, 0xBC26, 0x7ADD, 0xBCA5, 0x8000, 0xA300, 0x015E,
- 0x6025, 0x0F00, 0x6FCB, 0xCFC4, 0x6036, 0x0FE0, 0xB048, 0xFFF1, 0x6910, 0xBF38, 0x6910,
- 0xDF41, 0xFA86, 0x6960, 0x3E18, 0x8A0E, 0xBF99, 0x0C18, 0x7076, 0x9F07, 0x6A91, 0xBA96,
- 0x7016, 0xBE18, 0x2A46, 0x88E0, 0x398B, 0x39E9, 0x39C8, 0x88F0, 0xA300, 0x015E, 0x7077,
- 0x8F20, 0xBC3C, 0x0160, 0x6FCD, 0xCF66, 0x6910, 0xBF18, 0x6910, 0xFAC7, 0x7147, 0xFE18,
- 0x2A47, 0xBF9D, 0x8E18, 0xBF9D, 0x8E18, 0x2A47, 0xBF9D, 0x8E18, 0xBF9D, 0x8E18, 0xBF9D,
- 0x8E18, 0x2A47, 0xBF9D, 0xAE18, 0x2A47, 0x88F0, 0xB06C, 0xFFFA, 0x6E62, 0xDF66, 0x39E9,
- 0x39C8, 0x88E0, 0x0E7A, 0x3F3E, 0x63EC, 0xFF18, 0x6FC3, 0x8FA1, 0xBC3D, 0x0184, 0xB068,
- 0xFFF1, 0x6915, 0xBF38, 0x6915, 0x1F20, 0x5FDA, 0x3885, 0xCF1E, 0xCF50, 0xA310, 0x017E,
- 0xA301, 0x01AD, 0xA304, 0x017F, 0xA302, 0x0181, 0xA31E, 0x0180, 0xA303, 0x0182, 0xCF3B,
- 0x8EC0, 0xE9F8, 0xA31B, 0x016E, 0x0000, 0x2451, 0xA201, 0x01AC, 0x3909, 0xBC22, 0x3124,
- 0x2453, 0xBC3D, 0x0184, 0x451F, 0xBD08, 0x0A11, 0x77F6, 0xFA43, 0x2442, 0x6960, 0x3E38,
- 0x8A0C, 0xBF8C, 0x8638, 0x2A43, 0x88B0, 0x398B, 0x39E9, 0x39C8, 0x88C0, 0x439B, 0x6E18,
- 0x2403, 0xB024, 0xFFF3, 0x6D06, 0xA444, 0x6910, 0xEA38, 0x8EC0, 0xA301, 0x01AC, 0x8E00,
- 0xBC20, 0x3131, 0xA201, 0x02C2, 0xFA10, 0x2600, 0x8F3E, 0xA200, 0x01E2, 0x2680, 0x8F39,
- 0x2610, 0xA200, 0x01BE, 0xB010, 0xFFFF, 0x8F2C, 0xA202, 0x01E3, 0x26A0, 0x8F28, 0xBC22,
- 0x02A8, 0xBC23, 0x3133, 0xBC24, 0x3132, 0xBC40, 0x3906, 0xFA73, 0xBC25, 0x3134, 0xBC27,
- 0x3135, 0xBC40, 0x3102, 0xFA94, 0x04F3, 0xFAB5, 0xFAF6, 0x04A2, 0x1095, 0x10DE, 0x1D1A,
- 0x4003, 0x3240, 0x3843, 0x8F02, 0xB228, 0x0040, 0x4803, 0x18DC, 0x2103, 0x8F05, 0x2183,
- 0x8F18, 0x3401, 0xA300, 0x01BE, 0x8D15, 0x8C14, 0xA301, 0x01BE, 0x3280, 0x4002, 0x8F0D,
- 0xA301, 0x01BE, 0x8D0C, 0x8C0B, 0x4002, 0x2690, 0x4800, 0x4002, 0x8F03, 0x8E00, 0x8C04,
- 0xA302, 0x01BE, 0xA300, 0x01BE, 0xA200, 0x01BE, 0x2600, 0xBC21, 0x2035, 0x4020, 0x8EC0,
- 0x1810, 0xFB30, 0x0000, 0x38E0, 0xA200, 0x01E1, 0xB202, 0x0040, 0x405A, 0xBC3C, 0x01C0,
- 0x441E, 0x8F0F, 0x6E11, 0xE800, 0xBD08, 0x0A88, 0x6D74, 0xA103, 0xE142, 0x1B1A, 0x0E9A,
- 0x3F14, 0x6E11, 0xFF18, 0x8E00, 0x8EC0, 0xA300, 0x01E1, 0x8E00, 0xB522, 0x0009, 0x3867,
- 0xBD08, 0x0A9D, 0x6D76, 0xA184, 0xE1C3, 0xBCB6, 0x8000, 0x8E00, 0x1B63, 0x0EE3, 0x3F1D,
- 0x6E19, 0xFF18, 0x8E00, 0x8EC0, 0xA300, 0x01E1, 0x8E00, 0xA200, 0x01F7, 0x2600, 0xA200,
- 0x01E4, 0x8F44, 0xA201, 0x01F8, 0x2690, 0x8F41, 0xBC21, 0x3173, 0xA202, 0x01E5, 0xFA31,
- 0x2191, 0x8F02, 0x3491, 0xA302, 0x01E5, 0xA202, 0x01E5, 0x2251, 0x8F33, 0xBC21, 0x02A8,
- 0xBC23, 0x316F, 0xBC25, 0x316C, 0xBC40, 0x4086, 0xFA73, 0xBC22, 0x316D, 0xBC24, 0x316E,
- 0x680C, 0xFAB3, 0xFA52, 0xFA94, 0x38A3, 0x8F04, 0xBC23, 0x3170, 0x8E00, 0xFA73, 0x2033,
- 0x18D4, 0xBC26, 0x3171, 0xBC40, 0x4881, 0xFAD6, 0x210E, 0x8F04, 0xBC25, 0x3172, 0x8E00,
- 0xFAB5, 0x210D, 0x1954, 0x1E5D, 0x2208, 0x401E, 0x8F0A, 0x2108, 0xA31E, 0x01E5, 0x8F03,
- 0x8E00, 0x8C05, 0xB000, 0xFFFF, 0x3401, 0x8D01, 0x4000, 0x40A1, 0x2801, 0xA300, 0x01E4,
- 0x382E, 0xB012, 0x3136, 0xBC20, 0x3163, 0xBD04, 0x0AFB, 0xFA22, 0xFB02, 0xFA2A, 0xFB02,
- 0xBD04, 0x0B01, 0xFA2A, 0xFB02, 0x8EB8, 0x0000, 0x2451, 0xA201, 0x01E0, 0x3909, 0xBC22,
- 0x3163, 0x2453, 0xBC3D, 0x01C0, 0x441F, 0xBD08, 0x0B25, 0x77F6, 0xFA43, 0x2442, 0x6960,
- 0x3E38, 0x8A08, 0xBF8C, 0x8638, 0x2A43, 0x88B0, 0x398B, 0x39E9, 0x39C8, 0x88C0, 0x429B,
- 0x6E18, 0x2403, 0xB024, 0xFFF7, 0x6D06, 0xA444, 0x6910, 0xEA38, 0x8EC0, 0xA301, 0x01E0,
- 0x8E00, 0xBC20, 0x31B2, 0x5FE1, 0xFA10, 0xB020, 0x319C, 0xB012, 0x319C, 0x0008, 0xBC23,
- 0x01F9, 0xFA10, 0xBC40, 0x1981, 0x6862, 0x3A52, 0xBC40, 0x3582, 0x8F06, 0xA200, 0x0085,
- 0x2681, 0x8F03, 0x8EC0, 0x4040, 0xA300, 0x0085, 0x8EB8, 0x0000, 0xBC21, 0x02A8, 0xBC23,
- 0x0263, 0xBC40, 0x4880, 0xBC40, 0x5084, 0x6E10, 0xE580, 0x7000, 0x25C4, 0xA203, 0x0266,
- 0xBC40, 0x5881, 0x2630, 0xBC40, 0x1501, 0x401C, 0x8F28, 0x3820, 0xB532, 0x0002, 0xB036,
- 0x3174, 0x3882, 0x6910, 0xBA65, 0x6960, 0x2206, 0x8A02, 0xBBD4, 0xCA86, 0x6A3D, 0x7A73,
- 0x88C0, 0x3215, 0x00E3, 0x8F05, 0xB416, 0x0002, 0x0441, 0x3214, 0x1801, 0x8C0A, 0x3B80,
- 0x3330, 0x8F04, 0x2614, 0x8F04, 0x8E00, 0x8CE1, 0x3449, 0x344D, 0x8DDE, 0xBC20, 0x31B2,
- 0x383C, 0xFA10, 0x2108, 0x1801, 0xB000, 0x319C, 0x8EC0, 0xFA10, 0xA300, 0x01FF, 0xBC25,
- 0x01F9, 0x34AB, 0xE904, 0xE143, 0x6122, 0xDF82, 0x3320, 0x8F02, 0xBC23, 0x31B4, 0x8C05,
- 0xFA73, 0xBC23, 0x31B3, 0x8E00, 0xFA73, 0x2813, 0xA201, 0x0260, 0xBC40, 0x268E, 0xBC40,
- 0x2E8F, 0x6D4A, 0xA29E, 0x700E, 0xE2DC, 0x7307, 0xDFDE, 0x6E7F, 0x224C, 0xCFCE, 0x6A34,
- 0xDFA5, 0x6E28, 0x2800, 0xBC3D, 0x0200, 0x6EE3, 0xE287, 0x88E0, 0xBD07, 0x0BC7, 0x6D00,
- 0x9FCE, 0xBCFF, 0x8000, 0x8E00, 0xE4E7, 0xE2C5, 0xBCDB, 0x8000, 0x6E7F, 0x0FCE, 0x6A34,
- 0xE4E5, 0x38A0, 0x88E0, 0x6EE3, 0xE287, 0xDFCE, 0xBCFF, 0x8000, 0xCF82, 0xE4E7, 0xE2C5,
- 0xBCDB, 0x8000, 0xE64C, 0xE4E5, 0xCFDF, 0xE546, 0xA301, 0x0260, 0xA31F, 0x01F9, 0xCFA3,
- 0x8EC0, 0xE9FC, 0xE5DC, 0x0000, 0xBC22, 0x31B7, 0x8E00, 0xFA52, 0x26A0, 0x8F04, 0x8EC0,
- 0xBC22, 0x6568, 0xA302, 0x0268, 0xA200, 0x0261, 0x403A, 0xBC3C, 0x0200, 0x4C1E, 0x8E00,
- 0xE062, 0xA300, 0x0261, 0x6904, 0xBC1B, 0x241B, 0xBD1E, 0x0BFA, 0x67A6, 0xBC1B, 0x241B,
- 0x1E9A, 0xBC3D, 0x0290, 0xA201, 0x0293, 0x3B7A, 0x407F, 0xBC23, 0x31B6, 0x6EE7, 0x64E2,
- 0xFA73, 0xA204, 0x02B0, 0xA300, 0x0261, 0xA301, 0x0293, 0x21A3, 0x8F2C, 0xA200, 0x0293,
- 0x407E, 0xBC23, 0x31B5, 0x7016, 0xBC1C, 0x1EA2, 0xB800, 0xE61C, 0x1EA2, 0x1E93, 0xB124,
- 0x0001, 0xBC23, 0x2000, 0xBCA4, 0xC000, 0xBC24, 0x3FFF, 0x24DA, 0xB056, 0xFFFF, 0x3095,
- 0x0562, 0xA300, 0x0293, 0x4004, 0xBD0B, 0x0C39, 0x33D0, 0xB56A, 0x0001, 0x8F02, 0xB548,
- 0x0001, 0x8C05, 0x0172, 0x3521, 0x0572, 0xB548, 0x0001, 0x8E00, 0x30A3, 0xA302, 0x0269,
- 0xA202, 0x0269, 0xA203, 0x0268, 0x0493, 0x3220, 0xBC23, 0x0400, 0x8F02, 0xBC23, 0x31B8,
- 0x8E00, 0xFA73, 0xBC24, 0x0267, 0x281A, 0xE643, 0x8EC0, 0xBC40, 0x260F, 0xBC40, 0x1E0E,
- 0x0000, 0xBC23, 0x0267, 0x349D, 0xE904, 0x6D57, 0xA15F, 0x6D27, 0xDF82, 0x700E, 0xA2DD,
- 0xBC40, 0x2184, 0x6E7F, 0x5FDF, 0xBC40, 0x1983, 0x7307, 0xA14C, 0xCFCE, 0x6AA7, 0x1FA5,
- 0xA200, 0x0262, 0xBC3C, 0x0200, 0x88E0, 0x6EEB, 0xFC1F, 0x6960, 0x1FCE, 0xBC25, 0x026F,
- 0xBCFD, 0xC000, 0xBD07, 0x0C8C, 0xB51E, 0x0002, 0x6D7A, 0xA681, 0xE061, 0xBC9C, 0x4000,
- 0x6E7F, 0x4FCE, 0xB512, 0x0002, 0x6AA7, 0x26C1, 0x88E0, 0x6E29, 0xDFCE, 0x6EEB, 0xFC1F,
- 0xBCFD, 0xC000, 0x8E00, 0xB51E, 0x0002, 0xE681, 0xE061, 0xBC9C, 0x4000, 0xCFA3, 0xB512,
- 0x0002, 0xBC24, 0x0267, 0xE6C1, 0xE5DD, 0xE54C, 0xA300, 0x0262, 0xBC40, 0x0E06, 0xCF85,
- 0xCFDE, 0x8EC0, 0xE9FC, 0xE6DE, 0xA200, 0x02A7, 0x2600, 0xBC01, 0x0D4B, 0xA203, 0x0294,
- 0x2630, 0xA202, 0x02C5, 0xBC25, 0x1000, 0xA200, 0x02C6, 0xA204, 0x02C3, 0xA201, 0x01BE,
- 0xBCA5, 0x4000, 0xBC23, 0x0294, 0x8F33, 0xBC26, 0x31CE, 0xBC40, 0x1185, 0x6990, 0x7AD4,
- 0x0495, 0xBCA5, 0x0000, 0xBC26, 0x31CF, 0x00AA, 0xBC25, 0x31D0, 0xBC40, 0x1984, 0xBC40,
- 0x2187, 0x0404, 0xFAD6, 0x044F, 0xFAB5, 0xBC81, 0x8000, 0xBC93, 0x4000, 0x0020, 0x0079,
- 0xA204, 0x0299, 0xBC40, 0x1582, 0xBC40, 0x1D80, 0xBC40, 0x2581, 0x8F07, 0x32C0, 0x4000,
- 0x8F00, 0xB008, 0xFFFF, 0x8C13, 0xA300, 0x0299, 0xBC20, 0x4000, 0x21A0, 0x8F00, 0x3421,
- 0x8C0B, 0xA300, 0x0299, 0x403E, 0xBC40, 0x1D80, 0xA31E, 0x0294, 0xBC40, 0x2581, 0xBC40,
- 0x1582, 0xBC20, 0x31D1, 0xBC40, 0x1185, 0xFA10, 0x20A8, 0x4020, 0xBC40, 0x1981, 0x3840,
- 0x8F06, 0xBC20, 0x31D2, 0x8E00, 0xFA10, 0x2088, 0x3802, 0x8F00, 0x4000, 0xBC24, 0x31D3,
- 0xBC40, 0x2183, 0xFA94, 0xBC27, 0x31EE, 0x4006, 0x6867, 0x3AF3, 0x1932, 0x202B, 0x8F04,
- 0xBC23, 0x31EF, 0x8E00, 0xFA73, 0x218B, 0x8F00, 0x3886, 0x2640, 0xBC21, 0x029A, 0x8F0B,
- 0xBC23, 0x31D4, 0xA204, 0x0299, 0xFA73, 0x2023, 0x8F01, 0x2600, 0x8F03, 0x8E00, 0x8C13,
- 0xA306, 0x0295, 0xBC20, 0x31F7, 0xBC40, 0x2083, 0xFA10, 0x2118, 0x1803, 0xA302, 0x0295,
- 0xBC40, 0x1C86, 0xBC40, 0x1486, 0xBC40, 0x5C86, 0xBC40, 0x2480, 0xBC40, 0x2080, 0xB230,
- 0x7530, 0x4C02, 0x8EC0, 0x1810, 0xBC40, 0x2480, 0x8EC0, 0x4000, 0xA300, 0x0294, 0x0000,
- 0xBC22, 0x31F0, 0xE91C, 0xBC24, 0x029A, 0x7007, 0x3A52, 0x6E11, 0x1C82, 0x6E7F, 0x3C85,
- 0xBC26, 0x31F4, 0xBC23, 0x31F3, 0x77FE, 0xDCA4, 0xBC27, 0x31F2, 0xB801, 0xA891, 0x7027,
- 0xFA73, 0xFAF6, 0xDCC3, 0xBC27, 0x31D5, 0xBC23, 0x31DA, 0xDD26, 0xDD04, 0xFAF6, 0xBC24,
- 0x31F5, 0xFA73, 0xDD66, 0xDD43, 0xFA96, 0xB074, 0x000B, 0xBC23, 0x31D8, 0xDDA6, 0xDD87,
- 0xBC26, 0x31D7, 0xB800, 0xE6F7, 0xDCE1, 0xBC24, 0x31D6, 0x6D34, 0x9DC3, 0xDDE7, 0xBC21,
- 0x8000, 0xFAD6, 0xBC27, 0x31D9, 0xFA94, 0x6163, 0x9E46, 0xE1DE, 0x6D34, 0xDE03, 0x6143,
- 0x1E24, 0xDE86, 0xDE63, 0xB801, 0xEE73, 0xB064, 0x000C, 0xBC21, 0x31F6, 0xDEA7, 0xDEE3,
- 0xDF06, 0xBC27, 0x31F1, 0xB034, 0x0009, 0x6D45, 0x1EC4, 0xB800, 0x6CD1, 0x6E81, 0xBAF6,
- 0xB024, 0x000A, 0xDFA6, 0xDF42, 0xDF23, 0xE1C3, 0xE142, 0xE246, 0xDF64, 0xDF8F, 0xBC3D,
- 0x029F, 0xBD08, 0x0E56, 0x6CD8, 0x1FC1, 0x7003, 0x0E27, 0x6915, 0xA044, 0x8F01, 0x2640,
- 0x8F6F, 0x6A3B, 0xCCE5, 0x6D6C, 0x4EC7, 0x6A3B, 0xDFE6, 0x88D0, 0xB20C, 0x0060, 0xDCE5,
- 0xCDC5, 0x8F65, 0x6A09, 0x4D65, 0x88FC, 0x6910, 0x8C86, 0x28DD, 0x28FD, 0x8890, 0xBCFF,
- 0xC000, 0xBC92, 0x4000, 0x2442, 0x28D5, 0x6A3F, 0x4CE5, 0x88F0, 0x686B, 0x8D26, 0x611E,
- 0x4DE7, 0x2409, 0x8F05, 0xCFA6, 0x686B, 0x8CC5, 0xCD06, 0x666B, 0x8CE5, 0x6113, 0x5DFC,
- 0x2409, 0x32F0, 0xBCEC, 0x4000, 0x8F05, 0xCD41, 0x686E, 0x5DFC, 0x8F01, 0x35F9, 0xDDE7,
- 0x686D, 0x4EE6, 0x401F, 0x8F12, 0x6CB8, 0x0DC5, 0x3BBC, 0x8F09, 0x38FE, 0xBC21, 0x2666,
- 0xBCFE, 0x4000, 0xB06C, 0xFFFF, 0x3BA6, 0x3BE7, 0x0F27, 0x6EF7, 0xDEFD, 0xBC3D, 0x029F,
- 0x8C26, 0x409F, 0xCDE5, 0x69B4, 0x0EA6, 0x8F01, 0x3569, 0xDDE5, 0x684B, 0x9EFC, 0x7027,
- 0xCDC5, 0xBC3D, 0x029F, 0x8F16, 0x6910, 0x8FC1, 0x5BE5, 0x28E5, 0xBC25, 0x31CA, 0x403B,
- 0xFAA6, 0xE0E7, 0x8A03, 0xBBF9, 0x4C3F, 0x6A3F, 0x9EF0, 0x88D0, 0x77FE, 0xDFC1, 0x66EB,
- 0x0DC5, 0x0F26, 0x3BC6, 0x8D02, 0xDFE6, 0xCDC5, 0x6A09, 0x4E47, 0x88EC, 0x6915, 0x0F8F,
- 0x6915, 0x8E85, 0x28F7, 0x28DD, 0x88B0, 0xBC9D, 0x8000, 0xBCE6, 0xC000, 0x6915, 0x0F8F,
- 0x2456, 0x6A33, 0xCFC1, 0x28D5, 0x88A0, 0x8E00, 0x0556, 0x242D, 0x26D0, 0x8F04, 0xCFE6,
- 0xCDA7, 0x2137, 0x19BE, 0xDFE6, 0x6D00, 0xA444, 0x6915, 0xEA38, 0xE4C4, 0xCFE6, 0xCF44,
- 0xCF27, 0xCF00, 0xE7C3, 0xE642, 0xA305, 0x029A, 0xCE02, 0xCD83, 0xCF65, 0xE441, 0xCDE7,
- 0xCE64, 0xCEFB, 0xCCF0, 0xCCA1, 0xE9E4, 0xE6C6, 0xE5C7, 0xE55E, 0x8EC0, 0xE65B, 0xE4D0,
- 0xBC21, 0x02A8, 0xE90E, 0x6E18, 0x7C22, 0xA204, 0x02C4, 0x6C28, 0xA0C5, 0xA200, 0x02C2,
- 0x6C49, 0x5F04, 0xB050, 0x31BD, 0x6E0D, 0x1F55, 0x6980, 0x3AB6, 0xB012, 0xFFF2, 0xA21E,
- 0x02C6, 0xB000, 0x31BF, 0x616C, 0xA4DE, 0x7000, 0x5F21, 0xFA12, 0x4025, 0x180D, 0x0554,
- 0xB020, 0x31BB, 0xA204, 0x02C5, 0xBC40, 0x2187, 0x31E7, 0xFA52, 0x0497, 0xB000, 0x31B9,
- 0xBC40, 0x1987, 0x3127, 0x6C88, 0x3A10, 0x0504, 0x38F4, 0xB00E, 0xFFF7, 0x6622, 0x9F60,
- 0x6D37, 0x6446, 0xB06E, 0xFFF6, 0x6C90, 0x1F86, 0x6643, 0x2745, 0xB05E, 0xFFF5, 0xB07E,
- 0xFFF4, 0xE1C6, 0x6998, 0x66C4, 0xE7C2, 0xDFC7, 0xDFA5, 0x8F54, 0xBC20, 0x02A8, 0x700F,
- 0x8E44, 0x65E3, 0x0EC5, 0xB5A8, 0x000F, 0x65B3, 0x65DE, 0xBC40, 0xBC02, 0xBC40, 0x5404,
- 0xB4AA, 0x0001, 0xB5B6, 0x000F, 0xB4C8, 0x0001, 0xB5EC, 0x000F, 0x62B6, 0x8EA2, 0x0BB4,
- 0x170A, 0xBC40, 0xC406, 0xB4E4, 0x0001, 0xB5C8, 0x000F, 0xBC40, 0x9403, 0x62C9, 0x8E83,
- 0x178B, 0xB4F6, 0x0001, 0xB5EC, 0x000F, 0x0BB7, 0xBC40, 0x8404, 0xCEE4, 0xB5FA, 0x000F,
- 0xBC40, 0x4405, 0x174C, 0xBC40, 0x8C07, 0xB4F8, 0x0001, 0xB5DA, 0x000F, 0xBC40, 0x3C02,
- 0xBC40, 0x4C03, 0xB5A4, 0x000F, 0xB5B6, 0x000F, 0xBC40, 0x3404, 0x0B6F, 0xB5C8, 0x000F,
- 0xBC40, 0x7C02, 0xBC40, 0x9C03, 0xBC40, 0x5C01, 0xBC40, 0xAC01, 0xBC40, 0xB401, 0xBC40,
- 0x7405, 0xBC40, 0xA406, 0x8C69, 0xA304, 0x02B5, 0xBC23, 0x02B5, 0xBC22, 0x31C4, 0xB046,
- 0xFFF9, 0xFA52, 0xDFE4, 0xBC02, 0x1E36, 0x7000, 0x4FE0, 0xB030, 0x000B, 0xBC20, 0x31C3,
- 0xB046, 0xFFF7, 0xFA12, 0xCF80, 0xDF84, 0xBC02, 0x1E36, 0x7000, 0x4F80, 0x6D31, 0xCFA0,
- 0xBC22, 0x31C6, 0xB046, 0xFFF8, 0xFA52, 0xDF84, 0xBC02, 0x1E36, 0x7000, 0x4F80, 0xB030,
- 0x000C, 0xBC20, 0x31C5, 0xB046, 0xFFF6, 0xFA12, 0xCFC0, 0xDF84, 0xBC02, 0x1E36, 0x6E05,
- 0x0F81, 0xB032, 0x000E, 0xBC40, 0x788F, 0x7000, 0x61CE, 0xB040, 0xFFF3, 0x88D8, 0xBC22,
- 0x31C7, 0xB066, 0xFFF3, 0xCF20, 0xFA52, 0xDE65, 0xDF26, 0xDF83, 0xBC02, 0x1E36, 0xCF80,
- 0xCF01, 0xBC47, 0xA803, 0xBC47, 0x5804, 0x6112, 0xCE7E, 0x6C33, 0x0F21, 0x241B, 0xBC47,
- 0xA004, 0x6847, 0x24DE, 0xDEE3, 0x8F03, 0xBC23, 0x31C9, 0x4001, 0x8C05, 0xFA72, 0xBC23,
- 0x31C8, 0x4001, 0xFA72, 0xB030, 0xFFFE, 0xB046, 0xFFF6, 0xCF60, 0xBC02, 0x1E36, 0xBC21,
- 0x02A8, 0xBC20, 0x31C1, 0xCF1E, 0xBC40, 0x4083, 0xFA10, 0xBC40, 0x649E, 0x2098, 0x8F09,
- 0xBC20, 0x31C2, 0xBC40, 0x5083, 0xFA10, 0x6406, 0x0F55, 0x0018, 0x8C03, 0xBC40, 0x5480,
- 0xCF55, 0x8E00, 0x8EC0, 0xE9F2, 0x8E00, 0xBC23, 0x00A5, 0xBC20, 0x3054, 0x6E10, 0xE181,
- 0xB800, 0x2074, 0x24A1, 0xA201, 0x045F, 0x28C8, 0x6911, 0x2902, 0xBC21, 0x00A3, 0x6E10,
- 0x654E, 0xBC24, 0x2081, 0xE085, 0xBC26, 0x2083, 0xB801, 0x2837, 0x692F, 0x65CF, 0xDFC3,
- 0xFAD3, 0x28D8, 0x2444, 0xBC23, 0x00A1, 0x6E10, 0xE54E, 0xE185, 0xE1C6, 0x692D, 0x64CF,
- 0x28E0, 0x2444, 0xA200, 0x00A0, 0x7008, 0xA54E, 0x6220, 0xA5CF, 0xBC24, 0x2080, 0x26A0,
- 0xFA94, 0xBC22, 0x00A7, 0x8F0E, 0x38A2, 0x8E00, 0xE286, 0xE2C7, 0x24BE, 0xBC26, 0x3055,
- 0x8E00, 0xFAD6, 0x28E6, 0x2444, 0x8E00, 0xA30E, 0x00A7, 0xE6CF, 0xBC24, 0x3053, 0x8E00,
- 0xFA94, 0x2244, 0x8F3A, 0x7007, 0x8FC4, 0xA20E, 0x00A5, 0xE24F, 0x88C8, 0xA20E, 0x00A1,
- 0x690B, 0x21CF, 0x88B8, 0xA20E, 0x00A3, 0xE0CF, 0x8898, 0xBC26, 0x3056, 0xE10E, 0xFAD6,
- 0x6807, 0xA14F, 0x88A8, 0x8F10, 0xBC26, 0x3057, 0x8E00, 0xFAD6, 0x200E, 0x8F0A, 0xBC26,
- 0x3059, 0x8E00, 0xFAD6, 0x212E, 0x8F04, 0xBC25, 0x3058, 0x8E00, 0xFAB5, 0x2095, 0x8F03,
- 0x8E00, 0x8C06, 0xA31E, 0x008C, 0x403E, 0x8E00, 0xA31E, 0x008C, 0x403C, 0xA303, 0x009C,
- 0xA301, 0x009D, 0xA304, 0x009E, 0xA302, 0x009F, 0xA31C, 0x008B, 0xE9FE, 0x8EC0, 0x3401,
- 0xA300, 0x00A0, 0x6C84, 0xA904, 0xFA13, 0x6E0D, 0x1FD5, 0xBC22, 0x3104, 0xB002, 0xFFFD,
- 0xFA52, 0xBC21, 0x7FFF, 0x6622, 0xA443, 0x40A1, 0xBC23, 0x02CE, 0xBC24, 0x045A, 0xBC02,
- 0x1E36, 0xCFD5, 0x8E00, 0x8EC0, 0xE9FC, 0x8E00, 0xE906, 0xA202, 0x02D3, 0x6E0D, 0x1F81,
- 0xB012, 0xFFFB, 0x6988, 0x5FA1, 0xDFD5, 0x8F04, 0xBC20, 0x2080, 0x4021, 0x8C0F, 0xA301,
- 0x02D3, 0xFA11, 0xBC02, 0x1E46, 0xA201, 0x0474, 0x1A41, 0x7007, 0x9F61, 0xBC20, 0x2080,
- 0xA31E, 0x02D3, 0xFB11, 0x7040, 0x4F83, 0xBC22, 0x3104, 0x6C8C, 0xBA10, 0xFA52, 0xBC23,
- 0x7FFF, 0x6626, 0x9F60, 0xCFA0, 0xBC23, 0x02D1, 0xBC24, 0x045B, 0xBC02, 0x1E36, 0xCFD5,
- 0x8E00, 0x8EC0, 0xE9FA, 0x8E00, 0xE902, 0xFA31, 0xDFC0, 0xDFF5, 0xBC02, 0x1E46, 0xCFC1,
- 0xDFC0, 0xFA31, 0xBC02, 0x1E46, 0xCFC1, 0x1A48, 0xA200, 0x02D5, 0xA202, 0x045C, 0x0E41,
- 0x26A0, 0xA301, 0x02D5, 0x8F06, 0xBC21, 0x2082, 0x401E, 0xA200, 0x02D5, 0xA31E, 0x02D5,
- 0xFB30, 0x6D14, 0x4FF5, 0xE9FE, 0x40E0, 0x8EC0, 0x0848, 0xA301, 0x045C, 0x6C84, 0xBA10,
- 0xE904, 0xB580, 0x0002, 0xA201, 0x0474, 0xB100, 0x00BE, 0xBC23, 0x2081, 0x66C2, 0x1FD5,
- 0xBC22, 0x3104, 0x6E2D, 0x3B74, 0xB00A, 0xFFFD, 0xFA52, 0xBC23, 0x7FFF, 0x6626, 0xA444,
- 0x40C1, 0xBC23, 0x02D6, 0xBC24, 0x045D, 0xBC02, 0x1E36, 0xCFD5, 0x8E00, 0x8EC0, 0xE9FC,
- 0x8E00, 0xE904, 0xFA10, 0x6E08, 0x1FC1, 0xDFF5, 0xBC02, 0x1E46, 0xA201, 0x0474, 0xBC22,
- 0x3104, 0x6692, 0x0FC0, 0xBC23, 0x2083, 0x6C80, 0xBA52, 0xBC24, 0x7FFF, 0x6E05, 0x3B71,
- 0x6628, 0x9FA1, 0xB000, 0xFFFD, 0x40E1, 0xBC23, 0x02D9, 0xBC24, 0x045E, 0xBC02, 0x1E36,
- 0xCFF5, 0x8E00, 0x8EC0, 0xE9FC, 0x8E00, 0x0000, 0xBC21, 0x00A9, 0x4402, 0xE083, 0xE0C4,
- 0x24A3, 0xBC23, 0x213F, 0x8E00, 0x6960, 0x3A74, 0x8A0E, 0x6A38, 0xBA74, 0xB300, 0x0044,
- 0x28E2, 0x8F0B, 0x2600, 0x8F04, 0x2444, 0x8EC0, 0xA30E, 0x00A9, 0xE4CF, 0x4000, 0x8EC0,
- 0xA300, 0x00A9, 0xE4C0, 0x8880, 0x8EC0, 0x8E00, 0xA300, 0x045F, 0xE904, 0xBC21, 0x2022,
- 0x6E05, 0x1FD5, 0xA21C, 0x047A, 0xB000, 0xFFFD, 0xFA35, 0x7000, 0x6445, 0xDFFC, 0xBC22,
- 0x0780, 0xBC23, 0x02DD, 0xBC24, 0x02DF, 0xBC02, 0x1E36, 0xA201, 0x02DF, 0xA200, 0x02DC,
- 0xCFE2, 0xA092, 0x8000, 0xB000, 0xFFFF, 0xA301, 0x047A, 0x2680, 0xA300, 0x02DC, 0x8F34,
- 0xBC20, 0x304D, 0xBC3E, 0x0320, 0xBC3A, 0x7FFF, 0xFA10, 0xA202, 0x047C, 0xA31E, 0x02DC,
- 0xA31A, 0x047A, 0x21C8, 0x8F14, 0xBC20, 0x304E, 0xBC23, 0x304F, 0xFA10, 0x6872, 0x3A70,
- 0x8F03, 0x2048, 0x8F01, 0x26A0, 0x8F05, 0x21C8, 0x8F0A, 0x4000, 0xA300, 0x047C, 0x8D07,
- 0x4040, 0x8C05, 0xA300, 0x047C, 0x4020, 0xA300, 0x047C, 0xA200, 0x047C, 0x2242, 0x4000,
- 0x8F02, 0xA300, 0x047B, 0x8C07, 0xCFD5, 0x7008, 0x0FD5, 0x8C03, 0xA300, 0x047B, 0xCFD5,
- 0x8E00, 0x8EC0, 0xE9FC, 0x8E00, 0xBC20, 0x2021, 0xA201, 0x047C, 0x6984, 0x3A12, 0x8F1B,
- 0x2611, 0xB034, 0xFFE0, 0x8F10, 0x2692, 0x8F1B, 0xBC21, 0x3051, 0x8E00, 0xFA31, 0x20D1,
- 0x8F00, 0xA026, 0x4000, 0x21D1, 0x8F11, 0xB024, 0x0020, 0xA0A4, 0x4000, 0x8D0E, 0xBC21,
- 0x3052, 0x8E00, 0xFA31, 0x8C09, 0xA026, 0x4000, 0xBC21, 0x3050, 0xB024, 0x0020, 0xFA31,
- 0xA0A4, 0x4000, 0x8EC0, 0xFB12, 0x8E00, 0x0000, 0xBC22, 0x3105, 0xE902, 0xA21C, 0x0326,
- 0x77FE, 0xBA52, 0x6EF0, 0x9FDC, 0xA200, 0x0312, 0xBC3C, 0x02E0, 0xBC22, 0x30C2, 0xBC23,
- 0x8EE4, 0xBC24, 0x771E, 0xBC25, 0x88E2, 0x403B, 0x706F, 0xE800, 0xBD05, 0x11DA, 0x6E30,
- 0xBC19, 0x2442, 0x6960, 0x3AC7, 0x8A08, 0xBB3D, 0x8E19, 0x28CF, 0xA207, 0x0315, 0xBC21,
- 0x12EB, 0xA206, 0x0316, 0x28F9, 0x28F3, 0xA307, 0x0316, 0x88F0, 0x2442, 0x28FC, 0x28F5,
- 0xA307, 0x0315, 0x417A, 0x88E0, 0xA207, 0x0317, 0x699C, 0xEA18, 0x2442, 0x4001, 0x8F00,
- 0xB01E, 0xFFFF, 0x6A3C, 0x4FC1, 0x88E4, 0xBC3D, 0x0318, 0x5FFA, 0x7007, 0x64E6, 0xA206,
- 0x0317, 0x6998, 0xDFC1, 0x8F02, 0x35B1, 0x3BA6, 0x8E00, 0xA31D, 0x0317, 0xA300, 0x0312,
- 0xCFC2, 0x8EC0, 0xE9FE, 0xA302, 0x0326, 0x0000, 0xA200, 0x0325, 0xA201, 0x0354, 0xBC3D,
- 0x0327, 0x459F, 0x403B, 0xBC3C, 0x0318, 0x41BE, 0xBC22, 0x30CB, 0xBD05, 0x1200, 0x5FFA,
- 0x3862, 0x6910, 0xBC1D, 0x6960, 0x3A64, 0x8A03, 0xBBB0, 0xC81D, 0x28EC, 0x88B0, 0x40DA,
- 0xE4E3, 0xEA18, 0xA300, 0x0325, 0xA200, 0x0353, 0x3B9D, 0x459E, 0xBC22, 0x30CF, 0x5FFA,
- 0xA301, 0x0354, 0x6910, 0xBA43, 0xE064, 0x8A27, 0xBB8C, 0x861C, 0x403A, 0x28E3, 0x88A0,
- 0xEA18, 0x8EC0, 0xA300, 0x0353, 0xA302, 0x0355, 0xBC25, 0x0357, 0xBC22, 0x30F8, 0x6E09,
- 0x7CA4, 0xB800, 0xA6B6, 0x24B4, 0xA206, 0x0356, 0x33B0, 0x4FE4, 0xBC27, 0x01FF, 0x35B1,
- 0x1927, 0x09F4, 0xBC24, 0x0100, 0x4806, 0x1926, 0xA206, 0x0355, 0x2670, 0xA307, 0x0356,
- 0x243E, 0x28FC, 0x2444, 0x4004, 0x7008, 0x64CE, 0x6673, 0x26CF, 0x2670, 0x8F2C, 0xBC27,
- 0x30F7, 0xE2CF, 0xFAF7, 0x6CDC, 0x26C4, 0xA20E, 0x0357, 0xA304, 0x0357, 0x88D8, 0x8F1C,
- 0x3230, 0x8F01, 0xB036, 0xFFFF, 0xFB53, 0xA202, 0x0359, 0x2620, 0x8F0D, 0x2622, 0x4043,
- 0x8F05, 0xB20A, 0x099A, 0x189A, 0xB22A, 0x21EC, 0x8C08, 0x18A2, 0xB22A, 0x13D7, 0x8C04,
- 0x188A, 0xB20A, 0x17AE, 0x188A, 0x8C07, 0xA302, 0x0359, 0xBC22, 0x30F7, 0xB03E, 0xFFFF,
- 0xFB53, 0xA202, 0x0359, 0x144A, 0x2442, 0x28F1, 0x8894, 0x8EC0, 0x8E00, 0xE441, 0xBC22,
- 0x2131, 0xBC23, 0x00B0, 0xBC24, 0x2135, 0x6915, 0x3B53, 0xFA93, 0xBC22, 0x2136, 0xE4C3,
- 0xB800, 0xA210, 0xBC80, 0x4000, 0x6915, 0xE902, 0xBC21, 0x30F9, 0xA203, 0x035B, 0xBC22,
- 0x035C, 0x6E73, 0xFA31, 0xBC24, 0x30FA, 0x28C1, 0xA300, 0x035B, 0xFA94, 0x6E08, 0xBC40,
- 0x6A37, 0x2143, 0x2A83, 0x88C0, 0xDFCE, 0xDFEF, 0xBC20, 0x0A30, 0xBC88, 0x0000, 0xCFCE,
- 0xA300, 0x035A, 0xCFEF, 0x2444, 0xA203, 0x035E, 0xB580, 0x0001, 0x6000, 0xE4CE, 0xB000,
- 0x2000, 0xE54F, 0xA300, 0x035E, 0xBC21, 0x3244, 0xBC80, 0x4000, 0xBC21, 0x2111, 0x8EC0,
- 0xE9FE, 0xFB30, 0xBC22, 0x3105, 0xBC24, 0x30FB, 0xE906, 0xA203, 0x035A, 0xBC25, 0xF000,
- 0xFA52, 0xFA94, 0xA21E, 0x0314, 0xA21C, 0x015F, 0x66BA, 0xDF84, 0xDFA2, 0x7050, 0xDF63,
- 0xDFDC, 0xDF5E, 0xBC22, 0x0CCD, 0xBC24, 0x2131, 0xBC25, 0x199A, 0xBC3B, 0x009C, 0xBC3D,
- 0x02E0, 0xBD0A, 0x131D, 0xA206, 0x035F, 0x700E, 0x8F67, 0x63ED, 0xCFBE, 0xB47C, 0x000E,
- 0xB11E, 0x0005, 0xA200, 0x0360, 0x0E08, 0x2810, 0xB5FE, 0x000E, 0x380E, 0x1BB7, 0xB000,
- 0x0400, 0xBCF0, 0xC000, 0xA306, 0x035F, 0xBCED, 0x4000, 0x283A, 0xA307, 0x0360, 0x888C,
- 0xBC27, 0x00B1, 0x6EE7, 0x7B97, 0x606C, 0x0F40, 0xBC27, 0x3244, 0xBCED, 0xC000, 0x7016,
- 0xBC1F, 0x6EE6, 0xDF40, 0xBC20, 0x2135, 0xBC21, 0x2111, 0xFA10, 0xBC8E, 0x0000, 0xFB36,
- 0xB560, 0x0001, 0xCF80, 0xBC8C, 0x0000, 0xBC3E, 0x00C2, 0x63E1, 0x8FC0, 0x3F3E, 0xFF18,
- 0xDFC0, 0xCFC2, 0xA302, 0x015F, 0xCF43, 0x8EC0, 0xE9FA, 0xA303, 0x0314, 0xA203, 0x0366,
- 0x6D06, 0x6044, 0xBC22, 0x0367, 0xA203, 0x0363, 0x08C3, 0xA206, 0x0355, 0x6E00, 0xBC45,
- 0xBCC9, 0x8000, 0x698C, 0x2146, 0x24B5, 0xA205, 0x0364, 0x28E5, 0x2444, 0xA303, 0x0366,
- 0x7000, 0x244E, 0x7008, 0xE54F, 0x1918, 0x2640, 0x8F4A, 0xE14F, 0xA20E, 0x0367, 0xE540,
- 0xA300, 0x0367, 0xBC22, 0x3101, 0xE0C1, 0x2409, 0xFA52, 0x88C8, 0x218A, 0x240C, 0x3840,
- 0x8F0B, 0xBC20, 0x2004, 0x8E00, 0xFA10, 0x2680, 0x3802, 0x8F04, 0xBC20, 0x3100, 0x5FE4,
- 0xFA10, 0x2108, 0x181C, 0xA201, 0x0369, 0xA204, 0x0365, 0x3449, 0x084C, 0xBC24, 0x30FE,
- 0x2610, 0xA301, 0x0369, 0xA201, 0x0362, 0xFA94, 0x195A, 0x0048, 0x3340, 0x8F12, 0x2650,
- 0x8F14, 0xBC20, 0x3103, 0xA204, 0x0361, 0x69B0, 0x3A10, 0x8F02, 0x2188, 0x8C04, 0x185A,
- 0x0410, 0x2088, 0x1853, 0xA301, 0x0361, 0x3822, 0x8D05, 0xBC20, 0x30FE, 0xB028, 0xFFFF,
- 0xFB12, 0x8EC0, 0xA301, 0x0362, 0x8E00, 0x8EB8, 0xBC20, 0x303D, 0x4021, 0xFA10, 0xA202,
- 0x0462, 0x1408, 0x3491, 0xB000, 0xFFFF, 0x0810, 0x2680, 0xA300, 0x0462, 0xA200, 0x0460,
- 0x8F36, 0xBC23, 0x3041, 0xBC22, 0x3040, 0x6980, 0x3A73, 0xA204, 0x045B, 0xA21C, 0x045A,
- 0xFA52, 0x8F06, 0x21A3, 0x8F02, 0x387C, 0x201A, 0x8F07, 0x4000, 0x8D06, 0x21A3, 0x8F03,
- 0x387C, 0x219A, 0x8F00, 0x3801, 0xBC22, 0x3043, 0x8E00, 0xFA52, 0x2620, 0x8F17, 0xA202,
- 0x0465, 0x26A0, 0x8F12, 0xBC22, 0x2004, 0x8E00, 0xFA52, 0x26A0, 0x8F0C, 0xBC22, 0x303F,
- 0xA203, 0x045E, 0xFA52, 0x209A, 0x8F05, 0xBC22, 0x303E, 0xA203, 0x045D, 0xFA52, 0x211A,
- 0x8F00, 0x4000, 0xBC22, 0x3044, 0xA300, 0x0460, 0xFA50, 0xA202, 0x0463, 0x2680, 0x8F03,
- 0x4000, 0x8C42, 0xA300, 0x0461, 0xBC20, 0x2015, 0xBC23, 0x3048, 0xFA10, 0xFA73, 0x2003,
- 0x4000, 0x3860, 0x8F1A, 0xBC20, 0x2080, 0xBC24, 0x3046, 0xFA10, 0xFA94, 0x2184, 0x3803,
- 0x8F07, 0xBC20, 0x3047, 0xBC24, 0x2015, 0xFA10, 0xFA94, 0x2020, 0x3803, 0x8F08, 0xBC20,
- 0x2083, 0xBC24, 0x3045, 0xFA10, 0xFA94, 0x2004, 0x3803, 0x8F00, 0x3801, 0x2680, 0x8F02,
- 0xBC20, 0x304A, 0x8C05, 0xFA10, 0xBC20, 0x3049, 0x8E00, 0xFA10, 0xBC24, 0x304B, 0x0E10,
- 0xFA92, 0x2102, 0x8F04, 0xBC22, 0x304C, 0x8E00, 0xFA52, 0x2002, 0x1890, 0x33A0, 0x180B,
- 0xA300, 0x0461, 0xBC20, 0x3042, 0xA201, 0x0461, 0xA203, 0x0460, 0xB512, 0x0001, 0xFA10,
- 0xA302, 0x0463, 0x0059, 0x2600, 0x8F0A, 0x2601, 0x8F07, 0x2602, 0x4042, 0x8F02, 0x2603,
- 0x8C04, 0x1851, 0x8C02, 0x4001, 0x4021, 0xBC20, 0x200D, 0x8EC0, 0x8E00, 0xFB11, 0xBC20,
- 0x0375, 0xBC21, 0x0372, 0xBC22, 0x036A, 0xBC3C, 0x0376, 0x700E, 0xA0C1, 0x70CF, 0xA040,
- 0xBC23, 0x038F, 0xBC09, 0x1482, 0x2442, 0xE104, 0xBC26, 0x1180, 0x6A39, 0xA185, 0xBC21,
- 0xF2C0, 0x6A3A, 0x61C7, 0x6A3F, 0xA5A5, 0xE584, 0xE184, 0xE185, 0xBC21, 0x1CF0, 0x6A3A,
- 0x61C7, 0xBC21, 0x8620, 0x6A3E, 0x65A5, 0x88C0, 0x2442, 0x6A39, 0xA584, 0xBC21, 0x0840,
- 0x6A3A, 0x6184, 0x6A3F, 0xA185, 0xBC21, 0x0A40, 0x6A3A, 0x61C7, 0xBC21, 0x8620, 0x6A3E,
- 0x65A5, 0x88C0, 0x8E00, 0xE584, 0xE464, 0xBC23, 0x038F, 0xBC21, 0x0375, 0x8E00, 0xE4C0,
- 0x8EB8, 0x0000, 0xA202, 0x0372, 0xA203, 0x0395, 0x009A, 0xB214, 0x0014, 0x8F16, 0xB024,
- 0xFFEC, 0x5FC3, 0x04DA, 0x3B43, 0xA200, 0x0375, 0xBC3C, 0x0376, 0x433E, 0xBC23, 0x305B,
- 0x77F6, 0xAA18, 0x6910, 0xBA64, 0xE065, 0x8A05, 0xBBB0, 0xC81D, 0x4023, 0x8880, 0xA303,
- 0x0373, 0x8EC0, 0xA302, 0x0395, 0x8E00, 0xBC20, 0x03BA, 0xA203, 0x03B9, 0x6D20, 0xA00E,
- 0xB206, 0x0080, 0xE04F, 0xE14C, 0x8F36, 0x88B0, 0x40A4, 0xB226, 0x01B0, 0x40C5, 0x1925,
- 0x401C, 0xB226, 0x06C0, 0x7007, 0xA45C, 0x4083, 0x6607, 0x255E, 0xA205, 0x0396, 0xA202,
- 0x03BE, 0xA31C, 0x03B9, 0xA31C, 0x03BA, 0x2268, 0x8F03, 0x8E00, 0x8C03, 0xB034, 0xFFFF,
- 0x34D1, 0xA300, 0x0396, 0xA202, 0x03BD, 0xB236, 0x000A, 0x8F05, 0xB226, 0xFFF6, 0x3B83,
- 0x8F04, 0x4002, 0x401C, 0x8D02, 0x4022, 0x401C, 0x26A1, 0x8F00, 0x40A0, 0xA31C, 0x03BE,
- 0xA302, 0x03BD, 0x8C0D, 0xA300, 0x0397, 0x2421, 0xBC25, 0x1000, 0x28E5, 0x34D9, 0xA303,
- 0x03B9, 0xA30E, 0x03BA, 0xE44F, 0xE54C, 0xA200, 0x0397, 0x3048, 0xBC20, 0x7E7E, 0x8EC0,
- 0xBC82, 0x0000, 0x8E00, 0xBC22, 0x2131, 0xBC24, 0x00B2, 0x77F6, 0xBB54, 0xBC23, 0x2135,
- 0xBC22, 0x2136, 0x7087, 0xBA73, 0x6910, 0xFA52, 0xBCB2, 0xC000, 0xBCA2, 0x8000, 0xA200,
- 0x03A6, 0x3F1A, 0xBC22, 0x3060, 0xBC3C, 0x03A8, 0x6910, 0xBF10, 0xE902, 0xFA43, 0x6960,
- 0x3E18, 0x8A06, 0xBF8C, 0x8618, 0xBF8C, 0xA410, 0x2A42, 0xBC23, 0x03C4, 0x88D0, 0x6D26,
- 0xA19E, 0xBC27, 0x03C7, 0x6E62, 0xE15A, 0x6E7A, 0x5FC2, 0x6E72, 0x21DC, 0x88A0, 0x6D4E,
- 0xA38E, 0xA206, 0x03A5, 0xA300, 0x03A6, 0x6998, 0x23CF, 0xE24C, 0xDFE5, 0x8F03, 0x8E00,
- 0x8C16, 0xB06C, 0xFFFF, 0x88E0, 0x39FC, 0x39DE, 0x399A, 0x8880, 0xBC21, 0x2045, 0x2442,
- 0x7007, 0xBB30, 0xBC20, 0x2046, 0xBC21, 0x305A, 0x7009, 0xBB16, 0x7007, 0x3A30, 0x3B4C,
- 0x15B0, 0x240A, 0x4020, 0x28C8, 0xBC21, 0x03BF, 0xE7CF, 0xA30E, 0x03C7, 0xBCAA, 0x8000,
- 0xA306, 0x03A5, 0x690B, 0x60C6, 0x6E20, 0x664C, 0x6E7F, 0x2482, 0x6E77, 0xA0C7, 0x6E66,
- 0xA4C6, 0x6A3A, 0x0FC1, 0xBC20, 0x3068, 0x6915, 0x24CC, 0xA30E, 0x03C4, 0x6915, 0xE5CF,
- 0x6915, 0xBA01, 0x6A34, 0x7A02, 0x6A3C, 0xBA02, 0xBC40, 0x1205, 0x6A3E, 0xBA02, 0x6A3A,
- 0xBA16, 0xBC40, 0x1A03, 0x6A3A, 0x8FE0, 0x28DE, 0x88A0, 0xBC40, 0x1E05, 0xBC40, 0x1602,
- 0xBC23, 0x28BE, 0xA204, 0x03C3, 0xBCA4, 0xC000, 0xB038, 0x4000, 0x009A, 0xA302, 0x03C3,
- 0xBC23, 0x3244, 0xBCA4, 0xC000, 0xBC23, 0x2111, 0x8EC0, 0xE9FE, 0xFB72, 0xA200, 0x0398,
- 0x2457, 0xBC22, 0x306D, 0x77FE, 0xA441, 0xBC3C, 0x0399, 0x7067, 0xBA43, 0x6E73, 0xE800,
- 0x6915, 0x3C1C, 0x8A0A, 0xBB8C, 0x861C, 0xBB8C, 0xA413, 0x28DA, 0xA300, 0x0398, 0x8EC0,
- 0x8880, 0x8E00, 0xE902, 0xA203, 0x0372, 0x6CAC, 0x1FD5, 0x8F06, 0xBC20, 0x036A, 0xBC21,
- 0x213E, 0xBC0B, 0x15CB, 0xFA32, 0xE402, 0xBC02, 0x1445, 0xBC02, 0x148A, 0xA201, 0x0372,
- 0x41E3, 0xA202, 0x0373, 0x0459, 0x2621, 0xA301, 0x0372, 0x8F07, 0x26A2, 0x8F1A, 0xA200,
- 0x0374, 0xBC02, 0x1AEC, 0x4002, 0x8D16, 0x3820, 0xBC02, 0x14AE, 0x3820, 0xBC02, 0x1504,
- 0xA201, 0x03B8, 0x2610, 0x8F04, 0xB002, 0xFFFF, 0x4002, 0x8C08, 0xA300, 0x03B8, 0x3820,
- 0xBC02, 0x15A4, 0xA300, 0x0374, 0x4042, 0xCFD5, 0x8E00, 0x8EC0, 0xE9FE, 0xA302, 0x0373,
- 0x3E02, 0xBC20, 0x03E5, 0x3820, 0xE002, 0xE003, 0xE044, 0xE402, 0xE484, 0xE042, 0xE482,
- 0x7008, 0xA443, 0xA200, 0x03E4, 0x0C10, 0xA300, 0x03E4, 0x3E01, 0x8EB8, 0xBC20, 0x30BF,
- 0xA201, 0x0447, 0xFA10, 0x6852, 0x2902, 0xBC22, 0x30BB, 0xBC23, 0x30BD, 0x18D3, 0xA202,
- 0x0449, 0xFA64, 0x3491, 0x6835, 0x3A73, 0x8F65, 0xA202, 0x0448, 0x2153, 0x8F07, 0x3449,
- 0x3401, 0xA080, 0x4000, 0x4002, 0x8C5B, 0xA300, 0x0447, 0xBC20, 0x30C1, 0xA201, 0x03CF,
- 0xBC22, 0x30BA, 0x6114, 0x5FF5, 0x701F, 0x3A10, 0x4023, 0x6220, 0xDFDC, 0xB412, 0x0001,
- 0x2620, 0x8F04, 0x7000, 0x5FC1, 0xA301, 0x03CB, 0xA301, 0x03CC, 0xBC22, 0x30C0, 0xA201,
- 0x03D6, 0x3449, 0xFA52, 0x20CA, 0xA301, 0x03D6, 0x8F19, 0x4041, 0x0801, 0x2600, 0x8F13,
- 0x3E02, 0x4000, 0xA300, 0x0099, 0x3E01, 0xBC20, 0x2008, 0xBC21, 0xFF7F, 0xFA12, 0x0851,
- 0x7008, 0x3B11, 0xBC02, 0x05B3, 0x7010, 0x4FC0, 0x8C05, 0xA301, 0x009A, 0x8C02, 0x4060,
- 0xCFC0, 0x3302, 0x8F18, 0x3541, 0xBC21, 0x1111, 0x2829, 0x3200, 0x380E, 0x8F0D, 0x70F0,
- 0x4FF5, 0xBC22, 0x2042, 0xBC23, 0x2041, 0xBC24, 0xEEEF, 0xBC0D, 0x1681, 0xFB51, 0x6008,
- 0x3B70, 0x8C06, 0x4002, 0x8C04, 0x7000, 0x8FF5, 0x7000, 0x8FF5, 0xA302, 0x0448, 0x8EC0,
- 0xE9FE, 0xA302, 0x0449, 0xA200, 0x03CE, 0xB300, 0x6600, 0x4020, 0x3820, 0x8F00, 0xA200,
- 0x044A, 0x2681, 0xA300, 0x044A, 0x8F27, 0xA200, 0x03D2, 0x2600, 0xBC22, 0x2044, 0x4000,
- 0x1801, 0xFA53, 0x0118, 0xBC23, 0x2043, 0xFB54, 0xFA72, 0x0448, 0x0091, 0xA204, 0x03D5,
- 0xFB72, 0xB5C8, 0x0001, 0x0061, 0xA202, 0x044C, 0x004A, 0xBC23, 0x2042, 0xA204, 0x0448,
- 0xA300, 0x03D2, 0xBC22, 0x2041, 0xA205, 0x03CA, 0x0020, 0xFB71, 0xA300, 0x0448, 0xFB55,
- 0xBC00, 0x1612, 0x8EB8, 0xA201, 0x03D5, 0x3312, 0xA201, 0x03CE, 0x8F0A, 0xB312, 0x3F00,
- 0x8F07, 0xA202, 0x03D4, 0x224A, 0x8F04, 0x4001, 0x7008, 0x2441, 0xA300, 0x03D0, 0x8EB8,
- 0x2680, 0xA200, 0x03CF, 0x8F0A, 0xFA11, 0xB312, 0x0198, 0x8F05, 0xA201, 0x03D3, 0x1641,
- 0x40A2, 0x2E4A, 0x8F00, 0x3401, 0x3402, 0xBC21, 0x30BB, 0x2041, 0x8F04, 0x4000, 0xA300,
- 0x03D0, 0xBC20, 0x30B3, 0xA201, 0x03D0, 0x2611, 0x4001, 0x8F00, 0xFA11, 0xA300, 0x03CF,
- 0x8EC0, 0xB592, 0x0006, 0xA301, 0x03CE, 0x6EF5, 0x6080, 0xE906, 0x7007, 0x20C1, 0xA204,
- 0x03CE, 0x6313, 0x1F83, 0x65B0, 0x5FA2, 0x65C0, 0x1FE3, 0x7000, 0x9FC0, 0x4020, 0x4207,
- 0x5FE6, 0xBC23, 0xC6C0, 0xBC21, 0x6E40, 0x38A2, 0xBC0F, 0x1720, 0x2F68, 0x2F20, 0x8F00,
- 0x0D6B, 0x2FB0, 0x8F00, 0x0D69, 0x1785, 0x3491, 0x4044, 0x6815, 0x0FE4, 0x4147, 0x8FEE,
- 0x6E1D, 0x0FA2, 0xB036, 0xFFFB, 0x69A8, 0x5FE3, 0x8F08, 0xB42A, 0x0006, 0xBC23, 0x03FF,
- 0x0893, 0xA31C, 0x03D5, 0xDF62, 0xA302, 0x03D2, 0x7000, 0x8F83, 0xBC21, 0x7F80, 0x3882,
- 0xBD10, 0x174F, 0x2E90, 0x2F68, 0x2FB0, 0x8F0B, 0x26B1, 0x8F02, 0x09E9, 0x2670, 0x8F03,
- 0xBC26, 0x6E40, 0x0D6E, 0x8C03, 0x1785, 0x3521, 0x3491, 0x8E00, 0xCFA0, 0x2601, 0xBC20,
- 0x03FF, 0x8F27, 0xB41A, 0x0006, 0x0808, 0x2680, 0x8F01, 0x32C2, 0x8F00, 0x403C, 0x26B0,
- 0xDF7C, 0x8F12, 0xBC22, 0x30B3, 0x6E20, 0x8FC3, 0xBC21, 0x30BB, 0xBD04, 0x1772, 0xFA86,
- 0x6881, 0xBA86, 0x8F01, 0x2246, 0x8F03, 0x21E1, 0x1914, 0xA304, 0x03CF, 0x8E00, 0x8D0B,
- 0xCFC0, 0x6330, 0x8FE0, 0xA305, 0x03D4, 0xA304, 0x03D5, 0xBC02, 0x16C7, 0x8D01, 0xCFC3,
- 0x6EAF, 0x8F60, 0xA303, 0x03D3, 0x8EC0, 0xE9FA, 0xA305, 0x03D4, 0xB022, 0x3098, 0xA200,
- 0x03D2, 0x6980, 0x3A45, 0x8F26, 0x4343, 0x0519, 0x4003, 0xBC0C, 0x1799, 0xFA46, 0x0DAE,
- 0x2246, 0x8F01, 0x3882, 0x3803, 0x8E00, 0x2680, 0x8F18, 0x2610, 0x4046, 0x4022, 0x1996,
- 0x4205, 0x3290, 0x0569, 0xA306, 0x03D5, 0x8F02, 0x3250, 0x8F00, 0x14D5, 0xBC21, 0x30A9,
- 0x044C, 0x3210, 0x8F01, 0x1451, 0x00D9, 0xA201, 0x03D3, 0x0C4B, 0xA301, 0x03D3, 0x8EC0,
- 0xA300, 0x03D2, 0x8E00, 0xE904, 0xA201, 0x03CC, 0xA200, 0x03CD, 0x7000, 0x9F81, 0xB000,
- 0xFFFF, 0xA302, 0x03CE, 0x6984, 0x1FB5, 0x8F4C, 0x2680, 0x8F47, 0xA201, 0x03CF, 0x344A,
- 0xBC20, 0x30BB, 0x21C8, 0xBC20, 0x30B3, 0x1841, 0x6E18, 0x9FC1, 0xBC21, 0x03D7, 0xBC02,
- 0x1700, 0xA201, 0x03CF, 0x7000, 0x8FC0, 0xA204, 0x0444, 0x6882, 0x1FC1, 0x4023, 0x8F06,
- 0xB018, 0xFFFF, 0x6CC7, 0x9FC0, 0x6626, 0x9FE1, 0x8C20, 0xDF82, 0x3422, 0x6CE1, 0x1FE0,
- 0x181A, 0x2681, 0xA300, 0x03CB, 0x8F15, 0xBC20, 0x0444, 0x8A09, 0xE402, 0xFA31, 0xA21E,
- 0x03D3, 0xB592, 0x0006, 0xA302, 0x03D0, 0xA303, 0x03D1, 0xA302, 0x03D5, 0xA302, 0x03D2,
- 0xA301, 0x03CE, 0xA31E, 0x03CA, 0xBC02, 0x1690, 0xCFE2, 0xCFC1, 0xA302, 0x0444, 0xA301,
- 0x03CF, 0x8C26, 0x71A0, 0x0F85, 0x8C23, 0xCF85, 0x2600, 0x4681, 0x1848, 0x7008, 0x1FC1,
- 0x2C48, 0x401E, 0xBC21, 0x03D9, 0xBC20, 0x03D7, 0xA31E, 0x03CF, 0x1848, 0x3862, 0xBC02,
- 0x1700, 0xA202, 0x03CF, 0x6988, 0x0FC0, 0x4025, 0x8F09, 0x0885, 0x2620, 0x4006, 0x8F00,
- 0xBC02, 0x15FE, 0xA306, 0x0444, 0x8C02, 0x4680, 0xCF85, 0xCFB5, 0xA305, 0x03CC, 0x8EC0,
- 0xE9FC, 0xA300, 0x03CD, 0xE902, 0xA203, 0x03CD, 0xB036, 0xFFFF, 0x698C, 0x1FC3, 0xDFF5,
- 0xBC01, 0x190F, 0xA201, 0x03D1, 0x2690, 0xBC01, 0x1920, 0xB016, 0xFFE6, 0x4340, 0x2048,
- 0xBC01, 0x190A, 0xB306, 0x0019, 0xBC01, 0x18F4, 0xA201, 0x03D2, 0xB306, 0x0018, 0x8F7E,
- 0xB306, 0x0017, 0x8F4E, 0xCFC3, 0xB316, 0x0016, 0xBC01, 0x1920, 0xA203, 0x044B, 0x26B0,
- 0xBC01, 0x1920, 0x4023, 0x2610, 0xA303, 0x044B, 0x4002, 0x8F0F, 0xBC21, 0x03D7, 0xBC02,
- 0x1700, 0x2680, 0xA300, 0x03D2, 0x8F07, 0xA203, 0x0444, 0xA21E, 0x03D3, 0x34D9, 0xA31E,
- 0x03CA, 0xA303, 0x0444, 0xA203, 0x0444, 0xB236, 0x0080, 0x8F19, 0xA203, 0x0446, 0xB236,
- 0x0080, 0x7000, 0xCFC5, 0xBC21, 0x0444, 0x8F09, 0xA200, 0x0445, 0xB200, 0x0080, 0x8F12,
- 0x8A03, 0xE483, 0x3569, 0xBC02, 0x15FE, 0x8D0D, 0x8A03, 0xE483, 0xB05A, 0xFFFF, 0xBC02,
- 0x15FE, 0x8D06, 0x7000, 0xCFC5, 0xBC21, 0x0444, 0x8A03, 0xE483, 0xA200, 0x03D2, 0xDFC5,
- 0xBC02, 0x16DA, 0xBC02, 0x1690, 0x8D73, 0x2610, 0xBC21, 0x03D7, 0x8F24, 0xBC40, 0x1880,
- 0x4023, 0x2E03, 0xBC40, 0x1C80, 0x4002, 0x185A, 0xA200, 0x03D9, 0x2E03, 0x0001, 0xA300,
- 0x03D9, 0xBC21, 0x03D9, 0x441A, 0xBC02, 0x1700, 0x2680, 0xA300, 0x03D2, 0x8F0B, 0xA203,
- 0x0445, 0xA201, 0x03D3, 0x34D9, 0xA301, 0x03CA, 0xA31A, 0x044C, 0xA303, 0x0445, 0x8C04,
- 0x4003, 0x8C02, 0x4003, 0x4003, 0x8C47, 0xA303, 0x044B, 0x2610, 0xBC21, 0x03D9, 0x4002,
- 0x4023, 0x8F3D, 0xBC02, 0x1700, 0x2680, 0xA300, 0x03D2, 0x8F37, 0xA203, 0x0446, 0x441E,
- 0xA201, 0x03D3, 0x34D9, 0xA301, 0x03CA, 0xA31E, 0x044C, 0xA303, 0x0446, 0x8D2C, 0xA203,
- 0x03D4, 0x2630, 0xBC20, 0x03D2, 0x8F00, 0xBC02, 0x16C7, 0xA203, 0x03D2, 0x26B0, 0x8F1E,
- 0xA203, 0x0444, 0xA21E, 0x03D3, 0x34D9, 0xA31E, 0x03CA, 0xA303, 0x0444, 0x8D16, 0x4661,
- 0x044B, 0xBC02, 0x1787, 0x8D11, 0xA200, 0x03D7, 0x4010, 0x4023, 0xA300, 0x03CA, 0xA310,
- 0x03D1, 0xBC21, 0x03D7, 0x3843, 0xBC02, 0x1700, 0x4683, 0xA310, 0x044C, 0xDFC3, 0xCFF5,
- 0xCFC3, 0x8EC0, 0xE9FE, 0xA303, 0x03CD, 0xE902, 0x8E00, 0xDFD5, 0x3E02, 0xA200, 0x03E3,
- 0x7000, 0x5FE0, 0xA301, 0x03E3, 0x2600, 0x8F12, 0xA200, 0x03CB, 0x2680, 0x8F02, 0xA200,
- 0x03CC, 0x2600, 0x8F02, 0xA200, 0x03CD, 0x2681, 0x8F06, 0xBC20, 0x03E5, 0xBC21, 0x03D7,
- 0xBD04, 0x1945, 0xE002, 0xE482, 0x3E01, 0x8C0E, 0xCFE0, 0xA200, 0x03CB, 0x2601, 0x8F02,
- 0xBC02, 0x17B9, 0x8C04, 0xCFE0, 0xBC02, 0x183D, 0xCFE0, 0xB000, 0xFFFF, 0x69A0, 0x1FE0,
- 0x8FEF, 0xCFD5, 0x8E00, 0x8EC0, 0xE9FE, 0x8E00, 0xBC20, 0x2048, 0x8E00, 0xFA10, 0x2600,
- 0x8F06, 0xBC20, 0x2043, 0xBC22, 0x2044, 0x4001, 0x8EC0, 0xFB11, 0xFB51, 0x8EB8, 0xA201,
- 0x03E1, 0xBC22, 0x3079, 0xFA20, 0xB030, 0xFFD8, 0xB302, 0x308C, 0xA303, 0x03EE, 0x8EC0,
- 0x1851, 0xA301, 0x03E1, 0xA203, 0x03E3, 0x34D9, 0xA200, 0x03FD, 0x5FFA, 0xBC3C, 0x03FA,
- 0x407E, 0xA303, 0x03E3, 0x7009, 0x2461, 0x6CE4, 0x3C1E, 0x4003, 0xA205, 0x03E4, 0x19E3,
- 0x0C95, 0x2131, 0x6555, 0x2042, 0x1863, 0xA300, 0x03FD, 0x33A0, 0xB05A, 0x03E6, 0x1823,
- 0x637E, 0x22C0, 0x2E04, 0xB5FE, 0x0005, 0x01C7, 0x6678, 0xE6A7, 0x684C, 0xA2C2, 0x18E3,
- 0x0C0B, 0x2E94, 0x8EC0, 0x0097, 0xE6C2, 0xA200, 0x03DB, 0xBC3C, 0x03DC, 0x409E, 0x405A,
- 0xBC22, 0x03EA, 0x77FE, 0xAA18, 0xE05F, 0xBC23, 0x308C, 0xE51F, 0xBD03, 0x19C3, 0x6910,
- 0xBC1C, 0xFA65, 0x8A03, 0xBBB0, 0xCA1C, 0x28EC, 0x88C0, 0x8E00, 0xE504, 0x8EC0, 0xEA18,
- 0xA300, 0x03DB, 0xBC26, 0x03E2, 0xA202, 0x03E9, 0xE343, 0x698C, 0x2902, 0xA203, 0x03E0,
- 0xBC01, 0x1A6F, 0xA204, 0x03F6, 0x69B0, 0x5FD5, 0x3883, 0x8F02, 0x4004, 0xA304, 0x03F6,
- 0x3342, 0x8F68, 0xBC26, 0x03F7, 0x602D, 0x215F, 0x26C0, 0xE55F, 0x8F61, 0x6E11, 0xBCC5,
- 0x6CF4, 0x2341, 0x4004, 0x4026, 0x19B4, 0x3210, 0x8F00, 0x35B1, 0xBC40, 0x1102, 0x3220,
- 0x8F00, 0x35B1, 0x2663, 0xA207, 0x03F1, 0x8F01, 0x26E0, 0x8F09, 0x2435, 0x2429, 0x2412,
- 0x20B5, 0x8F00, 0x35F9, 0x2095, 0x8F00, 0xB07E, 0xFFFF, 0xA202, 0x03F2, 0x3551, 0xB20A,
- 0x004C, 0x3844, 0x8F0B, 0xB23E, 0x0008, 0x38A7, 0x4024, 0x38E2, 0x8F05, 0x38E5, 0x3378,
- 0x3882, 0x8F01, 0x5FE4, 0x38E2, 0x38A2, 0x00E3, 0xA305, 0x03F2, 0xA307, 0x03F1, 0xDFE3,
- 0xBC02, 0x197C, 0xA203, 0x03F5, 0xA202, 0x03F3, 0x6056, 0x0FE4, 0x3491, 0xB438, 0x0001,
- 0xA305, 0x03F5, 0xB204, 0x0208, 0x8F14, 0xA202, 0x03F5, 0xA205, 0x03F4, 0xB524, 0x0001,
- 0x20AA, 0x401D, 0x8F06, 0xA202, 0x03E4, 0x4024, 0x0C94, 0x3883, 0xA302, 0x03E4, 0x4643,
- 0xA31D, 0x03F5, 0xA31D, 0x03F4, 0x4002, 0xA303, 0x03EF, 0xA302, 0x03F3, 0xA202, 0x03EF,
- 0x2222, 0x8F09, 0x3491, 0x2262, 0x8F11, 0xA202, 0x03E9, 0x8E00, 0xE142, 0xA302, 0x03F0,
- 0x8D0C, 0xA201, 0x03F0, 0x7008, 0x9FE4, 0xBC02, 0x197C, 0xA202, 0x03F4, 0x6024, 0x0FE4,
- 0xA302, 0x03F4, 0xB008, 0xFFFF, 0x69A0, 0x0FD5, 0x8F79, 0x700F, 0xDFD5, 0xBC02, 0x196D,
- 0xA31F, 0x03F6, 0xCFD5, 0x8D73, 0x7766, 0xE145, 0xA202, 0x03F0, 0x3822, 0xBC3D, 0x03F1,
- 0x453F, 0xA204, 0x0442, 0x69AC, 0x64E5, 0x6E28, 0x6A38, 0x8F02, 0xA207, 0x03EE, 0x26F0,
- 0x8F15, 0xE142, 0xE2C5, 0x6175, 0x60C2, 0x615A, 0xA242, 0x243F, 0x242D, 0x017D, 0xB05A,
- 0x0008, 0xB4DA, 0x0004, 0x356A, 0xB4DA, 0x0002, 0x016A, 0x206A, 0x5FE2, 0x1955, 0x8C02,
- 0xE605, 0x5FE2, 0xB006, 0xFFFF, 0x2680, 0x8F3F, 0xA203, 0x0443, 0x34D9, 0xA303, 0x0443,
- 0xB236, 0x00F0, 0x8F08, 0xDFC1, 0xDFF5, 0xBC24, 0x041A, 0xBC02, 0x196D, 0xCFF5, 0x8C31,
- 0xCFC1, 0xBC24, 0x041A, 0x4003, 0x6E38, 0xE200, 0x4005, 0xA071, 0xC000, 0xBD27, 0x1ABA,
- 0x6659, 0x6200, 0xA071, 0xC000, 0x1965, 0xA207, 0x03EE, 0xB0DA, 0x041A, 0x003D, 0xB450,
- 0x0001, 0xA305, 0x03EF, 0x26D0, 0x4685, 0x4667, 0x405F, 0x19EF, 0xE71F, 0xA307, 0x03CD,
- 0xBC25, 0x03F0, 0x8A06, 0xE703, 0x8A0A, 0xE683, 0x8A03, 0xE682, 0xBC3F, 0x03FA, 0xA303,
- 0x03CC, 0xA31F, 0x03FD, 0xA303, 0x03CB, 0xA304, 0x0442, 0xA301, 0x03F0, 0xE9FE, 0xA300,
- 0x03E0, 0xA202, 0x03E9, 0x8EC0, 0x3491, 0xA302, 0x03E9, 0x0000, 0xE902, 0xA201, 0x03DB,
- 0xDFD5, 0x6960, 0x24C0, 0xBC02, 0x19AA, 0xBC20, 0x03EA, 0xA300, 0x03E9, 0xBD04, 0x1AFD,
- 0xBC02, 0x19C8, 0x8E00, 0x8E00, 0xCFD5, 0x8E00, 0x8EC0, 0xE9FE, 0x8E00, 0xE902, 0xA200,
- 0x0466, 0x6980, 0x1FC0, 0xBC01, 0x1BB4, 0xB310, 0x00FF, 0xBC01, 0x1BBA, 0xA201, 0x0468,
- 0xA202, 0x0467, 0xB034, 0xFFFF, 0x3310, 0xBC20, 0x0450, 0xBC01, 0x1BAA, 0x3880, 0x4021,
- 0xE20E, 0xE24F, 0xBC24, 0x3002, 0x88D8, 0xFA94, 0xBCDB, 0x0000, 0xBC24, 0x3009, 0x2435,
- 0xFA94, 0x2134, 0x4004, 0x19CC, 0xA307, 0x0465, 0xBC27, 0x3013, 0xA305, 0x0464, 0xFAF7,
- 0x21B7, 0x198C, 0x26E0, 0x8F04, 0xBC26, 0x2004, 0x8E00, 0xFAD6, 0x2660, 0x8F03, 0xA206,
- 0x046A, 0x35B1, 0xA306, 0x046A, 0xBC27, 0x3011, 0xA206, 0x0469, 0x35B1, 0xFAF7, 0x2037,
- 0xA306, 0x0469, 0x8F0F, 0xBC26, 0x3012, 0xA207, 0x046A, 0xFAD6, 0x21BE, 0x8F03, 0x8E00,
- 0x8C04, 0xA304, 0x046B, 0xA301, 0x046B, 0xA304, 0x046A, 0xA304, 0x0469, 0xBC26, 0x300A,
- 0x8E00, 0xFAD6, 0x212E, 0x0526, 0x19B5, 0x202C, 0xBC25, 0x2017, 0x1926, 0x6CA8, 0x3AB2,
- 0xBC25, 0x3006, 0x8F02, 0xA303, 0x0467, 0xBC25, 0x3003, 0xBC23, 0x300C, 0x8E00, 0xFA73,
- 0x2013, 0x8F13, 0xBC26, 0x300D, 0x34E9, 0xFAD6, 0x2016, 0x8F0C, 0xBC26, 0x300E, 0x8E00,
- 0xFAD6, 0x2016, 0x8F05, 0xBC26, 0x300F, 0x8E00, 0xFAD6, 0x2016, 0x8C02, 0x18DD, 0x34EA,
- 0x38A3, 0x2442, 0xFAB2, 0x28E2, 0x88A0, 0xBC23, 0x300B, 0xB524, 0x0006, 0xFA73, 0xB424,
- 0x0006, 0x32B0, 0x8F01, 0x4003, 0x049A, 0xBC23, 0x2020, 0xB524, 0x0001, 0xFA73, 0x0859,
- 0x2690, 0xBC23, 0x2003, 0x8F02, 0x4001, 0x8C0C, 0xFB71, 0x3451, 0x8C09, 0x7000, 0x7B71,
- 0xB012, 0xFFFF, 0xA301, 0x0468, 0xA303, 0x0467, 0x4001, 0xE401, 0xE441, 0x8D06, 0xBC20,
- 0x2003, 0x5FC1, 0xFA12, 0x0851, 0xFB11, 0xCFC0, 0x3401, 0xE9FE, 0xBC21, 0x00FF, 0x8EC0,
- 0x0801, 0xA300, 0x0466, 0xE904, 0xBC21, 0x2016, 0x6E05, 0x1FD5, 0xB000, 0xFFFD, 0xBC22,
- 0x3000, 0xFA31, 0x7000, 0x6441, 0xFA52, 0xBC23, 0x044D, 0xBC24, 0x044F, 0xBC02, 0x1E36,
- 0xA200, 0x044F, 0x7003, 0x0FD5, 0xBC22, 0x4444, 0x6915, 0xE9FC, 0x2456, 0x28C2, 0xBC20,
- 0x3001, 0x8890, 0xBC22, 0x0450, 0x6910, 0xBA10, 0x28C8, 0x6E00, 0xBC41, 0x88B4, 0x7101,
- 0x2145, 0x24A9, 0x28DC, 0x2444, 0x8EC0, 0xE54F, 0xE44E, 0xBC21, 0x3033, 0xBC22, 0x201E,
- 0xB580, 0x0001, 0xFA31, 0x4043, 0xFA54, 0x0923, 0xB012, 0xFFFF, 0x2220, 0x8F01, 0x3310,
- 0x8FF7, 0x8EB8, 0xA200, 0x0470, 0x3280, 0xBC21, 0x0477, 0xBC22, 0x0474, 0x184A, 0xA202,
- 0x046D, 0xBC40, 0x1083, 0x6CE8, 0xE084, 0x66B7, 0x20C1, 0x8F04, 0xB044, 0x3014, 0x8E00,
- 0xFA94, 0x211C, 0x8F0B, 0x32A0, 0xB044, 0xFFFF, 0x8F07, 0xB058, 0x3017, 0x8E00, 0xFAB5,
- 0x219D, 0x8F02, 0x3844, 0x8D01, 0x3491, 0xB034, 0x301A, 0xA302, 0x046D, 0xFA73, 0xBC22,
- 0x3023, 0x1A59, 0x2419, 0xFA52, 0x211A, 0x8F05, 0x3300, 0x8F02, 0xBC20, 0x301F, 0x8C05,
- 0xFA10, 0xBC20, 0x301E, 0x8E00, 0xFA10, 0x4202, 0x0490, 0xA203, 0x0473, 0x2442, 0x28DA,
- 0x28C8, 0x8884, 0xBC21, 0x0200, 0xBC90, 0x4000, 0xBC22, 0x0800, 0xBC80, 0x8000, 0xBC22,
- 0x3024, 0x2690, 0x4004, 0xA203, 0x0454, 0x1820, 0xFA52, 0x0E4B, 0x210A, 0xA300, 0x0473,
- 0x8F04, 0xBC20, 0x3025, 0x8E00, 0xFA10, 0x2008, 0x1881, 0x8EC0, 0xA302, 0x0454, 0x8E00,
- 0xBC20, 0x200F, 0xA201, 0x046E, 0xFA10, 0x2680, 0x8F00, 0x3449, 0x2682, 0x4000, 0x8F00,
- 0xB012, 0xFFFF, 0x3210, 0x8F02, 0x3317, 0x40E0, 0x1801, 0x8EC0, 0xA300, 0x046E, 0x8E00,
- 0xBC20, 0x3031, 0xBC21, 0x2000, 0xFA12, 0x0811, 0x2241, 0xA200, 0x046E, 0x8F03, 0x4E00,
- 0x0810, 0xB400, 0x0004, 0xB010, 0x3026, 0xA203, 0x0454, 0xFA31, 0xBC24, 0x1000, 0x0994,
- 0x1AD9, 0x2274, 0x34D9, 0x4025, 0x111D, 0x8F01, 0x41E3, 0x0913, 0x4002, 0x3240, 0x3862,
- 0x8F02, 0x4103, 0x2123, 0x18DC, 0xB5C6, 0x0001, 0xBC26, 0x302E, 0x0E4C, 0x6980, 0x3AD6,
- 0xBC24, 0x200B, 0xB5F0, 0x0004, 0xA303, 0x046F, 0x1895, 0x0E4E, 0xA300, 0x046E, 0x00FB,
- 0x6988, 0x3B91, 0x8F01, 0x2681, 0x8F00, 0x4002, 0x2620, 0x8F01, 0x2682, 0x8F00, 0x4002,
- 0x2620, 0x8F01, 0x2683, 0x8F00, 0x4002, 0x2620, 0x8F40, 0x2604, 0x8F3E, 0x2620, 0x8F01,
- 0x2685, 0x8F00, 0x4002, 0x2620, 0x8F33, 0x2606, 0x8F31, 0x2620, 0x8F01, 0x2687, 0x8F33,
- 0xBC20, 0x2005, 0xBC21, 0x0200, 0xFA10, 0x0801, 0x2680, 0x8F20, 0xA200, 0x0452, 0x2602,
- 0x8F11, 0x2603, 0x8F03, 0x4060, 0x8C25, 0xA300, 0x0452, 0xBC20, 0x3036, 0xBC21, 0x2081,
- 0xFA10, 0xFA31, 0x2088, 0x4040, 0x8F18, 0xA300, 0x0452, 0x8D17, 0xBC20, 0x3037, 0xBC21,
- 0x2081, 0xFA10, 0xFA31, 0x2188, 0x4060, 0x8F0C, 0xA300, 0x0452, 0x8D0B, 0x4060, 0xA300,
- 0x0452, 0x8D07, 0x4020, 0x8C05, 0xA300, 0x0452, 0x4000, 0xA300, 0x0452, 0xA200, 0x0452,
- 0xB000, 0x3039, 0xBC21, 0x2006, 0xFA10, 0x8EC0, 0x0003, 0xFB30, 0xA200, 0x0474, 0xA201,
- 0x0453, 0xB500, 0x0007, 0xBC22, 0x302F, 0x1AC8, 0x241B, 0xFA52, 0x211A, 0x8F02, 0xBC22,
- 0x3021, 0x8C05, 0xFA52, 0xBC22, 0x3020, 0x8E00, 0xFA52, 0xA204, 0x046C, 0xBC23, 0x8000,
- 0x04DA, 0x3340, 0x2457, 0x2456, 0x8F04, 0x2454, 0x28CB, 0x28C2, 0x8C03, 0x8880, 0xA30E,
- 0x046C, 0xBC21, 0x3030, 0xBC22, 0x3032, 0xA300, 0x0453, 0xFA31, 0xFA52, 0xBC23, 0x1000,
- 0x0913, 0x1A08, 0xBC25, 0x0400, 0x2263, 0xBC81, 0x4000, 0x8F01, 0xBC20, 0x0FFF, 0x0810,
- 0xBC21, 0x200C, 0x8EC0, 0x8E00, 0xFB30, 0x0000, 0xBC20, 0x3022, 0xBC21, 0x3038, 0x7017,
- 0xBA10, 0x700C, 0x3A31, 0xA310, 0x046C, 0xA31E, 0x0470, 0xA300, 0x0454, 0xA301, 0x0452,
- 0x6EE5, 0x6800, 0xBD0F, 0x1D81, 0xBC20, 0x3034, 0xBC21, 0x2005, 0xFA10, 0xB000, 0x0301,
- 0x7008, 0x3B30, 0xBC02, 0x1BF3, 0xBC02, 0x1C65, 0xBC02, 0x1C7B, 0xBC20, 0x3034, 0xBC21,
- 0x2005, 0xFA10, 0xB000, 0x0201, 0x7000, 0x3B30, 0xBC02, 0x1BF3, 0x8E00, 0x8E00, 0xBC20,
- 0x3034, 0xBC21, 0x2005, 0xFA10, 0xB000, 0x0301, 0x7008, 0x3B30, 0xBC02, 0x1BF3, 0xBC02,
- 0x1C65, 0xBC02, 0x1C7B, 0xA201, 0x046E, 0xBC20, 0x3034, 0xB012, 0x3026, 0x6EAF, 0x3A10,
- 0xBC22, 0x3035, 0xBC23, 0x2005, 0xFA31, 0xB000, 0x0201, 0xFA52, 0xA301, 0x0454, 0xFB70,
- 0xBC24, 0x2009, 0x8EC0, 0x7008, 0x3B72, 0xFB90, 0xE902, 0xA200, 0x0470, 0x6CC0, 0x1FD5,
- 0x8F34, 0xA200, 0x0472, 0xA201, 0x0471, 0x2680, 0x8F0F, 0xB312, 0x007F, 0xBC20, 0x3035,
- 0x8F07, 0xFA10, 0xB000, 0x0101, 0xBC21, 0x2005, 0x8C03, 0x7008, 0x3B30, 0x4020, 0x8C1E,
- 0xA300, 0x0472, 0xB232, 0x007F, 0x4000, 0x8F00, 0x3409, 0x3300, 0xA300, 0x0471, 0x8F0A,
- 0xBC02, 0x1C65, 0xBC02, 0x1C7B, 0xBC20, 0x3035, 0xBC21, 0x2005, 0xFA10, 0x8C07, 0x7000,
- 0x3B30, 0xBC02, 0x1C04, 0xBC02, 0x1C7B, 0x4000, 0xA300, 0x0472, 0xBC02, 0x1D12, 0x8D13,
- 0xBC02, 0x1C04, 0xBC02, 0x1C7B, 0xA200, 0x0470, 0xB000, 0xFFFF, 0xA201, 0x0471, 0xA300,
- 0x0470, 0xB232, 0x007F, 0x4000, 0x8F00, 0x3409, 0xA300, 0x0471, 0x7008, 0x4FD5, 0xBC20,
- 0x2009, 0x8EC0, 0xE9FE, 0xFB11, 0xBC21, 0x2010, 0xE908, 0xBC20, 0x200E, 0xFA31, 0xFA12,
- 0xBC24, 0x7F00, 0x6E1D, 0x1F95, 0xB036, 0xFFF9, 0x0894, 0xB444, 0x0008, 0x6E10, 0xE581,
- 0xFA10, 0x73F8, 0x65C4, 0x0801, 0xBC21, 0x0474, 0xBC40, 0x1500, 0xDFA1, 0xBD03, 0x1E2E,
- 0xE0DC, 0xE101, 0xDFC2, 0xDFFC, 0xBC02, 0x1E46, 0xCFE1, 0x63A0, 0x4FA1, 0x6D34, 0x4FC2,
- 0x6E20, 0x6480, 0xB406, 0x0001, 0xBC40, 0x1E00, 0xDFA1, 0x7000, 0x0F95, 0xBC21, 0x2009,
- 0x8EC0, 0xE9F8, 0xFB30, 0xE040, 0x6C00, 0x6246, 0x6E08, 0xE185, 0x6681, 0xA1C6, 0x24B5,
- 0x28C2, 0x2444, 0x8E00, 0xE5CF, 0x88B8, 0x8EC0, 0xE4CE, 0xE643, 0x3291, 0x8F0C, 0x24C1,
- 0x1448, 0x41A2, 0x2442, 0x4403, 0x0410, 0x28CB, 0xB580, 0x0004, 0x8890, 0x8EC0, 0x0001,
- 0x8E00, 0x8EC0, 0x4000, 0x8E00, 0xBC20, 0x2092, 0x4041, 0xFA10, 0xBC22, 0x2093, 0x0841,
- 0x6984, 0xBA51, 0x8F0F, 0x4022, 0x0802, 0x2681, 0x8F17, 0xBC20, 0x2000, 0x21C8, 0xBC20,
- 0x2095, 0x8F02, 0x8EC0, 0xE0C1, 0xFB11, 0xFA31, 0xFB11, 0x8EB8, 0xBC20, 0x2094, 0xBC22,
- 0x2000, 0x6872, 0xBA10, 0x8F02, 0x8EC0, 0xE4C0, 0x8E00, 0x8EC0, 0xFB30, 0x8E00, 0x8EB8,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000
-};
-#endif
-
-const unsigned short bin_patch_E1[] = {
- 0x2000, 0x21FF, 0xBC24, 0x20A0, 0x8E00, 0xFA95, 0xB30A, 0x06AF, 0x8F2E, 0xB30A, 0x08E5,
- 0x8F07, 0xBC25, 0x08E5, 0xFB95, 0xBC22, 0x399E, 0xBC23, 0x199E, 0xBC00, 0x0841, 0xBC25,
- 0x06AF, 0xFB95, 0x5400, 0xBC21, 0xD0B1, 0xBC02, 0x07CA, 0x5500, 0xBC21, 0x07C2, 0xBC02,
- 0x07CA, 0x40A0, 0xBC21, 0x0359, 0xBC02, 0x07CA, 0x41A0, 0xBC21, 0x00A0, 0xBC02, 0x07CA,
- 0x41C0, 0xBC21, 0x4208, 0xBC02, 0x07CA, 0x4380, 0xBC21, 0x2800, 0xBC02, 0x07CA, 0x4E04,
- 0xBC00, 0x08E6, 0x4344, 0xBC25, 0x0400, 0x2620, 0x8F06, 0xBC02, 0x07F0, 0x5404, 0x4025,
- 0xBC02, 0x07FB, 0xBC00, 0x06C1, 0xBC02, 0x07FB, 0x5404, 0x4025, 0xBC02, 0x07F0, 0xBC00,
- 0x06C1, 0xBDC8, 0x404E, 0x8E00, 0xFA11, 0xBC00, 0x0630, 0x8E00, 0x8E00, 0x8E00, 0xBC21,
- 0x0002, 0xBC20, 0x2008, 0xBC00, 0x01BB, 0xBC21, 0x033F, 0xA202, 0x0083, 0xFB11, 0x8EA2,
- 0xBC20, 0x2008, 0x7010, 0x4FF5, 0xBC22, 0x201A, 0xBC00, 0x0161, 0x4044, 0xBC25, 0x1000,
- 0xBC02, 0x07F0, 0x4E24, 0xBC00, 0x0705, 0xBC22, 0x399E, 0xBC23, 0x199E, 0xBC00, 0x078A,
- 0xBC24, 0x2080, 0x6C88, 0x3A10, 0xFA94, 0xB548, 0x0005, 0xBC00, 0x0E9F, 0xE902, 0xBC26,
- 0x2023, 0xDFE4, 0xBC24, 0x2000, 0xFAD6, 0x0934, 0x26C0, 0x8F01, 0xBC26, 0x3056, 0x8D02,
- 0xBC26, 0x31F9, 0xCFE4, 0xE9FE, 0xBC00, 0x0FED, 0xBC20, 0x2090, 0xBC21, 0x0100, 0xFA12,
- 0xE902, 0x0851, 0x6984, 0x1FD5, 0x8F37, 0x8E00, 0x8D03, 0x8E00, 0xBC20, 0x2090, 0xBC21,
- 0x8000, 0xFA10, 0x0801, 0x2600, 0x8FF5, 0xBC20, 0x2090, 0xBC21, 0x2091, 0x714F, 0xBA10,
- 0xBC22, 0x666D, 0x7028, 0xBB32, 0x71F8, 0xBB32, 0xA203, 0x0457, 0x0802, 0xA204, 0x0458,
- 0x6980, 0x3B33, 0xFB34, 0xBC22, 0x2545, 0xA31E, 0x0459, 0xFB32, 0x8F0C, 0x2601, 0x4FE1,
- 0x8F0D, 0x2602, 0xBC21, 0x0380, 0x8F09, 0x2683, 0x4001, 0x8F05, 0xBC02, 0x40E7, 0x8D04,
- 0xBC21, 0x03FF, 0xA301, 0x0456, 0xA301, 0x0455, 0xA200, 0x0458, 0xA201, 0x0457, 0x260F,
- 0x8F02, 0x8E00, 0x8C03, 0x3401, 0x3449, 0x4000, 0xCFD5, 0xA300, 0x0458, 0x8EC0, 0xE9FE,
- 0xA301, 0x0457, 0xBC22, 0x3105, 0xA200, 0x0313, 0x77DE, 0xBA52, 0x3BC2, 0xBC22, 0x2091,
- 0xBC3C, 0x02E0, 0xBC23, 0x666D, 0x7000, 0xFB53, 0x700E, 0xAA18, 0xBC24, 0x0B12, 0xFB54,
- 0x6D36, 0x7C1C, 0x6C8D, 0x7B54, 0x8FF9, 0xA203, 0x0355, 0xFB53, 0xA203, 0x035A, 0xFB53,
- 0xA203, 0x0464, 0xBC24, 0x2004, 0xFB53, 0xFA94, 0xA203, 0x047F, 0xFB54, 0xFB53, 0xA204,
- 0x0480, 0xFB54, 0xA203, 0x0481, 0xFB53, 0xA204, 0x0361, 0xA203, 0x0362, 0xFB54, 0xFB53,
- 0xBC23, 0x5A5A, 0xFB53, 0x8EC0, 0xBC23, 0x2545, 0xFB53, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000
-};
-
-const unsigned short bin_patch_E2[] = {
- 0x2000, 0x21FF, 0x8E00, 0x8E00, 0x8E00, 0xBC21, 0x0002, 0xBC20, 0x2008, 0xBC00, 0x01A9,
- 0xBC21, 0x033F, 0xA202, 0x0083, 0xFB11, 0x8EA2, 0xBC20, 0x2008, 0x7010, 0x4FF5, 0xBC22,
- 0x201A, 0xBC00, 0x014F, 0x240C, 0xA301, 0x047F, 0xA30F, 0x0480, 0xA30E, 0x0481, 0xBC00,
- 0x1353, 0x5380, 0xBC21, 0xAC40, 0xBC02, 0x07EA, 0x4380, 0xBC21, 0x2C00, 0xBC02, 0x07EA,
- 0x43A0, 0xBC21, 0xFB40, 0xBC02, 0x07EA, 0x43C0, 0xBC21, 0x0546, 0xBC02, 0x07EA, 0x43E0,
- 0xBC21, 0xFB3C, 0xBC02, 0x07EA, 0x4400, 0xBC21, 0x0537, 0xBC02, 0x07EA, 0x4E04, 0xBC00,
- 0x092A, 0x4025, 0xBC21, 0x2023, 0xBC22, 0x0400, 0xFA31, 0x084A, 0x2610, 0x8F01, 0xBC02,
- 0x081B, 0x8D02, 0xBC02, 0x0810, 0x4E24, 0xBC00, 0x0722, 0x4280, 0xBC02, 0x07EA, 0xBC22,
- 0x8018, 0xBC23, 0x8098, 0xCFE0, 0x2600, 0x1853, 0x42C0, 0xBC02, 0x07EA, 0x4240, 0xBC21,
- 0xE400, 0xBC02, 0x07EA, 0x4260, 0xBC21, 0x0010, 0xBC02, 0x07EA, 0x4040, 0xBC21, 0x0FFB,
- 0xBC02, 0x07EA, 0x4220, 0xBC21, 0x2020, 0xBC02, 0x07EA, 0xBC20, 0x0005, 0x4461, 0xBC02,
- 0x07F8, 0x4220, 0xBC21, 0x1020, 0xBC02, 0x07EA, 0xBC20, 0x0005, 0x4461, 0xBC02, 0x07F8,
- 0x4220, 0xBC21, 0x4020, 0xBC02, 0x07EA, 0xBC20, 0x0064, 0x4461, 0xBC02, 0x07F8, 0x4240,
- 0xBC21, 0xE407, 0xBC02, 0x07EA, 0x4260, 0xBC21, 0x7010, 0xBC02, 0x07EA, 0xBC20, 0x0064,
- 0x4461, 0xBC02, 0x07F8, 0x4520, 0xBC21, 0x8001, 0xBC02, 0x07EA, 0xBC00, 0x0794, 0xBC20,
- 0x2090, 0xBC21, 0x0100, 0xFA12, 0xE902, 0x0851, 0x6984, 0x1FD5, 0x8F37, 0x8E00, 0x8D03,
- 0x8E00, 0xBC20, 0x2090, 0xBC21, 0x8000, 0xFA10, 0x0801, 0x2600, 0x8FF5, 0xBC20, 0x2090,
- 0xBC21, 0x2091, 0x714F, 0xBA10, 0xBC22, 0x666D, 0x7028, 0xBB32, 0x71F8, 0xBB32, 0xA203,
- 0x045B, 0x0802, 0xA204, 0x045C, 0x6980, 0x3B33, 0xFB34, 0xBC22, 0x2545, 0xA31E, 0x045D,
- 0xFB32, 0x8F0C, 0x2601, 0x4FE1, 0x8F0D, 0x2602, 0xBC21, 0x0380, 0x8F09, 0x2683, 0x4001,
- 0x8F05, 0xBC02, 0x40F6, 0x8D04, 0xBC21, 0x03FF, 0xA301, 0x045A, 0xA301, 0x0459, 0xA200,
- 0x045C, 0xA201, 0x045B, 0x260F, 0x8F02, 0x8E00, 0x8C03, 0x3401, 0x3449, 0x4000, 0xCFD5,
- 0xA300, 0x045C, 0x8EC0, 0xE9FE, 0xA301, 0x045B, 0xBC22, 0x3105, 0xA200, 0x0314, 0x77DE,
- 0xBA52, 0x3BC2, 0xBC22, 0x2091, 0xBC3C, 0x02E1, 0xBC23, 0x666D, 0x7000, 0xFB53, 0x700E,
- 0xAA18, 0xBC24, 0x0B12, 0xFB54, 0x6D36, 0x7C1C, 0x6C8D, 0x7B54, 0x8FF9, 0xA203, 0x0356,
- 0xFB53, 0xA203, 0x035D, 0xFB53, 0xA203, 0x0468, 0xBC24, 0x2004, 0xFB53, 0xFA94, 0xA203,
- 0x0483, 0xFB54, 0xFB53, 0xA204, 0x0484, 0xFB54, 0xA203, 0x0485, 0xFB53, 0xA204, 0x0364,
- 0xA203, 0x0365, 0xFB54, 0xFB53, 0xBC23, 0x5A5A, 0xFB53, 0x8EC0, 0xBC23, 0x2545, 0xFB53,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000
-};
-
-const unsigned short bin_coeff_E1[] = {
- 0x0000, 0x01FF, 0x0400, 0x0006, 0x2AAB, 0x0324, 0x0324, 0x0324, 0x010C, 0x010C, 0x010C,
- 0x1111, 0x1259, 0x0001, 0x005A, 0x0E9B, 0x0FFF, 0x0FFF, 0x0008, 0x0001, 0x0001, 0x0CCD,
- 0xFFE0, 0xFFD8, 0x00FF, 0xFFAC, 0xFFBC, 0xFF00, 0x0020, 0x0048, 0x0050, 0x0050, 0x000E,
- 0x0002, 0x7000, 0x0800, 0xFFF8, 0x0008, 0x002B, 0xFFF6, 0xFFF8, 0xFFFE, 0x0003, 0x0008,
- 0x000D, 0x000F, 0x0014, 0x0019, 0x0000, 0x0800, 0x6580, 0x0000, 0x0000, 0x7FFF, 0x0008,
- 0x0078, 0xFEF5, 0xFEE8, 0x0003, 0x0080, 0x0080, 0x0080, 0x0300, 0x0006, 0xC080, 0xF000,
- 0x0660, 0xDA80, 0x0000, 0x0001, 0x0001, 0xFFE4, 0xFFE8, 0x0080, 0x0034, 0x0001, 0xFFFF,
- 0x0001, 0xFFFE, 0x3AC0, 0x3340, 0x2BC0, 0x07C0, 0x05C0, 0x03E0, 0x0008, 0x1000, 0x2000,
- 0xFF01, 0xFFE5, 0xFFE9, 0x0DA8, 0x000E, 0xF75E, 0x1136, 0xEC7B, 0x0D3C, 0xFA9A, 0xFC47,
- 0xF58B, 0x1055, 0x3DDA, 0x3DDA, 0x1055, 0xF58B, 0xFC47, 0x1B17, 0x362A, 0x1B17, 0x67DA,
- 0xA798, 0xFDA6, 0xF8BE, 0xF36E, 0xF0D4, 0xF368, 0xFB18, 0x04E8, 0x0C98, 0x0F2C, 0x0C92,
- 0x0742, 0x025A, 0x0028, 0x0029, 0x0028, 0x0029, 0x0028, 0x0029, 0x0028, 0x0028, 0x0029,
- 0x0028, 0x0029, 0x0028, 0x0028, 0x0029, 0x0028, 0x0029, 0x0028, 0x0029, 0x0028, 0x712C,
- 0xF1A8, 0xF9D4, 0x208E, 0x4BC2, 0xF280, 0xF280, 0x4BC2, 0x208E, 0xF9D4, 0xF1A8, 0x712C,
- 0x0000, 0x0200, 0x0100, 0x0080, 0x0040, 0x0020, 0x0010, 0x0008, 0x0004, 0x0002, 0x0001,
- 0x02DC, 0x016E, 0x00B7, 0x0287, 0x039F, 0x0313, 0x0355, 0x0376, 0x01BB, 0x0201, 0x03DC,
- 0x01EE, 0x00F7, 0x02A7, 0x038F, 0x031B, 0x00FC, 0x00FC, 0x0198, 0x0198, 0x0168, 0x0350,
- 0x01B4, 0x01B4, 0x0089, 0x002C, 0x0058, 0x002C, 0x0400, 0x0000, 0x0003, 0xFAED, 0xFED0,
- 0x09E2, 0x166A, 0x1BEF, 0x166A, 0x09E2, 0xFED0, 0xFAED, 0x2715, 0x58EB, 0x58EB, 0x2715,
- 0xFF8F, 0xFF25, 0xFEA1, 0xFE12, 0xFD8A, 0xFD26, 0xFD04, 0xFD43, 0xFE00, 0xFF4E, 0x0139,
- 0x03B9, 0x06BB, 0x0A1A, 0x0DA5, 0x111F, 0x144B, 0x16EC, 0x18CC, 0x19C7, 0x19C7, 0x18CC,
- 0x16EC, 0x144B, 0x111F, 0x0DA5, 0x0A1A, 0x06BB, 0x03B9, 0x0139, 0xFF4E, 0xFE00, 0xFD43,
- 0xFD04, 0xFD26, 0xFD8A, 0xFE12, 0xFEA1, 0xFF25, 0xFF8F, 0x0002, 0x0004, 0x47B3, 0xBAC5,
- 0x0B85, 0x0005, 0x299A, 0x0004, 0x000A, 0x0660, 0x0CCD, 0x0003, 0x0006, 0x0080, 0x002C,
- 0x0020, 0x0027, 0xFF4F, 0xFDB1, 0xFE2E, 0x0465, 0x0EF1, 0x161E, 0x1382, 0x0983, 0x007B,
- 0xFD66, 0xFE7D, 0xFFE2, 0x0031, 0x000D, 0x4000, 0xFD24, 0x513A, 0xCAEC, 0x3514, 0xAEC6,
- 0x02DC, 0x4000, 0xEFB5, 0x6EAE, 0x8DAB, 0x7255, 0x9152, 0x104B, 0x2518, 0x1FBB, 0x14A2,
- 0x0D6A, 0x08B9, 0x05AC, 0x03B0, 0x0266, 0x018F, 0x0104, 0x00A9, 0x006E, 0x0047, 0x0001,
- 0x0164, 0x019A, 0x0001, 0x0002, 0x0000, 0x0000, 0x0000, 0x0000, 0x7FFF, 0x0000, 0x0100,
- 0xF500, 0x1C00, 0x5A00, 0x0100, 0xFF00, 0xF800, 0x2000, 0x4F00, 0x0100, 0xFE00, 0xFC00,
- 0x2200, 0x4700, 0x0000, 0xFD00, 0x0100, 0x2300, 0x3D00, 0xFF00, 0xFE00, 0x0500, 0x2200,
- 0x3600, 0xFF00, 0xFF00, 0x0900, 0x2100, 0x2F00, 0x0000, 0x0100, 0x0C00, 0x1F00, 0x2900,
- 0x0000, 0x0300, 0x0E00, 0x1D00, 0x2500, 0x0000, 0x0000, 0x0000, 0x0000, 0x7FFF, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0004, 0x0008, 0x0308, 0x0312, 0x01CC, 0x017C, 0x0019,
- 0x0000, 0x0000, 0x0000, 0x0000, 0xE000, 0x1840, 0xC880, 0xFFEE, 0x0000, 0x4000, 0x2680,
- 0xFF81, 0xE000, 0x5000, 0xD080, 0xFFB3, 0xF800, 0x4500, 0xD380, 0xFFE2, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0F80, 0xDB80, 0x21C0, 0xFFCC, 0x0000, 0xC680, 0x0540, 0x0023, 0x33C0,
- 0xDAC0, 0x5900, 0xFFDA, 0x0AC0, 0xDF80, 0x1940, 0xFFF7, 0x7FFF, 0x50C3, 0x47FA, 0x4026,
- 0x392C, 0x32F5, 0x2D6A, 0x287A, 0x2413, 0x2027, 0x1CA8, 0x198A, 0x16C3, 0x1449, 0x1214,
- 0x101D, 0x0E5D, 0x0CCD, 0x0B68, 0x0A2B, 0x0910, 0x0813, 0x0015, 0x0002, 0x0080, 0x2848,
- 0x051F, 0x0001, 0x0010, 0xFC40, 0xFC40, 0xFD94, 0xFD80, 0xFE80, 0xFE80, 0xFE7C, 0xFE7F,
- 0x02F4, 0x0001, 0x0080, 0x0080, 0x1000, 0x0080, 0x1000, 0x1000, 0x0400, 0x599A, 0x199A,
- 0x0666, 0x0021, 0x2000, 0x2000, 0x2000, 0xFFE4, 0x0032, 0x000A, 0x2000, 0x4000, 0x0800,
- 0x0400, 0x000C, 0x0005, 0x000C, 0x00FF, 0x083D, 0x4000, 0x062F, 0x404C, 0x01B9, 0x4052,
- 0x0155, 0x405B, 0x0704, 0x4069, 0x0786, 0x4071, 0x0E9A, 0x4077, 0x0FEB, 0x4080, 0x0000,
- 0x0000, 0xFFD5, 0x0001, 0x0375, 0x001E, 0x0AAB, 0x2000, 0x2AAB, 0x0040, 0x0005, 0x001E,
- 0x4093, 0xFEE0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000
-};
-
-const unsigned short bin_coeff_E2[] = {
- 0x0000, 0x01FF, 0x0400, 0x0006, 0x2AAB, 0x0324, 0x0324, 0x0324, 0x010C, 0x010C, 0x010C,
- 0x1111, 0x1259, 0x0001, 0x005A, 0x0E9B, 0x0FFF, 0x0FFF, 0x0020, 0x0001, 0x0001, 0x0CCD,
- 0xFFE0, 0xFFD8, 0x00FF, 0xFFAC, 0xFFBC, 0xFF00, 0x0020, 0x0048, 0x0050, 0x0050, 0x000E,
- 0x0002, 0x7000, 0x0800, 0xFFF8, 0x0008, 0x002B, 0xFFF6, 0xFFF8, 0xFFFE, 0x0003, 0x0008,
- 0x000D, 0x000F, 0x0014, 0x0019, 0x0000, 0x0800, 0x6580, 0x0000, 0x0000, 0x7FFF, 0x0008,
- 0x0078, 0xFEF5, 0xFEE8, 0x0003, 0x0080, 0x0080, 0x0080, 0x0300, 0x0006, 0xC080, 0xF000,
- 0x0660, 0xDA80, 0x0000, 0x0001, 0x0001, 0xFFE4, 0xFFE8, 0x0080, 0x0034, 0x0001, 0xFFFF,
- 0x0001, 0xFFFE, 0x3AC0, 0x3340, 0x2BC0, 0x07C0, 0x05C0, 0x03E0, 0x0008, 0x1000, 0x2000,
- 0xFF01, 0xFFE5, 0xFFE9, 0x0DA8, 0x000E, 0xF75E, 0x1136, 0xEC7B, 0x0D3C, 0xFA9A, 0xFC47,
- 0xF58B, 0x1055, 0x3DDA, 0x3DDA, 0x1055, 0xF58B, 0xFC47, 0x1B17, 0x362A, 0x1B17, 0x67DA,
- 0xA798, 0xFDA6, 0xF8BE, 0xF36E, 0xF0D4, 0xF368, 0xFB18, 0x04E8, 0x0C98, 0x0F2C, 0x0C92,
- 0x0742, 0x025A, 0x0028, 0x0029, 0x0028, 0x0029, 0x0028, 0x0029, 0x0028, 0x0028, 0x0029,
- 0x0028, 0x0029, 0x0028, 0x0028, 0x0029, 0x0028, 0x0029, 0x0028, 0x0029, 0x0028, 0x712C,
- 0xF1A8, 0xF9D4, 0x208E, 0x4BC2, 0xF280, 0xF280, 0x4BC2, 0x208E, 0xF9D4, 0xF1A8, 0x712C,
- 0x0000, 0x0200, 0x0100, 0x0080, 0x0040, 0x0020, 0x0010, 0x0008, 0x0004, 0x0002, 0x0001,
- 0x02DC, 0x016E, 0x00B7, 0x0287, 0x039F, 0x0313, 0x0355, 0x0376, 0x01BB, 0x0201, 0x03DC,
- 0x01EE, 0x00F7, 0x02A7, 0x038F, 0x031B, 0x00FC, 0x00FC, 0x0198, 0x0198, 0x0168, 0x0350,
- 0x01B4, 0x01B4, 0x0089, 0x002C, 0x0058, 0x002C, 0x0400, 0x0000, 0x0003, 0xFAED, 0xFED0,
- 0x09E2, 0x166A, 0x1BEF, 0x166A, 0x09E2, 0xFED0, 0xFAED, 0x2715, 0x58EB, 0x58EB, 0x2715,
- 0xFF8F, 0xFF25, 0xFEA1, 0xFE12, 0xFD8A, 0xFD26, 0xFD04, 0xFD43, 0xFE00, 0xFF4E, 0x0139,
- 0x03B9, 0x06BB, 0x0A1A, 0x0DA5, 0x111F, 0x144B, 0x16EC, 0x18CC, 0x19C7, 0x19C7, 0x18CC,
- 0x16EC, 0x144B, 0x111F, 0x0DA5, 0x0A1A, 0x06BB, 0x03B9, 0x0139, 0xFF4E, 0xFE00, 0xFD43,
- 0xFD04, 0xFD26, 0xFD8A, 0xFE12, 0xFEA1, 0xFF25, 0xFF8F, 0x0002, 0x0004, 0x47B3, 0xBAC5,
- 0x0B85, 0x0005, 0x299A, 0x0004, 0x000A, 0x0660, 0x0CCD, 0x0003, 0x0006, 0x0080, 0x002C,
- 0x0020, 0x0027, 0xFF4F, 0xFDB1, 0xFE2E, 0x0465, 0x0EF1, 0x161E, 0x1382, 0x0983, 0x007B,
- 0xFD66, 0xFE7D, 0xFFE2, 0x0031, 0x000D, 0x4000, 0xFD24, 0x513A, 0xCAEC, 0x3514, 0xAEC6,
- 0x02DC, 0x4000, 0xEFB5, 0x6EAE, 0x8DAB, 0x7255, 0x9152, 0x104B, 0x2518, 0x1FBB, 0x14A2,
- 0x0D6A, 0x08B9, 0x05AC, 0x03B0, 0x0266, 0x018F, 0x0104, 0x00A9, 0x006E, 0x0047, 0x0001,
- 0x0164, 0x019A, 0x0001, 0x0002, 0x0000, 0x0000, 0x0000, 0x0000, 0x7FFF, 0x0000, 0x0100,
- 0xF500, 0x1C00, 0x5A00, 0x0100, 0xFF00, 0xF800, 0x2000, 0x4F00, 0x0100, 0xFE00, 0xFC00,
- 0x2200, 0x4700, 0x0000, 0xFD00, 0x0100, 0x2300, 0x3D00, 0xFF00, 0xFE00, 0x0500, 0x2200,
- 0x3600, 0xFF00, 0xFF00, 0x0900, 0x2100, 0x2F00, 0x0000, 0x0100, 0x0C00, 0x1F00, 0x2900,
- 0x0000, 0x0300, 0x0E00, 0x1D00, 0x2500, 0x0000, 0x0000, 0x0000, 0x0000, 0x7FFF, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0004, 0x0008, 0x0308, 0x0312, 0x01CC, 0x017C, 0x0019,
- 0x0000, 0x0000, 0x0000, 0x0000, 0xE000, 0x1840, 0xC880, 0xFFEE, 0x0000, 0x4000, 0x2680,
- 0xFF81, 0xE000, 0x5000, 0xD080, 0xFFB3, 0xF800, 0x4500, 0xD380, 0xFFE2, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0F80, 0xDB80, 0x21C0, 0xFFCC, 0x0000, 0xC680, 0x0540, 0x0023, 0x33C0,
- 0xDAC0, 0x5900, 0xFFDA, 0x0AC0, 0xDF80, 0x1940, 0xFFF7, 0x7FFF, 0x50C3, 0x47FA, 0x4026,
- 0x392C, 0x32F5, 0x2D6A, 0x287A, 0x2413, 0x2027, 0x1CA8, 0x198A, 0x16C3, 0x1449, 0x1214,
- 0x101D, 0x0E5D, 0x0CCD, 0x0B68, 0x0A2B, 0x0910, 0x0813, 0x0015, 0x0002, 0x0080, 0x2848,
- 0x051F, 0x0001, 0x0010, 0xFC40, 0xFC40, 0xFD94, 0xFD80, 0xFE80, 0xFE80, 0xFE7C, 0xFE7F,
- 0x02F4, 0x0001, 0x0080, 0x0080, 0x1000, 0x0080, 0x1000, 0x1000, 0x0400, 0x599A, 0x199A,
- 0x0666, 0x0021, 0x2000, 0x2000, 0x2000, 0xFFE4, 0x0032, 0x000A, 0x2000, 0x4000, 0x0800,
- 0x0400, 0x000C, 0x0005, 0x000C, 0x0038, 0x01A7, 0x4000, 0x0143, 0x4009, 0x0000, 0x0000,
- 0x0929, 0x4020, 0x0721, 0x4041, 0x0755, 0x4052, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0xFFD5, 0x0001, 0x0375, 0x001E, 0x0AAB, 0x2000, 0x2AAB, 0x0040, 0x0005, 0x001E,
- 0x0001, 0xFEE0, 0xFED8, 0xFED8, 0x0000, 0x0040, 0x40A2, 0x0000
-};
-
-const unsigned short bin_hw_coeff[] = {
- 0x0000, 0x0027, 0xfffd, 0xfffc, 0x0002, 0x000a, 0x0005, 0xfff4, 0xffed, 0x0004, 0x0024,
- 0x0018, 0xffd8, 0xffb1, 0x0006, 0x00cd, 0x0179, 0x0001, 0xfffd, 0x0004, 0x0000, 0x000b,
- 0xffe0, 0x0047, 0xff75, 0x0134, 0x04c4, 0xff9c, 0x000f, 0x0007, 0xfff7, 0x0006, 0x0001,
- 0x0008, 0xffdf, 0x005d, 0xff18, 0x034a, 0xff81, 0x03d9, 0x00a6, 0xfffe, 0x0012, 0xffa6,
- 0x0000
-};
diff --git a/drivers/misc/mediatek/fmradio/mt6626/inc/mt6626_fm.h b/drivers/misc/mediatek/fmradio/mt6626/inc/mt6626_fm.h
deleted file mode 100644
index 0be899f59..000000000
--- a/drivers/misc/mediatek/fmradio/mt6626/inc/mt6626_fm.h
+++ /dev/null
@@ -1,81 +0,0 @@
-/* mt6628_fm.h
- *
- * (C) Copyright 2009
- * MediaTek <www.MediaTek.com>
- * Hongcheng <hongcheng.xia@MediaTek.com>
- *
- * MT6626 FM Radio Driver -- head file
- *
- * 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.
- *
- * 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.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- */
-#ifndef __MT6626_FM_H__
-#define __MT6626_FM_H__
-
-#include "fm_typedef.h"
-
-/* #define FM_PowerOn_with_ShortAntenna */
-#define MT6626_RSSI_TH_LONG 0xFF01 /* FM radio long antenna RSSI threshold(11.375dBuV) */
-#define MT6626_RSSI_TH_SHORT 0xFEE0 /* FM radio short antenna RSSI threshold(-1dBuV) */
-#define MT6626_CQI_TH 0x00E9 /* FM radio Channel quality indicator threshold(0x0000~0x00FF) */
-#define MT6626_SEEK_SPACE 1 /* FM radio seek space,1:100KHZ; 2:200KHZ */
-#define MT6626_SCAN_CH_SIZE 40 /* FM radio scan max channel size */
-#define MT6626_BAND 1 /* FM radio band, 1:87.5MHz~108.0MHz; 2:76.0MHz~90.0MHz; 3:76.0MHz~108.0MHz; 4:special */
-#define MT6626_BAND_FREQ_L 875 /* FM radio special band low freq(Default 87.5MHz) */
-#define MT6626_BAND_FREQ_H 1080 /* FM radio special band high freq(Default 108.0MHz) */
-#define MT6626_DEEMPHASIS_50us TRUE
-
-/* customer need customize the I2C port */
-#if 0 /* def MT6516 */
-#define MT6626_I2C_PORT 2
-#else
-#define MT6626_I2C_PORT 0
-#endif
-
-#define MT6626_SLAVE_ADDR 0xE0 /* 0x70 7-bit address */
-#define MT6626_MAX_COUNT 100
-#define MT6626_SCANTBL_SIZE 16 /* 16*uinit16_t */
-
-#define AFC_ON 0x01
-#if AFC_ON
-#define FM_MAIN_CTRL_INIT 0x480
-#else
-#define FM_MAIN_CTRL_INIT 0x080
-#endif
-
-/* FM_MAIN_EXTINTRMASK */
-#define FM_EXT_STC_DONE_MASK 0x01
-#define FM_EXT_RDS_MASK 0x20
-
-#define MT6626_FM_STC_DONE_TIMEOUT 12 /* second */
-
-/* FM_MAIN_CHANDETSTAT */
-#define FM_MAIN_CHANDET_MASK 0x3FF0 /* D4~D13 in address 6FH */
-#define FM_MAIN_CHANDET_SHIFT 0x04
-#define FM_HOST_CHAN 0x3FF0
-
-/* FM_MAIN_CFG1(0x36) && FM_MAIN_CFG2(0x37) */
-#define MT6626_FM_SEEK_UP 0x0
-#define MT6626_FM_SEEK_DOWN 0x01
-#define MT6626_FM_SCAN_UP 0x0
-#define MT6626_FM_SCAN_DOWN 0x01
-#define MT6626_FM_SPACE_INVALID 0x0
-#define MT6626_FM_SPACE_50K 0x01
-#define MT6626_FM_SPACE_100K 0x02
-#define MT6626_FM_SPACE_200K 0x04
-
-#define ext_clk /* if define ext_clk use external reference clock or mask will use internal */
-#define MT6626_DEV "MT6626"
-
-#endif /* end of #ifndef __MT6626_FM_H__ */
diff --git a/drivers/misc/mediatek/fmradio/mt6626/inc/mt6626_fm_cmd.h b/drivers/misc/mediatek/fmradio/mt6626/inc/mt6626_fm_cmd.h
deleted file mode 100644
index d95df49aa..000000000
--- a/drivers/misc/mediatek/fmradio/mt6626/inc/mt6626_fm_cmd.h
+++ /dev/null
@@ -1,46 +0,0 @@
-#ifndef __MT6626_FM_CMD_H__
-#define __MT6626_FM_CMD_H__
-
-#include <linux/types.h>
-#include "fm_typedef.h"
-
-/* FM basic-operation's opcode */
-#define FM_BOP_BASE (0x80)
-enum {
- FM_WRITE_BASIC_OP = (FM_BOP_BASE + 0x00),
- FM_UDELAY_BASIC_OP = (FM_BOP_BASE + 0x01),
- FM_RD_UNTIL_BASIC_OP = (FM_BOP_BASE + 0x02),
- FM_MODIFY_BASIC_OP = (FM_BOP_BASE + 0x03),
- FM_MSLEEP_BASIC_OP = (FM_BOP_BASE + 0x04),
- FM_MAX_BASIC_OP = (FM_BOP_BASE + 0x05)
-};
-
-/* FM BOP's size */
-#define FM_WRITE_BASIC_OP_SIZE (3)
-#define FM_UDELAY_BASIC_OP_SIZE (4)
-#define FM_RD_UNTIL_BASIC_OP_SIZE (5)
-#define FM_MODIFY_BASIC_OP_SIZE (5)
-#define FM_MSLEEP_BASIC_OP_SIZE (4)
-
-fm_s32 mt6626_pwrup_clock_on(fm_u8 *tx_buf, fm_s32 tx_buf_size);
-fm_s32 mt6626_pwrup_digital_init_1(fm_u8 *tx_buf, fm_s32 tx_buf_size);
-fm_s32 mt6626_pwrup_digital_init_2(fm_u8 *tx_buf, fm_s32 tx_buf_size);
-fm_s32 mt6626_pwrdown(fm_u8 *tx_buf, fm_s32 tx_buf_size);
-fm_s32 mt6626_rampdown(fm_u8 *tx_buf, fm_s32 tx_buf_size);
-fm_s32 mt6626_tune(fm_u8 *tx_buf, fm_s32 tx_buf_size, fm_u16 freq);
-fm_s32 mt6626_seek(fm_u8 *tx_buf, fm_s32 tx_buf_size, fm_u16 seekdir, fm_u16 space,
- fm_u16 max_freq, fm_u16 min_freq);
-fm_s32 mt6626_scan(fm_u8 *tx_buf, fm_s32 tx_buf_size, fm_u16 scandir, fm_u16 space,
- fm_u16 max_freq, fm_u16 min_freq);
-fm_s32 mt6626_get_reg(fm_u8 *tx_buf, fm_s32 tx_buf_size, fm_u8 addr);
-fm_s32 mt6626_set_reg(fm_u8 *tx_buf, fm_s32 tx_buf_size, fm_u8 addr, fm_u16 value);
-fm_s32 mt6626_patch_download(fm_u8 *tx_buf, fm_s32 tx_buf_size, fm_u8 seg_num, fm_u8 seg_id,
- const fm_u8 *src, fm_s32 seg_len);
-fm_s32 mt6626_coeff_download(fm_u8 *tx_buf, fm_s32 tx_buf_size, fm_u8 seg_num, fm_u8 seg_id,
- const fm_u8 *src, fm_s32 seg_len);
-fm_s32 mt6626_hwcoeff_download(fm_u8 *tx_buf, fm_s32 tx_buf_size, fm_u8 seg_num, fm_u8 seg_id,
- const fm_u8 *src, fm_s32 seg_len);
-fm_s32 mt6626_rom_download(fm_u8 *tx_buf, fm_s32 tx_buf_size, fm_u8 seg_num, fm_u8 seg_id,
- const fm_u8 *src, fm_s32 seg_len);
-
-#endif
diff --git a/drivers/misc/mediatek/fmradio/mt6626/inc/mt6626_fm_lib.h b/drivers/misc/mediatek/fmradio/mt6626/inc/mt6626_fm_lib.h
deleted file mode 100644
index e401f04f9..000000000
--- a/drivers/misc/mediatek/fmradio/mt6626/inc/mt6626_fm_lib.h
+++ /dev/null
@@ -1,77 +0,0 @@
-#ifndef __MT6626_FM_LIB_H__
-#define __MT6626_FM_LIB_H__
-
-#include "fm_typedef.h"
-
-enum {
- DSPPATCH = 0xFFF9,
- USDELAY = 0xFFFA,
- MSDELAY = 0xFFFB,
- HW_VER = 0xFFFD,
- POLL_N = 0xFFFE, /* poling check if bit(n) is '0' */
- POLL_P = 0xFFFF, /* polling check if bit(n) is '1' */
-};
-
-enum {
- FM_PUS_DSPPATCH = DSPPATCH,
- FM_PUS_USDELAY = USDELAY,
- FM_PUS_MSDELAY = MSDELAY,
- FM_PUS_HW_VER = HW_VER,
- FM_PUS_POLL_N = POLL_N, /* poling check if bit(n) is '0' */
- FM_PUS_POLL_P = POLL_P, /* polling check if bit(n) is '1' */
- FM_PUS_MAX
-};
-
-enum {
- DSP_PATH = 0x02,
- DSP_COEFF = 0x03,
- DSP_HW_COEFF = 0x04
-};
-
-enum IMG_TYPE {
- IMG_WRONG = 0,
- IMG_ROM,
- IMG_PATCH,
- IMG_COEFFICIENT,
- IMG_HW_COEFFICIENT
-};
-
-enum {
- mt6626_E1 = 0,
- mt6626_E2
-};
-
-enum {
- FM_LONG_ANA = 0,
- FM_SHORT_ANA
-};
-
-struct ctrl_word_operation {
- fm_u16 addr;
- fm_u16 and;
- fm_u16 or;
-};
-
-enum {
- MT66x6_BT = 0,
- MT66x6_FM,
- MT66x6_MAX
-};
-
-enum {
- MT6626_I2S_ON = 0,
- MT6626_I2S_OFF
-};
-
-enum {
- MT6626_I2S_MASTER = 0,
- MT6626_I2S_SLAVE
-};
-
-enum {
- MT6626_I2S_32K = 0,
- MT6626_I2S_44K,
- MT6626_I2S_48K
-};
-
-#endif
diff --git a/drivers/misc/mediatek/fmradio/mt6626/inc/mt6626_fm_link.h b/drivers/misc/mediatek/fmradio/mt6626/inc/mt6626_fm_link.h
deleted file mode 100644
index 85bd4d2ff..000000000
--- a/drivers/misc/mediatek/fmradio/mt6626/inc/mt6626_fm_link.h
+++ /dev/null
@@ -1,68 +0,0 @@
-/* mt6626_fm_ctrl_link.h
- *
- * (C) Copyright 2009
- * MediaTek <www.MediaTek.com>
- * Hongcheng <hongcheng.xia@MediaTek.com>
- *
- * MT6626 FM Radio Driver -- setup data link
- *
- * 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.
- *
- * 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.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- */
-
-#ifndef __MT6626_FM_LINK_H__
-#define __MT6626_FM_LINK_H__
-
-#include <linux/wait.h>
-#include "fm_link.h"
-#include "fm_utils.h"
-
-#define RX_BUF_SIZE 128
-#define TX_BUF_SIZE 1024
-
-#define SW_RETRY_CNT (2)
-#define SW_RETRY_CNT_MAX (5)
-#define SW_WAIT_TIMEOUT_MAX (100)
-
-/* FM operation timeout define for error handle */
-#define TEST_TIMEOUT (3)
-#define FSPI_EN_TIMEOUT (3)
-#define FSPI_MUXSEL_TIMEOUT (3)
-#define FSPI_RD_TIMEOUT (3)
-#define FSPI_WR_TIMEOUT (3)
-#define I2C_RD_TIMEOUT (3)
-#define I2C_WR_TIMEOUT (3)
-#define EN_TIMEOUT (5)
-#define RST_TIMEOUT (3)
-#define TUNE_TIMEOUT (3)
-#define SEEK_TIMEOUT (10)
-#define SCAN_TIMEOUT (15) /* usualy scan will cost 10 seconds */
-#define RDS_RX_EN_TIMEOUT (3)
-#define RDS_DATA_TIMEOUT (100)
-#define RAMPDOWN_TIMEOUT (3)
-#define MCUCLK_TIMEOUT (3)
-#define MODEMCLK_TIMEOUT (3)
-#define RDS_TX_TIMEOUT (3)
-#define PATCH_TIMEOUT (5)
-#define COEFF_TIMEOUT (5)
-#define HWCOEFF_TIMEOUT (5)
-#define ROM_TIMEOUT (5)
-
-struct fm_link_event {
- struct fm_flag_event *ln_event;
- struct fm_res_ctx result; /* seek/scan/read/RDS */
-};
-
-
-#endif
diff --git a/drivers/misc/mediatek/fmradio/mt6626/inc/mt6626_fm_reg.h b/drivers/misc/mediatek/fmradio/mt6626/inc/mt6626_fm_reg.h
deleted file mode 100644
index bc2c9e50b..000000000
--- a/drivers/misc/mediatek/fmradio/mt6626/inc/mt6626_fm_reg.h
+++ /dev/null
@@ -1,83 +0,0 @@
-#ifndef __MT6626_FM_REG_H__
-#define __MT6626_FM_REG_H__
-
-enum MT6626_REG {
- FM_MAIN_CG1_CTRL = 0x60,
- FM_MAIN_CG2_CTRL = 0x61,
- FM_MAIN_HWVER = 0x62,
- FM_MAIN_CTRL = 0x63,
- FM_CHANNEL_SET = 0x65,
- FM_MAIN_CFG1 = 0x66,
- FM_MAIN_CFG2 = 0x67,
- FM_MAIN_MCLKDESENSE = 0x38,
- FM_MAIN_INTR = 0x69,
- FM_MAIN_INTRMASK = 0x6A,
- FM_MAIN_EXTINTRMASK = 0x6B,
- FM_RSSI_IND = 0x6C,
- FM_RSSI_TH = 0x6D,
- FM_MAIN_RESET = 0x6E,
- FM_MAIN_CHANDETSTAT = 0x6F,
- FM_RDS_CFG0 = 0x80,
- FM_RDS_INFO = 0x81,
- FM_RDS_DATA_REG = 0x82,
- FM_RDS_GOODBK_CNT = 0x83,
- FM_RDS_BADBK_CNT = 0x84,
- FM_RDS_PWDI = 0x85,
- FM_RDS_PWDQ = 0x86,
- FM_RDS_FIFO_STATUS0 = 0x87,
- FM_FT_CON9 = 0x8F,
- FM_DSP_PATCH_CTRL = 0x90,
- FM_DSP_PATCH_OFFSET = 0x91,
- FM_DSP_PATCH_DATA = 0x92,
- FM_DSP_MEM_CTRL4 = 0x93,
- FM_ADDR_PAMD = 0xB4,
- FM_RDS_BDGRP_ABD_CTRL_REG = 0xB6,
- FM_RDS_POINTER = 0xF0,
-};
-
-/* RDS_BDGRP_ABD_CTRL_REG */
-enum {
- BDGRP_ABD_EN = 0x0001,
- BER_RUN = 0x2000
-};
-#define FM_DAC_CON1 0x83
-#define FM_DAC_CON2 0x84
-#define FM_FT_CON0 0x86
-enum {
- FT_EN = 0x0001
-};
-
-#define FM_I2S_CON0 0x90
-enum {
- I2S_EN = 0x0001,
- FORMAT = 0x0002,
- WLEN = 0x0004,
- I2S_SRC = 0x0008
-};
-
-/* FM_MAIN_CTRL */
-enum {
- TUNE = 0x0001,
- SEEK = 0x0002,
- SCAN = 0x0004,
- RDS_MASK = 0x0010,
- MUTE = 0x0020,
- RDS_BRST = 0x0040,
- RAMP_DOWN = 0x0100,
-};
-
-/* FM_MAIN_INTR */
-enum {
- FM_INTR_STC_DONE = 0x0001,
- FM_INTR_IQCAL_DONE = 0x0002,
- FM_INTR_DESENSE_HIT = 0x0004,
- FM_INTR_CHNL_CHG = 0x0008,
- FM_INTR_SW_INTR = 0x0010,
- FM_INTR_RDS = 0x0020
-};
-
-enum {
- ANTENNA_TYPE = 0x0010,
-};
-
-#endif /* __MT6626_FM_REG_H__ */
diff --git a/drivers/misc/mediatek/fmradio/mt6626/piv/mt6626_fm_priv.c b/drivers/misc/mediatek/fmradio/mt6626/piv/mt6626_fm_priv.c
deleted file mode 100644
index e69de29bb..000000000
--- a/drivers/misc/mediatek/fmradio/mt6626/piv/mt6626_fm_priv.c
+++ /dev/null
diff --git a/drivers/misc/mediatek/fmradio/mt6626/piv/mt6626_fm_priv.h b/drivers/misc/mediatek/fmradio/mt6626/piv/mt6626_fm_priv.h
deleted file mode 100644
index 99407933e..000000000
--- a/drivers/misc/mediatek/fmradio/mt6626/piv/mt6626_fm_priv.h
+++ /dev/null
@@ -1,5 +0,0 @@
-#ifndef __MTK_FM_H__
-#define __MTK_FM_H__
-
-
-#endif /* __MTK_FM_H__ */
diff --git a/drivers/misc/mediatek/fmradio/mt6626/pub/mt6626_fm_cmd.c b/drivers/misc/mediatek/fmradio/mt6626/pub/mt6626_fm_cmd.c
deleted file mode 100644
index 087bf4ce2..000000000
--- a/drivers/misc/mediatek/fmradio/mt6626/pub/mt6626_fm_cmd.c
+++ /dev/null
@@ -1,690 +0,0 @@
-#include <linux/kernel.h>
-
-#include "fm_typedef.h"
-#include "fm_dbg.h"
-#include "fm_err.h"
-#include "fm_rds.h"
-#include "fm_cust_cfg.h"
-
-#include "mt6626_fm_reg.h"
-#include "mt6626_fm_link.h"
-#include "mt6626_fm.h"
-#include "mt6626_fm_cmd.h"
-
-static fm_s32 fm_bop_write(fm_u8 addr, fm_u16 value, fm_u8 *buf, fm_s32 size)
-{
- if (size < (FM_WRITE_BASIC_OP_SIZE + 2)) {
- return (-1);
- }
-
- if (buf == NULL) {
- return (-2);
- }
-
- buf[0] = FM_WRITE_BASIC_OP;
- buf[1] = FM_WRITE_BASIC_OP_SIZE;
- buf[2] = addr;
- buf[3] = (fm_u8) ((value) & 0x00FF);
- buf[4] = (fm_u8) ((value >> 8) & 0x00FF);
-
- WCN_DBG(FM_DBG | CHIP, "%02x %02x %02x %02x %02x\n", buf[0], buf[1], buf[2], buf[3],
- buf[4]);
-
- return (FM_WRITE_BASIC_OP_SIZE + 2);
-}
-
-static fm_s32 fm_bop_udelay(fm_u32 value, fm_u8 *buf, fm_s32 size)
-{
- if (size < (FM_UDELAY_BASIC_OP_SIZE + 2)) {
- return (-1);
- }
-
- if (buf == NULL) {
- return (-2);
- }
-
- buf[0] = FM_UDELAY_BASIC_OP;
- buf[1] = FM_UDELAY_BASIC_OP_SIZE;
- buf[2] = (fm_u8) ((value) & 0x000000FF);
- buf[3] = (fm_u8) ((value >> 8) & 0x000000FF);
- buf[4] = (fm_u8) ((value >> 16) & 0x000000FF);
- buf[5] = (fm_u8) ((value >> 24) & 0x000000FF);
-
- WCN_DBG(FM_DBG | CHIP, "%02x %02x %02x %02x %02x %02x\n", buf[0], buf[1], buf[2], buf[3],
- buf[4], buf[5]);
-
- return (FM_UDELAY_BASIC_OP_SIZE + 2);
-}
-
-static fm_s32 fm_bop_rd_until(fm_u8 addr, fm_u16 mask, fm_u16 value, fm_u8 *buf, fm_s32 size)
-{
- if (size < (FM_RD_UNTIL_BASIC_OP_SIZE + 2)) {
- return (-1);
- }
-
- if (buf == NULL) {
- return (-2);
- }
-
- buf[0] = FM_RD_UNTIL_BASIC_OP;
- buf[1] = FM_RD_UNTIL_BASIC_OP_SIZE;
- buf[2] = addr;
- buf[3] = (fm_u8) ((mask) & 0x00FF);
- buf[4] = (fm_u8) ((mask >> 8) & 0x00FF);
- buf[5] = (fm_u8) ((value) & 0x00FF);
- buf[6] = (fm_u8) ((value >> 8) & 0x00FF);
-
- WCN_DBG(FM_DBG | CHIP, "%02x %02x %02x %02x %02x %02x %02x\n", buf[0], buf[1], buf[2],
- buf[3], buf[4], buf[5], buf[6]);
-
- return (FM_RD_UNTIL_BASIC_OP_SIZE + 2);
-}
-
-static fm_s32 fm_bop_modify(fm_u8 addr, fm_u16 mask_and, fm_u16 mask_or, fm_u8 *buf, fm_s32 size)
-{
- if (size < (FM_MODIFY_BASIC_OP_SIZE + 2)) {
- return (-1);
- }
-
- if (buf == NULL) {
- return (-2);
- }
-
- buf[0] = FM_MODIFY_BASIC_OP;
- buf[1] = FM_MODIFY_BASIC_OP_SIZE;
- buf[2] = addr;
- buf[3] = (fm_u8) ((mask_and) & 0x00FF);
- buf[4] = (fm_u8) ((mask_and >> 8) & 0x00FF);
- buf[5] = (fm_u8) ((mask_or) & 0x00FF);
- buf[6] = (fm_u8) ((mask_or >> 8) & 0x00FF);
-
- WCN_DBG(FM_DBG | CHIP, "%02x %02x %02x %02x %02x %02x %02x\n", buf[0], buf[1], buf[2],
- buf[3], buf[4], buf[5], buf[6]);
-
- return (FM_MODIFY_BASIC_OP_SIZE + 2);
-}
-
-#if 0
-static fm_s32 fm_bop_msleep(fm_u32 value, fm_u8 *buf, fm_s32 size)
-{
- if (size < (FM_MSLEEP_BASIC_OP_SIZE + 2)) {
- return (-1);
- }
-
- if (buf == NULL) {
- return (-2);
- }
-
- buf[0] = FM_MSLEEP_BASIC_OP;
- buf[1] = FM_MSLEEP_BASIC_OP_SIZE;
- buf[2] = (fm_u8) ((value) & 0x000000FF);
- buf[3] = (fm_u8) ((value >> 8) & 0x000000FF);
- buf[4] = (fm_u8) ((value >> 16) & 0x000000FF);
- buf[5] = (fm_u8) ((value >> 24) & 0x000000FF);
-
- WCN_DBG(FM_DBG | CHIP, "%02x %02x %02x %02x %02x %02x\n", buf[0], buf[1], buf[2], buf[3],
- buf[4], buf[5]);
-
- return (FM_MSLEEP_BASIC_OP_SIZE + 2);
-}
-#endif
-
-/*
- * mt6626_pwrup_clock_on - Wholechip FM Power Up: step 1, FM Digital Clock enable
- * @buf - target buf
- * @buf_size - buffer size
- * return package size
- */
-fm_s32 mt6626_pwrup_clock_on(fm_u8 *buf, fm_s32 buf_size)
-{
- fm_s32 pkt_size = 0;
-
- if (buf_size < TX_BUF_SIZE) {
- return (-1);
- }
-
- buf[0] = FM_TASK_COMMAND_PKT_TYPE;
- buf[1] = FM_ENABLE_OPCODE;
- pkt_size = 4;
-
- /* FM Digital Clock enable */
- pkt_size += fm_bop_write(0x60, 0x3000, &buf[pkt_size], buf_size - pkt_size); /* wr 60 3000 */
- pkt_size += fm_bop_write(0x60, 0x3001, &buf[pkt_size], buf_size - pkt_size); /* wr 60 3001 */
- pkt_size += fm_bop_udelay(3000, &buf[pkt_size], buf_size - pkt_size); /* delay 3ms */
- pkt_size += fm_bop_write(0x60, 0x3003, &buf[pkt_size], buf_size - pkt_size); /* wr 60 3003 */
- pkt_size += fm_bop_write(0x60, 0x3007, &buf[pkt_size], buf_size - pkt_size); /* wr 60 3007 */
- /* no low power mode, analog line in, long antenna */
- pkt_size += fm_bop_modify(0x61, 0xFF63, 0x0000, &buf[pkt_size], buf_size - pkt_size);
-
- buf[2] = (fm_u8) ((pkt_size - 4) & 0x00FF);
- buf[3] = (fm_u8) (((pkt_size - 4) >> 8) & 0x00FF);
-
- return pkt_size;
-}
-
-/*
- * mt6626_patch_download - Wholechip FM Power Up: step 3, download patch to f/w,
- * @buf - target buf
- * @buf_size - buffer size
- * @seg_num - total segments that this patch divided into
- * @seg_id - No. of Segments: segment that will now be sent
- * @src - patch source buffer
- * @seg_len - segment size: segment that will now be sent
- * return package size
- */
-fm_s32 mt6626_patch_download(fm_u8 *buf, fm_s32 buf_size, fm_u8 seg_num, fm_u8 seg_id,
- const fm_u8 *src, fm_s32 seg_len)
-{
- fm_s32 pkt_size = 0;
- fm_u8 *dst = NULL;
-
- if (buf_size < TX_BUF_SIZE) {
- return (-1);
- }
-
- buf[0] = FM_TASK_COMMAND_PKT_TYPE;
- buf[1] = FM_PATCH_DOWNLOAD_OPCODE;
- pkt_size = 4;
-
- buf[pkt_size++] = seg_num;
- buf[pkt_size++] = seg_id;
-
- if (seg_len > (buf_size - pkt_size)) {
- return -1;
- }
-
- dst = &buf[pkt_size];
- pkt_size += seg_len;
-
- /* copy patch to tx buffer */
- while (seg_len--) {
- *dst = *src;
- /* pr_debug("%02x ", *dst); */
- src++;
- dst++;
- }
-
- buf[2] = (fm_u8) ((pkt_size - 4) & 0x00FF);
- buf[3] = (fm_u8) (((pkt_size - 4) >> 8) & 0x00FF);
- WCN_DBG(FM_DBG | CHIP, "%02x %02x %02x %02x %02x %02x %02x\n", buf[0], buf[1], buf[2],
- buf[3], buf[4], buf[5], buf[6]);
-
- return pkt_size;
-}
-
-/*
- * mt6626_coeff_download - Wholechip FM Power Up: step 3,download coeff to f/w,
- * @buf - target buf
- * @buf_size - buffer size
- * @seg_num - total segments that this patch divided into
- * @seg_id - No. of Segments: segment that will now be sent
- * @src - patch source buffer
- * @seg_len - segment size: segment that will now be sent
- * return package size
- */
-fm_s32 mt6626_coeff_download(fm_u8 *buf, fm_s32 buf_size, fm_u8 seg_num, fm_u8 seg_id,
- const fm_u8 *src, fm_s32 seg_len)
-{
- fm_s32 pkt_size = 0;
- fm_u8 *dst = NULL;
-
- if (buf_size < TX_BUF_SIZE) {
- return (-1);
- }
-
- buf[0] = FM_TASK_COMMAND_PKT_TYPE;
- buf[1] = FM_COEFF_DOWNLOAD_OPCODE;
- pkt_size = 4;
-
- buf[pkt_size++] = seg_num;
- buf[pkt_size++] = seg_id;
-
- if (seg_len > (buf_size - pkt_size)) {
- return -1;
- }
-
- dst = &buf[pkt_size];
- pkt_size += seg_len;
-
- /* copy patch to tx buffer */
- while (seg_len--) {
- *dst = *src;
- /* pr_debug("%02x ", *dst); */
- src++;
- dst++;
- }
-
- buf[2] = (fm_u8) ((pkt_size - 4) & 0x00FF);
- buf[3] = (fm_u8) (((pkt_size - 4) >> 8) & 0x00FF);
- WCN_DBG(FM_DBG | CHIP, "%02x %02x %02x %02x %02x %02x %02x\n", buf[0], buf[1], buf[2],
- buf[3], buf[4], buf[5], buf[6]);
-
- return pkt_size;
-}
-
-/*
- * mt6626_hwcoeff_download - Wholechip FM Power Up: step 3,download hwcoeff to f/w,
- * @buf - target buf
- * @buf_size - buffer size
- * @seg_num - total segments that this patch divided into
- * @seg_id - No. of Segments: segment that will now be sent
- * @src - patch source buffer
- * @seg_len - segment size: segment that will now be sent
- * return package size
- */
-fm_s32 mt6626_hwcoeff_download(fm_u8 *buf, fm_s32 buf_size, fm_u8 seg_num, fm_u8 seg_id,
- const fm_u8 *src, fm_s32 seg_len)
-{
- fm_s32 pkt_size = 0;
- fm_u8 *dst = NULL;
-
- if (buf_size < TX_BUF_SIZE) {
- return (-1);
- }
-
- buf[0] = FM_TASK_COMMAND_PKT_TYPE;
- buf[1] = FM_HWCOEFF_DOWNLOAD_OPCODE;
- pkt_size = 4;
-
- buf[pkt_size++] = seg_num;
- buf[pkt_size++] = seg_id;
-
- if (seg_len > (buf_size - pkt_size)) {
- return -1;
- }
-
- dst = &buf[pkt_size];
- pkt_size += seg_len;
-
- /* copy patch to tx buffer */
- while (seg_len--) {
- *dst = *src;
- /* pr_debug("%02x ", *dst); */
- src++;
- dst++;
- }
-
- buf[2] = (fm_u8) ((pkt_size - 4) & 0x00FF);
- buf[3] = (fm_u8) (((pkt_size - 4) >> 8) & 0x00FF);
- WCN_DBG(FM_DBG | CHIP, "%02x %02x %02x %02x %02x %02x %02x\n", buf[0], buf[1], buf[2],
- buf[3], buf[4], buf[5], buf[6]);
-
- return pkt_size;
-}
-
-/*
- * mt6626_rom_download - Wholechip FM Power Up: step 3,download rom to f/w,
- * @buf - target buf
- * @buf_size - buffer size
- * @seg_num - total segments that this patch divided into
- * @seg_id - No. of Segments: segment that will now be sent
- * @src - patch source buffer
- * @seg_len - segment size: segment that will now be sent
- * return package size
- */
-fm_s32 mt6626_rom_download(fm_u8 *buf, fm_s32 buf_size, fm_u8 seg_num, fm_u8 seg_id,
- const fm_u8 *src, fm_s32 seg_len)
-{
- fm_s32 pkt_size = 0;
- fm_u8 *dst = NULL;
-
- if (buf_size < TX_BUF_SIZE) {
- return (-1);
- }
-
- buf[0] = FM_TASK_COMMAND_PKT_TYPE;
- buf[1] = FM_ROM_DOWNLOAD_OPCODE;
- pkt_size = 4;
-
- buf[pkt_size++] = seg_num;
- buf[pkt_size++] = seg_id;
-
- if (seg_len > (buf_size - pkt_size)) {
- return -1;
- }
-
- dst = &buf[pkt_size];
- pkt_size += seg_len;
-
- /* copy patch to tx buffer */
- while (seg_len--) {
- *dst = *src;
- /* pr_debug("%02x ", *dst); */
- src++;
- dst++;
- }
-
- buf[2] = (fm_u8) ((pkt_size - 4) & 0x00FF);
- buf[3] = (fm_u8) (((pkt_size - 4) >> 8) & 0x00FF);
- WCN_DBG(FM_DBG | CHIP, "%02x %02x %02x %02x %02x %02x %02x\n", buf[0], buf[1], buf[2],
- buf[3], buf[4], buf[5], buf[6]);
-
- return pkt_size;
-}
-
-/*
- * mt6626_pwrup_digital_init - Wholechip FM Power Up: step 4, FM Digital Init: fm_rgf_maincon
- * @buf - target buf
- * @buf_size - buffer size
- * return package size
- */
-fm_s32 mt6626_pwrup_digital_init_1(fm_u8 *buf, fm_s32 buf_size)
-{
- fm_s32 pkt_size = 0;
-
- if (buf_size < TX_BUF_SIZE) {
- return (-1);
- }
-
- buf[0] = FM_TASK_COMMAND_PKT_TYPE;
- buf[1] = FM_ENABLE_OPCODE;
- pkt_size = 4;
-
- /* Wholechip FM Power Up: FM Digital Init: fm_rgf_maincon */
- pkt_size += fm_bop_write(0x6A, 0x0020, &buf[pkt_size], buf_size - pkt_size); /* wr 6A 0020 */
- pkt_size += fm_bop_write(0x6B, 0x0020, &buf[pkt_size], buf_size - pkt_size); /* wr 6B 0020 */
- pkt_size += fm_bop_write(0xA0, 0xD0B1, &buf[pkt_size], buf_size - pkt_size); /* wr a0 D0B1 */
- pkt_size += fm_bop_write(0x60, 0x300F, &buf[pkt_size], buf_size - pkt_size); /* wr 60 300F */
- pkt_size += fm_bop_write(0x61, 0x0003, &buf[pkt_size], buf_size - pkt_size); /* wr 61 3 */
- pkt_size += fm_bop_write(0x61, 0x0002, &buf[pkt_size], buf_size - pkt_size); /* wr 61 2 */
- /* pkt_size += fm_bop_modify(0x61, 0xFFFF, 0x0002, &buf[pkt_size], buf_size - pkt_size); */
- /* pkt_size += fm_bop_modify(0x61, 0xFFFE, 0x0000, &buf[pkt_size], buf_size - pkt_size); */
-
- buf[2] = (fm_u8) ((pkt_size - 4) & 0x00FF);
- buf[3] = (fm_u8) (((pkt_size - 4) >> 8) & 0x00FF);
-
- return pkt_size;
-}
-
-/*
- * mt6626_pwrup_digital_init - Wholechip FM Power Up: step 4, FM Digital Init: fm_rgf_maincon
- * @buf - target buf
- * @buf_size - buffer size
- * return package size
- */
-fm_s32 mt6626_pwrup_digital_init_2(fm_u8 *buf, fm_s32 buf_size)
-{
- fm_s32 pkt_size = 0;
-
- if (buf_size < TX_BUF_SIZE) {
- return (-1);
- }
-
- buf[0] = FM_TASK_COMMAND_PKT_TYPE;
- buf[1] = FM_ENABLE_OPCODE;
- pkt_size = 4;
-
- pkt_size += fm_bop_rd_until(0x64, 0x001F, 0x0002, &buf[pkt_size], buf_size - pkt_size); /* Poll 64[0~4] = 2 */
-
- buf[2] = (fm_u8) ((pkt_size - 4) & 0x00FF);
- buf[3] = (fm_u8) (((pkt_size - 4) >> 8) & 0x00FF);
-
- return pkt_size;
-}
-
-/*
- * mt6626_pwrdown - Wholechip FM Power down: Digital Modem Power Down
- * @buf - target buf
- * @buf_size - buffer size
- * return package size
- */
-fm_s32 mt6626_pwrdown(fm_u8 *buf, fm_s32 buf_size)
-{
- fm_s32 pkt_size = 0;
-
- if (buf_size < TX_BUF_SIZE) {
- return (-1);
- }
-
- buf[0] = FM_TASK_COMMAND_PKT_TYPE;
- buf[1] = FM_ENABLE_OPCODE;
- pkt_size = 4;
-
- /* Disable HW clock control */
- pkt_size += fm_bop_write(0x60, 0x330F, &buf[pkt_size], buf_size - pkt_size); /* wr 60 330F */
- /* Reset ASIP */
- pkt_size += fm_bop_write(0x61, 0x0001, &buf[pkt_size], buf_size - pkt_size); /* wr 61 0001 */
- /* digital core + digital rgf reset */
- pkt_size += fm_bop_modify(0x6E, 0xFFF8, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* wr 6E[0~2] 0 */
- pkt_size += fm_bop_modify(0x6E, 0xFFF8, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* wr 6E[0~2] 0 */
- pkt_size += fm_bop_modify(0x6E, 0xFFF8, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* wr 6E[0~2] 0 */
- /* Disable all clock */
- pkt_size += fm_bop_write(0x60, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* wr 60 0000 */
- /* Reset rgfrf */
- pkt_size += fm_bop_write(0x60, 0x4000, &buf[pkt_size], buf_size - pkt_size); /* wr 60 4000 */
- pkt_size += fm_bop_write(0x60, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* wr 60 0000 */
-
- buf[2] = (fm_u8) ((pkt_size - 4) & 0x00FF);
- buf[3] = (fm_u8) (((pkt_size - 4) >> 8) & 0x00FF);
-
- return pkt_size;
-}
-
-/*
- * mt6626_rampdown - f/w will wait for STC_DONE interrupt
- * @buf - target buf
- * @buf_size - buffer size
- * return package size
- */
-fm_s32 mt6626_rampdown(fm_u8 *buf, fm_s32 buf_size)
-{
- fm_s32 pkt_size = 0;
-
- if (buf_size < TX_BUF_SIZE) {
- return (-1);
- }
-
- buf[0] = FM_TASK_COMMAND_PKT_TYPE;
- buf[1] = FM_RAMPDOWN_OPCODE;
- pkt_size = 4;
-
- /* Clear DSP state */
- pkt_size += fm_bop_modify(FM_MAIN_CTRL, 0xFFF0, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* wr 63[3:0] = 0 */
- /* Set DSP ramp down state */
- pkt_size += fm_bop_modify(FM_MAIN_CTRL, 0xFFFF, RAMP_DOWN, &buf[pkt_size], buf_size - pkt_size); /* wr 63[8] = 1 */
- /* @Wait for STC_DONE interrupt@ */
- pkt_size += fm_bop_rd_until(FM_MAIN_INTR, FM_INTR_STC_DONE, FM_INTR_STC_DONE, &buf[pkt_size], buf_size - pkt_size); /* Poll 69[0] = b'1 */
- /* Clear DSP ramp down state */
- pkt_size += fm_bop_modify(FM_MAIN_CTRL, (~RAMP_DOWN), 0x0000, &buf[pkt_size], buf_size - pkt_size); /* wr 63[8] = 0 */
- /* Write 1 clear the STC_DONE interrupt status flag */
- pkt_size += fm_bop_modify(FM_MAIN_INTR, 0xFFFF, FM_INTR_STC_DONE, &buf[pkt_size], buf_size - pkt_size); /* wr 69[0] = 1 */
-
- buf[2] = (fm_u8) ((pkt_size - 4) & 0x00FF);
- buf[3] = (fm_u8) (((pkt_size - 4) >> 8) & 0x00FF);
-
- return pkt_size;
-}
-
-/*
- * mt6626_tune - execute tune action,
- * @buf - target buf
- * @buf_size - buffer size
- * @freq - 760 ~ 1080, 100KHz unit
- * return package size
- */
-fm_s32 mt6626_tune(fm_u8 *buf, fm_s32 buf_size, fm_u16 freq)
-{
- fm_s32 pkt_size = 0;
-
- if (buf_size < TX_BUF_SIZE) {
- return (-1);
- }
-
- freq = (freq - 640) * 2;
-
- buf[0] = FM_TASK_COMMAND_PKT_TYPE;
- buf[1] = FM_TUNE_OPCODE;
- pkt_size = 4;
-
- /* Set desired channel & channel parameter */
- pkt_size += fm_bop_modify(FM_CHANNEL_SET, 0xFC00, freq, &buf[pkt_size], buf_size - pkt_size); /* set 0x65[9:0] = 0x029e, => ((97.5 - 64) * 20) */
- /* Enable hardware controlled tuning sequence */
- pkt_size += fm_bop_modify(FM_MAIN_CTRL, 0xFFFE, TUNE, &buf[pkt_size], buf_size - pkt_size); /* set 0x63[0] = 1 */
- /* Wait for STC_DONE interrupt */
- pkt_size += fm_bop_rd_until(FM_MAIN_INTR, FM_INTR_STC_DONE, FM_INTR_STC_DONE, &buf[pkt_size], buf_size - pkt_size); /* Poll 69[0] = b'1 */
- /* Write 1 clear the STC_DONE interrupt status flag */
- pkt_size += fm_bop_modify(FM_MAIN_INTR, 0xFFFF, FM_INTR_STC_DONE, &buf[pkt_size], buf_size - pkt_size); /* wr 69[0] = 1 */
-
- buf[2] = (fm_u8) ((pkt_size - 4) & 0x00FF);
- buf[3] = (fm_u8) (((pkt_size - 4) >> 8) & 0x00FF);
-
- return pkt_size;
-}
-
-/*
- * mt6626_seek - execute seek action,
- * @buf - target buf
- * @buf_size - buffer size
- * @seekdir - 0=seek up, 1=seek down
- * @space - step, 50KHz:001, 100KHz:010, 200KHz:100
- * @max_freq - upper bound
- * @min_freq - lower bound
- * return package size
- */
-fm_s32 mt6626_seek(fm_u8 *buf, fm_s32 buf_size, fm_u16 seekdir, fm_u16 space, fm_u16 max_freq,
- fm_u16 min_freq)
-{
- fm_s32 pkt_size = 0;
-
- if (buf_size < TX_BUF_SIZE) {
- return (-1);
- }
-
- buf[0] = FM_TASK_COMMAND_PKT_TYPE;
- buf[1] = FM_SEEK_OPCODE;
- pkt_size = 4;
-
- /* Program seek direction */
- if (seekdir == 0) {
- pkt_size += fm_bop_modify(FM_MAIN_CFG1, 0xFBFF, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* 0x66[10] = 0, seek up */
- } else {
- pkt_size += fm_bop_modify(FM_MAIN_CFG1, 0xFFFF, 0x0400, &buf[pkt_size], buf_size - pkt_size); /* 0x66[10] = 1, seek down */
- }
-
- /* Program scan channel spacing */
- if (space == 1) {
- pkt_size += fm_bop_modify(FM_MAIN_CFG1, 0x8FFF, 0x1000, &buf[pkt_size], buf_size - pkt_size); /* clear 0x66[14:12] then 0x66[14:12]=001 */
- } else if (space == 2) {
- pkt_size += fm_bop_modify(FM_MAIN_CFG1, 0x8FFF, 0x2000, &buf[pkt_size], buf_size - pkt_size); /* clear 0x66[14:12] then 0x66[14:12]=010 */
- } else if (space == 4) {
- pkt_size += fm_bop_modify(FM_MAIN_CFG1, 0x8FFF, 0x4000, &buf[pkt_size], buf_size - pkt_size); /* clear 0x66[14:12] then 0x66[14:12]=100 */
- }
- /* enable wrap , if it is not auto scan function, 0x66[11] 0=no wrarp, 1=wrap */
- pkt_size += fm_bop_modify(FM_MAIN_CFG1, 0xFFFF, 0x0800, &buf[pkt_size], buf_size - pkt_size); /* 0x66[11] = 1, wrap */
- /* 0x66[9:0] freq upper bound */
- max_freq = (max_freq - 640) * 2;
- pkt_size +=
- fm_bop_modify(FM_MAIN_CFG1, 0xFC00, max_freq, &buf[pkt_size], buf_size - pkt_size);
- /* 0x67[9:0] freq lower bound */
- min_freq = (min_freq - 640) * 2;
- pkt_size +=
- fm_bop_modify(FM_MAIN_CFG2, 0xFC00, min_freq, &buf[pkt_size], buf_size - pkt_size);
- /* Enable hardware controlled seeking sequence */
- pkt_size += fm_bop_modify(FM_MAIN_CTRL, 0xFFFF, SEEK, &buf[pkt_size], buf_size - pkt_size); /* 0x63[1] = 1 */
- /* Wait for STC_DONE interrupt */
- pkt_size += fm_bop_rd_until(FM_MAIN_INTR, FM_INTR_STC_DONE, FM_INTR_STC_DONE, &buf[pkt_size], buf_size - pkt_size); /* Poll 69[0] = b'1 */
- /* Write 1 clear the STC_DONE interrupt status flag */
- pkt_size += fm_bop_modify(FM_MAIN_INTR, 0xFFFF, FM_INTR_STC_DONE, &buf[pkt_size], buf_size - pkt_size); /* wr 69[0] = 1 */
-
- buf[2] = (fm_u8) ((pkt_size - 4) & 0x00FF);
- buf[3] = (fm_u8) (((pkt_size - 4) >> 8) & 0x00FF);
-
- return pkt_size;
-}
-
-/*
- * mt6626_scan - execute scan action,
- * @buf - target buf
- * @buf_size - buffer size
- * @scandir - 0=seek up, 1=seek down
- * @space - step, 50KHz:001, 100KHz:010, 200KHz:100
- * @max_freq - upper bound
- * @min_freq - lower bound
- * return package size
- */
-fm_s32 mt6626_scan(fm_u8 *buf, fm_s32 buf_size, fm_u16 scandir, fm_u16 space, fm_u16 max_freq,
- fm_u16 min_freq)
-{
- fm_s32 pkt_size = 0;
-
- if (buf_size < TX_BUF_SIZE) {
- return (-1);
- }
-
- buf[0] = FM_TASK_COMMAND_PKT_TYPE;
- buf[1] = FM_SCAN_OPCODE;
- pkt_size = 4;
-
- /* Program seek direction */
- if (scandir == 0) {
- pkt_size += fm_bop_modify(FM_MAIN_CFG1, 0xFBFF, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* 0x66[10] = 0, seek up */
- } else {
- pkt_size += fm_bop_modify(FM_MAIN_CFG1, 0xFFFF, 0x0400, &buf[pkt_size], buf_size - pkt_size); /* 0x66[10] = 1, seek down */
- }
-
- /* Program scan channel spacing */
- if (space == 1) {
- pkt_size += fm_bop_modify(FM_MAIN_CFG1, 0x8FFF, 0x1000, &buf[pkt_size], buf_size - pkt_size); /* clear 0x66[14:12] then 0x66[14:12]=001 */
- } else if (space == 2) {
- pkt_size += fm_bop_modify(FM_MAIN_CFG1, 0x8FFF, 0x2000, &buf[pkt_size], buf_size - pkt_size); /* clear 0x66[14:12] then 0x66[14:12]=010 */
- } else if (space == 4) {
- pkt_size += fm_bop_modify(FM_MAIN_CFG1, 0x8FFF, 0x4000, &buf[pkt_size], buf_size - pkt_size); /* clear 0x66[14:12] then 0x66[14:12]=100 */
- }
- /* disable wrap , if it is auto scan function, 0x66[11] 0=no wrarp, 1=wrap */
- pkt_size += fm_bop_modify(FM_MAIN_CFG1, 0xF7FF, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* 0x66[11] = 0, no wrap */
- /* 0x66[9:0] freq upper bound */
- max_freq = (max_freq - 640) * 2;
- pkt_size +=
- fm_bop_modify(FM_MAIN_CFG1, 0xFC00, max_freq, &buf[pkt_size], buf_size - pkt_size);
- /* 0x67[9:0] freq lower bound */
- min_freq = (min_freq - 640) * 2;
- pkt_size +=
- fm_bop_modify(FM_MAIN_CFG2, 0xFC00, min_freq, &buf[pkt_size], buf_size - pkt_size);
- /* Enable hardware controlled scanning sequence */
- pkt_size += fm_bop_modify(FM_MAIN_CTRL, 0xFFFF, SCAN, &buf[pkt_size], buf_size - pkt_size); /* 0x63[1] = 1 */
- /* Wait for STC_DONE interrupt */
- pkt_size += fm_bop_rd_until(FM_MAIN_INTR, FM_INTR_STC_DONE, FM_INTR_STC_DONE, &buf[pkt_size], buf_size - pkt_size); /* Poll 69[0] = b'1 */
- /* Write 1 clear the STC_DONE interrupt status flag */
- pkt_size += fm_bop_modify(FM_MAIN_INTR, 0xFFFF, FM_INTR_STC_DONE, &buf[pkt_size], buf_size - pkt_size); /* wr 69[0] = 1 */
-
- buf[2] = (fm_u8) ((pkt_size - 4) & 0x00FF);
- buf[3] = (fm_u8) (((pkt_size - 4) >> 8) & 0x00FF);
-
- return pkt_size;
-}
-
-fm_s32 mt6626_get_reg(fm_u8 *buf, fm_s32 buf_size, fm_u8 addr)
-{
- if (buf_size < TX_BUF_SIZE) {
- return (-1);
- }
-
- buf[0] = FM_TASK_COMMAND_PKT_TYPE;
- buf[1] = FSPI_READ_OPCODE;
- buf[2] = 0x01;
- buf[3] = 0x00;
- buf[4] = addr;
-
- WCN_DBG(FM_DBG | CHIP, "%02x %02x %02x %02x %02x\n", buf[0], buf[1], buf[2], buf[3],
- buf[4]);
- return 5;
-}
-
-fm_s32 mt6626_set_reg(fm_u8 *buf, fm_s32 buf_size, fm_u8 addr, fm_u16 value)
-{
- if (buf_size < TX_BUF_SIZE) {
- return (-1);
- }
-
- buf[0] = FM_TASK_COMMAND_PKT_TYPE;
- buf[1] = FSPI_WRITE_OPCODE;
- buf[2] = 0x03;
- buf[3] = 0x00;
- buf[4] = addr;
- buf[5] = (fm_u8) ((value) & 0x00FF);
- buf[6] = (fm_u8) ((value >> 8) & 0x00FF);
-
- WCN_DBG(FM_DBG | CHIP, "%02x %02x %02x %02x %02x %02x %02x\n", buf[0], buf[1], buf[2],
- buf[3], buf[4], buf[5], buf[6]);
- return 7;
-}
diff --git a/drivers/misc/mediatek/fmradio/mt6626/pub/mt6626_fm_eint.c b/drivers/misc/mediatek/fmradio/mt6626/pub/mt6626_fm_eint.c
deleted file mode 100644
index b6cf3d794..000000000
--- a/drivers/misc/mediatek/fmradio/mt6626/pub/mt6626_fm_eint.c
+++ /dev/null
@@ -1,135 +0,0 @@
-/* mt6626_fm_eint.c
- *
- * (C) Copyright 2009
- * MediaTek <www.MediaTek.com>
- * Hongcheng <hongcheng.xia@MediaTek.com>
- *
- * mt6626 FM Radio Driver -- EINT functions
- *
- * 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.
- *
- * 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.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- */
-#include "fm_typedef.h"
-#include "fm_dbg.h"
-#include "fm_err.h"
-#include "fm_eint.h"
-
-#if 0 /* def MT6516 */
-#include <mach/mt6516_eint.h>
-#include <mach/mt6516_gpio.h>
-#endif
-#if 0 /* def MT6573 */
-#include <mach/mt6573_eint.h>
-#include <mach/mt6573_gpio.h>
-#endif
-#if 1 /* def MT6575 */
-#include <mach/eint.h>
-#include <mach/mt6575_gpio.h>
-#endif
-
-#include <cust_eint.h>
-#include <cust_gpio_usage.h>
-
-struct fm_eint_interface {
- void (*mask) (fm_u32 eint_num);
- void (*unmask) (fm_u32 eint_num);
- void (*set_hw_debounce) (fm_u32 eint_num, fm_u32 ms);
- void (*set_polarity) (fm_u32 eint_num, fm_u32 pol);
- fm_u32(*set_sens) (fm_u32 eint_num, fm_u32 sens);
- void (*registration) (fm_u32 eint_num, fm_u32 is_deb_en, fm_u32 pol,
- void (EINT_FUNC_PTR) (void), fm_u32 is_auto_umask);
- fm_s32(*init) (void);
-};
-
-
-#if 0 /* def MT6516 */
-extern void MT6516_EINTIRQUnmask(fm_u32 line);
-extern void MT6516_EINTIRQMask(fm_u32 line);
-extern void MT6516_EINT_Set_HW_Debounce(fm_u8 eintno, fm_u32 ms);
-extern fm_u32 MT6516_EINT_Set_Sensitivity(fm_u8 eintno, kal_bool sens);
-extern void MT6516_EINT_Registration(fm_u8 eintno, kal_bool Dbounce_En,
- kal_bool ACT_Polarity, void (EINT_FUNC_PTR) (void),
- kal_bool auto_umask);
-#endif
-
-static struct fm_eint_interface fm_eint_ops = {
-#if 0 /* def MT6516 */
- .mask = MT6516_EINTIRQMask,
- .unmask = MT6516_EINTIRQUnmask,
- .set_hw_debounce = MT6516_EINT_Set_HW_Debounce,
- .set_polarity = NULL,
- .set_sens = MT6516_EINT_Set_Sensitivity,
- .registration = MT6516_EINT_Registration,
- .init = NULL,
-#else
- .mask = mt65xx_eint_mask,
- .unmask = mt65xx_eint_unmask,
- .set_hw_debounce = mt65xx_eint_set_hw_debounce,
- .set_polarity = mt65xx_eint_set_polarity,
- .set_sens = mt65xx_eint_set_sens,
- .registration = mt65xx_eint_registration,
- .init = mt65xx_eint_init,
-#endif
-};
-
-fm_s32 fm_enable_eint(void)
-{
- WCN_DBG(FM_INF | EINT, "%s\n", __func__);
- fm_eint_ops.unmask(CUST_EINT_FM_RDS_NUM);
- return 0;
-}
-
-fm_s32 fm_disable_eint(void)
-{
- WCN_DBG(FM_INF | EINT, "%s\n", __func__);
- fm_eint_ops.mask(CUST_EINT_FM_RDS_NUM);
- return 0;
-}
-
-fm_s32 fm_request_eint(void (*parser) (void))
-{
- WCN_DBG(FM_NTC | EINT, "%s\n", __func__);
- fm_eint_ops.set_sens(CUST_EINT_FM_RDS_NUM, CUST_EINT_FM_RDS_SENSITIVE);
- fm_eint_ops.set_hw_debounce(CUST_EINT_FM_RDS_NUM, CUST_EINT_FM_RDS_DEBOUNCE_CN);
- fm_eint_ops.registration(CUST_EINT_FM_RDS_NUM,
- CUST_EINT_FM_RDS_DEBOUNCE_EN,
- CUST_EINT_FM_RDS_POLARITY, parser, 0);
- fm_eint_ops.mask(CUST_EINT_FM_RDS_NUM);
- return 0;
-}
-
-fm_s32 fm_eint_pin_cfg(fm_s32 mode)
-{
- int ret = 0;
-
- WCN_DBG(FM_NTC | EINT, "%s\n", __func__);
-
- switch (mode) {
- case FM_EINT_PIN_EINT_MODE:
- mt_set_gpio_mode(GPIO_FM_RDS_PIN, GPIO_FM_RDS_PIN_M_GPIO);
- mt_set_gpio_pull_enable(GPIO_FM_RDS_PIN, GPIO_PULL_ENABLE);
- mt_set_gpio_pull_select(GPIO_FM_RDS_PIN, GPIO_PULL_UP);
- mt_set_gpio_mode(GPIO_FM_RDS_PIN, GPIO_FM_RDS_PIN_M_EINT);
- break;
- case FM_EINT_PIN_GPIO_MODE:
- mt_set_gpio_mode(GPIO_FM_RDS_PIN, GPIO_FM_RDS_PIN_M_GPIO);
- mt_set_gpio_dir(GPIO_FM_RDS_PIN, GPIO_DIR_IN);
- break;
- default:
- ret = -1;
- break;
- }
-
- return ret;
-}
diff --git a/drivers/misc/mediatek/fmradio/mt6626/pub/mt6626_fm_lib.c b/drivers/misc/mediatek/fmradio/mt6626/pub/mt6626_fm_lib.c
deleted file mode 100644
index b3afd4aad..000000000
--- a/drivers/misc/mediatek/fmradio/mt6626/pub/mt6626_fm_lib.c
+++ /dev/null
@@ -1,1153 +0,0 @@
-#include <linux/semaphore.h>
-#include <linux/delay.h>
-#include <linux/slab.h>
-
-#include "fm_typedef.h"
-#include "fm_dbg.h"
-#include "fm_err.h"
-#include "fm_interface.h"
-#include "fm_stdlib.h"
-#include "fm_patch.h"
-#include "fm_config.h"
-
-#include "mt6626_fm_reg.h"
-#include "mt6626_fm.h"
-#include "mt6626_drv_dsp.h"
-#include "mt6626_fm_link.h"
-#include "mt6626_fm_lib.h"
-#include "mt6626_fm_cmd.h"
-
-#define MT6626_FM_PATCH_PATH "/etc/firmware/mt6626_fm_patch.bin"
-#define MT6626_FM_COEFF_PATH "/etc/firmware/mt6626_fm_coeff.bin"
-#define MT6626_FM_HWCOEFF_PATH "/etc/firmware/mt6626_fm_hwcoeff.bin"
-#define MT6626_FM_ROM_PATH "/etc/firmware/mt6626_fm_rom.bin"
-
-extern void fm_low_power_wa(int fmon);
-extern void mt66x6_poweron(int idx);
-extern void mt66x6_poweroff(int idx);
-
-static struct fm_callback *fm_cb_op;
-
-/* mt6626 FM Receiver Power Up Sequence*/
-static const struct ctrl_word_operation PowerOnSetting[] = {
- /* @Wholechip FM Power Up: FM Digital Clock enable */
- {0x60, 0x0, 0x3000},
- {0x60, 0x0, 0x3001},
- {MSDELAY, 0x0, 0x0003}, /* Delay 3ms */
- {0x60, 0x0, 0x3003},
- {0x60, 0x0, 0x3007},
- {HW_VER, 0x99, 0x0000},
- /* antenna and audio path config */
-#ifdef FMRADIO_I2S_SUPPORT
-#ifdef FM_PowerOn_with_ShortAntenna
- {0x61, 0xFF73, 0x0090}, /* no low power mode, I2S, short antenna */
-#else
- {0x61, 0xFF73, 0x0080}, /* no low power mode, I2S, long antenna */
-#endif
- {0x9B, 0xFFF7, 0x0008}, /* 0000->master, 0008->slave */
- {0x5F, 0xE7FF, 0x0000}, /* 0000->32K, 0800->44.1K, 1000->48K */
- /* {0x61, 0xFF73, 0x0080},//no low power mode, I2S, long antenna, 0xff63 */
- /* {0x9B, 0xFFF7, 0x0008},//0000->master, 0008->slave */
- /* {0x5F, 0xE7FF, 0x0000},//0000->32K, 0800->44.1K, 1000->48K */
-#else
-#ifdef FM_PowerOn_with_ShortAntenna
- {0x61, 0xFF63, 0x0010}, /* no low power mode, analog line in, short antenna */
-#else
- {0x61, 0xFF63, 0x0000}, /* no low power mode, analog line in, long antenna */
-#endif
-#endif
- {HW_VER, 0x0062, 0x0000}, /* read the HW version */
-
- /* @Wholechip FM Power Up: FM Digital Init: download patch/DSP coefficient/HWACC coefficient */
- {DSPPATCH, 0x0, DSP_PATH},
- {DSPPATCH, 0x0, DSP_COEFF},
- {DSPPATCH, 0x0, DSP_HW_COEFF},
- {0x90, 0x0, 0x0040},
- {0x90, 0x0, 0x0000},
-
- /* @Wholechip FM Power Up: FM Digital Init: fm_rgf_maincon */
- {0x6A, 0x0, 0x0020},
- {0x6B, 0x0, 0x0020},
- {0x60, 0x0, 0x300F},
- {0x61, 0xFFFF, 0x0002},
- {0x61, 0xFFFE, 0x0000},
- {POLL_P, 0x64, 0x2}
-};
-
-#define POWER_ON_COMMAND_COUNT (sizeof(PowerOnSetting)/sizeof(PowerOnSetting[0]))
-
-static int Chip_Version = mt6626_E1;
-
-
-static fm_s32 mt6626_pwron(fm_s32 data)
-{
- mt66x6_poweron(MT66x6_FM);
- return 0;
-}
-
-
-static fm_s32 mt6626_pwroff(fm_s32 data)
-{
- mt66x6_poweroff(MT66x6_FM);
- return 0;
-}
-
-static fm_s32 Delayms(fm_u32 data)
-{
- WCN_DBG(FM_DBG | CHIP, "delay %dms\n", data);
- msleep(data);
- return 0;
-}
-
-static fm_s32 Delayus(fm_u32 data)
-{
- WCN_DBG(FM_DBG | CHIP, "delay %dus\n", data);
- udelay(data);
- return 0;
-}
-
-static fm_s32 mt6626_read(fm_u8 addr, fm_u16 *val)
-{
- fm_s32 ret = 0;
-
- ret = fm_ctrl_rx(addr, val);
-
- if (ret) {
- WCN_DBG(FM_ALT | CHIP, "rd 0x%02x err\n", addr);
- return ret;
- }
-
- WCN_DBG(FM_DBG | CHIP, "rd 0x%02x 0x%04x\n", addr, *val);
- return ret;
-}
-
-static fm_s32 mt6626_write(fm_u8 addr, fm_u16 val)
-{
- fm_s32 ret = 0;
-
- ret = fm_ctrl_tx(addr, val);
-
- if (ret) {
- WCN_DBG(FM_ALT | CHIP, "wr 0x%02x err\n", addr);
- return ret;
- }
-
- WCN_DBG(FM_DBG | CHIP, "wr 0x%02x 0x%04x\n", addr, val);
- return ret;
-}
-
-static fm_s32 mt6626_write1(fm_u8 addr, fm_u16 val)
-{
- return fm_ctrl_tx(addr, val);
-}
-
-static fm_s32 mt6626_set_bits(fm_u8 addr, fm_u16 bits, fm_u16 mask)
-{
- fm_s32 ret = 0;
- fm_u16 val;
-
- ret = mt6626_read(addr, &val);
-
- if (ret)
- return ret;
-
- val = ((val & (mask)) | bits);
- ret = mt6626_write(addr, val);
-
- return ret;
-}
-
-static fm_u16 mt6626_get_chipid(void)
-{
- return 0x6626;
-}
-
-static void mt6626_TUNE_ON(void)
-{
- fm_u16 dataRead;
-
- WCN_DBG(FM_DBG | CHIP, "tune on\n");
- mt6626_read(FM_MAIN_CTRL, &dataRead);
- /* mt6626_write(FM_MAIN_CTRL, (dataRead&0xFFFE)|TUNE); */
- mt6626_write(FM_MAIN_CTRL, (dataRead & 0xFFF8) | TUNE);
-}
-
-static void mt6626_SEEK_ON(void)
-{
- fm_u16 dataRead;
-
- WCN_DBG(FM_DBG | CHIP, "seek on\n");
- mt6626_read(FM_MAIN_CTRL, &dataRead);
- /* mt6626_write(FM_MAIN_CTRL, (dataRead&0xFFFD)|SEEK); */
- mt6626_write(FM_MAIN_CTRL, (dataRead & 0xFFF8) | SEEK);
-}
-
-static void mt6626_SCAN_ON(void)
-{
- fm_u16 dataRead;
-
- WCN_DBG(FM_DBG | CHIP, "scan on\n");
- mt6626_read(FM_MAIN_CTRL, &dataRead);
- /* mt6626_write(FM_MAIN_CTRL, (dataRead&0xFFFB)|SCAN); */
- mt6626_write(FM_MAIN_CTRL, (dataRead & 0xFFF8) | SCAN);
-}
-
-/* MT6628_SetAntennaType - set Antenna type
- * @type - 1,Short Antenna; 0, Long Antenna
- */
-static fm_s32 mt6626_SetAntennaType(fm_s32 type)
-{
- fm_u16 dataRead;
-
- WCN_DBG(FM_DBG | CHIP, "set ana to %s\n", type ? "short" : "long");
- mt6626_read(FM_MAIN_CG2_CTRL, &dataRead);
-
- if (type) {
- dataRead |= ANTENNA_TYPE;
- } else {
- dataRead &= (~ANTENNA_TYPE);
- }
-
- mt6626_write(FM_MAIN_CG2_CTRL, dataRead);
-
- return 0;
-}
-
-static fm_s32 mt6626_GetAntennaType(void)
-{
- fm_u16 dataRead;
-
- mt6626_read(FM_MAIN_CG2_CTRL, &dataRead);
- WCN_DBG(FM_DBG | CHIP, "get ana type: %s\n", (dataRead & ANTENNA_TYPE) ? "short" : "long");
-
- if (dataRead & ANTENNA_TYPE)
- return FM_SHORT_ANA; /* short antenna */
- else
- return FM_LONG_ANA; /* long antenna */
-}
-
-static fm_s32 mt6626_writeFA(fm_u16 *buff, fm_u8 fa)
-{
- fm_u8 i = 0;
-
- for (i = 0; i < 3; i++) {
- if ((fa >> i) & 0x1)
- *buff |= (1 << (12 + i));
- else
- *buff &= ~(1 << (12 + i));
- }
-
- return 0;
-}
-
-static fm_s32 mt6626_Mute(fm_bool mute)
-{
- fm_u16 dataRead;
-
- WCN_DBG(FM_DBG | CHIP, "set %s\n", mute ? "mute" : "unmute");
- mt6626_read(FM_MAIN_CTRL, &dataRead);
-
- if (mute == 1) {
- mt6626_write(FM_MAIN_CTRL, (dataRead & 0xFFDF) | 0x0020);
- } else {
- mt6626_write(FM_MAIN_CTRL, (dataRead & 0xFFDF));
- }
-
- return 0;
-}
-
-/*
- * mt6626_WaitSTCDone - wait for stc done flag change to '1'
- * @waittime - the total wait time in ms
- * @interval - the delay time of every polling loop in ms
- * if success, return 0; else error code
- */
-static fm_s32 mt6626_WaitSTCDone(fm_u32 waittime, fm_u32 interval)
-{
- fm_u16 dataRead;
- fm_s32 cnt;
-
- if (interval) {
- cnt = waittime / interval;
- } else {
- cnt = 0;
- }
-
- do {
- if (cnt-- < 0) {
- return -1; /* wait for STC done failed */
- }
-
- Delayms(interval);
- mt6626_read(FM_MAIN_INTR, &dataRead);
- } while ((dataRead & FM_INTR_STC_DONE) == 0);
-
- return 0;
-}
-
-static fm_s32 mt6626_ClearSTCDone(void)
-{
- fm_u16 dataRead;
-
- mt6626_read(FM_MAIN_INTR, &dataRead);
- mt6626_write(FM_MAIN_INTR, dataRead | FM_INTR_STC_DONE); /* clear status flag */
- return 0;
-}
-
-static fm_s32 mt6626_RampDown(void)
-{
- fm_u16 dataRead;
-
- WCN_DBG(FM_DBG | CHIP, "ramp down\n");
- /* Clear DSP state */
- mt6626_read(FM_MAIN_CTRL, &dataRead);
- mt6626_write(FM_MAIN_CTRL, (dataRead & 0xFFF0)); /* clear rgf_tune/seek/scan/dsp_init */
-
- /* Set DSP ramp down state */
- mt6626_read(FM_MAIN_CTRL, &dataRead);
- mt6626_write(FM_MAIN_CTRL, (dataRead | RAMP_DOWN));
-
- /* Check STC_DONE status flag (not the interrupt flag!) */
- if (mt6626_WaitSTCDone(1000, 1)) {
- WCN_DBG(FM_ALT | CHIP, "ramp down failed\n");
- return -1;
- }
- /* Clear DSP ramp down state */
- mt6626_read(FM_MAIN_CTRL, &dataRead);
- mt6626_write(FM_MAIN_CTRL, (dataRead & (~RAMP_DOWN)));
-
- mt6626_ClearSTCDone();
- return 0;
-}
-
-/*
-* mt6626_DspPatch - DSP download procedure
-* @img - source dsp bin code
-* @type - rom/patch/coefficient/hw_coefficient
-*
-*/
-static fm_s32 mt6626_DspPatch(const fm_u16 *img, enum IMG_TYPE type)
-{
- fm_u32 ctrl_code = 0;
- fm_u16 data_len = 0; /* in words */
- fm_u16 i;
-
- FMR_ASSERT(img);
-
- WCN_DBG(FM_DBG | CHIP, "down load DSP patch %d (1-rom, 2-patch, 3-coe, 4-hwcoe)\n", type);
-
- switch (type) {
- case IMG_ROM: /* rom code */
- case IMG_PATCH: /* patch */
- ctrl_code = 0x10;
- break;
- case IMG_COEFFICIENT: /* coeff */
- ctrl_code = 0xe;
- break;
- case IMG_HW_COEFFICIENT: /* HW coeff */
- ctrl_code = 0xd;
- break;
- default:
- break;
- }
-
- data_len = img[1] - img[0] + 1;
- WCN_DBG(FM_DBG | CHIP, "patch len: %d\n", data_len);
-
- if (!(data_len > 0)) {
- ; /* error */
- return -FM_EPARA;
- }
-
- mt6626_write(FM_DSP_PATCH_CTRL, 0);
- mt6626_write(FM_DSP_PATCH_OFFSET, img[0]); /* Start address */
- mt6626_write(FM_DSP_PATCH_CTRL, 0x40); /* Reset download control */
- mt6626_write(FM_DSP_PATCH_CTRL, ctrl_code); /* Set download control */
-
- switch (type) {
- case IMG_ROM:
- case IMG_PATCH:
- case IMG_HW_COEFFICIENT:
- WCN_DBG(FM_DBG | CHIP, "rom/patch/hw_coefficient downloading......\n");
-
- for (i = 0; i < data_len; i++) {
- mt6626_write1(FM_DSP_PATCH_DATA, img[2 + i]);
- }
-
- break;
- case IMG_COEFFICIENT:
- WCN_DBG(FM_DBG | CHIP, "coefficient downloading......\n");
-
- if (MT6626_DEEMPHASIS_50us) {
- for (i = 0; i < data_len; i++) {
- if (i == 86) {
- mt6626_write1(FM_DSP_PATCH_DATA,
- fm_cust_config_fetch(FM_CFG_RX_RSSI_TH_LONG));
- } else if (i == 292) {
- mt6626_write1(FM_DSP_PATCH_DATA, 0x332B);
- mt6626_write1(FM_DSP_PATCH_DATA, 0x2545);
- mt6626_write1(FM_DSP_PATCH_DATA, 0x1344);
- mt6626_write1(FM_DSP_PATCH_DATA, 0x09F5);
- mt6626_write1(FM_DSP_PATCH_DATA, 0x0526);
- mt6626_write1(FM_DSP_PATCH_DATA, 0x02A9);
- mt6626_write1(FM_DSP_PATCH_DATA, 0x0160);
- mt6626_write1(FM_DSP_PATCH_DATA, 0x00B6);
- mt6626_write1(FM_DSP_PATCH_DATA, 0x005E);
- mt6626_write1(FM_DSP_PATCH_DATA, 0x0031);
- mt6626_write1(FM_DSP_PATCH_DATA, 0x0000);
- mt6626_write1(FM_DSP_PATCH_DATA, 0x0000);
- mt6626_write1(FM_DSP_PATCH_DATA, 0x0000);
- i += 12;
- } else if (i == 505) {
- mt6626_write1(FM_DSP_PATCH_DATA,
- fm_cust_config_fetch
- (FM_CFG_RX_RSSI_TH_SHORT));
- } else {
- mt6626_write1(FM_DSP_PATCH_DATA, img[2 + i]);
- }
- }
- } else {
- for (i = 0; i < data_len; i++) {
- if (i == 86) {
- mt6626_write1(FM_DSP_PATCH_DATA,
- fm_cust_config_fetch(FM_CFG_RX_RSSI_TH_LONG));
- } else if (i == 505) {
- mt6626_write1(FM_DSP_PATCH_DATA,
- fm_cust_config_fetch
- (FM_CFG_RX_RSSI_TH_SHORT));
- } else {
- mt6626_write1(FM_DSP_PATCH_DATA, img[2 + i]);
- }
- }
- }
-
- break;
- default:
- break;
- }
-
- WCN_DBG(FM_DBG | CHIP, "down load DSP patch %d ok\n", type);
- return 0;
-}
-
-static fm_s32 mt6626_PowerUp(fm_u16 *chip_id, fm_u16 *device_id)
-{
- fm_s32 ret = 0;
- fm_s32 i;
- fm_u16 tmp_reg, cnt = 0;
-
- const fm_u16 *bin_patch = NULL;
- const fm_u16 *bin_coeff = NULL;
-
- FMR_ASSERT(chip_id);
- FMR_ASSERT(device_id);
-
- WCN_DBG(FM_DBG | CHIP, "pwr on seq\n");
-
- /* mt6626 FM power on sequence */
- for (i = 0; i < POWER_ON_COMMAND_COUNT; i++) {
- switch (PowerOnSetting[i].addr) {
- case FM_PUS_DSPPATCH:
-
- switch (PowerOnSetting[i].or) {
- case DSP_PATH: /* DSP path download */
- mt6626_DspPatch(bin_patch, IMG_PATCH);
- break;
- case DSP_COEFF: /* DSP coefficient download */
- mt6626_DspPatch(bin_coeff, IMG_COEFFICIENT);
- break;
- case DSP_HW_COEFF: /* DSP HW coefficient download */
- mt6626_DspPatch(bin_hw_coeff, IMG_HW_COEFFICIENT);
- break;
- default:
- break;
- }
-
- break;
- case FM_PUS_POLL_P:
- cnt = 0;
-
- do {
- mt6626_read((fm_u8) PowerOnSetting[i].and, &tmp_reg);
- tmp_reg &= PowerOnSetting[i].or;
-
- if (tmp_reg == 0) {
- Delayms(10);
- cnt++;
- }
- } while ((tmp_reg == 0) && (cnt < (MT6626_MAX_COUNT << 1)));
-
- if (cnt == (MT6626_MAX_COUNT << 1)) {
- WCN_DBG(FM_ALT | CHIP, "polling status Active failed:0x%02X\n",
- (fm_u8) PowerOnSetting[i].and);
- return -FM_EPARA;
- }
-
- break;
- case FM_PUS_POLL_N:
- cnt = 0;
-
- do {
- mt6626_read((fm_u8) PowerOnSetting[i].and, &tmp_reg);
- tmp_reg &= PowerOnSetting[i].or;
-
- if (tmp_reg != 0) {
- Delayms(10);
- cnt++;
- }
- } while ((tmp_reg != 0) && (cnt < MT6626_MAX_COUNT));
-
- if (cnt == MT6626_MAX_COUNT) {
- WCN_DBG(FM_ALT | CHIP, "polling status Negative failed:0x%02X\n",
- (fm_u8) PowerOnSetting[i].and);
- return -FM_EPARA;
- }
-
- break;
- case FM_PUS_USDELAY:
- Delayus(PowerOnSetting[i].or);
- break;
- case FM_PUS_MSDELAY:
- Delayms(PowerOnSetting[i].or);
- break;
- case FM_PUS_HW_VER:
-
- switch (PowerOnSetting[i].and) {
- case 0x99:
- mt6626_read(0x99, &tmp_reg);
-
- switch (tmp_reg) {
- case 0x0:
- Chip_Version = mt6626_E1;
- bin_patch = bin_patch_E1;
- bin_coeff = bin_coeff_E1;
- break;
- case 0x8A01:
- default:
- Chip_Version = mt6626_E2;
- bin_patch = bin_patch_E2;
- bin_coeff = bin_coeff_E2;
- break;
- }
-
- break;
- case 0x62:
- mt6626_read((fm_u8) PowerOnSetting[i].and, &tmp_reg);
- /* record chip id & device id */
- *chip_id = tmp_reg;
- *device_id = tmp_reg;
- WCN_DBG(FM_NTC | CHIP, "chip_id:0x%04x\n", tmp_reg);
- break;
- case 0x1C:
- mt6626_read((fm_u8) PowerOnSetting[i].and, &tmp_reg);
-
- if (PowerOnSetting[i].or) {
- mt6626_write(PowerOnSetting[i].and, (tmp_reg | 0x8000));
- } else {
- mt6626_write(PowerOnSetting[i].and, (tmp_reg & 0x7FFF));
- }
-
- break;
- default:
- break;
- }
-
- break;
- default:
-
- if (PowerOnSetting[i].and != 0) {
- if (mt6626_read((fm_u8) PowerOnSetting[i].addr, &tmp_reg)) {
- WCN_DBG(FM_ALT | CHIP,
- "power up failed, can't read reg %02X\n",
- (fm_u8) PowerOnSetting[i].and);
- return -FM_EPARA;
- }
-
- tmp_reg &= PowerOnSetting[i].and;
- tmp_reg |= PowerOnSetting[i].or;
- } else {
- tmp_reg = PowerOnSetting[i].or;
- }
-
- if (mt6626_write((fm_u8) PowerOnSetting[i].addr, tmp_reg)) {
- WCN_DBG(FM_ALT | CHIP, "power up failed, can't write reg %02X\n",
- (fm_u8) PowerOnSetting[i].addr);
- return -FM_EPARA;
- }
-
- break;
- }
- }
-
- WCN_DBG(FM_DBG | CHIP, "pwr on seq done\n");
- return ret;
-}
-
-static fm_s32 mt6626_PowerDown(void)
-{
- fm_s32 ret = 0;
- fm_s16 i;
- fm_u16 dataRead;
-
- /*SW work around for MCUFA issue.
- *if interrupt happen before doing rampdown, DSP can't switch MCUFA back well.
- * In case read interrupt, and clean if interrupt found before rampdown.
- */
- WCN_DBG(FM_DBG | CHIP, "pwr down seq\n");
- mt6626_read(FM_MAIN_INTR, &dataRead);
-
- if (dataRead & 0x1) {
- mt6626_write(FM_MAIN_INTR, dataRead); /* clear status flag */
- }
-
- mt6626_RampDown();
-
- mt6626_write(0x60, 0x330F);
- mt6626_write(FM_MAIN_CG2_CTRL, 1);
-
- for (i = 0; i < 4; i++) {
- mt6626_read(0x6E, &dataRead);
- mt6626_write(0x6E, (dataRead & 0xFFF8));
- }
-
- mt6626_write(FM_MAIN_CG1_CTRL, 0);
- mt6626_write(FM_MAIN_CG1_CTRL, 0x4000);
- mt6626_write(FM_MAIN_CG1_CTRL, 0);
-
- return ret;
-}
-
-static fm_bool mt6626_SetFreq(fm_u16 freq)
-{
- fm_u32 CHAN = 0x0000;
- fm_u16 dataRead, cnt = 0, tempbuff = 0;
-
- Rampdown_again:
- mt6626_RampDown();
-
- fm_cb_op->cur_freq_set(freq);
- CHAN = (freq - 640) << 1;
- mt6626_read(FM_CHANNEL_SET, &dataRead);
-
- switch (Chip_Version) {
- case mt6626_E1:
-
- if (((fm_u8) ((dataRead & 0x1000) >> 12)) ^ (channel_parameter[freq - 760] & 0x1)) {
- mt6626_read(0x61, &tempbuff);
- mt6626_write(0x60, 0x330F);
- mt6626_write(0x61, 1);
- mt6626_write(0x6e, 0x0);
- mt6626_write(0x6e, 0x0);
- mt6626_write(0x6e, 0x0);
- mt6626_write(0x6e, 0x0);
- mt6626_write(0x60, 0x0);
- mt6626_write(0x60, 0x4000);
- mt6626_write(0x60, 0x0);
- mt6626_write(0x60, 0x3000);
- mt6626_write(0x60, 0x3001);
- Delayms(3);
- mt6626_write(0x60, 0x3003);
- mt6626_write(0x60, 0x3007);
- mt6626_write(0x60, 0x300f);
- mt6626_write(0x61, tempbuff | 0x3);
- mt6626_write(0x61, tempbuff | 0x2);
- mt6626_write(0x6A, 0x20);
- mt6626_write(0x6B, 0x20);
- Delayms(200);
- }
-
- break;
- case mt6626_E2:
- break;
- default:
- break;
-
- }
-
- mt6626_writeFA(&dataRead, (channel_parameter[freq - 760]));
- mt6626_write(FM_CHANNEL_SET, (dataRead & 0xFC00) | CHAN);
-
- mt6626_TUNE_ON();
-
- if (mt6626_WaitSTCDone(5000, 15)) {
- if (cnt++ > 100) {
- WCN_DBG(FM_ALT | CHIP, "set freq failed\n");
- return FALSE;
- } else {
- WCN_DBG(FM_WAR | CHIP, "set freq retry, cnt=%d\n", cnt);
- goto Rampdown_again;
- }
- }
-
- mt6626_ClearSTCDone(); /* clear status flag */
-
- WCN_DBG(FM_DBG | CHIP, "set freq to %d ok\n", freq);
- return TRUE;
-}
-
-/*
-* mt6626_Seek
-* pFreq: IN/OUT parm, IN start freq/OUT seek valid freq
-* return fm_true:seek success; fm_false:seek failed
-*/
-static fm_bool mt6626_Seek(fm_u16 min_freq, fm_u16 max_freq, fm_u16 *pFreq, fm_u16 seekdir,
- fm_u16 space)
-{
- fm_u16 dataRead;
- fm_u16 freq_l;
- fm_u16 freq_h;
-
- mt6626_RampDown();
- mt6626_Mute(fm_true);
-
- WCN_DBG(FM_DBG | CHIP, "min_freq:%d, max_freq:%d\n", min_freq, max_freq);
-
- /* Program seek direction */
- mt6626_read(FM_MAIN_CFG1, &dataRead);
- dataRead &= 0xFBFF;
-
- if (seekdir == 0) {
- dataRead |= 0x0000;
- } else {
- dataRead |= 0x0400;
- }
-
- WCN_DBG(FM_DBG | CHIP, "seek %s\n", seekdir ? "down" : "up");
- /* Program scan channel spacing */
- dataRead &= 0x8FFF;
-
- if (space == 4) {
- dataRead |= 0x4000;
- } else {
- dataRead |= 0x2000;
- }
-
- WCN_DBG(FM_DBG | CHIP, "seek space %d\n", space);
- /* enable wrap , if it is not auto scan function, 0x66[11] 0=no wrarp, 1=wrap */
- dataRead &= 0xF7FF;
- dataRead |= 0x0800;
- /* 0x66[9:0] freq upper bound */
- max_freq = (max_freq - 640) * 2;
- dataRead &= 0xFC00;
- dataRead |= max_freq;
- mt6626_write(FM_MAIN_CFG1, dataRead);
- /* 0x67[9:0] freq lower bound */
- mt6626_read(FM_MAIN_CFG2, &dataRead);
- min_freq = (min_freq - 640) * 2;
- dataRead &= 0xFC00;
- dataRead |= min_freq;
- mt6626_write(FM_MAIN_CFG2, dataRead);
- /* Enable STC done intr */
- mt6626_set_bits(FM_MAIN_EXTINTRMASK, FM_EXT_STC_DONE_MASK, 0xFFFE);
- mt6626_SEEK_ON();
-
- if (fm_wait_stc_done(MT6626_FM_STC_DONE_TIMEOUT) == fm_false) {
- WCN_DBG(FM_ALT | CHIP, "seek, get stc done failed\n");
- mt6626_set_bits(FM_MAIN_INTR, 0x0001, 0xFFFF);
- mt6626_RampDown();
- return fm_false;
- }
- /* Disable STC done intr */
- mt6626_set_bits(FM_MAIN_EXTINTRMASK, 0, 0xFFFE);
- /* get the result freq */
- mt6626_read(FM_MAIN_CHANDETSTAT, &dataRead);
- mt6626_write(FM_CHANNEL_SET, (dataRead & FM_HOST_CHAN) >> 4);
- *pFreq = 640 + ((dataRead & FM_MAIN_CHANDET_MASK) >> (FM_MAIN_CHANDET_SHIFT + 1));
- freq_l = fm_cust_config_fetch(FM_CFG_RX_BAND_FREQ_L);
- freq_h = fm_cust_config_fetch(FM_CFG_RX_BAND_FREQ_H);
- *pFreq = (*pFreq > freq_h) ? freq_h : *pFreq;
- *pFreq = (*pFreq < freq_l) ? freq_l : *pFreq;
- fm_cb_op->cur_freq_set(*pFreq);
- WCN_DBG(FM_NTC | CHIP, "seek, result freq:%d\n", *pFreq);
- mt6626_Mute(fm_false);
-
- return fm_true;
-}
-
-static fm_bool mt6626_Scan(fm_u16 min_freq, fm_u16 max_freq,
- fm_u16 *pFreq,
- fm_u16 *pScanTBL, fm_u16 *ScanTBLsize, fm_u16 scandir, fm_u16 space)
-{
- fm_u16 tmp_reg, space_val, startfreq, offset = 0;
- fm_u16 tmp_scanTBLsize = *ScanTBLsize;
- fm_u16 dataRead;
-
- if ((!pScanTBL) || (tmp_scanTBLsize == 0)) {
- WCN_DBG(FM_ALT | CHIP, "scan, failed:invalid scan table\n");
- return fm_false;
- }
-
- WCN_DBG(FM_DBG | CHIP,
- "scan start freq: %d, max_freq:%d, min_freq:%d, scan BTL size:%d, scandir:%d, space:%d\n",
- *pFreq, max_freq, min_freq, *ScanTBLsize, scandir, space);
-
- if (tmp_scanTBLsize > MT6626_SCANTBL_SIZE) {
- tmp_scanTBLsize = MT6626_SCANTBL_SIZE;
- }
-
- if (space == MT6626_FM_SPACE_200K) {
- space_val = 2; /* 200K */
- } else if (space == MT6626_FM_SPACE_100K) {
- space_val = 1; /* 100K */
- } else {
- space_val = 1; /* 100K */
- }
-
- /* scan up */
- if (scandir == MT6626_FM_SCAN_UP) {
- startfreq = min_freq - space_val;
- } else {
- startfreq = max_freq + space_val; /* max_freq compare need or not */
- }
-
- mt6626_RampDown();
- mt6626_Mute(fm_true);
-
- /* set freq */
- if (fm_false == mt6626_SetFreq(startfreq)) {
- WCN_DBG(FM_ALT | CHIP, "scan, failed set freq\n");
- return fm_false;
- }
-
- mt6626_RampDown();
-
- /* set space(100k/200k)and band(min_freq~max_freq) and up/down and disable wrap */
- mt6626_read(FM_MAIN_CFG2, &dataRead);
- mt6626_write(FM_MAIN_CFG2, (dataRead & 0xFC00) | ((min_freq - 640) << 1)); /* set space(100k/200k)and band(875~1080)and up/down */
- mt6626_read(FM_MAIN_CFG1, &dataRead);
- mt6626_write(FM_MAIN_CFG1, (dataRead & 0x8800) | (scandir << 10) | (1 << (12 + space)) | ((max_freq - 640) << 1)); /* set space(100k/200k)and band(875~1080)and up/down */
- mt6626_read(FM_MAIN_CFG1, &dataRead);
- mt6626_write(FM_MAIN_CFG1, dataRead & 0xF7FF); /* disable wrap , if it is auto scan function */
-
- /* Enable STC done intr */
- mt6626_set_bits(FM_MAIN_EXTINTRMASK, FM_EXT_STC_DONE_MASK, 0xFFFE);
- /* scan on */
- mt6626_SCAN_ON();
-
- if (fm_wait_stc_done(MT6626_FM_STC_DONE_TIMEOUT) == fm_false) {
- WCN_DBG(FM_ALT | CHIP, "scan, get stc done failed\n");
- mt6626_set_bits(FM_MAIN_INTR, 0x0001, 0xFFFF);
- mt6626_RampDown();
-
- /* get the valid freq after scan */
- mt6626_read(FM_MAIN_CHANDETSTAT, &tmp_reg);
- tmp_reg = 640 + ((tmp_reg & FM_MAIN_CHANDET_MASK) >> (FM_MAIN_CHANDET_SHIFT + 1));
- *pFreq = tmp_reg;
- WCN_DBG(FM_DBG | CHIP, "scan, failed freq:%d\n", *pFreq);
- return fm_false;
- }
- /* Disable STC done intr */
- mt6626_set_bits(FM_MAIN_EXTINTRMASK, 0, 0xFFFE);
-
- /* get scan Table */
- WCN_DBG(FM_DBG | CHIP, "mt6626_Scan tbl:");
-
- for (offset = 0; offset < tmp_scanTBLsize; offset++) {
- mt6626_read(FM_RDS_DATA_REG, &tmp_reg);
- *(pScanTBL + offset) = tmp_reg;
- }
-
- *ScanTBLsize = tmp_scanTBLsize;
-
- /* get the valid freq after scan */
- mt6626_read(FM_MAIN_CHANDETSTAT, &tmp_reg);
- tmp_reg = 640 + ((tmp_reg & FM_MAIN_CHANDET_MASK) >> (FM_MAIN_CHANDET_SHIFT + 1));
- *pFreq = tmp_reg;
- WCN_DBG(FM_DBG | CHIP, "scan, after scan freq:%d\n", *pFreq);
- mt6626_Mute(fm_false);
-
- return fm_true;
-}
-
-/*
- * mt6626_GetCurRSSI - get current freq's RSSI value
- * RS=RSSI
- * If RS>511, then RSSI(dBm)= (RS-1024)/16*6
- * else RSSI(dBm)= RS/16*6
- */
-static fm_s32 mt6626_GetCurRSSI(fm_s32 *pRSSI)
-{
- fm_u16 tmp_reg;
-
- mt6626_read(FM_RSSI_IND, &tmp_reg);
- tmp_reg = tmp_reg & 0x03ff;
-
- if (pRSSI) {
- *pRSSI = (tmp_reg > 511) ? (((tmp_reg - 1024) * 6) >> 4) : ((tmp_reg * 6) >> 4);
- WCN_DBG(FM_DBG | CHIP, "rssi:%d, dBm:%d\n", tmp_reg, *pRSSI);
- } else {
- WCN_DBG(FM_ERR | CHIP, "get rssi para error\n");
- return -FM_EPARA;
- }
-
- return 0;
-}
-
-static fm_s32 mt6626_SetVol(fm_u8 vol)
-{
-#define MT6626_VOL_MAX 0x2B /* 43 volume(0-15) */
- int ret = 0;
- fm_u8 tmp_vol = vol & 0x3f;
- fm_u16 tmp = 0;
-
- mt6626_read(0x60, &tmp);
- mt6626_write(0x60, tmp & 0xFFF7); /* 0x60 D3=0 */
-
- tmp_vol = vol * 3;
- if (tmp_vol > MT6626_VOL_MAX)
- tmp_vol = MT6626_VOL_MAX;
-
- ret = mt6626_set_bits(0x9C, (tmp_vol << 8), 0xC0FF);
-
- if (ret) {
- WCN_DBG(FM_ERR | CHIP, "Set vol=%d Failed\n", tmp_vol);
- return ret;
- } else {
- WCN_DBG(FM_DBG | CHIP, "Set vol=%d OK\n", tmp_vol);
- }
-
- mt6626_write(0x60, tmp); /* 0x60 D3=1 */
- return 0;
-}
-
-static fm_s32 mt6626_GetVol(fm_u8 *pVol)
-{
- int ret = 0;
- fm_u16 tmp_reg;
- fm_u16 tmp = 0;
-
- FMR_ASSERT(pVol);
-
- mt6626_read(0x60, &tmp);
- mt6626_write(0x60, tmp & 0xFFF7); /* 0x60 D3=0 */
-
- ret = mt6626_read(0x9C, &tmp_reg);
-
- if (ret) {
- *pVol = 0;
- WCN_DBG(FM_ERR | CHIP, "Get vol Failed\n");
- return ret;
- } else {
- *pVol = (tmp_reg >> 8) & 0x3f;
- WCN_DBG(FM_DBG | CHIP, "Get vol=%d OK\n", *pVol);
- }
-
- mt6626_write(0x60, tmp); /* 0x60 D3=1 */
- return 0;
-}
-
-static fm_s32 mt6626_dump_reg(void)
-{
- return 0;
-}
-
-static fm_bool mt6626_GetMonoStereo(fm_u16 *pMonoStereo)
-{
-#define FM_BF_STEREO 0x1000
- fm_u16 TmpReg;
-
- if (pMonoStereo) {
- mt6626_read(FM_RSSI_IND, &TmpReg);
- *pMonoStereo = (TmpReg & FM_BF_STEREO) >> 12;
- } else {
- WCN_DBG(FM_ERR | CHIP, "MonoStero: para err\n");
- return fm_false;
- }
-
- WCN_DBG(FM_DBG | CHIP, "MonoStero:0x%04x\n", *pMonoStereo);
- return fm_true;
-}
-
-static fm_s32 mt6626_SetMonoStereo(fm_s32 MonoStereo)
-{
- fm_s32 ret = 0;
-#define FM_FORCE_MS 0x0008
-
- WCN_DBG(FM_DBG | CHIP, "set to %s\n", MonoStereo ? "mono" : "auto");
-
- mt6626_write(0x60, 0x3007);
-
- if (MonoStereo) {
- ret = mt6626_set_bits(0x75, FM_FORCE_MS, ~FM_FORCE_MS);
- } else {
- ret = mt6626_set_bits(0x75, 0x0000, ~FM_FORCE_MS);
- }
-
- return ret;
-}
-
-static fm_s32 mt6626_GetCapArray(fm_s32 *ca)
-{
- fm_u16 dataRead;
- fm_u16 tmp = 0;
-
- FMR_ASSERT(ca);
- mt6626_read(0x60, &tmp);
- mt6626_write(0x60, tmp & 0xFFF7); /* 0x60 D3=0 */
-
- mt6626_read(0x25, &dataRead);
- *ca = dataRead;
-
- mt6626_write(0x60, tmp); /* 0x60 D3=1 */
- return 0;
-}
-
-
-/*
- * mt6626_GetCurPamd - get current freq's PAMD value
- * PA=PAMD
- * If PA>511 then PAMD(dB)= (PA-1024)/16*6,
- * else PAMD(dB)=PA/16*6
- */
-static fm_bool mt6626_GetCurPamd(fm_u16 *pPamdLevl)
-{
- fm_u16 tmp_reg;
- fm_u16 dBvalue;
-
- if (mt6626_read(FM_ADDR_PAMD, &tmp_reg))
- return fm_false;
-
- tmp_reg &= 0x03FF;
- dBvalue = (tmp_reg > 511) ? ((1024 - tmp_reg) * 6 / 16) : 0;
-
- *pPamdLevl = dBvalue;
- return fm_true;
-}
-
-static fm_s32 mt6626_ScanStop(void)
-{
- return fm_force_active_event(FLAG_SCAN);
-}
-
-static fm_s32 mt6626_SeekStop(void)
-{
- return fm_force_active_event(FLAG_SEEK);
-}
-
-/*
- * mt6626_I2s_Setting - set the I2S state on MT6626
- * @onoff - I2S on/off
- * @mode - I2S mode: Master or Slave
- *
- * Return:0, if success; error code, if failed
- */
-static fm_s32 mt6626_I2s_Setting(fm_s32 onoff, fm_s32 mode, fm_s32 sample)
-{
- fm_u16 tmp_state = 0;
- fm_u16 tmp_mode = 0;
- fm_u16 tmp_sample = 0;
- fm_s32 ret = 0;
-
- if (onoff == MT6626_I2S_ON) {
- tmp_state = 0x0080; /* I2S Frequency tracking on, 0x61 D7=1 */
- } else if (onoff == MT6626_I2S_OFF) {
- tmp_state = 0x0000; /* I2S Frequency tracking off, 0x61 D7=0 */
- } else {
- WCN_DBG(FM_ERR | CHIP, "%s():[onoff=%d]\n", __func__, onoff);
- ret = -FM_EPARA;
- goto out;
- }
-
- if (mode == MT6626_I2S_MASTER) {
- tmp_mode = 0x03; /* 6620 as I2S master */
- } else if (mode == MT6626_I2S_SLAVE) {
- tmp_mode = 0x0B; /* 6620 as I2S slave */
- } else {
- WCN_DBG(FM_ERR | CHIP, "%s():[mode=%d]\n", __func__, mode);
- ret = -FM_EPARA;
- goto out;
- }
-
- if (sample == MT6626_I2S_32K) {
- tmp_sample = 0x0000; /* 6620 I2S 32KHz sample rate */
- } else if (sample == MT6626_I2S_44K) {
- tmp_sample = 0x0800; /* 6620 I2S 44.1KHz sample rate */
- } else if (sample == MT6626_I2S_48K) {
- tmp_sample = 0x1000; /* 6620 I2S 48KHz sample rate */
- } else {
- WCN_DBG(FM_ERR | CHIP, "%s():[sample=%d]\n", __func__, sample);
- ret = -FM_EPARA;
- goto out;
- }
-
- if ((ret = mt6626_set_bits(0x5F, tmp_sample, 0xE7FF)))
- goto out;
-
- if ((ret = mt6626_write(0x9B, tmp_mode)))
- goto out;
-
- if ((ret = mt6626_set_bits(0x61, tmp_state, 0xFF7F)))
- goto out;
-
- WCN_DBG(FM_NTC | CHIP, "[onoff=%s][mode=%s][sample=%d](0)33KHz,(1)44.1KHz,(2)48KHz\n",
- (onoff == MT6626_I2S_ON) ? "On" : "Off",
- (mode == MT6626_I2S_MASTER) ? "Master" : "Slave", sample);
- out:
- return ret;
-}
-
-static fm_bool mt6626_em_test(fm_u16 group_idx, fm_u16 item_idx, fm_u32 item_value)
-{
- return fm_true;
-}
-
-static fm_s32 fm_low_power_wa_default(fm_s32 fmon)
-{
- return 0;
-}
-
-fm_s32 fm_low_ops_register(struct fm_lowlevel_ops *ops)
-{
- fm_s32 ret = 0;
- /* Basic functions. */
-
- FMR_ASSERT(ops);
- FMR_ASSERT(ops->cb.cur_freq_get);
- FMR_ASSERT(ops->cb.cur_freq_set);
- fm_cb_op = &ops->cb;
-
- /* ops->bi.low_pwr_wa = mt6626_low_pwr_wa; */
- ops->bi.low_pwr_wa = fm_low_power_wa_default;
- ops->bi.pwron = mt6626_pwron;
- ops->bi.pwroff = mt6626_pwroff;
- ops->bi.msdelay = Delayms;
- ops->bi.usdelay = Delayus;
- ops->bi.read = mt6626_read;
- ops->bi.write = mt6626_write;
- ops->bi.setbits = mt6626_set_bits;
- ops->bi.chipid_get = mt6626_get_chipid;
- ops->bi.mute = mt6626_Mute;
- ops->bi.rampdown = mt6626_RampDown;
- ops->bi.pwrupseq = mt6626_PowerUp;
- ops->bi.pwrdownseq = mt6626_PowerDown;
- ops->bi.setfreq = mt6626_SetFreq;
- ops->bi.seek = mt6626_Seek;
- ops->bi.seekstop = mt6626_SeekStop;
- ops->bi.scan = mt6626_Scan;
- ops->bi.scanstop = mt6626_ScanStop;
- ops->bi.rssiget = mt6626_GetCurRSSI;
- ops->bi.volset = mt6626_SetVol;
- ops->bi.volget = mt6626_GetVol;
- ops->bi.dumpreg = mt6626_dump_reg;
- ops->bi.msget = mt6626_GetMonoStereo;
- ops->bi.msset = mt6626_SetMonoStereo;
- ops->bi.pamdget = mt6626_GetCurPamd;
- ops->bi.em = mt6626_em_test;
- ops->bi.anaswitch = mt6626_SetAntennaType;
- ops->bi.anaget = mt6626_GetAntennaType;
- ops->bi.caparray_get = mt6626_GetCapArray;
- ops->bi.i2s_set = mt6626_I2s_Setting;
-
- return ret;
-}
-
-fm_s32 fm_low_ops_unregister(struct fm_lowlevel_ops *ops)
-{
- fm_s32 ret = 0;
- /* Basic functions. */
-
- FMR_ASSERT(ops);
-
- fm_memset(&ops->bi, 0, sizeof(struct fm_basic_interface));
- return ret;
-}
diff --git a/drivers/misc/mediatek/fmradio/mt6626/pub/mt6626_fm_link.c b/drivers/misc/mediatek/fmradio/mt6626/pub/mt6626_fm_link.c
deleted file mode 100644
index fe49d9a96..000000000
--- a/drivers/misc/mediatek/fmradio/mt6626/pub/mt6626_fm_link.c
+++ /dev/null
@@ -1,243 +0,0 @@
-/* mt6626_fm_link.c
- *
- * (C) Copyright 2009
- * MediaTek <www.MediaTek.com>
- * Hongcheng <hongcheng.xia@MediaTek.com>
- *
- * MT6626 FM Radio Driver -- setup data link
- *
- * 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.
- *
- * 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.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- */
-#include <linux/slab.h>
-#include <linux/version.h>
-#include <linux/interrupt.h>
-#include <linux/cdev.h>
-#include <asm/uaccess.h>
-#include <linux/i2c.h>
-
-#include "fm_typedef.h"
-#include "fm_dbg.h"
-#include "fm_err.h"
-#include "fm_stdlib.h"
-
-#include "mt6626_fm.h"
-#include "mt6626_fm_link.h"
-#include "mt6626_fm_reg.h"
-
-/* these functions are defined after Linux2.6.32 */
-static int fm_i2c_probe(struct i2c_client *client, const struct i2c_device_id *id);
-static int fm_i2c_detect(struct i2c_client *client, int kind, struct i2c_board_info *info);
-static int fm_i2c_remove(struct i2c_client *client);
-
-
-static const struct i2c_device_id fm_i2c_id = { MT6626_DEV, 0 };
-static unsigned short force[] =
- { MT6626_I2C_PORT, MT6626_SLAVE_ADDR, I2C_CLIENT_END, I2C_CLIENT_END };
-static const unsigned short *const forces[] = { force, NULL };
-
-static struct i2c_client_address_data addr_data = {
- .forces = forces
-};
-
-struct i2c_driver MT6626_driver = {
- .probe = fm_i2c_probe,
- .remove = fm_i2c_remove,
- .detect = fm_i2c_detect,
- .driver.name = MT6626_DEV,
- .id_table = &fm_i2c_id,
- .address_data = &addr_data,
-};
-
-static struct i2c_client *g_client;
-
-static int fm_i2c_probe(struct i2c_client *client, const struct i2c_device_id *id)
-{
- int ret = 0;
-
- WCN_DBG(FM_NTC | LINK, "%s\n", __func__);
- g_client = client;
-
- return ret;
-}
-
-static int fm_i2c_detect(struct i2c_client *client, int kind, struct i2c_board_info *info)
-{
- WCN_DBG(FM_NTC | LINK, "%s\n", __func__);
- strcpy(info->type, MT6626_DEV);
- return 0;
-}
-
-static int fm_i2c_remove(struct i2c_client *client)
-{
- WCN_DBG(FM_NTC | LINK, "%s\n", __func__);
- return 0;
-}
-
-static struct fm_link_event *link_event;
-
-fm_s32 fm_link_setup(void *data)
-{
- if (!(link_event = kzalloc(sizeof(struct fm_link_event), GFP_KERNEL))) {
- WCN_DBG(FM_ALT | LINK, "kzalloc(fm_link_event) -ENOMEM\n");
- return -1;
- }
-
- link_event->ln_event = fm_flag_event_create("ln_evt");
-
- if (!link_event->ln_event) {
- WCN_DBG(FM_ALT | LINK, "create mt6626_ln_event failed\n");
- fm_free(link_event);
- return -1;
- }
-
- fm_flag_event_get(link_event->ln_event);
-
- WCN_DBG(FM_NTC | LINK, "fm link setup\n");
- return i2c_add_driver(&MT6626_driver);
-}
-
-fm_s32 fm_link_release(void)
-{
- fm_flag_event_put(link_event->ln_event);
- if (link_event) {
- fm_free(link_event);
- }
-
- WCN_DBG(FM_NTC | LINK, "fm link release\n");
- i2c_del_driver(&MT6626_driver);
- return 0;
-}
-
-/*
- * fm_ctrl_rx
- * the low level func to read a rigister
- * @addr - rigister address
- * @val - the pointer of target buf
- * If success, return 0; else error code
- */
-fm_s32 fm_ctrl_rx(fm_u8 addr, fm_u16 *val)
-{
- fm_s32 n;
- fm_u8 b[2] = { 0 };
-
- /* first, send addr to MT6626 */
- n = i2c_master_send(g_client, (fm_u8 *) &addr, 1);
-
- if (n < 0) {
- WCN_DBG(FM_ALT | LINK, "rx 1, [addr=0x%02X] [err=%d]\n", addr, n);
- return -1;
- }
- /* second, receive two byte from MT6626 */
- n = i2c_master_recv(g_client, b, 2);
-
- if (n < 0) {
- WCN_DBG(FM_ALT | LINK, "rx 2, [addr=0x%02X] [err=%d]\n", addr, n);
- return -2;
- }
-
- *val = ((fm_u16) b[0] << 8 | (fm_u16) b[1]);
-
- return 0;
-}
-
-/*
- * fm_ctrl_tx
- * the low level func to write a rigister
- * @addr - rigister address
- * @val - value will be writed in the rigister
- * If success, return 0; else error code
- */
-fm_s32 fm_ctrl_tx(fm_u8 addr, fm_u16 val)
-{
- fm_s32 n;
- fm_u8 b[3];
-
- b[0] = addr;
- b[1] = (fm_u8) (val >> 8);
- b[2] = (fm_u8) (val & 0xFF);
-
- n = i2c_master_send(g_client, b, 3);
-
- if (n < 0) {
- WCN_DBG(FM_ALT | LINK, "tx, [addr=0x%02X] [err=%d]\n", addr, n);
- return -1;
- }
-
- return 0;
-}
-
-/*
- * fm_cmd_tx() - send cmd to FM firmware and wait event
- * @buf - send buffer
- * @len - the length of cmd
- * @mask - the event flag mask
- * @ cnt - the retry conter
- * @timeout - timeout per cmd
- * Return 0, if success; error code, if failed
- */
-fm_s32 fm_cmd_tx(fm_u8 *buf, fm_u16 len, fm_s32 mask, fm_s32 cnt, fm_s32 timeout,
- fm_s32(*callback) (struct fm_res_ctx *result))
-{
- return 0;
-}
-
-fm_bool fm_wait_stc_done(fm_u32 sec)
-{
- fm_s32 ret_time = 0;
-
- ret_time = FM_EVENT_WAIT_TIMEOUT(link_event->ln_event, FLAG_TEST, sec);
- if (!ret_time) {
- WCN_DBG(FM_WAR | LINK, "wait stc done fail\n");
- return fm_false;
- } else {
- WCN_DBG(FM_DBG | LINK, "wait stc done ok\n");
- }
-
- FM_EVENT_CLR(link_event->ln_event, FLAG_TEST);
- return fm_true;
-}
-
-fm_s32 fm_event_parser(fm_s32(*rds_parser) (struct rds_rx_t *, fm_s32))
-{
- fm_u16 tmp_reg;
-
- fm_ctrl_rx(FM_MAIN_INTR, &tmp_reg);
-
- if (tmp_reg & FM_INTR_STC_DONE) {
- /* clear status flag */
- fm_ctrl_tx(FM_MAIN_INTR, tmp_reg | FM_INTR_STC_DONE);
- FM_EVENT_SEND(link_event->ln_event, FLAG_TEST);
- }
-
- if (tmp_reg & FM_INTR_RDS) {
- /* clear status flag */
- fm_ctrl_tx(FM_MAIN_INTR, tmp_reg | FM_INTR_RDS);
-
- /*Handle the RDS data that we get */
- if (rds_parser) {
- rds_parser(NULL, 0); /* mt6626 rds lib will get rds raw data by itself */
- } else {
- WCN_DBG(FM_WAR | LINK, "no method to parse RDS data\n");
- }
- }
-
- return 0;
-}
-
-fm_s32 fm_force_active_event(fm_u32 mask)
-{
- FM_EVENT_SEND(link_event->ln_event, FLAG_TEST);
- return 0;
-}
diff --git a/drivers/misc/mediatek/fmradio/mt6626/pub/mt6626_fm_rds.c b/drivers/misc/mediatek/fmradio/mt6626/pub/mt6626_fm_rds.c
deleted file mode 100644
index 2cefc4fb6..000000000
--- a/drivers/misc/mediatek/fmradio/mt6626/pub/mt6626_fm_rds.c
+++ /dev/null
@@ -1,320 +0,0 @@
-/* mt6626_rds.c
- *
- * (C) Copyright 2009
- * MediaTek <www.MediaTek.com>
- * hongcheng <hongcheng.xia@MediaTek.com>
- *
- * mt6626 FM Radio Driver
- *
- * 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.
- *
- * 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.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- */
-#include "fm_typedef.h"
-#include "fm_dbg.h"
-#include "fm_err.h"
-#include "fm_interface.h"
-#include "fm_stdlib.h"
-#include "fm_rds.h"
-
-#include "mt6626_fm_reg.h"
-
-
-static fm_bool bRDS_FirstIn = fm_false;
-static fm_u32 gBLER_CHK_INTERVAL = 5000;
-static fm_u16 GOOD_BLK_CNT = 0, BAD_BLK_CNT;
-static fm_u8 BAD_BLK_RATIO;
-
-static struct fm_callback *fm_cb;
-static struct fm_basic_interface *fm_bi;
-
-
-static fm_bool mt6626_RDS_support(void);
-static fm_s32 mt6626_RDS_enable(void);
-static fm_s32 mt6626_RDS_disable(void);
-static fm_u16 mt6626_RDS_Get_GoodBlock_Counter(void);
-static fm_u16 mt6626_RDS_Get_BadBlock_Counter(void);
-static fm_u8 mt6626_RDS_Get_BadBlock_Ratio(void);
-static fm_u32 mt6626_RDS_Get_BlerCheck_Interval(void);
-static void mt6626_RDS_GetData(fm_u16 *data, fm_u16 datalen);
-static void mt6626_RDS_Init_Data(rds_t *pstRDSData);
-
-
-
-static fm_bool mt6626_RDS_support(void)
-{
- return fm_true;
-}
-
-static fm_s32 mt6626_RDS_enable(void)
-{
- fm_u16 dataRead;
-
- WCN_DBG(FM_DBG | RDSC, "rds enable\n");
- fm_bi->read(FM_RDS_CFG0, &dataRead);
- fm_bi->write(FM_RDS_CFG0, 6); /* set buf_start_th */
- fm_bi->read(FM_MAIN_CTRL, &dataRead);
- fm_bi->write(FM_MAIN_CTRL, dataRead | (RDS_MASK));
-
- return 0;
-}
-
-static fm_s32 mt6626_RDS_disable(void)
-{
- fm_u16 dataRead;
-
- WCN_DBG(FM_DBG | RDSC, "rds disable\n");
- fm_bi->read(FM_MAIN_CTRL, &dataRead);
- fm_bi->write(FM_MAIN_CTRL, dataRead & (~RDS_MASK));
-
- return 0;
-}
-
-static fm_u16 mt6626_RDS_Get_GoodBlock_Counter(void)
-{
- fm_u16 tmp_reg;
-
- fm_bi->read(FM_RDS_GOODBK_CNT, &tmp_reg);
- GOOD_BLK_CNT = tmp_reg;
- WCN_DBG(FM_DBG | RDSC, "get good block cnt:%d\n", (fm_s32) tmp_reg);
-
- return tmp_reg;
-}
-
-static fm_u16 mt6626_RDS_Get_BadBlock_Counter(void)
-{
- fm_u16 tmp_reg;
-
- fm_bi->read(FM_RDS_BADBK_CNT, &tmp_reg);
- BAD_BLK_CNT = tmp_reg;
- WCN_DBG(FM_DBG | RDSC, "get bad block cnt:%d\n", (fm_s32) tmp_reg);
-
- return tmp_reg;
-}
-
-static fm_u8 mt6626_RDS_Get_BadBlock_Ratio(void)
-{
- fm_u16 tmp_reg;
- fm_u16 gbc;
- fm_u16 bbc;
-
- gbc = mt6626_RDS_Get_GoodBlock_Counter();
- bbc = mt6626_RDS_Get_BadBlock_Counter();
-
- if ((gbc + bbc) > 0) {
- tmp_reg = (fm_u8) (bbc * 100 / (gbc + bbc));
- } else {
- tmp_reg = 0;
- }
-
- BAD_BLK_RATIO = tmp_reg;
- WCN_DBG(FM_DBG | RDSC, "get badblock ratio:%d\n", (fm_s32) tmp_reg);
-
- return tmp_reg;
-}
-
-static fm_s32 mt6626_RDS_BlockCounter_Reset(void)
-{
- mt6626_RDS_disable();
- mt6626_RDS_enable();
-
- return 0;
-}
-
-static fm_u32 mt6626_RDS_Get_BlerCheck_Interval(void)
-{
- return gBLER_CHK_INTERVAL;
-}
-
-static fm_s32 mt6626_RDS_BlerCheck(rds_t *dst)
-{
- return -1;
-}
-
-static void RDS_Recovery_Handler(void)
-{
- fm_u16 tempData = 0;
-
- do {
- fm_bi->read(FM_RDS_DATA_REG, &tempData);
- fm_bi->read(FM_RDS_POINTER, &tempData);
- } while (tempData & 0x3);
-}
-
-static void mt6626_RDS_GetData(fm_u16 *data, fm_u16 datalen)
-{
-#define RDS_GROUP_DIFF_OFS 0x007C
-#define RDS_FIFO_DIFF 0x007F
-#define RDS_CRC_BLK_ADJ 0x0020
-#define RDS_CRC_CORR_CNT 0x001E
-#define RDS_CRC_INFO 0x0001
-
- fm_u16 CRC = 0, i = 0, RDS_adj = 0, RDSDataCount = 0, FM_WARorrCnt = 0;
- fm_u16 temp = 0, OutputPofm_s32 = 0;
-
- WCN_DBG(FM_DBG | RDSC, "get data\n");
- fm_bi->read(FM_RDS_FIFO_STATUS0, &temp);
- RDSDataCount = ((RDS_GROUP_DIFF_OFS & temp) << 2);
-
- if ((temp & RDS_FIFO_DIFF) >= 4) {
- /* block A data and info handling */
- fm_bi->read(FM_RDS_INFO, &temp);
- RDS_adj |= (temp & RDS_CRC_BLK_ADJ) << 10;
- CRC |= (temp & RDS_CRC_INFO) << 3;
- FM_WARorrCnt |= ((temp & RDS_CRC_CORR_CNT) << 11);
- fm_bi->read(FM_RDS_DATA_REG, &data[0]);
-
- /* block B data and info handling */
- fm_bi->read(FM_RDS_INFO, &temp);
- RDS_adj |= (temp & RDS_CRC_BLK_ADJ) << 9;
- CRC |= (temp & RDS_CRC_INFO) << 2;
- FM_WARorrCnt |= ((temp & RDS_CRC_CORR_CNT) << 7);
- fm_bi->read(FM_RDS_DATA_REG, &data[1]);
-
- /* block C data and info handling */
- fm_bi->read(FM_RDS_INFO, &temp);
- RDS_adj |= (temp & RDS_CRC_BLK_ADJ) << 8;
- CRC |= (temp & RDS_CRC_INFO) << 1;
- FM_WARorrCnt |= ((temp & RDS_CRC_CORR_CNT) << 3);
- fm_bi->read(FM_RDS_DATA_REG, &data[2]);
-
- /* block D data and info handling */
- fm_bi->read(FM_RDS_INFO, &temp);
- RDS_adj |= (temp & RDS_CRC_BLK_ADJ) << 7;
- CRC |= (temp & RDS_CRC_INFO);
- FM_WARorrCnt |= ((temp & RDS_CRC_CORR_CNT) >> 1);
- fm_bi->read(FM_RDS_DATA_REG, &data[3]);
-
- data[4] = FM_WARorrCnt; /* CBC */
- data[5] = (CRC | RDS_adj | RDSDataCount); /* CRC */
-
- fm_bi->read(FM_RDS_PWDI, &data[6]);
- fm_bi->read(FM_RDS_PWDQ, &data[7]);
-
- fm_bi->read(FM_RDS_POINTER, &OutputPofm_s32);
-
- /* Go fm_s32o RDS recovery handler while RDS output pofm_s32 doesn't align to 4 in numeric */
- if (OutputPofm_s32 & 0x3) {
- RDS_Recovery_Handler();
- }
-
- } else {
- for (; i < 8; i++)
- data[i] = 0;
- }
-}
-
-static void mt6626_RDS_Init_Data(rds_t *pstRDSData)
-{
- fm_memset(pstRDSData, 0, sizeof(rds_t));
- bRDS_FirstIn = fm_true;
-
- fm_memset(pstRDSData->RT_Data.TextData, 0x20, sizeof(pstRDSData->RT_Data.TextData));
- fm_memset(pstRDSData->PS_Data.PS, '\0', sizeof(pstRDSData->PS_Data.PS));
- fm_memset(pstRDSData->PS_ON, 0x20, sizeof(pstRDSData->PS_ON));
-}
-
-fm_bool mt6626_RDS_OnOff(rds_t *dst, fm_bool bFlag)
-{
- if (mt6626_RDS_support() == fm_false) {
- WCN_DBG(FM_ALT | RDSC, "mt6626_RDS_OnOff failed, RDS not support\n");
- return fm_false;
- }
-
- if (bFlag) {
- mt6626_RDS_Init_Data(dst);
- mt6626_RDS_enable();
- } else {
- mt6626_RDS_disable();
- }
-
- return fm_true;
-}
-
-DEFINE_RDSLOG(rds_log);
-
-/* mt6626_RDS_Efm_s32_Handler - response FM RDS interrupt
- * @fm - main data structure of FM driver
- * This function first get RDS raw data, then call RDS spec parser
- */
-static fm_s32 mt6626_rds_parser(rds_t *rds_dst, struct rds_rx_t *rds_raw, fm_s32 rds_size,
- fm_u16(*getfreq) (void))
-{
- struct rds_rx_t raw;
- fm_u16 fifo_offset;
-
- do {
- mt6626_RDS_GetData(&raw.data[0].blkA, sizeof(rds_packet_t) + 2);
- fifo_offset = (raw.data[0].crc & FM_RDS_DCO_FIFO_OFST) >> 5; /* FM_RDS_DATA_CRC_FFOST */
- WCN_DBG(FM_DBG | RDSC, "RDS fifo_offset:%d\n", fifo_offset);
- rds_log.log_in(&rds_log, &raw, sizeof(rds_packet_t) + 2 * sizeof(fm_u16));
- rds_parser(rds_dst, &raw, sizeof(rds_packet_t) + 2 * sizeof(fm_u16), getfreq);
- } while (fifo_offset > 1);
-
- return 0;
-}
-
-static fm_s32 mt6626_rds_log_get(struct rds_rx_t *dst, fm_s32 *dst_len)
-{
- return rds_log.log_out(&rds_log, dst, dst_len);
-}
-
-static fm_s32 mt6626_rds_gc_get(struct rds_group_cnt_t *dst, rds_t *rdsp)
-{
- return rds_grp_counter_get(dst, &rdsp->gc);
-}
-
-static fm_s32 mt6626_rds_gc_reset(rds_t *rdsp)
-{
- return rds_grp_counter_reset(&rdsp->gc);
-}
-
-fm_s32 fm_rds_ops_register(struct fm_lowlevel_ops *ops)
-{
- fm_s32 ret = 0;
-
- FMR_ASSERT(ops);
- FMR_ASSERT(ops->bi.write);
- FMR_ASSERT(ops->bi.read);
- FMR_ASSERT(ops->bi.setbits);
- FMR_ASSERT(ops->bi.usdelay);
- fm_bi = &ops->bi;
-
- FMR_ASSERT(ops->cb.cur_freq_get);
- FMR_ASSERT(ops->cb.cur_freq_set);
- fm_cb = &ops->cb;
-
- ops->ri.rds_blercheck = mt6626_RDS_BlerCheck;
- ops->ri.rds_onoff = mt6626_RDS_OnOff;
- ops->ri.rds_parser = mt6626_rds_parser;
- ops->ri.rds_gbc_get = mt6626_RDS_Get_GoodBlock_Counter;
- ops->ri.rds_bbc_get = mt6626_RDS_Get_BadBlock_Counter;
- ops->ri.rds_bbr_get = mt6626_RDS_Get_BadBlock_Ratio;
- ops->ri.rds_bc_reset = mt6626_RDS_BlockCounter_Reset;
- ops->ri.rds_bci_get = mt6626_RDS_Get_BlerCheck_Interval;
- ops->ri.rds_log_get = mt6626_rds_log_get;
- ops->ri.rds_gc_get = mt6626_rds_gc_get;
- ops->ri.rds_gc_reset = mt6626_rds_gc_reset;
- return ret;
-}
-
-fm_s32 fm_rds_ops_unregister(struct fm_lowlevel_ops *ops)
-{
- fm_s32 ret = 0;
-
- FMR_ASSERT(ops);
-
- fm_bi = NULL;
- fm_memset(&ops->ri, 0, sizeof(struct fm_rds_interface));
- return ret;
-}
diff --git a/drivers/misc/mediatek/fmradio/mt6627/inc/mt6627_drv_dsp.h b/drivers/misc/mediatek/fmradio/mt6627/inc/mt6627_drv_dsp.h
deleted file mode 100644
index ca62e398f..000000000
--- a/drivers/misc/mediatek/fmradio/mt6627/inc/mt6627_drv_dsp.h
+++ /dev/null
@@ -1,14 +0,0 @@
-
-const unsigned char channel_parameter[] = {
- 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 5, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0
-};
diff --git a/drivers/misc/mediatek/fmradio/mt6627/inc/mt6627_fm.h b/drivers/misc/mediatek/fmradio/mt6627/inc/mt6627_fm.h
deleted file mode 100644
index 40bbd7cda..000000000
--- a/drivers/misc/mediatek/fmradio/mt6627/inc/mt6627_fm.h
+++ /dev/null
@@ -1,58 +0,0 @@
-/* mt6627_fm.h
- *
- * (C) Copyright 2009
- * MediaTek <www.MediaTek.com>
- * Hongcheng <hongcheng.xia@MediaTek.com>
- *
- * MT6627 FM Radio Driver -- head file
- *
- * 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.
- *
- * 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.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- */
-#ifndef __MT6627_FM_H__
-#define __MT6627_FM_H__
-
-#include "fm_typedef.h"
-
-/* #define FM_PowerOn_with_ShortAntenna */
-#define MT6627_RSSI_TH_LONG 0xFF01 /* FM radio long antenna RSSI threshold(11.375dBuV) */
-#define MT6627_RSSI_TH_SHORT 0xFEE0 /* FM radio short antenna RSSI threshold(-1dBuV) */
-#define MT6627_CQI_TH 0x00E9 /* FM radio Channel quality indicator threshold(0x0000~0x00FF) */
-#define MT6627_SEEK_SPACE 1 /* FM radio seek space,1:100KHZ; 2:200KHZ */
-#define MT6627_SCAN_CH_SIZE 40 /* FM radio scan max channel size */
-#define MT6627_BAND 1 /* FM radio band, 1:87.5MHz~108.0MHz; 2:76.0MHz~90.0MHz; 3:76.0MHz~108.0MHz; 4:special */
-#define MT6627_BAND_FREQ_L 875 /* FM radio special band low freq(Default 87.5MHz) */
-#define MT6627_BAND_FREQ_H 1080 /* FM radio special band high freq(Default 108.0MHz) */
-#define MT6627_DEEMPHASIS_50us TRUE
-
-#define MT6627_SLAVE_ADDR 0xE0 /* 0x70 7-bit address */
-#define MT6627_MAX_COUNT 100
-
-#ifdef CONFIG_MTK_FM_50KHZ_SUPPORT
-#define MT6627_SCANTBL_SIZE 26 /* 16*uinit16_t */
-#else
-#define MT6627_SCANTBL_SIZE 16 /* 16*uinit16_t */
-#endif
-
-#define AFC_ON 0x01
-#if AFC_ON
-#define FM_MAIN_CTRL_INIT 0x480
-#else
-#define FM_MAIN_CTRL_INIT 0x080
-#endif
-
-#define ext_clk /* if define ext_clk use external reference clock or mask will use internal */
-#define MT6627_DEV "MT6627"
-
-#endif /* end of #ifndef __MT6627_FM_H__ */
diff --git a/drivers/misc/mediatek/fmradio/mt6627/inc/mt6627_fm_cmd.h b/drivers/misc/mediatek/fmradio/mt6627/inc/mt6627_fm_cmd.h
deleted file mode 100644
index 60eac0e62..000000000
--- a/drivers/misc/mediatek/fmradio/mt6627/inc/mt6627_fm_cmd.h
+++ /dev/null
@@ -1,71 +0,0 @@
-#ifndef __MT6627_FM_CMD_H__
-#define __MT6627_FM_CMD_H__
-
-#include <linux/types.h>
-#include "fm_typedef.h"
-
-/* FM basic-operation's opcode */
-#define FM_BOP_BASE (0x80)
-enum {
- FM_WRITE_BASIC_OP = (FM_BOP_BASE + 0x00),
- FM_UDELAY_BASIC_OP = (FM_BOP_BASE + 0x01),
- FM_RD_UNTIL_BASIC_OP = (FM_BOP_BASE + 0x02),
- FM_MODIFY_BASIC_OP = (FM_BOP_BASE + 0x03),
- FM_MSLEEP_BASIC_OP = (FM_BOP_BASE + 0x04),
- FM_TOP_WRITE_BASIC_OP = (FM_BOP_BASE + 0x05),
- FM_TOP_RD_UNTIL_BASIC_OP = (FM_BOP_BASE + 0x06),
- FM_TOP_MODIFY_BASIC_OP = (FM_BOP_BASE + 0x07),
- FM_MAX_BASIC_OP = (FM_BOP_BASE + 0x08)
-};
-
-/* FM BOP's size */
-#define FM_TOP_WRITE_BOP_SIZE (7)
-#define FM_TOP_RD_UNTIL_BOP_SIZE (11)
-#define FM_TOP_MODIFY_BOP_SIZE (11)
-
-#define FM_WRITE_BASIC_OP_SIZE (3)
-#define FM_UDELAY_BASIC_OP_SIZE (4)
-#define FM_RD_UNTIL_BASIC_OP_SIZE (5)
-#define FM_MODIFY_BASIC_OP_SIZE (5)
-#define FM_MSLEEP_BASIC_OP_SIZE (4)
-
-fm_s32 mt6627_pwrup_fpga_on(fm_u8 *buf, fm_s32 buf_size);
-fm_s32 mt6627_pwrup_clock_on(fm_u8 *buf, fm_s32 buf_size);
-fm_s32 mt6627_pwrup_digital_init(fm_u8 *buf, fm_s32 buf_size);
-fm_s32 mt6627_pwrdown(fm_u8 *buf, fm_s32 buf_size);
-fm_s32 mt6627_rampdown(fm_u8 *buf, fm_s32 buf_size);
-fm_s32 mt6627_tune(fm_u8 *buf, fm_s32 buf_size, fm_u16 freq, fm_u16 chan_para);
-fm_s32 mt6627_seek(fm_u8 *buf, fm_s32 buf_size, fm_u16 seekdir, fm_u16 space, fm_u16 max_freq,
- fm_u16 min_freq);
-fm_s32 mt6627_scan(fm_u8 *buf, fm_s32 buf_size, fm_u16 scandir, fm_u16 space, fm_u16 max_freq,
- fm_u16 min_freq);
-fm_s32 mt6627_cqi_get(fm_u8 *buf, fm_s32 buf_size);
-fm_s32 mt6627_get_reg(fm_u8 *buf, fm_s32 buf_size, fm_u8 addr);
-fm_s32 mt6627_set_reg(fm_u8 *buf, fm_s32 buf_size, fm_u8 addr, fm_u16 value);
-fm_s32 mt6627_patch_download(fm_u8 *buf, fm_s32 buf_size, fm_u8 seg_num, fm_u8 seg_id,
- const fm_u8 *src, fm_s32 seg_len);
-fm_s32 mt6627_coeff_download(fm_u8 *buf, fm_s32 buf_size, fm_u8 seg_num, fm_u8 seg_id,
- const fm_u8 *src, fm_s32 seg_len);
-#if 0
-fm_s32 mt6627_hwcoeff_download(fm_u8 *buf, fm_s32 buf_size, fm_u8 seg_num, fm_u8 seg_id,
- const fm_u8 *src, fm_s32 seg_len);
-fm_s32 mt6627_rom_download(fm_u8 *buf, fm_s32 buf_size, fm_u8 seg_num, fm_u8 seg_id,
- const fm_u8 *src, fm_s32 seg_len);
-#endif
-fm_s32 mt6627_full_cqi_req(fm_u8 *buf, fm_s32 buf_size, fm_u16 *freq, fm_s32 cnt, fm_s32 type);
-fm_s32 mt6627_top_get_reg(fm_u8 *buf, fm_s32 buf_size, fm_u16 addr);
-fm_s32 mt6627_top_set_reg(fm_u8 *buf, fm_s32 buf_size, fm_u16 addr, fm_u32 value);
-fm_s32 mt6627_host_get_reg(fm_u8 *buf, fm_s32 buf_size, fm_u32 addr);
-fm_s32 mt6627_host_set_reg(fm_u8 *buf, fm_s32 buf_size, fm_u32 addr, fm_u32 value);
-fm_s32 mt6627_set_bits_reg(fm_u8 *buf, fm_s32 buf_size, fm_u8 addr, fm_u16 bits, fm_u16 mask);
-fm_s32 mt6627_pwrup_fine_tune(fm_u8 *buf, fm_s32 buf_size);
-
-/*
- * fm_get_channel_space - get the spcace of gived channel
- * @freq - value in 760~1080 or 7600~10800
- *
- * Return 0, if 760~1080; return 1, if 7600 ~ 10800, else err code < 0
- */
-extern fm_s32 fm_get_channel_space(int freq);
-
-#endif
diff --git a/drivers/misc/mediatek/fmradio/mt6627/inc/mt6627_fm_cust_cfg.h b/drivers/misc/mediatek/fmradio/mt6627/inc/mt6627_fm_cust_cfg.h
deleted file mode 100644
index c60b8f63d..000000000
--- a/drivers/misc/mediatek/fmradio/mt6627/inc/mt6627_fm_cust_cfg.h
+++ /dev/null
@@ -1,99 +0,0 @@
-/*
- *
- * (C) Copyright 20011
- * MediaTek <www.MediaTek.com>
- * Hongcheng Xia<Hongcheng.Xia@MediaTek.com>
- *
- * FM Radio Driver
- *
- * 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.
- *
- * 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.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- */
-
-#ifndef __FM_CUST_CFG_H__
-#define __FM_CUST_CFG_H__
-
-/* scan sort algorithm */
-enum {
- FM_SCAN_SORT_NON = 0,
- FM_SCAN_SORT_UP,
- FM_SCAN_SORT_DOWN,
- FM_SCAN_SORT_MAX
-};
-/*typedef struct {
- fm_s32 short_ana_rssi_th;
- fm_s32 long_ana_rssi_th;
- fm_s32 desene_rssi_th;
- fm_s32 pamd_th;
- fm_s32 mr_th;
- fm_s32 atdc_th;
- fm_u32 prx_th;
- fm_u32 atdev_th;
- fm_u16 smg_th;
- fm_u16 deemphasis;
- fm_u16 osc_freq;
-}mt6628_fm_rx_cust_cfg;
-
-typedef struct{
- mt6628_fm_rx_cust_cfg rx_cfg;
-}mt6628_fm_cust_cfg;
-*/
-/* ***************************************************************************************** */
-/* ***********************************FM config for customer: start****************************** */
-/* ***************************************************************************************** */
-/* RX */
-#define FM_RX_RSSI_TH_LONG_MT6627 -296 /* FM radio long antenna RSSI threshold(-4dBuV) */
-#define FM_RX_RSSI_TH_SHORT_MT6627 -296 /* FM radio short antenna RSSI threshold(-4dBuV) */
-#define FM_RX_DESENSE_RSSI_MT6627 -258
-#define FM_RX_PAMD_TH_MT6627 -12
-#define FM_RX_MR_TH_MT6627 -67
-#define FM_RX_ATDC_TH_MT6627 3496
-#define FM_RX_PRX_TH_MT6627 64
-#define FM_RX_SMG_TH_MT6627 16421 /* FM soft-mute gain threshold */
-#define FM_RX_DEEMPHASIS_MT6627 0 /* 0-50us, China Mainland; 1-75us China Taiwan */
-#define FM_RX_OSC_FREQ_MT6627 0 /* 0-26MHz; 1-19MHz; 2-24MHz; 3-38.4MHz; 4-40MHz; 5-52MHz */
-/* #define FM_RX_SEEK_SPACE_MT6627 1 //FM radio seek space,1:100KHZ; 2:200KHZ */
-/* #define FM_RX_SCAN_CH_SIZE_MT6627 40 //FM radio scan max channel size */
-/* #define FM_RX_BAND_MT6627 1 //FM radio band, 1:87.5MHz~108.0MHz; 2:76.0MHz~90.0MHz; 3:76.0MHz~108.0MHz; 4:special */
-/* #define FM_RX_SCAN_SORT_SELECT_MT6627 FM_SCAN_SORT_NON */
-/* #define FM_RX_FAKE_CH_NUM_MT6627 1 */
-/* #define FM_RX_FAKE_CH_RSSI_MT6627 40 */
-/* #define FM_RX_FAKE_CH_1_MT6627 1075 */
-/* #define FM_RX_FAKE_CH_2_MT6627 0 */
-/* #define FM_RX_FAKE_CH_3_MT6627 0 */
-/* #define FM_RX_FAKE_CH_4_MT6627 0 */
-/* #define FM_RX_FAKE_CH_5_MT6627 0 */
-
-/* TX */
-/* #define FM_TX_PWR_LEVEL_MAX_MT6627 120 */
-/* #define FM_TX_SCAN_HOLE_LOW_MT6627 923 //92.3MHz~95.4MHz should not show to user */
-/* #define FM_TX_SCAN_HOLE_HIGH_MT6627 954 //92.3MHz~95.4MHz should not show to user */
-
-
-/* ***************************************************************************************** */
-/* ***********************************FM config for customer:end ******************************* */
-/* ***************************************************************************************** */
-
-/* #define FM_SEEK_SPACE_MT6627 FM_RX_SEEK_SPACE_MT6627 */
-/* max scan chl num */
-/* #define FM_MAX_CHL_SIZ_MT6627E FM_RX_SCAN_CH_SIZE_MT6627 */
-/* auto HiLo */
-#define FM_AUTO_HILO_OFF_MT6627 0
-#define FM_AUTO_HILO_ON_MT6627 1
-
-
-/* seek threshold */
-#define FM_SEEKTH_LEVEL_DEFAULT_MT6627 4
-
-#endif /* __FM_CUST_CFG_H__ */
diff --git a/drivers/misc/mediatek/fmradio/mt6627/inc/mt6627_fm_lib.h b/drivers/misc/mediatek/fmradio/mt6627/inc/mt6627_fm_lib.h
deleted file mode 100644
index 899607151..000000000
--- a/drivers/misc/mediatek/fmradio/mt6627/inc/mt6627_fm_lib.h
+++ /dev/null
@@ -1,71 +0,0 @@
-#ifndef __MT6627_FM_LIB_H__
-#define __MT6627_FM_LIB_H__
-
-#include "fm_typedef.h"
-
-enum {
- DSPPATCH = 0xFFF9,
- USDELAY = 0xFFFA,
- MSDELAY = 0xFFFB,
- HW_VER = 0xFFFD,
- POLL_N = 0xFFFE, /* poling check if bit(n) is '0' */
- POLL_P = 0xFFFF, /* polling check if bit(n) is '1' */
-};
-
-enum {
- FM_PUS_DSPPATCH = DSPPATCH,
- FM_PUS_USDELAY = USDELAY,
- FM_PUS_MSDELAY = MSDELAY,
- FM_PUS_HW_VER = HW_VER,
- FM_PUS_POLL_N = POLL_N, /* poling check if bit(n) is '0' */
- FM_PUS_POLL_P = POLL_P, /* polling check if bit(n) is '1' */
- FM_PUS_MAX
-};
-
-enum {
- DSP_PATH = 0x02,
- DSP_COEFF = 0x03,
- DSP_HW_COEFF = 0x04
-};
-
-enum IMG_TYPE {
- IMG_WRONG = 0,
- IMG_ROM,
- IMG_PATCH,
- IMG_COEFFICIENT,
- IMG_HW_COEFFICIENT
-};
-
-enum {
- mt6627_E1 = 0,
- mt6627_E2
-};
-
-struct mt6627_fm_cqi {
- fm_u16 ch;
- fm_u16 rssi;
- fm_u16 reserve;
-};
-
-struct adapt_fm_cqi {
- fm_s32 ch;
- fm_s32 rssi;
- fm_s32 reserve;
-};
-
-struct mt6627_full_cqi {
- fm_u16 ch;
- fm_u16 rssi;
- fm_u16 pamd;
- fm_u16 pr;
- fm_u16 fpamd;
- fm_u16 mr;
- fm_u16 atdc;
- fm_u16 prx;
- fm_u16 atdev;
- fm_u16 smg; /* soft-mute gain */
- fm_u16 drssi; /* delta rssi */
-};
-
-
-#endif
diff --git a/drivers/misc/mediatek/fmradio/mt6627/inc/mt6627_fm_reg.h b/drivers/misc/mediatek/fmradio/mt6627/inc/mt6627_fm_reg.h
deleted file mode 100644
index d72a14a62..000000000
--- a/drivers/misc/mediatek/fmradio/mt6627/inc/mt6627_fm_reg.h
+++ /dev/null
@@ -1,89 +0,0 @@
-#ifndef __MT6627_FM_REG_H__
-#define __MT6627_FM_REG_H__
-
-enum MT6627_REG {
- FM_MAIN_CG1_CTRL = 0x60,
- FM_MAIN_CG2_CTRL = 0x61,
- FM_MAIN_HWVER = 0x62,
- FM_MAIN_CTRL = 0x63,
- FM_CHANNEL_SET = 0x65,
- FM_MAIN_CFG1 = 0x66,
- FM_MAIN_CFG2 = 0x67,
- FM_MAIN_MCLKDESENSE = 0x38,
- FM_MAIN_INTR = 0x69,
- FM_MAIN_INTRMASK = 0x6A,
- FM_MAIN_EXTINTRMASK = 0x6B,
- FM_RSSI_IND = 0x6C,
- FM_RSSI_TH = 0x6D,
- FM_MAIN_RESET = 0x6E,
- FM_MAIN_CHANDETSTAT = 0x6F,
- FM_RDS_CFG0 = 0x80,
- FM_RDS_INFO = 0x81,
- FM_RDS_DATA_REG = 0x82,
- FM_RDS_GOODBK_CNT = 0x83,
- FM_RDS_BADBK_CNT = 0x84,
- FM_RDS_PWDI = 0x85,
- FM_RDS_PWDQ = 0x86,
- FM_RDS_FIFO_STATUS0 = 0x87,
- FM_FT_CON9 = 0x8F,
- FM_DSP_PATCH_CTRL = 0x90,
- FM_DSP_PATCH_OFFSET = 0x91,
- FM_DSP_PATCH_DATA = 0x92,
- FM_DSP_MEM_CTRL4 = 0x93,
- FM_ADDR_PAMD = 0xB4,
- FM_RDS_BDGRP_ABD_CTRL_REG = 0xB6,
- FM_RDS_POINTER = 0xF0,
-};
-
-/* RDS_BDGRP_ABD_CTRL_REG */
-enum {
- BDGRP_ABD_EN = 0x0001,
- BER_RUN = 0x2000
-};
-#define FM_DAC_CON1 0x83
-#define FM_DAC_CON2 0x84
-#define FM_FT_CON0 0x86
-enum {
- FT_EN = 0x0001
-};
-
-#define FM_I2S_CON0 0x90
-enum {
- I2S_EN = 0x0001,
- FORMAT = 0x0002,
- WLEN = 0x0004,
- I2S_SRC = 0x0008
-};
-
-/* FM_MAIN_CTRL */
-enum {
- TUNE = 0x0001,
- SEEK = 0x0002,
- SCAN = 0x0004,
- CQI_READ = 0x0008,
- RDS_MASK = 0x0010,
- MUTE = 0x0020,
- RDS_BRST = 0x0040,
- RAMP_DOWN = 0x0100,
-};
-
-/* FM_MAIN_INTR */
-enum {
- FM_INTR_STC_DONE = 0x0001,
- FM_INTR_IQCAL_DONE = 0x0002,
- FM_INTR_DESENSE_HIT = 0x0004,
- FM_INTR_CHNL_CHG = 0x0008,
- FM_INTR_SW_INTR = 0x0010,
- FM_INTR_RDS = 0x0020
-};
-
-enum {
- ANTENNA_TYPE = 0x0010, /* 0x61 D4, 0:long, 1:short */
- ANALOG_I2S = 0x0080, /* 0x61 D7, 0:lineout, 1:I2S */
- DE_EMPHASIS = 0x1000, /* 0x61 D12,0:50us, 1:75 us */
-};
-
-#define OSC_FREQ_BITS 0x0070 /* 0x60 bit4~6 */
-#define OSC_FREQ_MASK (~OSC_FREQ_BITS)
-
-#endif /* __MT6627_FM_REG_H__ */
diff --git a/drivers/misc/mediatek/fmradio/mt6627/pub/mt6627_fm_cmd.c b/drivers/misc/mediatek/fmradio/mt6627/pub/mt6627_fm_cmd.c
deleted file mode 100644
index c0d5f6917..000000000
--- a/drivers/misc/mediatek/fmradio/mt6627/pub/mt6627_fm_cmd.c
+++ /dev/null
@@ -1,1038 +0,0 @@
-#include <linux/kernel.h>
-#include <linux/types.h>
-
-#include "fm_typedef.h"
-#include "fm_dbg.h"
-#include "fm_err.h"
-#include "fm_rds.h"
-#include "fm_config.h"
-#include "fm_link.h"
-
-#include "mt6627_fm_reg.h"
-/* #include "mt6627_fm_link.h" */
-#include "mt6627_fm.h"
-#include "mt6627_fm_cmd.h"
-#include "mt6627_fm_cust_cfg.h"
-
-extern fm_cust_cfg mt6627_fm_config;
-
-static fm_s32 fm_bop_write(fm_u8 addr, fm_u16 value, fm_u8 *buf, fm_s32 size)
-{
- if (size < (FM_WRITE_BASIC_OP_SIZE + 2)) {
- return (-1);
- }
-
- if (buf == NULL) {
- return (-2);
- }
-
- buf[0] = FM_WRITE_BASIC_OP;
- buf[1] = FM_WRITE_BASIC_OP_SIZE;
- buf[2] = addr;
- buf[3] = (fm_u8) ((value) & 0x00FF);
- buf[4] = (fm_u8) ((value >> 8) & 0x00FF);
-
- WCN_DBG(FM_DBG | CHIP, "%02x %02x %02x %02x %02x\n", buf[0], buf[1], buf[2], buf[3],
- buf[4]);
-
- return (FM_WRITE_BASIC_OP_SIZE + 2);
-}
-
-
-static fm_s32 fm_bop_udelay(fm_u32 value, fm_u8 *buf, fm_s32 size)
-{
- if (size < (FM_UDELAY_BASIC_OP_SIZE + 2)) {
- return (-1);
- }
-
- if (buf == NULL) {
- return (-2);
- }
-
- buf[0] = FM_UDELAY_BASIC_OP;
- buf[1] = FM_UDELAY_BASIC_OP_SIZE;
- buf[2] = (fm_u8) ((value) & 0x000000FF);
- buf[3] = (fm_u8) ((value >> 8) & 0x000000FF);
- buf[4] = (fm_u8) ((value >> 16) & 0x000000FF);
- buf[5] = (fm_u8) ((value >> 24) & 0x000000FF);
-
- WCN_DBG(FM_DBG | CHIP, "%02x %02x %02x %02x %02x %02x\n", buf[0], buf[1], buf[2], buf[3],
- buf[4], buf[5]);
-
- return (FM_UDELAY_BASIC_OP_SIZE + 2);
-}
-
-
-static fm_s32 fm_bop_rd_until(fm_u8 addr, fm_u16 mask, fm_u16 value, fm_u8 *buf, fm_s32 size)
-{
- if (size < (FM_RD_UNTIL_BASIC_OP_SIZE + 2)) {
- return (-1);
- }
-
- if (buf == NULL) {
- return (-2);
- }
-
- buf[0] = FM_RD_UNTIL_BASIC_OP;
- buf[1] = FM_RD_UNTIL_BASIC_OP_SIZE;
- buf[2] = addr;
- buf[3] = (fm_u8) ((mask) & 0x00FF);
- buf[4] = (fm_u8) ((mask >> 8) & 0x00FF);
- buf[5] = (fm_u8) ((value) & 0x00FF);
- buf[6] = (fm_u8) ((value >> 8) & 0x00FF);
-
- WCN_DBG(FM_DBG | CHIP, "%02x %02x %02x %02x %02x %02x %02x\n", buf[0], buf[1], buf[2],
- buf[3], buf[4], buf[5], buf[6]);
-
- return (FM_RD_UNTIL_BASIC_OP_SIZE + 2);
-}
-
-
-static fm_s32 fm_bop_modify(fm_u8 addr, fm_u16 mask_and, fm_u16 mask_or, fm_u8 *buf, fm_s32 size)
-{
- if (size < (FM_MODIFY_BASIC_OP_SIZE + 2)) {
- return (-1);
- }
-
- if (buf == NULL) {
- return (-2);
- }
-
- buf[0] = FM_MODIFY_BASIC_OP;
- buf[1] = FM_MODIFY_BASIC_OP_SIZE;
- buf[2] = addr;
- buf[3] = (fm_u8) ((mask_and) & 0x00FF);
- buf[4] = (fm_u8) ((mask_and >> 8) & 0x00FF);
- buf[5] = (fm_u8) ((mask_or) & 0x00FF);
- buf[6] = (fm_u8) ((mask_or >> 8) & 0x00FF);
-
- WCN_DBG(FM_DBG | CHIP, "%02x %02x %02x %02x %02x %02x %02x\n", buf[0], buf[1], buf[2],
- buf[3], buf[4], buf[5], buf[6]);
-
- return (FM_MODIFY_BASIC_OP_SIZE + 2);
-}
-
-
-static fm_s32 fm_bop_top_write(fm_u16 addr, fm_u32 value, fm_u8 *buf, fm_s32 size)
-{
- if (size < (FM_TOP_WRITE_BOP_SIZE + 2)) {
- return (-1);
- }
-
- if (buf == NULL) {
- return (-2);
- }
-
- buf[0] = FM_TOP_WRITE_BASIC_OP;
- buf[1] = FM_TOP_WRITE_BOP_SIZE;
- buf[2] = 04;
- buf[3] = (fm_u8) ((addr) & 0x00FF);
- buf[4] = (fm_u8) ((addr >> 8) & 0x00FF);
- buf[5] = (fm_u8) ((value) & 0x00FF);
- buf[6] = (fm_u8) ((value >> 8) & 0x00FF);
- buf[7] = (fm_u8) ((value >> 16) & 0x00FF);
- buf[8] = (fm_u8) ((value >> 24) & 0x00FF);
-
- WCN_DBG(FM_DBG | CHIP, "%02x %02x %02x %02x %02x %02x %02x %02x %02x\n", buf[0], buf[1],
- buf[2], buf[3], buf[4], buf[5], buf[6], buf[7], buf[8]);
-
- return (FM_TOP_WRITE_BOP_SIZE + 2);
-}
-
-
-static fm_s32 fm_bop_top_rd_until(fm_u16 addr, fm_u32 mask, fm_u32 value, fm_u8 *buf, fm_s32 size)
-{
- if (size < (FM_TOP_RD_UNTIL_BOP_SIZE + 2)) {
- return (-1);
- }
-
- if (buf == NULL) {
- return (-2);
- }
-
- buf[0] = FM_TOP_RD_UNTIL_BASIC_OP;
- buf[1] = FM_TOP_RD_UNTIL_BOP_SIZE;
- buf[2] = 04;
- buf[3] = (fm_u8) ((addr) & 0x00FF);
- buf[4] = (fm_u8) ((addr >> 8) & 0x00FF);
- buf[5] = (fm_u8) ((mask) & 0x00FF);
- buf[6] = (fm_u8) ((mask >> 8) & 0x00FF);
- buf[7] = (fm_u8) ((mask >> 16) & 0x00FF);
- buf[8] = (fm_u8) ((mask >> 24) & 0x00FF);
- buf[9] = (fm_u8) ((value) & 0x00FF);
- buf[10] = (fm_u8) ((value >> 8) & 0x00FF);
- buf[11] = (fm_u8) ((value >> 16) & 0x00FF);
- buf[12] = (fm_u8) ((value >> 24) & 0x00FF);
-
- WCN_DBG(FM_DBG | CHIP, "%02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x\n",
- buf[0], buf[1], buf[2], buf[3], buf[4], buf[5], buf[6], buf[7], buf[8], buf[9],
- buf[10], buf[11], buf[12]);
-
- return (FM_TOP_RD_UNTIL_BOP_SIZE + 2);
-}
-
-/*
- * mt6627_pwrup_clock_on - Wholechip FM Power Up: step 1, FM Digital Clock enable
- * @buf - target buf
- * @buf_size - buffer size
- * return package size
- */
-fm_s32 mt6627_pwrup_clock_on(fm_u8 *buf, fm_s32 buf_size)
-{
- fm_s32 pkt_size = 0;
- fm_u16 de_emphasis;
- /* fm_u16 osc_freq; */
-
- if (buf_size < TX_BUF_SIZE) {
- return (-1);
- }
-
- de_emphasis = mt6627_fm_config.rx_cfg.deemphasis; /* MT6627fm_cust_config_fetch(FM_CFG_RX_DEEMPHASIS); */
- de_emphasis &= 0x0001; /* rang 0~1 */
- /* osc_freq = mt6627_fm_config.rx_cfg.osc_freq;//MT6628fm_cust_config_fetch(FM_CFG_RX_OSC_FREQ); */
- /* osc_freq &= 0x0007; //rang 0~5 */
-
- buf[0] = FM_TASK_COMMAND_PKT_TYPE;
- buf[1] = FM_ENABLE_OPCODE;
- pkt_size = 4;
-
- /* 2,turn on top clock */
- pkt_size += fm_bop_top_write(0xA10, 0xFFFFFFFF, &buf[pkt_size], buf_size - pkt_size); /* wr a10 ffffffff */
- /* 3,enable MTCMOS */
- pkt_size += fm_bop_top_write(0x60, 0x00000030, &buf[pkt_size], buf_size - pkt_size); /* wr 60 30 */
- pkt_size += fm_bop_top_write(0x60, 0x00000035, &buf[pkt_size], buf_size - pkt_size); /* wr 60 35 */
- pkt_size += fm_bop_top_rd_until(0x60, 0x0000000A, 0xA, &buf[pkt_size], buf_size - pkt_size); /* Poll 60[1]=1,[3]= 1 */
- pkt_size += fm_bop_top_write(0x60, 0x00000015, &buf[pkt_size], buf_size - pkt_size); /* wr 60 15 */
- pkt_size += fm_bop_top_write(0x60, 0x00000005, &buf[pkt_size], buf_size - pkt_size); /* wr 60 5 */
- pkt_size += fm_bop_udelay(10, &buf[pkt_size], buf_size - pkt_size); /* delay 10us */
- pkt_size += fm_bop_top_write(0x60, 0x00000045, &buf[pkt_size], buf_size - pkt_size); /* wr 60 45 */
- /* 4,set CSPI fm slave dummy count */
- pkt_size += fm_bop_top_write(0x68, 0x0000003F, &buf[pkt_size], buf_size - pkt_size); /* wr 68 3F */
-
- /* a1 enable digital OSC */
- pkt_size += fm_bop_top_write(0x50, 0x00000001, &buf[pkt_size], buf_size - pkt_size); /* wr 50 1 */
- pkt_size += fm_bop_udelay(3000, &buf[pkt_size], buf_size - pkt_size); /* delay 3ms */
- /* a3 set OSC clock output to fm */
- pkt_size += fm_bop_top_write(0x50, 0x00000003, &buf[pkt_size], buf_size - pkt_size); /* wr 50 3 */
- /* a4 release HW clock gating */
- pkt_size += fm_bop_top_write(0x50, 0x00000007, &buf[pkt_size], buf_size - pkt_size); /* wr 50 7 */
- /* set I2S current driving */
- pkt_size += fm_bop_top_write(0x000, 0x00000000, &buf[pkt_size], buf_size - pkt_size); /* wr 0 0 */
- /* a5 enable DSP auto clock gating */
- pkt_size += fm_bop_write(0x70, 0x0040, &buf[pkt_size], buf_size - pkt_size); /* wr 70 0040 */
- /* a7 deemphasis setting */
- pkt_size +=
- fm_bop_modify(0x61, ~DE_EMPHASIS, (de_emphasis << 12), &buf[pkt_size],
- buf_size - pkt_size);
-
- /* pkt_size += fm_bop_modify(0x60, OSC_FREQ_MASK, (osc_freq << 4), &buf[pkt_size], buf_size - pkt_size); */
-
- buf[2] = (fm_u8) ((pkt_size - 4) & 0x00FF);
- buf[3] = (fm_u8) (((pkt_size - 4) >> 8) & 0x00FF);
-
- return pkt_size;
-}
-
-
-/*
- * mt6627_patch_download - Wholechip FM Power Up: step 3, download patch to f/w,
- * @buf - target buf
- * @buf_size - buffer size
- * @seg_num - total segments that this patch divided into
- * @seg_id - No. of Segments: segment that will now be sent
- * @src - patch source buffer
- * @seg_len - segment size: segment that will now be sent
- * return package size
- */
-fm_s32 mt6627_patch_download(fm_u8 *buf, fm_s32 buf_size, fm_u8 seg_num, fm_u8 seg_id,
- const fm_u8 *src, fm_s32 seg_len)
-{
- fm_s32 pkt_size = 0;
- fm_u8 *dst = NULL;
-
- if (buf_size < TX_BUF_SIZE) {
- return (-1);
- }
-
- buf[0] = FM_TASK_COMMAND_PKT_TYPE;
- buf[1] = FM_PATCH_DOWNLOAD_OPCODE;
- pkt_size = 4;
-
- buf[pkt_size++] = seg_num;
- buf[pkt_size++] = seg_id;
-
- if (seg_len > (buf_size - pkt_size)) {
- return -1;
- }
-
- dst = &buf[pkt_size];
- pkt_size += seg_len;
-
- /* copy patch to tx buffer */
- while (seg_len--) {
- *dst = *src;
- /* pr_debug("%02x ", *dst); */
- src++;
- dst++;
- }
-
- buf[2] = (fm_u8) ((pkt_size - 4) & 0x00FF);
- buf[3] = (fm_u8) (((pkt_size - 4) >> 8) & 0x00FF);
- WCN_DBG(FM_DBG | CHIP, "%02x %02x %02x %02x %02x %02x %02x\n", buf[0], buf[1], buf[2],
- buf[3], buf[4], buf[5], buf[6]);
-
- return pkt_size;
-}
-
-
-/*
- * mt6627_coeff_download - Wholechip FM Power Up: step 3,download coeff to f/w,
- * @buf - target buf
- * @buf_size - buffer size
- * @seg_num - total segments that this patch divided into
- * @seg_id - No. of Segments: segment that will now be sent
- * @src - patch source buffer
- * @seg_len - segment size: segment that will now be sent
- * return package size
- */
-fm_s32 mt6627_coeff_download(fm_u8 *buf, fm_s32 buf_size, fm_u8 seg_num, fm_u8 seg_id,
- const fm_u8 *src, fm_s32 seg_len)
-{
- fm_s32 pkt_size = 0;
- fm_u8 *dst = NULL;
-
- if (buf_size < TX_BUF_SIZE) {
- return (-1);
- }
-
- buf[0] = FM_TASK_COMMAND_PKT_TYPE;
- buf[1] = FM_COEFF_DOWNLOAD_OPCODE;
- pkt_size = 4;
-
- buf[pkt_size++] = seg_num;
- buf[pkt_size++] = seg_id;
-
- if (seg_len > (buf_size - pkt_size)) {
- return -1;
- }
-
- dst = &buf[pkt_size];
- pkt_size += seg_len;
-
- /* copy patch to tx buffer */
- while (seg_len--) {
- *dst = *src;
- /* pr_debug("%02x ", *dst); */
- src++;
- dst++;
- }
-
- buf[2] = (fm_u8) ((pkt_size - 4) & 0x00FF);
- buf[3] = (fm_u8) (((pkt_size - 4) >> 8) & 0x00FF);
- WCN_DBG(FM_DBG | CHIP, "%02x %02x %02x %02x %02x %02x %02x\n", buf[0], buf[1], buf[2],
- buf[3], buf[4], buf[5], buf[6]);
-
- return pkt_size;
-}
-
-#if 0
-/*
- * mt6627_hwcoeff_download - Wholechip FM Power Up: step 3,download hwcoeff to f/w,
- * @buf - target buf
- * @buf_size - buffer size
- * @seg_num - total segments that this patch divided into
- * @seg_id - No. of Segments: segment that will now be sent
- * @src - patch source buffer
- * @seg_len - segment size: segment that will now be sent
- * return package size
- */
-fm_s32 mt6627_hwcoeff_download(fm_u8 *buf, fm_s32 buf_size, fm_u8 seg_num, fm_u8 seg_id,
- const fm_u8 *src, fm_s32 seg_len)
-{
- fm_s32 pkt_size = 0;
- fm_u8 *dst = NULL;
-
- if (buf_size < TX_BUF_SIZE) {
- return (-1);
- }
-
- buf[0] = FM_TASK_COMMAND_PKT_TYPE;
- buf[1] = FM_HWCOEFF_DOWNLOAD_OPCODE;
- pkt_size = 4;
-
- buf[pkt_size++] = seg_num;
- buf[pkt_size++] = seg_id;
-
- if (seg_len > (buf_size - pkt_size)) {
- return -1;
- }
-
- dst = &buf[pkt_size];
- pkt_size += seg_len;
-
- /* copy patch to tx buffer */
- while (seg_len--) {
- *dst = *src;
- /* pr_debug("%02x ", *dst); */
- src++;
- dst++;
- }
-
- buf[2] = (fm_u8) ((pkt_size - 4) & 0x00FF);
- buf[3] = (fm_u8) (((pkt_size - 4) >> 8) & 0x00FF);
- WCN_DBG(FM_DBG | CHIP, "%02x %02x %02x %02x %02x %02x %02x\n", buf[0], buf[1], buf[2],
- buf[3], buf[4], buf[5], buf[6]);
-
- return pkt_size;
-}
-
-
-/*
- * mt6627_rom_download - Wholechip FM Power Up: step 3,download rom to f/w,
- * @buf - target buf
- * @buf_size - buffer size
- * @seg_num - total segments that this patch divided into
- * @seg_id - No. of Segments: segment that will now be sent
- * @src - patch source buffer
- * @seg_len - segment size: segment that will now be sent
- * return package size
- */
-fm_s32 mt6627_rom_download(fm_u8 *buf, fm_s32 buf_size, fm_u8 seg_num, fm_u8 seg_id,
- const fm_u8 *src, fm_s32 seg_len)
-{
- fm_s32 pkt_size = 0;
- fm_u8 *dst = NULL;
-
- if (buf_size < TX_BUF_SIZE) {
- return (-1);
- }
-
- buf[0] = FM_TASK_COMMAND_PKT_TYPE;
- buf[1] = FM_ROM_DOWNLOAD_OPCODE;
- pkt_size = 4;
-
- buf[pkt_size++] = seg_num;
- buf[pkt_size++] = seg_id;
-
- if (seg_len > (buf_size - pkt_size)) {
- return -1;
- }
-
- dst = &buf[pkt_size];
- pkt_size += seg_len;
-
- /* copy patch to tx buffer */
- while (seg_len--) {
- *dst = *src;
- /* pr_debug("%02x ", *dst); */
- src++;
- dst++;
- }
-
- buf[2] = (fm_u8) ((pkt_size - 4) & 0x00FF);
- buf[3] = (fm_u8) (((pkt_size - 4) >> 8) & 0x00FF);
- WCN_DBG(FM_DBG | CHIP, "%02x %02x %02x %02x %02x %02x %02x\n", buf[0], buf[1], buf[2],
- buf[3], buf[4], buf[5], buf[6]);
-
- return pkt_size;
-}
-#endif
-
-/*
- * mt6627_pwrup_digital_init - Wholechip FM Power Up: step 4, FM Digital Init: fm_rgf_maincon
- * @buf - target buf
- * @buf_size - buffer size
- * return package size
- */
-fm_s32 mt6627_pwrup_digital_init(fm_u8 *buf, fm_s32 buf_size)
-{
- fm_s32 pkt_size = 0;
-
- if (buf_size < TX_BUF_SIZE) {
- return (-1);
- }
-
- buf[0] = FM_TASK_COMMAND_PKT_TYPE;
- buf[1] = FM_ENABLE_OPCODE;
- pkt_size = 4;
- /* FM RF&ADPLL divider setting */
- /* D2.1 set cell mode */
- /* wr 30 D3:D2 00:FDD(default),01:both.10: TDD, 11 FDD */
- /* pkt_size += fm_bop_modify(0x30, 0xFFF3, 0x0000, &buf[pkt_size], buf_size - pkt_size); */
- /* D2.2 set ADPLL divider */
- pkt_size += fm_bop_write(0x21, 0xE000, &buf[pkt_size], buf_size - pkt_size); /* wr 21 E000 */
- /* D2.3 set SDM coeff0_H */
- pkt_size += fm_bop_write(0xD8, 0x03F0, &buf[pkt_size], buf_size - pkt_size); /* wr D8 0x03F0 */
- /* D2.4 set SDM coeff0_L */
- pkt_size += fm_bop_write(0xD9, 0x3F04, &buf[pkt_size], buf_size - pkt_size); /* wr D9 0x3F04 */
- /* D2.5 set SDM coeff1_H */
- pkt_size += fm_bop_write(0xDA, 0x0014, &buf[pkt_size], buf_size - pkt_size); /* wr DA 0x0014 */
- /* D2.6 set SDM coeff1_L */
- pkt_size += fm_bop_write(0xDB, 0x2A38, &buf[pkt_size], buf_size - pkt_size); /* wr DB 0x2A38 */
- /* D2.7 set 26M clock */
- pkt_size += fm_bop_write(0x23, 0x4000, &buf[pkt_size], buf_size - pkt_size); /* wr 23 4000 */
-
- /* FM Digital Init: fm_rgf_maincon */
- /* E4 */
- pkt_size += fm_bop_write(0x6A, 0x0021, &buf[pkt_size], buf_size - pkt_size); /* wr 6A 0021 */
- pkt_size += fm_bop_write(0x6B, 0x0021, &buf[pkt_size], buf_size - pkt_size); /* wr 6B 0021 */
- /* E5 */
- pkt_size += fm_bop_top_write(0x50, 0x0000000F, &buf[pkt_size], buf_size - pkt_size); /* wr 50 f */
- /* E6 */
- pkt_size += fm_bop_modify(0x61, 0xFFFD, 0x0002, &buf[pkt_size], buf_size - pkt_size); /* wr 61 D1=1 */
- /* E7 */
- pkt_size += fm_bop_modify(0x61, 0xFFFE, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* wr 61 D0=0 */
- /* E8 */
- pkt_size += fm_bop_udelay(100000, &buf[pkt_size], buf_size - pkt_size); /* delay 100ms */
- /* E9 */
- pkt_size += fm_bop_rd_until(0x64, 0x001F, 0x0002, &buf[pkt_size], buf_size - pkt_size); /* Poll 64[0~4] = 2 */
-
- buf[2] = (fm_u8) ((pkt_size - 4) & 0x00FF);
- buf[3] = (fm_u8) (((pkt_size - 4) >> 8) & 0x00FF);
-
- return pkt_size;
-}
-
-/*
- * mt6627_pwrup_fine_tune - Wholechip FM Power Up: step 5, FM RF fine tune setting
- * @buf - target buf
- * @buf_size - buffer size
- * return package size
- */
-fm_s32 mt6627_pwrup_fine_tune(fm_u8 *buf, fm_s32 buf_size)
-{
- fm_s32 pkt_size = 0;
-
- if (buf_size < TX_BUF_SIZE) {
- return (-1);
- }
-
- buf[0] = FM_TASK_COMMAND_PKT_TYPE;
- buf[1] = FM_ENABLE_OPCODE;
- pkt_size = 4;
-
- /* F1 set host control RF register */
- pkt_size += fm_bop_top_write(0x50, 0x00000007, &buf[pkt_size], buf_size - pkt_size); /* wr 50 7 */
- /* F2 fine tune RF setting */
- pkt_size += fm_bop_write(0x01, 0xBEE8, &buf[pkt_size], buf_size - pkt_size); /* wr 01 0xBEE8 */
- pkt_size += fm_bop_write(0x03, 0xF6ED, &buf[pkt_size], buf_size - pkt_size); /* wr 03 0xF6ED mdy 0315 version */
- pkt_size += fm_bop_write(0x15, 0x0D80, &buf[pkt_size], buf_size - pkt_size); /* wr 15 0x0D80 */
- pkt_size += fm_bop_write(0x16, 0x0068, &buf[pkt_size], buf_size - pkt_size); /* wr 16 0x0068 */
- pkt_size += fm_bop_write(0x17, 0x092A, &buf[pkt_size], buf_size - pkt_size); /* wr 17 0x092A */
- pkt_size += fm_bop_write(0x34, 0x807F, &buf[pkt_size], buf_size - pkt_size); /* wr 34 0x807F */
- pkt_size += fm_bop_write(0x35, 0x311E, &buf[pkt_size], buf_size - pkt_size); /* wr 35 0x311E */
- /* F1 set DSP control RF register */
- pkt_size += fm_bop_top_write(0x50, 0x0000000F, &buf[pkt_size], buf_size - pkt_size); /* wr 50 F */
-
- buf[2] = (fm_u8) ((pkt_size - 4) & 0x00FF);
- buf[3] = (fm_u8) (((pkt_size - 4) >> 8) & 0x00FF);
-
- return pkt_size;
-}
-
-
-/*
- * mt6627_pwrdown - Wholechip FM Power down: Digital Modem Power Down
- * @buf - target buf
- * @buf_size - buffer size
- * return package size
- */
-fm_s32 mt6627_pwrdown(fm_u8 *buf, fm_s32 buf_size)
-{
- fm_s32 pkt_size = 0;
-
- if (buf_size < TX_BUF_SIZE) {
- return (-1);
- }
-
- buf[0] = FM_TASK_COMMAND_PKT_TYPE;
- buf[1] = FM_ENABLE_OPCODE;
- pkt_size = 4;
- /* A1:set audio output I2S Tx mode: */
- pkt_size += fm_bop_modify(0x9B, 0xFFF8, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* wr 9B[0~2] 0 */
-
- /* B0:Disable HW clock control */
- pkt_size += fm_bop_top_write(0x50, 0x330F, &buf[pkt_size], buf_size - pkt_size); /* wr top50 330F */
- /* B1:Reset ASIP */
- pkt_size += fm_bop_write(0x61, 0x0001, &buf[pkt_size], buf_size - pkt_size); /* wr 61 0001 */
- /* B2:digital core + digital rgf reset */
- pkt_size += fm_bop_modify(0x6E, 0xFFF8, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* wr 6E[0~2] 0 */
- pkt_size += fm_bop_modify(0x6E, 0xFFF8, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* wr 6E[0~2] 0 */
- pkt_size += fm_bop_modify(0x6E, 0xFFF8, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* wr 6E[0~2] 0 */
- pkt_size += fm_bop_modify(0x6E, 0xFFF8, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* wr 6E[0~2] 0 */
- /* B3:Disable all clock */
- pkt_size += fm_bop_top_write(0x50, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* wr top50 0000 */
- /* B4:Reset rgfrf */
- pkt_size += fm_bop_top_write(0x50, 0x4000, &buf[pkt_size], buf_size - pkt_size); /* wr top50 4000 */
- pkt_size += fm_bop_top_write(0x50, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* wr top50 0000 */
- /* MTCMOS power off */
- /* C0:disable MTCMOS */
- pkt_size += fm_bop_top_write(0x60, 0x0005, &buf[pkt_size], buf_size - pkt_size); /* wr top60 0005 */
- pkt_size += fm_bop_top_write(0x60, 0x0015, &buf[pkt_size], buf_size - pkt_size); /* wr top60 0015 */
- pkt_size += fm_bop_top_write(0x60, 0x0035, &buf[pkt_size], buf_size - pkt_size); /* wr top60 0035 */
- pkt_size += fm_bop_top_write(0x60, 0x0030, &buf[pkt_size], buf_size - pkt_size); /* wr top60 0030 */
- pkt_size += fm_bop_top_rd_until(0x60, 0x0000000A, 0x0, &buf[pkt_size], buf_size - pkt_size); /* Poll 60[1]=0,[3]= 0 */
-
- buf[2] = (fm_u8) ((pkt_size - 4) & 0x00FF);
- buf[3] = (fm_u8) (((pkt_size - 4) >> 8) & 0x00FF);
-
- return pkt_size;
-}
-
-
-/*
- * mt6627_rampdown - f/w will wait for STC_DONE interrupt
- * @buf - target buf
- * @buf_size - buffer size
- * return package size
- */
-fm_s32 mt6627_rampdown(fm_u8 *buf, fm_s32 buf_size)
-{
- fm_s32 pkt_size = 0;
-
- if (buf_size < TX_BUF_SIZE) {
- return (-1);
- }
-
- buf[0] = FM_TASK_COMMAND_PKT_TYPE;
- buf[1] = FM_RAMPDOWN_OPCODE;
- pkt_size = 4;
-
- /* Clear DSP state */
- pkt_size += fm_bop_modify(FM_MAIN_CTRL, 0xFFF0, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* wr 63[3:0] = 0 */
- /* Set DSP ramp down state */
- pkt_size += fm_bop_modify(FM_MAIN_CTRL, 0xFFFF, RAMP_DOWN, &buf[pkt_size], buf_size - pkt_size); /* wr 63[8] = 1 */
- /* @Wait for STC_DONE interrupt@ */
- pkt_size += fm_bop_rd_until(FM_MAIN_INTR, FM_INTR_STC_DONE, FM_INTR_STC_DONE, &buf[pkt_size], buf_size - pkt_size); /* Poll 69[0] = b'1 */
- /* Clear DSP ramp down state */
- pkt_size += fm_bop_modify(FM_MAIN_CTRL, (~RAMP_DOWN), 0x0000, &buf[pkt_size], buf_size - pkt_size); /* wr 63[8] = 0 */
- /* Write 1 clear the STC_DONE interrupt status flag */
- pkt_size += fm_bop_modify(FM_MAIN_INTR, 0xFFFF, FM_INTR_STC_DONE, &buf[pkt_size], buf_size - pkt_size); /* wr 69[0] = 1 */
-
- buf[2] = (fm_u8) ((pkt_size - 4) & 0x00FF);
- buf[3] = (fm_u8) (((pkt_size - 4) >> 8) & 0x00FF);
-
- return pkt_size;
-}
-
-
-/*
- * mt6627_tune - execute tune action,
- * @buf - target buf
- * @buf_size - buffer size
- * @freq - 760 ~ 1080, 100KHz unit
- * return package size
- */
-fm_s32 mt6627_tune(fm_u8 *buf, fm_s32 buf_size, fm_u16 freq, fm_u16 chan_para)
-{
- /* #define FM_TUNE_USE_POLL */
- fm_s32 pkt_size = 0;
-
- if (buf_size < TX_BUF_SIZE) {
- return (-1);
- }
-/*
- if (0 == fm_get_channel_space(freq)) {
- freq *= 10;
- }
-
- freq = (freq - 6400) * 2 / 10;
-*/
- buf[0] = FM_TASK_COMMAND_PKT_TYPE;
- buf[1] = FM_TUNE_OPCODE;
- pkt_size = 4;
-
- /* Set desired channel & channel parameter */
-#ifdef FM_TUNE_USE_POLL
- pkt_size += fm_bop_write(0x6A, 0x0000, &buf[pkt_size], buf_size - pkt_size);
- pkt_size += fm_bop_write(0x6B, 0x0000, &buf[pkt_size], buf_size - pkt_size);
-#endif
- /* pkt_size += fm_bop_modify(FM_CHANNEL_SET, 0xFC00, freq, &buf[pkt_size], buf_size - pkt_size);// set 0x65[9:0] = 0x029e, => ((97.5 - 64) * 20) */
- /* channel para setting, D15~D12, D15: ATJ, D13: HL, D12: FA */
- /* pkt_size += fm_bop_modify(FM_CHANNEL_SET, 0x0FFF, (chan_para << 12), &buf[pkt_size], buf_size - pkt_size); */
- /* Enable hardware controlled tuning sequence */
- pkt_size += fm_bop_modify(FM_MAIN_CTRL, 0xFFF8, TUNE, &buf[pkt_size], buf_size - pkt_size); /* set 0x63[0] = 1 */
- /* Wait for STC_DONE interrupt */
-#ifdef FM_TUNE_USE_POLL
- pkt_size += fm_bop_rd_until(FM_MAIN_INTR, FM_INTR_STC_DONE, FM_INTR_STC_DONE, &buf[pkt_size], buf_size - pkt_size); /* Poll 69[0] = b'1 */
- /* Write 1 clear the STC_DONE interrupt status flag */
- pkt_size += fm_bop_modify(FM_MAIN_INTR, 0xFFFF, FM_INTR_STC_DONE, &buf[pkt_size], buf_size - pkt_size); /* wr 69[0] = 1 */
-#endif
- buf[2] = (fm_u8) ((pkt_size - 4) & 0x00FF);
- buf[3] = (fm_u8) (((pkt_size - 4) >> 8) & 0x00FF);
-
- return pkt_size;
-}
-
-
-/*
- * mt6627_full_cqi_req - execute request cqi info action,
- * @buf - target buf
- * @buf_size - buffer size
- * @freq - 7600 ~ 10800, freq array
- * @cnt - channel count
- * @type - request type, 1: a single channel; 2: multi channel; 3:multi channel with 100Khz step; 4: multi channel with 50Khz step
- *
- * return package size
- */
-fm_s32 mt6627_full_cqi_req(fm_u8 *buf, fm_s32 buf_size, fm_u16 *freq, fm_s32 cnt, fm_s32 type)
-{
- fm_s32 pkt_size = 0;
-
- if (buf_size < TX_BUF_SIZE) {
- return (-1);
- }
-
- buf[0] = FM_TASK_COMMAND_PKT_TYPE;
- buf[1] = FM_SOFT_MUTE_TUNE_OPCODE;
- pkt_size = 4;
-
- switch (type) {
- case 1:
- buf[pkt_size] = 0x0001;
- pkt_size++;
- buf[pkt_size] = (fm_u8) ((*freq) & 0x00FF);
- pkt_size++;
- buf[pkt_size] = (fm_u8) ((*freq >> 8) & 0x00FF);
- pkt_size++;
- break;
- case 2:
- buf[pkt_size] = 0x0002;
- pkt_size++;
- break;
- case 3:
- buf[pkt_size] = 0x0003;
- pkt_size++;
- break;
- case 4:
- buf[pkt_size] = 0x0004;
- pkt_size++;
- break;
- default:
- buf[pkt_size] = (fm_u16) type;
- pkt_size++;
- break;
- }
-
- buf[2] = (fm_u8) ((pkt_size - 4) & 0x00FF);
- buf[3] = (fm_u8) (((pkt_size - 4) >> 8) & 0x00FF);
-
- return pkt_size;
-}
-
-
-/*
- * mt6627_seek - execute seek action,
- * @buf - target buf
- * @buf_size - buffer size
- * @seekdir - 0=seek up, 1=seek down
- * @space - step, 50KHz:001, 100KHz:010, 200KHz:100
- * @max_freq - upper bound
- * @min_freq - lower bound
- * return package size
- */
-fm_s32 mt6627_seek(fm_u8 *buf, fm_s32 buf_size, fm_u16 seekdir, fm_u16 space, fm_u16 max_freq,
- fm_u16 min_freq)
-{
- fm_s32 pkt_size = 0;
-
- if (buf_size < TX_BUF_SIZE) {
- return (-1);
- }
-
- if (0 == fm_get_channel_space(max_freq)) {
- max_freq *= 10;
- }
-
- if (0 == fm_get_channel_space(min_freq)) {
- min_freq *= 10;
- }
-
- buf[0] = FM_TASK_COMMAND_PKT_TYPE;
- buf[1] = FM_SEEK_OPCODE;
- pkt_size = 4;
-
- /* Program seek direction */
- if (seekdir == 0) {
- pkt_size += fm_bop_modify(FM_MAIN_CFG1, 0xFBFF, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* 0x66[10] = 0, seek up */
- } else {
- pkt_size += fm_bop_modify(FM_MAIN_CFG1, 0xFBFF, 0x0400, &buf[pkt_size], buf_size - pkt_size); /* 0x66[10] = 1, seek down */
- }
-
- /* Program scan channel spacing */
- if (space == 1) {
- pkt_size += fm_bop_modify(FM_MAIN_CFG1, 0x8FFF, 0x1000, &buf[pkt_size], buf_size - pkt_size); /* clear 0x66[14:12] then 0x66[14:12]=001 */
- } else if (space == 2) {
- pkt_size += fm_bop_modify(FM_MAIN_CFG1, 0x8FFF, 0x2000, &buf[pkt_size], buf_size - pkt_size); /* clear 0x66[14:12] then 0x66[14:12]=010 */
- } else if (space == 4) {
- pkt_size += fm_bop_modify(FM_MAIN_CFG1, 0x8FFF, 0x4000, &buf[pkt_size], buf_size - pkt_size); /* clear 0x66[14:12] then 0x66[14:12]=100 */
- }
- /* enable wrap , if it is not auto scan function, 0x66[11] 0=no wrarp, 1=wrap */
- pkt_size += fm_bop_modify(FM_MAIN_CFG1, 0xF7FF, 0x0800, &buf[pkt_size], buf_size - pkt_size); /* 0x66[11] = 1, wrap */
- /* 0x66[9:0] freq upper bound */
-
- max_freq = (max_freq - 6400) * 2 / 10;
-
- pkt_size +=
- fm_bop_modify(FM_MAIN_CFG1, 0xFC00, max_freq, &buf[pkt_size], buf_size - pkt_size);
- /* 0x67[9:0] freq lower bound */
-
- min_freq = (min_freq - 6400) * 2 / 10;
-
- pkt_size +=
- fm_bop_modify(FM_MAIN_CFG2, 0xFC00, min_freq, &buf[pkt_size], buf_size - pkt_size);
- /* Enable hardware controlled seeking sequence */
- pkt_size += fm_bop_modify(FM_MAIN_CTRL, 0xFFF8, SEEK, &buf[pkt_size], buf_size - pkt_size); /* 0x63[1] = 1 */
- /* Wait for STC_DONE interrupt */
- /* pkt_size += fm_bop_rd_until(FM_MAIN_INTR, FM_INTR_STC_DONE, FM_INTR_STC_DONE, &buf[pkt_size], buf_size - pkt_size);//Poll 69[0] = b'1 */
- /* Write 1 clear the STC_DONE interrupt status flag */
- /* pkt_size += fm_bop_modify(FM_MAIN_INTR, 0xFFFF, FM_INTR_STC_DONE, &buf[pkt_size], buf_size - pkt_size);//wr 69[0] = 1 */
-
- buf[2] = (fm_u8) ((pkt_size - 4) & 0x00FF);
- buf[3] = (fm_u8) (((pkt_size - 4) >> 8) & 0x00FF);
-
- return pkt_size;
-}
-
-
-/*
- * mt6627_scan - execute scan action,
- * @buf - target buf
- * @buf_size - buffer size
- * @scandir - 0=seek up, 1=seek down
- * @space - step, 50KHz:001, 100KHz:010, 200KHz:100
- * @max_freq - upper bound
- * @min_freq - lower bound
- * return package size
- */
-fm_s32 mt6627_scan(fm_u8 *buf, fm_s32 buf_size, fm_u16 scandir, fm_u16 space, fm_u16 max_freq,
- fm_u16 min_freq)
-{
- fm_s32 pkt_size = 0;
-
- if (buf_size < TX_BUF_SIZE) {
- return (-1);
- }
-
- if (0 == fm_get_channel_space(max_freq)) {
- max_freq *= 10;
- }
- if (0 == fm_get_channel_space(min_freq)) {
- min_freq *= 10;
- }
-
- buf[0] = FM_TASK_COMMAND_PKT_TYPE;
- buf[1] = FM_SCAN_OPCODE;
- pkt_size = 4;
-
- /* Program seek direction */
- if (scandir == 0) {
- pkt_size += fm_bop_modify(FM_MAIN_CFG1, 0xFBFF, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* 0x66[10] = 0, seek up */
- } else {
- pkt_size += fm_bop_modify(FM_MAIN_CFG1, 0xFFFF, 0x0400, &buf[pkt_size], buf_size - pkt_size); /* 0x66[10] = 1, seek down */
- }
-
- /* Program scan channel spacing */
- if (space == 1) {
- pkt_size += fm_bop_modify(FM_MAIN_CFG1, 0x8FFF, 0x1000, &buf[pkt_size], buf_size - pkt_size); /* clear 0x66[14:12] then 0x66[14:12]=001 */
- } else if (space == 2) {
- pkt_size += fm_bop_modify(FM_MAIN_CFG1, 0x8FFF, 0x2000, &buf[pkt_size], buf_size - pkt_size); /* clear 0x66[14:12] then 0x66[14:12]=010 */
- } else if (space == 4) {
- pkt_size += fm_bop_modify(FM_MAIN_CFG1, 0x8FFF, 0x4000, &buf[pkt_size], buf_size - pkt_size); /* clear 0x66[14:12] then 0x66[14:12]=100 */
- }
- /* disable wrap , if it is auto scan function, 0x66[11] 0=no wrarp, 1=wrap */
- pkt_size += fm_bop_modify(FM_MAIN_CFG1, 0xF7FF, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* 0x66[11] = 0, no wrap */
- /* 0x66[9:0] freq upper bound */
-
- max_freq = (max_freq - 6400) * 2 / 10;
-
- pkt_size +=
- fm_bop_modify(FM_MAIN_CFG1, 0xFC00, max_freq, &buf[pkt_size], buf_size - pkt_size);
- /* 0x67[9:0] freq lower bound */
-
- min_freq = (min_freq - 6400) * 2 / 10;
-
- pkt_size +=
- fm_bop_modify(FM_MAIN_CFG2, 0xFC00, min_freq, &buf[pkt_size], buf_size - pkt_size);
- /* Enable hardware controlled scanning sequence */
- pkt_size += fm_bop_modify(FM_MAIN_CTRL, 0xFFF8, SCAN, &buf[pkt_size], buf_size - pkt_size); /* 0x63[1] = 1 */
- /* Wait for STC_DONE interrupt */
- /* pkt_size += fm_bop_rd_until(FM_MAIN_INTR, FM_INTR_STC_DONE, FM_INTR_STC_DONE, &buf[pkt_size], buf_size - pkt_size);//Poll 69[0] = b'1 */
- /* Write 1 clear the STC_DONE interrupt status flag */
- /* pkt_size += fm_bop_modify(FM_MAIN_INTR, 0xFFFF, FM_INTR_STC_DONE, &buf[pkt_size], buf_size - pkt_size);//wr 69[0] = 1 */
-
- buf[2] = (fm_u8) ((pkt_size - 4) & 0x00FF);
- buf[3] = (fm_u8) (((pkt_size - 4) >> 8) & 0x00FF);
-
- return pkt_size;
-}
-
-
-fm_s32 mt6627_cqi_get(fm_u8 *buf, fm_s32 buf_size)
-{
- fm_s32 pkt_size = 0;
-
- if (buf_size < TX_BUF_SIZE) {
- return (-1);
- }
-
- buf[0] = FM_TASK_COMMAND_PKT_TYPE;
- buf[1] = FM_SCAN_OPCODE;
- pkt_size = 4;
-
- pkt_size += fm_bop_modify(FM_MAIN_CTRL, 0xFFF0, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* wr 63 bit0~2 0 */
- pkt_size += fm_bop_modify(FM_MAIN_CTRL, ~CQI_READ, CQI_READ, &buf[pkt_size], buf_size - pkt_size); /* wr 63 bit3 1 */
-
- buf[2] = (fm_u8) ((pkt_size - 4) & 0x00FF);
- buf[3] = (fm_u8) (((pkt_size - 4) >> 8) & 0x00FF);
-
- return pkt_size;
-}
-
-
-fm_s32 mt6627_get_reg(fm_u8 *buf, fm_s32 buf_size, fm_u8 addr)
-{
- if (buf_size < TX_BUF_SIZE) {
- return (-1);
- }
-
- buf[0] = FM_TASK_COMMAND_PKT_TYPE;
- buf[1] = FSPI_READ_OPCODE;
- buf[2] = 0x01;
- buf[3] = 0x00;
- buf[4] = addr;
-
- WCN_DBG(FM_DBG | CHIP, "%02x %02x %02x %02x %02x\n", buf[0], buf[1], buf[2], buf[3],
- buf[4]);
- return 5;
-}
-
-
-fm_s32 mt6627_set_reg(fm_u8 *buf, fm_s32 buf_size, fm_u8 addr, fm_u16 value)
-{
- if (buf_size < TX_BUF_SIZE) {
- return (-1);
- }
-
- buf[0] = FM_TASK_COMMAND_PKT_TYPE;
- buf[1] = FSPI_WRITE_OPCODE;
- buf[2] = 0x03;
- buf[3] = 0x00;
- buf[4] = addr;
- buf[5] = (fm_u8) ((value) & 0x00FF);
- buf[6] = (fm_u8) ((value >> 8) & 0x00FF);
-
- WCN_DBG(FM_DBG | CHIP, "%02x %02x %02x %02x %02x %02x %02x\n", buf[0], buf[1], buf[2],
- buf[3], buf[4], buf[5], buf[6]);
- return 7;
-}
-
-
-fm_s32 mt6627_set_bits_reg(fm_u8 *buf, fm_s32 buf_size, fm_u8 addr, fm_u16 bits, fm_u16 mask)
-{
- fm_s32 pkt_size = 0;
- if (buf_size < TX_BUF_SIZE) {
- return (-1);
- }
-
- buf[0] = FM_TASK_COMMAND_PKT_TYPE;
- buf[1] = 0x11; /* 0x11 this opcode won't be parsed as an opcode, so set here as spcial case. */
- pkt_size = 4;
- pkt_size += fm_bop_modify(addr, mask, bits, &buf[pkt_size], buf_size - pkt_size);
-
- buf[2] = (fm_u8) ((pkt_size - 4) & 0x00FF);
- buf[3] = (fm_u8) (((pkt_size - 4) >> 8) & 0x00FF);
-
- return pkt_size;
-}
-
-/*top register read*/
-fm_s32 mt6627_top_get_reg(fm_u8 *buf, fm_s32 buf_size, fm_u16 addr)
-{
- if (buf_size < TX_BUF_SIZE) {
- return (-1);
- }
-
- buf[0] = FM_TASK_COMMAND_PKT_TYPE;
- buf[1] = CSPI_READ_OPCODE;
- buf[2] = 0x03;
- buf[3] = 0x00;
- buf[4] = 0x04; /* top 04,fm 02 */
- buf[5] = (fm_u8) ((addr) & 0x00FF);
- buf[6] = (fm_u8) ((addr >> 8) & 0x00FF);
-
- WCN_DBG(FM_DBG | CHIP, "%02x %02x %02x %02x %02x %02x %02x\n", buf[0], buf[1], buf[2],
- buf[3], buf[4], buf[5], buf[6]);
- return 7;
-}
-
-
-fm_s32 mt6627_top_set_reg(fm_u8 *buf, fm_s32 buf_size, fm_u16 addr, fm_u32 value)
-{
- if (buf_size < TX_BUF_SIZE) {
- return (-1);
- }
-
- buf[0] = FM_TASK_COMMAND_PKT_TYPE;
- buf[1] = CSPI_WRITE_OPCODE;
- buf[2] = 0x07;
- buf[3] = 0x00;
- buf[4] = 0x04; /* top 04,fm 02 */
- buf[5] = (fm_u8) ((addr) & 0x00FF);
- buf[6] = (fm_u8) ((addr >> 8) & 0x00FF);
- buf[7] = (fm_u8) ((value) & 0x00FF);
- buf[8] = (fm_u8) ((value >> 8) & 0x00FF);
- buf[9] = (fm_u8) ((value >> 16) & 0x00FF);
- buf[10] = (fm_u8) ((value >> 24) & 0x00FF);
-
- WCN_DBG(FM_DBG | CHIP, "%02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x\n", buf[0],
- buf[1], buf[2], buf[3], buf[4], buf[5], buf[6], buf[7], buf[8], buf[9], buf[10]);
- return 11;
-}
-
-/*host register read*/
-fm_s32 mt6627_host_get_reg(fm_u8 *buf, fm_s32 buf_size, fm_u32 addr)
-{
- if (buf_size < TX_BUF_SIZE) {
- return (-1);
- }
-
- buf[0] = FM_TASK_COMMAND_PKT_TYPE;
- buf[1] = FM_HOST_READ_OPCODE;
- buf[2] = 0x04;
- buf[3] = 0x00;
- buf[4] = (fm_u8) ((addr) & 0x00FF);
- buf[5] = (fm_u8) ((addr >> 8) & 0x00FF);
- buf[6] = (fm_u8) ((addr >> 16) & 0x00FF);
- buf[7] = (fm_u8) ((addr >> 24) & 0x00FF);
-
- WCN_DBG(FM_DBG | CHIP, "%02x %02x %02x %02x %02x %02x %02x %02x\n", buf[0], buf[1], buf[2],
- buf[3], buf[4], buf[5], buf[6], buf[7]);
- return 8;
-}
-
-
-fm_s32 mt6627_host_set_reg(fm_u8 *buf, fm_s32 buf_size, fm_u32 addr, fm_u32 value)
-{
- if (buf_size < TX_BUF_SIZE) {
- return (-1);
- }
-
- buf[0] = FM_TASK_COMMAND_PKT_TYPE;
- buf[1] = FM_HOST_WRITE_OPCODE;
- buf[2] = 0x08;
- buf[3] = 0x00;
- buf[4] = (fm_u8) ((addr) & 0x00FF);
- buf[5] = (fm_u8) ((addr >> 8) & 0x00FF);
- buf[6] = (fm_u8) ((addr >> 16) & 0x00FF);
- buf[7] = (fm_u8) ((addr >> 24) & 0x00FF);
- buf[8] = (fm_u8) ((value) & 0x00FF);
- buf[9] = (fm_u8) ((value >> 8) & 0x00FF);
- buf[10] = (fm_u8) ((value >> 16) & 0x00FF);
- buf[11] = (fm_u8) ((value >> 24) & 0x00FF);
-
- WCN_DBG(FM_DBG | CHIP, "%02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x\n",
- buf[0], buf[1], buf[2], buf[3], buf[4], buf[5], buf[6], buf[7], buf[8], buf[9],
- buf[10], buf[11]);
- return 12;
-}
diff --git a/drivers/misc/mediatek/fmradio/mt6627/pub/mt6627_fm_config.c b/drivers/misc/mediatek/fmradio/mt6627/pub/mt6627_fm_config.c
deleted file mode 100644
index cde6e66ef..000000000
--- a/drivers/misc/mediatek/fmradio/mt6627/pub/mt6627_fm_config.c
+++ /dev/null
@@ -1,180 +0,0 @@
-/* mt6627_fm_config.c
- *
- * (C) Copyright 2011
- * MediaTek <www.MediaTek.com>
- * hongcheng <hongcheng.xia@MediaTek.com>
- *
- * FM Radio Driver
- *
- * 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.
- *
- * 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.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- */
-#include <linux/string.h>
-#include <linux/slab.h>
-
-#include "fm_typedef.h"
-#include "fm_rds.h"
-#include "fm_dbg.h"
-#include "fm_err.h"
-#include "fm_stdlib.h"
-#include "fm_patch.h"
-#include "fm_config.h"
-/* #include "fm_cust_cfg.h" */
-#include "mt6627_fm_cust_cfg.h"
-fm_cust_cfg mt6627_fm_config;
-/* static fm_s32 fm_index = 0; */
-
-static fm_s32 MT6627fm_cust_config_print(fm_cust_cfg *cfg)
-{
- WCN_DBG(FM_NTC | MAIN, "MT6627 rssi_l:\t%d\n", cfg->rx_cfg.long_ana_rssi_th);
- WCN_DBG(FM_NTC | MAIN, "MT6627 rssi_s:\t%d\n", cfg->rx_cfg.short_ana_rssi_th);
- WCN_DBG(FM_NTC | MAIN, "MT6627 pamd_th:\t%d\n", cfg->rx_cfg.pamd_th);
- WCN_DBG(FM_NTC | MAIN, "MT6627 mr_th:\t%d\n", cfg->rx_cfg.mr_th);
- WCN_DBG(FM_NTC | MAIN, "MT6627 atdc_th:\t%d\n", cfg->rx_cfg.atdc_th);
- WCN_DBG(FM_NTC | MAIN, "MT6627 prx_th:\t%d\n", cfg->rx_cfg.prx_th);
- WCN_DBG(FM_NTC | MAIN, "MT6627 atdev_th:\t%d\n", cfg->rx_cfg.atdev_th);
- WCN_DBG(FM_NTC | MAIN, "MT6627 smg_th:\t%d\n", cfg->rx_cfg.smg_th);
- WCN_DBG(FM_NTC | MAIN, "de_emphasis:\t%d\n", cfg->rx_cfg.deemphasis);
- WCN_DBG(FM_NTC | MAIN, "osc_freq:\t%d\n", cfg->rx_cfg.osc_freq);
-
- WCN_DBG(FM_NTC | MAIN, "aud path[%d]I2S state[%d]mode[%d]rate[%d]\n", cfg->aud_cfg.aud_path,
- cfg->aud_cfg.i2s_info.status, cfg->aud_cfg.i2s_info.mode,
- cfg->aud_cfg.i2s_info.rate);
- return 0;
-}
-
-static fm_s32 MT6627cfg_item_handler(fm_s8 *grp, fm_s8 *key, fm_s8 *val, fm_cust_cfg *cfg)
-{
- fm_s32 ret = 0;
- struct fm_rx_cust_cfg *rx_cfg = &cfg->rx_cfg;
-
- if (0 <= (ret = cfg_item_match(key, val, "FM_RX_RSSI_TH_LONG_MT6627", &rx_cfg->long_ana_rssi_th))) { /* FMR_RSSI_TH_L = 0x0301 */
- return ret;
- } else if (0 <=
- (ret =
- cfg_item_match(key, val, "FM_RX_RSSI_TH_SHORT_MT6627",
- &rx_cfg->short_ana_rssi_th))) {
- return ret;
- } else if (0 <=
- (ret =
- cfg_item_match(key, val, "FM_RX_DESENSE_RSSI_MT6627",
- &rx_cfg->desene_rssi_th))) {
- return ret;
- } else if (0 <= (ret = cfg_item_match(key, val, "FM_RX_PAMD_TH_MT6627", &rx_cfg->pamd_th))) {
- return ret;
- } else if (0 <= (ret = cfg_item_match(key, val, "FM_RX_MR_TH_MT6627", &rx_cfg->mr_th))) {
- return ret;
- } else if (0 <= (ret = cfg_item_match(key, val, "FM_RX_ATDC_TH_MT6627", &rx_cfg->atdc_th))) {
- return ret;
- } else if (0 <= (ret = cfg_item_match(key, val, "FM_RX_PRX_TH_MT6627", &rx_cfg->prx_th))) {
- return ret;
- }
- /*else if (0 <= (ret = cfg_item_match(key, val, "FM_RX_ATDEV_TH_MT6627", &rx_cfg->atdev_th)))
- {
- return ret;
- } */
- else if (0 <= (ret = cfg_item_match(key, val, "FM_RX_SMG_TH_MT6627", &rx_cfg->smg_th))) {
- return ret;
- } else if (0 <=
- (ret =
- cfg_item_match(key, val, "FM_RX_DEEMPHASIS_MT6627", &rx_cfg->deemphasis))) {
- return ret;
- } else if (0 <=
- (ret = cfg_item_match(key, val, "FM_RX_OSC_FREQ_MT6627", &rx_cfg->osc_freq))) {
- return ret;
- } else {
- WCN_DBG(FM_WAR | MAIN, "MT6627 invalid key\n");
- return -1;
- }
-}
-
-static fm_s32 MT6627fm_cust_config_default(fm_cust_cfg *cfg)
-{
- FMR_ASSERT(cfg);
-
- cfg->rx_cfg.long_ana_rssi_th = FM_RX_RSSI_TH_LONG_MT6627;
- cfg->rx_cfg.short_ana_rssi_th = FM_RX_RSSI_TH_SHORT_MT6627;
- cfg->rx_cfg.desene_rssi_th = FM_RX_DESENSE_RSSI_MT6627;
- cfg->rx_cfg.pamd_th = FM_RX_PAMD_TH_MT6627;
- cfg->rx_cfg.mr_th = FM_RX_MR_TH_MT6627;
- cfg->rx_cfg.atdc_th = FM_RX_ATDC_TH_MT6627;
- cfg->rx_cfg.prx_th = FM_RX_PRX_TH_MT6627;
- cfg->rx_cfg.smg_th = FM_RX_SMG_TH_MT6627;
- cfg->rx_cfg.deemphasis = FM_RX_DEEMPHASIS_MT6627;
- cfg->rx_cfg.osc_freq = FM_RX_OSC_FREQ_MT6627;
-
- cfg->aud_cfg.aud_path = FM_AUD_I2S;
- cfg->aud_cfg.i2s_info.status = FM_I2S_OFF;
- cfg->aud_cfg.i2s_info.mode = FM_I2S_MASTER;
- cfg->aud_cfg.i2s_info.rate = FM_I2S_32K;
- cfg->aud_cfg.i2s_pad = FM_I2S_PAD_CONN;
-
- return 0;
-}
-
-static fm_s32 MT6627fm_cust_config_file(const fm_s8 *filename, fm_cust_cfg *cfg)
-{
- fm_s32 ret = 0;
- fm_s8 *buf = NULL;
- fm_s32 file_len = 0;
-
- if (!(buf = fm_zalloc(4096))) {
- WCN_DBG(FM_ALT | MAIN, "-ENOMEM\n");
- return -ENOMEM;
- }
-/* fm_index = 0; */
-
- file_len = fm_file_read(filename, buf, 4096, 0);
-
- if (file_len <= 0) {
- ret = -1;
- goto out;
- }
-
- ret = cfg_parser(buf, MT6627cfg_item_handler, cfg);
-
- out:
-
- if (buf) {
- fm_free(buf);
- }
-
- return ret;
-}
-
-#define MT6627_FM_CUST_CFG_PATH "etc/fmr/mt6627_fm_cust.cfg"
-fm_s32 MT6627fm_cust_config_setup(const fm_s8 *filepath)
-{
- fm_s32 ret = 0;
- fm_s8 *filep = NULL;
- fm_s8 file_path[51] = { 0 };
-
- MT6627fm_cust_config_default(&mt6627_fm_config);
- WCN_DBG(FM_NTC | MAIN, "MT6627 FM default config\n");
- MT6627fm_cust_config_print(&mt6627_fm_config);
-
- if (!filepath) {
- filep = MT6627_FM_CUST_CFG_PATH;
- } else {
- memcpy(file_path, filepath, (strlen(filepath) > 50) ? 50 : strlen(filepath));
- filep = file_path;
- trim_path(&filep);
- }
-
- ret = MT6627fm_cust_config_file(filep, &mt6627_fm_config);
- WCN_DBG(FM_NTC | MAIN, "MT6627 FM cust config\n");
- MT6627fm_cust_config_print(&mt6627_fm_config);
-
- return ret;
-}
diff --git a/drivers/misc/mediatek/fmradio/mt6627/pub/mt6627_fm_lib.c b/drivers/misc/mediatek/fmradio/mt6627/pub/mt6627_fm_lib.c
deleted file mode 100644
index fa958cf32..000000000
--- a/drivers/misc/mediatek/fmradio/mt6627/pub/mt6627_fm_lib.c
+++ /dev/null
@@ -1,2126 +0,0 @@
-#include <linux/delay.h>
-#include <linux/slab.h>
-#include <linux/vmalloc.h>
-
-#include "osal_typedef.h"
-#include "stp_exp.h"
-#include "wmt_exp.h"
-
-#include "fm_typedef.h"
-#include "fm_dbg.h"
-#include "fm_err.h"
-#include "fm_interface.h"
-#include "fm_stdlib.h"
-#include "fm_patch.h"
-#include "fm_utils.h"
-#include "fm_link.h"
-#include "fm_config.h"
-#include "fm_private.h"
-
-#include "mt6627_fm_reg.h"
-#include "mt6627_fm.h"
-#include "mt6627_fm_lib.h"
-#include "mt6627_fm_cmd.h"
-#include "mt6627_fm_cust_cfg.h"
-/* #include "mach/mt_gpio.h" */
-extern fm_cust_cfg mt6627_fm_config;
-
-/* #define MT6627_FM_PATCH_PATH "/etc/firmware/mt6627/mt6627_fm_patch.bin" */
-/* #define MT6627_FM_COEFF_PATH "/etc/firmware/mt6627/mt6627_fm_coeff.bin" */
-/* #define MT6627_FM_HWCOEFF_PATH "/etc/firmware/mt6627/mt6627_fm_hwcoeff.bin" */
-/* #define MT6627_FM_ROM_PATH "/etc/firmware/mt6627/mt6627_fm_rom.bin" */
-
-static struct fm_patch_tbl mt6627_patch_tbl[5] = {
- {FM_ROM_V1, "/etc/firmware/mt6627/mt6627_fm_v1_patch.bin",
- "/etc/firmware/mt6627/mt6627_fm_v1_coeff.bin", NULL, NULL},
- {FM_ROM_V2, "/etc/firmware/mt6627/mt6627_fm_v2_patch.bin",
- "/etc/firmware/mt6627/mt6627_fm_v2_coeff.bin", NULL, NULL},
- {FM_ROM_V3, "/etc/firmware/mt6627/mt6627_fm_v3_patch.bin",
- "/etc/firmware/mt6627/mt6627_fm_v3_coeff.bin", NULL, NULL},
- {FM_ROM_V4, "/etc/firmware/mt6627/mt6627_fm_v4_patch.bin",
- "/etc/firmware/mt6627/mt6627_fm_v4_coeff.bin", NULL, NULL},
- {FM_ROM_V5, "/etc/firmware/mt6627/mt6627_fm_v5_patch.bin",
- "/etc/firmware/mt6627/mt6627_fm_v5_coeff.bin", NULL, NULL},
-};
-
-static struct fm_hw_info mt6627_hw_info = {
- .chip_id = 0x00006627,
- .eco_ver = 0x00000000,
- .rom_ver = 0x00000000,
- .patch_ver = 0x00000000,
- .reserve = 0x00000000,
-};
-
-#define PATCH_SEG_LEN 512
-
-static fm_u8 *cmd_buf;
-static struct fm_lock *cmd_buf_lock;
-static struct fm_callback *fm_cb_op;
-static struct fm_res_ctx *mt6627_res;
-/* static fm_s32 Chip_Version = mt6627_E1; */
-
-/* static fm_bool rssi_th_set = fm_false; */
-
-
-#if 0 /* def CONFIG_MTK_FM_50KHZ_SUPPORT */
-static struct fm_fifo *cqi_fifo;
-#endif
-static fm_s32 mt6627_is_dese_chan(fm_u16 freq);
-static fm_bool mt6627_I2S_hopping_check(fm_u16 freq);
-
-#if 0
-static fm_s32 mt6627_mcu_dese(fm_u16 freq, void *arg);
-static fm_s32 mt6627_gps_dese(fm_u16 freq, void *arg);
-static fm_s32 mt6627_I2s_Setting(fm_s32 onoff, fm_s32 mode, fm_s32 sample);
-#endif
-static fm_u16 mt6627_chan_para_get(fm_u16 freq);
-static fm_s32 mt6627_desense_check(fm_u16 freq, fm_s32 rssi);
-static fm_bool mt6627_TDD_chan_check(fm_u16 freq);
-static fm_s32 mt6627_soft_mute_tune(fm_u16 freq, fm_s32 *rssi, fm_bool *valid);
-static fm_s32 mt6627_pwron(fm_s32 data)
-{
- /*//Turn on FM on 6627 chip by WMT driver
- if(MTK_WCN_BOOL_FALSE == mtk_wcn_wmt_func_on(WMTDRV_TYPE_LPBK)){
- WCN_DBG(FM_ALT|CHIP,"WMT turn on LPBK Fail!\n");
- return -FM_ELINK;
- }else{
- WCN_DBG(FM_ALT|CHIP,"WMT turn on LPBK OK!\n");
- //return 0;
- } */
- if (MTK_WCN_BOOL_FALSE == mtk_wcn_wmt_func_on(WMTDRV_TYPE_FM)) {
- WCN_DBG(FM_ALT | CHIP, "WMT turn on FM Fail!\n");
- return -FM_ELINK;
- } else {
- WCN_DBG(FM_ALT | CHIP, "WMT turn on FM OK!\n");
- return 0;
- }
-}
-
-
-static fm_s32 mt6627_pwroff(fm_s32 data)
-{
- if (MTK_WCN_BOOL_FALSE == mtk_wcn_wmt_func_off(WMTDRV_TYPE_FM)) {
- WCN_DBG(FM_ALT | CHIP, "WMT turn off FM Fail!\n");
- return -FM_ELINK;
- } else {
- WCN_DBG(FM_NTC | CHIP, "WMT turn off FM OK!\n");
- return 0;
- }
-}
-
-static fm_s32 Delayms(fm_u32 data)
-{
- WCN_DBG(FM_DBG | CHIP, "delay %dms\n", data);
- msleep(data);
- return 0;
-}
-
-static fm_s32 Delayus(fm_u32 data)
-{
- WCN_DBG(FM_DBG | CHIP, "delay %dus\n", data);
- udelay(data);
- return 0;
-}
-
-fm_s32 mt6627_get_read_result(struct fm_res_ctx *result)
-{
- FMR_ASSERT(result);
- mt6627_res = result;
-
- return 0;
-}
-
-static fm_s32 mt6627_read(fm_u8 addr, fm_u16 *val)
-{
- fm_s32 ret = 0;
- fm_u16 pkt_size;
-
- if (FM_LOCK(cmd_buf_lock))
- return (-FM_ELOCK);
- pkt_size = mt6627_get_reg(cmd_buf, TX_BUF_SIZE, addr);
- ret =
- fm_cmd_tx(cmd_buf, pkt_size, FLAG_FSPI_RD, SW_RETRY_CNT, FSPI_RD_TIMEOUT,
- mt6627_get_read_result);
-
- if (!ret && mt6627_res) {
- *val = mt6627_res->fspi_rd;
- }
-
- FM_UNLOCK(cmd_buf_lock);
-
- return ret;
-}
-
-static fm_s32 mt6627_write(fm_u8 addr, fm_u16 val)
-{
- fm_s32 ret = 0;
- fm_u16 pkt_size;
-
- if (FM_LOCK(cmd_buf_lock))
- return (-FM_ELOCK);
- pkt_size = mt6627_set_reg(cmd_buf, TX_BUF_SIZE, addr, val);
- ret = fm_cmd_tx(cmd_buf, pkt_size, FLAG_FSPI_WR, SW_RETRY_CNT, FSPI_WR_TIMEOUT, NULL);
- FM_UNLOCK(cmd_buf_lock);
-
- return ret;
-}
-
-static fm_s32 mt6627_set_bits(fm_u8 addr, fm_u16 bits, fm_u16 mask)
-{
- fm_s32 ret = 0;
- fm_u16 pkt_size;
-
- if (FM_LOCK(cmd_buf_lock))
- return (-FM_ELOCK);
- pkt_size = mt6627_set_bits_reg(cmd_buf, TX_BUF_SIZE, addr, bits, mask);
- ret = fm_cmd_tx(cmd_buf, pkt_size, (1 << 0x11), SW_RETRY_CNT, FSPI_WR_TIMEOUT, NULL); /* 0x11 this opcode won't be parsed as an opcode, so set here as spcial case. */
- FM_UNLOCK(cmd_buf_lock);
-
- return ret;
-}
-
-static fm_s32 mt6627_top_read(fm_u16 addr, fm_u32 *val)
-{
- fm_s32 ret = 0;
- fm_u16 pkt_size;
-
- if (FM_LOCK(cmd_buf_lock))
- return (-FM_ELOCK);
- pkt_size = mt6627_top_get_reg(cmd_buf, TX_BUF_SIZE, addr);
- ret =
- fm_cmd_tx(cmd_buf, pkt_size, FLAG_CSPI_READ, SW_RETRY_CNT, FSPI_RD_TIMEOUT,
- mt6627_get_read_result);
-
- if (!ret && mt6627_res) {
- *val = mt6627_res->cspi_rd;
- }
-
- FM_UNLOCK(cmd_buf_lock);
-
- return ret;
-}
-
-static fm_s32 mt6627_top_write(fm_u16 addr, fm_u32 val)
-{
- fm_s32 ret = 0;
- fm_u16 pkt_size;
-
- if (FM_LOCK(cmd_buf_lock))
- return (-FM_ELOCK);
- pkt_size = mt6627_top_set_reg(cmd_buf, TX_BUF_SIZE, addr, val);
- ret = fm_cmd_tx(cmd_buf, pkt_size, FLAG_CSPI_WRITE, SW_RETRY_CNT, FSPI_WR_TIMEOUT, NULL);
- FM_UNLOCK(cmd_buf_lock);
-
- return ret;
-}
-
-/*static fm_s32 mt6627_top_set_bits(fm_u16 addr, fm_u32 bits, fm_u32 mask)
-{
- fm_s32 ret = 0;
- fm_u32 val;
-
- ret = mt6627_top_read(addr, &val);
-
- if (ret)
- return ret;
-
- val = ((val & (mask)) | bits);
- ret = mt6627_top_write(addr, val);
-
- return ret;
-}*/
-
-static fm_s32 mt6627_host_read(fm_u32 addr, fm_u32 *val)
-{
- fm_s32 ret = 0;
- fm_u16 pkt_size;
-
- if (FM_LOCK(cmd_buf_lock))
- return (-FM_ELOCK);
- pkt_size = mt6627_host_get_reg(cmd_buf, TX_BUF_SIZE, addr);
- ret =
- fm_cmd_tx(cmd_buf, pkt_size, FLAG_HOST_READ, SW_RETRY_CNT, FSPI_RD_TIMEOUT,
- mt6627_get_read_result);
-
- if (!ret && mt6627_res) {
- *val = mt6627_res->cspi_rd;
- }
-
- FM_UNLOCK(cmd_buf_lock);
-
- return ret;
-}
-
-static fm_s32 mt6627_host_write(fm_u32 addr, fm_u32 val)
-{
- fm_s32 ret = 0;
- fm_u16 pkt_size;
-
- if (FM_LOCK(cmd_buf_lock))
- return (-FM_ELOCK);
- pkt_size = mt6627_host_set_reg(cmd_buf, TX_BUF_SIZE, addr, val);
- ret = fm_cmd_tx(cmd_buf, pkt_size, FLAG_HOST_WRITE, SW_RETRY_CNT, FSPI_WR_TIMEOUT, NULL);
- FM_UNLOCK(cmd_buf_lock);
-
- return ret;
-}
-
-/*static fm_s32 mt6627_DSP_write(fm_u16 addr, fm_u16 val)
-{
- mt6627_write(0xE2, addr);
- mt6627_write(0xE3, val);
- mt6627_write(0xE1, 0x0002);
- return 0;
-}
-static fm_s32 mt6627_DSP_read(fm_u16 addr, fm_u16 *val)
-{
- fm_s32 ret=-1;
- mt6627_write(0xE2, addr);
- mt6627_write(0xE1, 0x0001);
- ret = mt6627_read(0xE4, val);
- return ret;
-}*/
-static fm_u16 mt6627_get_chipid(void)
-{
- return 0x6627;
-}
-
-/* MT6627_SetAntennaType - set Antenna type
- * @type - 1,Short Antenna; 0, Long Antenna
- */
-static fm_s32 mt6627_SetAntennaType(fm_s32 type)
-{
- fm_u16 dataRead;
-
- WCN_DBG(FM_DBG | CHIP, "set ana to %s\n", type ? "short" : "long");
- mt6627_read(FM_MAIN_CG2_CTRL, &dataRead);
-
- if (type) {
- dataRead |= ANTENNA_TYPE;
- } else {
- dataRead &= (~ANTENNA_TYPE);
- }
-
- mt6627_write(FM_MAIN_CG2_CTRL, dataRead);
-
- return 0;
-}
-
-static fm_s32 mt6627_GetAntennaType(void)
-{
- fm_u16 dataRead;
-
- mt6627_read(FM_MAIN_CG2_CTRL, &dataRead);
- WCN_DBG(FM_DBG | CHIP, "get ana type: %s\n", (dataRead & ANTENNA_TYPE) ? "short" : "long");
-
- if (dataRead & ANTENNA_TYPE)
- return FM_ANA_SHORT; /* short antenna */
- else
- return FM_ANA_LONG; /* long antenna */
-}
-
-
-static fm_s32 mt6627_Mute(fm_bool mute)
-{
- fm_s32 ret = 0;
- fm_u16 dataRead;
-
- WCN_DBG(FM_DBG | CHIP, "set %s\n", mute ? "mute" : "unmute");
- /* mt6627_read(FM_MAIN_CTRL, &dataRead); */
- mt6627_read(0x9C, &dataRead);
-
- /* mt6627_top_write(0x0050,0x00000007); */
- if (mute == 1) {
- ret = mt6627_write(0x9C, (dataRead & 0xFFFC) | 0x0003);
- } else {
- ret = mt6627_write(0x9C, (dataRead & 0xFFFC));
- }
- /* mt6627_top_write(0x0050,0x0000000F); */
-
- return ret;
-}
-
-
-/*static fm_s32 mt6627_set_RSSITh(fm_u16 TH_long, fm_u16 TH_short)
-{
- mt6627_write(0xE2, 0x3072);
- mt6627_write(0xE3, TH_long);
- mt6627_write(0xE1, 0x0002);
- Delayms(1);
- mt6627_write(0xE2, 0x307A);
- mt6627_write(0xE3, TH_short);
- mt6627_write(0xE1, 0x0002);
-
- WCN_DBG(FM_DBG | CHIP, "RSSI TH, long:0x%04x, short:0x%04x", TH_long, TH_short);
- return 0;
-}
-*/
-/*
-static fm_s32 mt6627_set_SMGTh(fm_s32 ver, fm_u16 TH_smg)
-{
- if (mt6627_E1 == ver) {
- mt6627_write(0xE2, 0x321E);
- mt6627_write(0xE3, TH_smg);
- mt6627_write(0xE1, 0x0002);
- } else {
- mt6627_write(0xE2, 0x3218);
- mt6627_write(0xE3, TH_smg);
- mt6627_write(0xE1, 0x0002);
- }
-
- WCN_DBG(FM_DBG | CHIP, "Soft-mute gain TH %d\n", (int)TH_smg);
- return 0;
-}
-*/
-static fm_s32 mt6627_RampDown(void)
-{
- fm_s32 ret = 0;
- fm_u16 pkt_size;
- /* fm_u16 tmp; */
-
- WCN_DBG(FM_DBG | CHIP, "ramp down\n");
- /* pwer up sequence 0425 */
- ret = mt6627_top_write(0x0050, 0x00000007);
- if (ret) {
- WCN_DBG(FM_ERR | CHIP, "ramp down wr top 0x50 failed\n");
- return ret;
- }
-
- ret = mt6627_set_bits(0x0F, 0x0000, 0xF800);
- if (ret) {
- WCN_DBG(FM_ERR | CHIP, "ramp down wr 0x0f failed\n");
- return ret;
- }
-
- ret = mt6627_top_write(0x0050, 0x0000000F);
- if (ret) {
- WCN_DBG(FM_ERR | CHIP, "ramp down wr top 0x50 failed\n");
- return ret;
- }
-
- /* mt6627_read(FM_MAIN_INTRMASK, &tmp); */
- ret = mt6627_write(FM_MAIN_INTRMASK, 0x0000);
- if (ret) {
- WCN_DBG(FM_ERR | CHIP, "ramp down wr FM_MAIN_INTRMASK failed\n");
- return ret;
- }
-
- ret = mt6627_write(FM_MAIN_EXTINTRMASK, 0x0000);
- if (ret) {
- WCN_DBG(FM_ERR | CHIP, "ramp down wr FM_MAIN_EXTINTRMASK failed\n");
- return ret;
- }
-
- if (FM_LOCK(cmd_buf_lock))
- return (-FM_ELOCK);
- pkt_size = mt6627_rampdown(cmd_buf, TX_BUF_SIZE);
- ret = fm_cmd_tx(cmd_buf, pkt_size, FLAG_RAMPDOWN, SW_RETRY_CNT, RAMPDOWN_TIMEOUT, NULL);
- FM_UNLOCK(cmd_buf_lock);
-
- if (ret) {
- WCN_DBG(FM_ERR | CHIP, "ramp down failed\n");
- return ret;
- }
-
- ret = mt6627_write(FM_MAIN_EXTINTRMASK, 0x0021);
- if (ret) {
- WCN_DBG(FM_ERR | CHIP, "ramp down wr FM_MAIN_EXTINTRMASK failed\n");
- return ret;
- }
-
- ret = mt6627_write(FM_MAIN_INTRMASK, 0x0021);
- if (ret) {
- WCN_DBG(FM_ERR | CHIP, "ramp down wr FM_MAIN_INTRMASK failed\n");
- }
-
- return ret;
-}
-
-static fm_s32 mt6627_get_rom_version(void)
-{
- fm_u16 tmp;
- fm_s32 ret;
-
- /* DSP rom code version request enable --- set 0x61 b15=1 */
- mt6627_set_bits(0x61, 0x8000, 0x7FFF);
-
- /* Release ASIP reset --- set 0x61 b1=1 */
- mt6627_set_bits(0x61, 0x0002, 0xFFFD);
-
- /* Enable ASIP power --- set 0x61 b0=0 */
- mt6627_set_bits(0x61, 0x0000, 0xFFFE);
-
- /* Wait DSP code version ready --- wait 1ms */
- do {
- Delayus(1000);
- ret = mt6627_read(0x84, &tmp);
- /* ret=-4 means signal got when control FM. usually get sig 9 to kill FM process. */
- /* now cancel FM power up sequence is recommended. */
- if (ret) {
- return ret;
- }
- WCN_DBG(FM_NTC | CHIP, "0x84=%x\n", tmp);
- } while (tmp != 0x0001);
-
- /* Get FM DSP code version --- rd 0x83[15:8] */
- mt6627_read(0x83, &tmp);
- tmp = (tmp >> 8);
-
- /* DSP rom code version request disable --- set 0x61 b15=0 */
- mt6627_set_bits(0x61, 0x0000, 0x7FFF);
-
- /* Reset ASIP --- set 0x61[1:0] = 1 */
- mt6627_set_bits(0x61, 0x0001, 0xFFFC);
-
- /* WCN_DBG(FM_NTC | CHIP, "ROM version: v%d\n", (fm_s32)tmp); */
- return (fm_s32) tmp;
-}
-
-static fm_s32 mt6627_get_patch_path(fm_s32 ver, const fm_s8 **ppath)
-{
- fm_s32 i;
- fm_s32 max = sizeof(mt6627_patch_tbl) / sizeof(mt6627_patch_tbl[0]);
-
- /* check if the ROM version is defined or not */
- for (i = 0; i < max; i++) {
- if ((mt6627_patch_tbl[i].idx == ver)
- && (fm_file_exist(mt6627_patch_tbl[i].patch) == 0)) {
- *ppath = mt6627_patch_tbl[i].patch;
- WCN_DBG(FM_NTC | CHIP, "Get ROM version OK\n");
- return 0;
- }
- }
-
- /* the ROM version isn't defined, find a latest patch instead */
- for (i = max; i > 0; i--) {
- if (fm_file_exist(mt6627_patch_tbl[i - 1].patch) == 0) {
- *ppath = mt6627_patch_tbl[i - 1].patch;
- WCN_DBG(FM_WAR | CHIP, "undefined ROM version\n");
- return 1;
- }
- }
-
- /* get path failed */
- WCN_DBG(FM_ERR | CHIP, "No valid patch file\n");
- return -FM_EPATCH;
-}
-
-
-static fm_s32 mt6627_get_coeff_path(fm_s32 ver, const fm_s8 **ppath)
-{
- fm_s32 i;
- fm_s32 max = sizeof(mt6627_patch_tbl) / sizeof(mt6627_patch_tbl[0]);
-
- /* check if the ROM version is defined or not */
- for (i = 0; i < max; i++) {
- if ((mt6627_patch_tbl[i].idx == ver)
- && (fm_file_exist(mt6627_patch_tbl[i].coeff) == 0)) {
- *ppath = mt6627_patch_tbl[i].coeff;
- WCN_DBG(FM_NTC | CHIP, "Get ROM version OK\n");
- return 0;
- }
- }
-
-
- /* the ROM version isn't defined, find a latest patch instead */
- for (i = max; i > 0; i--) {
- if (fm_file_exist(mt6627_patch_tbl[i - 1].coeff) == 0) {
- *ppath = mt6627_patch_tbl[i - 1].coeff;
- WCN_DBG(FM_WAR | CHIP, "undefined ROM version\n");
- return 1;
- }
- }
-
- /* get path failed */
- WCN_DBG(FM_ERR | CHIP, "No valid coeff file\n");
- return -FM_EPATCH;
-}
-
-
-/*
-* mt6627_DspPatch - DSP download procedure
-* @img - source dsp bin code
-* @len - patch length in byte
-* @type - rom/patch/coefficient/hw_coefficient
-*/
-static fm_s32 mt6627_DspPatch(const fm_u8 *img, fm_s32 len, enum IMG_TYPE type)
-{
- fm_u8 seg_num;
- fm_u8 seg_id = 0;
- fm_s32 seg_len;
- fm_s32 ret = 0;
- fm_u16 pkt_size;
-
- FMR_ASSERT(img);
-
- if (len <= 0) {
- return -1;
- }
-
- seg_num = len / PATCH_SEG_LEN + 1;
- WCN_DBG(FM_NTC | CHIP, "binary len:%d, seg num:%d\n", len, seg_num);
-
- switch (type) {
-#if 0
- case IMG_ROM:
-
- for (seg_id = 0; seg_id < seg_num; seg_id++) {
- seg_len = ((seg_id + 1) < seg_num) ? PATCH_SEG_LEN : (len % PATCH_SEG_LEN);
- WCN_DBG(FM_NTC | CHIP, "rom,[seg_id:%d], [seg_len:%d]\n", seg_id, seg_len);
- if (FM_LOCK(cmd_buf_lock))
- return (-FM_ELOCK);
- pkt_size =
- mt6627_rom_download(cmd_buf, TX_BUF_SIZE, seg_num, seg_id,
- &img[seg_id * PATCH_SEG_LEN], seg_len);
- WCN_DBG(FM_NTC | CHIP, "pkt_size:%d\n", (fm_s32) pkt_size);
- ret =
- fm_cmd_tx(cmd_buf, pkt_size, FLAG_ROM, SW_RETRY_CNT, ROM_TIMEOUT, NULL);
- FM_UNLOCK(cmd_buf_lock);
-
- if (ret) {
- WCN_DBG(FM_ALT | CHIP, "mt6627_rom_download failed\n");
- return ret;
- }
- }
-
- break;
-#endif
- case IMG_PATCH:
-
- for (seg_id = 0; seg_id < seg_num; seg_id++) {
- seg_len = ((seg_id + 1) < seg_num) ? PATCH_SEG_LEN : (len % PATCH_SEG_LEN);
- WCN_DBG(FM_NTC | CHIP, "patch,[seg_id:%d], [seg_len:%d]\n", seg_id,
- seg_len);
- if (FM_LOCK(cmd_buf_lock))
- return (-FM_ELOCK);
- pkt_size =
- mt6627_patch_download(cmd_buf, TX_BUF_SIZE, seg_num, seg_id,
- &img[seg_id * PATCH_SEG_LEN], seg_len);
- WCN_DBG(FM_NTC | CHIP, "pkt_size:%d\n", (fm_s32) pkt_size);
- ret =
- fm_cmd_tx(cmd_buf, pkt_size, FLAG_PATCH, SW_RETRY_CNT, PATCH_TIMEOUT,
- NULL);
- FM_UNLOCK(cmd_buf_lock);
-
- if (ret) {
- WCN_DBG(FM_ALT | CHIP, "mt6627_patch_download failed\n");
- return ret;
- }
- }
-
- break;
-#if 0
- case IMG_HW_COEFFICIENT:
-
- for (seg_id = 0; seg_id < seg_num; seg_id++) {
- seg_len = ((seg_id + 1) < seg_num) ? PATCH_SEG_LEN : (len % PATCH_SEG_LEN);
- WCN_DBG(FM_NTC | CHIP, "hwcoeff,[seg_id:%d], [seg_len:%d]\n", seg_id,
- seg_len);
- if (FM_LOCK(cmd_buf_lock))
- return (-FM_ELOCK);
- pkt_size =
- mt6627_hwcoeff_download(cmd_buf, TX_BUF_SIZE, seg_num, seg_id,
- &img[seg_id * PATCH_SEG_LEN], seg_len);
- WCN_DBG(FM_NTC | CHIP, "pkt_size:%d\n", (fm_s32) pkt_size);
- ret =
- fm_cmd_tx(cmd_buf, pkt_size, FLAG_HWCOEFF, SW_RETRY_CNT,
- HWCOEFF_TIMEOUT, NULL);
- FM_UNLOCK(cmd_buf_lock);
-
- if (ret) {
- WCN_DBG(FM_ALT | CHIP, "mt6627_hwcoeff_download failed\n");
- return ret;
- }
- }
-
- break;
-#endif
- case IMG_COEFFICIENT:
-
- for (seg_id = 0; seg_id < seg_num; seg_id++) {
- seg_len = ((seg_id + 1) < seg_num) ? PATCH_SEG_LEN : (len % PATCH_SEG_LEN);
- WCN_DBG(FM_NTC | CHIP, "coeff,[seg_id:%d], [seg_len:%d]\n", seg_id,
- seg_len);
- if (FM_LOCK(cmd_buf_lock))
- return (-FM_ELOCK);
- pkt_size =
- mt6627_coeff_download(cmd_buf, TX_BUF_SIZE, seg_num, seg_id,
- &img[seg_id * PATCH_SEG_LEN], seg_len);
- WCN_DBG(FM_NTC | CHIP, "pkt_size:%d\n", (fm_s32) pkt_size);
- ret =
- fm_cmd_tx(cmd_buf, pkt_size, FLAG_COEFF, SW_RETRY_CNT, COEFF_TIMEOUT,
- NULL);
- FM_UNLOCK(cmd_buf_lock);
-
- if (ret) {
- WCN_DBG(FM_ALT | CHIP, "mt6627_coeff_download failed\n");
- return ret;
- }
- }
-
- break;
- default:
- break;
- }
-
- return 0;
-}
-
-
-static fm_s32 mt6627_PowerUp(fm_u16 *chip_id, fm_u16 *device_id)
-{
-#define PATCH_BUF_SIZE 4096*6
- fm_s32 ret = 0;
- fm_u16 pkt_size;
- fm_u16 tmp_reg = 0;
-#if defined(MT6625_FM)
- fm_u32 host_reg = 0;
-#endif
-
- const fm_s8 *path_patch = NULL;
- const fm_s8 *path_coeff = NULL;
- /* const fm_s8 *path_hwcoeff = NULL; */
- /* fm_s32 coeff_len = 0; */
- fm_s32 patch_len = 0;
- fm_u8 *dsp_buf = NULL;
-
- FMR_ASSERT(chip_id);
- FMR_ASSERT(device_id);
-
- WCN_DBG(FM_DBG | CHIP, "pwr on seq......\n");
-
- /* Wholechip FM Power Up: step 1, set common SPI parameter */
- ret = mt6627_host_write(0x8013000C, 0x0000801F);
- if (ret) {
- WCN_DBG(FM_ALT | CHIP, " pwrup set CSPI failed\n");
- return ret;
- }
-#if defined(MT6625_FM)
- ret = mt6627_host_read(0x80101030,&host_reg);
- if (ret) {
- WCN_DBG(FM_ALT | CHIP, " pwrup read 0x80100030 failed\n");
- return ret;
- }
- ret = mt6627_host_write(0x80101030, host_reg|(1<<1));
- if (ret) {
- WCN_DBG(FM_ALT | CHIP, " pwrup enable top_ck_en_adie failed\n");
- return ret;
- }
-
- /* enable bgldo */
- ret = mt6627_top_read(0x00c0, &tmp_reg);
- if (ret) {
- WCN_DBG(FM_ERR | CHIP, "power up read top 0xc0 failed\n");
- return ret;
- }
- ret = mt6627_top_write(0x00c0, tmp_reg|(0x3<<27));
- if (ret) {
- WCN_DBG(FM_ERR | CHIP, "power up write top 0xc0 failed\n");
- return ret;
- }
-#endif
- if (FM_LOCK(cmd_buf_lock))
- return (-FM_ELOCK);
- pkt_size = mt6627_pwrup_clock_on(cmd_buf, TX_BUF_SIZE);
- ret = fm_cmd_tx(cmd_buf, pkt_size, FLAG_EN, SW_RETRY_CNT, EN_TIMEOUT, NULL);
- FM_UNLOCK(cmd_buf_lock);
-
- if (ret) {
- WCN_DBG(FM_ALT | CHIP, "mt6627_pwrup_clock_on failed\n");
- return ret;
- }
-/* #ifdef FM_DIGITAL_INPUT */
- /* mt6627_I2s_Setting(MT6627_I2S_ON, MT6627_I2S_MASTER, MT6627_I2S_44K); */
- /* mt_combo_audio_ctrl(COMBO_AUDIO_STATE_2); */
- /* mtk_wcn_cmb_stub_audio_ctrl((CMB_STUB_AIF_X)CMB_STUB_AIF_2); */
-/* #endif */
-
- /* Wholechip FM Power Up: step 2, read HW version */
- mt6627_read(0x62, &tmp_reg);
- /* *chip_id = tmp_reg; */
- if ((tmp_reg == 0x6625) || (tmp_reg == 0x6627))
- *chip_id = 0x6627;
- *device_id = tmp_reg;
- mt6627_hw_info.chip_id = (fm_s32) tmp_reg;
- WCN_DBG(FM_NTC | CHIP, "chip_id:0x%04x\n", tmp_reg);
-
- if ((mt6627_hw_info.chip_id != 0x6627) && (mt6627_hw_info.chip_id != 0x6625)) {
- WCN_DBG(FM_NTC | CHIP, "fm sys error, reset hw\n");
- return (-FM_EFW);
- }
-
- mt6627_hw_info.eco_ver = (fm_s32) mtk_wcn_wmt_hwver_get();
- WCN_DBG(FM_NTC | CHIP, "ECO version:0x%08x\n", mt6627_hw_info.eco_ver);
- mt6627_hw_info.eco_ver += 1;
-
- /* get mt6627 DSP rom version */
- if ((ret = mt6627_get_rom_version()) >= 0) {
- mt6627_hw_info.rom_ver = ret;
- WCN_DBG(FM_NTC | CHIP, "ROM version: v%d\n", mt6627_hw_info.rom_ver);
- } else {
- WCN_DBG(FM_ERR | CHIP, "get ROM version failed\n");
- /* ret=-4 means signal got when control FM. usually get sig 9 to kill FM process. */
- /* now cancel FM power up sequence is recommended. */
- return ret;
- }
-
- /* Wholechip FM Power Up: step 3, download patch */
- if (!(dsp_buf = fm_vmalloc(PATCH_BUF_SIZE))) {
- WCN_DBG(FM_ALT | CHIP, "-ENOMEM\n");
- return -ENOMEM;
- }
-
- ret = mt6627_get_patch_path(mt6627_hw_info.rom_ver, &path_patch);
- if (ret) {
- WCN_DBG(FM_ALT | CHIP, " mt6627_get_patch_path failed\n");
- return ret;
- }
- patch_len = fm_file_read(path_patch, dsp_buf, PATCH_BUF_SIZE, 0);
- ret = mt6627_DspPatch((const fm_u8 *)dsp_buf, patch_len, IMG_PATCH);
- if (ret) {
- WCN_DBG(FM_ALT | CHIP, " DL DSPpatch failed\n");
- return ret;
- }
-
- ret = mt6627_get_coeff_path(mt6627_hw_info.rom_ver, &path_coeff);
- patch_len = fm_file_read(path_coeff, dsp_buf, PATCH_BUF_SIZE, 0);
-
- mt6627_hw_info.rom_ver += 1;
-
- tmp_reg = dsp_buf[38] | (dsp_buf[39] << 8); /* to be confirmed */
- mt6627_hw_info.patch_ver = (fm_s32) tmp_reg;
- WCN_DBG(FM_NTC | CHIP, "Patch version: 0x%08x\n", mt6627_hw_info.patch_ver);
-
- if (ret == 1) {
- dsp_buf[4] = 0x00; /* if we found rom version undefined, we should disable patch */
- dsp_buf[5] = 0x00;
- }
-
- ret = mt6627_DspPatch((const fm_u8 *)dsp_buf, patch_len, IMG_COEFFICIENT);
- if (ret) {
- WCN_DBG(FM_ALT | CHIP, " DL DSPcoeff failed\n");
- return ret;
- }
- mt6627_write(0x92, 0x0000); /* ? */
- mt6627_write(0x90, 0x0040);
- mt6627_write(0x90, 0x0000);
-
- if (dsp_buf) {
- fm_vfree(dsp_buf);
- dsp_buf = NULL;
- }
- /* Wholechip FM Power Up: step 4, FM Digital Init: fm_rgf_maincon */
- if (FM_LOCK(cmd_buf_lock))
- return (-FM_ELOCK);
- pkt_size = mt6627_pwrup_digital_init(cmd_buf, TX_BUF_SIZE);
- ret = fm_cmd_tx(cmd_buf, pkt_size, FLAG_EN, SW_RETRY_CNT, EN_TIMEOUT, NULL);
- FM_UNLOCK(cmd_buf_lock);
- if (ret) {
- WCN_DBG(FM_ALT | CHIP, "mt6627_pwrup_digital_init failed\n");
- return ret;
- }
- /* Wholechip FM Power Up: step 5, FM RF fine tune setting */
- if (FM_LOCK(cmd_buf_lock))
- return (-FM_ELOCK);
- pkt_size = mt6627_pwrup_fine_tune(cmd_buf, TX_BUF_SIZE);
- ret = fm_cmd_tx(cmd_buf, pkt_size, FLAG_EN, SW_RETRY_CNT, EN_TIMEOUT, NULL);
- FM_UNLOCK(cmd_buf_lock);
- if (ret) {
- WCN_DBG(FM_ALT | CHIP, "mt6627_pwrup_fine_tune failed\n");
- return ret;
- }
- /* enable connsys FM 2 wire RX */
- mt6627_write(0x9B, 0xF9AB);
- mt6627_host_write(0x80101054, 0x00003f35);
-
- WCN_DBG(FM_NTC | CHIP, "pwr on seq ok\n");
-
- return ret;
-}
-
-static fm_s32 mt6627_PowerDown(void)
-{
- fm_s32 ret = 0;
- fm_u16 pkt_size;
- fm_u16 dataRead;
- fm_u32 tem;
- fm_u32 host_reg = 0;
-
- WCN_DBG(FM_DBG | CHIP, "pwr down seq\n");
- /*SW work around for MCUFA issue.
- *if interrupt happen before doing rampdown, DSP can't switch MCUFA back well.
- * In case read interrupt, and clean if interrupt found before rampdown.
- */
- mt6627_read(FM_MAIN_INTR, &dataRead);
-
- if (dataRead & 0x1) {
- mt6627_write(FM_MAIN_INTR, dataRead); /* clear status flag */
- }
-
- //mt6627_RampDown();
-
-/* #ifdef FM_DIGITAL_INPUT */
-/* mt6627_I2s_Setting(MT6627_I2S_OFF, MT6627_I2S_SLAVE, MT6627_I2S_44K); */
-/* #endif */
- /* pwer up sequence 0425 */
- /* A0:set audio output I2X Rx mode: */
- mt6627_host_read(0x80101054, &tem);
- tem = tem & 0xFFFF9FFF;
- mt6627_host_write(0x80101054, tem);
-
- if (FM_LOCK(cmd_buf_lock))
- return (-FM_ELOCK);
- pkt_size = mt6627_pwrdown(cmd_buf, TX_BUF_SIZE);
- ret = fm_cmd_tx(cmd_buf, pkt_size, FLAG_EN, SW_RETRY_CNT, EN_TIMEOUT, NULL);
- FM_UNLOCK(cmd_buf_lock);
-
- if (ret) {
- WCN_DBG(FM_ALT | CHIP, "mt6627_pwrdown failed\n");
- return ret;
- }
- /* FIX_ME, disable ext interrupt */
- mt6627_write(FM_MAIN_EXTINTRMASK, 0x00);
-
-#if defined(MT6625_FM)
- ret = mt6627_host_read(0x80101030,&host_reg);
- if (ret) {
- WCN_DBG(FM_ALT | CHIP, " pwroff read 0x80100030 failed\n");
- return ret;
- }
- ret = mt6627_host_write(0x80101030, host_reg&(~(0x1<<1)));
- if (ret) {
- WCN_DBG(FM_ALT | CHIP, " pwroff diable top_ck_en_adie failed\n");
- return ret;
- }
-#endif
-
-/* rssi_th_set = fm_false; */
- return ret;
-}
-
-/* just for dgb */
-#if 0
-static void mt6627_bt_write(fm_u32 addr, fm_u32 val)
-{
- fm_u32 tem, i = 0;
- mt6627_host_write(0x80103020, addr);
- mt6627_host_write(0x80103024, val);
- mt6627_host_read(0x80103000, &tem);
- while ((tem == 4) && (i < 1000)) {
- i++;
- mt6627_host_read(0x80103000, &tem);
- }
- return;
-}
-#endif
-static fm_bool mt6627_SetFreq(fm_u16 freq)
-{
- fm_s32 ret = 0;
- fm_u16 pkt_size;
- fm_u16 chan_para = 0;
- fm_u32 reg_val = 0;
- fm_u16 freq_reg = 0;
-
- fm_cb_op->cur_freq_set(freq);
-
-#if 0
- /* MCU clock adjust if need */
- if ((ret = mt6627_mcu_dese(freq, NULL)) < 0) {
- WCN_DBG(FM_ERR | MAIN, "mt6627_mcu_dese FAIL:%d\n", ret);
- }
-
- WCN_DBG(FM_INF | MAIN, "MCU %d\n", ret);
-
- /* GPS clock adjust if need */
- if ((ret = mt6627_gps_dese(freq, NULL)) < 0) {
- WCN_DBG(FM_ERR | MAIN, "mt6627_gps_dese FAIL:%d\n", ret);
- }
-
- WCN_DBG(FM_INF | MAIN, "GPS %d\n", ret);
-#endif
- /* pwer up sequence 0425 */
- ret = mt6627_top_write(0x0050, 0x00000007);
- if (ret) {
- WCN_DBG(FM_ERR | CHIP, "set freq wr top 0x50 failed\n");
- }
-
- ret = mt6627_set_bits(0x0F, 0x0455, 0xF800);
- if (ret) {
- WCN_DBG(FM_ERR | CHIP, "set freq wr 0x0f failed\n");
- }
-
- if (mt6627_TDD_chan_check(freq)) {
- ret = mt6627_set_bits(0x30, 0x0008, 0xFFF3); /* use TDD solution */
- WCN_DBG(FM_ERR | CHIP, "set freq wr 0x30 failed\n");
- }
- else {
- ret = mt6627_set_bits(0x30, 0x0000, 0xFFF3); /* default use FDD solution */
- WCN_DBG(FM_ERR | CHIP, "set freq wr 0x30 failed\n");
- }
- ret = mt6627_top_write(0x0050, 0x0000000F);
- if (ret) {
- WCN_DBG(FM_ERR | CHIP, "set freq wr top 0x50 failed\n");
- }
-
-/* if (fm_cb_op->chan_para_get) { */
- chan_para = mt6627_chan_para_get(freq);
- WCN_DBG(FM_DBG | CHIP, "%d chan para = %d\n", (fm_s32) freq, (fm_s32) chan_para);
-/* } */
-
- freq_reg = freq;
- if (0 == fm_get_channel_space(freq_reg)) {
- freq_reg *= 10;
- }
- freq_reg = (freq_reg - 6400) * 2 / 10;
- ret = mt6627_set_bits(0x65, freq_reg, 0xFC00);
- if (ret) {
- WCN_DBG(FM_ERR | CHIP, "set freq wr 0x65 failed\n");
- return fm_false;
- }
-
- ret = mt6627_set_bits(0x65, (chan_para << 12), 0x0FFF);
- if (ret) {
- WCN_DBG(FM_ERR | CHIP, "set freq wr 0x65 failed\n");
- return fm_false;
- }
-
- /* enable connsys FM 2 wire RX */
- mt6627_write(0x9B, 0xF9AB);
- mt6627_host_write(0x80101054, 0x00003f35);
-
- if ((mt6627_hw_info.chip_id == 0x6625) && ((mtk_wcn_wmt_chipid_query() == 0x6592) || (mtk_wcn_wmt_chipid_query() == 0x6752))) {
- if (mt6627_I2S_hopping_check(freq)) {
- /* set i2s TX desense mode */
- ret = mt6627_set_bits(0x9C, 0x80, 0xFFFF);
- if (ret) {
- WCN_DBG(FM_ERR | CHIP, "set freq wr 0x9C failed\n");
- }
-
- /* set i2s RX desense mode */
- ret = mt6627_host_read(0x80101054, &reg_val);
- if (ret) {
- WCN_DBG(FM_ERR | CHIP, "set freq rd 0x80101054 failed\n");
- }
-
- reg_val |= 0x8000;
- ret = mt6627_host_write(0x80101054, reg_val);
- if (ret) {
- WCN_DBG(FM_ERR | CHIP, "set freq wr 0x80101054 failed\n");
- }
- } else {
- ret = mt6627_set_bits(0x9C, 0x0, 0xFF7F);
- if (ret) {
- WCN_DBG(FM_ERR | CHIP, "set freq wr 0x9C failed\n");
- }
-
- ret = mt6627_host_read(0x80101054, &reg_val);
- if (ret) {
- WCN_DBG(FM_ERR | CHIP, "set freq rd 0x80101054 failed\n");
- }
-
- reg_val &= 0x7FFF;
- ret = mt6627_host_write(0x80101054, reg_val);
- if (ret) {
- WCN_DBG(FM_ERR | CHIP, "set freq wr 0x80101054 failed\n");
- }
- }
- }
-
- if (FM_LOCK(cmd_buf_lock))
- return fm_false;
- pkt_size = mt6627_tune(cmd_buf, TX_BUF_SIZE, freq, chan_para);
- ret =
- fm_cmd_tx(cmd_buf, pkt_size, FLAG_TUNE | FLAG_TUNE_DONE, SW_RETRY_CNT, TUNE_TIMEOUT,
- NULL);
- FM_UNLOCK(cmd_buf_lock);
-
- if (ret) {
- WCN_DBG(FM_ALT | CHIP, "mt6627_tune failed\n");
- return fm_false;
- }
-
- WCN_DBG(FM_DBG | CHIP, "set freq to %d ok\n", freq);
-#if 0
- /* ADPLL setting for dbg */
- mt6627_top_write(0x0050, 0x00000007);
- mt6627_top_write(0x0A08, 0xFFFFFFFF);
- mt6627_bt_write(0x82, 0x11);
- mt6627_bt_write(0x83, 0x11);
- mt6627_bt_write(0x84, 0x11);
- mt6627_top_write(0x0040, 0x1C1C1C1C);
- mt6627_top_write(0x0044, 0x1C1C1C1C);
- mt6627_write(0x70, 0x0010);
- /*0x0806 DCO clk
- 0x0802 ref clk
- 0x0804 feedback clk
- */
- mt6627_write(0xE0, 0x0806);
-#endif
- return fm_true;
-}
-
-#if 0
-/*
-* mt6627_Seek
-* @pFreq - IN/OUT parm, IN start freq/OUT seek valid freq
-* @seekdir - 0:up, 1:down
-* @space - 1:50KHz, 2:100KHz, 4:200KHz
-* return fm_true:seek success; fm_false:seek failed
-*/
-static fm_bool mt6627_Seek(fm_u16 min_freq, fm_u16 max_freq, fm_u16 *pFreq, fm_u16 seekdir,
- fm_u16 space)
-{
- fm_s32 ret = 0;
- fm_u16 pkt_size, temp;
-
- mt6627_RampDown();
- mt6627_read(FM_MAIN_CTRL, &temp);
- mt6627_Mute(fm_true);
-
- if (FM_LOCK(cmd_buf_lock))
- return fm_false;
- pkt_size = mt6627_seek(cmd_buf, TX_BUF_SIZE, seekdir, space, max_freq, min_freq);
- ret =
- fm_cmd_tx(cmd_buf, pkt_size, FLAG_SEEK | FLAG_SEEK_DONE, SW_RETRY_CNT, SEEK_TIMEOUT,
- mt6627_get_read_result);
- FM_UNLOCK(cmd_buf_lock);
-
- if (!ret && mt6627_res) {
- *pFreq = mt6627_res->seek_result;
- /* fm_cb_op->cur_freq_set(*pFreq); */
- } else {
- WCN_DBG(FM_ALT | CHIP, "mt6627_seek failed\n");
- return ret;
- }
-
- /* get the result freq */
- WCN_DBG(FM_NTC | CHIP, "seek, result freq:%d\n", *pFreq);
- mt6627_RampDown();
- if ((temp & 0x0020) == 0) {
- mt6627_Mute(fm_false);
- }
-
- return fm_true;
-}
-#endif
-#define FM_CQI_LOG_PATH "/mnt/sdcard/fmcqilog"
-
-static fm_s32 mt6627_full_cqi_get(fm_s32 min_freq, fm_s32 max_freq, fm_s32 space, fm_s32 cnt)
-{
- fm_s32 ret = 0;
- fm_u16 pkt_size;
- fm_u16 freq, orig_freq;
- fm_s32 i, j, k;
- fm_s32 space_val, max, min, num;
- struct mt6627_full_cqi *p_cqi;
- fm_u8 *cqi_log_title =
- "Freq, RSSI, PAMD, PR, FPAMD, MR, ATDC, PRX, ATDEV, SMGain, DltaRSSI\n";
- fm_u8 cqi_log_buf[100] = { 0 };
- fm_s32 pos;
- fm_u8 cqi_log_path[100] = { 0 };
-
- WCN_DBG(FM_NTC | CHIP, "6627 cqi log start\n");
- /* for soft-mute tune, and get cqi */
- freq = fm_cb_op->cur_freq_get();
- if (0 == fm_get_channel_space(freq)) {
- freq *= 10;
- }
- /* get cqi */
- orig_freq = freq;
- if (0 == fm_get_channel_space(min_freq)) {
- min = min_freq * 10;
- } else {
- min = min_freq;
- }
- if (0 == fm_get_channel_space(max_freq)) {
- max = max_freq * 10;
- } else {
- max = max_freq;
- }
- if (space == 0x0001) {
- space_val = 5; /* 50Khz */
- } else if (space == 0x0002) {
- space_val = 10; /* 100Khz */
- } else if (space == 0x0004) {
- space_val = 20; /* 200Khz */
- } else {
- space_val = 10;
- }
- num = (max - min) / space_val + 1; /* Eg, (8760 - 8750) / 10 + 1 = 2 */
- for (k = 0; (10000 == orig_freq) && (0xffffffff == g_dbg_level) && (k < cnt); k++) {
- WCN_DBG(FM_NTC | CHIP, "cqi file:%d\n", k + 1);
- freq = min;
- pos = 0;
- fm_memcpy(cqi_log_path, FM_CQI_LOG_PATH, strlen(FM_CQI_LOG_PATH));
- sprintf(&cqi_log_path[strlen(FM_CQI_LOG_PATH)], "%d.txt", k + 1);
- fm_file_write(cqi_log_path, cqi_log_title, strlen(cqi_log_title), &pos);
- for (j = 0; j < num; j++) {
- if (FM_LOCK(cmd_buf_lock))
- return (-FM_ELOCK);
- pkt_size = mt6627_full_cqi_req(cmd_buf, TX_BUF_SIZE, &freq, 1, 1);
- ret =
- fm_cmd_tx(cmd_buf, pkt_size, FLAG_SM_TUNE, SW_RETRY_CNT,
- SM_TUNE_TIMEOUT, mt6627_get_read_result);
- FM_UNLOCK(cmd_buf_lock);
-
- if (!ret && mt6627_res) {
- WCN_DBG(FM_NTC | CHIP, "smt cqi size %d\n", mt6627_res->cqi[0]);
- p_cqi = (struct mt6627_full_cqi *)&mt6627_res->cqi[2];
- for (i = 0; i < mt6627_res->cqi[1]; i++) {
- /* just for debug */
- WCN_DBG(FM_NTC | CHIP,
- "freq %d, 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x\n",
- p_cqi[i].ch, p_cqi[i].rssi, p_cqi[i].pamd,
- p_cqi[i].pr, p_cqi[i].fpamd, p_cqi[i].mr,
- p_cqi[i].atdc, p_cqi[i].prx, p_cqi[i].atdev,
- p_cqi[i].smg, p_cqi[i].drssi);
- /* format to buffer */
- sprintf(cqi_log_buf,
- "%04d,%04x,%04x,%04x,%04x,%04x,%04x,%04x,%04x,%04x,%04x,\n",
- p_cqi[i].ch, p_cqi[i].rssi, p_cqi[i].pamd,
- p_cqi[i].pr, p_cqi[i].fpamd, p_cqi[i].mr,
- p_cqi[i].atdc, p_cqi[i].prx, p_cqi[i].atdev,
- p_cqi[i].smg, p_cqi[i].drssi);
- /* write back to log file */
- fm_file_write(cqi_log_path, cqi_log_buf,
- strlen(cqi_log_buf), &pos);
- }
- } else {
- WCN_DBG(FM_ALT | CHIP, "smt get CQI failed\n");
- ret = -1;
- }
- freq += space_val;
- }
- fm_cb_op->cur_freq_set(0); /* avoid run too much times */
- }
- WCN_DBG(FM_NTC | CHIP, "6627 cqi log done\n");
-
- return ret;
-}
-
-#if 0
-static fm_bool mt6627_Scan(fm_u16 min_freq, fm_u16 max_freq, fm_u16 *pFreq, fm_u16 *pScanTBL,
- fm_u16 *ScanTBLsize, fm_u16 scandir, fm_u16 space)
-{
- fm_s32 ret = 0;
- fm_u16 pkt_size, temp;
- fm_u16 offset = 0;
- fm_u16 tmp_scanTBLsize = *ScanTBLsize;
-
- if ((!pScanTBL) || (tmp_scanTBLsize == 0)) {
- WCN_DBG(FM_ALT | CHIP, "scan, failed:invalid scan table\n");
- return fm_false;
- }
-
- WCN_DBG(FM_NTC | CHIP,
- "start freq: %d, max_freq:%d, min_freq:%d, scan BTL size:%d, scandir:%d, space:%d\n",
- *pFreq, max_freq, min_freq, *ScanTBLsize, scandir, space);
-
- mt6627_RampDown();
- mt6627_read(FM_MAIN_CTRL, &temp);
- mt6627_Mute(fm_true);
-
- mt6627_full_cqi_get(min_freq, max_freq, space, 5);
-
- /* normal scan */
- if (FM_LOCK(cmd_buf_lock))
- return (-FM_ELOCK);
- pkt_size = mt6627_scan(cmd_buf, TX_BUF_SIZE, scandir, space, max_freq, min_freq);
- ret =
- fm_cmd_tx(cmd_buf, pkt_size, FLAG_SCAN | FLAG_SCAN_DONE, SW_RETRY_CNT, SCAN_TIMEOUT,
- mt6627_get_read_result);
- FM_UNLOCK(cmd_buf_lock);
-
- if (!ret && mt6627_res) {
- fm_memcpy(pScanTBL, mt6627_res->scan_result, sizeof(fm_u16) * FM_SCANTBL_SIZE);
- WCN_DBG(FM_NTC | CHIP, "Rx scan result:\n");
-
- for (offset = 0; offset < tmp_scanTBLsize; offset++) {
- WCN_DBG(FM_NTC | CHIP, "%d: %04x\n", (fm_s32) offset, *(pScanTBL + offset));
- }
-
- *ScanTBLsize = tmp_scanTBLsize;
- } else {
- WCN_DBG(FM_ALT | CHIP, "mt6627_scan failed\n");
- return ret;
- }
-
- mt6627_set_bits(FM_MAIN_CTRL, 0x0000, 0xFFF0); /* make sure tune/seek/scan/cqi bits = 0 */
- if ((temp & 0x0020) == 0) {
- mt6627_Mute(fm_false);
- }
-
- return fm_true;
-}
-
-/* add for scan cancel case */
-static fm_bool cqi_abort = fm_false;
-
-static fm_s32 mt6627_CQI_Get(fm_s8 *buf, fm_s32 buf_len)
-{
- fm_s32 ret = 0;
- fm_s32 i;
- fm_u16 pkt_size;
- struct mt6627_fm_cqi *pmt6627_cqi;
- struct adapt_fm_cqi *pcqi;
-
- if (!buf || buf_len < FM_CQI_BUF_SIZE) {
- return -FM_EBUF;
- }
-
- if (FM_LOCK(cmd_buf_lock))
- return (-FM_ELOCK);
- pkt_size = mt6627_cqi_get(cmd_buf, TX_BUF_SIZE);
- if (cqi_abort == fm_true) {
- cqi_abort = fm_false;
- ret = -1;
- } else {
- ret =
- fm_cmd_tx(cmd_buf, pkt_size, FLAG_SCAN | FLAG_CQI_DONE, SW_RETRY_CNT,
- SCAN_TIMEOUT, mt6627_get_read_result);
- }
- FM_UNLOCK(cmd_buf_lock);
-
- if (!ret && mt6627_res) {
- /* FIXEDME */
- pmt6627_cqi = (struct mt6627_fm_cqi *)mt6627_res->cqi;
- pcqi = (struct adapt_fm_cqi *)buf;
-
- for (i = 0; i < (sizeof(mt6627_res->cqi) / sizeof(struct mt6627_fm_cqi)); i++) {
- pcqi[i].ch = (pmt6627_cqi[i].ch * 10 / 2) + 6400;
- pcqi[i].rssi = (fm_s32) pmt6627_cqi[i].rssi;
-
- if (pcqi[i].rssi >= 32768) {
- pcqi[i].rssi = pcqi[i].rssi - 65536;
- }
-
- pcqi[i].rssi = ((pcqi[i].rssi * 6) >> 4);
- WCN_DBG(FM_NTC | CHIP, "%d --> %d(dbm)\n", pcqi[i].ch, pcqi[i].rssi);
- }
- } else {
- WCN_DBG(FM_ALT | CHIP, "mt6627 get CQI failed:%d\n", ret);
- }
-
- mt6627_set_bits(FM_MAIN_CTRL, 0x0000, 0xFFF0); /* make sure tune/seek/scan/cqi bits = 0 */
-
- return ret;
-}
-
-static fm_bool scan_abort = fm_false;
-
-#ifdef CONFIG_MTK_FM_50KHZ_SUPPORT
-#define SCAN_SEG_LEN 250
-static fm_s8 raw_buf[16 * sizeof(struct adapt_fm_cqi)] = { 0 };
-
-static fm_bool mt6627_Scan_50KHz(fm_u16 min_freq, fm_u16 max_freq, fm_u16 *pFreq,
- fm_u16 *pScanTBL, fm_u16 *ScanTBLsize, fm_u16 scandir,
- fm_u16 space)
-{
- fm_s32 ret = 0;
- fm_s32 num;
- fm_s32 seg;
- fm_s32 i, j;
- fm_u16 scan_tbl[FM_SCANTBL_SIZE]; /* need no less than the chip */
- fm_s32 start_freq, end_freq;
- fm_s32 ch_offset, step, tmp_val;
- fm_s32 chl_cnt = 0;
- fm_s32 word_offset, bit_offset;
- fm_s32 space_val = 5;
- struct adapt_fm_cqi *pCQI = (struct adapt_fm_cqi *)raw_buf;
-
- if (space == 0x0001) {
- space_val = 5; /* 50Khz */
- } else if (space == 0x0002) {
- space_val = 10; /* 100Khz */
- } else if (space == 0x0004) {
- space_val = 20; /* 200Khz */
- }
- /* calculate segment number */
- num = (max_freq - min_freq) / space_val; /* Eg, (10800 - 8750) / 5 = 410 */
- seg = (num / SCAN_SEG_LEN) + ((num % SCAN_SEG_LEN) ? 1 : 0); /* Eg, (410 / 200) + ((410 % 200) ? 1 : 0) = 2 + 1 = 3 */
-
- FM_FIFO_RESET(cqi_fifo);
- fm_memset(pScanTBL, 0, sizeof(fm_u16) * (*ScanTBLsize));
-
- /* do scan */
- scan_abort = fm_false; /* reset scan cancel flag */
- for (i = 0; i < seg; i++) {
- start_freq = min_freq + SCAN_SEG_LEN * space_val * i;
- end_freq = min_freq + SCAN_SEG_LEN * space_val * (i + 1) - space_val;
- end_freq = (end_freq > max_freq) ? max_freq : end_freq;
- chl_cnt = 0;
-
- if (fm_true == scan_abort) {
- scan_abort = fm_false;
- return fm_false;
- }
-
- if (fm_false ==
- mt6627_Scan(start_freq, end_freq, pFreq, scan_tbl, ScanTBLsize, scandir,
- space)) {
- return fm_false;
- }
- /* get channel count */
- for (ch_offset = 0; ch_offset < FM_SCANTBL_SIZE; ch_offset++) {
- if (scan_tbl[ch_offset] == 0)
- continue;
- for (step = 0; step < 16; step++) {
- if (scan_tbl[ch_offset] & (1 << step)) {
- tmp_val = start_freq + (ch_offset * 16 + step) * space_val;
- WCN_DBG(FM_NTC | CHIP, "freq %d, end freq %d\n", tmp_val,
- end_freq);
- if (tmp_val <= end_freq) {
- chl_cnt++;
- /* set reult bitmap */
- word_offset = (tmp_val - min_freq) / space_val / 16;
- bit_offset = (tmp_val - min_freq) / space_val % 16;
- if ((word_offset < 26) && (word_offset >= 0)) {
- pScanTBL[word_offset] |= (1 << bit_offset);
- }
- WCN_DBG(FM_NTC | CHIP, "cnt %d, word %d, bit %d\n",
- chl_cnt, word_offset, bit_offset);
- }
- }
- }
- }
-
- /* get cqi info */
- while (chl_cnt > 0) {
- ret = mt6627_CQI_Get(raw_buf, 16 * sizeof(struct adapt_fm_cqi));
- if (ret) {
- return ret;
- }
- /* add valid channel to cqi_fifo */
- for (j = 0; j < sizeof(raw_buf) / sizeof(struct adapt_fm_cqi); j++) {
- if ((pCQI[j].ch >= start_freq) && (pCQI[j].ch <= end_freq)) {
- FM_FIFO_INPUT(cqi_fifo, pCQI + j);
- WCN_DBG(FM_NTC | CHIP, "%d %d(dbm) add to fifo\n",
- pCQI[j].ch, pCQI[j].rssi);
- }
- }
-
- chl_cnt -= 16;
- }
- }
-
- return fm_true;
-}
-
-
-static fm_s32 mt6627_CQI_Get_50KHz(fm_s8 *buf, fm_s32 buf_len)
-{
- fm_s32 ret = 0;
- fm_s32 i;
- struct adapt_fm_cqi tmp = {
- .ch = 0,
- .rssi = 0,
- };
- struct adapt_fm_cqi *pcqi = (struct adapt_fm_cqi *)buf;
-
-
- if (!buf || buf_len < FM_CQI_BUF_SIZE) {
- return -FM_EBUF;
- }
-
- for (i = 0; ((i < (buf_len / sizeof(struct adapt_fm_cqi))) &&
- (fm_false == FM_FIFO_IS_EMPTY(cqi_fifo))); i++) {
- FM_FIFO_OUTPUT(cqi_fifo, &tmp);
- pcqi[i].ch = tmp.ch;
- pcqi[i].rssi = tmp.rssi;
- WCN_DBG(FM_NTC | CHIP, "%d %d(dbm) get from fifo\n", pcqi[i].ch, pcqi[i].rssi);
- }
-
- return ret;
-}
-
-#endif /* CONFIG_MTK_FM_50KHZ_SUPPORT */
-static fm_s32 mt6627_SeekStop(void)
-{
- return fm_force_active_event(FLAG_SEEK_DONE);
-}
-
-static fm_s32 mt6627_ScanStop(void)
-{
- cqi_abort = fm_true;
- scan_abort = fm_true;
- fm_force_active_event(FLAG_SCAN_DONE | FLAG_CQI_DONE);
-
- return 0;
-}
-
-#endif
-
-/*
- * mt6627_GetCurRSSI - get current freq's RSSI value
- * RS=RSSI
- * If RS>511, then RSSI(dBm)= (RS-1024)/16*6
- * else RSSI(dBm)= RS/16*6
- */
-static fm_s32 mt6627_GetCurRSSI(fm_s32 *pRSSI)
-{
- fm_u16 tmp_reg;
-
- mt6627_read(FM_RSSI_IND, &tmp_reg);
- tmp_reg = tmp_reg & 0x03ff;
-
- if (pRSSI) {
- *pRSSI = (tmp_reg > 511) ? (((tmp_reg - 1024) * 6) >> 4) : ((tmp_reg * 6) >> 4);
- WCN_DBG(FM_DBG | CHIP, "rssi:%d, dBm:%d\n", tmp_reg, *pRSSI);
- } else {
- WCN_DBG(FM_ERR | CHIP, "get rssi para error\n");
- return -FM_EPARA;
- }
-
- return 0;
-}
-
-static fm_u16 mt6627_vol_tbl[16] = { 0x0000, 0x0519, 0x066A, 0x0814,
- 0x0A2B, 0x0CCD, 0x101D, 0x1449,
- 0x198A, 0x2027, 0x287A, 0x32F5,
- 0x4027, 0x50C3, 0x65AD, 0x7FFF
-};
-
-static fm_s32 mt6627_SetVol(fm_u8 vol)
-{
- fm_s32 ret = 0;
-
- vol = (vol > 15) ? 15 : vol;
- ret = mt6627_write(0x7D, mt6627_vol_tbl[vol]);
- if (ret) {
- WCN_DBG(FM_ERR | CHIP, "Set vol=%d Failed\n", vol);
- return ret;
- } else {
- WCN_DBG(FM_DBG | CHIP, "Set vol=%d OK\n", vol);
- }
-
- if (vol == 10) {
- fm_print_cmd_fifo(); /* just for debug */
- fm_print_evt_fifo();
- }
- return 0;
-}
-
-static fm_s32 mt6627_GetVol(fm_u8 *pVol)
-{
- int ret = 0;
- fm_u16 tmp;
- fm_s32 i;
-
- FMR_ASSERT(pVol);
-
- ret = mt6627_read(0x7D, &tmp);
- if (ret) {
- *pVol = 0;
- WCN_DBG(FM_ERR | CHIP, "Get vol Failed\n");
- return ret;
- }
-
- for (i = 0; i < 16; i++) {
- if (mt6627_vol_tbl[i] == tmp) {
- *pVol = i;
- break;
- }
- }
-
- WCN_DBG(FM_DBG | CHIP, "Get vol=%d OK\n", *pVol);
- return 0;
-}
-
-static fm_s32 mt6627_dump_reg(void)
-{
- fm_s32 i;
- fm_u16 TmpReg;
- for (i = 0; i < 0xff; i++) {
- mt6627_read(i, &TmpReg);
- WCN_DBG(FM_NTC | CHIP, "0x%02x=0x%04x\n", i, TmpReg);
- }
- return 0;
-}
-
-/*0:mono, 1:stereo*/
-static fm_bool mt6627_GetMonoStereo(fm_u16 *pMonoStereo)
-{
-#define FM_BF_STEREO 0x1000
- fm_u16 TmpReg;
-
- if (pMonoStereo) {
- mt6627_read(FM_RSSI_IND, &TmpReg);
- *pMonoStereo = (TmpReg & FM_BF_STEREO) >> 12;
- } else {
- WCN_DBG(FM_ERR | CHIP, "MonoStero: para err\n");
- return fm_false;
- }
-
- FM_LOG_NTC(CHIP, "Get MonoStero:0x%04x\n", *pMonoStereo);
- return fm_true;
-}
-
-static fm_s32 mt6627_SetMonoStereo(fm_s32 MonoStereo)
-{
- fm_s32 ret = 0;
-
- FM_LOG_NTC(CHIP, "set to %s\n", MonoStereo ? "mono" : "auto");
- mt6627_top_write(0x50, 0x0007);
-
- if (MonoStereo) { /*mono */
- ret = mt6627_set_bits(0x75, 0x0008, ~0x0008);
- } else { /*auto switch */
-
- ret = mt6627_set_bits(0x75, 0x0000, ~0x0008);
- }
-
- mt6627_top_write(0x50, 0x000F);
- return ret;
-}
-
-static fm_s32 mt6627_GetCapArray(fm_s32 *ca)
-{
- fm_u16 dataRead;
- fm_u16 tmp = 0;
-
- FMR_ASSERT(ca);
- mt6627_read(0x60, &tmp);
- mt6627_write(0x60, tmp & 0xFFF7); /* 0x60 D3=0 */
-
- mt6627_read(0x26, &dataRead);
- *ca = dataRead;
-
- mt6627_write(0x60, tmp); /* 0x60 D3=1 */
- return 0;
-}
-
-/*
- * mt6627_GetCurPamd - get current freq's PAMD value
- * PA=PAMD
- * If PA>511 then PAMD(dB)= (PA-1024)/16*6,
- * else PAMD(dB)=PA/16*6
- */
-static fm_bool mt6627_GetCurPamd(fm_u16 *pPamdLevl)
-{
- fm_u16 tmp_reg;
- fm_u16 dBvalue, valid_cnt = 0;
- int i, total = 0;
- for (i = 0; i < 8; i++) {
- if (mt6627_read(FM_ADDR_PAMD, &tmp_reg)) {
- *pPamdLevl = 0;
- return fm_false;
- }
-
- tmp_reg &= 0x03FF;
- dBvalue = (tmp_reg > 256) ? ((512 - tmp_reg) * 6 / 16) : 0;
- if (dBvalue != 0) {
- total += dBvalue;
- valid_cnt++;
- WCN_DBG(FM_DBG | CHIP, "[%d]PAMD=%d\n", i, dBvalue);
- }
- Delayms(3);
- }
- if (valid_cnt != 0) {
- *pPamdLevl = total / valid_cnt;
- } else {
- *pPamdLevl = 0;
- }
- WCN_DBG(FM_NTC | CHIP, "PAMD=%d\n", *pPamdLevl);
- return fm_true;
-}
-
-static fm_s32 mt6627_i2s_info_get(fm_s32 *ponoff, fm_s32 *pmode, fm_s32 *psample)
-{
- FMR_ASSERT(ponoff);
- FMR_ASSERT(pmode);
- FMR_ASSERT(psample);
-
- *ponoff = mt6627_fm_config.aud_cfg.i2s_info.status;
- *pmode = mt6627_fm_config.aud_cfg.i2s_info.mode;
- *psample = mt6627_fm_config.aud_cfg.i2s_info.rate;
-
- return 0;
-}
-
-static fm_s32 mt6627fm_get_audio_info(fm_audio_info_t *data)
-{
- memcpy(data, &mt6627_fm_config.aud_cfg, sizeof(fm_audio_info_t));
- return 0;
-}
-
-static fm_s32 mt6627_hw_info_get(struct fm_hw_info *req)
-{
- FMR_ASSERT(req);
-
- req->chip_id = mt6627_hw_info.chip_id;
- req->eco_ver = mt6627_hw_info.eco_ver;
- req->patch_ver = mt6627_hw_info.patch_ver;
- req->rom_ver = mt6627_hw_info.rom_ver;
-
- return 0;
-}
-
-static fm_s32 mt6627_pre_search(void)
-{
- mt6627_RampDown();
- /* disable audio output I2S Rx mode */
- mt6627_host_write(0x80101054, 0x00000000);
- /* disable audio output I2S Tx mode */
- mt6627_write(0x9B, 0x0000);
- /*FM_LOG_NTC(FM_NTC | CHIP, "search threshold: RSSI=%d,de-RSSI=%d,smg=%d %d\n",
- mt6627_fm_config.rx_cfg.long_ana_rssi_th, mt6627_fm_config.rx_cfg.desene_rssi_th,
- mt6627_fm_config.rx_cfg.smg_th);*/
- return 0;
-}
-
-static fm_s32 mt6627_restore_search(void)
-{
- mt6627_RampDown();
- /* set audio output I2S Tx mode */
- mt6627_write(0x9B, 0xF9AB);
- /* set audio output I2S Rx mode */
- mt6627_host_write(0x80101054, 0x00003f35);
- return 0;
-}
-
-static fm_s32 mt6627_soft_mute_tune(fm_u16 freq, fm_s32 *rssi, fm_bool *valid)
-{
- fm_s32 ret = 0;
- fm_u16 pkt_size;
- /* fm_u16 freq;//, orig_freq; */
- struct mt6627_full_cqi *p_cqi;
- fm_s32 RSSI = 0, PAMD = 0, MR = 0, ATDC = 0;
- fm_u32 PRX = 0, ATDEV = 0;
- fm_u16 softmuteGainLvl = 0;
-
- ret = mt6627_chan_para_get(freq);
- if (ret == 2) {
- ret = mt6627_set_bits(FM_CHANNEL_SET, 0x2000, 0x0FFF); /* mdf HiLo */
- } else {
- ret = mt6627_set_bits(FM_CHANNEL_SET, 0x0000, 0x0FFF); /* clear FA/HL/ATJ */
- }
- if (FM_LOCK(cmd_buf_lock))
- return (-FM_ELOCK);
- pkt_size = mt6627_full_cqi_req(cmd_buf, TX_BUF_SIZE, &freq, 1, 1);
- ret =
- fm_cmd_tx(cmd_buf, pkt_size, FLAG_SM_TUNE, SW_RETRY_CNT, SM_TUNE_TIMEOUT,
- mt6627_get_read_result);
- FM_UNLOCK(cmd_buf_lock);
-
- if (!ret && mt6627_res) {
- WCN_DBG(FM_NTC | CHIP, "smt cqi size %d\n", mt6627_res->cqi[0]);
- p_cqi = (struct mt6627_full_cqi *)&mt6627_res->cqi[2];
- /* just for debug */
- WCN_DBG(FM_NTC | CHIP,
- "freq %d, 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x\n",
- p_cqi->ch, p_cqi->rssi, p_cqi->pamd, p_cqi->pr, p_cqi->fpamd, p_cqi->mr,
- p_cqi->atdc, p_cqi->prx, p_cqi->atdev, p_cqi->smg, p_cqi->drssi);
- RSSI =
- ((p_cqi->rssi & 0x03FF) >=
- 512) ? ((p_cqi->rssi & 0x03FF) - 1024) : (p_cqi->rssi & 0x03FF);
- PAMD =
- ((p_cqi->pamd & 0x1FF) >=
- 256) ? ((p_cqi->pamd & 0x01FF) - 512) : (p_cqi->pamd & 0x01FF);
- MR = ((p_cqi->mr & 0x01FF) >=
- 256) ? ((p_cqi->mr & 0x01FF) - 512) : (p_cqi->mr & 0x01FF);
- ATDC = (p_cqi->atdc >= 32768) ? (65536 - p_cqi->atdc) : (p_cqi->atdc);
- if (ATDC < 0) {
- ATDC = (~(ATDC)) - 1; /* Get abs value of ATDC */
- }
- PRX = (p_cqi->prx & 0x00FF);
- ATDEV = p_cqi->atdev;
- softmuteGainLvl = p_cqi->smg;
- /* check if the channel is valid according to each CQIs */
- if ((RSSI >= mt6627_fm_config.rx_cfg.long_ana_rssi_th)
- && (PAMD <= mt6627_fm_config.rx_cfg.pamd_th)
- && (ATDC <= mt6627_fm_config.rx_cfg.atdc_th)
- && (MR >= mt6627_fm_config.rx_cfg.mr_th)
- && (PRX >= mt6627_fm_config.rx_cfg.prx_th)
- && (ATDEV >= ATDC) /* sync scan algorithm */
- &&(softmuteGainLvl >= mt6627_fm_config.rx_cfg.smg_th)) {
- *valid = fm_true;
- } else {
- *valid = fm_false;
- }
- *rssi = RSSI;
-/* if(RSSI < -296)
- WCN_DBG(FM_NTC | CHIP, "rssi\n");
- else if(PAMD > -12)
- WCN_DBG(FM_NTC | CHIP, "PAMD\n");
- else if(ATDC > 3496)
- WCN_DBG(FM_NTC | CHIP, "ATDC\n");
- else if(MR < -67)
- WCN_DBG(FM_NTC | CHIP, "MR\n");
- else if(PRX < 80)
- WCN_DBG(FM_NTC | CHIP, "PRX\n");
- else if(ATDEV < ATDC)
- WCN_DBG(FM_NTC | CHIP, "ATDEV\n");
- else if(softmuteGainLvl < 16421)
- WCN_DBG(FM_NTC | CHIP, "softmuteGainLvl\n");
- */
- } else {
- WCN_DBG(FM_ALT | CHIP, "smt get CQI failed\n");
- return fm_false;
- }
- WCN_DBG(FM_NTC | CHIP, "valid=%d\n", *valid);
- return fm_true;
-}
-
-static fm_bool mt6627_em_test(fm_u16 group_idx, fm_u16 item_idx, fm_u32 item_value)
-{
- return fm_true;
-}
-
-/*
-parm:
- parm.th_type: 0, RSSI. 1,desense RSSI. 2,SMG.
- parm.th_val: threshold value
-*/
-static fm_s32 mt6627_set_search_th(fm_s32 idx, fm_s32 val, fm_s32 reserve)
-{
- switch (idx) {
- case 0:
- {
- mt6627_fm_config.rx_cfg.long_ana_rssi_th = val;
- WCN_DBG(FM_NTC | CHIP, "set rssi th =%d\n", val);
- break;
- }
- case 1:
- {
- mt6627_fm_config.rx_cfg.desene_rssi_th = val;
- WCN_DBG(FM_NTC | CHIP, "set desense rssi th =%d\n", val);
- break;
- }
- case 2:
- {
- mt6627_fm_config.rx_cfg.smg_th = val;
- WCN_DBG(FM_NTC | CHIP, "set smg th =%d\n", val);
- break;
- }
- default:
- break;
- }
- return 0;
-}
-
-static fm_s32 MT6627fm_low_power_wa_default(fm_s32 fmon)
-{
- return 0;
-}
-
-fm_s32 MT6627fm_low_ops_register(struct fm_lowlevel_ops *ops)
-{
- fm_s32 ret = 0;
- /* Basic functions. */
-
- FMR_ASSERT(ops);
- FMR_ASSERT(ops->cb.cur_freq_get);
- FMR_ASSERT(ops->cb.cur_freq_set);
- fm_cb_op = &ops->cb;
-
- ops->bi.pwron = mt6627_pwron;
- ops->bi.pwroff = mt6627_pwroff;
- ops->bi.msdelay = Delayms;
- ops->bi.usdelay = Delayus;
- ops->bi.read = mt6627_read;
- ops->bi.write = mt6627_write;
- ops->bi.top_read = mt6627_top_read;
- ops->bi.top_write = mt6627_top_write;
- ops->bi.host_read = mt6627_host_read;
- ops->bi.host_write = mt6627_host_write;
- ops->bi.setbits = mt6627_set_bits;
- ops->bi.chipid_get = mt6627_get_chipid;
- ops->bi.mute = mt6627_Mute;
- ops->bi.rampdown = mt6627_RampDown;
- ops->bi.pwrupseq = mt6627_PowerUp;
- ops->bi.pwrdownseq = mt6627_PowerDown;
- ops->bi.setfreq = mt6627_SetFreq;
- ops->bi.low_pwr_wa = MT6627fm_low_power_wa_default;
- ops->bi.get_aud_info = mt6627fm_get_audio_info;
-#if 0
- ops->bi.seek = mt6627_Seek;
- ops->bi.seekstop = mt6627_SeekStop;
- ops->bi.scan = mt6627_Scan;
- ops->bi.cqi_get = mt6627_CQI_Get;
-#ifdef CONFIG_MTK_FM_50KHZ_SUPPORT
- ops->bi.scan = mt6627_Scan_50KHz;
- ops->bi.cqi_get = mt6627_CQI_Get_50KHz;
-#endif
- ops->bi.scanstop = mt6627_ScanStop;
- ops->bi.i2s_set = mt6627_I2s_Setting;
-#endif
- ops->bi.rssiget = mt6627_GetCurRSSI;
- ops->bi.volset = mt6627_SetVol;
- ops->bi.volget = mt6627_GetVol;
- ops->bi.dumpreg = mt6627_dump_reg;
- ops->bi.msget = mt6627_GetMonoStereo;
- ops->bi.msset = mt6627_SetMonoStereo;
- ops->bi.pamdget = mt6627_GetCurPamd;
- ops->bi.em = mt6627_em_test;
- ops->bi.anaswitch = mt6627_SetAntennaType;
- ops->bi.anaget = mt6627_GetAntennaType;
- ops->bi.caparray_get = mt6627_GetCapArray;
- ops->bi.hwinfo_get = mt6627_hw_info_get;
- ops->bi.i2s_get = mt6627_i2s_info_get;
- ops->bi.is_dese_chan = mt6627_is_dese_chan;
- ops->bi.softmute_tune = mt6627_soft_mute_tune;
- ops->bi.desense_check = mt6627_desense_check;
- ops->bi.cqi_log = mt6627_full_cqi_get;
- ops->bi.pre_search = mt6627_pre_search;
- ops->bi.restore_search = mt6627_restore_search;
- ops->bi.set_search_th = mt6627_set_search_th;
-
- cmd_buf_lock = fm_lock_create("27_cmd");
- ret = fm_lock_get(cmd_buf_lock);
-
- cmd_buf = fm_zalloc(TX_BUF_SIZE + 1);
-
- if (!cmd_buf) {
- WCN_DBG(FM_ALT | CHIP, "6627 fm lib alloc tx buf failed\n");
- ret = -1;
- }
-#if 0 /* def CONFIG_MTK_FM_50KHZ_SUPPORT */
- cqi_fifo = fm_fifo_create("6628_cqi_fifo", sizeof(struct adapt_fm_cqi), 640);
- if (!cqi_fifo) {
- WCN_DBG(FM_ALT | CHIP, "6627 fm lib create cqi fifo failed\n");
- ret = -1;
- }
-#endif
-
- return ret;
-}
-
-fm_s32 MT6627fm_low_ops_unregister(struct fm_lowlevel_ops *ops)
-{
- fm_s32 ret = 0;
- /* Basic functions. */
- FMR_ASSERT(ops);
-
-#if 0 /* def CONFIG_MTK_FM_50KHZ_SUPPORT */
- fm_fifo_release(cqi_fifo);
-#endif
-
- if (cmd_buf) {
- fm_free(cmd_buf);
- cmd_buf = NULL;
- }
-
- ret = fm_lock_put(cmd_buf_lock);
- fm_memset(&ops->bi, 0, sizeof(struct fm_basic_interface));
- return ret;
-}
-
-/* static struct fm_pub pub; */
-/* static struct fm_pub_cb *pub_cb = &pub.pub_tbl; */
-
-static const fm_u16 mt6627_mcu_dese_list[] = {
- 7630, 7800, 7940, 8320, 9260, 9600, 9710, 9920, 10400, 10410
-};
-
-static const fm_u16 mt6627_gps_dese_list[] = {
- 7850, 7860
-};
-
-static const fm_s8 mt6627_chan_para_map[] = {
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, /* 6500~6595 */
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 6600~6695 */
- 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, /* 6700~6795 */
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 6800~6895 */
- 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 6900~6995 */
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 7000~7095 */
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, /* 7100~7195 */
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 2, 0, /* 7200~7295 */
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 7300~7395 */
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 7400~7495 */
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 7500~7595 */
- 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, /* 7600~7695 */
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 7700~7795 */
- 8, 0, 2, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 7800~7895 */
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, /* 7900~7995 */
- 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, /* 8000~8095 */
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 8100~8195 */
- 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 8200~8295 */
- 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 8300~8395 */
- 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 8400~8495 */
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 8500~8595 */
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 8600~8695 */
- 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 8700~8795 */
- 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 8800~8895 */
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 8900~8995 */
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 9000~9095 */
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 9100~9195 */
- 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 9200~9295 */
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, /* 9300~9395 */
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 9400~9495 */
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 9500~9595 */
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 9600~9695 */
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 9700~9795 */
- 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 9800~9895 */
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, /* 9900~9995 */
- 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 10000~10095 */
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 10100~10195 */
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, /* 10200~10295 */
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 10300~10395 */
- 8, 0, 2, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 10400~10495 */
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 10500~10595 */
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 10600~10695 */
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, /* 10700~10795 */
- 0 /* 10800 */
-};
-
-
-static const fm_u16 mt6627_scan_dese_list[] = {
- 6910, 7680, 7800, 9210, 9220, 9230, 9600, 9980, 9990, 10400, 10750, 10760
-};
-
-static const fm_u16 mt6627_I2S_hopping_list[] = {
- 6550, 6760, 6960, 6970, 7170, 7370, 7580, 7780, 7990, 8810, 9210, 9220, 10240
-};
-
-static const fm_u16 mt6627_TDD_list[] = {
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 6500~6595 */
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 6600~6695 */
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 6700~6795 */
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 6800~6895 */
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 6900~6995 */
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 7000~7095 */
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 7100~7195 */
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 7200~7295 */
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 7300~7395 */
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 7400~7495 */
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 7500~7595 */
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 7600~7695 */
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 7700~7795 */
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 7800~7895 */
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 7900~7995 */
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 8000~8095 */
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 8100~8195 */
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 8200~8295 */
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 8300~8395 */
- 0x0101, 0x0000, 0x0000, 0x0000, 0x0000, /* 8400~8495 */
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 8500~8595 */
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 8600~8695 */
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 8700~8795 */
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 8800~8895 */
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 8900~8995 */
- 0x0000, 0x0000, 0x0101, 0x0101, 0x0101, /* 9000~9095 */
- 0x0101, 0x0000, 0x0000, 0x0000, 0x0000, /* 9100~9195 */
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 9200~9295 */
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 9300~9395 */
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 9400~9495 */
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 9500~9595 */
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 9600~9695 */
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0100, /* 9700~9795 */
- 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, /* 9800~9895 */
- 0x0101, 0x0101, 0x0001, 0x0000, 0x0000, /* 9900~9995 */
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 10000~10095 */
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 10100~10195 */
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 10200~10295 */
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 10300~10395 */
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 10400~10495 */
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 10500~10595 */
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0100, /* 10600~10695 */
- 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, /* 10700~10795 */
- 0x0001 /* 10800 */
-};
-
-static const fm_u16 mt6627_TDD_Mask[] = {
- 0x0001, 0x0010, 0x0100, 0x1000
-};
-
-/* return value: 0, not a de-sense channel; 1, this is a de-sense channel; else error no */
-static fm_s32 mt6627_is_dese_chan(fm_u16 freq)
-{
- fm_s32 size;
-
- /* return 0;//HQA only :skip desense channel check. */
- size = sizeof(mt6627_scan_dese_list) / sizeof(mt6627_scan_dese_list[0]);
-
- if (0 == fm_get_channel_space(freq)) {
- freq *= 10;
- }
-
- while (size) {
- if (mt6627_scan_dese_list[size - 1] == freq)
- return 1;
-
- size--;
- }
-
- return 0;
-}
-
-/* return value:
-1, is desense channel and rssi is less than threshold;
-0, not desense channel or it is but rssi is more than threshold.*/
-static fm_s32 mt6627_desense_check(fm_u16 freq, fm_s32 rssi)
-{
- if (mt6627_is_dese_chan(freq)) {
- if (rssi < mt6627_fm_config.rx_cfg.desene_rssi_th) {
- return 1;
- }
- WCN_DBG(FM_DBG | CHIP, "desen_rssi %d th:%d\n", rssi,
- mt6627_fm_config.rx_cfg.desene_rssi_th);
- }
- return 0;
-}
-
-static fm_bool mt6627_TDD_chan_check(fm_u16 freq)
-{
- fm_u32 i = 0;
- fm_u16 freq_tmp = freq;
- fm_s32 ret = 0;
-
- ret = fm_get_channel_space(freq_tmp);
- if (0 == ret) {
- freq_tmp *= 10;
- } else if (-1 == ret)
- return fm_false;
-
- i = (freq_tmp - 6500) / 5;
-
- WCN_DBG(FM_NTC | CHIP, "Freq %d is 0x%4x, mask is 0x%4x\n", freq, (mt6627_TDD_list[i / 4]),
- mt6627_TDD_Mask[i % 4]);
- if (mt6627_TDD_list[i / 4] & mt6627_TDD_Mask[i % 4]) {
- WCN_DBG(FM_NTC | CHIP, "Freq %d use TDD solution\n", freq);
- return fm_true;
- } else
- return fm_false;
-}
-
-
-/* get channel parameter, HL side/ FA / ATJ */
-static fm_u16 mt6627_chan_para_get(fm_u16 freq)
-{
- fm_s32 pos, size;
-
- /* return 0;//for HQA only: skip FA/HL/ATJ */
- if (0 == fm_get_channel_space(freq)) {
- freq *= 10;
- }
- if (freq < 6500) {
- return 0;
- }
- pos = (freq - 6500) / 5;
-
- size = sizeof(mt6627_chan_para_map) / sizeof(mt6627_chan_para_map[0]);
-
- pos = (pos < 0) ? 0 : pos;
- pos = (pos > (size - 1)) ? (size - 1) : pos;
-
- return mt6627_chan_para_map[pos];
-}
-
-static fm_bool mt6627_I2S_hopping_check(fm_u16 freq)
-{
- fm_s32 size;
-
- size = sizeof(mt6627_I2S_hopping_list) / sizeof(mt6627_I2S_hopping_list[0]);
-
- if (0 == fm_get_channel_space(freq)) {
- freq *= 10;
- }
-
- while (size) {
- if (mt6627_I2S_hopping_list[size - 1] == freq)
- return 1;
- size--;
- }
-
- return 0;
-}
diff --git a/drivers/misc/mediatek/fmradio/mt6627/pub/mt6627_fm_rds.c b/drivers/misc/mediatek/fmradio/mt6627/pub/mt6627_fm_rds.c
deleted file mode 100644
index e3d31d648..000000000
--- a/drivers/misc/mediatek/fmradio/mt6627/pub/mt6627_fm_rds.c
+++ /dev/null
@@ -1,351 +0,0 @@
-/* mt6627_rds.c
- *
- * (C) Copyright 2009
- * MediaTek <www.MediaTek.com>
- * hongcheng <hongcheng.xia@MediaTek.com>
- *
- * mt6627 FM Radio Driver
- *
- * 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.
- *
- * 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.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- */
-#include "fm_typedef.h"
-#include "fm_dbg.h"
-#include "fm_err.h"
-#include "fm_interface.h"
-#include "fm_stdlib.h"
-#include "fm_rds.h"
-#include "mt6627_fm_reg.h"
-
-
-static fm_bool bRDS_FirstIn = fm_false;
-static fm_u32 gBLER_CHK_INTERVAL = 5000;
-static fm_u16 GOOD_BLK_CNT = 0, BAD_BLK_CNT;
-static fm_u8 BAD_BLK_RATIO;
-
-static struct fm_callback *fm_cb;
-static struct fm_basic_interface *fm_bi;
-
-
-static fm_bool mt6627_RDS_support(void);
-static fm_s32 mt6627_RDS_enable(void);
-static fm_s32 mt6627_RDS_disable(void);
-static fm_u16 mt6627_RDS_Get_GoodBlock_Counter(void);
-static fm_u16 mt6627_RDS_Get_BadBlock_Counter(void);
-static fm_u8 mt6627_RDS_Get_BadBlock_Ratio(void);
-static fm_u32 mt6627_RDS_Get_BlerCheck_Interval(void);
-/* static void mt6627_RDS_GetData(fm_u16 *data, fm_u16 datalen); */
-static void mt6627_RDS_Init_Data(rds_t *pstRDSData);
-
-
-
-static fm_bool mt6627_RDS_support(void)
-{
- return fm_true;
-}
-
-static fm_s32 mt6627_RDS_enable(void)
-{
- fm_s32 ret = 0;
- fm_u16 dataRead = 0;
-
- WCN_DBG(FM_DBG | RDSC, "rds enable\n");
- ret = fm_bi->read(FM_RDS_CFG0, &dataRead);
- if(ret) {
- WCN_DBG(FM_NTC | RDSC, "rds enable read 0x80 fail\n");
- return ret;
- }
- ret = fm_bi->write(FM_RDS_CFG0, 6); /* set buf_start_th */
- if(ret) {
- WCN_DBG(FM_NTC | RDSC, "rds enable write 0x80 fail\n");
- return ret;
- }
- ret = fm_bi->read(FM_MAIN_CTRL, &dataRead);
- if(ret) {
- WCN_DBG(FM_NTC | RDSC, "rds enable read 0x63 fail\n");
- return ret;
- }
- ret = fm_bi->write(FM_MAIN_CTRL, dataRead | (RDS_MASK));
- if(ret) {
- WCN_DBG(FM_NTC | RDSC, "rds enable write 0x63 fail\n");
- return ret;
- }
-
- return ret;
-}
-
-static fm_s32 mt6627_RDS_disable(void)
-{
- fm_s32 ret = 0;
- fm_u16 dataRead = 0;
-
- WCN_DBG(FM_DBG | RDSC, "rds disable\n");
- ret = fm_bi->read(FM_MAIN_CTRL, &dataRead);
- if(ret) {
- WCN_DBG(FM_NTC | RDSC, "rds disable read 0x63 fail\n");
- return ret;
- }
- ret = fm_bi->write(FM_MAIN_CTRL, dataRead & (~RDS_MASK));
- if(ret) {
- WCN_DBG(FM_NTC | RDSC, "rds disable write 0x63 fail\n");
- return ret;
- }
-
- return ret;
-}
-
-static fm_u16 mt6627_RDS_Get_GoodBlock_Counter(void)
-{
- fm_u16 tmp_reg;
-
- fm_bi->read(FM_RDS_GOODBK_CNT, &tmp_reg);
- GOOD_BLK_CNT = tmp_reg;
- WCN_DBG(FM_DBG | RDSC, "get good block cnt:%d\n", (fm_s32) tmp_reg);
-
- return tmp_reg;
-}
-
-static fm_u16 mt6627_RDS_Get_BadBlock_Counter(void)
-{
- fm_u16 tmp_reg;
-
- fm_bi->read(FM_RDS_BADBK_CNT, &tmp_reg);
- BAD_BLK_CNT = tmp_reg;
- WCN_DBG(FM_DBG | RDSC, "get bad block cnt:%d\n", (fm_s32) tmp_reg);
-
- return tmp_reg;
-}
-
-static fm_u8 mt6627_RDS_Get_BadBlock_Ratio(void)
-{
- fm_u16 tmp_reg;
- fm_u16 gbc;
- fm_u16 bbc;
-
- gbc = mt6627_RDS_Get_GoodBlock_Counter();
- bbc = mt6627_RDS_Get_BadBlock_Counter();
-
- if ((gbc + bbc) > 0) {
- tmp_reg = (fm_u8) (bbc * 100 / (gbc + bbc));
- } else {
- tmp_reg = 0;
- }
-
- BAD_BLK_RATIO = tmp_reg;
- WCN_DBG(FM_DBG | RDSC, "get badblock ratio:%d\n", (fm_s32) tmp_reg);
-
- return tmp_reg;
-}
-
-static fm_s32 mt6627_RDS_BlockCounter_Reset(void)
-{
- mt6627_RDS_disable();
- mt6627_RDS_enable();
-
- return 0;
-}
-
-static fm_u32 mt6627_RDS_Get_BlerCheck_Interval(void)
-{
- return gBLER_CHK_INTERVAL;
-}
-
-static fm_s32 mt6627_RDS_BlerCheck(rds_t *dst)
-{
- return 0;
-}
-
-#if 0
-static void RDS_Recovery_Handler(void)
-{
- fm_u16 tempData = 0;
-
- do {
- fm_bi->read(FM_RDS_DATA_REG, &tempData);
- fm_bi->read(FM_RDS_POINTER, &tempData);
- } while (tempData & 0x3);
-}
-#endif
-
-#if 0
-static void mt6627_RDS_GetData(fm_u16 *data, fm_u16 datalen)
-{
-#define RDS_GROUP_DIFF_OFS 0x007C
-#define RDS_FIFO_DIFF 0x007F
-#define RDS_CRC_BLK_ADJ 0x0020
-#define RDS_CRC_CORR_CNT 0x001E
-#define RDS_CRC_INFO 0x0001
-
- fm_u16 CRC = 0, i = 0, RDS_adj = 0, RDSDataCount = 0, FM_WARorrCnt = 0;
- fm_u16 temp = 0, OutputPofm_s32 = 0;
-
- WCN_DBG(FM_DBG | RDSC, "get data\n");
- fm_bi->read(FM_RDS_FIFO_STATUS0, &temp);
- RDSDataCount = ((RDS_GROUP_DIFF_OFS & temp) << 2);
-
- if ((temp & RDS_FIFO_DIFF) >= 4) {
- /* block A data and info handling */
- fm_bi->read(FM_RDS_INFO, &temp);
- RDS_adj |= (temp & RDS_CRC_BLK_ADJ) << 10;
- CRC |= (temp & RDS_CRC_INFO) << 3;
- FM_WARorrCnt |= ((temp & RDS_CRC_CORR_CNT) << 11);
- fm_bi->read(FM_RDS_DATA_REG, &data[0]);
-
- /* block B data and info handling */
- fm_bi->read(FM_RDS_INFO, &temp);
- RDS_adj |= (temp & RDS_CRC_BLK_ADJ) << 9;
- CRC |= (temp & RDS_CRC_INFO) << 2;
- FM_WARorrCnt |= ((temp & RDS_CRC_CORR_CNT) << 7);
- fm_bi->read(FM_RDS_DATA_REG, &data[1]);
-
- /* block C data and info handling */
- fm_bi->read(FM_RDS_INFO, &temp);
- RDS_adj |= (temp & RDS_CRC_BLK_ADJ) << 8;
- CRC |= (temp & RDS_CRC_INFO) << 1;
- FM_WARorrCnt |= ((temp & RDS_CRC_CORR_CNT) << 3);
- fm_bi->read(FM_RDS_DATA_REG, &data[2]);
-
- /* block D data and info handling */
- fm_bi->read(FM_RDS_INFO, &temp);
- RDS_adj |= (temp & RDS_CRC_BLK_ADJ) << 7;
- CRC |= (temp & RDS_CRC_INFO);
- FM_WARorrCnt |= ((temp & RDS_CRC_CORR_CNT) >> 1);
- fm_bi->read(FM_RDS_DATA_REG, &data[3]);
-
- data[4] = (CRC | RDS_adj | RDSDataCount);
- data[5] = FM_WARorrCnt;
-
- fm_bi->read(FM_RDS_PWDI, &data[6]);
- fm_bi->read(FM_RDS_PWDQ, &data[7]);
-
- fm_bi->read(FM_RDS_POINTER, &OutputPofm_s32);
-
- /* Go fm_s32o RDS recovery handler while RDS output pofm_s32 doesn't align to 4 in numeric */
- if (OutputPofm_s32 & 0x3) {
- RDS_Recovery_Handler();
- }
-
- } else {
- for (; i < 8; i++)
- data[i] = 0;
- }
-}
-#endif
-
-static void mt6627_RDS_Init_Data(rds_t *pstRDSData)
-{
- fm_memset(pstRDSData, 0, sizeof(rds_t));
- bRDS_FirstIn = fm_true;
-
- pstRDSData->event_status = 0x0000;
- fm_memset(pstRDSData->RT_Data.TextData, 0x20, sizeof(pstRDSData->RT_Data.TextData));
- fm_memset(pstRDSData->PS_Data.PS, '\0', sizeof(pstRDSData->PS_Data.PS));
- fm_memset(pstRDSData->PS_ON, 0x20, sizeof(pstRDSData->PS_ON));
-}
-
-fm_bool mt6627_RDS_OnOff(rds_t *dst, fm_bool bFlag)
-{
- fm_s32 ret = 0;
-
- if (mt6627_RDS_support() == fm_false) {
- WCN_DBG(FM_ALT | RDSC, "mt6627_RDS_OnOff failed, RDS not support\n");
- return fm_false;
- }
-
- if (bFlag) {
- mt6627_RDS_Init_Data(dst);
- ret = mt6627_RDS_enable();
- if(ret) {
- WCN_DBG(FM_NTC | RDSC, "mt6630_RDS_OnOff enable failed\n");
- return fm_false;
- }
- } else {
- mt6627_RDS_Init_Data(dst);
- ret = mt6627_RDS_disable();
- if(ret) {
- WCN_DBG(FM_NTC | RDSC, "mt6630_RDS_OnOff disable failed\n");
- return fm_false;
- }
- }
-
- return fm_true;
-}
-
-DEFINE_RDSLOG(mt6627_rds_log);
-
-/* mt6627_RDS_Efm_s32_Handler - response FM RDS interrupt
- * @fm - main data structure of FM driver
- * This function first get RDS raw data, then call RDS spec parser
- */
-static fm_s32 mt6627_rds_parser(rds_t *rds_dst, struct rds_rx_t *rds_raw, fm_s32 rds_size,
- fm_u16(*getfreq) (void))
-{
- mt6627_rds_log.log_in(&mt6627_rds_log, rds_raw, rds_size);
- return rds_parser(rds_dst, rds_raw, rds_size, getfreq);
-}
-
-static fm_s32 mt6627_rds_log_get(struct rds_rx_t *dst, fm_s32 *dst_len)
-{
- return mt6627_rds_log.log_out(&mt6627_rds_log, dst, dst_len);
-}
-
-static fm_s32 mt6627_rds_gc_get(struct rds_group_cnt_t *dst, rds_t *rdsp)
-{
- return rds_grp_counter_get(dst, &rdsp->gc);
-}
-
-static fm_s32 mt6627_rds_gc_reset(rds_t *rdsp)
-{
- return rds_grp_counter_reset(&rdsp->gc);
-}
-
-fm_s32 MT6627fm_rds_ops_register(struct fm_lowlevel_ops *ops)
-{
- fm_s32 ret = 0;
-
- FMR_ASSERT(ops);
- FMR_ASSERT(ops->bi.write);
- FMR_ASSERT(ops->bi.read);
- FMR_ASSERT(ops->bi.setbits);
- FMR_ASSERT(ops->bi.usdelay);
- fm_bi = &ops->bi;
-
- FMR_ASSERT(ops->cb.cur_freq_get);
- FMR_ASSERT(ops->cb.cur_freq_set);
- fm_cb = &ops->cb;
-
- ops->ri.rds_blercheck = mt6627_RDS_BlerCheck;
- ops->ri.rds_onoff = mt6627_RDS_OnOff;
- ops->ri.rds_parser = mt6627_rds_parser;
- ops->ri.rds_gbc_get = mt6627_RDS_Get_GoodBlock_Counter;
- ops->ri.rds_bbc_get = mt6627_RDS_Get_BadBlock_Counter;
- ops->ri.rds_bbr_get = mt6627_RDS_Get_BadBlock_Ratio;
- ops->ri.rds_bc_reset = mt6627_RDS_BlockCounter_Reset;
- ops->ri.rds_bci_get = mt6627_RDS_Get_BlerCheck_Interval;
- ops->ri.rds_log_get = mt6627_rds_log_get;
- ops->ri.rds_gc_get = mt6627_rds_gc_get;
- ops->ri.rds_gc_reset = mt6627_rds_gc_reset;
- return ret;
-}
-
-fm_s32 MT6627fm_rds_ops_unregister(struct fm_lowlevel_ops *ops)
-{
- fm_s32 ret = 0;
-
- FMR_ASSERT(ops);
-
- fm_bi = NULL;
- fm_memset(&ops->ri, 0, sizeof(struct fm_rds_interface));
- return ret;
-}
diff --git a/drivers/misc/mediatek/fmradio/mt6628/inc/mt6628_drv_dsp.h b/drivers/misc/mediatek/fmradio/mt6628/inc/mt6628_drv_dsp.h
deleted file mode 100644
index 749a38a32..000000000
--- a/drivers/misc/mediatek/fmradio/mt6628/inc/mt6628_drv_dsp.h
+++ /dev/null
@@ -1,972 +0,0 @@
-
-const unsigned char channel_parameter[] = {
- 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 5, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0
-};
-
-#if defined(MT6626_FPGA)
-const unsigned short bin_rom[] = {
- 0x0000, 0x1FFF, 0xBC00, 0x0010, 0xBC00, 0x0271, 0x8EC8, 0x8E00, 0x8EC8, 0x8E00, 0x8EC8,
- 0x8E00, 0x8EC8, 0x8E00, 0x8EC8, 0x8E00, 0x8EC8, 0x8E00, 0xBC02, 0x0906, 0xBC20, 0x2019,
- 0x4021, 0xFB11, 0xBC02, 0x0807, 0xBC20, 0x2019, 0x4041, 0xFB11, 0xBC22, 0x0480, 0xBC20,
- 0x0080, 0x4001, 0x8B02, 0xE401, 0xBC21, 0x0367, 0xA301, 0x0080, 0xBC20, 0x201A, 0x41E1,
- 0xFA12, 0xA302, 0x0082, 0x0891, 0x2620, 0x8FF9, 0x3D02, 0xBC21, 0x2018, 0x481E, 0xBC22,
- 0x2019, 0x8C69, 0x40C0, 0xA203, 0x0082, 0x2631, 0x8F4B, 0x2634, 0x8F3E, 0x2632, 0x8F1D,
- 0xB306, 0x0008, 0x8F0A, 0x40E0, 0xFB50, 0xBC02, 0x1E58, 0xBC22, 0x2019, 0xBC21, 0x2018,
- 0x481E, 0x8C53, 0x40C0, 0xFB50, 0xFA33, 0x26B0, 0x8F08, 0xBC02, 0x072A, 0xBC21, 0x2018,
- 0x4020, 0x7207, 0xBB30, 0x40C0, 0xBC22, 0x2019, 0xA31E, 0x0082, 0x8D41, 0x40A0, 0x70E0,
- 0x3B50, 0xBC21, 0x201D, 0xBC22, 0x201B, 0xFA31, 0xFA52, 0x0810, 0xBC3E, 0x00E4, 0xBC3A,
- 0x0692, 0xB400, 0x0002, 0xA31E, 0x0083, 0xA31A, 0x0084, 0x0408, 0xBC02, 0x0131, 0x40C0,
- 0xBC22, 0x2019, 0xBC21, 0x2018, 0x481E, 0x8D23, 0x4080, 0xFB50, 0xBC02, 0x016B, 0x40C0,
- 0xBC22, 0x2019, 0xBC21, 0x2018, 0x481E, 0x8D18, 0x4060, 0xBC21, 0x201F, 0xFB50, 0xFA30,
- 0xBC3E, 0x00C8, 0xBC3A, 0x0652, 0xBC21, 0x03FF, 0xA31E, 0x0083, 0xA31A, 0x0084, 0x0801,
- 0xBC02, 0x0131, 0x40C0, 0xBC22, 0x2019, 0xBC21, 0x2018, 0x481E, 0xA203, 0x0082, 0xB316,
- 0x0040, 0x8F91, 0xBC00, 0x001C, 0x6915, 0xA902, 0x8E00, 0xA30E, 0x0085, 0xDFD5, 0xBC02,
- 0x0607, 0xBC02, 0x077A, 0xBC20, 0x2019, 0x7040, 0x4FD5, 0xBC22, 0x2008, 0xFB11, 0xFA51,
- 0xBC23, 0x4000, 0x0ACB, 0xBC21, 0x2100, 0xFB53, 0xFA32, 0xB314, 0x0020, 0x8FFB, 0x4121,
- 0xE9FE, 0xFB11, 0xBC00, 0x1D52, 0xE902, 0xBC20, 0x2019, 0x7060, 0x5FD5, 0x8C02, 0xFB11,
- 0x8E00, 0xA200, 0x008B, 0x2600, 0x8FFA, 0x3E02, 0xA200, 0x008C, 0x6980, 0x4FD5, 0x8F02,
- 0xA200, 0x0086, 0x2681, 0x8F02, 0x4080, 0xA300, 0x0082, 0x8EC0, 0xE9FE, 0x8E00, 0xE902,
- 0xBC20, 0x2019, 0x7068, 0x5FD5, 0x8C02, 0xFB11, 0x8E00, 0xA200, 0x008B, 0x2600, 0x8FFA,
- 0x3E02, 0xA200, 0x008C, 0xA201, 0x0088, 0x2681, 0x8F06, 0x4020, 0xA202, 0x008A, 0x1401,
- 0x0A10, 0xA300, 0x008A, 0x3409, 0xA300, 0x0088, 0xA201, 0x0086, 0xB300, 0x0010, 0x8F01,
- 0x2691, 0x8F09, 0x401C, 0xBC20, 0x2041, 0xA202, 0x008A, 0xA31C, 0x0088, 0xA31C, 0x008A,
- 0xFB12, 0x2691, 0x8F16, 0xBC20, 0x2019, 0x41C1, 0x7008, 0x7B11, 0xBC22, 0x2018, 0xBC20,
- 0x201A, 0x8C05, 0xFB51, 0x8E00, 0xBC20, 0x201A, 0x8E00, 0xFA10, 0xB310, 0x0008, 0x8FF6,
- 0x7040, 0x0FD5, 0x8C03, 0xA300, 0x0082, 0xCFD5, 0x8E00, 0x8EC0, 0xE9FE, 0x8E00, 0xE902,
- 0x8E00, 0xDFC0, 0xDFF5, 0xBC02, 0x05A2, 0xA200, 0x0087, 0x2680, 0x8F0C, 0xBC20, 0x2040,
- 0x7000, 0x4FC3, 0x700F, 0xBB11, 0x4042, 0xA303, 0x0089, 0xA31E, 0x0087, 0xA301, 0x0086,
- 0xFB12, 0xA200, 0x0084, 0x8EA0, 0xBC20, 0x02C7, 0xA300, 0x009B, 0xBC02, 0x00A7, 0x3E01,
- 0xBC20, 0x2008, 0xBC21, 0x033D, 0xA202, 0x0083, 0xFB11, 0x8EA2, 0xBC20, 0x2008, 0x7000,
- 0x4FF5, 0xBC22, 0x201A, 0x7040, 0x3B11, 0xFA51, 0x2248, 0x8F00, 0xA300, 0x0082, 0x8EC0,
- 0xE9FE, 0x8E00, 0xE902, 0x8E00, 0xDFD5, 0xBC02, 0x0480, 0xBC20, 0x02B3, 0xA300, 0x009B,
- 0xBC02, 0x00A7, 0x3E01, 0xBC20, 0x2008, 0xBC21, 0x03F7, 0xBC22, 0x2018, 0x7008, 0x3B11,
- 0x7050, 0x3B50, 0xBC21, 0x2019, 0x8C2E, 0xFB30, 0xA200, 0x0081, 0x2601, 0x8F04, 0xBC21,
- 0x8000, 0xBC20, 0x2023, 0x8C24, 0xFB11, 0xBC02, 0x01BE, 0xA200, 0x0085, 0x4001, 0xA301,
- 0x0081, 0x2682, 0x8F02, 0x4100, 0xA300, 0x0082, 0xBC02, 0x1E58, 0xBC20, 0x201A, 0x8E00,
- 0xFA10, 0xB310, 0x0008, 0x8F05, 0xBC20, 0x2019, 0x4161, 0x7008, 0x3B11, 0xA300, 0x0085,
- 0xBC02, 0x077A, 0xBC20, 0x2023, 0xBC21, 0x8000, 0xFB11, 0xA200, 0x0082, 0x2604, 0x8FCE,
- 0x3E02, 0x7000, 0x4FD5, 0xBC20, 0x2008, 0x8EC0, 0xE9FE, 0xFB11, 0xE902, 0xA200, 0x0098,
- 0x6CE0, 0x1FD5, 0x8F57, 0xBC02, 0x0918, 0xBC20, 0x01AE, 0xBC02, 0x09F0, 0xA200, 0x02A7,
- 0x2682, 0x8F02, 0xBC20, 0x01AE, 0xBC02, 0x0D50, 0xA200, 0x008E, 0x2606, 0x8F1E, 0x2604,
- 0x8F17, 0x2602, 0x8F0B, 0x2600, 0x8F05, 0xA200, 0x008D, 0x2680, 0x8F20, 0xBC02, 0x0BDE,
- 0x8D1F, 0xBC02, 0x0E6E, 0x8D1C, 0xBC20, 0x2032, 0x4101, 0xFA10, 0x0801, 0xA300, 0x01E3,
- 0xBC02, 0x0A17, 0x8D12, 0xBC02, 0x0AA2, 0xBC02, 0x0CA4, 0x8D0D, 0xA200, 0x0085, 0x2601,
- 0x8F05, 0xA200, 0x02C7, 0x2601, 0x8F01, 0xBC02, 0x0B48, 0x8D02, 0xBC02, 0x0B2B, 0xA201,
- 0x01BE, 0xBC20, 0x01AE, 0xBC02, 0x0A72, 0xBC20, 0x01E7, 0xBC02, 0x0B04, 0xA200, 0x0266,
- 0x2680, 0xBC20, 0x01E7, 0x8F03, 0xBC21, 0x7FFF, 0xBC02, 0x0B8C, 0x8D04, 0xA201, 0x01FF,
- 0xBC02, 0x0B8C, 0xBC02, 0x0C54, 0xA200, 0x0099, 0x2600, 0x8F02, 0xBC02, 0x195E, 0xBC02,
- 0x1926, 0xA200, 0x009A, 0x2600, 0x8F02, 0xB000, 0xFFFF, 0xA300, 0x009A, 0xBC20, 0x2040,
- 0x4021, 0xFA10, 0x0801, 0x2600, 0x8F0A, 0xBC20, 0x2023, 0xBC21, 0x4000, 0xFA10, 0x0801,
- 0x2680, 0x8F02, 0xA200, 0x009A, 0x2600, 0x8F15, 0x3E02, 0x4000, 0xA300, 0x0099, 0x3E01,
- 0xBC20, 0x2008, 0xBC21, 0x0080, 0xFA12, 0x0851, 0x2610, 0x8F0B, 0xFA11, 0xBC22, 0xFF7F,
- 0x084A, 0x7000, 0x3B11, 0xBC02, 0x05B3, 0x8D03, 0x4020, 0xA300, 0x0099, 0x7038, 0x4FD5,
- 0xA200, 0x008E, 0xE9FE, 0x3401, 0x8EC0, 0x0801, 0xA300, 0x008E, 0x4020, 0xBC21, 0x00C0,
- 0xA300, 0x0091, 0xA300, 0x0092, 0xA301, 0x0098, 0x8EC0, 0xA300, 0x0090, 0xA300, 0x008F,
- 0xE918, 0x8E00, 0xDD05, 0xBC25, 0x2096, 0xDD5B, 0xFAB5, 0xA205, 0x009B, 0xDD7A, 0xDD9F,
- 0xDDBE, 0xDDDD, 0xDDFC, 0xDE0B, 0xDE2C, 0xDE49, 0xDE68, 0xDE8F, 0xDEAE, 0xDED5, 0xDEE6,
- 0xDF04, 0xDF23, 0xDF42, 0xDF61, 0xDF80, 0xDD27, 0xF9FC, 0x8EA5, 0xBC20, 0x2096, 0xBC21,
- 0x00FF, 0xFA10, 0x6220, 0x4D05, 0xA203, 0x0096, 0x6854, 0xCD27, 0x6624, 0xCF80, 0xA302,
- 0x0096, 0xCF61, 0xCF42, 0xCF23, 0xCF04, 0xCEE6, 0xCDFC, 0xCDDD, 0xCDBE, 0xCD9F, 0xCD7A,
- 0xCD5B, 0xF8FC, 0xCED5, 0xCEAE, 0xCE8F, 0xCE68, 0xCE49, 0xCE2C, 0xCE0B, 0xE9E8, 0x8EC8,
- 0xBC20, 0x2102, 0xBC21, 0x8000, 0xFA10, 0x0801, 0x6980, 0x2902, 0x8F07, 0xDFD5, 0xBC02,
- 0x02DB, 0xBC20, 0x02DB, 0xCFD5, 0xA300, 0x009B, 0x8EC0, 0xE9FE, 0x8E00, 0xBC20, 0x2104,
- 0xBC21, 0x8000, 0xFA10, 0x0801, 0x6980, 0x2902, 0x8F07, 0xDFD5, 0xBC02, 0x0423, 0xBC20,
- 0x0423, 0xCFD5, 0xA300, 0x009B, 0x8EC0, 0xE9FE, 0x8E00, 0xE906, 0xA202, 0x0090, 0x69A8,
- 0x1F95, 0x8F19, 0xBC24, 0x2081, 0xBC23, 0x2082, 0xFA95, 0xBC24, 0x2015, 0xFA73, 0xA21A,
- 0x0461, 0xA21E, 0x046B, 0xA210, 0x0361, 0xFA94, 0xA305, 0x02CA, 0xA303, 0x02CB, 0xA310,
- 0x02C8, 0xA31A, 0x02C9, 0xA304, 0x02CC, 0xA31E, 0x02CD, 0x26A6, 0x8F32, 0xBC23, 0x027F,
- 0xBC24, 0x026F, 0x4022, 0xBD10, 0x0306, 0xE205, 0xE585, 0xA21C, 0x02C8, 0xA21A, 0x02CA,
- 0xA21E, 0x02CB, 0xA210, 0x02C9, 0xA205, 0x02CC, 0xA203, 0x02CD, 0xA204, 0x0081, 0xA31C,
- 0x02C2, 0xA310, 0x02C3, 0xA31A, 0x02C4, 0xA31E, 0x02C5, 0xA305, 0x02C6, 0xA303, 0x02C7,
- 0x2640, 0x8F03, 0xA203, 0x0095, 0x34D9, 0xA303, 0x0095, 0xA203, 0x0098, 0xA302, 0x0081,
- 0x3230, 0x8F02, 0xB026, 0xFFFF, 0xA302, 0x0098, 0xA200, 0x028F, 0x421E, 0x403A, 0xBC3C,
- 0x027F, 0xBC22, 0x2033, 0xE064, 0xBC23, 0x2034, 0xE065, 0xFB54, 0xFB75, 0xA300, 0x028F,
- 0xBC02, 0x1BC3, 0xBC22, 0x3105, 0xA200, 0x0313, 0x700E, 0xBA52, 0x3BC2, 0xBC22, 0x2139,
- 0xBC3C, 0x02E0, 0xBD05, 0x0352, 0xFA53, 0xE463, 0xA202, 0x0099, 0x2620, 0xA300, 0x0313,
- 0x385A, 0x8F10, 0xBC23, 0x2008, 0xBC24, 0x0080, 0xFA75, 0x0B2C, 0xBC25, 0x2103, 0xFB74,
- 0xFAB3, 0xBC24, 0x4000, 0x08DC, 0x2630, 0x8F01, 0xBC02, 0x15BE, 0x4022, 0xA203, 0x0091,
- 0x26B0, 0x8F05, 0xBC20, 0x2012, 0xBC21, 0x2014, 0xBC02, 0x106C, 0x4022, 0xA203, 0x0093,
- 0xB306, 0x0011, 0x4003, 0x1893, 0xA204, 0x0091, 0x6D28, 0x5FA2, 0x4244, 0x2214, 0x18DA,
- 0xA202, 0x008F, 0x2620, 0xA303, 0x0091, 0x8F67, 0x2621, 0x8F53, 0x2622, 0x8F2B, 0x26A3,
- 0x8F26, 0xBC02, 0x118C, 0xCFA2, 0x2620, 0xBC20, 0x2015, 0x8F0E, 0xA201, 0x0097, 0xBC02,
- 0x101D, 0xBC02, 0x1391, 0xBC02, 0x1DAA, 0xA202, 0x0097, 0x2622, 0x4043, 0x8F00, 0x34D1,
- 0xA303, 0x0097, 0xA202, 0x0093, 0x3511, 0x4242, 0x21E2, 0xA203, 0x0094, 0x4005, 0x34D9,
- 0x192C, 0x4062, 0x08DA, 0xA304, 0x0093, 0x8C51, 0xA303, 0x0094, 0x8C4E, 0x4062, 0x3854,
- 0xB004, 0xFFFB, 0xDFC0, 0xBC02, 0x121B, 0x6E15, 0x0FC0, 0xB014, 0xFFFA, 0xDFC1, 0xBC02,
- 0x1277, 0xBC02, 0x12BC, 0xCFC0, 0xBC21, 0x0464, 0xBC02, 0x1326, 0x7018, 0x8FA3, 0x2630,
- 0x8F33, 0xA201, 0x0097, 0xBC20, 0x2013, 0xBC02, 0x1037, 0xA201, 0x0097, 0xBC20, 0x200B,
- 0xBC02, 0x1092, 0x4062, 0x8D27, 0xBC02, 0x118C, 0xBC02, 0x11E4, 0xBC02, 0x1B03, 0x7018,
- 0x8FA3, 0x2630, 0x8F1B, 0xA201, 0x0097, 0xBC20, 0x2011, 0xBC02, 0x10B6, 0x4062, 0x8D15,
- 0xBC02, 0x12BC, 0xCFA2, 0x2620, 0x8F00, 0xBC02, 0x1E00, 0xBC02, 0x10FF, 0xA202, 0x0094,
- 0x26A0, 0x4062, 0x8F05, 0xA203, 0x047B, 0x2630, 0x8F01, 0xBC02, 0x115E, 0x4062, 0xA204,
- 0x008F, 0xA203, 0x0090, 0x6D48, 0x4F95, 0x34D9, 0x40E6, 0xA205, 0x008D, 0x08DE, 0x08A2,
- 0x26D0, 0xA303, 0x0090, 0xA302, 0x008F, 0x8F04, 0xBC22, 0x31F8, 0xDF95, 0xFA52, 0x8EA2,
- 0xCF95, 0x8E00, 0x8EC0, 0xE9FA, 0x8E00, 0xE902, 0xA200, 0x0092, 0xDFC0, 0xDFF5, 0xBC02,
- 0x10DC, 0xCFC0, 0xB300, 0x0044, 0x8F2B, 0xA201, 0x0097, 0xB300, 0x0045, 0x8F21, 0xB300,
- 0x0046, 0x8F14, 0xCFC0, 0xB310, 0x0047, 0x8F21, 0xA200, 0x0470, 0x2680, 0x8F00, 0xBC02,
- 0x0F91, 0xBC02, 0x1DAA, 0xA200, 0x0097, 0x2602, 0x4041, 0x8F00, 0x3441, 0xA301, 0x0097,
- 0x8D12, 0xBC20, 0x2013, 0xBC02, 0x1037, 0xA201, 0x0097, 0xBC20, 0x200B, 0xBC02, 0x1092,
- 0x8D07, 0xBC20, 0x2011, 0xBC02, 0x10B6, 0x8D02, 0xBC02, 0x1E00, 0x7240, 0x4FC0, 0x6D00,
- 0x4FF5, 0x21C1, 0x4001, 0x1808, 0xA201, 0x008D, 0x2690, 0xA300, 0x0092, 0x8F04, 0xBC20,
- 0x31F8, 0xDFD5, 0xFA10, 0x8EA0, 0xCFD5, 0x8E00, 0x8EC0, 0xE9FE, 0x8E00, 0xBC20, 0x009C,
- 0xBC21, 0x047C, 0x0448, 0x3489, 0x32A0, 0x4001, 0x8F01, 0x8B02, 0xE401, 0x8EB8, 0xE902,
- 0x8E00, 0xDFD5, 0xBC02, 0x0474, 0xBC20, 0x3173, 0xBC21, 0x3010, 0xBC24, 0x02A8, 0xBC22,
- 0x2032, 0x7014, 0x3A10, 0x4085, 0x700F, 0x3A31, 0xA300, 0x01E5, 0xFA53, 0xBC40, 0x1605,
- 0xA301, 0x0467, 0x4100, 0xBC40, 0x1E10, 0xBC40, 0x2610, 0x6206, 0x2610, 0xFA51, 0x6213,
- 0x6650, 0xBC3A, 0x0184, 0xBC3E, 0x01C0, 0x4503, 0x4444, 0xBC2E, 0x0160, 0xBC2F, 0x0170,
- 0xB048, 0x009C, 0xB056, 0x009C, 0xA300, 0x01E3, 0xA301, 0x01F7, 0xA31C, 0x0468, 0xA31C,
- 0x0461, 0xA31C, 0x045C, 0xA30E, 0x016E, 0xA30F, 0x017E, 0xA31A, 0x01AC, 0xA31A, 0x01AD,
- 0xA31E, 0x01E0, 0xA31E, 0x01E1, 0xA304, 0x015E, 0xA305, 0x015F, 0xBC20, 0x3136, 0xBC21,
- 0x3163, 0xBD04, 0x04D2, 0xFA04, 0xFB24, 0xFA0C, 0xFB24, 0xBD04, 0x04D8, 0xFA0C, 0xFB24,
- 0xBC20, 0x31B2, 0x7717, 0xBA51, 0x7006, 0xBA14, 0x38BC, 0x084D, 0xB048, 0x319C, 0xA301,
- 0x0266, 0xBC20, 0x0200, 0xFA91, 0xB040, 0x0050, 0xB060, 0x0010, 0xA304, 0x0261, 0xA300,
- 0x0260, 0xA306, 0x0262, 0xFA52, 0x4044, 0x1609, 0x41E6, 0x0894, 0x1406, 0xB4F2, 0x0001,
- 0x0B07, 0xBC20, 0x01F9, 0xA302, 0x02A7, 0xBC40, 0x1C01, 0xBC40, 0x3401, 0x144E, 0x24A1,
- 0xBC24, 0x029A, 0xBC40, 0x140C, 0xBC21, 0x0267, 0xBC22, 0x0294, 0xBC3C, 0x4000, 0x6D79,
- 0x640E, 0xBC3F, 0x0285, 0xBC3B, 0x0290, 0xBC30, 0x2000, 0x7000, 0x244F, 0xBC40, 0x6607,
- 0xA31F, 0x028F, 0xA31B, 0x0293, 0xBC40, 0x0C9C, 0xBC40, 0x149C, 0xBC40, 0x151E, 0xBC40,
- 0x2C80, 0xBC40, 0x3490, 0xBC40, 0x3C9A, 0xBC40, 0x2D10, 0xBC40, 0x1D03, 0x40A7, 0xBC02,
- 0x05B3, 0xB04A, 0x0318, 0xBC23, 0x30FD, 0xBC22, 0x30FF, 0xA304, 0x0325, 0xFA74, 0xFA52,
- 0x04F2, 0xBC21, 0x02E0, 0x3589, 0xB00E, 0x0318, 0xA306, 0x0312, 0xA300, 0x0326, 0xBC26,
- 0x30FC, 0xBC20, 0x3102, 0xFAD6, 0xFA10, 0xA306, 0x0360, 0x14AA, 0x1428, 0x14EB, 0xA304,
- 0x035F, 0xBC26, 0x2021, 0x35CD, 0xBC25, 0x0327, 0xBC24, 0x07C0, 0xBC3E, 0x7FFF, 0xBC3A,
- 0x0320, 0xB012, 0x0019, 0xB024, 0xFFFF, 0xB000, 0xFFFF, 0x6D4B, 0x3BD4, 0xA305, 0x0354,
- 0xA31E, 0x047A, 0xA31A, 0x02DC, 0xA301, 0x0314, 0xA307, 0x0313, 0xA304, 0x0353, 0xA302,
- 0x0363, 0xA303, 0x0364, 0xA300, 0x0365, 0xBC02, 0x0263, 0xBC02, 0x07A4, 0xBC20, 0x2023,
- 0xBC21, 0x4000, 0x700F, 0xBA10, 0x0801, 0x2680, 0x8F09, 0xBC20, 0x2040, 0x7008, 0x4FD5,
- 0xFA10, 0x0801, 0x2600, 0x8F10, 0xA301, 0x0099, 0x8D0F, 0xBC20, 0x2008, 0xBC21, 0xFF7F,
- 0x7007, 0x3A12, 0x6214, 0x4FD5, 0xA31C, 0x0099, 0xA31C, 0x02A7, 0xA31E, 0x008D, 0xFB11,
- 0x8EC0, 0xE9FE, 0x8E00, 0xE902, 0x8E00, 0xDFD5, 0xBC02, 0x0474, 0x6914, 0x4FD5, 0x4020,
- 0xE9FE, 0xA309, 0x008B, 0xA309, 0x008C, 0xA300, 0x00A0, 0xBC00, 0x0263, 0xBC22, 0x036A,
- 0xBC21, 0x044C, 0x044A, 0x3509, 0x32C0, 0x4001, 0x4023, 0x8F01, 0x8B04, 0xE501, 0x2680,
- 0x8F02, 0xBC22, 0x2040, 0x8E00, 0xFB51, 0xBC22, 0x305A, 0x40BC, 0x703F, 0xBA52, 0xBC3A,
- 0x0376, 0xBC2E, 0x0399, 0x4FEF, 0xBC28, 0x03A8, 0x2680, 0x149A, 0x4270, 0xA31E, 0x0372,
- 0xA31A, 0x0375, 0xA310, 0x0395, 0xA31C, 0x0396, 0xA31C, 0x0397, 0xA30E, 0x0398, 0xA30F,
- 0x03B8, 0xA308, 0x03A6, 0xA302, 0x03A5, 0xBC20, 0x2040, 0x8F01, 0x4042, 0xFB12, 0xBC20,
- 0x3079, 0xBC3E, 0x03DC, 0xBC3A, 0x041A, 0xBC24, 0x2044, 0xFA03, 0xBC30, 0x03F1, 0xA31E,
- 0x03DB, 0xA31A, 0x0442, 0xA310, 0x03F0, 0xFB91, 0xA301, 0x03E2, 0xA303, 0x03E0, 0xBC22,
- 0x2043, 0x8EC0, 0xA300, 0x03E1, 0xFB51, 0xE902, 0xA200, 0x008C, 0xA201, 0x0082, 0x6980,
- 0x5FD5, 0x8F16, 0x2611, 0x8F14, 0x2612, 0x8F11, 0xBC20, 0x201A, 0x4201, 0xFA10, 0x0801,
- 0x2680, 0x8F00, 0xBC02, 0x06A8, 0xBC20, 0x201F, 0xBC21, 0x03FF, 0xFA10, 0x0801, 0xBC22,
- 0x2002, 0x8C06, 0xFB50, 0xBC20, 0x2002, 0xA201, 0x0089, 0xFB11, 0xBC20, 0x2000, 0x4021,
- 0xFB11, 0xFA11, 0x2693, 0x8FFC, 0x8E00, 0xBC20, 0x2000, 0x4001, 0xBC22, 0x2020, 0x7010,
- 0x3B11, 0xFA51, 0x0808, 0x2600, 0x4021, 0x8F0C, 0xBC20, 0x2001, 0x8E00, 0xFB11, 0xFA11,
- 0x2693, 0x8FFC, 0x8E00, 0x7000, 0x4FD5, 0xBC20, 0x2001, 0x8C02, 0xFB11, 0xCFD5, 0x8E00,
- 0x8EC0, 0xE9FE, 0x8E00, 0xBC20, 0x201B, 0x4022, 0xFA10, 0x4381, 0x0902, 0x0841, 0x4043,
- 0x2640, 0x0803, 0x124B, 0xA204, 0x0089, 0xBC23, 0x201D, 0x8F10, 0x0461, 0xFA73, 0xA301,
- 0x0089, 0x218B, 0x8F1A, 0x2600, 0xBC20, 0x201C, 0x8F03, 0xFA10, 0x8C15, 0xA300, 0x0089,
- 0xA302, 0x0086, 0x8D10, 0xBC25, 0x201C, 0x0061, 0xFAB4, 0xA301, 0x0089, 0x208C, 0x8F07,
- 0x2600, 0x8F03, 0xFA70, 0x8C04, 0xA300, 0x0089, 0xA302, 0x0086, 0xBC20, 0x201F, 0xBC21,
- 0x03FF, 0xFA10, 0xA203, 0x0089, 0x0801, 0x2258, 0x8F03, 0x8EC0, 0xA302, 0x0086, 0x8E00,
- 0x8EB8, 0xBC20, 0x201B, 0x4381, 0xFA10, 0x0801, 0xA201, 0x0089, 0xB480, 0x0002, 0xBC22,
- 0x201C, 0x0008, 0xFA51, 0x2001, 0xA300, 0x0089, 0x8F03, 0x8EC0, 0x4020, 0xA300, 0x0086,
- 0x8EB8, 0xE902, 0xBC22, 0x2000, 0xDFD5, 0x41A3, 0xBC02, 0x0723, 0x4344, 0xBC25, 0x0400,
- 0x2620, 0x8F05, 0xBC02, 0x07F0, 0x5404, 0x4025, 0xBC02, 0x07F0, 0x8D06, 0xBC02, 0x07FB,
- 0x5404, 0x4025, 0xBC02, 0x07FB, 0xBC02, 0x072A, 0x4E20, 0xBC02, 0x07B8, 0xBC20, 0x0001,
- 0x0848, 0xB412, 0x0000, 0xBC22, 0x1000, 0x4183, 0xBC02, 0x0723, 0x220A, 0x8F3F, 0xDFE2,
- 0xBC21, 0x2098, 0x41C2, 0xFA33, 0x0ADA, 0xFB33, 0x4060, 0x4841, 0xBC02, 0x07D8, 0xBC21,
- 0x2098, 0x4202, 0xBC20, 0xFFFE, 0x0ADA, 0xFB33, 0x08D8, 0xFB33, 0x4E20, 0xBC02, 0x07B8,
- 0xBC22, 0xFFFE, 0x084A, 0xCFE2, 0x0A4A, 0xBC02, 0x07CA, 0x4224, 0xBC25, 0x4000, 0xBC02,
- 0x07FB, 0x4044, 0x4045, 0xBC02, 0x07FB, 0x4284, 0x4105, 0xBC02, 0x07FB, 0x4284, 0x4105,
- 0xBC02, 0x07F0, 0xCFE0, 0xBC02, 0x0733, 0x4E24, 0x4045, 0xBC02, 0x07FB, 0x4E24, 0x4045,
- 0xBC02, 0x07F0, 0xBC20, 0x2098, 0x43E1, 0xFB11, 0x4021, 0xFB11, 0xBC22, 0x4000, 0x41C3,
- 0xBC02, 0x0723, 0x38A2, 0x4E20, 0xBC02, 0x07B8, 0xB55A, 0x0002, 0x0A4D, 0xBC02, 0x07CA,
- 0xCFD5, 0xE9FE, 0x8EB8, 0xBC20, 0x201F, 0x8E00, 0xFA10, 0x0890, 0x1093, 0x8EB8, 0xE902,
- 0x4E24, 0xDFD5, 0x4085, 0xBC02, 0x07FB, 0xCFD5, 0xE9FE, 0x8EB8, 0xE902, 0xBC21, 0x202D,
- 0xDFD5, 0xDFE0, 0x4280, 0xBC02, 0x07CA, 0xBC22, 0x8018, 0xBC23, 0x8098, 0xCFE0, 0x2600,
- 0x1853, 0x42C0, 0xBC02, 0x07CA, 0x4240, 0xBC21, 0xE419, 0xBC02, 0x07CA, 0x4260, 0xBC21,
- 0x9010, 0xBC02, 0x07CA, 0x4040, 0xBC21, 0x0FFB, 0xBC02, 0x07CA, 0x4220, 0xBC21, 0x2020,
- 0xBC02, 0x07CA, 0xBC20, 0x0005, 0x4461, 0xBC02, 0x07D8, 0x4220, 0xBC21, 0x1020, 0xBC02,
- 0x07CA, 0xBC20, 0x0005, 0x4461, 0xBC02, 0x07D8, 0x4220, 0xBC21, 0x4020, 0xBC02, 0x07CA,
- 0xBC20, 0x0064, 0x4461, 0xBC02, 0x07D8, 0x4520, 0xBC21, 0x8001, 0xBC02, 0x07CA, 0xCFD5,
- 0xE9FE, 0x8EB8, 0xE902, 0xBC20, 0x2023, 0xDFD5, 0xFA16, 0xBC20, 0x2000, 0x09B0, 0xDFE6,
- 0x4060, 0xBC02, 0x07B8, 0xBC22, 0x39AE, 0xBC23, 0x19AE, 0xCFE6, 0x2660, 0x195A, 0x220D,
- 0x8F02, 0x3825, 0xBC02, 0x07CA, 0x4480, 0xBC02, 0x07B8, 0xBC22, 0x0000, 0xBC23, 0x0001,
- 0xCFE6, 0x2660, 0x195A, 0x220D, 0x8F02, 0x3825, 0xBC02, 0x07CA, 0xCFD5, 0xE9FE, 0x8EB8,
- 0xE902, 0x4E04, 0x4805, 0xDFD5, 0xBC20, 0x2023, 0xBC21, 0x4000, 0xFA10, 0x0801, 0x2600,
- 0x8F01, 0xBC02, 0x07FB, 0x8D02, 0xBC02, 0x07F0, 0xCFD5, 0xE9FE, 0x8EB8, 0xBC22, 0x209A,
- 0xBC23, 0x0100, 0x0AD8, 0xBC21, 0x209D, 0xFB53, 0x4043, 0xFA32, 0x0893, 0x26A0, 0x8FFA,
- 0xBC22, 0x209C, 0x8E00, 0xFA51, 0x8EB8, 0xBC22, 0x209A, 0xBC23, 0x209B, 0xFB50, 0xBC22,
- 0x209D, 0xFB71, 0x4023, 0xFA51, 0x084B, 0x2690, 0x8FFB, 0x8EB8, 0xBC08, 0x07E6, 0x8E00,
- 0xBDC8, 0x07E5, 0x8E00, 0xBC09, 0x07E4, 0x8E00, 0x8E00, 0x8E00, 0x8E00, 0x8E00, 0x8E00,
- 0x8E00, 0x8EB8, 0xBC08, 0x07EE, 0x8E00, 0xBC09, 0x07ED, 0x8E00, 0x8E00, 0x8EB8, 0xE902,
- 0x3804, 0xDFD5, 0xBC02, 0x07B8, 0x0A4D, 0xBC02, 0x07CA, 0xCFD5, 0xE9FE, 0x8EB8, 0xE902,
- 0x1745, 0xDFD5, 0x3804, 0xBC02, 0x07B8, 0x084D, 0xBC02, 0x07CA, 0xCFD5, 0xE9FE, 0x8EB8,
- 0xBC20, 0x201A, 0x4201, 0xFA10, 0x0801, 0x2600, 0x8F00, 0x8EB8, 0xE902, 0x4020, 0xDFD5,
- 0xBC21, 0x1F2A, 0xBC02, 0x07CA, 0xBC20, 0x01F4, 0x4461, 0xBC02, 0x07E8, 0x4000, 0xBC21,
- 0x402D, 0xBC02, 0x07CA, 0x4280, 0x4461, 0xBC02, 0x07E8, 0x4000, 0xBC21, 0x5FED, 0xBC02,
- 0x07CA, 0x4020, 0xBC21, 0x1F6A, 0xBC02, 0x07CA, 0x4280, 0x4461, 0xBC02, 0x07E8, 0x4000,
- 0xBC21, 0x7FED, 0xBC02, 0x07CA, 0x4500, 0x4461, 0xBC02, 0x07E8, 0xBC20, 0x2023, 0xBC22,
- 0x39AE, 0xBC23, 0x19AE, 0xFA10, 0xBC21, 0x2000, 0x0841, 0x38C1, 0x2610, 0x185A, 0x4060,
- 0xBC02, 0x07CA, 0x4040, 0xBC21, 0x0FF9, 0xBC02, 0x07CA, 0xBC20, 0x000A, 0x4461, 0xBC02,
- 0x07E8, 0x4022, 0x4003, 0x2660, 0x1853, 0x4480, 0xBC02, 0x07CA, 0x4540, 0xBC02, 0x07B8,
- 0xDFE1, 0x40C0, 0x4202, 0x41E3, 0x4104, 0xBC25, 0x31EC, 0x41E6, 0xBC02, 0x08EC, 0x41C0,
- 0xBC24, 0x87FF, 0x4166, 0xBC02, 0x08F9, 0xCFE1, 0x4000, 0x4402, 0x43E3, 0x4164, 0xBC25,
- 0x31ED, 0x43E6, 0xBC02, 0x08EC, 0xDFE5, 0x4180, 0xBC24, 0xFF07, 0x4066, 0xBC02, 0x08F9,
- 0xCFE5, 0x40E0, 0xBC24, 0xFFE0, 0x4006, 0xBC02, 0x08F9, 0x4000, 0xBC02, 0x0733, 0xBC20,
- 0x2098, 0x43E1, 0xFB11, 0x4021, 0xFB11, 0x4500, 0x4401, 0xBC02, 0x07CA, 0x4140, 0xBC21,
- 0x0841, 0xBC02, 0x07CA, 0xBC20, 0x01F4, 0x4841, 0xBC02, 0x07E8, 0x4140, 0xBC21, 0x0840,
- 0xBC02, 0x07CA, 0x4500, 0x4001, 0xBC02, 0x07CA, 0xBC21, 0x2023, 0xBC22, 0x0400, 0xFA31,
- 0x084A, 0x2610, 0x8F0A, 0x5364, 0x4065, 0xBC02, 0x07F0, 0x4AC0, 0x4021, 0xBC02, 0x07CA,
- 0xBC21, 0x1FFA, 0x8D02, 0xBC21, 0x1FFB, 0x4040, 0xBC02, 0x07CA, 0x4C80, 0x4841, 0xBC02,
- 0x07E8, 0x41E0, 0xBC21, 0x4042, 0xBC02, 0x07CA, 0xBC02, 0x07A4, 0x4E80, 0x4021, 0xBC02,
- 0x07CA, 0x4E60, 0xBC21, 0x0480, 0xBC02, 0x07CA, 0x5380, 0xBC21, 0xAB40, 0xBC02, 0x07CA,
- 0x4102, 0x4503, 0xBC24, 0x2023, 0xBC25, 0x0400, 0xFA94, 0x0925, 0x2640, 0x1853, 0x53C0,
- 0xBC02, 0x07CA, 0x4E04, 0x4025, 0xBC02, 0x07FB, 0xCFD5, 0xE9FE, 0x8EB8, 0x1048, 0x0891,
- 0x08D9, 0x2620, 0x1863, 0xFAB2, 0x004A, 0x4002, 0x3210, 0x1851, 0x210E, 0x1971, 0x8EB8,
- 0xE901, 0x8E00, 0xDFF5, 0xBC02, 0x07B8, 0x0861, 0x316E, 0x0A4D, 0xBC02, 0x07CA, 0xCFF5,
- 0xE9FF, 0x8EB8, 0xBC20, 0x209F, 0xBC21, 0x31DB, 0xA300, 0x047E, 0xA301, 0x047D, 0xBD11,
- 0x0911, 0xFA22, 0xFB02, 0x8EC0, 0xA300, 0x047E, 0xA301, 0x047D, 0x0000, 0x6915, 0xA908,
- 0xA21B, 0x0180, 0xA21E, 0x017E, 0xA21D, 0x016E, 0xBC3C, 0x3116, 0xBC30, 0x311D, 0x7016,
- 0xDF1B, 0xA204, 0x017F, 0xA202, 0x0181, 0xA203, 0x0182, 0xA201, 0x01AD, 0x6915, 0x1F3D,
- 0x77F6, 0x9F5E, 0xBC26, 0x3106, 0xDF70, 0xDF9C, 0xBD08, 0x09DB, 0xA200, 0x015E, 0xBC3C,
- 0x009C, 0xBC3E, 0x00C2, 0xA304, 0x017F, 0x6E7B, 0x9FA1, 0x6E43, 0xBAC5, 0x6E4B, 0xBE18,
- 0x396C, 0x8A0E, 0xBF95, 0x8A18, 0x77E6, 0x9FC6, 0x6A91, 0x7AD5, 0x7077, 0xFE18, 0x6A91,
- 0x4F86, 0x88D0, 0x6E62, 0xFAC7, 0x6E7A, 0x5FE0, 0x39C8, 0x8890, 0xBC3D, 0x0170, 0x6FCA,
- 0x4F41, 0x6910, 0xBAC5, 0x6910, 0xFF38, 0x7016, 0xBE38, 0x2A47, 0x6A91, 0xFE38, 0xBF95,
- 0x8A38, 0x6A91, 0x7AC7, 0xBF95, 0x8A38, 0xBF9D, 0x8E38, 0xBF95, 0xAA38, 0x2A47, 0x6A91,
- 0xFE38, 0x2A45, 0x88D0, 0x398B, 0x39E9, 0x39C8, 0x88F0, 0xB06C, 0xFFFA, 0x613E, 0xDF86,
- 0xBC26, 0x7ADD, 0xBCB7, 0x8000, 0x04AA, 0xBC26, 0x7ADD, 0xBCA5, 0x8000, 0xA300, 0x015E,
- 0x6025, 0x0F00, 0x6FCB, 0xCFC4, 0x6036, 0x0FE0, 0xB048, 0xFFF1, 0x6910, 0xBF38, 0x6910,
- 0xDF41, 0xFA86, 0x6960, 0x3E18, 0x8A0E, 0xBF99, 0x0C18, 0x7076, 0x9F07, 0x6A91, 0xBA96,
- 0x7016, 0xBE18, 0x2A46, 0x88E0, 0x398B, 0x39E9, 0x39C8, 0x88F0, 0xA300, 0x015E, 0x7077,
- 0x8F20, 0xBC3C, 0x0160, 0x6FCD, 0xCF66, 0x6910, 0xBF18, 0x6910, 0xFAC7, 0x7147, 0xFE18,
- 0x2A47, 0xBF9D, 0x8E18, 0xBF9D, 0x8E18, 0x2A47, 0xBF9D, 0x8E18, 0xBF9D, 0x8E18, 0xBF9D,
- 0x8E18, 0x2A47, 0xBF9D, 0xAE18, 0x2A47, 0x88F0, 0xB06C, 0xFFFA, 0x6E62, 0xDF66, 0x39E9,
- 0x39C8, 0x88E0, 0x0E7A, 0x3F3E, 0x63EC, 0xFF18, 0x6FC3, 0x8FA1, 0xBC3D, 0x0184, 0xB068,
- 0xFFF1, 0x6915, 0xBF38, 0x6915, 0x1F20, 0x5FDA, 0x3885, 0xCF1E, 0xCF50, 0xA310, 0x017E,
- 0xA301, 0x01AD, 0xA304, 0x017F, 0xA302, 0x0181, 0xA31E, 0x0180, 0xA303, 0x0182, 0xCF3B,
- 0x8EC0, 0xE9F8, 0xA31B, 0x016E, 0x0000, 0x2451, 0xA201, 0x01AC, 0x3909, 0xBC22, 0x3124,
- 0x2453, 0xBC3D, 0x0184, 0x451F, 0xBD08, 0x0A11, 0x77F6, 0xFA43, 0x2442, 0x6960, 0x3E38,
- 0x8A0C, 0xBF8C, 0x8638, 0x2A43, 0x88B0, 0x398B, 0x39E9, 0x39C8, 0x88C0, 0x439B, 0x6E18,
- 0x2403, 0xB024, 0xFFF3, 0x6D06, 0xA444, 0x6910, 0xEA38, 0x8EC0, 0xA301, 0x01AC, 0x8E00,
- 0xBC20, 0x3131, 0xA201, 0x02C2, 0xFA10, 0x2600, 0x8F3E, 0xA200, 0x01E2, 0x2680, 0x8F39,
- 0x2610, 0xA200, 0x01BE, 0xB010, 0xFFFF, 0x8F2C, 0xA202, 0x01E3, 0x26A0, 0x8F28, 0xBC22,
- 0x02A8, 0xBC23, 0x3133, 0xBC24, 0x3132, 0xBC40, 0x3906, 0xFA73, 0xBC25, 0x3134, 0xBC27,
- 0x3135, 0xBC40, 0x3102, 0xFA94, 0x04F3, 0xFAB5, 0xFAF6, 0x04A2, 0x1095, 0x10DE, 0x1D1A,
- 0x4003, 0x3240, 0x3843, 0x8F02, 0xB228, 0x0040, 0x4803, 0x18DC, 0x2103, 0x8F05, 0x2183,
- 0x8F18, 0x3401, 0xA300, 0x01BE, 0x8D15, 0x8C14, 0xA301, 0x01BE, 0x3280, 0x4002, 0x8F0D,
- 0xA301, 0x01BE, 0x8D0C, 0x8C0B, 0x4002, 0x2690, 0x4800, 0x4002, 0x8F03, 0x8E00, 0x8C04,
- 0xA302, 0x01BE, 0xA300, 0x01BE, 0xA200, 0x01BE, 0x2600, 0xBC21, 0x2035, 0x4020, 0x8EC0,
- 0x1810, 0xFB30, 0x0000, 0x38E0, 0xA200, 0x01E1, 0xB202, 0x0040, 0x405A, 0xBC3C, 0x01C0,
- 0x441E, 0x8F0F, 0x6E11, 0xE800, 0xBD08, 0x0A88, 0x6D74, 0xA103, 0xE142, 0x1B1A, 0x0E9A,
- 0x3F14, 0x6E11, 0xFF18, 0x8E00, 0x8EC0, 0xA300, 0x01E1, 0x8E00, 0xB522, 0x0009, 0x3867,
- 0xBD08, 0x0A9D, 0x6D76, 0xA184, 0xE1C3, 0xBCB6, 0x8000, 0x8E00, 0x1B63, 0x0EE3, 0x3F1D,
- 0x6E19, 0xFF18, 0x8E00, 0x8EC0, 0xA300, 0x01E1, 0x8E00, 0xA200, 0x01F7, 0x2600, 0xA200,
- 0x01E4, 0x8F44, 0xA201, 0x01F8, 0x2690, 0x8F41, 0xBC21, 0x3173, 0xA202, 0x01E5, 0xFA31,
- 0x2191, 0x8F02, 0x3491, 0xA302, 0x01E5, 0xA202, 0x01E5, 0x2251, 0x8F33, 0xBC21, 0x02A8,
- 0xBC23, 0x316F, 0xBC25, 0x316C, 0xBC40, 0x4086, 0xFA73, 0xBC22, 0x316D, 0xBC24, 0x316E,
- 0x680C, 0xFAB3, 0xFA52, 0xFA94, 0x38A3, 0x8F04, 0xBC23, 0x3170, 0x8E00, 0xFA73, 0x2033,
- 0x18D4, 0xBC26, 0x3171, 0xBC40, 0x4881, 0xFAD6, 0x210E, 0x8F04, 0xBC25, 0x3172, 0x8E00,
- 0xFAB5, 0x210D, 0x1954, 0x1E5D, 0x2208, 0x401E, 0x8F0A, 0x2108, 0xA31E, 0x01E5, 0x8F03,
- 0x8E00, 0x8C05, 0xB000, 0xFFFF, 0x3401, 0x8D01, 0x4000, 0x40A1, 0x2801, 0xA300, 0x01E4,
- 0x382E, 0xB012, 0x3136, 0xBC20, 0x3163, 0xBD04, 0x0AFB, 0xFA22, 0xFB02, 0xFA2A, 0xFB02,
- 0xBD04, 0x0B01, 0xFA2A, 0xFB02, 0x8EB8, 0x0000, 0x2451, 0xA201, 0x01E0, 0x3909, 0xBC22,
- 0x3163, 0x2453, 0xBC3D, 0x01C0, 0x441F, 0xBD08, 0x0B25, 0x77F6, 0xFA43, 0x2442, 0x6960,
- 0x3E38, 0x8A08, 0xBF8C, 0x8638, 0x2A43, 0x88B0, 0x398B, 0x39E9, 0x39C8, 0x88C0, 0x429B,
- 0x6E18, 0x2403, 0xB024, 0xFFF7, 0x6D06, 0xA444, 0x6910, 0xEA38, 0x8EC0, 0xA301, 0x01E0,
- 0x8E00, 0xBC20, 0x31B2, 0x5FE1, 0xFA10, 0xB020, 0x319C, 0xB012, 0x319C, 0x0008, 0xBC23,
- 0x01F9, 0xFA10, 0xBC40, 0x1981, 0x6862, 0x3A52, 0xBC40, 0x3582, 0x8F06, 0xA200, 0x0085,
- 0x2681, 0x8F03, 0x8EC0, 0x4040, 0xA300, 0x0085, 0x8EB8, 0x0000, 0xBC21, 0x02A8, 0xBC23,
- 0x0263, 0xBC40, 0x4880, 0xBC40, 0x5084, 0x6E10, 0xE580, 0x7000, 0x25C4, 0xA203, 0x0266,
- 0xBC40, 0x5881, 0x2630, 0xBC40, 0x1501, 0x401C, 0x8F28, 0x3820, 0xB532, 0x0002, 0xB036,
- 0x3174, 0x3882, 0x6910, 0xBA65, 0x6960, 0x2206, 0x8A02, 0xBBD4, 0xCA86, 0x6A3D, 0x7A73,
- 0x88C0, 0x3215, 0x00E3, 0x8F05, 0xB416, 0x0002, 0x0441, 0x3214, 0x1801, 0x8C0A, 0x3B80,
- 0x3330, 0x8F04, 0x2614, 0x8F04, 0x8E00, 0x8CE1, 0x3449, 0x344D, 0x8DDE, 0xBC20, 0x31B2,
- 0x383C, 0xFA10, 0x2108, 0x1801, 0xB000, 0x319C, 0x8EC0, 0xFA10, 0xA300, 0x01FF, 0xBC25,
- 0x01F9, 0x34AB, 0xE904, 0xE143, 0x6122, 0xDF82, 0x3320, 0x8F02, 0xBC23, 0x31B4, 0x8C05,
- 0xFA73, 0xBC23, 0x31B3, 0x8E00, 0xFA73, 0x2813, 0xA201, 0x0260, 0xBC40, 0x268E, 0xBC40,
- 0x2E8F, 0x6D4A, 0xA29E, 0x700E, 0xE2DC, 0x7307, 0xDFDE, 0x6E7F, 0x224C, 0xCFCE, 0x6A34,
- 0xDFA5, 0x6E28, 0x2800, 0xBC3D, 0x0200, 0x6EE3, 0xE287, 0x88E0, 0xBD07, 0x0BC7, 0x6D00,
- 0x9FCE, 0xBCFF, 0x8000, 0x8E00, 0xE4E7, 0xE2C5, 0xBCDB, 0x8000, 0x6E7F, 0x0FCE, 0x6A34,
- 0xE4E5, 0x38A0, 0x88E0, 0x6EE3, 0xE287, 0xDFCE, 0xBCFF, 0x8000, 0xCF82, 0xE4E7, 0xE2C5,
- 0xBCDB, 0x8000, 0xE64C, 0xE4E5, 0xCFDF, 0xE546, 0xA301, 0x0260, 0xA31F, 0x01F9, 0xCFA3,
- 0x8EC0, 0xE9FC, 0xE5DC, 0x0000, 0xBC22, 0x31B7, 0x8E00, 0xFA52, 0x26A0, 0x8F04, 0x8EC0,
- 0xBC22, 0x6568, 0xA302, 0x0268, 0xA200, 0x0261, 0x403A, 0xBC3C, 0x0200, 0x4C1E, 0x8E00,
- 0xE062, 0xA300, 0x0261, 0x6904, 0xBC1B, 0x241B, 0xBD1E, 0x0BFA, 0x67A6, 0xBC1B, 0x241B,
- 0x1E9A, 0xBC3D, 0x0290, 0xA201, 0x0293, 0x3B7A, 0x407F, 0xBC23, 0x31B6, 0x6EE7, 0x64E2,
- 0xFA73, 0xA204, 0x02B0, 0xA300, 0x0261, 0xA301, 0x0293, 0x21A3, 0x8F2C, 0xA200, 0x0293,
- 0x407E, 0xBC23, 0x31B5, 0x7016, 0xBC1C, 0x1EA2, 0xB800, 0xE61C, 0x1EA2, 0x1E93, 0xB124,
- 0x0001, 0xBC23, 0x2000, 0xBCA4, 0xC000, 0xBC24, 0x3FFF, 0x24DA, 0xB056, 0xFFFF, 0x3095,
- 0x0562, 0xA300, 0x0293, 0x4004, 0xBD0B, 0x0C39, 0x33D0, 0xB56A, 0x0001, 0x8F02, 0xB548,
- 0x0001, 0x8C05, 0x0172, 0x3521, 0x0572, 0xB548, 0x0001, 0x8E00, 0x30A3, 0xA302, 0x0269,
- 0xA202, 0x0269, 0xA203, 0x0268, 0x0493, 0x3220, 0xBC23, 0x0400, 0x8F02, 0xBC23, 0x31B8,
- 0x8E00, 0xFA73, 0xBC24, 0x0267, 0x281A, 0xE643, 0x8EC0, 0xBC40, 0x260F, 0xBC40, 0x1E0E,
- 0x0000, 0xBC23, 0x0267, 0x349D, 0xE904, 0x6D57, 0xA15F, 0x6D27, 0xDF82, 0x700E, 0xA2DD,
- 0xBC40, 0x2184, 0x6E7F, 0x5FDF, 0xBC40, 0x1983, 0x7307, 0xA14C, 0xCFCE, 0x6AA7, 0x1FA5,
- 0xA200, 0x0262, 0xBC3C, 0x0200, 0x88E0, 0x6EEB, 0xFC1F, 0x6960, 0x1FCE, 0xBC25, 0x026F,
- 0xBCFD, 0xC000, 0xBD07, 0x0C8C, 0xB51E, 0x0002, 0x6D7A, 0xA681, 0xE061, 0xBC9C, 0x4000,
- 0x6E7F, 0x4FCE, 0xB512, 0x0002, 0x6AA7, 0x26C1, 0x88E0, 0x6E29, 0xDFCE, 0x6EEB, 0xFC1F,
- 0xBCFD, 0xC000, 0x8E00, 0xB51E, 0x0002, 0xE681, 0xE061, 0xBC9C, 0x4000, 0xCFA3, 0xB512,
- 0x0002, 0xBC24, 0x0267, 0xE6C1, 0xE5DD, 0xE54C, 0xA300, 0x0262, 0xBC40, 0x0E06, 0xCF85,
- 0xCFDE, 0x8EC0, 0xE9FC, 0xE6DE, 0xA200, 0x02A7, 0x2600, 0xBC01, 0x0D4B, 0xA203, 0x0294,
- 0x2630, 0xA202, 0x02C5, 0xBC25, 0x1000, 0xA200, 0x02C6, 0xA204, 0x02C3, 0xA201, 0x01BE,
- 0xBCA5, 0x4000, 0xBC23, 0x0294, 0x8F33, 0xBC26, 0x31CE, 0xBC40, 0x1185, 0x6990, 0x7AD4,
- 0x0495, 0xBCA5, 0x0000, 0xBC26, 0x31CF, 0x00AA, 0xBC25, 0x31D0, 0xBC40, 0x1984, 0xBC40,
- 0x2187, 0x0404, 0xFAD6, 0x044F, 0xFAB5, 0xBC81, 0x8000, 0xBC93, 0x4000, 0x0020, 0x0079,
- 0xA204, 0x0299, 0xBC40, 0x1582, 0xBC40, 0x1D80, 0xBC40, 0x2581, 0x8F07, 0x32C0, 0x4000,
- 0x8F00, 0xB008, 0xFFFF, 0x8C13, 0xA300, 0x0299, 0xBC20, 0x4000, 0x21A0, 0x8F00, 0x3421,
- 0x8C0B, 0xA300, 0x0299, 0x403E, 0xBC40, 0x1D80, 0xA31E, 0x0294, 0xBC40, 0x2581, 0xBC40,
- 0x1582, 0xBC20, 0x31D1, 0xBC40, 0x1185, 0xFA10, 0x20A8, 0x4020, 0xBC40, 0x1981, 0x3840,
- 0x8F06, 0xBC20, 0x31D2, 0x8E00, 0xFA10, 0x2088, 0x3802, 0x8F00, 0x4000, 0xBC24, 0x31D3,
- 0xBC40, 0x2183, 0xFA94, 0xBC27, 0x31EE, 0x4006, 0x6867, 0x3AF3, 0x1932, 0x202B, 0x8F04,
- 0xBC23, 0x31EF, 0x8E00, 0xFA73, 0x218B, 0x8F00, 0x3886, 0x2640, 0xBC21, 0x029A, 0x8F0B,
- 0xBC23, 0x31D4, 0xA204, 0x0299, 0xFA73, 0x2023, 0x8F01, 0x2600, 0x8F03, 0x8E00, 0x8C13,
- 0xA306, 0x0295, 0xBC20, 0x31F7, 0xBC40, 0x2083, 0xFA10, 0x2118, 0x1803, 0xA302, 0x0295,
- 0xBC40, 0x1C86, 0xBC40, 0x1486, 0xBC40, 0x5C86, 0xBC40, 0x2480, 0xBC40, 0x2080, 0xB230,
- 0x7530, 0x4C02, 0x8EC0, 0x1810, 0xBC40, 0x2480, 0x8EC0, 0x4000, 0xA300, 0x0294, 0x0000,
- 0xBC22, 0x31F0, 0xE91C, 0xBC24, 0x029A, 0x7007, 0x3A52, 0x6E11, 0x1C82, 0x6E7F, 0x3C85,
- 0xBC26, 0x31F4, 0xBC23, 0x31F3, 0x77FE, 0xDCA4, 0xBC27, 0x31F2, 0xB801, 0xA891, 0x7027,
- 0xFA73, 0xFAF6, 0xDCC3, 0xBC27, 0x31D5, 0xBC23, 0x31DA, 0xDD26, 0xDD04, 0xFAF6, 0xBC24,
- 0x31F5, 0xFA73, 0xDD66, 0xDD43, 0xFA96, 0xB074, 0x000B, 0xBC23, 0x31D8, 0xDDA6, 0xDD87,
- 0xBC26, 0x31D7, 0xB800, 0xE6F7, 0xDCE1, 0xBC24, 0x31D6, 0x6D34, 0x9DC3, 0xDDE7, 0xBC21,
- 0x8000, 0xFAD6, 0xBC27, 0x31D9, 0xFA94, 0x6163, 0x9E46, 0xE1DE, 0x6D34, 0xDE03, 0x6143,
- 0x1E24, 0xDE86, 0xDE63, 0xB801, 0xEE73, 0xB064, 0x000C, 0xBC21, 0x31F6, 0xDEA7, 0xDEE3,
- 0xDF06, 0xBC27, 0x31F1, 0xB034, 0x0009, 0x6D45, 0x1EC4, 0xB800, 0x6CD1, 0x6E81, 0xBAF6,
- 0xB024, 0x000A, 0xDFA6, 0xDF42, 0xDF23, 0xE1C3, 0xE142, 0xE246, 0xDF64, 0xDF8F, 0xBC3D,
- 0x029F, 0xBD08, 0x0E56, 0x6CD8, 0x1FC1, 0x7003, 0x0E27, 0x6915, 0xA044, 0x8F01, 0x2640,
- 0x8F6F, 0x6A3B, 0xCCE5, 0x6D6C, 0x4EC7, 0x6A3B, 0xDFE6, 0x88D0, 0xB20C, 0x0060, 0xDCE5,
- 0xCDC5, 0x8F65, 0x6A09, 0x4D65, 0x88FC, 0x6910, 0x8C86, 0x28DD, 0x28FD, 0x8890, 0xBCFF,
- 0xC000, 0xBC92, 0x4000, 0x2442, 0x28D5, 0x6A3F, 0x4CE5, 0x88F0, 0x686B, 0x8D26, 0x611E,
- 0x4DE7, 0x2409, 0x8F05, 0xCFA6, 0x686B, 0x8CC5, 0xCD06, 0x666B, 0x8CE5, 0x6113, 0x5DFC,
- 0x2409, 0x32F0, 0xBCEC, 0x4000, 0x8F05, 0xCD41, 0x686E, 0x5DFC, 0x8F01, 0x35F9, 0xDDE7,
- 0x686D, 0x4EE6, 0x401F, 0x8F12, 0x6CB8, 0x0DC5, 0x3BBC, 0x8F09, 0x38FE, 0xBC21, 0x2666,
- 0xBCFE, 0x4000, 0xB06C, 0xFFFF, 0x3BA6, 0x3BE7, 0x0F27, 0x6EF7, 0xDEFD, 0xBC3D, 0x029F,
- 0x8C26, 0x409F, 0xCDE5, 0x69B4, 0x0EA6, 0x8F01, 0x3569, 0xDDE5, 0x684B, 0x9EFC, 0x7027,
- 0xCDC5, 0xBC3D, 0x029F, 0x8F16, 0x6910, 0x8FC1, 0x5BE5, 0x28E5, 0xBC25, 0x31CA, 0x403B,
- 0xFAA6, 0xE0E7, 0x8A03, 0xBBF9, 0x4C3F, 0x6A3F, 0x9EF0, 0x88D0, 0x77FE, 0xDFC1, 0x66EB,
- 0x0DC5, 0x0F26, 0x3BC6, 0x8D02, 0xDFE6, 0xCDC5, 0x6A09, 0x4E47, 0x88EC, 0x6915, 0x0F8F,
- 0x6915, 0x8E85, 0x28F7, 0x28DD, 0x88B0, 0xBC9D, 0x8000, 0xBCE6, 0xC000, 0x6915, 0x0F8F,
- 0x2456, 0x6A33, 0xCFC1, 0x28D5, 0x88A0, 0x8E00, 0x0556, 0x242D, 0x26D0, 0x8F04, 0xCFE6,
- 0xCDA7, 0x2137, 0x19BE, 0xDFE6, 0x6D00, 0xA444, 0x6915, 0xEA38, 0xE4C4, 0xCFE6, 0xCF44,
- 0xCF27, 0xCF00, 0xE7C3, 0xE642, 0xA305, 0x029A, 0xCE02, 0xCD83, 0xCF65, 0xE441, 0xCDE7,
- 0xCE64, 0xCEFB, 0xCCF0, 0xCCA1, 0xE9E4, 0xE6C6, 0xE5C7, 0xE55E, 0x8EC0, 0xE65B, 0xE4D0,
- 0xBC21, 0x02A8, 0xE90E, 0x6E18, 0x7C22, 0xA204, 0x02C4, 0x6C28, 0xA0C5, 0xA200, 0x02C2,
- 0x6C49, 0x5F04, 0xB050, 0x31BD, 0x6E0D, 0x1F55, 0x6980, 0x3AB6, 0xB012, 0xFFF2, 0xA21E,
- 0x02C6, 0xB000, 0x31BF, 0x616C, 0xA4DE, 0x7000, 0x5F21, 0xFA12, 0x4025, 0x180D, 0x0554,
- 0xB020, 0x31BB, 0xA204, 0x02C5, 0xBC40, 0x2187, 0x31E7, 0xFA52, 0x0497, 0xB000, 0x31B9,
- 0xBC40, 0x1987, 0x3127, 0x6C88, 0x3A10, 0x0504, 0x38F4, 0xB00E, 0xFFF7, 0x6622, 0x9F60,
- 0x6D37, 0x6446, 0xB06E, 0xFFF6, 0x6C90, 0x1F86, 0x6643, 0x2745, 0xB05E, 0xFFF5, 0xB07E,
- 0xFFF4, 0xE1C6, 0x6998, 0x66C4, 0xE7C2, 0xDFC7, 0xDFA5, 0x8F54, 0xBC20, 0x02A8, 0x700F,
- 0x8E44, 0x65E3, 0x0EC5, 0xB5A8, 0x000F, 0x65B3, 0x65DE, 0xBC40, 0xBC02, 0xBC40, 0x5404,
- 0xB4AA, 0x0001, 0xB5B6, 0x000F, 0xB4C8, 0x0001, 0xB5EC, 0x000F, 0x62B6, 0x8EA2, 0x0BB4,
- 0x170A, 0xBC40, 0xC406, 0xB4E4, 0x0001, 0xB5C8, 0x000F, 0xBC40, 0x9403, 0x62C9, 0x8E83,
- 0x178B, 0xB4F6, 0x0001, 0xB5EC, 0x000F, 0x0BB7, 0xBC40, 0x8404, 0xCEE4, 0xB5FA, 0x000F,
- 0xBC40, 0x4405, 0x174C, 0xBC40, 0x8C07, 0xB4F8, 0x0001, 0xB5DA, 0x000F, 0xBC40, 0x3C02,
- 0xBC40, 0x4C03, 0xB5A4, 0x000F, 0xB5B6, 0x000F, 0xBC40, 0x3404, 0x0B6F, 0xB5C8, 0x000F,
- 0xBC40, 0x7C02, 0xBC40, 0x9C03, 0xBC40, 0x5C01, 0xBC40, 0xAC01, 0xBC40, 0xB401, 0xBC40,
- 0x7405, 0xBC40, 0xA406, 0x8C69, 0xA304, 0x02B5, 0xBC23, 0x02B5, 0xBC22, 0x31C4, 0xB046,
- 0xFFF9, 0xFA52, 0xDFE4, 0xBC02, 0x1E36, 0x7000, 0x4FE0, 0xB030, 0x000B, 0xBC20, 0x31C3,
- 0xB046, 0xFFF7, 0xFA12, 0xCF80, 0xDF84, 0xBC02, 0x1E36, 0x7000, 0x4F80, 0x6D31, 0xCFA0,
- 0xBC22, 0x31C6, 0xB046, 0xFFF8, 0xFA52, 0xDF84, 0xBC02, 0x1E36, 0x7000, 0x4F80, 0xB030,
- 0x000C, 0xBC20, 0x31C5, 0xB046, 0xFFF6, 0xFA12, 0xCFC0, 0xDF84, 0xBC02, 0x1E36, 0x6E05,
- 0x0F81, 0xB032, 0x000E, 0xBC40, 0x788F, 0x7000, 0x61CE, 0xB040, 0xFFF3, 0x88D8, 0xBC22,
- 0x31C7, 0xB066, 0xFFF3, 0xCF20, 0xFA52, 0xDE65, 0xDF26, 0xDF83, 0xBC02, 0x1E36, 0xCF80,
- 0xCF01, 0xBC47, 0xA803, 0xBC47, 0x5804, 0x6112, 0xCE7E, 0x6C33, 0x0F21, 0x241B, 0xBC47,
- 0xA004, 0x6847, 0x24DE, 0xDEE3, 0x8F03, 0xBC23, 0x31C9, 0x4001, 0x8C05, 0xFA72, 0xBC23,
- 0x31C8, 0x4001, 0xFA72, 0xB030, 0xFFFE, 0xB046, 0xFFF6, 0xCF60, 0xBC02, 0x1E36, 0xBC21,
- 0x02A8, 0xBC20, 0x31C1, 0xCF1E, 0xBC40, 0x4083, 0xFA10, 0xBC40, 0x649E, 0x2098, 0x8F09,
- 0xBC20, 0x31C2, 0xBC40, 0x5083, 0xFA10, 0x6406, 0x0F55, 0x0018, 0x8C03, 0xBC40, 0x5480,
- 0xCF55, 0x8E00, 0x8EC0, 0xE9F2, 0x8E00, 0xBC23, 0x00A5, 0xBC20, 0x3054, 0x6E10, 0xE181,
- 0xB800, 0x2074, 0x24A1, 0xA201, 0x045F, 0x28C8, 0x6911, 0x2902, 0xBC21, 0x00A3, 0x6E10,
- 0x654E, 0xBC24, 0x2081, 0xE085, 0xBC26, 0x2083, 0xB801, 0x2837, 0x692F, 0x65CF, 0xDFC3,
- 0xFAD3, 0x28D8, 0x2444, 0xBC23, 0x00A1, 0x6E10, 0xE54E, 0xE185, 0xE1C6, 0x692D, 0x64CF,
- 0x28E0, 0x2444, 0xA200, 0x00A0, 0x7008, 0xA54E, 0x6220, 0xA5CF, 0xBC24, 0x2080, 0x26A0,
- 0xFA94, 0xBC22, 0x00A7, 0x8F0E, 0x38A2, 0x8E00, 0xE286, 0xE2C7, 0x24BE, 0xBC26, 0x3055,
- 0x8E00, 0xFAD6, 0x28E6, 0x2444, 0x8E00, 0xA30E, 0x00A7, 0xE6CF, 0xBC24, 0x3053, 0x8E00,
- 0xFA94, 0x2244, 0x8F3A, 0x7007, 0x8FC4, 0xA20E, 0x00A5, 0xE24F, 0x88C8, 0xA20E, 0x00A1,
- 0x690B, 0x21CF, 0x88B8, 0xA20E, 0x00A3, 0xE0CF, 0x8898, 0xBC26, 0x3056, 0xE10E, 0xFAD6,
- 0x6807, 0xA14F, 0x88A8, 0x8F10, 0xBC26, 0x3057, 0x8E00, 0xFAD6, 0x200E, 0x8F0A, 0xBC26,
- 0x3059, 0x8E00, 0xFAD6, 0x212E, 0x8F04, 0xBC25, 0x3058, 0x8E00, 0xFAB5, 0x2095, 0x8F03,
- 0x8E00, 0x8C06, 0xA31E, 0x008C, 0x403E, 0x8E00, 0xA31E, 0x008C, 0x403C, 0xA303, 0x009C,
- 0xA301, 0x009D, 0xA304, 0x009E, 0xA302, 0x009F, 0xA31C, 0x008B, 0xE9FE, 0x8EC0, 0x3401,
- 0xA300, 0x00A0, 0x6C84, 0xA904, 0xFA13, 0x6E0D, 0x1FD5, 0xBC22, 0x3104, 0xB002, 0xFFFD,
- 0xFA52, 0xBC21, 0x7FFF, 0x6622, 0xA443, 0x40A1, 0xBC23, 0x02CE, 0xBC24, 0x045A, 0xBC02,
- 0x1E36, 0xCFD5, 0x8E00, 0x8EC0, 0xE9FC, 0x8E00, 0xE906, 0xA202, 0x02D3, 0x6E0D, 0x1F81,
- 0xB012, 0xFFFB, 0x6988, 0x5FA1, 0xDFD5, 0x8F04, 0xBC20, 0x2080, 0x4021, 0x8C0F, 0xA301,
- 0x02D3, 0xFA11, 0xBC02, 0x1E46, 0xA201, 0x0474, 0x1A41, 0x7007, 0x9F61, 0xBC20, 0x2080,
- 0xA31E, 0x02D3, 0xFB11, 0x7040, 0x4F83, 0xBC22, 0x3104, 0x6C8C, 0xBA10, 0xFA52, 0xBC23,
- 0x7FFF, 0x6626, 0x9F60, 0xCFA0, 0xBC23, 0x02D1, 0xBC24, 0x045B, 0xBC02, 0x1E36, 0xCFD5,
- 0x8E00, 0x8EC0, 0xE9FA, 0x8E00, 0xE902, 0xFA31, 0xDFC0, 0xDFF5, 0xBC02, 0x1E46, 0xCFC1,
- 0xDFC0, 0xFA31, 0xBC02, 0x1E46, 0xCFC1, 0x1A48, 0xA200, 0x02D5, 0xA202, 0x045C, 0x0E41,
- 0x26A0, 0xA301, 0x02D5, 0x8F06, 0xBC21, 0x2082, 0x401E, 0xA200, 0x02D5, 0xA31E, 0x02D5,
- 0xFB30, 0x6D14, 0x4FF5, 0xE9FE, 0x40E0, 0x8EC0, 0x0848, 0xA301, 0x045C, 0x6C84, 0xBA10,
- 0xE904, 0xB580, 0x0002, 0xA201, 0x0474, 0xB100, 0x00BE, 0xBC23, 0x2081, 0x66C2, 0x1FD5,
- 0xBC22, 0x3104, 0x6E2D, 0x3B74, 0xB00A, 0xFFFD, 0xFA52, 0xBC23, 0x7FFF, 0x6626, 0xA444,
- 0x40C1, 0xBC23, 0x02D6, 0xBC24, 0x045D, 0xBC02, 0x1E36, 0xCFD5, 0x8E00, 0x8EC0, 0xE9FC,
- 0x8E00, 0xE904, 0xFA10, 0x6E08, 0x1FC1, 0xDFF5, 0xBC02, 0x1E46, 0xA201, 0x0474, 0xBC22,
- 0x3104, 0x6692, 0x0FC0, 0xBC23, 0x2083, 0x6C80, 0xBA52, 0xBC24, 0x7FFF, 0x6E05, 0x3B71,
- 0x6628, 0x9FA1, 0xB000, 0xFFFD, 0x40E1, 0xBC23, 0x02D9, 0xBC24, 0x045E, 0xBC02, 0x1E36,
- 0xCFF5, 0x8E00, 0x8EC0, 0xE9FC, 0x8E00, 0x0000, 0xBC21, 0x00A9, 0x4402, 0xE083, 0xE0C4,
- 0x24A3, 0xBC23, 0x213F, 0x8E00, 0x6960, 0x3A74, 0x8A0E, 0x6A38, 0xBA74, 0xB300, 0x0044,
- 0x28E2, 0x8F0B, 0x2600, 0x8F04, 0x2444, 0x8EC0, 0xA30E, 0x00A9, 0xE4CF, 0x4000, 0x8EC0,
- 0xA300, 0x00A9, 0xE4C0, 0x8880, 0x8EC0, 0x8E00, 0xA300, 0x045F, 0xE904, 0xBC21, 0x2022,
- 0x6E05, 0x1FD5, 0xA21C, 0x047A, 0xB000, 0xFFFD, 0xFA35, 0x7000, 0x6445, 0xDFFC, 0xBC22,
- 0x0780, 0xBC23, 0x02DD, 0xBC24, 0x02DF, 0xBC02, 0x1E36, 0xA201, 0x02DF, 0xA200, 0x02DC,
- 0xCFE2, 0xA092, 0x8000, 0xB000, 0xFFFF, 0xA301, 0x047A, 0x2680, 0xA300, 0x02DC, 0x8F34,
- 0xBC20, 0x304D, 0xBC3E, 0x0320, 0xBC3A, 0x7FFF, 0xFA10, 0xA202, 0x047C, 0xA31E, 0x02DC,
- 0xA31A, 0x047A, 0x21C8, 0x8F14, 0xBC20, 0x304E, 0xBC23, 0x304F, 0xFA10, 0x6872, 0x3A70,
- 0x8F03, 0x2048, 0x8F01, 0x26A0, 0x8F05, 0x21C8, 0x8F0A, 0x4000, 0xA300, 0x047C, 0x8D07,
- 0x4040, 0x8C05, 0xA300, 0x047C, 0x4020, 0xA300, 0x047C, 0xA200, 0x047C, 0x2242, 0x4000,
- 0x8F02, 0xA300, 0x047B, 0x8C07, 0xCFD5, 0x7008, 0x0FD5, 0x8C03, 0xA300, 0x047B, 0xCFD5,
- 0x8E00, 0x8EC0, 0xE9FC, 0x8E00, 0xBC20, 0x2021, 0xA201, 0x047C, 0x6984, 0x3A12, 0x8F1B,
- 0x2611, 0xB034, 0xFFE0, 0x8F10, 0x2692, 0x8F1B, 0xBC21, 0x3051, 0x8E00, 0xFA31, 0x20D1,
- 0x8F00, 0xA026, 0x4000, 0x21D1, 0x8F11, 0xB024, 0x0020, 0xA0A4, 0x4000, 0x8D0E, 0xBC21,
- 0x3052, 0x8E00, 0xFA31, 0x8C09, 0xA026, 0x4000, 0xBC21, 0x3050, 0xB024, 0x0020, 0xFA31,
- 0xA0A4, 0x4000, 0x8EC0, 0xFB12, 0x8E00, 0x0000, 0xBC22, 0x3105, 0xE902, 0xA21C, 0x0326,
- 0x77FE, 0xBA52, 0x6EF0, 0x9FDC, 0xA200, 0x0312, 0xBC3C, 0x02E0, 0xBC22, 0x30C2, 0xBC23,
- 0x8EE4, 0xBC24, 0x771E, 0xBC25, 0x88E2, 0x403B, 0x706F, 0xE800, 0xBD05, 0x11DA, 0x6E30,
- 0xBC19, 0x2442, 0x6960, 0x3AC7, 0x8A08, 0xBB3D, 0x8E19, 0x28CF, 0xA207, 0x0315, 0xBC21,
- 0x12EB, 0xA206, 0x0316, 0x28F9, 0x28F3, 0xA307, 0x0316, 0x88F0, 0x2442, 0x28FC, 0x28F5,
- 0xA307, 0x0315, 0x417A, 0x88E0, 0xA207, 0x0317, 0x699C, 0xEA18, 0x2442, 0x4001, 0x8F00,
- 0xB01E, 0xFFFF, 0x6A3C, 0x4FC1, 0x88E4, 0xBC3D, 0x0318, 0x5FFA, 0x7007, 0x64E6, 0xA206,
- 0x0317, 0x6998, 0xDFC1, 0x8F02, 0x35B1, 0x3BA6, 0x8E00, 0xA31D, 0x0317, 0xA300, 0x0312,
- 0xCFC2, 0x8EC0, 0xE9FE, 0xA302, 0x0326, 0x0000, 0xA200, 0x0325, 0xA201, 0x0354, 0xBC3D,
- 0x0327, 0x459F, 0x403B, 0xBC3C, 0x0318, 0x41BE, 0xBC22, 0x30CB, 0xBD05, 0x1200, 0x5FFA,
- 0x3862, 0x6910, 0xBC1D, 0x6960, 0x3A64, 0x8A03, 0xBBB0, 0xC81D, 0x28EC, 0x88B0, 0x40DA,
- 0xE4E3, 0xEA18, 0xA300, 0x0325, 0xA200, 0x0353, 0x3B9D, 0x459E, 0xBC22, 0x30CF, 0x5FFA,
- 0xA301, 0x0354, 0x6910, 0xBA43, 0xE064, 0x8A27, 0xBB8C, 0x861C, 0x403A, 0x28E3, 0x88A0,
- 0xEA18, 0x8EC0, 0xA300, 0x0353, 0xA302, 0x0355, 0xBC25, 0x0357, 0xBC22, 0x30F8, 0x6E09,
- 0x7CA4, 0xB800, 0xA6B6, 0x24B4, 0xA206, 0x0356, 0x33B0, 0x4FE4, 0xBC27, 0x01FF, 0x35B1,
- 0x1927, 0x09F4, 0xBC24, 0x0100, 0x4806, 0x1926, 0xA206, 0x0355, 0x2670, 0xA307, 0x0356,
- 0x243E, 0x28FC, 0x2444, 0x4004, 0x7008, 0x64CE, 0x6673, 0x26CF, 0x2670, 0x8F2C, 0xBC27,
- 0x30F7, 0xE2CF, 0xFAF7, 0x6CDC, 0x26C4, 0xA20E, 0x0357, 0xA304, 0x0357, 0x88D8, 0x8F1C,
- 0x3230, 0x8F01, 0xB036, 0xFFFF, 0xFB53, 0xA202, 0x0359, 0x2620, 0x8F0D, 0x2622, 0x4043,
- 0x8F05, 0xB20A, 0x099A, 0x189A, 0xB22A, 0x21EC, 0x8C08, 0x18A2, 0xB22A, 0x13D7, 0x8C04,
- 0x188A, 0xB20A, 0x17AE, 0x188A, 0x8C07, 0xA302, 0x0359, 0xBC22, 0x30F7, 0xB03E, 0xFFFF,
- 0xFB53, 0xA202, 0x0359, 0x144A, 0x2442, 0x28F1, 0x8894, 0x8EC0, 0x8E00, 0xE441, 0xBC22,
- 0x2131, 0xBC23, 0x00B0, 0xBC24, 0x2135, 0x6915, 0x3B53, 0xFA93, 0xBC22, 0x2136, 0xE4C3,
- 0xB800, 0xA210, 0xBC80, 0x4000, 0x6915, 0xE902, 0xBC21, 0x30F9, 0xA203, 0x035B, 0xBC22,
- 0x035C, 0x6E73, 0xFA31, 0xBC24, 0x30FA, 0x28C1, 0xA300, 0x035B, 0xFA94, 0x6E08, 0xBC40,
- 0x6A37, 0x2143, 0x2A83, 0x88C0, 0xDFCE, 0xDFEF, 0xBC20, 0x0A30, 0xBC88, 0x0000, 0xCFCE,
- 0xA300, 0x035A, 0xCFEF, 0x2444, 0xA203, 0x035E, 0xB580, 0x0001, 0x6000, 0xE4CE, 0xB000,
- 0x2000, 0xE54F, 0xA300, 0x035E, 0xBC21, 0x3244, 0xBC80, 0x4000, 0xBC21, 0x2111, 0x8EC0,
- 0xE9FE, 0xFB30, 0xBC22, 0x3105, 0xBC24, 0x30FB, 0xE906, 0xA203, 0x035A, 0xBC25, 0xF000,
- 0xFA52, 0xFA94, 0xA21E, 0x0314, 0xA21C, 0x015F, 0x66BA, 0xDF84, 0xDFA2, 0x7050, 0xDF63,
- 0xDFDC, 0xDF5E, 0xBC22, 0x0CCD, 0xBC24, 0x2131, 0xBC25, 0x199A, 0xBC3B, 0x009C, 0xBC3D,
- 0x02E0, 0xBD0A, 0x131D, 0xA206, 0x035F, 0x700E, 0x8F67, 0x63ED, 0xCFBE, 0xB47C, 0x000E,
- 0xB11E, 0x0005, 0xA200, 0x0360, 0x0E08, 0x2810, 0xB5FE, 0x000E, 0x380E, 0x1BB7, 0xB000,
- 0x0400, 0xBCF0, 0xC000, 0xA306, 0x035F, 0xBCED, 0x4000, 0x283A, 0xA307, 0x0360, 0x888C,
- 0xBC27, 0x00B1, 0x6EE7, 0x7B97, 0x606C, 0x0F40, 0xBC27, 0x3244, 0xBCED, 0xC000, 0x7016,
- 0xBC1F, 0x6EE6, 0xDF40, 0xBC20, 0x2135, 0xBC21, 0x2111, 0xFA10, 0xBC8E, 0x0000, 0xFB36,
- 0xB560, 0x0001, 0xCF80, 0xBC8C, 0x0000, 0xBC3E, 0x00C2, 0x63E1, 0x8FC0, 0x3F3E, 0xFF18,
- 0xDFC0, 0xCFC2, 0xA302, 0x015F, 0xCF43, 0x8EC0, 0xE9FA, 0xA303, 0x0314, 0xA203, 0x0366,
- 0x6D06, 0x6044, 0xBC22, 0x0367, 0xA203, 0x0363, 0x08C3, 0xA206, 0x0355, 0x6E00, 0xBC45,
- 0xBCC9, 0x8000, 0x698C, 0x2146, 0x24B5, 0xA205, 0x0364, 0x28E5, 0x2444, 0xA303, 0x0366,
- 0x7000, 0x244E, 0x7008, 0xE54F, 0x1918, 0x2640, 0x8F4A, 0xE14F, 0xA20E, 0x0367, 0xE540,
- 0xA300, 0x0367, 0xBC22, 0x3101, 0xE0C1, 0x2409, 0xFA52, 0x88C8, 0x218A, 0x240C, 0x3840,
- 0x8F0B, 0xBC20, 0x2004, 0x8E00, 0xFA10, 0x2680, 0x3802, 0x8F04, 0xBC20, 0x3100, 0x5FE4,
- 0xFA10, 0x2108, 0x181C, 0xA201, 0x0369, 0xA204, 0x0365, 0x3449, 0x084C, 0xBC24, 0x30FE,
- 0x2610, 0xA301, 0x0369, 0xA201, 0x0362, 0xFA94, 0x195A, 0x0048, 0x3340, 0x8F12, 0x2650,
- 0x8F14, 0xBC20, 0x3103, 0xA204, 0x0361, 0x69B0, 0x3A10, 0x8F02, 0x2188, 0x8C04, 0x185A,
- 0x0410, 0x2088, 0x1853, 0xA301, 0x0361, 0x3822, 0x8D05, 0xBC20, 0x30FE, 0xB028, 0xFFFF,
- 0xFB12, 0x8EC0, 0xA301, 0x0362, 0x8E00, 0x8EB8, 0xBC20, 0x303D, 0x4021, 0xFA10, 0xA202,
- 0x0462, 0x1408, 0x3491, 0xB000, 0xFFFF, 0x0810, 0x2680, 0xA300, 0x0462, 0xA200, 0x0460,
- 0x8F36, 0xBC23, 0x3041, 0xBC22, 0x3040, 0x6980, 0x3A73, 0xA204, 0x045B, 0xA21C, 0x045A,
- 0xFA52, 0x8F06, 0x21A3, 0x8F02, 0x387C, 0x201A, 0x8F07, 0x4000, 0x8D06, 0x21A3, 0x8F03,
- 0x387C, 0x219A, 0x8F00, 0x3801, 0xBC22, 0x3043, 0x8E00, 0xFA52, 0x2620, 0x8F17, 0xA202,
- 0x0465, 0x26A0, 0x8F12, 0xBC22, 0x2004, 0x8E00, 0xFA52, 0x26A0, 0x8F0C, 0xBC22, 0x303F,
- 0xA203, 0x045E, 0xFA52, 0x209A, 0x8F05, 0xBC22, 0x303E, 0xA203, 0x045D, 0xFA52, 0x211A,
- 0x8F00, 0x4000, 0xBC22, 0x3044, 0xA300, 0x0460, 0xFA50, 0xA202, 0x0463, 0x2680, 0x8F03,
- 0x4000, 0x8C42, 0xA300, 0x0461, 0xBC20, 0x2015, 0xBC23, 0x3048, 0xFA10, 0xFA73, 0x2003,
- 0x4000, 0x3860, 0x8F1A, 0xBC20, 0x2080, 0xBC24, 0x3046, 0xFA10, 0xFA94, 0x2184, 0x3803,
- 0x8F07, 0xBC20, 0x3047, 0xBC24, 0x2015, 0xFA10, 0xFA94, 0x2020, 0x3803, 0x8F08, 0xBC20,
- 0x2083, 0xBC24, 0x3045, 0xFA10, 0xFA94, 0x2004, 0x3803, 0x8F00, 0x3801, 0x2680, 0x8F02,
- 0xBC20, 0x304A, 0x8C05, 0xFA10, 0xBC20, 0x3049, 0x8E00, 0xFA10, 0xBC24, 0x304B, 0x0E10,
- 0xFA92, 0x2102, 0x8F04, 0xBC22, 0x304C, 0x8E00, 0xFA52, 0x2002, 0x1890, 0x33A0, 0x180B,
- 0xA300, 0x0461, 0xBC20, 0x3042, 0xA201, 0x0461, 0xA203, 0x0460, 0xB512, 0x0001, 0xFA10,
- 0xA302, 0x0463, 0x0059, 0x2600, 0x8F0A, 0x2601, 0x8F07, 0x2602, 0x4042, 0x8F02, 0x2603,
- 0x8C04, 0x1851, 0x8C02, 0x4001, 0x4021, 0xBC20, 0x200D, 0x8EC0, 0x8E00, 0xFB11, 0xBC20,
- 0x0375, 0xBC21, 0x0372, 0xBC22, 0x036A, 0xBC3C, 0x0376, 0x700E, 0xA0C1, 0x70CF, 0xA040,
- 0xBC23, 0x038F, 0xBC09, 0x1482, 0x2442, 0xE104, 0xBC26, 0x1180, 0x6A39, 0xA185, 0xBC21,
- 0xF2C0, 0x6A3A, 0x61C7, 0x6A3F, 0xA5A5, 0xE584, 0xE184, 0xE185, 0xBC21, 0x1CF0, 0x6A3A,
- 0x61C7, 0xBC21, 0x8620, 0x6A3E, 0x65A5, 0x88C0, 0x2442, 0x6A39, 0xA584, 0xBC21, 0x0840,
- 0x6A3A, 0x6184, 0x6A3F, 0xA185, 0xBC21, 0x0A40, 0x6A3A, 0x61C7, 0xBC21, 0x8620, 0x6A3E,
- 0x65A5, 0x88C0, 0x8E00, 0xE584, 0xE464, 0xBC23, 0x038F, 0xBC21, 0x0375, 0x8E00, 0xE4C0,
- 0x8EB8, 0x0000, 0xA202, 0x0372, 0xA203, 0x0395, 0x009A, 0xB214, 0x0014, 0x8F16, 0xB024,
- 0xFFEC, 0x5FC3, 0x04DA, 0x3B43, 0xA200, 0x0375, 0xBC3C, 0x0376, 0x433E, 0xBC23, 0x305B,
- 0x77F6, 0xAA18, 0x6910, 0xBA64, 0xE065, 0x8A05, 0xBBB0, 0xC81D, 0x4023, 0x8880, 0xA303,
- 0x0373, 0x8EC0, 0xA302, 0x0395, 0x8E00, 0xBC20, 0x03BA, 0xA203, 0x03B9, 0x6D20, 0xA00E,
- 0xB206, 0x0080, 0xE04F, 0xE14C, 0x8F36, 0x88B0, 0x40A4, 0xB226, 0x01B0, 0x40C5, 0x1925,
- 0x401C, 0xB226, 0x06C0, 0x7007, 0xA45C, 0x4083, 0x6607, 0x255E, 0xA205, 0x0396, 0xA202,
- 0x03BE, 0xA31C, 0x03B9, 0xA31C, 0x03BA, 0x2268, 0x8F03, 0x8E00, 0x8C03, 0xB034, 0xFFFF,
- 0x34D1, 0xA300, 0x0396, 0xA202, 0x03BD, 0xB236, 0x000A, 0x8F05, 0xB226, 0xFFF6, 0x3B83,
- 0x8F04, 0x4002, 0x401C, 0x8D02, 0x4022, 0x401C, 0x26A1, 0x8F00, 0x40A0, 0xA31C, 0x03BE,
- 0xA302, 0x03BD, 0x8C0D, 0xA300, 0x0397, 0x2421, 0xBC25, 0x1000, 0x28E5, 0x34D9, 0xA303,
- 0x03B9, 0xA30E, 0x03BA, 0xE44F, 0xE54C, 0xA200, 0x0397, 0x3048, 0xBC20, 0x7E7E, 0x8EC0,
- 0xBC82, 0x0000, 0x8E00, 0xBC22, 0x2131, 0xBC24, 0x00B2, 0x77F6, 0xBB54, 0xBC23, 0x2135,
- 0xBC22, 0x2136, 0x7087, 0xBA73, 0x6910, 0xFA52, 0xBCB2, 0xC000, 0xBCA2, 0x8000, 0xA200,
- 0x03A6, 0x3F1A, 0xBC22, 0x3060, 0xBC3C, 0x03A8, 0x6910, 0xBF10, 0xE902, 0xFA43, 0x6960,
- 0x3E18, 0x8A06, 0xBF8C, 0x8618, 0xBF8C, 0xA410, 0x2A42, 0xBC23, 0x03C4, 0x88D0, 0x6D26,
- 0xA19E, 0xBC27, 0x03C7, 0x6E62, 0xE15A, 0x6E7A, 0x5FC2, 0x6E72, 0x21DC, 0x88A0, 0x6D4E,
- 0xA38E, 0xA206, 0x03A5, 0xA300, 0x03A6, 0x6998, 0x23CF, 0xE24C, 0xDFE5, 0x8F03, 0x8E00,
- 0x8C16, 0xB06C, 0xFFFF, 0x88E0, 0x39FC, 0x39DE, 0x399A, 0x8880, 0xBC21, 0x2045, 0x2442,
- 0x7007, 0xBB30, 0xBC20, 0x2046, 0xBC21, 0x305A, 0x7009, 0xBB16, 0x7007, 0x3A30, 0x3B4C,
- 0x15B0, 0x240A, 0x4020, 0x28C8, 0xBC21, 0x03BF, 0xE7CF, 0xA30E, 0x03C7, 0xBCAA, 0x8000,
- 0xA306, 0x03A5, 0x690B, 0x60C6, 0x6E20, 0x664C, 0x6E7F, 0x2482, 0x6E77, 0xA0C7, 0x6E66,
- 0xA4C6, 0x6A3A, 0x0FC1, 0xBC20, 0x3068, 0x6915, 0x24CC, 0xA30E, 0x03C4, 0x6915, 0xE5CF,
- 0x6915, 0xBA01, 0x6A34, 0x7A02, 0x6A3C, 0xBA02, 0xBC40, 0x1205, 0x6A3E, 0xBA02, 0x6A3A,
- 0xBA16, 0xBC40, 0x1A03, 0x6A3A, 0x8FE0, 0x28DE, 0x88A0, 0xBC40, 0x1E05, 0xBC40, 0x1602,
- 0xBC23, 0x28BE, 0xA204, 0x03C3, 0xBCA4, 0xC000, 0xB038, 0x4000, 0x009A, 0xA302, 0x03C3,
- 0xBC23, 0x3244, 0xBCA4, 0xC000, 0xBC23, 0x2111, 0x8EC0, 0xE9FE, 0xFB72, 0xA200, 0x0398,
- 0x2457, 0xBC22, 0x306D, 0x77FE, 0xA441, 0xBC3C, 0x0399, 0x7067, 0xBA43, 0x6E73, 0xE800,
- 0x6915, 0x3C1C, 0x8A0A, 0xBB8C, 0x861C, 0xBB8C, 0xA413, 0x28DA, 0xA300, 0x0398, 0x8EC0,
- 0x8880, 0x8E00, 0xE902, 0xA203, 0x0372, 0x6CAC, 0x1FD5, 0x8F06, 0xBC20, 0x036A, 0xBC21,
- 0x213E, 0xBC0B, 0x15CB, 0xFA32, 0xE402, 0xBC02, 0x1445, 0xBC02, 0x148A, 0xA201, 0x0372,
- 0x41E3, 0xA202, 0x0373, 0x0459, 0x2621, 0xA301, 0x0372, 0x8F07, 0x26A2, 0x8F1A, 0xA200,
- 0x0374, 0xBC02, 0x1AEC, 0x4002, 0x8D16, 0x3820, 0xBC02, 0x14AE, 0x3820, 0xBC02, 0x1504,
- 0xA201, 0x03B8, 0x2610, 0x8F04, 0xB002, 0xFFFF, 0x4002, 0x8C08, 0xA300, 0x03B8, 0x3820,
- 0xBC02, 0x15A4, 0xA300, 0x0374, 0x4042, 0xCFD5, 0x8E00, 0x8EC0, 0xE9FE, 0xA302, 0x0373,
- 0x3E02, 0xBC20, 0x03E5, 0x3820, 0xE002, 0xE003, 0xE044, 0xE402, 0xE484, 0xE042, 0xE482,
- 0x7008, 0xA443, 0xA200, 0x03E4, 0x0C10, 0xA300, 0x03E4, 0x3E01, 0x8EB8, 0xBC20, 0x30BF,
- 0xA201, 0x0447, 0xFA10, 0x6852, 0x2902, 0xBC22, 0x30BB, 0xBC23, 0x30BD, 0x18D3, 0xA202,
- 0x0449, 0xFA64, 0x3491, 0x6835, 0x3A73, 0x8F65, 0xA202, 0x0448, 0x2153, 0x8F07, 0x3449,
- 0x3401, 0xA080, 0x4000, 0x4002, 0x8C5B, 0xA300, 0x0447, 0xBC20, 0x30C1, 0xA201, 0x03CF,
- 0xBC22, 0x30BA, 0x6114, 0x5FF5, 0x701F, 0x3A10, 0x4023, 0x6220, 0xDFDC, 0xB412, 0x0001,
- 0x2620, 0x8F04, 0x7000, 0x5FC1, 0xA301, 0x03CB, 0xA301, 0x03CC, 0xBC22, 0x30C0, 0xA201,
- 0x03D6, 0x3449, 0xFA52, 0x20CA, 0xA301, 0x03D6, 0x8F19, 0x4041, 0x0801, 0x2600, 0x8F13,
- 0x3E02, 0x4000, 0xA300, 0x0099, 0x3E01, 0xBC20, 0x2008, 0xBC21, 0xFF7F, 0xFA12, 0x0851,
- 0x7008, 0x3B11, 0xBC02, 0x05B3, 0x7010, 0x4FC0, 0x8C05, 0xA301, 0x009A, 0x8C02, 0x4060,
- 0xCFC0, 0x3302, 0x8F18, 0x3541, 0xBC21, 0x1111, 0x2829, 0x3200, 0x380E, 0x8F0D, 0x70F0,
- 0x4FF5, 0xBC22, 0x2042, 0xBC23, 0x2041, 0xBC24, 0xEEEF, 0xBC0D, 0x1681, 0xFB51, 0x6008,
- 0x3B70, 0x8C06, 0x4002, 0x8C04, 0x7000, 0x8FF5, 0x7000, 0x8FF5, 0xA302, 0x0448, 0x8EC0,
- 0xE9FE, 0xA302, 0x0449, 0xA200, 0x03CE, 0xB300, 0x6600, 0x4020, 0x3820, 0x8F00, 0xA200,
- 0x044A, 0x2681, 0xA300, 0x044A, 0x8F27, 0xA200, 0x03D2, 0x2600, 0xBC22, 0x2044, 0x4000,
- 0x1801, 0xFA53, 0x0118, 0xBC23, 0x2043, 0xFB54, 0xFA72, 0x0448, 0x0091, 0xA204, 0x03D5,
- 0xFB72, 0xB5C8, 0x0001, 0x0061, 0xA202, 0x044C, 0x004A, 0xBC23, 0x2042, 0xA204, 0x0448,
- 0xA300, 0x03D2, 0xBC22, 0x2041, 0xA205, 0x03CA, 0x0020, 0xFB71, 0xA300, 0x0448, 0xFB55,
- 0xBC00, 0x1612, 0x8EB8, 0xA201, 0x03D5, 0x3312, 0xA201, 0x03CE, 0x8F0A, 0xB312, 0x3F00,
- 0x8F07, 0xA202, 0x03D4, 0x224A, 0x8F04, 0x4001, 0x7008, 0x2441, 0xA300, 0x03D0, 0x8EB8,
- 0x2680, 0xA200, 0x03CF, 0x8F0A, 0xFA11, 0xB312, 0x0198, 0x8F05, 0xA201, 0x03D3, 0x1641,
- 0x40A2, 0x2E4A, 0x8F00, 0x3401, 0x3402, 0xBC21, 0x30BB, 0x2041, 0x8F04, 0x4000, 0xA300,
- 0x03D0, 0xBC20, 0x30B3, 0xA201, 0x03D0, 0x2611, 0x4001, 0x8F00, 0xFA11, 0xA300, 0x03CF,
- 0x8EC0, 0xB592, 0x0006, 0xA301, 0x03CE, 0x6EF5, 0x6080, 0xE906, 0x7007, 0x20C1, 0xA204,
- 0x03CE, 0x6313, 0x1F83, 0x65B0, 0x5FA2, 0x65C0, 0x1FE3, 0x7000, 0x9FC0, 0x4020, 0x4207,
- 0x5FE6, 0xBC23, 0xC6C0, 0xBC21, 0x6E40, 0x38A2, 0xBC0F, 0x1720, 0x2F68, 0x2F20, 0x8F00,
- 0x0D6B, 0x2FB0, 0x8F00, 0x0D69, 0x1785, 0x3491, 0x4044, 0x6815, 0x0FE4, 0x4147, 0x8FEE,
- 0x6E1D, 0x0FA2, 0xB036, 0xFFFB, 0x69A8, 0x5FE3, 0x8F08, 0xB42A, 0x0006, 0xBC23, 0x03FF,
- 0x0893, 0xA31C, 0x03D5, 0xDF62, 0xA302, 0x03D2, 0x7000, 0x8F83, 0xBC21, 0x7F80, 0x3882,
- 0xBD10, 0x174F, 0x2E90, 0x2F68, 0x2FB0, 0x8F0B, 0x26B1, 0x8F02, 0x09E9, 0x2670, 0x8F03,
- 0xBC26, 0x6E40, 0x0D6E, 0x8C03, 0x1785, 0x3521, 0x3491, 0x8E00, 0xCFA0, 0x2601, 0xBC20,
- 0x03FF, 0x8F27, 0xB41A, 0x0006, 0x0808, 0x2680, 0x8F01, 0x32C2, 0x8F00, 0x403C, 0x26B0,
- 0xDF7C, 0x8F12, 0xBC22, 0x30B3, 0x6E20, 0x8FC3, 0xBC21, 0x30BB, 0xBD04, 0x1772, 0xFA86,
- 0x6881, 0xBA86, 0x8F01, 0x2246, 0x8F03, 0x21E1, 0x1914, 0xA304, 0x03CF, 0x8E00, 0x8D0B,
- 0xCFC0, 0x6330, 0x8FE0, 0xA305, 0x03D4, 0xA304, 0x03D5, 0xBC02, 0x16C7, 0x8D01, 0xCFC3,
- 0x6EAF, 0x8F60, 0xA303, 0x03D3, 0x8EC0, 0xE9FA, 0xA305, 0x03D4, 0xB022, 0x3098, 0xA200,
- 0x03D2, 0x6980, 0x3A45, 0x8F26, 0x4343, 0x0519, 0x4003, 0xBC0C, 0x1799, 0xFA46, 0x0DAE,
- 0x2246, 0x8F01, 0x3882, 0x3803, 0x8E00, 0x2680, 0x8F18, 0x2610, 0x4046, 0x4022, 0x1996,
- 0x4205, 0x3290, 0x0569, 0xA306, 0x03D5, 0x8F02, 0x3250, 0x8F00, 0x14D5, 0xBC21, 0x30A9,
- 0x044C, 0x3210, 0x8F01, 0x1451, 0x00D9, 0xA201, 0x03D3, 0x0C4B, 0xA301, 0x03D3, 0x8EC0,
- 0xA300, 0x03D2, 0x8E00, 0xE904, 0xA201, 0x03CC, 0xA200, 0x03CD, 0x7000, 0x9F81, 0xB000,
- 0xFFFF, 0xA302, 0x03CE, 0x6984, 0x1FB5, 0x8F4C, 0x2680, 0x8F47, 0xA201, 0x03CF, 0x344A,
- 0xBC20, 0x30BB, 0x21C8, 0xBC20, 0x30B3, 0x1841, 0x6E18, 0x9FC1, 0xBC21, 0x03D7, 0xBC02,
- 0x1700, 0xA201, 0x03CF, 0x7000, 0x8FC0, 0xA204, 0x0444, 0x6882, 0x1FC1, 0x4023, 0x8F06,
- 0xB018, 0xFFFF, 0x6CC7, 0x9FC0, 0x6626, 0x9FE1, 0x8C20, 0xDF82, 0x3422, 0x6CE1, 0x1FE0,
- 0x181A, 0x2681, 0xA300, 0x03CB, 0x8F15, 0xBC20, 0x0444, 0x8A09, 0xE402, 0xFA31, 0xA21E,
- 0x03D3, 0xB592, 0x0006, 0xA302, 0x03D0, 0xA303, 0x03D1, 0xA302, 0x03D5, 0xA302, 0x03D2,
- 0xA301, 0x03CE, 0xA31E, 0x03CA, 0xBC02, 0x1690, 0xCFE2, 0xCFC1, 0xA302, 0x0444, 0xA301,
- 0x03CF, 0x8C26, 0x71A0, 0x0F85, 0x8C23, 0xCF85, 0x2600, 0x4681, 0x1848, 0x7008, 0x1FC1,
- 0x2C48, 0x401E, 0xBC21, 0x03D9, 0xBC20, 0x03D7, 0xA31E, 0x03CF, 0x1848, 0x3862, 0xBC02,
- 0x1700, 0xA202, 0x03CF, 0x6988, 0x0FC0, 0x4025, 0x8F09, 0x0885, 0x2620, 0x4006, 0x8F00,
- 0xBC02, 0x15FE, 0xA306, 0x0444, 0x8C02, 0x4680, 0xCF85, 0xCFB5, 0xA305, 0x03CC, 0x8EC0,
- 0xE9FC, 0xA300, 0x03CD, 0xE902, 0xA203, 0x03CD, 0xB036, 0xFFFF, 0x698C, 0x1FC3, 0xDFF5,
- 0xBC01, 0x190F, 0xA201, 0x03D1, 0x2690, 0xBC01, 0x1920, 0xB016, 0xFFE6, 0x4340, 0x2048,
- 0xBC01, 0x190A, 0xB306, 0x0019, 0xBC01, 0x18F4, 0xA201, 0x03D2, 0xB306, 0x0018, 0x8F7E,
- 0xB306, 0x0017, 0x8F4E, 0xCFC3, 0xB316, 0x0016, 0xBC01, 0x1920, 0xA203, 0x044B, 0x26B0,
- 0xBC01, 0x1920, 0x4023, 0x2610, 0xA303, 0x044B, 0x4002, 0x8F0F, 0xBC21, 0x03D7, 0xBC02,
- 0x1700, 0x2680, 0xA300, 0x03D2, 0x8F07, 0xA203, 0x0444, 0xA21E, 0x03D3, 0x34D9, 0xA31E,
- 0x03CA, 0xA303, 0x0444, 0xA203, 0x0444, 0xB236, 0x0080, 0x8F19, 0xA203, 0x0446, 0xB236,
- 0x0080, 0x7000, 0xCFC5, 0xBC21, 0x0444, 0x8F09, 0xA200, 0x0445, 0xB200, 0x0080, 0x8F12,
- 0x8A03, 0xE483, 0x3569, 0xBC02, 0x15FE, 0x8D0D, 0x8A03, 0xE483, 0xB05A, 0xFFFF, 0xBC02,
- 0x15FE, 0x8D06, 0x7000, 0xCFC5, 0xBC21, 0x0444, 0x8A03, 0xE483, 0xA200, 0x03D2, 0xDFC5,
- 0xBC02, 0x16DA, 0xBC02, 0x1690, 0x8D73, 0x2610, 0xBC21, 0x03D7, 0x8F24, 0xBC40, 0x1880,
- 0x4023, 0x2E03, 0xBC40, 0x1C80, 0x4002, 0x185A, 0xA200, 0x03D9, 0x2E03, 0x0001, 0xA300,
- 0x03D9, 0xBC21, 0x03D9, 0x441A, 0xBC02, 0x1700, 0x2680, 0xA300, 0x03D2, 0x8F0B, 0xA203,
- 0x0445, 0xA201, 0x03D3, 0x34D9, 0xA301, 0x03CA, 0xA31A, 0x044C, 0xA303, 0x0445, 0x8C04,
- 0x4003, 0x8C02, 0x4003, 0x4003, 0x8C47, 0xA303, 0x044B, 0x2610, 0xBC21, 0x03D9, 0x4002,
- 0x4023, 0x8F3D, 0xBC02, 0x1700, 0x2680, 0xA300, 0x03D2, 0x8F37, 0xA203, 0x0446, 0x441E,
- 0xA201, 0x03D3, 0x34D9, 0xA301, 0x03CA, 0xA31E, 0x044C, 0xA303, 0x0446, 0x8D2C, 0xA203,
- 0x03D4, 0x2630, 0xBC20, 0x03D2, 0x8F00, 0xBC02, 0x16C7, 0xA203, 0x03D2, 0x26B0, 0x8F1E,
- 0xA203, 0x0444, 0xA21E, 0x03D3, 0x34D9, 0xA31E, 0x03CA, 0xA303, 0x0444, 0x8D16, 0x4661,
- 0x044B, 0xBC02, 0x1787, 0x8D11, 0xA200, 0x03D7, 0x4010, 0x4023, 0xA300, 0x03CA, 0xA310,
- 0x03D1, 0xBC21, 0x03D7, 0x3843, 0xBC02, 0x1700, 0x4683, 0xA310, 0x044C, 0xDFC3, 0xCFF5,
- 0xCFC3, 0x8EC0, 0xE9FE, 0xA303, 0x03CD, 0xE902, 0x8E00, 0xDFD5, 0x3E02, 0xA200, 0x03E3,
- 0x7000, 0x5FE0, 0xA301, 0x03E3, 0x2600, 0x8F12, 0xA200, 0x03CB, 0x2680, 0x8F02, 0xA200,
- 0x03CC, 0x2600, 0x8F02, 0xA200, 0x03CD, 0x2681, 0x8F06, 0xBC20, 0x03E5, 0xBC21, 0x03D7,
- 0xBD04, 0x1945, 0xE002, 0xE482, 0x3E01, 0x8C0E, 0xCFE0, 0xA200, 0x03CB, 0x2601, 0x8F02,
- 0xBC02, 0x17B9, 0x8C04, 0xCFE0, 0xBC02, 0x183D, 0xCFE0, 0xB000, 0xFFFF, 0x69A0, 0x1FE0,
- 0x8FEF, 0xCFD5, 0x8E00, 0x8EC0, 0xE9FE, 0x8E00, 0xBC20, 0x2048, 0x8E00, 0xFA10, 0x2600,
- 0x8F06, 0xBC20, 0x2043, 0xBC22, 0x2044, 0x4001, 0x8EC0, 0xFB11, 0xFB51, 0x8EB8, 0xA201,
- 0x03E1, 0xBC22, 0x3079, 0xFA20, 0xB030, 0xFFD8, 0xB302, 0x308C, 0xA303, 0x03EE, 0x8EC0,
- 0x1851, 0xA301, 0x03E1, 0xA203, 0x03E3, 0x34D9, 0xA200, 0x03FD, 0x5FFA, 0xBC3C, 0x03FA,
- 0x407E, 0xA303, 0x03E3, 0x7009, 0x2461, 0x6CE4, 0x3C1E, 0x4003, 0xA205, 0x03E4, 0x19E3,
- 0x0C95, 0x2131, 0x6555, 0x2042, 0x1863, 0xA300, 0x03FD, 0x33A0, 0xB05A, 0x03E6, 0x1823,
- 0x637E, 0x22C0, 0x2E04, 0xB5FE, 0x0005, 0x01C7, 0x6678, 0xE6A7, 0x684C, 0xA2C2, 0x18E3,
- 0x0C0B, 0x2E94, 0x8EC0, 0x0097, 0xE6C2, 0xA200, 0x03DB, 0xBC3C, 0x03DC, 0x409E, 0x405A,
- 0xBC22, 0x03EA, 0x77FE, 0xAA18, 0xE05F, 0xBC23, 0x308C, 0xE51F, 0xBD03, 0x19C3, 0x6910,
- 0xBC1C, 0xFA65, 0x8A03, 0xBBB0, 0xCA1C, 0x28EC, 0x88C0, 0x8E00, 0xE504, 0x8EC0, 0xEA18,
- 0xA300, 0x03DB, 0xBC26, 0x03E2, 0xA202, 0x03E9, 0xE343, 0x698C, 0x2902, 0xA203, 0x03E0,
- 0xBC01, 0x1A6F, 0xA204, 0x03F6, 0x69B0, 0x5FD5, 0x3883, 0x8F02, 0x4004, 0xA304, 0x03F6,
- 0x3342, 0x8F68, 0xBC26, 0x03F7, 0x602D, 0x215F, 0x26C0, 0xE55F, 0x8F61, 0x6E11, 0xBCC5,
- 0x6CF4, 0x2341, 0x4004, 0x4026, 0x19B4, 0x3210, 0x8F00, 0x35B1, 0xBC40, 0x1102, 0x3220,
- 0x8F00, 0x35B1, 0x2663, 0xA207, 0x03F1, 0x8F01, 0x26E0, 0x8F09, 0x2435, 0x2429, 0x2412,
- 0x20B5, 0x8F00, 0x35F9, 0x2095, 0x8F00, 0xB07E, 0xFFFF, 0xA202, 0x03F2, 0x3551, 0xB20A,
- 0x004C, 0x3844, 0x8F0B, 0xB23E, 0x0008, 0x38A7, 0x4024, 0x38E2, 0x8F05, 0x38E5, 0x3378,
- 0x3882, 0x8F01, 0x5FE4, 0x38E2, 0x38A2, 0x00E3, 0xA305, 0x03F2, 0xA307, 0x03F1, 0xDFE3,
- 0xBC02, 0x197C, 0xA203, 0x03F5, 0xA202, 0x03F3, 0x6056, 0x0FE4, 0x3491, 0xB438, 0x0001,
- 0xA305, 0x03F5, 0xB204, 0x0208, 0x8F14, 0xA202, 0x03F5, 0xA205, 0x03F4, 0xB524, 0x0001,
- 0x20AA, 0x401D, 0x8F06, 0xA202, 0x03E4, 0x4024, 0x0C94, 0x3883, 0xA302, 0x03E4, 0x4643,
- 0xA31D, 0x03F5, 0xA31D, 0x03F4, 0x4002, 0xA303, 0x03EF, 0xA302, 0x03F3, 0xA202, 0x03EF,
- 0x2222, 0x8F09, 0x3491, 0x2262, 0x8F11, 0xA202, 0x03E9, 0x8E00, 0xE142, 0xA302, 0x03F0,
- 0x8D0C, 0xA201, 0x03F0, 0x7008, 0x9FE4, 0xBC02, 0x197C, 0xA202, 0x03F4, 0x6024, 0x0FE4,
- 0xA302, 0x03F4, 0xB008, 0xFFFF, 0x69A0, 0x0FD5, 0x8F79, 0x700F, 0xDFD5, 0xBC02, 0x196D,
- 0xA31F, 0x03F6, 0xCFD5, 0x8D73, 0x7766, 0xE145, 0xA202, 0x03F0, 0x3822, 0xBC3D, 0x03F1,
- 0x453F, 0xA204, 0x0442, 0x69AC, 0x64E5, 0x6E28, 0x6A38, 0x8F02, 0xA207, 0x03EE, 0x26F0,
- 0x8F15, 0xE142, 0xE2C5, 0x6175, 0x60C2, 0x615A, 0xA242, 0x243F, 0x242D, 0x017D, 0xB05A,
- 0x0008, 0xB4DA, 0x0004, 0x356A, 0xB4DA, 0x0002, 0x016A, 0x206A, 0x5FE2, 0x1955, 0x8C02,
- 0xE605, 0x5FE2, 0xB006, 0xFFFF, 0x2680, 0x8F3F, 0xA203, 0x0443, 0x34D9, 0xA303, 0x0443,
- 0xB236, 0x00F0, 0x8F08, 0xDFC1, 0xDFF5, 0xBC24, 0x041A, 0xBC02, 0x196D, 0xCFF5, 0x8C31,
- 0xCFC1, 0xBC24, 0x041A, 0x4003, 0x6E38, 0xE200, 0x4005, 0xA071, 0xC000, 0xBD27, 0x1ABA,
- 0x6659, 0x6200, 0xA071, 0xC000, 0x1965, 0xA207, 0x03EE, 0xB0DA, 0x041A, 0x003D, 0xB450,
- 0x0001, 0xA305, 0x03EF, 0x26D0, 0x4685, 0x4667, 0x405F, 0x19EF, 0xE71F, 0xA307, 0x03CD,
- 0xBC25, 0x03F0, 0x8A06, 0xE703, 0x8A0A, 0xE683, 0x8A03, 0xE682, 0xBC3F, 0x03FA, 0xA303,
- 0x03CC, 0xA31F, 0x03FD, 0xA303, 0x03CB, 0xA304, 0x0442, 0xA301, 0x03F0, 0xE9FE, 0xA300,
- 0x03E0, 0xA202, 0x03E9, 0x8EC0, 0x3491, 0xA302, 0x03E9, 0x0000, 0xE902, 0xA201, 0x03DB,
- 0xDFD5, 0x6960, 0x24C0, 0xBC02, 0x19AA, 0xBC20, 0x03EA, 0xA300, 0x03E9, 0xBD04, 0x1AFD,
- 0xBC02, 0x19C8, 0x8E00, 0x8E00, 0xCFD5, 0x8E00, 0x8EC0, 0xE9FE, 0x8E00, 0xE902, 0xA200,
- 0x0466, 0x6980, 0x1FC0, 0xBC01, 0x1BB4, 0xB310, 0x00FF, 0xBC01, 0x1BBA, 0xA201, 0x0468,
- 0xA202, 0x0467, 0xB034, 0xFFFF, 0x3310, 0xBC20, 0x0450, 0xBC01, 0x1BAA, 0x3880, 0x4021,
- 0xE20E, 0xE24F, 0xBC24, 0x3002, 0x88D8, 0xFA94, 0xBCDB, 0x0000, 0xBC24, 0x3009, 0x2435,
- 0xFA94, 0x2134, 0x4004, 0x19CC, 0xA307, 0x0465, 0xBC27, 0x3013, 0xA305, 0x0464, 0xFAF7,
- 0x21B7, 0x198C, 0x26E0, 0x8F04, 0xBC26, 0x2004, 0x8E00, 0xFAD6, 0x2660, 0x8F03, 0xA206,
- 0x046A, 0x35B1, 0xA306, 0x046A, 0xBC27, 0x3011, 0xA206, 0x0469, 0x35B1, 0xFAF7, 0x2037,
- 0xA306, 0x0469, 0x8F0F, 0xBC26, 0x3012, 0xA207, 0x046A, 0xFAD6, 0x21BE, 0x8F03, 0x8E00,
- 0x8C04, 0xA304, 0x046B, 0xA301, 0x046B, 0xA304, 0x046A, 0xA304, 0x0469, 0xBC26, 0x300A,
- 0x8E00, 0xFAD6, 0x212E, 0x0526, 0x19B5, 0x202C, 0xBC25, 0x2017, 0x1926, 0x6CA8, 0x3AB2,
- 0xBC25, 0x3006, 0x8F02, 0xA303, 0x0467, 0xBC25, 0x3003, 0xBC23, 0x300C, 0x8E00, 0xFA73,
- 0x2013, 0x8F13, 0xBC26, 0x300D, 0x34E9, 0xFAD6, 0x2016, 0x8F0C, 0xBC26, 0x300E, 0x8E00,
- 0xFAD6, 0x2016, 0x8F05, 0xBC26, 0x300F, 0x8E00, 0xFAD6, 0x2016, 0x8C02, 0x18DD, 0x34EA,
- 0x38A3, 0x2442, 0xFAB2, 0x28E2, 0x88A0, 0xBC23, 0x300B, 0xB524, 0x0006, 0xFA73, 0xB424,
- 0x0006, 0x32B0, 0x8F01, 0x4003, 0x049A, 0xBC23, 0x2020, 0xB524, 0x0001, 0xFA73, 0x0859,
- 0x2690, 0xBC23, 0x2003, 0x8F02, 0x4001, 0x8C0C, 0xFB71, 0x3451, 0x8C09, 0x7000, 0x7B71,
- 0xB012, 0xFFFF, 0xA301, 0x0468, 0xA303, 0x0467, 0x4001, 0xE401, 0xE441, 0x8D06, 0xBC20,
- 0x2003, 0x5FC1, 0xFA12, 0x0851, 0xFB11, 0xCFC0, 0x3401, 0xE9FE, 0xBC21, 0x00FF, 0x8EC0,
- 0x0801, 0xA300, 0x0466, 0xE904, 0xBC21, 0x2016, 0x6E05, 0x1FD5, 0xB000, 0xFFFD, 0xBC22,
- 0x3000, 0xFA31, 0x7000, 0x6441, 0xFA52, 0xBC23, 0x044D, 0xBC24, 0x044F, 0xBC02, 0x1E36,
- 0xA200, 0x044F, 0x7003, 0x0FD5, 0xBC22, 0x4444, 0x6915, 0xE9FC, 0x2456, 0x28C2, 0xBC20,
- 0x3001, 0x8890, 0xBC22, 0x0450, 0x6910, 0xBA10, 0x28C8, 0x6E00, 0xBC41, 0x88B4, 0x7101,
- 0x2145, 0x24A9, 0x28DC, 0x2444, 0x8EC0, 0xE54F, 0xE44E, 0xBC21, 0x3033, 0xBC22, 0x201E,
- 0xB580, 0x0001, 0xFA31, 0x4043, 0xFA54, 0x0923, 0xB012, 0xFFFF, 0x2220, 0x8F01, 0x3310,
- 0x8FF7, 0x8EB8, 0xA200, 0x0470, 0x3280, 0xBC21, 0x0477, 0xBC22, 0x0474, 0x184A, 0xA202,
- 0x046D, 0xBC40, 0x1083, 0x6CE8, 0xE084, 0x66B7, 0x20C1, 0x8F04, 0xB044, 0x3014, 0x8E00,
- 0xFA94, 0x211C, 0x8F0B, 0x32A0, 0xB044, 0xFFFF, 0x8F07, 0xB058, 0x3017, 0x8E00, 0xFAB5,
- 0x219D, 0x8F02, 0x3844, 0x8D01, 0x3491, 0xB034, 0x301A, 0xA302, 0x046D, 0xFA73, 0xBC22,
- 0x3023, 0x1A59, 0x2419, 0xFA52, 0x211A, 0x8F05, 0x3300, 0x8F02, 0xBC20, 0x301F, 0x8C05,
- 0xFA10, 0xBC20, 0x301E, 0x8E00, 0xFA10, 0x4202, 0x0490, 0xA203, 0x0473, 0x2442, 0x28DA,
- 0x28C8, 0x8884, 0xBC21, 0x0200, 0xBC90, 0x4000, 0xBC22, 0x0800, 0xBC80, 0x8000, 0xBC22,
- 0x3024, 0x2690, 0x4004, 0xA203, 0x0454, 0x1820, 0xFA52, 0x0E4B, 0x210A, 0xA300, 0x0473,
- 0x8F04, 0xBC20, 0x3025, 0x8E00, 0xFA10, 0x2008, 0x1881, 0x8EC0, 0xA302, 0x0454, 0x8E00,
- 0xBC20, 0x200F, 0xA201, 0x046E, 0xFA10, 0x2680, 0x8F00, 0x3449, 0x2682, 0x4000, 0x8F00,
- 0xB012, 0xFFFF, 0x3210, 0x8F02, 0x3317, 0x40E0, 0x1801, 0x8EC0, 0xA300, 0x046E, 0x8E00,
- 0xBC20, 0x3031, 0xBC21, 0x2000, 0xFA12, 0x0811, 0x2241, 0xA200, 0x046E, 0x8F03, 0x4E00,
- 0x0810, 0xB400, 0x0004, 0xB010, 0x3026, 0xA203, 0x0454, 0xFA31, 0xBC24, 0x1000, 0x0994,
- 0x1AD9, 0x2274, 0x34D9, 0x4025, 0x111D, 0x8F01, 0x41E3, 0x0913, 0x4002, 0x3240, 0x3862,
- 0x8F02, 0x4103, 0x2123, 0x18DC, 0xB5C6, 0x0001, 0xBC26, 0x302E, 0x0E4C, 0x6980, 0x3AD6,
- 0xBC24, 0x200B, 0xB5F0, 0x0004, 0xA303, 0x046F, 0x1895, 0x0E4E, 0xA300, 0x046E, 0x00FB,
- 0x6988, 0x3B91, 0x8F01, 0x2681, 0x8F00, 0x4002, 0x2620, 0x8F01, 0x2682, 0x8F00, 0x4002,
- 0x2620, 0x8F01, 0x2683, 0x8F00, 0x4002, 0x2620, 0x8F40, 0x2604, 0x8F3E, 0x2620, 0x8F01,
- 0x2685, 0x8F00, 0x4002, 0x2620, 0x8F33, 0x2606, 0x8F31, 0x2620, 0x8F01, 0x2687, 0x8F33,
- 0xBC20, 0x2005, 0xBC21, 0x0200, 0xFA10, 0x0801, 0x2680, 0x8F20, 0xA200, 0x0452, 0x2602,
- 0x8F11, 0x2603, 0x8F03, 0x4060, 0x8C25, 0xA300, 0x0452, 0xBC20, 0x3036, 0xBC21, 0x2081,
- 0xFA10, 0xFA31, 0x2088, 0x4040, 0x8F18, 0xA300, 0x0452, 0x8D17, 0xBC20, 0x3037, 0xBC21,
- 0x2081, 0xFA10, 0xFA31, 0x2188, 0x4060, 0x8F0C, 0xA300, 0x0452, 0x8D0B, 0x4060, 0xA300,
- 0x0452, 0x8D07, 0x4020, 0x8C05, 0xA300, 0x0452, 0x4000, 0xA300, 0x0452, 0xA200, 0x0452,
- 0xB000, 0x3039, 0xBC21, 0x2006, 0xFA10, 0x8EC0, 0x0003, 0xFB30, 0xA200, 0x0474, 0xA201,
- 0x0453, 0xB500, 0x0007, 0xBC22, 0x302F, 0x1AC8, 0x241B, 0xFA52, 0x211A, 0x8F02, 0xBC22,
- 0x3021, 0x8C05, 0xFA52, 0xBC22, 0x3020, 0x8E00, 0xFA52, 0xA204, 0x046C, 0xBC23, 0x8000,
- 0x04DA, 0x3340, 0x2457, 0x2456, 0x8F04, 0x2454, 0x28CB, 0x28C2, 0x8C03, 0x8880, 0xA30E,
- 0x046C, 0xBC21, 0x3030, 0xBC22, 0x3032, 0xA300, 0x0453, 0xFA31, 0xFA52, 0xBC23, 0x1000,
- 0x0913, 0x1A08, 0xBC25, 0x0400, 0x2263, 0xBC81, 0x4000, 0x8F01, 0xBC20, 0x0FFF, 0x0810,
- 0xBC21, 0x200C, 0x8EC0, 0x8E00, 0xFB30, 0x0000, 0xBC20, 0x3022, 0xBC21, 0x3038, 0x7017,
- 0xBA10, 0x700C, 0x3A31, 0xA310, 0x046C, 0xA31E, 0x0470, 0xA300, 0x0454, 0xA301, 0x0452,
- 0x6EE5, 0x6800, 0xBD0F, 0x1D81, 0xBC20, 0x3034, 0xBC21, 0x2005, 0xFA10, 0xB000, 0x0301,
- 0x7008, 0x3B30, 0xBC02, 0x1BF3, 0xBC02, 0x1C65, 0xBC02, 0x1C7B, 0xBC20, 0x3034, 0xBC21,
- 0x2005, 0xFA10, 0xB000, 0x0201, 0x7000, 0x3B30, 0xBC02, 0x1BF3, 0x8E00, 0x8E00, 0xBC20,
- 0x3034, 0xBC21, 0x2005, 0xFA10, 0xB000, 0x0301, 0x7008, 0x3B30, 0xBC02, 0x1BF3, 0xBC02,
- 0x1C65, 0xBC02, 0x1C7B, 0xA201, 0x046E, 0xBC20, 0x3034, 0xB012, 0x3026, 0x6EAF, 0x3A10,
- 0xBC22, 0x3035, 0xBC23, 0x2005, 0xFA31, 0xB000, 0x0201, 0xFA52, 0xA301, 0x0454, 0xFB70,
- 0xBC24, 0x2009, 0x8EC0, 0x7008, 0x3B72, 0xFB90, 0xE902, 0xA200, 0x0470, 0x6CC0, 0x1FD5,
- 0x8F34, 0xA200, 0x0472, 0xA201, 0x0471, 0x2680, 0x8F0F, 0xB312, 0x007F, 0xBC20, 0x3035,
- 0x8F07, 0xFA10, 0xB000, 0x0101, 0xBC21, 0x2005, 0x8C03, 0x7008, 0x3B30, 0x4020, 0x8C1E,
- 0xA300, 0x0472, 0xB232, 0x007F, 0x4000, 0x8F00, 0x3409, 0x3300, 0xA300, 0x0471, 0x8F0A,
- 0xBC02, 0x1C65, 0xBC02, 0x1C7B, 0xBC20, 0x3035, 0xBC21, 0x2005, 0xFA10, 0x8C07, 0x7000,
- 0x3B30, 0xBC02, 0x1C04, 0xBC02, 0x1C7B, 0x4000, 0xA300, 0x0472, 0xBC02, 0x1D12, 0x8D13,
- 0xBC02, 0x1C04, 0xBC02, 0x1C7B, 0xA200, 0x0470, 0xB000, 0xFFFF, 0xA201, 0x0471, 0xA300,
- 0x0470, 0xB232, 0x007F, 0x4000, 0x8F00, 0x3409, 0xA300, 0x0471, 0x7008, 0x4FD5, 0xBC20,
- 0x2009, 0x8EC0, 0xE9FE, 0xFB11, 0xBC21, 0x2010, 0xE908, 0xBC20, 0x200E, 0xFA31, 0xFA12,
- 0xBC24, 0x7F00, 0x6E1D, 0x1F95, 0xB036, 0xFFF9, 0x0894, 0xB444, 0x0008, 0x6E10, 0xE581,
- 0xFA10, 0x73F8, 0x65C4, 0x0801, 0xBC21, 0x0474, 0xBC40, 0x1500, 0xDFA1, 0xBD03, 0x1E2E,
- 0xE0DC, 0xE101, 0xDFC2, 0xDFFC, 0xBC02, 0x1E46, 0xCFE1, 0x63A0, 0x4FA1, 0x6D34, 0x4FC2,
- 0x6E20, 0x6480, 0xB406, 0x0001, 0xBC40, 0x1E00, 0xDFA1, 0x7000, 0x0F95, 0xBC21, 0x2009,
- 0x8EC0, 0xE9F8, 0xFB30, 0xE040, 0x6C00, 0x6246, 0x6E08, 0xE185, 0x6681, 0xA1C6, 0x24B5,
- 0x28C2, 0x2444, 0x8E00, 0xE5CF, 0x88B8, 0x8EC0, 0xE4CE, 0xE643, 0x3291, 0x8F0C, 0x24C1,
- 0x1448, 0x41A2, 0x2442, 0x4403, 0x0410, 0x28CB, 0xB580, 0x0004, 0x8890, 0x8EC0, 0x0001,
- 0x8E00, 0x8EC0, 0x4000, 0x8E00, 0xBC20, 0x2092, 0x4041, 0xFA10, 0xBC22, 0x2093, 0x0841,
- 0x6984, 0xBA51, 0x8F0F, 0x4022, 0x0802, 0x2681, 0x8F17, 0xBC20, 0x2000, 0x21C8, 0xBC20,
- 0x2095, 0x8F02, 0x8EC0, 0xE0C1, 0xFB11, 0xFA31, 0xFB11, 0x8EB8, 0xBC20, 0x2094, 0xBC22,
- 0x2000, 0x6872, 0xBA10, 0x8F02, 0x8EC0, 0xE4C0, 0x8E00, 0x8EC0, 0xFB30, 0x8E00, 0x8EB8,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000
-};
-#endif
-
-const unsigned short bin_patch_E1[] = {
- 0x2000, 0x21FF, 0xBC24, 0x20A0, 0x8E00, 0xFA95, 0xB30A, 0x06AF, 0x8F2E, 0xB30A, 0x08E5,
- 0x8F07, 0xBC25, 0x08E5, 0xFB95, 0xBC22, 0x399E, 0xBC23, 0x199E, 0xBC00, 0x0841, 0xBC25,
- 0x06AF, 0xFB95, 0x5400, 0xBC21, 0xD0B1, 0xBC02, 0x07CA, 0x5500, 0xBC21, 0x07C2, 0xBC02,
- 0x07CA, 0x40A0, 0xBC21, 0x0359, 0xBC02, 0x07CA, 0x41A0, 0xBC21, 0x00A0, 0xBC02, 0x07CA,
- 0x41C0, 0xBC21, 0x4208, 0xBC02, 0x07CA, 0x4380, 0xBC21, 0x2800, 0xBC02, 0x07CA, 0x4E04,
- 0xBC00, 0x08E6, 0x4344, 0xBC25, 0x0400, 0x2620, 0x8F06, 0xBC02, 0x07F0, 0x5404, 0x4025,
- 0xBC02, 0x07FB, 0xBC00, 0x06C1, 0xBC02, 0x07FB, 0x5404, 0x4025, 0xBC02, 0x07F0, 0xBC00,
- 0x06C1, 0xBDC8, 0x404E, 0x8E00, 0xFA11, 0xBC00, 0x0630, 0x8E00, 0x8E00, 0x8E00, 0xBC21,
- 0x0002, 0xBC20, 0x2008, 0xBC00, 0x01BB, 0xBC21, 0x033F, 0xA202, 0x0083, 0xFB11, 0x8EA2,
- 0xBC20, 0x2008, 0x7010, 0x4FF5, 0xBC22, 0x201A, 0xBC00, 0x0161, 0x4044, 0xBC25, 0x1000,
- 0xBC02, 0x07F0, 0x4E24, 0xBC00, 0x0705, 0xBC22, 0x399E, 0xBC23, 0x199E, 0xBC00, 0x078A,
- 0xBC24, 0x2080, 0x6C88, 0x3A10, 0xFA94, 0xB548, 0x0005, 0xBC00, 0x0E9F, 0xE902, 0xBC26,
- 0x2023, 0xDFE4, 0xBC24, 0x2000, 0xFAD6, 0x0934, 0x26C0, 0x8F01, 0xBC26, 0x3056, 0x8D02,
- 0xBC26, 0x31F9, 0xCFE4, 0xE9FE, 0xBC00, 0x0FED, 0xBC20, 0x2090, 0xBC21, 0x0100, 0xFA12,
- 0xE902, 0x0851, 0x6984, 0x1FD5, 0x8F37, 0x8E00, 0x8D03, 0x8E00, 0xBC20, 0x2090, 0xBC21,
- 0x8000, 0xFA10, 0x0801, 0x2600, 0x8FF5, 0xBC20, 0x2090, 0xBC21, 0x2091, 0x714F, 0xBA10,
- 0xBC22, 0x666D, 0x7028, 0xBB32, 0x71F8, 0xBB32, 0xA203, 0x0457, 0x0802, 0xA204, 0x0458,
- 0x6980, 0x3B33, 0xFB34, 0xBC22, 0x2545, 0xA31E, 0x0459, 0xFB32, 0x8F0C, 0x2601, 0x4FE1,
- 0x8F0D, 0x2602, 0xBC21, 0x0380, 0x8F09, 0x2683, 0x4001, 0x8F05, 0xBC02, 0x40E7, 0x8D04,
- 0xBC21, 0x03FF, 0xA301, 0x0456, 0xA301, 0x0455, 0xA200, 0x0458, 0xA201, 0x0457, 0x260F,
- 0x8F02, 0x8E00, 0x8C03, 0x3401, 0x3449, 0x4000, 0xCFD5, 0xA300, 0x0458, 0x8EC0, 0xE9FE,
- 0xA301, 0x0457, 0xBC22, 0x3105, 0xA200, 0x0313, 0x77DE, 0xBA52, 0x3BC2, 0xBC22, 0x2091,
- 0xBC3C, 0x02E0, 0xBC23, 0x666D, 0x7000, 0xFB53, 0x700E, 0xAA18, 0xBC24, 0x0B12, 0xFB54,
- 0x6D36, 0x7C1C, 0x6C8D, 0x7B54, 0x8FF9, 0xA203, 0x0355, 0xFB53, 0xA203, 0x035A, 0xFB53,
- 0xA203, 0x0464, 0xBC24, 0x2004, 0xFB53, 0xFA94, 0xA203, 0x047F, 0xFB54, 0xFB53, 0xA204,
- 0x0480, 0xFB54, 0xA203, 0x0481, 0xFB53, 0xA204, 0x0361, 0xA203, 0x0362, 0xFB54, 0xFB53,
- 0xBC23, 0x5A5A, 0xFB53, 0x8EC0, 0xBC23, 0x2545, 0xFB53, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000
-};
-
-const unsigned short bin_patch_E2[] = {
- 0x2000, 0x21FF, 0x8E00, 0x8E00, 0x8E00, 0xBC21, 0x0002, 0xBC20, 0x2008, 0xBC00, 0x01A9,
- 0xBC21, 0x033F, 0xA202, 0x0083, 0xFB11, 0x8EA2, 0xBC20, 0x2008, 0x7010, 0x4FF5, 0xBC22,
- 0x201A, 0xBC00, 0x014F, 0x240C, 0xA301, 0x047F, 0xA30F, 0x0480, 0xA30E, 0x0481, 0xBC00,
- 0x1353, 0x5380, 0xBC21, 0xAC40, 0xBC02, 0x07EA, 0x4380, 0xBC21, 0x2C00, 0xBC02, 0x07EA,
- 0x43A0, 0xBC21, 0xFB40, 0xBC02, 0x07EA, 0x43C0, 0xBC21, 0x0546, 0xBC02, 0x07EA, 0x43E0,
- 0xBC21, 0xFB3C, 0xBC02, 0x07EA, 0x4400, 0xBC21, 0x0537, 0xBC02, 0x07EA, 0x4E04, 0xBC00,
- 0x092A, 0x4025, 0xBC21, 0x2023, 0xBC22, 0x0400, 0xFA31, 0x084A, 0x2610, 0x8F01, 0xBC02,
- 0x081B, 0x8D02, 0xBC02, 0x0810, 0x4E24, 0xBC00, 0x0722, 0x4280, 0xBC02, 0x07EA, 0xBC22,
- 0x8018, 0xBC23, 0x8098, 0xCFE0, 0x2600, 0x1853, 0x42C0, 0xBC02, 0x07EA, 0x4240, 0xBC21,
- 0xE400, 0xBC02, 0x07EA, 0x4260, 0xBC21, 0x0010, 0xBC02, 0x07EA, 0x4040, 0xBC21, 0x0FFB,
- 0xBC02, 0x07EA, 0x4220, 0xBC21, 0x2020, 0xBC02, 0x07EA, 0xBC20, 0x0005, 0x4461, 0xBC02,
- 0x07F8, 0x4220, 0xBC21, 0x1020, 0xBC02, 0x07EA, 0xBC20, 0x0005, 0x4461, 0xBC02, 0x07F8,
- 0x4220, 0xBC21, 0x4020, 0xBC02, 0x07EA, 0xBC20, 0x0064, 0x4461, 0xBC02, 0x07F8, 0x4240,
- 0xBC21, 0xE407, 0xBC02, 0x07EA, 0x4260, 0xBC21, 0x7010, 0xBC02, 0x07EA, 0xBC20, 0x0064,
- 0x4461, 0xBC02, 0x07F8, 0x4520, 0xBC21, 0x8001, 0xBC02, 0x07EA, 0xBC00, 0x0794, 0xBC20,
- 0x2090, 0xBC21, 0x0100, 0xFA12, 0xE902, 0x0851, 0x6984, 0x1FD5, 0x8F37, 0x8E00, 0x8D03,
- 0x8E00, 0xBC20, 0x2090, 0xBC21, 0x8000, 0xFA10, 0x0801, 0x2600, 0x8FF5, 0xBC20, 0x2090,
- 0xBC21, 0x2091, 0x714F, 0xBA10, 0xBC22, 0x666D, 0x7028, 0xBB32, 0x71F8, 0xBB32, 0xA203,
- 0x045B, 0x0802, 0xA204, 0x045C, 0x6980, 0x3B33, 0xFB34, 0xBC22, 0x2545, 0xA31E, 0x045D,
- 0xFB32, 0x8F0C, 0x2601, 0x4FE1, 0x8F0D, 0x2602, 0xBC21, 0x0380, 0x8F09, 0x2683, 0x4001,
- 0x8F05, 0xBC02, 0x40F6, 0x8D04, 0xBC21, 0x03FF, 0xA301, 0x045A, 0xA301, 0x0459, 0xA200,
- 0x045C, 0xA201, 0x045B, 0x260F, 0x8F02, 0x8E00, 0x8C03, 0x3401, 0x3449, 0x4000, 0xCFD5,
- 0xA300, 0x045C, 0x8EC0, 0xE9FE, 0xA301, 0x045B, 0xBC22, 0x3105, 0xA200, 0x0314, 0x77DE,
- 0xBA52, 0x3BC2, 0xBC22, 0x2091, 0xBC3C, 0x02E1, 0xBC23, 0x666D, 0x7000, 0xFB53, 0x700E,
- 0xAA18, 0xBC24, 0x0B12, 0xFB54, 0x6D36, 0x7C1C, 0x6C8D, 0x7B54, 0x8FF9, 0xA203, 0x0356,
- 0xFB53, 0xA203, 0x035D, 0xFB53, 0xA203, 0x0468, 0xBC24, 0x2004, 0xFB53, 0xFA94, 0xA203,
- 0x0483, 0xFB54, 0xFB53, 0xA204, 0x0484, 0xFB54, 0xA203, 0x0485, 0xFB53, 0xA204, 0x0364,
- 0xA203, 0x0365, 0xFB54, 0xFB53, 0xBC23, 0x5A5A, 0xFB53, 0x8EC0, 0xBC23, 0x2545, 0xFB53,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000
-};
-
-const unsigned short bin_coeff_E1[] = {
- 0x0000, 0x01FF, 0x0400, 0x0006, 0x2AAB, 0x0324, 0x0324, 0x0324, 0x010C, 0x010C, 0x010C,
- 0x1111, 0x1259, 0x0001, 0x005A, 0x0E9B, 0x0FFF, 0x0FFF, 0x0008, 0x0001, 0x0001, 0x0CCD,
- 0xFFE0, 0xFFD8, 0x00FF, 0xFFAC, 0xFFBC, 0xFF00, 0x0020, 0x0048, 0x0050, 0x0050, 0x000E,
- 0x0002, 0x7000, 0x0800, 0xFFF8, 0x0008, 0x002B, 0xFFF6, 0xFFF8, 0xFFFE, 0x0003, 0x0008,
- 0x000D, 0x000F, 0x0014, 0x0019, 0x0000, 0x0800, 0x6580, 0x0000, 0x0000, 0x7FFF, 0x0008,
- 0x0078, 0xFEF5, 0xFEE8, 0x0003, 0x0080, 0x0080, 0x0080, 0x0300, 0x0006, 0xC080, 0xF000,
- 0x0660, 0xDA80, 0x0000, 0x0001, 0x0001, 0xFFE4, 0xFFE8, 0x0080, 0x0034, 0x0001, 0xFFFF,
- 0x0001, 0xFFFE, 0x3AC0, 0x3340, 0x2BC0, 0x07C0, 0x05C0, 0x03E0, 0x0008, 0x1000, 0x2000,
- 0xFF01, 0xFFE5, 0xFFE9, 0x0DA8, 0x000E, 0xF75E, 0x1136, 0xEC7B, 0x0D3C, 0xFA9A, 0xFC47,
- 0xF58B, 0x1055, 0x3DDA, 0x3DDA, 0x1055, 0xF58B, 0xFC47, 0x1B17, 0x362A, 0x1B17, 0x67DA,
- 0xA798, 0xFDA6, 0xF8BE, 0xF36E, 0xF0D4, 0xF368, 0xFB18, 0x04E8, 0x0C98, 0x0F2C, 0x0C92,
- 0x0742, 0x025A, 0x0028, 0x0029, 0x0028, 0x0029, 0x0028, 0x0029, 0x0028, 0x0028, 0x0029,
- 0x0028, 0x0029, 0x0028, 0x0028, 0x0029, 0x0028, 0x0029, 0x0028, 0x0029, 0x0028, 0x712C,
- 0xF1A8, 0xF9D4, 0x208E, 0x4BC2, 0xF280, 0xF280, 0x4BC2, 0x208E, 0xF9D4, 0xF1A8, 0x712C,
- 0x0000, 0x0200, 0x0100, 0x0080, 0x0040, 0x0020, 0x0010, 0x0008, 0x0004, 0x0002, 0x0001,
- 0x02DC, 0x016E, 0x00B7, 0x0287, 0x039F, 0x0313, 0x0355, 0x0376, 0x01BB, 0x0201, 0x03DC,
- 0x01EE, 0x00F7, 0x02A7, 0x038F, 0x031B, 0x00FC, 0x00FC, 0x0198, 0x0198, 0x0168, 0x0350,
- 0x01B4, 0x01B4, 0x0089, 0x002C, 0x0058, 0x002C, 0x0400, 0x0000, 0x0003, 0xFAED, 0xFED0,
- 0x09E2, 0x166A, 0x1BEF, 0x166A, 0x09E2, 0xFED0, 0xFAED, 0x2715, 0x58EB, 0x58EB, 0x2715,
- 0xFF8F, 0xFF25, 0xFEA1, 0xFE12, 0xFD8A, 0xFD26, 0xFD04, 0xFD43, 0xFE00, 0xFF4E, 0x0139,
- 0x03B9, 0x06BB, 0x0A1A, 0x0DA5, 0x111F, 0x144B, 0x16EC, 0x18CC, 0x19C7, 0x19C7, 0x18CC,
- 0x16EC, 0x144B, 0x111F, 0x0DA5, 0x0A1A, 0x06BB, 0x03B9, 0x0139, 0xFF4E, 0xFE00, 0xFD43,
- 0xFD04, 0xFD26, 0xFD8A, 0xFE12, 0xFEA1, 0xFF25, 0xFF8F, 0x0002, 0x0004, 0x47B3, 0xBAC5,
- 0x0B85, 0x0005, 0x299A, 0x0004, 0x000A, 0x0660, 0x0CCD, 0x0003, 0x0006, 0x0080, 0x002C,
- 0x0020, 0x0027, 0xFF4F, 0xFDB1, 0xFE2E, 0x0465, 0x0EF1, 0x161E, 0x1382, 0x0983, 0x007B,
- 0xFD66, 0xFE7D, 0xFFE2, 0x0031, 0x000D, 0x4000, 0xFD24, 0x513A, 0xCAEC, 0x3514, 0xAEC6,
- 0x02DC, 0x4000, 0xEFB5, 0x6EAE, 0x8DAB, 0x7255, 0x9152, 0x104B, 0x2518, 0x1FBB, 0x14A2,
- 0x0D6A, 0x08B9, 0x05AC, 0x03B0, 0x0266, 0x018F, 0x0104, 0x00A9, 0x006E, 0x0047, 0x0001,
- 0x0164, 0x019A, 0x0001, 0x0002, 0x0000, 0x0000, 0x0000, 0x0000, 0x7FFF, 0x0000, 0x0100,
- 0xF500, 0x1C00, 0x5A00, 0x0100, 0xFF00, 0xF800, 0x2000, 0x4F00, 0x0100, 0xFE00, 0xFC00,
- 0x2200, 0x4700, 0x0000, 0xFD00, 0x0100, 0x2300, 0x3D00, 0xFF00, 0xFE00, 0x0500, 0x2200,
- 0x3600, 0xFF00, 0xFF00, 0x0900, 0x2100, 0x2F00, 0x0000, 0x0100, 0x0C00, 0x1F00, 0x2900,
- 0x0000, 0x0300, 0x0E00, 0x1D00, 0x2500, 0x0000, 0x0000, 0x0000, 0x0000, 0x7FFF, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0004, 0x0008, 0x0308, 0x0312, 0x01CC, 0x017C, 0x0019,
- 0x0000, 0x0000, 0x0000, 0x0000, 0xE000, 0x1840, 0xC880, 0xFFEE, 0x0000, 0x4000, 0x2680,
- 0xFF81, 0xE000, 0x5000, 0xD080, 0xFFB3, 0xF800, 0x4500, 0xD380, 0xFFE2, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0F80, 0xDB80, 0x21C0, 0xFFCC, 0x0000, 0xC680, 0x0540, 0x0023, 0x33C0,
- 0xDAC0, 0x5900, 0xFFDA, 0x0AC0, 0xDF80, 0x1940, 0xFFF7, 0x7FFF, 0x50C3, 0x47FA, 0x4026,
- 0x392C, 0x32F5, 0x2D6A, 0x287A, 0x2413, 0x2027, 0x1CA8, 0x198A, 0x16C3, 0x1449, 0x1214,
- 0x101D, 0x0E5D, 0x0CCD, 0x0B68, 0x0A2B, 0x0910, 0x0813, 0x0015, 0x0002, 0x0080, 0x2848,
- 0x051F, 0x0001, 0x0010, 0xFC40, 0xFC40, 0xFD94, 0xFD80, 0xFE80, 0xFE80, 0xFE7C, 0xFE7F,
- 0x02F4, 0x0001, 0x0080, 0x0080, 0x1000, 0x0080, 0x1000, 0x1000, 0x0400, 0x599A, 0x199A,
- 0x0666, 0x0021, 0x2000, 0x2000, 0x2000, 0xFFE4, 0x0032, 0x000A, 0x2000, 0x4000, 0x0800,
- 0x0400, 0x000C, 0x0005, 0x000C, 0x00FF, 0x083D, 0x4000, 0x062F, 0x404C, 0x01B9, 0x4052,
- 0x0155, 0x405B, 0x0704, 0x4069, 0x0786, 0x4071, 0x0E9A, 0x4077, 0x0FEB, 0x4080, 0x0000,
- 0x0000, 0xFFD5, 0x0001, 0x0375, 0x001E, 0x0AAB, 0x2000, 0x2AAB, 0x0040, 0x0005, 0x001E,
- 0x4093, 0xFEE0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000
-};
-
-const unsigned short bin_coeff_E2[] = {
- 0x0000, 0x01FF, 0x0400, 0x0006, 0x2AAB, 0x0324, 0x0324, 0x0324, 0x010C, 0x010C, 0x010C,
- 0x1111, 0x1259, 0x0001, 0x005A, 0x0E9B, 0x0FFF, 0x0FFF, 0x0020, 0x0001, 0x0001, 0x0CCD,
- 0xFFE0, 0xFFD8, 0x00FF, 0xFFAC, 0xFFBC, 0xFF00, 0x0020, 0x0048, 0x0050, 0x0050, 0x000E,
- 0x0002, 0x7000, 0x0800, 0xFFF8, 0x0008, 0x002B, 0xFFF6, 0xFFF8, 0xFFFE, 0x0003, 0x0008,
- 0x000D, 0x000F, 0x0014, 0x0019, 0x0000, 0x0800, 0x6580, 0x0000, 0x0000, 0x7FFF, 0x0008,
- 0x0078, 0xFEF5, 0xFEE8, 0x0003, 0x0080, 0x0080, 0x0080, 0x0300, 0x0006, 0xC080, 0xF000,
- 0x0660, 0xDA80, 0x0000, 0x0001, 0x0001, 0xFFE4, 0xFFE8, 0x0080, 0x0034, 0x0001, 0xFFFF,
- 0x0001, 0xFFFE, 0x3AC0, 0x3340, 0x2BC0, 0x07C0, 0x05C0, 0x03E0, 0x0008, 0x1000, 0x2000,
- 0xFF01, 0xFFE5, 0xFFE9, 0x0DA8, 0x000E, 0xF75E, 0x1136, 0xEC7B, 0x0D3C, 0xFA9A, 0xFC47,
- 0xF58B, 0x1055, 0x3DDA, 0x3DDA, 0x1055, 0xF58B, 0xFC47, 0x1B17, 0x362A, 0x1B17, 0x67DA,
- 0xA798, 0xFDA6, 0xF8BE, 0xF36E, 0xF0D4, 0xF368, 0xFB18, 0x04E8, 0x0C98, 0x0F2C, 0x0C92,
- 0x0742, 0x025A, 0x0028, 0x0029, 0x0028, 0x0029, 0x0028, 0x0029, 0x0028, 0x0028, 0x0029,
- 0x0028, 0x0029, 0x0028, 0x0028, 0x0029, 0x0028, 0x0029, 0x0028, 0x0029, 0x0028, 0x712C,
- 0xF1A8, 0xF9D4, 0x208E, 0x4BC2, 0xF280, 0xF280, 0x4BC2, 0x208E, 0xF9D4, 0xF1A8, 0x712C,
- 0x0000, 0x0200, 0x0100, 0x0080, 0x0040, 0x0020, 0x0010, 0x0008, 0x0004, 0x0002, 0x0001,
- 0x02DC, 0x016E, 0x00B7, 0x0287, 0x039F, 0x0313, 0x0355, 0x0376, 0x01BB, 0x0201, 0x03DC,
- 0x01EE, 0x00F7, 0x02A7, 0x038F, 0x031B, 0x00FC, 0x00FC, 0x0198, 0x0198, 0x0168, 0x0350,
- 0x01B4, 0x01B4, 0x0089, 0x002C, 0x0058, 0x002C, 0x0400, 0x0000, 0x0003, 0xFAED, 0xFED0,
- 0x09E2, 0x166A, 0x1BEF, 0x166A, 0x09E2, 0xFED0, 0xFAED, 0x2715, 0x58EB, 0x58EB, 0x2715,
- 0xFF8F, 0xFF25, 0xFEA1, 0xFE12, 0xFD8A, 0xFD26, 0xFD04, 0xFD43, 0xFE00, 0xFF4E, 0x0139,
- 0x03B9, 0x06BB, 0x0A1A, 0x0DA5, 0x111F, 0x144B, 0x16EC, 0x18CC, 0x19C7, 0x19C7, 0x18CC,
- 0x16EC, 0x144B, 0x111F, 0x0DA5, 0x0A1A, 0x06BB, 0x03B9, 0x0139, 0xFF4E, 0xFE00, 0xFD43,
- 0xFD04, 0xFD26, 0xFD8A, 0xFE12, 0xFEA1, 0xFF25, 0xFF8F, 0x0002, 0x0004, 0x47B3, 0xBAC5,
- 0x0B85, 0x0005, 0x299A, 0x0004, 0x000A, 0x0660, 0x0CCD, 0x0003, 0x0006, 0x0080, 0x002C,
- 0x0020, 0x0027, 0xFF4F, 0xFDB1, 0xFE2E, 0x0465, 0x0EF1, 0x161E, 0x1382, 0x0983, 0x007B,
- 0xFD66, 0xFE7D, 0xFFE2, 0x0031, 0x000D, 0x4000, 0xFD24, 0x513A, 0xCAEC, 0x3514, 0xAEC6,
- 0x02DC, 0x4000, 0xEFB5, 0x6EAE, 0x8DAB, 0x7255, 0x9152, 0x104B, 0x2518, 0x1FBB, 0x14A2,
- 0x0D6A, 0x08B9, 0x05AC, 0x03B0, 0x0266, 0x018F, 0x0104, 0x00A9, 0x006E, 0x0047, 0x0001,
- 0x0164, 0x019A, 0x0001, 0x0002, 0x0000, 0x0000, 0x0000, 0x0000, 0x7FFF, 0x0000, 0x0100,
- 0xF500, 0x1C00, 0x5A00, 0x0100, 0xFF00, 0xF800, 0x2000, 0x4F00, 0x0100, 0xFE00, 0xFC00,
- 0x2200, 0x4700, 0x0000, 0xFD00, 0x0100, 0x2300, 0x3D00, 0xFF00, 0xFE00, 0x0500, 0x2200,
- 0x3600, 0xFF00, 0xFF00, 0x0900, 0x2100, 0x2F00, 0x0000, 0x0100, 0x0C00, 0x1F00, 0x2900,
- 0x0000, 0x0300, 0x0E00, 0x1D00, 0x2500, 0x0000, 0x0000, 0x0000, 0x0000, 0x7FFF, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0004, 0x0008, 0x0308, 0x0312, 0x01CC, 0x017C, 0x0019,
- 0x0000, 0x0000, 0x0000, 0x0000, 0xE000, 0x1840, 0xC880, 0xFFEE, 0x0000, 0x4000, 0x2680,
- 0xFF81, 0xE000, 0x5000, 0xD080, 0xFFB3, 0xF800, 0x4500, 0xD380, 0xFFE2, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0F80, 0xDB80, 0x21C0, 0xFFCC, 0x0000, 0xC680, 0x0540, 0x0023, 0x33C0,
- 0xDAC0, 0x5900, 0xFFDA, 0x0AC0, 0xDF80, 0x1940, 0xFFF7, 0x7FFF, 0x50C3, 0x47FA, 0x4026,
- 0x392C, 0x32F5, 0x2D6A, 0x287A, 0x2413, 0x2027, 0x1CA8, 0x198A, 0x16C3, 0x1449, 0x1214,
- 0x101D, 0x0E5D, 0x0CCD, 0x0B68, 0x0A2B, 0x0910, 0x0813, 0x0015, 0x0002, 0x0080, 0x2848,
- 0x051F, 0x0001, 0x0010, 0xFC40, 0xFC40, 0xFD94, 0xFD80, 0xFE80, 0xFE80, 0xFE7C, 0xFE7F,
- 0x02F4, 0x0001, 0x0080, 0x0080, 0x1000, 0x0080, 0x1000, 0x1000, 0x0400, 0x599A, 0x199A,
- 0x0666, 0x0021, 0x2000, 0x2000, 0x2000, 0xFFE4, 0x0032, 0x000A, 0x2000, 0x4000, 0x0800,
- 0x0400, 0x000C, 0x0005, 0x000C, 0x0038, 0x01A7, 0x4000, 0x0143, 0x4009, 0x0000, 0x0000,
- 0x0929, 0x4020, 0x0721, 0x4041, 0x0755, 0x4052, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0xFFD5, 0x0001, 0x0375, 0x001E, 0x0AAB, 0x2000, 0x2AAB, 0x0040, 0x0005, 0x001E,
- 0x0001, 0xFEE0, 0xFED8, 0xFED8, 0x0000, 0x0040, 0x40A2, 0x0000
-};
-
-const unsigned short bin_hw_coeff[] = {
- 0x0000, 0x0027, 0xfffd, 0xfffc, 0x0002, 0x000a, 0x0005, 0xfff4, 0xffed, 0x0004, 0x0024,
- 0x0018, 0xffd8, 0xffb1, 0x0006, 0x00cd, 0x0179, 0x0001, 0xfffd, 0x0004, 0x0000, 0x000b,
- 0xffe0, 0x0047, 0xff75, 0x0134, 0x04c4, 0xff9c, 0x000f, 0x0007, 0xfff7, 0x0006, 0x0001,
- 0x0008, 0xffdf, 0x005d, 0xff18, 0x034a, 0xff81, 0x03d9, 0x00a6, 0xfffe, 0x0012, 0xffa6,
- 0x0000
-};
diff --git a/drivers/misc/mediatek/fmradio/mt6628/inc/mt6628_fm.h b/drivers/misc/mediatek/fmradio/mt6628/inc/mt6628_fm.h
deleted file mode 100644
index 1792104ec..000000000
--- a/drivers/misc/mediatek/fmradio/mt6628/inc/mt6628_fm.h
+++ /dev/null
@@ -1,58 +0,0 @@
-/* mt6628_fm.h
- *
- * (C) Copyright 2009
- * MediaTek <www.MediaTek.com>
- * Hongcheng <hongcheng.xia@MediaTek.com>
- *
- * MT6628 FM Radio Driver -- head file
- *
- * 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.
- *
- * 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.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- */
-#ifndef __MT6628_FM_H__
-#define __MT6628_FM_H__
-
-#include "fm_typedef.h"
-
-/* #define FM_PowerOn_with_ShortAntenna */
-#define MT6628_RSSI_TH_LONG 0xFF01 /* FM radio long antenna RSSI threshold(11.375dBuV) */
-#define MT6628_RSSI_TH_SHORT 0xFEE0 /* FM radio short antenna RSSI threshold(-1dBuV) */
-#define MT6628_CQI_TH 0x00E9 /* FM radio Channel quality indicator threshold(0x0000~0x00FF) */
-#define MT6628_SEEK_SPACE 1 /* FM radio seek space,1:100KHZ; 2:200KHZ */
-#define MT6628_SCAN_CH_SIZE 40 /* FM radio scan max channel size */
-#define MT6628_BAND 1 /* FM radio band, 1:87.5MHz~108.0MHz; 2:76.0MHz~90.0MHz; 3:76.0MHz~108.0MHz; 4:special */
-#define MT6628_BAND_FREQ_L 875 /* FM radio special band low freq(Default 87.5MHz) */
-#define MT6628_BAND_FREQ_H 1080 /* FM radio special band high freq(Default 108.0MHz) */
-#define MT6628_DEEMPHASIS_50us TRUE
-
-#define MT6628_SLAVE_ADDR 0xE0 /* 0x70 7-bit address */
-#define MT6628_MAX_COUNT 100
-
-#ifdef CONFIG_MTK_FM_50KHZ_SUPPORT
-#define MT6628_SCANTBL_SIZE 26 /* 16*uinit16_t */
-#else
-#define MT6628_SCANTBL_SIZE 16 /* 16*uinit16_t */
-#endif
-
-#define AFC_ON 0x01
-#if AFC_ON
-#define FM_MAIN_CTRL_INIT 0x480
-#else
-#define FM_MAIN_CTRL_INIT 0x080
-#endif
-
-#define ext_clk /* if define ext_clk use external reference clock or mask will use internal */
-#define MT6628_DEV "MT6628"
-
-#endif /* end of #ifndef __MT6628_FM_H__ */
diff --git a/drivers/misc/mediatek/fmradio/mt6628/inc/mt6628_fm_cmd.h b/drivers/misc/mediatek/fmradio/mt6628/inc/mt6628_fm_cmd.h
deleted file mode 100644
index 93bbe4c8a..000000000
--- a/drivers/misc/mediatek/fmradio/mt6628/inc/mt6628_fm_cmd.h
+++ /dev/null
@@ -1,56 +0,0 @@
-#ifndef __MT6628_FM_CMD_H__
-#define __MT6628_FM_CMD_H__
-
-#include <linux/types.h>
-#include "fm_typedef.h"
-
-/* FM basic-operation's opcode */
-#define FM_BOP_BASE (0x80)
-enum {
- FM_WRITE_BASIC_OP = (FM_BOP_BASE + 0x00),
- FM_UDELAY_BASIC_OP = (FM_BOP_BASE + 0x01),
- FM_RD_UNTIL_BASIC_OP = (FM_BOP_BASE + 0x02),
- FM_MODIFY_BASIC_OP = (FM_BOP_BASE + 0x03),
- FM_MSLEEP_BASIC_OP = (FM_BOP_BASE + 0x04),
- FM_MAX_BASIC_OP = (FM_BOP_BASE + 0x05)
-};
-
-/* FM BOP's size */
-#define FM_WRITE_BASIC_OP_SIZE (3)
-#define FM_UDELAY_BASIC_OP_SIZE (4)
-#define FM_RD_UNTIL_BASIC_OP_SIZE (5)
-#define FM_MODIFY_BASIC_OP_SIZE (5)
-#define FM_MSLEEP_BASIC_OP_SIZE (4)
-
-fm_s32 mt6628_pwrup_fpga_on(fm_u8 *buf, fm_s32 buf_size);
-fm_s32 mt6628_pwrup_clock_on(fm_u8 *buf, fm_s32 buf_size);
-fm_s32 mt6628_pwrup_digital_init(fm_u8 *buf, fm_s32 buf_size);
-fm_s32 mt6628_pwrdown(fm_u8 *buf, fm_s32 buf_size);
-fm_s32 mt6628_rampdown(fm_u8 *buf, fm_s32 buf_size);
-fm_s32 mt6628_tune(fm_u8 *buf, fm_s32 buf_size, fm_u16 freq, fm_u16 chan_para);
-fm_s32 mt6628_seek(fm_u8 *buf, fm_s32 buf_size, fm_u16 seekdir, fm_u16 space, fm_u16 max_freq,
- fm_u16 min_freq);
-fm_s32 mt6628_scan(fm_u8 *buf, fm_s32 buf_size, fm_u16 scandir, fm_u16 space, fm_u16 max_freq,
- fm_u16 min_freq);
-fm_s32 mt6628_cqi_get(fm_u8 *buf, fm_s32 buf_size);
-fm_s32 mt6628_get_reg(fm_u8 *buf, fm_s32 buf_size, fm_u8 addr);
-fm_s32 mt6628_set_reg(fm_u8 *buf, fm_s32 buf_size, fm_u8 addr, fm_u16 value);
-fm_s32 mt6628_patch_download(fm_u8 *buf, fm_s32 buf_size, fm_u8 seg_num, fm_u8 seg_id,
- const fm_u8 *src, fm_s32 seg_len);
-fm_s32 mt6628_coeff_download(fm_u8 *buf, fm_s32 buf_size, fm_u8 seg_num, fm_u8 seg_id,
- const fm_u8 *src, fm_s32 seg_len);
-fm_s32 mt6628_hwcoeff_download(fm_u8 *buf, fm_s32 buf_size, fm_u8 seg_num, fm_u8 seg_id,
- const fm_u8 *src, fm_s32 seg_len);
-fm_s32 mt6628_rom_download(fm_u8 *buf, fm_s32 buf_size, fm_u8 seg_num, fm_u8 seg_id,
- const fm_u8 *src, fm_s32 seg_len);
-fm_s32 mt6628_full_cqi_req(fm_u8 *buf, fm_s32 buf_size, fm_u16 *freq, fm_s32 cnt, fm_s32 type);
-
-/*
- * fm_get_channel_space - get the spcace of gived channel
- * @freq - value in 760~1080 or 7600~10800
- *
- * Return 0, if 760~1080; return 1, if 7600 ~ 10800, else err code < 0
- */
-extern fm_s32 fm_get_channel_space(int freq);
-
-#endif
diff --git a/drivers/misc/mediatek/fmradio/mt6628/inc/mt6628_fm_cust_cfg.h b/drivers/misc/mediatek/fmradio/mt6628/inc/mt6628_fm_cust_cfg.h
deleted file mode 100644
index d216bca7a..000000000
--- a/drivers/misc/mediatek/fmradio/mt6628/inc/mt6628_fm_cust_cfg.h
+++ /dev/null
@@ -1,99 +0,0 @@
-/*
- *
- * (C) Copyright 20011
- * MediaTek <www.MediaTek.com>
- * Hongcheng Xia<Hongcheng.Xia@MediaTek.com>
- *
- * FM Radio Driver
- *
- * 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.
- *
- * 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.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- */
-
-#ifndef __FM_CUST_CFG_H__
-#define __FM_CUST_CFG_H__
-
-/* scan sort algorithm */
-enum {
- FM_SCAN_SORT_NON = 0,
- FM_SCAN_SORT_UP,
- FM_SCAN_SORT_DOWN,
- FM_SCAN_SORT_MAX
-};
-/*typedef struct {
- fm_s32 short_ana_rssi_th;
- fm_s32 long_ana_rssi_th;
- fm_s32 desene_rssi_th;
- fm_s32 pamd_th;
- fm_s32 mr_th;
- fm_s32 atdc_th;
- fm_u32 prx_th;
- fm_u32 atdev_th;
- fm_u16 smg_th;
- fm_u16 deemphasis;
- fm_u16 osc_freq;
-}mt6628_fm_rx_cust_cfg;
-
-typedef struct{
- mt6628_fm_rx_cust_cfg rx_cfg;
-}mt6628_fm_cust_cfg;
-*/
-/* ***************************************************************************************** */
-/* ***********************************FM config for customer: start****************************** */
-/* ***************************************************************************************** */
-/* RX */
-#define FM_RX_RSSI_TH_LONG_MT6628 -296 /* FM radio long antenna RSSI threshold(-4dBuV) */
-#define FM_RX_RSSI_TH_SHORT_MT6628 -296 /* FM radio short antenna RSSI threshold(-4dBuV) */
-#define FM_RX_DESENSE_RSSI_MT6628 -258
-#define FM_RX_PAMD_TH_MT6628 -12
-#define FM_RX_MR_TH_MT6628 -67
-#define FM_RX_ATDC_TH_MT6628 3496
-#define FM_RX_PRX_TH_MT6628 64
-#define FM_RX_SMG_TH_MT6628 16421 /* FM soft-mute gain threshold */
-#define FM_RX_DEEMPHASIS_MT6628 0 /* 0-50us, China Mainland; 1-75us China Taiwan */
-#define FM_RX_OSC_FREQ_MT6628 0 /* 0-26MHz; 1-19MHz; 2-24MHz; 3-38.4MHz; 4-40MHz; 5-52MHz */
-/* #define FM_RX_SEEK_SPACE_MT6628 1 //FM radio seek space,1:100KHZ; 2:200KHZ */
-/* #define FM_RX_SCAN_CH_SIZE_MT6628 40 //FM radio scan max channel size */
-/* #define FM_RX_BAND_MT6628 1 //FM radio band, 1:87.5MHz~108.0MHz; 2:76.0MHz~90.0MHz; 3:76.0MHz~108.0MHz; 4:special */
-/* #define FM_RX_SCAN_SORT_SELECT_MT6628 FM_SCAN_SORT_NON */
-/* #define FM_RX_FAKE_CH_NUM_MT6628 1 */
-/* #define FM_RX_FAKE_CH_RSSI_MT6628 40 */
-/* #define FM_RX_FAKE_CH_1_MT6628 1075 */
-/* #define FM_RX_FAKE_CH_2_MT6628 0 */
-/* #define FM_RX_FAKE_CH_3_MT6628 0 */
-/* #define FM_RX_FAKE_CH_4_MT6628 0 */
-/* #define FM_RX_FAKE_CH_5_MT6628 0 */
-
-/* TX */
-/* #define FM_TX_PWR_LEVEL_MAX_MT6628 120 */
-/* #define FM_TX_SCAN_HOLE_LOW_MT6628 923 //92.3MHz~95.4MHz should not show to user */
-/* #define FM_TX_SCAN_HOLE_HIGH_MT6628 954 //92.3MHz~95.4MHz should not show to user */
-
-
-/* ***************************************************************************************** */
-/* ***********************************FM config for customer:end ******************************* */
-/* ***************************************************************************************** */
-
-/* #define FM_SEEK_SPACE_MT6628 FM_RX_SEEK_SPACE_MT6628 */
-/* max scan chl num */
-/* #define FM_MAX_CHL_SIZ_MT6628E FM_RX_SCAN_CH_SIZE_MT6628 */
-/* auto HiLo */
-#define FM_AUTO_HILO_OFF_MT6628 0
-#define FM_AUTO_HILO_ON_MT6628 1
-
-
-/* seek threshold */
-#define FM_SEEKTH_LEVEL_DEFAULT_MT6628 4
-
-#endif /* __FM_CUST_CFG_H__ */
diff --git a/drivers/misc/mediatek/fmradio/mt6628/inc/mt6628_fm_lib.h b/drivers/misc/mediatek/fmradio/mt6628/inc/mt6628_fm_lib.h
deleted file mode 100644
index f5dee4d10..000000000
--- a/drivers/misc/mediatek/fmradio/mt6628/inc/mt6628_fm_lib.h
+++ /dev/null
@@ -1,71 +0,0 @@
-#ifndef __MT6628_FM_LIB_H__
-#define __MT6628_FM_LIB_H__
-
-#include "fm_typedef.h"
-
-enum {
- DSPPATCH = 0xFFF9,
- USDELAY = 0xFFFA,
- MSDELAY = 0xFFFB,
- HW_VER = 0xFFFD,
- POLL_N = 0xFFFE, /* poling check if bit(n) is '0' */
- POLL_P = 0xFFFF, /* polling check if bit(n) is '1' */
-};
-
-enum {
- FM_PUS_DSPPATCH = DSPPATCH,
- FM_PUS_USDELAY = USDELAY,
- FM_PUS_MSDELAY = MSDELAY,
- FM_PUS_HW_VER = HW_VER,
- FM_PUS_POLL_N = POLL_N, /* poling check if bit(n) is '0' */
- FM_PUS_POLL_P = POLL_P, /* polling check if bit(n) is '1' */
- FM_PUS_MAX
-};
-
-enum {
- DSP_PATH = 0x02,
- DSP_COEFF = 0x03,
- DSP_HW_COEFF = 0x04
-};
-
-enum IMG_TYPE {
- IMG_WRONG = 0,
- IMG_ROM,
- IMG_PATCH,
- IMG_COEFFICIENT,
- IMG_HW_COEFFICIENT
-};
-
-enum {
- mt6628_E1 = 0,
- mt6628_E2
-};
-
-struct mt6628_fm_cqi {
- fm_u16 ch;
- fm_u16 rssi;
- fm_u16 reserve;
-};
-
-struct adapt_fm_cqi {
- fm_s32 ch;
- fm_s32 rssi;
- fm_s32 reserve;
-};
-
-struct mt6628_full_cqi {
- fm_u16 ch;
- fm_u16 rssi;
- fm_u16 pamd;
- fm_u16 pr;
- fm_u16 fpamd;
- fm_u16 mr;
- fm_u16 atdc;
- fm_u16 prx;
- fm_u16 atdev;
- fm_u16 smg; /* soft-mute gain */
- fm_u16 drssi; /* delta rssi */
-};
-
-
-#endif
diff --git a/drivers/misc/mediatek/fmradio/mt6628/inc/mt6628_fm_link.h b/drivers/misc/mediatek/fmradio/mt6628/inc/mt6628_fm_link.h
deleted file mode 100644
index 51f47adc2..000000000
--- a/drivers/misc/mediatek/fmradio/mt6628/inc/mt6628_fm_link.h
+++ /dev/null
@@ -1,68 +0,0 @@
-/* mt6626_fm_ctrl_link.h
- *
- * (C) Copyright 2009
- * MediaTek <www.MediaTek.com>
- * Hongcheng <hongcheng.xia@MediaTek.com>
- *
- * MT6626 FM Radio Driver -- setup data link
- *
- * 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.
- *
- * 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.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- */
-#if 0
-#ifndef __MT6628_FM_LINK_H__
-#define __MT6628_FM_LINK_H__
-
-#include <linux/wait.h>
-#include "fm_link.h"
-#include "fm_utils.h"
-
-#define RX_BUF_SIZE 128
-#define TX_BUF_SIZE 1024
-
-#define SW_RETRY_CNT (1)
-#define SW_RETRY_CNT_MAX (5)
-#define SW_WAIT_TIMEOUT_MAX (100)
-
-/* FM operation timeout define for error handle */
-#define TEST_TIMEOUT (3)
-#define FSPI_EN_TIMEOUT (3)
-#define FSPI_MUXSEL_TIMEOUT (3)
-#define FSPI_RD_TIMEOUT (3)
-#define FSPI_WR_TIMEOUT (3)
-#define I2C_RD_TIMEOUT (3)
-#define I2C_WR_TIMEOUT (3)
-#define EN_TIMEOUT (3)
-#define RST_TIMEOUT (3)
-#define TUNE_TIMEOUT (3)
-#define SM_TUNE_TIMEOUT (6)
-#define SEEK_TIMEOUT (15)
-#define SCAN_TIMEOUT (15) /* usualy scan will cost 10 seconds */
-#define RDS_RX_EN_TIMEOUT (3)
-#define RDS_DATA_TIMEOUT (100)
-#define RAMPDOWN_TIMEOUT (3)
-#define MCUCLK_TIMEOUT (3)
-#define MODEMCLK_TIMEOUT (3)
-#define RDS_TX_TIMEOUT (3)
-#define PATCH_TIMEOUT (3)
-#define COEFF_TIMEOUT (3)
-#define HWCOEFF_TIMEOUT (3)
-#define ROM_TIMEOUT (3)
-
-struct fm_link_event {
- struct fm_flag_event *ln_event;
- struct fm_res_ctx result; /* seek/scan/read/RDS */
-};
-#endif
-#endif
diff --git a/drivers/misc/mediatek/fmradio/mt6628/inc/mt6628_fm_reg.h b/drivers/misc/mediatek/fmradio/mt6628/inc/mt6628_fm_reg.h
deleted file mode 100644
index 2b16c67e8..000000000
--- a/drivers/misc/mediatek/fmradio/mt6628/inc/mt6628_fm_reg.h
+++ /dev/null
@@ -1,89 +0,0 @@
-#ifndef __MT6628_FM_REG_H__
-#define __MT6628_FM_REG_H__
-
-enum MT6628_REG {
- FM_MAIN_CG1_CTRL = 0x60,
- FM_MAIN_CG2_CTRL = 0x61,
- FM_MAIN_HWVER = 0x62,
- FM_MAIN_CTRL = 0x63,
- FM_CHANNEL_SET = 0x65,
- FM_MAIN_CFG1 = 0x66,
- FM_MAIN_CFG2 = 0x67,
- FM_MAIN_MCLKDESENSE = 0x38,
- FM_MAIN_INTR = 0x69,
- FM_MAIN_INTRMASK = 0x6A,
- FM_MAIN_EXTINTRMASK = 0x6B,
- FM_RSSI_IND = 0x6C,
- FM_RSSI_TH = 0x6D,
- FM_MAIN_RESET = 0x6E,
- FM_MAIN_CHANDETSTAT = 0x6F,
- FM_RDS_CFG0 = 0x80,
- FM_RDS_INFO = 0x81,
- FM_RDS_DATA_REG = 0x82,
- FM_RDS_GOODBK_CNT = 0x83,
- FM_RDS_BADBK_CNT = 0x84,
- FM_RDS_PWDI = 0x85,
- FM_RDS_PWDQ = 0x86,
- FM_RDS_FIFO_STATUS0 = 0x87,
- FM_FT_CON9 = 0x8F,
- FM_DSP_PATCH_CTRL = 0x90,
- FM_DSP_PATCH_OFFSET = 0x91,
- FM_DSP_PATCH_DATA = 0x92,
- FM_DSP_MEM_CTRL4 = 0x93,
- FM_ADDR_PAMD = 0xB4,
- FM_RDS_BDGRP_ABD_CTRL_REG = 0xB6,
- FM_RDS_POINTER = 0xF0,
-};
-
-/* RDS_BDGRP_ABD_CTRL_REG */
-enum {
- BDGRP_ABD_EN = 0x0001,
- BER_RUN = 0x2000
-};
-#define FM_DAC_CON1 0x83
-#define FM_DAC_CON2 0x84
-#define FM_FT_CON0 0x86
-enum {
- FT_EN = 0x0001
-};
-
-#define FM_I2S_CON0 0x90
-enum {
- I2S_EN = 0x0001,
- FORMAT = 0x0002,
- WLEN = 0x0004,
- I2S_SRC = 0x0008
-};
-
-/* FM_MAIN_CTRL */
-enum {
- TUNE = 0x0001,
- SEEK = 0x0002,
- SCAN = 0x0004,
- CQI_READ = 0x0008,
- RDS_MASK = 0x0010,
- MUTE = 0x0020,
- RDS_BRST = 0x0040,
- RAMP_DOWN = 0x0100,
-};
-
-/* FM_MAIN_INTR */
-enum {
- FM_INTR_STC_DONE = 0x0001,
- FM_INTR_IQCAL_DONE = 0x0002,
- FM_INTR_DESENSE_HIT = 0x0004,
- FM_INTR_CHNL_CHG = 0x0008,
- FM_INTR_SW_INTR = 0x0010,
- FM_INTR_RDS = 0x0020
-};
-
-enum {
- ANTENNA_TYPE = 0x0010, /* 0x61 D4, 0:long, 1:short */
- ANALOG_I2S = 0x0080, /* 0x61 D7, 0:lineout, 1:I2S */
- DE_EMPHASIS = 0x1000, /* 0x61 D12,0:50us, 1:75 us */
-};
-
-#define OSC_FREQ_BITS 0x0070 /* 0x60 bit4~6 */
-#define OSC_FREQ_MASK (~OSC_FREQ_BITS)
-
-#endif /* __MT6628_FM_REG_H__ */
diff --git a/drivers/misc/mediatek/fmradio/mt6628/pub/mt6628_fm_cmd.c b/drivers/misc/mediatek/fmradio/mt6628/pub/mt6628_fm_cmd.c
deleted file mode 100644
index 38ffbcccc..000000000
--- a/drivers/misc/mediatek/fmradio/mt6628/pub/mt6628_fm_cmd.c
+++ /dev/null
@@ -1,939 +0,0 @@
-#include <linux/kernel.h>
-#include <linux/types.h>
-
-#include "fm_typedef.h"
-#include "fm_dbg.h"
-#include "fm_err.h"
-#include "fm_rds.h"
-#include "fm_config.h"
-#include "fm_link.h"
-
-#include "mt6628_fm_reg.h"
-/* #include "mt6628_fm_link.h" */
-#include "mt6628_fm.h"
-#include "mt6628_fm_cmd.h"
-#include "mt6628_fm_cust_cfg.h"
-
-extern fm_cust_cfg mt6628_fm_config;
-
-static fm_s32 fm_bop_write(fm_u8 addr, fm_u16 value, fm_u8 *buf, fm_s32 size)
-{
- if (size < (FM_WRITE_BASIC_OP_SIZE + 2)) {
- return (-1);
- }
-
- if (buf == NULL) {
- return (-2);
- }
-
- buf[0] = FM_WRITE_BASIC_OP;
- buf[1] = FM_WRITE_BASIC_OP_SIZE;
- buf[2] = addr;
- buf[3] = (fm_u8) ((value) & 0x00FF);
- buf[4] = (fm_u8) ((value >> 8) & 0x00FF);
-
- WCN_DBG(FM_DBG | CHIP, "%02x %02x %02x %02x %02x\n", buf[0], buf[1], buf[2], buf[3],
- buf[4]);
-
- return (FM_WRITE_BASIC_OP_SIZE + 2);
-}
-
-
-static fm_s32 fm_bop_udelay(fm_u32 value, fm_u8 *buf, fm_s32 size)
-{
- if (size < (FM_UDELAY_BASIC_OP_SIZE + 2)) {
- return (-1);
- }
-
- if (buf == NULL) {
- return (-2);
- }
-
- buf[0] = FM_UDELAY_BASIC_OP;
- buf[1] = FM_UDELAY_BASIC_OP_SIZE;
- buf[2] = (fm_u8) ((value) & 0x000000FF);
- buf[3] = (fm_u8) ((value >> 8) & 0x000000FF);
- buf[4] = (fm_u8) ((value >> 16) & 0x000000FF);
- buf[5] = (fm_u8) ((value >> 24) & 0x000000FF);
-
- WCN_DBG(FM_DBG | CHIP, "%02x %02x %02x %02x %02x %02x\n", buf[0], buf[1], buf[2], buf[3],
- buf[4], buf[5]);
-
- return (FM_UDELAY_BASIC_OP_SIZE + 2);
-}
-
-
-static fm_s32 fm_bop_rd_until(fm_u8 addr, fm_u16 mask, fm_u16 value, fm_u8 *buf, fm_s32 size)
-{
- if (size < (FM_RD_UNTIL_BASIC_OP_SIZE + 2)) {
- return (-1);
- }
-
- if (buf == NULL) {
- return (-2);
- }
-
- buf[0] = FM_RD_UNTIL_BASIC_OP;
- buf[1] = FM_RD_UNTIL_BASIC_OP_SIZE;
- buf[2] = addr;
- buf[3] = (fm_u8) ((mask) & 0x00FF);
- buf[4] = (fm_u8) ((mask >> 8) & 0x00FF);
- buf[5] = (fm_u8) ((value) & 0x00FF);
- buf[6] = (fm_u8) ((value >> 8) & 0x00FF);
-
- WCN_DBG(FM_DBG | CHIP, "%02x %02x %02x %02x %02x %02x %02x\n", buf[0], buf[1], buf[2],
- buf[3], buf[4], buf[5], buf[6]);
-
- return (FM_RD_UNTIL_BASIC_OP_SIZE + 2);
-}
-
-
-static fm_s32 fm_bop_modify(fm_u8 addr, fm_u16 mask_and, fm_u16 mask_or, fm_u8 *buf, fm_s32 size)
-{
- if (size < (FM_MODIFY_BASIC_OP_SIZE + 2)) {
- return (-1);
- }
-
- if (buf == NULL) {
- return (-2);
- }
-
- buf[0] = FM_MODIFY_BASIC_OP;
- buf[1] = FM_MODIFY_BASIC_OP_SIZE;
- buf[2] = addr;
- buf[3] = (fm_u8) ((mask_and) & 0x00FF);
- buf[4] = (fm_u8) ((mask_and >> 8) & 0x00FF);
- buf[5] = (fm_u8) ((mask_or) & 0x00FF);
- buf[6] = (fm_u8) ((mask_or >> 8) & 0x00FF);
-
- WCN_DBG(FM_DBG | CHIP, "%02x %02x %02x %02x %02x %02x %02x\n", buf[0], buf[1], buf[2],
- buf[3], buf[4], buf[5], buf[6]);
-
- return (FM_MODIFY_BASIC_OP_SIZE + 2);
-}
-
-#if 0
-static fm_s32 fm_bop_msleep(fm_u32 value, fm_u8 *buf, fm_s32 size)
-{
- if (size < (FM_MSLEEP_BASIC_OP_SIZE + 2)) {
- return (-1);
- }
-
- if (buf == NULL) {
- return (-2);
- }
-
- buf[0] = FM_MSLEEP_BASIC_OP;
- buf[1] = FM_MSLEEP_BASIC_OP_SIZE;
- buf[2] = (fm_u8) ((value) & 0x000000FF);
- buf[3] = (fm_u8) ((value >> 8) & 0x000000FF);
- buf[4] = (fm_u8) ((value >> 16) & 0x000000FF);
- buf[5] = (fm_u8) ((value >> 24) & 0x000000FF);
-
- WCN_DBG(FM_DBG | CHIP, "%02x %02x %02x %02x %02x %02x\n", buf[0], buf[1], buf[2], buf[3],
- buf[4], buf[5]);
-
- return (FM_MSLEEP_BASIC_OP_SIZE + 2);
-}
-#endif
-
-/*
-inline fm_s32 fm_get_channel_space(fm_s32 freq)
-{
- if ((freq >= 760) && (freq <= 1080)) {
- return 0;
- } else if ((freq >= 7600) && (freq <= 10800)) {
- return 1;
- } else {
- return -1;
- }
-}
-*/
-
-fm_s32 mt6628_pwrup_fpga_on(fm_u8 *buf, fm_s32 buf_size)
-{
- fm_s32 pkt_size = 0;
-
- if (buf_size < TX_BUF_SIZE) {
- return (-1);
- }
-
- buf[0] = FM_TASK_COMMAND_PKT_TYPE;
- buf[1] = FM_ENABLE_OPCODE;
- pkt_size = 4;
-
- /* Turn on Central Bias + FC */
- pkt_size += fm_bop_write(0x01, 0x4A00, &buf[pkt_size], buf_size - pkt_size);
- pkt_size += fm_bop_udelay(30000, &buf[pkt_size], buf_size - pkt_size); /* delay 30ms */
- pkt_size += fm_bop_write(0x01, 0x6A00, &buf[pkt_size], buf_size - pkt_size);
- pkt_size += fm_bop_udelay(50000, &buf[pkt_size], buf_size - pkt_size); /* delay 50ms */
- pkt_size += fm_bop_write(0x02, 0x099C, &buf[pkt_size], buf_size - pkt_size);
- pkt_size += fm_bop_write(0x01, 0x6B82, &buf[pkt_size], buf_size - pkt_size);
- pkt_size += fm_bop_write(0x04, 0x0142, &buf[pkt_size], buf_size - pkt_size);
- pkt_size += fm_bop_write(0x05, 0x00E7, &buf[pkt_size], buf_size - pkt_size);
- pkt_size += fm_bop_write(0x0A, 0x0060, &buf[pkt_size], buf_size - pkt_size);
- pkt_size += fm_bop_write(0x0C, 0xAF8F, &buf[pkt_size], buf_size - pkt_size);
- pkt_size += fm_bop_write(0x0D, 0x0888, &buf[pkt_size], buf_size - pkt_size);
- pkt_size += fm_bop_write(0x10, 0x0E8D, &buf[pkt_size], buf_size - pkt_size);
- pkt_size += fm_bop_write(0x27, 0x0104, &buf[pkt_size], buf_size - pkt_size);
- pkt_size += fm_bop_write(0x0e, 0x0040, &buf[pkt_size], buf_size - pkt_size);
- pkt_size += fm_bop_write(0x03, 0x9860, &buf[pkt_size], buf_size - pkt_size);
- pkt_size += fm_bop_write(0x3F, 0xAD16, &buf[pkt_size], buf_size - pkt_size);
- pkt_size += fm_bop_write(0x3E, 0x3280, &buf[pkt_size], buf_size - pkt_size);
- pkt_size += fm_bop_write(0x06, 0x0125, &buf[pkt_size], buf_size - pkt_size);
- pkt_size += fm_bop_write(0x08, 0x15B8, &buf[pkt_size], buf_size - pkt_size);
- pkt_size += fm_bop_write(0x28, 0x0000, &buf[pkt_size], buf_size - pkt_size);
- pkt_size += fm_bop_write(0x00, 0x0167, &buf[pkt_size], buf_size - pkt_size);
- pkt_size += fm_bop_write(0x3A, 0x0004, &buf[pkt_size], buf_size - pkt_size);
- pkt_size += fm_bop_write(0x25, 0x0403, &buf[pkt_size], buf_size - pkt_size);
- pkt_size += fm_bop_write(0x20, 0x2720, &buf[pkt_size], buf_size - pkt_size);
- pkt_size += fm_bop_write(0x22, 0x9980, &buf[pkt_size], buf_size - pkt_size);
- pkt_size += fm_bop_write(0x25, 0x0803, &buf[pkt_size], buf_size - pkt_size);
- pkt_size += fm_bop_write(0x1E, 0x0863, &buf[pkt_size], buf_size - pkt_size);
- pkt_size += fm_bop_udelay(50000, &buf[pkt_size], buf_size - pkt_size); /* delay 50ms */
- pkt_size += fm_bop_write(0x1E, 0x0865, &buf[pkt_size], buf_size - pkt_size);
- pkt_size += fm_bop_udelay(50000, &buf[pkt_size], buf_size - pkt_size); /* delay 50ms */
- pkt_size += fm_bop_write(0x1E, 0x0871, &buf[pkt_size], buf_size - pkt_size);
- pkt_size += fm_bop_write(0x2A, 0x1020, &buf[pkt_size], buf_size - pkt_size);
- pkt_size += fm_bop_udelay(100000, &buf[pkt_size], buf_size - pkt_size); /* delay 100ms */
- pkt_size += fm_bop_write(0x00, 0x01E7, &buf[pkt_size], buf_size - pkt_size);
- pkt_size += fm_bop_udelay(1000, &buf[pkt_size], buf_size - pkt_size); /* delay 1ms */
- pkt_size += fm_bop_write(0x1B, 0x0094, &buf[pkt_size], buf_size - pkt_size);
- pkt_size += fm_bop_write(0x1B, 0x0095, &buf[pkt_size], buf_size - pkt_size);
- pkt_size += fm_bop_udelay(200000, &buf[pkt_size], buf_size - pkt_size); /* delay 100ms */
- pkt_size += fm_bop_write(0x1B, 0x0094, &buf[pkt_size], buf_size - pkt_size);
- pkt_size += fm_bop_write(0x00, 0x0167, &buf[pkt_size], buf_size - pkt_size);
- pkt_size += fm_bop_write(0x01, 0x6B8A, &buf[pkt_size], buf_size - pkt_size);
- pkt_size += fm_bop_udelay(1000, &buf[pkt_size], buf_size - pkt_size); /* delay 1ms */
- pkt_size += fm_bop_write(0x00, 0xC167, &buf[pkt_size], buf_size - pkt_size);
- pkt_size += fm_bop_write(0x0C, 0xAF8F, &buf[pkt_size], buf_size - pkt_size);
- pkt_size += fm_bop_udelay(30000, &buf[pkt_size], buf_size - pkt_size); /* delay 1ms */
- pkt_size += fm_bop_write(0x00, 0xF167, &buf[pkt_size], buf_size - pkt_size);
- pkt_size += fm_bop_write(0x37, 0x2590, &buf[pkt_size], buf_size - pkt_size);
- pkt_size += fm_bop_write(0x09, 0x2964, &buf[pkt_size], buf_size - pkt_size);
- pkt_size += fm_bop_write(0x2E, 0x0008, &buf[pkt_size], buf_size - pkt_size);
- pkt_size += fm_bop_write(0x11, 0x37D4, &buf[pkt_size], buf_size - pkt_size);
- pkt_size += fm_bop_write(0x2B, 0x0032, &buf[pkt_size], buf_size - pkt_size);
- pkt_size += fm_bop_write(0x2C, 0x0019, &buf[pkt_size], buf_size - pkt_size);
- pkt_size += fm_bop_write(0x71, 0x607F, &buf[pkt_size], buf_size - pkt_size);
- pkt_size += fm_bop_write(0x72, 0x878F, &buf[pkt_size], buf_size - pkt_size);
- pkt_size += fm_bop_write(0x73, 0x07C3, &buf[pkt_size], buf_size - pkt_size);
- pkt_size += fm_bop_write(0x28, 0x0000, &buf[pkt_size], buf_size - pkt_size);
- pkt_size += fm_bop_write(0x64, 0x0001, &buf[pkt_size], buf_size - pkt_size);
- pkt_size += fm_bop_write(0x6D, 0x1AB2, &buf[pkt_size], buf_size - pkt_size);
- pkt_size += fm_bop_write(0x9C, 0x0040, &buf[pkt_size], buf_size - pkt_size);
- pkt_size += fm_bop_write(0x9F, 0x0000, &buf[pkt_size], buf_size - pkt_size);
- pkt_size += fm_bop_write(0xB4, 0x8810, &buf[pkt_size], buf_size - pkt_size);
- pkt_size += fm_bop_write(0xB8, 0x006A, &buf[pkt_size], buf_size - pkt_size);
- pkt_size += fm_bop_write(0xBB, 0x006B, &buf[pkt_size], buf_size - pkt_size);
- pkt_size += fm_bop_write(0xCB, 0x00B3, &buf[pkt_size], buf_size - pkt_size);
- pkt_size += fm_bop_write(0xE0, 0xA301, &buf[pkt_size], buf_size - pkt_size);
- pkt_size += fm_bop_write(0xE4, 0x008F, &buf[pkt_size], buf_size - pkt_size);
- pkt_size += fm_bop_write(0x9E, 0x2B24, &buf[pkt_size], buf_size - pkt_size);
- pkt_size += fm_bop_write(0xCC, 0x0886, &buf[pkt_size], buf_size - pkt_size);
- pkt_size += fm_bop_write(0xDC, 0x036A, &buf[pkt_size], buf_size - pkt_size);
- pkt_size += fm_bop_write(0xDD, 0x836A, &buf[pkt_size], buf_size - pkt_size);
- pkt_size += fm_bop_write(0x0F, 0x1AA8, &buf[pkt_size], buf_size - pkt_size);
- pkt_size += fm_bop_write(0x9F, 0x0000, &buf[pkt_size], buf_size - pkt_size);
- pkt_size += fm_bop_udelay(100000, &buf[pkt_size], buf_size - pkt_size); /* delay 100ms */
- pkt_size += fm_bop_write(0x63, 0x0480, &buf[pkt_size], buf_size - pkt_size);
- pkt_size += fm_bop_udelay(100000, &buf[pkt_size], buf_size - pkt_size); /* delay 100ms */
- pkt_size += fm_bop_write(0x63, 0x0481, &buf[pkt_size], buf_size - pkt_size);
-
- pkt_size += fm_bop_write(0x6C, 0x0020, &buf[pkt_size], buf_size - pkt_size);
- pkt_size += fm_bop_write(0x45, 0x1FFF, &buf[pkt_size], buf_size - pkt_size);
- pkt_size += fm_bop_write(0x25, 0x040F, &buf[pkt_size], buf_size - pkt_size);
-
- pkt_size += fm_bop_write(0x28, 0x7E57, &buf[pkt_size], buf_size - pkt_size);
- pkt_size += fm_bop_write(0x11, 0x37DC, &buf[pkt_size], buf_size - pkt_size);
- pkt_size += fm_bop_write(0x07, 0x1140, &buf[pkt_size], buf_size - pkt_size);
- pkt_size += fm_bop_write(0x27, 0x005C, &buf[pkt_size], buf_size - pkt_size);
- pkt_size += fm_bop_write(0x42, 0x0016, &buf[pkt_size], buf_size - pkt_size);
- pkt_size += fm_bop_write(0x44, 0x006F, &buf[pkt_size], buf_size - pkt_size);
- pkt_size += fm_bop_write(0x46, 0x1DEF, &buf[pkt_size], buf_size - pkt_size);
- pkt_size += fm_bop_write(0x47, 0x0210, &buf[pkt_size], buf_size - pkt_size);
- pkt_size += fm_bop_write(0x55, 0x0001, &buf[pkt_size], buf_size - pkt_size);
- pkt_size += fm_bop_write(0x54, 0x8001, &buf[pkt_size], buf_size - pkt_size);
- pkt_size += fm_bop_write(0xA0, 0xD0B2, &buf[pkt_size], buf_size - pkt_size);
-
- buf[2] = (fm_u8) ((pkt_size - 4) & 0x00FF);
- buf[3] = (fm_u8) (((pkt_size - 4) >> 8) & 0x00FF);
-
- return pkt_size;
-}
-
-
-/*
- * mt6628_pwrup_clock_on - Wholechip FM Power Up: step 1, FM Digital Clock enable
- * @buf - target buf
- * @buf_size - buffer size
- * return package size
- */
-fm_s32 mt6628_pwrup_clock_on(fm_u8 *buf, fm_s32 buf_size)
-{
- fm_s32 pkt_size = 0;
- fm_u16 de_emphasis;
- fm_u16 osc_freq;
-
- if (buf_size < TX_BUF_SIZE) {
- return (-1);
- }
-
- de_emphasis = mt6628_fm_config.rx_cfg.deemphasis; /* MT6628fm_cust_config_fetch(FM_CFG_RX_DEEMPHASIS); */
- de_emphasis &= 0x0001; /* rang 0~1 */
- osc_freq = mt6628_fm_config.rx_cfg.osc_freq; /* MT6628fm_cust_config_fetch(FM_CFG_RX_OSC_FREQ); */
- osc_freq &= 0x0007; /* rang 0~5 */
-
- buf[0] = FM_TASK_COMMAND_PKT_TYPE;
- buf[1] = FM_ENABLE_OPCODE;
- pkt_size = 4;
-
- /* FM Digital Clock enable */
- pkt_size += fm_bop_write(0x60, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* wr 60 0000 */
- pkt_size += fm_bop_write(0x60, 0x0001, &buf[pkt_size], buf_size - pkt_size); /* wr 60 0001 */
- pkt_size += fm_bop_udelay(3000, &buf[pkt_size], buf_size - pkt_size); /* delay 3ms */
- pkt_size += fm_bop_write(0x60, 0x0003, &buf[pkt_size], buf_size - pkt_size); /* wr 60 0003 */
- pkt_size += fm_bop_write(0x60, 0x0007, &buf[pkt_size], buf_size - pkt_size); /* wr 60 0007 */
- pkt_size += fm_bop_modify(0x70, 0xFFBF, 0x0040, &buf[pkt_size], buf_size - pkt_size); /* wr 70 D6 = 1 */
- /* no low power mode, analog line in, long antenna */
- pkt_size += fm_bop_modify(0x61, 0xFF63, 0x0000, &buf[pkt_size], buf_size - pkt_size);
- pkt_size +=
- fm_bop_modify(0x61, ~DE_EMPHASIS, (de_emphasis << 12), &buf[pkt_size],
- buf_size - pkt_size);
- pkt_size +=
- fm_bop_modify(0x60, OSC_FREQ_MASK, (osc_freq << 4), &buf[pkt_size],
- buf_size - pkt_size);
-
- buf[2] = (fm_u8) ((pkt_size - 4) & 0x00FF);
- buf[3] = (fm_u8) (((pkt_size - 4) >> 8) & 0x00FF);
-
- return pkt_size;
-}
-
-
-/*
- * mt6628_patch_download - Wholechip FM Power Up: step 3, download patch to f/w,
- * @buf - target buf
- * @buf_size - buffer size
- * @seg_num - total segments that this patch divided into
- * @seg_id - No. of Segments: segment that will now be sent
- * @src - patch source buffer
- * @seg_len - segment size: segment that will now be sent
- * return package size
- */
-fm_s32 mt6628_patch_download(fm_u8 *buf, fm_s32 buf_size, fm_u8 seg_num, fm_u8 seg_id,
- const fm_u8 *src, fm_s32 seg_len)
-{
- fm_s32 pkt_size = 0;
- fm_u8 *dst = NULL;
-
- if (buf_size < TX_BUF_SIZE) {
- return (-1);
- }
-
- buf[0] = FM_TASK_COMMAND_PKT_TYPE;
- buf[1] = FM_PATCH_DOWNLOAD_OPCODE;
- pkt_size = 4;
-
- buf[pkt_size++] = seg_num;
- buf[pkt_size++] = seg_id;
-
- if (seg_len > (buf_size - pkt_size)) {
- return -1;
- }
-
- dst = &buf[pkt_size];
- pkt_size += seg_len;
-
- /* copy patch to tx buffer */
- while (seg_len--) {
- *dst = *src;
- /* pr_debug("%02x ", *dst); */
- src++;
- dst++;
- }
-
- buf[2] = (fm_u8) ((pkt_size - 4) & 0x00FF);
- buf[3] = (fm_u8) (((pkt_size - 4) >> 8) & 0x00FF);
- WCN_DBG(FM_DBG | CHIP, "%02x %02x %02x %02x %02x %02x %02x\n", buf[0], buf[1], buf[2],
- buf[3], buf[4], buf[5], buf[6]);
-
- return pkt_size;
-}
-
-
-/*
- * mt6628_coeff_download - Wholechip FM Power Up: step 3,download coeff to f/w,
- * @buf - target buf
- * @buf_size - buffer size
- * @seg_num - total segments that this patch divided into
- * @seg_id - No. of Segments: segment that will now be sent
- * @src - patch source buffer
- * @seg_len - segment size: segment that will now be sent
- * return package size
- */
-fm_s32 mt6628_coeff_download(fm_u8 *buf, fm_s32 buf_size, fm_u8 seg_num, fm_u8 seg_id,
- const fm_u8 *src, fm_s32 seg_len)
-{
- fm_s32 pkt_size = 0;
- fm_u8 *dst = NULL;
-
- if (buf_size < TX_BUF_SIZE) {
- return (-1);
- }
-
- buf[0] = FM_TASK_COMMAND_PKT_TYPE;
- buf[1] = FM_COEFF_DOWNLOAD_OPCODE;
- pkt_size = 4;
-
- buf[pkt_size++] = seg_num;
- buf[pkt_size++] = seg_id;
-
- if (seg_len > (buf_size - pkt_size)) {
- return -1;
- }
-
- dst = &buf[pkt_size];
- pkt_size += seg_len;
-
- /* copy patch to tx buffer */
- while (seg_len--) {
- *dst = *src;
- /* pr_debug("%02x ", *dst); */
- src++;
- dst++;
- }
-
- buf[2] = (fm_u8) ((pkt_size - 4) & 0x00FF);
- buf[3] = (fm_u8) (((pkt_size - 4) >> 8) & 0x00FF);
- WCN_DBG(FM_DBG | CHIP, "%02x %02x %02x %02x %02x %02x %02x\n", buf[0], buf[1], buf[2],
- buf[3], buf[4], buf[5], buf[6]);
-
- return pkt_size;
-}
-
-
-/*
- * mt6628_hwcoeff_download - Wholechip FM Power Up: step 3,download hwcoeff to f/w,
- * @buf - target buf
- * @buf_size - buffer size
- * @seg_num - total segments that this patch divided into
- * @seg_id - No. of Segments: segment that will now be sent
- * @src - patch source buffer
- * @seg_len - segment size: segment that will now be sent
- * return package size
- */
-fm_s32 mt6628_hwcoeff_download(fm_u8 *buf, fm_s32 buf_size, fm_u8 seg_num, fm_u8 seg_id,
- const fm_u8 *src, fm_s32 seg_len)
-{
- fm_s32 pkt_size = 0;
- fm_u8 *dst = NULL;
-
- if (buf_size < TX_BUF_SIZE) {
- return (-1);
- }
-
- buf[0] = FM_TASK_COMMAND_PKT_TYPE;
- buf[1] = FM_HWCOEFF_DOWNLOAD_OPCODE;
- pkt_size = 4;
-
- buf[pkt_size++] = seg_num;
- buf[pkt_size++] = seg_id;
-
- if (seg_len > (buf_size - pkt_size)) {
- return -1;
- }
-
- dst = &buf[pkt_size];
- pkt_size += seg_len;
-
- /* copy patch to tx buffer */
- while (seg_len--) {
- *dst = *src;
- /* pr_debug("%02x ", *dst); */
- src++;
- dst++;
- }
-
- buf[2] = (fm_u8) ((pkt_size - 4) & 0x00FF);
- buf[3] = (fm_u8) (((pkt_size - 4) >> 8) & 0x00FF);
- WCN_DBG(FM_DBG | CHIP, "%02x %02x %02x %02x %02x %02x %02x\n", buf[0], buf[1], buf[2],
- buf[3], buf[4], buf[5], buf[6]);
-
- return pkt_size;
-}
-
-
-/*
- * mt6628_rom_download - Wholechip FM Power Up: step 3,download rom to f/w,
- * @buf - target buf
- * @buf_size - buffer size
- * @seg_num - total segments that this patch divided into
- * @seg_id - No. of Segments: segment that will now be sent
- * @src - patch source buffer
- * @seg_len - segment size: segment that will now be sent
- * return package size
- */
-fm_s32 mt6628_rom_download(fm_u8 *buf, fm_s32 buf_size, fm_u8 seg_num, fm_u8 seg_id,
- const fm_u8 *src, fm_s32 seg_len)
-{
- fm_s32 pkt_size = 0;
- fm_u8 *dst = NULL;
-
- if (buf_size < TX_BUF_SIZE) {
- return (-1);
- }
-
- buf[0] = FM_TASK_COMMAND_PKT_TYPE;
- buf[1] = FM_ROM_DOWNLOAD_OPCODE;
- pkt_size = 4;
-
- buf[pkt_size++] = seg_num;
- buf[pkt_size++] = seg_id;
-
- if (seg_len > (buf_size - pkt_size)) {
- return -1;
- }
-
- dst = &buf[pkt_size];
- pkt_size += seg_len;
-
- /* copy patch to tx buffer */
- while (seg_len--) {
- *dst = *src;
- /* pr_debug("%02x ", *dst); */
- src++;
- dst++;
- }
-
- buf[2] = (fm_u8) ((pkt_size - 4) & 0x00FF);
- buf[3] = (fm_u8) (((pkt_size - 4) >> 8) & 0x00FF);
- WCN_DBG(FM_DBG | CHIP, "%02x %02x %02x %02x %02x %02x %02x\n", buf[0], buf[1], buf[2],
- buf[3], buf[4], buf[5], buf[6]);
-
- return pkt_size;
-}
-
-
-/*
- * mt6628_pwrup_digital_init - Wholechip FM Power Up: step 4, FM Digital Init: fm_rgf_maincon
- * @buf - target buf
- * @buf_size - buffer size
- * return package size
- */
-fm_s32 mt6628_pwrup_digital_init(fm_u8 *buf, fm_s32 buf_size)
-{
- fm_s32 pkt_size = 0;
-
- if (buf_size < TX_BUF_SIZE) {
- return (-1);
- }
-
- buf[0] = FM_TASK_COMMAND_PKT_TYPE;
- buf[1] = FM_ENABLE_OPCODE;
- pkt_size = 4;
-
- /* Wholechip FM Power Up: FM Digital Init: fm_rgf_maincon */
- pkt_size += fm_bop_write(0x6A, 0x2100, &buf[pkt_size], buf_size - pkt_size); /* wr 6A 2100 */
- pkt_size += fm_bop_write(0x6B, 0x2100, &buf[pkt_size], buf_size - pkt_size); /* wr 6B 2100 */
- pkt_size += fm_bop_modify(0x60, 0xFFF7, 0x0008, &buf[pkt_size], buf_size - pkt_size); /* wr 60 D3=1 */
- pkt_size += fm_bop_modify(0x61, 0xFFFD, 0x0002, &buf[pkt_size], buf_size - pkt_size); /* wr 61 D1=1 */
- pkt_size += fm_bop_modify(0x61, 0xFFFE, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* wr 61 D0=0 */
- pkt_size += fm_bop_udelay(200000, &buf[pkt_size], buf_size - pkt_size); /* delay 200ms */
- pkt_size += fm_bop_rd_until(0x64, 0x001F, 0x0002, &buf[pkt_size], buf_size - pkt_size); /* Poll 64[0~4] = 2 */
-
- buf[2] = (fm_u8) ((pkt_size - 4) & 0x00FF);
- buf[3] = (fm_u8) (((pkt_size - 4) >> 8) & 0x00FF);
-
- return pkt_size;
-}
-
-
-/*
- * mt6628_pwrdown - Wholechip FM Power down: Digital Modem Power Down
- * @buf - target buf
- * @buf_size - buffer size
- * return package size
- */
-fm_s32 mt6628_pwrdown(fm_u8 *buf, fm_s32 buf_size)
-{
- fm_s32 pkt_size = 0;
-
- if (buf_size < TX_BUF_SIZE) {
- return (-1);
- }
-
- buf[0] = FM_TASK_COMMAND_PKT_TYPE;
- buf[1] = FM_ENABLE_OPCODE;
- pkt_size = 4;
-
- /* Disable HW clock control */
- pkt_size += fm_bop_write(0x60, 0x330F, &buf[pkt_size], buf_size - pkt_size); /* wr 60 330F */
- /* Reset ASIP */
- pkt_size += fm_bop_write(0x61, 0x0001, &buf[pkt_size], buf_size - pkt_size); /* wr 61 0001 */
- /* digital core + digital rgf reset */
- pkt_size += fm_bop_modify(0x6E, 0xFFF8, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* wr 6E[0~2] 0 */
- pkt_size += fm_bop_modify(0x6E, 0xFFF8, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* wr 6E[0~2] 0 */
- pkt_size += fm_bop_modify(0x6E, 0xFFF8, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* wr 6E[0~2] 0 */
- pkt_size += fm_bop_modify(0x6E, 0xFFF8, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* wr 6E[0~2] 0 */
- /* Disable all clock */
- pkt_size += fm_bop_write(0x60, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* wr 60 0000 */
- /* Reset rgfrf */
- pkt_size += fm_bop_write(0x60, 0x4000, &buf[pkt_size], buf_size - pkt_size); /* wr 60 4000 */
- pkt_size += fm_bop_write(0x60, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* wr 60 0000 */
-
- buf[2] = (fm_u8) ((pkt_size - 4) & 0x00FF);
- buf[3] = (fm_u8) (((pkt_size - 4) >> 8) & 0x00FF);
-
- return pkt_size;
-}
-
-
-/*
- * mt6628_rampdown - f/w will wait for STC_DONE interrupt
- * @buf - target buf
- * @buf_size - buffer size
- * return package size
- */
-fm_s32 mt6628_rampdown(fm_u8 *buf, fm_s32 buf_size)
-{
- fm_s32 pkt_size = 0;
-
- if (buf_size < TX_BUF_SIZE) {
- return (-1);
- }
-
- buf[0] = FM_TASK_COMMAND_PKT_TYPE;
- buf[1] = FM_RAMPDOWN_OPCODE;
- pkt_size = 4;
-
- /* Clear DSP state */
- pkt_size += fm_bop_modify(FM_MAIN_CTRL, 0xFFF0, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* wr 63[3:0] = 0 */
- /* Set DSP ramp down state */
- pkt_size += fm_bop_modify(FM_MAIN_CTRL, 0xFFFF, RAMP_DOWN, &buf[pkt_size], buf_size - pkt_size); /* wr 63[8] = 1 */
- /* @Wait for STC_DONE interrupt@ */
- pkt_size += fm_bop_rd_until(FM_MAIN_INTR, FM_INTR_STC_DONE, FM_INTR_STC_DONE, &buf[pkt_size], buf_size - pkt_size); /* Poll 69[0] = b'1 */
- /* Clear DSP ramp down state */
- pkt_size += fm_bop_modify(FM_MAIN_CTRL, (~RAMP_DOWN), 0x0000, &buf[pkt_size], buf_size - pkt_size); /* wr 63[8] = 0 */
- /* Write 1 clear the STC_DONE interrupt status flag */
- pkt_size += fm_bop_modify(FM_MAIN_INTR, 0xFFFF, FM_INTR_STC_DONE, &buf[pkt_size], buf_size - pkt_size); /* wr 69[0] = 1 */
-
- buf[2] = (fm_u8) ((pkt_size - 4) & 0x00FF);
- buf[3] = (fm_u8) (((pkt_size - 4) >> 8) & 0x00FF);
-
- return pkt_size;
-}
-
-
-/*
- * mt6628_tune - execute tune action,
- * @buf - target buf
- * @buf_size - buffer size
- * @freq - 760 ~ 1080, 100KHz unit
- * return package size
- */
-fm_s32 mt6628_tune(fm_u8 *buf, fm_s32 buf_size, fm_u16 freq, fm_u16 chan_para)
-{
- /* #define FM_TUNE_USE_POLL */
- fm_s32 pkt_size = 0;
-
- if (buf_size < TX_BUF_SIZE) {
- return (-1);
- }
-
- if (0 == fm_get_channel_space(freq)) {
- freq *= 10;
- }
-
- freq = (freq - 6400) * 2 / 10;
-
- buf[0] = FM_TASK_COMMAND_PKT_TYPE;
- buf[1] = FM_TUNE_OPCODE;
- pkt_size = 4;
-
- /* Set desired channel & channel parameter */
-#ifdef FM_TUNE_USE_POLL
- pkt_size += fm_bop_write(0x6A, 0x0000, &buf[pkt_size], buf_size - pkt_size);
- pkt_size += fm_bop_write(0x6B, 0x0000, &buf[pkt_size], buf_size - pkt_size);
-#endif
- pkt_size += fm_bop_modify(FM_CHANNEL_SET, 0xFC00, freq, &buf[pkt_size], buf_size - pkt_size); /* set 0x65[9:0] = 0x029e, => ((97.5 - 64) * 20) */
- /* channel para setting, D15~D12, D15: ATJ, D13: HL, D12: FA */
- pkt_size +=
- fm_bop_modify(FM_CHANNEL_SET, 0x0FFF, (chan_para << 12), &buf[pkt_size],
- buf_size - pkt_size);
- /* Enable hardware controlled tuning sequence */
- pkt_size += fm_bop_modify(FM_MAIN_CTRL, 0xFFF8, TUNE, &buf[pkt_size], buf_size - pkt_size); /* set 0x63[0] = 1 */
- /* Wait for STC_DONE interrupt */
-#ifdef FM_TUNE_USE_POLL
- pkt_size += fm_bop_rd_until(FM_MAIN_INTR, FM_INTR_STC_DONE, FM_INTR_STC_DONE, &buf[pkt_size], buf_size - pkt_size); /* Poll 69[0] = b'1 */
- /* Write 1 clear the STC_DONE interrupt status flag */
- pkt_size += fm_bop_modify(FM_MAIN_INTR, 0xFFFF, FM_INTR_STC_DONE, &buf[pkt_size], buf_size - pkt_size); /* wr 69[0] = 1 */
-#endif
- buf[2] = (fm_u8) ((pkt_size - 4) & 0x00FF);
- buf[3] = (fm_u8) (((pkt_size - 4) >> 8) & 0x00FF);
-
- return pkt_size;
-}
-
-
-/*
- * mt6628_full_cqi_req - execute request cqi info action,
- * @buf - target buf
- * @buf_size - buffer size
- * @freq - 7600 ~ 10800, freq array
- * @cnt - channel count
- * @type - request type, 1: a single channel; 2: multi channel; 3:multi channel with 100Khz step; 4: multi channel with 50Khz step
- *
- * return package size
- */
-fm_s32 mt6628_full_cqi_req(fm_u8 *buf, fm_s32 buf_size, fm_u16 *freq, fm_s32 cnt, fm_s32 type)
-{
- fm_s32 pkt_size = 0;
-
- if (buf_size < TX_BUF_SIZE) {
- return (-1);
- }
-
- buf[0] = FM_TASK_COMMAND_PKT_TYPE;
- buf[1] = FM_SOFT_MUTE_TUNE_OPCODE;
- pkt_size = 4;
-
- switch (type) {
- case 1:
- buf[pkt_size] = 0x0001;
- pkt_size++;
- buf[pkt_size] = (fm_u8) ((*freq) & 0x00FF);
- pkt_size++;
- buf[pkt_size] = (fm_u8) ((*freq >> 8) & 0x00FF);
- pkt_size++;
- break;
- case 2:
- buf[pkt_size] = 0x0002;
- pkt_size++;
- break;
- case 3:
- buf[pkt_size] = 0x0003;
- pkt_size++;
- break;
- case 4:
- buf[pkt_size] = 0x0004;
- pkt_size++;
- break;
- default:
- buf[pkt_size] = (fm_u16) type;
- pkt_size++;
- break;
- }
-
- buf[2] = (fm_u8) ((pkt_size - 4) & 0x00FF);
- buf[3] = (fm_u8) (((pkt_size - 4) >> 8) & 0x00FF);
-
- return pkt_size;
-}
-
-
-/*
- * mt6628_seek - execute seek action,
- * @buf - target buf
- * @buf_size - buffer size
- * @seekdir - 0=seek up, 1=seek down
- * @space - step, 50KHz:001, 100KHz:010, 200KHz:100
- * @max_freq - upper bound
- * @min_freq - lower bound
- * return package size
- */
-fm_s32 mt6628_seek(fm_u8 *buf, fm_s32 buf_size, fm_u16 seekdir, fm_u16 space, fm_u16 max_freq,
- fm_u16 min_freq)
-{
- fm_s32 pkt_size = 0;
-
- if (buf_size < TX_BUF_SIZE) {
- return (-1);
- }
-
- if (0 == fm_get_channel_space(max_freq)) {
- max_freq *= 10;
- }
-
- if (0 == fm_get_channel_space(min_freq)) {
- min_freq *= 10;
- }
-
- buf[0] = FM_TASK_COMMAND_PKT_TYPE;
- buf[1] = FM_SEEK_OPCODE;
- pkt_size = 4;
-
- /* Program seek direction */
- if (seekdir == 0) {
- pkt_size += fm_bop_modify(FM_MAIN_CFG1, 0xFBFF, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* 0x66[10] = 0, seek up */
- } else {
- pkt_size += fm_bop_modify(FM_MAIN_CFG1, 0xFBFF, 0x0400, &buf[pkt_size], buf_size - pkt_size); /* 0x66[10] = 1, seek down */
- }
-
- /* Program scan channel spacing */
- if (space == 1) {
- pkt_size += fm_bop_modify(FM_MAIN_CFG1, 0x8FFF, 0x1000, &buf[pkt_size], buf_size - pkt_size); /* clear 0x66[14:12] then 0x66[14:12]=001 */
- } else if (space == 2) {
- pkt_size += fm_bop_modify(FM_MAIN_CFG1, 0x8FFF, 0x2000, &buf[pkt_size], buf_size - pkt_size); /* clear 0x66[14:12] then 0x66[14:12]=010 */
- } else if (space == 4) {
- pkt_size += fm_bop_modify(FM_MAIN_CFG1, 0x8FFF, 0x4000, &buf[pkt_size], buf_size - pkt_size); /* clear 0x66[14:12] then 0x66[14:12]=100 */
- }
- /* enable wrap , if it is not auto scan function, 0x66[11] 0=no wrarp, 1=wrap */
- pkt_size += fm_bop_modify(FM_MAIN_CFG1, 0xF7FF, 0x0800, &buf[pkt_size], buf_size - pkt_size); /* 0x66[11] = 1, wrap */
- /* 0x66[9:0] freq upper bound */
-
- max_freq = (max_freq - 6400) * 2 / 10;
-
- pkt_size +=
- fm_bop_modify(FM_MAIN_CFG1, 0xFC00, max_freq, &buf[pkt_size], buf_size - pkt_size);
- /* 0x67[9:0] freq lower bound */
-
- min_freq = (min_freq - 6400) * 2 / 10;
-
- pkt_size +=
- fm_bop_modify(FM_MAIN_CFG2, 0xFC00, min_freq, &buf[pkt_size], buf_size - pkt_size);
- /* Enable hardware controlled seeking sequence */
- pkt_size += fm_bop_modify(FM_MAIN_CTRL, 0xFFF8, SEEK, &buf[pkt_size], buf_size - pkt_size); /* 0x63[1] = 1 */
- /* Wait for STC_DONE interrupt */
- /* pkt_size += fm_bop_rd_until(FM_MAIN_INTR, FM_INTR_STC_DONE, FM_INTR_STC_DONE, &buf[pkt_size], buf_size - pkt_size);//Poll 69[0] = b'1 */
- /* Write 1 clear the STC_DONE interrupt status flag */
- /* pkt_size += fm_bop_modify(FM_MAIN_INTR, 0xFFFF, FM_INTR_STC_DONE, &buf[pkt_size], buf_size - pkt_size);//wr 69[0] = 1 */
-
- buf[2] = (fm_u8) ((pkt_size - 4) & 0x00FF);
- buf[3] = (fm_u8) (((pkt_size - 4) >> 8) & 0x00FF);
-
- return pkt_size;
-}
-
-
-/*
- * mt6628_scan - execute scan action,
- * @buf - target buf
- * @buf_size - buffer size
- * @scandir - 0=seek up, 1=seek down
- * @space - step, 50KHz:001, 100KHz:010, 200KHz:100
- * @max_freq - upper bound
- * @min_freq - lower bound
- * return package size
- */
-fm_s32 mt6628_scan(fm_u8 *buf, fm_s32 buf_size, fm_u16 scandir, fm_u16 space, fm_u16 max_freq,
- fm_u16 min_freq)
-{
- fm_s32 pkt_size = 0;
-
- if (buf_size < TX_BUF_SIZE) {
- return (-1);
- }
-
- if (0 == fm_get_channel_space(max_freq)) {
- max_freq *= 10;
- }
- if (0 == fm_get_channel_space(min_freq)) {
- min_freq *= 10;
- }
-
- buf[0] = FM_TASK_COMMAND_PKT_TYPE;
- buf[1] = FM_SCAN_OPCODE;
- pkt_size = 4;
-
- /* Program seek direction */
- if (scandir == 0) {
- pkt_size += fm_bop_modify(FM_MAIN_CFG1, 0xFBFF, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* 0x66[10] = 0, seek up */
- } else {
- pkt_size += fm_bop_modify(FM_MAIN_CFG1, 0xFFFF, 0x0400, &buf[pkt_size], buf_size - pkt_size); /* 0x66[10] = 1, seek down */
- }
-
- /* Program scan channel spacing */
- if (space == 1) {
- pkt_size += fm_bop_modify(FM_MAIN_CFG1, 0x8FFF, 0x1000, &buf[pkt_size], buf_size - pkt_size); /* clear 0x66[14:12] then 0x66[14:12]=001 */
- } else if (space == 2) {
- pkt_size += fm_bop_modify(FM_MAIN_CFG1, 0x8FFF, 0x2000, &buf[pkt_size], buf_size - pkt_size); /* clear 0x66[14:12] then 0x66[14:12]=010 */
- } else if (space == 4) {
- pkt_size += fm_bop_modify(FM_MAIN_CFG1, 0x8FFF, 0x4000, &buf[pkt_size], buf_size - pkt_size); /* clear 0x66[14:12] then 0x66[14:12]=100 */
- }
- /* disable wrap , if it is auto scan function, 0x66[11] 0=no wrarp, 1=wrap */
- pkt_size += fm_bop_modify(FM_MAIN_CFG1, 0xF7FF, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* 0x66[11] = 0, no wrap */
- /* 0x66[9:0] freq upper bound */
-
- max_freq = (max_freq - 6400) * 2 / 10;
-
- pkt_size +=
- fm_bop_modify(FM_MAIN_CFG1, 0xFC00, max_freq, &buf[pkt_size], buf_size - pkt_size);
- /* 0x67[9:0] freq lower bound */
-
- min_freq = (min_freq - 6400) * 2 / 10;
-
- pkt_size +=
- fm_bop_modify(FM_MAIN_CFG2, 0xFC00, min_freq, &buf[pkt_size], buf_size - pkt_size);
- /* Enable hardware controlled scanning sequence */
- pkt_size += fm_bop_modify(FM_MAIN_CTRL, 0xFFF8, SCAN, &buf[pkt_size], buf_size - pkt_size); /* 0x63[1] = 1 */
- /* Wait for STC_DONE interrupt */
- /* pkt_size += fm_bop_rd_until(FM_MAIN_INTR, FM_INTR_STC_DONE, FM_INTR_STC_DONE, &buf[pkt_size], buf_size - pkt_size);//Poll 69[0] = b'1 */
- /* Write 1 clear the STC_DONE interrupt status flag */
- /* pkt_size += fm_bop_modify(FM_MAIN_INTR, 0xFFFF, FM_INTR_STC_DONE, &buf[pkt_size], buf_size - pkt_size);//wr 69[0] = 1 */
-
- buf[2] = (fm_u8) ((pkt_size - 4) & 0x00FF);
- buf[3] = (fm_u8) (((pkt_size - 4) >> 8) & 0x00FF);
-
- return pkt_size;
-}
-
-
-fm_s32 mt6628_cqi_get(fm_u8 *buf, fm_s32 buf_size)
-{
- fm_s32 pkt_size = 0;
-
- if (buf_size < TX_BUF_SIZE) {
- return (-1);
- }
-
- buf[0] = FM_TASK_COMMAND_PKT_TYPE;
- buf[1] = FM_SCAN_OPCODE;
- pkt_size = 4;
-
- pkt_size += fm_bop_modify(FM_MAIN_CTRL, 0xFFF0, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* wr 63 bit0~2 0 */
- pkt_size += fm_bop_modify(FM_MAIN_CTRL, ~CQI_READ, CQI_READ, &buf[pkt_size], buf_size - pkt_size); /* wr 63 bit3 1 */
-
- buf[2] = (fm_u8) ((pkt_size - 4) & 0x00FF);
- buf[3] = (fm_u8) (((pkt_size - 4) >> 8) & 0x00FF);
-
- return pkt_size;
-}
-
-
-fm_s32 mt6628_get_reg(fm_u8 *buf, fm_s32 buf_size, fm_u8 addr)
-{
- if (buf_size < TX_BUF_SIZE) {
- return (-1);
- }
-
- buf[0] = FM_TASK_COMMAND_PKT_TYPE;
- buf[1] = FSPI_READ_OPCODE;
- buf[2] = 0x01;
- buf[3] = 0x00;
- buf[4] = addr;
-
- WCN_DBG(FM_DBG | CHIP, "%02x %02x %02x %02x %02x\n", buf[0], buf[1], buf[2], buf[3],
- buf[4]);
- return 5;
-}
-
-
-fm_s32 mt6628_set_reg(fm_u8 *buf, fm_s32 buf_size, fm_u8 addr, fm_u16 value)
-{
- if (buf_size < TX_BUF_SIZE) {
- return (-1);
- }
-
- buf[0] = FM_TASK_COMMAND_PKT_TYPE;
- buf[1] = FSPI_WRITE_OPCODE;
- buf[2] = 0x03;
- buf[3] = 0x00;
- buf[4] = addr;
- buf[5] = (fm_u8) ((value) & 0x00FF);
- buf[6] = (fm_u8) ((value >> 8) & 0x00FF);
-
- WCN_DBG(FM_DBG | CHIP, "%02x %02x %02x %02x %02x %02x %02x\n", buf[0], buf[1], buf[2],
- buf[3], buf[4], buf[5], buf[6]);
- return 7;
-}
diff --git a/drivers/misc/mediatek/fmradio/mt6628/pub/mt6628_fm_config.c b/drivers/misc/mediatek/fmradio/mt6628/pub/mt6628_fm_config.c
deleted file mode 100644
index 4aba259f9..000000000
--- a/drivers/misc/mediatek/fmradio/mt6628/pub/mt6628_fm_config.c
+++ /dev/null
@@ -1,298 +0,0 @@
-/* fm_config.c
- *
- * (C) Copyright 2011
- * MediaTek <www.MediaTek.com>
- * hongcheng <hongcheng.xia@MediaTek.com>
- *
- * FM Radio Driver
- *
- * 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.
- *
- * 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.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- */
-#include <linux/string.h>
-#include <linux/slab.h>
-
-#include "fm_typedef.h"
-#include "fm_rds.h"
-#include "fm_dbg.h"
-#include "fm_err.h"
-#include "fm_stdlib.h"
-#include "fm_patch.h"
-#include "fm_config.h"
-/* #include "fm_cust_cfg.h" */
-#include "mt6628_fm_cust_cfg.h"
-fm_cust_cfg mt6628_fm_config;
-/* static fm_s32 fm_index = 0; */
-
-static fm_s32 MT6628fm_cust_config_print(fm_cust_cfg *cfg)
-{
- WCN_DBG(FM_NTC | MAIN, "MT6628 rssi_l:\t%d\n", cfg->rx_cfg.long_ana_rssi_th);
- WCN_DBG(FM_NTC | MAIN, "MT6628 rssi_s:\t%d\n", cfg->rx_cfg.short_ana_rssi_th);
- WCN_DBG(FM_NTC | MAIN, "MT6628 pamd_th:\t%d\n", cfg->rx_cfg.pamd_th);
- WCN_DBG(FM_NTC | MAIN, "MT6628 mr_th:\t%d\n", cfg->rx_cfg.mr_th);
- WCN_DBG(FM_NTC | MAIN, "MT6628 atdc_th:\t%d\n", cfg->rx_cfg.atdc_th);
- WCN_DBG(FM_NTC | MAIN, "MT6628 prx_th:\t%d\n", cfg->rx_cfg.prx_th);
- WCN_DBG(FM_NTC | MAIN, "MT6628 atdev_th:\t%d\n", cfg->rx_cfg.atdev_th);
- WCN_DBG(FM_NTC | MAIN, "MT6628 smg_th:\t%d\n", cfg->rx_cfg.smg_th);
- WCN_DBG(FM_NTC | MAIN, "de_emphasis:\t%d\n", cfg->rx_cfg.deemphasis);
- WCN_DBG(FM_NTC | MAIN, "osc_freq:\t%d\n", cfg->rx_cfg.osc_freq);
-
- WCN_DBG(FM_NTC | MAIN, "aud path[%d]I2S state[%d]mode[%d]rate[%d]\n", cfg->aud_cfg.aud_path,
- cfg->aud_cfg.i2s_info.status, cfg->aud_cfg.i2s_info.mode,
- cfg->aud_cfg.i2s_info.rate);
- return 0;
-}
-
-static fm_s32 MT6628cfg_item_handler(fm_s8 *grp, fm_s8 *key, fm_s8 *val, fm_cust_cfg *cfg)
-{
- fm_s32 ret = 0;
- struct fm_rx_cust_cfg *rx_cfg = &cfg->rx_cfg;
-
- if (0 <= (ret = cfg_item_match(key, val, "FM_RX_RSSI_TH_LONG_MT6628", &rx_cfg->long_ana_rssi_th))) { /* FMR_RSSI_TH_L = 0x0301 */
- return ret;
- } else if (0 <=
- (ret =
- cfg_item_match(key, val, "FM_RX_RSSI_TH_SHORT_MT6628",
- &rx_cfg->short_ana_rssi_th))) {
- return ret;
- } else if (0 <=
- (ret =
- cfg_item_match(key, val, "FM_RX_DESENSE_RSSI_MT6628",
- &rx_cfg->desene_rssi_th))) {
- return ret;
- } else if (0 <= (ret = cfg_item_match(key, val, "FM_RX_PAMD_TH_MT6628", &rx_cfg->pamd_th))) {
- return ret;
- } else if (0 <= (ret = cfg_item_match(key, val, "FM_RX_MR_TH_MT6628", &rx_cfg->mr_th))) {
- return ret;
- } else if (0 <= (ret = cfg_item_match(key, val, "FM_RX_ATDC_TH_MT6628", &rx_cfg->atdc_th))) {
- return ret;
- } else if (0 <= (ret = cfg_item_match(key, val, "FM_RX_PRX_TH_MT6628", &rx_cfg->prx_th))) {
- return ret;
- }
- /*else if (0 <= (ret = cfg_item_match(key, val, "FM_RX_ATDEV_TH_MT6628", &rx_cfg->atdev_th)))
- {
- return ret;
- } */
- else if (0 <= (ret = cfg_item_match(key, val, "FM_RX_SMG_TH_MT6628", &rx_cfg->smg_th))) {
- return ret;
- } else if (0 <=
- (ret =
- cfg_item_match(key, val, "FM_RX_DEEMPHASIS_MT6628", &rx_cfg->deemphasis))) {
- return ret;
- } else if (0 <=
- (ret = cfg_item_match(key, val, "FM_RX_OSC_FREQ_MT6628", &rx_cfg->osc_freq))) {
- return ret;
- } else {
- WCN_DBG(FM_WAR | MAIN, "MT6628 invalid key\n");
- return -1;
- }
-}
-
-static fm_s32 MT6628fm_cust_config_default(fm_cust_cfg *cfg)
-{
- FMR_ASSERT(cfg);
-
- cfg->rx_cfg.long_ana_rssi_th = FM_RX_RSSI_TH_LONG_MT6628;
- cfg->rx_cfg.short_ana_rssi_th = FM_RX_RSSI_TH_SHORT_MT6628;
- cfg->rx_cfg.desene_rssi_th = FM_RX_DESENSE_RSSI_MT6628;
- cfg->rx_cfg.pamd_th = FM_RX_PAMD_TH_MT6628;
- cfg->rx_cfg.mr_th = FM_RX_MR_TH_MT6628;
- cfg->rx_cfg.atdc_th = FM_RX_ATDC_TH_MT6628;
- cfg->rx_cfg.prx_th = FM_RX_PRX_TH_MT6628;
- cfg->rx_cfg.smg_th = FM_RX_SMG_TH_MT6628;
- cfg->rx_cfg.deemphasis = FM_RX_DEEMPHASIS_MT6628;
- cfg->rx_cfg.osc_freq = FM_RX_OSC_FREQ_MT6628;
-
-#ifdef CONFIG_MTK_MERGE_INTERFACE_SUPPORT
- cfg->aud_cfg.aud_path = FM_AUD_MRGIF;
- cfg->aud_cfg.i2s_info.status = FM_I2S_OFF;
- cfg->aud_cfg.i2s_info.mode = FM_I2S_SLAVE;
- cfg->aud_cfg.i2s_info.rate = FM_I2S_44K;
- cfg->aud_cfg.i2s_pad = FM_I2S_PAD_IO;
-#elif defined FM_DIGITAL_INPUT
- cfg->aud_cfg.aud_path = FM_AUD_I2S;
- cfg->aud_cfg.i2s_info.status = FM_I2S_OFF;
- cfg->aud_cfg.i2s_info.mode = FM_I2S_SLAVE;
- cfg->aud_cfg.i2s_info.rate = FM_I2S_44K;
- cfg->aud_cfg.i2s_pad = FM_I2S_PAD_IO;
-#elif defined FM_ANALOG_INPUT
- cfg->aud_cfg.aud_path = FM_AUD_ANALOG;
- cfg->aud_cfg.i2s_info.status = FM_I2S_STATE_ERR;
- cfg->aud_cfg.i2s_info.mode = FM_I2S_MODE_ERR;
- cfg->aud_cfg.i2s_info.rate = FM_I2S_SR_ERR;
- cfg->aud_cfg.i2s_pad = FM_I2S_PAD_ERR;
-#else
- cfg->aud_cfg.aud_path = FM_AUD_ERR;
- cfg->aud_cfg.i2s_info.status = FM_I2S_STATE_ERR;
- cfg->aud_cfg.i2s_info.mode = FM_I2S_MODE_ERR;
- cfg->aud_cfg.i2s_info.rate = FM_I2S_SR_ERR;
- cfg->aud_cfg.i2s_pad = FM_I2S_PAD_ERR;
-#endif
- return 0;
-}
-
-static fm_s32 MT6628fm_cust_config_file(const fm_s8 *filename, fm_cust_cfg *cfg)
-{
- fm_s32 ret = 0;
- fm_s8 *buf = NULL;
- fm_s32 file_len = 0;
-
- if (!(buf = fm_zalloc(4096))) {
- WCN_DBG(FM_ALT | MAIN, "-ENOMEM\n");
- return -ENOMEM;
- }
-/* fm_index = 0; */
-
- file_len = fm_file_read(filename, buf, 4096, 0);
-
- if (file_len <= 0) {
- ret = -1;
- goto out;
- }
-
- ret = cfg_parser(buf, MT6628cfg_item_handler, cfg);
-
- out:
-
- if (buf) {
- fm_free(buf);
- }
-
- return ret;
-}
-
-#define MT6628_FM_CUST_CFG_PATH "etc/fmr/fm_cust.cfg"
-fm_s32 MT6628fm_cust_config_setup(const fm_s8 *filepath)
-{
- fm_s32 ret = 0;
- fm_s8 *filep = NULL;
- fm_s8 file_path[51] = { 0 };
-
- MT6628fm_cust_config_default(&mt6628_fm_config);
- WCN_DBG(FM_NTC | MAIN, "MT6628 FM default config\n");
- MT6628fm_cust_config_print(&mt6628_fm_config);
-
- if (!filepath) {
- filep = MT6628_FM_CUST_CFG_PATH;
- } else {
- memcpy(file_path, filepath, (strlen(filepath) > 50) ? 50 : strlen(filepath));
- filep = file_path;
- trim_path(&filep);
- }
-
- ret = MT6628fm_cust_config_file(filep, &mt6628_fm_config);
- WCN_DBG(FM_NTC | MAIN, "MT6628 FM cust config\n");
- MT6628fm_cust_config_print(&mt6628_fm_config);
-
- return ret;
-}
-
-fm_u16 MT6628fm_cust_config_fetch(enum fm_cust_cfg_op op_code)
-{
-#if 0
- fm_u16 tmp = 0;
- fm_s32 i;
- static fm_s32 fake_ch_idx;
-
- switch (op_code) {
- /* For FM RX */
- case FM_CFG_RX_RSSI_TH_LONG:{
- tmp = mt6628_fm_config.rx_cfg.long_ana_rssi_th;
- break;
- }
- case FM_CFG_RX_RSSI_TH_SHORT:{
- tmp = mt6628_fm_config.rx_cfg.short_ana_rssi_th;
- break;
- }
- case FM_CFG_RX_CQI_TH:{
- tmp = mt6628_fm_config.rx_cfg.cqi_th;
- break;
- }
- case FM_CFG_RX_MR_TH:{
- tmp = mt6628_fm_config.rx_cfg.mr_th;
- break;
- }
- case FM_CFG_RX_SMG_TH:{
- tmp = mt6628_fm_config.rx_cfg.smg_th;
- break;
- }
- case FM_CFG_RX_SCAN_CH_SIZE:{
- tmp = mt6628_fm_config.rx_cfg.scan_ch_size;
- break;
- }
- case FM_CFG_RX_SEEK_SPACE:{
- tmp = mt6628_fm_config.rx_cfg.seek_space;
- break;
- }
- case FM_CFG_RX_BAND:{
- tmp = mt6628_fm_config.rx_cfg.band;
- break;
- }
- case FM_CFG_RX_BAND_FREQ_L:{
- tmp = mt6628_fm_config.rx_cfg.band_freq_l;
- break;
- }
- case FM_CFG_RX_BAND_FREQ_H:{
- tmp = mt6628_fm_config.rx_cfg.band_freq_h;
- break;
- }
- case FM_CFG_RX_SCAN_SORT:{
- tmp = mt6628_fm_config.rx_cfg.scan_sort;
- break;
- }
- case FM_CFG_RX_FAKE_CH_NUM:{
- tmp = mt6628_fm_config.rx_cfg.fake_ch_num;
- break;
- }
- case FM_CFG_RX_FAKE_CH:{
- tmp = mt6628_fm_config.rx_cfg.fake_ch[fake_ch_idx];
- i = (mt6628_fm_config.rx_cfg.fake_ch_num >
- 0) ? mt6628_fm_config.rx_cfg.fake_ch_num : FAKE_CH_MAX;
- fake_ch_idx++;
- fake_ch_idx = fake_ch_idx % i;
- break;
- }
- case FM_CFG_RX_FAKE_CH_RSSI:{
- tmp = mt6628_fm_config.rx_cfg.fake_ch_rssi_th;
- break;
- }
- case FM_CFG_RX_DEEMPHASIS:{
- tmp = mt6628_fm_config.rx_cfg.deemphasis;
- break;
- }
- case FM_CFG_RX_OSC_FREQ:{
- tmp = mt6628_fm_config.rx_cfg.osc_freq;
- break;
- }
- /* For FM TX */
- case FM_CFG_TX_SCAN_HOLE_LOW:{
- tmp = mt6628_fm_config.tx_cfg.scan_hole_low;
- break;
- }
- case FM_CFG_TX_SCAN_HOLE_HIGH:{
- tmp = mt6628_fm_config.tx_cfg.scan_hole_high;
- break;
- }
- case FM_CFG_TX_PWR_LEVEL:{
- tmp = mt6628_fm_config.tx_cfg.power_level;
- break;
- }
- default:
- break;
- }
-
- WCN_DBG(FM_DBG | MAIN, "mt6628_cust cfg %d: 0x%04x\n", op_code, tmp);
-#endif
- return 0;
-}
diff --git a/drivers/misc/mediatek/fmradio/mt6628/pub/mt6628_fm_lib.c b/drivers/misc/mediatek/fmradio/mt6628/pub/mt6628_fm_lib.c
deleted file mode 100644
index 8c83d111b..000000000
--- a/drivers/misc/mediatek/fmradio/mt6628/pub/mt6628_fm_lib.c
+++ /dev/null
@@ -1,1814 +0,0 @@
-#include <linux/delay.h>
-#include <linux/slab.h>
-#include <linux/vmalloc.h>
-
-#include "stp_exp.h"
-#include "wmt_exp.h"
-
-#include "fm_typedef.h"
-#include "fm_dbg.h"
-#include "fm_err.h"
-#include "fm_interface.h"
-#include "fm_stdlib.h"
-#include "fm_patch.h"
-#include "fm_utils.h"
-#include "fm_link.h"
-#include "fm_config.h"
-#include "fm_private.h"
-
-#include "mt6628_fm_reg.h"
-#include "mt6628_fm.h"
-/* #include "mt6628_drv_dsp.h" */
-/* #include "mt6628_fm_link.h" */
-#include "mt6628_fm_lib.h"
-#include "mt6628_fm_cmd.h"
-#include "mt6628_fm_cust_cfg.h"
-extern fm_cust_cfg mt6628_fm_config;
-
-#define MT6628_FM_PATCH_PATH "/etc/firmware/mt6628/mt6628_fm_patch.bin"
-#define MT6628_FM_COEFF_PATH "/etc/firmware/mt6628/mt6628_fm_coeff.bin"
-#define MT6628_FM_HWCOEFF_PATH "/etc/firmware/mt6628/mt6628_fm_hwcoeff.bin"
-#define MT6628_FM_ROM_PATH "/etc/firmware/mt6628/mt6628_fm_rom.bin"
-
-static struct fm_patch_tbl mt6628_patch_tbl[5] = {
- {FM_ROM_V1, "/etc/firmware/mt6628/mt6628_fm_v1_patch.bin",
- "/etc/firmware/mt6628/mt6628_fm_v1_coeff.bin", NULL, NULL},
- {FM_ROM_V2, "/etc/firmware/mt6628/mt6628_fm_v2_patch.bin",
- "/etc/firmware/mt6628/mt6628_fm_v2_coeff.bin", NULL, NULL},
- {FM_ROM_V3, "/etc/firmware/mt6628/mt6628_fm_v3_patch.bin",
- "/etc/firmware/mt6628/mt6628_fm_v3_coeff.bin", NULL, NULL},
- {FM_ROM_V4, "/etc/firmware/mt6628/mt6628_fm_v4_patch.bin",
- "/etc/firmware/mt6628/mt6628_fm_v4_coeff.bin", NULL, NULL},
- {FM_ROM_V5, "/etc/firmware/mt6628/mt6628_fm_v5_patch.bin",
- "/etc/firmware/mt6628/mt6628_fm_v5_coeff.bin", NULL, NULL},
-};
-
-static struct fm_hw_info mt6628_hw_info = {
- .chip_id = 0x00006628,
- .eco_ver = 0x00000000,
- .rom_ver = 0x00000000,
- .patch_ver = 0x00000000,
- .reserve = 0x00000000,
-};
-
-#define PATCH_SEG_LEN 512
-
-static fm_u8 *cmd_buf;
-static struct fm_lock *cmd_buf_lock;
-static struct fm_callback *fm_cb_op;
-static struct fm_res_ctx *res;
-/* static fm_s32 Chip_Version = mt6628_E1; */
-
-/* static fm_bool rssi_th_set = fm_false; */
-
-#ifdef MT6628_FM_FPGA
-#undef MT6628_FM_USE_6626EVB
-#endif
-
-#ifdef CONFIG_MTK_FM_50KHZ_SUPPORT
-static struct fm_fifo *cqi_fifo;
-#endif
-static fm_s32 mt6628_is_dese_chan(fm_u16 freq);
-static fm_s32 mt6628_mcu_dese(fm_u16 freq, void *arg);
-static fm_s32 mt6628_gps_dese(fm_u16 freq, void *arg);
-static fm_u16 mt6628_chan_para_get(fm_u16 freq);
-static fm_s32 mt6628_desense_check(fm_u16 freq, fm_s32 rssi);
-static fm_s32 mt6628_I2s_Setting(fm_s32 onoff, fm_s32 mode, fm_s32 sample);
-static fm_s32 mt6628_soft_mute_tune(fm_u16 freq, fm_s32 *rssi, fm_bool *valid);
-static fm_s32 mt6628_pwron(fm_s32 data)
-{
- /*//Turn on FM on 6628 chip by WMT driver
- if(MTK_WCN_BOOL_FALSE == mtk_wcn_wmt_func_on(WMTDRV_TYPE_LPBK)){
- WCN_DBG(FM_ALT|CHIP,"WMT turn on LPBK Fail!\n");
- return -FM_ELINK;
- }else{
- WCN_DBG(FM_ALT|CHIP,"WMT turn on LPBK OK!\n");
- //return 0;
- } */
- if (MTK_WCN_BOOL_FALSE == mtk_wcn_wmt_func_on(WMTDRV_TYPE_FM)) {
- WCN_DBG(FM_ALT | CHIP, "WMT turn on FM Fail!\n");
- return -FM_ELINK;
- } else {
- WCN_DBG(FM_ALT | CHIP, "WMT turn on FM OK!\n");
- return 0;
- }
-}
-
-
-static fm_s32 mt6628_pwroff(fm_s32 data)
-{
- if (MTK_WCN_BOOL_FALSE == mtk_wcn_wmt_func_off(WMTDRV_TYPE_FM)) {
- WCN_DBG(FM_ALT | CHIP, "WMT turn off FM Fail!\n");
- return -FM_ELINK;
- } else {
- WCN_DBG(FM_NTC | CHIP, "WMT turn off FM OK!\n");
- return 0;
- }
-}
-
-static fm_s32 Delayms(fm_u32 data)
-{
- WCN_DBG(FM_DBG | CHIP, "delay %dms\n", data);
- msleep(data);
- return 0;
-}
-
-static fm_s32 Delayus(fm_u32 data)
-{
- WCN_DBG(FM_DBG | CHIP, "delay %dus\n", data);
- udelay(data);
- return 0;
-}
-
-fm_s32 mt6628_get_read_result(struct fm_res_ctx *result)
-{
- FMR_ASSERT(result);
- res = result;
-
- return 0;
-}
-
-static fm_s32 mt6628_read(fm_u8 addr, fm_u16 *val)
-{
- fm_s32 ret = 0;
- fm_u16 pkt_size;
-
- if (FM_LOCK(cmd_buf_lock))
- return (-FM_ELOCK);
- pkt_size = mt6628_get_reg(cmd_buf, TX_BUF_SIZE, addr);
- ret =
- fm_cmd_tx(cmd_buf, pkt_size, FLAG_FSPI_RD, SW_RETRY_CNT, FSPI_RD_TIMEOUT,
- mt6628_get_read_result);
-
- if (!ret && res) {
- *val = res->fspi_rd;
- }
-
- FM_UNLOCK(cmd_buf_lock);
-
- return ret;
-}
-
-static fm_s32 mt6628_write(fm_u8 addr, fm_u16 val)
-{
- fm_s32 ret = 0;
- fm_u16 pkt_size;
-
- if (FM_LOCK(cmd_buf_lock))
- return (-FM_ELOCK);
- pkt_size = mt6628_set_reg(cmd_buf, TX_BUF_SIZE, addr, val);
- ret = fm_cmd_tx(cmd_buf, pkt_size, FLAG_FSPI_WR, SW_RETRY_CNT, FSPI_WR_TIMEOUT, NULL);
- FM_UNLOCK(cmd_buf_lock);
-
- return ret;
-}
-
-static fm_s32 mt6628_set_bits(fm_u8 addr, fm_u16 bits, fm_u16 mask)
-{
- fm_s32 ret = 0;
- fm_u16 val;
-
- ret = mt6628_read(addr, &val);
-
- if (ret)
- return ret;
-
- val = ((val & (mask)) | bits);
- ret = mt6628_write(addr, val);
-
- return ret;
-}
-
-static fm_u16 mt6628_get_chipid(void)
-{
- return 0x6628;
-}
-
-/* MT6628_SetAntennaType - set Antenna type
- * @type - 1,Short Antenna; 0, Long Antenna
- */
-static fm_s32 mt6628_SetAntennaType(fm_s32 type)
-{
- fm_u16 dataRead;
-
- WCN_DBG(FM_DBG | CHIP, "set ana to %s\n", type ? "short" : "long");
- mt6628_read(FM_MAIN_CG2_CTRL, &dataRead);
-
- if (type) {
- dataRead |= ANTENNA_TYPE;
- } else {
- dataRead &= (~ANTENNA_TYPE);
- }
-
- mt6628_write(FM_MAIN_CG2_CTRL, dataRead);
-
- return 0;
-}
-
-static fm_s32 mt6628_GetAntennaType(void)
-{
- fm_u16 dataRead;
-
- mt6628_read(FM_MAIN_CG2_CTRL, &dataRead);
- WCN_DBG(FM_DBG | CHIP, "get ana type: %s\n", (dataRead & ANTENNA_TYPE) ? "short" : "long");
-
- if (dataRead & ANTENNA_TYPE)
- return FM_ANA_SHORT; /* short antenna */
- else
- return FM_ANA_LONG; /* long antenna */
-}
-
-
-static fm_s32 mt6628_Mute(fm_bool mute)
-{
- fm_s32 ret = 0;
- fm_u16 dataRead;
-
- WCN_DBG(FM_DBG | CHIP, "set %s\n", mute ? "mute" : "unmute");
- mt6628_read(FM_MAIN_CTRL, &dataRead);
-
- if (mute == 1) {
- ret = mt6628_write(FM_MAIN_CTRL, (dataRead & 0xFFDF) | 0x0020);
- } else {
- ret = mt6628_write(FM_MAIN_CTRL, (dataRead & 0xFFDF));
- }
-
- return ret;
-}
-
-
-/*static fm_s32 mt6628_set_RSSITh(fm_u16 TH_long, fm_u16 TH_short)
-{
- mt6628_write(0xE2, 0x3072);
- mt6628_write(0xE3, TH_long);
- mt6628_write(0xE1, 0x0002);
- Delayms(1);
- mt6628_write(0xE2, 0x307A);
- mt6628_write(0xE3, TH_short);
- mt6628_write(0xE1, 0x0002);
-
- WCN_DBG(FM_DBG | CHIP, "RSSI TH, long:0x%04x, short:0x%04x", TH_long, TH_short);
- return 0;
-}
-*/
-/*
-static fm_s32 mt6628_set_SMGTh(fm_s32 ver, fm_u16 TH_smg)
-{
- if (mt6628_E1 == ver) {
- mt6628_write(0xE2, 0x321E);
- mt6628_write(0xE3, TH_smg);
- mt6628_write(0xE1, 0x0002);
- } else {
- mt6628_write(0xE2, 0x3218);
- mt6628_write(0xE3, TH_smg);
- mt6628_write(0xE1, 0x0002);
- }
-
- WCN_DBG(FM_DBG | CHIP, "Soft-mute gain TH %d\n", (int)TH_smg);
- return 0;
-}
-*/
-static fm_s32 mt6628_RampDown(void)
-{
- fm_s32 ret = 0;
- fm_u16 pkt_size;
- fm_u16 tmp;
-
- WCN_DBG(FM_DBG | CHIP, "ramp down\n");
-
- mt6628_read(FM_MAIN_INTRMASK, &tmp);
- mt6628_write(FM_MAIN_INTRMASK, 0x0000);
- mt6628_write(0x6B, 0x0000);
-
- if (FM_LOCK(cmd_buf_lock))
- return (-FM_ELOCK);
- pkt_size = mt6628_rampdown(cmd_buf, TX_BUF_SIZE);
- ret = fm_cmd_tx(cmd_buf, pkt_size, FLAG_RAMPDOWN, SW_RETRY_CNT, RAMPDOWN_TIMEOUT, NULL);
- FM_UNLOCK(cmd_buf_lock);
-
- if (ret) {
- WCN_DBG(FM_ERR | CHIP, "ramp down failed\n");
- }
-#ifdef MT6628_FM_FPGA
- Delayms(10);
- mt6628_write(0x54, 0x0001);
- mt6628_write(0x11, 0x37D4);
- mt6628_write(0x54, 0x8000);
-#endif
- mt6628_write(0x6B, 0x2100);
- mt6628_write(FM_MAIN_INTRMASK, tmp);
- return ret;
-}
-
-static fm_s32 mt6628_get_rom_version(void)
-{
- fm_u16 tmp;
-
- /* DSP rom code version request enable --- set 0x61 b15=1 */
- mt6628_set_bits(0x61, 0x8000, 0x7FFF);
-
- /* Release ASIP reset --- set 0x61 b1=1 */
- mt6628_set_bits(0x61, 0x0002, 0xFFFD);
-
- /* Enable ASIP power --- set 0x61 b0=0 */
- mt6628_set_bits(0x61, 0x0000, 0xFFFE);
-
- /* Wait DSP code version ready --- wait 1ms */
- Delayus(1000);
-
- /* Get FM DSP code version --- rd 0x83[15:8] */
- mt6628_read(0x83, &tmp);
- tmp = (tmp >> 8);
-
- /* DSP rom code version request disable --- set 0x61 b15=0 */
- mt6628_set_bits(0x61, 0x0000, 0x7FFF);
-
- /* Reset ASIP --- set 0x61[1:0] = 1 */
- mt6628_set_bits(0x61, 0x0001, 0xFFFC);
-
- WCN_DBG(FM_NTC | CHIP, "ROM version: v%d\n", (fm_s32) tmp);
- return (fm_s32) tmp;
-}
-
-static fm_s32 mt6628_get_patch_path(fm_s32 ver, const fm_s8 **ppath)
-{
- fm_s32 i;
- fm_s32 max = sizeof(mt6628_patch_tbl) / sizeof(mt6628_patch_tbl[0]);
-
- /* check if the ROM version is defined or not */
- for (i = 0; i < max; i++) {
- if ((mt6628_patch_tbl[i].idx == ver)
- && (fm_file_exist(mt6628_patch_tbl[i].patch) == 0)) {
- *ppath = mt6628_patch_tbl[i].patch;
- WCN_DBG(FM_NTC | CHIP, "Get ROM version OK\n");
- return 0;
- }
- }
-
-
- /* the ROM version isn't defined, find a latest patch instead */
- for (i = max; i > 0; i--) {
- if (fm_file_exist(mt6628_patch_tbl[i - 1].patch) == 0) {
- *ppath = mt6628_patch_tbl[i - 1].patch;
- WCN_DBG(FM_WAR | CHIP, "undefined ROM version\n");
- return 1;
- }
- }
-
- /* get path failed */
- WCN_DBG(FM_ERR | CHIP, "No valid patch file\n");
- return -FM_EPATCH;
-}
-
-
-static fm_s32 mt6628_get_coeff_path(fm_s32 ver, const fm_s8 **ppath)
-{
- fm_s32 i;
- fm_s32 max = sizeof(mt6628_patch_tbl) / sizeof(mt6628_patch_tbl[0]);
-
- /* check if the ROM version is defined or not */
- for (i = 0; i < max; i++) {
- if ((mt6628_patch_tbl[i].idx == ver)
- && (fm_file_exist(mt6628_patch_tbl[i].coeff) == 0)) {
- *ppath = mt6628_patch_tbl[i].coeff;
- WCN_DBG(FM_NTC | CHIP, "Get ROM version OK\n");
- return 0;
- }
- }
-
-
- /* the ROM version isn't defined, find a latest patch instead */
- for (i = max; i > 0; i--) {
- if (fm_file_exist(mt6628_patch_tbl[i - 1].coeff) == 0) {
- *ppath = mt6628_patch_tbl[i - 1].coeff;
- WCN_DBG(FM_WAR | CHIP, "undefined ROM version\n");
- return 1;
- }
- }
-
- /* get path failed */
- WCN_DBG(FM_ERR | CHIP, "No valid coeff file\n");
- return -FM_EPATCH;
-}
-
-
-/*
-* mt6628_DspPatch - DSP download procedure
-* @img - source dsp bin code
-* @len - patch length in byte
-* @type - rom/patch/coefficient/hw_coefficient
-*/
-static fm_s32 mt6628_DspPatch(const fm_u8 *img, fm_s32 len, enum IMG_TYPE type)
-{
- fm_u8 seg_num;
- fm_u8 seg_id = 0;
- fm_s32 seg_len;
- fm_s32 ret = 0;
- fm_u16 pkt_size;
-
- FMR_ASSERT(img);
-
- if (len <= 0) {
- return -1;
- }
-
- seg_num = len / PATCH_SEG_LEN + 1;
- WCN_DBG(FM_NTC | CHIP, "binary len:%d, seg num:%d\n", len, seg_num);
-
- switch (type) {
- case IMG_ROM:
-
- for (seg_id = 0; seg_id < seg_num; seg_id++) {
- seg_len = ((seg_id + 1) < seg_num) ? PATCH_SEG_LEN : (len % PATCH_SEG_LEN);
- WCN_DBG(FM_NTC | CHIP, "rom,[seg_id:%d], [seg_len:%d]\n", seg_id, seg_len);
- if (FM_LOCK(cmd_buf_lock))
- return (-FM_ELOCK);
- pkt_size =
- mt6628_rom_download(cmd_buf, TX_BUF_SIZE, seg_num, seg_id,
- &img[seg_id * PATCH_SEG_LEN], seg_len);
- WCN_DBG(FM_NTC | CHIP, "pkt_size:%d\n", (fm_s32) pkt_size);
- ret =
- fm_cmd_tx(cmd_buf, pkt_size, FLAG_ROM, SW_RETRY_CNT, ROM_TIMEOUT, NULL);
- FM_UNLOCK(cmd_buf_lock);
-
- if (ret) {
- WCN_DBG(FM_ALT | CHIP, "mt6628_rom_download failed\n");
- return ret;
- }
- }
-
- break;
- case IMG_PATCH:
-
- for (seg_id = 0; seg_id < seg_num; seg_id++) {
- seg_len = ((seg_id + 1) < seg_num) ? PATCH_SEG_LEN : (len % PATCH_SEG_LEN);
- WCN_DBG(FM_NTC | CHIP, "patch,[seg_id:%d], [seg_len:%d]\n", seg_id,
- seg_len);
- if (FM_LOCK(cmd_buf_lock))
- return (-FM_ELOCK);
- pkt_size =
- mt6628_patch_download(cmd_buf, TX_BUF_SIZE, seg_num, seg_id,
- &img[seg_id * PATCH_SEG_LEN], seg_len);
- WCN_DBG(FM_NTC | CHIP, "pkt_size:%d\n", (fm_s32) pkt_size);
- ret =
- fm_cmd_tx(cmd_buf, pkt_size, FLAG_PATCH, SW_RETRY_CNT, PATCH_TIMEOUT,
- NULL);
- FM_UNLOCK(cmd_buf_lock);
-
- if (ret) {
- WCN_DBG(FM_ALT | CHIP, "mt6628_patch_download failed\n");
- return ret;
- }
- }
-
- break;
- case IMG_HW_COEFFICIENT:
-
- for (seg_id = 0; seg_id < seg_num; seg_id++) {
- seg_len = ((seg_id + 1) < seg_num) ? PATCH_SEG_LEN : (len % PATCH_SEG_LEN);
- WCN_DBG(FM_NTC | CHIP, "hwcoeff,[seg_id:%d], [seg_len:%d]\n", seg_id,
- seg_len);
- if (FM_LOCK(cmd_buf_lock))
- return (-FM_ELOCK);
- pkt_size =
- mt6628_hwcoeff_download(cmd_buf, TX_BUF_SIZE, seg_num, seg_id,
- &img[seg_id * PATCH_SEG_LEN], seg_len);
- WCN_DBG(FM_NTC | CHIP, "pkt_size:%d\n", (fm_s32) pkt_size);
- ret =
- fm_cmd_tx(cmd_buf, pkt_size, FLAG_HWCOEFF, SW_RETRY_CNT,
- HWCOEFF_TIMEOUT, NULL);
- FM_UNLOCK(cmd_buf_lock);
-
- if (ret) {
- WCN_DBG(FM_ALT | CHIP, "mt6628_hwcoeff_download failed\n");
- return ret;
- }
- }
-
- break;
- case IMG_COEFFICIENT:
-
- for (seg_id = 0; seg_id < seg_num; seg_id++) {
- seg_len = ((seg_id + 1) < seg_num) ? PATCH_SEG_LEN : (len % PATCH_SEG_LEN);
- WCN_DBG(FM_NTC | CHIP, "coeff,[seg_id:%d], [seg_len:%d]\n", seg_id,
- seg_len);
- if (FM_LOCK(cmd_buf_lock))
- return (-FM_ELOCK);
- pkt_size =
- mt6628_coeff_download(cmd_buf, TX_BUF_SIZE, seg_num, seg_id,
- &img[seg_id * PATCH_SEG_LEN], seg_len);
- WCN_DBG(FM_NTC | CHIP, "pkt_size:%d\n", (fm_s32) pkt_size);
- ret =
- fm_cmd_tx(cmd_buf, pkt_size, FLAG_COEFF, SW_RETRY_CNT, COEFF_TIMEOUT,
- NULL);
- FM_UNLOCK(cmd_buf_lock);
-
- if (ret) {
- WCN_DBG(FM_ALT | CHIP, "mt6628_coeff_download failed\n");
- return ret;
- }
- }
-
- break;
- default:
- break;
- }
-
- return 0;
-}
-
-
-static fm_s32 mt6628_PowerUp(fm_u16 *chip_id, fm_u16 *device_id)
-{
-#define PATCH_BUF_SIZE 4096*6
- fm_s32 ret = 0;
- fm_u16 pkt_size;
- fm_u16 tmp_reg = 0;
-
- const fm_s8 *path_patch = NULL;
- const fm_s8 *path_coeff = NULL;
- /* const fm_s8 *path_hwcoeff = NULL; */
- /* fm_s32 coeff_len = 0; */
- fm_s32 patch_len = 0;
- fm_u8 *dsp_buf = NULL;
-
- FMR_ASSERT(chip_id);
- FMR_ASSERT(device_id);
-
- WCN_DBG(FM_DBG | CHIP, "pwr on seq......\n");
-
- /* Wholechip FM Power Up: step 1, FM Digital Clock enable */
- if (FM_LOCK(cmd_buf_lock))
- return (-FM_ELOCK);
- pkt_size = mt6628_pwrup_clock_on(cmd_buf, TX_BUF_SIZE);
- ret = fm_cmd_tx(cmd_buf, pkt_size, FLAG_EN, SW_RETRY_CNT, EN_TIMEOUT, NULL);
- FM_UNLOCK(cmd_buf_lock);
-
- if (ret) {
- WCN_DBG(FM_ALT | CHIP, "mt6628_pwrup_clock_on failed\n");
- return ret;
- }
-
- if ((mt6628_fm_config.aud_cfg.aud_path == FM_AUD_MRGIF)
- || (mt6628_fm_config.aud_cfg.aud_path == FM_AUD_I2S)) {
- mt6628_I2s_Setting(FM_I2S_ON, mt6628_fm_config.aud_cfg.i2s_info.mode,
- mt6628_fm_config.aud_cfg.i2s_info.rate);
- /* mt_combo_audio_ctrl(COMBO_AUDIO_STATE_2); */
- mtk_wcn_cmb_stub_audio_ctrl((CMB_STUB_AIF_X) CMB_STUB_AIF_2);
- }
- /* Wholechip FM Power Up: step 2, read HW version */
- mt6628_read(0x62, &tmp_reg);
- mt6628_read(0x62, &tmp_reg);
- *chip_id = tmp_reg;
- *device_id = tmp_reg;
- mt6628_hw_info.chip_id = (fm_s32) tmp_reg;
- WCN_DBG(FM_NTC | CHIP, "chip_id:0x%04x\n", tmp_reg);
-
- if (mt6628_hw_info.chip_id != 0x6628) {
- WCN_DBG(FM_NTC | CHIP, "fm sys error, reset hw\n");
- return (-FM_EFW);
- }
-
- mt6628_hw_info.eco_ver = (fm_s32) mtk_wcn_wmt_hwver_get();
- WCN_DBG(FM_NTC | CHIP, "ECO version:0x%08x\n", mt6628_hw_info.eco_ver);
- mt6628_hw_info.eco_ver += 1;
-
- /* get mt6628 DSP rom version */
- if ((ret = mt6628_get_rom_version()) >= 0) {
- mt6628_hw_info.rom_ver = ret;
- WCN_DBG(FM_NTC | CHIP, "ROM version: v%d\n", mt6628_hw_info.rom_ver);
- } else {
- WCN_DBG(FM_ERR | CHIP, "get ROM version failed\n");
- }
-
-
- /* Wholechip FM Power Up: step 3, download patch */
- if (!(dsp_buf = fm_vmalloc(PATCH_BUF_SIZE))) {
- WCN_DBG(FM_ALT | CHIP, "-ENOMEM\n");
- return -ENOMEM;
- }
-
- ret = mt6628_get_patch_path(mt6628_hw_info.rom_ver, &path_patch);
- patch_len = fm_file_read(path_patch, dsp_buf, PATCH_BUF_SIZE, 0);
- mt6628_DspPatch((const fm_u8 *)dsp_buf, patch_len, IMG_PATCH);
-
- ret = mt6628_get_coeff_path(mt6628_hw_info.rom_ver, &path_coeff);
- patch_len = fm_file_read(path_coeff, dsp_buf, PATCH_BUF_SIZE, 0);
-
- mt6628_hw_info.rom_ver += 1;
-
- tmp_reg = dsp_buf[38] | (dsp_buf[39] << 8);
- mt6628_hw_info.patch_ver = (fm_s32) tmp_reg;
- WCN_DBG(FM_NTC | CHIP, "Patch version: 0x%08x\n", mt6628_hw_info.patch_ver);
-
- if (ret == 1) {
- dsp_buf[4] = 0x00; /* if we found rom version undefined, we should disable patch */
- dsp_buf[5] = 0x00;
- }
-
- mt6628_DspPatch((const fm_u8 *)dsp_buf, patch_len, IMG_COEFFICIENT);
- mt6628_write(0x90, 0x0040);
- mt6628_write(0x90, 0x0000);
-
- if (dsp_buf) {
- fm_vfree(dsp_buf);
- dsp_buf = NULL;
- }
- /* mt6628_check_dsp(); */
-
- /* Wholechip FM Power Up: step 4, FM Digital Init: fm_rgf_maincon */
- if (FM_LOCK(cmd_buf_lock))
- return (-FM_ELOCK);
- pkt_size = mt6628_pwrup_digital_init(cmd_buf, TX_BUF_SIZE);
- ret = fm_cmd_tx(cmd_buf, pkt_size, FLAG_EN, SW_RETRY_CNT, EN_TIMEOUT, NULL);
- FM_UNLOCK(cmd_buf_lock);
- if (ret) {
- WCN_DBG(FM_ALT | CHIP, "mt6628_pwrup_digital_init failed\n");
- return ret;
- }
-
- WCN_DBG(FM_NTC | CHIP, "pwr on seq ok\n");
-
- /* mt6628_check_dsp(); */
-
-/* rssi_th_set = fm_false; */
- return ret;
-}
-
-static fm_s32 mt6628_PowerDown(void)
-{
- fm_s32 ret = 0;
- fm_u16 pkt_size;
- fm_u16 dataRead;
-
- WCN_DBG(FM_DBG | CHIP, "pwr down seq\n");
- /*SW work around for MCUFA issue.
- *if interrupt happen before doing rampdown, DSP can't switch MCUFA back well.
- * In case read interrupt, and clean if interrupt found before rampdown.
- */
- mt6628_read(FM_MAIN_INTR, &dataRead);
-
- if (dataRead & 0x1) {
- mt6628_write(FM_MAIN_INTR, dataRead); /* clear status flag */
- }
- /* mt6628_RampDown(); //remove because of wholechip reset fail issue */
-
-#ifdef FM_DIGITAL_INPUT
- mt6628_I2s_Setting(FM_I2S_OFF, FM_I2S_SLAVE, FM_I2S_44K);
-#endif
-
- if (FM_LOCK(cmd_buf_lock))
- return (-FM_ELOCK);
- pkt_size = mt6628_pwrdown(cmd_buf, TX_BUF_SIZE);
- ret = fm_cmd_tx(cmd_buf, pkt_size, FLAG_EN, SW_RETRY_CNT, EN_TIMEOUT, NULL);
- FM_UNLOCK(cmd_buf_lock);
-
- if (ret) {
- WCN_DBG(FM_ALT | CHIP, "mt6628_pwrdown failed\n");
- return ret;
- }
- /* FIX_ME, disable ext interrupt */
- mt6628_write(FM_MAIN_EXTINTRMASK, 0x00);
- /* ALPS0080963MCU won't sleep if MCU desense was enabled */
- mtk_wcn_wmt_dsns_ctrl(WMTDSNS_FM_DISABLE);
- return ret;
-}
-
-static fm_bool mt6628_SetFreq(fm_u16 freq)
-{
- fm_s32 ret = 0;
- fm_u16 pkt_size;
- fm_u16 chan_para = 0;
-
- fm_cb_op->cur_freq_set(freq);
-
-
- /* MCU clock adjust if need */
- if ((ret = mt6628_mcu_dese(freq, NULL)) < 0) {
- WCN_DBG(FM_ERR | MAIN, "mt6628_mcu_dese FAIL:%d\n", ret);
- }
-
- WCN_DBG(FM_INF | MAIN, "MCU %d\n", ret);
-
- /* GPS clock adjust if need */
- if ((ret = mt6628_gps_dese(freq, NULL)) < 0) {
- WCN_DBG(FM_ERR | MAIN, "mt6628_gps_dese FAIL:%d\n", ret);
- }
-
- WCN_DBG(FM_INF | MAIN, "GPS %d\n", ret);
- /* start tune */
- if (FM_LOCK(cmd_buf_lock))
- return fm_false;
-
-/* if (fm_cb_op->chan_para_get) { */
- chan_para = mt6628_chan_para_get(freq);
- WCN_DBG(FM_DBG | CHIP, "%d chan para = %d\n", (fm_s32) freq, (fm_s32) chan_para);
-/* } */
-
- pkt_size = mt6628_tune(cmd_buf, TX_BUF_SIZE, freq, chan_para);
- ret =
- fm_cmd_tx(cmd_buf, pkt_size, FLAG_TUNE | FLAG_TUNE_DONE, SW_RETRY_CNT, TUNE_TIMEOUT,
- NULL);
- FM_UNLOCK(cmd_buf_lock);
-
- if (ret) {
- WCN_DBG(FM_ALT | CHIP, "mt6628_tune failed\n");
- return ret;
- }
-
- WCN_DBG(FM_DBG | CHIP, "set freq to %d ok\n", freq);
-
- /* if (rssi_th_set == fm_false) {
- mt6628_set_RSSITh(MT6628fm_cust_config_fetch(FM_CFG_RX_RSSI_TH_LONG), MT6628fm_cust_config_fetch(FM_CFG_RX_RSSI_TH_SHORT));
- mt6628_set_SMGTh(Chip_Version, MT6628fm_cust_config_fetch(FM_CFG_RX_SMG_TH));
- rssi_th_set = fm_true;
- } */
-
- return fm_true;
-}
-
-
-/*
-* mt6628_Seek
-* @pFreq - IN/OUT parm, IN start freq/OUT seek valid freq
-* @seekdir - 0:up, 1:down
-* @space - 1:50KHz, 2:100KHz, 4:200KHz
-* return fm_true:seek success; fm_false:seek failed
-*/
-static fm_bool mt6628_Seek(fm_u16 min_freq, fm_u16 max_freq, fm_u16 *pFreq, fm_u16 seekdir,
- fm_u16 space)
-{
- fm_s32 ret = 0;
- fm_u16 pkt_size, temp;
-
- mt6628_RampDown();
- mt6628_read(FM_MAIN_CTRL, &temp);
- mt6628_Mute(fm_true);
-
- if (FM_LOCK(cmd_buf_lock))
- return fm_false;
- pkt_size = mt6628_seek(cmd_buf, TX_BUF_SIZE, seekdir, space, max_freq, min_freq);
- ret =
- fm_cmd_tx(cmd_buf, pkt_size, FLAG_SEEK | FLAG_SEEK_DONE, SW_RETRY_CNT, SEEK_TIMEOUT,
- mt6628_get_read_result);
- FM_UNLOCK(cmd_buf_lock);
-
- if (!ret && res) {
- *pFreq = res->seek_result;
- /* fm_cb_op->cur_freq_set(*pFreq); */
- } else {
- WCN_DBG(FM_ALT | CHIP, "mt6628_seek failed\n");
- return ret;
- }
-
- /* get the result freq */
- WCN_DBG(FM_NTC | CHIP, "seek, result freq:%d\n", *pFreq);
- mt6628_RampDown();
- if ((temp & 0x0020) == 0) {
- mt6628_Mute(fm_false);
- }
-
- return fm_true;
-}
-
-#define FM_CQI_LOG_PATH "/mnt/sdcard/fmcqilog"
-
-static fm_s32 mt6628_full_cqi_get(fm_s32 min_freq, fm_s32 max_freq, fm_s32 space, fm_s32 cnt)
-{
- fm_s32 ret = 0;
- fm_u16 pkt_size;
- fm_u16 freq, orig_freq;
- fm_s32 i, j, k;
- fm_s32 space_val, max, min, num;
- struct mt6628_full_cqi *p_cqi;
- fm_u8 *cqi_log_title =
- "Freq, RSSI, PAMD, PR, FPAMD, MR, ATDC, PRX, ATDEV, SMGain, DltaRSSI\n";
- fm_u8 cqi_log_buf[100] = { 0 };
- fm_s32 pos;
- fm_u8 cqi_log_path[100] = { 0 };
-
- WCN_DBG(FM_NTC | CHIP, "6628 cqi log start\n");
- /* for soft-mute tune, and get cqi */
- freq = fm_cb_op->cur_freq_get();
- if (0 == fm_get_channel_space(freq)) {
- freq *= 10;
- }
- /* get cqi */
- orig_freq = freq;
- if (0 == fm_get_channel_space(min_freq)) {
- min = min_freq * 10;
- } else {
- min = min_freq;
- }
- if (0 == fm_get_channel_space(max_freq)) {
- max = max_freq * 10;
- } else {
- max = max_freq;
- }
- if (space == 0x0001) {
- space_val = 5; /* 50Khz */
- } else if (space == 0x0002) {
- space_val = 10; /* 100Khz */
- } else if (space == 0x0004) {
- space_val = 20; /* 200Khz */
- } else {
- space_val = 10;
- }
- num = (max - min) / space_val + 1; /* Eg, (8760 - 8750) / 10 + 1 = 2 */
- for (k = 0; (10000 == orig_freq) && (0xffffffff == g_dbg_level) && (k < cnt); k++) {
- WCN_DBG(FM_NTC | CHIP, "cqi file:%d\n", k + 1);
- freq = min;
- pos = 0;
- fm_memcpy(cqi_log_path, FM_CQI_LOG_PATH, strlen(FM_CQI_LOG_PATH));
- sprintf(&cqi_log_path[strlen(FM_CQI_LOG_PATH)], "%d.txt", k + 1);
- fm_file_write(cqi_log_path, cqi_log_title, strlen(cqi_log_title), &pos);
- for (j = 0; j < num; j++) {
- if (FM_LOCK(cmd_buf_lock))
- return (-FM_ELOCK);
- pkt_size = mt6628_full_cqi_req(cmd_buf, TX_BUF_SIZE, &freq, 1, 1);
- ret =
- fm_cmd_tx(cmd_buf, pkt_size, FLAG_SM_TUNE, SW_RETRY_CNT,
- SM_TUNE_TIMEOUT, mt6628_get_read_result);
- FM_UNLOCK(cmd_buf_lock);
-
- if (!ret && res) {
- WCN_DBG(FM_NTC | CHIP, "smt cqi size %d\n", res->cqi[0]);
- p_cqi = (struct mt6628_full_cqi *)&res->cqi[2];
- for (i = 0; i < res->cqi[1]; i++) {
- /* just for debug */
- WCN_DBG(FM_NTC | CHIP,
- "freq %d, 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x\n",
- p_cqi[i].ch, p_cqi[i].rssi, p_cqi[i].pamd,
- p_cqi[i].pr, p_cqi[i].fpamd, p_cqi[i].mr,
- p_cqi[i].atdc, p_cqi[i].prx, p_cqi[i].atdev,
- p_cqi[i].smg, p_cqi[i].drssi);
- /* format to buffer */
- sprintf(cqi_log_buf,
- "%04d,%04x,%04x,%04x,%04x,%04x,%04x,%04x,%04x,%04x,%04x,\n",
- p_cqi[i].ch, p_cqi[i].rssi, p_cqi[i].pamd,
- p_cqi[i].pr, p_cqi[i].fpamd, p_cqi[i].mr,
- p_cqi[i].atdc, p_cqi[i].prx, p_cqi[i].atdev,
- p_cqi[i].smg, p_cqi[i].drssi);
- /* write back to log file */
- fm_file_write(cqi_log_path, cqi_log_buf,
- strlen(cqi_log_buf), &pos);
- }
- } else {
- WCN_DBG(FM_ALT | CHIP, "smt get CQI failed\n");
- ret = -1;
- }
- freq += space_val;
- }
- fm_cb_op->cur_freq_set(0); /* avoid run too much times */
- }
- WCN_DBG(FM_NTC | CHIP, "6628 cqi log done\n");
-
- return ret;
-}
-
-
-static fm_bool mt6628_Scan(fm_u16 min_freq, fm_u16 max_freq, fm_u16 *pFreq, fm_u16 *pScanTBL,
- fm_u16 *ScanTBLsize, fm_u16 scandir, fm_u16 space)
-{
- fm_s32 ret = 0;
- fm_u16 pkt_size, temp;
- fm_u16 offset = 0;
- fm_u16 tmp_scanTBLsize = *ScanTBLsize;
-
- if ((!pScanTBL) || (tmp_scanTBLsize == 0)) {
- WCN_DBG(FM_ALT | CHIP, "scan, failed:invalid scan table\n");
- return fm_false;
- }
-
- WCN_DBG(FM_NTC | CHIP,
- "start freq: %d, max_freq:%d, min_freq:%d, scan BTL size:%d, scandir:%d, space:%d\n",
- *pFreq, max_freq, min_freq, *ScanTBLsize, scandir, space);
-
- mt6628_RampDown();
- mt6628_read(FM_MAIN_CTRL, &temp);
- mt6628_Mute(fm_true);
-
- mt6628_full_cqi_get(min_freq, max_freq, space, 5);
-
- /* normal scan */
- if (FM_LOCK(cmd_buf_lock))
- return (-FM_ELOCK);
- pkt_size = mt6628_scan(cmd_buf, TX_BUF_SIZE, scandir, space, max_freq, min_freq);
- ret =
- fm_cmd_tx(cmd_buf, pkt_size, FLAG_SCAN | FLAG_SCAN_DONE, SW_RETRY_CNT, SCAN_TIMEOUT,
- mt6628_get_read_result);
- FM_UNLOCK(cmd_buf_lock);
-
- if (!ret && res) {
- fm_memcpy(pScanTBL, res->scan_result, sizeof(fm_u16) * FM_SCANTBL_SIZE);
- WCN_DBG(FM_NTC | CHIP, "Rx scan result:\n");
-
- for (offset = 0; offset < tmp_scanTBLsize; offset++) {
- WCN_DBG(FM_NTC | CHIP, "%d: %04x\n", (fm_s32) offset, *(pScanTBL + offset));
- }
-
- *ScanTBLsize = tmp_scanTBLsize;
- } else {
- WCN_DBG(FM_ALT | CHIP, "mt6628_scan failed\n");
- return ret;
- }
-
- mt6628_set_bits(FM_MAIN_CTRL, 0x0000, 0xFFF0); /* make sure tune/seek/scan/cqi bits = 0 */
- if ((temp & 0x0020) == 0) {
- mt6628_Mute(fm_false);
- }
-
- return fm_true;
-}
-
-/* add for scan cancel case */
-static fm_bool cqi_abort = fm_false;
-
-static fm_s32 mt6628_CQI_Get(fm_s8 *buf, fm_s32 buf_len)
-{
- fm_s32 ret = 0;
- fm_s32 i;
- fm_u16 pkt_size;
- struct mt6628_fm_cqi *pmt6628_cqi;
- struct adapt_fm_cqi *pcqi;
-
- if (!buf || buf_len < FM_CQI_BUF_SIZE) {
- return -FM_EBUF;
- }
-
- if (FM_LOCK(cmd_buf_lock))
- return (-FM_ELOCK);
- pkt_size = mt6628_cqi_get(cmd_buf, TX_BUF_SIZE);
- if (cqi_abort == fm_true) {
- cqi_abort = fm_false;
- ret = -1;
- } else {
- ret =
- fm_cmd_tx(cmd_buf, pkt_size, FLAG_SCAN | FLAG_CQI_DONE, SW_RETRY_CNT,
- SCAN_TIMEOUT, mt6628_get_read_result);
- }
- FM_UNLOCK(cmd_buf_lock);
-
- if (!ret && res) {
- /* FIXEDME */
- pmt6628_cqi = (struct mt6628_fm_cqi *)res->cqi;
- pcqi = (struct adapt_fm_cqi *)buf;
-
- for (i = 0; i < (sizeof(res->cqi) / sizeof(struct mt6628_fm_cqi)); i++) {
- pcqi[i].ch = (pmt6628_cqi[i].ch * 10 / 2) + 6400;
- pcqi[i].rssi = (fm_s32) pmt6628_cqi[i].rssi;
-
- if (pcqi[i].rssi >= 32768) {
- pcqi[i].rssi = pcqi[i].rssi - 65536;
- }
-
- pcqi[i].rssi = ((pcqi[i].rssi * 6) >> 4);
- WCN_DBG(FM_NTC | CHIP, "%d --> %d(dbm)\n", pcqi[i].ch, pcqi[i].rssi);
- }
- } else {
- WCN_DBG(FM_ALT | CHIP, "mt6628 get CQI failed:%d\n", ret);
- }
-
- mt6628_set_bits(FM_MAIN_CTRL, 0x0000, 0xFFF0); /* make sure tune/seek/scan/cqi bits = 0 */
-
- return ret;
-}
-
-static fm_bool scan_abort = fm_false;
-
-#ifdef CONFIG_MTK_FM_50KHZ_SUPPORT
-#define SCAN_SEG_LEN 250
-static fm_s8 raw_buf[16 * sizeof(struct adapt_fm_cqi)] = { 0 };
-
-static fm_bool mt6628_Scan_50KHz(fm_u16 min_freq, fm_u16 max_freq, fm_u16 *pFreq,
- fm_u16 *pScanTBL, fm_u16 *ScanTBLsize, fm_u16 scandir,
- fm_u16 space)
-{
- fm_s32 ret = 0;
- fm_s32 num;
- fm_s32 seg;
- fm_s32 i, j;
- fm_u16 scan_tbl[FM_SCANTBL_SIZE]; /* need no less than the chip */
- fm_s32 start_freq, end_freq;
- fm_s32 ch_offset, step, tmp_val;
- fm_s32 chl_cnt = 0;
- fm_s32 word_offset, bit_offset;
- fm_s32 space_val = 5;
- struct adapt_fm_cqi *pCQI = (struct adapt_fm_cqi *)raw_buf;
-
- if (space == 0x0001) {
- space_val = 5; /* 50Khz */
- } else if (space == 0x0002) {
- space_val = 10; /* 100Khz */
- } else if (space == 0x0004) {
- space_val = 20; /* 200Khz */
- }
- /* calculate segment number */
- num = (max_freq - min_freq) / space_val; /* Eg, (10800 - 8750) / 5 = 410 */
- seg = (num / SCAN_SEG_LEN) + ((num % SCAN_SEG_LEN) ? 1 : 0); /* Eg, (410 / 200) + ((410 % 200) ? 1 : 0) = 2 + 1 = 3 */
-
- FM_FIFO_RESET(cqi_fifo);
- fm_memset(pScanTBL, 0, sizeof(fm_u16) * (*ScanTBLsize));
-
- /* do scan */
- scan_abort = fm_false; /* reset scan cancel flag */
- for (i = 0; i < seg; i++) {
- start_freq = min_freq + SCAN_SEG_LEN * space_val * i;
- end_freq = min_freq + SCAN_SEG_LEN * space_val * (i + 1) - space_val;
- end_freq = (end_freq > max_freq) ? max_freq : end_freq;
- chl_cnt = 0;
-
- if (fm_true == scan_abort) {
- scan_abort = fm_false;
- return fm_false;
- }
-
- if (fm_false ==
- mt6628_Scan(start_freq, end_freq, pFreq, scan_tbl, ScanTBLsize, scandir,
- space)) {
- return fm_false;
- }
- /* get channel count */
- for (ch_offset = 0; ch_offset < FM_SCANTBL_SIZE; ch_offset++) {
- if (scan_tbl[ch_offset] == 0)
- continue;
- for (step = 0; step < 16; step++) {
- if (scan_tbl[ch_offset] & (1 << step)) {
- tmp_val = start_freq + (ch_offset * 16 + step) * space_val;
- WCN_DBG(FM_NTC | CHIP, "freq %d, end freq %d\n", tmp_val,
- end_freq);
- if (tmp_val <= end_freq) {
- chl_cnt++;
- /* set reult bitmap */
- word_offset = (tmp_val - min_freq) / space_val / 16;
- bit_offset = (tmp_val - min_freq) / space_val % 16;
- if ((word_offset < 26) && (word_offset >= 0)) {
- pScanTBL[word_offset] |= (1 << bit_offset);
- }
- WCN_DBG(FM_NTC | CHIP, "cnt %d, word %d, bit %d\n",
- chl_cnt, word_offset, bit_offset);
- }
- }
- }
- }
-
- /* get cqi info */
- while (chl_cnt > 0) {
- ret = mt6628_CQI_Get(raw_buf, 16 * sizeof(struct adapt_fm_cqi));
- if (ret) {
- return ret;
- }
- /* add valid channel to cqi_fifo */
- for (j = 0; j < sizeof(raw_buf) / sizeof(struct adapt_fm_cqi); j++) {
- if ((pCQI[j].ch >= start_freq) && (pCQI[j].ch <= end_freq)) {
- FM_FIFO_INPUT(cqi_fifo, pCQI + j);
- WCN_DBG(FM_NTC | CHIP, "%d %d(dbm) add to fifo\n",
- pCQI[j].ch, pCQI[j].rssi);
- }
- }
-
- chl_cnt -= 16;
- }
- }
-
- return fm_true;
-}
-
-
-static fm_s32 mt6628_CQI_Get_50KHz(fm_s8 *buf, fm_s32 buf_len)
-{
- fm_s32 ret = 0;
- fm_s32 i;
- struct adapt_fm_cqi tmp = {
- .ch = 0,
- .rssi = 0,
- };
- struct adapt_fm_cqi *pcqi = (struct adapt_fm_cqi *)buf;
-
-
- if (!buf || buf_len < FM_CQI_BUF_SIZE) {
- return -FM_EBUF;
- }
-
- for (i = 0; ((i < (buf_len / sizeof(struct adapt_fm_cqi))) &&
- (fm_false == FM_FIFO_IS_EMPTY(cqi_fifo))); i++) {
- FM_FIFO_OUTPUT(cqi_fifo, &tmp);
- pcqi[i].ch = tmp.ch;
- pcqi[i].rssi = tmp.rssi;
- WCN_DBG(FM_NTC | CHIP, "%d %d(dbm) get from fifo\n", pcqi[i].ch, pcqi[i].rssi);
- }
-
- return ret;
-}
-
-#endif /* CONFIG_MTK_FM_50KHZ_SUPPORT */
-
-
-/*
- * mt6628_GetCurRSSI - get current freq's RSSI value
- * RS=RSSI
- * If RS>511, then RSSI(dBm)= (RS-1024)/16*6
- * else RSSI(dBm)= RS/16*6
- */
-static fm_s32 mt6628_GetCurRSSI(fm_s32 *pRSSI)
-{
- fm_u16 tmp_reg;
-
- mt6628_read(FM_RSSI_IND, &tmp_reg);
- tmp_reg = tmp_reg & 0x03ff;
-
- if (pRSSI) {
- *pRSSI = (tmp_reg > 511) ? (((tmp_reg - 1024) * 6) >> 4) : ((tmp_reg * 6) >> 4);
- WCN_DBG(FM_DBG | CHIP, "rssi:%d, dBm:%d\n", tmp_reg, *pRSSI);
- } else {
- WCN_DBG(FM_ERR | CHIP, "get rssi para error\n");
- return -FM_EPARA;
- }
-
- return 0;
-}
-
-static fm_u16 mt6628_vol_tbl[16] = { 0x0000, 0x0519, 0x066A, 0x0814,
- 0x0A2B, 0x0CCD, 0x101D, 0x1449,
- 0x198A, 0x2027, 0x287A, 0x32F5,
- 0x4027, 0x50C3, 0x65AD, 0x7FFF
-};
-
-static fm_s32 mt6628_SetVol(fm_u8 vol)
-{
- fm_s32 ret = 0;
-
- vol = (vol > 15) ? 15 : vol;
- ret = mt6628_write(0x7D, mt6628_vol_tbl[vol]);
- if (ret) {
- WCN_DBG(FM_ERR | CHIP, "Set vol=%d Failed\n", vol);
- return ret;
- } else {
- WCN_DBG(FM_DBG | CHIP, "Set vol=%d OK\n", vol);
- }
-
- if (vol == 10) {
- fm_print_cmd_fifo(); /* just for debug */
- fm_print_evt_fifo();
- }
- return 0;
-}
-
-static fm_s32 mt6628_GetVol(fm_u8 *pVol)
-{
- int ret = 0;
- fm_u16 tmp;
- fm_s32 i;
-
- FMR_ASSERT(pVol);
-
- ret = mt6628_read(0x7D, &tmp);
- if (ret) {
- *pVol = 0;
- WCN_DBG(FM_ERR | CHIP, "Get vol Failed\n");
- return ret;
- }
-
- for (i = 0; i < 16; i++) {
- if (mt6628_vol_tbl[i] == tmp) {
- *pVol = i;
- break;
- }
- }
-
- WCN_DBG(FM_DBG | CHIP, "Get vol=%d OK\n", *pVol);
- return 0;
-}
-
-static fm_s32 mt6628_dump_reg(void)
-{
- fm_s32 i;
- fm_u16 TmpReg;
- for (i = 0; i < 0xff; i++) {
- mt6628_read(i, &TmpReg);
- WCN_DBG(FM_NTC | CHIP, "0x%02x=0x%04x\n", i, TmpReg);
- }
- return 0;
-}
-
-static fm_bool mt6628_GetMonoStereo(fm_u16 *pMonoStereo)
-{
-#define FM_BF_STEREO 0x1000
- fm_u16 TmpReg;
-
- if (pMonoStereo) {
- mt6628_read(FM_RSSI_IND, &TmpReg);
- *pMonoStereo = (TmpReg & FM_BF_STEREO) >> 12;
- } else {
- WCN_DBG(FM_ERR | CHIP, "MonoStero: para err\n");
- return fm_false;
- }
-
- WCN_DBG(FM_DBG | CHIP, "MonoStero:0x%04x\n", *pMonoStereo);
- return fm_true;
-}
-
-static fm_s32 mt6628_SetMonoStereo(fm_s32 MonoStereo)
-{
- fm_s32 ret = 0;
-#define FM_FORCE_MS 0x0008
-
- WCN_DBG(FM_DBG | CHIP, "set to %s\n", MonoStereo ? "mono" : "auto");
-
- mt6628_write(0x60, 0x3007);
-
- if (MonoStereo) {
- ret = mt6628_set_bits(0x75, FM_FORCE_MS, ~FM_FORCE_MS);
- } else {
- ret = mt6628_set_bits(0x75, 0x0000, ~FM_FORCE_MS);
- }
-
- return ret;
-}
-
-static fm_s32 mt6628_GetCapArray(fm_s32 *ca)
-{
- fm_u16 dataRead;
- fm_u16 tmp = 0;
-
- FMR_ASSERT(ca);
- mt6628_read(0x60, &tmp);
- mt6628_write(0x60, tmp & 0xFFF7); /* 0x60 D3=0 */
-
- mt6628_read(0x26, &dataRead);
- *ca = dataRead;
-
- mt6628_write(0x60, tmp); /* 0x60 D3=1 */
- return 0;
-}
-
-/*
- * mt6628_GetCurPamd - get current freq's PAMD value
- * PA=PAMD
- * If PA>511 then PAMD(dB)= (PA-1024)/16*6,
- * else PAMD(dB)=PA/16*6
- */
-static fm_bool mt6628_GetCurPamd(fm_u16 *pPamdLevl)
-{
- fm_u16 tmp_reg;
- fm_u16 dBvalue, valid_cnt = 0;
- int i, total = 0;
- for (i = 0; i < 8; i++) {
- if (mt6628_read(FM_ADDR_PAMD, &tmp_reg)) {
- *pPamdLevl = 0;
- return fm_false;
- }
-
- tmp_reg &= 0x03FF;
- dBvalue = (tmp_reg > 256) ? ((512 - tmp_reg) * 6 / 16) : 0;
- if (dBvalue != 0) {
- total += dBvalue;
- valid_cnt++;
- WCN_DBG(FM_DBG | CHIP, "[%d]PAMD=%d\n", i, dBvalue);
- }
- Delayms(3);
- }
- if (valid_cnt != 0) {
- *pPamdLevl = total / valid_cnt;
- } else {
- *pPamdLevl = 0;
- }
- WCN_DBG(FM_NTC | CHIP, "PAMD=%d\n", *pPamdLevl);
- return fm_true;
-}
-
-static fm_s32 mt6628_ScanStop(void)
-{
- cqi_abort = fm_true;
- scan_abort = fm_true;
- fm_force_active_event(FLAG_SCAN_DONE | FLAG_CQI_DONE);
-
- return 0;
-}
-
-static fm_s32 mt6628_SeekStop(void)
-{
- return fm_force_active_event(FLAG_SEEK_DONE);
-}
-
-
-/*
- * mt6628_I2s_Setting - set the I2S state on MT6628
- * @onoff - I2S on/off
- * @mode - I2S mode: Master or Slave
- *
- * Return:0, if success; error code, if failed
- */
-static fm_s32 mt6628_I2s_Setting(fm_s32 onoff, fm_s32 mode, fm_s32 sample)
-{
- fm_u16 tmp_state = 0;
- fm_u16 tmp_mode = 0;
- fm_u16 tmp_sample = 0;
- fm_s32 ret = 0;
-
- if (onoff == FM_I2S_ON) {
- tmp_state = 0x0080; /* I2S Frequency tracking on, 0x61 D7=1 */
- mt6628_fm_config.aud_cfg.i2s_info.status = FM_I2S_ON;
- } else if (onoff == FM_I2S_OFF) {
- tmp_state = 0x0000; /* I2S Frequency tracking off, 0x61 D7=0 */
- mt6628_fm_config.aud_cfg.i2s_info.status = FM_I2S_OFF;
- } else {
- WCN_DBG(FM_ERR | CHIP, "%s():[onoff=%d]\n", __func__, onoff);
- ret = -FM_EPARA;
- goto out;
- }
-
- if (mode == FM_I2S_MASTER) {
- tmp_mode = 0x0000; /* 6620 as I2S master, set 0x9B D3=0 */
- mt6628_fm_config.aud_cfg.i2s_info.mode = FM_I2S_MASTER;
- } else if (mode == FM_I2S_SLAVE) {
- tmp_mode = 0x0008; /* 6620 as I2S slave, set 0x9B D3=1 */
- mt6628_fm_config.aud_cfg.i2s_info.mode = FM_I2S_SLAVE;
- } else {
- WCN_DBG(FM_ERR | CHIP, "%s():[mode=%d]\n", __func__, mode);
- ret = -FM_EPARA;
- goto out;
- }
-
- if (sample == FM_I2S_32K) {
- tmp_sample = 0x0000; /* 6620 I2S 32KHz sample rate, 0x5F D11~12 */
- mt6628_fm_config.aud_cfg.i2s_info.rate = FM_I2S_32K;
- } else if (sample == FM_I2S_44K) {
- tmp_sample = 0x0800; /* 6620 I2S 44.1KHz sample rate */
- mt6628_fm_config.aud_cfg.i2s_info.rate = FM_I2S_44K;
- } else if (sample == FM_I2S_48K) {
- tmp_sample = 0x1000; /* 6620 I2S 48KHz sample rate */
- mt6628_fm_config.aud_cfg.i2s_info.rate = FM_I2S_48K;
- } else {
- WCN_DBG(FM_ERR | CHIP, "%s():[sample=%d]\n", __func__, sample);
- ret = -FM_EPARA;
- goto out;
- }
-
- if ((ret = mt6628_set_bits(0x5F, tmp_sample, 0xE7FF)))
- goto out;
-
- if ((ret = mt6628_set_bits(0x9B, tmp_mode, 0xFFF7)))
- goto out;
-
- if ((ret = mt6628_set_bits(0x61, tmp_state, 0xFF7F)))
- goto out;
-
- WCN_DBG(FM_NTC | CHIP, "[onoff=%s][mode=%s][sample=%d](0)33KHz,(1)44.1KHz,(2)48KHz\n",
- (onoff == FM_I2S_ON) ? "On" : "Off",
- (mode == FM_I2S_MASTER) ? "Master" : "Slave", sample);
- out:
- return ret;
-}
-
-static fm_s32 mt6628fm_get_audio_info(fm_audio_info_t *data)
-{
- memcpy(data, &mt6628_fm_config.aud_cfg, sizeof(fm_audio_info_t));
- return 0;
-}
-
-static fm_s32 mt6628_i2s_info_get(fm_s32 *ponoff, fm_s32 *pmode, fm_s32 *psample)
-{
- FMR_ASSERT(ponoff);
- FMR_ASSERT(pmode);
- FMR_ASSERT(psample);
-
- *ponoff = mt6628_fm_config.aud_cfg.i2s_info.status;
- *pmode = mt6628_fm_config.aud_cfg.i2s_info.mode;
- *psample = mt6628_fm_config.aud_cfg.i2s_info.rate;
-
- return 0;
-}
-
-
-static fm_s32 mt6628_hw_info_get(struct fm_hw_info *req)
-{
- FMR_ASSERT(req);
-
- req->chip_id = mt6628_hw_info.chip_id;
- req->eco_ver = mt6628_hw_info.eco_ver;
- req->patch_ver = mt6628_hw_info.patch_ver;
- req->rom_ver = mt6628_hw_info.rom_ver;
-
- return 0;
-}
-
-static fm_s32 mt6628_pre_search(void)
-{
- mt6628_RampDown();
- /* mt6628_Mute(fm_true); //remove because app will do mute/unmute when start/stop scan */
-
- FM_LOG_NTC(FM_NTC | CHIP, "search threshold: RSSI=%d,de-RSSI=%d,smg=%d %d\n",
- mt6628_fm_config.rx_cfg.long_ana_rssi_th, mt6628_fm_config.rx_cfg.desene_rssi_th,
- mt6628_fm_config.rx_cfg.smg_th);
- return 0;
-}
-
-static fm_s32 mt6628_restore_search(void)
-{
- mt6628_RampDown();
- /* mt6628_Mute(fm_false); */
- return 0;
-}
-
-static fm_s32 mt6628_soft_mute_tune(fm_u16 freq, fm_s32 *rssi, fm_bool *valid)
-{
- fm_s32 ret = 0;
- fm_u16 pkt_size;
- /* fm_u16 freq;//, orig_freq; */
- struct mt6628_full_cqi *p_cqi;
- fm_s32 RSSI = 0, PAMD = 0, MR = 0, ATDC = 0;
- fm_u32 PRX = 0, ATDEV = 0;
- fm_u16 softmuteGainLvl = 0;
-
- if (FM_LOCK(cmd_buf_lock))
- return (-FM_ELOCK);
- pkt_size = mt6628_full_cqi_req(cmd_buf, TX_BUF_SIZE, &freq, 1, 1);
- ret =
- fm_cmd_tx(cmd_buf, pkt_size, FLAG_SM_TUNE, SW_RETRY_CNT, SM_TUNE_TIMEOUT,
- mt6628_get_read_result);
- FM_UNLOCK(cmd_buf_lock);
-
- if (!ret && res) {
- WCN_DBG(FM_NTC | CHIP, "smt cqi size %d\n", res->cqi[0]);
- p_cqi = (struct mt6628_full_cqi *)&res->cqi[2];
- /* just for debug */
- WCN_DBG(FM_NTC | CHIP,
- "freq %d, 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x\n",
- p_cqi->ch, p_cqi->rssi, p_cqi->pamd, p_cqi->pr, p_cqi->fpamd, p_cqi->mr,
- p_cqi->atdc, p_cqi->prx, p_cqi->atdev, p_cqi->smg, p_cqi->drssi);
- RSSI =
- ((p_cqi->rssi & 0x03FF) >=
- 512) ? ((p_cqi->rssi & 0x03FF) - 1024) : (p_cqi->rssi & 0x03FF);
- PAMD =
- ((p_cqi->pamd & 0x1FF) >=
- 256) ? ((p_cqi->pamd & 0x01FF) - 512) : (p_cqi->pamd & 0x01FF);
- MR = ((p_cqi->mr & 0x01FF) >=
- 256) ? ((p_cqi->mr & 0x01FF) - 512) : (p_cqi->mr & 0x01FF);
- ATDC = (p_cqi->atdc >= 32768) ? (65536 - p_cqi->atdc) : (p_cqi->atdc);
- if (ATDC < 0) {
- ATDC = (~(ATDC)) - 1; /* Get abs value of ATDC */
- }
- PRX = (p_cqi->prx & 0x00FF);
- ATDEV = p_cqi->atdev;
- softmuteGainLvl = p_cqi->smg;
- /* check if the channel is valid according to each CQIs */
- if ((RSSI >= mt6628_fm_config.rx_cfg.long_ana_rssi_th)
- && (PAMD <= mt6628_fm_config.rx_cfg.pamd_th)
- && (ATDC <= mt6628_fm_config.rx_cfg.atdc_th)
- && (MR >= mt6628_fm_config.rx_cfg.mr_th)
- && (PRX >= mt6628_fm_config.rx_cfg.prx_th)
- && (ATDEV >= ATDC)
- && (softmuteGainLvl >= mt6628_fm_config.rx_cfg.smg_th)) {
- *valid = fm_true;
- } else {
- *valid = fm_false;
- }
- *rssi = RSSI;
-/* if(RSSI < -296)
- WCN_DBG(FM_NTC | CHIP, "rssi\n");
- else if(PAMD > -12)
- WCN_DBG(FM_NTC | CHIP, "PAMD\n");
- else if(ATDC > 3496)
- WCN_DBG(FM_NTC | CHIP, "ATDC\n");
- else if(MR < -67)
- WCN_DBG(FM_NTC | CHIP, "MR\n");
- else if(PRX < 80)
- WCN_DBG(FM_NTC | CHIP, "PRX\n");
- else if(ATDEV < ATDC)
- WCN_DBG(FM_NTC | CHIP, "ATDEV\n");
- else if(softmuteGainLvl < 16421)
- WCN_DBG(FM_NTC | CHIP, "softmuteGainLvl\n");
- */
- } else {
- WCN_DBG(FM_ALT | CHIP, "smt get CQI failed\n");
- return fm_false;
- }
- WCN_DBG(FM_NTC | CHIP, "valid=%d\n", *valid);
- return fm_true;
-}
-
-static fm_bool mt6628_em_test(fm_u16 group_idx, fm_u16 item_idx, fm_u32 item_value)
-{
- return fm_true;
-}
-
-static fm_s32 MT6628fm_low_power_wa_default(fm_s32 fmon)
-{
- return 0;
-}
-
-/*
-parm:
- parm.th_type: 0, RSSI. 1,desense RSSI. 2,SMG.
- parm.th_val: threshold value
-*/
-static fm_s32 mt6628_set_search_th(fm_s32 idx, fm_s32 val, fm_s32 reserve)
-{
- switch (idx) {
- case 0:
- {
- mt6628_fm_config.rx_cfg.long_ana_rssi_th = val;
- WCN_DBG(FM_NTC | CHIP, "set rssi th =%d\n", val);
- break;
- }
- case 1:
- {
- mt6628_fm_config.rx_cfg.desene_rssi_th = val;
- WCN_DBG(FM_NTC | CHIP, "set desense rssi th =%d\n", val);
- break;
- }
- case 2:
- {
- mt6628_fm_config.rx_cfg.smg_th = val;
- WCN_DBG(FM_NTC | CHIP, "set smg th =%d\n", val);
- break;
- }
- default:
- break;
- }
- return 0;
-}
-
-fm_s32 MT6628fm_low_ops_register(struct fm_lowlevel_ops *ops)
-{
- fm_s32 ret = 0;
- /* Basic functions. */
-
- FMR_ASSERT(ops);
- FMR_ASSERT(ops->cb.cur_freq_get);
- FMR_ASSERT(ops->cb.cur_freq_set);
- fm_cb_op = &ops->cb;
-
- ops->bi.low_pwr_wa = MT6628fm_low_power_wa_default;
- ops->bi.pwron = mt6628_pwron;
- ops->bi.pwroff = mt6628_pwroff;
- ops->bi.msdelay = Delayms;
- ops->bi.usdelay = Delayus;
- ops->bi.read = mt6628_read;
- ops->bi.write = mt6628_write;
- ops->bi.setbits = mt6628_set_bits;
- ops->bi.chipid_get = mt6628_get_chipid;
- ops->bi.mute = mt6628_Mute;
- ops->bi.rampdown = mt6628_RampDown;
- ops->bi.pwrupseq = mt6628_PowerUp;
- ops->bi.pwrdownseq = mt6628_PowerDown;
- ops->bi.setfreq = mt6628_SetFreq;
- ops->bi.seek = mt6628_Seek;
- ops->bi.seekstop = mt6628_SeekStop;
- ops->bi.scan = mt6628_Scan;
- ops->bi.cqi_get = mt6628_CQI_Get;
-#ifdef CONFIG_MTK_FM_50KHZ_SUPPORT
- ops->bi.scan = mt6628_Scan_50KHz;
- ops->bi.cqi_get = mt6628_CQI_Get_50KHz;
-#endif
- ops->bi.scanstop = mt6628_ScanStop;
- ops->bi.rssiget = mt6628_GetCurRSSI;
- ops->bi.volset = mt6628_SetVol;
- ops->bi.volget = mt6628_GetVol;
- ops->bi.dumpreg = mt6628_dump_reg;
- ops->bi.msget = mt6628_GetMonoStereo;
- ops->bi.msset = mt6628_SetMonoStereo;
- ops->bi.pamdget = mt6628_GetCurPamd;
- ops->bi.em = mt6628_em_test;
- ops->bi.anaswitch = mt6628_SetAntennaType;
- ops->bi.anaget = mt6628_GetAntennaType;
- ops->bi.caparray_get = mt6628_GetCapArray;
- ops->bi.i2s_set = mt6628_I2s_Setting;
- ops->bi.hwinfo_get = mt6628_hw_info_get;
- ops->bi.i2s_get = mt6628_i2s_info_get;
- ops->bi.is_dese_chan = mt6628_is_dese_chan;
- ops->bi.softmute_tune = mt6628_soft_mute_tune;
- ops->bi.desense_check = mt6628_desense_check;
- ops->bi.cqi_log = mt6628_full_cqi_get;
- ops->bi.set_search_th = mt6628_set_search_th;
- ops->bi.pre_search = mt6628_pre_search;
- ops->bi.restore_search = mt6628_restore_search;
- ops->bi.get_aud_info = mt6628fm_get_audio_info;
-
- cmd_buf_lock = fm_lock_create("28_cmd");
- ret = fm_lock_get(cmd_buf_lock);
-
- cmd_buf = fm_zalloc(TX_BUF_SIZE + 1);
-
- if (!cmd_buf) {
- WCN_DBG(FM_ALT | CHIP, "6628 fm lib alloc tx buf failed\n");
- ret = -1;
- }
-#ifdef CONFIG_MTK_FM_50KHZ_SUPPORT
- cqi_fifo = fm_fifo_create("6628_cqi_fifo", sizeof(struct adapt_fm_cqi), 640);
- if (!cqi_fifo) {
- WCN_DBG(FM_ALT | CHIP, "6628 fm lib create cqi fifo failed\n");
- ret = -1;
- }
-#endif
-
- return ret;
-}
-
-fm_s32 MT6628fm_low_ops_unregister(struct fm_lowlevel_ops *ops)
-{
- fm_s32 ret = 0;
- /* Basic functions. */
- FMR_ASSERT(ops);
-
-#ifdef CONFIG_MTK_FM_50KHZ_SUPPORT
- fm_fifo_release(cqi_fifo);
-#endif
-
- if (cmd_buf) {
- fm_free(cmd_buf);
- cmd_buf = NULL;
- }
-
- ret = fm_lock_put(cmd_buf_lock);
- fm_memset(&ops->bi, 0, sizeof(struct fm_basic_interface));
- return ret;
-}
-
-/* static struct fm_pub pub; */
-/* static struct fm_pub_cb *pub_cb = &pub.pub_tbl; */
-
-static const fm_u16 mt6628_mcu_dese_list[] = {
- 7630, 7800, 7940, 8320, 9260, 9600, 9710, 9920, 10400, 10410
-};
-
-static const fm_u16 mt6628_gps_dese_list[] = {
- 7850, 7860
-};
-
-static const fm_s8 mt6628_chan_para_map[] = {
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, /* 7600~7695 */
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 7700~7795 */
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 7800~7895 */
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 7900~7995 */
- 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 8000~8095 */
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 8100~8195 */
- 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 8200~8295 */
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 8300~8395 */
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, /* 8400~8495 */
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 8500~8595 */
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 8600~8695 */
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 8700~8795 */
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 8800~8895 */
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 8900~8995 */
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 9000~9095 */
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 9100~9195 */
- 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 9200~9295 */
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 9300~9395 */
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, /* 9400~9495 */
- 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 1, 0, /* 9500~9595 */
- 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 9600~9695 */
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 9700~9795 */
- 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 9800~9895 */
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, /* 9900~9995 */
- 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 10000~10095 */
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 10100~10195 */
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, /* 10200~10295 */
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 10300~10395 */
- 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 10400~10495 */
- 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 10500~10595 */
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 10600~10695 */
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, /* 10700~10795 */
- 0 /* 10800 */
-};
-
-
-static const fm_u16 mt6628_scan_dese_list[] = {
- 7680, 8210, 8450, 9210, 9220, 9600, 9840, 10400, 10750, 10760
-};
-
-/* return value: 0, not a de-sense channel; 1, this is a de-sense channel; else error no */
-static fm_s32 mt6628_is_dese_chan(fm_u16 freq)
-{
- fm_s32 size;
-
- size = sizeof(mt6628_scan_dese_list) / sizeof(mt6628_scan_dese_list[0]);
-
- if (0 == fm_get_channel_space(freq)) {
- freq *= 10;
- }
-
- while (size) {
- if (mt6628_scan_dese_list[size - 1] == freq)
- return 1;
-
- size--;
- }
-
- return 0;
-}
-
-/* return value:
-1, is desense channel and rssi is less than threshold;
-0, not desense channel or it is but rssi is more than threshold.*/
-static fm_s32 mt6628_desense_check(fm_u16 freq, fm_s32 rssi)
-{
- if (mt6628_is_dese_chan(freq)) {
- if (rssi < mt6628_fm_config.rx_cfg.desene_rssi_th) {
- return 1;
- }
- WCN_DBG(FM_DBG | CHIP, "desen_rssi %d th:%d\n", rssi,
- mt6628_fm_config.rx_cfg.desene_rssi_th);
- }
- return 0;
-}
-
-
-/* return value: 0, mcu dese disable; 1, enable; else error no */
-static fm_s32 mt6628_mcu_dese(fm_u16 freq, void *arg)
-{
- fm_mcu_desense_t state = FM_MCU_DESE_DISABLE;
- fm_s32 len = 0;
- fm_s32 indx = 0;
-
- if (0 == fm_get_channel_space(freq)) {
- freq *= 10;
- }
-
- WCN_DBG(FM_DBG | CHIP, "%s, [freq=%d]\n", __func__, (int)freq);
-
- len = sizeof(mt6628_mcu_dese_list) / sizeof(mt6628_mcu_dese_list[0]);
- indx = 0;
-
- while ((indx < len) && (state != FM_MCU_DESE_ENABLE)) {
- if (mt6628_mcu_dese_list[indx] == freq) {
- state = FM_MCU_DESE_ENABLE;
- }
-
- indx++;
- }
-
- /* request 6628 MCU change clk */
- if (state == FM_MCU_DESE_DISABLE) {
- if (!mtk_wcn_wmt_dsns_ctrl(WMTDSNS_FM_DISABLE)) {
- return -1;
- }
- return 0;
- } else {
- if (!mtk_wcn_wmt_dsns_ctrl(WMTDSNS_FM_ENABLE)) {
- return -1;
- }
- return 1;
- }
-}
-
-
-
-/* return value: 0,mcu dese disable; 1, enable; else error no */
-static fm_s32 mt6628_gps_dese(fm_u16 freq, void *arg)
-{
- fm_gps_desense_t state = FM_GPS_DESE_DISABLE;
- fm_s32 len = 0;
- fm_s32 indx = 0;
-
- if (0 == fm_get_channel_space(freq)) {
- freq *= 10;
- }
-
- WCN_DBG(FM_DBG | CHIP, "%s, [freq=%d]\n", __func__, (int)freq);
-
- len = sizeof(mt6628_gps_dese_list) / sizeof(mt6628_gps_dese_list[0]);
- indx = 0;
-
- while ((indx < len) && (state != FM_GPS_DESE_ENABLE)) {
- if (mt6628_gps_dese_list[indx] == freq) {
- state = FM_GPS_DESE_ENABLE;
- }
-
- indx++;
- }
-
- /* request 6628 GPS change clk */
- if (state == FM_GPS_DESE_DISABLE) {
- if (!mtk_wcn_wmt_dsns_ctrl(WMTDSNS_FM_GPS_DISABLE)) {
- return -1;
- }
- return 0;
- } else {
- if (!mtk_wcn_wmt_dsns_ctrl(WMTDSNS_FM_GPS_ENABLE)) {
- return -1;
- }
- return 1;
- }
-}
-
-
-/* get channel parameter, HL side/ FA / ATJ */
-static fm_u16 mt6628_chan_para_get(fm_u16 freq)
-{
- fm_s32 pos, size;
-
- if (0 == fm_get_channel_space(freq)) {
- freq *= 10;
- }
-
- pos = (freq - 7600) / 5;
-
- size = sizeof(mt6628_chan_para_map) / sizeof(mt6628_chan_para_map[0]);
-
- pos = (pos < 0) ? 0 : pos;
- pos = (pos > (size - 1)) ? (size - 1) : pos;
-
- return mt6628_chan_para_map[pos];
-}
diff --git a/drivers/misc/mediatek/fmradio/mt6628/pub/mt6628_fm_rds.c b/drivers/misc/mediatek/fmradio/mt6628/pub/mt6628_fm_rds.c
deleted file mode 100644
index ff326ffdf..000000000
--- a/drivers/misc/mediatek/fmradio/mt6628/pub/mt6628_fm_rds.c
+++ /dev/null
@@ -1,317 +0,0 @@
-/* mt6628_rds.c
- *
- * (C) Copyright 2009
- * MediaTek <www.MediaTek.com>
- * hongcheng <hongcheng.xia@MediaTek.com>
- *
- * mt6628 FM Radio Driver
- *
- * 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.
- *
- * 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.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- */
-#include "fm_typedef.h"
-#include "fm_dbg.h"
-#include "fm_err.h"
-#include "fm_interface.h"
-#include "fm_stdlib.h"
-#include "fm_rds.h"
-#include "mt6628_fm_reg.h"
-
-
-static fm_bool bRDS_FirstIn = fm_false;
-static fm_u32 gBLER_CHK_INTERVAL = 5000;
-static fm_u16 GOOD_BLK_CNT = 0, BAD_BLK_CNT;
-static fm_u8 BAD_BLK_RATIO;
-
-static struct fm_callback *fm_cb;
-static struct fm_basic_interface *fm_bi;
-
-
-static fm_bool mt6628_RDS_support(void);
-static fm_s32 mt6628_RDS_enable(void);
-static fm_s32 mt6628_RDS_disable(void);
-static fm_u16 mt6628_RDS_Get_GoodBlock_Counter(void);
-static fm_u16 mt6628_RDS_Get_BadBlock_Counter(void);
-static fm_u8 mt6628_RDS_Get_BadBlock_Ratio(void);
-static fm_u32 mt6628_RDS_Get_BlerCheck_Interval(void);
-/* static void mt6628_RDS_GetData(fm_u16 *data, fm_u16 datalen); */
-static void mt6628_RDS_Init_Data(rds_t *pstRDSData);
-
-
-
-static fm_bool mt6628_RDS_support(void)
-{
- return fm_true;
-}
-
-static fm_s32 mt6628_RDS_enable(void)
-{
- fm_s32 ret = 0;
- fm_u16 dataRead;
-
- WCN_DBG(FM_DBG | RDSC, "rds enable\n");
- ret = fm_bi->read(FM_RDS_CFG0, &dataRead);
- ret = fm_bi->write(FM_RDS_CFG0, 6); /* set buf_start_th */
- ret = fm_bi->read(FM_MAIN_CTRL, &dataRead);
- ret = fm_bi->write(FM_MAIN_CTRL, dataRead | (RDS_MASK));
-
- return ret;
-}
-
-static fm_s32 mt6628_RDS_disable(void)
-{
- fm_s32 ret = 0;
- fm_u16 dataRead;
-
- WCN_DBG(FM_DBG | RDSC, "rds disable\n");
- ret = fm_bi->read(FM_MAIN_CTRL, &dataRead);
- ret = fm_bi->write(FM_MAIN_CTRL, dataRead & (~RDS_MASK));
-
- return ret;
-}
-
-static fm_u16 mt6628_RDS_Get_GoodBlock_Counter(void)
-{
- fm_u16 tmp_reg;
-
- fm_bi->read(FM_RDS_GOODBK_CNT, &tmp_reg);
- GOOD_BLK_CNT = tmp_reg;
- WCN_DBG(FM_DBG | RDSC, "get good block cnt:%d\n", (fm_s32) tmp_reg);
-
- return tmp_reg;
-}
-
-static fm_u16 mt6628_RDS_Get_BadBlock_Counter(void)
-{
- fm_u16 tmp_reg;
-
- fm_bi->read(FM_RDS_BADBK_CNT, &tmp_reg);
- BAD_BLK_CNT = tmp_reg;
- WCN_DBG(FM_DBG | RDSC, "get bad block cnt:%d\n", (fm_s32) tmp_reg);
-
- return tmp_reg;
-}
-
-static fm_u8 mt6628_RDS_Get_BadBlock_Ratio(void)
-{
- fm_u16 tmp_reg;
- fm_u16 gbc;
- fm_u16 bbc;
-
- gbc = mt6628_RDS_Get_GoodBlock_Counter();
- bbc = mt6628_RDS_Get_BadBlock_Counter();
-
- if ((gbc + bbc) > 0) {
- tmp_reg = (fm_u8) (bbc * 100 / (gbc + bbc));
- } else {
- tmp_reg = 0;
- }
-
- BAD_BLK_RATIO = tmp_reg;
- WCN_DBG(FM_DBG | RDSC, "get badblock ratio:%d\n", (fm_s32) tmp_reg);
-
- return tmp_reg;
-}
-
-static fm_s32 mt6628_RDS_BlockCounter_Reset(void)
-{
- mt6628_RDS_disable();
- mt6628_RDS_enable();
-
- return 0;
-}
-
-static fm_u32 mt6628_RDS_Get_BlerCheck_Interval(void)
-{
- return gBLER_CHK_INTERVAL;
-}
-
-static fm_s32 mt6628_RDS_BlerCheck(rds_t *dst)
-{
- return 0;
-}
-
-#if 0
-static void RDS_Recovery_Handler(void)
-{
- fm_u16 tempData = 0;
-
- do {
- fm_bi->read(FM_RDS_DATA_REG, &tempData);
- fm_bi->read(FM_RDS_POINTER, &tempData);
- } while (tempData & 0x3);
-}
-#endif
-
-#if 0
-static void mt6628_RDS_GetData(fm_u16 *data, fm_u16 datalen)
-{
-#define RDS_GROUP_DIFF_OFS 0x007C
-#define RDS_FIFO_DIFF 0x007F
-#define RDS_CRC_BLK_ADJ 0x0020
-#define RDS_CRC_CORR_CNT 0x001E
-#define RDS_CRC_INFO 0x0001
-
- fm_u16 CRC = 0, i = 0, RDS_adj = 0, RDSDataCount = 0, FM_WARorrCnt = 0;
- fm_u16 temp = 0, OutputPofm_s32 = 0;
-
- WCN_DBG(FM_DBG | RDSC, "get data\n");
- fm_bi->read(FM_RDS_FIFO_STATUS0, &temp);
- RDSDataCount = ((RDS_GROUP_DIFF_OFS & temp) << 2);
-
- if ((temp & RDS_FIFO_DIFF) >= 4) {
- /* block A data and info handling */
- fm_bi->read(FM_RDS_INFO, &temp);
- RDS_adj |= (temp & RDS_CRC_BLK_ADJ) << 10;
- CRC |= (temp & RDS_CRC_INFO) << 3;
- FM_WARorrCnt |= ((temp & RDS_CRC_CORR_CNT) << 11);
- fm_bi->read(FM_RDS_DATA_REG, &data[0]);
-
- /* block B data and info handling */
- fm_bi->read(FM_RDS_INFO, &temp);
- RDS_adj |= (temp & RDS_CRC_BLK_ADJ) << 9;
- CRC |= (temp & RDS_CRC_INFO) << 2;
- FM_WARorrCnt |= ((temp & RDS_CRC_CORR_CNT) << 7);
- fm_bi->read(FM_RDS_DATA_REG, &data[1]);
-
- /* block C data and info handling */
- fm_bi->read(FM_RDS_INFO, &temp);
- RDS_adj |= (temp & RDS_CRC_BLK_ADJ) << 8;
- CRC |= (temp & RDS_CRC_INFO) << 1;
- FM_WARorrCnt |= ((temp & RDS_CRC_CORR_CNT) << 3);
- fm_bi->read(FM_RDS_DATA_REG, &data[2]);
-
- /* block D data and info handling */
- fm_bi->read(FM_RDS_INFO, &temp);
- RDS_adj |= (temp & RDS_CRC_BLK_ADJ) << 7;
- CRC |= (temp & RDS_CRC_INFO);
- FM_WARorrCnt |= ((temp & RDS_CRC_CORR_CNT) >> 1);
- fm_bi->read(FM_RDS_DATA_REG, &data[3]);
-
- data[4] = (CRC | RDS_adj | RDSDataCount);
- data[5] = FM_WARorrCnt;
-
- fm_bi->read(FM_RDS_PWDI, &data[6]);
- fm_bi->read(FM_RDS_PWDQ, &data[7]);
-
- fm_bi->read(FM_RDS_POINTER, &OutputPofm_s32);
-
- /* Go fm_s32o RDS recovery handler while RDS output pofm_s32 doesn't align to 4 in numeric */
- if (OutputPofm_s32 & 0x3) {
- RDS_Recovery_Handler();
- }
-
- } else {
- for (; i < 8; i++)
- data[i] = 0;
- }
-}
-#endif
-
-static void mt6628_RDS_Init_Data(rds_t *pstRDSData)
-{
- fm_memset(pstRDSData, 0, sizeof(rds_t));
- bRDS_FirstIn = fm_true;
-
- pstRDSData->event_status = 0x0000;
- fm_memset(pstRDSData->RT_Data.TextData, 0x20, sizeof(pstRDSData->RT_Data.TextData));
- fm_memset(pstRDSData->PS_Data.PS, '\0', sizeof(pstRDSData->PS_Data.PS));
- fm_memset(pstRDSData->PS_ON, 0x20, sizeof(pstRDSData->PS_ON));
-}
-
-fm_bool mt6628_RDS_OnOff(rds_t *dst, fm_bool bFlag)
-{
- if (mt6628_RDS_support() == fm_false) {
- WCN_DBG(FM_ALT | RDSC, "mt6628_RDS_OnOff failed, RDS not support\n");
- return fm_false;
- }
-
- if (bFlag) {
- mt6628_RDS_Init_Data(dst);
- mt6628_RDS_enable();
- } else {
- mt6628_RDS_Init_Data(dst);
- mt6628_RDS_disable();
- }
-
- return fm_true;
-}
-
-DEFINE_RDSLOG(mt6628_rds_log);
-
-/* mt6628_RDS_Efm_s32_Handler - response FM RDS interrupt
- * @fm - main data structure of FM driver
- * This function first get RDS raw data, then call RDS spec parser
- */
-static fm_s32 mt6628_rds_parser(rds_t *rds_dst, struct rds_rx_t *rds_raw, fm_s32 rds_size,
- fm_u16(*getfreq) (void))
-{
- mt6628_rds_log.log_in(&mt6628_rds_log, rds_raw, rds_size);
- return rds_parser(rds_dst, rds_raw, rds_size, getfreq);
-}
-
-static fm_s32 mt6628_rds_log_get(struct rds_rx_t *dst, fm_s32 *dst_len)
-{
- return mt6628_rds_log.log_out(&mt6628_rds_log, dst, dst_len);
-}
-
-static fm_s32 mt6628_rds_gc_get(struct rds_group_cnt_t *dst, rds_t *rdsp)
-{
- return rds_grp_counter_get(dst, &rdsp->gc);
-}
-
-static fm_s32 mt6628_rds_gc_reset(rds_t *rdsp)
-{
- return rds_grp_counter_reset(&rdsp->gc);
-}
-
-fm_s32 MT6628fm_rds_ops_register(struct fm_lowlevel_ops *ops)
-{
- fm_s32 ret = 0;
-
- FMR_ASSERT(ops);
- FMR_ASSERT(ops->bi.write);
- FMR_ASSERT(ops->bi.read);
- FMR_ASSERT(ops->bi.setbits);
- FMR_ASSERT(ops->bi.usdelay);
- fm_bi = &ops->bi;
-
- FMR_ASSERT(ops->cb.cur_freq_get);
- FMR_ASSERT(ops->cb.cur_freq_set);
- fm_cb = &ops->cb;
-
- ops->ri.rds_blercheck = mt6628_RDS_BlerCheck;
- ops->ri.rds_onoff = mt6628_RDS_OnOff;
- ops->ri.rds_parser = mt6628_rds_parser;
- ops->ri.rds_gbc_get = mt6628_RDS_Get_GoodBlock_Counter;
- ops->ri.rds_bbc_get = mt6628_RDS_Get_BadBlock_Counter;
- ops->ri.rds_bbr_get = mt6628_RDS_Get_BadBlock_Ratio;
- ops->ri.rds_bc_reset = mt6628_RDS_BlockCounter_Reset;
- ops->ri.rds_bci_get = mt6628_RDS_Get_BlerCheck_Interval;
- ops->ri.rds_log_get = mt6628_rds_log_get;
- ops->ri.rds_gc_get = mt6628_rds_gc_get;
- ops->ri.rds_gc_reset = mt6628_rds_gc_reset;
- return ret;
-}
-
-fm_s32 MT6628fm_rds_ops_unregister(struct fm_lowlevel_ops *ops)
-{
- fm_s32 ret = 0;
-
- FMR_ASSERT(ops);
-
- fm_bi = NULL;
- fm_memset(&ops->ri, 0, sizeof(struct fm_rds_interface));
- return ret;
-}
diff --git a/drivers/misc/mediatek/fmradio/mt6630/inc/mt6630_fm.h b/drivers/misc/mediatek/fmradio/mt6630/inc/mt6630_fm.h
deleted file mode 100644
index 52502ad31..000000000
--- a/drivers/misc/mediatek/fmradio/mt6630/inc/mt6630_fm.h
+++ /dev/null
@@ -1,58 +0,0 @@
-/* mt6630_fm.h
- *
- * (C) Copyright 2009
- * MediaTek <www.MediaTek.com>
- * Hongcheng <hongcheng.xia@MediaTek.com>
- *
- * MT6630 FM Radio Driver -- head file
- *
- * 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.
- *
- * 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.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- */
-#ifndef __MT6630_FM_H__
-#define __MT6630_FM_H__
-
-#include "fm_typedef.h"
-
-/* #define FM_PowerOn_with_ShortAntenna */
-#define MT6630_RSSI_TH_LONG 0xFF01 /* FM radio long antenna RSSI threshold(11.375dBuV) */
-#define MT6630_RSSI_TH_SHORT 0xFEE0 /* FM radio short antenna RSSI threshold(-1dBuV) */
-#define MT6630_CQI_TH 0x00E9 /* FM radio Channel quality indicator threshold(0x0000~0x00FF) */
-#define MT6630_SEEK_SPACE 1 /* FM radio seek space,1:100KHZ; 2:200KHZ */
-#define MT6630_SCAN_CH_SIZE 40 /* FM radio scan max channel size */
-#define MT6630_BAND 1 /* FM radio band, 1:87.5MHz~108.0MHz; 2:76.0MHz~90.0MHz; 3:76.0MHz~108.0MHz; 4:special */
-#define MT6630_BAND_FREQ_L 875 /* FM radio special band low freq(Default 87.5MHz) */
-#define MT6630_BAND_FREQ_H 1080 /* FM radio special band high freq(Default 108.0MHz) */
-#define MT6630_DEEMPHASIS_50us TRUE
-
-#define MT6630_SLAVE_ADDR 0xE0 /* 0x70 7-bit address */
-#define MT6630_MAX_COUNT 100
-
-#ifdef CONFIG_MTK_FM_50KHZ_SUPPORT
-#define MT6630_SCANTBL_SIZE 26 /* 16*uinit16_t */
-#else
-#define MT6630_SCANTBL_SIZE 16 /* 16*uinit16_t */
-#endif
-
-#define AFC_ON 0x01
-#if AFC_ON
-#define FM_MAIN_CTRL_INIT 0x480
-#else
-#define FM_MAIN_CTRL_INIT 0x080
-#endif
-
-#define ext_clk /* if define ext_clk use external reference clock or mask will use internal */
-#define MT6630_DEV "MT6630"
-
-#endif /* end of #ifndef __MT6630_FM_H__ */
diff --git a/drivers/misc/mediatek/fmradio/mt6630/inc/mt6630_fm_cmd.h b/drivers/misc/mediatek/fmradio/mt6630/inc/mt6630_fm_cmd.h
deleted file mode 100644
index ac303114f..000000000
--- a/drivers/misc/mediatek/fmradio/mt6630/inc/mt6630_fm_cmd.h
+++ /dev/null
@@ -1,77 +0,0 @@
-#ifndef __MT6630_FM_CMD_H__
-#define __MT6630_FM_CMD_H__
-
-#include <linux/types.h>
-#include "fm_typedef.h"
-
-/* FM basic-operation's opcode */
-#define FM_BOP_BASE (0x80)
-enum {
- FM_WRITE_BASIC_OP = (FM_BOP_BASE + 0x00),
- FM_UDELAY_BASIC_OP = (FM_BOP_BASE + 0x01),
- FM_RD_UNTIL_BASIC_OP = (FM_BOP_BASE + 0x02),
- FM_MODIFY_BASIC_OP = (FM_BOP_BASE + 0x03),
- FM_MSLEEP_BASIC_OP = (FM_BOP_BASE + 0x04),
- FM_TOP_WRITE_BASIC_OP = (FM_BOP_BASE + 0x05),
- FM_TOP_RD_UNTIL_BASIC_OP = (FM_BOP_BASE + 0x06),
- FM_TOP_MODIFY_BASIC_OP = (FM_BOP_BASE + 0x07),
- FM_MAX_BASIC_OP = (FM_BOP_BASE + 0x08)
-};
-
-/* FM BOP's size */
-#define FM_TOP_WRITE_BOP_SIZE (7)
-#define FM_TOP_RD_UNTIL_BOP_SIZE (11)
-#define FM_TOP_MODIFY_BOP_SIZE (11)
-
-#define FM_WRITE_BASIC_OP_SIZE (3)
-#define FM_UDELAY_BASIC_OP_SIZE (4)
-#define FM_RD_UNTIL_BASIC_OP_SIZE (5)
-#define FM_MODIFY_BASIC_OP_SIZE (5)
-#define FM_MSLEEP_BASIC_OP_SIZE (4)
-
-fm_s32 mt6630_pwrup_fpga_on(fm_u8 *buf, fm_s32 buf_size);
-fm_s32 mt6630_pwrup_clock_on(fm_u8 *buf, fm_s32 buf_size);
-fm_s32 mt6630_pwrup_digital_init(fm_u8 *buf, fm_s32 buf_size);
-fm_s32 mt6630_pwrdown(fm_u8 *buf, fm_s32 buf_size);
-fm_s32 mt6630_rampdown(fm_u8 *buf, fm_s32 buf_size);
-fm_s32 mt6630_tune(fm_u8 *buf, fm_s32 buf_size, fm_u16 freq, fm_u16 chan_para);
-fm_s32 mt6630_seek(fm_u8 *buf, fm_s32 buf_size, fm_u16 seekdir, fm_u16 space, fm_u16 max_freq,
- fm_u16 min_freq);
-fm_s32 mt6630_scan(fm_u8 *buf, fm_s32 buf_size, fm_u16 scandir, fm_u16 space, fm_u16 max_freq,
- fm_u16 min_freq);
-fm_s32 mt6630_cqi_get(fm_u8 *buf, fm_s32 buf_size);
-fm_s32 mt6630_get_reg(fm_u8 *buf, fm_s32 buf_size, fm_u8 addr);
-fm_s32 mt6630_set_reg(fm_u8 *buf, fm_s32 buf_size, fm_u8 addr, fm_u16 value);
-fm_s32 mt6630_patch_download(fm_u8 *buf, fm_s32 buf_size, fm_u8 seg_num, fm_u8 seg_id,
- const fm_u8 *src, fm_s32 seg_len);
-fm_s32 mt6630_coeff_download(fm_u8 *buf, fm_s32 buf_size, fm_u8 seg_num, fm_u8 seg_id,
- const fm_u8 *src, fm_s32 seg_len);
-#if 0
-fm_s32 mt6630_hwcoeff_download(fm_u8 *buf, fm_s32 buf_size, fm_u8 seg_num, fm_u8 seg_id,
- const fm_u8 *src, fm_s32 seg_len);
-fm_s32 mt6630_rom_download(fm_u8 *buf, fm_s32 buf_size, fm_u8 seg_num, fm_u8 seg_id,
- const fm_u8 *src, fm_s32 seg_len);
-#endif
-fm_s32 mt6630_full_cqi_req(fm_u8 *buf, fm_s32 buf_size, fm_u16 *freq, fm_s32 cnt, fm_s32 type);
-fm_s32 mt6630_top_get_reg(fm_u8 *buf, fm_s32 buf_size, fm_u16 addr);
-fm_s32 mt6630_top_set_reg(fm_u8 *buf, fm_s32 buf_size, fm_u16 addr, fm_u32 value);
-fm_s32 mt6630_host_get_reg(fm_u8 *buf, fm_s32 buf_size, fm_u32 addr);
-fm_s32 mt6630_host_set_reg(fm_u8 *buf, fm_s32 buf_size, fm_u32 addr, fm_u32 value);
-fm_s32 mt6630_set_bits_reg(fm_u8 *buf, fm_s32 buf_size, fm_u8 addr, fm_u16 bits, fm_u16 mask);
-/*****************Tx***********************/
-fm_s32 mt6630_tune_tx(fm_u8 *buf, fm_s32 buf_size, fm_u16 freq, fm_u16 chan_para);
-fm_s32 mt6630_pwrup_clock_on_tx(fm_u8 *buf, fm_s32 buf_size);
-fm_s32 mt6630_pwrup_tx_deviation(fm_u8 *buf, fm_s32 buf_size);
-fm_s32 mt6630_rds_tx(fm_u8 *tx_buf, fm_s32 tx_buf_size, fm_u16 pi, fm_u16 *ps, fm_u16 *other_rds,
- fm_u8 other_rds_cnt);
-fm_s32 mt6630_tx_rdson_deviation(fm_u8 *buf, fm_s32 buf_size);
-
-/*
- * fm_get_channel_space - get the spcace of gived channel
- * @freq - value in 760~1080 or 7600~10800
- *
- * Return 0, if 760~1080; return 1, if 7600 ~ 10800, else err code < 0
- */
-extern fm_s32 fm_get_channel_space(int freq);
-
-#endif
diff --git a/drivers/misc/mediatek/fmradio/mt6630/inc/mt6630_fm_cust_cfg.h b/drivers/misc/mediatek/fmradio/mt6630/inc/mt6630_fm_cust_cfg.h
deleted file mode 100644
index 8107cfe35..000000000
--- a/drivers/misc/mediatek/fmradio/mt6630/inc/mt6630_fm_cust_cfg.h
+++ /dev/null
@@ -1,102 +0,0 @@
-/*
- *
- * (C) Copyright 20011
- * MediaTek <www.MediaTek.com>
- * Hongcheng Xia<Hongcheng.Xia@MediaTek.com>
- *
- * FM Radio Driver
- *
- * 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.
- *
- * 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.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- */
-
-#ifndef __MT6630_CUST_CFG_H__
-#define __MT6630_CUST_CFG_H__
-
-/* scan sort algorithm */
-enum {
- FM_SCAN_SORT_NON = 0,
- FM_SCAN_SORT_UP,
- FM_SCAN_SORT_DOWN,
- FM_SCAN_SORT_MAX
-};
-/*typedef struct {
- fm_s32 short_ana_rssi_th;
- fm_s32 long_ana_rssi_th;
- fm_s32 desene_rssi_th;
- fm_s32 pamd_th;
- fm_s32 mr_th;
- fm_s32 atdc_th;
- fm_u32 prx_th;
- fm_u32 atdev_th;
- fm_u16 smg_th;
- fm_u16 deemphasis;
- fm_u16 osc_freq;
-}mt6628_fm_rx_cust_cfg;
-
-typedef struct{
- mt6628_fm_rx_cust_cfg rx_cfg;
-}mt6628_fm_cust_cfg;
-*/
-/* ***************************************************************************************** */
-/* ***********************************FM config for customer: start****************************** */
-/* ***************************************************************************************** */
-/* RX */
-#define FM_RX_RSSI_TH_LONG_MT6630 -296 /* FM radio long antenna RSSI threshold(-4dBuV) */
-#define FM_RX_RSSI_TH_SHORT_MT6630 -296 /* FM radio short antenna RSSI threshold(-4dBuV) */
-#define FM_RX_DESENSE_RSSI_MT6630 -258
-#define FM_RX_PAMD_TH_MT6630 -12
-#define FM_RX_MR_TH_MT6630 -67
-#define FM_RX_ATDC_TH_MT6630 3496
-#define FM_RX_PRX_TH_MT6630 64
-#define FM_RX_SMG_TH_MT6630 16421 /* FM soft-mute gain threshold */
-#define FM_RX_DEEMPHASIS_MT6630 0 /* 0-50us, China Mainland; 1-75us China Taiwan */
-#define FM_RX_OSC_FREQ_MT6630 0 /* 0-26MHz; 1-19MHz; 2-24MHz; 3-38.4MHz; 4-40MHz; 5-52MHz */
-/* #define FM_RX_SEEK_SPACE_MT6630 1 //FM radio seek space,1:100KHZ; 2:200KHZ */
-/* #define FM_RX_SCAN_CH_SIZE_MT6630 40 //FM radio scan max channel size */
-/* #define FM_RX_BAND_MT6630 1 //FM radio band, 1:87.5MHz~108.0MHz; 2:76.0MHz~90.0MHz; 3:76.0MHz~108.0MHz; 4:special */
-/* #define FM_RX_SCAN_SORT_SELECT_MT6630 FM_SCAN_SORT_NON */
-/* #define FM_RX_FAKE_CH_NUM_MT6630 1 */
-/* #define FM_RX_FAKE_CH_RSSI_MT6630 40 */
-/* #define FM_RX_FAKE_CH_1_MT6630 1075 */
-/* #define FM_RX_FAKE_CH_2_MT6630 0 */
-/* #define FM_RX_FAKE_CH_3_MT6630 0 */
-/* #define FM_RX_FAKE_CH_4_MT6630 0 */
-/* #define FM_RX_FAKE_CH_5_MT6630 0 */
-
-/* TX */
-/* #define FM_TX_PWR_LEVEL_MAX_MT6630 120 */
-/* #define FM_TX_SCAN_HOLE_LOW_MT6630 923 //92.3MHz~95.4MHz should not show to user */
-/* #define FM_TX_SCAN_HOLE_HIGH_MT6630 954 //92.3MHz~95.4MHz should not show to user */
-#define FM_TX_PAMD_TH_MT6630 -23
-#define FM_TX_MR_TH_MT6630 60
-#define FM_TX_SMG_TH_MT6630 8231
-
-
-/* ***************************************************************************************** */
-/* ***********************************FM config for customer:end ******************************* */
-/* ***************************************************************************************** */
-
-/* #define FM_SEEK_SPACE_MT6630 FM_RX_SEEK_SPACE_MT6630 */
-/* max scan chl num */
-/* #define FM_MAX_CHL_SIZ_MT6630E FM_RX_SCAN_CH_SIZE_MT6630 */
-/* auto HiLo */
-#define FM_AUTO_HILO_OFF_MT6630 0
-#define FM_AUTO_HILO_ON_MT6630 1
-
-
-/* seek threshold */
-#define FM_SEEKTH_LEVEL_DEFAULT_MT6630 4
-
-#endif /* __MT6630_CUST_CFG_H__ */
diff --git a/drivers/misc/mediatek/fmradio/mt6630/inc/mt6630_fm_lib.h b/drivers/misc/mediatek/fmradio/mt6630/inc/mt6630_fm_lib.h
deleted file mode 100644
index 868c1a89f..000000000
--- a/drivers/misc/mediatek/fmradio/mt6630/inc/mt6630_fm_lib.h
+++ /dev/null
@@ -1,71 +0,0 @@
-#ifndef __MT6630_FM_LIB_H__
-#define __MT6630_FM_LIB_H__
-
-#include "fm_typedef.h"
-
-enum {
- DSPPATCH = 0xFFF9,
- USDELAY = 0xFFFA,
- MSDELAY = 0xFFFB,
- HW_VER = 0xFFFD,
- POLL_N = 0xFFFE, /* poling check if bit(n) is '0' */
- POLL_P = 0xFFFF, /* polling check if bit(n) is '1' */
-};
-
-enum {
- FM_PUS_DSPPATCH = DSPPATCH,
- FM_PUS_USDELAY = USDELAY,
- FM_PUS_MSDELAY = MSDELAY,
- FM_PUS_HW_VER = HW_VER,
- FM_PUS_POLL_N = POLL_N, /* poling check if bit(n) is '0' */
- FM_PUS_POLL_P = POLL_P, /* polling check if bit(n) is '1' */
- FM_PUS_MAX
-};
-
-enum {
- DSP_PATH = 0x02,
- DSP_COEFF = 0x03,
- DSP_HW_COEFF = 0x04
-};
-
-enum IMG_TYPE {
- IMG_WRONG = 0,
- IMG_ROM,
- IMG_PATCH,
- IMG_COEFFICIENT,
- IMG_HW_COEFFICIENT
-};
-
-enum {
- mt6630_E1 = 0,
- mt6630_E2
-};
-
-struct mt6630_fm_cqi {
- fm_u16 ch;
- fm_u16 rssi;
- fm_u16 reserve;
-};
-
-struct adapt_fm_cqi {
- fm_s32 ch;
- fm_s32 rssi;
- fm_s32 reserve;
-};
-
-struct mt6630_full_cqi {
- fm_u16 ch;
- fm_u16 rssi;
- fm_u16 pamd;
- fm_u16 pr;
- fm_u16 fpamd;
- fm_u16 mr;
- fm_u16 atdc;
- fm_u16 prx;
- fm_u16 atdev;
- fm_u16 smg; /* soft-mute gain */
- fm_u16 drssi; /* delta rssi */
-};
-
-
-#endif
diff --git a/drivers/misc/mediatek/fmradio/mt6630/inc/mt6630_fm_reg.h b/drivers/misc/mediatek/fmradio/mt6630/inc/mt6630_fm_reg.h
deleted file mode 100644
index c8e36184a..000000000
--- a/drivers/misc/mediatek/fmradio/mt6630/inc/mt6630_fm_reg.h
+++ /dev/null
@@ -1,89 +0,0 @@
-#ifndef __MT6630_FM_REG_H__
-#define __MT6630_FM_REG_H__
-
-enum MT6630_REG {
- FM_MAIN_CG1_CTRL = 0x60,
- FM_MAIN_CG2_CTRL = 0x61,
- FM_MAIN_HWVER = 0x62,
- FM_MAIN_CTRL = 0x63,
- FM_CHANNEL_SET = 0x65,
- FM_MAIN_CFG1 = 0x66,
- FM_MAIN_CFG2 = 0x67,
- FM_MAIN_MCLKDESENSE = 0x38,
- FM_MAIN_INTR = 0x69,
- FM_MAIN_INTRMASK = 0x6A,
- FM_MAIN_EXTINTRMASK = 0x6B,
- FM_RSSI_IND = 0x6C,
- FM_RSSI_TH = 0x6D,
- FM_MAIN_RESET = 0x6E,
- FM_MAIN_CHANDETSTAT = 0x6F,
- FM_RDS_CFG0 = 0x80,
- FM_RDS_INFO = 0x81,
- FM_RDS_DATA_REG = 0x82,
- FM_RDS_GOODBK_CNT = 0x83,
- FM_RDS_BADBK_CNT = 0x84,
- FM_RDS_PWDI = 0x85,
- FM_RDS_PWDQ = 0x86,
- FM_RDS_FIFO_STATUS0 = 0x87,
- FM_FT_CON9 = 0x8F,
- FM_DSP_PATCH_CTRL = 0x90,
- FM_DSP_PATCH_OFFSET = 0x91,
- FM_DSP_PATCH_DATA = 0x92,
- FM_DSP_MEM_CTRL4 = 0x93,
- FM_ADDR_PAMD = 0xB4,
- FM_RDS_BDGRP_ABD_CTRL_REG = 0xB6,
- FM_RDS_POINTER = 0xF0,
-};
-
-/* RDS_BDGRP_ABD_CTRL_REG */
-enum {
- BDGRP_ABD_EN = 0x0001,
- BER_RUN = 0x2000
-};
-#define FM_DAC_CON1 0x83
-#define FM_DAC_CON2 0x84
-#define FM_FT_CON0 0x86
-enum {
- FT_EN = 0x0001
-};
-
-#define FM_I2S_CON0 0x90
-enum {
- I2S_EN = 0x0001,
- FORMAT = 0x0002,
- WLEN = 0x0004,
- I2S_SRC = 0x0008
-};
-
-/* FM_MAIN_CTRL */
-enum {
- TUNE = 0x0001,
- SEEK = 0x0002,
- SCAN = 0x0004,
- CQI_READ = 0x0008,
- RDS_MASK = 0x0010,
- MUTE = 0x0020,
- RDS_BRST = 0x0040,
- RAMP_DOWN = 0x0100,
-};
-
-/* FM_MAIN_INTR */
-enum {
- FM_INTR_STC_DONE = 0x0001,
- FM_INTR_IQCAL_DONE = 0x0002,
- FM_INTR_DESENSE_HIT = 0x0004,
- FM_INTR_CHNL_CHG = 0x0008,
- FM_INTR_SW_INTR = 0x0010,
- FM_INTR_RDS = 0x0020
-};
-
-enum {
- ANTENNA_TYPE = 0x0010, /* 0x61 D4, 0:long, 1:short */
- ANALOG_I2S = 0x0080, /* 0x61 D7, 0:lineout, 1:I2S */
- DE_EMPHASIS = 0x1000, /* 0x61 D12,0:50us, 1:75 us */
-};
-
-#define OSC_FREQ_BITS 0x0070 /* 0x60 bit4~6 */
-#define OSC_FREQ_MASK (~OSC_FREQ_BITS)
-
-#endif /* __MT6630_FM_REG_H__ */
diff --git a/drivers/misc/mediatek/fmradio/mt6630/pub/mt6630_fm_cmd.c b/drivers/misc/mediatek/fmradio/mt6630/pub/mt6630_fm_cmd.c
deleted file mode 100644
index eedc201f7..000000000
--- a/drivers/misc/mediatek/fmradio/mt6630/pub/mt6630_fm_cmd.c
+++ /dev/null
@@ -1,1053 +0,0 @@
-/* mt6630_fm_cmd.c
- *
- * (C) Copyright 2009
- * MediaTek <www.MediaTek.com>
- * Hongcheng <hongcheng.xia@MediaTek.com>
- *
- * MT6630 FM Radio Driver -- source file
- *
- * 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.
- *
- * 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.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- */
-#include <linux/kernel.h>
-#include <linux/types.h>
-
-#include "fm_typedef.h"
-#include "fm_dbg.h"
-#include "fm_err.h"
-#include "fm_rds.h"
-#include "fm_config.h"
-#include "fm_link.h"
-
-#include "mt6630_fm_reg.h"
-/* #include "mt6630_fm_link.h" */
-#include "mt6630_fm.h"
-#include "mt6630_fm_cmd.h"
-#include "mt6630_fm_cust_cfg.h"
-
-extern fm_cust_cfg mt6630_fm_config;
-
-static fm_s32 fm_bop_write(fm_u8 addr, fm_u16 value, fm_u8 *buf, fm_s32 size)
-{
- if (size < (FM_WRITE_BASIC_OP_SIZE + 2)) {
- return (-1);
- }
-
- if (buf == NULL) {
- return (-2);
- }
-
- buf[0] = FM_WRITE_BASIC_OP;
- buf[1] = FM_WRITE_BASIC_OP_SIZE;
- buf[2] = addr;
- buf[3] = (fm_u8) ((value) & 0x00FF);
- buf[4] = (fm_u8) ((value >> 8) & 0x00FF);
-
- WCN_DBG(FM_DBG | CHIP, "%02x %02x %02x %02x %02x\n", buf[0], buf[1], buf[2], buf[3],
- buf[4]);
-
- return (FM_WRITE_BASIC_OP_SIZE + 2);
-}
-
-
-static fm_s32 fm_bop_udelay(fm_u32 value, fm_u8 *buf, fm_s32 size)
-{
- if (size < (FM_UDELAY_BASIC_OP_SIZE + 2)) {
- return (-1);
- }
-
- if (buf == NULL) {
- return (-2);
- }
-
- buf[0] = FM_UDELAY_BASIC_OP;
- buf[1] = FM_UDELAY_BASIC_OP_SIZE;
- buf[2] = (fm_u8) ((value) & 0x000000FF);
- buf[3] = (fm_u8) ((value >> 8) & 0x000000FF);
- buf[4] = (fm_u8) ((value >> 16) & 0x000000FF);
- buf[5] = (fm_u8) ((value >> 24) & 0x000000FF);
-
- WCN_DBG(FM_DBG | CHIP, "%02x %02x %02x %02x %02x %02x\n", buf[0], buf[1], buf[2], buf[3],
- buf[4], buf[5]);
-
- return (FM_UDELAY_BASIC_OP_SIZE + 2);
-}
-
-
-static fm_s32 fm_bop_rd_until(fm_u8 addr, fm_u16 mask, fm_u16 value, fm_u8 *buf, fm_s32 size)
-{
- if (size < (FM_RD_UNTIL_BASIC_OP_SIZE + 2)) {
- return (-1);
- }
-
- if (buf == NULL) {
- return (-2);
- }
-
- buf[0] = FM_RD_UNTIL_BASIC_OP;
- buf[1] = FM_RD_UNTIL_BASIC_OP_SIZE;
- buf[2] = addr;
- buf[3] = (fm_u8) ((mask) & 0x00FF);
- buf[4] = (fm_u8) ((mask >> 8) & 0x00FF);
- buf[5] = (fm_u8) ((value) & 0x00FF);
- buf[6] = (fm_u8) ((value >> 8) & 0x00FF);
-
- WCN_DBG(FM_DBG | CHIP, "%02x %02x %02x %02x %02x %02x %02x\n", buf[0], buf[1], buf[2],
- buf[3], buf[4], buf[5], buf[6]);
-
- return (FM_RD_UNTIL_BASIC_OP_SIZE + 2);
-}
-
-
-static fm_s32 fm_bop_modify(fm_u8 addr, fm_u16 mask_and, fm_u16 mask_or, fm_u8 *buf, fm_s32 size)
-{
- if (size < (FM_MODIFY_BASIC_OP_SIZE + 2)) {
- return (-1);
- }
-
- if (buf == NULL) {
- return (-2);
- }
-
- buf[0] = FM_MODIFY_BASIC_OP;
- buf[1] = FM_MODIFY_BASIC_OP_SIZE;
- buf[2] = addr;
- buf[3] = (fm_u8) ((mask_and) & 0x00FF);
- buf[4] = (fm_u8) ((mask_and >> 8) & 0x00FF);
- buf[5] = (fm_u8) ((mask_or) & 0x00FF);
- buf[6] = (fm_u8) ((mask_or >> 8) & 0x00FF);
-
- WCN_DBG(FM_DBG | CHIP, "%02x %02x %02x %02x %02x %02x %02x\n", buf[0], buf[1], buf[2],
- buf[3], buf[4], buf[5], buf[6]);
-
- return (FM_MODIFY_BASIC_OP_SIZE + 2);
-}
-
-/*
- * mt6630_pwrup_clock_on - Wholechip FM Power Up: step 1, FM Digital Clock enable
- * @buf - target buf
- * @buf_size - buffer size
- * return package size
- */
-fm_s32 mt6630_pwrup_clock_on(fm_u8 *buf, fm_s32 buf_size)
-{
- fm_s32 pkt_size = 0;
- fm_u16 de_emphasis;
- /* fm_u16 osc_freq; */
-
- if (buf_size < TX_BUF_SIZE) {
- return (-1);
- }
-
- de_emphasis = mt6630_fm_config.rx_cfg.deemphasis; /* MT6630fm_cust_config_fetch(FM_CFG_RX_DEEMPHASIS); */
- de_emphasis &= 0x0001; /* rang 0~1 */
- /* osc_freq = mt6630_fm_config.rx_cfg.osc_freq;//MT6628fm_cust_config_fetch(FM_CFG_RX_OSC_FREQ); */
- /* osc_freq &= 0x0007; //rang 0~5 */
-
- buf[0] = FM_TASK_COMMAND_PKT_TYPE;
- buf[1] = FM_ENABLE_OPCODE;
- pkt_size = 4;
-
- /* B1.1 Enable digital OSC */
- pkt_size += fm_bop_write(0x60, 0x0003, &buf[pkt_size], buf_size - pkt_size); /* wr 60 3 */
- pkt_size += fm_bop_udelay(100, &buf[pkt_size], buf_size - pkt_size); /* delay 100us */
- /* B1.3 Release HW clock gating */
- pkt_size += fm_bop_write(0x60, 0x0007, &buf[pkt_size], buf_size - pkt_size); /* wr 60 7 */
- /* B1.4 Set FM long/short antenna:1: short_antenna 0: long antenna(default) */
- pkt_size += fm_bop_modify(0x61, 0xFFEF, 0x0000, &buf[pkt_size], buf_size - pkt_size);
- /* B1.5 Set audio output mode (lineout/I2S) 0:lineout, 1:I2S */
- if (mt6630_fm_config.aud_cfg.aud_path == FM_AUD_ANALOG) {
- pkt_size +=
- fm_bop_modify(0x61, 0xFF7F, 0x0000, &buf[pkt_size], buf_size - pkt_size);
- } else {
- pkt_size +=
- fm_bop_modify(0x61, 0xFF7F, 0x0080, &buf[pkt_size], buf_size - pkt_size);
- }
- /* B1.6 Set deemphasis setting */
- pkt_size +=
- fm_bop_modify(0x61, ~DE_EMPHASIS, (de_emphasis << 12), &buf[pkt_size],
- buf_size - pkt_size);
-
- /* pkt_size += fm_bop_modify(0x60, OSC_FREQ_MASK, (osc_freq << 4), &buf[pkt_size], buf_size - pkt_size); */
-
- buf[2] = (fm_u8) ((pkt_size - 4) & 0x00FF);
- buf[3] = (fm_u8) (((pkt_size - 4) >> 8) & 0x00FF);
-
- return pkt_size;
-}
-
-
-/*
- * mt6630_patch_download - Wholechip FM Power Up: step 3, download patch to f/w,
- * @buf - target buf
- * @buf_size - buffer size
- * @seg_num - total segments that this patch divided into
- * @seg_id - No. of Segments: segment that will now be sent
- * @src - patch source buffer
- * @seg_len - segment size: segment that will now be sent
- * return package size
- */
-fm_s32 mt6630_patch_download(fm_u8 *buf, fm_s32 buf_size, fm_u8 seg_num, fm_u8 seg_id,
- const fm_u8 *src, fm_s32 seg_len)
-{
- fm_s32 pkt_size = 0;
- fm_u8 *dst = NULL;
-
- if (buf_size < TX_BUF_SIZE) {
- return (-1);
- }
-
- buf[0] = FM_TASK_COMMAND_PKT_TYPE;
- buf[1] = FM_PATCH_DOWNLOAD_OPCODE;
- pkt_size = 4;
-
- buf[pkt_size++] = seg_num;
- buf[pkt_size++] = seg_id;
-
- if (seg_len > (buf_size - pkt_size)) {
- return -1;
- }
-
- dst = &buf[pkt_size];
- pkt_size += seg_len;
-
- /* copy patch to tx buffer */
- while (seg_len--) {
- *dst = *src;
- /* pr_debug("%02x ", *dst); */
- src++;
- dst++;
- }
-
- buf[2] = (fm_u8) ((pkt_size - 4) & 0x00FF);
- buf[3] = (fm_u8) (((pkt_size - 4) >> 8) & 0x00FF);
- WCN_DBG(FM_DBG | CHIP, "%02x %02x %02x %02x %02x %02x %02x\n", buf[0], buf[1], buf[2],
- buf[3], buf[4], buf[5], buf[6]);
-
- return pkt_size;
-}
-
-
-/*
- * mt6630_coeff_download - Wholechip FM Power Up: step 3,download coeff to f/w,
- * @buf - target buf
- * @buf_size - buffer size
- * @seg_num - total segments that this patch divided into
- * @seg_id - No. of Segments: segment that will now be sent
- * @src - patch source buffer
- * @seg_len - segment size: segment that will now be sent
- * return package size
- */
-fm_s32 mt6630_coeff_download(fm_u8 *buf, fm_s32 buf_size, fm_u8 seg_num, fm_u8 seg_id,
- const fm_u8 *src, fm_s32 seg_len)
-{
- fm_s32 pkt_size = 0;
- fm_u8 *dst = NULL;
-
- if (buf_size < TX_BUF_SIZE) {
- return (-1);
- }
-
- buf[0] = FM_TASK_COMMAND_PKT_TYPE;
- buf[1] = FM_COEFF_DOWNLOAD_OPCODE;
- pkt_size = 4;
-
- buf[pkt_size++] = seg_num;
- buf[pkt_size++] = seg_id;
-
- if (seg_len > (buf_size - pkt_size)) {
- return -1;
- }
-
- dst = &buf[pkt_size];
- pkt_size += seg_len;
-
- /* copy patch to tx buffer */
- while (seg_len--) {
- *dst = *src;
- /* pr_debug("%02x ", *dst); */
- src++;
- dst++;
- }
-
- buf[2] = (fm_u8) ((pkt_size - 4) & 0x00FF);
- buf[3] = (fm_u8) (((pkt_size - 4) >> 8) & 0x00FF);
- WCN_DBG(FM_DBG | CHIP, "%02x %02x %02x %02x %02x %02x %02x\n", buf[0], buf[1], buf[2],
- buf[3], buf[4], buf[5], buf[6]);
-
- return pkt_size;
-}
-
-/*
- * mt6630_pwrup_digital_init - Wholechip FM Power Up: step 4, FM Digital Init: fm_rgf_maincon
- * @buf - target buf
- * @buf_size - buffer size
- * return package size
- */
-fm_s32 mt6630_pwrup_digital_init(fm_u8 *buf, fm_s32 buf_size)
-{
- fm_s32 pkt_size = 0;
-
- if (buf_size < TX_BUF_SIZE) {
- return (-1);
- }
-
- buf[0] = FM_TASK_COMMAND_PKT_TYPE;
- buf[1] = FM_ENABLE_OPCODE;
- pkt_size = 4;
-
- //update FM ADPLL fast tracking mode gain
- pkt_size += fm_bop_modify(0xF, 0xF800, 0x0455, &buf[pkt_size], buf_size - pkt_size);
- /* F1.4 Set appropriate interrupt mask behavior as desired(RX) */
- /* pkt_size += fm_bop_write(0x6A, 0x0021, &buf[pkt_size], buf_size - pkt_size);//wr 6A 0021 */
- pkt_size += fm_bop_write(0x6B, 0x0021, &buf[pkt_size], buf_size - pkt_size); /* wr 6B 0021 */
- /* F1.9 Enable HW auto control */
- pkt_size += fm_bop_write(0x60, 0x000F, &buf[pkt_size], buf_size - pkt_size); /* wr 60 f */
- /* F1.10 Release ASIP reset */
- pkt_size += fm_bop_modify(0x61, 0xFFFD, 0x0002, &buf[pkt_size], buf_size - pkt_size); /* wr 61 D1=1 */
- /* F1.11 Enable ASIP power */
- pkt_size += fm_bop_modify(0x61, 0xFFFE, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* wr 61 D0=0 */
- pkt_size += fm_bop_udelay(100000, &buf[pkt_size], buf_size - pkt_size); /* delay 100ms */
- /* F1.13 Check HW intitial complete */
- pkt_size += fm_bop_rd_until(0x64, 0x001F, 0x0002, &buf[pkt_size], buf_size - pkt_size); /* Poll 64[0~4] = 2 */
-
- buf[2] = (fm_u8) ((pkt_size - 4) & 0x00FF);
- buf[3] = (fm_u8) (((pkt_size - 4) >> 8) & 0x00FF);
-
- return pkt_size;
-}
-
-/*
- * mt6630_pwrdown - Wholechip FM Power down: Digital Modem Power Down
- * @buf - target buf
- * @buf_size - buffer size
- * return package size
- */
-fm_s32 mt6630_pwrdown(fm_u8 *buf, fm_s32 buf_size)
-{
- fm_s32 pkt_size = 0;
-
- if (buf_size < TX_BUF_SIZE) {
- return (-1);
- }
-
- buf[0] = FM_TASK_COMMAND_PKT_TYPE;
- buf[1] = FM_ENABLE_OPCODE;
- pkt_size = 4;
-
- /* Disable HW clock control */
- pkt_size += fm_bop_write(0x60, 0x0107, &buf[pkt_size], buf_size - pkt_size); /* wr 60 107 */
- /* Reset ASIP */
- pkt_size += fm_bop_write(0x61, 0x0001, &buf[pkt_size], buf_size - pkt_size); /* wr 61 0001 */
- /* digital core + digital rgf reset */
- pkt_size += fm_bop_modify(0x6E, 0xFFF8, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* wr 6E[0~2] 0 */
- pkt_size += fm_bop_modify(0x6E, 0xFFF8, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* wr 6E[0~2] 0 */
- pkt_size += fm_bop_modify(0x6E, 0xFFF8, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* wr 6E[0~2] 0 */
- pkt_size += fm_bop_modify(0x6E, 0xFFF8, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* wr 6E[0~2] 0 */
- /* Disable all clock */
- pkt_size += fm_bop_write(0x60, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* wr 60 0000 */
- /* Reset rgfrf */
- pkt_size += fm_bop_write(0x60, 0x4000, &buf[pkt_size], buf_size - pkt_size); /* wr 60 4000 */
- pkt_size += fm_bop_write(0x60, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* wr 60 0000 */
-
- buf[2] = (fm_u8) ((pkt_size - 4) & 0x00FF);
- buf[3] = (fm_u8) (((pkt_size - 4) >> 8) & 0x00FF);
-
- return pkt_size;
-}
-
-
-/*
- * mt6630_rampdown - f/w will wait for STC_DONE interrupt
- * @buf - target buf
- * @buf_size - buffer size
- * return package size
- */
-fm_s32 mt6630_rampdown(fm_u8 *buf, fm_s32 buf_size)
-{
- fm_s32 pkt_size = 0;
-
- if (buf_size < TX_BUF_SIZE) {
- return (-1);
- }
-
- buf[0] = FM_TASK_COMMAND_PKT_TYPE;
- buf[1] = FM_RAMPDOWN_OPCODE;
- pkt_size = 4;
-
- /* Clear DSP state */
- pkt_size += fm_bop_modify(FM_MAIN_CTRL, 0xFFF0, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* wr 63[3:0] = 0 */
- /* Set DSP ramp down state */
- pkt_size += fm_bop_modify(FM_MAIN_CTRL, 0xFFFF, RAMP_DOWN, &buf[pkt_size], buf_size - pkt_size); /* wr 63[8] = 1 */
- /* @Wait for STC_DONE interrupt@ */
- pkt_size += fm_bop_rd_until(FM_MAIN_INTR, FM_INTR_STC_DONE, FM_INTR_STC_DONE, &buf[pkt_size], buf_size - pkt_size); /* Poll 69[0] = b'1 */
- /* Clear DSP ramp down state */
- pkt_size += fm_bop_modify(FM_MAIN_CTRL, (~RAMP_DOWN), 0x0000, &buf[pkt_size], buf_size - pkt_size); /* wr 63[8] = 0 */
- /* Write 1 clear the STC_DONE interrupt status flag */
- pkt_size += fm_bop_modify(FM_MAIN_INTR, 0xFFFF, FM_INTR_STC_DONE, &buf[pkt_size], buf_size - pkt_size); /* wr 69[0] = 1 */
-
- buf[2] = (fm_u8) ((pkt_size - 4) & 0x00FF);
- buf[3] = (fm_u8) (((pkt_size - 4) >> 8) & 0x00FF);
-
- return pkt_size;
-}
-
-
-/*
- * mt6630_tune - execute tune action,
- * @buf - target buf
- * @buf_size - buffer size
- * @freq - 760 ~ 1080, 100KHz unit
- * return package size
- */
-fm_s32 mt6630_tune(fm_u8 *buf, fm_s32 buf_size, fm_u16 freq, fm_u16 chan_para)
-{
- /* #define FM_TUNE_USE_POLL */
- fm_s32 pkt_size = 0;
-
- if (buf_size < TX_BUF_SIZE) {
- return (-1);
- }
-
- if (0 == fm_get_channel_space(freq)) {
- freq *= 10;
- }
-
- freq = (freq - 6400) * 2 / 10;
-
- buf[0] = FM_TASK_COMMAND_PKT_TYPE;
- buf[1] = FM_TUNE_OPCODE;
- pkt_size = 4;
-
- /* Set desired channel & channel parameter */
-#ifdef FM_TUNE_USE_POLL
- pkt_size += fm_bop_write(0x6A, 0x0000, &buf[pkt_size], buf_size - pkt_size);
- pkt_size += fm_bop_write(0x6B, 0x0000, &buf[pkt_size], buf_size - pkt_size);
-#endif
- pkt_size += fm_bop_modify(FM_CHANNEL_SET, 0xFC00, freq, &buf[pkt_size], buf_size - pkt_size); /* set 0x65[9:0] = 0x029e, => ((97.5 - 64) * 20) */
- /* channel para setting, D15~D12, D15: ATJ, D13: HL, D12: FA */
- pkt_size +=
- fm_bop_modify(FM_CHANNEL_SET, 0x0FFF, (chan_para << 12), &buf[pkt_size],
- buf_size - pkt_size);
- /* Enable hardware controlled tuning sequence */
- pkt_size += fm_bop_modify(FM_MAIN_CTRL, 0xFFF8, TUNE, &buf[pkt_size], buf_size - pkt_size); /* set 0x63[0] = 1 */
- /* Wait for STC_DONE interrupt */
-#ifdef FM_TUNE_USE_POLL
- pkt_size += fm_bop_rd_until(FM_MAIN_INTR, FM_INTR_STC_DONE, FM_INTR_STC_DONE, &buf[pkt_size], buf_size - pkt_size); /* Poll 69[0] = b'1 */
- /* Write 1 clear the STC_DONE interrupt status flag */
- pkt_size += fm_bop_modify(FM_MAIN_INTR, 0xFFFF, FM_INTR_STC_DONE, &buf[pkt_size], buf_size - pkt_size); /* wr 69[0] = 1 */
-#endif
- buf[2] = (fm_u8) ((pkt_size - 4) & 0x00FF);
- buf[3] = (fm_u8) (((pkt_size - 4) >> 8) & 0x00FF);
-
- return pkt_size;
-}
-
-
-/*
- * mt6630_full_cqi_req - execute request cqi info action,
- * @buf - target buf
- * @buf_size - buffer size
- * @freq - 7600 ~ 10800, freq array
- * @cnt - channel count
- * @type - request type, 1: a single channel; 2: multi channel; 3:multi channel with 100Khz step; 4: multi channel with 50Khz step
- *
- * return package size
- */
-fm_s32 mt6630_full_cqi_req(fm_u8 *buf, fm_s32 buf_size, fm_u16 *freq, fm_s32 cnt, fm_s32 type)
-{
- fm_s32 pkt_size = 0;
-
- if (buf_size < TX_BUF_SIZE) {
- return (-1);
- }
-
- buf[0] = FM_TASK_COMMAND_PKT_TYPE;
- buf[1] = FM_SOFT_MUTE_TUNE_OPCODE;
- pkt_size = 4;
-
- switch (type) {
- case 1:
- buf[pkt_size] = 0x0001;
- pkt_size++;
- buf[pkt_size] = (fm_u8) ((*freq) & 0x00FF);
- pkt_size++;
- buf[pkt_size] = (fm_u8) ((*freq >> 8) & 0x00FF);
- pkt_size++;
- break;
- case 2:
- buf[pkt_size] = 0x0002;
- pkt_size++;
- break;
- case 3:
- buf[pkt_size] = 0x0003;
- pkt_size++;
- break;
- case 4:
- buf[pkt_size] = 0x0004;
- pkt_size++;
- break;
- default:
- buf[pkt_size] = (fm_u16) type;
- pkt_size++;
- break;
- }
-
- buf[2] = (fm_u8) ((pkt_size - 4) & 0x00FF);
- buf[3] = (fm_u8) (((pkt_size - 4) >> 8) & 0x00FF);
-
- return pkt_size;
-}
-
-
-/*
- * mt6630_seek - execute seek action,
- * @buf - target buf
- * @buf_size - buffer size
- * @seekdir - 0=seek up, 1=seek down
- * @space - step, 50KHz:001, 100KHz:010, 200KHz:100
- * @max_freq - upper bound
- * @min_freq - lower bound
- * return package size
- */
-fm_s32 mt6630_seek(fm_u8 *buf, fm_s32 buf_size, fm_u16 seekdir, fm_u16 space, fm_u16 max_freq,
- fm_u16 min_freq)
-{
- fm_s32 pkt_size = 0;
-
- if (buf_size < TX_BUF_SIZE) {
- return (-1);
- }
-
- if (0 == fm_get_channel_space(max_freq)) {
- max_freq *= 10;
- }
-
- if (0 == fm_get_channel_space(min_freq)) {
- min_freq *= 10;
- }
-
- buf[0] = FM_TASK_COMMAND_PKT_TYPE;
- buf[1] = FM_SEEK_OPCODE;
- pkt_size = 4;
-
- /* Program seek direction */
- if (seekdir == 0) {
- pkt_size += fm_bop_modify(FM_MAIN_CFG1, 0xFBFF, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* 0x66[10] = 0, seek up */
- } else {
- pkt_size += fm_bop_modify(FM_MAIN_CFG1, 0xFBFF, 0x0400, &buf[pkt_size], buf_size - pkt_size); /* 0x66[10] = 1, seek down */
- }
-
- /* Program scan channel spacing */
- if (space == 1) {
- pkt_size += fm_bop_modify(FM_MAIN_CFG1, 0x8FFF, 0x1000, &buf[pkt_size], buf_size - pkt_size); /* clear 0x66[14:12] then 0x66[14:12]=001 */
- } else if (space == 2) {
- pkt_size += fm_bop_modify(FM_MAIN_CFG1, 0x8FFF, 0x2000, &buf[pkt_size], buf_size - pkt_size); /* clear 0x66[14:12] then 0x66[14:12]=010 */
- } else if (space == 4) {
- pkt_size += fm_bop_modify(FM_MAIN_CFG1, 0x8FFF, 0x4000, &buf[pkt_size], buf_size - pkt_size); /* clear 0x66[14:12] then 0x66[14:12]=100 */
- }
- /* enable wrap , if it is not auto scan function, 0x66[11] 0=no wrarp, 1=wrap */
- pkt_size += fm_bop_modify(FM_MAIN_CFG1, 0xF7FF, 0x0800, &buf[pkt_size], buf_size - pkt_size); /* 0x66[11] = 1, wrap */
- /* 0x66[9:0] freq upper bound */
-
- max_freq = (max_freq - 6400) * 2 / 10;
-
- pkt_size +=
- fm_bop_modify(FM_MAIN_CFG1, 0xFC00, max_freq, &buf[pkt_size], buf_size - pkt_size);
- /* 0x67[9:0] freq lower bound */
-
- min_freq = (min_freq - 6400) * 2 / 10;
-
- pkt_size +=
- fm_bop_modify(FM_MAIN_CFG2, 0xFC00, min_freq, &buf[pkt_size], buf_size - pkt_size);
- /* Enable hardware controlled seeking sequence */
- pkt_size += fm_bop_modify(FM_MAIN_CTRL, 0xFFF8, SEEK, &buf[pkt_size], buf_size - pkt_size); /* 0x63[1] = 1 */
- /* Wait for STC_DONE interrupt */
- /* pkt_size += fm_bop_rd_until(FM_MAIN_INTR, FM_INTR_STC_DONE, FM_INTR_STC_DONE, &buf[pkt_size], buf_size - pkt_size);//Poll 69[0] = b'1 */
- /* Write 1 clear the STC_DONE interrupt status flag */
- /* pkt_size += fm_bop_modify(FM_MAIN_INTR, 0xFFFF, FM_INTR_STC_DONE, &buf[pkt_size], buf_size - pkt_size);//wr 69[0] = 1 */
-
- buf[2] = (fm_u8) ((pkt_size - 4) & 0x00FF);
- buf[3] = (fm_u8) (((pkt_size - 4) >> 8) & 0x00FF);
-
- return pkt_size;
-}
-
-
-/*
- * mt6630_scan - execute scan action,
- * @buf - target buf
- * @buf_size - buffer size
- * @scandir - 0=seek up, 1=seek down
- * @space - step, 50KHz:001, 100KHz:010, 200KHz:100
- * @max_freq - upper bound
- * @min_freq - lower bound
- * return package size
- */
-fm_s32 mt6630_scan(fm_u8 *buf, fm_s32 buf_size, fm_u16 scandir, fm_u16 space, fm_u16 max_freq,
- fm_u16 min_freq)
-{
- fm_s32 pkt_size = 0;
-
- if (buf_size < TX_BUF_SIZE) {
- return (-1);
- }
-
- if (0 == fm_get_channel_space(max_freq)) {
- max_freq *= 10;
- }
- if (0 == fm_get_channel_space(min_freq)) {
- min_freq *= 10;
- }
-
- buf[0] = FM_TASK_COMMAND_PKT_TYPE;
- buf[1] = FM_SCAN_OPCODE;
- pkt_size = 4;
-
- /* Program seek direction */
- if (scandir == 0) {
- pkt_size += fm_bop_modify(FM_MAIN_CFG1, 0xFBFF, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* 0x66[10] = 0, seek up */
- } else {
- pkt_size += fm_bop_modify(FM_MAIN_CFG1, 0xFFFF, 0x0400, &buf[pkt_size], buf_size - pkt_size); /* 0x66[10] = 1, seek down */
- }
-
- /* Program scan channel spacing */
- if (space == 1) {
- pkt_size += fm_bop_modify(FM_MAIN_CFG1, 0x8FFF, 0x1000, &buf[pkt_size], buf_size - pkt_size); /* clear 0x66[14:12] then 0x66[14:12]=001 */
- } else if (space == 2) {
- pkt_size += fm_bop_modify(FM_MAIN_CFG1, 0x8FFF, 0x2000, &buf[pkt_size], buf_size - pkt_size); /* clear 0x66[14:12] then 0x66[14:12]=010 */
- } else if (space == 4) {
- pkt_size += fm_bop_modify(FM_MAIN_CFG1, 0x8FFF, 0x4000, &buf[pkt_size], buf_size - pkt_size); /* clear 0x66[14:12] then 0x66[14:12]=100 */
- }
- /* disable wrap , if it is auto scan function, 0x66[11] 0=no wrarp, 1=wrap */
- pkt_size += fm_bop_modify(FM_MAIN_CFG1, 0xF7FF, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* 0x66[11] = 0, no wrap */
- /* 0x66[9:0] freq upper bound */
-
- max_freq = (max_freq - 6400) * 2 / 10;
-
- pkt_size +=
- fm_bop_modify(FM_MAIN_CFG1, 0xFC00, max_freq, &buf[pkt_size], buf_size - pkt_size);
- /* 0x67[9:0] freq lower bound */
-
- min_freq = (min_freq - 6400) * 2 / 10;
-
- pkt_size +=
- fm_bop_modify(FM_MAIN_CFG2, 0xFC00, min_freq, &buf[pkt_size], buf_size - pkt_size);
- /* Enable hardware controlled scanning sequence */
- pkt_size += fm_bop_modify(FM_MAIN_CTRL, 0xFFF8, SCAN, &buf[pkt_size], buf_size - pkt_size); /* 0x63[1] = 1 */
- /* Wait for STC_DONE interrupt */
- /* pkt_size += fm_bop_rd_until(FM_MAIN_INTR, FM_INTR_STC_DONE, FM_INTR_STC_DONE, &buf[pkt_size], buf_size - pkt_size);//Poll 69[0] = b'1 */
- /* Write 1 clear the STC_DONE interrupt status flag */
- /* pkt_size += fm_bop_modify(FM_MAIN_INTR, 0xFFFF, FM_INTR_STC_DONE, &buf[pkt_size], buf_size - pkt_size);//wr 69[0] = 1 */
-
- buf[2] = (fm_u8) ((pkt_size - 4) & 0x00FF);
- buf[3] = (fm_u8) (((pkt_size - 4) >> 8) & 0x00FF);
-
- return pkt_size;
-}
-
-
-fm_s32 mt6630_cqi_get(fm_u8 *buf, fm_s32 buf_size)
-{
- fm_s32 pkt_size = 0;
-
- if (buf_size < TX_BUF_SIZE) {
- return (-1);
- }
-
- buf[0] = FM_TASK_COMMAND_PKT_TYPE;
- buf[1] = FM_SCAN_OPCODE;
- pkt_size = 4;
-
- pkt_size += fm_bop_modify(FM_MAIN_CTRL, 0xFFF0, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* wr 63 bit0~2 0 */
- pkt_size += fm_bop_modify(FM_MAIN_CTRL, ~CQI_READ, CQI_READ, &buf[pkt_size], buf_size - pkt_size); /* wr 63 bit3 1 */
-
- buf[2] = (fm_u8) ((pkt_size - 4) & 0x00FF);
- buf[3] = (fm_u8) (((pkt_size - 4) >> 8) & 0x00FF);
-
- return pkt_size;
-}
-
-
-fm_s32 mt6630_get_reg(fm_u8 *buf, fm_s32 buf_size, fm_u8 addr)
-{
- if (buf_size < TX_BUF_SIZE) {
- return (-1);
- }
-
- buf[0] = FM_TASK_COMMAND_PKT_TYPE;
- buf[1] = FSPI_READ_OPCODE;
- buf[2] = 0x01;
- buf[3] = 0x00;
- buf[4] = addr;
-
- WCN_DBG(FM_DBG | CHIP, "%02x %02x %02x %02x %02x\n", buf[0], buf[1], buf[2], buf[3],
- buf[4]);
- return 5;
-}
-
-
-fm_s32 mt6630_set_reg(fm_u8 *buf, fm_s32 buf_size, fm_u8 addr, fm_u16 value)
-{
- if (buf_size < TX_BUF_SIZE) {
- return (-1);
- }
-
- buf[0] = FM_TASK_COMMAND_PKT_TYPE;
- buf[1] = FSPI_WRITE_OPCODE;
- buf[2] = 0x03;
- buf[3] = 0x00;
- buf[4] = addr;
- buf[5] = (fm_u8) ((value) & 0x00FF);
- buf[6] = (fm_u8) ((value >> 8) & 0x00FF);
-
- WCN_DBG(FM_DBG | CHIP, "%02x %02x %02x %02x %02x %02x %02x\n", buf[0], buf[1], buf[2],
- buf[3], buf[4], buf[5], buf[6]);
- return 7;
-}
-
-
-fm_s32 mt6630_set_bits_reg(fm_u8 *buf, fm_s32 buf_size, fm_u8 addr, fm_u16 bits, fm_u16 mask)
-{
- fm_s32 pkt_size = 0;
- if (buf_size < TX_BUF_SIZE) {
- return (-1);
- }
-
- buf[0] = FM_TASK_COMMAND_PKT_TYPE;
- buf[1] = 0x11; /* 0x11 this opcode won't be parsed as an opcode, so set here as spcial case. */
- pkt_size = 4;
- pkt_size += fm_bop_modify(addr, mask, bits, &buf[pkt_size], buf_size - pkt_size);
-
- buf[2] = (fm_u8) ((pkt_size - 4) & 0x00FF);
- buf[3] = (fm_u8) (((pkt_size - 4) >> 8) & 0x00FF);
-
- return pkt_size;
-}
-
-/*top register read*/
-fm_s32 mt6630_top_get_reg(fm_u8 *buf, fm_s32 buf_size, fm_u16 addr)
-{
- if (buf_size < TX_BUF_SIZE) {
- return (-1);
- }
-
- buf[0] = FM_TASK_COMMAND_PKT_TYPE;
- buf[1] = CSPI_READ_OPCODE;
- buf[2] = 0x03;
- buf[3] = 0x00;
- buf[4] = 0x04; /* top 04,fm 02 */
- buf[5] = (fm_u8) ((addr) & 0x00FF);
- buf[6] = (fm_u8) ((addr >> 8) & 0x00FF);
-
- WCN_DBG(FM_DBG | CHIP, "%02x %02x %02x %02x %02x %02x %02x\n", buf[0], buf[1], buf[2],
- buf[3], buf[4], buf[5], buf[6]);
- return 7;
-}
-
-
-fm_s32 mt6630_top_set_reg(fm_u8 *buf, fm_s32 buf_size, fm_u16 addr, fm_u32 value)
-{
- if (buf_size < TX_BUF_SIZE) {
- return (-1);
- }
-
- buf[0] = FM_TASK_COMMAND_PKT_TYPE;
- buf[1] = CSPI_WRITE_OPCODE;
- buf[2] = 0x07;
- buf[3] = 0x00;
- buf[4] = 0x04; /* top 04,fm 02 */
- buf[5] = (fm_u8) ((addr) & 0x00FF);
- buf[6] = (fm_u8) ((addr >> 8) & 0x00FF);
- buf[7] = (fm_u8) ((value) & 0x00FF);
- buf[8] = (fm_u8) ((value >> 8) & 0x00FF);
- buf[9] = (fm_u8) ((value >> 16) & 0x00FF);
- buf[10] = (fm_u8) ((value >> 24) & 0x00FF);
-
- WCN_DBG(FM_DBG | CHIP, "%02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x\n", buf[0],
- buf[1], buf[2], buf[3], buf[4], buf[5], buf[6], buf[7], buf[8], buf[9], buf[10]);
- return 11;
-}
-
-/*host register read*/
-fm_s32 mt6630_host_get_reg(fm_u8 *buf, fm_s32 buf_size, fm_u32 addr)
-{
- if (buf_size < TX_BUF_SIZE) {
- return (-1);
- }
-
- buf[0] = FM_TASK_COMMAND_PKT_TYPE;
- buf[1] = FM_HOST_READ_OPCODE;
- buf[2] = 0x04;
- buf[3] = 0x00;
- buf[4] = (fm_u8) ((addr) & 0x00FF);
- buf[5] = (fm_u8) ((addr >> 8) & 0x00FF);
- buf[6] = (fm_u8) ((addr >> 16) & 0x00FF);
- buf[7] = (fm_u8) ((addr >> 24) & 0x00FF);
-
- WCN_DBG(FM_DBG | CHIP, "%02x %02x %02x %02x %02x %02x %02x %02x\n", buf[0], buf[1], buf[2],
- buf[3], buf[4], buf[5], buf[6], buf[7]);
- return 8;
-}
-
-
-fm_s32 mt6630_host_set_reg(fm_u8 *buf, fm_s32 buf_size, fm_u32 addr, fm_u32 value)
-{
- if (buf_size < TX_BUF_SIZE) {
- return (-1);
- }
-
- buf[0] = FM_TASK_COMMAND_PKT_TYPE;
- buf[1] = FM_HOST_WRITE_OPCODE;
- buf[2] = 0x08;
- buf[3] = 0x00;
- buf[4] = (fm_u8) ((addr) & 0x00FF);
- buf[5] = (fm_u8) ((addr >> 8) & 0x00FF);
- buf[6] = (fm_u8) ((addr >> 16) & 0x00FF);
- buf[7] = (fm_u8) ((addr >> 24) & 0x00FF);
- buf[8] = (fm_u8) ((value) & 0x00FF);
- buf[9] = (fm_u8) ((value >> 8) & 0x00FF);
- buf[10] = (fm_u8) ((value >> 16) & 0x00FF);
- buf[11] = (fm_u8) ((value >> 24) & 0x00FF);
-
- WCN_DBG(FM_DBG | CHIP, "%02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x\n",
- buf[0], buf[1], buf[2], buf[3], buf[4], buf[5], buf[6], buf[7], buf[8], buf[9],
- buf[10], buf[11]);
- return 12;
-}
-
-/********************************Tx function***********************************************/
-/*
- * mt6630_pwrup_clock_on_tx - FM tx Digital Clock enable
- * @buf - target buf
- * @buf_size - buffer size
- * return package size
- */
-fm_s32 mt6630_pwrup_clock_on_tx(fm_u8 *buf, fm_s32 buf_size)
-{
- fm_s32 pkt_size = 0;
-
- if (buf_size < TX_BUF_SIZE) {
- return (-1);
- }
-
- buf[0] = FM_TASK_COMMAND_PKT_TYPE;
- buf[1] = FM_ENABLE_OPCODE;
- pkt_size = 4;
-
- /* B1.0 Enable digital OSC */
- pkt_size += fm_bop_write(0x60, 0x0003, &buf[pkt_size], buf_size - pkt_size); /* wr 60 3 */
- pkt_size += fm_bop_udelay(100, &buf[pkt_size], buf_size - pkt_size); /* delay 100us */
- /* B1.2 Release HW clock gating */
- pkt_size += fm_bop_write(0x60, 0x0007, &buf[pkt_size], buf_size - pkt_size); /* wr 60 7 */
- if (mt6630_fm_config.aud_cfg.aud_path == FM_AUD_ANALOG) {
- pkt_size +=
- fm_bop_modify(0x61, 0xFF7F, 0x0000, &buf[pkt_size], buf_size - pkt_size);
- } else {
- pkt_size +=
- fm_bop_modify(0x61, 0xFF7F, 0x0080, &buf[pkt_size], buf_size - pkt_size);
- }
- /* B1.4 set TX mode: 0909 sequence */
- pkt_size += fm_bop_write(0xC7, 0x8286, &buf[pkt_size], buf_size - pkt_size); /* wr C7 8286 */
-
- buf[2] = (fm_u8) ((pkt_size - 4) & 0x00FF);
- buf[3] = (fm_u8) (((pkt_size - 4) >> 8) & 0x00FF);
-
- return pkt_size;
-}
-
-/*
- * mt6630_pwrup_tx_deviation - default deviation (RDS off)
- * @buf - target buf
- * @buf_size - buffer size
- * return package size
- */
-fm_s32 mt6630_pwrup_tx_deviation(fm_u8 *buf, fm_s32 buf_size)
-{
- fm_s32 pkt_size = 0;
-
- if (buf_size < TX_BUF_SIZE) {
- return (-1);
- }
-
- buf[0] = FM_TASK_COMMAND_PKT_TYPE;
- buf[1] = FM_ENABLE_OPCODE;
- pkt_size = 4;
-
- /* A1 switch to host control */
- pkt_size += fm_bop_write(0x60, 0x0007, &buf[pkt_size], buf_size - pkt_size); /* wr 60 0007 */
- /* set rgf_tx_beta_sum */
- pkt_size += fm_bop_write(0xCD, 0x72D2, &buf[pkt_size], buf_size - pkt_size); /* wr CD 72D2 */
- /* set rgf_tx_beta_diff */
- pkt_size += fm_bop_write(0xCF, 0x787B, &buf[pkt_size], buf_size - pkt_size); /* wr CF 787B */
- /* set rgf_tx_beta_rds */
- pkt_size += fm_bop_write(0xCE, 0x0785, &buf[pkt_size], buf_size - pkt_size); /* wr CE 785 */
- /* set rgf_tx_beta_pilot */
- pkt_size += fm_bop_write(0xCC, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* wr CC 0 */
- /* set rgf_phase_gen_rsh */
- pkt_size += fm_bop_modify(0xAD, 0xFFE8, 0x0001, &buf[pkt_size], buf_size - pkt_size); /* wr AD D4 D2:D0=1 */
- /* set rgf_phase_gen_wb */
- pkt_size += fm_bop_modify(0xA8, 0xF000, 0x0F16, &buf[pkt_size], buf_size - pkt_size); /* wr A8 D11:D0=F16 */
- /* set agc */
- pkt_size += fm_bop_modify(0xAE, 0xFC00, 0x020B, &buf[pkt_size], buf_size - pkt_size); /* wr AE D9:D0=20B */
- /* set rgf_beta_fm */
- pkt_size += fm_bop_write(0xEE, 0x623D, &buf[pkt_size], buf_size - pkt_size); /* wr EE 623D */
- /* switch to DSP control */
- pkt_size += fm_bop_write(0x60, 0x000F, &buf[pkt_size], buf_size - pkt_size); /* wr 60 000F */
-
- buf[2] = (fm_u8) ((pkt_size - 4) & 0x00FF);
- buf[3] = (fm_u8) (((pkt_size - 4) >> 8) & 0x00FF);
-
- return pkt_size;
-}
-
-/*
- * mt6630_tx_rdsoff_deviation - deviation (RDS on)
- * @buf - target buf
- * @buf_size - buffer size
- * return package size
- */
-fm_s32 mt6630_tx_rdson_deviation(fm_u8 *buf, fm_s32 buf_size)
-{
- fm_s32 pkt_size = 0;
-
- if (buf_size < TX_BUF_SIZE) {
- return (-1);
- }
-
- buf[0] = FM_TASK_COMMAND_PKT_TYPE;
- buf[1] = RDS_TX_OPCODE;
- pkt_size = 4;
-
- /* A1 switch to host control */
- pkt_size += fm_bop_write(0x60, 0x0007, &buf[pkt_size], buf_size - pkt_size); /* wr 60 0007 */
- /* set rgf_tx_beta_sum */
- pkt_size += fm_bop_write(0xCD, 0x70E3, &buf[pkt_size], buf_size - pkt_size); /* wr CD 70E3 */
- /* set rgf_tx_beta_diff */
- pkt_size += fm_bop_write(0xCF, 0x7675, &buf[pkt_size], buf_size - pkt_size); /* wr CF 7675 */
- /* set rgf_tx_beta_rds:0909 sequence */
- pkt_size += fm_bop_write(0xCC, 0x0227, &buf[pkt_size], buf_size - pkt_size); /* wr CC 227 */
- /* set rgf_tx_beta_pilot :0909 sequence */
- pkt_size += fm_bop_write(0xCE, 0x0764, &buf[pkt_size], buf_size - pkt_size); /* wr CE 764 */
- /* set rgf_phase_gen_rsh */
- pkt_size += fm_bop_modify(0xAD, 0xFFEF, 0x0000, &buf[pkt_size], buf_size - pkt_size); /* wr AD D4 =0 */
- pkt_size += fm_bop_modify(0xAD, 0xFFF8, 0x0001, &buf[pkt_size], buf_size - pkt_size); /* wr AD D2:D0=1 */
- /* set rgf_phase_gen_wb */
- pkt_size += fm_bop_modify(0xA8, 0xF000, 0x0222, &buf[pkt_size], buf_size - pkt_size); /* wr A8 D11:D0=222 */
- /* set agc */
- pkt_size += fm_bop_modify(0xAE, 0xFC00, 0x0203, &buf[pkt_size], buf_size - pkt_size); /* wr AE D9:D0=203 */
- /* set rgf_beta_fm */
- pkt_size += fm_bop_write(0xEE, 0x63EB, &buf[pkt_size], buf_size - pkt_size); /* wr EE 63EB */
- /* switch to DSP control */
- pkt_size += fm_bop_write(0x60, 0x000F, &buf[pkt_size], buf_size - pkt_size); /* wr 60 000F */
-
- buf[2] = (fm_u8) ((pkt_size - 4) & 0x00FF);
- buf[3] = (fm_u8) (((pkt_size - 4) >> 8) & 0x00FF);
-
- return pkt_size;
-}
-
-/*
- * mt6630_tune_tx - execute tx tune action,
- * @buf - target buf
- * @buf_size - buffer size
- * @freq - 760 ~ 1080, 100KHz unit
- * return package size
- */
-fm_s32 mt6630_tune_tx(fm_u8 *buf, fm_s32 buf_size, fm_u16 freq, fm_u16 chan_para)
-{
- /* #define FM_TUNE_USE_POLL */
- fm_s32 pkt_size = 0;
-
- if (buf_size < TX_BUF_SIZE) {
- return (-1);
- }
-
- if (0 == fm_get_channel_space(freq)) {
- freq *= 10;
- }
-
- freq = (freq - 6400) * 2 / 10;
-
- buf[0] = FM_TASK_COMMAND_PKT_TYPE;
- buf[1] = FM_TUNE_OPCODE;
- pkt_size = 4;
-
- /* Set desired channel & channel parameter */
-#ifdef FM_TUNE_USE_POLL
- pkt_size += fm_bop_write(0x6B, 0x0000, &buf[pkt_size], buf_size - pkt_size);
-#endif
- /* sequence 09/16:0x65 D12=1 for iq switch */
- pkt_size += fm_bop_modify(FM_CHANNEL_SET, 0xEC00, freq | 0x1000, &buf[pkt_size], buf_size - pkt_size); /* set 0x65[9:0] = 0x029e, => ((97.5 - 64) * 20) */
- /* set iq switch, D12 */
- /* pkt_size += fm_bop_modify(FM_CHANNEL_SET, 0x0FFF, (chan_para << 12), &buf[pkt_size], buf_size - pkt_size); */
- /* Enable hardware controlled tuning sequence */
- pkt_size += fm_bop_modify(FM_MAIN_CTRL, 0xFFF8, TUNE, &buf[pkt_size], buf_size - pkt_size); /* set 0x63[0] = 1 */
- /* Wait for STC_DONE interrupt */
-#ifdef FM_TUNE_USE_POLL
- pkt_size += fm_bop_rd_until(FM_MAIN_INTR, FM_INTR_STC_DONE, FM_INTR_STC_DONE, &buf[pkt_size], buf_size - pkt_size); /* Poll 69[0] = b'1 */
- /* Write 1 clear the STC_DONE interrupt status flag */
- pkt_size += fm_bop_modify(FM_MAIN_INTR, 0xFFFF, FM_INTR_STC_DONE, &buf[pkt_size], buf_size - pkt_size); /* wr 69[0] = 1 */
-#endif
- buf[2] = (fm_u8) ((pkt_size - 4) & 0x00FF);
- buf[3] = (fm_u8) (((pkt_size - 4) >> 8) & 0x00FF);
-
- return pkt_size;
-}
-
-/*
-pi: pi code
-ps: block B,C,D
-other_rds: unused
-other_rds_cnt: unused
-*/
-fm_s32 mt6630_rds_tx(fm_u8 *tx_buf, fm_s32 tx_buf_size, fm_u16 pi, fm_u16 *ps, fm_u16 *other_rds,
- fm_u8 other_rds_cnt)
-{
- fm_s32 pkt_size = 0;
- fm_s32 i;
-
- if (tx_buf_size < TX_BUF_SIZE) {
- return (-1);
- }
-
- tx_buf[0] = FM_TASK_COMMAND_PKT_TYPE;
- tx_buf[1] = RDS_TX_OPCODE;
- pkt_size = 4;
-
- /* set repeat mode */
- pkt_size += fm_bop_modify(0x88, 0xFFFE, 0x0001, &tx_buf[pkt_size], TX_BUF_SIZE - pkt_size); /* wr 88[0] = b'1, repeat mode */
- pkt_size += fm_bop_modify(0x88, 0xFFFB, 0x0004, &tx_buf[pkt_size], TX_BUF_SIZE - pkt_size); /* wr 88[2] = b'1, PI_reg mode */
- pkt_size += fm_bop_write(0x8A, pi, &tx_buf[pkt_size], tx_buf_size - pkt_size); /* write PI to PI_reg */
-
- pkt_size += fm_bop_modify(0x88, 0xFFFD, 0x0002, &tx_buf[pkt_size], TX_BUF_SIZE - pkt_size); /* wr 88[1] = b'1, addr from host */
- for (i = 0; i < 12; i++) {
- pkt_size += fm_bop_write(0x8B, (0x0063 + i), &tx_buf[pkt_size], tx_buf_size - pkt_size); /* 8B = mem_addr */
- pkt_size += fm_bop_write(0x8C, ps[i], &tx_buf[pkt_size], tx_buf_size - pkt_size); /* 8C = RDS Tx data */
- }
- pkt_size += fm_bop_modify(0x88, 0xFFFD, 0x0000, &tx_buf[pkt_size], TX_BUF_SIZE - pkt_size); /* wr 88[1] = b'0, clear mem_addr */
- pkt_size += fm_bop_modify(0x88, 0xFFEF, 0x0010, &tx_buf[pkt_size], TX_BUF_SIZE - pkt_size); /* wr 88[4] = b'1, switch to ps buf */
- /* work around: write at leat one group to normal buffer, otherwise ps buffer can be sent out. */
- pkt_size += fm_bop_write(0x8C, 0, &tx_buf[pkt_size], tx_buf_size - pkt_size);
- pkt_size += fm_bop_write(0x8C, 0, &tx_buf[pkt_size], tx_buf_size - pkt_size);
- pkt_size += fm_bop_write(0x8C, 0, &tx_buf[pkt_size], tx_buf_size - pkt_size);
- pkt_size += fm_bop_write(0x8C, 0, &tx_buf[pkt_size], tx_buf_size - pkt_size);
- pkt_size += fm_bop_modify(0x88, 0xFFDF, 0x0020, &tx_buf[pkt_size], TX_BUF_SIZE - pkt_size); /* wr 88[5] = b'1,clear in_ptr */
- pkt_size += fm_bop_modify(0x88, 0xFFDF, 0x0000, &tx_buf[pkt_size], TX_BUF_SIZE - pkt_size); /* wr 88[5] = b'0,clear in_ptr */
-
- tx_buf[2] = (fm_u8) ((pkt_size - 4) & 0x00FF);
- tx_buf[3] = (fm_u8) (((pkt_size - 4) >> 8) & 0x00FF);
-
- return pkt_size;
-}
diff --git a/drivers/misc/mediatek/fmradio/mt6630/pub/mt6630_fm_config.c b/drivers/misc/mediatek/fmradio/mt6630/pub/mt6630_fm_config.c
deleted file mode 100644
index ed000697a..000000000
--- a/drivers/misc/mediatek/fmradio/mt6630/pub/mt6630_fm_config.c
+++ /dev/null
@@ -1,204 +0,0 @@
-/* mt6630_fm_config.c
- *
- * (C) Copyright 2011
- * MediaTek <www.MediaTek.com>
- * hongcheng <hongcheng.xia@MediaTek.com>
- *
- * FM Radio Driver
- *
- * 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.
- *
- * 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.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- */
-#include <linux/string.h>
-#include <linux/slab.h>
-
-#include "fm_typedef.h"
-#include "fm_rds.h"
-#include "fm_dbg.h"
-#include "fm_err.h"
-#include "fm_stdlib.h"
-#include "fm_patch.h"
-#include "fm_config.h"
-/* #include "fm_cust_cfg.h" */
-#include "mt6630_fm_cust_cfg.h"
-fm_cust_cfg mt6630_fm_config;
-/* static fm_s32 fm_index = 0; */
-
-static fm_s32 MT6630fm_cust_config_print(fm_cust_cfg *cfg)
-{
- WCN_DBG(FM_NTC | MAIN, "MT6630 rssi_l:\t%d\n", cfg->rx_cfg.long_ana_rssi_th);
- WCN_DBG(FM_NTC | MAIN, "MT6630 rssi_s:\t%d\n", cfg->rx_cfg.short_ana_rssi_th);
- WCN_DBG(FM_NTC | MAIN, "MT6630 pamd_th:\t%d\n", cfg->rx_cfg.pamd_th);
- WCN_DBG(FM_NTC | MAIN, "MT6630 mr_th:\t%d\n", cfg->rx_cfg.mr_th);
- WCN_DBG(FM_NTC | MAIN, "MT6630 atdc_th:\t%d\n", cfg->rx_cfg.atdc_th);
- WCN_DBG(FM_NTC | MAIN, "MT6630 prx_th:\t%d\n", cfg->rx_cfg.prx_th);
- WCN_DBG(FM_NTC | MAIN, "MT6630 atdev_th:\t%d\n", cfg->rx_cfg.atdev_th);
- WCN_DBG(FM_NTC | MAIN, "MT6630 smg_th:\t%d\n", cfg->rx_cfg.smg_th);
- WCN_DBG(FM_NTC | MAIN, "de_emphasis:\t%d\n", cfg->rx_cfg.deemphasis);
- WCN_DBG(FM_NTC | MAIN, "osc_freq:\t%d\n", cfg->rx_cfg.osc_freq);
-
- WCN_DBG(FM_NTC | MAIN, "aud path[%d]I2S state[%d]mode[%d]rate[%d]\n", cfg->aud_cfg.aud_path,
- cfg->aud_cfg.i2s_info.status, cfg->aud_cfg.i2s_info.mode,
- cfg->aud_cfg.i2s_info.rate);
- return 0;
-}
-
-static fm_s32 MT6630cfg_item_handler(fm_s8 *grp, fm_s8 *key, fm_s8 *val, fm_cust_cfg *cfg)
-{
- fm_s32 ret = 0;
- struct fm_rx_cust_cfg *rx_cfg = &cfg->rx_cfg;
-
- if (0 <= (ret = cfg_item_match(key, val, "FM_RX_RSSI_TH_LONG_MT6630", &rx_cfg->long_ana_rssi_th))) { /* FMR_RSSI_TH_L = 0x0301 */
- return ret;
- } else if (0 <=
- (ret =
- cfg_item_match(key, val, "FM_RX_RSSI_TH_SHORT_MT6630",
- &rx_cfg->short_ana_rssi_th))) {
- return ret;
- } else if (0 <=
- (ret =
- cfg_item_match(key, val, "FM_RX_DESENSE_RSSI_MT6630",
- &rx_cfg->desene_rssi_th))) {
- return ret;
- } else if (0 <= (ret = cfg_item_match(key, val, "FM_RX_PAMD_TH_MT6630", &rx_cfg->pamd_th))) {
- return ret;
- } else if (0 <= (ret = cfg_item_match(key, val, "FM_RX_MR_TH_MT6630", &rx_cfg->mr_th))) {
- return ret;
- } else if (0 <= (ret = cfg_item_match(key, val, "FM_RX_ATDC_TH_MT6630", &rx_cfg->atdc_th))) {
- return ret;
- } else if (0 <= (ret = cfg_item_match(key, val, "FM_RX_PRX_TH_MT6630", &rx_cfg->prx_th))) {
- return ret;
- }
- /*else if (0 <= (ret = cfg_item_match(key, val, "FM_RX_ATDEV_TH_MT6630", &rx_cfg->atdev_th)))
- {
- return ret;
- } */
- else if (0 <= (ret = cfg_item_match(key, val, "FM_RX_SMG_TH_MT6630", &rx_cfg->smg_th))) {
- return ret;
- } else if (0 <=
- (ret =
- cfg_item_match(key, val, "FM_RX_DEEMPHASIS_MT6630", &rx_cfg->deemphasis))) {
- return ret;
- } else if (0 <=
- (ret = cfg_item_match(key, val, "FM_RX_OSC_FREQ_MT6630", &rx_cfg->osc_freq))) {
- return ret;
- } else {
- WCN_DBG(FM_WAR | MAIN, "MT6630 invalid key\n");
- return -1;
- }
-}
-
-static fm_s32 MT6630fm_cust_config_default(fm_cust_cfg *cfg)
-{
- FMR_ASSERT(cfg);
-
- cfg->rx_cfg.long_ana_rssi_th = FM_RX_RSSI_TH_LONG_MT6630;
- cfg->rx_cfg.short_ana_rssi_th = FM_RX_RSSI_TH_SHORT_MT6630;
- cfg->rx_cfg.desene_rssi_th = FM_RX_DESENSE_RSSI_MT6630;
- cfg->rx_cfg.pamd_th = FM_RX_PAMD_TH_MT6630;
- cfg->rx_cfg.mr_th = FM_RX_MR_TH_MT6630;
- cfg->rx_cfg.atdc_th = FM_RX_ATDC_TH_MT6630;
- cfg->rx_cfg.prx_th = FM_RX_PRX_TH_MT6630;
- cfg->rx_cfg.smg_th = FM_RX_SMG_TH_MT6630;
- cfg->rx_cfg.deemphasis = FM_RX_DEEMPHASIS_MT6630;
- cfg->rx_cfg.osc_freq = FM_RX_OSC_FREQ_MT6630;
-
- cfg->tx_cfg.pamd_th = FM_TX_PAMD_TH_MT6630;
- cfg->tx_cfg.mr_th = FM_TX_MR_TH_MT6630;
- cfg->tx_cfg.smg_th = FM_TX_SMG_TH_MT6630;
-
-#ifdef CONFIG_MTK_MERGE_INTERFACE_SUPPORT
- cfg->aud_cfg.aud_path = FM_AUD_MRGIF;
- cfg->aud_cfg.i2s_info.status = FM_I2S_OFF;
- cfg->aud_cfg.i2s_info.mode = FM_I2S_SLAVE;
- cfg->aud_cfg.i2s_info.rate = FM_I2S_44K;
- cfg->aud_cfg.i2s_pad = FM_I2S_PAD_IO;
-#elif defined FM_DIGITAL_INPUT
- cfg->aud_cfg.aud_path = FM_AUD_I2S;
- cfg->aud_cfg.i2s_info.status = FM_I2S_OFF;
- cfg->aud_cfg.i2s_info.mode = FM_I2S_SLAVE;
- cfg->aud_cfg.i2s_info.rate = FM_I2S_44K;
- cfg->aud_cfg.i2s_pad = FM_I2S_PAD_IO;
-#elif defined FM_ANALOG_INPUT
- cfg->aud_cfg.aud_path = FM_AUD_ANALOG;
- cfg->aud_cfg.i2s_info.status = FM_I2S_STATE_ERR;
- cfg->aud_cfg.i2s_info.mode = FM_I2S_MODE_ERR;
- cfg->aud_cfg.i2s_info.rate = FM_I2S_SR_ERR;
- cfg->aud_cfg.i2s_pad = FM_I2S_PAD_ERR;
-#else
- cfg->aud_cfg.aud_path = FM_AUD_ERR;
- cfg->aud_cfg.i2s_info.status = FM_I2S_STATE_ERR;
- cfg->aud_cfg.i2s_info.mode = FM_I2S_MODE_ERR;
- cfg->aud_cfg.i2s_info.rate = FM_I2S_SR_ERR;
- cfg->aud_cfg.i2s_pad = FM_I2S_PAD_ERR;
-#endif
-
- return 0;
-}
-
-static fm_s32 MT6630fm_cust_config_file(const fm_s8 *filename, fm_cust_cfg *cfg)
-{
- fm_s32 ret = 0;
- fm_s8 *buf = NULL;
- fm_s32 file_len = 0;
-
- if (!(buf = fm_zalloc(4096))) {
- WCN_DBG(FM_ALT | MAIN, "-ENOMEM\n");
- return -ENOMEM;
- }
-/* fm_index = 0; */
-
- file_len = fm_file_read(filename, buf, 4096, 0);
-
- if (file_len <= 0) {
- ret = -1;
- goto out;
- }
-
- ret = cfg_parser(buf, MT6630cfg_item_handler, cfg);
-
- out:
-
- if (buf) {
- fm_free(buf);
- }
-
- return ret;
-}
-
-#define MT6630_FM_CUST_CFG_PATH "etc/fmr/mt6630_fm_cust.cfg"
-fm_s32 MT6630fm_cust_config_setup(const fm_s8 *filepath)
-{
- fm_s32 ret = 0;
- fm_s8 *filep = NULL;
- fm_s8 file_path[51] = { 0 };
-
- MT6630fm_cust_config_default(&mt6630_fm_config);
- WCN_DBG(FM_NTC | MAIN, "MT6630 FM default config\n");
- MT6630fm_cust_config_print(&mt6630_fm_config);
-
- if (!filepath) {
- filep = MT6630_FM_CUST_CFG_PATH;
- } else {
- memcpy(file_path, filepath, (strlen(filepath) > 50) ? 50 : strlen(filepath));
- filep = file_path;
- trim_path(&filep);
- }
-
- ret = MT6630fm_cust_config_file(filep, &mt6630_fm_config);
- WCN_DBG(FM_NTC | MAIN, "MT6630 FM cust config\n");
- MT6630fm_cust_config_print(&mt6630_fm_config);
-
- return ret;
-}
diff --git a/drivers/misc/mediatek/fmradio/mt6630/pub/mt6630_fm_lib.c b/drivers/misc/mediatek/fmradio/mt6630/pub/mt6630_fm_lib.c
deleted file mode 100644
index 031e805c4..000000000
--- a/drivers/misc/mediatek/fmradio/mt6630/pub/mt6630_fm_lib.c
+++ /dev/null
@@ -1,2343 +0,0 @@
-#include <linux/delay.h>
-#include <linux/slab.h>
-#include <linux/vmalloc.h>
-
-#include "stp_exp.h"
-#include "wmt_exp.h"
-
-#include "fm_typedef.h"
-#include "fm_dbg.h"
-#include "fm_err.h"
-#include "fm_interface.h"
-#include "fm_stdlib.h"
-#include "fm_patch.h"
-#include "fm_utils.h"
-#include "fm_link.h"
-#include "fm_config.h"
-#include "fm_private.h"
-
-#include "mt6630_fm_reg.h"
-#include "mt6630_fm.h"
-#include "mt6630_fm_lib.h"
-#include "mt6630_fm_cmd.h"
-#include "mt6630_fm_cust_cfg.h"
-extern fm_cust_cfg mt6630_fm_config;
-
-static struct fm_patch_tbl mt6630_patch_tbl[5] = {
- {FM_ROM_V1, "/etc/firmware/mt6630/mt6630_fm_v1_patch.bin",
- "/etc/firmware/mt6630/mt6630_fm_v1_coeff.bin", NULL, NULL},
- {FM_ROM_V2, "/etc/firmware/mt6630/mt6630_fm_v2_patch.bin",
- "/etc/firmware/mt6630/mt6630_fm_v2_coeff.bin", NULL, NULL},
- {FM_ROM_V3, "/etc/firmware/mt6630/mt6630_fm_v3_patch.bin",
- "/etc/firmware/mt6630/mt6630_fm_v3_coeff.bin", NULL, NULL},
- {FM_ROM_V4, "/etc/firmware/mt6630/mt6630_fm_v4_patch.bin",
- "/etc/firmware/mt6630/mt6630_fm_v4_coeff.bin", NULL, NULL},
- {FM_ROM_V5, "/etc/firmware/mt6630/mt6630_fm_v5_patch.bin",
- "/etc/firmware/mt6630/mt6630_fm_v5_coeff.bin", NULL, NULL},
-};
-
-static struct fm_patch_tbl mt6630_patch_tbl_tx[5] = {
- {FM_ROM_V1, "/etc/firmware/mt6630/mt6630_fm_v1_patch_tx.bin",
- "/etc/firmware/mt6630/mt6630_fm_v1_coeff_tx.bin", NULL, NULL},
- {FM_ROM_V2, "/etc/firmware/mt6630/mt6630_fm_v2_patch_tx.bin",
- "/etc/firmware/mt6630/mt6630_fm_v2_coeff_tx.bin", NULL, NULL},
- {FM_ROM_V3, "/etc/firmware/mt6630/mt6630_fm_v3_patch_tx.bin",
- "/etc/firmware/mt6630/mt6630_fm_v3_coeff_tx.bin", NULL, NULL},
- {FM_ROM_V4, "/etc/firmware/mt6630/mt6630_fm_v4_patch_tx.bin",
- "/etc/firmware/mt6630/mt6630_fm_v4_coeff_tx.bin", NULL, NULL},
- {FM_ROM_V5, "/etc/firmware/mt6630/mt6630_fm_v5_patch_tx.bin",
- "/etc/firmware/mt6630/mt6630_fm_v5_coeff_tx.bin", NULL, NULL},
-};
-
-static struct fm_hw_info mt6630_hw_info = {
- .chip_id = 0x00006630,
- .eco_ver = 0x00000000,
- .rom_ver = 0x00000000,
- .patch_ver = 0x00000000,
- .reserve = 0x00000000,
-};
-
-#define PATCH_SEG_LEN 512
-
-static fm_u8 *cmd_buf;
-static struct fm_lock *cmd_buf_lock;
-static struct fm_callback *fm_cb_op;
-static struct fm_res_ctx *mt6630_res;
-static fm_u8 fm_packaging = 1; /*0:QFN,1:WLCSP */
-static fm_u32 fm_sant_flag; /* 1,Short Antenna; 0, Long Antenna */
-static fm_s32 mt6630_is_dese_chan(fm_u16 freq);
-#if 0
-static fm_s32 mt6630_mcu_dese(fm_u16 freq, void *arg);
-#endif
-static fm_s32 mt6630_gps_dese(fm_u16 freq, void *arg);
-
-static fm_s32 mt6630_I2s_Setting(fm_s32 onoff, fm_s32 mode, fm_s32 sample);
-static fm_u16 mt6630_chan_para_get(fm_u16 freq);
-static fm_s32 mt6630_desense_check(fm_u16 freq, fm_s32 rssi);
-static fm_bool mt6630_TDD_chan_check(fm_u16 freq);
-static fm_s32 mt6630_soft_mute_tune(fm_u16 freq, fm_s32 *rssi, fm_bool *valid);
-static fm_s32 mt6630_pwron(fm_s32 data)
-{
- if (MTK_WCN_BOOL_FALSE == mtk_wcn_wmt_func_on(WMTDRV_TYPE_FM)) {
- FM_LOG_ERR(FM_ERR | CHIP, "WMT turn on FM Fail!\n");
- return -FM_ELINK;
- } else {
- FM_LOG_NTC(FM_NTC | CHIP, "WMT turn on FM OK!\n");
- return 0;
- }
-}
-
-static fm_s32 mt6630_pwroff(fm_s32 data)
-{
- if (MTK_WCN_BOOL_FALSE == mtk_wcn_wmt_func_off(WMTDRV_TYPE_FM)) {
- FM_LOG_ERR(FM_ERR | CHIP, "WMT turn off FM Fail!\n");
- return -FM_ELINK;
- } else {
- FM_LOG_NTC(FM_NTC | CHIP, "WMT turn off FM OK!\n");
- return 0;
- }
-}
-
-static fm_s32 Delayms(fm_u32 data)
-{
- FM_LOG_DBG(FM_DBG | CHIP, "delay %dms\n", data);
- msleep(data);
- return 0;
-}
-
-static fm_s32 Delayus(fm_u32 data)
-{
- FM_LOG_DBG(FM_DBG | CHIP, "delay %dus\n", data);
- udelay(data);
- return 0;
-}
-
-fm_s32 mt6630_get_read_result(struct fm_res_ctx *result)
-{
- FMR_ASSERT(result);
- mt6630_res = result;
-
- return 0;
-}
-
-static fm_s32 mt6630_read(fm_u8 addr, fm_u16 *val)
-{
- fm_s32 ret = 0;
- fm_u16 pkt_size;
-
- if (FM_LOCK(cmd_buf_lock))
- return (-FM_ELOCK);
- pkt_size = mt6630_get_reg(cmd_buf, TX_BUF_SIZE, addr);
- ret =
- fm_cmd_tx(cmd_buf, pkt_size, FLAG_FSPI_RD, SW_RETRY_CNT, FSPI_RD_TIMEOUT,
- mt6630_get_read_result);
-
- if (!ret && mt6630_res) {
- *val = mt6630_res->fspi_rd;
- }
-
- FM_UNLOCK(cmd_buf_lock);
-
- return ret;
-}
-
-static fm_s32 mt6630_write(fm_u8 addr, fm_u16 val)
-{
- fm_s32 ret = 0;
- fm_u16 pkt_size;
-
- if (FM_LOCK(cmd_buf_lock))
- return (-FM_ELOCK);
- pkt_size = mt6630_set_reg(cmd_buf, TX_BUF_SIZE, addr, val);
- ret = fm_cmd_tx(cmd_buf, pkt_size, FLAG_FSPI_WR, SW_RETRY_CNT, FSPI_WR_TIMEOUT, NULL);
- FM_UNLOCK(cmd_buf_lock);
-
- return ret;
-}
-
-static fm_s32 mt6630_set_bits(fm_u8 addr, fm_u16 bits, fm_u16 mask)
-{
- fm_s32 ret = 0;
- fm_u16 pkt_size;
-
- if (FM_LOCK(cmd_buf_lock))
- return (-FM_ELOCK);
- pkt_size = mt6630_set_bits_reg(cmd_buf, TX_BUF_SIZE, addr, bits, mask);
- ret = fm_cmd_tx(cmd_buf, pkt_size, (1 << 0x11), SW_RETRY_CNT, FSPI_WR_TIMEOUT, NULL); /* 0x11 this opcode won't be parsed as an opcode, so set here as spcial case. */
- FM_UNLOCK(cmd_buf_lock);
-
- return ret;
-}
-
-static fm_s32 mt6630_host_read(fm_u32 addr, fm_u32 *val)
-{
- fm_s32 ret = 0;
- fm_u16 pkt_size;
-
- if (FM_LOCK(cmd_buf_lock))
- return (-FM_ELOCK);
- pkt_size = mt6630_host_get_reg(cmd_buf, TX_BUF_SIZE, addr);
- ret =
- fm_cmd_tx(cmd_buf, pkt_size, FLAG_HOST_READ, SW_RETRY_CNT, FSPI_RD_TIMEOUT,
- mt6630_get_read_result);
-
- if (!ret && mt6630_res) {
- *val = mt6630_res->cspi_rd;
- }
-
- FM_UNLOCK(cmd_buf_lock);
-
- return ret;
-}
-
-static fm_s32 mt6630_host_write(fm_u32 addr, fm_u32 val)
-{
- fm_s32 ret = 0;
- fm_u16 pkt_size;
-
- if (FM_LOCK(cmd_buf_lock))
- return (-FM_ELOCK);
- pkt_size = mt6630_host_set_reg(cmd_buf, TX_BUF_SIZE, addr, val);
- ret = fm_cmd_tx(cmd_buf, pkt_size, FLAG_HOST_WRITE, SW_RETRY_CNT, FSPI_WR_TIMEOUT, NULL);
- FM_UNLOCK(cmd_buf_lock);
-
- return ret;
-}
-
-static fm_u16 mt6630_get_chipid(void)
-{
- return 0x6630;
-}
-
-/* MT6630_SetAntennaType - set Antenna type
- * @type - 1,Short Antenna; 0, Long Antenna
- */
-static fm_s32 mt6630_SetAntennaType(fm_s32 type)
-{
- fm_u16 dataRead;
-
- FM_LOG_NTC(FM_NTC | CHIP, "set ana to %s\n", type ? "short" : "long");
- if (fm_packaging == 0) {
- fm_sant_flag = type;
- } else {
- mt6630_read(FM_MAIN_CG2_CTRL, &dataRead);
-
- if (type) {
- dataRead |= ANTENNA_TYPE;
- } else {
- dataRead &= (~ANTENNA_TYPE);
- }
-
- mt6630_write(FM_MAIN_CG2_CTRL, dataRead);
- }
- return 0;
-}
-
-static fm_s32 mt6630_GetAntennaType(void)
-{
- fm_u16 dataRead;
-
- if (fm_packaging == 0) {
- return fm_sant_flag;
- } else {
- mt6630_read(FM_MAIN_CG2_CTRL, &dataRead);
- FM_LOG_NTC(FM_NTC | CHIP, "get ana type: %s\n",
- (dataRead & ANTENNA_TYPE) ? "short" : "long");
-
- if (dataRead & ANTENNA_TYPE)
- return FM_ANA_SHORT; /* short antenna */
- else
- return FM_ANA_LONG; /* long antenna */
- }
-}
-
-
-static fm_s32 mt6630_Mute(fm_bool mute)
-{
- fm_s32 ret = 0;
- fm_u16 dataRead;
-
- FM_LOG_NTC(FM_NTC | CHIP, "set %s\n", mute ? "mute" : "unmute");
- mt6630_read(FM_MAIN_CTRL, &dataRead);
-
- if (mute == 1)
- {
- ret = mt6630_write(FM_MAIN_CTRL, (dataRead&0xFFDF) | 0x0020);
- }
- else
- {
- ret = mt6630_write(FM_MAIN_CTRL, (dataRead&0xFFDF));
- }
- return ret;
-}
-
-static fm_s32 mt6630_RampDown(void)
-{
- fm_s32 ret = 0;
- fm_u16 pkt_size;
- /* fm_u16 tmp; */
-
- FM_LOG_NTC(FM_NTC | CHIP, "ramp down\n");
-
- ret = mt6630_write(FM_MAIN_EXTINTRMASK, 0x0000);
- if (ret) {
- FM_LOG_ERR(FM_ERR |CHIP, "ramp down write FM_MAIN_EXTINTRMASK failed\n");
- return ret;
- }
-
- if (FM_LOCK(cmd_buf_lock))
- return (-FM_ELOCK);
- pkt_size = mt6630_rampdown(cmd_buf, TX_BUF_SIZE);
- ret = fm_cmd_tx(cmd_buf, pkt_size, FLAG_RAMPDOWN, SW_RETRY_CNT, RAMPDOWN_TIMEOUT, NULL);
- FM_UNLOCK(cmd_buf_lock);
-
- if (ret) {
- FM_LOG_ERR(FM_ERR |CHIP, "ramp down failed\n");
- return ret;
- }
-
- ret = mt6630_write(FM_MAIN_EXTINTRMASK, 0x0021);
- if (ret) {
- FM_LOG_ERR(FM_ERR |CHIP, "ramp down write FM_MAIN_EXTINTRMASK failed\n");
- }
-
- return ret;
-}
-
-static fm_s32 mt6630_get_rom_version(void)
-{
- fm_u16 tmp;
- fm_s32 ret;
-
- /* DSP rom code version request enable --- set 0x61 b15=1 */
- mt6630_set_bits(0x61, 0x8000, 0x7FFF);
-
- /* Release ASIP reset --- set 0x61 b1=1 */
- mt6630_set_bits(0x61, 0x0002, 0xFFFD);
-
- /* Enable ASIP power --- set 0x61 b0=0 */
- mt6630_set_bits(0x61, 0x0000, 0xFFFE);
-
- /* Wait DSP code version ready --- wait 1ms */
- do {
- Delayus(1000);
- ret = mt6630_read(0x84, &tmp);
- /* ret=-4 means signal got when control FM. usually get sig 9 to kill FM process. */
- /* now cancel FM power up sequence is recommended. */
- if (ret) {
- return ret;
- }
- FM_LOG_DBG(FM_DBG |CHIP, "0x84=%x\n", tmp);
- } while (tmp != 0x0001);
-
- /* Get FM DSP code version --- rd 0x83[15:8] */
- mt6630_read(0x83, &tmp);
- FM_LOG_NTC(FM_NTC | CHIP, "DSP ver=0x%x\n", tmp);
- tmp = (tmp >> 8);
-
- /* DSP rom code version request disable --- set 0x61 b15=0 */
- mt6630_set_bits(0x61, 0x0000, 0x7FFF);
-
- /* Reset ASIP --- set 0x61[1:0] = 1 */
- mt6630_set_bits(0x61, 0x0001, 0xFFFC);
-
- /* FM_LOG_NTC(CHIP, "ROM version: v%d\n", (fm_s32)tmp); */
- return (fm_s32) tmp;
-}
-
-static fm_s32 mt6630_get_patch_path(fm_s32 ver, const fm_s8 **ppath,
- struct fm_patch_tbl *patch_tbl)
-{
- fm_s32 i;
- fm_s32 max = FM_ROM_MAX;
-
- /* check if the ROM version is defined or not */
- for (i = 0; i < max; i++) {
- if ((patch_tbl[i].idx == ver) && (fm_file_exist(patch_tbl[i].patch) == 0)) {
- *ppath = patch_tbl[i].patch;
- FM_LOG_NTC(FM_NTC | CHIP, "Get ROM version OK\n");
- return 0;
- }
- }
-
- /* the ROM version isn't defined, find a latest patch instead */
- for (i = max; i > 0; i--) {
- if (fm_file_exist(patch_tbl[i - 1].patch) == 0) {
- *ppath = patch_tbl[i - 1].patch;
- FM_LOG_ERR(FM_ERR | CHIP, "undefined ROM version\n");
- return 0;
- }
- }
-
- /* get path failed */
- FM_LOG_ERR(FM_ERR | CHIP, "No valid patch file\n");
- return -FM_EPATCH;
-}
-
-
-static fm_s32 mt6630_get_coeff_path(fm_s32 ver, const fm_s8 **ppath,
- struct fm_patch_tbl *patch_tbl)
-{
- fm_s32 i;
- fm_s32 max = FM_ROM_MAX;
-
- /* check if the ROM version is defined or not */
- for (i = 0; i < max; i++) {
- if ((patch_tbl[i].idx == ver) && (fm_file_exist(patch_tbl[i].coeff) == 0)) {
- *ppath = patch_tbl[i].coeff;
- FM_LOG_NTC(FM_NTC | CHIP, "Get ROM version OK\n");
- return 0;
- }
- }
-
-
- /* the ROM version isn't defined, find a latest patch instead */
- for (i = max; i > 0; i--) {
- if (fm_file_exist(patch_tbl[i - 1].coeff) == 0) {
- *ppath = patch_tbl[i - 1].coeff;
- FM_LOG_ERR(FM_ERR | CHIP, "undefined ROM version\n");
- return 1;
- }
- }
-
- /* get path failed */
- FM_LOG_ERR(FM_ERR | CHIP, "No valid coeff file\n");
- return -FM_EPATCH;
-}
-
-/*
-* mt6630_DspPatch - DSP download procedure
-* @img - source dsp bin code
-* @len - patch length in byte
-* @type - rom/patch/coefficient/hw_coefficient
-*/
-static fm_s32 mt6630_DspPatch(const fm_u8 *img, fm_s32 len, enum IMG_TYPE type)
-{
- fm_u8 seg_num;
- fm_u8 seg_id = 0;
- fm_s32 seg_len;
- fm_s32 ret = 0;
- fm_u16 pkt_size;
-
- FMR_ASSERT(img);
-
- if (len <= 0) {
- return -1;
- }
-
- seg_num = len / PATCH_SEG_LEN + 1;
- FM_LOG_NTC(FM_NTC | CHIP, "binary len:%d, seg num:%d\n", len, seg_num);
-
- switch (type) {
-#if 0
- case IMG_ROM:
-
- for (seg_id = 0; seg_id < seg_num; seg_id++) {
- seg_len = ((seg_id + 1) < seg_num) ? PATCH_SEG_LEN : (len % PATCH_SEG_LEN);
- FM_LOG_NTC(CHIP, "rom,[seg_id:%d], [seg_len:%d]\n", seg_id, seg_len);
- if (FM_LOCK(cmd_buf_lock))
- return (-FM_ELOCK);
- pkt_size =
- mt6630_rom_download(cmd_buf, TX_BUF_SIZE, seg_num, seg_id,
- &img[seg_id * PATCH_SEG_LEN], seg_len);
- FM_LOG_NTC(CHIP, "pkt_size:%d\n", (fm_s32) pkt_size);
- ret =
- fm_cmd_tx(cmd_buf, pkt_size, FLAG_ROM, SW_RETRY_CNT, ROM_TIMEOUT, NULL);
- FM_UNLOCK(cmd_buf_lock);
-
- if (ret) {
- FM_LOG_ERR(CHIP, "mt6630_rom_download failed\n");
- return ret;
- }
- }
-
- break;
-#endif
- case IMG_PATCH:
-
- for (seg_id = 0; seg_id < seg_num; seg_id++) {
- seg_len = ((seg_id + 1) < seg_num) ? PATCH_SEG_LEN : (len % PATCH_SEG_LEN);
- FM_LOG_NTC(FM_NTC | CHIP, "patch,[seg_id:%d], [seg_len:%d]\n", seg_id, seg_len);
- if (FM_LOCK(cmd_buf_lock))
- return (-FM_ELOCK);
- pkt_size =
- mt6630_patch_download(cmd_buf, TX_BUF_SIZE, seg_num, seg_id,
- &img[seg_id * PATCH_SEG_LEN], seg_len);
- FM_LOG_NTC(FM_NTC | CHIP, "pkt_size:%d\n", (fm_s32) pkt_size);
- ret =
- fm_cmd_tx(cmd_buf, pkt_size, FLAG_PATCH, SW_RETRY_CNT, PATCH_TIMEOUT,
- NULL);
- FM_UNLOCK(cmd_buf_lock);
-
- if (ret) {
- FM_LOG_ERR(FM_ERR | CHIP, "mt6630_patch_download failed\n");
- return ret;
- }
- }
-
- break;
-#if 0
- case IMG_HW_COEFFICIENT:
-
- for (seg_id = 0; seg_id < seg_num; seg_id++) {
- seg_len = ((seg_id + 1) < seg_num) ? PATCH_SEG_LEN : (len % PATCH_SEG_LEN);
- FM_LOG_NTC(CHIP, "hwcoeff,[seg_id:%d], [seg_len:%d]\n", seg_id, seg_len);
- if (FM_LOCK(cmd_buf_lock))
- return (-FM_ELOCK);
- pkt_size =
- mt6630_hwcoeff_download(cmd_buf, TX_BUF_SIZE, seg_num, seg_id,
- &img[seg_id * PATCH_SEG_LEN], seg_len);
- FM_LOG_NTC(CHIP, "pkt_size:%d\n", (fm_s32) pkt_size);
- ret =
- fm_cmd_tx(cmd_buf, pkt_size, FLAG_HWCOEFF, SW_RETRY_CNT,
- HWCOEFF_TIMEOUT, NULL);
- FM_UNLOCK(cmd_buf_lock);
-
- if (ret) {
- FM_LOG_ERR(CHIP, "mt6630_hwcoeff_download failed\n");
- return ret;
- }
- }
-
- break;
-#endif
- case IMG_COEFFICIENT:
-
- for (seg_id = 0; seg_id < seg_num; seg_id++) {
- seg_len = ((seg_id + 1) < seg_num) ? PATCH_SEG_LEN : (len % PATCH_SEG_LEN);
- FM_LOG_NTC(FM_NTC | CHIP, "coeff,[seg_id:%d], [seg_len:%d]\n", seg_id, seg_len);
- if (FM_LOCK(cmd_buf_lock))
- return (-FM_ELOCK);
- pkt_size =
- mt6630_coeff_download(cmd_buf, TX_BUF_SIZE, seg_num, seg_id,
- &img[seg_id * PATCH_SEG_LEN], seg_len);
- FM_LOG_NTC(FM_NTC | CHIP, "pkt_size:%d\n", (fm_s32) pkt_size);
- ret =
- fm_cmd_tx(cmd_buf, pkt_size, FLAG_COEFF, SW_RETRY_CNT, COEFF_TIMEOUT,
- NULL);
- FM_UNLOCK(cmd_buf_lock);
-
- if (ret) {
- FM_LOG_ERR(FM_ERR | CHIP, "mt6630_coeff_download failed\n");
- return ret;
- }
- }
-
- break;
- default:
- break;
- }
-
- return 0;
-}
-
-static fm_s32 mt6630_pwrup_top_setting(void)
-{
- fm_s32 ret = 0, value = 0;
- /* A0.1 Turn on FM buffer */
- ret = mt6630_host_read(0x8102123c, &value);
- if (ret) {
- FM_LOG_ERR(FM_ERR | CHIP, " 0x8102123c rd failed\n");
- return ret;
- }
- ret = mt6630_host_write(0x8102123c, value & 0xFFFFFFBF);
- if (ret) {
- FM_LOG_ERR(FM_ERR | CHIP, " 0x8102123c wr failed\n");
- return ret;
- }
- /* A0.2 Set xtal no off when FM on */
- ret = mt6630_host_read(0x81021134, &value);
- if (ret) {
- FM_LOG_ERR(FM_ERR | CHIP, " 0x81021134 rd failed\n");
- return ret;
- }
- ret = mt6630_host_write(0x81021134, value | 0x80);
- if (ret) {
- FM_LOG_ERR(FM_ERR | CHIP, " 0x81021134 wr failed\n");
- return ret;
- }
- /* A0.3 Set top off always on when FM on */
- ret = mt6630_host_read(0x81020010, &value);
- if (ret) {
- FM_LOG_ERR(FM_ERR | CHIP, " 0x81020010 rd failed\n");
- return ret;
- }
- ret = mt6630_host_write(0x81020010, value & 0xFFFDFFFF);
- if (ret) {
- FM_LOG_ERR(FM_ERR | CHIP, " 0x81020010 wr failed\n");
- return ret;
- }
- /* A0.4 Always enable PALDO when FM on */
- ret = mt6630_host_read(0x81021430, &value);
- if (ret) {
- FM_LOG_ERR(FM_ERR | CHIP, " 0x81021430 rd failed\n");
- return ret;
- }
- ret = mt6630_host_write(0x81021430, value | 0x80000000);
- if (ret) {
- FM_LOG_ERR(FM_ERR | CHIP, " 0x81021430 wr failed\n");
- return ret;
- }
- /* A0.5 */
- Delayus(240);
-
- /* A0.6 MTCMOS Control */
- ret = mt6630_host_read(0x81020008, &value);
- if (ret) {
- FM_LOG_ERR(FM_ERR | CHIP, " 0x81020008 rd failed\n");
- return ret;
- }
- ret = mt6630_host_write(0x81020008, value | 0x00000030);
- if (ret) {
- FM_LOG_ERR(FM_ERR | CHIP, " 0x81020008 wr failed\n");
- return ret;
- }
- /* A0.7 */
- Delayus(20);
-
- /* A0.8 release power on reset */
- ret = mt6630_host_read(0x81020008, &value);
- if (ret) {
- FM_LOG_ERR(FM_ERR | CHIP, " 0x81020008 rd failed\n");
- return ret;
- }
- ret = mt6630_host_write(0x81020008, value | 0x00000001);
- if (ret) {
- FM_LOG_ERR(FM_ERR | CHIP, " 0x81020008 wr failed\n");
- return ret;
- }
- /* A0.9 enable fspi_mas_bclk_ck */
- ret = mt6630_host_read(0x80000108, &value);
- if (ret) {
- FM_LOG_ERR(FM_ERR | CHIP, " 0x80000108 rd failed\n");
- return ret;
- }
- ret = mt6630_host_write(0x80000108, value | 0x00000100);
- if (ret) {
- FM_LOG_ERR(FM_ERR | CHIP, " 0x80000108 wr failed\n");
- return ret;
- }
- return ret;
-}
-
-static fm_s32 mt6630_pwrdown_top_setting(void)
-{
- fm_s32 ret = 0, value = 0;
- /* B0.1 disable fspi_mas_bclk_ck */
- ret = mt6630_host_read(0x80000104, &value);
- if (ret) {
- FM_LOG_ERR(FM_ERR | CHIP, " 0x80000104 rd failed\n");
- return ret;
- }
- ret = mt6630_host_write(0x80000104, value | 0x00000100);
- if (ret) {
- FM_LOG_ERR(FM_ERR | CHIP, " 0x80000104 wr failed\n");
- return ret;
- }
- /* B0.2 set power off reset */
- ret = mt6630_host_read(0x81020008, &value);
- if (ret) {
- FM_LOG_ERR(FM_ERR | CHIP, " 0x81020008 rd failed\n");
- return ret;
- }
- ret = mt6630_host_write(0x81020008, value & 0xFFFFFFFE);
- if (ret) {
- FM_LOG_ERR(FM_ERR | CHIP, " 0x81020008 wr failed\n");
- return ret;
- }
- /* B0.3 */
- Delayus(20);
-
- /* B0.4 disable MTCMOS & set Iso_en */
- ret = mt6630_host_read(0x81020008, &value);
- if (ret) {
- FM_LOG_ERR(FM_ERR | CHIP, " 0x81020008 rd failed\n");
- return ret;
- }
- ret = mt6630_host_write(0x81020008, value & 0xFFFFFFEF);
- if (ret) {
- FM_LOG_ERR(FM_ERR | CHIP, " 0x81020008 wr failed\n");
- return ret;
- }
- /* B0.5 Turn off FM buffer */
- ret = mt6630_host_read(0x8102123c, &value);
- if (ret) {
- FM_LOG_ERR(FM_ERR | CHIP, " 0x8102123c rd failed\n");
- return ret;
- }
- ret = mt6630_host_write(0x8102123c, value | 0x40);
- if (ret) {
- FM_LOG_ERR(FM_ERR | CHIP, " 0x8102123c wr failed\n");
- return ret;
- }
- /* B0.6 Clear xtal no off when FM off */
- ret = mt6630_host_read(0x81021134, &value);
- if (ret) {
- FM_LOG_ERR(FM_ERR | CHIP, " 0x81021134 rd failed\n");
- return ret;
- }
- ret = mt6630_host_write(0x81021134, value & 0xFFFFFF7F);
- if (ret) {
- FM_LOG_ERR(FM_ERR | CHIP, " 0x81021134 wr failed\n");
- return ret;
- }
- /* B0.7 Clear top off always on when FM off */
- ret = mt6630_host_read(0x81020010, &value);
- if (ret) {
- FM_LOG_ERR(FM_ERR | CHIP, " 0x81020010 rd failed\n");
- return ret;
- }
- ret = mt6630_host_write(0x81020010, value | 0x20000);
- if (ret) {
- FM_LOG_ERR(FM_ERR | CHIP, " 0x81020010 wr failed\n");
- return ret;
- }
- /* B0.9 Disable PALDO when FM off */
- ret = mt6630_host_read(0x81021430, &value);
- if (ret) {
- FM_LOG_ERR(FM_ERR | CHIP, " 0x81021430 rd failed\n");
- return ret;
- }
- ret = mt6630_host_write(0x81021430, value & 0x7FFFFFFF);
- if (ret) {
- FM_LOG_ERR(FM_ERR | CHIP, " 0x81021430 wr failed\n");
- return ret;
- }
-
- return ret;
-}
-
-static fm_s32 mt6630_pwrup_DSP_download(struct fm_patch_tbl *patch_tbl)
-{
-#define PATCH_BUF_SIZE 4096*6
- fm_s32 ret = 0;
- const fm_s8 *path_patch = NULL;
- const fm_s8 *path_coeff = NULL;
- fm_s32 patch_len = 0;
- fm_u8 *dsp_buf = NULL;
- fm_u16 tmp_reg = 0;
-
- mt6630_hw_info.eco_ver = (fm_s32) mtk_wcn_wmt_hwver_get();
- FM_LOG_NTC(CHIP, "ECO version:0x%08x\n", mt6630_hw_info.eco_ver);
- mt6630_hw_info.eco_ver += 1;
-
- /* FM ROM code version request */
- if ((ret = mt6630_get_rom_version()) >= 0) {
- mt6630_hw_info.rom_ver = ret;
- FM_LOG_NTC(FM_NTC | CHIP, "ROM version: v%d\n", mt6630_hw_info.rom_ver);
- } else {
- FM_LOG_ERR(FM_ERR | CHIP, "get ROM version failed\n");
- /* ret=-4 means signal got when control FM. usually get sig 9 to kill FM process. */
- /* now cancel FM power up sequence is recommended. */
- return ret;
- }
-
- /* Wholechip FM Power Up: step 3, download patch */
- if (!(dsp_buf = fm_vmalloc(PATCH_BUF_SIZE))) {
- FM_LOG_ERR(FM_ERR | CHIP, "-ENOMEM\n");
- return -ENOMEM;
- }
-
- ret = mt6630_get_patch_path(mt6630_hw_info.rom_ver, &path_patch, patch_tbl);
- if (ret) {
- FM_LOG_ERR(FM_ERR | CHIP, " mt6630_get_patch_path failed\n");
- goto out;
- }
- patch_len = fm_file_read(path_patch, dsp_buf, PATCH_BUF_SIZE, 0);
- ret = mt6630_DspPatch((const fm_u8 *)dsp_buf, patch_len, IMG_PATCH);
- if (ret) {
- FM_LOG_ERR(FM_ERR | CHIP, " DL DSPpatch failed\n");
- goto out;
- }
-
- ret = mt6630_get_coeff_path(mt6630_hw_info.rom_ver, &path_coeff, patch_tbl);
- if (ret == -FM_EPATCH) {
- FM_LOG_ERR(FM_ERR | CHIP, " mt6630_get_coeff_path failed\n");
- goto out;
- }
- patch_len = fm_file_read(path_coeff, dsp_buf, PATCH_BUF_SIZE, 0);
-
- mt6630_hw_info.rom_ver += 1;
-
- tmp_reg = dsp_buf[38] | (dsp_buf[39] << 8); /* to be confirmed */
- mt6630_hw_info.patch_ver = (fm_s32) tmp_reg;
- FM_LOG_NTC(FM_NTC | CHIP, "Patch version: 0x%08x\n", mt6630_hw_info.patch_ver);
-
- if (ret == 1) {
- dsp_buf[4] = 0x00; /* if we found rom version undefined, we should disable patch */
- dsp_buf[5] = 0x00;
- }
-
- ret = mt6630_DspPatch((const fm_u8 *)dsp_buf, patch_len, IMG_COEFFICIENT);
- if (ret) {
- FM_LOG_ERR(FM_ERR | CHIP, " DL DSPcoeff failed\n");
- goto out;
- }
- mt6630_write(0x90, 0x0040);
- mt6630_write(0x90, 0x0000);
- out:
- if (dsp_buf) {
- fm_vfree(dsp_buf);
- dsp_buf = NULL;
- }
- return ret;
-}
-
-static fm_s32 mt6630_PowerUp(fm_u16 *chip_id, fm_u16 *device_id)
-{
- fm_s32 ret = 0, reg = 0;
- fm_u16 pkt_size;
- fm_u16 tmp_reg = 0;
-
- FMR_ASSERT(chip_id);
- FMR_ASSERT(device_id);
-
- FM_LOG_DBG(FM_DBG | CHIP, "pwr on seq......\n");
-
- ret = mt6630_host_read(0x80021010, &reg);
- if (ret) {
- FM_LOG_ERR(FM_ERR | CHIP, "packaging rd failed\n");
- } else {
- fm_packaging = (reg & 0x00008000) >> 15;
- FM_LOG_NTC(FM_NTC | CHIP, "fm_packaging: %d\n", fm_packaging);
- }
- ret = mt6630_pwrup_top_setting();
- if (ret) {
- FM_LOG_ERR(FM_ERR | CHIP, "mt6630_pwrup_top_setting failed\n");
- return ret;
- }
- if (FM_LOCK(cmd_buf_lock))
- return (-FM_ELOCK);
- pkt_size = mt6630_pwrup_clock_on(cmd_buf, TX_BUF_SIZE);
- ret = fm_cmd_tx(cmd_buf, pkt_size, FLAG_EN, SW_RETRY_CNT, EN_TIMEOUT, NULL);
- FM_UNLOCK(cmd_buf_lock);
-
- if (ret) {
- FM_LOG_ERR(FM_ERR | CHIP, "mt6630_pwrup_clock_on failed\n");
- return ret;
- }
- /* read HW version */
- mt6630_read(0x62, &tmp_reg);
- *chip_id = tmp_reg;
- *device_id = tmp_reg;
- mt6630_hw_info.chip_id = (fm_s32) tmp_reg;
- FM_LOG_NTC(FM_NTC | CHIP, "chip_id:0x%04x\n", tmp_reg);
-
- if (mt6630_hw_info.chip_id != 0x6630) {
- FM_LOG_NTC(FM_NTC | CHIP, "fm sys error!\n");
- return (-FM_EPARA);
- }
- ret = mt6630_pwrup_DSP_download(mt6630_patch_tbl);
- if (ret) {
- FM_LOG_ERR(FM_ERR | CHIP, "mt6630_pwrup_DSP_download failed\n");
- return ret;
- }
-
- if ((mt6630_fm_config.aud_cfg.aud_path == FM_AUD_MRGIF)
- || (mt6630_fm_config.aud_cfg.aud_path == FM_AUD_I2S)) {
- mt6630_I2s_Setting(FM_I2S_ON, mt6630_fm_config.aud_cfg.i2s_info.mode,
- mt6630_fm_config.aud_cfg.i2s_info.rate);
- /* mt_combo_audio_ctrl(COMBO_AUDIO_STATE_2); */
- mtk_wcn_cmb_stub_audio_ctrl((CMB_STUB_AIF_X) CMB_STUB_AIF_2);
- }
- /* Wholechip FM Power Up: step 4, FM Digital Init: fm_rgf_maincon */
- if (FM_LOCK(cmd_buf_lock))
- return (-FM_ELOCK);
- pkt_size = mt6630_pwrup_digital_init(cmd_buf, TX_BUF_SIZE);
- ret = fm_cmd_tx(cmd_buf, pkt_size, FLAG_EN, SW_RETRY_CNT, EN_TIMEOUT, NULL);
- FM_UNLOCK(cmd_buf_lock);
- if (ret) {
- FM_LOG_ERR(FM_ERR | CHIP, "mt6630_pwrup_digital_init failed\n");
- return ret;
- }
-
- FM_LOG_NTC(FM_NTC | CHIP, "pwr on seq ok\n");
-
- return ret;
-}
-
-static fm_s32 mt6630_PowerDown(void)
-{
- fm_s32 ret = 0;
- fm_u16 pkt_size;
- fm_u16 dataRead;
-
- FM_LOG_DBG(FM_DBG | CHIP, "pwr down seq\n");
- /*SW work around for MCUFA issue.
- *if interrupt happen before doing rampdown, DSP can't switch MCUFA back well.
- * In case read interrupt, and clean if interrupt found before rampdown.
- */
- mt6630_read(FM_MAIN_INTR, &dataRead);
-
- if (dataRead & 0x1) {
- mt6630_write(FM_MAIN_INTR, dataRead); /* clear status flag */
- }
-
- //mt6630_RampDown();
-
- if (FM_LOCK(cmd_buf_lock))
- return (-FM_ELOCK);
- pkt_size = mt6630_pwrdown(cmd_buf, TX_BUF_SIZE);
- ret = fm_cmd_tx(cmd_buf, pkt_size, FLAG_EN, SW_RETRY_CNT, EN_TIMEOUT, NULL);
- FM_UNLOCK(cmd_buf_lock);
-
- if (ret) {
- FM_LOG_ERR(FM_ERR | CHIP, "mt6630_pwrdown failed\n");
- return ret;
- }
-
- ret = mt6630_pwrdown_top_setting();
- if (ret) {
- FM_LOG_ERR(FM_ERR | CHIP, "mt6630_pwrdown_top_setting failed\n");
- return ret;
- }
-
- return ret;
-}
-
-/* just for dgb */
-static fm_bool mt6630_SetFreq(fm_u16 freq)
-{
- fm_s32 ret = 0;
- fm_u16 pkt_size;
- fm_u16 chan_para = 0;
-
- fm_cb_op->cur_freq_set(freq);
-
-#if 0
- /* MCU clock adjust if need */
- if ((ret = mt6630_mcu_dese(freq, NULL)) < 0) {
- WCN_DBG(FM_ERR | MAIN, "mt6630_mcu_dese FAIL:%d\n", ret);
- }
-
- WCN_DBG(FM_INF | MAIN, "MCU %d\n", ret);
-#endif
-
- /* GPS clock adjust if need */
- if ((ret = mt6630_gps_dese(freq, NULL)) < 0) {
- WCN_DBG(FM_ERR | MAIN, "mt6630_gps_dese FAIL:%d\n", ret);
- }
-
- WCN_DBG(FM_INF | MAIN, "GPS %d\n", ret);
-
- ret = mt6630_write(0x60, 0x0007);
- if (ret) {
- WCN_DBG(FM_ALT | MAIN, "set freq write 0x60 fail\n");
- }
- if (mt6630_TDD_chan_check(freq)) {
- ret = mt6630_set_bits(0x30, 0x0004, 0xFFF9); /* use TDD solution */
- if (ret) {
- WCN_DBG(FM_ALT | MAIN, "set freq write 0x30 fail\n");
- }
- }
- else {
- ret = mt6630_set_bits(0x30, 0x0000, 0xFFF9); /* default use FDD solution */
- if (ret) {
- WCN_DBG(FM_ALT | MAIN, "set freq write 0x30 fail\n");
- }
- }
- ret = mt6630_write(0x60, 0x000F);
- if (ret) {
- WCN_DBG(FM_ALT | MAIN, "set freq write 0x60 fail\n");
- }
-
- chan_para = mt6630_chan_para_get(freq);
- FM_LOG_DBG(FM_DBG |CHIP, "%d chan para = %d\n", (fm_s32) freq, (fm_s32) chan_para);
-
- if (FM_LOCK(cmd_buf_lock))
- return fm_false;
- pkt_size = mt6630_tune(cmd_buf, TX_BUF_SIZE, freq, chan_para);
- ret =
- fm_cmd_tx(cmd_buf, pkt_size, FLAG_TUNE | FLAG_TUNE_DONE, SW_RETRY_CNT, TUNE_TIMEOUT,
- NULL);
- FM_UNLOCK(cmd_buf_lock);
-
- if (ret) {
- FM_LOG_ERR(FM_ERR |CHIP, "mt6630_tune failed\n");
- return fm_false;
- }
-
- FM_LOG_DBG(FM_DBG |CHIP, "set freq to %d ok\n", freq);
- return fm_true;
-}
-
-#define FM_CQI_LOG_PATH "/mnt/sdcard/fmcqilog"
-
-static fm_s32 mt6630_full_cqi_get(fm_s32 min_freq, fm_s32 max_freq, fm_s32 space, fm_s32 cnt)
-{
- fm_s32 ret = 0;
- fm_u16 pkt_size;
- fm_u16 freq, orig_freq;
- fm_s32 i, j, k;
- fm_s32 space_val, max, min, num;
- struct mt6630_full_cqi *p_cqi;
- fm_u8 *cqi_log_title =
- "Freq, RSSI, PAMD, PR, FPAMD, MR, ATDC, PRX, ATDEV, SMGain, DltaRSSI\n";
- fm_u8 cqi_log_buf[100] = { 0 };
- fm_s32 pos;
- fm_u8 cqi_log_path[100] = { 0 };
-
- FM_LOG_NTC(FM_NTC | CHIP, "6630 cqi log start\n");
- /* for soft-mute tune, and get cqi */
- freq = fm_cb_op->cur_freq_get();
- if (0 == fm_get_channel_space(freq)) {
- freq *= 10;
- }
- /* get cqi */
- orig_freq = freq;
- if (0 == fm_get_channel_space(min_freq)) {
- min = min_freq * 10;
- } else {
- min = min_freq;
- }
- if (0 == fm_get_channel_space(max_freq)) {
- max = max_freq * 10;
- } else {
- max = max_freq;
- }
- if (space == 0x0001) {
- space_val = 5; /* 50Khz */
- } else if (space == 0x0002) {
- space_val = 10; /* 100Khz */
- } else if (space == 0x0004) {
- space_val = 20; /* 200Khz */
- } else {
- space_val = 10;
- }
- num = (max - min) / space_val + 1; /* Eg, (8760 - 8750) / 10 + 1 = 2 */
- for (k = 0; (10000 == orig_freq) && (0xffffffff == g_dbg_level) && (k < cnt); k++) {
- FM_LOG_NTC(FM_NTC | CHIP, "cqi file:%d\n", k + 1);
- freq = min;
- pos = 0;
- fm_memcpy(cqi_log_path, FM_CQI_LOG_PATH, strlen(FM_CQI_LOG_PATH));
- sprintf(&cqi_log_path[strlen(FM_CQI_LOG_PATH)], "%d.txt", k + 1);
- fm_file_write(cqi_log_path, cqi_log_title, strlen(cqi_log_title), &pos);
- for (j = 0; j < num; j++) {
- if (FM_LOCK(cmd_buf_lock))
- return (-FM_ELOCK);
- pkt_size = mt6630_full_cqi_req(cmd_buf, TX_BUF_SIZE, &freq, 1, 1);
- ret =
- fm_cmd_tx(cmd_buf, pkt_size, FLAG_SM_TUNE, SW_RETRY_CNT,
- SM_TUNE_TIMEOUT, mt6630_get_read_result);
- FM_UNLOCK(cmd_buf_lock);
-
- if (!ret && mt6630_res) {
- FM_LOG_NTC(FM_NTC | CHIP, "smt cqi size %d\n", mt6630_res->cqi[0]);
- p_cqi = (struct mt6630_full_cqi *)&mt6630_res->cqi[2];
- for (i = 0; i < mt6630_res->cqi[1]; i++) {
- /* just for debug */
- FM_LOG_NTC(FM_NTC | CHIP,
- "freq %d, 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x\n",
- p_cqi[i].ch, p_cqi[i].rssi, p_cqi[i].pamd,
- p_cqi[i].pr, p_cqi[i].fpamd, p_cqi[i].mr,
- p_cqi[i].atdc, p_cqi[i].prx, p_cqi[i].atdev,
- p_cqi[i].smg, p_cqi[i].drssi);
- /* format to buffer */
- sprintf(cqi_log_buf,
- "%04d,%04x,%04x,%04x,%04x,%04x,%04x,%04x,%04x,%04x,%04x,\n",
- p_cqi[i].ch, p_cqi[i].rssi, p_cqi[i].pamd,
- p_cqi[i].pr, p_cqi[i].fpamd, p_cqi[i].mr,
- p_cqi[i].atdc, p_cqi[i].prx, p_cqi[i].atdev,
- p_cqi[i].smg, p_cqi[i].drssi);
- /* write back to log file */
- fm_file_write(cqi_log_path, cqi_log_buf,
- strlen(cqi_log_buf), &pos);
- }
- } else {
- FM_LOG_ERR(FM_ERR | CHIP, "smt get CQI failed\n");
- ret = -1;
- }
- freq += space_val;
- }
- fm_cb_op->cur_freq_set(0); /* avoid run too much times */
- }
- FM_LOG_NTC(FM_NTC | CHIP, "6630 cqi log done\n");
-
- return ret;
-}
-
-/*
- * mt6630_GetCurRSSI - get current freq's RSSI value
- * RS=RSSI
- * If RS>511, then RSSI(dBm)= (RS-1024)/16*6
- * else RSSI(dBm)= RS/16*6
- */
-static fm_s32 mt6630_GetCurRSSI(fm_s32 *pRSSI)
-{
- fm_u16 tmp_reg;
-
- /* TODO: check reg */
- mt6630_read(FM_RSSI_IND, &tmp_reg);
- tmp_reg = tmp_reg & 0x03ff;
-
- if (pRSSI) {
- *pRSSI = (tmp_reg > 511) ? (((tmp_reg - 1024) * 6) >> 4) : ((tmp_reg * 6) >> 4);
- FM_LOG_DBG(FM_DBG | CHIP, "rssi:%d, dBm:%d\n", tmp_reg, *pRSSI);
- } else {
- WCN_DBG(FM_ERR | CHIP, "get rssi para error\n");
- return -FM_EPARA;
- }
-
- return 0;
-}
-
-static fm_u16 mt6630_vol_tbl[16] = {
- 0x0000, 0x0519, 0x066A, 0x0814,
- 0x0A2B, 0x0CCD, 0x101D, 0x1449,
- 0x198A, 0x2027, 0x287A, 0x32F5,
- 0x4027, 0x50C3, 0x65AD, 0x7FFF
-};
-
-static fm_s32 mt6630_SetVol(fm_u8 vol)
-{
- fm_s32 ret = 0;
-
- /* TODO: check reg */
- vol = (vol > 15) ? 15 : vol;
- ret = mt6630_write(0x7D, mt6630_vol_tbl[vol]);
- if (ret) {
- WCN_DBG(FM_ERR | CHIP, "Set vol=%d Failed\n", vol);
- return ret;
- } else {
- FM_LOG_DBG(FM_DBG | CHIP, "Set vol=%d OK\n", vol);
- }
-
- if (vol == 10) {
- fm_print_cmd_fifo(); /* just for debug */
- fm_print_evt_fifo();
- }
- return 0;
-}
-
-static fm_s32 mt6630_GetVol(fm_u8 *pVol)
-{
- int ret = 0;
- fm_u16 tmp;
- fm_s32 i;
-
- FMR_ASSERT(pVol);
-
- /* TODO: check reg */
- ret = mt6630_read(0x7D, &tmp);
- if (ret) {
- *pVol = 0;
- WCN_DBG(FM_ERR | CHIP, "Get vol Failed\n");
- return ret;
- }
-
- for (i = 0; i < 16; i++) {
- if (mt6630_vol_tbl[i] == tmp) {
- *pVol = i;
- break;
- }
- }
-
- FM_LOG_DBG(FM_DBG | CHIP, "Get vol=%d OK\n", *pVol);
- return 0;
-}
-
-static fm_s32 mt6630_dump_reg(void)
-{
- fm_s32 i;
- fm_u16 TmpReg;
- for (i = 0; i < 0xff; i++) {
- mt6630_read(i, &TmpReg);
- FM_LOG_NTC(FM_NTC | CHIP, "0x%02x=0x%04x\n", i, TmpReg);
- }
- return 0;
-}
-
-static fm_bool mt6630_GetMonoStereo(fm_u16 *pMonoStereo)
-{
-#define FM_BF_STEREO 0x1000
- fm_u16 TmpReg;
-
- /* TODO: check reg */
- if (pMonoStereo) {
- mt6630_read(FM_RSSI_IND, &TmpReg);
- *pMonoStereo = (TmpReg & FM_BF_STEREO) >> 12;
- } else {
- WCN_DBG(FM_ERR | CHIP, "MonoStero: para err\n");
- return fm_false;
- }
-
- FM_LOG_DBG(FM_DBG | CHIP, "MonoStero:0x%04x\n", *pMonoStereo);
- return fm_true;
-}
-
-static fm_s32 mt6630_SetMonoStereo(fm_s32 MonoStereo)
-{
- fm_s32 ret = 0;
-#define FM_FORCE_MS 0x0008
-
- FM_LOG_DBG(FM_DBG | CHIP, "set to %s\n", MonoStereo ? "mono" : "auto");
- /* TODO: check reg */
-
- mt6630_write(0x60, 0x3007);
-
- if (MonoStereo) {
- ret = mt6630_set_bits(0x75, FM_FORCE_MS, ~FM_FORCE_MS);
- } else {
- ret = mt6630_set_bits(0x75, 0x0000, ~FM_FORCE_MS);
- }
-
- return ret;
-}
-
-static fm_s32 mt6630_GetCapArray(fm_s32 *ca)
-{
- fm_u16 dataRead;
- fm_u16 tmp = 0;
-
- /* TODO: check reg */
- FMR_ASSERT(ca);
- mt6630_read(0x60, &tmp);
- mt6630_write(0x60, tmp & 0xFFF7); /* 0x60 D3=0 */
-
- mt6630_read(0x26, &dataRead);
- *ca = dataRead;
-
- mt6630_write(0x60, tmp); /* 0x60 D3=1 */
- return 0;
-}
-
-/*
- * mt6630_GetCurPamd - get current freq's PAMD value
- * PA=PAMD
- * If PA>511 then PAMD(dB)= (PA-1024)/16*6,
- * else PAMD(dB)=PA/16*6
- */
-static fm_bool mt6630_GetCurPamd(fm_u16 *pPamdLevl)
-{
- fm_u16 tmp_reg;
- fm_u16 dBvalue, valid_cnt = 0;
- int i, total = 0;
- for (i = 0; i < 8; i++) {
- /* TODO: check reg */
- if (mt6630_read(FM_ADDR_PAMD, &tmp_reg)) {
- *pPamdLevl = 0;
- return fm_false;
- }
-
- tmp_reg &= 0x03FF;
- dBvalue = (tmp_reg > 256) ? ((512 - tmp_reg) * 6 / 16) : 0;
- if (dBvalue != 0) {
- total += dBvalue;
- valid_cnt++;
- FM_LOG_DBG(FM_DBG | CHIP, "[%d]PAMD=%d\n", i, dBvalue);
- }
- Delayms(3);
- }
- if (valid_cnt != 0) {
- *pPamdLevl = total / valid_cnt;
- } else {
- *pPamdLevl = 0;
- }
- FM_LOG_NTC(FM_NTC | CHIP, "PAMD=%d\n", *pPamdLevl);
- return fm_true;
-}
-
-static fm_s32 MT6630_FMOverBT(fm_bool enable)
-{
- fm_s32 ret = 0;
-
- WCN_DBG(FM_NTC | CHIP, "+%s():\n", __func__);
-
- if (enable == fm_true) {
- /* change I2S to slave mode and 48K sample rate */
- if (mt6630_I2s_Setting(FM_I2S_ON, FM_I2S_SLAVE, FM_I2S_48K))
- goto out;
- WCN_DBG(FM_NTC | CHIP, "set FM via BT controller\n");
- } else if (enable == fm_false) {
- /* change I2S to master mode and 44.1K sample rate */
- if (mt6630_I2s_Setting(FM_I2S_ON, FM_I2S_MASTER, FM_I2S_44K))
- goto out;
- WCN_DBG(FM_NTC | CHIP, "set FM via Host\n");
- } else {
- WCN_DBG(FM_ERR | CHIP, "%s()\n", __func__);
- ret = -FM_EPARA;
- goto out;
- }
- out:
- WCN_DBG(FM_NTC | CHIP, "-%s():[ret=%d]\n", __func__, ret);
- return ret;
-}
-
-
-/*
- * mt6630_I2s_Setting - set the I2S state on MT6630
- * @onoff - I2S on/off
- * @mode - I2S mode: Master or Slave
- *
- * Return:0, if success; error code, if failed
- */
-static fm_s32 mt6630_I2s_Setting(fm_s32 onoff, fm_s32 mode, fm_s32 sample)
-{
- fm_u16 tmp_state = 0;
- fm_u16 tmp_mode = 0;
- fm_u16 tmp_sample = 0;
- fm_s32 ret = 0;
-
- if (onoff == FM_I2S_ON) {
- tmp_state = 0x0003; /* I2S enable and standard I2S mode, 0x9B D0,D1=1 */
- mt6630_fm_config.aud_cfg.i2s_info.status = FM_I2S_ON;
- } else if (onoff == FM_I2S_OFF) {
- tmp_state = 0x0000; /* I2S off, 0x9B D0,D1=0 */
- mt6630_fm_config.aud_cfg.i2s_info.status = FM_I2S_OFF;
- } else {
- WCN_DBG(FM_ERR | CHIP, "%s():[onoff=%d]\n", __func__, onoff);
- ret = -FM_EPARA;
- goto out;
- }
-
- if (mode == FM_I2S_MASTER) {
- tmp_mode = 0x0000; /* 6630 as I2S master, set 0x9B D3=0 */
- mt6630_fm_config.aud_cfg.i2s_info.mode = FM_I2S_MASTER;
- } else if (mode == FM_I2S_SLAVE) {
- tmp_mode = 0x0008; /* 6630 as I2S slave, set 0x9B D3=1 */
- mt6630_fm_config.aud_cfg.i2s_info.mode = FM_I2S_SLAVE;
- } else {
- WCN_DBG(FM_ERR | CHIP, "%s():[mode=%d]\n", __func__, mode);
- ret = -FM_EPARA;
- goto out;
- }
-
- if (sample == FM_I2S_32K) {
- tmp_sample = 0x0000; /* 6630 I2S 32KHz sample rate, 0x5F D11~12 */
- mt6630_fm_config.aud_cfg.i2s_info.rate = FM_I2S_32K;
- } else if (sample == FM_I2S_44K) {
- tmp_sample = 0x0800; /* 6630 I2S 44.1KHz sample rate */
- mt6630_fm_config.aud_cfg.i2s_info.rate = FM_I2S_44K;
- } else if (sample == FM_I2S_48K) {
- tmp_sample = 0x1000; /* 6630 I2S 48KHz sample rate */
- mt6630_fm_config.aud_cfg.i2s_info.rate = FM_I2S_48K;
- } else {
- WCN_DBG(FM_ERR | CHIP, "%s():[sample=%d]\n", __func__, sample);
- ret = -FM_EPARA;
- goto out;
- }
-
- ret = mt6630_write(0x60, 0x7);
- if (ret)
- {
- goto out;
- }
-
- ret = mt6630_set_bits(0x5F, tmp_sample, 0xE7FF);
- if (ret) {
- goto out;
- }
- ret = mt6630_set_bits(0x9B, tmp_mode, 0xFFF7);
- if (ret) {
- goto out;
- }
- ret = mt6630_set_bits(0x9B, tmp_state, 0xFFFC);
- if (ret) {
- goto out;
- }
- /* F0.4 enable ft */
- ret = mt6630_set_bits(0x56, 0x1, 0xFFFE);
- if (ret) {
- goto out;
- }
-
- ret = mt6630_write(0x60, 0xf);
- if (ret)
- {
- goto out;
- }
-
- FM_LOG_NTC(FM_NTC | CHIP, "[onoff=%s][mode=%s][sample=%d](0)33KHz,(1)44.1KHz,(2)48KHz\n",
- (onoff == FM_I2S_ON) ? "On" : "Off",
- (mode == FM_I2S_MASTER) ? "Master" : "Slave", sample);
- out:
- return ret;
-}
-
-static fm_s32 mt6630fm_get_audio_info(fm_audio_info_t *data)
-{
- memcpy(data, &mt6630_fm_config.aud_cfg, sizeof(fm_audio_info_t));
- return 0;
-}
-
-static fm_s32 mt6630_i2s_info_get(fm_s32 *ponoff, fm_s32 *pmode, fm_s32 *psample)
-{
- *ponoff = mt6630_fm_config.aud_cfg.i2s_info.status;
- *pmode = mt6630_fm_config.aud_cfg.i2s_info.mode;
- *psample = mt6630_fm_config.aud_cfg.i2s_info.rate;
-
- return 0;
-}
-
-static fm_s32 mt6630_hw_info_get(struct fm_hw_info *req)
-{
- FMR_ASSERT(req);
-
- req->chip_id = mt6630_hw_info.chip_id;
- req->eco_ver = mt6630_hw_info.eco_ver;
- req->patch_ver = mt6630_hw_info.patch_ver;
- req->rom_ver = mt6630_hw_info.rom_ver;
-
- return 0;
-}
-
-static fm_s32 mt6630_pre_search(void)
-{
- mt6630_RampDown();
- return 0;
-}
-
-static fm_s32 mt6630_restore_search(void)
-{
- mt6630_RampDown();
- return 0;
-}
-
-/*
-freq: 8750~10800
-valid: fm_true-valid channel,fm_false-invalid channel
-return: fm_true- smt success, fm_false-smt fail
-*/
-static fm_s32 mt6630_soft_mute_tune(fm_u16 freq, fm_s32 *rssi, fm_bool *valid)
-{
- fm_s32 ret = 0;
- fm_u16 pkt_size;
- /* fm_u16 freq;//, orig_freq; */
- struct mt6630_full_cqi *p_cqi;
- fm_s32 RSSI = 0, PAMD = 0, MR = 0, ATDC = 0;
- fm_u32 PRX = 0, ATDEV = 0;
- fm_u16 softmuteGainLvl = 0;
-
- ret = mt6630_chan_para_get(freq);
- if (ret == 2) {
- ret = mt6630_set_bits(FM_CHANNEL_SET, 0x2000, 0x0FFF); /* mdf HiLo */
- } else {
- ret = mt6630_set_bits(FM_CHANNEL_SET, 0x0000, 0x0FFF); /* clear FA/HL/ATJ */
- }
-#if 0
- mt6630_write(0x60, 0x0007);
- if (mt6630_TDD_chan_check(freq))
- mt6630_set_bits(0x30, 0x0004, 0xFFF9); /* use TDD solution */
- else
- mt6630_set_bits(0x30, 0x0000, 0xFFF9); /* default use FDD solution */
- mt6630_write(0x60, 0x000F);
-#endif
- if (FM_LOCK(cmd_buf_lock))
- return (-FM_ELOCK);
- pkt_size = mt6630_full_cqi_req(cmd_buf, TX_BUF_SIZE, &freq, 1, 1);
- ret =
- fm_cmd_tx(cmd_buf, pkt_size, FLAG_SM_TUNE, SW_RETRY_CNT, SM_TUNE_TIMEOUT,
- mt6630_get_read_result);
- FM_UNLOCK(cmd_buf_lock);
-
- if (!ret && mt6630_res) {
- FM_LOG_NTC(FM_NTC | CHIP, "smt cqi size %d\n", mt6630_res->cqi[0]);
- p_cqi = (struct mt6630_full_cqi *)&mt6630_res->cqi[2];
- /* just for debug */
- FM_LOG_NTC(FM_NTC | CHIP,
- "freq %d, 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x\n",
- p_cqi->ch, p_cqi->rssi, p_cqi->pamd, p_cqi->pr, p_cqi->fpamd, p_cqi->mr,
- p_cqi->atdc, p_cqi->prx, p_cqi->atdev, p_cqi->smg, p_cqi->drssi);
- RSSI =
- ((p_cqi->rssi & 0x03FF) >=
- 512) ? ((p_cqi->rssi & 0x03FF) - 1024) : (p_cqi->rssi & 0x03FF);
- PAMD =
- ((p_cqi->pamd & 0x1FF) >=
- 256) ? ((p_cqi->pamd & 0x01FF) - 512) : (p_cqi->pamd & 0x01FF);
- MR = ((p_cqi->mr & 0x01FF) >=
- 256) ? ((p_cqi->mr & 0x01FF) - 512) : (p_cqi->mr & 0x01FF);
- ATDC = (p_cqi->atdc >= 32768) ? (65536 - p_cqi->atdc) : (p_cqi->atdc);
- if (ATDC < 0) {
- ATDC = (~(ATDC)) - 1; /* Get abs value of ATDC */
- }
- PRX = (p_cqi->prx & 0x00FF);
- ATDEV = p_cqi->atdev;
- softmuteGainLvl = p_cqi->smg;
- /* check if the channel is valid according to each CQIs */
- if ((RSSI >= mt6630_fm_config.rx_cfg.long_ana_rssi_th)
- && (PAMD <= mt6630_fm_config.rx_cfg.pamd_th)
- && (ATDC <= mt6630_fm_config.rx_cfg.atdc_th)
- && (MR >= mt6630_fm_config.rx_cfg.mr_th)
- && (PRX >= mt6630_fm_config.rx_cfg.prx_th)
- && (ATDEV >= ATDC) /* sync scan algorithm */
- &&(softmuteGainLvl >= mt6630_fm_config.rx_cfg.smg_th)) {
- *valid = fm_true;
- } else {
- *valid = fm_false;
- }
- *rssi = RSSI;
-/* if(RSSI < -296)
- FM_LOG_NTC(FM_NTC | CHIP, "rssi\n");
- else if(PAMD > -12)
- FM_LOG_NTC(FM_NTC | CHIP, "PAMD\n");
- else if(ATDC > 3496)
- FM_LOG_NTC(FM_NTC | CHIP, "ATDC\n");
- else if(MR < -67)
- FM_LOG_NTC(FM_NTC | CHIP, "MR\n");
- else if(PRX < 80)
- FM_LOG_NTC(FM_NTC | CHIP, "PRX\n");
- else if(ATDEV < ATDC)
- FM_LOG_NTC(FM_NTC | CHIP, "ATDEV\n");
- else if(softmuteGainLvl < 16421)
- FM_LOG_NTC(FM_NTC | CHIP, "softmuteGainLvl\n");
- */
- } else {
- FM_LOG_ERR(FM_ERR | CHIP, "smt get CQI failed\n");
- return fm_false;
- }
- FM_LOG_NTC(FM_NTC | CHIP, "valid=%d\n", *valid);
- return fm_true;
-}
-
-/*
-parm:
- parm.th_type: 0, RSSI. 1,desense RSSI. 2,SMG.
- parm.th_val: threshold value
-*/
-static fm_s32 mt6630_set_search_th(fm_s32 idx, fm_s32 val, fm_s32 reserve)
-{
- switch (idx) {
- case 0:
- {
- mt6630_fm_config.rx_cfg.long_ana_rssi_th = val;
- WCN_DBG(FM_NTC | CHIP, "set rssi th =%d\n", val);
- break;
- }
- case 1:
- {
- mt6630_fm_config.rx_cfg.desene_rssi_th = val;
- WCN_DBG(FM_NTC | CHIP, "set desense rssi th =%d\n", val);
- break;
- }
- case 2:
- {
- mt6630_fm_config.rx_cfg.smg_th = val;
- WCN_DBG(FM_NTC | CHIP, "set smg th =%d\n", val);
- break;
- }
- default:
- break;
- }
- return 0;
-}
-
-#if 0
-static const fm_u16 mt6630_mcu_dese_list[] = {
- 0 /* 7630, 7800, 7940, 8320, 9260, 9600, 9710, 9920, 10400, 10410 */
-};
-
-static const fm_u16 mt6630_gps_dese_list[] = {
- 0 /* 7850, 7860 */
-};
-#endif
-
-static const fm_s8 mt6630_chan_para_map[] = {
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 6500~6595 */
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 6600~6695 */
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, /* 6700~6795 */
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 6800~6895 */
- 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 6900~6995 */
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 7000~7095 */
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 7100~7195 */
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 7200~7295 */
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 7300~7395 */
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 7400~7495 */
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 7500~7595 */
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, /* 7600~7695 */
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 7700~7795 */
- 8, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 7800~7895 */
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 7900~7995 */
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 8000~8095 */
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 8100~8195 */
- 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 8200~8295 */
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, /* 8300~8395 */
- 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 8400~8495 */
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 8500~8595 */
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 8600~8695 */
- 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 8700~8795 */
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 8800~8895 */
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 8900~8995 */
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 9000~9095 */
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 9100~9195 */
- 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 9200~9295 */
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 9300~9395 */
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 9400~9495 */
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 9500~9595 */
- 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 9600~9695 */
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 9700~9795 */
- 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 9800~9895 */
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, /* 9900~9995 */
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 10000~10095 */
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 10100~10195 */
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, /* 10200~10295 */
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, /* 10300~10395 */
- 8, 0, 2, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 10400~10495 */
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, /* 10500~10595 */
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 10600~10695 */
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, /* 10700~10795 */
- 0 /* 10800 */
-};
-
-static const fm_u16 mt6630_TDD_list[] = {
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 6500~6595 */
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 6600~6695 */
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 6700~6795 */
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 6800~6895 */
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 6900~6995 */
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 7000~7095 */
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 7100~7195 */
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 7200~7295 */
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 7300~7395 */
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 7400~7495 */
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 7500~7595 */
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 7600~7695 */
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 7700~7795 */
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 7800~7895 */
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 7900~7995 */
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 8000~8095 */
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 8100~8195 */
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 8200~8295 */
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 8300~8395 */
- 0x0101, 0x0000, 0x0000, 0x0000, 0x0000, /* 8400~8495 */
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 8500~8595 */
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 8600~8695 */
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 8700~8795 */
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 8800~8895 */
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 8900~8995 */
- 0x0000, 0x0000, 0x0101, 0x0101, 0x0101, /* 9000~9095 */
- 0x0101, 0x0000, 0x0000, 0x0000, 0x0000, /* 9100~9195 */
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 9200~9295 */
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 9300~9395 */
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 9400~9495 */
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 9500~9595 */
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 9600~9695 */
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0100, /* 9700~9795 */
- 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, /* 9800~9895 */
- 0x0101, 0x0101, 0x0001, 0x0000, 0x0000, /* 9900~9995 */
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 10000~10095 */
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 10100~10195 */
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 10200~10295 */
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 10300~10395 */
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 10400~10495 */
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 10500~10595 */
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0100, /* 10600~10695 */
- 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, /* 10700~10795 */
- 0x0001 /* 10800 */
-};
-
-static const fm_u16 mt6630_TDD_Mask[] = {
- 0x0001, 0x0010, 0x0100, 0x1000
-};
-
-static const fm_u16 mt6630_scan_dese_list[] = {
- 7800, 9210, 9220, 9600, 9980, 10400, 10750, 10760
-};
-
-/* return value: 0, not a de-sense channel; 1, this is a de-sense channel; else error no */
-static fm_s32 mt6630_is_dese_chan(fm_u16 freq)
-{
- fm_s32 size;
-
- /* return 0;//HQA only :skip desense channel check. */
- size = sizeof(mt6630_scan_dese_list) / sizeof(mt6630_scan_dese_list[0]);
-
- if (0 == fm_get_channel_space(freq)) {
- freq *= 10;
- }
-
- while (size) {
- if (mt6630_scan_dese_list[size - 1] == freq)
- return 1;
-
- size--;
- }
-
- return 0;
-}
-
-static fm_bool mt6630_TDD_chan_check(fm_u16 freq)
-{
- fm_u32 i = 0;
- fm_u16 freq_tmp = freq;
- fm_s32 ret = 0;
-
- ret = fm_get_channel_space(freq_tmp);
- if (0 == ret) {
- freq_tmp *= 10;
- } else if (-1 == ret)
- return fm_false;
-
- i = (freq_tmp - 6500) / 5;
-
- /* WCN_DBG(FM_NTC | CHIP, "Freq %d is 0x%4x, mask is 0x%4x\n", freq,(mt6630_TDD_list[i/4]),mt6630_TDD_Mask[i%4]); */
- if (mt6630_TDD_list[i / 4] & mt6630_TDD_Mask[i % 4]) {
- WCN_DBG(FM_DBG | CHIP, "Freq %d use TDD solution\n", freq);
- return fm_true;
- } else
- return fm_false;
-}
-
-
-/* return value:
-1, is desense channel and rssi is less than threshold;
-0, not desense channel or it is but rssi is more than threshold.*/
-static fm_s32 mt6630_desense_check(fm_u16 freq, fm_s32 rssi)
-{
- if (mt6630_is_dese_chan(freq)) {
- if (rssi < mt6630_fm_config.rx_cfg.desene_rssi_th) {
- return 1;
- }
- FM_LOG_DBG(FM_DBG | CHIP, "desen_rssi %d th:%d\n", rssi,
- mt6630_fm_config.rx_cfg.desene_rssi_th);
- }
- return 0;
-}
-
-/* get channel parameter, HL side/ FA / ATJ */
-static fm_u16 mt6630_chan_para_get(fm_u16 freq)
-{
- fm_s32 pos, size;
-
- /* return 0;//for HQA only: skip FA/HL/ATJ */
- if (0 == fm_get_channel_space(freq)) {
- freq *= 10;
- }
- if (freq < 6500) {
- return 0;
- }
- pos = (freq - 6500) / 5;
-
- size = sizeof(mt6630_chan_para_map) / sizeof(mt6630_chan_para_map[0]);
-
- pos = (pos < 0) ? 0 : pos;
- pos = (pos > (size - 1)) ? (size - 1) : pos;
-
- return mt6630_chan_para_map[pos];
-}
-
-static fm_s32 mt6630_gps_dese(fm_u16 freq, void *arg)
-{
- fm_gps_desense_t state = FM_GPS_DESE_DISABLE;
-
- if (0 == fm_get_channel_space(freq)) {
- freq *= 10;
- }
-
- WCN_DBG(FM_DBG | CHIP, "%s, [freq=%d]\n", __func__, (int)freq);
-
- if (state != FM_GPS_DESE_ENABLE) {
- if ((freq >= 7800) && (freq <= 8000)) {
- state = FM_GPS_DESE_ENABLE;
- }
- }
- /* request 6630 GPS change clk */
- if (state == FM_GPS_DESE_DISABLE) {
- if (!mtk_wcn_wmt_dsns_ctrl(WMTDSNS_FM_GPS_DISABLE)) {
- return -1;
- }
- return 0;
- } else {
- if (!mtk_wcn_wmt_dsns_ctrl(WMTDSNS_FM_GPS_ENABLE)) {
- return -1;
- }
- return 1;
- }
-}
-
-/******************************Tx function********************************************/
-static fm_s32 mt6630_Tx_Support(fm_s32 *sup)
-{
- *sup = 1;
- return 0;
-}
-
-static fm_s32 mt6630_rdsTx_Support(fm_s32 *sup)
-{
- *sup = 1;
- return 0;
-}
-
-static fm_s32 MT6630_Rds_Tx_Enable(void)
-{
- fm_s32 ret = 0;
- fm_u16 pkt_size;
-
- if (FM_LOCK(cmd_buf_lock)) {
- return (-FM_ELOCK);
- }
- pkt_size = mt6630_tx_rdson_deviation(cmd_buf, TX_BUF_SIZE);
- ret = fm_cmd_tx(cmd_buf, pkt_size, FLAG_RDS_TX, SW_RETRY_CNT, EN_TIMEOUT, NULL);
- FM_UNLOCK(cmd_buf_lock);
- if (ret) {
- WCN_DBG(FM_ALT | CHIP, "mt6630_tx_rdson_deviation failed\n");
- return ret;
- }
- mt6630_set_bits(0xC7, 0x0800, 0xF7FF);
- return 0;
-}
-
-static fm_s32 MT6630_Rds_Tx_Disable(void)
-{
- fm_s32 ret = 0;
- fm_u16 pkt_size;
-
- if (FM_LOCK(cmd_buf_lock)) {
- return (-FM_ELOCK);
- }
- pkt_size = mt6630_pwrup_tx_deviation(cmd_buf, TX_BUF_SIZE);
- ret = fm_cmd_tx(cmd_buf, pkt_size, FLAG_EN, SW_RETRY_CNT, EN_TIMEOUT, NULL);
- FM_UNLOCK(cmd_buf_lock);
- if (ret) {
- WCN_DBG(FM_ALT | CHIP, "mt6630_pwrup_tx_deviation failed\n");
- return ret;
- }
-
- mt6630_set_bits(0xC7, 0x0000, 0xF7FF);
-
- return 0;
-}
-
-/*
-pi: pi code,
-ps: block B,C,D
-other_rds: NULL now
-other_rds_cnt:0 now
-*/
-static fm_s32 MT6630_Rds_Tx(fm_u16 pi, fm_u16 *ps, fm_u16 *other_rds, fm_u8 other_rds_cnt)
-{
- fm_s32 ret = 0;
- fm_u16 pkt_size = 0;
-
- WCN_DBG(FM_NTC | RDSC,
- "+%s():PI=0x%04x, PS=0x%04x/0x%04x/0x%04x/0x%04x, other_rds_cnt=%d\n", __func__,
- pi, ps[0], ps[1], ps[2], ps[3], other_rds_cnt);
- if (FM_LOCK(cmd_buf_lock))
- return (-FM_ELOCK);
- pkt_size = mt6630_rds_tx(cmd_buf, TX_BUF_SIZE, pi, ps, other_rds, other_rds_cnt);
- ret = fm_cmd_tx(cmd_buf, pkt_size, FLAG_RDS_TX, SW_RETRY_CNT, RDS_TX_TIMEOUT, NULL);
- FM_UNLOCK(cmd_buf_lock);
-
- return ret;
-}
-
-/*
-freq: 8750~10800
-valid: fm_true-valid channel,fm_false-invalid channel
-return: fm_true- smt success, fm_false-smt fail
-*/
-static fm_s32 mt6630_soft_mute_tune_Tx(fm_u16 freq, fm_s32 *rssi, fm_bool *valid)
-{
- fm_s32 ret = 0;
- fm_u16 pkt_size;
- struct mt6630_full_cqi *p_cqi;
- fm_s32 RSSI = 0, PAMD = 0, MR = 0, ATDC = 0;
- fm_u32 PRX = 0, ATDEV = 0;
- fm_u16 softmuteGainLvl = 0;
-
- ret = mt6630_chan_para_get(freq);
- if (ret == 2) {
- ret = mt6630_set_bits(FM_CHANNEL_SET, 0x2000, 0x0FFF); /* mdf HiLo */
- } else {
- ret = mt6630_set_bits(FM_CHANNEL_SET, 0x0000, 0x0FFF); /* clear FA/HL/ATJ */
- }
-
- mt6630_write(0x60, 0x0007);
- if (mt6630_TDD_chan_check(freq))
- mt6630_set_bits(0x30, 0x0004, 0xFFF9); /* use TDD solution */
- else
- mt6630_set_bits(0x30, 0x0000, 0xFFF9); /* default use FDD solution */
- mt6630_write(0x60, 0x000F);
-
- if (FM_LOCK(cmd_buf_lock))
- return (-FM_ELOCK);
- pkt_size = mt6630_full_cqi_req(cmd_buf, TX_BUF_SIZE, &freq, 1, 1);
- ret =
- fm_cmd_tx(cmd_buf, pkt_size, FLAG_SM_TUNE, SW_RETRY_CNT, SM_TUNE_TIMEOUT,
- mt6630_get_read_result);
- FM_UNLOCK(cmd_buf_lock);
-
- if (!ret && mt6630_res) {
- FM_LOG_NTC(FM_NTC | CHIP, "smt cqi size %d\n", mt6630_res->cqi[0]);
- p_cqi = (struct mt6630_full_cqi *)&mt6630_res->cqi[2];
- /* just for debug */
- FM_LOG_NTC(FM_NTC | CHIP,
- "freq %d, 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x, 0x%04x\n",
- p_cqi->ch, p_cqi->rssi, p_cqi->pamd, p_cqi->pr, p_cqi->fpamd, p_cqi->mr,
- p_cqi->atdc, p_cqi->prx, p_cqi->atdev, p_cqi->smg, p_cqi->drssi);
- RSSI =
- ((p_cqi->rssi & 0x03FF) >=
- 512) ? ((p_cqi->rssi & 0x03FF) - 1024) : (p_cqi->rssi & 0x03FF);
- PAMD =
- ((p_cqi->pamd & 0x1FF) >=
- 256) ? ((p_cqi->pamd & 0x01FF) - 512) : (p_cqi->pamd & 0x01FF);
- MR = ((p_cqi->mr & 0x01FF) >=
- 256) ? ((p_cqi->mr & 0x01FF) - 512) : (p_cqi->mr & 0x01FF);
- ATDC = (p_cqi->atdc >= 32768) ? (65536 - p_cqi->atdc) : (p_cqi->atdc);
- if (ATDC < 0) {
- ATDC = (~(ATDC)) - 1; /* Get abs value of ATDC */
- }
- PRX = (p_cqi->prx & 0x00FF);
- ATDEV = p_cqi->atdev;
- softmuteGainLvl = p_cqi->smg;
- /* check if the channel is valid according to each CQIs */
- if ((PAMD > mt6630_fm_config.tx_cfg.pamd_th)
- && (MR <= mt6630_fm_config.tx_cfg.mr_th)
- && (softmuteGainLvl < mt6630_fm_config.tx_cfg.smg_th)) {
- *valid = fm_true;
- } else {
- *valid = fm_false;
- }
- *rssi = RSSI;
- } else {
- FM_LOG_ERR(FM_ERR | CHIP, "smt get CQI failed\n");
- return fm_false;
- }
- FM_LOG_NTC(FM_NTC | CHIP, "valid=%d\n", *valid);
- return fm_true;
-}
-
-#define TX_ABANDON_BAND_LOW1 7320
-#define TX_ABANDON_BAND_HIGH1 7450
-#define TX_ABANDON_BAND_LOW2 9760
-#define TX_ABANDON_BAND_HIGH2 9940
-static fm_s32 mt6630_TxScan(fm_u16 min_freq,
- fm_u16 max_freq,
- fm_u16 *pFreq,
- fm_u16 *pScanTBL, fm_u16 *ScanTBLsize, fm_u16 scandir, fm_u16 space)
-{
- fm_s32 i = 0, ret = 0;
- fm_u16 freq = *pFreq;
- fm_u16 scan_cnt = *ScanTBLsize;
- fm_u16 cnt = 0;
- fm_s32 rssi = 0;
- fm_s32 step;
- fm_bool valid = fm_false;
- fm_s32 total_no = 0;
-
- WCN_DBG(FM_NTC | CHIP, "+%s():\n", __func__);
-
- if ((!pScanTBL) || (*ScanTBLsize < FM_TX_SCAN_MIN) || (*ScanTBLsize > FM_TX_SCAN_MAX)) {
- WCN_DBG(FM_ERR | CHIP, "invalid scan table\n");
- ret = -FM_EPARA;
- return 1;
- }
- if (0 == fm_get_channel_space(freq)) {
- *pFreq *= 10;
- }
- if (0 == fm_get_channel_space(max_freq)) {
- max_freq *= 10;
- }
- if (0 == fm_get_channel_space(min_freq)) {
- min_freq *= 10;
- }
-
- WCN_DBG(FM_NTC | CHIP,
- "[freq=%d], [max_freq=%d],[min_freq=%d],[scan BTL size=%d],[scandir=%d],[space=%d]\n",
- *pFreq, max_freq, min_freq, *ScanTBLsize, scandir, space);
-
- cnt = 0;
- if (space == FM_SPACE_200K) {
- step = 20;
- } else if (space == FM_SPACE_50K) {
- step = 5;
- } else {
- step = 10;
- }
- total_no = (max_freq - min_freq) / step + 1;
- if (scandir == FM_TX_SCAN_UP) {
- for (i = ((*pFreq - min_freq) / step); i < total_no; i++) {
- freq = min_freq + step * i;
-
- //FM desense GPS
- if((freq>=TX_ABANDON_BAND_LOW1) && (freq<=TX_ABANDON_BAND_HIGH1))
- {
- freq = TX_ABANDON_BAND_HIGH1 + 10;
- i = (freq-min_freq)/step;
- }
-
- if((freq>=TX_ABANDON_BAND_LOW2) && (freq<=TX_ABANDON_BAND_HIGH2))
- {
- freq = TX_ABANDON_BAND_HIGH2 + 10;
- i = (freq-min_freq)/step;
- }
-
- ret = mt6630_soft_mute_tune_Tx(freq, &rssi, &valid);
- if (ret == fm_false) {
- WCN_DBG(FM_ERR | CHIP, "mt6630_soft_mute_tune failed\n");
- return 1;
- }
-
- if (valid == fm_true) {
- *(pScanTBL + cnt) = freq; /* strore the valid empty channel */
- cnt++;
- WCN_DBG(FM_NTC | CHIP, "empty channel:[freq=%d] [cnt=%d]\n", freq,
- cnt);
- }
- if (cnt >= scan_cnt) {
- break;
- }
- }
-
- if (cnt < scan_cnt) {
- for (i = 0; i < ((*pFreq - min_freq) / step); i++) {
- freq = min_freq + step * i;
-
- //FM desense GPS
- if((freq>=TX_ABANDON_BAND_LOW1) && (freq<=TX_ABANDON_BAND_HIGH1))
- {
- freq = TX_ABANDON_BAND_HIGH1 + 10;
- i = (freq-min_freq)/step;
- }
-
- if((freq>=TX_ABANDON_BAND_LOW2) && (freq<=TX_ABANDON_BAND_HIGH2))
- {
- freq = TX_ABANDON_BAND_HIGH2 + 10;
- i = (freq-min_freq)/step;
- }
-
- if(i >= ((*pFreq-min_freq)/step))
- break;
-
- ret = mt6630_soft_mute_tune_Tx(freq, &rssi, &valid);
- if (ret == fm_false) {
- WCN_DBG(FM_ERR | CHIP, "mt6630_soft_mute_tune failed\n");
- return 1;
- }
-
- if (valid == fm_true) {
- *(pScanTBL + cnt) = freq; /* strore the valid empty channel */
- cnt++;
- WCN_DBG(FM_NTC | CHIP, "empty channel:[freq=%d] [cnt=%d]\n",
- freq, cnt);
- }
- if (cnt >= scan_cnt) {
- break;
- }
- }
- }
- } else {
- for (i = ((*pFreq - min_freq) / step - 1); i >= 0; i--) {
- freq = min_freq + step * i;
-
- //FM desense GPS
- if((freq>=TX_ABANDON_BAND_LOW1) && (freq<=TX_ABANDON_BAND_HIGH1))
- {
- freq = TX_ABANDON_BAND_LOW1 - 10;
- i = (freq-min_freq)/step;
- }
-
- if((freq>=TX_ABANDON_BAND_LOW2) && (freq<=TX_ABANDON_BAND_HIGH2))
- {
- freq = TX_ABANDON_BAND_LOW2 - 10;
- i = (freq-min_freq)/step;
- }
-
- ret = mt6630_soft_mute_tune_Tx(freq, &rssi, &valid);
- if (ret == fm_false) {
- WCN_DBG(FM_ERR | CHIP, "mt6630_soft_mute_tune failed\n");
- return 1;
- }
-
- if (valid == fm_true) {
- *(pScanTBL + cnt) = freq; /* strore the valid empty channel */
- cnt++;
- WCN_DBG(FM_NTC | CHIP, "empty channel:[freq=%d] [cnt=%d]\n", freq,
- cnt);
- }
- if (cnt >= scan_cnt) {
- break;
- }
- }
- if (cnt < scan_cnt) {
- for (i = (total_no - 1); i > ((*pFreq - min_freq) / step); i--) {
- freq = min_freq + step * i;
-
- //FM desense GPS
- if((freq>=TX_ABANDON_BAND_LOW1) && (freq<=TX_ABANDON_BAND_HIGH1))
- {
- freq = TX_ABANDON_BAND_LOW1 - 10;
- i = (freq-min_freq)/step;
- }
-
- if((freq>=TX_ABANDON_BAND_LOW2) && (freq<=TX_ABANDON_BAND_HIGH2))
- {
- freq = TX_ABANDON_BAND_LOW2 - 10;
- i = (freq-min_freq)/step;
- }
-
- if(i <= ((*pFreq-min_freq)/step))
- break;
-
- ret = mt6630_soft_mute_tune_Tx(freq, &rssi, &valid);
- if (ret == fm_false) {
- WCN_DBG(FM_ERR | CHIP, "mt6630_soft_mute_tune failed\n");
- return 1;
- }
-
- if (valid == fm_true) {
- *(pScanTBL + cnt) = freq; /* strore the valid empty channel */
- cnt++;
- WCN_DBG(FM_NTC | CHIP, "empty channel:[freq=%d] [cnt=%d]\n",
- freq, cnt);
- }
- if (cnt >= scan_cnt) {
- break;
- }
- }
- }
- }
-
- *ScanTBLsize = cnt;
- WCN_DBG(FM_NTC | CHIP, "completed, [cnt=%d],[freq=%d]\n", cnt, freq);
- /* return 875~1080 */
- for (i = 0; i < cnt; i++) {
- if (1 == fm_get_channel_space(*(pScanTBL + i))) {
- *(pScanTBL + i) = *(pScanTBL + i) / 10;
- }
- }
- WCN_DBG(FM_NTC | CHIP, "-%s():[ret=%d]\n", __func__, ret);
- return 0;
-}
-
-static fm_s32 mt6630_PowerUpTx(void)
-{
- fm_s32 ret = 0;
- fm_u16 pkt_size;
- fm_u16 dataRead;
-
- FM_LOG_NTC(FM_NTC | CHIP, "pwr on Tx seq......\n");
-
- ret = mt6630_pwrup_top_setting();
- if (ret) {
- FM_LOG_ERR(FM_ERR | CHIP, "mt6630_pwrup_top_setting failed\n");
- return ret;
- }
- if (FM_LOCK(cmd_buf_lock)) {
- return (-FM_ELOCK);
- }
- pkt_size = mt6630_pwrup_clock_on_tx(cmd_buf, TX_BUF_SIZE);
- ret = fm_cmd_tx(cmd_buf, pkt_size, FLAG_EN, SW_RETRY_CNT, EN_TIMEOUT, NULL);
- FM_UNLOCK(cmd_buf_lock);
-
- if (ret) {
- WCN_DBG(FM_ALT | CHIP, "mt6630_pwrup_clock_on_tx failed\n");
- return ret;
- }
-
- mt6630_read(0x62, &dataRead);
- WCN_DBG(FM_NTC | CHIP, "Tx on chipid=%x\n", dataRead);
-
- ret = mt6630_pwrup_DSP_download(mt6630_patch_tbl_tx);
- if (ret) {
- FM_LOG_ERR(FM_ERR | CHIP, "mt6630_pwrup_DSP_download failed\n");
- return ret;
- }
-
- if ((mt6630_fm_config.aud_cfg.aud_path == FM_AUD_MRGIF)
- || (mt6630_fm_config.aud_cfg.aud_path == FM_AUD_I2S)) {
- mt6630_I2s_Setting(FM_I2S_ON, mt6630_fm_config.aud_cfg.i2s_info.mode,
- mt6630_fm_config.aud_cfg.i2s_info.rate);
- /* mtk_wcn_cmb_stub_audio_ctrl((CMB_STUB_AIF_X)CMB_STUB_AIF_2);//no need to do? */
- WCN_DBG(FM_NTC | CHIP, "pwron set I2S on ok\n");
- }
-
- if (FM_LOCK(cmd_buf_lock)) {
- return (-FM_ELOCK);
- }
- pkt_size = mt6630_pwrup_digital_init(cmd_buf, TX_BUF_SIZE);
- ret = fm_cmd_tx(cmd_buf, pkt_size, FLAG_EN, SW_RETRY_CNT, EN_TIMEOUT, NULL);
- FM_UNLOCK(cmd_buf_lock);
- if (ret) {
- WCN_DBG(FM_ALT | CHIP, "mt6630_dig_init failed\n");
- return ret;
- }
-
- if (FM_LOCK(cmd_buf_lock)) {
- return (-FM_ELOCK);
- }
- pkt_size = mt6630_pwrup_tx_deviation(cmd_buf, TX_BUF_SIZE);
- ret = fm_cmd_tx(cmd_buf, pkt_size, FLAG_EN, SW_RETRY_CNT, EN_TIMEOUT, NULL);
- FM_UNLOCK(cmd_buf_lock);
- if (ret) {
- WCN_DBG(FM_ALT | CHIP, "mt6630_pwrup__tx_deviation failed\n");
- return ret;
- }
-
- WCN_DBG(FM_DBG | CHIP, "pwr on tx seq ok\n");
- return ret;
-}
-
-static fm_s32 mt6630_PowerDownTx(void)
-{
- fm_s32 ret = 0;
-
- ret = mt6630_PowerDown();
- if (ret) {
- FM_LOG_ERR(FM_ERR | CHIP, "mt6630_PowerDownTx failed\n");
- return ret;
- }
-
- return ret;
-}
-
-static fm_u16 mt6630_Hside_list_Tx[] = { 7720, 8045 };
-
-static fm_bool mt6630_HiSide_chan_check_Tx(fm_u16 freq)
-{
- //fm_s32 pos, size;
- fm_u32 i = 0, count = 0;
-
- /* return 0;//for HQA only: skip FA/HL/ATJ */
- if (0 == fm_get_channel_space(freq)) {
- freq *= 10;
- }
- if (freq < 6500) {
- return fm_false;
- }
-
- count = sizeof(mt6630_Hside_list_Tx) / sizeof(mt6630_Hside_list_Tx[0]);
- for (i = 0; i < count; i++) {
- if (freq == mt6630_Hside_list_Tx[i])
- return fm_true;
- }
-
- return fm_false;
-}
-
-static fm_bool MT6630_SetFreq_Tx(fm_u16 freq)
-{
- fm_s32 ret = 0;
- fm_u16 pkt_size;
- fm_u16 chan_para = 0;
-
- ret = mt6630_RampDown();
- if (ret) {
- WCN_DBG(FM_ALT | CHIP, "mt6630_RampDown failed\n");
- return ret;
- }
-
- if (fm_true == mt6630_HiSide_chan_check_Tx(freq)) {
- FM_LOG_DBG(FM_DBG | CHIP, "%d chan para = %d\n", (fm_s32) freq, (fm_s32) chan_para);
- ret = mt6630_set_bits(FM_CHANNEL_SET, 0x2000, 0x0FFF); /* mdf HiLo */
- } else
- ret = mt6630_set_bits(FM_CHANNEL_SET, 0x0000, 0xEFFF); /* clear HiLo */
-
-
- if (ret) {
- WCN_DBG(FM_ALT | CHIP, "mt6630_set_bits failed\n");
- return ret;
- }
- /* fm_cb_op->cur_freq_set(freq); */
- /* start tune */
- if (FM_LOCK(cmd_buf_lock))
- return (-FM_ELOCK);
- pkt_size = mt6630_tune_tx(cmd_buf, TX_BUF_SIZE, freq, 0);
- ret =
- fm_cmd_tx(cmd_buf, pkt_size, FLAG_TUNE | FLAG_TUNE_DONE, SW_RETRY_CNT, TUNE_TIMEOUT,
- NULL);
- FM_UNLOCK(cmd_buf_lock);
-
- if (ret) {
- WCN_DBG(FM_ALT | CHIP, "mt6630_tune_tx failed\n");
- return ret;
- }
-
- WCN_DBG(FM_DBG | CHIP, "mt6630_tune_tx to %d ok\n", freq);
-
- return fm_true;
-}
-
-
-fm_s32 MT6630fm_low_ops_register(struct fm_lowlevel_ops *ops)
-{
- fm_s32 ret = 0;
- /* Basic functions. */
-
- FMR_ASSERT(ops);
- FMR_ASSERT(ops->cb.cur_freq_get);
- FMR_ASSERT(ops->cb.cur_freq_set);
- fm_cb_op = &ops->cb;
-
- ops->bi.pwron = mt6630_pwron;
- ops->bi.pwroff = mt6630_pwroff;
- ops->bi.msdelay = Delayms;
- ops->bi.usdelay = Delayus;
- ops->bi.read = mt6630_read;
- ops->bi.write = mt6630_write;
- /* ops->bi.top_read = mt6630_top_read; */
- /* ops->bi.top_write = mt6630_top_write; */
- ops->bi.host_read = mt6630_host_read;
- ops->bi.host_write = mt6630_host_write;
- ops->bi.setbits = mt6630_set_bits;
- ops->bi.chipid_get = mt6630_get_chipid;
- ops->bi.mute = mt6630_Mute;
- ops->bi.rampdown = mt6630_RampDown;
- ops->bi.pwrupseq = mt6630_PowerUp;
- ops->bi.pwrdownseq = mt6630_PowerDown;
- ops->bi.setfreq = mt6630_SetFreq;
- /* ops->bi.low_pwr_wa = MT6630fm_low_power_wa_default; */
- ops->bi.i2s_set = mt6630_I2s_Setting;
- ops->bi.rssiget = mt6630_GetCurRSSI;
- ops->bi.volset = mt6630_SetVol;
- ops->bi.volget = mt6630_GetVol;
- ops->bi.dumpreg = mt6630_dump_reg;
- ops->bi.msget = mt6630_GetMonoStereo;
- ops->bi.msset = mt6630_SetMonoStereo;
- ops->bi.pamdget = mt6630_GetCurPamd;
- /* ops->bi.em = mt6630_em_test; */
- ops->bi.anaswitch = mt6630_SetAntennaType;
- ops->bi.anaget = mt6630_GetAntennaType;
- ops->bi.caparray_get = mt6630_GetCapArray;
- ops->bi.hwinfo_get = mt6630_hw_info_get;
- ops->bi.fm_via_bt = MT6630_FMOverBT;
- ops->bi.i2s_get = mt6630_i2s_info_get;
- ops->bi.is_dese_chan = mt6630_is_dese_chan;
- ops->bi.softmute_tune = mt6630_soft_mute_tune;
- ops->bi.desense_check = mt6630_desense_check;
- ops->bi.cqi_log = mt6630_full_cqi_get;
- ops->bi.pre_search = mt6630_pre_search;
- ops->bi.restore_search = mt6630_restore_search;
- ops->bi.set_search_th = mt6630_set_search_th;
- ops->bi.get_aud_info = mt6630fm_get_audio_info;
- /*****tx function****/
- ops->ri.rdstx_support = mt6630_rdsTx_Support;
- ops->bi.tx_support = mt6630_Tx_Support;
- ops->bi.pwrupseq_tx = mt6630_PowerUpTx;
- ops->bi.tune_tx = MT6630_SetFreq_Tx;
- ops->bi.pwrdownseq_tx = mt6630_PowerDownTx;
- ops->bi.tx_scan = mt6630_TxScan;
- ops->ri.rds_tx = MT6630_Rds_Tx;
- ops->ri.rds_tx_enable = MT6630_Rds_Tx_Enable;
- ops->ri.rds_tx_disable = MT6630_Rds_Tx_Disable;
- /* ops->bi.tx_pwr_ctrl = MT6630_TX_PWR_CTRL; */
- /* ops->bi.rtc_drift_ctrl = MT6630_RTC_Drift_CTRL; */
- /* ops->bi.tx_desense_wifi = MT6630_TX_DESENSE; */
-
- cmd_buf_lock = fm_lock_create("30_cmd");
- ret = fm_lock_get(cmd_buf_lock);
-
- cmd_buf = fm_zalloc(TX_BUF_SIZE + 1);
-
- if (!cmd_buf) {
- FM_LOG_ERR(FM_ERR | CHIP, "6630 fm lib alloc tx buf failed\n");
- ret = -1;
- }
-
- return ret;
-}
-
-fm_s32 MT6630fm_low_ops_unregister(struct fm_lowlevel_ops *ops)
-{
- fm_s32 ret = 0;
- /* Basic functions. */
- FMR_ASSERT(ops);
-
- if (cmd_buf) {
- fm_free(cmd_buf);
- cmd_buf = NULL;
- }
-
- ret = fm_lock_put(cmd_buf_lock);
- fm_memset(&ops->bi, 0, sizeof(struct fm_basic_interface));
- return ret;
-}
diff --git a/drivers/misc/mediatek/fmradio/mt6630/pub/mt6630_fm_rds.c b/drivers/misc/mediatek/fmradio/mt6630/pub/mt6630_fm_rds.c
deleted file mode 100644
index 09a31c476..000000000
--- a/drivers/misc/mediatek/fmradio/mt6630/pub/mt6630_fm_rds.c
+++ /dev/null
@@ -1,345 +0,0 @@
-/* mt6630_rds.c
- *
- * (C) Copyright 2009
- * MediaTek <www.MediaTek.com>
- * hongcheng <hongcheng.xia@MediaTek.com>
- *
- * mt6630 FM Radio Driver
- *
- * 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.
- *
- * 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.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- */
-#include "fm_typedef.h"
-#include "fm_dbg.h"
-#include "fm_err.h"
-#include "fm_interface.h"
-#include "fm_stdlib.h"
-#include "fm_rds.h"
-#include "mt6630_fm_reg.h"
-
-
-static fm_bool bRDS_FirstIn = fm_false;
-static fm_u32 gBLER_CHK_INTERVAL = 5000;
-static fm_u16 GOOD_BLK_CNT = 0, BAD_BLK_CNT;
-static fm_u8 BAD_BLK_RATIO;
-
-static struct fm_callback *fm_cb;
-static struct fm_basic_interface *fm_bi;
-
-
-static fm_bool mt6630_RDS_support(void);
-static fm_s32 mt6630_RDS_enable(void);
-static fm_s32 mt6630_RDS_disable(void);
-static fm_u16 mt6630_RDS_Get_GoodBlock_Counter(void);
-static fm_u16 mt6630_RDS_Get_BadBlock_Counter(void);
-static fm_u8 mt6630_RDS_Get_BadBlock_Ratio(void);
-static fm_u32 mt6630_RDS_Get_BlerCheck_Interval(void);
-/* static void mt6630_RDS_GetData(fm_u16 *data, fm_u16 datalen); */
-static void mt6630_RDS_Init_Data(rds_t *pstRDSData);
-
-
-
-static fm_bool mt6630_RDS_support(void)
-{
- return fm_true;
-}
-
-static fm_s32 mt6630_RDS_enable(void)
-{
- fm_s32 ret = 0;
- fm_u16 dataRead = 0;
-
- WCN_DBG(FM_DBG | RDSC, "rds enable\n");
- /* ret = fm_bi->read(FM_RDS_CFG0, &dataRead); */
- ret = fm_bi->write(FM_RDS_CFG0, 6); /* set buf_start_th */
- if(ret) {
- WCN_DBG(FM_NTC | RDSC, "rds enable write 0x80 fail\n");
- return ret;
- }
- ret = fm_bi->read(FM_MAIN_CTRL, &dataRead);
- if(ret) {
- WCN_DBG(FM_NTC | RDSC, "rds enable read 0x63 fail\n");
- return ret;
- }
- ret = fm_bi->write(FM_MAIN_CTRL, dataRead | (RDS_MASK));
- if(ret) {
- WCN_DBG(FM_NTC | RDSC, "rds enable write 0x63 fail\n");
- return ret;
- }
-
- return ret;
-}
-
-static fm_s32 mt6630_RDS_disable(void)
-{
- fm_s32 ret = 0;
- fm_u16 dataRead = 0;
-
- WCN_DBG(FM_DBG | RDSC, "rds disable\n");
- ret = fm_bi->read(FM_MAIN_CTRL, &dataRead);
- if(ret) {
- WCN_DBG(FM_NTC | RDSC, "rds disable read 0x63 fail\n");
- return ret;
- }
- ret = fm_bi->write(FM_MAIN_CTRL, dataRead & (~RDS_MASK));
- if(ret) {
- WCN_DBG(FM_NTC | RDSC, "rds disable write 0x63 fail\n");
- return ret;
- }
-
- return ret;
-}
-
-static fm_u16 mt6630_RDS_Get_GoodBlock_Counter(void)
-{
- fm_u16 tmp_reg;
-
- fm_bi->read(FM_RDS_GOODBK_CNT, &tmp_reg);
- GOOD_BLK_CNT = tmp_reg;
- WCN_DBG(FM_DBG | RDSC, "get good block cnt:%d\n", (fm_s32) tmp_reg);
-
- return tmp_reg;
-}
-
-static fm_u16 mt6630_RDS_Get_BadBlock_Counter(void)
-{
- fm_u16 tmp_reg;
-
- fm_bi->read(FM_RDS_BADBK_CNT, &tmp_reg);
- BAD_BLK_CNT = tmp_reg;
- WCN_DBG(FM_DBG | RDSC, "get bad block cnt:%d\n", (fm_s32) tmp_reg);
-
- return tmp_reg;
-}
-
-static fm_u8 mt6630_RDS_Get_BadBlock_Ratio(void)
-{
- fm_u16 tmp_reg;
- fm_u16 gbc;
- fm_u16 bbc;
-
- gbc = mt6630_RDS_Get_GoodBlock_Counter();
- bbc = mt6630_RDS_Get_BadBlock_Counter();
-
- if ((gbc + bbc) > 0) {
- tmp_reg = (fm_u8) (bbc * 100 / (gbc + bbc));
- } else {
- tmp_reg = 0;
- }
-
- BAD_BLK_RATIO = tmp_reg;
- WCN_DBG(FM_DBG | RDSC, "get badblock ratio:%d\n", (fm_s32) tmp_reg);
-
- return tmp_reg;
-}
-
-static fm_s32 mt6630_RDS_BlockCounter_Reset(void)
-{
- mt6630_RDS_disable();
- mt6630_RDS_enable();
-
- return 0;
-}
-
-static fm_u32 mt6630_RDS_Get_BlerCheck_Interval(void)
-{
- return gBLER_CHK_INTERVAL;
-}
-
-static fm_s32 mt6630_RDS_BlerCheck(rds_t *dst)
-{
- return 0;
-}
-
-#if 0
-static void RDS_Recovery_Handler(void)
-{
- fm_u16 tempData = 0;
-
- do {
- fm_bi->read(FM_RDS_DATA_REG, &tempData);
- fm_bi->read(FM_RDS_POINTER, &tempData);
- } while (tempData & 0x3);
-}
-#endif
-
-#if 0
-static void mt6630_RDS_GetData(fm_u16 *data, fm_u16 datalen)
-{
-#define RDS_GROUP_DIFF_OFS 0x007C
-#define RDS_FIFO_DIFF 0x007F
-#define RDS_CRC_BLK_ADJ 0x0020
-#define RDS_CRC_CORR_CNT 0x001E
-#define RDS_CRC_INFO 0x0001
-
- fm_u16 CRC = 0, i = 0, RDS_adj = 0, RDSDataCount = 0, FM_WARorrCnt = 0;
- fm_u16 temp = 0, OutputPofm_s32 = 0;
-
- WCN_DBG(FM_DBG | RDSC, "get data\n");
- fm_bi->read(FM_RDS_FIFO_STATUS0, &temp);
- RDSDataCount = ((RDS_GROUP_DIFF_OFS & temp) << 2);
-
- if ((temp & RDS_FIFO_DIFF) >= 4) {
- /* block A data and info handling */
- fm_bi->read(FM_RDS_INFO, &temp);
- RDS_adj |= (temp & RDS_CRC_BLK_ADJ) << 10;
- CRC |= (temp & RDS_CRC_INFO) << 3;
- FM_WARorrCnt |= ((temp & RDS_CRC_CORR_CNT) << 11);
- fm_bi->read(FM_RDS_DATA_REG, &data[0]);
-
- /* block B data and info handling */
- fm_bi->read(FM_RDS_INFO, &temp);
- RDS_adj |= (temp & RDS_CRC_BLK_ADJ) << 9;
- CRC |= (temp & RDS_CRC_INFO) << 2;
- FM_WARorrCnt |= ((temp & RDS_CRC_CORR_CNT) << 7);
- fm_bi->read(FM_RDS_DATA_REG, &data[1]);
-
- /* block C data and info handling */
- fm_bi->read(FM_RDS_INFO, &temp);
- RDS_adj |= (temp & RDS_CRC_BLK_ADJ) << 8;
- CRC |= (temp & RDS_CRC_INFO) << 1;
- FM_WARorrCnt |= ((temp & RDS_CRC_CORR_CNT) << 3);
- fm_bi->read(FM_RDS_DATA_REG, &data[2]);
-
- /* block D data and info handling */
- fm_bi->read(FM_RDS_INFO, &temp);
- RDS_adj |= (temp & RDS_CRC_BLK_ADJ) << 7;
- CRC |= (temp & RDS_CRC_INFO);
- FM_WARorrCnt |= ((temp & RDS_CRC_CORR_CNT) >> 1);
- fm_bi->read(FM_RDS_DATA_REG, &data[3]);
-
- data[4] = (CRC | RDS_adj | RDSDataCount);
- data[5] = FM_WARorrCnt;
-
- fm_bi->read(FM_RDS_PWDI, &data[6]);
- fm_bi->read(FM_RDS_PWDQ, &data[7]);
-
- fm_bi->read(FM_RDS_POINTER, &OutputPofm_s32);
-
- /* Go fm_s32o RDS recovery handler while RDS output pofm_s32 doesn't align to 4 in numeric */
- if (OutputPofm_s32 & 0x3) {
- RDS_Recovery_Handler();
- }
-
- } else {
- for (; i < 8; i++)
- data[i] = 0;
- }
-}
-#endif
-
-static void mt6630_RDS_Init_Data(rds_t *pstRDSData)
-{
- fm_memset(pstRDSData, 0, sizeof(rds_t));
- bRDS_FirstIn = fm_true;
-
- fm_memset(pstRDSData->RT_Data.TextData, 0x20, sizeof(pstRDSData->RT_Data.TextData));
- fm_memset(pstRDSData->PS_Data.PS, '\0', sizeof(pstRDSData->PS_Data.PS));
- fm_memset(pstRDSData->PS_ON, 0x20, sizeof(pstRDSData->PS_ON));
-}
-
-fm_bool mt6630_RDS_OnOff(rds_t *dst, fm_bool bFlag)
-{
- fm_s32 ret = 0;
-
- if (mt6630_RDS_support() == fm_false) {
- WCN_DBG(FM_ALT | RDSC, "mt6630_RDS_OnOff failed, RDS not support\n");
- return fm_false;
- }
-
- if (bFlag) {
- mt6630_RDS_Init_Data(dst);
- ret = mt6630_RDS_enable();
- if(ret) {
- WCN_DBG(FM_NTC | RDSC, "mt6630_RDS_OnOff enable failed\n");
- return fm_false;
- }
- } else {
- ret = mt6630_RDS_disable();
- if(ret) {
- WCN_DBG(FM_NTC | RDSC, "mt6630_RDS_OnOff disable failed\n");
- return fm_false;
- }
- }
-
- return fm_true;
-}
-
-DEFINE_RDSLOG(mt6630_rds_log);
-
-/* mt6630_RDS_Efm_s32_Handler - response FM RDS interrupt
- * @fm - main data structure of FM driver
- * This function first get RDS raw data, then call RDS spec parser
- */
-static fm_s32 mt6630_rds_parser(rds_t *rds_dst, struct rds_rx_t *rds_raw, fm_s32 rds_size,
- fm_u16(*getfreq) (void))
-{
- mt6630_rds_log.log_in(&mt6630_rds_log, rds_raw, rds_size);
- return rds_parser(rds_dst, rds_raw, rds_size, getfreq);
-}
-
-static fm_s32 mt6630_rds_log_get(struct rds_rx_t *dst, fm_s32 *dst_len)
-{
- return mt6630_rds_log.log_out(&mt6630_rds_log, dst, dst_len);
-}
-
-static fm_s32 mt6630_rds_gc_get(struct rds_group_cnt_t *dst, rds_t *rdsp)
-{
- return rds_grp_counter_get(dst, &rdsp->gc);
-}
-
-static fm_s32 mt6630_rds_gc_reset(rds_t *rdsp)
-{
- return rds_grp_counter_reset(&rdsp->gc);
-}
-
-fm_s32 MT6630fm_rds_ops_register(struct fm_lowlevel_ops *ops)
-{
- fm_s32 ret = 0;
-
- FMR_ASSERT(ops);
- FMR_ASSERT(ops->bi.write);
- FMR_ASSERT(ops->bi.read);
- FMR_ASSERT(ops->bi.setbits);
- FMR_ASSERT(ops->bi.usdelay);
- fm_bi = &ops->bi;
-
- FMR_ASSERT(ops->cb.cur_freq_get);
- FMR_ASSERT(ops->cb.cur_freq_set);
- fm_cb = &ops->cb;
-
- ops->ri.rds_blercheck = mt6630_RDS_BlerCheck;
- ops->ri.rds_onoff = mt6630_RDS_OnOff;
- ops->ri.rds_parser = mt6630_rds_parser;
- ops->ri.rds_gbc_get = mt6630_RDS_Get_GoodBlock_Counter;
- ops->ri.rds_bbc_get = mt6630_RDS_Get_BadBlock_Counter;
- ops->ri.rds_bbr_get = mt6630_RDS_Get_BadBlock_Ratio;
- ops->ri.rds_bc_reset = mt6630_RDS_BlockCounter_Reset;
- ops->ri.rds_bci_get = mt6630_RDS_Get_BlerCheck_Interval;
- ops->ri.rds_log_get = mt6630_rds_log_get;
- ops->ri.rds_gc_get = mt6630_rds_gc_get;
- ops->ri.rds_gc_reset = mt6630_rds_gc_reset;
- return ret;
-}
-
-fm_s32 MT6630fm_rds_ops_unregister(struct fm_lowlevel_ops *ops)
-{
- fm_s32 ret = 0;
-
- FMR_ASSERT(ops);
-
- fm_bi = NULL;
- fm_memset(&ops->ri, 0, sizeof(struct fm_rds_interface));
- return ret;
-}